From a140109f8dcc721af6c850f3b03bd4d74bff633c Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Thu, 10 Oct 2019 21:38:28 +0100 Subject: [PATCH 1/6] JAV-63 [Github #294] Mosaic array sort --- src/model/transaction/TransferTransaction.ts | 6 ++-- .../transaction/TransferTransaction.spec.ts | 35 +++++++++++++++++++ 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/model/transaction/TransferTransaction.ts b/src/model/transaction/TransferTransaction.ts index dba889c578..e12def328a 100644 --- a/src/model/transaction/TransferTransaction.ts +++ b/src/model/transaction/TransferTransaction.ts @@ -180,11 +180,9 @@ export class TransferTransaction extends Transaction { * @returns {Mosaic[]} */ public sortMosaics(): Mosaic[] { - const sortedMosaics = this.mosaics.sort((a, b) => { - if (Number(a.id[1]) > b.id[1]) { return 1; } else if (a.id[1] < b.id[1]) { return -1; } - return 0; + return this.mosaics.sort((a, b) => { + return a.id.id.compact() - b.id.id.compact(); }); - return sortedMosaics; } /** diff --git a/test/model/transaction/TransferTransaction.spec.ts b/test/model/transaction/TransferTransaction.spec.ts index a8e1648616..5536a152e7 100644 --- a/test/model/transaction/TransferTransaction.spec.ts +++ b/test/model/transaction/TransferTransaction.spec.ts @@ -27,6 +27,11 @@ import { Deadline } from '../../../src/model/transaction/Deadline'; import { TransferTransaction } from '../../../src/model/transaction/TransferTransaction'; import {UInt64} from '../../../src/model/UInt64'; import { TestingAccount } from '../../conf/conf.spec'; +import { Mosaic } from '../../../src/model/mosaic/Mosaic'; +import { MosaicId } from '../../../src/model/model'; +import { CreateStatementFromDTO } from '../../../src/infrastructure/receipt/CreateReceiptFromDTO'; +import { CreateTransactionFromDTO } from '../../../src/infrastructure/transaction/CreateTransactionFromDTO'; +import { CreateTransactionFromPayload } from '../../../src/infrastructure/transaction/CreateTransactionFromPayload'; describe('TransferTransaction', () => { let account: Account; @@ -295,4 +300,34 @@ describe('TransferTransaction', () => { ); }).to.throw(); }); + + it('should sort the Mosaic array', () => { + const mosaics = [ + new Mosaic(new MosaicId(UInt64.fromUint(200).toDTO()), UInt64.fromUint(0)), + new Mosaic(new MosaicId(UInt64.fromUint(100).toDTO()), UInt64.fromUint(0)), + ]; + + const transferTransaction = TransferTransaction.create( + Deadline.create(), + Address.createFromRawAddress('SBILTA367K2LX2FEXG5TFWAS7GEFYAGY7QLFBYKC'), + mosaics, + PlainMessage.create('NEM'), + NetworkType.MIJIN_TEST, + ); + + expect(transferTransaction.mosaics[0].id.id.compact()).to.be.equal(200); + expect(transferTransaction.mosaics[1].id.id.compact()).to.be.equal(100); + + const signedTransaction = transferTransaction.signWith(account, generationHash); + + expect(signedTransaction.payload.substring( + 304, + signedTransaction.payload.length, + )).to.be.equal( + '64000000000000000000000000000000C8000000000000000000000000000000'); + + const sorted = CreateTransactionFromPayload(signedTransaction.payload) as TransferTransaction; + expect(sorted.mosaics[0].id.id.compact()).to.be.equal(100); + expect(sorted.mosaics[1].id.id.compact()).to.be.equal(200); + }); }); From 104f04b0e284914766ae9d0df65101a91992cadc Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Thu, 10 Oct 2019 21:40:28 +0100 Subject: [PATCH 2/6] Fixed lint issue --- test/model/transaction/TransferTransaction.spec.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/test/model/transaction/TransferTransaction.spec.ts b/test/model/transaction/TransferTransaction.spec.ts index 5536a152e7..38b1e9ac64 100644 --- a/test/model/transaction/TransferTransaction.spec.ts +++ b/test/model/transaction/TransferTransaction.spec.ts @@ -15,23 +15,21 @@ */ import { expect } from 'chai'; +import { CreateTransactionFromPayload } from '../../../src/infrastructure/transaction/CreateTransactionFromPayload'; import { Account } from '../../../src/model/account/Account'; import { Address } from '../../../src/model/account/Address'; import { NetworkType } from '../../../src/model/blockchain/NetworkType'; import { MessageType } from '../../../src/model/message/MessageType'; import { PersistentHarvestingDelegationMessage } from '../../../src/model/message/PersistentHarvestingDelegationMessage'; import { PlainMessage } from '../../../src/model/message/PlainMessage'; +import { MosaicId } from '../../../src/model/model'; +import { Mosaic } from '../../../src/model/mosaic/Mosaic'; import { NetworkCurrencyMosaic } from '../../../src/model/mosaic/NetworkCurrencyMosaic'; import { NamespaceId } from '../../../src/model/namespace/NamespaceId'; import { Deadline } from '../../../src/model/transaction/Deadline'; import { TransferTransaction } from '../../../src/model/transaction/TransferTransaction'; import {UInt64} from '../../../src/model/UInt64'; import { TestingAccount } from '../../conf/conf.spec'; -import { Mosaic } from '../../../src/model/mosaic/Mosaic'; -import { MosaicId } from '../../../src/model/model'; -import { CreateStatementFromDTO } from '../../../src/infrastructure/receipt/CreateReceiptFromDTO'; -import { CreateTransactionFromDTO } from '../../../src/infrastructure/transaction/CreateTransactionFromDTO'; -import { CreateTransactionFromPayload } from '../../../src/infrastructure/transaction/CreateTransactionFromPayload'; describe('TransferTransaction', () => { let account: Account; From a8db31968d8d0fa856c8d26afcd88b719e9ee356 Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Thu, 10 Oct 2019 21:38:28 +0100 Subject: [PATCH 3/6] JAV-63 [Github #294] Mosaic array sort --- src/model/transaction/TransferTransaction.ts | 6 ++-- .../transaction/TransferTransaction.spec.ts | 35 +++++++++++++++++++ 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/model/transaction/TransferTransaction.ts b/src/model/transaction/TransferTransaction.ts index dba889c578..e12def328a 100644 --- a/src/model/transaction/TransferTransaction.ts +++ b/src/model/transaction/TransferTransaction.ts @@ -180,11 +180,9 @@ export class TransferTransaction extends Transaction { * @returns {Mosaic[]} */ public sortMosaics(): Mosaic[] { - const sortedMosaics = this.mosaics.sort((a, b) => { - if (Number(a.id[1]) > b.id[1]) { return 1; } else if (a.id[1] < b.id[1]) { return -1; } - return 0; + return this.mosaics.sort((a, b) => { + return a.id.id.compact() - b.id.id.compact(); }); - return sortedMosaics; } /** diff --git a/test/model/transaction/TransferTransaction.spec.ts b/test/model/transaction/TransferTransaction.spec.ts index 03f775a182..1ed26e81da 100644 --- a/test/model/transaction/TransferTransaction.spec.ts +++ b/test/model/transaction/TransferTransaction.spec.ts @@ -27,6 +27,11 @@ import { Deadline } from '../../../src/model/transaction/Deadline'; import { TransferTransaction } from '../../../src/model/transaction/TransferTransaction'; import {UInt64} from '../../../src/model/UInt64'; import { TestingAccount } from '../../conf/conf.spec'; +import { Mosaic } from '../../../src/model/mosaic/Mosaic'; +import { MosaicId } from '../../../src/model/model'; +import { CreateStatementFromDTO } from '../../../src/infrastructure/receipt/CreateReceiptFromDTO'; +import { CreateTransactionFromDTO } from '../../../src/infrastructure/transaction/CreateTransactionFromDTO'; +import { CreateTransactionFromPayload } from '../../../src/infrastructure/transaction/CreateTransactionFromPayload'; describe('TransferTransaction', () => { let account: Account; @@ -299,4 +304,34 @@ describe('TransferTransaction', () => { ); }).to.throw(); }); + + it('should sort the Mosaic array', () => { + const mosaics = [ + new Mosaic(new MosaicId(UInt64.fromUint(200).toDTO()), UInt64.fromUint(0)), + new Mosaic(new MosaicId(UInt64.fromUint(100).toDTO()), UInt64.fromUint(0)), + ]; + + const transferTransaction = TransferTransaction.create( + Deadline.create(), + Address.createFromRawAddress('SBILTA367K2LX2FEXG5TFWAS7GEFYAGY7QLFBYKC'), + mosaics, + PlainMessage.create('NEM'), + NetworkType.MIJIN_TEST, + ); + + expect(transferTransaction.mosaics[0].id.id.compact()).to.be.equal(200); + expect(transferTransaction.mosaics[1].id.id.compact()).to.be.equal(100); + + const signedTransaction = transferTransaction.signWith(account, generationHash); + + expect(signedTransaction.payload.substring( + 304, + signedTransaction.payload.length, + )).to.be.equal( + '64000000000000000000000000000000C8000000000000000000000000000000'); + + const sorted = CreateTransactionFromPayload(signedTransaction.payload) as TransferTransaction; + expect(sorted.mosaics[0].id.id.compact()).to.be.equal(100); + expect(sorted.mosaics[1].id.id.compact()).to.be.equal(200); + }); }); From 70a7412c787ad18edba724c108064d0848326277 Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Thu, 10 Oct 2019 21:40:28 +0100 Subject: [PATCH 4/6] Fixed lint issue --- test/model/transaction/TransferTransaction.spec.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/test/model/transaction/TransferTransaction.spec.ts b/test/model/transaction/TransferTransaction.spec.ts index 1ed26e81da..4341d9e526 100644 --- a/test/model/transaction/TransferTransaction.spec.ts +++ b/test/model/transaction/TransferTransaction.spec.ts @@ -15,23 +15,21 @@ */ import { expect } from 'chai'; +import { CreateTransactionFromPayload } from '../../../src/infrastructure/transaction/CreateTransactionFromPayload'; import { Account } from '../../../src/model/account/Account'; import { Address } from '../../../src/model/account/Address'; import { NetworkType } from '../../../src/model/blockchain/NetworkType'; import { MessageType } from '../../../src/model/message/MessageType'; import { PersistentHarvestingDelegationMessage } from '../../../src/model/message/PersistentHarvestingDelegationMessage'; import { PlainMessage } from '../../../src/model/message/PlainMessage'; +import { MosaicId } from '../../../src/model/model'; +import { Mosaic } from '../../../src/model/mosaic/Mosaic'; import { NetworkCurrencyMosaic } from '../../../src/model/mosaic/NetworkCurrencyMosaic'; import { NamespaceId } from '../../../src/model/namespace/NamespaceId'; import { Deadline } from '../../../src/model/transaction/Deadline'; import { TransferTransaction } from '../../../src/model/transaction/TransferTransaction'; import {UInt64} from '../../../src/model/UInt64'; import { TestingAccount } from '../../conf/conf.spec'; -import { Mosaic } from '../../../src/model/mosaic/Mosaic'; -import { MosaicId } from '../../../src/model/model'; -import { CreateStatementFromDTO } from '../../../src/infrastructure/receipt/CreateReceiptFromDTO'; -import { CreateTransactionFromDTO } from '../../../src/infrastructure/transaction/CreateTransactionFromDTO'; -import { CreateTransactionFromPayload } from '../../../src/infrastructure/transaction/CreateTransactionFromPayload'; describe('TransferTransaction', () => { let account: Account; From 07a9b86b7c3a19129ed79d026bc64d365947167f Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Mon, 14 Oct 2019 09:48:45 +0100 Subject: [PATCH 5/6] Fixed wrong import path --- test/model/transaction/TransferTransaction.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/model/transaction/TransferTransaction.spec.ts b/test/model/transaction/TransferTransaction.spec.ts index 4341d9e526..7b6126a291 100644 --- a/test/model/transaction/TransferTransaction.spec.ts +++ b/test/model/transaction/TransferTransaction.spec.ts @@ -22,8 +22,8 @@ import { NetworkType } from '../../../src/model/blockchain/NetworkType'; import { MessageType } from '../../../src/model/message/MessageType'; import { PersistentHarvestingDelegationMessage } from '../../../src/model/message/PersistentHarvestingDelegationMessage'; import { PlainMessage } from '../../../src/model/message/PlainMessage'; -import { MosaicId } from '../../../src/model/model'; import { Mosaic } from '../../../src/model/mosaic/Mosaic'; +import { MosaicId } from '../../../src/model/mosaic/MosaicId'; import { NetworkCurrencyMosaic } from '../../../src/model/mosaic/NetworkCurrencyMosaic'; import { NamespaceId } from '../../../src/model/namespace/NamespaceId'; import { Deadline } from '../../../src/model/transaction/Deadline'; From bc47507407ae02f98ae252278ee2e1327e38f9cd Mon Sep 17 00:00:00 2001 From: Steven Liu Date: Mon, 14 Oct 2019 13:11:37 +0100 Subject: [PATCH 6/6] Fixed issue on mosaic array sorting Use Long to compare unsigned mosaicId Fixed issue on Uint64.toString issue (use long instead) --- src/model/UInt64.ts | 2 +- src/model/transaction/TransferTransaction.ts | 5 +++- .../transaction/TransferTransaction.spec.ts | 27 +++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/model/UInt64.ts b/src/model/UInt64.ts index de3dd93142..574b6a1995 100644 --- a/src/model/UInt64.ts +++ b/src/model/UInt64.ts @@ -116,7 +116,7 @@ export class UInt64 { * @return {string} */ public toString(): string { - return this.compact().toString(); + return Long.fromBits(this.lower, this.higher, true).toString(); } /** diff --git a/src/model/transaction/TransferTransaction.ts b/src/model/transaction/TransferTransaction.ts index e12def328a..e4cd7bf855 100644 --- a/src/model/transaction/TransferTransaction.ts +++ b/src/model/transaction/TransferTransaction.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import * as Long from 'long'; import { Convert, Convert as convert } from '../../core/format'; import { RawAddress } from '../../core/format/RawAddress'; import { AmountDto } from '../../infrastructure/catbuffer/AmountDto'; @@ -181,7 +182,9 @@ export class TransferTransaction extends Transaction { */ public sortMosaics(): Mosaic[] { return this.mosaics.sort((a, b) => { - return a.id.id.compact() - b.id.id.compact(); + const long_a = Long.fromBits(a.id.id.lower, a.id.id.higher, true); + const long_b = Long.fromBits(b.id.id.lower, b.id.id.higher, true); + return long_a.compare(long_b); }); } diff --git a/test/model/transaction/TransferTransaction.spec.ts b/test/model/transaction/TransferTransaction.spec.ts index 7b6126a291..92d3d6a86d 100644 --- a/test/model/transaction/TransferTransaction.spec.ts +++ b/test/model/transaction/TransferTransaction.spec.ts @@ -332,4 +332,31 @@ describe('TransferTransaction', () => { expect(sorted.mosaics[0].id.id.compact()).to.be.equal(100); expect(sorted.mosaics[1].id.id.compact()).to.be.equal(200); }); + + it('should sort the Mosaic array - using Hex MosaicId', () => { + const mosaics = [ + new Mosaic(new MosaicId('D525AD41D95FCF29'), UInt64.fromUint(5)), + new Mosaic(new MosaicId('77A1969932D987D7'), UInt64.fromUint(6)), + new Mosaic(new MosaicId('67F2B76F28BD36BA'), UInt64.fromUint(10)), + ]; + + const transferTransaction = TransferTransaction.create( + Deadline.create(), + Address.createFromRawAddress('SBILTA367K2LX2FEXG5TFWAS7GEFYAGY7QLFBYKC'), + mosaics, + PlainMessage.create('NEM'), + NetworkType.MIJIN_TEST, + ); + + expect(transferTransaction.mosaics[0].id.toHex()).to.be.equal('D525AD41D95FCF29'); + expect(transferTransaction.mosaics[1].id.toHex()).to.be.equal('77A1969932D987D7'); + expect(transferTransaction.mosaics[2].id.toHex()).to.be.equal('67F2B76F28BD36BA'); + + const signedTransaction = transferTransaction.signWith(account, generationHash); + const sorted = CreateTransactionFromPayload(signedTransaction.payload) as TransferTransaction; + expect(sorted.mosaics[0].id.toHex()).to.be.equal('67F2B76F28BD36BA'); + expect(sorted.mosaics[1].id.toHex()).to.be.equal('77A1969932D987D7'); + expect(sorted.mosaics[2].id.toHex()).to.be.equal('D525AD41D95FCF29'); + + }); });