From 97a0456a584ae4ff01e8a553ba2e4d8e587b6c5b Mon Sep 17 00:00:00 2001 From: Fernando Boucquez Date: Wed, 4 Mar 2020 13:21:49 -0300 Subject: [PATCH 1/4] Changed dto mappers to map nonce as a decimal int. Changed http exception handling so the error body is in the exception Some code improvements around how MosaicNonce objects are created --- e2e/infrastructure/AccountHttp.spec.ts | 6 +- e2e/infrastructure/MosaicHttp.spec.ts | 11 ++-- package-lock.json | 4 +- src/core/format/Convert.ts | 27 ++++++++ src/infrastructure/Http.ts | 4 +- .../transaction/CreateTransactionFromDTO.ts | 63 +++++++++---------- src/model/mosaic/MosaicId.ts | 10 +-- src/model/mosaic/MosaicNonce.ts | 63 ++++++++++++------- .../MosaicDefinitionTransaction.ts | 3 +- src/service/TransactionService.ts | 7 +-- test/core/format/Convert.spec.ts | 43 ++++++++----- test/core/utils/TransactionMapping.spec.ts | 18 +++--- test/infrastructure/NodeHttp.spec.ts | 3 +- .../SerializeTransactionToJSON.spec.ts | 8 +-- test/model/mosaic/MosaicId.spec.ts | 22 +++---- test/model/mosaic/MosaicNonce.spec.ts | 44 ++++++++----- .../transaction/AggregateTransaction.spec.ts | 49 +++++++-------- .../MosaicDefinitionTransaction.spec.ts | 36 +++++------ 18 files changed, 245 insertions(+), 176 deletions(-) diff --git a/e2e/infrastructure/AccountHttp.spec.ts b/e2e/infrastructure/AccountHttp.spec.ts index 3629cda265..5f8d79d5fc 100644 --- a/e2e/infrastructure/AccountHttp.spec.ts +++ b/e2e/infrastructure/AccountHttp.spec.ts @@ -228,10 +228,12 @@ describe('AccountHttp', () => { describe('transactions', () => { it('should call transactions successfully by type', async () => { const transactions = await accountRepository.getAccountTransactions( - publicAccount.address, new QueryParams(), new TransactionFilter({ types: [TransactionType.TRANSFER] })).toPromise(); + publicAccount.address, new QueryParams(), new TransactionFilter({ + types: [TransactionType.TRANSFER, TransactionType.AGGREGATE_COMPLETE], + })).toPromise(); expect(transactions.length).to.be.greaterThan(0); transactions.forEach((t) => { - expect(t.type).to.be.eq(TransactionType.TRANSFER); + expect((t.type === TransactionType.TRANSFER || t.type === TransactionType.AGGREGATE_COMPLETE)).to.be.eq(true); }); }); }); diff --git a/e2e/infrastructure/MosaicHttp.spec.ts b/e2e/infrastructure/MosaicHttp.spec.ts index bdcb367761..8962043a56 100644 --- a/e2e/infrastructure/MosaicHttp.spec.ts +++ b/e2e/infrastructure/MosaicHttp.spec.ts @@ -65,8 +65,8 @@ describe('MosaicHttp', () => { */ describe('Setup test MosaicId', () => { - it('Announce MosaicDefinitionTransaction', () => { - const nonce = MosaicNonce.createRandom(); + it('Announce MosaicDefinitionTransaction', async () => { + const nonce = MosaicNonce.createFromNumber(999999999); mosaicId = MosaicId.createFromNonce(nonce, account.publicAccount); const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create( Deadline.create(), @@ -74,13 +74,16 @@ describe('MosaicHttp', () => { mosaicId, MosaicFlags.create(true, true, false), 3, - UInt64.fromUint(0), + UInt64.fromUint(100), networkType, helper.maxFee, ); const signedTransaction = mosaicDefinitionTransaction.signWith(account, generationHash); - return helper.announce(signedTransaction); + const listenedTransaction = await helper.announce(signedTransaction) as MosaicDefinitionTransaction; + expect(mosaicDefinitionTransaction.nonce.toHex()).to.be.equal(listenedTransaction.nonce.toHex()); + expect(mosaicDefinitionTransaction.nonce).to.deep.equal(listenedTransaction.nonce); + expect(mosaicDefinitionTransaction.getMosaicNonceIntValue()).to.be.equal(listenedTransaction.getMosaicNonceIntValue()); }); }); diff --git a/package-lock.json b/package-lock.json index 0e2341d549..8ebc8ca7b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4004,7 +4004,7 @@ }, "is-fullwidth-code-point": { "version": "2.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, @@ -4042,7 +4042,7 @@ }, "which-module": { "version": "2.0.0", - "resolved": false, + "resolved": "", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, diff --git a/src/core/format/Convert.ts b/src/core/format/Convert.ts index d41850cb1d..4c16dc0489 100644 --- a/src/core/format/Convert.ts +++ b/src/core/format/Convert.ts @@ -229,4 +229,31 @@ export class Convert { } return Convert.uint8ToHex(Uint8Array.from(delta)); } + + /** + * It splits the number's bytes into a an array. + * @param number the number + * @param arraySize the expected size of the array. + */ + public static numberToUint8Array(number: number, arraySize: number): Uint8Array { + const uint8Array = new Uint8Array(arraySize); + for (let index = 0; index < uint8Array.length; index++) { + const byte = number & 0xff; + uint8Array [index] = byte; + number = (number - byte) / 256; + } + return uint8Array; + } + + /** + * It creates a number from the bytes in the array. + * @param array the number from the bytes. + */ + public static uintArray8ToNumber(array: Uint8Array): number { + let value = 0; + for (let index = 0; index < array.length; index++) { + value += array[index] << (index * 8); + } + return value >>> 0; + } } diff --git a/src/infrastructure/Http.ts b/src/infrastructure/Http.ts index 1a9e71ae80..28e026ecf9 100644 --- a/src/infrastructure/Http.ts +++ b/src/infrastructure/Http.ts @@ -65,14 +65,14 @@ export abstract class Http { } errorHandling(error: any): Error { - if (error.response && error.response.statusCode && error.body) { + if (error.response && error.response.statusCode && error.response.body) { const formattedError = { statusCode: error.response.statusCode, errorDetails: { statusCode: error.response.statusCode, statusMessage: error.response.statusMessage, }, - body: error.body, + body: error.response.body, }; return new Error(JSON.stringify(formattedError)); } diff --git a/src/infrastructure/transaction/CreateTransactionFromDTO.ts b/src/infrastructure/transaction/CreateTransactionFromDTO.ts index d7741bd7b5..4bcf4ae50a 100644 --- a/src/infrastructure/transaction/CreateTransactionFromDTO.ts +++ b/src/infrastructure/transaction/CreateTransactionFromDTO.ts @@ -13,48 +13,47 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {Convert as convert} from '../../core/format'; +import { Convert as convert } from '../../core/format'; import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping'; -import {Address} from '../../model/account/Address'; -import {PublicAccount} from '../../model/account/PublicAccount'; -import {NetworkType} from '../../model/blockchain/NetworkType'; +import { Address } from '../../model/account/Address'; +import { PublicAccount } from '../../model/account/PublicAccount'; import { EncryptedMessage } from '../../model/message/EncryptedMessage'; import { MessageType } from '../../model/message/MessageType'; import { PersistentHarvestingDelegationMessage } from '../../model/message/PersistentHarvestingDelegationMessage'; -import {EmptyMessage, PlainMessage} from '../../model/message/PlainMessage'; -import {Mosaic} from '../../model/mosaic/Mosaic'; -import {MosaicFlags} from '../../model/mosaic/MosaicFlags'; -import {MosaicId} from '../../model/mosaic/MosaicId'; +import { EmptyMessage, PlainMessage } from '../../model/message/PlainMessage'; +import { Mosaic } from '../../model/mosaic/Mosaic'; +import { MosaicFlags } from '../../model/mosaic/MosaicFlags'; +import { MosaicId } from '../../model/mosaic/MosaicId'; import { MosaicNonce } from '../../model/mosaic/MosaicNonce'; -import {NamespaceId} from '../../model/namespace/NamespaceId'; -import {AccountAddressRestrictionTransaction} from '../../model/transaction/AccountAddressRestrictionTransaction'; +import { NamespaceId } from '../../model/namespace/NamespaceId'; +import { AccountAddressRestrictionTransaction } from '../../model/transaction/AccountAddressRestrictionTransaction'; import { AccountLinkTransaction } from '../../model/transaction/AccountLinkTransaction'; import { AccountMetadataTransaction } from '../../model/transaction/AccountMetadataTransaction'; -import {AccountMosaicRestrictionTransaction} from '../../model/transaction/AccountMosaicRestrictionTransaction'; -import {AccountOperationRestrictionTransaction} from '../../model/transaction/AccountOperationRestrictionTransaction'; -import {AddressAliasTransaction} from '../../model/transaction/AddressAliasTransaction'; -import {AggregateTransaction} from '../../model/transaction/AggregateTransaction'; -import {AggregateTransactionCosignature} from '../../model/transaction/AggregateTransactionCosignature'; -import {AggregateTransactionInfo} from '../../model/transaction/AggregateTransactionInfo'; -import {Deadline} from '../../model/transaction/Deadline'; -import {LockFundsTransaction} from '../../model/transaction/LockFundsTransaction'; +import { AccountMosaicRestrictionTransaction } from '../../model/transaction/AccountMosaicRestrictionTransaction'; +import { AccountOperationRestrictionTransaction } from '../../model/transaction/AccountOperationRestrictionTransaction'; +import { AddressAliasTransaction } from '../../model/transaction/AddressAliasTransaction'; +import { AggregateTransaction } from '../../model/transaction/AggregateTransaction'; +import { AggregateTransactionCosignature } from '../../model/transaction/AggregateTransactionCosignature'; +import { AggregateTransactionInfo } from '../../model/transaction/AggregateTransactionInfo'; +import { Deadline } from '../../model/transaction/Deadline'; +import { LockFundsTransaction } from '../../model/transaction/LockFundsTransaction'; import { MosaicAddressRestrictionTransaction } from '../../model/transaction/MosaicAddressRestrictionTransaction'; -import {MosaicAliasTransaction} from '../../model/transaction/MosaicAliasTransaction'; -import {MosaicDefinitionTransaction} from '../../model/transaction/MosaicDefinitionTransaction'; +import { MosaicAliasTransaction } from '../../model/transaction/MosaicAliasTransaction'; +import { MosaicDefinitionTransaction } from '../../model/transaction/MosaicDefinitionTransaction'; import { MosaicGlobalRestrictionTransaction } from '../../model/transaction/MosaicGlobalRestrictionTransaction'; import { MosaicMetadataTransaction } from '../../model/transaction/MosaicMetadataTransaction'; -import {MosaicSupplyChangeTransaction} from '../../model/transaction/MosaicSupplyChangeTransaction'; -import {MultisigAccountModificationTransaction} from '../../model/transaction/MultisigAccountModificationTransaction'; +import { MosaicSupplyChangeTransaction } from '../../model/transaction/MosaicSupplyChangeTransaction'; +import { MultisigAccountModificationTransaction } from '../../model/transaction/MultisigAccountModificationTransaction'; import { NamespaceMetadataTransaction } from '../../model/transaction/NamespaceMetadataTransaction'; -import {NamespaceRegistrationTransaction} from '../../model/transaction/NamespaceRegistrationTransaction'; -import {SecretLockTransaction} from '../../model/transaction/SecretLockTransaction'; -import {SecretProofTransaction} from '../../model/transaction/SecretProofTransaction'; -import {SignedTransaction} from '../../model/transaction/SignedTransaction'; -import {Transaction} from '../../model/transaction/Transaction'; -import {TransactionInfo} from '../../model/transaction/TransactionInfo'; -import {TransactionType} from '../../model/transaction/TransactionType'; -import {TransferTransaction} from '../../model/transaction/TransferTransaction'; -import {UInt64} from '../../model/UInt64'; +import { NamespaceRegistrationTransaction } from '../../model/transaction/NamespaceRegistrationTransaction'; +import { SecretLockTransaction } from '../../model/transaction/SecretLockTransaction'; +import { SecretProofTransaction } from '../../model/transaction/SecretProofTransaction'; +import { SignedTransaction } from '../../model/transaction/SignedTransaction'; +import { Transaction } from '../../model/transaction/Transaction'; +import { TransactionInfo } from '../../model/transaction/TransactionInfo'; +import { TransactionType } from '../../model/transaction/TransactionType'; +import { TransferTransaction } from '../../model/transaction/TransferTransaction'; +import { UInt64 } from '../../model/UInt64'; // tslint:disable: no-use-before-declare /** @@ -161,7 +160,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr transactionDTO.version, Deadline.createFromDTO(transactionDTO.deadline), UInt64.fromNumericString(transactionDTO.maxFee || '0'), - MosaicNonce.createFromHex(transactionDTO.nonce.toString(16)), + MosaicNonce.createFromNumber(transactionDTO.nonce), new MosaicId(transactionDTO.id), new MosaicFlags(transactionDTO.flags), transactionDTO.divisibility, diff --git a/src/model/mosaic/MosaicId.ts b/src/model/mosaic/MosaicId.ts index bb2019ddcf..5804ca9c48 100644 --- a/src/model/mosaic/MosaicId.ts +++ b/src/model/mosaic/MosaicId.ts @@ -14,10 +14,10 @@ * limitations under the License. */ import { Convert as convert, RawUInt64 as uint64_t } from '../../core/format'; -import {NamespaceMosaicIdGenerator} from '../../infrastructure/transaction/NamespaceMosaicIdGenerator'; -import {PublicAccount} from '../account/PublicAccount'; -import {Id} from '../Id'; -import {MosaicNonce} from '../mosaic/MosaicNonce'; +import { NamespaceMosaicIdGenerator } from '../../infrastructure/transaction/NamespaceMosaicIdGenerator'; +import { PublicAccount } from '../account/PublicAccount'; +import { Id } from '../Id'; +import { MosaicNonce } from '../mosaic/MosaicNonce'; /** * The mosaic id structure describes mosaic id @@ -39,7 +39,7 @@ export class MosaicId { * @return {MosaicId} */ public static createFromNonce(nonce: MosaicNonce, owner: PublicAccount): MosaicId { - const mosaicId = NamespaceMosaicIdGenerator.mosaicId(nonce.nonce, convert.hexToUint8(owner.publicKey)); + const mosaicId = NamespaceMosaicIdGenerator.mosaicId(nonce.toUint8Array(), convert.hexToUint8(owner.publicKey)); return new MosaicId(mosaicId); } diff --git a/src/model/mosaic/MosaicNonce.ts b/src/model/mosaic/MosaicNonce.ts index baa25c2e36..d120a92b11 100644 --- a/src/model/mosaic/MosaicNonce.ts +++ b/src/model/mosaic/MosaicNonce.ts @@ -13,8 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {Crypto} from '../../core/crypto'; -import { Convert as convert} from '../../core/format'; +import { Crypto } from '../../core/crypto'; +import { Convert as convert } from '../../core/format'; + /** * The mosaic nonce structure * @@ -22,6 +23,18 @@ import { Convert as convert} from '../../core/format'; */ export class MosaicNonce { + /** + * Create MosaicNonce from int + * + * @param nonce nonce + */ + constructor(nonce: Uint8Array) { + if (nonce.length !== 4) { + throw Error('Invalid byte size for nonce, should be 4 bytes but received ' + nonce.length); + } + this.nonce = nonce; + } + /** * Mosaic nonce */ @@ -35,9 +48,29 @@ export class MosaicNonce { public static createRandom(): MosaicNonce { const bytes = Crypto.randomBytes(4); const nonce = new Uint8Array(bytes); + return this.createFromUint8Array(nonce); + } + + /** + * Create a MosaicNonce from a Uint8Array notation. + * + * @param nonce {number} + * @return {MosaicNonce} + */ + public static createFromUint8Array(nonce: Uint8Array): MosaicNonce { return new MosaicNonce(nonce); } + /** + * Create a MosaicNonce from a number notation. + * + * @param nonce {number} + * @return {MosaicNonce} + */ + public static createFromNumber(nonce: number): MosaicNonce { + return new MosaicNonce(convert.numberToUint8Array(nonce, 4)); + } + /** * Create a MosaicNonce from hexadecimal notation. * @@ -45,39 +78,27 @@ export class MosaicNonce { * @return {MosaicNonce} */ public static createFromHex(hex: string): MosaicNonce { - const uint8 = convert.hexToUint8(hex.padStart(8, '0')); - - if (uint8.length !== 4) { - throw new Error('Expected 4 bytes for Nonce and got ' + hex.length + ' instead.'); - } - - return new MosaicNonce(uint8); + return new MosaicNonce(convert.hexToUint8(hex)); } /** - * Create MosaicNonce from Uint8Array - * - * @param id + * @returns the nonce as an array of 4 digits */ - constructor(nonce: Uint8Array) { - if (nonce.length !== 4) { - throw Error('Invalid byte size for nonce, should be 4 bytes but received ' + nonce.length); - } - - this.nonce = nonce; + public toUint8Array(): Uint8Array { + return this.nonce; } /** * @internal - * @returns {[number,number,number,number]} + * @returns the nonce as number */ public toDTO(): number { - return (this.nonce[0] + (this.nonce[1] << 8) + (this.nonce[2] << 16) + (this.nonce[3] << 24)) >>> 0; + return convert.uintArray8ToNumber(this.nonce); } /** * Get string value of nonce - * @returns {string} + * @returns the nonce as hex */ public toHex(): string { return convert.uint8ToHex(this.nonce); diff --git a/src/model/transaction/MosaicDefinitionTransaction.ts b/src/model/transaction/MosaicDefinitionTransaction.ts index c982f61151..4c537560ab 100644 --- a/src/model/transaction/MosaicDefinitionTransaction.ts +++ b/src/model/transaction/MosaicDefinitionTransaction.ts @@ -19,7 +19,6 @@ import { BlockDurationDto, EmbeddedMosaicDefinitionTransactionBuilder, EmbeddedTransactionBuilder, - GeneratorUtils, KeyDto, MosaicDefinitionTransactionBuilder, MosaicIdDto, @@ -138,7 +137,7 @@ export class MosaicDefinitionTransaction extends Transaction { const transaction = MosaicDefinitionTransaction.create( isEmbedded ? Deadline.create() : Deadline.createFromDTO( (builder as MosaicDefinitionTransactionBuilder).getDeadline().timestamp), - new MosaicNonce(builder.getNonce().serialize()), + MosaicNonce.createFromUint8Array(builder.getNonce().serialize()), new MosaicId(builder.getId().mosaicId), MosaicFlags.create( (builder.getFlags() & 1) === 1, diff --git a/src/service/TransactionService.ts b/src/service/TransactionService.ts index a80636b4d2..8946d809ca 100644 --- a/src/service/TransactionService.ts +++ b/src/service/TransactionService.ts @@ -71,10 +71,9 @@ export class TransactionService implements ITransactionService { */ public announce(signedTransaction: SignedTransaction, listener: IListener): Observable { const signerAddress = signedTransaction.getSignerAddress(); - const transactionObservable = this.transactionRepository.announce(signedTransaction).pipe( - flatMap(() => listener.confirmed(signerAddress, signedTransaction.hash)), - ); - return this.getTransactionOrRaiseError(listener, signerAddress, signedTransaction.hash, transactionObservable); + this.transactionRepository.announce(signedTransaction); + return this.getTransactionOrRaiseError(listener, + signerAddress, signedTransaction.hash, listener.confirmed(signerAddress, signedTransaction.hash)); } /** diff --git a/test/core/format/Convert.spec.ts b/test/core/format/Convert.spec.ts index c82cfa3f87..76afe057c6 100644 --- a/test/core/format/Convert.spec.ts +++ b/test/core/format/Convert.spec.ts @@ -13,8 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {expect} from 'chai'; -import {Convert as convert} from '../../../src/core/format'; +import { expect } from 'chai'; +import { Convert as convert } from '../../../src/core/format'; describe('convert', () => { describe('toByte', () => { @@ -193,9 +193,9 @@ describe('convert', () => { it('uint8 array with length not multiple of four cannot be converted to uint32 array', () => { // Assert: expect(() => { - convert.uint8ToUint32(Uint8Array.of(0x02, 0x6E, 0xE4, 0x15, 0x15)); - }) - .to.throw('byte length of Uint32Array should be a multiple of 4'); + convert.uint8ToUint32(Uint8Array.of(0x02, 0x6E, 0xE4, 0x15, 0x15)); + }) + .to.throw('byte length of Uint32Array should be a multiple of 4'); }); }); @@ -245,10 +245,10 @@ describe('convert', () => { describe('signed <-> unsigned byte', () => { const testCases = [{ - signed: -128, - unsigned: 0x80, - description: 'min negative', - }, + signed: -128, + unsigned: 0x80, + description: 'min negative', + }, { signed: -127, unsigned: 0x81, @@ -293,9 +293,9 @@ describe('convert', () => { describe('uint8ToInt8', () => { const failureTestCases = [{ - input: 256, - description: 'one too large', - }, + input: 256, + description: 'one too large', + }, { input: 1000, description: 'very large', @@ -322,9 +322,9 @@ describe('convert', () => { describe('int8ToUint8', () => { const failureTestCases = [{ - input: -1000, - description: 'very small', - }, + input: -1000, + description: 'very small', + }, { input: -129, description: 'one too small', @@ -402,4 +402,17 @@ describe('convert', () => { expect(result).to.be.equal(expected); }); }); + + describe('uint8ToNumber', () => { + it('should convert to number and back', () => { + const expected = 123456789; + const array = convert.numberToUint8Array(expected, 4); + // Act: + const result = convert.uintArray8ToNumber(array); + + // Assert: + expect(result).to.be.equal(expected); + }); + }); + }); diff --git a/test/core/utils/TransactionMapping.spec.ts b/test/core/utils/TransactionMapping.spec.ts index ecfda570d4..5bf7987125 100644 --- a/test/core/utils/TransactionMapping.spec.ts +++ b/test/core/utils/TransactionMapping.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {deepEqual} from 'assert'; +import { deepEqual } from 'assert'; import { expect } from 'chai'; import { sha3_256 } from 'js-sha3'; import { Convert } from '../../../src/core/format'; @@ -47,7 +47,6 @@ import { AccountRestrictionModification } from '../../../src/model/transaction/A import { AccountRestrictionTransaction } from '../../../src/model/transaction/AccountRestrictionTransaction'; import { AddressAliasTransaction } from '../../../src/model/transaction/AddressAliasTransaction'; import { AggregateTransaction } from '../../../src/model/transaction/AggregateTransaction'; -import { CosignatoryModificationAction } from '../../../src/model/transaction/CosignatoryModificationAction'; import { Deadline } from '../../../src/model/transaction/Deadline'; import { HashType } from '../../../src/model/transaction/HashType'; import { LinkAction } from '../../../src/model/transaction/LinkAction'; @@ -59,12 +58,11 @@ import { MosaicGlobalRestrictionTransaction } from '../../../src/model/transacti import { MosaicMetadataTransaction } from '../../../src/model/transaction/MosaicMetadataTransaction'; import { MosaicSupplyChangeTransaction } from '../../../src/model/transaction/MosaicSupplyChangeTransaction'; import { MultisigAccountModificationTransaction } from '../../../src/model/transaction/MultisigAccountModificationTransaction'; -import { MultisigCosignatoryModification } from '../../../src/model/transaction/MultisigCosignatoryModification'; import { NamespaceMetadataTransaction } from '../../../src/model/transaction/NamespaceMetadataTransaction'; import { NamespaceRegistrationTransaction } from '../../../src/model/transaction/NamespaceRegistrationTransaction'; import { SecretLockTransaction } from '../../../src/model/transaction/SecretLockTransaction'; import { SecretProofTransaction } from '../../../src/model/transaction/SecretProofTransaction'; -import { TransactionType } from '../../../src/model/transaction/TransactionType' ; +import { TransactionType } from '../../../src/model/transaction/TransactionType'; import { TransferTransaction } from '../../../src/model/transaction/TransferTransaction'; import { UInt64 } from '../../../src/model/UInt64'; import { TestingAccount } from '../../conf/conf.spec'; @@ -184,7 +182,7 @@ describe('TransactionMapping - createFromPayload', () => { it('should create MosaicDefinitionTransaction', () => { const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create( Deadline.create(), - new MosaicNonce(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce + MosaicNonce.createFromUint8Array(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce new MosaicId(UInt64.fromUint(1).toDTO()), // ID MosaicFlags.create(false, false, false), 3, @@ -208,7 +206,7 @@ describe('TransactionMapping - createFromPayload', () => { it('should create MosaicDefinitionTransaction - without duration', () => { const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create( Deadline.create(), - new MosaicNonce(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce + MosaicNonce.createFromUint8Array(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce new MosaicId(UInt64.fromUint(1).toDTO()), // ID MosaicFlags.create(false, false, false), 3, @@ -230,7 +228,7 @@ describe('TransactionMapping - createFromPayload', () => { it('should create MosaicDefinitionTransaction - without duration', () => { const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create( Deadline.create(), - new MosaicNonce(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce + MosaicNonce.createFromUint8Array(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce new MosaicId(UInt64.fromUint(1).toDTO()), // ID MosaicFlags.create(false, false, false), 3, @@ -252,7 +250,7 @@ describe('TransactionMapping - createFromPayload', () => { it('should create MosaicDefinitionTransaction - without duration', () => { const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create( Deadline.create(), - new MosaicNonce(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce + MosaicNonce.createFromUint8Array(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce new MosaicId(UInt64.fromUint(1).toDTO()), // ID MosaicFlags.create(false, false, false), 3, @@ -274,7 +272,7 @@ describe('TransactionMapping - createFromPayload', () => { it('should create MosaicDefinitionTransaction - without duration', () => { const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create( Deadline.create(), - new MosaicNonce(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce + MosaicNonce.createFromUint8Array(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce new MosaicId(UInt64.fromUint(1).toDTO()), // ID MosaicFlags.create(false, false, false), 3, @@ -829,7 +827,7 @@ describe('TransactionMapping - createFromDTO (Transaction.toJSON() feed)', () => it('should create MosaicDefinitionTransaction', () => { const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create( Deadline.create(), - new MosaicNonce(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce + MosaicNonce.createFromUint8Array(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce new MosaicId(UInt64.fromUint(1).toDTO()), // ID MosaicFlags.create(false, false, false), 3, diff --git a/test/infrastructure/NodeHttp.spec.ts b/test/infrastructure/NodeHttp.spec.ts index c17e51ab6d..c3a15daaa7 100644 --- a/test/infrastructure/NodeHttp.spec.ts +++ b/test/infrastructure/NodeHttp.spec.ts @@ -162,8 +162,7 @@ describe('NodeHttp', () => { it('getStorageInfo on Exception', async () => { when(nodeRoutesApi.getNodeStorage()).thenReturn(Promise.reject({ - response: {statusCode: 500, statusMessage: 'Some Error'}, - body: 'The Body', + response: {statusCode: 500, statusMessage: 'Some Error', body: 'The Body',}, })); try { await nodeRepository.getStorageInfo().toPromise(); diff --git a/test/infrastructure/SerializeTransactionToJSON.spec.ts b/test/infrastructure/SerializeTransactionToJSON.spec.ts index 5e23359f61..49c0275d1a 100644 --- a/test/infrastructure/SerializeTransactionToJSON.spec.ts +++ b/test/infrastructure/SerializeTransactionToJSON.spec.ts @@ -16,7 +16,7 @@ import { expect } from 'chai'; import { sha3_256 } from 'js-sha3'; -import {Convert as convert} from '../../src/core/format'; +import { Convert as convert } from '../../src/core/format'; import { Account } from '../../src/model/account/Account'; import { Address } from '../../src/model/account/Address'; import { PublicAccount } from '../../src/model/account/PublicAccount'; @@ -45,7 +45,7 @@ import { MultisigAccountModificationTransaction } from '../../src/model/transact import { NamespaceRegistrationTransaction } from '../../src/model/transaction/NamespaceRegistrationTransaction'; import { SecretLockTransaction } from '../../src/model/transaction/SecretLockTransaction'; import { SecretProofTransaction } from '../../src/model/transaction/SecretProofTransaction'; -import { TransactionType } from '../../src/model/transaction/TransactionType' ; +import { TransactionType } from '../../src/model/transaction/TransactionType'; import { TransferTransaction } from '../../src/model/transaction/TransferTransaction'; import { UInt64 } from '../../src/model/UInt64'; import { TestingAccount } from '../conf/conf.spec'; @@ -159,7 +159,7 @@ describe('SerializeTransactionToJSON', () => { it('should create MosaicDefinitionTransaction', () => { const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create( Deadline.create(), - new MosaicNonce(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce + MosaicNonce.createFromUint8Array(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce new MosaicId(UInt64.fromUint(1).toDTO()), // ID MosaicFlags.create(true, true, true), 5, @@ -179,7 +179,7 @@ describe('SerializeTransactionToJSON', () => { it('should create MosaicDefinitionTransaction without duration', () => { const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create( Deadline.create(), - new MosaicNonce(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce + MosaicNonce.createFromUint8Array(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce new MosaicId(UInt64.fromUint(1).toDTO()), // ID MosaicFlags.create(true, false), 3, diff --git a/test/model/mosaic/MosaicId.spec.ts b/test/model/mosaic/MosaicId.spec.ts index 256f44ec69..1ba7c5670b 100644 --- a/test/model/mosaic/MosaicId.spec.ts +++ b/test/model/mosaic/MosaicId.spec.ts @@ -13,13 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {deepEqual} from 'assert'; -import {expect} from 'chai'; -import {PublicAccount} from '../../../src/model/account/PublicAccount'; -import {NetworkType} from '../../../src/model/blockchain/NetworkType'; -import {Id} from '../../../src/model/Id'; -import {MosaicId} from '../../../src/model/mosaic/MosaicId'; -import {MosaicNonce} from '../../../src/model/mosaic/MosaicNonce'; +import { deepEqual } from 'assert'; +import { PublicAccount } from '../../../src/model/account/PublicAccount'; +import { NetworkType } from '../../../src/model/blockchain/NetworkType'; +import { Id } from '../../../src/model/Id'; +import { MosaicId } from '../../../src/model/mosaic/MosaicId'; +import { MosaicNonce } from '../../../src/model/mosaic/MosaicNonce'; describe('MosaicId', () => { const publicKey = 'b4f12e7c9f6946091e2cb8b6d3a12b50d17ccbbf646386ea27ce2946a7423dcf'; @@ -36,17 +35,14 @@ describe('MosaicId', () => { it('should create id given nonce and owner', () => { const owner = PublicAccount.createFromPublicKey(publicKey, NetworkType.MIJIN_TEST); - const bytes = new Uint8Array([0x0, 0x0, 0x0, 0x0]); - const id = MosaicId.createFromNonce(new MosaicNonce(bytes), owner); - + const id = MosaicId.createFromNonce(MosaicNonce.createFromNumber(0), owner); deepEqual(id.id, new Id([481110499, 231112638])); }); it('should create id twice the same given nonce and owner', () => { const owner = PublicAccount.createFromPublicKey(publicKey, NetworkType.MIJIN_TEST); - const bytes = new Uint8Array([0x0, 0x0, 0x0, 0x0]); - const id1 = MosaicId.createFromNonce(new MosaicNonce(bytes), owner); - const id2 = MosaicId.createFromNonce(new MosaicNonce(bytes), owner); + const id1 = MosaicId.createFromNonce(MosaicNonce.createFromNumber(12), owner); + const id2 = MosaicId.createFromNonce(MosaicNonce.createFromNumber(12), owner); deepEqual(id1.id, id2.id); }); diff --git a/test/model/mosaic/MosaicNonce.spec.ts b/test/model/mosaic/MosaicNonce.spec.ts index b5b062a299..65c7e9f1df 100644 --- a/test/model/mosaic/MosaicNonce.spec.ts +++ b/test/model/mosaic/MosaicNonce.spec.ts @@ -13,23 +13,27 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {deepEqual} from 'assert'; -import {expect} from 'chai'; -import {PublicAccount} from '../../../src/model/account/PublicAccount'; -import {NetworkType} from '../../../src/model/blockchain/NetworkType'; -import {MosaicNonce} from '../../../src/model/mosaic/MosaicNonce'; +import { deepEqual } from 'assert'; +import { expect } from 'chai'; +import { MosaicNonce } from '../../../src/model/mosaic/MosaicNonce'; describe('MosaicNonce', () => { it('should be created from Uint8Array', () => { - const nonce = new MosaicNonce(new Uint8Array([0x0, 0x0, 0x0, 0x0])); - deepEqual(nonce.nonce, new Uint8Array([0x0, 0x0, 0x0, 0x0])); + const nonce = new MosaicNonce(new Uint8Array([0, 0, 0, 0])); deepEqual(nonce.toDTO(), 0); }); it('should create random nonce', () => { const nonce = MosaicNonce.createRandom(); expect(nonce.nonce).to.not.be.null; + expect(nonce.toUint8Array()).to.not.be.null; + }); + + it('should create from createFromUint8Array', () => { + const nonce = MosaicNonce.createFromUint8Array(new Uint8Array([1, 2, 3, 4])); + expect(nonce.toDTO()).to.be.equals(67305985); + expect(nonce.toUint8Array()).to.be.deep.equal(new Uint8Array([1, 2, 3, 4])); }); it('should create random nonce twice not the same', () => { @@ -38,40 +42,50 @@ describe('MosaicNonce', () => { expect(nonce1.nonce).to.not.be.null; expect(nonce2.nonce).to.not.be.null; expect(nonce2.nonce).to.not.be.equal(nonce1.nonce); + expect(nonce2.toUint8Array()).to.not.deep.equal(nonce1.toUint8Array()); + expect(nonce2.toUint8Array()).to.not.be.null; }); it('should create nonce from hexadecimal notation', () => { const nonce = MosaicNonce.createFromHex('00000000'); expect(nonce.nonce).to.not.be.null; - deepEqual(nonce.nonce, new Uint8Array([0x0, 0x0, 0x0, 0x0])); + deepEqual(nonce.toUint8Array(), new Uint8Array([0, 0, 0, 0])); deepEqual(nonce.toDTO(), 0); }); it('should create nonce from hexadecimal notation throw exception', () => { expect(() => { MosaicNonce.createFromHex('111100000000'); - }).to.throw(Error, 'Expected 4 bytes for Nonce and got ' + '111100000000'.length + ' instead.'); + }).to.throw(Error, 'Invalid byte size for nonce, should be 4 bytes but received 6'); }); it('should create nonce from hexadecimal notation with uint32 input - 0 value', () => { - const nonce = MosaicNonce.createFromHex((0).toString(16)); + const nonce = MosaicNonce.createFromHex((0).toString(16).padStart(8, '0')); expect(nonce.nonce).to.not.be.null; - deepEqual(nonce.nonce, new Uint8Array([0x0, 0x0, 0x0, 0x0])); + deepEqual(nonce.nonce, new Uint8Array([0, 0, 0, 0])); deepEqual(nonce.toDTO(), 0); }); it('should create nonce from hexadecimal notation with uint32 input', () => { - const nonce = MosaicNonce.createFromHex((11).toString(16)); + const hex = (1845149376).toString(16); + const nonce = MosaicNonce.createFromHex(hex); expect(nonce.nonce).to.not.be.null; - deepEqual(nonce.nonce, new Uint8Array([0, 0, 0, 11])); - deepEqual(nonce.toDTO(), 184549376); + deepEqual(nonce.toUint8Array(), new Uint8Array([109, 250, 190, 192])); + deepEqual(nonce.toDTO(), 3233741421); + deepEqual(nonce.toHex().toUpperCase(), hex.toUpperCase()); }); describe('toHex()', () => { it('should return string value of nonce', () => { - const nonce = new MosaicNonce(new Uint8Array([0x0, 0x0, 0x0, 0x0])); + const nonce = new MosaicNonce(new Uint8Array([0, 0, 0, 0])); const hex = nonce.toHex(); expect(hex).to.be.equal('00000000'); }); + + it('should return string value of nonce', () => { + const nonce = new MosaicNonce(new Uint8Array([1, 2, 3, 4])); + const hex = nonce.toHex(); + expect(hex).to.be.equal('01020304'); + }); }); }); diff --git a/test/model/transaction/AggregateTransaction.spec.ts b/test/model/transaction/AggregateTransaction.spec.ts index ac4755084e..d5a3f2b86e 100644 --- a/test/model/transaction/AggregateTransaction.spec.ts +++ b/test/model/transaction/AggregateTransaction.spec.ts @@ -14,22 +14,21 @@ * limitations under the License. */ -import {expect} from 'chai'; -import {ChronoUnit} from 'js-joda'; -import {Convert} from '../../../src/core/format'; +import { expect } from 'chai'; +import { ChronoUnit } from 'js-joda'; +import { Convert } from '../../../src/core/format'; import { TransactionMapping } from '../../../src/core/utils/TransactionMapping'; -import {CreateTransactionFromDTO} from '../../../src/infrastructure/transaction/CreateTransactionFromDTO'; -import { CreateTransactionFromPayload } from '../../../src/infrastructure/transaction/CreateTransactionFromPayload'; -import {Account} from '../../../src/model/account/Account'; -import {Address} from '../../../src/model/account/Address'; -import {PublicAccount} from '../../../src/model/account/PublicAccount'; -import {NetworkType} from '../../../src/model/blockchain/NetworkType'; -import {PlainMessage} from '../../../src/model/message/PlainMessage'; +import { CreateTransactionFromDTO } from '../../../src/infrastructure/transaction/CreateTransactionFromDTO'; +import { Account } from '../../../src/model/account/Account'; +import { Address } from '../../../src/model/account/Address'; +import { PublicAccount } from '../../../src/model/account/PublicAccount'; +import { NetworkType } from '../../../src/model/blockchain/NetworkType'; +import { PlainMessage } from '../../../src/model/message/PlainMessage'; import { Mosaic } from '../../../src/model/mosaic/Mosaic'; -import {MosaicFlags} from '../../../src/model/mosaic/MosaicFlags'; -import {MosaicId} from '../../../src/model/mosaic/MosaicId'; -import {MosaicNonce} from '../../../src/model/mosaic/MosaicNonce'; -import {MosaicSupplyChangeAction} from '../../../src/model/mosaic/MosaicSupplyChangeAction'; +import { MosaicFlags } from '../../../src/model/mosaic/MosaicFlags'; +import { MosaicId } from '../../../src/model/mosaic/MosaicId'; +import { MosaicNonce } from '../../../src/model/mosaic/MosaicNonce'; +import { MosaicSupplyChangeAction } from '../../../src/model/mosaic/MosaicSupplyChangeAction'; import { NetworkCurrencyLocal } from '../../../src/model/mosaic/NetworkCurrencyLocal'; import { NamespaceId } from '../../../src/model/namespace/NamespaceId'; import { ReceiptSource } from '../../../src/model/receipt/ReceiptSource'; @@ -37,20 +36,20 @@ import { ResolutionEntry } from '../../../src/model/receipt/ResolutionEntry'; import { ResolutionStatement } from '../../../src/model/receipt/ResolutionStatement'; import { ResolutionType } from '../../../src/model/receipt/ResolutionType'; import { Statement } from '../../../src/model/receipt/Statement'; -import {AggregateTransaction} from '../../../src/model/transaction/AggregateTransaction'; -import {AggregateTransactionCosignature} from '../../../src/model/transaction/AggregateTransactionCosignature'; +import { AggregateTransaction } from '../../../src/model/transaction/AggregateTransaction'; +import { AggregateTransactionCosignature } from '../../../src/model/transaction/AggregateTransactionCosignature'; import { CosignatureSignedTransaction } from '../../../src/model/transaction/CosignatureSignedTransaction'; import { CosignatureTransaction } from '../../../src/model/transaction/CosignatureTransaction'; -import {Deadline} from '../../../src/model/transaction/Deadline'; -import {MosaicDefinitionTransaction} from '../../../src/model/transaction/MosaicDefinitionTransaction'; -import {MosaicSupplyChangeTransaction} from '../../../src/model/transaction/MosaicSupplyChangeTransaction'; -import {MultisigAccountModificationTransaction} from '../../../src/model/transaction/MultisigAccountModificationTransaction'; -import {NamespaceRegistrationTransaction} from '../../../src/model/transaction/NamespaceRegistrationTransaction'; +import { Deadline } from '../../../src/model/transaction/Deadline'; +import { MosaicDefinitionTransaction } from '../../../src/model/transaction/MosaicDefinitionTransaction'; +import { MosaicSupplyChangeTransaction } from '../../../src/model/transaction/MosaicSupplyChangeTransaction'; +import { MultisigAccountModificationTransaction } from '../../../src/model/transaction/MultisigAccountModificationTransaction'; +import { NamespaceRegistrationTransaction } from '../../../src/model/transaction/NamespaceRegistrationTransaction'; import { TransactionInfo } from '../../../src/model/transaction/TransactionInfo'; import { TransactionType } from '../../../src/model/transaction/TransactionType'; -import {TransferTransaction} from '../../../src/model/transaction/TransferTransaction'; -import {UInt64} from '../../../src/model/UInt64'; -import {Cosignatory2Account, CosignatoryAccount, MultisigAccount, TestingAccount} from '../../conf/conf.spec'; +import { TransferTransaction } from '../../../src/model/transaction/TransferTransaction'; +import { UInt64 } from '../../../src/model/UInt64'; +import { Cosignatory2Account, CosignatoryAccount, MultisigAccount, TestingAccount } from '../../conf/conf.spec'; describe('AggregateTransaction', () => { let account: Account; @@ -164,7 +163,7 @@ describe('AggregateTransaction', () => { it('should createComplete an AggregateTransaction object with MosaicDefinitionTransaction', () => { const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create( Deadline.create(), - new MosaicNonce(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce + MosaicNonce.createFromUint8Array(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce new MosaicId(UInt64.fromUint(1).toDTO()), // ID MosaicFlags.create(true, true, true), 3, diff --git a/test/model/transaction/MosaicDefinitionTransaction.spec.ts b/test/model/transaction/MosaicDefinitionTransaction.spec.ts index 9be5cb72b5..c1a4d9bc42 100644 --- a/test/model/transaction/MosaicDefinitionTransaction.spec.ts +++ b/test/model/transaction/MosaicDefinitionTransaction.spec.ts @@ -14,17 +14,17 @@ * limitations under the License. */ -import {expect} from 'chai'; -import {Convert} from '../../../src/core/format'; -import {Account} from '../../../src/model/account/Account'; -import {NetworkType} from '../../../src/model/blockchain/NetworkType'; -import {MosaicFlags} from '../../../src/model/mosaic/MosaicFlags'; -import {MosaicId} from '../../../src/model/mosaic/MosaicId'; -import {MosaicNonce} from '../../../src/model/mosaic/MosaicNonce'; -import {Deadline} from '../../../src/model/transaction/Deadline'; -import {MosaicDefinitionTransaction} from '../../../src/model/transaction/MosaicDefinitionTransaction'; -import {UInt64} from '../../../src/model/UInt64'; -import {TestingAccount} from '../../conf/conf.spec'; +import { expect } from 'chai'; +import { Convert } from '../../../src/core/format'; +import { Account } from '../../../src/model/account/Account'; +import { NetworkType } from '../../../src/model/blockchain/NetworkType'; +import { MosaicFlags } from '../../../src/model/mosaic/MosaicFlags'; +import { MosaicId } from '../../../src/model/mosaic/MosaicId'; +import { MosaicNonce } from '../../../src/model/mosaic/MosaicNonce'; +import { Deadline } from '../../../src/model/transaction/Deadline'; +import { MosaicDefinitionTransaction } from '../../../src/model/transaction/MosaicDefinitionTransaction'; +import { UInt64 } from '../../../src/model/UInt64'; +import { TestingAccount } from '../../conf/conf.spec'; describe('MosaicDefinitionTransaction', () => { let account: Account; @@ -36,7 +36,7 @@ describe('MosaicDefinitionTransaction', () => { it('should default maxFee field be set to 0', () => { const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create( Deadline.create(), - new MosaicNonce(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce + MosaicNonce.createFromUint8Array(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce new MosaicId(UInt64.fromUint(1).toDTO()), // ID MosaicFlags.create(true, true, true), 3, @@ -51,7 +51,7 @@ describe('MosaicDefinitionTransaction', () => { it('should filled maxFee override transaction maxFee', () => { const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create( Deadline.create(), - new MosaicNonce(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce + MosaicNonce.createFromUint8Array(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce new MosaicId(UInt64.fromUint(1).toDTO()), // ID MosaicFlags.create(true, true, true), 3, @@ -67,7 +67,7 @@ describe('MosaicDefinitionTransaction', () => { it('should createComplete an MosaicDefinitionTransaction object and sign it with flags 7', () => { const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create( Deadline.create(), - new MosaicNonce(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce + MosaicNonce.createFromUint8Array(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce new MosaicId(UInt64.fromUint(1).toDTO()), // ID MosaicFlags.create(true, true, true), 3, @@ -95,7 +95,7 @@ describe('MosaicDefinitionTransaction', () => { const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create( Deadline.create(), - new MosaicNonce(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce + MosaicNonce.createFromUint8Array(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce new MosaicId(UInt64.fromUint(1).toDTO()), // ID MosaicFlags.create(false, false, false), 3, @@ -123,7 +123,7 @@ describe('MosaicDefinitionTransaction', () => { it('should return 150 for MosaicDefinition transaction byte size', () => { const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create( Deadline.create(), - new MosaicNonce(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce + MosaicNonce.createFromUint8Array(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce new MosaicId(UInt64.fromUint(1).toDTO()), // ID MosaicFlags.create(true, true, false), 3, @@ -139,7 +139,7 @@ describe('MosaicDefinitionTransaction', () => { const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create( Deadline.create(), - new MosaicNonce(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce + MosaicNonce.createFromUint8Array(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce new MosaicId(UInt64.fromUint(1).toDTO()), // ID MosaicFlags.create(false, false, false), 3, @@ -163,7 +163,7 @@ describe('MosaicDefinitionTransaction', () => { it('Test set maxFee using multiplier', () => { const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create( Deadline.create(), - new MosaicNonce(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce + MosaicNonce.createFromUint8Array(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce new MosaicId(UInt64.fromUint(1).toDTO()), // ID MosaicFlags.create(false, false, false), 3, From aeea6d5c16bb391afdae697f14fd974c5bdcb9f7 Mon Sep 17 00:00:00 2001 From: Fernando Boucquez Date: Wed, 4 Mar 2020 13:28:11 -0300 Subject: [PATCH 2/4] Changed nonce in e2e to the greatest one --- e2e/infrastructure/MosaicHttp.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/infrastructure/MosaicHttp.spec.ts b/e2e/infrastructure/MosaicHttp.spec.ts index 8962043a56..8367a5440d 100644 --- a/e2e/infrastructure/MosaicHttp.spec.ts +++ b/e2e/infrastructure/MosaicHttp.spec.ts @@ -66,7 +66,7 @@ describe('MosaicHttp', () => { describe('Setup test MosaicId', () => { it('Announce MosaicDefinitionTransaction', async () => { - const nonce = MosaicNonce.createFromNumber(999999999); + const nonce = MosaicNonce.createFromUint8Array(new Uint8Array([255, 255, 255, 255])); mosaicId = MosaicId.createFromNonce(nonce, account.publicAccount); const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create( Deadline.create(), From d6251eebd295b88deb409c4b027a63d18b6d8411 Mon Sep 17 00:00:00 2001 From: Fernando Boucquez Date: Wed, 4 Mar 2020 14:24:20 -0300 Subject: [PATCH 3/4] Improved e2e test --- e2e/infrastructure/MosaicHttp.spec.ts | 7 ++++++- test/core/format/Convert.spec.ts | 19 ++++++++++++++++--- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/e2e/infrastructure/MosaicHttp.spec.ts b/e2e/infrastructure/MosaicHttp.spec.ts index 8367a5440d..921b5c1c4d 100644 --- a/e2e/infrastructure/MosaicHttp.spec.ts +++ b/e2e/infrastructure/MosaicHttp.spec.ts @@ -66,7 +66,7 @@ describe('MosaicHttp', () => { describe('Setup test MosaicId', () => { it('Announce MosaicDefinitionTransaction', async () => { - const nonce = MosaicNonce.createFromUint8Array(new Uint8Array([255, 255, 255, 255])); + const nonce = MosaicNonce.createFromUint8Array(new Uint8Array([200, 255, 255, 255])); mosaicId = MosaicId.createFromNonce(nonce, account.publicAccount); const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create( Deadline.create(), @@ -84,6 +84,11 @@ describe('MosaicHttp', () => { expect(mosaicDefinitionTransaction.nonce.toHex()).to.be.equal(listenedTransaction.nonce.toHex()); expect(mosaicDefinitionTransaction.nonce).to.deep.equal(listenedTransaction.nonce); expect(mosaicDefinitionTransaction.getMosaicNonceIntValue()).to.be.equal(listenedTransaction.getMosaicNonceIntValue()); + + const savedTransaction = await helper.repositoryFactory.createTransactionRepository().getTransaction(signedTransaction.hash).toPromise() as MosaicDefinitionTransaction; + expect(mosaicDefinitionTransaction.nonce.toHex()).to.be.equal(savedTransaction.nonce.toHex()); + expect(mosaicDefinitionTransaction.nonce).to.deep.equal(savedTransaction.nonce); + expect(mosaicDefinitionTransaction.getMosaicNonceIntValue()).to.be.equal(savedTransaction.getMosaicNonceIntValue()); }); }); diff --git a/test/core/format/Convert.spec.ts b/test/core/format/Convert.spec.ts index 76afe057c6..a3c729ae56 100644 --- a/test/core/format/Convert.spec.ts +++ b/test/core/format/Convert.spec.ts @@ -405,13 +405,26 @@ describe('convert', () => { describe('uint8ToNumber', () => { it('should convert to number and back', () => { - const expected = 123456789; - const array = convert.numberToUint8Array(expected, 4); + const input = 123456789; + const array = convert.numberToUint8Array(input, 4); // Act: const result = convert.uintArray8ToNumber(array); // Assert: - expect(result).to.be.equal(expected); + expect(result).to.be.equal(input); + }); + }); + + describe('uint8ToNumber', () => { + it('should convert to number and back when negative', () => { + const input = 123456789 >> (Number.MAX_SAFE_INTEGER); + const array = convert.numberToUint8Array(input, 4); + // Act: + const result = convert.uintArray8ToNumber(array); + + // Assert: + expect(result).to.be.equal(123456789); + expect(input).to.be.equal(123456789); }); }); From 963db2d99c3e2999c5f27808633bb9da4b718053 Mon Sep 17 00:00:00 2001 From: Fernando Boucquez Date: Wed, 4 Mar 2020 14:54:14 -0300 Subject: [PATCH 4/4] fixed unit test --- e2e/infrastructure/MosaicHttp.spec.ts | 4 +++- test/core/format/Convert.spec.ts | 10 ++++------ test/model/mosaic/MosaicNonce.spec.ts | 9 +++++++++ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/e2e/infrastructure/MosaicHttp.spec.ts b/e2e/infrastructure/MosaicHttp.spec.ts index 921b5c1c4d..2c5e490e5b 100644 --- a/e2e/infrastructure/MosaicHttp.spec.ts +++ b/e2e/infrastructure/MosaicHttp.spec.ts @@ -66,7 +66,9 @@ describe('MosaicHttp', () => { describe('Setup test MosaicId', () => { it('Announce MosaicDefinitionTransaction', async () => { - const nonce = MosaicNonce.createFromUint8Array(new Uint8Array([200, 255, 255, 255])); + const nonce = MosaicNonce.createFromNumber(-1501238750); + expect(nonce.toDTO()).to.be.equals(2793728546); + expect(nonce.toHex()).to.be.equals('22EA84A6'); mosaicId = MosaicId.createFromNonce(nonce, account.publicAccount); const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create( Deadline.create(), diff --git a/test/core/format/Convert.spec.ts b/test/core/format/Convert.spec.ts index a3c729ae56..a0b0e41469 100644 --- a/test/core/format/Convert.spec.ts +++ b/test/core/format/Convert.spec.ts @@ -403,7 +403,7 @@ describe('convert', () => { }); }); - describe('uint8ToNumber', () => { + describe('numberToUint8Array', () => { it('should convert to number and back', () => { const input = 123456789; const array = convert.numberToUint8Array(input, 4); @@ -413,18 +413,16 @@ describe('convert', () => { // Assert: expect(result).to.be.equal(input); }); - }); - describe('uint8ToNumber', () => { it('should convert to number and back when negative', () => { - const input = 123456789 >> (Number.MAX_SAFE_INTEGER); + const input = -123456789; const array = convert.numberToUint8Array(input, 4); // Act: const result = convert.uintArray8ToNumber(array); // Assert: - expect(result).to.be.equal(123456789); - expect(input).to.be.equal(123456789); + expect(result).to.be.equal(4171510507); + expect(input).to.be.equal(-123456789); }); }); diff --git a/test/model/mosaic/MosaicNonce.spec.ts b/test/model/mosaic/MosaicNonce.spec.ts index 65c7e9f1df..0247f64449 100644 --- a/test/model/mosaic/MosaicNonce.spec.ts +++ b/test/model/mosaic/MosaicNonce.spec.ts @@ -59,6 +59,15 @@ describe('MosaicNonce', () => { }).to.throw(Error, 'Invalid byte size for nonce, should be 4 bytes but received 6'); }); + it('should createFromHex from nonce', () => { + const nonce = MosaicNonce.createFromHex('FFFFFFC8'); + deepEqual(nonce.toHex().toUpperCase(), 'FFFFFFC8'); + deepEqual(nonce.toDTO(), 3372220415); + + const nonce2 = MosaicNonce.createFromNumber(nonce.toDTO()); + deepEqual(nonce2.toHex().toUpperCase(), 'FFFFFFC8'); + }); + it('should create nonce from hexadecimal notation with uint32 input - 0 value', () => { const nonce = MosaicNonce.createFromHex((0).toString(16).padStart(8, '0')); expect(nonce.nonce).to.not.be.null;