diff options
Diffstat (limited to 'service/src')
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 @@ | |||
| 1 | package market.guess.service.domain; | ||
| 2 | |||
| 3 | import java.math.BigDecimal; | ||
| 4 | import java.time.Clock; | ||
| 5 | import java.util.ArrayList; | ||
| 6 | import java.util.List; | ||
| 7 | |||
| 8 | public 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 @@ | |||
| 1 | package market.guess.service.domain; | ||
| 2 | |||
| 3 | public 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 @@ | |||
| 1 | package market.guess.service.domain; | ||
| 2 | |||
| 3 | import java.math.BigDecimal; | ||
| 4 | import java.math.RoundingMode; | ||
| 5 | |||
| 6 | public 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 @@ | |||
| 1 | package market.guess.service.domain; | ||
| 2 | |||
| 3 | import java.math.BigDecimal; | ||
| 4 | import java.util.ArrayList; | ||
| 5 | import java.util.List; | ||
| 6 | import market.guess.api.CommissionTiming; | ||
| 7 | import market.guess.api.EventStatus; | ||
| 8 | import market.guess.service.mechanism.TradingMechanism; | ||
| 9 | |||
| 10 | public 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 @@ | |||
| 1 | package market.guess.service.domain; | ||
| 2 | |||
| 3 | import java.math.BigDecimal; | ||
| 4 | import java.time.Instant; | ||
| 5 | import market.guess.api.LedgerType; | ||
| 6 | |||
| 7 | public 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 @@ | |||
| 1 | package market.guess.service.domain; | ||
| 2 | |||
| 3 | public 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 @@ | |||
| 1 | package market.guess.service.domain; | ||
| 2 | |||
| 3 | import java.math.BigDecimal; | ||
| 4 | import java.time.Instant; | ||
| 5 | |||
| 6 | public 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 @@ | |||
| 1 | package market.guess.service.domain; | ||
| 2 | |||
| 3 | import java.math.BigDecimal; | ||
| 4 | |||
| 5 | public 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 @@ | |||
| 1 | package market.guess.service.mechanism; | ||
| 2 | |||
| 3 | import java.math.BigDecimal; | ||
| 4 | import market.guess.api.MechanismType; | ||
| 5 | |||
| 6 | public 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 @@ | |||
| 1 | package market.guess.service.repositories; | ||
| 2 | |||
| 3 | import market.guess.service.domain.Event; | ||
| 4 | |||
| 5 | public 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 @@ | |||
| 1 | package market.guess.service.repositories; | ||
| 2 | |||
| 3 | import market.guess.service.domain.User; | ||
| 4 | |||
| 5 | public interface UserRepository { | ||
| 6 | |||
| 7 | User getUser(String name); | ||
| 8 | } | ||