Skip to content

Commit 6afb2f1

Browse files
author
Grégory Saive
authored
Merge pull request #111 from rg911/task/g109_optional_duration_for_mosaic_transaction
Task/g109 optional duration for mosaic transaction
2 parents ecf1cdd + 58a3f11 commit 6afb2f1

15 files changed

+241
-52
lines changed

package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
"@types/crypto-js": "^3.1.43",
5454
"crypto-js": "^3.1.9-1",
5555
"js-joda": "^1.6.2",
56-
"nem2-library": "^0.9.13",
56+
"nem2-library": "^0.9.14",
5757
"request": "^2.83.0",
5858
"request-promise-native": "^1.0.5",
5959
"rxjs": "^6.2.1",

src/infrastructure/transaction/CreateTransactionFromDTO.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ const CreateStandaloneTransactionFromDTO = (transactionDTO, transactionInfo): Tr
158158
new MosaicProperties(
159159
new UInt64(transactionDTO.properties[0].value),
160160
(new UInt64(transactionDTO.properties[1].value)).compact(),
161-
new UInt64(transactionDTO.properties.length === 3 ? transactionDTO.properties[2].value : [0, 0]),
161+
new UInt64(transactionDTO.properties.length === 3 ? transactionDTO.properties[2].value : undefined),
162162
),
163163
transactionDTO.signature,
164164
transactionDTO.signer ? PublicAccount.createFromPublicKey(transactionDTO.signer,

src/infrastructure/transaction/CreateTransactionFromPayload.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ const CreateTransaction = (type: number, transactionData: string, networkType: N
224224
transferable: (flags & 2) === 2,
225225
levyMutable: (flags & 4) === 4,
226226
divisibility: parseInt(convert.uint8ToHex(convert.hexToUint8(divisibility).reverse()), 16),
227-
duration: UInt64.fromHex(reverse(duration)),
227+
duration: duration ? UInt64.fromHex(reverse(duration)) : undefined,
228228
}),
229229
networkType,
230230
);

src/model/mosaic/MosaicInfo.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ export class MosaicInfo {
8181
* Mosaic duration
8282
* @returns {UInt64}
8383
*/
84-
public get duration(): UInt64 {
84+
public get duration(): UInt64 | undefined {
8585
return this.properties.duration;
8686
}
8787

src/model/mosaic/MosaicProperties.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,9 @@ export class MosaicProperties {
5959
/**
6060
* The duration in blocks a mosaic will be available.
6161
* After the duration finishes mosaic is inactive and can be renewed.
62+
* Duration is optional when defining the mosaic
6263
*/
63-
public readonly duration: UInt64) {
64+
public readonly duration?: UInt64) {
6465
let binaryFlags = '00' + (flags.lower >>> 0).toString(2);
6566
binaryFlags = binaryFlags.substr(binaryFlags.length - 3, 3);
6667
this.supplyMutable = binaryFlags[2] === '1';
@@ -78,7 +79,7 @@ export class MosaicProperties {
7879
transferable: boolean,
7980
levyMutable: boolean,
8081
divisibility: number,
81-
duration: UInt64,
82+
duration?: UInt64,
8283
}) {
8384
const flags = (params.supplyMutable ? 1 : 0) + (params.transferable ? 2 : 0) + (params.levyMutable ? 4 : 0);
8485
return new MosaicProperties(UInt64.fromUint(flags), params.divisibility, params.duration);
@@ -88,12 +89,17 @@ export class MosaicProperties {
8889
* Create DTO object
8990
*/
9091
toDTO() {
91-
return [
92+
const dto = [
9293
{id: 0, value: UInt64.fromUint((this.supplyMutable ? 1 : 0) +
93-
(this.transferable ? 2 : 0) +
94-
(this.levyMutable ? 4 : 0)).toDTO()},
94+
(this.transferable ? 2 : 0) +
95+
(this.levyMutable ? 4 : 0)).toDTO()},
9596
{id: 1, value: UInt64.fromUint(this.divisibility).toDTO()},
96-
{id: 2, value: this.duration.toDTO()},
9797
];
98+
99+
if (this.duration !== undefined) {
100+
dto.push({id: 2, value: this.duration.toDTO()});
101+
}
102+
103+
return dto;
98104
}
99105
}

src/model/transaction/EncryptedMessage.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ export class EncryptedMessage extends Message {
2828
public readonly recipientPublicAccount?: PublicAccount;
2929

3030
constructor(payload: string,
31-
recipientPublicAccount?: PublicAccount){
32-
super(MessageType.EncryptedMessage,payload);
31+
recipientPublicAccount?: PublicAccount) {
32+
super(MessageType.EncryptedMessage, payload);
3333
this.recipientPublicAccount = recipientPublicAccount;
3434
}
3535

@@ -40,7 +40,9 @@ export class EncryptedMessage extends Message {
4040
* @param privateKey
4141
*/
4242
public static create(message: string, recipientPublicAccount: PublicAccount, privateKey) {
43-
return new EncryptedMessage(crypto.encode(privateKey, recipientPublicAccount.publicKey, message), recipientPublicAccount);
43+
return new EncryptedMessage(
44+
crypto.encode(privateKey, recipientPublicAccount.publicKey, message).toUpperCase(),
45+
recipientPublicAccount);
4446
}
4547

4648
/**

src/model/transaction/MosaicDefinitionTransaction.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ export class MosaicDefinitionTransaction extends Transaction {
128128
.addFee(this.maxFee.toDTO())
129129
.addVersion(this.versionToDTO())
130130
.addDivisibility(this.mosaicProperties.divisibility)
131-
.addDuration(this.mosaicProperties.duration.toDTO())
131+
.addDuration(this.mosaicProperties.duration ? this.mosaicProperties.duration.toDTO() : [])
132132
.addNonce(this.nonce.toDTO())
133133
.addMosaicId(this.mosaicId.id.toDTO());
134134

test/core/utils/TransactionMapping.spec.ts

Lines changed: 102 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,8 +192,108 @@ describe('TransactionMapping - createFromPayload', () => {
192192

193193
const transaction = TransactionMapping.createFromPayload(signedTransaction.payload) as MosaicDefinitionTransaction;
194194

195-
expect(transaction.mosaicProperties.duration.lower).to.be.equal(1000);
196-
expect(transaction.mosaicProperties.duration.higher).to.be.equal(0);
195+
expect(transaction.mosaicProperties.duration!.lower).to.be.equal(1000);
196+
expect(transaction.mosaicProperties.duration!.higher).to.be.equal(0);
197+
expect(transaction.mosaicProperties.divisibility).to.be.equal(3);
198+
expect(transaction.mosaicProperties.supplyMutable).to.be.equal(false);
199+
expect(transaction.mosaicProperties.transferable).to.be.equal(false);
200+
expect(transaction.mosaicProperties.levyMutable).to.be.equal(false);
201+
202+
});
203+
204+
it('should create MosaicDefinitionTransaction - without duration', () => {
205+
const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create(
206+
Deadline.create(),
207+
new MosaicNonce(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce
208+
new MosaicId(UInt64.fromUint(1).toDTO()), // ID
209+
MosaicProperties.create({
210+
supplyMutable: false,
211+
transferable: false,
212+
levyMutable: false,
213+
divisibility: 3,
214+
}),
215+
NetworkType.MIJIN_TEST,
216+
);
217+
218+
const signedTransaction = mosaicDefinitionTransaction.signWith(account);
219+
220+
const transaction = TransactionMapping.createFromPayload(signedTransaction.payload) as MosaicDefinitionTransaction;
221+
222+
expect(transaction.mosaicProperties.divisibility).to.be.equal(3);
223+
expect(transaction.mosaicProperties.supplyMutable).to.be.equal(false);
224+
expect(transaction.mosaicProperties.transferable).to.be.equal(false);
225+
expect(transaction.mosaicProperties.levyMutable).to.be.equal(false);
226+
227+
});
228+
229+
it('should create MosaicDefinitionTransaction - without duration', () => {
230+
const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create(
231+
Deadline.create(),
232+
new MosaicNonce(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce
233+
new MosaicId(UInt64.fromUint(1).toDTO()), // ID
234+
MosaicProperties.create({
235+
supplyMutable: false,
236+
transferable: false,
237+
levyMutable: false,
238+
divisibility: 3,
239+
}),
240+
NetworkType.MIJIN_TEST,
241+
);
242+
243+
const signedTransaction = mosaicDefinitionTransaction.signWith(account);
244+
245+
const transaction = TransactionMapping.createFromPayload(signedTransaction.payload) as MosaicDefinitionTransaction;
246+
247+
expect(transaction.mosaicProperties.divisibility).to.be.equal(3);
248+
expect(transaction.mosaicProperties.supplyMutable).to.be.equal(false);
249+
expect(transaction.mosaicProperties.transferable).to.be.equal(false);
250+
expect(transaction.mosaicProperties.levyMutable).to.be.equal(false);
251+
252+
});
253+
254+
it('should create MosaicDefinitionTransaction - without duration', () => {
255+
const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create(
256+
Deadline.create(),
257+
new MosaicNonce(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce
258+
new MosaicId(UInt64.fromUint(1).toDTO()), // ID
259+
MosaicProperties.create({
260+
supplyMutable: false,
261+
transferable: false,
262+
levyMutable: false,
263+
divisibility: 3,
264+
}),
265+
NetworkType.MIJIN_TEST,
266+
);
267+
268+
const signedTransaction = mosaicDefinitionTransaction.signWith(account);
269+
270+
const transaction = TransactionMapping.createFromPayload(signedTransaction.payload) as MosaicDefinitionTransaction;
271+
272+
expect(transaction.mosaicProperties.divisibility).to.be.equal(3);
273+
expect(transaction.mosaicProperties.supplyMutable).to.be.equal(false);
274+
expect(transaction.mosaicProperties.transferable).to.be.equal(false);
275+
expect(transaction.mosaicProperties.levyMutable).to.be.equal(false);
276+
277+
});
278+
279+
it('should create MosaicDefinitionTransaction - without duration', () => {
280+
const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create(
281+
Deadline.create(),
282+
new MosaicNonce(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce
283+
new MosaicId(UInt64.fromUint(1).toDTO()), // ID
284+
MosaicProperties.create({
285+
supplyMutable: false,
286+
transferable: false,
287+
levyMutable: false,
288+
divisibility: 3,
289+
}),
290+
NetworkType.MIJIN_TEST,
291+
);
292+
293+
const signedTransaction = mosaicDefinitionTransaction.signWith(account);
294+
295+
const transaction = TransactionMapping.createFromPayload(signedTransaction.payload) as MosaicDefinitionTransaction;
296+
197297
expect(transaction.mosaicProperties.divisibility).to.be.equal(3);
198298
expect(transaction.mosaicProperties.supplyMutable).to.be.equal(false);
199299
expect(transaction.mosaicProperties.transferable).to.be.equal(false);

test/infrastructure/SerializeTransactionToJSON.spec.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,27 @@ describe('SerializeTransactionToJSON', () => {
197197

198198
});
199199

200+
it('should create MosaicDefinitionTransaction without duration', () => {
201+
const mosaicDefinitionTransaction = MosaicDefinitionTransaction.create(
202+
Deadline.create(),
203+
new MosaicNonce(new Uint8Array([0xE6, 0xDE, 0x84, 0xB8])), // nonce
204+
new MosaicId(UInt64.fromUint(1).toDTO()), // ID
205+
MosaicProperties.create({
206+
supplyMutable: false,
207+
transferable: false,
208+
levyMutable: false,
209+
divisibility: 3,
210+
}),
211+
NetworkType.MIJIN_TEST,
212+
);
213+
214+
const json = mosaicDefinitionTransaction.toJSON();
215+
216+
expect(json.transaction.type).to.be.equal(TransactionType.MOSAIC_DEFINITION);
217+
expect(json.transaction.properties.length).to.be.equal(2);
218+
219+
});
220+
200221
it('should create MosaicSupplyChangeTransaction', () => {
201222
const mosaicId = new MosaicId([2262289484, 3405110546]);
202223
const mosaicSupplyChangeTransaction = MosaicSupplyChangeTransaction.create(

0 commit comments

Comments
 (0)