Skip to content

Commit 1a39f26

Browse files
authored
Merge pull request #103 from proximax-storage/issue/101-deadline-implementation
Deadline implementation improvements
2 parents d41f0cc + 4f6e259 commit 1a39f26

File tree

8 files changed

+122
-31
lines changed

8 files changed

+122
-31
lines changed

src/e2e/java/io/proximax/sdk/E2EBaseTest.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import java.math.BigDecimal;
2323
import java.math.BigInteger;
2424
import java.net.URL;
25-
import java.time.temporal.ChronoUnit;
2625
import java.util.Collection;
2726
import java.util.Collections;
2827
import java.util.LinkedList;
@@ -40,7 +39,7 @@
4039
import io.proximax.sdk.model.account.Address;
4140
import io.proximax.sdk.model.mosaic.Mosaic;
4241
import io.proximax.sdk.model.mosaic.NetworkCurrencyMosaic;
43-
import io.proximax.sdk.model.transaction.Deadline;
42+
import io.proximax.sdk.model.transaction.DeadlineRaw;
4443
import io.proximax.sdk.model.transaction.PlainMessage;
4544
import io.proximax.sdk.model.transaction.SignedTransaction;
4645
import io.proximax.sdk.model.transaction.TransactionDeadline;
@@ -117,7 +116,7 @@ void cleanup() {
117116
* @return deadline
118117
*/
119118
protected TransactionDeadline getDeadline() {
120-
return new Deadline(5, ChronoUnit.MINUTES);
119+
return DeadlineRaw.startNow(BigInteger.valueOf(5*60*1000l));
121120
}
122121

123122

src/main/java/io/proximax/sdk/infrastructure/TransactionHttp.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
import io.proximax.sdk.TransactionRepository;
3333
import io.proximax.sdk.gen.model.TransactionStatusDTO;
3434
import io.proximax.sdk.model.transaction.CosignatureSignedTransaction;
35-
import io.proximax.sdk.model.transaction.DeadlineBP;
35+
import io.proximax.sdk.model.transaction.DeadlineRaw;
3636
import io.proximax.sdk.model.transaction.SignedTransaction;
3737
import io.proximax.sdk.model.transaction.Transaction;
3838
import io.proximax.sdk.model.transaction.TransactionAnnounceResponse;
@@ -91,7 +91,7 @@ public Observable<TransactionStatus> getTransactionStatus(String transactionHash
9191
.map(transactionStatusDTO -> new TransactionStatus(transactionStatusDTO.getGroup(),
9292
transactionStatusDTO.getStatus(),
9393
transactionStatusDTO.getHash(),
94-
new DeadlineBP(toBigInt(transactionStatusDTO.getDeadline())),
94+
new DeadlineRaw(toBigInt(transactionStatusDTO.getDeadline())),
9595
toBigInt(transactionStatusDTO.getHeight())));
9696
}
9797

@@ -107,7 +107,7 @@ public Observable<List<TransactionStatus>> getTransactionStatuses(List<String> t
107107
.map(transactionStatusDTO -> new TransactionStatus(transactionStatusDTO.getGroup(),
108108
transactionStatusDTO.getStatus(),
109109
transactionStatusDTO.getHash(),
110-
new DeadlineBP(toBigInt(transactionStatusDTO.getDeadline())),
110+
new DeadlineRaw(toBigInt(transactionStatusDTO.getDeadline())),
111111
toBigInt(transactionStatusDTO.getHeight())))
112112
.toList()
113113
.toObservable();

src/main/java/io/proximax/sdk/infrastructure/TransactionMapping.java

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ public TransferTransaction apply(JsonObject input) {
207207
// retrieve transaction data from transaction field
208208
JsonObject transaction = input.getAsJsonObject("transaction");
209209
// deadline
210-
DeadlineBP deadline = new DeadlineBP(extractBigInteger(transaction.getAsJsonArray("deadline")));
210+
TransactionDeadline deadline = new DeadlineRaw(extractBigInteger(transaction.getAsJsonArray("deadline")));
211211
// mosaics
212212
List<Mosaic> mosaics;
213213
if (transaction.getAsJsonArray("mosaics") != null) {
@@ -261,7 +261,7 @@ public ModifyMetadataTransaction apply(JsonObject input) {
261261
// retrieve transaction data from transaction field
262262
JsonObject transaction = input.getAsJsonObject("transaction");
263263
// deadline
264-
DeadlineBP deadline = new DeadlineBP(extractBigInteger(transaction.getAsJsonArray("deadline")));
264+
TransactionDeadline deadline = new DeadlineRaw(extractBigInteger(transaction.getAsJsonArray("deadline")));
265265
// version
266266
JsonElement version = transaction.get("version");
267267
// transaction type
@@ -330,7 +330,7 @@ public ModifyAccountPropertyTransaction<?> apply(JsonObject input) {
330330
// retrieve transaction data from transaction field
331331
JsonObject transaction = input.getAsJsonObject("transaction");
332332
// deadline
333-
DeadlineBP deadline = new DeadlineBP(extractBigInteger(transaction.getAsJsonArray("deadline")));
333+
TransactionDeadline deadline = new DeadlineRaw(extractBigInteger(transaction.getAsJsonArray("deadline")));
334334
// version
335335
JsonElement version = transaction.get("version");
336336
// transaction type
@@ -437,7 +437,7 @@ public RegisterNamespaceTransaction apply(JsonObject input) {
437437
TransactionInfo transactionInfo = this.createTransactionInfo(input.getAsJsonObject("meta"));
438438
JsonObject transaction = input.getAsJsonObject("transaction");
439439
// retrieve fields
440-
DeadlineBP deadline = new DeadlineBP(extractBigInteger(transaction.getAsJsonArray("deadline")));
440+
TransactionDeadline deadline = new DeadlineRaw(extractBigInteger(transaction.getAsJsonArray("deadline")));
441441
NamespaceType namespaceType = NamespaceType.rawValueOf(transaction.get("namespaceType").getAsInt());
442442
NamespaceId namespaceId = new NamespaceId(extractBigInteger(transaction.getAsJsonArray("namespaceId")));
443443
Optional<BigInteger> namespaceDuration = namespaceType == NamespaceType.RootNamespace ? Optional.of(extractBigInteger(transaction.getAsJsonArray("duration"))) : Optional.empty();
@@ -472,7 +472,7 @@ public MosaicDefinitionTransaction apply(JsonObject input) {
472472
TransactionInfo transactionInfo = this.createTransactionInfo(input.getAsJsonObject("meta"));
473473
JsonObject transaction = input.getAsJsonObject("transaction");
474474
// load data fields
475-
DeadlineBP deadline = new DeadlineBP(extractBigInteger(transaction.getAsJsonArray("deadline")));
475+
TransactionDeadline deadline = new DeadlineRaw(extractBigInteger(transaction.getAsJsonArray("deadline")));
476476
// construct properties
477477
JsonElement version = transaction.get("version");
478478
// return instance of mosaic definition transaction
@@ -544,7 +544,7 @@ public AliasTransaction apply(JsonObject input) {
544544
TransactionInfo transactionInfo = this.createTransactionInfo(input.getAsJsonObject("meta"));
545545
JsonObject transaction = input.getAsJsonObject("transaction");
546546
// load data fields
547-
DeadlineBP deadline = new DeadlineBP(extractBigInteger(transaction.getAsJsonArray("deadline")));
547+
TransactionDeadline deadline = new DeadlineRaw(extractBigInteger(transaction.getAsJsonArray("deadline")));
548548
JsonElement version = transaction.get("version");
549549
// return instance of mosaic alias definition transaction
550550
return new AliasTransaction(
@@ -587,7 +587,7 @@ public AliasTransaction apply(JsonObject input) {
587587
TransactionInfo transactionInfo = this.createTransactionInfo(input.getAsJsonObject("meta"));
588588
JsonObject transaction = input.getAsJsonObject("transaction");
589589
// load data fields
590-
DeadlineBP deadline = new DeadlineBP(extractBigInteger(transaction.getAsJsonArray("deadline")));
590+
TransactionDeadline deadline = new DeadlineRaw(extractBigInteger(transaction.getAsJsonArray("deadline")));
591591
JsonElement version = transaction.get("version");
592592
// return instance of mosaic alias definition transaction
593593
return new AliasTransaction(
@@ -614,7 +614,7 @@ public MosaicSupplyChangeTransaction apply(JsonObject input) {
614614
TransactionInfo transactionInfo = this.createTransactionInfo(input.getAsJsonObject("meta"));
615615

616616
JsonObject transaction = input.getAsJsonObject("transaction");
617-
DeadlineBP deadline = new DeadlineBP(extractBigInteger(transaction.getAsJsonArray("deadline")));
617+
TransactionDeadline deadline = new DeadlineRaw(extractBigInteger(transaction.getAsJsonArray("deadline")));
618618

619619
return new MosaicSupplyChangeTransaction(
620620
extractNetworkType(transaction.get("version")),
@@ -638,7 +638,7 @@ public ModifyMultisigAccountTransaction apply(JsonObject input) {
638638
TransactionInfo transactionInfo = this.createTransactionInfo(input.getAsJsonObject("meta"));
639639

640640
JsonObject transaction = input.getAsJsonObject("transaction");
641-
DeadlineBP deadline = new DeadlineBP(extractBigInteger(transaction.getAsJsonArray("deadline")));
641+
TransactionDeadline deadline = new DeadlineRaw(extractBigInteger(transaction.getAsJsonArray("deadline")));
642642
NetworkType networkType = extractNetworkType(transaction.get("version"));
643643

644644
List<MultisigCosignatoryModification> modifications = transaction.has("modifications") ? stream(transaction.getAsJsonArray("modifications"))
@@ -673,7 +673,7 @@ public ModifyContractTransaction apply(JsonObject input) {
673673
TransactionInfo transactionInfo = this.createTransactionInfo(input.getAsJsonObject("meta"));
674674

675675
JsonObject transaction = input.getAsJsonObject("transaction");
676-
DeadlineBP deadline = new DeadlineBP(extractBigInteger(transaction.getAsJsonArray("deadline")));
676+
TransactionDeadline deadline = new DeadlineRaw(extractBigInteger(transaction.getAsJsonArray("deadline")));
677677
NetworkType networkType = extractNetworkType(transaction.get("version"));
678678

679679
return new ModifyContractTransaction(
@@ -724,7 +724,7 @@ public AggregateTransaction apply(JsonObject input) {
724724
TransactionInfo transactionInfo = this.createTransactionInfo(input.getAsJsonObject("meta"));
725725

726726
JsonObject transaction = input.getAsJsonObject("transaction");
727-
DeadlineBP deadline = new DeadlineBP(extractBigInteger(transaction.getAsJsonArray("deadline")));
727+
TransactionDeadline deadline = new DeadlineRaw(extractBigInteger(transaction.getAsJsonArray("deadline")));
728728
NetworkType networkType = extractNetworkType(transaction.get("version"));
729729

730730
List<Transaction> transactions = new ArrayList<>();
@@ -789,7 +789,7 @@ public LockFundsTransaction apply(JsonObject input) {
789789
TransactionInfo transactionInfo = this.createTransactionInfo(input.getAsJsonObject("meta"));
790790

791791
JsonObject transaction = input.getAsJsonObject("transaction");
792-
DeadlineBP deadline = new DeadlineBP(extractBigInteger(transaction.getAsJsonArray("deadline")));
792+
TransactionDeadline deadline = new DeadlineRaw(extractBigInteger(transaction.getAsJsonArray("deadline")));
793793
NetworkType networkType = extractNetworkType(transaction.get("version"));
794794
Mosaic mosaic;
795795
if (transaction.has("mosaicId")) {
@@ -819,7 +819,7 @@ public SecretLockTransaction apply(JsonObject input) {
819819
TransactionInfo transactionInfo = this.createTransactionInfo(input.getAsJsonObject("meta"));
820820

821821
JsonObject transaction = input.getAsJsonObject("transaction");
822-
DeadlineBP deadline = new DeadlineBP(extractBigInteger(transaction.getAsJsonArray("deadline")));
822+
TransactionDeadline deadline = new DeadlineRaw(extractBigInteger(transaction.getAsJsonArray("deadline")));
823823
NetworkType networkType = extractNetworkType(transaction.get("version"));
824824
Mosaic mosaic;
825825
if (transaction.has("mosaicId")) {
@@ -851,7 +851,7 @@ public SecretProofTransaction apply(JsonObject input) {
851851
TransactionInfo transactionInfo = this.createTransactionInfo(input.getAsJsonObject("meta"));
852852

853853
JsonObject transaction = input.getAsJsonObject("transaction");
854-
DeadlineBP deadline = new DeadlineBP(extractBigInteger(transaction.getAsJsonArray("deadline")));
854+
TransactionDeadline deadline = new DeadlineRaw(extractBigInteger(transaction.getAsJsonArray("deadline")));
855855
NetworkType networkType = extractNetworkType(transaction.get("version"));
856856

857857
return new SecretProofTransaction(

src/main/java/io/proximax/sdk/infrastructure/listener/StatusChannelMessage.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import com.google.gson.JsonObject;
99

1010
import io.proximax.sdk.model.account.Address;
11-
import io.proximax.sdk.model.transaction.DeadlineBP;
11+
import io.proximax.sdk.model.transaction.DeadlineRaw;
1212
import io.proximax.sdk.model.transaction.TransactionStatusError;
1313
import io.reactivex.Observable;
1414
import io.reactivex.subjects.Subject;
@@ -38,7 +38,7 @@ private static TransactionStatusError getMessageObject(JsonObject message) {
3838
return new TransactionStatusError(
3939
message.get("hash").getAsString(),
4040
message.get("status").getAsString(),
41-
new DeadlineBP(extractBigInteger(message.getAsJsonArray("deadline"))));
41+
new DeadlineRaw(extractBigInteger(message.getAsJsonArray("deadline"))));
4242

4343
}
4444

src/main/java/io/proximax/sdk/model/transaction/Deadline.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,8 @@
2121
import java.time.temporal.ChronoUnit;
2222

2323
/**
24-
* The deadline of the transaction. The deadline is given as the number of seconds elapsed since the creation of the
24+
* The deadline of the transaction. The deadline is given as the number of milliseconds elapsed since the creation of the
2525
* nemesis block. If a transaction does not get included in a block before the deadline is reached, it is deleted.
26-
*
27-
* @since 1.0
2826
*/
2927
public class Deadline implements TransactionDeadline {
3028

src/main/java/io/proximax/sdk/model/transaction/DeadlineBP.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public DeadlineBP(int units, ChronoUnit chronoUnit) {
4848
/**
4949
* Constructor
5050
*
51-
* @param input Deadline in BigInteger format
51+
* @param input milliseconds since epoch
5252
*/
5353
public DeadlineBP(BigInteger input) {
5454
instant = Instant.ofEpochMilli(input.longValue() + NETWORK_EPOCH_START_MILLIS);
@@ -65,11 +65,7 @@ public static DeadlineBP create(int units, ChronoUnit chronoUnit) {
6565
return new DeadlineBP(units, chronoUnit);
6666
}
6767

68-
/**
69-
* Returns number of seconds elapsed since the creation of the nemesis block.
70-
*
71-
* @return long
72-
*/
68+
@Override
7369
public long getInstant() {
7470
return instant.toEpochMilli() - DeadlineBP.NETWORK_EPOCH.toEpochMilli();
7571
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* Copyright 2019 ProximaX Limited. All rights reserved.
3+
* Use of this source code is governed by the Apache 2.0
4+
* license that can be found in the LICENSE file.
5+
*/
6+
package io.proximax.sdk.model.transaction;
7+
8+
import java.math.BigInteger;
9+
import java.util.Date;
10+
11+
/**
12+
* Raw deadline implementation working directly with milliseconds. Consider using {@link Deadline} or {@link DeadlineBP}
13+
*/
14+
public class DeadlineRaw implements TransactionDeadline {
15+
16+
/** milliseconds since epoch */
17+
private final long deadline;
18+
19+
/**
20+
* @param deadline in milliseconds since epoch
21+
*/
22+
public DeadlineRaw(BigInteger deadline) {
23+
this.deadline = deadline.longValue();
24+
}
25+
26+
/**
27+
* create new deadline instance specifying duration since current time
28+
*
29+
* @param duration duration after current time
30+
* @return deadline representing specified time
31+
*/
32+
public static TransactionDeadline startNow(BigInteger duration) {
33+
return new DeadlineRaw(BigInteger
34+
.valueOf(System.currentTimeMillis() - TransactionDeadline.NETWORK_EPOCH_START_MILLIS).add(duration));
35+
}
36+
37+
@Override
38+
public long getInstant() {
39+
return deadline;
40+
}
41+
42+
@Override
43+
public String toString() {
44+
return "DeadlineRaw [deadline=" + new Date(deadline + TransactionDeadline.NETWORK_EPOCH_START_MILLIS) + "]";
45+
}
46+
47+
48+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* Copyright 2019 ProximaX Limited. All rights reserved.
3+
* Use of this source code is governed by the Apache 2.0
4+
* license that can be found in the LICENSE file.
5+
*/
6+
package io.proximax.sdk.model.transaction;
7+
8+
import static org.junit.jupiter.api.Assertions.assertEquals;
9+
import static org.junit.jupiter.api.Assertions.assertTrue;
10+
11+
import java.math.BigInteger;
12+
import java.time.temporal.ChronoUnit;
13+
14+
import org.junit.jupiter.api.Test;
15+
16+
/**
17+
* {@link DeadlineRaw} tests
18+
*/
19+
class DeadlineRawTest {
20+
private static final long HOUR_MILLIS = 3_600_000l;
21+
private static final long ACCEPTABLE_THRESHOLD = 500l;
22+
@Test
23+
void constructor() {
24+
DeadlineRaw rawDeadline = new DeadlineRaw(BigInteger.valueOf(HOUR_MILLIS));
25+
assertEquals(HOUR_MILLIS, rawDeadline.getInstant());
26+
}
27+
28+
@Test
29+
void startNow() {
30+
Deadline deadline = new Deadline(1, ChronoUnit.HOURS);
31+
TransactionDeadline rawDeadline = DeadlineRaw.startNow(BigInteger.valueOf(HOUR_MILLIS));
32+
long diff = Math.abs(deadline.getInstant() - rawDeadline.getInstant());
33+
assertTrue(diff < ACCEPTABLE_THRESHOLD);
34+
}
35+
36+
@Test
37+
void compareWithDeadline() {
38+
Deadline deadline = new Deadline(BigInteger.valueOf(HOUR_MILLIS));
39+
DeadlineRaw rawDeadline = new DeadlineRaw(BigInteger.valueOf(HOUR_MILLIS));
40+
41+
long diff = Math.abs(deadline.getInstant() - rawDeadline.getInstant());
42+
assertTrue(diff < ACCEPTABLE_THRESHOLD, "difference was "+diff);
43+
}
44+
45+
@Test
46+
void toStringPasses() {
47+
DeadlineRaw rawDeadline = new DeadlineRaw(BigInteger.valueOf(HOUR_MILLIS));
48+
assertTrue(rawDeadline.toString().startsWith("DeadlineRaw"));
49+
}
50+
}

0 commit comments

Comments
 (0)