Skip to content

Commit 7bc46b8

Browse files
authored
feat!: ability to specify custom nonce generator (#16)
1 parent ab3c048 commit 7bc46b8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+185
-162
lines changed

README.md

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,17 @@ KrakenAPI api = new KrakenAPI(MyRestTemplateRestRequest(apiKey, apiSecret));
8484

8585
See `DefaultKrakenRestRequester` for the default implementation.
8686

87-
### Custom nonce generator (not yet implemented)
87+
### Custom nonce generator
88+
89+
For private endpoint requests, the nonce value is set to `System.currentTimeMillis()`. If you wish to use another value, you can specify a custom nonce generator when creating the `KrakenAPI` instance:
90+
91+
```java
92+
KrakenAPI api = new KrakenAPI(
93+
new KrakenCredentials(key, secret),
94+
() -> Long.toString(System.currentTimeMillis() / 1000));
95+
```
96+
97+
The second parameter is of type `KrakenNonceGenerator`, an interface containing a single `generate()` method returning a string.
8898

8999
## Examples
90100

@@ -98,11 +108,9 @@ mvn clean install
98108

99109
# run example classes
100110
mvn -q -pl examples exec:java -Dexec.mainClass=dev.andstuff.kraken.example.SimpleExamples
101-
mvn -q -pl examples exec:java -Dexec.mainClass=dev.andstuff.kraken.example.TotalRewards
111+
mvn -q -pl examples exec:java -Dexec.mainClass=dev.andstuff.kraken.example.StakingRewardsSummaryExample
102112
```
103113

104114
[1]: https://docs.kraken.com/rest/
105-
106115
[2]: https://github.com/FasterXML/jackson
107-
108116
[3]: https://github.com/nyg/kraken-api-java/blob/v1.0.0/examples/src/main/java/dev/andstuff/kraken/example/Examples.java

examples/src/main/java/dev/andstuff/kraken/example/SimpleExamples.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
import com.fasterxml.jackson.databind.JsonNode;
99

1010
import dev.andstuff.kraken.api.KrakenAPI;
11-
import dev.andstuff.kraken.api.model.KrakenCredentials;
12-
import dev.andstuff.kraken.api.model.endpoint.market.params.AssetPairParams;
13-
import dev.andstuff.kraken.api.model.endpoint.market.response.AssetInfo;
14-
import dev.andstuff.kraken.api.model.endpoint.market.response.AssetPair;
15-
import dev.andstuff.kraken.api.model.endpoint.market.response.ServerTime;
16-
import dev.andstuff.kraken.api.model.endpoint.market.response.SystemStatus;
11+
import dev.andstuff.kraken.api.endpoint.market.params.AssetPairParams;
12+
import dev.andstuff.kraken.api.endpoint.market.response.AssetInfo;
13+
import dev.andstuff.kraken.api.endpoint.market.response.AssetPair;
14+
import dev.andstuff.kraken.api.endpoint.market.response.ServerTime;
15+
import dev.andstuff.kraken.api.endpoint.market.response.SystemStatus;
16+
import dev.andstuff.kraken.api.rest.KrakenCredentials;
1717
import lombok.extern.slf4j.Slf4j;
1818

1919
@Slf4j
@@ -65,8 +65,8 @@ public static void main(String[] args) {
6565
"price", "1000",
6666
"oflags", "post,fciq",
6767
"close[ordertype]", "limit",
68-
"close[price]", "1500",
69-
"validate", "true"));
68+
"close[price]", "500",
69+
"validate", "true")); // does not submit the order when set to true
7070
log.info("{}", order);
7171
}
7272
}

examples/src/main/java/dev/andstuff/kraken/example/StakingRewardsSummaryExample.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88
import java.util.Set;
99

1010
import dev.andstuff.kraken.api.KrakenAPI;
11-
import dev.andstuff.kraken.api.model.KrakenCredentials;
12-
import dev.andstuff.kraken.api.model.KrakenException;
13-
import dev.andstuff.kraken.api.model.endpoint.account.params.LedgerInfoParams;
14-
import dev.andstuff.kraken.api.model.endpoint.account.response.LedgerEntry;
15-
import dev.andstuff.kraken.api.model.endpoint.account.response.LedgerInfo;
11+
import dev.andstuff.kraken.api.rest.KrakenCredentials;
12+
import dev.andstuff.kraken.api.endpoint.KrakenException;
13+
import dev.andstuff.kraken.api.endpoint.account.params.LedgerInfoParams;
14+
import dev.andstuff.kraken.api.endpoint.account.response.LedgerEntry;
15+
import dev.andstuff.kraken.api.endpoint.account.response.LedgerInfo;
1616
import dev.andstuff.kraken.example.reward.AssetRates;
1717
import dev.andstuff.kraken.example.reward.StakingRewards;
1818
import dev.andstuff.kraken.example.reward.csv.CsvLedgerEntries;

examples/src/main/java/dev/andstuff/kraken/example/helper/CredentialsHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import java.io.InputStream;
55
import java.util.Properties;
66

7-
import dev.andstuff.kraken.api.model.KrakenCredentials;
7+
import dev.andstuff.kraken.api.rest.KrakenCredentials;
88
import lombok.AccessLevel;
99
import lombok.NoArgsConstructor;
1010

examples/src/main/java/dev/andstuff/kraken/example/reward/AssetRates.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import java.util.Map;
88
import java.util.Optional;
99

10-
import dev.andstuff.kraken.api.model.endpoint.market.response.Ticker;
10+
import dev.andstuff.kraken.api.endpoint.market.response.Ticker;
1111
import lombok.Getter;
1212

1313
@Getter

examples/src/main/java/dev/andstuff/kraken/example/reward/AssetRewards.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import java.util.List;
77
import java.util.Map;
88

9-
import dev.andstuff.kraken.api.model.endpoint.account.response.LedgerEntry;
9+
import dev.andstuff.kraken.api.endpoint.account.response.LedgerEntry;
1010
import lombok.Getter;
1111

1212
/**

examples/src/main/java/dev/andstuff/kraken/example/reward/StakingRewards.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import java.util.List;
77
import java.util.Set;
88

9-
import dev.andstuff.kraken.api.model.endpoint.account.response.LedgerEntry;
9+
import dev.andstuff.kraken.api.endpoint.account.response.LedgerEntry;
1010
import lombok.Getter;
1111

1212
/**

examples/src/main/java/dev/andstuff/kraken/example/reward/csv/CsvLedgerEntries.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import com.opencsv.exceptions.CsvDataTypeMismatchException;
1313
import com.opencsv.exceptions.CsvRequiredFieldEmptyException;
1414

15-
import dev.andstuff.kraken.api.model.endpoint.account.response.LedgerEntry;
15+
import dev.andstuff.kraken.api.endpoint.account.response.LedgerEntry;
1616
import dev.andstuff.kraken.example.helper.HeaderAndPositionMappingStrategy;
1717

1818
public class CsvLedgerEntries {

examples/src/main/java/dev/andstuff/kraken/example/reward/csv/CsvLedgerEntry.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import com.opencsv.bean.CsvBindByName;
77
import com.opencsv.bean.CsvBindByPosition;
88

9-
import dev.andstuff.kraken.api.model.endpoint.account.response.LedgerEntry;
9+
import dev.andstuff.kraken.api.endpoint.account.response.LedgerEntry;
1010

1111
public record CsvLedgerEntry(@CsvBindByPosition(position = 7) @CsvBindByName(column = "ledger_entry_id") String ledgerEntryId,
1212
@CsvBindByPosition(position = 8) @CsvBindByName(column = "reference_id") String referenceId,

library/src/main/java/dev/andstuff/kraken/api/KrakenAPI.java

Lines changed: 52 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,48 +5,65 @@
55

66
import com.fasterxml.jackson.databind.JsonNode;
77

8-
import dev.andstuff.kraken.api.model.KrakenCredentials;
9-
import dev.andstuff.kraken.api.model.endpoint.account.LedgerEntriesEndpoint;
10-
import dev.andstuff.kraken.api.model.endpoint.account.LedgerInfoEndpoint;
11-
import dev.andstuff.kraken.api.model.endpoint.account.params.LedgerEntriesParams;
12-
import dev.andstuff.kraken.api.model.endpoint.account.params.LedgerInfoParams;
13-
import dev.andstuff.kraken.api.model.endpoint.account.response.LedgerEntry;
14-
import dev.andstuff.kraken.api.model.endpoint.account.response.LedgerInfo;
15-
import dev.andstuff.kraken.api.model.endpoint.market.AssetInfoEndpoint;
16-
import dev.andstuff.kraken.api.model.endpoint.market.AssetPairEndpoint;
17-
import dev.andstuff.kraken.api.model.endpoint.market.ServerTimeEndpoint;
18-
import dev.andstuff.kraken.api.model.endpoint.market.SystemStatusEndpoint;
19-
import dev.andstuff.kraken.api.model.endpoint.market.TickerEndpoint;
20-
import dev.andstuff.kraken.api.model.endpoint.market.params.AssetPairParams;
21-
import dev.andstuff.kraken.api.model.endpoint.market.response.AssetInfo;
22-
import dev.andstuff.kraken.api.model.endpoint.market.response.AssetPair;
23-
import dev.andstuff.kraken.api.model.endpoint.market.response.ServerTime;
24-
import dev.andstuff.kraken.api.model.endpoint.market.response.SystemStatus;
25-
import dev.andstuff.kraken.api.model.endpoint.market.response.Ticker;
26-
import dev.andstuff.kraken.api.model.endpoint.priv.JsonPrivateEndpoint;
27-
import dev.andstuff.kraken.api.model.endpoint.pub.JsonPublicEndpoint;
8+
import dev.andstuff.kraken.api.endpoint.account.LedgerEntriesEndpoint;
9+
import dev.andstuff.kraken.api.endpoint.account.LedgerInfoEndpoint;
10+
import dev.andstuff.kraken.api.endpoint.account.params.LedgerEntriesParams;
11+
import dev.andstuff.kraken.api.endpoint.account.params.LedgerInfoParams;
12+
import dev.andstuff.kraken.api.endpoint.account.response.LedgerEntry;
13+
import dev.andstuff.kraken.api.endpoint.account.response.LedgerInfo;
14+
import dev.andstuff.kraken.api.endpoint.market.AssetInfoEndpoint;
15+
import dev.andstuff.kraken.api.endpoint.market.AssetPairEndpoint;
16+
import dev.andstuff.kraken.api.endpoint.market.ServerTimeEndpoint;
17+
import dev.andstuff.kraken.api.endpoint.market.SystemStatusEndpoint;
18+
import dev.andstuff.kraken.api.endpoint.market.TickerEndpoint;
19+
import dev.andstuff.kraken.api.endpoint.market.params.AssetPairParams;
20+
import dev.andstuff.kraken.api.endpoint.market.response.AssetInfo;
21+
import dev.andstuff.kraken.api.endpoint.market.response.AssetPair;
22+
import dev.andstuff.kraken.api.endpoint.market.response.ServerTime;
23+
import dev.andstuff.kraken.api.endpoint.market.response.SystemStatus;
24+
import dev.andstuff.kraken.api.endpoint.market.response.Ticker;
25+
import dev.andstuff.kraken.api.endpoint.priv.JsonPrivateEndpoint;
26+
import dev.andstuff.kraken.api.endpoint.priv.PrivateEndpoint;
27+
import dev.andstuff.kraken.api.endpoint.pub.JsonPublicEndpoint;
2828
import dev.andstuff.kraken.api.rest.DefaultKrakenRestRequester;
29+
import dev.andstuff.kraken.api.rest.EpochBasedNonceGenerator;
30+
import dev.andstuff.kraken.api.rest.KrakenCredentials;
31+
import dev.andstuff.kraken.api.rest.KrakenNonceGenerator;
2932
import dev.andstuff.kraken.api.rest.KrakenRestRequester;
33+
import lombok.Builder;
3034
import lombok.Getter;
3135
import lombok.RequiredArgsConstructor;
3236

37+
@Builder(toBuilder = true)
3338
public class KrakenAPI {
3439

40+
private final KrakenCredentials credentials;
41+
private final KrakenNonceGenerator nonceGenerator;
3542
private final KrakenRestRequester restRequester;
3643

3744
public KrakenAPI() {
38-
this(new DefaultKrakenRestRequester());
45+
this(null, new DefaultKrakenRestRequester());
46+
}
47+
48+
public KrakenAPI(String key, String secret) {
49+
this(new KrakenCredentials(key, secret));
3950
}
4051

4152
public KrakenAPI(KrakenCredentials credentials) {
42-
this(new DefaultKrakenRestRequester(credentials));
53+
this(credentials, new DefaultKrakenRestRequester());
4354
}
4455

45-
public KrakenAPI(String key, String secret) {
46-
this(new DefaultKrakenRestRequester(key, secret));
56+
public KrakenAPI(KrakenCredentials credentials, KrakenNonceGenerator nonceGenerator) {
57+
this(credentials, nonceGenerator, new DefaultKrakenRestRequester());
58+
}
59+
60+
public KrakenAPI(KrakenCredentials credentials, KrakenRestRequester restRequester) {
61+
this(credentials, new EpochBasedNonceGenerator(), restRequester);
4762
}
4863

49-
public KrakenAPI(KrakenRestRequester restRequester) {
64+
public KrakenAPI(KrakenCredentials credentials, KrakenNonceGenerator nonceGenerator, KrakenRestRequester restRequester) {
65+
this.credentials = credentials;
66+
this.nonceGenerator = nonceGenerator;
5067
this.restRequester = restRequester;
5168
}
5269

@@ -83,11 +100,15 @@ public Map<String, Ticker> ticker(List<String> pairs) {
83100
/* Implemented private endpoints */
84101

85102
public LedgerInfo ledgerInfo(LedgerInfoParams params) {
86-
return restRequester.execute(new LedgerInfoEndpoint(params));
103+
return executePrivate(new LedgerInfoEndpoint(params));
87104
}
88105

89106
public Map<String, LedgerEntry> ledgerEntries(LedgerEntriesParams params) {
90-
return restRequester.execute(new LedgerEntriesEndpoint(params));
107+
return executePrivate(new LedgerEntriesEndpoint(params));
108+
}
109+
110+
private <T> T executePrivate(PrivateEndpoint<T> endpoint) {
111+
return restRequester.execute(endpoint, credentials, nonceGenerator);
91112
}
92113

93114
/* Query unimplemented endpoints */
@@ -109,27 +130,26 @@ public JsonNode queryPublic(String path, Map<String, String> queryParams) {
109130
}
110131

111132
public JsonNode query(Private endpoint) {
112-
return restRequester.execute(new JsonPrivateEndpoint(endpoint.getPath()));
133+
return executePrivate(new JsonPrivateEndpoint(endpoint.getPath()));
113134
}
114135

115136
public JsonNode query(Private endpoint, Map<String, String> params) {
116-
return restRequester.execute(new JsonPrivateEndpoint(endpoint.getPath(), params));
137+
return executePrivate(new JsonPrivateEndpoint(endpoint.getPath(), params));
117138
}
118139

119140
public JsonNode queryPrivate(String path) {
120-
return restRequester.execute(new JsonPrivateEndpoint(path));
141+
return executePrivate(new JsonPrivateEndpoint(path));
121142
}
122143

123144
public JsonNode queryPrivate(String path, Map<String, String> params) {
124-
return restRequester.execute(new JsonPrivateEndpoint(path, params));
145+
return executePrivate(new JsonPrivateEndpoint(path, params));
125146
}
126147

127148
/* All endpoints */
128149

129150
@Getter
130151
@RequiredArgsConstructor
131152
public enum Public {
132-
133153
ASSETS("Assets"),
134154
ASSET_PAIRS("AssetPairs"),
135155
DEPTH("Depth"),
@@ -146,7 +166,6 @@ public enum Public {
146166
@Getter
147167
@RequiredArgsConstructor
148168
public enum Private {
149-
150169
ACCOUNT_TRANSFER("AccountTransfer"),
151170
ADD_EXPORT("AddExport"),
152171
ADD_ORDER("AddOrder"),

0 commit comments

Comments
 (0)