summaryrefslogtreecommitdiffstats
path: root/service
diff options
context:
space:
mode:
Diffstat (limited to 'service')
-rw-r--r--service/src/main/java/market/guess/service/domain/Account.java27
-rw-r--r--service/src/main/java/market/guess/service/domain/AccountType.java6
-rw-r--r--service/src/main/java/market/guess/service/domain/BigDecimalOptions.java14
-rw-r--r--service/src/main/java/market/guess/service/domain/Event.java51
-rw-r--r--service/src/main/java/market/guess/service/domain/LedgerEntry.java8
-rw-r--r--service/src/main/java/market/guess/service/domain/Option.java21
-rw-r--r--service/src/main/java/market/guess/service/domain/Trade.java19
-rw-r--r--service/src/main/java/market/guess/service/domain/User.java21
-rw-r--r--service/src/main/java/market/guess/service/mechanism/TradingMechanism.java15
-rw-r--r--service/src/main/java/market/guess/service/repositories/EventRepository.java7
-rw-r--r--service/src/main/java/market/guess/service/repositories/UserRepository.java8
11 files changed, 197 insertions, 0 deletions
diff --git a/service/src/main/java/market/guess/service/domain/Account.java b/service/src/main/java/market/guess/service/domain/Account.java
new file mode 100644
index 0000000..8b510a5
--- /dev/null
+++ b/service/src/main/java/market/guess/service/domain/Account.java
@@ -0,0 +1,27 @@
1package market.guess.service.domain;
2
3import java.math.BigDecimal;
4import java.time.Clock;
5import java.util.ArrayList;
6import java.util.List;
7
8public final class Account {
9
10 private final AccountType accountType;
11 private final String owner;
12 private final Clock clock;
13 private final List<LedgerEntry> entries = new ArrayList<>();
14 private BigDecimal balance;
15
16 public Account(AccountType accountType, String owner, BigDecimal initialBalance) {
17 this(accountType, owner, initialBalance, Clock.systemUTC());
18 }
19
20 public Account(AccountType accountType, String owner, BigDecimal initialBalance, Clock clock) {
21 super();
22 this.accountType = accountType;
23 this.owner = owner;
24 this.balance = initialBalance;
25 this.clock = clock;
26 }
27}
diff --git a/service/src/main/java/market/guess/service/domain/AccountType.java b/service/src/main/java/market/guess/service/domain/AccountType.java
new file mode 100644
index 0000000..293ff4e
--- /dev/null
+++ b/service/src/main/java/market/guess/service/domain/AccountType.java
@@ -0,0 +1,6 @@
1package market.guess.service.domain;
2
3public enum AccountType {
4 EVENT,
5 USER
6}
diff --git a/service/src/main/java/market/guess/service/domain/BigDecimalOptions.java b/service/src/main/java/market/guess/service/domain/BigDecimalOptions.java
new file mode 100644
index 0000000..159905f
--- /dev/null
+++ b/service/src/main/java/market/guess/service/domain/BigDecimalOptions.java
@@ -0,0 +1,14 @@
1package market.guess.service.domain;
2
3import java.math.BigDecimal;
4import java.math.RoundingMode;
5
6public record BigDecimalOptions(int scale, RoundingMode roundingMode) {
7 public static final BigDecimalOptions DEFAULT = new BigDecimalOptions(2, RoundingMode.HALF_EVEN);
8 public static final BigDecimal ZERO_MONEY =
9 BigDecimal.ZERO.setScale(DEFAULT.scale(), DEFAULT.roundingMode());
10
11 public static BigDecimal valueOf(double v) {
12 return BigDecimal.valueOf(v).setScale(DEFAULT.scale(), DEFAULT.roundingMode());
13 }
14}
diff --git a/service/src/main/java/market/guess/service/domain/Event.java b/service/src/main/java/market/guess/service/domain/Event.java
new file mode 100644
index 0000000..4c33928
--- /dev/null
+++ b/service/src/main/java/market/guess/service/domain/Event.java
@@ -0,0 +1,51 @@
1package market.guess.service.domain;
2
3import java.math.BigDecimal;
4import java.util.ArrayList;
5import java.util.List;
6import market.guess.api.CommissionTiming;
7import market.guess.api.EventStatus;
8import market.guess.service.mechanism.TradingMechanism;
9
10public final class Event {
11 private final String eventKey;
12 private final int displayId;
13 private final String name;
14 private final String description;
15 private final int commissionPercent;
16 private final CommissionTiming commissionTiming;
17 private final TradingMechanism mechanism;
18 private final List<Option> options;
19 private final Account account;
20 private final String marketMaker;
21
22 private final List<Trade> trades = new ArrayList<>();
23 private EventStatus status;
24 private String winningOptionKey;
25 private long nextTradeSeq = 1;
26 private BigDecimal settlementCommission = BigDecimalOptions.ZERO_MONEY;
27
28 public Event(
29 String eventKey,
30 int displayId,
31 String name,
32 String description,
33 int commissionPercent,
34 CommissionTiming commissionTiming,
35 TradingMechanism mechanism,
36 EventStatus status,
37 List<Option> options,
38 String marketMaker) {
39 this.eventKey = eventKey;
40 this.displayId = displayId;
41 this.name = name;
42 this.description = description;
43 this.commissionPercent = commissionPercent;
44 this.commissionTiming = commissionTiming;
45 this.mechanism = mechanism;
46 this.options = List.copyOf(options);
47 this.marketMaker = marketMaker;
48 this.account = new Account(AccountType.EVENT, eventKey, BigDecimalOptions.ZERO_MONEY);
49 this.status = status;
50 }
51}
diff --git a/service/src/main/java/market/guess/service/domain/LedgerEntry.java b/service/src/main/java/market/guess/service/domain/LedgerEntry.java
new file mode 100644
index 0000000..b9173c8
--- /dev/null
+++ b/service/src/main/java/market/guess/service/domain/LedgerEntry.java
@@ -0,0 +1,8 @@
1package market.guess.service.domain;
2
3import java.math.BigDecimal;
4import java.time.Instant;
5import market.guess.api.LedgerType;
6
7public record LedgerEntry(
8 Instant time, LedgerType type, BigDecimal amount, BigDecimal balanceAfter, String note) {}
diff --git a/service/src/main/java/market/guess/service/domain/Option.java b/service/src/main/java/market/guess/service/domain/Option.java
new file mode 100644
index 0000000..c182850
--- /dev/null
+++ b/service/src/main/java/market/guess/service/domain/Option.java
@@ -0,0 +1,21 @@
1package market.guess.service.domain;
2
3public final class Option {
4
5 private String key;
6 private String name;
7
8 public Option(String key, String name) {
9 super();
10 this.key = key;
11 this.name = name;
12 }
13
14 public String getName() {
15 return name;
16 }
17
18 public String getKey() {
19 return key;
20 }
21}
diff --git a/service/src/main/java/market/guess/service/domain/Trade.java b/service/src/main/java/market/guess/service/domain/Trade.java
new file mode 100644
index 0000000..cb6ed93
--- /dev/null
+++ b/service/src/main/java/market/guess/service/domain/Trade.java
@@ -0,0 +1,19 @@
1package market.guess.service.domain;
2
3import java.math.BigDecimal;
4import java.time.Instant;
5
6public record Trade(
7 long seq,
8 Instant at,
9 String userName,
10 String optionKey,
11 String optionName,
12 long quantity,
13 BigDecimal sharesCost,
14 BigDecimal commission) {
15
16 public BigDecimal totalPaid() {
17 return sharesCost.add(commission);
18 }
19}
diff --git a/service/src/main/java/market/guess/service/domain/User.java b/service/src/main/java/market/guess/service/domain/User.java
new file mode 100644
index 0000000..3ae1d0f
--- /dev/null
+++ b/service/src/main/java/market/guess/service/domain/User.java
@@ -0,0 +1,21 @@
1package market.guess.service.domain;
2
3import java.math.BigDecimal;
4
5public final class User {
6 private final String name;
7 private final Account account;
8
9 public User(String name, BigDecimal initialBalance) {
10 this.name = name;
11 this.account = new Account(AccountType.USER, name, initialBalance);
12 }
13
14 public String getName() {
15 return name;
16 }
17
18 public Account getAccount() {
19 return account;
20 }
21}
diff --git a/service/src/main/java/market/guess/service/mechanism/TradingMechanism.java b/service/src/main/java/market/guess/service/mechanism/TradingMechanism.java
new file mode 100644
index 0000000..d6e38bc
--- /dev/null
+++ b/service/src/main/java/market/guess/service/mechanism/TradingMechanism.java
@@ -0,0 +1,15 @@
1package market.guess.service.mechanism;
2
3import java.math.BigDecimal;
4import market.guess.api.MechanismType;
5
6public interface TradingMechanism {
7
8 MechanismType type();
9
10 BigDecimal openingCost(int optionCount);
11
12 BigDecimal costOfBuying(long[] q, int optionIndex, long quantity);
13
14 double[] prices(long[] q);
15}
diff --git a/service/src/main/java/market/guess/service/repositories/EventRepository.java b/service/src/main/java/market/guess/service/repositories/EventRepository.java
new file mode 100644
index 0000000..7794c99
--- /dev/null
+++ b/service/src/main/java/market/guess/service/repositories/EventRepository.java
@@ -0,0 +1,7 @@
1package market.guess.service.repositories;
2
3import market.guess.service.domain.Event;
4
5public interface EventRepository {
6 Event getEvent(String id);
7}
diff --git a/service/src/main/java/market/guess/service/repositories/UserRepository.java b/service/src/main/java/market/guess/service/repositories/UserRepository.java
new file mode 100644
index 0000000..992a8b3
--- /dev/null
+++ b/service/src/main/java/market/guess/service/repositories/UserRepository.java
@@ -0,0 +1,8 @@
1package market.guess.service.repositories;
2
3import market.guess.service.domain.User;
4
5public interface UserRepository {
6
7 User getUser(String name);
8}