From bde728b6929857becfdbfd3a088dfc831714a90c Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Wed, 18 Dec 2019 11:56:34 +0000 Subject: [PATCH 01/18] Fixed #390 Spread operator does not assign super class methods --- .../transaction/AccountAddressRestrictionTransaction.ts | 4 ++-- .../transaction/AccountMosaicRestrictionTransaction.ts | 4 ++-- src/model/transaction/LockFundsTransaction.ts | 4 ++-- .../transaction/MosaicAddressRestrictionTransaction.ts | 4 ++-- .../transaction/MosaicGlobalRestrictionTransaction.ts | 4 ++-- src/model/transaction/MosaicMetadataTransaction.ts | 4 ++-- src/model/transaction/MosaicSupplyChangeTransaction.ts | 4 ++-- src/model/transaction/SecretLockTransaction.ts | 4 ++-- src/model/transaction/SecretProofTransaction.ts | 4 ++-- src/model/transaction/Transaction.ts | 2 +- src/model/transaction/TransferTransaction.ts | 7 ++++--- test/model/transaction/AccountLinkTransaction.spec.ts | 3 +++ test/model/transaction/AccountMetadataTransaction.spec.ts | 3 +++ test/model/transaction/AggregateTransaction.spec.ts | 6 ++++++ test/model/transaction/LockFundsTransaction.spec.ts | 6 ++++++ .../MosaicAddressRestrictionTransaction.spec.ts | 6 ++++++ test/model/transaction/MosaicAliasTransaction.spec.ts | 3 +++ test/model/transaction/MosaicDefinitionTransaction.spec.ts | 3 +++ .../transaction/MosaicGlobalRestrictionTransaction.spec.ts | 6 ++++++ test/model/transaction/MosaicMetadataTransaction.spec.ts | 6 ++++++ .../transaction/MosaicSupplyChangeTransaction.spec.ts | 5 +++++ .../MultisigAccountModificationTransaction.spec.ts | 3 +++ .../model/transaction/NamespaceMetadataTransaction.spec.ts | 3 +++ .../transaction/NamespaceRegistrationTransaction.spec.ts | 3 +++ test/model/transaction/SecretLockTransaction.spec.ts | 5 +++++ test/model/transaction/SecretProofTransaction.spec.ts | 5 +++++ test/model/transaction/TransferTransaction.spec.ts | 6 ++++++ 27 files changed, 95 insertions(+), 22 deletions(-) diff --git a/src/model/transaction/AccountAddressRestrictionTransaction.ts b/src/model/transaction/AccountAddressRestrictionTransaction.ts index 66f2b2fafd..5aff4bee0e 100644 --- a/src/model/transaction/AccountAddressRestrictionTransaction.ts +++ b/src/model/transaction/AccountAddressRestrictionTransaction.ts @@ -199,13 +199,13 @@ export class AccountAddressRestrictionTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): AccountAddressRestrictionTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return {...Object.getPrototypeOf(this), + return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { restrictionAdditions: this.restrictionAdditions.map((addition) => statement.resolveAddress(addition, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)), restrictionDeletions: this.restrictionDeletions.map((deletion) => statement.resolveAddress(deletion, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)), - }; + }); } } diff --git a/src/model/transaction/AccountMosaicRestrictionTransaction.ts b/src/model/transaction/AccountMosaicRestrictionTransaction.ts index c739b574b8..b6428e83c7 100644 --- a/src/model/transaction/AccountMosaicRestrictionTransaction.ts +++ b/src/model/transaction/AccountMosaicRestrictionTransaction.ts @@ -199,13 +199,13 @@ export class AccountMosaicRestrictionTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): AccountMosaicRestrictionTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return {...Object.getPrototypeOf(this), + return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { restrictionAdditions: this.restrictionAdditions.map((addition) => statement.resolveMosaicId(addition, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)), restrictionDeletions: this.restrictionDeletions.map((deletion) => statement.resolveMosaicId(deletion, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)), - }; + }); } } diff --git a/src/model/transaction/LockFundsTransaction.ts b/src/model/transaction/LockFundsTransaction.ts index 3bab2f98aa..c4154e9fda 100644 --- a/src/model/transaction/LockFundsTransaction.ts +++ b/src/model/transaction/LockFundsTransaction.ts @@ -212,8 +212,8 @@ export class LockFundsTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): LockFundsTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return {...Object.getPrototypeOf(this), + return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { mosaic: statement.resolveMosaic(this.mosaic, transactionInfo.height.toString(), - transactionInfo.index, aggregateTransactionIndex)}; + transactionInfo.index, aggregateTransactionIndex)}); } } diff --git a/src/model/transaction/MosaicAddressRestrictionTransaction.ts b/src/model/transaction/MosaicAddressRestrictionTransaction.ts index 7323856186..44b9ce1682 100644 --- a/src/model/transaction/MosaicAddressRestrictionTransaction.ts +++ b/src/model/transaction/MosaicAddressRestrictionTransaction.ts @@ -243,10 +243,10 @@ export class MosaicAddressRestrictionTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): MosaicAddressRestrictionTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return {...Object.getPrototypeOf(this), + return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { mosaicId: statement.resolveMosaicId(this.mosaicId, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex), targetAddress: statement.resolveAddress(this.targetAddress, - transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)}; + transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)}); } } diff --git a/src/model/transaction/MosaicGlobalRestrictionTransaction.ts b/src/model/transaction/MosaicGlobalRestrictionTransaction.ts index 35ff2de88e..a172d6da29 100644 --- a/src/model/transaction/MosaicGlobalRestrictionTransaction.ts +++ b/src/model/transaction/MosaicGlobalRestrictionTransaction.ts @@ -253,10 +253,10 @@ export class MosaicGlobalRestrictionTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): MosaicGlobalRestrictionTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return {...Object.getPrototypeOf(this), + return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { mosaicId: statement.resolveMosaicId(this.mosaicId, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex), referenceMosaicId: statement.resolveMosaicId(this.referenceMosaicId, transactionInfo.height.toString(), - transactionInfo.index, aggregateTransactionIndex)}; + transactionInfo.index, aggregateTransactionIndex)}); } } diff --git a/src/model/transaction/MosaicMetadataTransaction.ts b/src/model/transaction/MosaicMetadataTransaction.ts index ce5b5135cf..b161f8766d 100644 --- a/src/model/transaction/MosaicMetadataTransaction.ts +++ b/src/model/transaction/MosaicMetadataTransaction.ts @@ -219,8 +219,8 @@ export class MosaicMetadataTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): MosaicMetadataTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return {...Object.getPrototypeOf(this), + return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { targetMosaicId: statement.resolveMosaicId(this.targetMosaicId, transactionInfo.height.toString(), - transactionInfo.index, aggregateTransactionIndex)}; + transactionInfo.index, aggregateTransactionIndex)}); } } diff --git a/src/model/transaction/MosaicSupplyChangeTransaction.ts b/src/model/transaction/MosaicSupplyChangeTransaction.ts index 3e6b2685cb..69eae71d37 100644 --- a/src/model/transaction/MosaicSupplyChangeTransaction.ts +++ b/src/model/transaction/MosaicSupplyChangeTransaction.ts @@ -193,8 +193,8 @@ export class MosaicSupplyChangeTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): MosaicSupplyChangeTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return {...Object.getPrototypeOf(this), + return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { mosaicId: statement.resolveMosaicId(this.mosaicId, transactionInfo.height.toString(), - transactionInfo.index, aggregateTransactionIndex)}; + transactionInfo.index, aggregateTransactionIndex)}); } } diff --git a/src/model/transaction/SecretLockTransaction.ts b/src/model/transaction/SecretLockTransaction.ts index 3606ede7e7..6dc523b95e 100644 --- a/src/model/transaction/SecretLockTransaction.ts +++ b/src/model/transaction/SecretLockTransaction.ts @@ -240,10 +240,10 @@ export class SecretLockTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): SecretLockTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return {...Object.getPrototypeOf(this), + return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { recipientAddress: statement.resolveAddress(this.recipientAddress, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex), mosaic: statement.resolveMosaic(this.mosaic, transactionInfo.height.toString(), - transactionInfo.index, aggregateTransactionIndex)}; + transactionInfo.index, aggregateTransactionIndex)}); } } diff --git a/src/model/transaction/SecretProofTransaction.ts b/src/model/transaction/SecretProofTransaction.ts index 2c3a9de798..9ecca5ae92 100644 --- a/src/model/transaction/SecretProofTransaction.ts +++ b/src/model/transaction/SecretProofTransaction.ts @@ -223,8 +223,8 @@ export class SecretProofTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): SecretProofTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return {...Object.getPrototypeOf(this), + return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { recipientAddress: statement.resolveAddress(this.recipientAddress, - transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)}; + transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)}); } } diff --git a/src/model/transaction/Transaction.ts b/src/model/transaction/Transaction.ts index f42edc8415..8e7010c4d1 100644 --- a/src/model/transaction/Transaction.ts +++ b/src/model/transaction/Transaction.ts @@ -200,7 +200,7 @@ export abstract class Transaction { * @returns {TransferTransaction} */ public setMaxFee(feeMultiplier: number): Transaction { - return {...Object.getPrototypeOf(this), maxFee: UInt64.fromUint(this.size * feeMultiplier)}; + return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, {maxFee: UInt64.fromUint(this.size * feeMultiplier)}); } /** diff --git a/src/model/transaction/TransferTransaction.ts b/src/model/transaction/TransferTransaction.ts index d858927b9e..923a5b4b04 100644 --- a/src/model/transaction/TransferTransaction.ts +++ b/src/model/transaction/TransferTransaction.ts @@ -282,9 +282,10 @@ export class TransferTransaction extends Transaction { */ public resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): TransferTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return {...Object.getPrototypeOf(this), recipientAddress: statement.resolveAddress(this.recipientAddress, - transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex), + return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, + {recipientAddress: statement.resolveAddress(this.recipientAddress, transactionInfo.height.toString(), + transactionInfo.index, aggregateTransactionIndex), mosaics: this.mosaics.map((mosaic) => statement.resolveMosaic(mosaic, transactionInfo.height.toString(), - transactionInfo.index, aggregateTransactionIndex))}; + transactionInfo.index, aggregateTransactionIndex))}); } } diff --git a/test/model/transaction/AccountLinkTransaction.spec.ts b/test/model/transaction/AccountLinkTransaction.spec.ts index aed6cb72c6..f197c25f37 100644 --- a/test/model/transaction/AccountLinkTransaction.spec.ts +++ b/test/model/transaction/AccountLinkTransaction.spec.ts @@ -116,5 +116,8 @@ describe('AccountLinkTransaction', () => { ).setMaxFee(2); ​ expect(accountLinkTransaction.maxFee.compact()).to.be.equal(322); + + const signedTransaction = accountLinkTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/AccountMetadataTransaction.spec.ts b/test/model/transaction/AccountMetadataTransaction.spec.ts index ecf15db7be..0ceecdffff 100644 --- a/test/model/transaction/AccountMetadataTransaction.spec.ts +++ b/test/model/transaction/AccountMetadataTransaction.spec.ts @@ -103,6 +103,9 @@ describe('AccountMetadataTransaction', () => { expect(Convert.hexToUint8(accountMetadataTransaction.serialize()).length).to.be.equal(accountMetadataTransaction.size); expect(accountMetadataTransaction.size).to.be.equal(182); + + const signedTransaction = accountMetadataTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); }); diff --git a/test/model/transaction/AggregateTransaction.spec.ts b/test/model/transaction/AggregateTransaction.spec.ts index 5ae0e31825..d7eb524dec 100644 --- a/test/model/transaction/AggregateTransaction.spec.ts +++ b/test/model/transaction/AggregateTransaction.spec.ts @@ -582,6 +582,9 @@ describe('AggregateTransaction', () => { ).setMaxFee(2); ​ expect(aggregateTransaction.maxFee.compact()).to.be.equal(560); + + const signedTransaction = aggregateTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); it('Test resolveAlias can resolve', () => { @@ -614,5 +617,8 @@ describe('AggregateTransaction', () => { expect(innerTransaction.mosaics[0].id instanceof MosaicId).to.be.true; expect((innerTransaction.recipientAddress as Address).equals(account.address)).to.be.true; expect((innerTransaction.mosaics[0].id as MosaicId).equals(resolvedMosaicId)).to.be.true; + + const signedTransaction = aggregateTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/LockFundsTransaction.spec.ts b/test/model/transaction/LockFundsTransaction.spec.ts index ddcf970822..b5016e198d 100644 --- a/test/model/transaction/LockFundsTransaction.spec.ts +++ b/test/model/transaction/LockFundsTransaction.spec.ts @@ -181,6 +181,9 @@ describe('LockFundsTransaction', () => { ).setMaxFee(2); ​ expect(lockFundsTransaction.maxFee.compact()).to.be.equal(368); + + const signedTransactionTest = lockFundsTransaction.signWith(account, generationHash); + expect(signedTransactionTest.hash).not.to.be.undefined; }); it('Test resolveAlias can resolve', () => { @@ -205,5 +208,8 @@ describe('LockFundsTransaction', () => { ​ expect(transaction.mosaic.id instanceof MosaicId).to.be.true; expect((transaction.mosaic.id as MosaicId).equals(resolvedMosaicId)).to.be.true; + + const signedTransactionTest = transaction.signWith(account, generationHash); + expect(signedTransactionTest.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/MosaicAddressRestrictionTransaction.spec.ts b/test/model/transaction/MosaicAddressRestrictionTransaction.spec.ts index 3783e40f9e..53bbbe7a96 100644 --- a/test/model/transaction/MosaicAddressRestrictionTransaction.spec.ts +++ b/test/model/transaction/MosaicAddressRestrictionTransaction.spec.ts @@ -164,6 +164,9 @@ describe('MosaicAddressRestrictionTransaction', () => { ).setMaxFee(2); ​ expect(transaction.maxFee.compact()).to.be.equal(370); + + const signedTransaction = transaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); it('Test resolveAlias can resolve', () => { @@ -185,5 +188,8 @@ describe('MosaicAddressRestrictionTransaction', () => { expect(transaction.mosaicId instanceof MosaicId).to.be.true; expect((transaction.targetAddress as Address).equals(account.address)).to.be.true; expect((transaction.mosaicId as MosaicId).equals(resolvedMosaicId)).to.be.true; + + const signedTransaction = transaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/MosaicAliasTransaction.spec.ts b/test/model/transaction/MosaicAliasTransaction.spec.ts index a9c9f698a3..3e9f775b44 100644 --- a/test/model/transaction/MosaicAliasTransaction.spec.ts +++ b/test/model/transaction/MosaicAliasTransaction.spec.ts @@ -118,5 +118,8 @@ describe('MosaicAliasTransaction', () => { ).setMaxFee(2); ​ expect(mosaicAliasTransaction.maxFee.compact()).to.be.equal(290); + + const signedTransaction = mosaicAliasTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/MosaicDefinitionTransaction.spec.ts b/test/model/transaction/MosaicDefinitionTransaction.spec.ts index 0de595a09a..9be5cb72b5 100644 --- a/test/model/transaction/MosaicDefinitionTransaction.spec.ts +++ b/test/model/transaction/MosaicDefinitionTransaction.spec.ts @@ -172,5 +172,8 @@ describe('MosaicDefinitionTransaction', () => { ).setMaxFee(2); ​ expect(mosaicDefinitionTransaction.maxFee.compact()).to.be.equal(300); + + const signedTransaction = mosaicDefinitionTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/MosaicGlobalRestrictionTransaction.spec.ts b/test/model/transaction/MosaicGlobalRestrictionTransaction.spec.ts index a4b387dcd5..846f631733 100644 --- a/test/model/transaction/MosaicGlobalRestrictionTransaction.spec.ts +++ b/test/model/transaction/MosaicGlobalRestrictionTransaction.spec.ts @@ -162,6 +162,9 @@ describe('MosaicGlobalRestrictionTransaction', () => { ).setMaxFee(2); ​ expect(mosaicGlobalRestrictionTransaction.maxFee.compact()).to.be.equal(340); + + const signedTransaction = mosaicGlobalRestrictionTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); it('Test resolveAlias can resolve', () => { @@ -185,5 +188,8 @@ describe('MosaicGlobalRestrictionTransaction', () => { expect((mosaicGlobalRestrictionTransaction.mosaicId as MosaicId).equals(resolvedMosaicId)).to.be.true; expect(mosaicGlobalRestrictionTransaction.referenceMosaicId instanceof MosaicId).to.be.true; expect((mosaicGlobalRestrictionTransaction.referenceMosaicId as MosaicId).equals(resolvedMosaicId)).to.be.true; + + const signedTransaction = mosaicGlobalRestrictionTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/MosaicMetadataTransaction.spec.ts b/test/model/transaction/MosaicMetadataTransaction.spec.ts index bea46583b2..c55ad3efed 100644 --- a/test/model/transaction/MosaicMetadataTransaction.spec.ts +++ b/test/model/transaction/MosaicMetadataTransaction.spec.ts @@ -161,6 +161,9 @@ describe('MosaicMetadataTransaction', () => { ).setMaxFee(2); ​ expect(mosaicMetadataTransaction.maxFee.compact()).to.be.equal(380); + + const signedTransaction = mosaicMetadataTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); it('Test resolveAlias can resolve', () => { @@ -180,5 +183,8 @@ describe('MosaicMetadataTransaction', () => { ​ expect(mosaicMetadataTransaction.targetMosaicId instanceof MosaicId).to.be.true; expect((mosaicMetadataTransaction.targetMosaicId as MosaicId).equals(resolvedMosaicId)).to.be.true; + + const signedTransaction = mosaicMetadataTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/MosaicSupplyChangeTransaction.spec.ts b/test/model/transaction/MosaicSupplyChangeTransaction.spec.ts index 805a1f592c..77f2fdaa90 100644 --- a/test/model/transaction/MosaicSupplyChangeTransaction.spec.ts +++ b/test/model/transaction/MosaicSupplyChangeTransaction.spec.ts @@ -127,6 +127,8 @@ describe('MosaicSupplyChangeTransaction', () => { ).setMaxFee(2); ​ expect(mosaicSupplyChangeTransaction.maxFee.compact()).to.be.equal(290); + const signedTransaction = mosaicSupplyChangeTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); it('Test resolveAlias can resolve', () => { @@ -144,5 +146,8 @@ describe('MosaicSupplyChangeTransaction', () => { ​ expect(mosaicSupplyChangeTransaction.mosaicId instanceof MosaicId).to.be.true; expect((mosaicSupplyChangeTransaction.mosaicId as MosaicId).equals(resolvedMosaicId)).to.be.true; + + const signedTransaction = mosaicSupplyChangeTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/MultisigAccountModificationTransaction.spec.ts b/test/model/transaction/MultisigAccountModificationTransaction.spec.ts index 1b1f4e3707..ff5a2ae193 100644 --- a/test/model/transaction/MultisigAccountModificationTransaction.spec.ts +++ b/test/model/transaction/MultisigAccountModificationTransaction.spec.ts @@ -134,5 +134,8 @@ describe('MultisigAccountModificationTransaction', () => { ).setMaxFee(2); ​ expect(modifyMultisigAccountTransaction.maxFee.compact()).to.be.equal(336); + + const signedTransaction = modifyMultisigAccountTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/NamespaceMetadataTransaction.spec.ts b/test/model/transaction/NamespaceMetadataTransaction.spec.ts index cd881f49b3..27688408c5 100644 --- a/test/model/transaction/NamespaceMetadataTransaction.spec.ts +++ b/test/model/transaction/NamespaceMetadataTransaction.spec.ts @@ -124,5 +124,8 @@ describe('NamespaceMetadataTransaction', () => { ).setMaxFee(2); ​ expect(namespaceMetadataTransaction.maxFee.compact()).to.be.equal(380); + + const signedTransaction = namespaceMetadataTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/NamespaceRegistrationTransaction.spec.ts b/test/model/transaction/NamespaceRegistrationTransaction.spec.ts index c24ebfe45b..921a3bd457 100644 --- a/test/model/transaction/NamespaceRegistrationTransaction.spec.ts +++ b/test/model/transaction/NamespaceRegistrationTransaction.spec.ts @@ -131,5 +131,8 @@ describe('NamespaceRegistrationTransaction', () => { ).setMaxFee(2); ​ expect(registerNamespaceTransaction.maxFee.compact()).to.be.equal(330); + + const signedTransaction = registerNamespaceTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/SecretLockTransaction.spec.ts b/test/model/transaction/SecretLockTransaction.spec.ts index 9cb2c2c33c..612b1ef7b8 100644 --- a/test/model/transaction/SecretLockTransaction.spec.ts +++ b/test/model/transaction/SecretLockTransaction.spec.ts @@ -300,6 +300,8 @@ describe('SecretLockTransaction', () => { ).setMaxFee(2); ​ expect(secretLockTransaction.maxFee.compact()).to.be.equal(420); + const signedTransaction = secretLockTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); it('Test resolveAlias can resolve', () => { @@ -322,5 +324,8 @@ describe('SecretLockTransaction', () => { expect(secretLockTransaction.mosaic.id instanceof MosaicId).to.be.true; expect((secretLockTransaction.recipientAddress as Address).equals(account.address)).to.be.true; expect((secretLockTransaction.mosaic.id as MosaicId).equals(mosaicId)).to.be.true; + + const signedTransaction = secretLockTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/SecretProofTransaction.spec.ts b/test/model/transaction/SecretProofTransaction.spec.ts index 7092f966e7..f6c2eece9e 100644 --- a/test/model/transaction/SecretProofTransaction.spec.ts +++ b/test/model/transaction/SecretProofTransaction.spec.ts @@ -257,6 +257,8 @@ describe('SecretProofTransaction', () => { ).setMaxFee(2); ​ expect(secretProofTransaction.maxFee.compact()).to.be.equal(440); + const signedTransaction = secretProofTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); it('Test resolveAlias can resolve', () => { @@ -276,5 +278,8 @@ describe('SecretProofTransaction', () => { ​ expect(transferTransaction.recipientAddress instanceof Address).to.be.true; expect((transferTransaction.recipientAddress as Address).equals(account.address)).to.be.true; + + const signedTransaction = transferTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/TransferTransaction.spec.ts b/test/model/transaction/TransferTransaction.spec.ts index 6626d55eaf..83e3d09d9b 100644 --- a/test/model/transaction/TransferTransaction.spec.ts +++ b/test/model/transaction/TransferTransaction.spec.ts @@ -407,6 +407,9 @@ describe('TransferTransaction', () => { ).setMaxFee(2); ​ expect(transferTransaction.maxFee.compact()).to.be.equal(378); + + const signedTransaction = transferTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); it('Test resolveAlias can resolve', () => { @@ -426,5 +429,8 @@ describe('TransferTransaction', () => { expect(transferTransaction.mosaics[0].id instanceof MosaicId).to.be.true; expect((transferTransaction.recipientAddress as Address).equals(account.address)).to.be.true; expect((transferTransaction.mosaics[0].id as MosaicId).equals(mosaicId)).to.be.true; + + const signedTransaction = transferTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); From faaef7f83661b459972e7b473fea30ee66649231 Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Fri, 20 Dec 2019 21:27:50 +0000 Subject: [PATCH 02/18] Fixed #393 applied catbuffer generator on aggregate --- .../AggregateBondedTransactionBuilder.ts | 8 +- .../AggregateCompleteTransactionBuilder.ts | 8 +- .../AggregateTransactionBodyBuilder.ts | 52 ++- .../catbuffer/BalanceChangeReceiptBuilder.ts | 111 +++++ .../BalanceTransferReceiptBuilder.ts | 132 ++++++ .../catbuffer/BlockHeaderBuilder.ts | 387 ++++++++++++++++++ .../catbuffer/EmbeddedTransactionHelper.ts | 181 ++++++++ src/infrastructure/catbuffer/EntityTypeDto.ts | 40 ++ .../catbuffer/GeneratorUtils.ts | 9 + .../catbuffer/InflationReceiptBuilder.ts | 92 +++++ .../catbuffer/MosaicExpiryReceiptBuilder.ts | 92 +++++ .../NamespaceExpiryReceiptBuilder.ts | 92 +++++ .../catbuffer/ReceiptBuilder.ts | 108 +++++ .../catbuffer/ReceiptTypeDto.ts | 27 ++ .../AccountAddressRestrictionTransaction.ts | 8 +- .../transaction/AccountLinkTransaction.ts | 8 +- .../transaction/AccountMetadataTransaction.ts | 8 +- .../AccountMosaicRestrictionTransaction.ts | 8 +- .../AccountOperationRestrictionTransaction.ts | 8 +- .../transaction/AddressAliasTransaction.ts | 8 +- src/model/transaction/AggregateTransaction.ts | 58 +-- src/model/transaction/LockFundsTransaction.ts | 8 +- .../MosaicAddressRestrictionTransaction.ts | 8 +- .../transaction/MosaicAliasTransaction.ts | 8 +- .../MosaicDefinitionTransaction.ts | 8 +- .../MosaicGlobalRestrictionTransaction.ts | 8 +- .../transaction/MosaicMetadataTransaction.ts | 8 +- .../MosaicSupplyChangeTransaction.ts | 8 +- .../MultisigAccountModificationTransaction.ts | 8 +- .../NamespaceMetadataTransaction.ts | 8 +- .../NamespaceRegistrationTransaction.ts | 30 +- .../transaction/SecretLockTransaction.ts | 8 +- .../transaction/SecretProofTransaction.ts | 8 +- src/model/transaction/Transaction.ts | 8 +- src/model/transaction/TransferTransaction.ts | 8 +- test/model/transaction/Transaction.spec.ts | 3 +- 36 files changed, 1431 insertions(+), 151 deletions(-) create mode 100644 src/infrastructure/catbuffer/BalanceChangeReceiptBuilder.ts create mode 100644 src/infrastructure/catbuffer/BalanceTransferReceiptBuilder.ts create mode 100644 src/infrastructure/catbuffer/BlockHeaderBuilder.ts create mode 100644 src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts create mode 100644 src/infrastructure/catbuffer/InflationReceiptBuilder.ts create mode 100644 src/infrastructure/catbuffer/MosaicExpiryReceiptBuilder.ts create mode 100644 src/infrastructure/catbuffer/NamespaceExpiryReceiptBuilder.ts create mode 100644 src/infrastructure/catbuffer/ReceiptBuilder.ts create mode 100644 src/infrastructure/catbuffer/ReceiptTypeDto.ts diff --git a/src/infrastructure/catbuffer/AggregateBondedTransactionBuilder.ts b/src/infrastructure/catbuffer/AggregateBondedTransactionBuilder.ts index 56f42da250..ba3b56b75f 100644 --- a/src/infrastructure/catbuffer/AggregateBondedTransactionBuilder.ts +++ b/src/infrastructure/catbuffer/AggregateBondedTransactionBuilder.ts @@ -21,6 +21,8 @@ import { AggregateTransactionBodyBuilder } from './AggregateTransactionBodyBuilder'; import { AmountDto } from './AmountDto'; +import { CosignatureBuilder } from './CosignatureBuilder'; +import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder'; import { EntityTypeDto } from './EntityTypeDto'; import { GeneratorUtils } from './GeneratorUtils'; import { Hash256Dto } from './Hash256Dto'; @@ -50,7 +52,7 @@ export class AggregateBondedTransactionBuilder extends TransactionBuilder { * @param cosignatures Cosignatures data (fills remaining body space after transactions). */ // tslint:disable-next-line: max-line-length - public constructor(signature: SignatureDto, signerPublicKey: KeyDto, version: number, network: NetworkTypeDto, type: EntityTypeDto, fee: AmountDto, deadline: TimestampDto, transactionsHash: Hash256Dto, transactions: Uint8Array, cosignatures: Uint8Array) { + public constructor(signature: SignatureDto, signerPublicKey: KeyDto, version: number, network: NetworkTypeDto, type: EntityTypeDto, fee: AmountDto, deadline: TimestampDto, transactionsHash: Hash256Dto, transactions: EmbeddedTransactionBuilder[], cosignatures: CosignatureBuilder[]) { super(signature, signerPublicKey, version, network, type, fee, deadline); this.aggregateTransactionBody = new AggregateTransactionBodyBuilder(transactionsHash, transactions, cosignatures); } @@ -94,7 +96,7 @@ export class AggregateBondedTransactionBuilder extends TransactionBuilder { * * @return Sub-transaction data (transactions are variable sized and payload size is in bytes). */ - public getTransactions(): Uint8Array { + public getTransactions(): EmbeddedTransactionBuilder[] { return this.aggregateTransactionBody.getTransactions(); } @@ -103,7 +105,7 @@ export class AggregateBondedTransactionBuilder extends TransactionBuilder { * * @return Cosignatures data (fills remaining body space after transactions). */ - public getCosignatures(): Uint8Array { + public getCosignatures(): CosignatureBuilder[] { return this.aggregateTransactionBody.getCosignatures(); } diff --git a/src/infrastructure/catbuffer/AggregateCompleteTransactionBuilder.ts b/src/infrastructure/catbuffer/AggregateCompleteTransactionBuilder.ts index 6dd372648f..f6b6e0983e 100644 --- a/src/infrastructure/catbuffer/AggregateCompleteTransactionBuilder.ts +++ b/src/infrastructure/catbuffer/AggregateCompleteTransactionBuilder.ts @@ -21,6 +21,8 @@ import { AggregateTransactionBodyBuilder } from './AggregateTransactionBodyBuilder'; import { AmountDto } from './AmountDto'; +import { CosignatureBuilder } from './CosignatureBuilder'; +import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder'; import { EntityTypeDto } from './EntityTypeDto'; import { GeneratorUtils } from './GeneratorUtils'; import { Hash256Dto } from './Hash256Dto'; @@ -50,7 +52,7 @@ export class AggregateCompleteTransactionBuilder extends TransactionBuilder { * @param cosignatures Cosignatures data (fills remaining body space after transactions). */ // tslint:disable-next-line: max-line-length - public constructor(signature: SignatureDto, signerPublicKey: KeyDto, version: number, network: NetworkTypeDto, type: EntityTypeDto, fee: AmountDto, deadline: TimestampDto, transactionsHash: Hash256Dto, transactions: Uint8Array, cosignatures: Uint8Array) { + public constructor(signature: SignatureDto, signerPublicKey: KeyDto, version: number, network: NetworkTypeDto, type: EntityTypeDto, fee: AmountDto, deadline: TimestampDto, transactionsHash: Hash256Dto, transactions: EmbeddedTransactionBuilder[], cosignatures: CosignatureBuilder[]) { super(signature, signerPublicKey, version, network, type, fee, deadline); this.aggregateTransactionBody = new AggregateTransactionBodyBuilder(transactionsHash, transactions, cosignatures); } @@ -94,7 +96,7 @@ export class AggregateCompleteTransactionBuilder extends TransactionBuilder { * * @return Sub-transaction data (transactions are variable sized and payload size is in bytes). */ - public getTransactions(): Uint8Array { + public getTransactions(): EmbeddedTransactionBuilder[] { return this.aggregateTransactionBody.getTransactions(); } @@ -103,7 +105,7 @@ export class AggregateCompleteTransactionBuilder extends TransactionBuilder { * * @return Cosignatures data (fills remaining body space after transactions). */ - public getCosignatures(): Uint8Array { + public getCosignatures(): CosignatureBuilder[] { return this.aggregateTransactionBody.getCosignatures(); } diff --git a/src/infrastructure/catbuffer/AggregateTransactionBodyBuilder.ts b/src/infrastructure/catbuffer/AggregateTransactionBodyBuilder.ts index b4de916720..5dd2492e47 100644 --- a/src/infrastructure/catbuffer/AggregateTransactionBodyBuilder.ts +++ b/src/infrastructure/catbuffer/AggregateTransactionBodyBuilder.ts @@ -19,6 +19,9 @@ *** along with Catapult. If not, see . **/ +import { CosignatureBuilder } from './CosignatureBuilder'; +import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder'; +import { EmbeddedTransactionHelper } from './EmbeddedTransactionHelper'; import { GeneratorUtils } from './GeneratorUtils'; import { Hash256Dto } from './Hash256Dto'; @@ -29,9 +32,9 @@ export class AggregateTransactionBodyBuilder { /** Reserved padding to align end of AggregateTransactionHeader on 8-byte boundary. */ aggregateTransactionHeader_Reserved1: number; /** Sub-transaction data (transactions are variable sized and payload size is in bytes). */ - transactions: Uint8Array; + transactions: EmbeddedTransactionBuilder[]; /** Cosignatures data (fills remaining body space after transactions). */ - cosignatures: Uint8Array; + cosignatures: CosignatureBuilder[]; /** * Constructor. @@ -40,7 +43,8 @@ export class AggregateTransactionBodyBuilder { * @param transactions Sub-transaction data (transactions are variable sized and payload size is in bytes). * @param cosignatures Cosignatures data (fills remaining body space after transactions). */ - public constructor(transactionsHash: Hash256Dto, transactions: Uint8Array, cosignatures: Uint8Array) { + // tslint:disable-next-line: max-line-length + public constructor(transactionsHash: Hash256Dto, transactions: EmbeddedTransactionBuilder[], cosignatures: CosignatureBuilder[]) { this.transactionsHash = transactionsHash; this.aggregateTransactionHeader_Reserved1 = 0; this.transactions = transactions; @@ -62,9 +66,24 @@ export class AggregateTransactionBodyBuilder { // tslint:disable-next-line: max-line-length const aggregateTransactionHeader_Reserved1 = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4)); byteArray.splice(0, 4); - const transactions = GeneratorUtils.getBytes(Uint8Array.from(byteArray), payloadSize); - byteArray.splice(0, payloadSize); - const cosignatures = Uint8Array.from(byteArray); + let transactionsByteSize = payloadSize; + const transactions: EmbeddedTransactionBuilder[] = []; + while (transactionsByteSize > 0) { + const item = EmbeddedTransactionHelper.loadFromBinary(Uint8Array.from(byteArray)); + transactions.push(item); + const itemSize = item.getSize() + GeneratorUtils.getTransactionPaddingSize(item.getSize(), 8); + transactionsByteSize -= itemSize; + byteArray.splice(0, itemSize); + } + let cosignaturesByteSize = byteArray.length; + const cosignatures: CosignatureBuilder[] = []; + while (cosignaturesByteSize > 0) { + const item = CosignatureBuilder.loadFromBinary(Uint8Array.from(byteArray)); + cosignatures.push(item); + const itemSize = item.getSize(); + cosignaturesByteSize -= itemSize; + byteArray.splice(0, itemSize); + } return new AggregateTransactionBodyBuilder(transactionsHash, transactions, cosignatures); } @@ -91,7 +110,7 @@ export class AggregateTransactionBodyBuilder { * * @return Sub-transaction data (transactions are variable sized and payload size is in bytes). */ - public getTransactions(): Uint8Array { + public getTransactions(): EmbeddedTransactionBuilder[] { return this.transactions; } @@ -100,7 +119,7 @@ export class AggregateTransactionBodyBuilder { * * @return Cosignatures data (fills remaining body space after transactions). */ - public getCosignatures(): Uint8Array { + public getCosignatures(): CosignatureBuilder[] { return this.cosignatures; } @@ -114,8 +133,8 @@ export class AggregateTransactionBodyBuilder { size += this.transactionsHash.getSize(); size += 4; // payloadSize size += 4; // aggregateTransactionHeader_Reserved1 - size += this.transactions.length; - size += this.cosignatures.length; + this.transactions.forEach((o) => size += EmbeddedTransactionHelper.serialize(o).length); + this.cosignatures.forEach((o) => size += o.getSize()); return size; } @@ -128,13 +147,20 @@ export class AggregateTransactionBodyBuilder { let newArray = Uint8Array.from([]); const transactionsHashBytes = this.transactionsHash.serialize(); newArray = GeneratorUtils.concatTypedArrays(newArray, transactionsHashBytes); - const payloadSizeBytes = GeneratorUtils.uintToBuffer(this.transactions.length, 4); + // tslint:disable-next-line: max-line-length + const payloadSizeBytes = GeneratorUtils.uintToBuffer(EmbeddedTransactionHelper.getEmbeddedTransactionSize(this.transactions), 4); newArray = GeneratorUtils.concatTypedArrays(newArray, payloadSizeBytes); // tslint:disable-next-line: max-line-length const aggregateTransactionHeader_Reserved1Bytes = GeneratorUtils.uintToBuffer(this.getAggregateTransactionHeader_Reserved1(), 4); newArray = GeneratorUtils.concatTypedArrays(newArray, aggregateTransactionHeader_Reserved1Bytes); - newArray = GeneratorUtils.concatTypedArrays(newArray, this.transactions); - newArray = GeneratorUtils.concatTypedArrays(newArray, this.cosignatures); + this.transactions.forEach((item) => { + const transactionsBytes = EmbeddedTransactionHelper.serialize(item); + newArray = GeneratorUtils.concatTypedArrays(newArray, transactionsBytes); + }); + this.cosignatures.forEach((item) => { + const cosignaturesBytes = item.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, cosignaturesBytes); + }); return newArray; } } diff --git a/src/infrastructure/catbuffer/BalanceChangeReceiptBuilder.ts b/src/infrastructure/catbuffer/BalanceChangeReceiptBuilder.ts new file mode 100644 index 0000000000..7670f20e0f --- /dev/null +++ b/src/infrastructure/catbuffer/BalanceChangeReceiptBuilder.ts @@ -0,0 +1,111 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { GeneratorUtils } from './GeneratorUtils'; +import { KeyDto } from './KeyDto'; +import { MosaicBuilder } from './MosaicBuilder'; +import { ReceiptBuilder } from './ReceiptBuilder'; +import { ReceiptTypeDto } from './ReceiptTypeDto'; + +/** Binary layout for a balance change receipt. */ +export class BalanceChangeReceiptBuilder extends ReceiptBuilder { + /** Mosaic. */ + mosaic: MosaicBuilder; + /** Account public key. */ + targetPublicKey: KeyDto; + + /** + * Constructor. + * + * @param version Receipt version. + * @param type Receipt type. + * @param mosaic Mosaic. + * @param targetPublicKey Account public key. + */ + public constructor(version: number, type: ReceiptTypeDto, mosaic: MosaicBuilder, targetPublicKey: KeyDto) { + super(version, type); + this.mosaic = mosaic; + this.targetPublicKey = targetPublicKey; + } + + /** + * Creates an instance of BalanceChangeReceiptBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of BalanceChangeReceiptBuilder. + */ + public static loadFromBinary(payload: Uint8Array): BalanceChangeReceiptBuilder { + const byteArray = Array.from(payload); + const superObject = ReceiptBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, superObject.getSize()); + const mosaic = MosaicBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, mosaic.getSize()); + const targetPublicKey = KeyDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, targetPublicKey.getSize()); + return new BalanceChangeReceiptBuilder(superObject.version, superObject.type, mosaic, targetPublicKey); + } + + /** + * Gets mosaic. + * + * @return Mosaic. + */ + public getMosaic(): MosaicBuilder { + return this.mosaic; + } + + /** + * Gets account public key. + * + * @return Account public key. + */ + public getTargetPublicKey(): KeyDto { + return this.targetPublicKey; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size: number = super.getSize(); + size += this.mosaic.getSize(); + size += this.targetPublicKey.getSize(); + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const superBytes = super.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, superBytes); + const mosaicBytes = this.mosaic.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, mosaicBytes); + const targetPublicKeyBytes = this.targetPublicKey.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, targetPublicKeyBytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/BalanceTransferReceiptBuilder.ts b/src/infrastructure/catbuffer/BalanceTransferReceiptBuilder.ts new file mode 100644 index 0000000000..89215dc6c1 --- /dev/null +++ b/src/infrastructure/catbuffer/BalanceTransferReceiptBuilder.ts @@ -0,0 +1,132 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { AddressDto } from './AddressDto'; +import { GeneratorUtils } from './GeneratorUtils'; +import { KeyDto } from './KeyDto'; +import { MosaicBuilder } from './MosaicBuilder'; +import { ReceiptBuilder } from './ReceiptBuilder'; +import { ReceiptTypeDto } from './ReceiptTypeDto'; + +/** Binary layout for a balance transfer receipt. */ +export class BalanceTransferReceiptBuilder extends ReceiptBuilder { + /** Mosaic. */ + mosaic: MosaicBuilder; + /** Mosaic sender public key. */ + senderPublicKey: KeyDto; + /** Mosaic recipient address. */ + recipientAddress: AddressDto; + + /** + * Constructor. + * + * @param version Receipt version. + * @param type Receipt type. + * @param mosaic Mosaic. + * @param senderPublicKey Mosaic sender public key. + * @param recipientAddress Mosaic recipient address. + */ + // tslint:disable-next-line: max-line-length + public constructor(version: number, type: ReceiptTypeDto, mosaic: MosaicBuilder, senderPublicKey: KeyDto, recipientAddress: AddressDto) { + super(version, type); + this.mosaic = mosaic; + this.senderPublicKey = senderPublicKey; + this.recipientAddress = recipientAddress; + } + + /** + * Creates an instance of BalanceTransferReceiptBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of BalanceTransferReceiptBuilder. + */ + public static loadFromBinary(payload: Uint8Array): BalanceTransferReceiptBuilder { + const byteArray = Array.from(payload); + const superObject = ReceiptBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, superObject.getSize()); + const mosaic = MosaicBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, mosaic.getSize()); + const senderPublicKey = KeyDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, senderPublicKey.getSize()); + const recipientAddress = AddressDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, recipientAddress.getSize()); + // tslint:disable-next-line: max-line-length + return new BalanceTransferReceiptBuilder(superObject.version, superObject.type, mosaic, senderPublicKey, recipientAddress); + } + + /** + * Gets mosaic. + * + * @return Mosaic. + */ + public getMosaic(): MosaicBuilder { + return this.mosaic; + } + + /** + * Gets mosaic sender public key. + * + * @return Mosaic sender public key. + */ + public getSenderPublicKey(): KeyDto { + return this.senderPublicKey; + } + + /** + * Gets mosaic recipient address. + * + * @return Mosaic recipient address. + */ + public getRecipientAddress(): AddressDto { + return this.recipientAddress; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size: number = super.getSize(); + size += this.mosaic.getSize(); + size += this.senderPublicKey.getSize(); + size += this.recipientAddress.getSize(); + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const superBytes = super.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, superBytes); + const mosaicBytes = this.mosaic.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, mosaicBytes); + const senderPublicKeyBytes = this.senderPublicKey.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, senderPublicKeyBytes); + const recipientAddressBytes = this.recipientAddress.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, recipientAddressBytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/BlockHeaderBuilder.ts b/src/infrastructure/catbuffer/BlockHeaderBuilder.ts new file mode 100644 index 0000000000..eb693aa3fa --- /dev/null +++ b/src/infrastructure/catbuffer/BlockHeaderBuilder.ts @@ -0,0 +1,387 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { BlockFeeMultiplierDto } from './BlockFeeMultiplierDto'; +import { DifficultyDto } from './DifficultyDto'; +import { EntityTypeDto } from './EntityTypeDto'; +import { GeneratorUtils } from './GeneratorUtils'; +import { Hash256Dto } from './Hash256Dto'; +import { HeightDto } from './HeightDto'; +import { KeyDto } from './KeyDto'; +import { NetworkTypeDto } from './NetworkTypeDto'; +import { SignatureDto } from './SignatureDto'; +import { TimestampDto } from './TimestampDto'; + +/** Binary layout for a block header. */ +export class BlockHeaderBuilder { + /** Entity size. */ + size = 0; + /** Reserved padding to align Signature on 8-byte boundary. */ + verifiableEntityHeader_Reserved1: number; + /** Entity signature. */ + signature: SignatureDto; + /** Entity signer's public key. */ + signerPublicKey: KeyDto; + /** Reserved padding to align end of EntityBody on 8-byte boundary. */ + entityBody_Reserved1: number; + /** Entity version. */ + version: number; + /** Entity network. */ + network: NetworkTypeDto; + /** Entity type. */ + type: EntityTypeDto; + /** Block height. */ + height: HeightDto; + /** Number of milliseconds elapsed since creation of nemesis block. */ + timestamp: TimestampDto; + /** Block difficulty. */ + difficulty: DifficultyDto; + /** Previous block hash. */ + previousBlockHash: Hash256Dto; + /** Hash of the transactions in this block. */ + transactionsHash: Hash256Dto; + /** Hash of the receipts generated by this block. */ + receiptsHash: Hash256Dto; + /** Hash of the global chain state at this block. */ + stateHash: Hash256Dto; + /** Beneficiary public key designated by harvester. */ + beneficiaryPublicKey: KeyDto; + /** Fee multiplier applied to block transactions. */ + feeMultiplier: BlockFeeMultiplierDto; + /** Reserved padding to align end of BlockHeader on 8-byte boundary. */ + blockHeader_Reserved1: number; + + /** + * Constructor. + * + * @param signature Entity signature. + * @param signerPublicKey Entity signer's public key. + * @param version Entity version. + * @param network Entity network. + * @param type Entity type. + * @param height Block height. + * @param timestamp Number of milliseconds elapsed since creation of nemesis block. + * @param difficulty Block difficulty. + * @param previousBlockHash Previous block hash. + * @param transactionsHash Hash of the transactions in this block. + * @param receiptsHash Hash of the receipts generated by this block. + * @param stateHash Hash of the global chain state at this block. + * @param beneficiaryPublicKey Beneficiary public key designated by harvester. + * @param feeMultiplier Fee multiplier applied to block transactions. + */ + // tslint:disable-next-line: max-line-length + public constructor(signature: SignatureDto, signerPublicKey: KeyDto, version: number, network: NetworkTypeDto, type: EntityTypeDto, height: HeightDto, timestamp: TimestampDto, difficulty: DifficultyDto, previousBlockHash: Hash256Dto, transactionsHash: Hash256Dto, receiptsHash: Hash256Dto, stateHash: Hash256Dto, beneficiaryPublicKey: KeyDto, feeMultiplier: BlockFeeMultiplierDto) { + this.verifiableEntityHeader_Reserved1 = 0; + this.signature = signature; + this.signerPublicKey = signerPublicKey; + this.entityBody_Reserved1 = 0; + this.version = version; + this.network = network; + this.type = type; + this.height = height; + this.timestamp = timestamp; + this.difficulty = difficulty; + this.previousBlockHash = previousBlockHash; + this.transactionsHash = transactionsHash; + this.receiptsHash = receiptsHash; + this.stateHash = stateHash; + this.beneficiaryPublicKey = beneficiaryPublicKey; + this.feeMultiplier = feeMultiplier; + this.blockHeader_Reserved1 = 0; + } + + /** + * Creates an instance of BlockHeaderBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of BlockHeaderBuilder. + */ + public static loadFromBinary(payload: Uint8Array): BlockHeaderBuilder { + const byteArray = Array.from(payload); + const size = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4)); + byteArray.splice(0, 4); + // tslint:disable-next-line: max-line-length + const verifiableEntityHeader_Reserved1 = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4)); + byteArray.splice(0, 4); + const signature = SignatureDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, signature.getSize()); + const signerPublicKey = KeyDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, signerPublicKey.getSize()); + const entityBody_Reserved1 = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4)); + byteArray.splice(0, 4); + const version = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 1)); + byteArray.splice(0, 1); + const network = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 1)); + byteArray.splice(0, 1); + const type = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 2)); + byteArray.splice(0, 2); + const height = HeightDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, height.getSize()); + const timestamp = TimestampDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, timestamp.getSize()); + const difficulty = DifficultyDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, difficulty.getSize()); + const previousBlockHash = Hash256Dto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, previousBlockHash.getSize()); + const transactionsHash = Hash256Dto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, transactionsHash.getSize()); + const receiptsHash = Hash256Dto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, receiptsHash.getSize()); + const stateHash = Hash256Dto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, stateHash.getSize()); + const beneficiaryPublicKey = KeyDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, beneficiaryPublicKey.getSize()); + const feeMultiplier = BlockFeeMultiplierDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, feeMultiplier.getSize()); + const blockHeader_Reserved1 = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4)); + byteArray.splice(0, 4); + // tslint:disable-next-line: max-line-length + return new BlockHeaderBuilder(signature, signerPublicKey, version, network, type, height, timestamp, difficulty, previousBlockHash, transactionsHash, receiptsHash, stateHash, beneficiaryPublicKey, feeMultiplier); + } + + /** + * Gets reserved padding to align Signature on 8-byte boundary. + * + * @return Reserved padding to align Signature on 8-byte boundary. + */ + public getVerifiableEntityHeader_Reserved1(): number { + return this.verifiableEntityHeader_Reserved1; + } + + /** + * Gets entity signature. + * + * @return Entity signature. + */ + public getSignature(): SignatureDto { + return this.signature; + } + + /** + * Gets entity signer's public key. + * + * @return Entity signer's public key. + */ + public getSignerPublicKey(): KeyDto { + return this.signerPublicKey; + } + + /** + * Gets reserved padding to align end of EntityBody on 8-byte boundary. + * + * @return Reserved padding to align end of EntityBody on 8-byte boundary. + */ + public getEntityBody_Reserved1(): number { + return this.entityBody_Reserved1; + } + + /** + * Gets entity version. + * + * @return Entity version. + */ + public getVersion(): number { + return this.version; + } + + /** + * Gets entity network. + * + * @return Entity network. + */ + public getNetwork(): NetworkTypeDto { + return this.network; + } + + /** + * Gets entity type. + * + * @return Entity type. + */ + public getType(): EntityTypeDto { + return this.type; + } + + /** + * Gets block height. + * + * @return Block height. + */ + public getHeight(): HeightDto { + return this.height; + } + + /** + * Gets number of milliseconds elapsed since creation of nemesis block. + * + * @return Number of milliseconds elapsed since creation of nemesis block. + */ + public getTimestamp(): TimestampDto { + return this.timestamp; + } + + /** + * Gets block difficulty. + * + * @return Block difficulty. + */ + public getDifficulty(): DifficultyDto { + return this.difficulty; + } + + /** + * Gets previous block hash. + * + * @return Previous block hash. + */ + public getPreviousBlockHash(): Hash256Dto { + return this.previousBlockHash; + } + + /** + * Gets hash of the transactions in this block. + * + * @return Hash of the transactions in this block. + */ + public getTransactionsHash(): Hash256Dto { + return this.transactionsHash; + } + + /** + * Gets hash of the receipts generated by this block. + * + * @return Hash of the receipts generated by this block. + */ + public getReceiptsHash(): Hash256Dto { + return this.receiptsHash; + } + + /** + * Gets hash of the global chain state at this block. + * + * @return Hash of the global chain state at this block. + */ + public getStateHash(): Hash256Dto { + return this.stateHash; + } + + /** + * Gets beneficiary public key designated by harvester. + * + * @return Beneficiary public key designated by harvester. + */ + public getBeneficiaryPublicKey(): KeyDto { + return this.beneficiaryPublicKey; + } + + /** + * Gets fee multiplier applied to block transactions. + * + * @return Fee multiplier applied to block transactions. + */ + public getFeeMultiplier(): BlockFeeMultiplierDto { + return this.feeMultiplier; + } + + /** + * Gets reserved padding to align end of BlockHeader on 8-byte boundary. + * + * @return Reserved padding to align end of BlockHeader on 8-byte boundary. + */ + public getBlockHeader_Reserved1(): number { + return this.blockHeader_Reserved1; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size = 0; + size += 4; // size + size += 4; // verifiableEntityHeader_Reserved1 + size += this.signature.getSize(); + size += this.signerPublicKey.getSize(); + size += 4; // entityBody_Reserved1 + size += 1; // version + size += 1; // network + size += 2; // type + size += this.height.getSize(); + size += this.timestamp.getSize(); + size += this.difficulty.getSize(); + size += this.previousBlockHash.getSize(); + size += this.transactionsHash.getSize(); + size += this.receiptsHash.getSize(); + size += this.stateHash.getSize(); + size += this.beneficiaryPublicKey.getSize(); + size += this.feeMultiplier.getSize(); + size += 4; // blockHeader_Reserved1 + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const sizeBytes = GeneratorUtils.uintToBuffer(this.getSize(), 4); + newArray = GeneratorUtils.concatTypedArrays(newArray, sizeBytes); + // tslint:disable-next-line: max-line-length + const verifiableEntityHeader_Reserved1Bytes = GeneratorUtils.uintToBuffer(this.getVerifiableEntityHeader_Reserved1(), 4); + newArray = GeneratorUtils.concatTypedArrays(newArray, verifiableEntityHeader_Reserved1Bytes); + const signatureBytes = this.signature.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, signatureBytes); + const signerPublicKeyBytes = this.signerPublicKey.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, signerPublicKeyBytes); + const entityBody_Reserved1Bytes = GeneratorUtils.uintToBuffer(this.getEntityBody_Reserved1(), 4); + newArray = GeneratorUtils.concatTypedArrays(newArray, entityBody_Reserved1Bytes); + const versionBytes = GeneratorUtils.uintToBuffer(this.getVersion(), 1); + newArray = GeneratorUtils.concatTypedArrays(newArray, versionBytes); + const networkBytes = GeneratorUtils.uintToBuffer(this.network, 1); + newArray = GeneratorUtils.concatTypedArrays(newArray, networkBytes); + const typeBytes = GeneratorUtils.uintToBuffer(this.type, 2); + newArray = GeneratorUtils.concatTypedArrays(newArray, typeBytes); + const heightBytes = this.height.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, heightBytes); + const timestampBytes = this.timestamp.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, timestampBytes); + const difficultyBytes = this.difficulty.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, difficultyBytes); + const previousBlockHashBytes = this.previousBlockHash.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, previousBlockHashBytes); + const transactionsHashBytes = this.transactionsHash.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, transactionsHashBytes); + const receiptsHashBytes = this.receiptsHash.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, receiptsHashBytes); + const stateHashBytes = this.stateHash.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, stateHashBytes); + const beneficiaryPublicKeyBytes = this.beneficiaryPublicKey.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, beneficiaryPublicKeyBytes); + const feeMultiplierBytes = this.feeMultiplier.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, feeMultiplierBytes); + const blockHeader_Reserved1Bytes = GeneratorUtils.uintToBuffer(this.getBlockHeader_Reserved1(), 4); + newArray = GeneratorUtils.concatTypedArrays(newArray, blockHeader_Reserved1Bytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts b/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts new file mode 100644 index 0000000000..ad436cfc30 --- /dev/null +++ b/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts @@ -0,0 +1,181 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { EntityTypeDto } from './EntityTypeDto' +import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder' +import { GeneratorUtils } from './GeneratorUtils' +import { EmbeddedTransferTransactionBuilder } from './EmbeddedTransferTransactionBuilder' +import { EmbeddedAccountLinkTransactionBuilder } from './EmbeddedAccountLinkTransactionBuilder' +import { EmbeddedHashLockTransactionBuilder } from './EmbeddedHashLockTransactionBuilder' +import { EmbeddedSecretLockTransactionBuilder } from './EmbeddedSecretLockTransactionBuilder' +import { EmbeddedSecretProofTransactionBuilder } from './EmbeddedSecretProofTransactionBuilder' +import { EmbeddedAccountMetadataTransactionBuilder } from './EmbeddedAccountMetadataTransactionBuilder' +import { EmbeddedMosaicMetadataTransactionBuilder } from './EmbeddedMosaicMetadataTransactionBuilder' +import { EmbeddedNamespaceMetadataTransactionBuilder } from './EmbeddedNamespaceMetadataTransactionBuilder' +import { EmbeddedMosaicDefinitionTransactionBuilder } from './EmbeddedMosaicDefinitionTransactionBuilder' +import { EmbeddedMosaicSupplyChangeTransactionBuilder } from './EmbeddedMosaicSupplyChangeTransactionBuilder' +import { EmbeddedMultisigAccountModificationTransactionBuilder } from './EmbeddedMultisigAccountModificationTransactionBuilder' +import { EmbeddedAddressAliasTransactionBuilder } from './EmbeddedAddressAliasTransactionBuilder' +import { EmbeddedMosaicAliasTransactionBuilder } from './EmbeddedMosaicAliasTransactionBuilder' +import { EmbeddedNamespaceRegistrationTransactionBuilder } from './EmbeddedNamespaceRegistrationTransactionBuilder' +import { EmbeddedAccountAddressRestrictionTransactionBuilder } from './EmbeddedAccountAddressRestrictionTransactionBuilder' +import { EmbeddedAccountMosaicRestrictionTransactionBuilder } from './EmbeddedAccountMosaicRestrictionTransactionBuilder' +import { EmbeddedAccountOperationRestrictionTransactionBuilder } from './EmbeddedAccountOperationRestrictionTransactionBuilder' +import { EmbeddedMosaicAddressRestrictionTransactionBuilder } from './EmbeddedMosaicAddressRestrictionTransactionBuilder' +import { EmbeddedMosaicGlobalRestrictionTransactionBuilder } from './EmbeddedMosaicGlobalRestrictionTransactionBuilder' + +export class EmbeddedTransactionHelper { + + public static serialize(transaction: EmbeddedTransactionBuilder): Uint8Array { + let byte: Uint8Array; + let padding: Uint8Array; + switch (transaction.type) { + case EntityTypeDto.TRANSFER_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedTransferTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.ACCOUNT_LINK_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedAccountLinkTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.HASH_LOCK_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedHashLockTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.SECRET_LOCK_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedSecretLockTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.SECRET_PROOF_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedSecretProofTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.ACCOUNT_METADATA_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedAccountMetadataTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MOSAIC_METADATA_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMosaicMetadataTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.NAMESPACE_METADATA_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedNamespaceMetadataTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MOSAIC_DEFINITION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMosaicDefinitionTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MOSAIC_SUPPLY_CHANGE_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMosaicSupplyChangeTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MULTISIG_ACCOUNT_MODIFICATION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMultisigAccountModificationTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.ADDRESS_ALIAS_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedAddressAliasTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MOSAIC_ALIAS_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMosaicAliasTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.NAMESPACE_REGISTRATION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedNamespaceRegistrationTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.ACCOUNT_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedAccountAddressRestrictionTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.ACCOUNT_MOSAIC_RESTRICTION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedAccountMosaicRestrictionTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.ACCOUNT_OPERATION_RESTRICTION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedAccountOperationRestrictionTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MOSAIC_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMosaicAddressRestrictionTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MOSAIC_GLOBAL_RESTRICTION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMosaicGlobalRestrictionTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + default: + throw new Error(`Transaction type: ${transaction.type} not recognized.`) + } + } + + public static loadFromBinary(bytes: Uint8Array):EmbeddedTransactionBuilder { + const header = EmbeddedTransactionBuilder.loadFromBinary(bytes); + switch (header.getType()) { + case EntityTypeDto.TRANSFER_TRANSACTION_BUILDER: + return EmbeddedTransferTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.ACCOUNT_LINK_TRANSACTION_BUILDER: + return EmbeddedAccountLinkTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.HASH_LOCK_TRANSACTION_BUILDER: + return EmbeddedHashLockTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.SECRET_LOCK_TRANSACTION_BUILDER: + return EmbeddedSecretLockTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.SECRET_PROOF_TRANSACTION_BUILDER: + return EmbeddedSecretProofTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.ACCOUNT_METADATA_TRANSACTION_BUILDER: + return EmbeddedAccountMetadataTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MOSAIC_METADATA_TRANSACTION_BUILDER: + return EmbeddedMosaicMetadataTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.NAMESPACE_METADATA_TRANSACTION_BUILDER: + return EmbeddedNamespaceMetadataTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MOSAIC_DEFINITION_TRANSACTION_BUILDER: + return EmbeddedMosaicDefinitionTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MOSAIC_SUPPLY_CHANGE_TRANSACTION_BUILDER: + return EmbeddedMosaicSupplyChangeTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MULTISIG_ACCOUNT_MODIFICATION_TRANSACTION_BUILDER: + return EmbeddedMultisigAccountModificationTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.ADDRESS_ALIAS_TRANSACTION_BUILDER: + return EmbeddedAddressAliasTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MOSAIC_ALIAS_TRANSACTION_BUILDER: + return EmbeddedMosaicAliasTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.NAMESPACE_REGISTRATION_TRANSACTION_BUILDER: + return EmbeddedNamespaceRegistrationTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.ACCOUNT_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: + return EmbeddedAccountAddressRestrictionTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.ACCOUNT_MOSAIC_RESTRICTION_TRANSACTION_BUILDER: + return EmbeddedAccountMosaicRestrictionTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.ACCOUNT_OPERATION_RESTRICTION_TRANSACTION_BUILDER: + return EmbeddedAccountOperationRestrictionTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MOSAIC_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: + return EmbeddedMosaicAddressRestrictionTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MOSAIC_GLOBAL_RESTRICTION_TRANSACTION_BUILDER: + return EmbeddedMosaicGlobalRestrictionTransactionBuilder.loadFromBinary(bytes) + default: + throw new Error(`Transaction type: ${header.getType()} not recognized.`) + } + } + + public static getEmbeddedTransactionSize(transactions: EmbeddedTransactionBuilder[]): number { + return transactions.map((o) => EmbeddedTransactionHelper.serialize(o).length).reduce((a, b) => a + b, 0); + } +} diff --git a/src/infrastructure/catbuffer/EntityTypeDto.ts b/src/infrastructure/catbuffer/EntityTypeDto.ts index cbbf804d10..4399620a5c 100644 --- a/src/infrastructure/catbuffer/EntityTypeDto.ts +++ b/src/infrastructure/catbuffer/EntityTypeDto.ts @@ -26,4 +26,44 @@ export enum EntityTypeDto { RESERVED = 0, /** Transfer transaction builder. */ TRANSFER_TRANSACTION_BUILDER = 16724, + /** Account link transaction builder. */ + ACCOUNT_LINK_TRANSACTION_BUILDER = 16716, + /** Hash lock transaction builder. */ + HASH_LOCK_TRANSACTION_BUILDER = 16712, + /** Secret lock transaction builder. */ + SECRET_LOCK_TRANSACTION_BUILDER = 16722, + /** Secret proof transaction builder. */ + SECRET_PROOF_TRANSACTION_BUILDER = 16978, + /** Account metadata transaction builder. */ + ACCOUNT_METADATA_TRANSACTION_BUILDER = 16708, + /** Mosaic metadata transaction builder. */ + MOSAIC_METADATA_TRANSACTION_BUILDER = 16964, + /** Namespace metadata transaction builder. */ + NAMESPACE_METADATA_TRANSACTION_BUILDER = 17220, + /** Mosaic definition transaction builder. */ + MOSAIC_DEFINITION_TRANSACTION_BUILDER = 16717, + /** Mosaic supply change transaction builder. */ + MOSAIC_SUPPLY_CHANGE_TRANSACTION_BUILDER = 16973, + /** Multisig account modification transaction builder. */ + MULTISIG_ACCOUNT_MODIFICATION_TRANSACTION_BUILDER = 16725, + /** Address alias transaction builder. */ + ADDRESS_ALIAS_TRANSACTION_BUILDER = 16974, + /** Mosaic alias transaction builder. */ + MOSAIC_ALIAS_TRANSACTION_BUILDER = 17230, + /** Namespace registration transaction builder. */ + NAMESPACE_REGISTRATION_TRANSACTION_BUILDER = 16718, + /** Account address restriction transaction builder. */ + ACCOUNT_ADDRESS_RESTRICTION_TRANSACTION_BUILDER = 16720, + /** Account mosaic restriction transaction builder. */ + ACCOUNT_MOSAIC_RESTRICTION_TRANSACTION_BUILDER = 16976, + /** Account operation restriction transaction builder. */ + ACCOUNT_OPERATION_RESTRICTION_TRANSACTION_BUILDER = 17232, + /** Mosaic address restriction transaction builder. */ + MOSAIC_ADDRESS_RESTRICTION_TRANSACTION_BUILDER = 16977, + /** Mosaic global restriction transaction builder. */ + MOSAIC_GLOBAL_RESTRICTION_TRANSACTION_BUILDER = 16721, + /** Aggregate complete transaction builder. */ + AGGREGATE_COMPLETE_TRANSACTION_BUILDER = 16705, + /** Aggregate bonded transaction builder. */ + AGGREGATE_BONDED_TRANSACTION_BUILDER = 16961, } diff --git a/src/infrastructure/catbuffer/GeneratorUtils.ts b/src/infrastructure/catbuffer/GeneratorUtils.ts index d1c6eb5d9b..74399315e0 100644 --- a/src/infrastructure/catbuffer/GeneratorUtils.ts +++ b/src/infrastructure/catbuffer/GeneratorUtils.ts @@ -145,4 +145,13 @@ export class GeneratorUtils { const bytes = binary.slice(0, size); return bytes; } + + /** + * Gets the padding size that rounds up \a size to the next multiple of \a alignment. + * @param size Inner transaction size + * @param alignment Next multiple alignment + */ + public static getTransactionPaddingSize(size: number, alignment: number): number { + return 0 === size % alignment ? 0 : alignment - (size % alignment); + } } diff --git a/src/infrastructure/catbuffer/InflationReceiptBuilder.ts b/src/infrastructure/catbuffer/InflationReceiptBuilder.ts new file mode 100644 index 0000000000..d9d12527ec --- /dev/null +++ b/src/infrastructure/catbuffer/InflationReceiptBuilder.ts @@ -0,0 +1,92 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { GeneratorUtils } from './GeneratorUtils'; +import { MosaicBuilder } from './MosaicBuilder'; +import { ReceiptBuilder } from './ReceiptBuilder'; +import { ReceiptTypeDto } from './ReceiptTypeDto'; + +/** Binary layout for an inflation receipt. */ +export class InflationReceiptBuilder extends ReceiptBuilder { + /** Mosaic. */ + mosaic: MosaicBuilder; + + /** + * Constructor. + * + * @param version Receipt version. + * @param type Receipt type. + * @param mosaic Mosaic. + */ + public constructor(version: number, type: ReceiptTypeDto, mosaic: MosaicBuilder) { + super(version, type); + this.mosaic = mosaic; + } + + /** + * Creates an instance of InflationReceiptBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of InflationReceiptBuilder. + */ + public static loadFromBinary(payload: Uint8Array): InflationReceiptBuilder { + const byteArray = Array.from(payload); + const superObject = ReceiptBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, superObject.getSize()); + const mosaic = MosaicBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, mosaic.getSize()); + return new InflationReceiptBuilder(superObject.version, superObject.type, mosaic); + } + + /** + * Gets mosaic. + * + * @return Mosaic. + */ + public getMosaic(): MosaicBuilder { + return this.mosaic; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size: number = super.getSize(); + size += this.mosaic.getSize(); + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const superBytes = super.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, superBytes); + const mosaicBytes = this.mosaic.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, mosaicBytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/MosaicExpiryReceiptBuilder.ts b/src/infrastructure/catbuffer/MosaicExpiryReceiptBuilder.ts new file mode 100644 index 0000000000..3940e509e5 --- /dev/null +++ b/src/infrastructure/catbuffer/MosaicExpiryReceiptBuilder.ts @@ -0,0 +1,92 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { GeneratorUtils } from './GeneratorUtils'; +import { MosaicIdDto } from './MosaicIdDto'; +import { ReceiptBuilder } from './ReceiptBuilder'; +import { ReceiptTypeDto } from './ReceiptTypeDto'; + +/** Binary layout for a mosaic expiry receipt. */ +export class MosaicExpiryReceiptBuilder extends ReceiptBuilder { + /** Expiring mosaic id. */ + artifactId: MosaicIdDto; + + /** + * Constructor. + * + * @param version Receipt version. + * @param type Receipt type. + * @param artifactId Expiring mosaic id. + */ + public constructor(version: number, type: ReceiptTypeDto, artifactId: MosaicIdDto) { + super(version, type); + this.artifactId = artifactId; + } + + /** + * Creates an instance of MosaicExpiryReceiptBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of MosaicExpiryReceiptBuilder. + */ + public static loadFromBinary(payload: Uint8Array): MosaicExpiryReceiptBuilder { + const byteArray = Array.from(payload); + const superObject = ReceiptBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, superObject.getSize()); + const artifactId = MosaicIdDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, artifactId.getSize()); + return new MosaicExpiryReceiptBuilder(superObject.version, superObject.type, artifactId); + } + + /** + * Gets expiring mosaic id. + * + * @return Expiring mosaic id. + */ + public getArtifactId(): MosaicIdDto { + return this.artifactId; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size: number = super.getSize(); + size += this.artifactId.getSize(); + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const superBytes = super.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, superBytes); + const artifactIdBytes = this.artifactId.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, artifactIdBytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/NamespaceExpiryReceiptBuilder.ts b/src/infrastructure/catbuffer/NamespaceExpiryReceiptBuilder.ts new file mode 100644 index 0000000000..2573d688a9 --- /dev/null +++ b/src/infrastructure/catbuffer/NamespaceExpiryReceiptBuilder.ts @@ -0,0 +1,92 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { GeneratorUtils } from './GeneratorUtils'; +import { NamespaceIdDto } from './NamespaceIdDto'; +import { ReceiptBuilder } from './ReceiptBuilder'; +import { ReceiptTypeDto } from './ReceiptTypeDto'; + +/** Binary layout for a namespace expiry receipt. */ +export class NamespaceExpiryReceiptBuilder extends ReceiptBuilder { + /** Expiring namespace id. */ + artifactId: NamespaceIdDto; + + /** + * Constructor. + * + * @param version Receipt version. + * @param type Receipt type. + * @param artifactId Expiring namespace id. + */ + public constructor(version: number, type: ReceiptTypeDto, artifactId: NamespaceIdDto) { + super(version, type); + this.artifactId = artifactId; + } + + /** + * Creates an instance of NamespaceExpiryReceiptBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of NamespaceExpiryReceiptBuilder. + */ + public static loadFromBinary(payload: Uint8Array): NamespaceExpiryReceiptBuilder { + const byteArray = Array.from(payload); + const superObject = ReceiptBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, superObject.getSize()); + const artifactId = NamespaceIdDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, artifactId.getSize()); + return new NamespaceExpiryReceiptBuilder(superObject.version, superObject.type, artifactId); + } + + /** + * Gets expiring namespace id. + * + * @return Expiring namespace id. + */ + public getArtifactId(): NamespaceIdDto { + return this.artifactId; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size: number = super.getSize(); + size += this.artifactId.getSize(); + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const superBytes = super.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, superBytes); + const artifactIdBytes = this.artifactId.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, artifactIdBytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/ReceiptBuilder.ts b/src/infrastructure/catbuffer/ReceiptBuilder.ts new file mode 100644 index 0000000000..524bf945df --- /dev/null +++ b/src/infrastructure/catbuffer/ReceiptBuilder.ts @@ -0,0 +1,108 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { GeneratorUtils } from './GeneratorUtils'; +import { ReceiptTypeDto } from './ReceiptTypeDto'; + +/** Binary layout for a receipt entity. */ +export class ReceiptBuilder { + /** Entity size. */ + size = 0; + /** Receipt version. */ + version: number; + /** Receipt type. */ + type: ReceiptTypeDto; + + /** + * Constructor. + * + * @param version Receipt version. + * @param type Receipt type. + */ + public constructor(version: number, type: ReceiptTypeDto) { + this.version = version; + this.type = type; + } + + /** + * Creates an instance of ReceiptBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of ReceiptBuilder. + */ + public static loadFromBinary(payload: Uint8Array): ReceiptBuilder { + const byteArray = Array.from(payload); + const size = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4)); + byteArray.splice(0, 4); + const version = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 2)); + byteArray.splice(0, 2); + const type = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 2)); + byteArray.splice(0, 2); + return new ReceiptBuilder(version, type); + } + + /** + * Gets receipt version. + * + * @return Receipt version. + */ + public getVersion(): number { + return this.version; + } + + /** + * Gets receipt type. + * + * @return Receipt type. + */ + public getType(): ReceiptTypeDto { + return this.type; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size = 0; + size += 4; // size + size += 2; // version + size += 2; // type + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const sizeBytes = GeneratorUtils.uintToBuffer(this.getSize(), 4); + newArray = GeneratorUtils.concatTypedArrays(newArray, sizeBytes); + const versionBytes = GeneratorUtils.uintToBuffer(this.getVersion(), 2); + newArray = GeneratorUtils.concatTypedArrays(newArray, versionBytes); + const typeBytes = GeneratorUtils.uintToBuffer(this.type, 2); + newArray = GeneratorUtils.concatTypedArrays(newArray, typeBytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/ReceiptTypeDto.ts b/src/infrastructure/catbuffer/ReceiptTypeDto.ts new file mode 100644 index 0000000000..f2d4bdc10f --- /dev/null +++ b/src/infrastructure/catbuffer/ReceiptTypeDto.ts @@ -0,0 +1,27 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + + +/** Enumeration of receipt types. */ +export enum ReceiptTypeDto { + /** Reserved receipt type. */ + RESERVED = 0, +} diff --git a/src/model/transaction/AccountAddressRestrictionTransaction.ts b/src/model/transaction/AccountAddressRestrictionTransaction.ts index 66f2b2fafd..d7814ea1dc 100644 --- a/src/model/transaction/AccountAddressRestrictionTransaction.ts +++ b/src/model/transaction/AccountAddressRestrictionTransaction.ts @@ -21,6 +21,7 @@ import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedAccountAddressRestrictionTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedAccountAddressRestrictionTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; import { TimestampDto } from '../../infrastructure/catbuffer/TimestampDto'; @@ -172,10 +173,10 @@ export class AccountAddressRestrictionTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedAccountAddressRestrictionTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedAccountAddressRestrictionTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -188,7 +189,6 @@ export class AccountAddressRestrictionTransaction extends Transaction { return new UnresolvedAddressDto(UnresolvedMapping.toUnresolvedAddressBytes(deletion, this.networkType)); }), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/AccountLinkTransaction.ts b/src/model/transaction/AccountLinkTransaction.ts index 9e6e813de3..2374266254 100644 --- a/src/model/transaction/AccountLinkTransaction.ts +++ b/src/model/transaction/AccountLinkTransaction.ts @@ -18,6 +18,7 @@ import { Convert } from '../../core/format'; import { AccountLinkTransactionBuilder } from '../../infrastructure/catbuffer/AccountLinkTransactionBuilder'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedAccountLinkTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedAccountLinkTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; import { TimestampDto } from '../../infrastructure/catbuffer/TimestampDto'; @@ -150,10 +151,10 @@ export class AccountLinkTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedAccountLinkTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedAccountLinkTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -161,7 +162,6 @@ export class AccountLinkTransaction extends Transaction { new KeyDto(Convert.hexToUint8(this.remotePublicKey)), this.linkAction.valueOf(), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/AccountMetadataTransaction.ts b/src/model/transaction/AccountMetadataTransaction.ts index 78b2009887..d01429d3af 100644 --- a/src/model/transaction/AccountMetadataTransaction.ts +++ b/src/model/transaction/AccountMetadataTransaction.ts @@ -18,6 +18,7 @@ import { Convert } from '../../core/format'; import { AccountMetadataTransactionBuilder } from '../../infrastructure/catbuffer/AccountMetadataTransactionBuilder'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedAccountMetadataTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedAccountMetadataTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; import { TimestampDto } from '../../infrastructure/catbuffer/TimestampDto'; @@ -178,10 +179,10 @@ export class AccountMetadataTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedAccountMetadataTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedAccountMetadataTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -191,7 +192,6 @@ export class AccountMetadataTransaction extends Transaction { this.valueSizeDelta, Convert.utf8ToUint8(this.value), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/AccountMosaicRestrictionTransaction.ts b/src/model/transaction/AccountMosaicRestrictionTransaction.ts index c739b574b8..b8a3f542a5 100644 --- a/src/model/transaction/AccountMosaicRestrictionTransaction.ts +++ b/src/model/transaction/AccountMosaicRestrictionTransaction.ts @@ -21,6 +21,7 @@ import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedAccountMosaicRestrictionTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedAccountMosaicRestrictionTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; import { TimestampDto } from '../../infrastructure/catbuffer/TimestampDto'; @@ -172,10 +173,10 @@ export class AccountMosaicRestrictionTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedAccountMosaicRestrictionTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedAccountMosaicRestrictionTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -188,7 +189,6 @@ export class AccountMosaicRestrictionTransaction extends Transaction { return new UnresolvedMosaicIdDto(deletion.id.toDTO()); }), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/AccountOperationRestrictionTransaction.ts b/src/model/transaction/AccountOperationRestrictionTransaction.ts index 899602794f..1dc508e493 100644 --- a/src/model/transaction/AccountOperationRestrictionTransaction.ts +++ b/src/model/transaction/AccountOperationRestrictionTransaction.ts @@ -22,6 +22,7 @@ import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedAccountOperationRestrictionTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedAccountOperationRestrictionTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; import { TimestampDto } from '../../infrastructure/catbuffer/TimestampDto'; @@ -160,10 +161,10 @@ export class AccountOperationRestrictionTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedAccountOperationRestrictionTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedAccountOperationRestrictionTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -172,7 +173,6 @@ export class AccountOperationRestrictionTransaction extends Transaction { this.restrictionAdditions, this.restrictionDeletions, ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/AddressAliasTransaction.ts b/src/model/transaction/AddressAliasTransaction.ts index 8f58f5d2a4..c94cd8492c 100644 --- a/src/model/transaction/AddressAliasTransaction.ts +++ b/src/model/transaction/AddressAliasTransaction.ts @@ -21,6 +21,7 @@ import { AddressAliasTransactionBuilder } from '../../infrastructure/catbuffer/A import { AddressDto } from '../../infrastructure/catbuffer/AddressDto'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedAddressAliasTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedAddressAliasTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { NamespaceIdDto } from '../../infrastructure/catbuffer/NamespaceIdDto'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; @@ -172,10 +173,10 @@ export class AddressAliasTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedAddressAliasTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedAddressAliasTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -184,7 +185,6 @@ export class AddressAliasTransaction extends Transaction { new AddressDto(RawAddress.stringToAddress(this.address.plain())), this.aliasAction.valueOf(), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/AggregateTransaction.ts b/src/model/transaction/AggregateTransaction.ts index a92792e4b5..82680242a5 100644 --- a/src/model/transaction/AggregateTransaction.ts +++ b/src/model/transaction/AggregateTransaction.ts @@ -20,6 +20,8 @@ import {AggregateBondedTransactionBuilder} from '../../infrastructure/catbuffer/ import {AggregateCompleteTransactionBuilder} from '../../infrastructure/catbuffer/AggregateCompleteTransactionBuilder'; import {AmountDto} from '../../infrastructure/catbuffer/AmountDto'; import {CosignatureBuilder} from '../../infrastructure/catbuffer/CosignatureBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; +import { EmbeddedTransactionHelper } from '../../infrastructure/catbuffer/EmbeddedTransactionHelper'; import {GeneratorUtils} from '../../infrastructure/catbuffer/GeneratorUtils'; import { Hash256Dto } from '../../infrastructure/catbuffer/Hash256Dto'; import {KeyDto} from '../../infrastructure/catbuffer/KeyDto'; @@ -139,36 +141,19 @@ export class AggregateTransaction extends Transaction { const builder = type === TransactionType.AGGREGATE_COMPLETE ? AggregateCompleteTransactionBuilder.loadFromBinary(Convert.hexToUint8(payload)) : AggregateBondedTransactionBuilder.loadFromBinary(Convert.hexToUint8(payload)); - const innerTransactionHex = Convert.uint8ToHex(builder.getTransactions()); + const innerTransactions = builder.getTransactions().map((t) => Convert.uint8ToHex(EmbeddedTransactionHelper.serialize(t))); const networkType = builder.getNetwork().valueOf(); - const consignaturesHex = Convert.uint8ToHex(builder.getCosignatures()); - - /** - * Get inner transactions array - */ - const embeddedTransactionArray: string[] = []; - let innerBinary = innerTransactionHex; - while (innerBinary.length) { - const payloadSize = parseInt(Convert.uint8ToHex(Convert.hexToUint8(innerBinary.substring(0, 8)).reverse()), 16) * 2; - const innerTransaction = innerBinary.substring(0, payloadSize); - embeddedTransactionArray.push(innerTransaction); - innerBinary = innerBinary.substring(payloadSize).replace(/\b0+/g, ''); - } - - /** - * Get cosignatures - */ - const consignatureArray = consignaturesHex.match(/.{1,192}/g); - const consignatures = consignatureArray ? consignatureArray.map((cosignature) => - new AggregateTransactionCosignature( - cosignature.substring(64, 192), - PublicAccount.createFromPublicKey(cosignature.substring(0, 64), networkType), - )) : []; + const consignatures = builder.getCosignatures().map((cosig) => { + return new AggregateTransactionCosignature( + Convert.uint8ToHex(cosig.signature.signature), + PublicAccount.createFromPublicKey(Convert.uint8ToHex(cosig.signerPublicKey.key), networkType), + ); + }); return type === TransactionType.AGGREGATE_COMPLETE ? AggregateTransaction.createComplete( Deadline.createFromDTO(builder.deadline.timestamp), - embeddedTransactionArray.map((transactionRaw) => { + innerTransactions.map((transactionRaw) => { return CreateTransactionFromPayload(transactionRaw, true) as InnerTransaction; }), networkType, @@ -176,7 +161,7 @@ export class AggregateTransaction extends Transaction { new UInt64(builder.fee.amount), ) : AggregateTransaction.createBonded( Deadline.createFromDTO(builder.deadline.timestamp), - embeddedTransactionArray.map((transactionRaw) => { + innerTransactions.map((transactionRaw) => { return CreateTransactionFromPayload(transactionRaw, true) as InnerTransaction; }), networkType, @@ -312,23 +297,14 @@ export class AggregateTransaction extends Transaction { protected generateBytes(): Uint8Array { const signerBuffer = new Uint8Array(32); const signatureBuffer = new Uint8Array(64); - let transactions = Uint8Array.from([]); - this.innerTransactions.forEach((transaction) => { - const transactionByte = transaction.toAggregateTransactionBytes(); - const innerTransactionPadding = new Uint8Array(this.getInnerTransactionPaddingSize(transactionByte.length, 8)); - const paddedTransactionByte = GeneratorUtils.concatTypedArrays(transactionByte, innerTransactionPadding); - transactions = GeneratorUtils.concatTypedArrays(transactions, paddedTransactionByte); - }); - - let cosignatures = Uint8Array.from([]); - this.cosignatures.forEach((cosignature) => { + const transactions = this.innerTransactions.map((transaction) => (transaction as Transaction).toEmbeddedTransaction()); + const cosignatures = this.cosignatures.map((cosignature) => { const signerBytes = Convert.hexToUint8(cosignature.signer.publicKey); const signatureBytes = Convert.hexToUint8(cosignature.signature); - const cosignatureBytes = new CosignatureBuilder( + return new CosignatureBuilder( new KeyDto(signerBytes), new SignatureDto(signatureBytes), - ).serialize(); - cosignatures = GeneratorUtils.concatTypedArrays(cosignatures, cosignatureBytes); + ); }); const transactionBuilder = this.type === TransactionType.AGGREGATE_COMPLETE ? @@ -361,9 +337,9 @@ export class AggregateTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { throw new Error('Method not implemented'); } diff --git a/src/model/transaction/LockFundsTransaction.ts b/src/model/transaction/LockFundsTransaction.ts index 3bab2f98aa..a8bd009e0d 100644 --- a/src/model/transaction/LockFundsTransaction.ts +++ b/src/model/transaction/LockFundsTransaction.ts @@ -18,6 +18,7 @@ import { Convert } from '../../core/format'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { BlockDurationDto } from '../../infrastructure/catbuffer/BlockDurationDto'; import { EmbeddedHashLockTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedHashLockTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { Hash256Dto } from '../../infrastructure/catbuffer/Hash256Dto'; import { HashLockTransactionBuilder } from '../../infrastructure/catbuffer/HashLockTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; @@ -188,10 +189,10 @@ export class LockFundsTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedHashLockTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedHashLockTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -201,7 +202,6 @@ export class LockFundsTransaction extends Transaction { new BlockDurationDto(this.duration.toDTO()), new Hash256Dto(Convert.hexToUint8(this.hash)), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MosaicAddressRestrictionTransaction.ts b/src/model/transaction/MosaicAddressRestrictionTransaction.ts index 7323856186..c2240472cd 100644 --- a/src/model/transaction/MosaicAddressRestrictionTransaction.ts +++ b/src/model/transaction/MosaicAddressRestrictionTransaction.ts @@ -20,6 +20,7 @@ import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMosaicAddressRestrictionTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedMosaicAddressRestrictionTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { MosaicAddressRestrictionTransactionBuilder } from '../../infrastructure/catbuffer/MosaicAddressRestrictionTransactionBuilder'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; @@ -218,10 +219,10 @@ export class MosaicAddressRestrictionTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMosaicAddressRestrictionTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMosaicAddressRestrictionTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -232,7 +233,6 @@ export class MosaicAddressRestrictionTransaction extends Transaction { this.newRestrictionValue.toDTO(), new UnresolvedAddressDto(UnresolvedMapping.toUnresolvedAddressBytes(this.targetAddress, this.networkType)), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MosaicAliasTransaction.ts b/src/model/transaction/MosaicAliasTransaction.ts index f259c5af13..238e8b1fbd 100644 --- a/src/model/transaction/MosaicAliasTransaction.ts +++ b/src/model/transaction/MosaicAliasTransaction.ts @@ -17,6 +17,7 @@ import { Convert } from '../../core/format'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMosaicAliasTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedMosaicAliasTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { MosaicAliasTransactionBuilder } from '../../infrastructure/catbuffer/MosaicAliasTransactionBuilder'; import { MosaicIdDto } from '../../infrastructure/catbuffer/MosaicIdDto'; @@ -164,10 +165,10 @@ export class MosaicAliasTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMosaicAliasTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMosaicAliasTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -176,7 +177,6 @@ export class MosaicAliasTransaction extends Transaction { new MosaicIdDto(this.mosaicId.id.toDTO()), this.aliasAction.valueOf(), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MosaicDefinitionTransaction.ts b/src/model/transaction/MosaicDefinitionTransaction.ts index a43a733825..5b3fe0754b 100644 --- a/src/model/transaction/MosaicDefinitionTransaction.ts +++ b/src/model/transaction/MosaicDefinitionTransaction.ts @@ -18,6 +18,7 @@ import { Convert } from '../../core/format'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { BlockDurationDto } from '../../infrastructure/catbuffer/BlockDurationDto'; import { EmbeddedMosaicDefinitionTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedMosaicDefinitionTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { GeneratorUtils } from '../../infrastructure/catbuffer/GeneratorUtils'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { MosaicDefinitionTransactionBuilder } from '../../infrastructure/catbuffer/MosaicDefinitionTransactionBuilder'; @@ -205,10 +206,10 @@ export class MosaicDefinitionTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMosaicDefinitionTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMosaicDefinitionTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -219,7 +220,6 @@ export class MosaicDefinitionTransaction extends Transaction { this.flags.getValue(), this.divisibility, ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MosaicGlobalRestrictionTransaction.ts b/src/model/transaction/MosaicGlobalRestrictionTransaction.ts index 35ff2de88e..7985c2947c 100644 --- a/src/model/transaction/MosaicGlobalRestrictionTransaction.ts +++ b/src/model/transaction/MosaicGlobalRestrictionTransaction.ts @@ -20,6 +20,7 @@ import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMosaicGlobalRestrictionTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedMosaicGlobalRestrictionTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { MosaicGlobalRestrictionTransactionBuilder } from '../../infrastructure/catbuffer/MosaicGlobalRestrictionTransactionBuilder'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; @@ -226,10 +227,10 @@ export class MosaicGlobalRestrictionTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMosaicGlobalRestrictionTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMosaicGlobalRestrictionTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -242,7 +243,6 @@ export class MosaicGlobalRestrictionTransaction extends Transaction { this.previousRestrictionType.valueOf(), this.newRestrictionType.valueOf(), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MosaicMetadataTransaction.ts b/src/model/transaction/MosaicMetadataTransaction.ts index ce5b5135cf..c491717997 100644 --- a/src/model/transaction/MosaicMetadataTransaction.ts +++ b/src/model/transaction/MosaicMetadataTransaction.ts @@ -18,6 +18,7 @@ import { Convert } from '../../core/format'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMosaicMetadataTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedMosaicMetadataTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { MosaicMetadataTransactionBuilder } from '../../infrastructure/catbuffer/MosaicMetadataTransactionBuilder'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; @@ -194,10 +195,10 @@ export class MosaicMetadataTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMosaicMetadataTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMosaicMetadataTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -208,7 +209,6 @@ export class MosaicMetadataTransaction extends Transaction { this.valueSizeDelta, Convert.utf8ToUint8(this.value), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MosaicSupplyChangeTransaction.ts b/src/model/transaction/MosaicSupplyChangeTransaction.ts index 3e6b2685cb..ca7e404242 100644 --- a/src/model/transaction/MosaicSupplyChangeTransaction.ts +++ b/src/model/transaction/MosaicSupplyChangeTransaction.ts @@ -18,6 +18,7 @@ import { Convert } from '../../core/format'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMosaicSupplyChangeTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedMosaicSupplyChangeTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { MosaicSupplyChangeTransactionBuilder } from '../../infrastructure/catbuffer/MosaicSupplyChangeTransactionBuilder'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; @@ -170,10 +171,10 @@ export class MosaicSupplyChangeTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMosaicSupplyChangeTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMosaicSupplyChangeTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -182,7 +183,6 @@ export class MosaicSupplyChangeTransaction extends Transaction { new AmountDto(this.delta.toDTO()), this.action.valueOf(), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MultisigAccountModificationTransaction.ts b/src/model/transaction/MultisigAccountModificationTransaction.ts index d8a4dc1d77..fcaefd7fcf 100644 --- a/src/model/transaction/MultisigAccountModificationTransaction.ts +++ b/src/model/transaction/MultisigAccountModificationTransaction.ts @@ -19,6 +19,7 @@ import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMultisigAccountModificationTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedMultisigAccountModificationTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import {MultisigAccountModificationTransactionBuilder, } from '../../infrastructure/catbuffer/MultisigAccountModificationTransactionBuilder'; @@ -193,10 +194,10 @@ export class MultisigAccountModificationTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMultisigAccountModificationTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMultisigAccountModificationTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -210,7 +211,6 @@ export class MultisigAccountModificationTransaction extends Transaction { return new KeyDto(Convert.hexToUint8(deletion.publicKey)); }), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/NamespaceMetadataTransaction.ts b/src/model/transaction/NamespaceMetadataTransaction.ts index f58453c268..36e80f13e3 100644 --- a/src/model/transaction/NamespaceMetadataTransaction.ts +++ b/src/model/transaction/NamespaceMetadataTransaction.ts @@ -17,6 +17,7 @@ import { Convert } from '../../core/format'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedNamespaceMetadataTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedNamespaceMetadataTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { NamespaceIdDto } from '../../infrastructure/catbuffer/NamespaceIdDto'; import { NamespaceMetadataTransactionBuilder } from '../../infrastructure/catbuffer/NamespaceMetadataTransactionBuilder'; @@ -192,10 +193,10 @@ export class NamespaceMetadataTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedNamespaceMetadataTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedNamespaceMetadataTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -206,7 +207,6 @@ export class NamespaceMetadataTransaction extends Transaction { this.valueSizeDelta, Convert.utf8ToUint8(this.value), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/NamespaceRegistrationTransaction.ts b/src/model/transaction/NamespaceRegistrationTransaction.ts index 935ee02bc7..cad026814e 100644 --- a/src/model/transaction/NamespaceRegistrationTransaction.ts +++ b/src/model/transaction/NamespaceRegistrationTransaction.ts @@ -20,6 +20,7 @@ import { BlockDurationDto } from '../../infrastructure/catbuffer/BlockDurationDt import { EmbeddedNamespaceRegistrationTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedNamespaceRegistrationTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { NamespaceIdDto } from '../../infrastructure/catbuffer/NamespaceIdDto'; import { NamespaceRegistrationTransactionBuilder } from '../../infrastructure/catbuffer/NamespaceRegistrationTransactionBuilder'; @@ -244,12 +245,11 @@ export class NamespaceRegistrationTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - let transactionBuilder: EmbeddedNamespaceRegistrationTransactionBuilder; + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { if (this.registrationType === NamespaceRegistrationType.RootNamespace) { - transactionBuilder = new EmbeddedNamespaceRegistrationTransactionBuilder( + return new EmbeddedNamespaceRegistrationTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -259,19 +259,17 @@ export class NamespaceRegistrationTransaction extends Transaction { new BlockDurationDto(this.duration!.toDTO()), undefined, ); - } else { - transactionBuilder = new EmbeddedNamespaceRegistrationTransactionBuilder( - new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), - this.versionToDTO(), - this.networkType.valueOf(), - TransactionType.REGISTER_NAMESPACE.valueOf(), - new NamespaceIdDto(this.namespaceId.id.toDTO()), - Convert.hexToUint8(Convert.utf8ToHex(this.namespaceName)), - undefined, - new NamespaceIdDto(this.parentId!.id.toDTO()), - ); } - return transactionBuilder.serialize(); + return new EmbeddedNamespaceRegistrationTransactionBuilder( + new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), + this.versionToDTO(), + this.networkType.valueOf(), + TransactionType.REGISTER_NAMESPACE.valueOf(), + new NamespaceIdDto(this.namespaceId.id.toDTO()), + Convert.hexToUint8(Convert.utf8ToHex(this.namespaceName)), + undefined, + new NamespaceIdDto(this.parentId!.id.toDTO()), + ); } /** diff --git a/src/model/transaction/SecretLockTransaction.ts b/src/model/transaction/SecretLockTransaction.ts index 3606ede7e7..df3ee1c863 100644 --- a/src/model/transaction/SecretLockTransaction.ts +++ b/src/model/transaction/SecretLockTransaction.ts @@ -18,6 +18,7 @@ import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { BlockDurationDto } from '../../infrastructure/catbuffer/BlockDurationDto'; import { EmbeddedSecretLockTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedSecretLockTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { Hash256Dto } from '../../infrastructure/catbuffer/Hash256Dto'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SecretLockTransactionBuilder } from '../../infrastructure/catbuffer/SecretLockTransactionBuilder'; @@ -214,10 +215,10 @@ export class SecretLockTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedSecretLockTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedSecretLockTransactionBuilder( new KeyDto(convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -229,7 +230,6 @@ export class SecretLockTransaction extends Transaction { this.hashType.valueOf(), new UnresolvedAddressDto(UnresolvedMapping.toUnresolvedAddressBytes(this.recipientAddress, this.networkType)), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/SecretProofTransaction.ts b/src/model/transaction/SecretProofTransaction.ts index 2c3a9de798..793d2a012d 100644 --- a/src/model/transaction/SecretProofTransaction.ts +++ b/src/model/transaction/SecretProofTransaction.ts @@ -21,6 +21,7 @@ import { Convert, Convert as convert } from '../../core/format'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedSecretProofTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedSecretProofTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { Hash256Dto } from '../../infrastructure/catbuffer/Hash256Dto'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SecretProofTransactionBuilder } from '../../infrastructure/catbuffer/SecretProofTransactionBuilder'; @@ -199,10 +200,10 @@ export class SecretProofTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedSecretProofTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedSecretProofTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -212,7 +213,6 @@ export class SecretProofTransaction extends Transaction { new UnresolvedAddressDto(UnresolvedMapping.toUnresolvedAddressBytes(this.recipientAddress, this.networkType)), this.getProofByte(), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/Transaction.ts b/src/model/transaction/Transaction.ts index f42edc8415..4830838648 100644 --- a/src/model/transaction/Transaction.ts +++ b/src/model/transaction/Transaction.ts @@ -16,6 +16,8 @@ import { KeyPair, SHA3Hasher, SignSchema } from '../../core/crypto'; import { Convert } from '../../core/format'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; +import { EmbeddedTransactionHelper } from '../../infrastructure/catbuffer/EmbeddedTransactionHelper'; import { SerializeTransactionToJSON } from '../../infrastructure/transaction/SerializeTransactionToJSON'; import { Account } from '../account/Account'; import { PublicAccount } from '../account/PublicAccount'; @@ -184,7 +186,7 @@ export abstract class Transaction { /** * @internal */ - protected abstract generateEmbeddedBytes(): Uint8Array; + public abstract toEmbeddedTransaction(): EmbeddedTransactionBuilder; /** * @internal @@ -286,7 +288,9 @@ export abstract class Transaction { * @return transaction with signer serialized to be part of an aggregate transaction */ public toAggregateTransactionBytes() { - return this.generateEmbeddedBytes(); + return EmbeddedTransactionHelper.serialize( + this.toEmbeddedTransaction(), + ); } /** diff --git a/src/model/transaction/TransferTransaction.ts b/src/model/transaction/TransferTransaction.ts index d858927b9e..4e99bb1d96 100644 --- a/src/model/transaction/TransferTransaction.ts +++ b/src/model/transaction/TransferTransaction.ts @@ -18,6 +18,7 @@ import * as Long from 'long'; import {Convert} from '../../core/format'; import {UnresolvedMapping} from '../../core/utils/UnresolvedMapping'; import {AmountDto} from '../../infrastructure/catbuffer/AmountDto'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import {EmbeddedTransferTransactionBuilder} from '../../infrastructure/catbuffer/EmbeddedTransferTransactionBuilder'; import {GeneratorUtils} from '../../infrastructure/catbuffer/GeneratorUtils'; import {KeyDto} from '../../infrastructure/catbuffer/KeyDto'; @@ -256,10 +257,10 @@ export class TransferTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedTransferTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedTransferTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -271,7 +272,6 @@ export class TransferTransaction extends Transaction { }), this.getMessageBuffer(), ); - return transactionBuilder.serialize(); } /** diff --git a/test/model/transaction/Transaction.spec.ts b/test/model/transaction/Transaction.spec.ts index 0b3eb881b4..04fb2e28b3 100644 --- a/test/model/transaction/Transaction.spec.ts +++ b/test/model/transaction/Transaction.spec.ts @@ -17,6 +17,7 @@ import { expect } from 'chai'; import { Observable } from 'rxjs/internal/Observable'; import { Convert } from '../../../src/core/format/Convert'; +import { EmbeddedTransactionBuilder } from '../../../src/infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { Account } from '../../../src/model/account/Account'; import { Address } from '../../../src/model/account/Address'; import { NetworkType } from '../../../src/model/blockchain/NetworkType'; @@ -400,7 +401,7 @@ class FakeTransaction extends Transaction { throw new Error('Not implemented'); } - protected generateEmbeddedBytes(): Uint8Array { + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { throw new Error('Not implemented'); } resolveAliases(): TransferTransaction { From 2c7de1fc0c48549d4001049d26690fa5acfba81b Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Fri, 20 Dec 2019 21:51:06 +0000 Subject: [PATCH 03/18] Fixed missing semicolon --- .../catbuffer/EmbeddedTransactionHelper.ts | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts b/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts index ad436cfc30..9a9c16712f 100644 --- a/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts +++ b/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts @@ -125,7 +125,7 @@ export class EmbeddedTransactionHelper { padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); return GeneratorUtils.concatTypedArrays(byte, padding); default: - throw new Error(`Transaction type: ${transaction.type} not recognized.`) + throw new Error(`Transaction type: ${transaction.type} not recognized.`); } } @@ -133,45 +133,45 @@ export class EmbeddedTransactionHelper { const header = EmbeddedTransactionBuilder.loadFromBinary(bytes); switch (header.getType()) { case EntityTypeDto.TRANSFER_TRANSACTION_BUILDER: - return EmbeddedTransferTransactionBuilder.loadFromBinary(bytes) + return EmbeddedTransferTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.ACCOUNT_LINK_TRANSACTION_BUILDER: - return EmbeddedAccountLinkTransactionBuilder.loadFromBinary(bytes) + return EmbeddedAccountLinkTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.HASH_LOCK_TRANSACTION_BUILDER: - return EmbeddedHashLockTransactionBuilder.loadFromBinary(bytes) + return EmbeddedHashLockTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.SECRET_LOCK_TRANSACTION_BUILDER: - return EmbeddedSecretLockTransactionBuilder.loadFromBinary(bytes) + return EmbeddedSecretLockTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.SECRET_PROOF_TRANSACTION_BUILDER: - return EmbeddedSecretProofTransactionBuilder.loadFromBinary(bytes) + return EmbeddedSecretProofTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.ACCOUNT_METADATA_TRANSACTION_BUILDER: - return EmbeddedAccountMetadataTransactionBuilder.loadFromBinary(bytes) + return EmbeddedAccountMetadataTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MOSAIC_METADATA_TRANSACTION_BUILDER: - return EmbeddedMosaicMetadataTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMosaicMetadataTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.NAMESPACE_METADATA_TRANSACTION_BUILDER: - return EmbeddedNamespaceMetadataTransactionBuilder.loadFromBinary(bytes) + return EmbeddedNamespaceMetadataTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MOSAIC_DEFINITION_TRANSACTION_BUILDER: - return EmbeddedMosaicDefinitionTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMosaicDefinitionTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MOSAIC_SUPPLY_CHANGE_TRANSACTION_BUILDER: - return EmbeddedMosaicSupplyChangeTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMosaicSupplyChangeTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MULTISIG_ACCOUNT_MODIFICATION_TRANSACTION_BUILDER: - return EmbeddedMultisigAccountModificationTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMultisigAccountModificationTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.ADDRESS_ALIAS_TRANSACTION_BUILDER: - return EmbeddedAddressAliasTransactionBuilder.loadFromBinary(bytes) + return EmbeddedAddressAliasTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MOSAIC_ALIAS_TRANSACTION_BUILDER: - return EmbeddedMosaicAliasTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMosaicAliasTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.NAMESPACE_REGISTRATION_TRANSACTION_BUILDER: - return EmbeddedNamespaceRegistrationTransactionBuilder.loadFromBinary(bytes) + return EmbeddedNamespaceRegistrationTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.ACCOUNT_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: - return EmbeddedAccountAddressRestrictionTransactionBuilder.loadFromBinary(bytes) + return EmbeddedAccountAddressRestrictionTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.ACCOUNT_MOSAIC_RESTRICTION_TRANSACTION_BUILDER: - return EmbeddedAccountMosaicRestrictionTransactionBuilder.loadFromBinary(bytes) + return EmbeddedAccountMosaicRestrictionTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.ACCOUNT_OPERATION_RESTRICTION_TRANSACTION_BUILDER: - return EmbeddedAccountOperationRestrictionTransactionBuilder.loadFromBinary(bytes) + return EmbeddedAccountOperationRestrictionTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MOSAIC_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: - return EmbeddedMosaicAddressRestrictionTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMosaicAddressRestrictionTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MOSAIC_GLOBAL_RESTRICTION_TRANSACTION_BUILDER: - return EmbeddedMosaicGlobalRestrictionTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMosaicGlobalRestrictionTransactionBuilder.loadFromBinary(bytes); default: - throw new Error(`Transaction type: ${header.getType()} not recognized.`) + throw new Error(`Transaction type: ${header.getType()} not recognized.`); } } From 3f68b80f3ae45419b27831eac6349405b10d51ad Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Fri, 20 Dec 2019 21:27:50 +0000 Subject: [PATCH 04/18] Fixed #393 applied catbuffer generator on aggregate --- .../AggregateBondedTransactionBuilder.ts | 8 +- .../AggregateCompleteTransactionBuilder.ts | 8 +- .../AggregateTransactionBodyBuilder.ts | 52 ++- .../catbuffer/BalanceChangeReceiptBuilder.ts | 111 +++++ .../BalanceTransferReceiptBuilder.ts | 132 ++++++ .../catbuffer/BlockHeaderBuilder.ts | 387 ++++++++++++++++++ .../catbuffer/EmbeddedTransactionHelper.ts | 181 ++++++++ src/infrastructure/catbuffer/EntityTypeDto.ts | 40 ++ .../catbuffer/GeneratorUtils.ts | 9 + .../catbuffer/InflationReceiptBuilder.ts | 92 +++++ .../catbuffer/MosaicExpiryReceiptBuilder.ts | 92 +++++ .../NamespaceExpiryReceiptBuilder.ts | 92 +++++ .../catbuffer/ReceiptBuilder.ts | 108 +++++ .../catbuffer/ReceiptTypeDto.ts | 27 ++ .../AccountAddressRestrictionTransaction.ts | 8 +- .../transaction/AccountLinkTransaction.ts | 8 +- .../transaction/AccountMetadataTransaction.ts | 8 +- .../AccountMosaicRestrictionTransaction.ts | 8 +- .../AccountOperationRestrictionTransaction.ts | 8 +- .../transaction/AddressAliasTransaction.ts | 8 +- src/model/transaction/AggregateTransaction.ts | 58 +-- src/model/transaction/LockFundsTransaction.ts | 8 +- .../MosaicAddressRestrictionTransaction.ts | 8 +- .../transaction/MosaicAliasTransaction.ts | 8 +- .../MosaicDefinitionTransaction.ts | 8 +- .../MosaicGlobalRestrictionTransaction.ts | 8 +- .../transaction/MosaicMetadataTransaction.ts | 8 +- .../MosaicSupplyChangeTransaction.ts | 8 +- .../MultisigAccountModificationTransaction.ts | 8 +- .../NamespaceMetadataTransaction.ts | 8 +- .../NamespaceRegistrationTransaction.ts | 30 +- .../transaction/SecretLockTransaction.ts | 8 +- .../transaction/SecretProofTransaction.ts | 8 +- src/model/transaction/Transaction.ts | 8 +- src/model/transaction/TransferTransaction.ts | 8 +- test/model/transaction/Transaction.spec.ts | 3 +- 36 files changed, 1431 insertions(+), 151 deletions(-) create mode 100644 src/infrastructure/catbuffer/BalanceChangeReceiptBuilder.ts create mode 100644 src/infrastructure/catbuffer/BalanceTransferReceiptBuilder.ts create mode 100644 src/infrastructure/catbuffer/BlockHeaderBuilder.ts create mode 100644 src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts create mode 100644 src/infrastructure/catbuffer/InflationReceiptBuilder.ts create mode 100644 src/infrastructure/catbuffer/MosaicExpiryReceiptBuilder.ts create mode 100644 src/infrastructure/catbuffer/NamespaceExpiryReceiptBuilder.ts create mode 100644 src/infrastructure/catbuffer/ReceiptBuilder.ts create mode 100644 src/infrastructure/catbuffer/ReceiptTypeDto.ts diff --git a/src/infrastructure/catbuffer/AggregateBondedTransactionBuilder.ts b/src/infrastructure/catbuffer/AggregateBondedTransactionBuilder.ts index 56f42da250..ba3b56b75f 100644 --- a/src/infrastructure/catbuffer/AggregateBondedTransactionBuilder.ts +++ b/src/infrastructure/catbuffer/AggregateBondedTransactionBuilder.ts @@ -21,6 +21,8 @@ import { AggregateTransactionBodyBuilder } from './AggregateTransactionBodyBuilder'; import { AmountDto } from './AmountDto'; +import { CosignatureBuilder } from './CosignatureBuilder'; +import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder'; import { EntityTypeDto } from './EntityTypeDto'; import { GeneratorUtils } from './GeneratorUtils'; import { Hash256Dto } from './Hash256Dto'; @@ -50,7 +52,7 @@ export class AggregateBondedTransactionBuilder extends TransactionBuilder { * @param cosignatures Cosignatures data (fills remaining body space after transactions). */ // tslint:disable-next-line: max-line-length - public constructor(signature: SignatureDto, signerPublicKey: KeyDto, version: number, network: NetworkTypeDto, type: EntityTypeDto, fee: AmountDto, deadline: TimestampDto, transactionsHash: Hash256Dto, transactions: Uint8Array, cosignatures: Uint8Array) { + public constructor(signature: SignatureDto, signerPublicKey: KeyDto, version: number, network: NetworkTypeDto, type: EntityTypeDto, fee: AmountDto, deadline: TimestampDto, transactionsHash: Hash256Dto, transactions: EmbeddedTransactionBuilder[], cosignatures: CosignatureBuilder[]) { super(signature, signerPublicKey, version, network, type, fee, deadline); this.aggregateTransactionBody = new AggregateTransactionBodyBuilder(transactionsHash, transactions, cosignatures); } @@ -94,7 +96,7 @@ export class AggregateBondedTransactionBuilder extends TransactionBuilder { * * @return Sub-transaction data (transactions are variable sized and payload size is in bytes). */ - public getTransactions(): Uint8Array { + public getTransactions(): EmbeddedTransactionBuilder[] { return this.aggregateTransactionBody.getTransactions(); } @@ -103,7 +105,7 @@ export class AggregateBondedTransactionBuilder extends TransactionBuilder { * * @return Cosignatures data (fills remaining body space after transactions). */ - public getCosignatures(): Uint8Array { + public getCosignatures(): CosignatureBuilder[] { return this.aggregateTransactionBody.getCosignatures(); } diff --git a/src/infrastructure/catbuffer/AggregateCompleteTransactionBuilder.ts b/src/infrastructure/catbuffer/AggregateCompleteTransactionBuilder.ts index 6dd372648f..f6b6e0983e 100644 --- a/src/infrastructure/catbuffer/AggregateCompleteTransactionBuilder.ts +++ b/src/infrastructure/catbuffer/AggregateCompleteTransactionBuilder.ts @@ -21,6 +21,8 @@ import { AggregateTransactionBodyBuilder } from './AggregateTransactionBodyBuilder'; import { AmountDto } from './AmountDto'; +import { CosignatureBuilder } from './CosignatureBuilder'; +import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder'; import { EntityTypeDto } from './EntityTypeDto'; import { GeneratorUtils } from './GeneratorUtils'; import { Hash256Dto } from './Hash256Dto'; @@ -50,7 +52,7 @@ export class AggregateCompleteTransactionBuilder extends TransactionBuilder { * @param cosignatures Cosignatures data (fills remaining body space after transactions). */ // tslint:disable-next-line: max-line-length - public constructor(signature: SignatureDto, signerPublicKey: KeyDto, version: number, network: NetworkTypeDto, type: EntityTypeDto, fee: AmountDto, deadline: TimestampDto, transactionsHash: Hash256Dto, transactions: Uint8Array, cosignatures: Uint8Array) { + public constructor(signature: SignatureDto, signerPublicKey: KeyDto, version: number, network: NetworkTypeDto, type: EntityTypeDto, fee: AmountDto, deadline: TimestampDto, transactionsHash: Hash256Dto, transactions: EmbeddedTransactionBuilder[], cosignatures: CosignatureBuilder[]) { super(signature, signerPublicKey, version, network, type, fee, deadline); this.aggregateTransactionBody = new AggregateTransactionBodyBuilder(transactionsHash, transactions, cosignatures); } @@ -94,7 +96,7 @@ export class AggregateCompleteTransactionBuilder extends TransactionBuilder { * * @return Sub-transaction data (transactions are variable sized and payload size is in bytes). */ - public getTransactions(): Uint8Array { + public getTransactions(): EmbeddedTransactionBuilder[] { return this.aggregateTransactionBody.getTransactions(); } @@ -103,7 +105,7 @@ export class AggregateCompleteTransactionBuilder extends TransactionBuilder { * * @return Cosignatures data (fills remaining body space after transactions). */ - public getCosignatures(): Uint8Array { + public getCosignatures(): CosignatureBuilder[] { return this.aggregateTransactionBody.getCosignatures(); } diff --git a/src/infrastructure/catbuffer/AggregateTransactionBodyBuilder.ts b/src/infrastructure/catbuffer/AggregateTransactionBodyBuilder.ts index b4de916720..5dd2492e47 100644 --- a/src/infrastructure/catbuffer/AggregateTransactionBodyBuilder.ts +++ b/src/infrastructure/catbuffer/AggregateTransactionBodyBuilder.ts @@ -19,6 +19,9 @@ *** along with Catapult. If not, see . **/ +import { CosignatureBuilder } from './CosignatureBuilder'; +import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder'; +import { EmbeddedTransactionHelper } from './EmbeddedTransactionHelper'; import { GeneratorUtils } from './GeneratorUtils'; import { Hash256Dto } from './Hash256Dto'; @@ -29,9 +32,9 @@ export class AggregateTransactionBodyBuilder { /** Reserved padding to align end of AggregateTransactionHeader on 8-byte boundary. */ aggregateTransactionHeader_Reserved1: number; /** Sub-transaction data (transactions are variable sized and payload size is in bytes). */ - transactions: Uint8Array; + transactions: EmbeddedTransactionBuilder[]; /** Cosignatures data (fills remaining body space after transactions). */ - cosignatures: Uint8Array; + cosignatures: CosignatureBuilder[]; /** * Constructor. @@ -40,7 +43,8 @@ export class AggregateTransactionBodyBuilder { * @param transactions Sub-transaction data (transactions are variable sized and payload size is in bytes). * @param cosignatures Cosignatures data (fills remaining body space after transactions). */ - public constructor(transactionsHash: Hash256Dto, transactions: Uint8Array, cosignatures: Uint8Array) { + // tslint:disable-next-line: max-line-length + public constructor(transactionsHash: Hash256Dto, transactions: EmbeddedTransactionBuilder[], cosignatures: CosignatureBuilder[]) { this.transactionsHash = transactionsHash; this.aggregateTransactionHeader_Reserved1 = 0; this.transactions = transactions; @@ -62,9 +66,24 @@ export class AggregateTransactionBodyBuilder { // tslint:disable-next-line: max-line-length const aggregateTransactionHeader_Reserved1 = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4)); byteArray.splice(0, 4); - const transactions = GeneratorUtils.getBytes(Uint8Array.from(byteArray), payloadSize); - byteArray.splice(0, payloadSize); - const cosignatures = Uint8Array.from(byteArray); + let transactionsByteSize = payloadSize; + const transactions: EmbeddedTransactionBuilder[] = []; + while (transactionsByteSize > 0) { + const item = EmbeddedTransactionHelper.loadFromBinary(Uint8Array.from(byteArray)); + transactions.push(item); + const itemSize = item.getSize() + GeneratorUtils.getTransactionPaddingSize(item.getSize(), 8); + transactionsByteSize -= itemSize; + byteArray.splice(0, itemSize); + } + let cosignaturesByteSize = byteArray.length; + const cosignatures: CosignatureBuilder[] = []; + while (cosignaturesByteSize > 0) { + const item = CosignatureBuilder.loadFromBinary(Uint8Array.from(byteArray)); + cosignatures.push(item); + const itemSize = item.getSize(); + cosignaturesByteSize -= itemSize; + byteArray.splice(0, itemSize); + } return new AggregateTransactionBodyBuilder(transactionsHash, transactions, cosignatures); } @@ -91,7 +110,7 @@ export class AggregateTransactionBodyBuilder { * * @return Sub-transaction data (transactions are variable sized and payload size is in bytes). */ - public getTransactions(): Uint8Array { + public getTransactions(): EmbeddedTransactionBuilder[] { return this.transactions; } @@ -100,7 +119,7 @@ export class AggregateTransactionBodyBuilder { * * @return Cosignatures data (fills remaining body space after transactions). */ - public getCosignatures(): Uint8Array { + public getCosignatures(): CosignatureBuilder[] { return this.cosignatures; } @@ -114,8 +133,8 @@ export class AggregateTransactionBodyBuilder { size += this.transactionsHash.getSize(); size += 4; // payloadSize size += 4; // aggregateTransactionHeader_Reserved1 - size += this.transactions.length; - size += this.cosignatures.length; + this.transactions.forEach((o) => size += EmbeddedTransactionHelper.serialize(o).length); + this.cosignatures.forEach((o) => size += o.getSize()); return size; } @@ -128,13 +147,20 @@ export class AggregateTransactionBodyBuilder { let newArray = Uint8Array.from([]); const transactionsHashBytes = this.transactionsHash.serialize(); newArray = GeneratorUtils.concatTypedArrays(newArray, transactionsHashBytes); - const payloadSizeBytes = GeneratorUtils.uintToBuffer(this.transactions.length, 4); + // tslint:disable-next-line: max-line-length + const payloadSizeBytes = GeneratorUtils.uintToBuffer(EmbeddedTransactionHelper.getEmbeddedTransactionSize(this.transactions), 4); newArray = GeneratorUtils.concatTypedArrays(newArray, payloadSizeBytes); // tslint:disable-next-line: max-line-length const aggregateTransactionHeader_Reserved1Bytes = GeneratorUtils.uintToBuffer(this.getAggregateTransactionHeader_Reserved1(), 4); newArray = GeneratorUtils.concatTypedArrays(newArray, aggregateTransactionHeader_Reserved1Bytes); - newArray = GeneratorUtils.concatTypedArrays(newArray, this.transactions); - newArray = GeneratorUtils.concatTypedArrays(newArray, this.cosignatures); + this.transactions.forEach((item) => { + const transactionsBytes = EmbeddedTransactionHelper.serialize(item); + newArray = GeneratorUtils.concatTypedArrays(newArray, transactionsBytes); + }); + this.cosignatures.forEach((item) => { + const cosignaturesBytes = item.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, cosignaturesBytes); + }); return newArray; } } diff --git a/src/infrastructure/catbuffer/BalanceChangeReceiptBuilder.ts b/src/infrastructure/catbuffer/BalanceChangeReceiptBuilder.ts new file mode 100644 index 0000000000..7670f20e0f --- /dev/null +++ b/src/infrastructure/catbuffer/BalanceChangeReceiptBuilder.ts @@ -0,0 +1,111 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { GeneratorUtils } from './GeneratorUtils'; +import { KeyDto } from './KeyDto'; +import { MosaicBuilder } from './MosaicBuilder'; +import { ReceiptBuilder } from './ReceiptBuilder'; +import { ReceiptTypeDto } from './ReceiptTypeDto'; + +/** Binary layout for a balance change receipt. */ +export class BalanceChangeReceiptBuilder extends ReceiptBuilder { + /** Mosaic. */ + mosaic: MosaicBuilder; + /** Account public key. */ + targetPublicKey: KeyDto; + + /** + * Constructor. + * + * @param version Receipt version. + * @param type Receipt type. + * @param mosaic Mosaic. + * @param targetPublicKey Account public key. + */ + public constructor(version: number, type: ReceiptTypeDto, mosaic: MosaicBuilder, targetPublicKey: KeyDto) { + super(version, type); + this.mosaic = mosaic; + this.targetPublicKey = targetPublicKey; + } + + /** + * Creates an instance of BalanceChangeReceiptBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of BalanceChangeReceiptBuilder. + */ + public static loadFromBinary(payload: Uint8Array): BalanceChangeReceiptBuilder { + const byteArray = Array.from(payload); + const superObject = ReceiptBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, superObject.getSize()); + const mosaic = MosaicBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, mosaic.getSize()); + const targetPublicKey = KeyDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, targetPublicKey.getSize()); + return new BalanceChangeReceiptBuilder(superObject.version, superObject.type, mosaic, targetPublicKey); + } + + /** + * Gets mosaic. + * + * @return Mosaic. + */ + public getMosaic(): MosaicBuilder { + return this.mosaic; + } + + /** + * Gets account public key. + * + * @return Account public key. + */ + public getTargetPublicKey(): KeyDto { + return this.targetPublicKey; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size: number = super.getSize(); + size += this.mosaic.getSize(); + size += this.targetPublicKey.getSize(); + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const superBytes = super.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, superBytes); + const mosaicBytes = this.mosaic.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, mosaicBytes); + const targetPublicKeyBytes = this.targetPublicKey.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, targetPublicKeyBytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/BalanceTransferReceiptBuilder.ts b/src/infrastructure/catbuffer/BalanceTransferReceiptBuilder.ts new file mode 100644 index 0000000000..89215dc6c1 --- /dev/null +++ b/src/infrastructure/catbuffer/BalanceTransferReceiptBuilder.ts @@ -0,0 +1,132 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { AddressDto } from './AddressDto'; +import { GeneratorUtils } from './GeneratorUtils'; +import { KeyDto } from './KeyDto'; +import { MosaicBuilder } from './MosaicBuilder'; +import { ReceiptBuilder } from './ReceiptBuilder'; +import { ReceiptTypeDto } from './ReceiptTypeDto'; + +/** Binary layout for a balance transfer receipt. */ +export class BalanceTransferReceiptBuilder extends ReceiptBuilder { + /** Mosaic. */ + mosaic: MosaicBuilder; + /** Mosaic sender public key. */ + senderPublicKey: KeyDto; + /** Mosaic recipient address. */ + recipientAddress: AddressDto; + + /** + * Constructor. + * + * @param version Receipt version. + * @param type Receipt type. + * @param mosaic Mosaic. + * @param senderPublicKey Mosaic sender public key. + * @param recipientAddress Mosaic recipient address. + */ + // tslint:disable-next-line: max-line-length + public constructor(version: number, type: ReceiptTypeDto, mosaic: MosaicBuilder, senderPublicKey: KeyDto, recipientAddress: AddressDto) { + super(version, type); + this.mosaic = mosaic; + this.senderPublicKey = senderPublicKey; + this.recipientAddress = recipientAddress; + } + + /** + * Creates an instance of BalanceTransferReceiptBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of BalanceTransferReceiptBuilder. + */ + public static loadFromBinary(payload: Uint8Array): BalanceTransferReceiptBuilder { + const byteArray = Array.from(payload); + const superObject = ReceiptBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, superObject.getSize()); + const mosaic = MosaicBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, mosaic.getSize()); + const senderPublicKey = KeyDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, senderPublicKey.getSize()); + const recipientAddress = AddressDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, recipientAddress.getSize()); + // tslint:disable-next-line: max-line-length + return new BalanceTransferReceiptBuilder(superObject.version, superObject.type, mosaic, senderPublicKey, recipientAddress); + } + + /** + * Gets mosaic. + * + * @return Mosaic. + */ + public getMosaic(): MosaicBuilder { + return this.mosaic; + } + + /** + * Gets mosaic sender public key. + * + * @return Mosaic sender public key. + */ + public getSenderPublicKey(): KeyDto { + return this.senderPublicKey; + } + + /** + * Gets mosaic recipient address. + * + * @return Mosaic recipient address. + */ + public getRecipientAddress(): AddressDto { + return this.recipientAddress; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size: number = super.getSize(); + size += this.mosaic.getSize(); + size += this.senderPublicKey.getSize(); + size += this.recipientAddress.getSize(); + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const superBytes = super.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, superBytes); + const mosaicBytes = this.mosaic.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, mosaicBytes); + const senderPublicKeyBytes = this.senderPublicKey.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, senderPublicKeyBytes); + const recipientAddressBytes = this.recipientAddress.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, recipientAddressBytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/BlockHeaderBuilder.ts b/src/infrastructure/catbuffer/BlockHeaderBuilder.ts new file mode 100644 index 0000000000..eb693aa3fa --- /dev/null +++ b/src/infrastructure/catbuffer/BlockHeaderBuilder.ts @@ -0,0 +1,387 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { BlockFeeMultiplierDto } from './BlockFeeMultiplierDto'; +import { DifficultyDto } from './DifficultyDto'; +import { EntityTypeDto } from './EntityTypeDto'; +import { GeneratorUtils } from './GeneratorUtils'; +import { Hash256Dto } from './Hash256Dto'; +import { HeightDto } from './HeightDto'; +import { KeyDto } from './KeyDto'; +import { NetworkTypeDto } from './NetworkTypeDto'; +import { SignatureDto } from './SignatureDto'; +import { TimestampDto } from './TimestampDto'; + +/** Binary layout for a block header. */ +export class BlockHeaderBuilder { + /** Entity size. */ + size = 0; + /** Reserved padding to align Signature on 8-byte boundary. */ + verifiableEntityHeader_Reserved1: number; + /** Entity signature. */ + signature: SignatureDto; + /** Entity signer's public key. */ + signerPublicKey: KeyDto; + /** Reserved padding to align end of EntityBody on 8-byte boundary. */ + entityBody_Reserved1: number; + /** Entity version. */ + version: number; + /** Entity network. */ + network: NetworkTypeDto; + /** Entity type. */ + type: EntityTypeDto; + /** Block height. */ + height: HeightDto; + /** Number of milliseconds elapsed since creation of nemesis block. */ + timestamp: TimestampDto; + /** Block difficulty. */ + difficulty: DifficultyDto; + /** Previous block hash. */ + previousBlockHash: Hash256Dto; + /** Hash of the transactions in this block. */ + transactionsHash: Hash256Dto; + /** Hash of the receipts generated by this block. */ + receiptsHash: Hash256Dto; + /** Hash of the global chain state at this block. */ + stateHash: Hash256Dto; + /** Beneficiary public key designated by harvester. */ + beneficiaryPublicKey: KeyDto; + /** Fee multiplier applied to block transactions. */ + feeMultiplier: BlockFeeMultiplierDto; + /** Reserved padding to align end of BlockHeader on 8-byte boundary. */ + blockHeader_Reserved1: number; + + /** + * Constructor. + * + * @param signature Entity signature. + * @param signerPublicKey Entity signer's public key. + * @param version Entity version. + * @param network Entity network. + * @param type Entity type. + * @param height Block height. + * @param timestamp Number of milliseconds elapsed since creation of nemesis block. + * @param difficulty Block difficulty. + * @param previousBlockHash Previous block hash. + * @param transactionsHash Hash of the transactions in this block. + * @param receiptsHash Hash of the receipts generated by this block. + * @param stateHash Hash of the global chain state at this block. + * @param beneficiaryPublicKey Beneficiary public key designated by harvester. + * @param feeMultiplier Fee multiplier applied to block transactions. + */ + // tslint:disable-next-line: max-line-length + public constructor(signature: SignatureDto, signerPublicKey: KeyDto, version: number, network: NetworkTypeDto, type: EntityTypeDto, height: HeightDto, timestamp: TimestampDto, difficulty: DifficultyDto, previousBlockHash: Hash256Dto, transactionsHash: Hash256Dto, receiptsHash: Hash256Dto, stateHash: Hash256Dto, beneficiaryPublicKey: KeyDto, feeMultiplier: BlockFeeMultiplierDto) { + this.verifiableEntityHeader_Reserved1 = 0; + this.signature = signature; + this.signerPublicKey = signerPublicKey; + this.entityBody_Reserved1 = 0; + this.version = version; + this.network = network; + this.type = type; + this.height = height; + this.timestamp = timestamp; + this.difficulty = difficulty; + this.previousBlockHash = previousBlockHash; + this.transactionsHash = transactionsHash; + this.receiptsHash = receiptsHash; + this.stateHash = stateHash; + this.beneficiaryPublicKey = beneficiaryPublicKey; + this.feeMultiplier = feeMultiplier; + this.blockHeader_Reserved1 = 0; + } + + /** + * Creates an instance of BlockHeaderBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of BlockHeaderBuilder. + */ + public static loadFromBinary(payload: Uint8Array): BlockHeaderBuilder { + const byteArray = Array.from(payload); + const size = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4)); + byteArray.splice(0, 4); + // tslint:disable-next-line: max-line-length + const verifiableEntityHeader_Reserved1 = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4)); + byteArray.splice(0, 4); + const signature = SignatureDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, signature.getSize()); + const signerPublicKey = KeyDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, signerPublicKey.getSize()); + const entityBody_Reserved1 = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4)); + byteArray.splice(0, 4); + const version = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 1)); + byteArray.splice(0, 1); + const network = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 1)); + byteArray.splice(0, 1); + const type = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 2)); + byteArray.splice(0, 2); + const height = HeightDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, height.getSize()); + const timestamp = TimestampDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, timestamp.getSize()); + const difficulty = DifficultyDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, difficulty.getSize()); + const previousBlockHash = Hash256Dto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, previousBlockHash.getSize()); + const transactionsHash = Hash256Dto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, transactionsHash.getSize()); + const receiptsHash = Hash256Dto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, receiptsHash.getSize()); + const stateHash = Hash256Dto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, stateHash.getSize()); + const beneficiaryPublicKey = KeyDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, beneficiaryPublicKey.getSize()); + const feeMultiplier = BlockFeeMultiplierDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, feeMultiplier.getSize()); + const blockHeader_Reserved1 = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4)); + byteArray.splice(0, 4); + // tslint:disable-next-line: max-line-length + return new BlockHeaderBuilder(signature, signerPublicKey, version, network, type, height, timestamp, difficulty, previousBlockHash, transactionsHash, receiptsHash, stateHash, beneficiaryPublicKey, feeMultiplier); + } + + /** + * Gets reserved padding to align Signature on 8-byte boundary. + * + * @return Reserved padding to align Signature on 8-byte boundary. + */ + public getVerifiableEntityHeader_Reserved1(): number { + return this.verifiableEntityHeader_Reserved1; + } + + /** + * Gets entity signature. + * + * @return Entity signature. + */ + public getSignature(): SignatureDto { + return this.signature; + } + + /** + * Gets entity signer's public key. + * + * @return Entity signer's public key. + */ + public getSignerPublicKey(): KeyDto { + return this.signerPublicKey; + } + + /** + * Gets reserved padding to align end of EntityBody on 8-byte boundary. + * + * @return Reserved padding to align end of EntityBody on 8-byte boundary. + */ + public getEntityBody_Reserved1(): number { + return this.entityBody_Reserved1; + } + + /** + * Gets entity version. + * + * @return Entity version. + */ + public getVersion(): number { + return this.version; + } + + /** + * Gets entity network. + * + * @return Entity network. + */ + public getNetwork(): NetworkTypeDto { + return this.network; + } + + /** + * Gets entity type. + * + * @return Entity type. + */ + public getType(): EntityTypeDto { + return this.type; + } + + /** + * Gets block height. + * + * @return Block height. + */ + public getHeight(): HeightDto { + return this.height; + } + + /** + * Gets number of milliseconds elapsed since creation of nemesis block. + * + * @return Number of milliseconds elapsed since creation of nemesis block. + */ + public getTimestamp(): TimestampDto { + return this.timestamp; + } + + /** + * Gets block difficulty. + * + * @return Block difficulty. + */ + public getDifficulty(): DifficultyDto { + return this.difficulty; + } + + /** + * Gets previous block hash. + * + * @return Previous block hash. + */ + public getPreviousBlockHash(): Hash256Dto { + return this.previousBlockHash; + } + + /** + * Gets hash of the transactions in this block. + * + * @return Hash of the transactions in this block. + */ + public getTransactionsHash(): Hash256Dto { + return this.transactionsHash; + } + + /** + * Gets hash of the receipts generated by this block. + * + * @return Hash of the receipts generated by this block. + */ + public getReceiptsHash(): Hash256Dto { + return this.receiptsHash; + } + + /** + * Gets hash of the global chain state at this block. + * + * @return Hash of the global chain state at this block. + */ + public getStateHash(): Hash256Dto { + return this.stateHash; + } + + /** + * Gets beneficiary public key designated by harvester. + * + * @return Beneficiary public key designated by harvester. + */ + public getBeneficiaryPublicKey(): KeyDto { + return this.beneficiaryPublicKey; + } + + /** + * Gets fee multiplier applied to block transactions. + * + * @return Fee multiplier applied to block transactions. + */ + public getFeeMultiplier(): BlockFeeMultiplierDto { + return this.feeMultiplier; + } + + /** + * Gets reserved padding to align end of BlockHeader on 8-byte boundary. + * + * @return Reserved padding to align end of BlockHeader on 8-byte boundary. + */ + public getBlockHeader_Reserved1(): number { + return this.blockHeader_Reserved1; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size = 0; + size += 4; // size + size += 4; // verifiableEntityHeader_Reserved1 + size += this.signature.getSize(); + size += this.signerPublicKey.getSize(); + size += 4; // entityBody_Reserved1 + size += 1; // version + size += 1; // network + size += 2; // type + size += this.height.getSize(); + size += this.timestamp.getSize(); + size += this.difficulty.getSize(); + size += this.previousBlockHash.getSize(); + size += this.transactionsHash.getSize(); + size += this.receiptsHash.getSize(); + size += this.stateHash.getSize(); + size += this.beneficiaryPublicKey.getSize(); + size += this.feeMultiplier.getSize(); + size += 4; // blockHeader_Reserved1 + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const sizeBytes = GeneratorUtils.uintToBuffer(this.getSize(), 4); + newArray = GeneratorUtils.concatTypedArrays(newArray, sizeBytes); + // tslint:disable-next-line: max-line-length + const verifiableEntityHeader_Reserved1Bytes = GeneratorUtils.uintToBuffer(this.getVerifiableEntityHeader_Reserved1(), 4); + newArray = GeneratorUtils.concatTypedArrays(newArray, verifiableEntityHeader_Reserved1Bytes); + const signatureBytes = this.signature.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, signatureBytes); + const signerPublicKeyBytes = this.signerPublicKey.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, signerPublicKeyBytes); + const entityBody_Reserved1Bytes = GeneratorUtils.uintToBuffer(this.getEntityBody_Reserved1(), 4); + newArray = GeneratorUtils.concatTypedArrays(newArray, entityBody_Reserved1Bytes); + const versionBytes = GeneratorUtils.uintToBuffer(this.getVersion(), 1); + newArray = GeneratorUtils.concatTypedArrays(newArray, versionBytes); + const networkBytes = GeneratorUtils.uintToBuffer(this.network, 1); + newArray = GeneratorUtils.concatTypedArrays(newArray, networkBytes); + const typeBytes = GeneratorUtils.uintToBuffer(this.type, 2); + newArray = GeneratorUtils.concatTypedArrays(newArray, typeBytes); + const heightBytes = this.height.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, heightBytes); + const timestampBytes = this.timestamp.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, timestampBytes); + const difficultyBytes = this.difficulty.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, difficultyBytes); + const previousBlockHashBytes = this.previousBlockHash.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, previousBlockHashBytes); + const transactionsHashBytes = this.transactionsHash.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, transactionsHashBytes); + const receiptsHashBytes = this.receiptsHash.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, receiptsHashBytes); + const stateHashBytes = this.stateHash.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, stateHashBytes); + const beneficiaryPublicKeyBytes = this.beneficiaryPublicKey.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, beneficiaryPublicKeyBytes); + const feeMultiplierBytes = this.feeMultiplier.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, feeMultiplierBytes); + const blockHeader_Reserved1Bytes = GeneratorUtils.uintToBuffer(this.getBlockHeader_Reserved1(), 4); + newArray = GeneratorUtils.concatTypedArrays(newArray, blockHeader_Reserved1Bytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts b/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts new file mode 100644 index 0000000000..ad436cfc30 --- /dev/null +++ b/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts @@ -0,0 +1,181 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { EntityTypeDto } from './EntityTypeDto' +import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder' +import { GeneratorUtils } from './GeneratorUtils' +import { EmbeddedTransferTransactionBuilder } from './EmbeddedTransferTransactionBuilder' +import { EmbeddedAccountLinkTransactionBuilder } from './EmbeddedAccountLinkTransactionBuilder' +import { EmbeddedHashLockTransactionBuilder } from './EmbeddedHashLockTransactionBuilder' +import { EmbeddedSecretLockTransactionBuilder } from './EmbeddedSecretLockTransactionBuilder' +import { EmbeddedSecretProofTransactionBuilder } from './EmbeddedSecretProofTransactionBuilder' +import { EmbeddedAccountMetadataTransactionBuilder } from './EmbeddedAccountMetadataTransactionBuilder' +import { EmbeddedMosaicMetadataTransactionBuilder } from './EmbeddedMosaicMetadataTransactionBuilder' +import { EmbeddedNamespaceMetadataTransactionBuilder } from './EmbeddedNamespaceMetadataTransactionBuilder' +import { EmbeddedMosaicDefinitionTransactionBuilder } from './EmbeddedMosaicDefinitionTransactionBuilder' +import { EmbeddedMosaicSupplyChangeTransactionBuilder } from './EmbeddedMosaicSupplyChangeTransactionBuilder' +import { EmbeddedMultisigAccountModificationTransactionBuilder } from './EmbeddedMultisigAccountModificationTransactionBuilder' +import { EmbeddedAddressAliasTransactionBuilder } from './EmbeddedAddressAliasTransactionBuilder' +import { EmbeddedMosaicAliasTransactionBuilder } from './EmbeddedMosaicAliasTransactionBuilder' +import { EmbeddedNamespaceRegistrationTransactionBuilder } from './EmbeddedNamespaceRegistrationTransactionBuilder' +import { EmbeddedAccountAddressRestrictionTransactionBuilder } from './EmbeddedAccountAddressRestrictionTransactionBuilder' +import { EmbeddedAccountMosaicRestrictionTransactionBuilder } from './EmbeddedAccountMosaicRestrictionTransactionBuilder' +import { EmbeddedAccountOperationRestrictionTransactionBuilder } from './EmbeddedAccountOperationRestrictionTransactionBuilder' +import { EmbeddedMosaicAddressRestrictionTransactionBuilder } from './EmbeddedMosaicAddressRestrictionTransactionBuilder' +import { EmbeddedMosaicGlobalRestrictionTransactionBuilder } from './EmbeddedMosaicGlobalRestrictionTransactionBuilder' + +export class EmbeddedTransactionHelper { + + public static serialize(transaction: EmbeddedTransactionBuilder): Uint8Array { + let byte: Uint8Array; + let padding: Uint8Array; + switch (transaction.type) { + case EntityTypeDto.TRANSFER_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedTransferTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.ACCOUNT_LINK_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedAccountLinkTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.HASH_LOCK_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedHashLockTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.SECRET_LOCK_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedSecretLockTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.SECRET_PROOF_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedSecretProofTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.ACCOUNT_METADATA_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedAccountMetadataTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MOSAIC_METADATA_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMosaicMetadataTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.NAMESPACE_METADATA_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedNamespaceMetadataTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MOSAIC_DEFINITION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMosaicDefinitionTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MOSAIC_SUPPLY_CHANGE_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMosaicSupplyChangeTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MULTISIG_ACCOUNT_MODIFICATION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMultisigAccountModificationTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.ADDRESS_ALIAS_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedAddressAliasTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MOSAIC_ALIAS_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMosaicAliasTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.NAMESPACE_REGISTRATION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedNamespaceRegistrationTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.ACCOUNT_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedAccountAddressRestrictionTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.ACCOUNT_MOSAIC_RESTRICTION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedAccountMosaicRestrictionTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.ACCOUNT_OPERATION_RESTRICTION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedAccountOperationRestrictionTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MOSAIC_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMosaicAddressRestrictionTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MOSAIC_GLOBAL_RESTRICTION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMosaicGlobalRestrictionTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + default: + throw new Error(`Transaction type: ${transaction.type} not recognized.`) + } + } + + public static loadFromBinary(bytes: Uint8Array):EmbeddedTransactionBuilder { + const header = EmbeddedTransactionBuilder.loadFromBinary(bytes); + switch (header.getType()) { + case EntityTypeDto.TRANSFER_TRANSACTION_BUILDER: + return EmbeddedTransferTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.ACCOUNT_LINK_TRANSACTION_BUILDER: + return EmbeddedAccountLinkTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.HASH_LOCK_TRANSACTION_BUILDER: + return EmbeddedHashLockTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.SECRET_LOCK_TRANSACTION_BUILDER: + return EmbeddedSecretLockTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.SECRET_PROOF_TRANSACTION_BUILDER: + return EmbeddedSecretProofTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.ACCOUNT_METADATA_TRANSACTION_BUILDER: + return EmbeddedAccountMetadataTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MOSAIC_METADATA_TRANSACTION_BUILDER: + return EmbeddedMosaicMetadataTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.NAMESPACE_METADATA_TRANSACTION_BUILDER: + return EmbeddedNamespaceMetadataTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MOSAIC_DEFINITION_TRANSACTION_BUILDER: + return EmbeddedMosaicDefinitionTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MOSAIC_SUPPLY_CHANGE_TRANSACTION_BUILDER: + return EmbeddedMosaicSupplyChangeTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MULTISIG_ACCOUNT_MODIFICATION_TRANSACTION_BUILDER: + return EmbeddedMultisigAccountModificationTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.ADDRESS_ALIAS_TRANSACTION_BUILDER: + return EmbeddedAddressAliasTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MOSAIC_ALIAS_TRANSACTION_BUILDER: + return EmbeddedMosaicAliasTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.NAMESPACE_REGISTRATION_TRANSACTION_BUILDER: + return EmbeddedNamespaceRegistrationTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.ACCOUNT_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: + return EmbeddedAccountAddressRestrictionTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.ACCOUNT_MOSAIC_RESTRICTION_TRANSACTION_BUILDER: + return EmbeddedAccountMosaicRestrictionTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.ACCOUNT_OPERATION_RESTRICTION_TRANSACTION_BUILDER: + return EmbeddedAccountOperationRestrictionTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MOSAIC_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: + return EmbeddedMosaicAddressRestrictionTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MOSAIC_GLOBAL_RESTRICTION_TRANSACTION_BUILDER: + return EmbeddedMosaicGlobalRestrictionTransactionBuilder.loadFromBinary(bytes) + default: + throw new Error(`Transaction type: ${header.getType()} not recognized.`) + } + } + + public static getEmbeddedTransactionSize(transactions: EmbeddedTransactionBuilder[]): number { + return transactions.map((o) => EmbeddedTransactionHelper.serialize(o).length).reduce((a, b) => a + b, 0); + } +} diff --git a/src/infrastructure/catbuffer/EntityTypeDto.ts b/src/infrastructure/catbuffer/EntityTypeDto.ts index cbbf804d10..4399620a5c 100644 --- a/src/infrastructure/catbuffer/EntityTypeDto.ts +++ b/src/infrastructure/catbuffer/EntityTypeDto.ts @@ -26,4 +26,44 @@ export enum EntityTypeDto { RESERVED = 0, /** Transfer transaction builder. */ TRANSFER_TRANSACTION_BUILDER = 16724, + /** Account link transaction builder. */ + ACCOUNT_LINK_TRANSACTION_BUILDER = 16716, + /** Hash lock transaction builder. */ + HASH_LOCK_TRANSACTION_BUILDER = 16712, + /** Secret lock transaction builder. */ + SECRET_LOCK_TRANSACTION_BUILDER = 16722, + /** Secret proof transaction builder. */ + SECRET_PROOF_TRANSACTION_BUILDER = 16978, + /** Account metadata transaction builder. */ + ACCOUNT_METADATA_TRANSACTION_BUILDER = 16708, + /** Mosaic metadata transaction builder. */ + MOSAIC_METADATA_TRANSACTION_BUILDER = 16964, + /** Namespace metadata transaction builder. */ + NAMESPACE_METADATA_TRANSACTION_BUILDER = 17220, + /** Mosaic definition transaction builder. */ + MOSAIC_DEFINITION_TRANSACTION_BUILDER = 16717, + /** Mosaic supply change transaction builder. */ + MOSAIC_SUPPLY_CHANGE_TRANSACTION_BUILDER = 16973, + /** Multisig account modification transaction builder. */ + MULTISIG_ACCOUNT_MODIFICATION_TRANSACTION_BUILDER = 16725, + /** Address alias transaction builder. */ + ADDRESS_ALIAS_TRANSACTION_BUILDER = 16974, + /** Mosaic alias transaction builder. */ + MOSAIC_ALIAS_TRANSACTION_BUILDER = 17230, + /** Namespace registration transaction builder. */ + NAMESPACE_REGISTRATION_TRANSACTION_BUILDER = 16718, + /** Account address restriction transaction builder. */ + ACCOUNT_ADDRESS_RESTRICTION_TRANSACTION_BUILDER = 16720, + /** Account mosaic restriction transaction builder. */ + ACCOUNT_MOSAIC_RESTRICTION_TRANSACTION_BUILDER = 16976, + /** Account operation restriction transaction builder. */ + ACCOUNT_OPERATION_RESTRICTION_TRANSACTION_BUILDER = 17232, + /** Mosaic address restriction transaction builder. */ + MOSAIC_ADDRESS_RESTRICTION_TRANSACTION_BUILDER = 16977, + /** Mosaic global restriction transaction builder. */ + MOSAIC_GLOBAL_RESTRICTION_TRANSACTION_BUILDER = 16721, + /** Aggregate complete transaction builder. */ + AGGREGATE_COMPLETE_TRANSACTION_BUILDER = 16705, + /** Aggregate bonded transaction builder. */ + AGGREGATE_BONDED_TRANSACTION_BUILDER = 16961, } diff --git a/src/infrastructure/catbuffer/GeneratorUtils.ts b/src/infrastructure/catbuffer/GeneratorUtils.ts index d1c6eb5d9b..74399315e0 100644 --- a/src/infrastructure/catbuffer/GeneratorUtils.ts +++ b/src/infrastructure/catbuffer/GeneratorUtils.ts @@ -145,4 +145,13 @@ export class GeneratorUtils { const bytes = binary.slice(0, size); return bytes; } + + /** + * Gets the padding size that rounds up \a size to the next multiple of \a alignment. + * @param size Inner transaction size + * @param alignment Next multiple alignment + */ + public static getTransactionPaddingSize(size: number, alignment: number): number { + return 0 === size % alignment ? 0 : alignment - (size % alignment); + } } diff --git a/src/infrastructure/catbuffer/InflationReceiptBuilder.ts b/src/infrastructure/catbuffer/InflationReceiptBuilder.ts new file mode 100644 index 0000000000..d9d12527ec --- /dev/null +++ b/src/infrastructure/catbuffer/InflationReceiptBuilder.ts @@ -0,0 +1,92 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { GeneratorUtils } from './GeneratorUtils'; +import { MosaicBuilder } from './MosaicBuilder'; +import { ReceiptBuilder } from './ReceiptBuilder'; +import { ReceiptTypeDto } from './ReceiptTypeDto'; + +/** Binary layout for an inflation receipt. */ +export class InflationReceiptBuilder extends ReceiptBuilder { + /** Mosaic. */ + mosaic: MosaicBuilder; + + /** + * Constructor. + * + * @param version Receipt version. + * @param type Receipt type. + * @param mosaic Mosaic. + */ + public constructor(version: number, type: ReceiptTypeDto, mosaic: MosaicBuilder) { + super(version, type); + this.mosaic = mosaic; + } + + /** + * Creates an instance of InflationReceiptBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of InflationReceiptBuilder. + */ + public static loadFromBinary(payload: Uint8Array): InflationReceiptBuilder { + const byteArray = Array.from(payload); + const superObject = ReceiptBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, superObject.getSize()); + const mosaic = MosaicBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, mosaic.getSize()); + return new InflationReceiptBuilder(superObject.version, superObject.type, mosaic); + } + + /** + * Gets mosaic. + * + * @return Mosaic. + */ + public getMosaic(): MosaicBuilder { + return this.mosaic; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size: number = super.getSize(); + size += this.mosaic.getSize(); + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const superBytes = super.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, superBytes); + const mosaicBytes = this.mosaic.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, mosaicBytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/MosaicExpiryReceiptBuilder.ts b/src/infrastructure/catbuffer/MosaicExpiryReceiptBuilder.ts new file mode 100644 index 0000000000..3940e509e5 --- /dev/null +++ b/src/infrastructure/catbuffer/MosaicExpiryReceiptBuilder.ts @@ -0,0 +1,92 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { GeneratorUtils } from './GeneratorUtils'; +import { MosaicIdDto } from './MosaicIdDto'; +import { ReceiptBuilder } from './ReceiptBuilder'; +import { ReceiptTypeDto } from './ReceiptTypeDto'; + +/** Binary layout for a mosaic expiry receipt. */ +export class MosaicExpiryReceiptBuilder extends ReceiptBuilder { + /** Expiring mosaic id. */ + artifactId: MosaicIdDto; + + /** + * Constructor. + * + * @param version Receipt version. + * @param type Receipt type. + * @param artifactId Expiring mosaic id. + */ + public constructor(version: number, type: ReceiptTypeDto, artifactId: MosaicIdDto) { + super(version, type); + this.artifactId = artifactId; + } + + /** + * Creates an instance of MosaicExpiryReceiptBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of MosaicExpiryReceiptBuilder. + */ + public static loadFromBinary(payload: Uint8Array): MosaicExpiryReceiptBuilder { + const byteArray = Array.from(payload); + const superObject = ReceiptBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, superObject.getSize()); + const artifactId = MosaicIdDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, artifactId.getSize()); + return new MosaicExpiryReceiptBuilder(superObject.version, superObject.type, artifactId); + } + + /** + * Gets expiring mosaic id. + * + * @return Expiring mosaic id. + */ + public getArtifactId(): MosaicIdDto { + return this.artifactId; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size: number = super.getSize(); + size += this.artifactId.getSize(); + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const superBytes = super.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, superBytes); + const artifactIdBytes = this.artifactId.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, artifactIdBytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/NamespaceExpiryReceiptBuilder.ts b/src/infrastructure/catbuffer/NamespaceExpiryReceiptBuilder.ts new file mode 100644 index 0000000000..2573d688a9 --- /dev/null +++ b/src/infrastructure/catbuffer/NamespaceExpiryReceiptBuilder.ts @@ -0,0 +1,92 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { GeneratorUtils } from './GeneratorUtils'; +import { NamespaceIdDto } from './NamespaceIdDto'; +import { ReceiptBuilder } from './ReceiptBuilder'; +import { ReceiptTypeDto } from './ReceiptTypeDto'; + +/** Binary layout for a namespace expiry receipt. */ +export class NamespaceExpiryReceiptBuilder extends ReceiptBuilder { + /** Expiring namespace id. */ + artifactId: NamespaceIdDto; + + /** + * Constructor. + * + * @param version Receipt version. + * @param type Receipt type. + * @param artifactId Expiring namespace id. + */ + public constructor(version: number, type: ReceiptTypeDto, artifactId: NamespaceIdDto) { + super(version, type); + this.artifactId = artifactId; + } + + /** + * Creates an instance of NamespaceExpiryReceiptBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of NamespaceExpiryReceiptBuilder. + */ + public static loadFromBinary(payload: Uint8Array): NamespaceExpiryReceiptBuilder { + const byteArray = Array.from(payload); + const superObject = ReceiptBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, superObject.getSize()); + const artifactId = NamespaceIdDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, artifactId.getSize()); + return new NamespaceExpiryReceiptBuilder(superObject.version, superObject.type, artifactId); + } + + /** + * Gets expiring namespace id. + * + * @return Expiring namespace id. + */ + public getArtifactId(): NamespaceIdDto { + return this.artifactId; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size: number = super.getSize(); + size += this.artifactId.getSize(); + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const superBytes = super.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, superBytes); + const artifactIdBytes = this.artifactId.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, artifactIdBytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/ReceiptBuilder.ts b/src/infrastructure/catbuffer/ReceiptBuilder.ts new file mode 100644 index 0000000000..524bf945df --- /dev/null +++ b/src/infrastructure/catbuffer/ReceiptBuilder.ts @@ -0,0 +1,108 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { GeneratorUtils } from './GeneratorUtils'; +import { ReceiptTypeDto } from './ReceiptTypeDto'; + +/** Binary layout for a receipt entity. */ +export class ReceiptBuilder { + /** Entity size. */ + size = 0; + /** Receipt version. */ + version: number; + /** Receipt type. */ + type: ReceiptTypeDto; + + /** + * Constructor. + * + * @param version Receipt version. + * @param type Receipt type. + */ + public constructor(version: number, type: ReceiptTypeDto) { + this.version = version; + this.type = type; + } + + /** + * Creates an instance of ReceiptBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of ReceiptBuilder. + */ + public static loadFromBinary(payload: Uint8Array): ReceiptBuilder { + const byteArray = Array.from(payload); + const size = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4)); + byteArray.splice(0, 4); + const version = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 2)); + byteArray.splice(0, 2); + const type = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 2)); + byteArray.splice(0, 2); + return new ReceiptBuilder(version, type); + } + + /** + * Gets receipt version. + * + * @return Receipt version. + */ + public getVersion(): number { + return this.version; + } + + /** + * Gets receipt type. + * + * @return Receipt type. + */ + public getType(): ReceiptTypeDto { + return this.type; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size = 0; + size += 4; // size + size += 2; // version + size += 2; // type + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const sizeBytes = GeneratorUtils.uintToBuffer(this.getSize(), 4); + newArray = GeneratorUtils.concatTypedArrays(newArray, sizeBytes); + const versionBytes = GeneratorUtils.uintToBuffer(this.getVersion(), 2); + newArray = GeneratorUtils.concatTypedArrays(newArray, versionBytes); + const typeBytes = GeneratorUtils.uintToBuffer(this.type, 2); + newArray = GeneratorUtils.concatTypedArrays(newArray, typeBytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/ReceiptTypeDto.ts b/src/infrastructure/catbuffer/ReceiptTypeDto.ts new file mode 100644 index 0000000000..f2d4bdc10f --- /dev/null +++ b/src/infrastructure/catbuffer/ReceiptTypeDto.ts @@ -0,0 +1,27 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + + +/** Enumeration of receipt types. */ +export enum ReceiptTypeDto { + /** Reserved receipt type. */ + RESERVED = 0, +} diff --git a/src/model/transaction/AccountAddressRestrictionTransaction.ts b/src/model/transaction/AccountAddressRestrictionTransaction.ts index 66f2b2fafd..d7814ea1dc 100644 --- a/src/model/transaction/AccountAddressRestrictionTransaction.ts +++ b/src/model/transaction/AccountAddressRestrictionTransaction.ts @@ -21,6 +21,7 @@ import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedAccountAddressRestrictionTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedAccountAddressRestrictionTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; import { TimestampDto } from '../../infrastructure/catbuffer/TimestampDto'; @@ -172,10 +173,10 @@ export class AccountAddressRestrictionTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedAccountAddressRestrictionTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedAccountAddressRestrictionTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -188,7 +189,6 @@ export class AccountAddressRestrictionTransaction extends Transaction { return new UnresolvedAddressDto(UnresolvedMapping.toUnresolvedAddressBytes(deletion, this.networkType)); }), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/AccountLinkTransaction.ts b/src/model/transaction/AccountLinkTransaction.ts index 9e6e813de3..2374266254 100644 --- a/src/model/transaction/AccountLinkTransaction.ts +++ b/src/model/transaction/AccountLinkTransaction.ts @@ -18,6 +18,7 @@ import { Convert } from '../../core/format'; import { AccountLinkTransactionBuilder } from '../../infrastructure/catbuffer/AccountLinkTransactionBuilder'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedAccountLinkTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedAccountLinkTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; import { TimestampDto } from '../../infrastructure/catbuffer/TimestampDto'; @@ -150,10 +151,10 @@ export class AccountLinkTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedAccountLinkTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedAccountLinkTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -161,7 +162,6 @@ export class AccountLinkTransaction extends Transaction { new KeyDto(Convert.hexToUint8(this.remotePublicKey)), this.linkAction.valueOf(), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/AccountMetadataTransaction.ts b/src/model/transaction/AccountMetadataTransaction.ts index 78b2009887..d01429d3af 100644 --- a/src/model/transaction/AccountMetadataTransaction.ts +++ b/src/model/transaction/AccountMetadataTransaction.ts @@ -18,6 +18,7 @@ import { Convert } from '../../core/format'; import { AccountMetadataTransactionBuilder } from '../../infrastructure/catbuffer/AccountMetadataTransactionBuilder'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedAccountMetadataTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedAccountMetadataTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; import { TimestampDto } from '../../infrastructure/catbuffer/TimestampDto'; @@ -178,10 +179,10 @@ export class AccountMetadataTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedAccountMetadataTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedAccountMetadataTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -191,7 +192,6 @@ export class AccountMetadataTransaction extends Transaction { this.valueSizeDelta, Convert.utf8ToUint8(this.value), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/AccountMosaicRestrictionTransaction.ts b/src/model/transaction/AccountMosaicRestrictionTransaction.ts index c739b574b8..b8a3f542a5 100644 --- a/src/model/transaction/AccountMosaicRestrictionTransaction.ts +++ b/src/model/transaction/AccountMosaicRestrictionTransaction.ts @@ -21,6 +21,7 @@ import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedAccountMosaicRestrictionTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedAccountMosaicRestrictionTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; import { TimestampDto } from '../../infrastructure/catbuffer/TimestampDto'; @@ -172,10 +173,10 @@ export class AccountMosaicRestrictionTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedAccountMosaicRestrictionTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedAccountMosaicRestrictionTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -188,7 +189,6 @@ export class AccountMosaicRestrictionTransaction extends Transaction { return new UnresolvedMosaicIdDto(deletion.id.toDTO()); }), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/AccountOperationRestrictionTransaction.ts b/src/model/transaction/AccountOperationRestrictionTransaction.ts index 899602794f..1dc508e493 100644 --- a/src/model/transaction/AccountOperationRestrictionTransaction.ts +++ b/src/model/transaction/AccountOperationRestrictionTransaction.ts @@ -22,6 +22,7 @@ import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedAccountOperationRestrictionTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedAccountOperationRestrictionTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; import { TimestampDto } from '../../infrastructure/catbuffer/TimestampDto'; @@ -160,10 +161,10 @@ export class AccountOperationRestrictionTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedAccountOperationRestrictionTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedAccountOperationRestrictionTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -172,7 +173,6 @@ export class AccountOperationRestrictionTransaction extends Transaction { this.restrictionAdditions, this.restrictionDeletions, ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/AddressAliasTransaction.ts b/src/model/transaction/AddressAliasTransaction.ts index 8f58f5d2a4..c94cd8492c 100644 --- a/src/model/transaction/AddressAliasTransaction.ts +++ b/src/model/transaction/AddressAliasTransaction.ts @@ -21,6 +21,7 @@ import { AddressAliasTransactionBuilder } from '../../infrastructure/catbuffer/A import { AddressDto } from '../../infrastructure/catbuffer/AddressDto'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedAddressAliasTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedAddressAliasTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { NamespaceIdDto } from '../../infrastructure/catbuffer/NamespaceIdDto'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; @@ -172,10 +173,10 @@ export class AddressAliasTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedAddressAliasTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedAddressAliasTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -184,7 +185,6 @@ export class AddressAliasTransaction extends Transaction { new AddressDto(RawAddress.stringToAddress(this.address.plain())), this.aliasAction.valueOf(), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/AggregateTransaction.ts b/src/model/transaction/AggregateTransaction.ts index a92792e4b5..82680242a5 100644 --- a/src/model/transaction/AggregateTransaction.ts +++ b/src/model/transaction/AggregateTransaction.ts @@ -20,6 +20,8 @@ import {AggregateBondedTransactionBuilder} from '../../infrastructure/catbuffer/ import {AggregateCompleteTransactionBuilder} from '../../infrastructure/catbuffer/AggregateCompleteTransactionBuilder'; import {AmountDto} from '../../infrastructure/catbuffer/AmountDto'; import {CosignatureBuilder} from '../../infrastructure/catbuffer/CosignatureBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; +import { EmbeddedTransactionHelper } from '../../infrastructure/catbuffer/EmbeddedTransactionHelper'; import {GeneratorUtils} from '../../infrastructure/catbuffer/GeneratorUtils'; import { Hash256Dto } from '../../infrastructure/catbuffer/Hash256Dto'; import {KeyDto} from '../../infrastructure/catbuffer/KeyDto'; @@ -139,36 +141,19 @@ export class AggregateTransaction extends Transaction { const builder = type === TransactionType.AGGREGATE_COMPLETE ? AggregateCompleteTransactionBuilder.loadFromBinary(Convert.hexToUint8(payload)) : AggregateBondedTransactionBuilder.loadFromBinary(Convert.hexToUint8(payload)); - const innerTransactionHex = Convert.uint8ToHex(builder.getTransactions()); + const innerTransactions = builder.getTransactions().map((t) => Convert.uint8ToHex(EmbeddedTransactionHelper.serialize(t))); const networkType = builder.getNetwork().valueOf(); - const consignaturesHex = Convert.uint8ToHex(builder.getCosignatures()); - - /** - * Get inner transactions array - */ - const embeddedTransactionArray: string[] = []; - let innerBinary = innerTransactionHex; - while (innerBinary.length) { - const payloadSize = parseInt(Convert.uint8ToHex(Convert.hexToUint8(innerBinary.substring(0, 8)).reverse()), 16) * 2; - const innerTransaction = innerBinary.substring(0, payloadSize); - embeddedTransactionArray.push(innerTransaction); - innerBinary = innerBinary.substring(payloadSize).replace(/\b0+/g, ''); - } - - /** - * Get cosignatures - */ - const consignatureArray = consignaturesHex.match(/.{1,192}/g); - const consignatures = consignatureArray ? consignatureArray.map((cosignature) => - new AggregateTransactionCosignature( - cosignature.substring(64, 192), - PublicAccount.createFromPublicKey(cosignature.substring(0, 64), networkType), - )) : []; + const consignatures = builder.getCosignatures().map((cosig) => { + return new AggregateTransactionCosignature( + Convert.uint8ToHex(cosig.signature.signature), + PublicAccount.createFromPublicKey(Convert.uint8ToHex(cosig.signerPublicKey.key), networkType), + ); + }); return type === TransactionType.AGGREGATE_COMPLETE ? AggregateTransaction.createComplete( Deadline.createFromDTO(builder.deadline.timestamp), - embeddedTransactionArray.map((transactionRaw) => { + innerTransactions.map((transactionRaw) => { return CreateTransactionFromPayload(transactionRaw, true) as InnerTransaction; }), networkType, @@ -176,7 +161,7 @@ export class AggregateTransaction extends Transaction { new UInt64(builder.fee.amount), ) : AggregateTransaction.createBonded( Deadline.createFromDTO(builder.deadline.timestamp), - embeddedTransactionArray.map((transactionRaw) => { + innerTransactions.map((transactionRaw) => { return CreateTransactionFromPayload(transactionRaw, true) as InnerTransaction; }), networkType, @@ -312,23 +297,14 @@ export class AggregateTransaction extends Transaction { protected generateBytes(): Uint8Array { const signerBuffer = new Uint8Array(32); const signatureBuffer = new Uint8Array(64); - let transactions = Uint8Array.from([]); - this.innerTransactions.forEach((transaction) => { - const transactionByte = transaction.toAggregateTransactionBytes(); - const innerTransactionPadding = new Uint8Array(this.getInnerTransactionPaddingSize(transactionByte.length, 8)); - const paddedTransactionByte = GeneratorUtils.concatTypedArrays(transactionByte, innerTransactionPadding); - transactions = GeneratorUtils.concatTypedArrays(transactions, paddedTransactionByte); - }); - - let cosignatures = Uint8Array.from([]); - this.cosignatures.forEach((cosignature) => { + const transactions = this.innerTransactions.map((transaction) => (transaction as Transaction).toEmbeddedTransaction()); + const cosignatures = this.cosignatures.map((cosignature) => { const signerBytes = Convert.hexToUint8(cosignature.signer.publicKey); const signatureBytes = Convert.hexToUint8(cosignature.signature); - const cosignatureBytes = new CosignatureBuilder( + return new CosignatureBuilder( new KeyDto(signerBytes), new SignatureDto(signatureBytes), - ).serialize(); - cosignatures = GeneratorUtils.concatTypedArrays(cosignatures, cosignatureBytes); + ); }); const transactionBuilder = this.type === TransactionType.AGGREGATE_COMPLETE ? @@ -361,9 +337,9 @@ export class AggregateTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { throw new Error('Method not implemented'); } diff --git a/src/model/transaction/LockFundsTransaction.ts b/src/model/transaction/LockFundsTransaction.ts index 3bab2f98aa..a8bd009e0d 100644 --- a/src/model/transaction/LockFundsTransaction.ts +++ b/src/model/transaction/LockFundsTransaction.ts @@ -18,6 +18,7 @@ import { Convert } from '../../core/format'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { BlockDurationDto } from '../../infrastructure/catbuffer/BlockDurationDto'; import { EmbeddedHashLockTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedHashLockTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { Hash256Dto } from '../../infrastructure/catbuffer/Hash256Dto'; import { HashLockTransactionBuilder } from '../../infrastructure/catbuffer/HashLockTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; @@ -188,10 +189,10 @@ export class LockFundsTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedHashLockTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedHashLockTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -201,7 +202,6 @@ export class LockFundsTransaction extends Transaction { new BlockDurationDto(this.duration.toDTO()), new Hash256Dto(Convert.hexToUint8(this.hash)), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MosaicAddressRestrictionTransaction.ts b/src/model/transaction/MosaicAddressRestrictionTransaction.ts index 7323856186..c2240472cd 100644 --- a/src/model/transaction/MosaicAddressRestrictionTransaction.ts +++ b/src/model/transaction/MosaicAddressRestrictionTransaction.ts @@ -20,6 +20,7 @@ import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMosaicAddressRestrictionTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedMosaicAddressRestrictionTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { MosaicAddressRestrictionTransactionBuilder } from '../../infrastructure/catbuffer/MosaicAddressRestrictionTransactionBuilder'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; @@ -218,10 +219,10 @@ export class MosaicAddressRestrictionTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMosaicAddressRestrictionTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMosaicAddressRestrictionTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -232,7 +233,6 @@ export class MosaicAddressRestrictionTransaction extends Transaction { this.newRestrictionValue.toDTO(), new UnresolvedAddressDto(UnresolvedMapping.toUnresolvedAddressBytes(this.targetAddress, this.networkType)), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MosaicAliasTransaction.ts b/src/model/transaction/MosaicAliasTransaction.ts index f259c5af13..238e8b1fbd 100644 --- a/src/model/transaction/MosaicAliasTransaction.ts +++ b/src/model/transaction/MosaicAliasTransaction.ts @@ -17,6 +17,7 @@ import { Convert } from '../../core/format'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMosaicAliasTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedMosaicAliasTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { MosaicAliasTransactionBuilder } from '../../infrastructure/catbuffer/MosaicAliasTransactionBuilder'; import { MosaicIdDto } from '../../infrastructure/catbuffer/MosaicIdDto'; @@ -164,10 +165,10 @@ export class MosaicAliasTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMosaicAliasTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMosaicAliasTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -176,7 +177,6 @@ export class MosaicAliasTransaction extends Transaction { new MosaicIdDto(this.mosaicId.id.toDTO()), this.aliasAction.valueOf(), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MosaicDefinitionTransaction.ts b/src/model/transaction/MosaicDefinitionTransaction.ts index a43a733825..5b3fe0754b 100644 --- a/src/model/transaction/MosaicDefinitionTransaction.ts +++ b/src/model/transaction/MosaicDefinitionTransaction.ts @@ -18,6 +18,7 @@ import { Convert } from '../../core/format'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { BlockDurationDto } from '../../infrastructure/catbuffer/BlockDurationDto'; import { EmbeddedMosaicDefinitionTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedMosaicDefinitionTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { GeneratorUtils } from '../../infrastructure/catbuffer/GeneratorUtils'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { MosaicDefinitionTransactionBuilder } from '../../infrastructure/catbuffer/MosaicDefinitionTransactionBuilder'; @@ -205,10 +206,10 @@ export class MosaicDefinitionTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMosaicDefinitionTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMosaicDefinitionTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -219,7 +220,6 @@ export class MosaicDefinitionTransaction extends Transaction { this.flags.getValue(), this.divisibility, ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MosaicGlobalRestrictionTransaction.ts b/src/model/transaction/MosaicGlobalRestrictionTransaction.ts index 35ff2de88e..7985c2947c 100644 --- a/src/model/transaction/MosaicGlobalRestrictionTransaction.ts +++ b/src/model/transaction/MosaicGlobalRestrictionTransaction.ts @@ -20,6 +20,7 @@ import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMosaicGlobalRestrictionTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedMosaicGlobalRestrictionTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { MosaicGlobalRestrictionTransactionBuilder } from '../../infrastructure/catbuffer/MosaicGlobalRestrictionTransactionBuilder'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; @@ -226,10 +227,10 @@ export class MosaicGlobalRestrictionTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMosaicGlobalRestrictionTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMosaicGlobalRestrictionTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -242,7 +243,6 @@ export class MosaicGlobalRestrictionTransaction extends Transaction { this.previousRestrictionType.valueOf(), this.newRestrictionType.valueOf(), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MosaicMetadataTransaction.ts b/src/model/transaction/MosaicMetadataTransaction.ts index ce5b5135cf..c491717997 100644 --- a/src/model/transaction/MosaicMetadataTransaction.ts +++ b/src/model/transaction/MosaicMetadataTransaction.ts @@ -18,6 +18,7 @@ import { Convert } from '../../core/format'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMosaicMetadataTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedMosaicMetadataTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { MosaicMetadataTransactionBuilder } from '../../infrastructure/catbuffer/MosaicMetadataTransactionBuilder'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; @@ -194,10 +195,10 @@ export class MosaicMetadataTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMosaicMetadataTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMosaicMetadataTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -208,7 +209,6 @@ export class MosaicMetadataTransaction extends Transaction { this.valueSizeDelta, Convert.utf8ToUint8(this.value), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MosaicSupplyChangeTransaction.ts b/src/model/transaction/MosaicSupplyChangeTransaction.ts index 3e6b2685cb..ca7e404242 100644 --- a/src/model/transaction/MosaicSupplyChangeTransaction.ts +++ b/src/model/transaction/MosaicSupplyChangeTransaction.ts @@ -18,6 +18,7 @@ import { Convert } from '../../core/format'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMosaicSupplyChangeTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedMosaicSupplyChangeTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { MosaicSupplyChangeTransactionBuilder } from '../../infrastructure/catbuffer/MosaicSupplyChangeTransactionBuilder'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; @@ -170,10 +171,10 @@ export class MosaicSupplyChangeTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMosaicSupplyChangeTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMosaicSupplyChangeTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -182,7 +183,6 @@ export class MosaicSupplyChangeTransaction extends Transaction { new AmountDto(this.delta.toDTO()), this.action.valueOf(), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MultisigAccountModificationTransaction.ts b/src/model/transaction/MultisigAccountModificationTransaction.ts index d8a4dc1d77..fcaefd7fcf 100644 --- a/src/model/transaction/MultisigAccountModificationTransaction.ts +++ b/src/model/transaction/MultisigAccountModificationTransaction.ts @@ -19,6 +19,7 @@ import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMultisigAccountModificationTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedMultisigAccountModificationTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import {MultisigAccountModificationTransactionBuilder, } from '../../infrastructure/catbuffer/MultisigAccountModificationTransactionBuilder'; @@ -193,10 +194,10 @@ export class MultisigAccountModificationTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMultisigAccountModificationTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMultisigAccountModificationTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -210,7 +211,6 @@ export class MultisigAccountModificationTransaction extends Transaction { return new KeyDto(Convert.hexToUint8(deletion.publicKey)); }), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/NamespaceMetadataTransaction.ts b/src/model/transaction/NamespaceMetadataTransaction.ts index f58453c268..36e80f13e3 100644 --- a/src/model/transaction/NamespaceMetadataTransaction.ts +++ b/src/model/transaction/NamespaceMetadataTransaction.ts @@ -17,6 +17,7 @@ import { Convert } from '../../core/format'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedNamespaceMetadataTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedNamespaceMetadataTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { NamespaceIdDto } from '../../infrastructure/catbuffer/NamespaceIdDto'; import { NamespaceMetadataTransactionBuilder } from '../../infrastructure/catbuffer/NamespaceMetadataTransactionBuilder'; @@ -192,10 +193,10 @@ export class NamespaceMetadataTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedNamespaceMetadataTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedNamespaceMetadataTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -206,7 +207,6 @@ export class NamespaceMetadataTransaction extends Transaction { this.valueSizeDelta, Convert.utf8ToUint8(this.value), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/NamespaceRegistrationTransaction.ts b/src/model/transaction/NamespaceRegistrationTransaction.ts index 935ee02bc7..cad026814e 100644 --- a/src/model/transaction/NamespaceRegistrationTransaction.ts +++ b/src/model/transaction/NamespaceRegistrationTransaction.ts @@ -20,6 +20,7 @@ import { BlockDurationDto } from '../../infrastructure/catbuffer/BlockDurationDt import { EmbeddedNamespaceRegistrationTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedNamespaceRegistrationTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { NamespaceIdDto } from '../../infrastructure/catbuffer/NamespaceIdDto'; import { NamespaceRegistrationTransactionBuilder } from '../../infrastructure/catbuffer/NamespaceRegistrationTransactionBuilder'; @@ -244,12 +245,11 @@ export class NamespaceRegistrationTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - let transactionBuilder: EmbeddedNamespaceRegistrationTransactionBuilder; + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { if (this.registrationType === NamespaceRegistrationType.RootNamespace) { - transactionBuilder = new EmbeddedNamespaceRegistrationTransactionBuilder( + return new EmbeddedNamespaceRegistrationTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -259,19 +259,17 @@ export class NamespaceRegistrationTransaction extends Transaction { new BlockDurationDto(this.duration!.toDTO()), undefined, ); - } else { - transactionBuilder = new EmbeddedNamespaceRegistrationTransactionBuilder( - new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), - this.versionToDTO(), - this.networkType.valueOf(), - TransactionType.REGISTER_NAMESPACE.valueOf(), - new NamespaceIdDto(this.namespaceId.id.toDTO()), - Convert.hexToUint8(Convert.utf8ToHex(this.namespaceName)), - undefined, - new NamespaceIdDto(this.parentId!.id.toDTO()), - ); } - return transactionBuilder.serialize(); + return new EmbeddedNamespaceRegistrationTransactionBuilder( + new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), + this.versionToDTO(), + this.networkType.valueOf(), + TransactionType.REGISTER_NAMESPACE.valueOf(), + new NamespaceIdDto(this.namespaceId.id.toDTO()), + Convert.hexToUint8(Convert.utf8ToHex(this.namespaceName)), + undefined, + new NamespaceIdDto(this.parentId!.id.toDTO()), + ); } /** diff --git a/src/model/transaction/SecretLockTransaction.ts b/src/model/transaction/SecretLockTransaction.ts index 3606ede7e7..df3ee1c863 100644 --- a/src/model/transaction/SecretLockTransaction.ts +++ b/src/model/transaction/SecretLockTransaction.ts @@ -18,6 +18,7 @@ import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { BlockDurationDto } from '../../infrastructure/catbuffer/BlockDurationDto'; import { EmbeddedSecretLockTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedSecretLockTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { Hash256Dto } from '../../infrastructure/catbuffer/Hash256Dto'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SecretLockTransactionBuilder } from '../../infrastructure/catbuffer/SecretLockTransactionBuilder'; @@ -214,10 +215,10 @@ export class SecretLockTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedSecretLockTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedSecretLockTransactionBuilder( new KeyDto(convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -229,7 +230,6 @@ export class SecretLockTransaction extends Transaction { this.hashType.valueOf(), new UnresolvedAddressDto(UnresolvedMapping.toUnresolvedAddressBytes(this.recipientAddress, this.networkType)), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/SecretProofTransaction.ts b/src/model/transaction/SecretProofTransaction.ts index 2c3a9de798..793d2a012d 100644 --- a/src/model/transaction/SecretProofTransaction.ts +++ b/src/model/transaction/SecretProofTransaction.ts @@ -21,6 +21,7 @@ import { Convert, Convert as convert } from '../../core/format'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedSecretProofTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedSecretProofTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { Hash256Dto } from '../../infrastructure/catbuffer/Hash256Dto'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SecretProofTransactionBuilder } from '../../infrastructure/catbuffer/SecretProofTransactionBuilder'; @@ -199,10 +200,10 @@ export class SecretProofTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedSecretProofTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedSecretProofTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -212,7 +213,6 @@ export class SecretProofTransaction extends Transaction { new UnresolvedAddressDto(UnresolvedMapping.toUnresolvedAddressBytes(this.recipientAddress, this.networkType)), this.getProofByte(), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/Transaction.ts b/src/model/transaction/Transaction.ts index f42edc8415..4830838648 100644 --- a/src/model/transaction/Transaction.ts +++ b/src/model/transaction/Transaction.ts @@ -16,6 +16,8 @@ import { KeyPair, SHA3Hasher, SignSchema } from '../../core/crypto'; import { Convert } from '../../core/format'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; +import { EmbeddedTransactionHelper } from '../../infrastructure/catbuffer/EmbeddedTransactionHelper'; import { SerializeTransactionToJSON } from '../../infrastructure/transaction/SerializeTransactionToJSON'; import { Account } from '../account/Account'; import { PublicAccount } from '../account/PublicAccount'; @@ -184,7 +186,7 @@ export abstract class Transaction { /** * @internal */ - protected abstract generateEmbeddedBytes(): Uint8Array; + public abstract toEmbeddedTransaction(): EmbeddedTransactionBuilder; /** * @internal @@ -286,7 +288,9 @@ export abstract class Transaction { * @return transaction with signer serialized to be part of an aggregate transaction */ public toAggregateTransactionBytes() { - return this.generateEmbeddedBytes(); + return EmbeddedTransactionHelper.serialize( + this.toEmbeddedTransaction(), + ); } /** diff --git a/src/model/transaction/TransferTransaction.ts b/src/model/transaction/TransferTransaction.ts index d858927b9e..4e99bb1d96 100644 --- a/src/model/transaction/TransferTransaction.ts +++ b/src/model/transaction/TransferTransaction.ts @@ -18,6 +18,7 @@ import * as Long from 'long'; import {Convert} from '../../core/format'; import {UnresolvedMapping} from '../../core/utils/UnresolvedMapping'; import {AmountDto} from '../../infrastructure/catbuffer/AmountDto'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import {EmbeddedTransferTransactionBuilder} from '../../infrastructure/catbuffer/EmbeddedTransferTransactionBuilder'; import {GeneratorUtils} from '../../infrastructure/catbuffer/GeneratorUtils'; import {KeyDto} from '../../infrastructure/catbuffer/KeyDto'; @@ -256,10 +257,10 @@ export class TransferTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedTransferTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedTransferTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -271,7 +272,6 @@ export class TransferTransaction extends Transaction { }), this.getMessageBuffer(), ); - return transactionBuilder.serialize(); } /** diff --git a/test/model/transaction/Transaction.spec.ts b/test/model/transaction/Transaction.spec.ts index 0b3eb881b4..04fb2e28b3 100644 --- a/test/model/transaction/Transaction.spec.ts +++ b/test/model/transaction/Transaction.spec.ts @@ -17,6 +17,7 @@ import { expect } from 'chai'; import { Observable } from 'rxjs/internal/Observable'; import { Convert } from '../../../src/core/format/Convert'; +import { EmbeddedTransactionBuilder } from '../../../src/infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { Account } from '../../../src/model/account/Account'; import { Address } from '../../../src/model/account/Address'; import { NetworkType } from '../../../src/model/blockchain/NetworkType'; @@ -400,7 +401,7 @@ class FakeTransaction extends Transaction { throw new Error('Not implemented'); } - protected generateEmbeddedBytes(): Uint8Array { + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { throw new Error('Not implemented'); } resolveAliases(): TransferTransaction { From cb0c6b17e3fc838160656f777689122f8f116b72 Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Fri, 20 Dec 2019 21:51:06 +0000 Subject: [PATCH 05/18] Fixed missing semicolon --- .../catbuffer/EmbeddedTransactionHelper.ts | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts b/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts index ad436cfc30..9a9c16712f 100644 --- a/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts +++ b/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts @@ -125,7 +125,7 @@ export class EmbeddedTransactionHelper { padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); return GeneratorUtils.concatTypedArrays(byte, padding); default: - throw new Error(`Transaction type: ${transaction.type} not recognized.`) + throw new Error(`Transaction type: ${transaction.type} not recognized.`); } } @@ -133,45 +133,45 @@ export class EmbeddedTransactionHelper { const header = EmbeddedTransactionBuilder.loadFromBinary(bytes); switch (header.getType()) { case EntityTypeDto.TRANSFER_TRANSACTION_BUILDER: - return EmbeddedTransferTransactionBuilder.loadFromBinary(bytes) + return EmbeddedTransferTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.ACCOUNT_LINK_TRANSACTION_BUILDER: - return EmbeddedAccountLinkTransactionBuilder.loadFromBinary(bytes) + return EmbeddedAccountLinkTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.HASH_LOCK_TRANSACTION_BUILDER: - return EmbeddedHashLockTransactionBuilder.loadFromBinary(bytes) + return EmbeddedHashLockTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.SECRET_LOCK_TRANSACTION_BUILDER: - return EmbeddedSecretLockTransactionBuilder.loadFromBinary(bytes) + return EmbeddedSecretLockTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.SECRET_PROOF_TRANSACTION_BUILDER: - return EmbeddedSecretProofTransactionBuilder.loadFromBinary(bytes) + return EmbeddedSecretProofTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.ACCOUNT_METADATA_TRANSACTION_BUILDER: - return EmbeddedAccountMetadataTransactionBuilder.loadFromBinary(bytes) + return EmbeddedAccountMetadataTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MOSAIC_METADATA_TRANSACTION_BUILDER: - return EmbeddedMosaicMetadataTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMosaicMetadataTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.NAMESPACE_METADATA_TRANSACTION_BUILDER: - return EmbeddedNamespaceMetadataTransactionBuilder.loadFromBinary(bytes) + return EmbeddedNamespaceMetadataTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MOSAIC_DEFINITION_TRANSACTION_BUILDER: - return EmbeddedMosaicDefinitionTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMosaicDefinitionTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MOSAIC_SUPPLY_CHANGE_TRANSACTION_BUILDER: - return EmbeddedMosaicSupplyChangeTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMosaicSupplyChangeTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MULTISIG_ACCOUNT_MODIFICATION_TRANSACTION_BUILDER: - return EmbeddedMultisigAccountModificationTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMultisigAccountModificationTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.ADDRESS_ALIAS_TRANSACTION_BUILDER: - return EmbeddedAddressAliasTransactionBuilder.loadFromBinary(bytes) + return EmbeddedAddressAliasTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MOSAIC_ALIAS_TRANSACTION_BUILDER: - return EmbeddedMosaicAliasTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMosaicAliasTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.NAMESPACE_REGISTRATION_TRANSACTION_BUILDER: - return EmbeddedNamespaceRegistrationTransactionBuilder.loadFromBinary(bytes) + return EmbeddedNamespaceRegistrationTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.ACCOUNT_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: - return EmbeddedAccountAddressRestrictionTransactionBuilder.loadFromBinary(bytes) + return EmbeddedAccountAddressRestrictionTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.ACCOUNT_MOSAIC_RESTRICTION_TRANSACTION_BUILDER: - return EmbeddedAccountMosaicRestrictionTransactionBuilder.loadFromBinary(bytes) + return EmbeddedAccountMosaicRestrictionTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.ACCOUNT_OPERATION_RESTRICTION_TRANSACTION_BUILDER: - return EmbeddedAccountOperationRestrictionTransactionBuilder.loadFromBinary(bytes) + return EmbeddedAccountOperationRestrictionTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MOSAIC_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: - return EmbeddedMosaicAddressRestrictionTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMosaicAddressRestrictionTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MOSAIC_GLOBAL_RESTRICTION_TRANSACTION_BUILDER: - return EmbeddedMosaicGlobalRestrictionTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMosaicGlobalRestrictionTransactionBuilder.loadFromBinary(bytes); default: - throw new Error(`Transaction type: ${header.getType()} not recognized.`) + throw new Error(`Transaction type: ${header.getType()} not recognized.`); } } From 8ef45a0f10b30ddde56c048c948ad0e57f6fa516 Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Sun, 22 Dec 2019 14:50:41 +0000 Subject: [PATCH 06/18] Applied catbuffer on receipt --- .../catbuffer/ReceiptBuilder.ts | 2 -- src/model/receipt/ArtifactExpiryReceipt.ts | 18 ++++++++------- src/model/receipt/BalanceChangeReceipt.ts | 17 +++++++------- src/model/receipt/BalanceTransferReceipt.ts | 23 ++++++++++--------- src/model/receipt/InflationReceipt.ts | 16 ++++++------- 5 files changed, 39 insertions(+), 37 deletions(-) diff --git a/src/infrastructure/catbuffer/ReceiptBuilder.ts b/src/infrastructure/catbuffer/ReceiptBuilder.ts index 524bf945df..ffe39705cb 100644 --- a/src/infrastructure/catbuffer/ReceiptBuilder.ts +++ b/src/infrastructure/catbuffer/ReceiptBuilder.ts @@ -97,8 +97,6 @@ export class ReceiptBuilder { */ public serialize(): Uint8Array { let newArray = Uint8Array.from([]); - const sizeBytes = GeneratorUtils.uintToBuffer(this.getSize(), 4); - newArray = GeneratorUtils.concatTypedArrays(newArray, sizeBytes); const versionBytes = GeneratorUtils.uintToBuffer(this.getVersion(), 2); newArray = GeneratorUtils.concatTypedArrays(newArray, versionBytes); const typeBytes = GeneratorUtils.uintToBuffer(this.type, 2); diff --git a/src/model/receipt/ArtifactExpiryReceipt.ts b/src/model/receipt/ArtifactExpiryReceipt.ts index 8df5aab72a..a8a14178e4 100644 --- a/src/model/receipt/ArtifactExpiryReceipt.ts +++ b/src/model/receipt/ArtifactExpiryReceipt.ts @@ -14,11 +14,12 @@ * limitations under the License. */ -import { Convert } from '../../core/format/Convert'; -import { GeneratorUtils } from '../../infrastructure/catbuffer/GeneratorUtils'; +import { MosaicExpiryReceiptBuilder } from '../../infrastructure/catbuffer/MosaicExpiryReceiptBuilder'; +import { MosaicIdDto } from '../../infrastructure/catbuffer/MosaicIdDto'; +import { NamespaceExpiryReceiptBuilder } from '../../infrastructure/catbuffer/NamespaceExpiryReceiptBuilder'; +import { NamespaceIdDto } from '../../infrastructure/catbuffer/NamespaceIdDto'; import { MosaicId } from '../mosaic/MosaicId'; import { NamespaceId } from '../namespace/NamespaceId'; -import { UInt64 } from '../UInt64'; import { Receipt } from './Receipt'; import { ReceiptType } from './ReceiptType'; import { ReceiptVersion } from './ReceiptVersion'; @@ -48,10 +49,11 @@ export class ArtifactExpiryReceipt extends Receipt { * @return {Uint8Array} */ public serialize(): Uint8Array { - const buffer = new Uint8Array(12); - buffer.set(GeneratorUtils.uintToBuffer(ReceiptVersion.ARTIFACT_EXPIRY, 2)); - buffer.set(GeneratorUtils.uintToBuffer(this.type, 2), 2); - buffer.set(GeneratorUtils.uint64ToBuffer(UInt64.fromHex(this.artifactId.toHex()).toDTO()), 4); - return buffer; + if (this.artifactId instanceof MosaicId) { + return new MosaicExpiryReceiptBuilder(ReceiptVersion.ARTIFACT_EXPIRY, this.type.valueOf(), + new MosaicIdDto(this.artifactId.toDTO())).serialize(); + } + return new NamespaceExpiryReceiptBuilder(ReceiptVersion.ARTIFACT_EXPIRY, this.type.valueOf(), + new NamespaceIdDto(this.artifactId.id.toDTO())).serialize(); } } diff --git a/src/model/receipt/BalanceChangeReceipt.ts b/src/model/receipt/BalanceChangeReceipt.ts index 83159b621c..7c11b72690 100644 --- a/src/model/receipt/BalanceChangeReceipt.ts +++ b/src/model/receipt/BalanceChangeReceipt.ts @@ -15,7 +15,11 @@ */ import { Convert } from '../../core/format/Convert'; -import { GeneratorUtils } from '../../infrastructure/catbuffer/GeneratorUtils'; +import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; +import { BalanceChangeReceiptBuilder } from '../../infrastructure/catbuffer/BalanceChangeReceiptBuilder'; +import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; +import { MosaicBuilder } from '../../infrastructure/catbuffer/MosaicBuilder'; +import { MosaicIdDto } from '../../infrastructure/catbuffer/MosaicIdDto'; import { PublicAccount } from '../account/PublicAccount'; import { MosaicId } from '../mosaic/MosaicId'; import { UInt64 } from '../UInt64'; @@ -62,12 +66,9 @@ export class BalanceChangeReceipt extends Receipt { * @return {Uint8Array} */ public serialize(): Uint8Array { - const buffer = new Uint8Array(52); - buffer.set(GeneratorUtils.uintToBuffer(ReceiptVersion.BALANCE_CHANGE, 2)); - buffer.set(GeneratorUtils.uintToBuffer(this.type, 2), 2); - buffer.set(GeneratorUtils.uint64ToBuffer(UInt64.fromHex(this.mosaicId.toHex()).toDTO()), 4); - buffer.set(GeneratorUtils.uint64ToBuffer(UInt64.fromHex(this.amount.toHex()).toDTO()), 12); - buffer.set(Convert.hexToUint8(this.targetPublicAccount.publicKey), 20); - return buffer; + return new BalanceChangeReceiptBuilder(ReceiptVersion.BALANCE_CHANGE, this.type.valueOf(), + new MosaicBuilder(new MosaicIdDto(this.mosaicId.toDTO()), new AmountDto(this.amount.toDTO())), + new KeyDto(Convert.hexToUint8(this.targetPublicAccount.publicKey)), + ).serialize(); } } diff --git a/src/model/receipt/BalanceTransferReceipt.ts b/src/model/receipt/BalanceTransferReceipt.ts index 1442fe3e82..4b11cc53f0 100644 --- a/src/model/receipt/BalanceTransferReceipt.ts +++ b/src/model/receipt/BalanceTransferReceipt.ts @@ -15,8 +15,13 @@ */ import { Convert } from '../../core/format/Convert'; -import { UnresolvedMapping } from "../../core/utils/UnresolvedMapping"; -import { GeneratorUtils } from '../../infrastructure/catbuffer/GeneratorUtils'; +import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; +import { AddressDto } from '../../infrastructure/catbuffer/AddressDto'; +import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; +import { BalanceTransferReceiptBuilder } from '../../infrastructure/catbuffer/BalanceTransferReceiptBuilder'; +import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; +import { MosaicBuilder } from '../../infrastructure/catbuffer/MosaicBuilder'; +import { MosaicIdDto } from '../../infrastructure/catbuffer/MosaicIdDto'; import { Address } from '../account/Address'; import { PublicAccount } from '../account/PublicAccount'; import { MosaicId } from '../mosaic/MosaicId'; @@ -70,15 +75,11 @@ export class BalanceTransferReceipt extends Receipt { * @return {Uint8Array} */ public serialize(): Uint8Array { - const recipient = this.getRecipientBytes(); - const buffer = new Uint8Array(52 + recipient.length); - buffer.set(GeneratorUtils.uintToBuffer(ReceiptVersion.BALANCE_TRANSFER, 2)); - buffer.set(GeneratorUtils.uintToBuffer(this.type, 2), 2); - buffer.set(GeneratorUtils.uint64ToBuffer(UInt64.fromHex(this.mosaicId.toHex()).toDTO()), 4); - buffer.set(GeneratorUtils.uint64ToBuffer(UInt64.fromHex(this.amount.toHex()).toDTO()), 12); - buffer.set(Convert.hexToUint8(this.sender.publicKey), 20); - buffer.set(recipient, 52); - return buffer; + return new BalanceTransferReceiptBuilder(ReceiptVersion.BALANCE_TRANSFER, this.type.valueOf(), + new MosaicBuilder(new MosaicIdDto(this.mosaicId.toDTO()), new AmountDto(this.amount.toDTO())), + new KeyDto(Convert.hexToUint8(this.sender.publicKey)), + new AddressDto(this.getRecipientBytes()), + ).serialize(); } /** diff --git a/src/model/receipt/InflationReceipt.ts b/src/model/receipt/InflationReceipt.ts index 4007cd2200..f9e217043d 100644 --- a/src/model/receipt/InflationReceipt.ts +++ b/src/model/receipt/InflationReceipt.ts @@ -14,8 +14,10 @@ * limitations under the License. */ -import { Convert } from '../../core/format/Convert'; -import { GeneratorUtils } from '../../infrastructure/catbuffer/GeneratorUtils'; +import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; +import { InflationReceiptBuilder } from '../../infrastructure/catbuffer/InflationReceiptBuilder'; +import { MosaicBuilder } from '../../infrastructure/catbuffer/MosaicBuilder'; +import { MosaicIdDto } from '../../infrastructure/catbuffer/MosaicIdDto'; import { MosaicId } from '../mosaic/MosaicId'; import { UInt64 } from '../UInt64'; import { Receipt } from './Receipt'; @@ -56,11 +58,9 @@ export class InflationReceipt extends Receipt { * @return {Uint8Array} */ public serialize(): Uint8Array { - const buffer = new Uint8Array(20); - buffer.set(GeneratorUtils.uintToBuffer(ReceiptVersion.INFLATION_RECEIPT, 2)); - buffer.set(GeneratorUtils.uintToBuffer(this.type, 2), 2); - buffer.set(GeneratorUtils.uint64ToBuffer(UInt64.fromHex(this.mosaicId.toHex()).toDTO()), 4); - buffer.set(GeneratorUtils.uint64ToBuffer(UInt64.fromHex(this.amount.toHex()).toDTO()), 12); - return buffer; + return new InflationReceiptBuilder( + ReceiptVersion.INFLATION_RECEIPT, this.type.valueOf(), + new MosaicBuilder(new MosaicIdDto(this.mosaicId.toDTO()), new AmountDto(this.amount.toDTO())), + ).serialize(); } } From 6d8c4213c116a5116a94303aa28b227b79d0caaa Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Sun, 22 Dec 2019 15:17:27 +0000 Subject: [PATCH 07/18] Moved object assgin to a static method in MappingDto --- src/core/utils/DtoMapping.ts | 11 ++++ .../AccountAddressRestrictionTransaction.ts | 17 +++--- .../AccountMosaicRestrictionTransaction.ts | 3 +- src/model/transaction/AggregateTransaction.ts | 9 +-- src/model/transaction/LockFundsTransaction.ts | 3 +- .../MosaicAddressRestrictionTransaction.ts | 3 +- .../MosaicGlobalRestrictionTransaction.ts | 3 +- .../transaction/MosaicMetadataTransaction.ts | 3 +- .../MosaicSupplyChangeTransaction.ts | 3 +- .../transaction/SecretLockTransaction.ts | 3 +- .../transaction/SecretProofTransaction.ts | 3 +- src/model/transaction/Transaction.ts | 7 ++- src/model/transaction/TransferTransaction.ts | 10 ++-- test/infrastructure/RepositoryFactory.spec.ts | 55 +++++++++---------- 14 files changed, 77 insertions(+), 56 deletions(-) diff --git a/src/core/utils/DtoMapping.ts b/src/core/utils/DtoMapping.ts index 576cd49d63..6c62abc026 100644 --- a/src/core/utils/DtoMapping.ts +++ b/src/core/utils/DtoMapping.ts @@ -54,4 +54,15 @@ export class DtoMapping { } }))); } + + /** + * Creates a copy of the first object adding the attributes of the second object. + * @param object the object to be cloned + * @param attributes the extra attributes to be added to the object. + * @returns a copy of the first object with the new attributes added. + */ + public static assign(object: T, attributes: any): T { + return Object.assign({__proto__: Object.getPrototypeOf(object)}, object, attributes); + } + } diff --git a/src/model/transaction/AccountAddressRestrictionTransaction.ts b/src/model/transaction/AccountAddressRestrictionTransaction.ts index 5aff4bee0e..d730adc931 100644 --- a/src/model/transaction/AccountAddressRestrictionTransaction.ts +++ b/src/model/transaction/AccountAddressRestrictionTransaction.ts @@ -15,6 +15,7 @@ */ import { Convert } from '../../core/format'; +import { DtoMapping } from '../../core/utils/DtoMapping'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AccountAddressRestrictionTransactionBuilder } from '../../infrastructure/catbuffer/AccountAddressRestrictionTransactionBuilder'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; @@ -199,13 +200,13 @@ export class AccountAddressRestrictionTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): AccountAddressRestrictionTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { - restrictionAdditions: - this.restrictionAdditions.map((addition) => statement.resolveAddress(addition, transactionInfo.height.toString(), - transactionInfo.index, aggregateTransactionIndex)), - restrictionDeletions: - this.restrictionDeletions.map((deletion) => statement.resolveAddress(deletion, transactionInfo.height.toString(), - transactionInfo.index, aggregateTransactionIndex)), - }); + return DtoMapping.assign(this, { + restrictionAdditions: + this.restrictionAdditions.map((addition) => statement.resolveAddress(addition, transactionInfo.height.toString(), + transactionInfo.index, aggregateTransactionIndex)), + restrictionDeletions: + this.restrictionDeletions.map((deletion) => statement.resolveAddress(deletion, transactionInfo.height.toString(), + transactionInfo.index, aggregateTransactionIndex)), + }); } } diff --git a/src/model/transaction/AccountMosaicRestrictionTransaction.ts b/src/model/transaction/AccountMosaicRestrictionTransaction.ts index b6428e83c7..4037d9e687 100644 --- a/src/model/transaction/AccountMosaicRestrictionTransaction.ts +++ b/src/model/transaction/AccountMosaicRestrictionTransaction.ts @@ -15,6 +15,7 @@ */ import { Convert } from '../../core/format'; +import { DtoMapping } from '../../core/utils/DtoMapping'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AccountMosaicRestrictionTransactionBuilder } from '../../infrastructure/catbuffer/AccountMosaicRestrictionTransactionBuilder'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; @@ -199,7 +200,7 @@ export class AccountMosaicRestrictionTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): AccountMosaicRestrictionTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { + return DtoMapping.assign(this, { restrictionAdditions: this.restrictionAdditions.map((addition) => statement.resolveMosaicId(addition, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)), diff --git a/src/model/transaction/AggregateTransaction.ts b/src/model/transaction/AggregateTransaction.ts index a92792e4b5..cfefb0a4e9 100644 --- a/src/model/transaction/AggregateTransaction.ts +++ b/src/model/transaction/AggregateTransaction.ts @@ -16,6 +16,7 @@ import {KeyPair, MerkleHashBuilder, SHA3Hasher, SignSchema} from '../../core/crypto'; import {Convert} from '../../core/format'; +import { DtoMapping } from '../../core/utils/DtoMapping'; import {AggregateBondedTransactionBuilder} from '../../infrastructure/catbuffer/AggregateBondedTransactionBuilder'; import {AggregateCompleteTransactionBuilder} from '../../infrastructure/catbuffer/AggregateCompleteTransactionBuilder'; import {AmountDto} from '../../infrastructure/catbuffer/AmountDto'; @@ -193,7 +194,7 @@ export class AggregateTransaction extends Transaction { */ public addTransactions(transactions: InnerTransaction[]): AggregateTransaction { const innerTransactions = this.innerTransactions.concat(transactions); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, {innerTransactions}); + return DtoMapping.assign(this, {innerTransactions}); } /** @@ -204,7 +205,7 @@ export class AggregateTransaction extends Transaction { */ public addCosignatures(cosigs: AggregateTransactionCosignature[]): AggregateTransaction { const cosignatures = this.cosignatures.concat(cosigs); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, {cosignatures}); + return DtoMapping.assign(this, {cosignatures}); } /** @@ -407,8 +408,8 @@ export class AggregateTransaction extends Transaction { */ resolveAliases(statement: Statement): AggregateTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, - {innerTransactions: this.innerTransactions.map((tx) => tx.resolveAliases(statement, transactionInfo.index)) + return DtoMapping.assign(this, + {innerTransactions: this.innerTransactions.map((tx) => tx.resolveAliases(statement, transactionInfo.index)) .sort((a, b) => a.transactionInfo!.index - b.transactionInfo!.index)}); } } diff --git a/src/model/transaction/LockFundsTransaction.ts b/src/model/transaction/LockFundsTransaction.ts index 300c871d11..9b6fc2bb35 100644 --- a/src/model/transaction/LockFundsTransaction.ts +++ b/src/model/transaction/LockFundsTransaction.ts @@ -15,6 +15,7 @@ */ import { Convert } from '../../core/format'; +import { DtoMapping } from '../../core/utils/DtoMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { BlockDurationDto } from '../../infrastructure/catbuffer/BlockDurationDto'; import { EmbeddedHashLockTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedHashLockTransactionBuilder'; @@ -211,7 +212,7 @@ export class LockFundsTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): LockFundsTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { + return DtoMapping.assign(this, { mosaic: statement.resolveMosaic(this.mosaic, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)}); } diff --git a/src/model/transaction/MosaicAddressRestrictionTransaction.ts b/src/model/transaction/MosaicAddressRestrictionTransaction.ts index 44b9ce1682..fa16011421 100644 --- a/src/model/transaction/MosaicAddressRestrictionTransaction.ts +++ b/src/model/transaction/MosaicAddressRestrictionTransaction.ts @@ -15,6 +15,7 @@ */ import { Convert } from '../../core/format'; +import { DtoMapping } from '../../core/utils/DtoMapping'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { @@ -243,7 +244,7 @@ export class MosaicAddressRestrictionTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): MosaicAddressRestrictionTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { + return DtoMapping.assign(this, { mosaicId: statement.resolveMosaicId(this.mosaicId, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex), targetAddress: statement.resolveAddress(this.targetAddress, diff --git a/src/model/transaction/MosaicGlobalRestrictionTransaction.ts b/src/model/transaction/MosaicGlobalRestrictionTransaction.ts index a172d6da29..e1d654f2d1 100644 --- a/src/model/transaction/MosaicGlobalRestrictionTransaction.ts +++ b/src/model/transaction/MosaicGlobalRestrictionTransaction.ts @@ -15,6 +15,7 @@ */ import { Convert } from '../../core/format'; +import { DtoMapping } from '../../core/utils/DtoMapping'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { @@ -253,7 +254,7 @@ export class MosaicGlobalRestrictionTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): MosaicGlobalRestrictionTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { + return DtoMapping.assign(this, { mosaicId: statement.resolveMosaicId(this.mosaicId, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex), referenceMosaicId: statement.resolveMosaicId(this.referenceMosaicId, transactionInfo.height.toString(), diff --git a/src/model/transaction/MosaicMetadataTransaction.ts b/src/model/transaction/MosaicMetadataTransaction.ts index b161f8766d..345db15e51 100644 --- a/src/model/transaction/MosaicMetadataTransaction.ts +++ b/src/model/transaction/MosaicMetadataTransaction.ts @@ -15,6 +15,7 @@ */ import { Convert } from '../../core/format'; +import { DtoMapping } from '../../core/utils/DtoMapping'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMosaicMetadataTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedMosaicMetadataTransactionBuilder'; @@ -219,7 +220,7 @@ export class MosaicMetadataTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): MosaicMetadataTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { + return DtoMapping.assign(this, { targetMosaicId: statement.resolveMosaicId(this.targetMosaicId, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)}); } diff --git a/src/model/transaction/MosaicSupplyChangeTransaction.ts b/src/model/transaction/MosaicSupplyChangeTransaction.ts index 69eae71d37..6ef580240f 100644 --- a/src/model/transaction/MosaicSupplyChangeTransaction.ts +++ b/src/model/transaction/MosaicSupplyChangeTransaction.ts @@ -15,6 +15,7 @@ */ import { Convert } from '../../core/format'; +import { DtoMapping } from '../../core/utils/DtoMapping'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMosaicSupplyChangeTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedMosaicSupplyChangeTransactionBuilder'; @@ -193,7 +194,7 @@ export class MosaicSupplyChangeTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): MosaicSupplyChangeTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { + return DtoMapping.assign(this, { mosaicId: statement.resolveMosaicId(this.mosaicId, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)}); } diff --git a/src/model/transaction/SecretLockTransaction.ts b/src/model/transaction/SecretLockTransaction.ts index 6dc523b95e..3b10e31c5c 100644 --- a/src/model/transaction/SecretLockTransaction.ts +++ b/src/model/transaction/SecretLockTransaction.ts @@ -14,6 +14,7 @@ * limitations under the License. */ import { Convert, Convert as convert } from '../../core/format'; +import { DtoMapping } from '../../core/utils/DtoMapping'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { BlockDurationDto } from '../../infrastructure/catbuffer/BlockDurationDto'; @@ -240,7 +241,7 @@ export class SecretLockTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): SecretLockTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { + return DtoMapping.assign(this, { recipientAddress: statement.resolveAddress(this.recipientAddress, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex), mosaic: statement.resolveMosaic(this.mosaic, transactionInfo.height.toString(), diff --git a/src/model/transaction/SecretProofTransaction.ts b/src/model/transaction/SecretProofTransaction.ts index b0fd539718..8e1855c841 100644 --- a/src/model/transaction/SecretProofTransaction.ts +++ b/src/model/transaction/SecretProofTransaction.ts @@ -15,6 +15,7 @@ */ import { Convert, Convert as convert } from '../../core/format'; +import { DtoMapping } from '../../core/utils/DtoMapping'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedSecretProofTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedSecretProofTransactionBuilder'; @@ -217,7 +218,7 @@ export class SecretProofTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): SecretProofTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { + return DtoMapping.assign(this, { recipientAddress: statement.resolveAddress(this.recipientAddress, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)}); } diff --git a/src/model/transaction/Transaction.ts b/src/model/transaction/Transaction.ts index 8e7010c4d1..3ffa2a2891 100644 --- a/src/model/transaction/Transaction.ts +++ b/src/model/transaction/Transaction.ts @@ -16,6 +16,7 @@ import { KeyPair, SHA3Hasher, SignSchema } from '../../core/crypto'; import { Convert } from '../../core/format'; +import { DtoMapping } from '../../core/utils/DtoMapping'; import { SerializeTransactionToJSON } from '../../infrastructure/transaction/SerializeTransactionToJSON'; import { Account } from '../account/Account'; import { PublicAccount } from '../account/PublicAccount'; @@ -200,7 +201,7 @@ export abstract class Transaction { * @returns {TransferTransaction} */ public setMaxFee(feeMultiplier: number): Transaction { - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, {maxFee: UInt64.fromUint(this.size * feeMultiplier)}); + return DtoMapping.assign(this, {maxFee: UInt64.fromUint(this.size * feeMultiplier)}); } /** @@ -277,7 +278,7 @@ export abstract class Transaction { if (this.type === TransactionType.AGGREGATE_BONDED || this.type === TransactionType.AGGREGATE_COMPLETE) { throw new Error('Inner transaction cannot be an aggregated transaction.'); } - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, {signer}); + return DtoMapping.assign(this, {signer}); } /** @@ -345,7 +346,7 @@ export abstract class Transaction { */ public reapplyGiven(deadline: Deadline = Deadline.create()): Transaction { if (this.isUnannounced()) { - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, {deadline}); + return DtoMapping.assign(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 923a5b4b04..7f213f989d 100644 --- a/src/model/transaction/TransferTransaction.ts +++ b/src/model/transaction/TransferTransaction.ts @@ -44,6 +44,7 @@ import {Transaction} from './Transaction'; import {TransactionInfo} from './TransactionInfo'; import {TransactionType} from './TransactionType'; import {TransactionVersion} from './TransactionVersion'; +import { DtoMapping } from '../../core/utils/DtoMapping'; /** * Transfer transactions contain data about transfers of mosaics and message to another account. @@ -282,10 +283,9 @@ export class TransferTransaction extends Transaction { */ public resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): TransferTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, - {recipientAddress: statement.resolveAddress(this.recipientAddress, transactionInfo.height.toString(), - transactionInfo.index, aggregateTransactionIndex), - mosaics: this.mosaics.map((mosaic) => statement.resolveMosaic(mosaic, transactionInfo.height.toString(), - transactionInfo.index, aggregateTransactionIndex))}); + return DtoMapping.assign(this, {recipientAddress: statement.resolveAddress(this.recipientAddress, transactionInfo.height.toString(), + transactionInfo.index, aggregateTransactionIndex), + mosaics: this.mosaics.map((mosaic) => statement.resolveMosaic(mosaic, transactionInfo.height.toString(), + transactionInfo.index, aggregateTransactionIndex))}); } } diff --git a/test/infrastructure/RepositoryFactory.spec.ts b/test/infrastructure/RepositoryFactory.spec.ts index 6199559a27..3ee35f30b4 100644 --- a/test/infrastructure/RepositoryFactory.spec.ts +++ b/test/infrastructure/RepositoryFactory.spec.ts @@ -13,19 +13,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { expect } from "chai"; -import { RepositoryFactoryHttp } from "../../src/infrastructure/RepositoryFactoryHttp"; -import { BlockRepository } from "../../src/infrastructure/BlockRepository"; -import { instance, mock, when } from "ts-mockito"; -import { BlockInfo } from "../../src/model/blockchain/BlockInfo"; +import { expect } from 'chai'; import { of as observableOf } from 'rxjs'; -import { map } from "rxjs/operators"; -import { NetworkRepository } from "../../src/infrastructure/NetworkRepository"; -import { NetworkType } from "../../src/model/blockchain/NetworkType"; +import { map } from 'rxjs/operators'; +import { instance, mock, when } from 'ts-mockito'; +import { BlockRepository } from '../../src/infrastructure/BlockRepository'; +import { NetworkRepository } from '../../src/infrastructure/NetworkRepository'; +import { RepositoryFactoryHttp } from '../../src/infrastructure/RepositoryFactoryHttp'; +import { BlockInfo } from '../../src/model/blockchain/BlockInfo'; +import { NetworkType } from '../../src/model/blockchain/NetworkType'; describe('RepositoryFactory', () => { it('Should create repositories', () => { - const repositoryFactory = new RepositoryFactoryHttp("http://localhost:3000"); + const repositoryFactory = new RepositoryFactoryHttp('http://localhost:3000'); expect(repositoryFactory.createBlockRepository()).to.be.not.null; expect(repositoryFactory.createNetworkRepository()).to.be.not.null; @@ -50,7 +50,7 @@ describe('RepositoryFactory', () => { const repositoryMock: BlockRepository = mock(); - const observableOfBlockInfo = observableOf({generationHash: 'aaaa'} as BlockInfo).pipe(map(v => { + const observableOfBlockInfo = observableOf({generationHash: 'aaaa'} as BlockInfo).pipe(map((v) => { counter++; return v; })); @@ -63,10 +63,10 @@ describe('RepositoryFactory', () => { createBlockRepository(): BlockRepository { return instance(repositoryMock); } - })("http://localhost:3000"); + })('http://localhost:3000'); expect(counter).to.be.equals(0); - repositoryFactory.getGenerationHash().subscribe(gh => { + repositoryFactory.getGenerationHash().subscribe((gh) => { expect(counter).to.be.equals(1); expect(gh).to.be.equals('aaaa'); repositoryFactory.getGenerationHash().subscribe(gh => { @@ -76,9 +76,9 @@ describe('RepositoryFactory', () => { expect(counter).to.be.equals(1); expect(gh).to.be.equals('aaaa'); done(); - }) - }) - }) + }); + }); + }); }); @@ -88,8 +88,8 @@ describe('RepositoryFactory', () => { const repositoryMock: NetworkRepository = mock(); - let expectedNetworkType = NetworkType.MIJIN_TEST; - const observableOfBlockInfo = observableOf(expectedNetworkType).pipe(map(v => { + const expectedNetworkType = NetworkType.MIJIN_TEST; + const observableOfBlockInfo = observableOf(expectedNetworkType).pipe(map((v) => { counter++; return v; })); @@ -98,22 +98,21 @@ describe('RepositoryFactory', () => { expect(observableOfBlockInfo).to.be.equals(observableOfBlockInfo); const repositoryFactory = new (class RepositoryFactoryHttpForTest extends RepositoryFactoryHttp { - createNetworkRepository(): NetworkRepository { return instance(repositoryMock); } - })("http://localhost:3000"); + })('http://localhost:3000'); expect(counter).to.be.equals(0); - repositoryFactory.getNetworkType().subscribe(networkType => { + repositoryFactory.getNetworkType().subscribe((networkType) => { expect(counter).to.be.equals(1); expect(networkType).to.be.equals(expectedNetworkType); repositoryFactory.getNetworkType().subscribe(networkType => { expect(counter).to.be.equals(1); expect(networkType).to.be.equals(expectedNetworkType); done(); - }) - }) + }); + }); }); @@ -123,8 +122,8 @@ describe('RepositoryFactory', () => { const repositoryMock: NetworkRepository = mock(); - let expectedNetworkType = NetworkType.MIJIN_TEST; - const observableOfBlockInfo = observableOf(expectedNetworkType).pipe(map(v => { + const expectedNetworkType = NetworkType.MIJIN_TEST; + const observableOfBlockInfo = observableOf(expectedNetworkType).pipe(map((v) => { counter++; return v; })); @@ -137,18 +136,18 @@ describe('RepositoryFactory', () => { createNetworkRepository(): NetworkRepository { return instance(repositoryMock); } - })("http://localhost:3000", expectedNetworkType); + })('http://localhost:3000', expectedNetworkType); expect(counter).to.be.equals(0); - repositoryFactory.getNetworkType().subscribe(networkType => { + repositoryFactory.getNetworkType().subscribe((networkType) => { expect(counter).to.be.equals(0); expect(networkType).to.be.equals(expectedNetworkType); repositoryFactory.getNetworkType().subscribe(networkType => { expect(counter).to.be.equals(0); expect(networkType).to.be.equals(expectedNetworkType); done(); - }) - }) + }); + }); }); From 4c656b22469035b68f94b1253b11f8fa77e9d767 Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Wed, 18 Dec 2019 11:56:34 +0000 Subject: [PATCH 08/18] Fixed #390 Spread operator does not assign super class methods --- .../transaction/AccountAddressRestrictionTransaction.ts | 4 ++-- .../transaction/AccountMosaicRestrictionTransaction.ts | 4 ++-- src/model/transaction/LockFundsTransaction.ts | 4 ++-- .../transaction/MosaicAddressRestrictionTransaction.ts | 4 ++-- .../transaction/MosaicGlobalRestrictionTransaction.ts | 4 ++-- src/model/transaction/MosaicMetadataTransaction.ts | 4 ++-- src/model/transaction/MosaicSupplyChangeTransaction.ts | 4 ++-- src/model/transaction/SecretLockTransaction.ts | 4 ++-- src/model/transaction/SecretProofTransaction.ts | 4 ++-- src/model/transaction/Transaction.ts | 2 +- src/model/transaction/TransferTransaction.ts | 7 ++++--- test/model/transaction/AccountLinkTransaction.spec.ts | 3 +++ test/model/transaction/AccountMetadataTransaction.spec.ts | 3 +++ test/model/transaction/AggregateTransaction.spec.ts | 6 ++++++ test/model/transaction/LockFundsTransaction.spec.ts | 6 ++++++ .../MosaicAddressRestrictionTransaction.spec.ts | 6 ++++++ test/model/transaction/MosaicAliasTransaction.spec.ts | 3 +++ test/model/transaction/MosaicDefinitionTransaction.spec.ts | 3 +++ .../transaction/MosaicGlobalRestrictionTransaction.spec.ts | 6 ++++++ test/model/transaction/MosaicMetadataTransaction.spec.ts | 6 ++++++ .../transaction/MosaicSupplyChangeTransaction.spec.ts | 5 +++++ .../MultisigAccountModificationTransaction.spec.ts | 3 +++ .../model/transaction/NamespaceMetadataTransaction.spec.ts | 3 +++ .../transaction/NamespaceRegistrationTransaction.spec.ts | 3 +++ test/model/transaction/SecretLockTransaction.spec.ts | 5 +++++ test/model/transaction/SecretProofTransaction.spec.ts | 5 +++++ test/model/transaction/TransferTransaction.spec.ts | 6 ++++++ 27 files changed, 95 insertions(+), 22 deletions(-) diff --git a/src/model/transaction/AccountAddressRestrictionTransaction.ts b/src/model/transaction/AccountAddressRestrictionTransaction.ts index 66f2b2fafd..5aff4bee0e 100644 --- a/src/model/transaction/AccountAddressRestrictionTransaction.ts +++ b/src/model/transaction/AccountAddressRestrictionTransaction.ts @@ -199,13 +199,13 @@ export class AccountAddressRestrictionTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): AccountAddressRestrictionTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return {...Object.getPrototypeOf(this), + return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { restrictionAdditions: this.restrictionAdditions.map((addition) => statement.resolveAddress(addition, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)), restrictionDeletions: this.restrictionDeletions.map((deletion) => statement.resolveAddress(deletion, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)), - }; + }); } } diff --git a/src/model/transaction/AccountMosaicRestrictionTransaction.ts b/src/model/transaction/AccountMosaicRestrictionTransaction.ts index c739b574b8..b6428e83c7 100644 --- a/src/model/transaction/AccountMosaicRestrictionTransaction.ts +++ b/src/model/transaction/AccountMosaicRestrictionTransaction.ts @@ -199,13 +199,13 @@ export class AccountMosaicRestrictionTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): AccountMosaicRestrictionTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return {...Object.getPrototypeOf(this), + return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { restrictionAdditions: this.restrictionAdditions.map((addition) => statement.resolveMosaicId(addition, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)), restrictionDeletions: this.restrictionDeletions.map((deletion) => statement.resolveMosaicId(deletion, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)), - }; + }); } } diff --git a/src/model/transaction/LockFundsTransaction.ts b/src/model/transaction/LockFundsTransaction.ts index 4d31fa9d3b..300c871d11 100644 --- a/src/model/transaction/LockFundsTransaction.ts +++ b/src/model/transaction/LockFundsTransaction.ts @@ -211,8 +211,8 @@ export class LockFundsTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): LockFundsTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return {...Object.getPrototypeOf(this), + return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { mosaic: statement.resolveMosaic(this.mosaic, transactionInfo.height.toString(), - transactionInfo.index, aggregateTransactionIndex)}; + transactionInfo.index, aggregateTransactionIndex)}); } } diff --git a/src/model/transaction/MosaicAddressRestrictionTransaction.ts b/src/model/transaction/MosaicAddressRestrictionTransaction.ts index 7323856186..44b9ce1682 100644 --- a/src/model/transaction/MosaicAddressRestrictionTransaction.ts +++ b/src/model/transaction/MosaicAddressRestrictionTransaction.ts @@ -243,10 +243,10 @@ export class MosaicAddressRestrictionTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): MosaicAddressRestrictionTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return {...Object.getPrototypeOf(this), + return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { mosaicId: statement.resolveMosaicId(this.mosaicId, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex), targetAddress: statement.resolveAddress(this.targetAddress, - transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)}; + transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)}); } } diff --git a/src/model/transaction/MosaicGlobalRestrictionTransaction.ts b/src/model/transaction/MosaicGlobalRestrictionTransaction.ts index 35ff2de88e..a172d6da29 100644 --- a/src/model/transaction/MosaicGlobalRestrictionTransaction.ts +++ b/src/model/transaction/MosaicGlobalRestrictionTransaction.ts @@ -253,10 +253,10 @@ export class MosaicGlobalRestrictionTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): MosaicGlobalRestrictionTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return {...Object.getPrototypeOf(this), + return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { mosaicId: statement.resolveMosaicId(this.mosaicId, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex), referenceMosaicId: statement.resolveMosaicId(this.referenceMosaicId, transactionInfo.height.toString(), - transactionInfo.index, aggregateTransactionIndex)}; + transactionInfo.index, aggregateTransactionIndex)}); } } diff --git a/src/model/transaction/MosaicMetadataTransaction.ts b/src/model/transaction/MosaicMetadataTransaction.ts index ce5b5135cf..b161f8766d 100644 --- a/src/model/transaction/MosaicMetadataTransaction.ts +++ b/src/model/transaction/MosaicMetadataTransaction.ts @@ -219,8 +219,8 @@ export class MosaicMetadataTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): MosaicMetadataTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return {...Object.getPrototypeOf(this), + return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { targetMosaicId: statement.resolveMosaicId(this.targetMosaicId, transactionInfo.height.toString(), - transactionInfo.index, aggregateTransactionIndex)}; + transactionInfo.index, aggregateTransactionIndex)}); } } diff --git a/src/model/transaction/MosaicSupplyChangeTransaction.ts b/src/model/transaction/MosaicSupplyChangeTransaction.ts index 3e6b2685cb..69eae71d37 100644 --- a/src/model/transaction/MosaicSupplyChangeTransaction.ts +++ b/src/model/transaction/MosaicSupplyChangeTransaction.ts @@ -193,8 +193,8 @@ export class MosaicSupplyChangeTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): MosaicSupplyChangeTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return {...Object.getPrototypeOf(this), + return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { mosaicId: statement.resolveMosaicId(this.mosaicId, transactionInfo.height.toString(), - transactionInfo.index, aggregateTransactionIndex)}; + transactionInfo.index, aggregateTransactionIndex)}); } } diff --git a/src/model/transaction/SecretLockTransaction.ts b/src/model/transaction/SecretLockTransaction.ts index 3606ede7e7..6dc523b95e 100644 --- a/src/model/transaction/SecretLockTransaction.ts +++ b/src/model/transaction/SecretLockTransaction.ts @@ -240,10 +240,10 @@ export class SecretLockTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): SecretLockTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return {...Object.getPrototypeOf(this), + return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { recipientAddress: statement.resolveAddress(this.recipientAddress, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex), mosaic: statement.resolveMosaic(this.mosaic, transactionInfo.height.toString(), - transactionInfo.index, aggregateTransactionIndex)}; + transactionInfo.index, aggregateTransactionIndex)}); } } diff --git a/src/model/transaction/SecretProofTransaction.ts b/src/model/transaction/SecretProofTransaction.ts index db890c7ca4..b0fd539718 100644 --- a/src/model/transaction/SecretProofTransaction.ts +++ b/src/model/transaction/SecretProofTransaction.ts @@ -217,8 +217,8 @@ export class SecretProofTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): SecretProofTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return {...Object.getPrototypeOf(this), + return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { recipientAddress: statement.resolveAddress(this.recipientAddress, - transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)}; + transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)}); } } diff --git a/src/model/transaction/Transaction.ts b/src/model/transaction/Transaction.ts index f42edc8415..8e7010c4d1 100644 --- a/src/model/transaction/Transaction.ts +++ b/src/model/transaction/Transaction.ts @@ -200,7 +200,7 @@ export abstract class Transaction { * @returns {TransferTransaction} */ public setMaxFee(feeMultiplier: number): Transaction { - return {...Object.getPrototypeOf(this), maxFee: UInt64.fromUint(this.size * feeMultiplier)}; + return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, {maxFee: UInt64.fromUint(this.size * feeMultiplier)}); } /** diff --git a/src/model/transaction/TransferTransaction.ts b/src/model/transaction/TransferTransaction.ts index d858927b9e..923a5b4b04 100644 --- a/src/model/transaction/TransferTransaction.ts +++ b/src/model/transaction/TransferTransaction.ts @@ -282,9 +282,10 @@ export class TransferTransaction extends Transaction { */ public resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): TransferTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return {...Object.getPrototypeOf(this), recipientAddress: statement.resolveAddress(this.recipientAddress, - transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex), + return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, + {recipientAddress: statement.resolveAddress(this.recipientAddress, transactionInfo.height.toString(), + transactionInfo.index, aggregateTransactionIndex), mosaics: this.mosaics.map((mosaic) => statement.resolveMosaic(mosaic, transactionInfo.height.toString(), - transactionInfo.index, aggregateTransactionIndex))}; + transactionInfo.index, aggregateTransactionIndex))}); } } diff --git a/test/model/transaction/AccountLinkTransaction.spec.ts b/test/model/transaction/AccountLinkTransaction.spec.ts index aed6cb72c6..f197c25f37 100644 --- a/test/model/transaction/AccountLinkTransaction.spec.ts +++ b/test/model/transaction/AccountLinkTransaction.spec.ts @@ -116,5 +116,8 @@ describe('AccountLinkTransaction', () => { ).setMaxFee(2); ​ expect(accountLinkTransaction.maxFee.compact()).to.be.equal(322); + + const signedTransaction = accountLinkTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/AccountMetadataTransaction.spec.ts b/test/model/transaction/AccountMetadataTransaction.spec.ts index ecf15db7be..0ceecdffff 100644 --- a/test/model/transaction/AccountMetadataTransaction.spec.ts +++ b/test/model/transaction/AccountMetadataTransaction.spec.ts @@ -103,6 +103,9 @@ describe('AccountMetadataTransaction', () => { expect(Convert.hexToUint8(accountMetadataTransaction.serialize()).length).to.be.equal(accountMetadataTransaction.size); expect(accountMetadataTransaction.size).to.be.equal(182); + + const signedTransaction = accountMetadataTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); }); diff --git a/test/model/transaction/AggregateTransaction.spec.ts b/test/model/transaction/AggregateTransaction.spec.ts index 5ae0e31825..d7eb524dec 100644 --- a/test/model/transaction/AggregateTransaction.spec.ts +++ b/test/model/transaction/AggregateTransaction.spec.ts @@ -582,6 +582,9 @@ describe('AggregateTransaction', () => { ).setMaxFee(2); ​ expect(aggregateTransaction.maxFee.compact()).to.be.equal(560); + + const signedTransaction = aggregateTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); it('Test resolveAlias can resolve', () => { @@ -614,5 +617,8 @@ describe('AggregateTransaction', () => { expect(innerTransaction.mosaics[0].id instanceof MosaicId).to.be.true; expect((innerTransaction.recipientAddress as Address).equals(account.address)).to.be.true; expect((innerTransaction.mosaics[0].id as MosaicId).equals(resolvedMosaicId)).to.be.true; + + const signedTransaction = aggregateTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/LockFundsTransaction.spec.ts b/test/model/transaction/LockFundsTransaction.spec.ts index ddcf970822..b5016e198d 100644 --- a/test/model/transaction/LockFundsTransaction.spec.ts +++ b/test/model/transaction/LockFundsTransaction.spec.ts @@ -181,6 +181,9 @@ describe('LockFundsTransaction', () => { ).setMaxFee(2); ​ expect(lockFundsTransaction.maxFee.compact()).to.be.equal(368); + + const signedTransactionTest = lockFundsTransaction.signWith(account, generationHash); + expect(signedTransactionTest.hash).not.to.be.undefined; }); it('Test resolveAlias can resolve', () => { @@ -205,5 +208,8 @@ describe('LockFundsTransaction', () => { ​ expect(transaction.mosaic.id instanceof MosaicId).to.be.true; expect((transaction.mosaic.id as MosaicId).equals(resolvedMosaicId)).to.be.true; + + const signedTransactionTest = transaction.signWith(account, generationHash); + expect(signedTransactionTest.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/MosaicAddressRestrictionTransaction.spec.ts b/test/model/transaction/MosaicAddressRestrictionTransaction.spec.ts index 3783e40f9e..53bbbe7a96 100644 --- a/test/model/transaction/MosaicAddressRestrictionTransaction.spec.ts +++ b/test/model/transaction/MosaicAddressRestrictionTransaction.spec.ts @@ -164,6 +164,9 @@ describe('MosaicAddressRestrictionTransaction', () => { ).setMaxFee(2); ​ expect(transaction.maxFee.compact()).to.be.equal(370); + + const signedTransaction = transaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); it('Test resolveAlias can resolve', () => { @@ -185,5 +188,8 @@ describe('MosaicAddressRestrictionTransaction', () => { expect(transaction.mosaicId instanceof MosaicId).to.be.true; expect((transaction.targetAddress as Address).equals(account.address)).to.be.true; expect((transaction.mosaicId as MosaicId).equals(resolvedMosaicId)).to.be.true; + + const signedTransaction = transaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/MosaicAliasTransaction.spec.ts b/test/model/transaction/MosaicAliasTransaction.spec.ts index a9c9f698a3..3e9f775b44 100644 --- a/test/model/transaction/MosaicAliasTransaction.spec.ts +++ b/test/model/transaction/MosaicAliasTransaction.spec.ts @@ -118,5 +118,8 @@ describe('MosaicAliasTransaction', () => { ).setMaxFee(2); ​ expect(mosaicAliasTransaction.maxFee.compact()).to.be.equal(290); + + const signedTransaction = mosaicAliasTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/MosaicDefinitionTransaction.spec.ts b/test/model/transaction/MosaicDefinitionTransaction.spec.ts index 0de595a09a..9be5cb72b5 100644 --- a/test/model/transaction/MosaicDefinitionTransaction.spec.ts +++ b/test/model/transaction/MosaicDefinitionTransaction.spec.ts @@ -172,5 +172,8 @@ describe('MosaicDefinitionTransaction', () => { ).setMaxFee(2); ​ expect(mosaicDefinitionTransaction.maxFee.compact()).to.be.equal(300); + + const signedTransaction = mosaicDefinitionTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/MosaicGlobalRestrictionTransaction.spec.ts b/test/model/transaction/MosaicGlobalRestrictionTransaction.spec.ts index a4b387dcd5..846f631733 100644 --- a/test/model/transaction/MosaicGlobalRestrictionTransaction.spec.ts +++ b/test/model/transaction/MosaicGlobalRestrictionTransaction.spec.ts @@ -162,6 +162,9 @@ describe('MosaicGlobalRestrictionTransaction', () => { ).setMaxFee(2); ​ expect(mosaicGlobalRestrictionTransaction.maxFee.compact()).to.be.equal(340); + + const signedTransaction = mosaicGlobalRestrictionTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); it('Test resolveAlias can resolve', () => { @@ -185,5 +188,8 @@ describe('MosaicGlobalRestrictionTransaction', () => { expect((mosaicGlobalRestrictionTransaction.mosaicId as MosaicId).equals(resolvedMosaicId)).to.be.true; expect(mosaicGlobalRestrictionTransaction.referenceMosaicId instanceof MosaicId).to.be.true; expect((mosaicGlobalRestrictionTransaction.referenceMosaicId as MosaicId).equals(resolvedMosaicId)).to.be.true; + + const signedTransaction = mosaicGlobalRestrictionTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/MosaicMetadataTransaction.spec.ts b/test/model/transaction/MosaicMetadataTransaction.spec.ts index bea46583b2..c55ad3efed 100644 --- a/test/model/transaction/MosaicMetadataTransaction.spec.ts +++ b/test/model/transaction/MosaicMetadataTransaction.spec.ts @@ -161,6 +161,9 @@ describe('MosaicMetadataTransaction', () => { ).setMaxFee(2); ​ expect(mosaicMetadataTransaction.maxFee.compact()).to.be.equal(380); + + const signedTransaction = mosaicMetadataTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); it('Test resolveAlias can resolve', () => { @@ -180,5 +183,8 @@ describe('MosaicMetadataTransaction', () => { ​ expect(mosaicMetadataTransaction.targetMosaicId instanceof MosaicId).to.be.true; expect((mosaicMetadataTransaction.targetMosaicId as MosaicId).equals(resolvedMosaicId)).to.be.true; + + const signedTransaction = mosaicMetadataTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/MosaicSupplyChangeTransaction.spec.ts b/test/model/transaction/MosaicSupplyChangeTransaction.spec.ts index 805a1f592c..77f2fdaa90 100644 --- a/test/model/transaction/MosaicSupplyChangeTransaction.spec.ts +++ b/test/model/transaction/MosaicSupplyChangeTransaction.spec.ts @@ -127,6 +127,8 @@ describe('MosaicSupplyChangeTransaction', () => { ).setMaxFee(2); ​ expect(mosaicSupplyChangeTransaction.maxFee.compact()).to.be.equal(290); + const signedTransaction = mosaicSupplyChangeTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); it('Test resolveAlias can resolve', () => { @@ -144,5 +146,8 @@ describe('MosaicSupplyChangeTransaction', () => { ​ expect(mosaicSupplyChangeTransaction.mosaicId instanceof MosaicId).to.be.true; expect((mosaicSupplyChangeTransaction.mosaicId as MosaicId).equals(resolvedMosaicId)).to.be.true; + + const signedTransaction = mosaicSupplyChangeTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/MultisigAccountModificationTransaction.spec.ts b/test/model/transaction/MultisigAccountModificationTransaction.spec.ts index 1b1f4e3707..ff5a2ae193 100644 --- a/test/model/transaction/MultisigAccountModificationTransaction.spec.ts +++ b/test/model/transaction/MultisigAccountModificationTransaction.spec.ts @@ -134,5 +134,8 @@ describe('MultisigAccountModificationTransaction', () => { ).setMaxFee(2); ​ expect(modifyMultisigAccountTransaction.maxFee.compact()).to.be.equal(336); + + const signedTransaction = modifyMultisigAccountTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/NamespaceMetadataTransaction.spec.ts b/test/model/transaction/NamespaceMetadataTransaction.spec.ts index cd881f49b3..27688408c5 100644 --- a/test/model/transaction/NamespaceMetadataTransaction.spec.ts +++ b/test/model/transaction/NamespaceMetadataTransaction.spec.ts @@ -124,5 +124,8 @@ describe('NamespaceMetadataTransaction', () => { ).setMaxFee(2); ​ expect(namespaceMetadataTransaction.maxFee.compact()).to.be.equal(380); + + const signedTransaction = namespaceMetadataTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/NamespaceRegistrationTransaction.spec.ts b/test/model/transaction/NamespaceRegistrationTransaction.spec.ts index c24ebfe45b..921a3bd457 100644 --- a/test/model/transaction/NamespaceRegistrationTransaction.spec.ts +++ b/test/model/transaction/NamespaceRegistrationTransaction.spec.ts @@ -131,5 +131,8 @@ describe('NamespaceRegistrationTransaction', () => { ).setMaxFee(2); ​ expect(registerNamespaceTransaction.maxFee.compact()).to.be.equal(330); + + const signedTransaction = registerNamespaceTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/SecretLockTransaction.spec.ts b/test/model/transaction/SecretLockTransaction.spec.ts index 9cb2c2c33c..612b1ef7b8 100644 --- a/test/model/transaction/SecretLockTransaction.spec.ts +++ b/test/model/transaction/SecretLockTransaction.spec.ts @@ -300,6 +300,8 @@ describe('SecretLockTransaction', () => { ).setMaxFee(2); ​ expect(secretLockTransaction.maxFee.compact()).to.be.equal(420); + const signedTransaction = secretLockTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); it('Test resolveAlias can resolve', () => { @@ -322,5 +324,8 @@ describe('SecretLockTransaction', () => { expect(secretLockTransaction.mosaic.id instanceof MosaicId).to.be.true; expect((secretLockTransaction.recipientAddress as Address).equals(account.address)).to.be.true; expect((secretLockTransaction.mosaic.id as MosaicId).equals(mosaicId)).to.be.true; + + const signedTransaction = secretLockTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/SecretProofTransaction.spec.ts b/test/model/transaction/SecretProofTransaction.spec.ts index 7092f966e7..f6c2eece9e 100644 --- a/test/model/transaction/SecretProofTransaction.spec.ts +++ b/test/model/transaction/SecretProofTransaction.spec.ts @@ -257,6 +257,8 @@ describe('SecretProofTransaction', () => { ).setMaxFee(2); ​ expect(secretProofTransaction.maxFee.compact()).to.be.equal(440); + const signedTransaction = secretProofTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); it('Test resolveAlias can resolve', () => { @@ -276,5 +278,8 @@ describe('SecretProofTransaction', () => { ​ expect(transferTransaction.recipientAddress instanceof Address).to.be.true; expect((transferTransaction.recipientAddress as Address).equals(account.address)).to.be.true; + + const signedTransaction = transferTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); diff --git a/test/model/transaction/TransferTransaction.spec.ts b/test/model/transaction/TransferTransaction.spec.ts index 6626d55eaf..83e3d09d9b 100644 --- a/test/model/transaction/TransferTransaction.spec.ts +++ b/test/model/transaction/TransferTransaction.spec.ts @@ -407,6 +407,9 @@ describe('TransferTransaction', () => { ).setMaxFee(2); ​ expect(transferTransaction.maxFee.compact()).to.be.equal(378); + + const signedTransaction = transferTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); it('Test resolveAlias can resolve', () => { @@ -426,5 +429,8 @@ describe('TransferTransaction', () => { expect(transferTransaction.mosaics[0].id instanceof MosaicId).to.be.true; expect((transferTransaction.recipientAddress as Address).equals(account.address)).to.be.true; expect((transferTransaction.mosaics[0].id as MosaicId).equals(mosaicId)).to.be.true; + + const signedTransaction = transferTransaction.signWith(account, generationHash); + expect(signedTransaction.hash).not.to.be.undefined; }); }); From a21ba912d3a871d4712540082bb4b1c134eba29a Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Sun, 22 Dec 2019 15:17:27 +0000 Subject: [PATCH 09/18] Moved object assgin to a static method in MappingDto --- src/core/utils/DtoMapping.ts | 11 ++++ .../AccountAddressRestrictionTransaction.ts | 17 +++--- .../AccountMosaicRestrictionTransaction.ts | 3 +- src/model/transaction/AggregateTransaction.ts | 9 +-- src/model/transaction/LockFundsTransaction.ts | 3 +- .../MosaicAddressRestrictionTransaction.ts | 3 +- .../MosaicGlobalRestrictionTransaction.ts | 3 +- .../transaction/MosaicMetadataTransaction.ts | 3 +- .../MosaicSupplyChangeTransaction.ts | 3 +- .../transaction/SecretLockTransaction.ts | 3 +- .../transaction/SecretProofTransaction.ts | 3 +- src/model/transaction/Transaction.ts | 7 ++- src/model/transaction/TransferTransaction.ts | 10 ++-- test/infrastructure/RepositoryFactory.spec.ts | 55 +++++++++---------- 14 files changed, 77 insertions(+), 56 deletions(-) diff --git a/src/core/utils/DtoMapping.ts b/src/core/utils/DtoMapping.ts index 576cd49d63..6c62abc026 100644 --- a/src/core/utils/DtoMapping.ts +++ b/src/core/utils/DtoMapping.ts @@ -54,4 +54,15 @@ export class DtoMapping { } }))); } + + /** + * Creates a copy of the first object adding the attributes of the second object. + * @param object the object to be cloned + * @param attributes the extra attributes to be added to the object. + * @returns a copy of the first object with the new attributes added. + */ + public static assign(object: T, attributes: any): T { + return Object.assign({__proto__: Object.getPrototypeOf(object)}, object, attributes); + } + } diff --git a/src/model/transaction/AccountAddressRestrictionTransaction.ts b/src/model/transaction/AccountAddressRestrictionTransaction.ts index 5aff4bee0e..d730adc931 100644 --- a/src/model/transaction/AccountAddressRestrictionTransaction.ts +++ b/src/model/transaction/AccountAddressRestrictionTransaction.ts @@ -15,6 +15,7 @@ */ import { Convert } from '../../core/format'; +import { DtoMapping } from '../../core/utils/DtoMapping'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AccountAddressRestrictionTransactionBuilder } from '../../infrastructure/catbuffer/AccountAddressRestrictionTransactionBuilder'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; @@ -199,13 +200,13 @@ export class AccountAddressRestrictionTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): AccountAddressRestrictionTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { - restrictionAdditions: - this.restrictionAdditions.map((addition) => statement.resolveAddress(addition, transactionInfo.height.toString(), - transactionInfo.index, aggregateTransactionIndex)), - restrictionDeletions: - this.restrictionDeletions.map((deletion) => statement.resolveAddress(deletion, transactionInfo.height.toString(), - transactionInfo.index, aggregateTransactionIndex)), - }); + return DtoMapping.assign(this, { + restrictionAdditions: + this.restrictionAdditions.map((addition) => statement.resolveAddress(addition, transactionInfo.height.toString(), + transactionInfo.index, aggregateTransactionIndex)), + restrictionDeletions: + this.restrictionDeletions.map((deletion) => statement.resolveAddress(deletion, transactionInfo.height.toString(), + transactionInfo.index, aggregateTransactionIndex)), + }); } } diff --git a/src/model/transaction/AccountMosaicRestrictionTransaction.ts b/src/model/transaction/AccountMosaicRestrictionTransaction.ts index b6428e83c7..4037d9e687 100644 --- a/src/model/transaction/AccountMosaicRestrictionTransaction.ts +++ b/src/model/transaction/AccountMosaicRestrictionTransaction.ts @@ -15,6 +15,7 @@ */ import { Convert } from '../../core/format'; +import { DtoMapping } from '../../core/utils/DtoMapping'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AccountMosaicRestrictionTransactionBuilder } from '../../infrastructure/catbuffer/AccountMosaicRestrictionTransactionBuilder'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; @@ -199,7 +200,7 @@ export class AccountMosaicRestrictionTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): AccountMosaicRestrictionTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { + return DtoMapping.assign(this, { restrictionAdditions: this.restrictionAdditions.map((addition) => statement.resolveMosaicId(addition, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)), diff --git a/src/model/transaction/AggregateTransaction.ts b/src/model/transaction/AggregateTransaction.ts index a92792e4b5..cfefb0a4e9 100644 --- a/src/model/transaction/AggregateTransaction.ts +++ b/src/model/transaction/AggregateTransaction.ts @@ -16,6 +16,7 @@ import {KeyPair, MerkleHashBuilder, SHA3Hasher, SignSchema} from '../../core/crypto'; import {Convert} from '../../core/format'; +import { DtoMapping } from '../../core/utils/DtoMapping'; import {AggregateBondedTransactionBuilder} from '../../infrastructure/catbuffer/AggregateBondedTransactionBuilder'; import {AggregateCompleteTransactionBuilder} from '../../infrastructure/catbuffer/AggregateCompleteTransactionBuilder'; import {AmountDto} from '../../infrastructure/catbuffer/AmountDto'; @@ -193,7 +194,7 @@ export class AggregateTransaction extends Transaction { */ public addTransactions(transactions: InnerTransaction[]): AggregateTransaction { const innerTransactions = this.innerTransactions.concat(transactions); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, {innerTransactions}); + return DtoMapping.assign(this, {innerTransactions}); } /** @@ -204,7 +205,7 @@ export class AggregateTransaction extends Transaction { */ public addCosignatures(cosigs: AggregateTransactionCosignature[]): AggregateTransaction { const cosignatures = this.cosignatures.concat(cosigs); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, {cosignatures}); + return DtoMapping.assign(this, {cosignatures}); } /** @@ -407,8 +408,8 @@ export class AggregateTransaction extends Transaction { */ resolveAliases(statement: Statement): AggregateTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, - {innerTransactions: this.innerTransactions.map((tx) => tx.resolveAliases(statement, transactionInfo.index)) + return DtoMapping.assign(this, + {innerTransactions: this.innerTransactions.map((tx) => tx.resolveAliases(statement, transactionInfo.index)) .sort((a, b) => a.transactionInfo!.index - b.transactionInfo!.index)}); } } diff --git a/src/model/transaction/LockFundsTransaction.ts b/src/model/transaction/LockFundsTransaction.ts index 300c871d11..9b6fc2bb35 100644 --- a/src/model/transaction/LockFundsTransaction.ts +++ b/src/model/transaction/LockFundsTransaction.ts @@ -15,6 +15,7 @@ */ import { Convert } from '../../core/format'; +import { DtoMapping } from '../../core/utils/DtoMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { BlockDurationDto } from '../../infrastructure/catbuffer/BlockDurationDto'; import { EmbeddedHashLockTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedHashLockTransactionBuilder'; @@ -211,7 +212,7 @@ export class LockFundsTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): LockFundsTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { + return DtoMapping.assign(this, { mosaic: statement.resolveMosaic(this.mosaic, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)}); } diff --git a/src/model/transaction/MosaicAddressRestrictionTransaction.ts b/src/model/transaction/MosaicAddressRestrictionTransaction.ts index 44b9ce1682..fa16011421 100644 --- a/src/model/transaction/MosaicAddressRestrictionTransaction.ts +++ b/src/model/transaction/MosaicAddressRestrictionTransaction.ts @@ -15,6 +15,7 @@ */ import { Convert } from '../../core/format'; +import { DtoMapping } from '../../core/utils/DtoMapping'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { @@ -243,7 +244,7 @@ export class MosaicAddressRestrictionTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): MosaicAddressRestrictionTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { + return DtoMapping.assign(this, { mosaicId: statement.resolveMosaicId(this.mosaicId, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex), targetAddress: statement.resolveAddress(this.targetAddress, diff --git a/src/model/transaction/MosaicGlobalRestrictionTransaction.ts b/src/model/transaction/MosaicGlobalRestrictionTransaction.ts index a172d6da29..e1d654f2d1 100644 --- a/src/model/transaction/MosaicGlobalRestrictionTransaction.ts +++ b/src/model/transaction/MosaicGlobalRestrictionTransaction.ts @@ -15,6 +15,7 @@ */ import { Convert } from '../../core/format'; +import { DtoMapping } from '../../core/utils/DtoMapping'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { @@ -253,7 +254,7 @@ export class MosaicGlobalRestrictionTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): MosaicGlobalRestrictionTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { + return DtoMapping.assign(this, { mosaicId: statement.resolveMosaicId(this.mosaicId, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex), referenceMosaicId: statement.resolveMosaicId(this.referenceMosaicId, transactionInfo.height.toString(), diff --git a/src/model/transaction/MosaicMetadataTransaction.ts b/src/model/transaction/MosaicMetadataTransaction.ts index b161f8766d..345db15e51 100644 --- a/src/model/transaction/MosaicMetadataTransaction.ts +++ b/src/model/transaction/MosaicMetadataTransaction.ts @@ -15,6 +15,7 @@ */ import { Convert } from '../../core/format'; +import { DtoMapping } from '../../core/utils/DtoMapping'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMosaicMetadataTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedMosaicMetadataTransactionBuilder'; @@ -219,7 +220,7 @@ export class MosaicMetadataTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): MosaicMetadataTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { + return DtoMapping.assign(this, { targetMosaicId: statement.resolveMosaicId(this.targetMosaicId, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)}); } diff --git a/src/model/transaction/MosaicSupplyChangeTransaction.ts b/src/model/transaction/MosaicSupplyChangeTransaction.ts index 69eae71d37..6ef580240f 100644 --- a/src/model/transaction/MosaicSupplyChangeTransaction.ts +++ b/src/model/transaction/MosaicSupplyChangeTransaction.ts @@ -15,6 +15,7 @@ */ import { Convert } from '../../core/format'; +import { DtoMapping } from '../../core/utils/DtoMapping'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMosaicSupplyChangeTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedMosaicSupplyChangeTransactionBuilder'; @@ -193,7 +194,7 @@ export class MosaicSupplyChangeTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): MosaicSupplyChangeTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { + return DtoMapping.assign(this, { mosaicId: statement.resolveMosaicId(this.mosaicId, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)}); } diff --git a/src/model/transaction/SecretLockTransaction.ts b/src/model/transaction/SecretLockTransaction.ts index 6dc523b95e..3b10e31c5c 100644 --- a/src/model/transaction/SecretLockTransaction.ts +++ b/src/model/transaction/SecretLockTransaction.ts @@ -14,6 +14,7 @@ * limitations under the License. */ import { Convert, Convert as convert } from '../../core/format'; +import { DtoMapping } from '../../core/utils/DtoMapping'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { BlockDurationDto } from '../../infrastructure/catbuffer/BlockDurationDto'; @@ -240,7 +241,7 @@ export class SecretLockTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): SecretLockTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { + return DtoMapping.assign(this, { recipientAddress: statement.resolveAddress(this.recipientAddress, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex), mosaic: statement.resolveMosaic(this.mosaic, transactionInfo.height.toString(), diff --git a/src/model/transaction/SecretProofTransaction.ts b/src/model/transaction/SecretProofTransaction.ts index b0fd539718..8e1855c841 100644 --- a/src/model/transaction/SecretProofTransaction.ts +++ b/src/model/transaction/SecretProofTransaction.ts @@ -15,6 +15,7 @@ */ import { Convert, Convert as convert } from '../../core/format'; +import { DtoMapping } from '../../core/utils/DtoMapping'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedSecretProofTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedSecretProofTransactionBuilder'; @@ -217,7 +218,7 @@ export class SecretProofTransaction extends Transaction { */ resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): SecretProofTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, { + return DtoMapping.assign(this, { recipientAddress: statement.resolveAddress(this.recipientAddress, transactionInfo.height.toString(), transactionInfo.index, aggregateTransactionIndex)}); } diff --git a/src/model/transaction/Transaction.ts b/src/model/transaction/Transaction.ts index 8e7010c4d1..3ffa2a2891 100644 --- a/src/model/transaction/Transaction.ts +++ b/src/model/transaction/Transaction.ts @@ -16,6 +16,7 @@ import { KeyPair, SHA3Hasher, SignSchema } from '../../core/crypto'; import { Convert } from '../../core/format'; +import { DtoMapping } from '../../core/utils/DtoMapping'; import { SerializeTransactionToJSON } from '../../infrastructure/transaction/SerializeTransactionToJSON'; import { Account } from '../account/Account'; import { PublicAccount } from '../account/PublicAccount'; @@ -200,7 +201,7 @@ export abstract class Transaction { * @returns {TransferTransaction} */ public setMaxFee(feeMultiplier: number): Transaction { - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, {maxFee: UInt64.fromUint(this.size * feeMultiplier)}); + return DtoMapping.assign(this, {maxFee: UInt64.fromUint(this.size * feeMultiplier)}); } /** @@ -277,7 +278,7 @@ export abstract class Transaction { if (this.type === TransactionType.AGGREGATE_BONDED || this.type === TransactionType.AGGREGATE_COMPLETE) { throw new Error('Inner transaction cannot be an aggregated transaction.'); } - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, {signer}); + return DtoMapping.assign(this, {signer}); } /** @@ -345,7 +346,7 @@ export abstract class Transaction { */ public reapplyGiven(deadline: Deadline = Deadline.create()): Transaction { if (this.isUnannounced()) { - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, {deadline}); + return DtoMapping.assign(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 923a5b4b04..7f213f989d 100644 --- a/src/model/transaction/TransferTransaction.ts +++ b/src/model/transaction/TransferTransaction.ts @@ -44,6 +44,7 @@ import {Transaction} from './Transaction'; import {TransactionInfo} from './TransactionInfo'; import {TransactionType} from './TransactionType'; import {TransactionVersion} from './TransactionVersion'; +import { DtoMapping } from '../../core/utils/DtoMapping'; /** * Transfer transactions contain data about transfers of mosaics and message to another account. @@ -282,10 +283,9 @@ export class TransferTransaction extends Transaction { */ public resolveAliases(statement: Statement, aggregateTransactionIndex: number = 0): TransferTransaction { const transactionInfo = this.checkTransactionHeightAndIndex(); - return Object.assign({__proto__: Object.getPrototypeOf(this)}, this, - {recipientAddress: statement.resolveAddress(this.recipientAddress, transactionInfo.height.toString(), - transactionInfo.index, aggregateTransactionIndex), - mosaics: this.mosaics.map((mosaic) => statement.resolveMosaic(mosaic, transactionInfo.height.toString(), - transactionInfo.index, aggregateTransactionIndex))}); + return DtoMapping.assign(this, {recipientAddress: statement.resolveAddress(this.recipientAddress, transactionInfo.height.toString(), + transactionInfo.index, aggregateTransactionIndex), + mosaics: this.mosaics.map((mosaic) => statement.resolveMosaic(mosaic, transactionInfo.height.toString(), + transactionInfo.index, aggregateTransactionIndex))}); } } diff --git a/test/infrastructure/RepositoryFactory.spec.ts b/test/infrastructure/RepositoryFactory.spec.ts index 6199559a27..3ee35f30b4 100644 --- a/test/infrastructure/RepositoryFactory.spec.ts +++ b/test/infrastructure/RepositoryFactory.spec.ts @@ -13,19 +13,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { expect } from "chai"; -import { RepositoryFactoryHttp } from "../../src/infrastructure/RepositoryFactoryHttp"; -import { BlockRepository } from "../../src/infrastructure/BlockRepository"; -import { instance, mock, when } from "ts-mockito"; -import { BlockInfo } from "../../src/model/blockchain/BlockInfo"; +import { expect } from 'chai'; import { of as observableOf } from 'rxjs'; -import { map } from "rxjs/operators"; -import { NetworkRepository } from "../../src/infrastructure/NetworkRepository"; -import { NetworkType } from "../../src/model/blockchain/NetworkType"; +import { map } from 'rxjs/operators'; +import { instance, mock, when } from 'ts-mockito'; +import { BlockRepository } from '../../src/infrastructure/BlockRepository'; +import { NetworkRepository } from '../../src/infrastructure/NetworkRepository'; +import { RepositoryFactoryHttp } from '../../src/infrastructure/RepositoryFactoryHttp'; +import { BlockInfo } from '../../src/model/blockchain/BlockInfo'; +import { NetworkType } from '../../src/model/blockchain/NetworkType'; describe('RepositoryFactory', () => { it('Should create repositories', () => { - const repositoryFactory = new RepositoryFactoryHttp("http://localhost:3000"); + const repositoryFactory = new RepositoryFactoryHttp('http://localhost:3000'); expect(repositoryFactory.createBlockRepository()).to.be.not.null; expect(repositoryFactory.createNetworkRepository()).to.be.not.null; @@ -50,7 +50,7 @@ describe('RepositoryFactory', () => { const repositoryMock: BlockRepository = mock(); - const observableOfBlockInfo = observableOf({generationHash: 'aaaa'} as BlockInfo).pipe(map(v => { + const observableOfBlockInfo = observableOf({generationHash: 'aaaa'} as BlockInfo).pipe(map((v) => { counter++; return v; })); @@ -63,10 +63,10 @@ describe('RepositoryFactory', () => { createBlockRepository(): BlockRepository { return instance(repositoryMock); } - })("http://localhost:3000"); + })('http://localhost:3000'); expect(counter).to.be.equals(0); - repositoryFactory.getGenerationHash().subscribe(gh => { + repositoryFactory.getGenerationHash().subscribe((gh) => { expect(counter).to.be.equals(1); expect(gh).to.be.equals('aaaa'); repositoryFactory.getGenerationHash().subscribe(gh => { @@ -76,9 +76,9 @@ describe('RepositoryFactory', () => { expect(counter).to.be.equals(1); expect(gh).to.be.equals('aaaa'); done(); - }) - }) - }) + }); + }); + }); }); @@ -88,8 +88,8 @@ describe('RepositoryFactory', () => { const repositoryMock: NetworkRepository = mock(); - let expectedNetworkType = NetworkType.MIJIN_TEST; - const observableOfBlockInfo = observableOf(expectedNetworkType).pipe(map(v => { + const expectedNetworkType = NetworkType.MIJIN_TEST; + const observableOfBlockInfo = observableOf(expectedNetworkType).pipe(map((v) => { counter++; return v; })); @@ -98,22 +98,21 @@ describe('RepositoryFactory', () => { expect(observableOfBlockInfo).to.be.equals(observableOfBlockInfo); const repositoryFactory = new (class RepositoryFactoryHttpForTest extends RepositoryFactoryHttp { - createNetworkRepository(): NetworkRepository { return instance(repositoryMock); } - })("http://localhost:3000"); + })('http://localhost:3000'); expect(counter).to.be.equals(0); - repositoryFactory.getNetworkType().subscribe(networkType => { + repositoryFactory.getNetworkType().subscribe((networkType) => { expect(counter).to.be.equals(1); expect(networkType).to.be.equals(expectedNetworkType); repositoryFactory.getNetworkType().subscribe(networkType => { expect(counter).to.be.equals(1); expect(networkType).to.be.equals(expectedNetworkType); done(); - }) - }) + }); + }); }); @@ -123,8 +122,8 @@ describe('RepositoryFactory', () => { const repositoryMock: NetworkRepository = mock(); - let expectedNetworkType = NetworkType.MIJIN_TEST; - const observableOfBlockInfo = observableOf(expectedNetworkType).pipe(map(v => { + const expectedNetworkType = NetworkType.MIJIN_TEST; + const observableOfBlockInfo = observableOf(expectedNetworkType).pipe(map((v) => { counter++; return v; })); @@ -137,18 +136,18 @@ describe('RepositoryFactory', () => { createNetworkRepository(): NetworkRepository { return instance(repositoryMock); } - })("http://localhost:3000", expectedNetworkType); + })('http://localhost:3000', expectedNetworkType); expect(counter).to.be.equals(0); - repositoryFactory.getNetworkType().subscribe(networkType => { + repositoryFactory.getNetworkType().subscribe((networkType) => { expect(counter).to.be.equals(0); expect(networkType).to.be.equals(expectedNetworkType); repositoryFactory.getNetworkType().subscribe(networkType => { expect(counter).to.be.equals(0); expect(networkType).to.be.equals(expectedNetworkType); done(); - }) - }) + }); + }); }); From fc8410b7c2642c0b65a3321864aadc2ccf432dfb Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Fri, 20 Dec 2019 21:27:50 +0000 Subject: [PATCH 10/18] Fixed #393 applied catbuffer generator on aggregate --- .../AggregateBondedTransactionBuilder.ts | 8 +- .../AggregateCompleteTransactionBuilder.ts | 8 +- .../AggregateTransactionBodyBuilder.ts | 52 ++- .../catbuffer/BalanceChangeReceiptBuilder.ts | 111 +++++ .../BalanceTransferReceiptBuilder.ts | 132 ++++++ .../catbuffer/BlockHeaderBuilder.ts | 387 ++++++++++++++++++ .../catbuffer/EmbeddedTransactionHelper.ts | 181 ++++++++ src/infrastructure/catbuffer/EntityTypeDto.ts | 40 ++ .../catbuffer/GeneratorUtils.ts | 9 + .../catbuffer/InflationReceiptBuilder.ts | 92 +++++ .../catbuffer/MosaicExpiryReceiptBuilder.ts | 92 +++++ .../NamespaceExpiryReceiptBuilder.ts | 92 +++++ .../catbuffer/ReceiptBuilder.ts | 108 +++++ .../catbuffer/ReceiptTypeDto.ts | 27 ++ .../AccountAddressRestrictionTransaction.ts | 8 +- .../transaction/AccountLinkTransaction.ts | 8 +- .../transaction/AccountMetadataTransaction.ts | 8 +- .../AccountMosaicRestrictionTransaction.ts | 8 +- .../AccountOperationRestrictionTransaction.ts | 8 +- .../transaction/AddressAliasTransaction.ts | 8 +- src/model/transaction/AggregateTransaction.ts | 58 +-- src/model/transaction/LockFundsTransaction.ts | 8 +- .../MosaicAddressRestrictionTransaction.ts | 8 +- .../transaction/MosaicAliasTransaction.ts | 8 +- .../MosaicDefinitionTransaction.ts | 8 +- .../MosaicGlobalRestrictionTransaction.ts | 8 +- .../transaction/MosaicMetadataTransaction.ts | 8 +- .../MosaicSupplyChangeTransaction.ts | 8 +- .../MultisigAccountModificationTransaction.ts | 8 +- .../NamespaceMetadataTransaction.ts | 8 +- .../NamespaceRegistrationTransaction.ts | 30 +- .../transaction/SecretLockTransaction.ts | 8 +- .../transaction/SecretProofTransaction.ts | 8 +- src/model/transaction/Transaction.ts | 8 +- src/model/transaction/TransferTransaction.ts | 8 +- test/model/transaction/Transaction.spec.ts | 3 +- 36 files changed, 1431 insertions(+), 151 deletions(-) create mode 100644 src/infrastructure/catbuffer/BalanceChangeReceiptBuilder.ts create mode 100644 src/infrastructure/catbuffer/BalanceTransferReceiptBuilder.ts create mode 100644 src/infrastructure/catbuffer/BlockHeaderBuilder.ts create mode 100644 src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts create mode 100644 src/infrastructure/catbuffer/InflationReceiptBuilder.ts create mode 100644 src/infrastructure/catbuffer/MosaicExpiryReceiptBuilder.ts create mode 100644 src/infrastructure/catbuffer/NamespaceExpiryReceiptBuilder.ts create mode 100644 src/infrastructure/catbuffer/ReceiptBuilder.ts create mode 100644 src/infrastructure/catbuffer/ReceiptTypeDto.ts diff --git a/src/infrastructure/catbuffer/AggregateBondedTransactionBuilder.ts b/src/infrastructure/catbuffer/AggregateBondedTransactionBuilder.ts index 56f42da250..ba3b56b75f 100644 --- a/src/infrastructure/catbuffer/AggregateBondedTransactionBuilder.ts +++ b/src/infrastructure/catbuffer/AggregateBondedTransactionBuilder.ts @@ -21,6 +21,8 @@ import { AggregateTransactionBodyBuilder } from './AggregateTransactionBodyBuilder'; import { AmountDto } from './AmountDto'; +import { CosignatureBuilder } from './CosignatureBuilder'; +import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder'; import { EntityTypeDto } from './EntityTypeDto'; import { GeneratorUtils } from './GeneratorUtils'; import { Hash256Dto } from './Hash256Dto'; @@ -50,7 +52,7 @@ export class AggregateBondedTransactionBuilder extends TransactionBuilder { * @param cosignatures Cosignatures data (fills remaining body space after transactions). */ // tslint:disable-next-line: max-line-length - public constructor(signature: SignatureDto, signerPublicKey: KeyDto, version: number, network: NetworkTypeDto, type: EntityTypeDto, fee: AmountDto, deadline: TimestampDto, transactionsHash: Hash256Dto, transactions: Uint8Array, cosignatures: Uint8Array) { + public constructor(signature: SignatureDto, signerPublicKey: KeyDto, version: number, network: NetworkTypeDto, type: EntityTypeDto, fee: AmountDto, deadline: TimestampDto, transactionsHash: Hash256Dto, transactions: EmbeddedTransactionBuilder[], cosignatures: CosignatureBuilder[]) { super(signature, signerPublicKey, version, network, type, fee, deadline); this.aggregateTransactionBody = new AggregateTransactionBodyBuilder(transactionsHash, transactions, cosignatures); } @@ -94,7 +96,7 @@ export class AggregateBondedTransactionBuilder extends TransactionBuilder { * * @return Sub-transaction data (transactions are variable sized and payload size is in bytes). */ - public getTransactions(): Uint8Array { + public getTransactions(): EmbeddedTransactionBuilder[] { return this.aggregateTransactionBody.getTransactions(); } @@ -103,7 +105,7 @@ export class AggregateBondedTransactionBuilder extends TransactionBuilder { * * @return Cosignatures data (fills remaining body space after transactions). */ - public getCosignatures(): Uint8Array { + public getCosignatures(): CosignatureBuilder[] { return this.aggregateTransactionBody.getCosignatures(); } diff --git a/src/infrastructure/catbuffer/AggregateCompleteTransactionBuilder.ts b/src/infrastructure/catbuffer/AggregateCompleteTransactionBuilder.ts index 6dd372648f..f6b6e0983e 100644 --- a/src/infrastructure/catbuffer/AggregateCompleteTransactionBuilder.ts +++ b/src/infrastructure/catbuffer/AggregateCompleteTransactionBuilder.ts @@ -21,6 +21,8 @@ import { AggregateTransactionBodyBuilder } from './AggregateTransactionBodyBuilder'; import { AmountDto } from './AmountDto'; +import { CosignatureBuilder } from './CosignatureBuilder'; +import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder'; import { EntityTypeDto } from './EntityTypeDto'; import { GeneratorUtils } from './GeneratorUtils'; import { Hash256Dto } from './Hash256Dto'; @@ -50,7 +52,7 @@ export class AggregateCompleteTransactionBuilder extends TransactionBuilder { * @param cosignatures Cosignatures data (fills remaining body space after transactions). */ // tslint:disable-next-line: max-line-length - public constructor(signature: SignatureDto, signerPublicKey: KeyDto, version: number, network: NetworkTypeDto, type: EntityTypeDto, fee: AmountDto, deadline: TimestampDto, transactionsHash: Hash256Dto, transactions: Uint8Array, cosignatures: Uint8Array) { + public constructor(signature: SignatureDto, signerPublicKey: KeyDto, version: number, network: NetworkTypeDto, type: EntityTypeDto, fee: AmountDto, deadline: TimestampDto, transactionsHash: Hash256Dto, transactions: EmbeddedTransactionBuilder[], cosignatures: CosignatureBuilder[]) { super(signature, signerPublicKey, version, network, type, fee, deadline); this.aggregateTransactionBody = new AggregateTransactionBodyBuilder(transactionsHash, transactions, cosignatures); } @@ -94,7 +96,7 @@ export class AggregateCompleteTransactionBuilder extends TransactionBuilder { * * @return Sub-transaction data (transactions are variable sized and payload size is in bytes). */ - public getTransactions(): Uint8Array { + public getTransactions(): EmbeddedTransactionBuilder[] { return this.aggregateTransactionBody.getTransactions(); } @@ -103,7 +105,7 @@ export class AggregateCompleteTransactionBuilder extends TransactionBuilder { * * @return Cosignatures data (fills remaining body space after transactions). */ - public getCosignatures(): Uint8Array { + public getCosignatures(): CosignatureBuilder[] { return this.aggregateTransactionBody.getCosignatures(); } diff --git a/src/infrastructure/catbuffer/AggregateTransactionBodyBuilder.ts b/src/infrastructure/catbuffer/AggregateTransactionBodyBuilder.ts index b4de916720..5dd2492e47 100644 --- a/src/infrastructure/catbuffer/AggregateTransactionBodyBuilder.ts +++ b/src/infrastructure/catbuffer/AggregateTransactionBodyBuilder.ts @@ -19,6 +19,9 @@ *** along with Catapult. If not, see . **/ +import { CosignatureBuilder } from './CosignatureBuilder'; +import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder'; +import { EmbeddedTransactionHelper } from './EmbeddedTransactionHelper'; import { GeneratorUtils } from './GeneratorUtils'; import { Hash256Dto } from './Hash256Dto'; @@ -29,9 +32,9 @@ export class AggregateTransactionBodyBuilder { /** Reserved padding to align end of AggregateTransactionHeader on 8-byte boundary. */ aggregateTransactionHeader_Reserved1: number; /** Sub-transaction data (transactions are variable sized and payload size is in bytes). */ - transactions: Uint8Array; + transactions: EmbeddedTransactionBuilder[]; /** Cosignatures data (fills remaining body space after transactions). */ - cosignatures: Uint8Array; + cosignatures: CosignatureBuilder[]; /** * Constructor. @@ -40,7 +43,8 @@ export class AggregateTransactionBodyBuilder { * @param transactions Sub-transaction data (transactions are variable sized and payload size is in bytes). * @param cosignatures Cosignatures data (fills remaining body space after transactions). */ - public constructor(transactionsHash: Hash256Dto, transactions: Uint8Array, cosignatures: Uint8Array) { + // tslint:disable-next-line: max-line-length + public constructor(transactionsHash: Hash256Dto, transactions: EmbeddedTransactionBuilder[], cosignatures: CosignatureBuilder[]) { this.transactionsHash = transactionsHash; this.aggregateTransactionHeader_Reserved1 = 0; this.transactions = transactions; @@ -62,9 +66,24 @@ export class AggregateTransactionBodyBuilder { // tslint:disable-next-line: max-line-length const aggregateTransactionHeader_Reserved1 = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4)); byteArray.splice(0, 4); - const transactions = GeneratorUtils.getBytes(Uint8Array.from(byteArray), payloadSize); - byteArray.splice(0, payloadSize); - const cosignatures = Uint8Array.from(byteArray); + let transactionsByteSize = payloadSize; + const transactions: EmbeddedTransactionBuilder[] = []; + while (transactionsByteSize > 0) { + const item = EmbeddedTransactionHelper.loadFromBinary(Uint8Array.from(byteArray)); + transactions.push(item); + const itemSize = item.getSize() + GeneratorUtils.getTransactionPaddingSize(item.getSize(), 8); + transactionsByteSize -= itemSize; + byteArray.splice(0, itemSize); + } + let cosignaturesByteSize = byteArray.length; + const cosignatures: CosignatureBuilder[] = []; + while (cosignaturesByteSize > 0) { + const item = CosignatureBuilder.loadFromBinary(Uint8Array.from(byteArray)); + cosignatures.push(item); + const itemSize = item.getSize(); + cosignaturesByteSize -= itemSize; + byteArray.splice(0, itemSize); + } return new AggregateTransactionBodyBuilder(transactionsHash, transactions, cosignatures); } @@ -91,7 +110,7 @@ export class AggregateTransactionBodyBuilder { * * @return Sub-transaction data (transactions are variable sized and payload size is in bytes). */ - public getTransactions(): Uint8Array { + public getTransactions(): EmbeddedTransactionBuilder[] { return this.transactions; } @@ -100,7 +119,7 @@ export class AggregateTransactionBodyBuilder { * * @return Cosignatures data (fills remaining body space after transactions). */ - public getCosignatures(): Uint8Array { + public getCosignatures(): CosignatureBuilder[] { return this.cosignatures; } @@ -114,8 +133,8 @@ export class AggregateTransactionBodyBuilder { size += this.transactionsHash.getSize(); size += 4; // payloadSize size += 4; // aggregateTransactionHeader_Reserved1 - size += this.transactions.length; - size += this.cosignatures.length; + this.transactions.forEach((o) => size += EmbeddedTransactionHelper.serialize(o).length); + this.cosignatures.forEach((o) => size += o.getSize()); return size; } @@ -128,13 +147,20 @@ export class AggregateTransactionBodyBuilder { let newArray = Uint8Array.from([]); const transactionsHashBytes = this.transactionsHash.serialize(); newArray = GeneratorUtils.concatTypedArrays(newArray, transactionsHashBytes); - const payloadSizeBytes = GeneratorUtils.uintToBuffer(this.transactions.length, 4); + // tslint:disable-next-line: max-line-length + const payloadSizeBytes = GeneratorUtils.uintToBuffer(EmbeddedTransactionHelper.getEmbeddedTransactionSize(this.transactions), 4); newArray = GeneratorUtils.concatTypedArrays(newArray, payloadSizeBytes); // tslint:disable-next-line: max-line-length const aggregateTransactionHeader_Reserved1Bytes = GeneratorUtils.uintToBuffer(this.getAggregateTransactionHeader_Reserved1(), 4); newArray = GeneratorUtils.concatTypedArrays(newArray, aggregateTransactionHeader_Reserved1Bytes); - newArray = GeneratorUtils.concatTypedArrays(newArray, this.transactions); - newArray = GeneratorUtils.concatTypedArrays(newArray, this.cosignatures); + this.transactions.forEach((item) => { + const transactionsBytes = EmbeddedTransactionHelper.serialize(item); + newArray = GeneratorUtils.concatTypedArrays(newArray, transactionsBytes); + }); + this.cosignatures.forEach((item) => { + const cosignaturesBytes = item.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, cosignaturesBytes); + }); return newArray; } } diff --git a/src/infrastructure/catbuffer/BalanceChangeReceiptBuilder.ts b/src/infrastructure/catbuffer/BalanceChangeReceiptBuilder.ts new file mode 100644 index 0000000000..7670f20e0f --- /dev/null +++ b/src/infrastructure/catbuffer/BalanceChangeReceiptBuilder.ts @@ -0,0 +1,111 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { GeneratorUtils } from './GeneratorUtils'; +import { KeyDto } from './KeyDto'; +import { MosaicBuilder } from './MosaicBuilder'; +import { ReceiptBuilder } from './ReceiptBuilder'; +import { ReceiptTypeDto } from './ReceiptTypeDto'; + +/** Binary layout for a balance change receipt. */ +export class BalanceChangeReceiptBuilder extends ReceiptBuilder { + /** Mosaic. */ + mosaic: MosaicBuilder; + /** Account public key. */ + targetPublicKey: KeyDto; + + /** + * Constructor. + * + * @param version Receipt version. + * @param type Receipt type. + * @param mosaic Mosaic. + * @param targetPublicKey Account public key. + */ + public constructor(version: number, type: ReceiptTypeDto, mosaic: MosaicBuilder, targetPublicKey: KeyDto) { + super(version, type); + this.mosaic = mosaic; + this.targetPublicKey = targetPublicKey; + } + + /** + * Creates an instance of BalanceChangeReceiptBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of BalanceChangeReceiptBuilder. + */ + public static loadFromBinary(payload: Uint8Array): BalanceChangeReceiptBuilder { + const byteArray = Array.from(payload); + const superObject = ReceiptBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, superObject.getSize()); + const mosaic = MosaicBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, mosaic.getSize()); + const targetPublicKey = KeyDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, targetPublicKey.getSize()); + return new BalanceChangeReceiptBuilder(superObject.version, superObject.type, mosaic, targetPublicKey); + } + + /** + * Gets mosaic. + * + * @return Mosaic. + */ + public getMosaic(): MosaicBuilder { + return this.mosaic; + } + + /** + * Gets account public key. + * + * @return Account public key. + */ + public getTargetPublicKey(): KeyDto { + return this.targetPublicKey; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size: number = super.getSize(); + size += this.mosaic.getSize(); + size += this.targetPublicKey.getSize(); + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const superBytes = super.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, superBytes); + const mosaicBytes = this.mosaic.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, mosaicBytes); + const targetPublicKeyBytes = this.targetPublicKey.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, targetPublicKeyBytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/BalanceTransferReceiptBuilder.ts b/src/infrastructure/catbuffer/BalanceTransferReceiptBuilder.ts new file mode 100644 index 0000000000..89215dc6c1 --- /dev/null +++ b/src/infrastructure/catbuffer/BalanceTransferReceiptBuilder.ts @@ -0,0 +1,132 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { AddressDto } from './AddressDto'; +import { GeneratorUtils } from './GeneratorUtils'; +import { KeyDto } from './KeyDto'; +import { MosaicBuilder } from './MosaicBuilder'; +import { ReceiptBuilder } from './ReceiptBuilder'; +import { ReceiptTypeDto } from './ReceiptTypeDto'; + +/** Binary layout for a balance transfer receipt. */ +export class BalanceTransferReceiptBuilder extends ReceiptBuilder { + /** Mosaic. */ + mosaic: MosaicBuilder; + /** Mosaic sender public key. */ + senderPublicKey: KeyDto; + /** Mosaic recipient address. */ + recipientAddress: AddressDto; + + /** + * Constructor. + * + * @param version Receipt version. + * @param type Receipt type. + * @param mosaic Mosaic. + * @param senderPublicKey Mosaic sender public key. + * @param recipientAddress Mosaic recipient address. + */ + // tslint:disable-next-line: max-line-length + public constructor(version: number, type: ReceiptTypeDto, mosaic: MosaicBuilder, senderPublicKey: KeyDto, recipientAddress: AddressDto) { + super(version, type); + this.mosaic = mosaic; + this.senderPublicKey = senderPublicKey; + this.recipientAddress = recipientAddress; + } + + /** + * Creates an instance of BalanceTransferReceiptBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of BalanceTransferReceiptBuilder. + */ + public static loadFromBinary(payload: Uint8Array): BalanceTransferReceiptBuilder { + const byteArray = Array.from(payload); + const superObject = ReceiptBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, superObject.getSize()); + const mosaic = MosaicBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, mosaic.getSize()); + const senderPublicKey = KeyDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, senderPublicKey.getSize()); + const recipientAddress = AddressDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, recipientAddress.getSize()); + // tslint:disable-next-line: max-line-length + return new BalanceTransferReceiptBuilder(superObject.version, superObject.type, mosaic, senderPublicKey, recipientAddress); + } + + /** + * Gets mosaic. + * + * @return Mosaic. + */ + public getMosaic(): MosaicBuilder { + return this.mosaic; + } + + /** + * Gets mosaic sender public key. + * + * @return Mosaic sender public key. + */ + public getSenderPublicKey(): KeyDto { + return this.senderPublicKey; + } + + /** + * Gets mosaic recipient address. + * + * @return Mosaic recipient address. + */ + public getRecipientAddress(): AddressDto { + return this.recipientAddress; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size: number = super.getSize(); + size += this.mosaic.getSize(); + size += this.senderPublicKey.getSize(); + size += this.recipientAddress.getSize(); + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const superBytes = super.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, superBytes); + const mosaicBytes = this.mosaic.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, mosaicBytes); + const senderPublicKeyBytes = this.senderPublicKey.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, senderPublicKeyBytes); + const recipientAddressBytes = this.recipientAddress.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, recipientAddressBytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/BlockHeaderBuilder.ts b/src/infrastructure/catbuffer/BlockHeaderBuilder.ts new file mode 100644 index 0000000000..eb693aa3fa --- /dev/null +++ b/src/infrastructure/catbuffer/BlockHeaderBuilder.ts @@ -0,0 +1,387 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { BlockFeeMultiplierDto } from './BlockFeeMultiplierDto'; +import { DifficultyDto } from './DifficultyDto'; +import { EntityTypeDto } from './EntityTypeDto'; +import { GeneratorUtils } from './GeneratorUtils'; +import { Hash256Dto } from './Hash256Dto'; +import { HeightDto } from './HeightDto'; +import { KeyDto } from './KeyDto'; +import { NetworkTypeDto } from './NetworkTypeDto'; +import { SignatureDto } from './SignatureDto'; +import { TimestampDto } from './TimestampDto'; + +/** Binary layout for a block header. */ +export class BlockHeaderBuilder { + /** Entity size. */ + size = 0; + /** Reserved padding to align Signature on 8-byte boundary. */ + verifiableEntityHeader_Reserved1: number; + /** Entity signature. */ + signature: SignatureDto; + /** Entity signer's public key. */ + signerPublicKey: KeyDto; + /** Reserved padding to align end of EntityBody on 8-byte boundary. */ + entityBody_Reserved1: number; + /** Entity version. */ + version: number; + /** Entity network. */ + network: NetworkTypeDto; + /** Entity type. */ + type: EntityTypeDto; + /** Block height. */ + height: HeightDto; + /** Number of milliseconds elapsed since creation of nemesis block. */ + timestamp: TimestampDto; + /** Block difficulty. */ + difficulty: DifficultyDto; + /** Previous block hash. */ + previousBlockHash: Hash256Dto; + /** Hash of the transactions in this block. */ + transactionsHash: Hash256Dto; + /** Hash of the receipts generated by this block. */ + receiptsHash: Hash256Dto; + /** Hash of the global chain state at this block. */ + stateHash: Hash256Dto; + /** Beneficiary public key designated by harvester. */ + beneficiaryPublicKey: KeyDto; + /** Fee multiplier applied to block transactions. */ + feeMultiplier: BlockFeeMultiplierDto; + /** Reserved padding to align end of BlockHeader on 8-byte boundary. */ + blockHeader_Reserved1: number; + + /** + * Constructor. + * + * @param signature Entity signature. + * @param signerPublicKey Entity signer's public key. + * @param version Entity version. + * @param network Entity network. + * @param type Entity type. + * @param height Block height. + * @param timestamp Number of milliseconds elapsed since creation of nemesis block. + * @param difficulty Block difficulty. + * @param previousBlockHash Previous block hash. + * @param transactionsHash Hash of the transactions in this block. + * @param receiptsHash Hash of the receipts generated by this block. + * @param stateHash Hash of the global chain state at this block. + * @param beneficiaryPublicKey Beneficiary public key designated by harvester. + * @param feeMultiplier Fee multiplier applied to block transactions. + */ + // tslint:disable-next-line: max-line-length + public constructor(signature: SignatureDto, signerPublicKey: KeyDto, version: number, network: NetworkTypeDto, type: EntityTypeDto, height: HeightDto, timestamp: TimestampDto, difficulty: DifficultyDto, previousBlockHash: Hash256Dto, transactionsHash: Hash256Dto, receiptsHash: Hash256Dto, stateHash: Hash256Dto, beneficiaryPublicKey: KeyDto, feeMultiplier: BlockFeeMultiplierDto) { + this.verifiableEntityHeader_Reserved1 = 0; + this.signature = signature; + this.signerPublicKey = signerPublicKey; + this.entityBody_Reserved1 = 0; + this.version = version; + this.network = network; + this.type = type; + this.height = height; + this.timestamp = timestamp; + this.difficulty = difficulty; + this.previousBlockHash = previousBlockHash; + this.transactionsHash = transactionsHash; + this.receiptsHash = receiptsHash; + this.stateHash = stateHash; + this.beneficiaryPublicKey = beneficiaryPublicKey; + this.feeMultiplier = feeMultiplier; + this.blockHeader_Reserved1 = 0; + } + + /** + * Creates an instance of BlockHeaderBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of BlockHeaderBuilder. + */ + public static loadFromBinary(payload: Uint8Array): BlockHeaderBuilder { + const byteArray = Array.from(payload); + const size = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4)); + byteArray.splice(0, 4); + // tslint:disable-next-line: max-line-length + const verifiableEntityHeader_Reserved1 = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4)); + byteArray.splice(0, 4); + const signature = SignatureDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, signature.getSize()); + const signerPublicKey = KeyDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, signerPublicKey.getSize()); + const entityBody_Reserved1 = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4)); + byteArray.splice(0, 4); + const version = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 1)); + byteArray.splice(0, 1); + const network = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 1)); + byteArray.splice(0, 1); + const type = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 2)); + byteArray.splice(0, 2); + const height = HeightDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, height.getSize()); + const timestamp = TimestampDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, timestamp.getSize()); + const difficulty = DifficultyDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, difficulty.getSize()); + const previousBlockHash = Hash256Dto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, previousBlockHash.getSize()); + const transactionsHash = Hash256Dto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, transactionsHash.getSize()); + const receiptsHash = Hash256Dto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, receiptsHash.getSize()); + const stateHash = Hash256Dto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, stateHash.getSize()); + const beneficiaryPublicKey = KeyDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, beneficiaryPublicKey.getSize()); + const feeMultiplier = BlockFeeMultiplierDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, feeMultiplier.getSize()); + const blockHeader_Reserved1 = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4)); + byteArray.splice(0, 4); + // tslint:disable-next-line: max-line-length + return new BlockHeaderBuilder(signature, signerPublicKey, version, network, type, height, timestamp, difficulty, previousBlockHash, transactionsHash, receiptsHash, stateHash, beneficiaryPublicKey, feeMultiplier); + } + + /** + * Gets reserved padding to align Signature on 8-byte boundary. + * + * @return Reserved padding to align Signature on 8-byte boundary. + */ + public getVerifiableEntityHeader_Reserved1(): number { + return this.verifiableEntityHeader_Reserved1; + } + + /** + * Gets entity signature. + * + * @return Entity signature. + */ + public getSignature(): SignatureDto { + return this.signature; + } + + /** + * Gets entity signer's public key. + * + * @return Entity signer's public key. + */ + public getSignerPublicKey(): KeyDto { + return this.signerPublicKey; + } + + /** + * Gets reserved padding to align end of EntityBody on 8-byte boundary. + * + * @return Reserved padding to align end of EntityBody on 8-byte boundary. + */ + public getEntityBody_Reserved1(): number { + return this.entityBody_Reserved1; + } + + /** + * Gets entity version. + * + * @return Entity version. + */ + public getVersion(): number { + return this.version; + } + + /** + * Gets entity network. + * + * @return Entity network. + */ + public getNetwork(): NetworkTypeDto { + return this.network; + } + + /** + * Gets entity type. + * + * @return Entity type. + */ + public getType(): EntityTypeDto { + return this.type; + } + + /** + * Gets block height. + * + * @return Block height. + */ + public getHeight(): HeightDto { + return this.height; + } + + /** + * Gets number of milliseconds elapsed since creation of nemesis block. + * + * @return Number of milliseconds elapsed since creation of nemesis block. + */ + public getTimestamp(): TimestampDto { + return this.timestamp; + } + + /** + * Gets block difficulty. + * + * @return Block difficulty. + */ + public getDifficulty(): DifficultyDto { + return this.difficulty; + } + + /** + * Gets previous block hash. + * + * @return Previous block hash. + */ + public getPreviousBlockHash(): Hash256Dto { + return this.previousBlockHash; + } + + /** + * Gets hash of the transactions in this block. + * + * @return Hash of the transactions in this block. + */ + public getTransactionsHash(): Hash256Dto { + return this.transactionsHash; + } + + /** + * Gets hash of the receipts generated by this block. + * + * @return Hash of the receipts generated by this block. + */ + public getReceiptsHash(): Hash256Dto { + return this.receiptsHash; + } + + /** + * Gets hash of the global chain state at this block. + * + * @return Hash of the global chain state at this block. + */ + public getStateHash(): Hash256Dto { + return this.stateHash; + } + + /** + * Gets beneficiary public key designated by harvester. + * + * @return Beneficiary public key designated by harvester. + */ + public getBeneficiaryPublicKey(): KeyDto { + return this.beneficiaryPublicKey; + } + + /** + * Gets fee multiplier applied to block transactions. + * + * @return Fee multiplier applied to block transactions. + */ + public getFeeMultiplier(): BlockFeeMultiplierDto { + return this.feeMultiplier; + } + + /** + * Gets reserved padding to align end of BlockHeader on 8-byte boundary. + * + * @return Reserved padding to align end of BlockHeader on 8-byte boundary. + */ + public getBlockHeader_Reserved1(): number { + return this.blockHeader_Reserved1; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size = 0; + size += 4; // size + size += 4; // verifiableEntityHeader_Reserved1 + size += this.signature.getSize(); + size += this.signerPublicKey.getSize(); + size += 4; // entityBody_Reserved1 + size += 1; // version + size += 1; // network + size += 2; // type + size += this.height.getSize(); + size += this.timestamp.getSize(); + size += this.difficulty.getSize(); + size += this.previousBlockHash.getSize(); + size += this.transactionsHash.getSize(); + size += this.receiptsHash.getSize(); + size += this.stateHash.getSize(); + size += this.beneficiaryPublicKey.getSize(); + size += this.feeMultiplier.getSize(); + size += 4; // blockHeader_Reserved1 + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const sizeBytes = GeneratorUtils.uintToBuffer(this.getSize(), 4); + newArray = GeneratorUtils.concatTypedArrays(newArray, sizeBytes); + // tslint:disable-next-line: max-line-length + const verifiableEntityHeader_Reserved1Bytes = GeneratorUtils.uintToBuffer(this.getVerifiableEntityHeader_Reserved1(), 4); + newArray = GeneratorUtils.concatTypedArrays(newArray, verifiableEntityHeader_Reserved1Bytes); + const signatureBytes = this.signature.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, signatureBytes); + const signerPublicKeyBytes = this.signerPublicKey.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, signerPublicKeyBytes); + const entityBody_Reserved1Bytes = GeneratorUtils.uintToBuffer(this.getEntityBody_Reserved1(), 4); + newArray = GeneratorUtils.concatTypedArrays(newArray, entityBody_Reserved1Bytes); + const versionBytes = GeneratorUtils.uintToBuffer(this.getVersion(), 1); + newArray = GeneratorUtils.concatTypedArrays(newArray, versionBytes); + const networkBytes = GeneratorUtils.uintToBuffer(this.network, 1); + newArray = GeneratorUtils.concatTypedArrays(newArray, networkBytes); + const typeBytes = GeneratorUtils.uintToBuffer(this.type, 2); + newArray = GeneratorUtils.concatTypedArrays(newArray, typeBytes); + const heightBytes = this.height.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, heightBytes); + const timestampBytes = this.timestamp.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, timestampBytes); + const difficultyBytes = this.difficulty.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, difficultyBytes); + const previousBlockHashBytes = this.previousBlockHash.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, previousBlockHashBytes); + const transactionsHashBytes = this.transactionsHash.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, transactionsHashBytes); + const receiptsHashBytes = this.receiptsHash.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, receiptsHashBytes); + const stateHashBytes = this.stateHash.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, stateHashBytes); + const beneficiaryPublicKeyBytes = this.beneficiaryPublicKey.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, beneficiaryPublicKeyBytes); + const feeMultiplierBytes = this.feeMultiplier.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, feeMultiplierBytes); + const blockHeader_Reserved1Bytes = GeneratorUtils.uintToBuffer(this.getBlockHeader_Reserved1(), 4); + newArray = GeneratorUtils.concatTypedArrays(newArray, blockHeader_Reserved1Bytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts b/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts new file mode 100644 index 0000000000..ad436cfc30 --- /dev/null +++ b/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts @@ -0,0 +1,181 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { EntityTypeDto } from './EntityTypeDto' +import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder' +import { GeneratorUtils } from './GeneratorUtils' +import { EmbeddedTransferTransactionBuilder } from './EmbeddedTransferTransactionBuilder' +import { EmbeddedAccountLinkTransactionBuilder } from './EmbeddedAccountLinkTransactionBuilder' +import { EmbeddedHashLockTransactionBuilder } from './EmbeddedHashLockTransactionBuilder' +import { EmbeddedSecretLockTransactionBuilder } from './EmbeddedSecretLockTransactionBuilder' +import { EmbeddedSecretProofTransactionBuilder } from './EmbeddedSecretProofTransactionBuilder' +import { EmbeddedAccountMetadataTransactionBuilder } from './EmbeddedAccountMetadataTransactionBuilder' +import { EmbeddedMosaicMetadataTransactionBuilder } from './EmbeddedMosaicMetadataTransactionBuilder' +import { EmbeddedNamespaceMetadataTransactionBuilder } from './EmbeddedNamespaceMetadataTransactionBuilder' +import { EmbeddedMosaicDefinitionTransactionBuilder } from './EmbeddedMosaicDefinitionTransactionBuilder' +import { EmbeddedMosaicSupplyChangeTransactionBuilder } from './EmbeddedMosaicSupplyChangeTransactionBuilder' +import { EmbeddedMultisigAccountModificationTransactionBuilder } from './EmbeddedMultisigAccountModificationTransactionBuilder' +import { EmbeddedAddressAliasTransactionBuilder } from './EmbeddedAddressAliasTransactionBuilder' +import { EmbeddedMosaicAliasTransactionBuilder } from './EmbeddedMosaicAliasTransactionBuilder' +import { EmbeddedNamespaceRegistrationTransactionBuilder } from './EmbeddedNamespaceRegistrationTransactionBuilder' +import { EmbeddedAccountAddressRestrictionTransactionBuilder } from './EmbeddedAccountAddressRestrictionTransactionBuilder' +import { EmbeddedAccountMosaicRestrictionTransactionBuilder } from './EmbeddedAccountMosaicRestrictionTransactionBuilder' +import { EmbeddedAccountOperationRestrictionTransactionBuilder } from './EmbeddedAccountOperationRestrictionTransactionBuilder' +import { EmbeddedMosaicAddressRestrictionTransactionBuilder } from './EmbeddedMosaicAddressRestrictionTransactionBuilder' +import { EmbeddedMosaicGlobalRestrictionTransactionBuilder } from './EmbeddedMosaicGlobalRestrictionTransactionBuilder' + +export class EmbeddedTransactionHelper { + + public static serialize(transaction: EmbeddedTransactionBuilder): Uint8Array { + let byte: Uint8Array; + let padding: Uint8Array; + switch (transaction.type) { + case EntityTypeDto.TRANSFER_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedTransferTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.ACCOUNT_LINK_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedAccountLinkTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.HASH_LOCK_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedHashLockTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.SECRET_LOCK_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedSecretLockTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.SECRET_PROOF_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedSecretProofTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.ACCOUNT_METADATA_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedAccountMetadataTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MOSAIC_METADATA_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMosaicMetadataTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.NAMESPACE_METADATA_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedNamespaceMetadataTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MOSAIC_DEFINITION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMosaicDefinitionTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MOSAIC_SUPPLY_CHANGE_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMosaicSupplyChangeTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MULTISIG_ACCOUNT_MODIFICATION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMultisigAccountModificationTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.ADDRESS_ALIAS_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedAddressAliasTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MOSAIC_ALIAS_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMosaicAliasTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.NAMESPACE_REGISTRATION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedNamespaceRegistrationTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.ACCOUNT_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedAccountAddressRestrictionTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.ACCOUNT_MOSAIC_RESTRICTION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedAccountMosaicRestrictionTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.ACCOUNT_OPERATION_RESTRICTION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedAccountOperationRestrictionTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MOSAIC_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMosaicAddressRestrictionTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MOSAIC_GLOBAL_RESTRICTION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMosaicGlobalRestrictionTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + default: + throw new Error(`Transaction type: ${transaction.type} not recognized.`) + } + } + + public static loadFromBinary(bytes: Uint8Array):EmbeddedTransactionBuilder { + const header = EmbeddedTransactionBuilder.loadFromBinary(bytes); + switch (header.getType()) { + case EntityTypeDto.TRANSFER_TRANSACTION_BUILDER: + return EmbeddedTransferTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.ACCOUNT_LINK_TRANSACTION_BUILDER: + return EmbeddedAccountLinkTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.HASH_LOCK_TRANSACTION_BUILDER: + return EmbeddedHashLockTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.SECRET_LOCK_TRANSACTION_BUILDER: + return EmbeddedSecretLockTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.SECRET_PROOF_TRANSACTION_BUILDER: + return EmbeddedSecretProofTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.ACCOUNT_METADATA_TRANSACTION_BUILDER: + return EmbeddedAccountMetadataTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MOSAIC_METADATA_TRANSACTION_BUILDER: + return EmbeddedMosaicMetadataTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.NAMESPACE_METADATA_TRANSACTION_BUILDER: + return EmbeddedNamespaceMetadataTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MOSAIC_DEFINITION_TRANSACTION_BUILDER: + return EmbeddedMosaicDefinitionTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MOSAIC_SUPPLY_CHANGE_TRANSACTION_BUILDER: + return EmbeddedMosaicSupplyChangeTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MULTISIG_ACCOUNT_MODIFICATION_TRANSACTION_BUILDER: + return EmbeddedMultisigAccountModificationTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.ADDRESS_ALIAS_TRANSACTION_BUILDER: + return EmbeddedAddressAliasTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MOSAIC_ALIAS_TRANSACTION_BUILDER: + return EmbeddedMosaicAliasTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.NAMESPACE_REGISTRATION_TRANSACTION_BUILDER: + return EmbeddedNamespaceRegistrationTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.ACCOUNT_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: + return EmbeddedAccountAddressRestrictionTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.ACCOUNT_MOSAIC_RESTRICTION_TRANSACTION_BUILDER: + return EmbeddedAccountMosaicRestrictionTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.ACCOUNT_OPERATION_RESTRICTION_TRANSACTION_BUILDER: + return EmbeddedAccountOperationRestrictionTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MOSAIC_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: + return EmbeddedMosaicAddressRestrictionTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MOSAIC_GLOBAL_RESTRICTION_TRANSACTION_BUILDER: + return EmbeddedMosaicGlobalRestrictionTransactionBuilder.loadFromBinary(bytes) + default: + throw new Error(`Transaction type: ${header.getType()} not recognized.`) + } + } + + public static getEmbeddedTransactionSize(transactions: EmbeddedTransactionBuilder[]): number { + return transactions.map((o) => EmbeddedTransactionHelper.serialize(o).length).reduce((a, b) => a + b, 0); + } +} diff --git a/src/infrastructure/catbuffer/EntityTypeDto.ts b/src/infrastructure/catbuffer/EntityTypeDto.ts index cbbf804d10..4399620a5c 100644 --- a/src/infrastructure/catbuffer/EntityTypeDto.ts +++ b/src/infrastructure/catbuffer/EntityTypeDto.ts @@ -26,4 +26,44 @@ export enum EntityTypeDto { RESERVED = 0, /** Transfer transaction builder. */ TRANSFER_TRANSACTION_BUILDER = 16724, + /** Account link transaction builder. */ + ACCOUNT_LINK_TRANSACTION_BUILDER = 16716, + /** Hash lock transaction builder. */ + HASH_LOCK_TRANSACTION_BUILDER = 16712, + /** Secret lock transaction builder. */ + SECRET_LOCK_TRANSACTION_BUILDER = 16722, + /** Secret proof transaction builder. */ + SECRET_PROOF_TRANSACTION_BUILDER = 16978, + /** Account metadata transaction builder. */ + ACCOUNT_METADATA_TRANSACTION_BUILDER = 16708, + /** Mosaic metadata transaction builder. */ + MOSAIC_METADATA_TRANSACTION_BUILDER = 16964, + /** Namespace metadata transaction builder. */ + NAMESPACE_METADATA_TRANSACTION_BUILDER = 17220, + /** Mosaic definition transaction builder. */ + MOSAIC_DEFINITION_TRANSACTION_BUILDER = 16717, + /** Mosaic supply change transaction builder. */ + MOSAIC_SUPPLY_CHANGE_TRANSACTION_BUILDER = 16973, + /** Multisig account modification transaction builder. */ + MULTISIG_ACCOUNT_MODIFICATION_TRANSACTION_BUILDER = 16725, + /** Address alias transaction builder. */ + ADDRESS_ALIAS_TRANSACTION_BUILDER = 16974, + /** Mosaic alias transaction builder. */ + MOSAIC_ALIAS_TRANSACTION_BUILDER = 17230, + /** Namespace registration transaction builder. */ + NAMESPACE_REGISTRATION_TRANSACTION_BUILDER = 16718, + /** Account address restriction transaction builder. */ + ACCOUNT_ADDRESS_RESTRICTION_TRANSACTION_BUILDER = 16720, + /** Account mosaic restriction transaction builder. */ + ACCOUNT_MOSAIC_RESTRICTION_TRANSACTION_BUILDER = 16976, + /** Account operation restriction transaction builder. */ + ACCOUNT_OPERATION_RESTRICTION_TRANSACTION_BUILDER = 17232, + /** Mosaic address restriction transaction builder. */ + MOSAIC_ADDRESS_RESTRICTION_TRANSACTION_BUILDER = 16977, + /** Mosaic global restriction transaction builder. */ + MOSAIC_GLOBAL_RESTRICTION_TRANSACTION_BUILDER = 16721, + /** Aggregate complete transaction builder. */ + AGGREGATE_COMPLETE_TRANSACTION_BUILDER = 16705, + /** Aggregate bonded transaction builder. */ + AGGREGATE_BONDED_TRANSACTION_BUILDER = 16961, } diff --git a/src/infrastructure/catbuffer/GeneratorUtils.ts b/src/infrastructure/catbuffer/GeneratorUtils.ts index d1c6eb5d9b..74399315e0 100644 --- a/src/infrastructure/catbuffer/GeneratorUtils.ts +++ b/src/infrastructure/catbuffer/GeneratorUtils.ts @@ -145,4 +145,13 @@ export class GeneratorUtils { const bytes = binary.slice(0, size); return bytes; } + + /** + * Gets the padding size that rounds up \a size to the next multiple of \a alignment. + * @param size Inner transaction size + * @param alignment Next multiple alignment + */ + public static getTransactionPaddingSize(size: number, alignment: number): number { + return 0 === size % alignment ? 0 : alignment - (size % alignment); + } } diff --git a/src/infrastructure/catbuffer/InflationReceiptBuilder.ts b/src/infrastructure/catbuffer/InflationReceiptBuilder.ts new file mode 100644 index 0000000000..d9d12527ec --- /dev/null +++ b/src/infrastructure/catbuffer/InflationReceiptBuilder.ts @@ -0,0 +1,92 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { GeneratorUtils } from './GeneratorUtils'; +import { MosaicBuilder } from './MosaicBuilder'; +import { ReceiptBuilder } from './ReceiptBuilder'; +import { ReceiptTypeDto } from './ReceiptTypeDto'; + +/** Binary layout for an inflation receipt. */ +export class InflationReceiptBuilder extends ReceiptBuilder { + /** Mosaic. */ + mosaic: MosaicBuilder; + + /** + * Constructor. + * + * @param version Receipt version. + * @param type Receipt type. + * @param mosaic Mosaic. + */ + public constructor(version: number, type: ReceiptTypeDto, mosaic: MosaicBuilder) { + super(version, type); + this.mosaic = mosaic; + } + + /** + * Creates an instance of InflationReceiptBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of InflationReceiptBuilder. + */ + public static loadFromBinary(payload: Uint8Array): InflationReceiptBuilder { + const byteArray = Array.from(payload); + const superObject = ReceiptBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, superObject.getSize()); + const mosaic = MosaicBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, mosaic.getSize()); + return new InflationReceiptBuilder(superObject.version, superObject.type, mosaic); + } + + /** + * Gets mosaic. + * + * @return Mosaic. + */ + public getMosaic(): MosaicBuilder { + return this.mosaic; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size: number = super.getSize(); + size += this.mosaic.getSize(); + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const superBytes = super.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, superBytes); + const mosaicBytes = this.mosaic.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, mosaicBytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/MosaicExpiryReceiptBuilder.ts b/src/infrastructure/catbuffer/MosaicExpiryReceiptBuilder.ts new file mode 100644 index 0000000000..3940e509e5 --- /dev/null +++ b/src/infrastructure/catbuffer/MosaicExpiryReceiptBuilder.ts @@ -0,0 +1,92 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { GeneratorUtils } from './GeneratorUtils'; +import { MosaicIdDto } from './MosaicIdDto'; +import { ReceiptBuilder } from './ReceiptBuilder'; +import { ReceiptTypeDto } from './ReceiptTypeDto'; + +/** Binary layout for a mosaic expiry receipt. */ +export class MosaicExpiryReceiptBuilder extends ReceiptBuilder { + /** Expiring mosaic id. */ + artifactId: MosaicIdDto; + + /** + * Constructor. + * + * @param version Receipt version. + * @param type Receipt type. + * @param artifactId Expiring mosaic id. + */ + public constructor(version: number, type: ReceiptTypeDto, artifactId: MosaicIdDto) { + super(version, type); + this.artifactId = artifactId; + } + + /** + * Creates an instance of MosaicExpiryReceiptBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of MosaicExpiryReceiptBuilder. + */ + public static loadFromBinary(payload: Uint8Array): MosaicExpiryReceiptBuilder { + const byteArray = Array.from(payload); + const superObject = ReceiptBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, superObject.getSize()); + const artifactId = MosaicIdDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, artifactId.getSize()); + return new MosaicExpiryReceiptBuilder(superObject.version, superObject.type, artifactId); + } + + /** + * Gets expiring mosaic id. + * + * @return Expiring mosaic id. + */ + public getArtifactId(): MosaicIdDto { + return this.artifactId; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size: number = super.getSize(); + size += this.artifactId.getSize(); + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const superBytes = super.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, superBytes); + const artifactIdBytes = this.artifactId.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, artifactIdBytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/NamespaceExpiryReceiptBuilder.ts b/src/infrastructure/catbuffer/NamespaceExpiryReceiptBuilder.ts new file mode 100644 index 0000000000..2573d688a9 --- /dev/null +++ b/src/infrastructure/catbuffer/NamespaceExpiryReceiptBuilder.ts @@ -0,0 +1,92 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { GeneratorUtils } from './GeneratorUtils'; +import { NamespaceIdDto } from './NamespaceIdDto'; +import { ReceiptBuilder } from './ReceiptBuilder'; +import { ReceiptTypeDto } from './ReceiptTypeDto'; + +/** Binary layout for a namespace expiry receipt. */ +export class NamespaceExpiryReceiptBuilder extends ReceiptBuilder { + /** Expiring namespace id. */ + artifactId: NamespaceIdDto; + + /** + * Constructor. + * + * @param version Receipt version. + * @param type Receipt type. + * @param artifactId Expiring namespace id. + */ + public constructor(version: number, type: ReceiptTypeDto, artifactId: NamespaceIdDto) { + super(version, type); + this.artifactId = artifactId; + } + + /** + * Creates an instance of NamespaceExpiryReceiptBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of NamespaceExpiryReceiptBuilder. + */ + public static loadFromBinary(payload: Uint8Array): NamespaceExpiryReceiptBuilder { + const byteArray = Array.from(payload); + const superObject = ReceiptBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, superObject.getSize()); + const artifactId = NamespaceIdDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, artifactId.getSize()); + return new NamespaceExpiryReceiptBuilder(superObject.version, superObject.type, artifactId); + } + + /** + * Gets expiring namespace id. + * + * @return Expiring namespace id. + */ + public getArtifactId(): NamespaceIdDto { + return this.artifactId; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size: number = super.getSize(); + size += this.artifactId.getSize(); + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const superBytes = super.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, superBytes); + const artifactIdBytes = this.artifactId.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, artifactIdBytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/ReceiptBuilder.ts b/src/infrastructure/catbuffer/ReceiptBuilder.ts new file mode 100644 index 0000000000..524bf945df --- /dev/null +++ b/src/infrastructure/catbuffer/ReceiptBuilder.ts @@ -0,0 +1,108 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { GeneratorUtils } from './GeneratorUtils'; +import { ReceiptTypeDto } from './ReceiptTypeDto'; + +/** Binary layout for a receipt entity. */ +export class ReceiptBuilder { + /** Entity size. */ + size = 0; + /** Receipt version. */ + version: number; + /** Receipt type. */ + type: ReceiptTypeDto; + + /** + * Constructor. + * + * @param version Receipt version. + * @param type Receipt type. + */ + public constructor(version: number, type: ReceiptTypeDto) { + this.version = version; + this.type = type; + } + + /** + * Creates an instance of ReceiptBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of ReceiptBuilder. + */ + public static loadFromBinary(payload: Uint8Array): ReceiptBuilder { + const byteArray = Array.from(payload); + const size = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4)); + byteArray.splice(0, 4); + const version = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 2)); + byteArray.splice(0, 2); + const type = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 2)); + byteArray.splice(0, 2); + return new ReceiptBuilder(version, type); + } + + /** + * Gets receipt version. + * + * @return Receipt version. + */ + public getVersion(): number { + return this.version; + } + + /** + * Gets receipt type. + * + * @return Receipt type. + */ + public getType(): ReceiptTypeDto { + return this.type; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size = 0; + size += 4; // size + size += 2; // version + size += 2; // type + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const sizeBytes = GeneratorUtils.uintToBuffer(this.getSize(), 4); + newArray = GeneratorUtils.concatTypedArrays(newArray, sizeBytes); + const versionBytes = GeneratorUtils.uintToBuffer(this.getVersion(), 2); + newArray = GeneratorUtils.concatTypedArrays(newArray, versionBytes); + const typeBytes = GeneratorUtils.uintToBuffer(this.type, 2); + newArray = GeneratorUtils.concatTypedArrays(newArray, typeBytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/ReceiptTypeDto.ts b/src/infrastructure/catbuffer/ReceiptTypeDto.ts new file mode 100644 index 0000000000..f2d4bdc10f --- /dev/null +++ b/src/infrastructure/catbuffer/ReceiptTypeDto.ts @@ -0,0 +1,27 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + + +/** Enumeration of receipt types. */ +export enum ReceiptTypeDto { + /** Reserved receipt type. */ + RESERVED = 0, +} diff --git a/src/model/transaction/AccountAddressRestrictionTransaction.ts b/src/model/transaction/AccountAddressRestrictionTransaction.ts index 66f2b2fafd..d7814ea1dc 100644 --- a/src/model/transaction/AccountAddressRestrictionTransaction.ts +++ b/src/model/transaction/AccountAddressRestrictionTransaction.ts @@ -21,6 +21,7 @@ import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedAccountAddressRestrictionTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedAccountAddressRestrictionTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; import { TimestampDto } from '../../infrastructure/catbuffer/TimestampDto'; @@ -172,10 +173,10 @@ export class AccountAddressRestrictionTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedAccountAddressRestrictionTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedAccountAddressRestrictionTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -188,7 +189,6 @@ export class AccountAddressRestrictionTransaction extends Transaction { return new UnresolvedAddressDto(UnresolvedMapping.toUnresolvedAddressBytes(deletion, this.networkType)); }), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/AccountLinkTransaction.ts b/src/model/transaction/AccountLinkTransaction.ts index 9e6e813de3..2374266254 100644 --- a/src/model/transaction/AccountLinkTransaction.ts +++ b/src/model/transaction/AccountLinkTransaction.ts @@ -18,6 +18,7 @@ import { Convert } from '../../core/format'; import { AccountLinkTransactionBuilder } from '../../infrastructure/catbuffer/AccountLinkTransactionBuilder'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedAccountLinkTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedAccountLinkTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; import { TimestampDto } from '../../infrastructure/catbuffer/TimestampDto'; @@ -150,10 +151,10 @@ export class AccountLinkTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedAccountLinkTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedAccountLinkTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -161,7 +162,6 @@ export class AccountLinkTransaction extends Transaction { new KeyDto(Convert.hexToUint8(this.remotePublicKey)), this.linkAction.valueOf(), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/AccountMetadataTransaction.ts b/src/model/transaction/AccountMetadataTransaction.ts index 78b2009887..d01429d3af 100644 --- a/src/model/transaction/AccountMetadataTransaction.ts +++ b/src/model/transaction/AccountMetadataTransaction.ts @@ -18,6 +18,7 @@ import { Convert } from '../../core/format'; import { AccountMetadataTransactionBuilder } from '../../infrastructure/catbuffer/AccountMetadataTransactionBuilder'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedAccountMetadataTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedAccountMetadataTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; import { TimestampDto } from '../../infrastructure/catbuffer/TimestampDto'; @@ -178,10 +179,10 @@ export class AccountMetadataTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedAccountMetadataTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedAccountMetadataTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -191,7 +192,6 @@ export class AccountMetadataTransaction extends Transaction { this.valueSizeDelta, Convert.utf8ToUint8(this.value), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/AccountMosaicRestrictionTransaction.ts b/src/model/transaction/AccountMosaicRestrictionTransaction.ts index c739b574b8..b8a3f542a5 100644 --- a/src/model/transaction/AccountMosaicRestrictionTransaction.ts +++ b/src/model/transaction/AccountMosaicRestrictionTransaction.ts @@ -21,6 +21,7 @@ import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedAccountMosaicRestrictionTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedAccountMosaicRestrictionTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; import { TimestampDto } from '../../infrastructure/catbuffer/TimestampDto'; @@ -172,10 +173,10 @@ export class AccountMosaicRestrictionTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedAccountMosaicRestrictionTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedAccountMosaicRestrictionTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -188,7 +189,6 @@ export class AccountMosaicRestrictionTransaction extends Transaction { return new UnresolvedMosaicIdDto(deletion.id.toDTO()); }), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/AccountOperationRestrictionTransaction.ts b/src/model/transaction/AccountOperationRestrictionTransaction.ts index 899602794f..1dc508e493 100644 --- a/src/model/transaction/AccountOperationRestrictionTransaction.ts +++ b/src/model/transaction/AccountOperationRestrictionTransaction.ts @@ -22,6 +22,7 @@ import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedAccountOperationRestrictionTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedAccountOperationRestrictionTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; import { TimestampDto } from '../../infrastructure/catbuffer/TimestampDto'; @@ -160,10 +161,10 @@ export class AccountOperationRestrictionTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedAccountOperationRestrictionTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedAccountOperationRestrictionTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -172,7 +173,6 @@ export class AccountOperationRestrictionTransaction extends Transaction { this.restrictionAdditions, this.restrictionDeletions, ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/AddressAliasTransaction.ts b/src/model/transaction/AddressAliasTransaction.ts index 863c1cbae8..2ee1a238ac 100644 --- a/src/model/transaction/AddressAliasTransaction.ts +++ b/src/model/transaction/AddressAliasTransaction.ts @@ -19,6 +19,7 @@ import { AddressAliasTransactionBuilder } from '../../infrastructure/catbuffer/A import { AddressDto } from '../../infrastructure/catbuffer/AddressDto'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedAddressAliasTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedAddressAliasTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { NamespaceIdDto } from '../../infrastructure/catbuffer/NamespaceIdDto'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; @@ -169,10 +170,10 @@ export class AddressAliasTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedAddressAliasTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedAddressAliasTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -181,7 +182,6 @@ export class AddressAliasTransaction extends Transaction { new AddressDto(RawAddress.stringToAddress(this.address.plain())), this.aliasAction.valueOf(), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/AggregateTransaction.ts b/src/model/transaction/AggregateTransaction.ts index a92792e4b5..82680242a5 100644 --- a/src/model/transaction/AggregateTransaction.ts +++ b/src/model/transaction/AggregateTransaction.ts @@ -20,6 +20,8 @@ import {AggregateBondedTransactionBuilder} from '../../infrastructure/catbuffer/ import {AggregateCompleteTransactionBuilder} from '../../infrastructure/catbuffer/AggregateCompleteTransactionBuilder'; import {AmountDto} from '../../infrastructure/catbuffer/AmountDto'; import {CosignatureBuilder} from '../../infrastructure/catbuffer/CosignatureBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; +import { EmbeddedTransactionHelper } from '../../infrastructure/catbuffer/EmbeddedTransactionHelper'; import {GeneratorUtils} from '../../infrastructure/catbuffer/GeneratorUtils'; import { Hash256Dto } from '../../infrastructure/catbuffer/Hash256Dto'; import {KeyDto} from '../../infrastructure/catbuffer/KeyDto'; @@ -139,36 +141,19 @@ export class AggregateTransaction extends Transaction { const builder = type === TransactionType.AGGREGATE_COMPLETE ? AggregateCompleteTransactionBuilder.loadFromBinary(Convert.hexToUint8(payload)) : AggregateBondedTransactionBuilder.loadFromBinary(Convert.hexToUint8(payload)); - const innerTransactionHex = Convert.uint8ToHex(builder.getTransactions()); + const innerTransactions = builder.getTransactions().map((t) => Convert.uint8ToHex(EmbeddedTransactionHelper.serialize(t))); const networkType = builder.getNetwork().valueOf(); - const consignaturesHex = Convert.uint8ToHex(builder.getCosignatures()); - - /** - * Get inner transactions array - */ - const embeddedTransactionArray: string[] = []; - let innerBinary = innerTransactionHex; - while (innerBinary.length) { - const payloadSize = parseInt(Convert.uint8ToHex(Convert.hexToUint8(innerBinary.substring(0, 8)).reverse()), 16) * 2; - const innerTransaction = innerBinary.substring(0, payloadSize); - embeddedTransactionArray.push(innerTransaction); - innerBinary = innerBinary.substring(payloadSize).replace(/\b0+/g, ''); - } - - /** - * Get cosignatures - */ - const consignatureArray = consignaturesHex.match(/.{1,192}/g); - const consignatures = consignatureArray ? consignatureArray.map((cosignature) => - new AggregateTransactionCosignature( - cosignature.substring(64, 192), - PublicAccount.createFromPublicKey(cosignature.substring(0, 64), networkType), - )) : []; + const consignatures = builder.getCosignatures().map((cosig) => { + return new AggregateTransactionCosignature( + Convert.uint8ToHex(cosig.signature.signature), + PublicAccount.createFromPublicKey(Convert.uint8ToHex(cosig.signerPublicKey.key), networkType), + ); + }); return type === TransactionType.AGGREGATE_COMPLETE ? AggregateTransaction.createComplete( Deadline.createFromDTO(builder.deadline.timestamp), - embeddedTransactionArray.map((transactionRaw) => { + innerTransactions.map((transactionRaw) => { return CreateTransactionFromPayload(transactionRaw, true) as InnerTransaction; }), networkType, @@ -176,7 +161,7 @@ export class AggregateTransaction extends Transaction { new UInt64(builder.fee.amount), ) : AggregateTransaction.createBonded( Deadline.createFromDTO(builder.deadline.timestamp), - embeddedTransactionArray.map((transactionRaw) => { + innerTransactions.map((transactionRaw) => { return CreateTransactionFromPayload(transactionRaw, true) as InnerTransaction; }), networkType, @@ -312,23 +297,14 @@ export class AggregateTransaction extends Transaction { protected generateBytes(): Uint8Array { const signerBuffer = new Uint8Array(32); const signatureBuffer = new Uint8Array(64); - let transactions = Uint8Array.from([]); - this.innerTransactions.forEach((transaction) => { - const transactionByte = transaction.toAggregateTransactionBytes(); - const innerTransactionPadding = new Uint8Array(this.getInnerTransactionPaddingSize(transactionByte.length, 8)); - const paddedTransactionByte = GeneratorUtils.concatTypedArrays(transactionByte, innerTransactionPadding); - transactions = GeneratorUtils.concatTypedArrays(transactions, paddedTransactionByte); - }); - - let cosignatures = Uint8Array.from([]); - this.cosignatures.forEach((cosignature) => { + const transactions = this.innerTransactions.map((transaction) => (transaction as Transaction).toEmbeddedTransaction()); + const cosignatures = this.cosignatures.map((cosignature) => { const signerBytes = Convert.hexToUint8(cosignature.signer.publicKey); const signatureBytes = Convert.hexToUint8(cosignature.signature); - const cosignatureBytes = new CosignatureBuilder( + return new CosignatureBuilder( new KeyDto(signerBytes), new SignatureDto(signatureBytes), - ).serialize(); - cosignatures = GeneratorUtils.concatTypedArrays(cosignatures, cosignatureBytes); + ); }); const transactionBuilder = this.type === TransactionType.AGGREGATE_COMPLETE ? @@ -361,9 +337,9 @@ export class AggregateTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { throw new Error('Method not implemented'); } diff --git a/src/model/transaction/LockFundsTransaction.ts b/src/model/transaction/LockFundsTransaction.ts index 4d31fa9d3b..caa200681e 100644 --- a/src/model/transaction/LockFundsTransaction.ts +++ b/src/model/transaction/LockFundsTransaction.ts @@ -18,6 +18,7 @@ import { Convert } from '../../core/format'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { BlockDurationDto } from '../../infrastructure/catbuffer/BlockDurationDto'; import { EmbeddedHashLockTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedHashLockTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { Hash256Dto } from '../../infrastructure/catbuffer/Hash256Dto'; import { HashLockTransactionBuilder } from '../../infrastructure/catbuffer/HashLockTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; @@ -187,10 +188,10 @@ export class LockFundsTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedHashLockTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedHashLockTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -200,7 +201,6 @@ export class LockFundsTransaction extends Transaction { new BlockDurationDto(this.duration.toDTO()), new Hash256Dto(Convert.hexToUint8(this.hash)), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MosaicAddressRestrictionTransaction.ts b/src/model/transaction/MosaicAddressRestrictionTransaction.ts index 7323856186..c2240472cd 100644 --- a/src/model/transaction/MosaicAddressRestrictionTransaction.ts +++ b/src/model/transaction/MosaicAddressRestrictionTransaction.ts @@ -20,6 +20,7 @@ import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMosaicAddressRestrictionTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedMosaicAddressRestrictionTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { MosaicAddressRestrictionTransactionBuilder } from '../../infrastructure/catbuffer/MosaicAddressRestrictionTransactionBuilder'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; @@ -218,10 +219,10 @@ export class MosaicAddressRestrictionTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMosaicAddressRestrictionTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMosaicAddressRestrictionTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -232,7 +233,6 @@ export class MosaicAddressRestrictionTransaction extends Transaction { this.newRestrictionValue.toDTO(), new UnresolvedAddressDto(UnresolvedMapping.toUnresolvedAddressBytes(this.targetAddress, this.networkType)), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MosaicAliasTransaction.ts b/src/model/transaction/MosaicAliasTransaction.ts index f259c5af13..238e8b1fbd 100644 --- a/src/model/transaction/MosaicAliasTransaction.ts +++ b/src/model/transaction/MosaicAliasTransaction.ts @@ -17,6 +17,7 @@ import { Convert } from '../../core/format'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMosaicAliasTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedMosaicAliasTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { MosaicAliasTransactionBuilder } from '../../infrastructure/catbuffer/MosaicAliasTransactionBuilder'; import { MosaicIdDto } from '../../infrastructure/catbuffer/MosaicIdDto'; @@ -164,10 +165,10 @@ export class MosaicAliasTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMosaicAliasTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMosaicAliasTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -176,7 +177,6 @@ export class MosaicAliasTransaction extends Transaction { new MosaicIdDto(this.mosaicId.id.toDTO()), this.aliasAction.valueOf(), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MosaicDefinitionTransaction.ts b/src/model/transaction/MosaicDefinitionTransaction.ts index a43a733825..5b3fe0754b 100644 --- a/src/model/transaction/MosaicDefinitionTransaction.ts +++ b/src/model/transaction/MosaicDefinitionTransaction.ts @@ -18,6 +18,7 @@ import { Convert } from '../../core/format'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { BlockDurationDto } from '../../infrastructure/catbuffer/BlockDurationDto'; import { EmbeddedMosaicDefinitionTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedMosaicDefinitionTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { GeneratorUtils } from '../../infrastructure/catbuffer/GeneratorUtils'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { MosaicDefinitionTransactionBuilder } from '../../infrastructure/catbuffer/MosaicDefinitionTransactionBuilder'; @@ -205,10 +206,10 @@ export class MosaicDefinitionTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMosaicDefinitionTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMosaicDefinitionTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -219,7 +220,6 @@ export class MosaicDefinitionTransaction extends Transaction { this.flags.getValue(), this.divisibility, ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MosaicGlobalRestrictionTransaction.ts b/src/model/transaction/MosaicGlobalRestrictionTransaction.ts index 35ff2de88e..7985c2947c 100644 --- a/src/model/transaction/MosaicGlobalRestrictionTransaction.ts +++ b/src/model/transaction/MosaicGlobalRestrictionTransaction.ts @@ -20,6 +20,7 @@ import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMosaicGlobalRestrictionTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedMosaicGlobalRestrictionTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { MosaicGlobalRestrictionTransactionBuilder } from '../../infrastructure/catbuffer/MosaicGlobalRestrictionTransactionBuilder'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; @@ -226,10 +227,10 @@ export class MosaicGlobalRestrictionTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMosaicGlobalRestrictionTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMosaicGlobalRestrictionTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -242,7 +243,6 @@ export class MosaicGlobalRestrictionTransaction extends Transaction { this.previousRestrictionType.valueOf(), this.newRestrictionType.valueOf(), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MosaicMetadataTransaction.ts b/src/model/transaction/MosaicMetadataTransaction.ts index ce5b5135cf..c491717997 100644 --- a/src/model/transaction/MosaicMetadataTransaction.ts +++ b/src/model/transaction/MosaicMetadataTransaction.ts @@ -18,6 +18,7 @@ import { Convert } from '../../core/format'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMosaicMetadataTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedMosaicMetadataTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { MosaicMetadataTransactionBuilder } from '../../infrastructure/catbuffer/MosaicMetadataTransactionBuilder'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; @@ -194,10 +195,10 @@ export class MosaicMetadataTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMosaicMetadataTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMosaicMetadataTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -208,7 +209,6 @@ export class MosaicMetadataTransaction extends Transaction { this.valueSizeDelta, Convert.utf8ToUint8(this.value), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MosaicSupplyChangeTransaction.ts b/src/model/transaction/MosaicSupplyChangeTransaction.ts index 3e6b2685cb..ca7e404242 100644 --- a/src/model/transaction/MosaicSupplyChangeTransaction.ts +++ b/src/model/transaction/MosaicSupplyChangeTransaction.ts @@ -18,6 +18,7 @@ import { Convert } from '../../core/format'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMosaicSupplyChangeTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedMosaicSupplyChangeTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { MosaicSupplyChangeTransactionBuilder } from '../../infrastructure/catbuffer/MosaicSupplyChangeTransactionBuilder'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; @@ -170,10 +171,10 @@ export class MosaicSupplyChangeTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMosaicSupplyChangeTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMosaicSupplyChangeTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -182,7 +183,6 @@ export class MosaicSupplyChangeTransaction extends Transaction { new AmountDto(this.delta.toDTO()), this.action.valueOf(), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MultisigAccountModificationTransaction.ts b/src/model/transaction/MultisigAccountModificationTransaction.ts index d8a4dc1d77..fcaefd7fcf 100644 --- a/src/model/transaction/MultisigAccountModificationTransaction.ts +++ b/src/model/transaction/MultisigAccountModificationTransaction.ts @@ -19,6 +19,7 @@ import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMultisigAccountModificationTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedMultisigAccountModificationTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import {MultisigAccountModificationTransactionBuilder, } from '../../infrastructure/catbuffer/MultisigAccountModificationTransactionBuilder'; @@ -193,10 +194,10 @@ export class MultisigAccountModificationTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMultisigAccountModificationTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMultisigAccountModificationTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -210,7 +211,6 @@ export class MultisigAccountModificationTransaction extends Transaction { return new KeyDto(Convert.hexToUint8(deletion.publicKey)); }), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/NamespaceMetadataTransaction.ts b/src/model/transaction/NamespaceMetadataTransaction.ts index f58453c268..36e80f13e3 100644 --- a/src/model/transaction/NamespaceMetadataTransaction.ts +++ b/src/model/transaction/NamespaceMetadataTransaction.ts @@ -17,6 +17,7 @@ import { Convert } from '../../core/format'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedNamespaceMetadataTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedNamespaceMetadataTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { NamespaceIdDto } from '../../infrastructure/catbuffer/NamespaceIdDto'; import { NamespaceMetadataTransactionBuilder } from '../../infrastructure/catbuffer/NamespaceMetadataTransactionBuilder'; @@ -192,10 +193,10 @@ export class NamespaceMetadataTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedNamespaceMetadataTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedNamespaceMetadataTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -206,7 +207,6 @@ export class NamespaceMetadataTransaction extends Transaction { this.valueSizeDelta, Convert.utf8ToUint8(this.value), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/NamespaceRegistrationTransaction.ts b/src/model/transaction/NamespaceRegistrationTransaction.ts index 935ee02bc7..cad026814e 100644 --- a/src/model/transaction/NamespaceRegistrationTransaction.ts +++ b/src/model/transaction/NamespaceRegistrationTransaction.ts @@ -20,6 +20,7 @@ import { BlockDurationDto } from '../../infrastructure/catbuffer/BlockDurationDt import { EmbeddedNamespaceRegistrationTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedNamespaceRegistrationTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { NamespaceIdDto } from '../../infrastructure/catbuffer/NamespaceIdDto'; import { NamespaceRegistrationTransactionBuilder } from '../../infrastructure/catbuffer/NamespaceRegistrationTransactionBuilder'; @@ -244,12 +245,11 @@ export class NamespaceRegistrationTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - let transactionBuilder: EmbeddedNamespaceRegistrationTransactionBuilder; + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { if (this.registrationType === NamespaceRegistrationType.RootNamespace) { - transactionBuilder = new EmbeddedNamespaceRegistrationTransactionBuilder( + return new EmbeddedNamespaceRegistrationTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -259,19 +259,17 @@ export class NamespaceRegistrationTransaction extends Transaction { new BlockDurationDto(this.duration!.toDTO()), undefined, ); - } else { - transactionBuilder = new EmbeddedNamespaceRegistrationTransactionBuilder( - new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), - this.versionToDTO(), - this.networkType.valueOf(), - TransactionType.REGISTER_NAMESPACE.valueOf(), - new NamespaceIdDto(this.namespaceId.id.toDTO()), - Convert.hexToUint8(Convert.utf8ToHex(this.namespaceName)), - undefined, - new NamespaceIdDto(this.parentId!.id.toDTO()), - ); } - return transactionBuilder.serialize(); + return new EmbeddedNamespaceRegistrationTransactionBuilder( + new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), + this.versionToDTO(), + this.networkType.valueOf(), + TransactionType.REGISTER_NAMESPACE.valueOf(), + new NamespaceIdDto(this.namespaceId.id.toDTO()), + Convert.hexToUint8(Convert.utf8ToHex(this.namespaceName)), + undefined, + new NamespaceIdDto(this.parentId!.id.toDTO()), + ); } /** diff --git a/src/model/transaction/SecretLockTransaction.ts b/src/model/transaction/SecretLockTransaction.ts index 3606ede7e7..df3ee1c863 100644 --- a/src/model/transaction/SecretLockTransaction.ts +++ b/src/model/transaction/SecretLockTransaction.ts @@ -18,6 +18,7 @@ import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { BlockDurationDto } from '../../infrastructure/catbuffer/BlockDurationDto'; import { EmbeddedSecretLockTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedSecretLockTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { Hash256Dto } from '../../infrastructure/catbuffer/Hash256Dto'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SecretLockTransactionBuilder } from '../../infrastructure/catbuffer/SecretLockTransactionBuilder'; @@ -214,10 +215,10 @@ export class SecretLockTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedSecretLockTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedSecretLockTransactionBuilder( new KeyDto(convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -229,7 +230,6 @@ export class SecretLockTransaction extends Transaction { this.hashType.valueOf(), new UnresolvedAddressDto(UnresolvedMapping.toUnresolvedAddressBytes(this.recipientAddress, this.networkType)), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/SecretProofTransaction.ts b/src/model/transaction/SecretProofTransaction.ts index db890c7ca4..43c00c16c9 100644 --- a/src/model/transaction/SecretProofTransaction.ts +++ b/src/model/transaction/SecretProofTransaction.ts @@ -18,6 +18,7 @@ import { Convert, Convert as convert } from '../../core/format'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedSecretProofTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedSecretProofTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { Hash256Dto } from '../../infrastructure/catbuffer/Hash256Dto'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SecretProofTransactionBuilder } from '../../infrastructure/catbuffer/SecretProofTransactionBuilder'; @@ -193,10 +194,10 @@ export class SecretProofTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedSecretProofTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedSecretProofTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -206,7 +207,6 @@ export class SecretProofTransaction extends Transaction { new UnresolvedAddressDto(UnresolvedMapping.toUnresolvedAddressBytes(this.recipientAddress, this.networkType)), this.getProofByte(), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/Transaction.ts b/src/model/transaction/Transaction.ts index f42edc8415..4830838648 100644 --- a/src/model/transaction/Transaction.ts +++ b/src/model/transaction/Transaction.ts @@ -16,6 +16,8 @@ import { KeyPair, SHA3Hasher, SignSchema } from '../../core/crypto'; import { Convert } from '../../core/format'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; +import { EmbeddedTransactionHelper } from '../../infrastructure/catbuffer/EmbeddedTransactionHelper'; import { SerializeTransactionToJSON } from '../../infrastructure/transaction/SerializeTransactionToJSON'; import { Account } from '../account/Account'; import { PublicAccount } from '../account/PublicAccount'; @@ -184,7 +186,7 @@ export abstract class Transaction { /** * @internal */ - protected abstract generateEmbeddedBytes(): Uint8Array; + public abstract toEmbeddedTransaction(): EmbeddedTransactionBuilder; /** * @internal @@ -286,7 +288,9 @@ export abstract class Transaction { * @return transaction with signer serialized to be part of an aggregate transaction */ public toAggregateTransactionBytes() { - return this.generateEmbeddedBytes(); + return EmbeddedTransactionHelper.serialize( + this.toEmbeddedTransaction(), + ); } /** diff --git a/src/model/transaction/TransferTransaction.ts b/src/model/transaction/TransferTransaction.ts index d858927b9e..4e99bb1d96 100644 --- a/src/model/transaction/TransferTransaction.ts +++ b/src/model/transaction/TransferTransaction.ts @@ -18,6 +18,7 @@ import * as Long from 'long'; import {Convert} from '../../core/format'; import {UnresolvedMapping} from '../../core/utils/UnresolvedMapping'; import {AmountDto} from '../../infrastructure/catbuffer/AmountDto'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import {EmbeddedTransferTransactionBuilder} from '../../infrastructure/catbuffer/EmbeddedTransferTransactionBuilder'; import {GeneratorUtils} from '../../infrastructure/catbuffer/GeneratorUtils'; import {KeyDto} from '../../infrastructure/catbuffer/KeyDto'; @@ -256,10 +257,10 @@ export class TransferTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedTransferTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedTransferTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -271,7 +272,6 @@ export class TransferTransaction extends Transaction { }), this.getMessageBuffer(), ); - return transactionBuilder.serialize(); } /** diff --git a/test/model/transaction/Transaction.spec.ts b/test/model/transaction/Transaction.spec.ts index 0b3eb881b4..04fb2e28b3 100644 --- a/test/model/transaction/Transaction.spec.ts +++ b/test/model/transaction/Transaction.spec.ts @@ -17,6 +17,7 @@ import { expect } from 'chai'; import { Observable } from 'rxjs/internal/Observable'; import { Convert } from '../../../src/core/format/Convert'; +import { EmbeddedTransactionBuilder } from '../../../src/infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { Account } from '../../../src/model/account/Account'; import { Address } from '../../../src/model/account/Address'; import { NetworkType } from '../../../src/model/blockchain/NetworkType'; @@ -400,7 +401,7 @@ class FakeTransaction extends Transaction { throw new Error('Not implemented'); } - protected generateEmbeddedBytes(): Uint8Array { + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { throw new Error('Not implemented'); } resolveAliases(): TransferTransaction { From 62629a0ac40e59e9c66b37da45d8de981bcf2d5e Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Fri, 20 Dec 2019 21:51:06 +0000 Subject: [PATCH 11/18] Fixed missing semicolon --- .../catbuffer/EmbeddedTransactionHelper.ts | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts b/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts index ad436cfc30..9a9c16712f 100644 --- a/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts +++ b/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts @@ -125,7 +125,7 @@ export class EmbeddedTransactionHelper { padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); return GeneratorUtils.concatTypedArrays(byte, padding); default: - throw new Error(`Transaction type: ${transaction.type} not recognized.`) + throw new Error(`Transaction type: ${transaction.type} not recognized.`); } } @@ -133,45 +133,45 @@ export class EmbeddedTransactionHelper { const header = EmbeddedTransactionBuilder.loadFromBinary(bytes); switch (header.getType()) { case EntityTypeDto.TRANSFER_TRANSACTION_BUILDER: - return EmbeddedTransferTransactionBuilder.loadFromBinary(bytes) + return EmbeddedTransferTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.ACCOUNT_LINK_TRANSACTION_BUILDER: - return EmbeddedAccountLinkTransactionBuilder.loadFromBinary(bytes) + return EmbeddedAccountLinkTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.HASH_LOCK_TRANSACTION_BUILDER: - return EmbeddedHashLockTransactionBuilder.loadFromBinary(bytes) + return EmbeddedHashLockTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.SECRET_LOCK_TRANSACTION_BUILDER: - return EmbeddedSecretLockTransactionBuilder.loadFromBinary(bytes) + return EmbeddedSecretLockTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.SECRET_PROOF_TRANSACTION_BUILDER: - return EmbeddedSecretProofTransactionBuilder.loadFromBinary(bytes) + return EmbeddedSecretProofTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.ACCOUNT_METADATA_TRANSACTION_BUILDER: - return EmbeddedAccountMetadataTransactionBuilder.loadFromBinary(bytes) + return EmbeddedAccountMetadataTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MOSAIC_METADATA_TRANSACTION_BUILDER: - return EmbeddedMosaicMetadataTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMosaicMetadataTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.NAMESPACE_METADATA_TRANSACTION_BUILDER: - return EmbeddedNamespaceMetadataTransactionBuilder.loadFromBinary(bytes) + return EmbeddedNamespaceMetadataTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MOSAIC_DEFINITION_TRANSACTION_BUILDER: - return EmbeddedMosaicDefinitionTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMosaicDefinitionTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MOSAIC_SUPPLY_CHANGE_TRANSACTION_BUILDER: - return EmbeddedMosaicSupplyChangeTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMosaicSupplyChangeTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MULTISIG_ACCOUNT_MODIFICATION_TRANSACTION_BUILDER: - return EmbeddedMultisigAccountModificationTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMultisigAccountModificationTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.ADDRESS_ALIAS_TRANSACTION_BUILDER: - return EmbeddedAddressAliasTransactionBuilder.loadFromBinary(bytes) + return EmbeddedAddressAliasTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MOSAIC_ALIAS_TRANSACTION_BUILDER: - return EmbeddedMosaicAliasTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMosaicAliasTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.NAMESPACE_REGISTRATION_TRANSACTION_BUILDER: - return EmbeddedNamespaceRegistrationTransactionBuilder.loadFromBinary(bytes) + return EmbeddedNamespaceRegistrationTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.ACCOUNT_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: - return EmbeddedAccountAddressRestrictionTransactionBuilder.loadFromBinary(bytes) + return EmbeddedAccountAddressRestrictionTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.ACCOUNT_MOSAIC_RESTRICTION_TRANSACTION_BUILDER: - return EmbeddedAccountMosaicRestrictionTransactionBuilder.loadFromBinary(bytes) + return EmbeddedAccountMosaicRestrictionTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.ACCOUNT_OPERATION_RESTRICTION_TRANSACTION_BUILDER: - return EmbeddedAccountOperationRestrictionTransactionBuilder.loadFromBinary(bytes) + return EmbeddedAccountOperationRestrictionTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MOSAIC_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: - return EmbeddedMosaicAddressRestrictionTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMosaicAddressRestrictionTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MOSAIC_GLOBAL_RESTRICTION_TRANSACTION_BUILDER: - return EmbeddedMosaicGlobalRestrictionTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMosaicGlobalRestrictionTransactionBuilder.loadFromBinary(bytes); default: - throw new Error(`Transaction type: ${header.getType()} not recognized.`) + throw new Error(`Transaction type: ${header.getType()} not recognized.`); } } From 127124d776e4242aa7362e6346f7b0659fb66bd3 Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Sun, 22 Dec 2019 14:50:41 +0000 Subject: [PATCH 12/18] Applied catbuffer on receipt --- .../catbuffer/ReceiptBuilder.ts | 2 -- src/model/receipt/ArtifactExpiryReceipt.ts | 18 ++++++++------- src/model/receipt/BalanceChangeReceipt.ts | 17 +++++++------- src/model/receipt/BalanceTransferReceipt.ts | 23 ++++++++++--------- src/model/receipt/InflationReceipt.ts | 16 ++++++------- 5 files changed, 39 insertions(+), 37 deletions(-) diff --git a/src/infrastructure/catbuffer/ReceiptBuilder.ts b/src/infrastructure/catbuffer/ReceiptBuilder.ts index 524bf945df..ffe39705cb 100644 --- a/src/infrastructure/catbuffer/ReceiptBuilder.ts +++ b/src/infrastructure/catbuffer/ReceiptBuilder.ts @@ -97,8 +97,6 @@ export class ReceiptBuilder { */ public serialize(): Uint8Array { let newArray = Uint8Array.from([]); - const sizeBytes = GeneratorUtils.uintToBuffer(this.getSize(), 4); - newArray = GeneratorUtils.concatTypedArrays(newArray, sizeBytes); const versionBytes = GeneratorUtils.uintToBuffer(this.getVersion(), 2); newArray = GeneratorUtils.concatTypedArrays(newArray, versionBytes); const typeBytes = GeneratorUtils.uintToBuffer(this.type, 2); diff --git a/src/model/receipt/ArtifactExpiryReceipt.ts b/src/model/receipt/ArtifactExpiryReceipt.ts index 8df5aab72a..a8a14178e4 100644 --- a/src/model/receipt/ArtifactExpiryReceipt.ts +++ b/src/model/receipt/ArtifactExpiryReceipt.ts @@ -14,11 +14,12 @@ * limitations under the License. */ -import { Convert } from '../../core/format/Convert'; -import { GeneratorUtils } from '../../infrastructure/catbuffer/GeneratorUtils'; +import { MosaicExpiryReceiptBuilder } from '../../infrastructure/catbuffer/MosaicExpiryReceiptBuilder'; +import { MosaicIdDto } from '../../infrastructure/catbuffer/MosaicIdDto'; +import { NamespaceExpiryReceiptBuilder } from '../../infrastructure/catbuffer/NamespaceExpiryReceiptBuilder'; +import { NamespaceIdDto } from '../../infrastructure/catbuffer/NamespaceIdDto'; import { MosaicId } from '../mosaic/MosaicId'; import { NamespaceId } from '../namespace/NamespaceId'; -import { UInt64 } from '../UInt64'; import { Receipt } from './Receipt'; import { ReceiptType } from './ReceiptType'; import { ReceiptVersion } from './ReceiptVersion'; @@ -48,10 +49,11 @@ export class ArtifactExpiryReceipt extends Receipt { * @return {Uint8Array} */ public serialize(): Uint8Array { - const buffer = new Uint8Array(12); - buffer.set(GeneratorUtils.uintToBuffer(ReceiptVersion.ARTIFACT_EXPIRY, 2)); - buffer.set(GeneratorUtils.uintToBuffer(this.type, 2), 2); - buffer.set(GeneratorUtils.uint64ToBuffer(UInt64.fromHex(this.artifactId.toHex()).toDTO()), 4); - return buffer; + if (this.artifactId instanceof MosaicId) { + return new MosaicExpiryReceiptBuilder(ReceiptVersion.ARTIFACT_EXPIRY, this.type.valueOf(), + new MosaicIdDto(this.artifactId.toDTO())).serialize(); + } + return new NamespaceExpiryReceiptBuilder(ReceiptVersion.ARTIFACT_EXPIRY, this.type.valueOf(), + new NamespaceIdDto(this.artifactId.id.toDTO())).serialize(); } } diff --git a/src/model/receipt/BalanceChangeReceipt.ts b/src/model/receipt/BalanceChangeReceipt.ts index 83159b621c..7c11b72690 100644 --- a/src/model/receipt/BalanceChangeReceipt.ts +++ b/src/model/receipt/BalanceChangeReceipt.ts @@ -15,7 +15,11 @@ */ import { Convert } from '../../core/format/Convert'; -import { GeneratorUtils } from '../../infrastructure/catbuffer/GeneratorUtils'; +import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; +import { BalanceChangeReceiptBuilder } from '../../infrastructure/catbuffer/BalanceChangeReceiptBuilder'; +import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; +import { MosaicBuilder } from '../../infrastructure/catbuffer/MosaicBuilder'; +import { MosaicIdDto } from '../../infrastructure/catbuffer/MosaicIdDto'; import { PublicAccount } from '../account/PublicAccount'; import { MosaicId } from '../mosaic/MosaicId'; import { UInt64 } from '../UInt64'; @@ -62,12 +66,9 @@ export class BalanceChangeReceipt extends Receipt { * @return {Uint8Array} */ public serialize(): Uint8Array { - const buffer = new Uint8Array(52); - buffer.set(GeneratorUtils.uintToBuffer(ReceiptVersion.BALANCE_CHANGE, 2)); - buffer.set(GeneratorUtils.uintToBuffer(this.type, 2), 2); - buffer.set(GeneratorUtils.uint64ToBuffer(UInt64.fromHex(this.mosaicId.toHex()).toDTO()), 4); - buffer.set(GeneratorUtils.uint64ToBuffer(UInt64.fromHex(this.amount.toHex()).toDTO()), 12); - buffer.set(Convert.hexToUint8(this.targetPublicAccount.publicKey), 20); - return buffer; + return new BalanceChangeReceiptBuilder(ReceiptVersion.BALANCE_CHANGE, this.type.valueOf(), + new MosaicBuilder(new MosaicIdDto(this.mosaicId.toDTO()), new AmountDto(this.amount.toDTO())), + new KeyDto(Convert.hexToUint8(this.targetPublicAccount.publicKey)), + ).serialize(); } } diff --git a/src/model/receipt/BalanceTransferReceipt.ts b/src/model/receipt/BalanceTransferReceipt.ts index 1442fe3e82..4b11cc53f0 100644 --- a/src/model/receipt/BalanceTransferReceipt.ts +++ b/src/model/receipt/BalanceTransferReceipt.ts @@ -15,8 +15,13 @@ */ import { Convert } from '../../core/format/Convert'; -import { UnresolvedMapping } from "../../core/utils/UnresolvedMapping"; -import { GeneratorUtils } from '../../infrastructure/catbuffer/GeneratorUtils'; +import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; +import { AddressDto } from '../../infrastructure/catbuffer/AddressDto'; +import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; +import { BalanceTransferReceiptBuilder } from '../../infrastructure/catbuffer/BalanceTransferReceiptBuilder'; +import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; +import { MosaicBuilder } from '../../infrastructure/catbuffer/MosaicBuilder'; +import { MosaicIdDto } from '../../infrastructure/catbuffer/MosaicIdDto'; import { Address } from '../account/Address'; import { PublicAccount } from '../account/PublicAccount'; import { MosaicId } from '../mosaic/MosaicId'; @@ -70,15 +75,11 @@ export class BalanceTransferReceipt extends Receipt { * @return {Uint8Array} */ public serialize(): Uint8Array { - const recipient = this.getRecipientBytes(); - const buffer = new Uint8Array(52 + recipient.length); - buffer.set(GeneratorUtils.uintToBuffer(ReceiptVersion.BALANCE_TRANSFER, 2)); - buffer.set(GeneratorUtils.uintToBuffer(this.type, 2), 2); - buffer.set(GeneratorUtils.uint64ToBuffer(UInt64.fromHex(this.mosaicId.toHex()).toDTO()), 4); - buffer.set(GeneratorUtils.uint64ToBuffer(UInt64.fromHex(this.amount.toHex()).toDTO()), 12); - buffer.set(Convert.hexToUint8(this.sender.publicKey), 20); - buffer.set(recipient, 52); - return buffer; + return new BalanceTransferReceiptBuilder(ReceiptVersion.BALANCE_TRANSFER, this.type.valueOf(), + new MosaicBuilder(new MosaicIdDto(this.mosaicId.toDTO()), new AmountDto(this.amount.toDTO())), + new KeyDto(Convert.hexToUint8(this.sender.publicKey)), + new AddressDto(this.getRecipientBytes()), + ).serialize(); } /** diff --git a/src/model/receipt/InflationReceipt.ts b/src/model/receipt/InflationReceipt.ts index 4007cd2200..f9e217043d 100644 --- a/src/model/receipt/InflationReceipt.ts +++ b/src/model/receipt/InflationReceipt.ts @@ -14,8 +14,10 @@ * limitations under the License. */ -import { Convert } from '../../core/format/Convert'; -import { GeneratorUtils } from '../../infrastructure/catbuffer/GeneratorUtils'; +import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; +import { InflationReceiptBuilder } from '../../infrastructure/catbuffer/InflationReceiptBuilder'; +import { MosaicBuilder } from '../../infrastructure/catbuffer/MosaicBuilder'; +import { MosaicIdDto } from '../../infrastructure/catbuffer/MosaicIdDto'; import { MosaicId } from '../mosaic/MosaicId'; import { UInt64 } from '../UInt64'; import { Receipt } from './Receipt'; @@ -56,11 +58,9 @@ export class InflationReceipt extends Receipt { * @return {Uint8Array} */ public serialize(): Uint8Array { - const buffer = new Uint8Array(20); - buffer.set(GeneratorUtils.uintToBuffer(ReceiptVersion.INFLATION_RECEIPT, 2)); - buffer.set(GeneratorUtils.uintToBuffer(this.type, 2), 2); - buffer.set(GeneratorUtils.uint64ToBuffer(UInt64.fromHex(this.mosaicId.toHex()).toDTO()), 4); - buffer.set(GeneratorUtils.uint64ToBuffer(UInt64.fromHex(this.amount.toHex()).toDTO()), 12); - return buffer; + return new InflationReceiptBuilder( + ReceiptVersion.INFLATION_RECEIPT, this.type.valueOf(), + new MosaicBuilder(new MosaicIdDto(this.mosaicId.toDTO()), new AmountDto(this.amount.toDTO())), + ).serialize(); } } From 57ac6c3f8ab28e99da9288852462a6a75181765a Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Sun, 22 Dec 2019 15:35:36 +0000 Subject: [PATCH 13/18] Fixed semicolom in import --- .../catbuffer/EmbeddedTransactionHelper.ts | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts b/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts index 9a9c16712f..f6c2bab694 100644 --- a/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts +++ b/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts @@ -19,28 +19,28 @@ *** along with Catapult. If not, see . **/ -import { EntityTypeDto } from './EntityTypeDto' -import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder' -import { GeneratorUtils } from './GeneratorUtils' -import { EmbeddedTransferTransactionBuilder } from './EmbeddedTransferTransactionBuilder' -import { EmbeddedAccountLinkTransactionBuilder } from './EmbeddedAccountLinkTransactionBuilder' -import { EmbeddedHashLockTransactionBuilder } from './EmbeddedHashLockTransactionBuilder' -import { EmbeddedSecretLockTransactionBuilder } from './EmbeddedSecretLockTransactionBuilder' -import { EmbeddedSecretProofTransactionBuilder } from './EmbeddedSecretProofTransactionBuilder' -import { EmbeddedAccountMetadataTransactionBuilder } from './EmbeddedAccountMetadataTransactionBuilder' -import { EmbeddedMosaicMetadataTransactionBuilder } from './EmbeddedMosaicMetadataTransactionBuilder' -import { EmbeddedNamespaceMetadataTransactionBuilder } from './EmbeddedNamespaceMetadataTransactionBuilder' -import { EmbeddedMosaicDefinitionTransactionBuilder } from './EmbeddedMosaicDefinitionTransactionBuilder' -import { EmbeddedMosaicSupplyChangeTransactionBuilder } from './EmbeddedMosaicSupplyChangeTransactionBuilder' -import { EmbeddedMultisigAccountModificationTransactionBuilder } from './EmbeddedMultisigAccountModificationTransactionBuilder' -import { EmbeddedAddressAliasTransactionBuilder } from './EmbeddedAddressAliasTransactionBuilder' -import { EmbeddedMosaicAliasTransactionBuilder } from './EmbeddedMosaicAliasTransactionBuilder' -import { EmbeddedNamespaceRegistrationTransactionBuilder } from './EmbeddedNamespaceRegistrationTransactionBuilder' -import { EmbeddedAccountAddressRestrictionTransactionBuilder } from './EmbeddedAccountAddressRestrictionTransactionBuilder' -import { EmbeddedAccountMosaicRestrictionTransactionBuilder } from './EmbeddedAccountMosaicRestrictionTransactionBuilder' -import { EmbeddedAccountOperationRestrictionTransactionBuilder } from './EmbeddedAccountOperationRestrictionTransactionBuilder' -import { EmbeddedMosaicAddressRestrictionTransactionBuilder } from './EmbeddedMosaicAddressRestrictionTransactionBuilder' -import { EmbeddedMosaicGlobalRestrictionTransactionBuilder } from './EmbeddedMosaicGlobalRestrictionTransactionBuilder' +import { EntityTypeDto } from './EntityTypeDto'; +import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder'; +import { GeneratorUtils } from './GeneratorUtils'; +import { EmbeddedTransferTransactionBuilder } from './EmbeddedTransferTransactionBuilder'; +import { EmbeddedAccountLinkTransactionBuilder } from './EmbeddedAccountLinkTransactionBuilder'; +import { EmbeddedHashLockTransactionBuilder } from './EmbeddedHashLockTransactionBuilder'; +import { EmbeddedSecretLockTransactionBuilder } from './EmbeddedSecretLockTransactionBuilder'; +import { EmbeddedSecretProofTransactionBuilder } from './EmbeddedSecretProofTransactionBuilder'; +import { EmbeddedAccountMetadataTransactionBuilder } from './EmbeddedAccountMetadataTransactionBuilder'; +import { EmbeddedMosaicMetadataTransactionBuilder } from './EmbeddedMosaicMetadataTransactionBuilder'; +import { EmbeddedNamespaceMetadataTransactionBuilder } from './EmbeddedNamespaceMetadataTransactionBuilder'; +import { EmbeddedMosaicDefinitionTransactionBuilder } from './EmbeddedMosaicDefinitionTransactionBuilder'; +import { EmbeddedMosaicSupplyChangeTransactionBuilder } from './EmbeddedMosaicSupplyChangeTransactionBuilder'; +import { EmbeddedMultisigAccountModificationTransactionBuilder } from './EmbeddedMultisigAccountModificationTransactionBuilder'; +import { EmbeddedAddressAliasTransactionBuilder } from './EmbeddedAddressAliasTransactionBuilder'; +import { EmbeddedMosaicAliasTransactionBuilder } from './EmbeddedMosaicAliasTransactionBuilder'; +import { EmbeddedNamespaceRegistrationTransactionBuilder } from './EmbeddedNamespaceRegistrationTransactionBuilder'; +import { EmbeddedAccountAddressRestrictionTransactionBuilder } from './EmbeddedAccountAddressRestrictionTransactionBuilder'; +import { EmbeddedAccountMosaicRestrictionTransactionBuilder } from './EmbeddedAccountMosaicRestrictionTransactionBuilder'; +import { EmbeddedAccountOperationRestrictionTransactionBuilder } from './EmbeddedAccountOperationRestrictionTransactionBuilder'; +import { EmbeddedMosaicAddressRestrictionTransactionBuilder } from './EmbeddedMosaicAddressRestrictionTransactionBuilder'; +import { EmbeddedMosaicGlobalRestrictionTransactionBuilder } from './EmbeddedMosaicGlobalRestrictionTransactionBuilder'; export class EmbeddedTransactionHelper { From ab5a537dff8664abfea92958971230d45eb04f6e Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Fri, 20 Dec 2019 21:27:50 +0000 Subject: [PATCH 14/18] Fixed #393 applied catbuffer generator on aggregate --- .../AggregateBondedTransactionBuilder.ts | 8 +- .../AggregateCompleteTransactionBuilder.ts | 8 +- .../AggregateTransactionBodyBuilder.ts | 52 ++- .../catbuffer/BalanceChangeReceiptBuilder.ts | 111 +++++ .../BalanceTransferReceiptBuilder.ts | 132 ++++++ .../catbuffer/BlockHeaderBuilder.ts | 387 ++++++++++++++++++ .../catbuffer/EmbeddedTransactionHelper.ts | 181 ++++++++ src/infrastructure/catbuffer/EntityTypeDto.ts | 40 ++ .../catbuffer/GeneratorUtils.ts | 9 + .../catbuffer/InflationReceiptBuilder.ts | 92 +++++ .../catbuffer/MosaicExpiryReceiptBuilder.ts | 92 +++++ .../NamespaceExpiryReceiptBuilder.ts | 92 +++++ .../catbuffer/ReceiptBuilder.ts | 108 +++++ .../catbuffer/ReceiptTypeDto.ts | 27 ++ .../AccountAddressRestrictionTransaction.ts | 8 +- .../transaction/AccountLinkTransaction.ts | 8 +- .../transaction/AccountMetadataTransaction.ts | 8 +- .../AccountMosaicRestrictionTransaction.ts | 8 +- .../AccountOperationRestrictionTransaction.ts | 8 +- .../transaction/AddressAliasTransaction.ts | 8 +- src/model/transaction/AggregateTransaction.ts | 58 +-- src/model/transaction/LockFundsTransaction.ts | 8 +- .../MosaicAddressRestrictionTransaction.ts | 8 +- .../transaction/MosaicAliasTransaction.ts | 8 +- .../MosaicDefinitionTransaction.ts | 8 +- .../MosaicGlobalRestrictionTransaction.ts | 8 +- .../transaction/MosaicMetadataTransaction.ts | 8 +- .../MosaicSupplyChangeTransaction.ts | 8 +- .../MultisigAccountModificationTransaction.ts | 8 +- .../NamespaceMetadataTransaction.ts | 8 +- .../NamespaceRegistrationTransaction.ts | 30 +- .../transaction/SecretLockTransaction.ts | 8 +- .../transaction/SecretProofTransaction.ts | 8 +- src/model/transaction/Transaction.ts | 8 +- src/model/transaction/TransferTransaction.ts | 8 +- test/model/transaction/Transaction.spec.ts | 3 +- 36 files changed, 1431 insertions(+), 151 deletions(-) create mode 100644 src/infrastructure/catbuffer/BalanceChangeReceiptBuilder.ts create mode 100644 src/infrastructure/catbuffer/BalanceTransferReceiptBuilder.ts create mode 100644 src/infrastructure/catbuffer/BlockHeaderBuilder.ts create mode 100644 src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts create mode 100644 src/infrastructure/catbuffer/InflationReceiptBuilder.ts create mode 100644 src/infrastructure/catbuffer/MosaicExpiryReceiptBuilder.ts create mode 100644 src/infrastructure/catbuffer/NamespaceExpiryReceiptBuilder.ts create mode 100644 src/infrastructure/catbuffer/ReceiptBuilder.ts create mode 100644 src/infrastructure/catbuffer/ReceiptTypeDto.ts diff --git a/src/infrastructure/catbuffer/AggregateBondedTransactionBuilder.ts b/src/infrastructure/catbuffer/AggregateBondedTransactionBuilder.ts index 56f42da250..ba3b56b75f 100644 --- a/src/infrastructure/catbuffer/AggregateBondedTransactionBuilder.ts +++ b/src/infrastructure/catbuffer/AggregateBondedTransactionBuilder.ts @@ -21,6 +21,8 @@ import { AggregateTransactionBodyBuilder } from './AggregateTransactionBodyBuilder'; import { AmountDto } from './AmountDto'; +import { CosignatureBuilder } from './CosignatureBuilder'; +import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder'; import { EntityTypeDto } from './EntityTypeDto'; import { GeneratorUtils } from './GeneratorUtils'; import { Hash256Dto } from './Hash256Dto'; @@ -50,7 +52,7 @@ export class AggregateBondedTransactionBuilder extends TransactionBuilder { * @param cosignatures Cosignatures data (fills remaining body space after transactions). */ // tslint:disable-next-line: max-line-length - public constructor(signature: SignatureDto, signerPublicKey: KeyDto, version: number, network: NetworkTypeDto, type: EntityTypeDto, fee: AmountDto, deadline: TimestampDto, transactionsHash: Hash256Dto, transactions: Uint8Array, cosignatures: Uint8Array) { + public constructor(signature: SignatureDto, signerPublicKey: KeyDto, version: number, network: NetworkTypeDto, type: EntityTypeDto, fee: AmountDto, deadline: TimestampDto, transactionsHash: Hash256Dto, transactions: EmbeddedTransactionBuilder[], cosignatures: CosignatureBuilder[]) { super(signature, signerPublicKey, version, network, type, fee, deadline); this.aggregateTransactionBody = new AggregateTransactionBodyBuilder(transactionsHash, transactions, cosignatures); } @@ -94,7 +96,7 @@ export class AggregateBondedTransactionBuilder extends TransactionBuilder { * * @return Sub-transaction data (transactions are variable sized and payload size is in bytes). */ - public getTransactions(): Uint8Array { + public getTransactions(): EmbeddedTransactionBuilder[] { return this.aggregateTransactionBody.getTransactions(); } @@ -103,7 +105,7 @@ export class AggregateBondedTransactionBuilder extends TransactionBuilder { * * @return Cosignatures data (fills remaining body space after transactions). */ - public getCosignatures(): Uint8Array { + public getCosignatures(): CosignatureBuilder[] { return this.aggregateTransactionBody.getCosignatures(); } diff --git a/src/infrastructure/catbuffer/AggregateCompleteTransactionBuilder.ts b/src/infrastructure/catbuffer/AggregateCompleteTransactionBuilder.ts index 6dd372648f..f6b6e0983e 100644 --- a/src/infrastructure/catbuffer/AggregateCompleteTransactionBuilder.ts +++ b/src/infrastructure/catbuffer/AggregateCompleteTransactionBuilder.ts @@ -21,6 +21,8 @@ import { AggregateTransactionBodyBuilder } from './AggregateTransactionBodyBuilder'; import { AmountDto } from './AmountDto'; +import { CosignatureBuilder } from './CosignatureBuilder'; +import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder'; import { EntityTypeDto } from './EntityTypeDto'; import { GeneratorUtils } from './GeneratorUtils'; import { Hash256Dto } from './Hash256Dto'; @@ -50,7 +52,7 @@ export class AggregateCompleteTransactionBuilder extends TransactionBuilder { * @param cosignatures Cosignatures data (fills remaining body space after transactions). */ // tslint:disable-next-line: max-line-length - public constructor(signature: SignatureDto, signerPublicKey: KeyDto, version: number, network: NetworkTypeDto, type: EntityTypeDto, fee: AmountDto, deadline: TimestampDto, transactionsHash: Hash256Dto, transactions: Uint8Array, cosignatures: Uint8Array) { + public constructor(signature: SignatureDto, signerPublicKey: KeyDto, version: number, network: NetworkTypeDto, type: EntityTypeDto, fee: AmountDto, deadline: TimestampDto, transactionsHash: Hash256Dto, transactions: EmbeddedTransactionBuilder[], cosignatures: CosignatureBuilder[]) { super(signature, signerPublicKey, version, network, type, fee, deadline); this.aggregateTransactionBody = new AggregateTransactionBodyBuilder(transactionsHash, transactions, cosignatures); } @@ -94,7 +96,7 @@ export class AggregateCompleteTransactionBuilder extends TransactionBuilder { * * @return Sub-transaction data (transactions are variable sized and payload size is in bytes). */ - public getTransactions(): Uint8Array { + public getTransactions(): EmbeddedTransactionBuilder[] { return this.aggregateTransactionBody.getTransactions(); } @@ -103,7 +105,7 @@ export class AggregateCompleteTransactionBuilder extends TransactionBuilder { * * @return Cosignatures data (fills remaining body space after transactions). */ - public getCosignatures(): Uint8Array { + public getCosignatures(): CosignatureBuilder[] { return this.aggregateTransactionBody.getCosignatures(); } diff --git a/src/infrastructure/catbuffer/AggregateTransactionBodyBuilder.ts b/src/infrastructure/catbuffer/AggregateTransactionBodyBuilder.ts index b4de916720..5dd2492e47 100644 --- a/src/infrastructure/catbuffer/AggregateTransactionBodyBuilder.ts +++ b/src/infrastructure/catbuffer/AggregateTransactionBodyBuilder.ts @@ -19,6 +19,9 @@ *** along with Catapult. If not, see . **/ +import { CosignatureBuilder } from './CosignatureBuilder'; +import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder'; +import { EmbeddedTransactionHelper } from './EmbeddedTransactionHelper'; import { GeneratorUtils } from './GeneratorUtils'; import { Hash256Dto } from './Hash256Dto'; @@ -29,9 +32,9 @@ export class AggregateTransactionBodyBuilder { /** Reserved padding to align end of AggregateTransactionHeader on 8-byte boundary. */ aggregateTransactionHeader_Reserved1: number; /** Sub-transaction data (transactions are variable sized and payload size is in bytes). */ - transactions: Uint8Array; + transactions: EmbeddedTransactionBuilder[]; /** Cosignatures data (fills remaining body space after transactions). */ - cosignatures: Uint8Array; + cosignatures: CosignatureBuilder[]; /** * Constructor. @@ -40,7 +43,8 @@ export class AggregateTransactionBodyBuilder { * @param transactions Sub-transaction data (transactions are variable sized and payload size is in bytes). * @param cosignatures Cosignatures data (fills remaining body space after transactions). */ - public constructor(transactionsHash: Hash256Dto, transactions: Uint8Array, cosignatures: Uint8Array) { + // tslint:disable-next-line: max-line-length + public constructor(transactionsHash: Hash256Dto, transactions: EmbeddedTransactionBuilder[], cosignatures: CosignatureBuilder[]) { this.transactionsHash = transactionsHash; this.aggregateTransactionHeader_Reserved1 = 0; this.transactions = transactions; @@ -62,9 +66,24 @@ export class AggregateTransactionBodyBuilder { // tslint:disable-next-line: max-line-length const aggregateTransactionHeader_Reserved1 = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4)); byteArray.splice(0, 4); - const transactions = GeneratorUtils.getBytes(Uint8Array.from(byteArray), payloadSize); - byteArray.splice(0, payloadSize); - const cosignatures = Uint8Array.from(byteArray); + let transactionsByteSize = payloadSize; + const transactions: EmbeddedTransactionBuilder[] = []; + while (transactionsByteSize > 0) { + const item = EmbeddedTransactionHelper.loadFromBinary(Uint8Array.from(byteArray)); + transactions.push(item); + const itemSize = item.getSize() + GeneratorUtils.getTransactionPaddingSize(item.getSize(), 8); + transactionsByteSize -= itemSize; + byteArray.splice(0, itemSize); + } + let cosignaturesByteSize = byteArray.length; + const cosignatures: CosignatureBuilder[] = []; + while (cosignaturesByteSize > 0) { + const item = CosignatureBuilder.loadFromBinary(Uint8Array.from(byteArray)); + cosignatures.push(item); + const itemSize = item.getSize(); + cosignaturesByteSize -= itemSize; + byteArray.splice(0, itemSize); + } return new AggregateTransactionBodyBuilder(transactionsHash, transactions, cosignatures); } @@ -91,7 +110,7 @@ export class AggregateTransactionBodyBuilder { * * @return Sub-transaction data (transactions are variable sized and payload size is in bytes). */ - public getTransactions(): Uint8Array { + public getTransactions(): EmbeddedTransactionBuilder[] { return this.transactions; } @@ -100,7 +119,7 @@ export class AggregateTransactionBodyBuilder { * * @return Cosignatures data (fills remaining body space after transactions). */ - public getCosignatures(): Uint8Array { + public getCosignatures(): CosignatureBuilder[] { return this.cosignatures; } @@ -114,8 +133,8 @@ export class AggregateTransactionBodyBuilder { size += this.transactionsHash.getSize(); size += 4; // payloadSize size += 4; // aggregateTransactionHeader_Reserved1 - size += this.transactions.length; - size += this.cosignatures.length; + this.transactions.forEach((o) => size += EmbeddedTransactionHelper.serialize(o).length); + this.cosignatures.forEach((o) => size += o.getSize()); return size; } @@ -128,13 +147,20 @@ export class AggregateTransactionBodyBuilder { let newArray = Uint8Array.from([]); const transactionsHashBytes = this.transactionsHash.serialize(); newArray = GeneratorUtils.concatTypedArrays(newArray, transactionsHashBytes); - const payloadSizeBytes = GeneratorUtils.uintToBuffer(this.transactions.length, 4); + // tslint:disable-next-line: max-line-length + const payloadSizeBytes = GeneratorUtils.uintToBuffer(EmbeddedTransactionHelper.getEmbeddedTransactionSize(this.transactions), 4); newArray = GeneratorUtils.concatTypedArrays(newArray, payloadSizeBytes); // tslint:disable-next-line: max-line-length const aggregateTransactionHeader_Reserved1Bytes = GeneratorUtils.uintToBuffer(this.getAggregateTransactionHeader_Reserved1(), 4); newArray = GeneratorUtils.concatTypedArrays(newArray, aggregateTransactionHeader_Reserved1Bytes); - newArray = GeneratorUtils.concatTypedArrays(newArray, this.transactions); - newArray = GeneratorUtils.concatTypedArrays(newArray, this.cosignatures); + this.transactions.forEach((item) => { + const transactionsBytes = EmbeddedTransactionHelper.serialize(item); + newArray = GeneratorUtils.concatTypedArrays(newArray, transactionsBytes); + }); + this.cosignatures.forEach((item) => { + const cosignaturesBytes = item.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, cosignaturesBytes); + }); return newArray; } } diff --git a/src/infrastructure/catbuffer/BalanceChangeReceiptBuilder.ts b/src/infrastructure/catbuffer/BalanceChangeReceiptBuilder.ts new file mode 100644 index 0000000000..7670f20e0f --- /dev/null +++ b/src/infrastructure/catbuffer/BalanceChangeReceiptBuilder.ts @@ -0,0 +1,111 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { GeneratorUtils } from './GeneratorUtils'; +import { KeyDto } from './KeyDto'; +import { MosaicBuilder } from './MosaicBuilder'; +import { ReceiptBuilder } from './ReceiptBuilder'; +import { ReceiptTypeDto } from './ReceiptTypeDto'; + +/** Binary layout for a balance change receipt. */ +export class BalanceChangeReceiptBuilder extends ReceiptBuilder { + /** Mosaic. */ + mosaic: MosaicBuilder; + /** Account public key. */ + targetPublicKey: KeyDto; + + /** + * Constructor. + * + * @param version Receipt version. + * @param type Receipt type. + * @param mosaic Mosaic. + * @param targetPublicKey Account public key. + */ + public constructor(version: number, type: ReceiptTypeDto, mosaic: MosaicBuilder, targetPublicKey: KeyDto) { + super(version, type); + this.mosaic = mosaic; + this.targetPublicKey = targetPublicKey; + } + + /** + * Creates an instance of BalanceChangeReceiptBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of BalanceChangeReceiptBuilder. + */ + public static loadFromBinary(payload: Uint8Array): BalanceChangeReceiptBuilder { + const byteArray = Array.from(payload); + const superObject = ReceiptBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, superObject.getSize()); + const mosaic = MosaicBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, mosaic.getSize()); + const targetPublicKey = KeyDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, targetPublicKey.getSize()); + return new BalanceChangeReceiptBuilder(superObject.version, superObject.type, mosaic, targetPublicKey); + } + + /** + * Gets mosaic. + * + * @return Mosaic. + */ + public getMosaic(): MosaicBuilder { + return this.mosaic; + } + + /** + * Gets account public key. + * + * @return Account public key. + */ + public getTargetPublicKey(): KeyDto { + return this.targetPublicKey; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size: number = super.getSize(); + size += this.mosaic.getSize(); + size += this.targetPublicKey.getSize(); + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const superBytes = super.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, superBytes); + const mosaicBytes = this.mosaic.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, mosaicBytes); + const targetPublicKeyBytes = this.targetPublicKey.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, targetPublicKeyBytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/BalanceTransferReceiptBuilder.ts b/src/infrastructure/catbuffer/BalanceTransferReceiptBuilder.ts new file mode 100644 index 0000000000..89215dc6c1 --- /dev/null +++ b/src/infrastructure/catbuffer/BalanceTransferReceiptBuilder.ts @@ -0,0 +1,132 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { AddressDto } from './AddressDto'; +import { GeneratorUtils } from './GeneratorUtils'; +import { KeyDto } from './KeyDto'; +import { MosaicBuilder } from './MosaicBuilder'; +import { ReceiptBuilder } from './ReceiptBuilder'; +import { ReceiptTypeDto } from './ReceiptTypeDto'; + +/** Binary layout for a balance transfer receipt. */ +export class BalanceTransferReceiptBuilder extends ReceiptBuilder { + /** Mosaic. */ + mosaic: MosaicBuilder; + /** Mosaic sender public key. */ + senderPublicKey: KeyDto; + /** Mosaic recipient address. */ + recipientAddress: AddressDto; + + /** + * Constructor. + * + * @param version Receipt version. + * @param type Receipt type. + * @param mosaic Mosaic. + * @param senderPublicKey Mosaic sender public key. + * @param recipientAddress Mosaic recipient address. + */ + // tslint:disable-next-line: max-line-length + public constructor(version: number, type: ReceiptTypeDto, mosaic: MosaicBuilder, senderPublicKey: KeyDto, recipientAddress: AddressDto) { + super(version, type); + this.mosaic = mosaic; + this.senderPublicKey = senderPublicKey; + this.recipientAddress = recipientAddress; + } + + /** + * Creates an instance of BalanceTransferReceiptBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of BalanceTransferReceiptBuilder. + */ + public static loadFromBinary(payload: Uint8Array): BalanceTransferReceiptBuilder { + const byteArray = Array.from(payload); + const superObject = ReceiptBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, superObject.getSize()); + const mosaic = MosaicBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, mosaic.getSize()); + const senderPublicKey = KeyDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, senderPublicKey.getSize()); + const recipientAddress = AddressDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, recipientAddress.getSize()); + // tslint:disable-next-line: max-line-length + return new BalanceTransferReceiptBuilder(superObject.version, superObject.type, mosaic, senderPublicKey, recipientAddress); + } + + /** + * Gets mosaic. + * + * @return Mosaic. + */ + public getMosaic(): MosaicBuilder { + return this.mosaic; + } + + /** + * Gets mosaic sender public key. + * + * @return Mosaic sender public key. + */ + public getSenderPublicKey(): KeyDto { + return this.senderPublicKey; + } + + /** + * Gets mosaic recipient address. + * + * @return Mosaic recipient address. + */ + public getRecipientAddress(): AddressDto { + return this.recipientAddress; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size: number = super.getSize(); + size += this.mosaic.getSize(); + size += this.senderPublicKey.getSize(); + size += this.recipientAddress.getSize(); + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const superBytes = super.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, superBytes); + const mosaicBytes = this.mosaic.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, mosaicBytes); + const senderPublicKeyBytes = this.senderPublicKey.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, senderPublicKeyBytes); + const recipientAddressBytes = this.recipientAddress.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, recipientAddressBytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/BlockHeaderBuilder.ts b/src/infrastructure/catbuffer/BlockHeaderBuilder.ts new file mode 100644 index 0000000000..eb693aa3fa --- /dev/null +++ b/src/infrastructure/catbuffer/BlockHeaderBuilder.ts @@ -0,0 +1,387 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { BlockFeeMultiplierDto } from './BlockFeeMultiplierDto'; +import { DifficultyDto } from './DifficultyDto'; +import { EntityTypeDto } from './EntityTypeDto'; +import { GeneratorUtils } from './GeneratorUtils'; +import { Hash256Dto } from './Hash256Dto'; +import { HeightDto } from './HeightDto'; +import { KeyDto } from './KeyDto'; +import { NetworkTypeDto } from './NetworkTypeDto'; +import { SignatureDto } from './SignatureDto'; +import { TimestampDto } from './TimestampDto'; + +/** Binary layout for a block header. */ +export class BlockHeaderBuilder { + /** Entity size. */ + size = 0; + /** Reserved padding to align Signature on 8-byte boundary. */ + verifiableEntityHeader_Reserved1: number; + /** Entity signature. */ + signature: SignatureDto; + /** Entity signer's public key. */ + signerPublicKey: KeyDto; + /** Reserved padding to align end of EntityBody on 8-byte boundary. */ + entityBody_Reserved1: number; + /** Entity version. */ + version: number; + /** Entity network. */ + network: NetworkTypeDto; + /** Entity type. */ + type: EntityTypeDto; + /** Block height. */ + height: HeightDto; + /** Number of milliseconds elapsed since creation of nemesis block. */ + timestamp: TimestampDto; + /** Block difficulty. */ + difficulty: DifficultyDto; + /** Previous block hash. */ + previousBlockHash: Hash256Dto; + /** Hash of the transactions in this block. */ + transactionsHash: Hash256Dto; + /** Hash of the receipts generated by this block. */ + receiptsHash: Hash256Dto; + /** Hash of the global chain state at this block. */ + stateHash: Hash256Dto; + /** Beneficiary public key designated by harvester. */ + beneficiaryPublicKey: KeyDto; + /** Fee multiplier applied to block transactions. */ + feeMultiplier: BlockFeeMultiplierDto; + /** Reserved padding to align end of BlockHeader on 8-byte boundary. */ + blockHeader_Reserved1: number; + + /** + * Constructor. + * + * @param signature Entity signature. + * @param signerPublicKey Entity signer's public key. + * @param version Entity version. + * @param network Entity network. + * @param type Entity type. + * @param height Block height. + * @param timestamp Number of milliseconds elapsed since creation of nemesis block. + * @param difficulty Block difficulty. + * @param previousBlockHash Previous block hash. + * @param transactionsHash Hash of the transactions in this block. + * @param receiptsHash Hash of the receipts generated by this block. + * @param stateHash Hash of the global chain state at this block. + * @param beneficiaryPublicKey Beneficiary public key designated by harvester. + * @param feeMultiplier Fee multiplier applied to block transactions. + */ + // tslint:disable-next-line: max-line-length + public constructor(signature: SignatureDto, signerPublicKey: KeyDto, version: number, network: NetworkTypeDto, type: EntityTypeDto, height: HeightDto, timestamp: TimestampDto, difficulty: DifficultyDto, previousBlockHash: Hash256Dto, transactionsHash: Hash256Dto, receiptsHash: Hash256Dto, stateHash: Hash256Dto, beneficiaryPublicKey: KeyDto, feeMultiplier: BlockFeeMultiplierDto) { + this.verifiableEntityHeader_Reserved1 = 0; + this.signature = signature; + this.signerPublicKey = signerPublicKey; + this.entityBody_Reserved1 = 0; + this.version = version; + this.network = network; + this.type = type; + this.height = height; + this.timestamp = timestamp; + this.difficulty = difficulty; + this.previousBlockHash = previousBlockHash; + this.transactionsHash = transactionsHash; + this.receiptsHash = receiptsHash; + this.stateHash = stateHash; + this.beneficiaryPublicKey = beneficiaryPublicKey; + this.feeMultiplier = feeMultiplier; + this.blockHeader_Reserved1 = 0; + } + + /** + * Creates an instance of BlockHeaderBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of BlockHeaderBuilder. + */ + public static loadFromBinary(payload: Uint8Array): BlockHeaderBuilder { + const byteArray = Array.from(payload); + const size = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4)); + byteArray.splice(0, 4); + // tslint:disable-next-line: max-line-length + const verifiableEntityHeader_Reserved1 = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4)); + byteArray.splice(0, 4); + const signature = SignatureDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, signature.getSize()); + const signerPublicKey = KeyDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, signerPublicKey.getSize()); + const entityBody_Reserved1 = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4)); + byteArray.splice(0, 4); + const version = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 1)); + byteArray.splice(0, 1); + const network = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 1)); + byteArray.splice(0, 1); + const type = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 2)); + byteArray.splice(0, 2); + const height = HeightDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, height.getSize()); + const timestamp = TimestampDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, timestamp.getSize()); + const difficulty = DifficultyDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, difficulty.getSize()); + const previousBlockHash = Hash256Dto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, previousBlockHash.getSize()); + const transactionsHash = Hash256Dto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, transactionsHash.getSize()); + const receiptsHash = Hash256Dto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, receiptsHash.getSize()); + const stateHash = Hash256Dto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, stateHash.getSize()); + const beneficiaryPublicKey = KeyDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, beneficiaryPublicKey.getSize()); + const feeMultiplier = BlockFeeMultiplierDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, feeMultiplier.getSize()); + const blockHeader_Reserved1 = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4)); + byteArray.splice(0, 4); + // tslint:disable-next-line: max-line-length + return new BlockHeaderBuilder(signature, signerPublicKey, version, network, type, height, timestamp, difficulty, previousBlockHash, transactionsHash, receiptsHash, stateHash, beneficiaryPublicKey, feeMultiplier); + } + + /** + * Gets reserved padding to align Signature on 8-byte boundary. + * + * @return Reserved padding to align Signature on 8-byte boundary. + */ + public getVerifiableEntityHeader_Reserved1(): number { + return this.verifiableEntityHeader_Reserved1; + } + + /** + * Gets entity signature. + * + * @return Entity signature. + */ + public getSignature(): SignatureDto { + return this.signature; + } + + /** + * Gets entity signer's public key. + * + * @return Entity signer's public key. + */ + public getSignerPublicKey(): KeyDto { + return this.signerPublicKey; + } + + /** + * Gets reserved padding to align end of EntityBody on 8-byte boundary. + * + * @return Reserved padding to align end of EntityBody on 8-byte boundary. + */ + public getEntityBody_Reserved1(): number { + return this.entityBody_Reserved1; + } + + /** + * Gets entity version. + * + * @return Entity version. + */ + public getVersion(): number { + return this.version; + } + + /** + * Gets entity network. + * + * @return Entity network. + */ + public getNetwork(): NetworkTypeDto { + return this.network; + } + + /** + * Gets entity type. + * + * @return Entity type. + */ + public getType(): EntityTypeDto { + return this.type; + } + + /** + * Gets block height. + * + * @return Block height. + */ + public getHeight(): HeightDto { + return this.height; + } + + /** + * Gets number of milliseconds elapsed since creation of nemesis block. + * + * @return Number of milliseconds elapsed since creation of nemesis block. + */ + public getTimestamp(): TimestampDto { + return this.timestamp; + } + + /** + * Gets block difficulty. + * + * @return Block difficulty. + */ + public getDifficulty(): DifficultyDto { + return this.difficulty; + } + + /** + * Gets previous block hash. + * + * @return Previous block hash. + */ + public getPreviousBlockHash(): Hash256Dto { + return this.previousBlockHash; + } + + /** + * Gets hash of the transactions in this block. + * + * @return Hash of the transactions in this block. + */ + public getTransactionsHash(): Hash256Dto { + return this.transactionsHash; + } + + /** + * Gets hash of the receipts generated by this block. + * + * @return Hash of the receipts generated by this block. + */ + public getReceiptsHash(): Hash256Dto { + return this.receiptsHash; + } + + /** + * Gets hash of the global chain state at this block. + * + * @return Hash of the global chain state at this block. + */ + public getStateHash(): Hash256Dto { + return this.stateHash; + } + + /** + * Gets beneficiary public key designated by harvester. + * + * @return Beneficiary public key designated by harvester. + */ + public getBeneficiaryPublicKey(): KeyDto { + return this.beneficiaryPublicKey; + } + + /** + * Gets fee multiplier applied to block transactions. + * + * @return Fee multiplier applied to block transactions. + */ + public getFeeMultiplier(): BlockFeeMultiplierDto { + return this.feeMultiplier; + } + + /** + * Gets reserved padding to align end of BlockHeader on 8-byte boundary. + * + * @return Reserved padding to align end of BlockHeader on 8-byte boundary. + */ + public getBlockHeader_Reserved1(): number { + return this.blockHeader_Reserved1; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size = 0; + size += 4; // size + size += 4; // verifiableEntityHeader_Reserved1 + size += this.signature.getSize(); + size += this.signerPublicKey.getSize(); + size += 4; // entityBody_Reserved1 + size += 1; // version + size += 1; // network + size += 2; // type + size += this.height.getSize(); + size += this.timestamp.getSize(); + size += this.difficulty.getSize(); + size += this.previousBlockHash.getSize(); + size += this.transactionsHash.getSize(); + size += this.receiptsHash.getSize(); + size += this.stateHash.getSize(); + size += this.beneficiaryPublicKey.getSize(); + size += this.feeMultiplier.getSize(); + size += 4; // blockHeader_Reserved1 + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const sizeBytes = GeneratorUtils.uintToBuffer(this.getSize(), 4); + newArray = GeneratorUtils.concatTypedArrays(newArray, sizeBytes); + // tslint:disable-next-line: max-line-length + const verifiableEntityHeader_Reserved1Bytes = GeneratorUtils.uintToBuffer(this.getVerifiableEntityHeader_Reserved1(), 4); + newArray = GeneratorUtils.concatTypedArrays(newArray, verifiableEntityHeader_Reserved1Bytes); + const signatureBytes = this.signature.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, signatureBytes); + const signerPublicKeyBytes = this.signerPublicKey.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, signerPublicKeyBytes); + const entityBody_Reserved1Bytes = GeneratorUtils.uintToBuffer(this.getEntityBody_Reserved1(), 4); + newArray = GeneratorUtils.concatTypedArrays(newArray, entityBody_Reserved1Bytes); + const versionBytes = GeneratorUtils.uintToBuffer(this.getVersion(), 1); + newArray = GeneratorUtils.concatTypedArrays(newArray, versionBytes); + const networkBytes = GeneratorUtils.uintToBuffer(this.network, 1); + newArray = GeneratorUtils.concatTypedArrays(newArray, networkBytes); + const typeBytes = GeneratorUtils.uintToBuffer(this.type, 2); + newArray = GeneratorUtils.concatTypedArrays(newArray, typeBytes); + const heightBytes = this.height.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, heightBytes); + const timestampBytes = this.timestamp.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, timestampBytes); + const difficultyBytes = this.difficulty.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, difficultyBytes); + const previousBlockHashBytes = this.previousBlockHash.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, previousBlockHashBytes); + const transactionsHashBytes = this.transactionsHash.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, transactionsHashBytes); + const receiptsHashBytes = this.receiptsHash.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, receiptsHashBytes); + const stateHashBytes = this.stateHash.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, stateHashBytes); + const beneficiaryPublicKeyBytes = this.beneficiaryPublicKey.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, beneficiaryPublicKeyBytes); + const feeMultiplierBytes = this.feeMultiplier.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, feeMultiplierBytes); + const blockHeader_Reserved1Bytes = GeneratorUtils.uintToBuffer(this.getBlockHeader_Reserved1(), 4); + newArray = GeneratorUtils.concatTypedArrays(newArray, blockHeader_Reserved1Bytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts b/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts new file mode 100644 index 0000000000..ad436cfc30 --- /dev/null +++ b/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts @@ -0,0 +1,181 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { EntityTypeDto } from './EntityTypeDto' +import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder' +import { GeneratorUtils } from './GeneratorUtils' +import { EmbeddedTransferTransactionBuilder } from './EmbeddedTransferTransactionBuilder' +import { EmbeddedAccountLinkTransactionBuilder } from './EmbeddedAccountLinkTransactionBuilder' +import { EmbeddedHashLockTransactionBuilder } from './EmbeddedHashLockTransactionBuilder' +import { EmbeddedSecretLockTransactionBuilder } from './EmbeddedSecretLockTransactionBuilder' +import { EmbeddedSecretProofTransactionBuilder } from './EmbeddedSecretProofTransactionBuilder' +import { EmbeddedAccountMetadataTransactionBuilder } from './EmbeddedAccountMetadataTransactionBuilder' +import { EmbeddedMosaicMetadataTransactionBuilder } from './EmbeddedMosaicMetadataTransactionBuilder' +import { EmbeddedNamespaceMetadataTransactionBuilder } from './EmbeddedNamespaceMetadataTransactionBuilder' +import { EmbeddedMosaicDefinitionTransactionBuilder } from './EmbeddedMosaicDefinitionTransactionBuilder' +import { EmbeddedMosaicSupplyChangeTransactionBuilder } from './EmbeddedMosaicSupplyChangeTransactionBuilder' +import { EmbeddedMultisigAccountModificationTransactionBuilder } from './EmbeddedMultisigAccountModificationTransactionBuilder' +import { EmbeddedAddressAliasTransactionBuilder } from './EmbeddedAddressAliasTransactionBuilder' +import { EmbeddedMosaicAliasTransactionBuilder } from './EmbeddedMosaicAliasTransactionBuilder' +import { EmbeddedNamespaceRegistrationTransactionBuilder } from './EmbeddedNamespaceRegistrationTransactionBuilder' +import { EmbeddedAccountAddressRestrictionTransactionBuilder } from './EmbeddedAccountAddressRestrictionTransactionBuilder' +import { EmbeddedAccountMosaicRestrictionTransactionBuilder } from './EmbeddedAccountMosaicRestrictionTransactionBuilder' +import { EmbeddedAccountOperationRestrictionTransactionBuilder } from './EmbeddedAccountOperationRestrictionTransactionBuilder' +import { EmbeddedMosaicAddressRestrictionTransactionBuilder } from './EmbeddedMosaicAddressRestrictionTransactionBuilder' +import { EmbeddedMosaicGlobalRestrictionTransactionBuilder } from './EmbeddedMosaicGlobalRestrictionTransactionBuilder' + +export class EmbeddedTransactionHelper { + + public static serialize(transaction: EmbeddedTransactionBuilder): Uint8Array { + let byte: Uint8Array; + let padding: Uint8Array; + switch (transaction.type) { + case EntityTypeDto.TRANSFER_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedTransferTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.ACCOUNT_LINK_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedAccountLinkTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.HASH_LOCK_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedHashLockTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.SECRET_LOCK_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedSecretLockTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.SECRET_PROOF_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedSecretProofTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.ACCOUNT_METADATA_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedAccountMetadataTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MOSAIC_METADATA_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMosaicMetadataTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.NAMESPACE_METADATA_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedNamespaceMetadataTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MOSAIC_DEFINITION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMosaicDefinitionTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MOSAIC_SUPPLY_CHANGE_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMosaicSupplyChangeTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MULTISIG_ACCOUNT_MODIFICATION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMultisigAccountModificationTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.ADDRESS_ALIAS_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedAddressAliasTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MOSAIC_ALIAS_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMosaicAliasTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.NAMESPACE_REGISTRATION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedNamespaceRegistrationTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.ACCOUNT_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedAccountAddressRestrictionTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.ACCOUNT_MOSAIC_RESTRICTION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedAccountMosaicRestrictionTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.ACCOUNT_OPERATION_RESTRICTION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedAccountOperationRestrictionTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MOSAIC_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMosaicAddressRestrictionTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + case EntityTypeDto.MOSAIC_GLOBAL_RESTRICTION_TRANSACTION_BUILDER: + byte = (transaction as EmbeddedMosaicGlobalRestrictionTransactionBuilder).serialize(); + padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); + default: + throw new Error(`Transaction type: ${transaction.type} not recognized.`) + } + } + + public static loadFromBinary(bytes: Uint8Array):EmbeddedTransactionBuilder { + const header = EmbeddedTransactionBuilder.loadFromBinary(bytes); + switch (header.getType()) { + case EntityTypeDto.TRANSFER_TRANSACTION_BUILDER: + return EmbeddedTransferTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.ACCOUNT_LINK_TRANSACTION_BUILDER: + return EmbeddedAccountLinkTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.HASH_LOCK_TRANSACTION_BUILDER: + return EmbeddedHashLockTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.SECRET_LOCK_TRANSACTION_BUILDER: + return EmbeddedSecretLockTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.SECRET_PROOF_TRANSACTION_BUILDER: + return EmbeddedSecretProofTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.ACCOUNT_METADATA_TRANSACTION_BUILDER: + return EmbeddedAccountMetadataTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MOSAIC_METADATA_TRANSACTION_BUILDER: + return EmbeddedMosaicMetadataTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.NAMESPACE_METADATA_TRANSACTION_BUILDER: + return EmbeddedNamespaceMetadataTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MOSAIC_DEFINITION_TRANSACTION_BUILDER: + return EmbeddedMosaicDefinitionTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MOSAIC_SUPPLY_CHANGE_TRANSACTION_BUILDER: + return EmbeddedMosaicSupplyChangeTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MULTISIG_ACCOUNT_MODIFICATION_TRANSACTION_BUILDER: + return EmbeddedMultisigAccountModificationTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.ADDRESS_ALIAS_TRANSACTION_BUILDER: + return EmbeddedAddressAliasTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MOSAIC_ALIAS_TRANSACTION_BUILDER: + return EmbeddedMosaicAliasTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.NAMESPACE_REGISTRATION_TRANSACTION_BUILDER: + return EmbeddedNamespaceRegistrationTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.ACCOUNT_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: + return EmbeddedAccountAddressRestrictionTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.ACCOUNT_MOSAIC_RESTRICTION_TRANSACTION_BUILDER: + return EmbeddedAccountMosaicRestrictionTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.ACCOUNT_OPERATION_RESTRICTION_TRANSACTION_BUILDER: + return EmbeddedAccountOperationRestrictionTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MOSAIC_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: + return EmbeddedMosaicAddressRestrictionTransactionBuilder.loadFromBinary(bytes) + case EntityTypeDto.MOSAIC_GLOBAL_RESTRICTION_TRANSACTION_BUILDER: + return EmbeddedMosaicGlobalRestrictionTransactionBuilder.loadFromBinary(bytes) + default: + throw new Error(`Transaction type: ${header.getType()} not recognized.`) + } + } + + public static getEmbeddedTransactionSize(transactions: EmbeddedTransactionBuilder[]): number { + return transactions.map((o) => EmbeddedTransactionHelper.serialize(o).length).reduce((a, b) => a + b, 0); + } +} diff --git a/src/infrastructure/catbuffer/EntityTypeDto.ts b/src/infrastructure/catbuffer/EntityTypeDto.ts index cbbf804d10..4399620a5c 100644 --- a/src/infrastructure/catbuffer/EntityTypeDto.ts +++ b/src/infrastructure/catbuffer/EntityTypeDto.ts @@ -26,4 +26,44 @@ export enum EntityTypeDto { RESERVED = 0, /** Transfer transaction builder. */ TRANSFER_TRANSACTION_BUILDER = 16724, + /** Account link transaction builder. */ + ACCOUNT_LINK_TRANSACTION_BUILDER = 16716, + /** Hash lock transaction builder. */ + HASH_LOCK_TRANSACTION_BUILDER = 16712, + /** Secret lock transaction builder. */ + SECRET_LOCK_TRANSACTION_BUILDER = 16722, + /** Secret proof transaction builder. */ + SECRET_PROOF_TRANSACTION_BUILDER = 16978, + /** Account metadata transaction builder. */ + ACCOUNT_METADATA_TRANSACTION_BUILDER = 16708, + /** Mosaic metadata transaction builder. */ + MOSAIC_METADATA_TRANSACTION_BUILDER = 16964, + /** Namespace metadata transaction builder. */ + NAMESPACE_METADATA_TRANSACTION_BUILDER = 17220, + /** Mosaic definition transaction builder. */ + MOSAIC_DEFINITION_TRANSACTION_BUILDER = 16717, + /** Mosaic supply change transaction builder. */ + MOSAIC_SUPPLY_CHANGE_TRANSACTION_BUILDER = 16973, + /** Multisig account modification transaction builder. */ + MULTISIG_ACCOUNT_MODIFICATION_TRANSACTION_BUILDER = 16725, + /** Address alias transaction builder. */ + ADDRESS_ALIAS_TRANSACTION_BUILDER = 16974, + /** Mosaic alias transaction builder. */ + MOSAIC_ALIAS_TRANSACTION_BUILDER = 17230, + /** Namespace registration transaction builder. */ + NAMESPACE_REGISTRATION_TRANSACTION_BUILDER = 16718, + /** Account address restriction transaction builder. */ + ACCOUNT_ADDRESS_RESTRICTION_TRANSACTION_BUILDER = 16720, + /** Account mosaic restriction transaction builder. */ + ACCOUNT_MOSAIC_RESTRICTION_TRANSACTION_BUILDER = 16976, + /** Account operation restriction transaction builder. */ + ACCOUNT_OPERATION_RESTRICTION_TRANSACTION_BUILDER = 17232, + /** Mosaic address restriction transaction builder. */ + MOSAIC_ADDRESS_RESTRICTION_TRANSACTION_BUILDER = 16977, + /** Mosaic global restriction transaction builder. */ + MOSAIC_GLOBAL_RESTRICTION_TRANSACTION_BUILDER = 16721, + /** Aggregate complete transaction builder. */ + AGGREGATE_COMPLETE_TRANSACTION_BUILDER = 16705, + /** Aggregate bonded transaction builder. */ + AGGREGATE_BONDED_TRANSACTION_BUILDER = 16961, } diff --git a/src/infrastructure/catbuffer/GeneratorUtils.ts b/src/infrastructure/catbuffer/GeneratorUtils.ts index d1c6eb5d9b..74399315e0 100644 --- a/src/infrastructure/catbuffer/GeneratorUtils.ts +++ b/src/infrastructure/catbuffer/GeneratorUtils.ts @@ -145,4 +145,13 @@ export class GeneratorUtils { const bytes = binary.slice(0, size); return bytes; } + + /** + * Gets the padding size that rounds up \a size to the next multiple of \a alignment. + * @param size Inner transaction size + * @param alignment Next multiple alignment + */ + public static getTransactionPaddingSize(size: number, alignment: number): number { + return 0 === size % alignment ? 0 : alignment - (size % alignment); + } } diff --git a/src/infrastructure/catbuffer/InflationReceiptBuilder.ts b/src/infrastructure/catbuffer/InflationReceiptBuilder.ts new file mode 100644 index 0000000000..d9d12527ec --- /dev/null +++ b/src/infrastructure/catbuffer/InflationReceiptBuilder.ts @@ -0,0 +1,92 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { GeneratorUtils } from './GeneratorUtils'; +import { MosaicBuilder } from './MosaicBuilder'; +import { ReceiptBuilder } from './ReceiptBuilder'; +import { ReceiptTypeDto } from './ReceiptTypeDto'; + +/** Binary layout for an inflation receipt. */ +export class InflationReceiptBuilder extends ReceiptBuilder { + /** Mosaic. */ + mosaic: MosaicBuilder; + + /** + * Constructor. + * + * @param version Receipt version. + * @param type Receipt type. + * @param mosaic Mosaic. + */ + public constructor(version: number, type: ReceiptTypeDto, mosaic: MosaicBuilder) { + super(version, type); + this.mosaic = mosaic; + } + + /** + * Creates an instance of InflationReceiptBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of InflationReceiptBuilder. + */ + public static loadFromBinary(payload: Uint8Array): InflationReceiptBuilder { + const byteArray = Array.from(payload); + const superObject = ReceiptBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, superObject.getSize()); + const mosaic = MosaicBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, mosaic.getSize()); + return new InflationReceiptBuilder(superObject.version, superObject.type, mosaic); + } + + /** + * Gets mosaic. + * + * @return Mosaic. + */ + public getMosaic(): MosaicBuilder { + return this.mosaic; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size: number = super.getSize(); + size += this.mosaic.getSize(); + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const superBytes = super.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, superBytes); + const mosaicBytes = this.mosaic.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, mosaicBytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/MosaicExpiryReceiptBuilder.ts b/src/infrastructure/catbuffer/MosaicExpiryReceiptBuilder.ts new file mode 100644 index 0000000000..3940e509e5 --- /dev/null +++ b/src/infrastructure/catbuffer/MosaicExpiryReceiptBuilder.ts @@ -0,0 +1,92 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { GeneratorUtils } from './GeneratorUtils'; +import { MosaicIdDto } from './MosaicIdDto'; +import { ReceiptBuilder } from './ReceiptBuilder'; +import { ReceiptTypeDto } from './ReceiptTypeDto'; + +/** Binary layout for a mosaic expiry receipt. */ +export class MosaicExpiryReceiptBuilder extends ReceiptBuilder { + /** Expiring mosaic id. */ + artifactId: MosaicIdDto; + + /** + * Constructor. + * + * @param version Receipt version. + * @param type Receipt type. + * @param artifactId Expiring mosaic id. + */ + public constructor(version: number, type: ReceiptTypeDto, artifactId: MosaicIdDto) { + super(version, type); + this.artifactId = artifactId; + } + + /** + * Creates an instance of MosaicExpiryReceiptBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of MosaicExpiryReceiptBuilder. + */ + public static loadFromBinary(payload: Uint8Array): MosaicExpiryReceiptBuilder { + const byteArray = Array.from(payload); + const superObject = ReceiptBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, superObject.getSize()); + const artifactId = MosaicIdDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, artifactId.getSize()); + return new MosaicExpiryReceiptBuilder(superObject.version, superObject.type, artifactId); + } + + /** + * Gets expiring mosaic id. + * + * @return Expiring mosaic id. + */ + public getArtifactId(): MosaicIdDto { + return this.artifactId; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size: number = super.getSize(); + size += this.artifactId.getSize(); + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const superBytes = super.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, superBytes); + const artifactIdBytes = this.artifactId.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, artifactIdBytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/NamespaceExpiryReceiptBuilder.ts b/src/infrastructure/catbuffer/NamespaceExpiryReceiptBuilder.ts new file mode 100644 index 0000000000..2573d688a9 --- /dev/null +++ b/src/infrastructure/catbuffer/NamespaceExpiryReceiptBuilder.ts @@ -0,0 +1,92 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { GeneratorUtils } from './GeneratorUtils'; +import { NamespaceIdDto } from './NamespaceIdDto'; +import { ReceiptBuilder } from './ReceiptBuilder'; +import { ReceiptTypeDto } from './ReceiptTypeDto'; + +/** Binary layout for a namespace expiry receipt. */ +export class NamespaceExpiryReceiptBuilder extends ReceiptBuilder { + /** Expiring namespace id. */ + artifactId: NamespaceIdDto; + + /** + * Constructor. + * + * @param version Receipt version. + * @param type Receipt type. + * @param artifactId Expiring namespace id. + */ + public constructor(version: number, type: ReceiptTypeDto, artifactId: NamespaceIdDto) { + super(version, type); + this.artifactId = artifactId; + } + + /** + * Creates an instance of NamespaceExpiryReceiptBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of NamespaceExpiryReceiptBuilder. + */ + public static loadFromBinary(payload: Uint8Array): NamespaceExpiryReceiptBuilder { + const byteArray = Array.from(payload); + const superObject = ReceiptBuilder.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, superObject.getSize()); + const artifactId = NamespaceIdDto.loadFromBinary(Uint8Array.from(byteArray)); + byteArray.splice(0, artifactId.getSize()); + return new NamespaceExpiryReceiptBuilder(superObject.version, superObject.type, artifactId); + } + + /** + * Gets expiring namespace id. + * + * @return Expiring namespace id. + */ + public getArtifactId(): NamespaceIdDto { + return this.artifactId; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size: number = super.getSize(); + size += this.artifactId.getSize(); + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const superBytes = super.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, superBytes); + const artifactIdBytes = this.artifactId.serialize(); + newArray = GeneratorUtils.concatTypedArrays(newArray, artifactIdBytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/ReceiptBuilder.ts b/src/infrastructure/catbuffer/ReceiptBuilder.ts new file mode 100644 index 0000000000..524bf945df --- /dev/null +++ b/src/infrastructure/catbuffer/ReceiptBuilder.ts @@ -0,0 +1,108 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + +import { GeneratorUtils } from './GeneratorUtils'; +import { ReceiptTypeDto } from './ReceiptTypeDto'; + +/** Binary layout for a receipt entity. */ +export class ReceiptBuilder { + /** Entity size. */ + size = 0; + /** Receipt version. */ + version: number; + /** Receipt type. */ + type: ReceiptTypeDto; + + /** + * Constructor. + * + * @param version Receipt version. + * @param type Receipt type. + */ + public constructor(version: number, type: ReceiptTypeDto) { + this.version = version; + this.type = type; + } + + /** + * Creates an instance of ReceiptBuilder from binary payload. + * + * @param payload Byte payload to use to serialize the object. + * @return Instance of ReceiptBuilder. + */ + public static loadFromBinary(payload: Uint8Array): ReceiptBuilder { + const byteArray = Array.from(payload); + const size = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 4)); + byteArray.splice(0, 4); + const version = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 2)); + byteArray.splice(0, 2); + const type = GeneratorUtils.bufferToUint(GeneratorUtils.getBytes(Uint8Array.from(byteArray), 2)); + byteArray.splice(0, 2); + return new ReceiptBuilder(version, type); + } + + /** + * Gets receipt version. + * + * @return Receipt version. + */ + public getVersion(): number { + return this.version; + } + + /** + * Gets receipt type. + * + * @return Receipt type. + */ + public getType(): ReceiptTypeDto { + return this.type; + } + + /** + * Gets the size of the object. + * + * @return Size in bytes. + */ + public getSize(): number { + let size = 0; + size += 4; // size + size += 2; // version + size += 2; // type + return size; + } + + /** + * Serializes an object to bytes. + * + * @return Serialized bytes. + */ + public serialize(): Uint8Array { + let newArray = Uint8Array.from([]); + const sizeBytes = GeneratorUtils.uintToBuffer(this.getSize(), 4); + newArray = GeneratorUtils.concatTypedArrays(newArray, sizeBytes); + const versionBytes = GeneratorUtils.uintToBuffer(this.getVersion(), 2); + newArray = GeneratorUtils.concatTypedArrays(newArray, versionBytes); + const typeBytes = GeneratorUtils.uintToBuffer(this.type, 2); + newArray = GeneratorUtils.concatTypedArrays(newArray, typeBytes); + return newArray; + } +} diff --git a/src/infrastructure/catbuffer/ReceiptTypeDto.ts b/src/infrastructure/catbuffer/ReceiptTypeDto.ts new file mode 100644 index 0000000000..f2d4bdc10f --- /dev/null +++ b/src/infrastructure/catbuffer/ReceiptTypeDto.ts @@ -0,0 +1,27 @@ +// tslint:disable: jsdoc-format +/** +*** Copyright (c) 2016-present, +*** Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. All rights reserved. +*** +*** This file is part of Catapult. +*** +*** Catapult is free software: you can redistribute it and/or modify +*** it under the terms of the GNU Lesser General Public License as published by +*** the Free Software Foundation, either version 3 of the License, or +*** (at your option) any later version. +*** +*** Catapult is distributed in the hope that it will be useful, +*** but WITHOUT ANY WARRANTY; without even the implied warranty of +*** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +*** GNU Lesser General Public License for more details. +*** +*** You should have received a copy of the GNU Lesser General Public License +*** along with Catapult. If not, see . +**/ + + +/** Enumeration of receipt types. */ +export enum ReceiptTypeDto { + /** Reserved receipt type. */ + RESERVED = 0, +} diff --git a/src/model/transaction/AccountAddressRestrictionTransaction.ts b/src/model/transaction/AccountAddressRestrictionTransaction.ts index d730adc931..52cdf79951 100644 --- a/src/model/transaction/AccountAddressRestrictionTransaction.ts +++ b/src/model/transaction/AccountAddressRestrictionTransaction.ts @@ -22,6 +22,7 @@ import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedAccountAddressRestrictionTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedAccountAddressRestrictionTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; import { TimestampDto } from '../../infrastructure/catbuffer/TimestampDto'; @@ -173,10 +174,10 @@ export class AccountAddressRestrictionTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedAccountAddressRestrictionTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedAccountAddressRestrictionTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -189,7 +190,6 @@ export class AccountAddressRestrictionTransaction extends Transaction { return new UnresolvedAddressDto(UnresolvedMapping.toUnresolvedAddressBytes(deletion, this.networkType)); }), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/AccountLinkTransaction.ts b/src/model/transaction/AccountLinkTransaction.ts index 9e6e813de3..2374266254 100644 --- a/src/model/transaction/AccountLinkTransaction.ts +++ b/src/model/transaction/AccountLinkTransaction.ts @@ -18,6 +18,7 @@ import { Convert } from '../../core/format'; import { AccountLinkTransactionBuilder } from '../../infrastructure/catbuffer/AccountLinkTransactionBuilder'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedAccountLinkTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedAccountLinkTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; import { TimestampDto } from '../../infrastructure/catbuffer/TimestampDto'; @@ -150,10 +151,10 @@ export class AccountLinkTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedAccountLinkTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedAccountLinkTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -161,7 +162,6 @@ export class AccountLinkTransaction extends Transaction { new KeyDto(Convert.hexToUint8(this.remotePublicKey)), this.linkAction.valueOf(), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/AccountMetadataTransaction.ts b/src/model/transaction/AccountMetadataTransaction.ts index 78b2009887..d01429d3af 100644 --- a/src/model/transaction/AccountMetadataTransaction.ts +++ b/src/model/transaction/AccountMetadataTransaction.ts @@ -18,6 +18,7 @@ import { Convert } from '../../core/format'; import { AccountMetadataTransactionBuilder } from '../../infrastructure/catbuffer/AccountMetadataTransactionBuilder'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedAccountMetadataTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedAccountMetadataTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; import { TimestampDto } from '../../infrastructure/catbuffer/TimestampDto'; @@ -178,10 +179,10 @@ export class AccountMetadataTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedAccountMetadataTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedAccountMetadataTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -191,7 +192,6 @@ export class AccountMetadataTransaction extends Transaction { this.valueSizeDelta, Convert.utf8ToUint8(this.value), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/AccountMosaicRestrictionTransaction.ts b/src/model/transaction/AccountMosaicRestrictionTransaction.ts index 4037d9e687..d3b8902b53 100644 --- a/src/model/transaction/AccountMosaicRestrictionTransaction.ts +++ b/src/model/transaction/AccountMosaicRestrictionTransaction.ts @@ -22,6 +22,7 @@ import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedAccountMosaicRestrictionTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedAccountMosaicRestrictionTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; import { TimestampDto } from '../../infrastructure/catbuffer/TimestampDto'; @@ -173,10 +174,10 @@ export class AccountMosaicRestrictionTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedAccountMosaicRestrictionTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedAccountMosaicRestrictionTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -189,7 +190,6 @@ export class AccountMosaicRestrictionTransaction extends Transaction { return new UnresolvedMosaicIdDto(deletion.id.toDTO()); }), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/AccountOperationRestrictionTransaction.ts b/src/model/transaction/AccountOperationRestrictionTransaction.ts index 899602794f..1dc508e493 100644 --- a/src/model/transaction/AccountOperationRestrictionTransaction.ts +++ b/src/model/transaction/AccountOperationRestrictionTransaction.ts @@ -22,6 +22,7 @@ import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedAccountOperationRestrictionTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedAccountOperationRestrictionTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; import { TimestampDto } from '../../infrastructure/catbuffer/TimestampDto'; @@ -160,10 +161,10 @@ export class AccountOperationRestrictionTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedAccountOperationRestrictionTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedAccountOperationRestrictionTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -172,7 +173,6 @@ export class AccountOperationRestrictionTransaction extends Transaction { this.restrictionAdditions, this.restrictionDeletions, ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/AddressAliasTransaction.ts b/src/model/transaction/AddressAliasTransaction.ts index 863c1cbae8..2ee1a238ac 100644 --- a/src/model/transaction/AddressAliasTransaction.ts +++ b/src/model/transaction/AddressAliasTransaction.ts @@ -19,6 +19,7 @@ import { AddressAliasTransactionBuilder } from '../../infrastructure/catbuffer/A import { AddressDto } from '../../infrastructure/catbuffer/AddressDto'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedAddressAliasTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedAddressAliasTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { NamespaceIdDto } from '../../infrastructure/catbuffer/NamespaceIdDto'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; @@ -169,10 +170,10 @@ export class AddressAliasTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedAddressAliasTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedAddressAliasTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -181,7 +182,6 @@ export class AddressAliasTransaction extends Transaction { new AddressDto(RawAddress.stringToAddress(this.address.plain())), this.aliasAction.valueOf(), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/AggregateTransaction.ts b/src/model/transaction/AggregateTransaction.ts index cfefb0a4e9..073f85ada0 100644 --- a/src/model/transaction/AggregateTransaction.ts +++ b/src/model/transaction/AggregateTransaction.ts @@ -21,6 +21,8 @@ import {AggregateBondedTransactionBuilder} from '../../infrastructure/catbuffer/ import {AggregateCompleteTransactionBuilder} from '../../infrastructure/catbuffer/AggregateCompleteTransactionBuilder'; import {AmountDto} from '../../infrastructure/catbuffer/AmountDto'; import {CosignatureBuilder} from '../../infrastructure/catbuffer/CosignatureBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; +import { EmbeddedTransactionHelper } from '../../infrastructure/catbuffer/EmbeddedTransactionHelper'; import {GeneratorUtils} from '../../infrastructure/catbuffer/GeneratorUtils'; import { Hash256Dto } from '../../infrastructure/catbuffer/Hash256Dto'; import {KeyDto} from '../../infrastructure/catbuffer/KeyDto'; @@ -140,36 +142,19 @@ export class AggregateTransaction extends Transaction { const builder = type === TransactionType.AGGREGATE_COMPLETE ? AggregateCompleteTransactionBuilder.loadFromBinary(Convert.hexToUint8(payload)) : AggregateBondedTransactionBuilder.loadFromBinary(Convert.hexToUint8(payload)); - const innerTransactionHex = Convert.uint8ToHex(builder.getTransactions()); + const innerTransactions = builder.getTransactions().map((t) => Convert.uint8ToHex(EmbeddedTransactionHelper.serialize(t))); const networkType = builder.getNetwork().valueOf(); - const consignaturesHex = Convert.uint8ToHex(builder.getCosignatures()); - - /** - * Get inner transactions array - */ - const embeddedTransactionArray: string[] = []; - let innerBinary = innerTransactionHex; - while (innerBinary.length) { - const payloadSize = parseInt(Convert.uint8ToHex(Convert.hexToUint8(innerBinary.substring(0, 8)).reverse()), 16) * 2; - const innerTransaction = innerBinary.substring(0, payloadSize); - embeddedTransactionArray.push(innerTransaction); - innerBinary = innerBinary.substring(payloadSize).replace(/\b0+/g, ''); - } - - /** - * Get cosignatures - */ - const consignatureArray = consignaturesHex.match(/.{1,192}/g); - const consignatures = consignatureArray ? consignatureArray.map((cosignature) => - new AggregateTransactionCosignature( - cosignature.substring(64, 192), - PublicAccount.createFromPublicKey(cosignature.substring(0, 64), networkType), - )) : []; + const consignatures = builder.getCosignatures().map((cosig) => { + return new AggregateTransactionCosignature( + Convert.uint8ToHex(cosig.signature.signature), + PublicAccount.createFromPublicKey(Convert.uint8ToHex(cosig.signerPublicKey.key), networkType), + ); + }); return type === TransactionType.AGGREGATE_COMPLETE ? AggregateTransaction.createComplete( Deadline.createFromDTO(builder.deadline.timestamp), - embeddedTransactionArray.map((transactionRaw) => { + innerTransactions.map((transactionRaw) => { return CreateTransactionFromPayload(transactionRaw, true) as InnerTransaction; }), networkType, @@ -177,7 +162,7 @@ export class AggregateTransaction extends Transaction { new UInt64(builder.fee.amount), ) : AggregateTransaction.createBonded( Deadline.createFromDTO(builder.deadline.timestamp), - embeddedTransactionArray.map((transactionRaw) => { + innerTransactions.map((transactionRaw) => { return CreateTransactionFromPayload(transactionRaw, true) as InnerTransaction; }), networkType, @@ -313,23 +298,14 @@ export class AggregateTransaction extends Transaction { protected generateBytes(): Uint8Array { const signerBuffer = new Uint8Array(32); const signatureBuffer = new Uint8Array(64); - let transactions = Uint8Array.from([]); - this.innerTransactions.forEach((transaction) => { - const transactionByte = transaction.toAggregateTransactionBytes(); - const innerTransactionPadding = new Uint8Array(this.getInnerTransactionPaddingSize(transactionByte.length, 8)); - const paddedTransactionByte = GeneratorUtils.concatTypedArrays(transactionByte, innerTransactionPadding); - transactions = GeneratorUtils.concatTypedArrays(transactions, paddedTransactionByte); - }); - - let cosignatures = Uint8Array.from([]); - this.cosignatures.forEach((cosignature) => { + const transactions = this.innerTransactions.map((transaction) => (transaction as Transaction).toEmbeddedTransaction()); + const cosignatures = this.cosignatures.map((cosignature) => { const signerBytes = Convert.hexToUint8(cosignature.signer.publicKey); const signatureBytes = Convert.hexToUint8(cosignature.signature); - const cosignatureBytes = new CosignatureBuilder( + return new CosignatureBuilder( new KeyDto(signerBytes), new SignatureDto(signatureBytes), - ).serialize(); - cosignatures = GeneratorUtils.concatTypedArrays(cosignatures, cosignatureBytes); + ); }); const transactionBuilder = this.type === TransactionType.AGGREGATE_COMPLETE ? @@ -362,9 +338,9 @@ export class AggregateTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { throw new Error('Method not implemented'); } diff --git a/src/model/transaction/LockFundsTransaction.ts b/src/model/transaction/LockFundsTransaction.ts index 9b6fc2bb35..70ffdb661c 100644 --- a/src/model/transaction/LockFundsTransaction.ts +++ b/src/model/transaction/LockFundsTransaction.ts @@ -19,6 +19,7 @@ import { DtoMapping } from '../../core/utils/DtoMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { BlockDurationDto } from '../../infrastructure/catbuffer/BlockDurationDto'; import { EmbeddedHashLockTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedHashLockTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { Hash256Dto } from '../../infrastructure/catbuffer/Hash256Dto'; import { HashLockTransactionBuilder } from '../../infrastructure/catbuffer/HashLockTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; @@ -188,10 +189,10 @@ export class LockFundsTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedHashLockTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedHashLockTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -201,7 +202,6 @@ export class LockFundsTransaction extends Transaction { new BlockDurationDto(this.duration.toDTO()), new Hash256Dto(Convert.hexToUint8(this.hash)), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MosaicAddressRestrictionTransaction.ts b/src/model/transaction/MosaicAddressRestrictionTransaction.ts index fa16011421..f5a36bfa76 100644 --- a/src/model/transaction/MosaicAddressRestrictionTransaction.ts +++ b/src/model/transaction/MosaicAddressRestrictionTransaction.ts @@ -21,6 +21,7 @@ import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMosaicAddressRestrictionTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedMosaicAddressRestrictionTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { MosaicAddressRestrictionTransactionBuilder } from '../../infrastructure/catbuffer/MosaicAddressRestrictionTransactionBuilder'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; @@ -219,10 +220,10 @@ export class MosaicAddressRestrictionTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMosaicAddressRestrictionTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMosaicAddressRestrictionTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -233,7 +234,6 @@ export class MosaicAddressRestrictionTransaction extends Transaction { this.newRestrictionValue.toDTO(), new UnresolvedAddressDto(UnresolvedMapping.toUnresolvedAddressBytes(this.targetAddress, this.networkType)), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MosaicAliasTransaction.ts b/src/model/transaction/MosaicAliasTransaction.ts index f259c5af13..238e8b1fbd 100644 --- a/src/model/transaction/MosaicAliasTransaction.ts +++ b/src/model/transaction/MosaicAliasTransaction.ts @@ -17,6 +17,7 @@ import { Convert } from '../../core/format'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMosaicAliasTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedMosaicAliasTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { MosaicAliasTransactionBuilder } from '../../infrastructure/catbuffer/MosaicAliasTransactionBuilder'; import { MosaicIdDto } from '../../infrastructure/catbuffer/MosaicIdDto'; @@ -164,10 +165,10 @@ export class MosaicAliasTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMosaicAliasTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMosaicAliasTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -176,7 +177,6 @@ export class MosaicAliasTransaction extends Transaction { new MosaicIdDto(this.mosaicId.id.toDTO()), this.aliasAction.valueOf(), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MosaicDefinitionTransaction.ts b/src/model/transaction/MosaicDefinitionTransaction.ts index a43a733825..5b3fe0754b 100644 --- a/src/model/transaction/MosaicDefinitionTransaction.ts +++ b/src/model/transaction/MosaicDefinitionTransaction.ts @@ -18,6 +18,7 @@ import { Convert } from '../../core/format'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { BlockDurationDto } from '../../infrastructure/catbuffer/BlockDurationDto'; import { EmbeddedMosaicDefinitionTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedMosaicDefinitionTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { GeneratorUtils } from '../../infrastructure/catbuffer/GeneratorUtils'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { MosaicDefinitionTransactionBuilder } from '../../infrastructure/catbuffer/MosaicDefinitionTransactionBuilder'; @@ -205,10 +206,10 @@ export class MosaicDefinitionTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMosaicDefinitionTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMosaicDefinitionTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -219,7 +220,6 @@ export class MosaicDefinitionTransaction extends Transaction { this.flags.getValue(), this.divisibility, ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MosaicGlobalRestrictionTransaction.ts b/src/model/transaction/MosaicGlobalRestrictionTransaction.ts index e1d654f2d1..f4b1969e3d 100644 --- a/src/model/transaction/MosaicGlobalRestrictionTransaction.ts +++ b/src/model/transaction/MosaicGlobalRestrictionTransaction.ts @@ -21,6 +21,7 @@ import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMosaicGlobalRestrictionTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedMosaicGlobalRestrictionTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { MosaicGlobalRestrictionTransactionBuilder } from '../../infrastructure/catbuffer/MosaicGlobalRestrictionTransactionBuilder'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; @@ -227,10 +228,10 @@ export class MosaicGlobalRestrictionTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMosaicGlobalRestrictionTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMosaicGlobalRestrictionTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -243,7 +244,6 @@ export class MosaicGlobalRestrictionTransaction extends Transaction { this.previousRestrictionType.valueOf(), this.newRestrictionType.valueOf(), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MosaicMetadataTransaction.ts b/src/model/transaction/MosaicMetadataTransaction.ts index 345db15e51..e48c636085 100644 --- a/src/model/transaction/MosaicMetadataTransaction.ts +++ b/src/model/transaction/MosaicMetadataTransaction.ts @@ -19,6 +19,7 @@ import { DtoMapping } from '../../core/utils/DtoMapping'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMosaicMetadataTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedMosaicMetadataTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { MosaicMetadataTransactionBuilder } from '../../infrastructure/catbuffer/MosaicMetadataTransactionBuilder'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; @@ -195,10 +196,10 @@ export class MosaicMetadataTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMosaicMetadataTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMosaicMetadataTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -209,7 +210,6 @@ export class MosaicMetadataTransaction extends Transaction { this.valueSizeDelta, Convert.utf8ToUint8(this.value), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MosaicSupplyChangeTransaction.ts b/src/model/transaction/MosaicSupplyChangeTransaction.ts index 6ef580240f..93484992a9 100644 --- a/src/model/transaction/MosaicSupplyChangeTransaction.ts +++ b/src/model/transaction/MosaicSupplyChangeTransaction.ts @@ -19,6 +19,7 @@ import { DtoMapping } from '../../core/utils/DtoMapping'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMosaicSupplyChangeTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedMosaicSupplyChangeTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { MosaicSupplyChangeTransactionBuilder } from '../../infrastructure/catbuffer/MosaicSupplyChangeTransactionBuilder'; import { SignatureDto } from '../../infrastructure/catbuffer/SignatureDto'; @@ -171,10 +172,10 @@ export class MosaicSupplyChangeTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMosaicSupplyChangeTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMosaicSupplyChangeTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -183,7 +184,6 @@ export class MosaicSupplyChangeTransaction extends Transaction { new AmountDto(this.delta.toDTO()), this.action.valueOf(), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/MultisigAccountModificationTransaction.ts b/src/model/transaction/MultisigAccountModificationTransaction.ts index d8a4dc1d77..fcaefd7fcf 100644 --- a/src/model/transaction/MultisigAccountModificationTransaction.ts +++ b/src/model/transaction/MultisigAccountModificationTransaction.ts @@ -19,6 +19,7 @@ import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedMultisigAccountModificationTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedMultisigAccountModificationTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import {MultisigAccountModificationTransactionBuilder, } from '../../infrastructure/catbuffer/MultisigAccountModificationTransactionBuilder'; @@ -193,10 +194,10 @@ export class MultisigAccountModificationTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedMultisigAccountModificationTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedMultisigAccountModificationTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -210,7 +211,6 @@ export class MultisigAccountModificationTransaction extends Transaction { return new KeyDto(Convert.hexToUint8(deletion.publicKey)); }), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/NamespaceMetadataTransaction.ts b/src/model/transaction/NamespaceMetadataTransaction.ts index f58453c268..36e80f13e3 100644 --- a/src/model/transaction/NamespaceMetadataTransaction.ts +++ b/src/model/transaction/NamespaceMetadataTransaction.ts @@ -17,6 +17,7 @@ import { Convert } from '../../core/format'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedNamespaceMetadataTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedNamespaceMetadataTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { NamespaceIdDto } from '../../infrastructure/catbuffer/NamespaceIdDto'; import { NamespaceMetadataTransactionBuilder } from '../../infrastructure/catbuffer/NamespaceMetadataTransactionBuilder'; @@ -192,10 +193,10 @@ export class NamespaceMetadataTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedNamespaceMetadataTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedNamespaceMetadataTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -206,7 +207,6 @@ export class NamespaceMetadataTransaction extends Transaction { this.valueSizeDelta, Convert.utf8ToUint8(this.value), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/NamespaceRegistrationTransaction.ts b/src/model/transaction/NamespaceRegistrationTransaction.ts index 935ee02bc7..cad026814e 100644 --- a/src/model/transaction/NamespaceRegistrationTransaction.ts +++ b/src/model/transaction/NamespaceRegistrationTransaction.ts @@ -20,6 +20,7 @@ import { BlockDurationDto } from '../../infrastructure/catbuffer/BlockDurationDt import { EmbeddedNamespaceRegistrationTransactionBuilder, } from '../../infrastructure/catbuffer/EmbeddedNamespaceRegistrationTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { NamespaceIdDto } from '../../infrastructure/catbuffer/NamespaceIdDto'; import { NamespaceRegistrationTransactionBuilder } from '../../infrastructure/catbuffer/NamespaceRegistrationTransactionBuilder'; @@ -244,12 +245,11 @@ export class NamespaceRegistrationTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - let transactionBuilder: EmbeddedNamespaceRegistrationTransactionBuilder; + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { if (this.registrationType === NamespaceRegistrationType.RootNamespace) { - transactionBuilder = new EmbeddedNamespaceRegistrationTransactionBuilder( + return new EmbeddedNamespaceRegistrationTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -259,19 +259,17 @@ export class NamespaceRegistrationTransaction extends Transaction { new BlockDurationDto(this.duration!.toDTO()), undefined, ); - } else { - transactionBuilder = new EmbeddedNamespaceRegistrationTransactionBuilder( - new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), - this.versionToDTO(), - this.networkType.valueOf(), - TransactionType.REGISTER_NAMESPACE.valueOf(), - new NamespaceIdDto(this.namespaceId.id.toDTO()), - Convert.hexToUint8(Convert.utf8ToHex(this.namespaceName)), - undefined, - new NamespaceIdDto(this.parentId!.id.toDTO()), - ); } - return transactionBuilder.serialize(); + return new EmbeddedNamespaceRegistrationTransactionBuilder( + new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), + this.versionToDTO(), + this.networkType.valueOf(), + TransactionType.REGISTER_NAMESPACE.valueOf(), + new NamespaceIdDto(this.namespaceId.id.toDTO()), + Convert.hexToUint8(Convert.utf8ToHex(this.namespaceName)), + undefined, + new NamespaceIdDto(this.parentId!.id.toDTO()), + ); } /** diff --git a/src/model/transaction/SecretLockTransaction.ts b/src/model/transaction/SecretLockTransaction.ts index 3b10e31c5c..944c2d3039 100644 --- a/src/model/transaction/SecretLockTransaction.ts +++ b/src/model/transaction/SecretLockTransaction.ts @@ -19,6 +19,7 @@ import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { BlockDurationDto } from '../../infrastructure/catbuffer/BlockDurationDto'; import { EmbeddedSecretLockTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedSecretLockTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { Hash256Dto } from '../../infrastructure/catbuffer/Hash256Dto'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SecretLockTransactionBuilder } from '../../infrastructure/catbuffer/SecretLockTransactionBuilder'; @@ -215,10 +216,10 @@ export class SecretLockTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedSecretLockTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedSecretLockTransactionBuilder( new KeyDto(convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -230,7 +231,6 @@ export class SecretLockTransaction extends Transaction { this.hashType.valueOf(), new UnresolvedAddressDto(UnresolvedMapping.toUnresolvedAddressBytes(this.recipientAddress, this.networkType)), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/SecretProofTransaction.ts b/src/model/transaction/SecretProofTransaction.ts index 8e1855c841..201e491f71 100644 --- a/src/model/transaction/SecretProofTransaction.ts +++ b/src/model/transaction/SecretProofTransaction.ts @@ -19,6 +19,7 @@ import { DtoMapping } from '../../core/utils/DtoMapping'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; import { EmbeddedSecretProofTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedSecretProofTransactionBuilder'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { Hash256Dto } from '../../infrastructure/catbuffer/Hash256Dto'; import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; import { SecretProofTransactionBuilder } from '../../infrastructure/catbuffer/SecretProofTransactionBuilder'; @@ -194,10 +195,10 @@ export class SecretProofTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedSecretProofTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedSecretProofTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -207,7 +208,6 @@ export class SecretProofTransaction extends Transaction { new UnresolvedAddressDto(UnresolvedMapping.toUnresolvedAddressBytes(this.recipientAddress, this.networkType)), this.getProofByte(), ); - return transactionBuilder.serialize(); } /** diff --git a/src/model/transaction/Transaction.ts b/src/model/transaction/Transaction.ts index 3ffa2a2891..49db64de8e 100644 --- a/src/model/transaction/Transaction.ts +++ b/src/model/transaction/Transaction.ts @@ -17,6 +17,8 @@ import { KeyPair, SHA3Hasher, SignSchema } from '../../core/crypto'; import { Convert } from '../../core/format'; import { DtoMapping } from '../../core/utils/DtoMapping'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; +import { EmbeddedTransactionHelper } from '../../infrastructure/catbuffer/EmbeddedTransactionHelper'; import { SerializeTransactionToJSON } from '../../infrastructure/transaction/SerializeTransactionToJSON'; import { Account } from '../account/Account'; import { PublicAccount } from '../account/PublicAccount'; @@ -185,7 +187,7 @@ export abstract class Transaction { /** * @internal */ - protected abstract generateEmbeddedBytes(): Uint8Array; + public abstract toEmbeddedTransaction(): EmbeddedTransactionBuilder; /** * @internal @@ -287,7 +289,9 @@ export abstract class Transaction { * @return transaction with signer serialized to be part of an aggregate transaction */ public toAggregateTransactionBytes() { - return this.generateEmbeddedBytes(); + return EmbeddedTransactionHelper.serialize( + this.toEmbeddedTransaction(), + ); } /** diff --git a/src/model/transaction/TransferTransaction.ts b/src/model/transaction/TransferTransaction.ts index 7f213f989d..7ea9cb13db 100644 --- a/src/model/transaction/TransferTransaction.ts +++ b/src/model/transaction/TransferTransaction.ts @@ -18,6 +18,7 @@ import * as Long from 'long'; import {Convert} from '../../core/format'; import {UnresolvedMapping} from '../../core/utils/UnresolvedMapping'; import {AmountDto} from '../../infrastructure/catbuffer/AmountDto'; +import { EmbeddedTransactionBuilder } from '../../infrastructure/catbuffer/EmbeddedTransactionBuilder'; import {EmbeddedTransferTransactionBuilder} from '../../infrastructure/catbuffer/EmbeddedTransferTransactionBuilder'; import {GeneratorUtils} from '../../infrastructure/catbuffer/GeneratorUtils'; import {KeyDto} from '../../infrastructure/catbuffer/KeyDto'; @@ -257,10 +258,10 @@ export class TransferTransaction extends Transaction { /** * @internal - * @returns {Uint8Array} + * @returns {EmbeddedTransactionBuilder} */ - protected generateEmbeddedBytes(): Uint8Array { - const transactionBuilder = new EmbeddedTransferTransactionBuilder( + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { + return new EmbeddedTransferTransactionBuilder( new KeyDto(Convert.hexToUint8(this.signer!.publicKey)), this.versionToDTO(), this.networkType.valueOf(), @@ -272,7 +273,6 @@ export class TransferTransaction extends Transaction { }), this.getMessageBuffer(), ); - return transactionBuilder.serialize(); } /** diff --git a/test/model/transaction/Transaction.spec.ts b/test/model/transaction/Transaction.spec.ts index 0b3eb881b4..04fb2e28b3 100644 --- a/test/model/transaction/Transaction.spec.ts +++ b/test/model/transaction/Transaction.spec.ts @@ -17,6 +17,7 @@ import { expect } from 'chai'; import { Observable } from 'rxjs/internal/Observable'; import { Convert } from '../../../src/core/format/Convert'; +import { EmbeddedTransactionBuilder } from '../../../src/infrastructure/catbuffer/EmbeddedTransactionBuilder'; import { Account } from '../../../src/model/account/Account'; import { Address } from '../../../src/model/account/Address'; import { NetworkType } from '../../../src/model/blockchain/NetworkType'; @@ -400,7 +401,7 @@ class FakeTransaction extends Transaction { throw new Error('Not implemented'); } - protected generateEmbeddedBytes(): Uint8Array { + public toEmbeddedTransaction(): EmbeddedTransactionBuilder { throw new Error('Not implemented'); } resolveAliases(): TransferTransaction { From fc997491ec53120ff983b3e6c047c3e44af84053 Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Fri, 20 Dec 2019 21:51:06 +0000 Subject: [PATCH 15/18] Fixed missing semicolon --- .../catbuffer/EmbeddedTransactionHelper.ts | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts b/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts index ad436cfc30..9a9c16712f 100644 --- a/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts +++ b/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts @@ -125,7 +125,7 @@ export class EmbeddedTransactionHelper { padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); return GeneratorUtils.concatTypedArrays(byte, padding); default: - throw new Error(`Transaction type: ${transaction.type} not recognized.`) + throw new Error(`Transaction type: ${transaction.type} not recognized.`); } } @@ -133,45 +133,45 @@ export class EmbeddedTransactionHelper { const header = EmbeddedTransactionBuilder.loadFromBinary(bytes); switch (header.getType()) { case EntityTypeDto.TRANSFER_TRANSACTION_BUILDER: - return EmbeddedTransferTransactionBuilder.loadFromBinary(bytes) + return EmbeddedTransferTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.ACCOUNT_LINK_TRANSACTION_BUILDER: - return EmbeddedAccountLinkTransactionBuilder.loadFromBinary(bytes) + return EmbeddedAccountLinkTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.HASH_LOCK_TRANSACTION_BUILDER: - return EmbeddedHashLockTransactionBuilder.loadFromBinary(bytes) + return EmbeddedHashLockTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.SECRET_LOCK_TRANSACTION_BUILDER: - return EmbeddedSecretLockTransactionBuilder.loadFromBinary(bytes) + return EmbeddedSecretLockTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.SECRET_PROOF_TRANSACTION_BUILDER: - return EmbeddedSecretProofTransactionBuilder.loadFromBinary(bytes) + return EmbeddedSecretProofTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.ACCOUNT_METADATA_TRANSACTION_BUILDER: - return EmbeddedAccountMetadataTransactionBuilder.loadFromBinary(bytes) + return EmbeddedAccountMetadataTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MOSAIC_METADATA_TRANSACTION_BUILDER: - return EmbeddedMosaicMetadataTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMosaicMetadataTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.NAMESPACE_METADATA_TRANSACTION_BUILDER: - return EmbeddedNamespaceMetadataTransactionBuilder.loadFromBinary(bytes) + return EmbeddedNamespaceMetadataTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MOSAIC_DEFINITION_TRANSACTION_BUILDER: - return EmbeddedMosaicDefinitionTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMosaicDefinitionTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MOSAIC_SUPPLY_CHANGE_TRANSACTION_BUILDER: - return EmbeddedMosaicSupplyChangeTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMosaicSupplyChangeTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MULTISIG_ACCOUNT_MODIFICATION_TRANSACTION_BUILDER: - return EmbeddedMultisigAccountModificationTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMultisigAccountModificationTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.ADDRESS_ALIAS_TRANSACTION_BUILDER: - return EmbeddedAddressAliasTransactionBuilder.loadFromBinary(bytes) + return EmbeddedAddressAliasTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MOSAIC_ALIAS_TRANSACTION_BUILDER: - return EmbeddedMosaicAliasTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMosaicAliasTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.NAMESPACE_REGISTRATION_TRANSACTION_BUILDER: - return EmbeddedNamespaceRegistrationTransactionBuilder.loadFromBinary(bytes) + return EmbeddedNamespaceRegistrationTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.ACCOUNT_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: - return EmbeddedAccountAddressRestrictionTransactionBuilder.loadFromBinary(bytes) + return EmbeddedAccountAddressRestrictionTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.ACCOUNT_MOSAIC_RESTRICTION_TRANSACTION_BUILDER: - return EmbeddedAccountMosaicRestrictionTransactionBuilder.loadFromBinary(bytes) + return EmbeddedAccountMosaicRestrictionTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.ACCOUNT_OPERATION_RESTRICTION_TRANSACTION_BUILDER: - return EmbeddedAccountOperationRestrictionTransactionBuilder.loadFromBinary(bytes) + return EmbeddedAccountOperationRestrictionTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MOSAIC_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: - return EmbeddedMosaicAddressRestrictionTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMosaicAddressRestrictionTransactionBuilder.loadFromBinary(bytes); case EntityTypeDto.MOSAIC_GLOBAL_RESTRICTION_TRANSACTION_BUILDER: - return EmbeddedMosaicGlobalRestrictionTransactionBuilder.loadFromBinary(bytes) + return EmbeddedMosaicGlobalRestrictionTransactionBuilder.loadFromBinary(bytes); default: - throw new Error(`Transaction type: ${header.getType()} not recognized.`) + throw new Error(`Transaction type: ${header.getType()} not recognized.`); } } From 04831f80f8ff513eb7d36fd52d690275823d044e Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Sun, 22 Dec 2019 14:50:41 +0000 Subject: [PATCH 16/18] Applied catbuffer on receipt --- .../catbuffer/ReceiptBuilder.ts | 2 -- src/model/receipt/ArtifactExpiryReceipt.ts | 18 ++++++++------- src/model/receipt/BalanceChangeReceipt.ts | 17 +++++++------- src/model/receipt/BalanceTransferReceipt.ts | 23 ++++++++++--------- src/model/receipt/InflationReceipt.ts | 16 ++++++------- 5 files changed, 39 insertions(+), 37 deletions(-) diff --git a/src/infrastructure/catbuffer/ReceiptBuilder.ts b/src/infrastructure/catbuffer/ReceiptBuilder.ts index 524bf945df..ffe39705cb 100644 --- a/src/infrastructure/catbuffer/ReceiptBuilder.ts +++ b/src/infrastructure/catbuffer/ReceiptBuilder.ts @@ -97,8 +97,6 @@ export class ReceiptBuilder { */ public serialize(): Uint8Array { let newArray = Uint8Array.from([]); - const sizeBytes = GeneratorUtils.uintToBuffer(this.getSize(), 4); - newArray = GeneratorUtils.concatTypedArrays(newArray, sizeBytes); const versionBytes = GeneratorUtils.uintToBuffer(this.getVersion(), 2); newArray = GeneratorUtils.concatTypedArrays(newArray, versionBytes); const typeBytes = GeneratorUtils.uintToBuffer(this.type, 2); diff --git a/src/model/receipt/ArtifactExpiryReceipt.ts b/src/model/receipt/ArtifactExpiryReceipt.ts index 8df5aab72a..a8a14178e4 100644 --- a/src/model/receipt/ArtifactExpiryReceipt.ts +++ b/src/model/receipt/ArtifactExpiryReceipt.ts @@ -14,11 +14,12 @@ * limitations under the License. */ -import { Convert } from '../../core/format/Convert'; -import { GeneratorUtils } from '../../infrastructure/catbuffer/GeneratorUtils'; +import { MosaicExpiryReceiptBuilder } from '../../infrastructure/catbuffer/MosaicExpiryReceiptBuilder'; +import { MosaicIdDto } from '../../infrastructure/catbuffer/MosaicIdDto'; +import { NamespaceExpiryReceiptBuilder } from '../../infrastructure/catbuffer/NamespaceExpiryReceiptBuilder'; +import { NamespaceIdDto } from '../../infrastructure/catbuffer/NamespaceIdDto'; import { MosaicId } from '../mosaic/MosaicId'; import { NamespaceId } from '../namespace/NamespaceId'; -import { UInt64 } from '../UInt64'; import { Receipt } from './Receipt'; import { ReceiptType } from './ReceiptType'; import { ReceiptVersion } from './ReceiptVersion'; @@ -48,10 +49,11 @@ export class ArtifactExpiryReceipt extends Receipt { * @return {Uint8Array} */ public serialize(): Uint8Array { - const buffer = new Uint8Array(12); - buffer.set(GeneratorUtils.uintToBuffer(ReceiptVersion.ARTIFACT_EXPIRY, 2)); - buffer.set(GeneratorUtils.uintToBuffer(this.type, 2), 2); - buffer.set(GeneratorUtils.uint64ToBuffer(UInt64.fromHex(this.artifactId.toHex()).toDTO()), 4); - return buffer; + if (this.artifactId instanceof MosaicId) { + return new MosaicExpiryReceiptBuilder(ReceiptVersion.ARTIFACT_EXPIRY, this.type.valueOf(), + new MosaicIdDto(this.artifactId.toDTO())).serialize(); + } + return new NamespaceExpiryReceiptBuilder(ReceiptVersion.ARTIFACT_EXPIRY, this.type.valueOf(), + new NamespaceIdDto(this.artifactId.id.toDTO())).serialize(); } } diff --git a/src/model/receipt/BalanceChangeReceipt.ts b/src/model/receipt/BalanceChangeReceipt.ts index 83159b621c..7c11b72690 100644 --- a/src/model/receipt/BalanceChangeReceipt.ts +++ b/src/model/receipt/BalanceChangeReceipt.ts @@ -15,7 +15,11 @@ */ import { Convert } from '../../core/format/Convert'; -import { GeneratorUtils } from '../../infrastructure/catbuffer/GeneratorUtils'; +import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; +import { BalanceChangeReceiptBuilder } from '../../infrastructure/catbuffer/BalanceChangeReceiptBuilder'; +import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; +import { MosaicBuilder } from '../../infrastructure/catbuffer/MosaicBuilder'; +import { MosaicIdDto } from '../../infrastructure/catbuffer/MosaicIdDto'; import { PublicAccount } from '../account/PublicAccount'; import { MosaicId } from '../mosaic/MosaicId'; import { UInt64 } from '../UInt64'; @@ -62,12 +66,9 @@ export class BalanceChangeReceipt extends Receipt { * @return {Uint8Array} */ public serialize(): Uint8Array { - const buffer = new Uint8Array(52); - buffer.set(GeneratorUtils.uintToBuffer(ReceiptVersion.BALANCE_CHANGE, 2)); - buffer.set(GeneratorUtils.uintToBuffer(this.type, 2), 2); - buffer.set(GeneratorUtils.uint64ToBuffer(UInt64.fromHex(this.mosaicId.toHex()).toDTO()), 4); - buffer.set(GeneratorUtils.uint64ToBuffer(UInt64.fromHex(this.amount.toHex()).toDTO()), 12); - buffer.set(Convert.hexToUint8(this.targetPublicAccount.publicKey), 20); - return buffer; + return new BalanceChangeReceiptBuilder(ReceiptVersion.BALANCE_CHANGE, this.type.valueOf(), + new MosaicBuilder(new MosaicIdDto(this.mosaicId.toDTO()), new AmountDto(this.amount.toDTO())), + new KeyDto(Convert.hexToUint8(this.targetPublicAccount.publicKey)), + ).serialize(); } } diff --git a/src/model/receipt/BalanceTransferReceipt.ts b/src/model/receipt/BalanceTransferReceipt.ts index 1442fe3e82..4b11cc53f0 100644 --- a/src/model/receipt/BalanceTransferReceipt.ts +++ b/src/model/receipt/BalanceTransferReceipt.ts @@ -15,8 +15,13 @@ */ import { Convert } from '../../core/format/Convert'; -import { UnresolvedMapping } from "../../core/utils/UnresolvedMapping"; -import { GeneratorUtils } from '../../infrastructure/catbuffer/GeneratorUtils'; +import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; +import { AddressDto } from '../../infrastructure/catbuffer/AddressDto'; +import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; +import { BalanceTransferReceiptBuilder } from '../../infrastructure/catbuffer/BalanceTransferReceiptBuilder'; +import { KeyDto } from '../../infrastructure/catbuffer/KeyDto'; +import { MosaicBuilder } from '../../infrastructure/catbuffer/MosaicBuilder'; +import { MosaicIdDto } from '../../infrastructure/catbuffer/MosaicIdDto'; import { Address } from '../account/Address'; import { PublicAccount } from '../account/PublicAccount'; import { MosaicId } from '../mosaic/MosaicId'; @@ -70,15 +75,11 @@ export class BalanceTransferReceipt extends Receipt { * @return {Uint8Array} */ public serialize(): Uint8Array { - const recipient = this.getRecipientBytes(); - const buffer = new Uint8Array(52 + recipient.length); - buffer.set(GeneratorUtils.uintToBuffer(ReceiptVersion.BALANCE_TRANSFER, 2)); - buffer.set(GeneratorUtils.uintToBuffer(this.type, 2), 2); - buffer.set(GeneratorUtils.uint64ToBuffer(UInt64.fromHex(this.mosaicId.toHex()).toDTO()), 4); - buffer.set(GeneratorUtils.uint64ToBuffer(UInt64.fromHex(this.amount.toHex()).toDTO()), 12); - buffer.set(Convert.hexToUint8(this.sender.publicKey), 20); - buffer.set(recipient, 52); - return buffer; + return new BalanceTransferReceiptBuilder(ReceiptVersion.BALANCE_TRANSFER, this.type.valueOf(), + new MosaicBuilder(new MosaicIdDto(this.mosaicId.toDTO()), new AmountDto(this.amount.toDTO())), + new KeyDto(Convert.hexToUint8(this.sender.publicKey)), + new AddressDto(this.getRecipientBytes()), + ).serialize(); } /** diff --git a/src/model/receipt/InflationReceipt.ts b/src/model/receipt/InflationReceipt.ts index 4007cd2200..f9e217043d 100644 --- a/src/model/receipt/InflationReceipt.ts +++ b/src/model/receipt/InflationReceipt.ts @@ -14,8 +14,10 @@ * limitations under the License. */ -import { Convert } from '../../core/format/Convert'; -import { GeneratorUtils } from '../../infrastructure/catbuffer/GeneratorUtils'; +import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; +import { InflationReceiptBuilder } from '../../infrastructure/catbuffer/InflationReceiptBuilder'; +import { MosaicBuilder } from '../../infrastructure/catbuffer/MosaicBuilder'; +import { MosaicIdDto } from '../../infrastructure/catbuffer/MosaicIdDto'; import { MosaicId } from '../mosaic/MosaicId'; import { UInt64 } from '../UInt64'; import { Receipt } from './Receipt'; @@ -56,11 +58,9 @@ export class InflationReceipt extends Receipt { * @return {Uint8Array} */ public serialize(): Uint8Array { - const buffer = new Uint8Array(20); - buffer.set(GeneratorUtils.uintToBuffer(ReceiptVersion.INFLATION_RECEIPT, 2)); - buffer.set(GeneratorUtils.uintToBuffer(this.type, 2), 2); - buffer.set(GeneratorUtils.uint64ToBuffer(UInt64.fromHex(this.mosaicId.toHex()).toDTO()), 4); - buffer.set(GeneratorUtils.uint64ToBuffer(UInt64.fromHex(this.amount.toHex()).toDTO()), 12); - return buffer; + return new InflationReceiptBuilder( + ReceiptVersion.INFLATION_RECEIPT, this.type.valueOf(), + new MosaicBuilder(new MosaicIdDto(this.mosaicId.toDTO()), new AmountDto(this.amount.toDTO())), + ).serialize(); } } From 84e5f6cfd4c6eeff28f6707d53771101e27fb99d Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Sun, 22 Dec 2019 15:35:36 +0000 Subject: [PATCH 17/18] Fixed semicolom in import --- .../catbuffer/EmbeddedTransactionHelper.ts | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts b/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts index 9a9c16712f..f6c2bab694 100644 --- a/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts +++ b/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts @@ -19,28 +19,28 @@ *** along with Catapult. If not, see . **/ -import { EntityTypeDto } from './EntityTypeDto' -import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder' -import { GeneratorUtils } from './GeneratorUtils' -import { EmbeddedTransferTransactionBuilder } from './EmbeddedTransferTransactionBuilder' -import { EmbeddedAccountLinkTransactionBuilder } from './EmbeddedAccountLinkTransactionBuilder' -import { EmbeddedHashLockTransactionBuilder } from './EmbeddedHashLockTransactionBuilder' -import { EmbeddedSecretLockTransactionBuilder } from './EmbeddedSecretLockTransactionBuilder' -import { EmbeddedSecretProofTransactionBuilder } from './EmbeddedSecretProofTransactionBuilder' -import { EmbeddedAccountMetadataTransactionBuilder } from './EmbeddedAccountMetadataTransactionBuilder' -import { EmbeddedMosaicMetadataTransactionBuilder } from './EmbeddedMosaicMetadataTransactionBuilder' -import { EmbeddedNamespaceMetadataTransactionBuilder } from './EmbeddedNamespaceMetadataTransactionBuilder' -import { EmbeddedMosaicDefinitionTransactionBuilder } from './EmbeddedMosaicDefinitionTransactionBuilder' -import { EmbeddedMosaicSupplyChangeTransactionBuilder } from './EmbeddedMosaicSupplyChangeTransactionBuilder' -import { EmbeddedMultisigAccountModificationTransactionBuilder } from './EmbeddedMultisigAccountModificationTransactionBuilder' -import { EmbeddedAddressAliasTransactionBuilder } from './EmbeddedAddressAliasTransactionBuilder' -import { EmbeddedMosaicAliasTransactionBuilder } from './EmbeddedMosaicAliasTransactionBuilder' -import { EmbeddedNamespaceRegistrationTransactionBuilder } from './EmbeddedNamespaceRegistrationTransactionBuilder' -import { EmbeddedAccountAddressRestrictionTransactionBuilder } from './EmbeddedAccountAddressRestrictionTransactionBuilder' -import { EmbeddedAccountMosaicRestrictionTransactionBuilder } from './EmbeddedAccountMosaicRestrictionTransactionBuilder' -import { EmbeddedAccountOperationRestrictionTransactionBuilder } from './EmbeddedAccountOperationRestrictionTransactionBuilder' -import { EmbeddedMosaicAddressRestrictionTransactionBuilder } from './EmbeddedMosaicAddressRestrictionTransactionBuilder' -import { EmbeddedMosaicGlobalRestrictionTransactionBuilder } from './EmbeddedMosaicGlobalRestrictionTransactionBuilder' +import { EntityTypeDto } from './EntityTypeDto'; +import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder'; +import { GeneratorUtils } from './GeneratorUtils'; +import { EmbeddedTransferTransactionBuilder } from './EmbeddedTransferTransactionBuilder'; +import { EmbeddedAccountLinkTransactionBuilder } from './EmbeddedAccountLinkTransactionBuilder'; +import { EmbeddedHashLockTransactionBuilder } from './EmbeddedHashLockTransactionBuilder'; +import { EmbeddedSecretLockTransactionBuilder } from './EmbeddedSecretLockTransactionBuilder'; +import { EmbeddedSecretProofTransactionBuilder } from './EmbeddedSecretProofTransactionBuilder'; +import { EmbeddedAccountMetadataTransactionBuilder } from './EmbeddedAccountMetadataTransactionBuilder'; +import { EmbeddedMosaicMetadataTransactionBuilder } from './EmbeddedMosaicMetadataTransactionBuilder'; +import { EmbeddedNamespaceMetadataTransactionBuilder } from './EmbeddedNamespaceMetadataTransactionBuilder'; +import { EmbeddedMosaicDefinitionTransactionBuilder } from './EmbeddedMosaicDefinitionTransactionBuilder'; +import { EmbeddedMosaicSupplyChangeTransactionBuilder } from './EmbeddedMosaicSupplyChangeTransactionBuilder'; +import { EmbeddedMultisigAccountModificationTransactionBuilder } from './EmbeddedMultisigAccountModificationTransactionBuilder'; +import { EmbeddedAddressAliasTransactionBuilder } from './EmbeddedAddressAliasTransactionBuilder'; +import { EmbeddedMosaicAliasTransactionBuilder } from './EmbeddedMosaicAliasTransactionBuilder'; +import { EmbeddedNamespaceRegistrationTransactionBuilder } from './EmbeddedNamespaceRegistrationTransactionBuilder'; +import { EmbeddedAccountAddressRestrictionTransactionBuilder } from './EmbeddedAccountAddressRestrictionTransactionBuilder'; +import { EmbeddedAccountMosaicRestrictionTransactionBuilder } from './EmbeddedAccountMosaicRestrictionTransactionBuilder'; +import { EmbeddedAccountOperationRestrictionTransactionBuilder } from './EmbeddedAccountOperationRestrictionTransactionBuilder'; +import { EmbeddedMosaicAddressRestrictionTransactionBuilder } from './EmbeddedMosaicAddressRestrictionTransactionBuilder'; +import { EmbeddedMosaicGlobalRestrictionTransactionBuilder } from './EmbeddedMosaicGlobalRestrictionTransactionBuilder'; export class EmbeddedTransactionHelper { From 70f3ab998519f0b48a13e1a697cad38856dd3ac9 Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Mon, 23 Dec 2019 13:51:51 +0000 Subject: [PATCH 18/18] Removed redundant switch case --- .../catbuffer/EmbeddedTransactionHelper.ts | 119 +++--------------- 1 file changed, 20 insertions(+), 99 deletions(-) diff --git a/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts b/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts index f6c2bab694..196a0ae451 100644 --- a/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts +++ b/src/infrastructure/catbuffer/EmbeddedTransactionHelper.ts @@ -19,117 +19,38 @@ *** along with Catapult. If not, see . **/ -import { EntityTypeDto } from './EntityTypeDto'; -import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder'; -import { GeneratorUtils } from './GeneratorUtils'; -import { EmbeddedTransferTransactionBuilder } from './EmbeddedTransferTransactionBuilder'; +import { EmbeddedAccountAddressRestrictionTransactionBuilder } from './EmbeddedAccountAddressRestrictionTransactionBuilder'; import { EmbeddedAccountLinkTransactionBuilder } from './EmbeddedAccountLinkTransactionBuilder'; -import { EmbeddedHashLockTransactionBuilder } from './EmbeddedHashLockTransactionBuilder'; -import { EmbeddedSecretLockTransactionBuilder } from './EmbeddedSecretLockTransactionBuilder'; -import { EmbeddedSecretProofTransactionBuilder } from './EmbeddedSecretProofTransactionBuilder'; import { EmbeddedAccountMetadataTransactionBuilder } from './EmbeddedAccountMetadataTransactionBuilder'; -import { EmbeddedMosaicMetadataTransactionBuilder } from './EmbeddedMosaicMetadataTransactionBuilder'; -import { EmbeddedNamespaceMetadataTransactionBuilder } from './EmbeddedNamespaceMetadataTransactionBuilder'; -import { EmbeddedMosaicDefinitionTransactionBuilder } from './EmbeddedMosaicDefinitionTransactionBuilder'; -import { EmbeddedMosaicSupplyChangeTransactionBuilder } from './EmbeddedMosaicSupplyChangeTransactionBuilder'; -import { EmbeddedMultisigAccountModificationTransactionBuilder } from './EmbeddedMultisigAccountModificationTransactionBuilder'; -import { EmbeddedAddressAliasTransactionBuilder } from './EmbeddedAddressAliasTransactionBuilder'; -import { EmbeddedMosaicAliasTransactionBuilder } from './EmbeddedMosaicAliasTransactionBuilder'; -import { EmbeddedNamespaceRegistrationTransactionBuilder } from './EmbeddedNamespaceRegistrationTransactionBuilder'; -import { EmbeddedAccountAddressRestrictionTransactionBuilder } from './EmbeddedAccountAddressRestrictionTransactionBuilder'; import { EmbeddedAccountMosaicRestrictionTransactionBuilder } from './EmbeddedAccountMosaicRestrictionTransactionBuilder'; import { EmbeddedAccountOperationRestrictionTransactionBuilder } from './EmbeddedAccountOperationRestrictionTransactionBuilder'; +import { EmbeddedAddressAliasTransactionBuilder } from './EmbeddedAddressAliasTransactionBuilder'; +import { EmbeddedHashLockTransactionBuilder } from './EmbeddedHashLockTransactionBuilder'; import { EmbeddedMosaicAddressRestrictionTransactionBuilder } from './EmbeddedMosaicAddressRestrictionTransactionBuilder'; +import { EmbeddedMosaicAliasTransactionBuilder } from './EmbeddedMosaicAliasTransactionBuilder'; +import { EmbeddedMosaicDefinitionTransactionBuilder } from './EmbeddedMosaicDefinitionTransactionBuilder'; import { EmbeddedMosaicGlobalRestrictionTransactionBuilder } from './EmbeddedMosaicGlobalRestrictionTransactionBuilder'; +import { EmbeddedMosaicMetadataTransactionBuilder } from './EmbeddedMosaicMetadataTransactionBuilder'; +import { EmbeddedMosaicSupplyChangeTransactionBuilder } from './EmbeddedMosaicSupplyChangeTransactionBuilder'; +import { EmbeddedMultisigAccountModificationTransactionBuilder } from './EmbeddedMultisigAccountModificationTransactionBuilder'; +import { EmbeddedNamespaceMetadataTransactionBuilder } from './EmbeddedNamespaceMetadataTransactionBuilder'; +import { EmbeddedNamespaceRegistrationTransactionBuilder } from './EmbeddedNamespaceRegistrationTransactionBuilder'; +import { EmbeddedSecretLockTransactionBuilder } from './EmbeddedSecretLockTransactionBuilder'; +import { EmbeddedSecretProofTransactionBuilder } from './EmbeddedSecretProofTransactionBuilder'; +import { EmbeddedTransactionBuilder } from './EmbeddedTransactionBuilder'; +import { EmbeddedTransferTransactionBuilder } from './EmbeddedTransferTransactionBuilder'; +import { EntityTypeDto } from './EntityTypeDto'; +import { GeneratorUtils } from './GeneratorUtils'; export class EmbeddedTransactionHelper { public static serialize(transaction: EmbeddedTransactionBuilder): Uint8Array { - let byte: Uint8Array; - let padding: Uint8Array; - switch (transaction.type) { - case EntityTypeDto.TRANSFER_TRANSACTION_BUILDER: - byte = (transaction as EmbeddedTransferTransactionBuilder).serialize(); - padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); - return GeneratorUtils.concatTypedArrays(byte, padding); - case EntityTypeDto.ACCOUNT_LINK_TRANSACTION_BUILDER: - byte = (transaction as EmbeddedAccountLinkTransactionBuilder).serialize(); - padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); - return GeneratorUtils.concatTypedArrays(byte, padding); - case EntityTypeDto.HASH_LOCK_TRANSACTION_BUILDER: - byte = (transaction as EmbeddedHashLockTransactionBuilder).serialize(); - padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); - return GeneratorUtils.concatTypedArrays(byte, padding); - case EntityTypeDto.SECRET_LOCK_TRANSACTION_BUILDER: - byte = (transaction as EmbeddedSecretLockTransactionBuilder).serialize(); - padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); - return GeneratorUtils.concatTypedArrays(byte, padding); - case EntityTypeDto.SECRET_PROOF_TRANSACTION_BUILDER: - byte = (transaction as EmbeddedSecretProofTransactionBuilder).serialize(); - padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); - return GeneratorUtils.concatTypedArrays(byte, padding); - case EntityTypeDto.ACCOUNT_METADATA_TRANSACTION_BUILDER: - byte = (transaction as EmbeddedAccountMetadataTransactionBuilder).serialize(); - padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); - return GeneratorUtils.concatTypedArrays(byte, padding); - case EntityTypeDto.MOSAIC_METADATA_TRANSACTION_BUILDER: - byte = (transaction as EmbeddedMosaicMetadataTransactionBuilder).serialize(); - padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); - return GeneratorUtils.concatTypedArrays(byte, padding); - case EntityTypeDto.NAMESPACE_METADATA_TRANSACTION_BUILDER: - byte = (transaction as EmbeddedNamespaceMetadataTransactionBuilder).serialize(); - padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); - return GeneratorUtils.concatTypedArrays(byte, padding); - case EntityTypeDto.MOSAIC_DEFINITION_TRANSACTION_BUILDER: - byte = (transaction as EmbeddedMosaicDefinitionTransactionBuilder).serialize(); - padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); - return GeneratorUtils.concatTypedArrays(byte, padding); - case EntityTypeDto.MOSAIC_SUPPLY_CHANGE_TRANSACTION_BUILDER: - byte = (transaction as EmbeddedMosaicSupplyChangeTransactionBuilder).serialize(); - padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); - return GeneratorUtils.concatTypedArrays(byte, padding); - case EntityTypeDto.MULTISIG_ACCOUNT_MODIFICATION_TRANSACTION_BUILDER: - byte = (transaction as EmbeddedMultisigAccountModificationTransactionBuilder).serialize(); - padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); - return GeneratorUtils.concatTypedArrays(byte, padding); - case EntityTypeDto.ADDRESS_ALIAS_TRANSACTION_BUILDER: - byte = (transaction as EmbeddedAddressAliasTransactionBuilder).serialize(); - padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); - return GeneratorUtils.concatTypedArrays(byte, padding); - case EntityTypeDto.MOSAIC_ALIAS_TRANSACTION_BUILDER: - byte = (transaction as EmbeddedMosaicAliasTransactionBuilder).serialize(); - padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); - return GeneratorUtils.concatTypedArrays(byte, padding); - case EntityTypeDto.NAMESPACE_REGISTRATION_TRANSACTION_BUILDER: - byte = (transaction as EmbeddedNamespaceRegistrationTransactionBuilder).serialize(); - padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); - return GeneratorUtils.concatTypedArrays(byte, padding); - case EntityTypeDto.ACCOUNT_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: - byte = (transaction as EmbeddedAccountAddressRestrictionTransactionBuilder).serialize(); - padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); - return GeneratorUtils.concatTypedArrays(byte, padding); - case EntityTypeDto.ACCOUNT_MOSAIC_RESTRICTION_TRANSACTION_BUILDER: - byte = (transaction as EmbeddedAccountMosaicRestrictionTransactionBuilder).serialize(); - padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); - return GeneratorUtils.concatTypedArrays(byte, padding); - case EntityTypeDto.ACCOUNT_OPERATION_RESTRICTION_TRANSACTION_BUILDER: - byte = (transaction as EmbeddedAccountOperationRestrictionTransactionBuilder).serialize(); - padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); - return GeneratorUtils.concatTypedArrays(byte, padding); - case EntityTypeDto.MOSAIC_ADDRESS_RESTRICTION_TRANSACTION_BUILDER: - byte = (transaction as EmbeddedMosaicAddressRestrictionTransactionBuilder).serialize(); - padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); - return GeneratorUtils.concatTypedArrays(byte, padding); - case EntityTypeDto.MOSAIC_GLOBAL_RESTRICTION_TRANSACTION_BUILDER: - byte = (transaction as EmbeddedMosaicGlobalRestrictionTransactionBuilder).serialize(); - padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); - return GeneratorUtils.concatTypedArrays(byte, padding); - default: - throw new Error(`Transaction type: ${transaction.type} not recognized.`); - } + const byte = transaction.serialize(); + const padding = new Uint8Array(GeneratorUtils.getTransactionPaddingSize(byte.length, 8)); + return GeneratorUtils.concatTypedArrays(byte, padding); } - public static loadFromBinary(bytes: Uint8Array):EmbeddedTransactionBuilder { + public static loadFromBinary(bytes: Uint8Array): EmbeddedTransactionBuilder { const header = EmbeddedTransactionBuilder.loadFromBinary(bytes); switch (header.getType()) { case EntityTypeDto.TRANSFER_TRANSACTION_BUILDER: