Skip to content
2 changes: 1 addition & 1 deletion src/model/UInt64.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

/**
Expand Down
9 changes: 5 additions & 4 deletions src/model/transaction/TransferTransaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
* limitations under the License.
*/

import * as Long from 'long';
import { Convert, Convert as convert } from '../../core/format';
import { UnresolvedMapping } from '../../core/utils/UnresolvedMapping';
import { AmountDto } from '../../infrastructure/catbuffer/AmountDto';
Expand Down Expand Up @@ -180,11 +181,11 @@ 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) => {
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);
});
return sortedMosaics;
}

/**
Expand Down
60 changes: 60 additions & 0 deletions test/model/transaction/TransferTransaction.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,15 @@
*/

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 { 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';
Expand Down Expand Up @@ -299,4 +302,61 @@ 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);
});

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');

});
});