diff options
Diffstat (limited to 'service/src/main/java')
9 files changed, 54 insertions, 16 deletions
diff --git a/service/src/main/java/market/guess/service/LocalGuessMarketContext.java b/service/src/main/java/market/guess/service/LocalGuessMarketContext.java index 29e3f5c..909a808 100644 --- a/service/src/main/java/market/guess/service/LocalGuessMarketContext.java +++ b/service/src/main/java/market/guess/service/LocalGuessMarketContext.java | |||
| @@ -86,7 +86,7 @@ public final class LocalGuessMarketContext implements GuessMarketContext { | |||
| 86 | event.toEventSummary(), | 86 | event.toEventSummary(), |
| 87 | event.toMarketState(), | 87 | event.toMarketState(), |
| 88 | event.getHistory(), | 88 | event.getHistory(), |
| 89 | event.getWinningOptionKey())); | 89 | event.getWinningOptionName())); |
| 90 | } | 90 | } |
| 91 | 91 | ||
| 92 | return Result.error("Couldn't settle event."); | 92 | return Result.error("Couldn't settle event."); |
diff --git a/service/src/main/java/market/guess/service/catalog/LocalCatalogContext.java b/service/src/main/java/market/guess/service/catalog/LocalCatalogContext.java index 270aadd..ea26107 100644 --- a/service/src/main/java/market/guess/service/catalog/LocalCatalogContext.java +++ b/service/src/main/java/market/guess/service/catalog/LocalCatalogContext.java | |||
| @@ -42,7 +42,11 @@ public final class LocalCatalogContext implements CatalogContext { | |||
| 42 | var event = optional.get(); | 42 | var event = optional.get(); |
| 43 | 43 | ||
| 44 | return Result.ok( | 44 | return Result.ok( |
| 45 | new EventDetailDTO(event.toEventSummary(), event.toMarketState(), event.getHistory(), "")); | 45 | new EventDetailDTO( |
| 46 | event.toEventSummary(), | ||
| 47 | event.toMarketState(), | ||
| 48 | event.getHistory(), | ||
| 49 | event.getWinningOptionName())); | ||
| 46 | } | 50 | } |
| 47 | 51 | ||
| 48 | @Override | 52 | @Override |
diff --git a/service/src/main/java/market/guess/service/catalog/infrastructure/provider/v1/XMLLoaderV1.java b/service/src/main/java/market/guess/service/catalog/infrastructure/provider/v1/XMLLoaderV1.java index b97114d..bcae787 100644 --- a/service/src/main/java/market/guess/service/catalog/infrastructure/provider/v1/XMLLoaderV1.java +++ b/service/src/main/java/market/guess/service/catalog/infrastructure/provider/v1/XMLLoaderV1.java | |||
| @@ -63,7 +63,7 @@ public final class XMLLoaderV1 implements Loader { | |||
| 63 | eventRepository.add(mapper.toDomain(event)); | 63 | eventRepository.add(mapper.toDomain(event)); |
| 64 | } | 64 | } |
| 65 | 65 | ||
| 66 | userRepository.add(new User("Tester", 9_999_999)); | 66 | userRepository.add(new User("Tester", 500)); |
| 67 | 67 | ||
| 68 | return Result.ok(new LoadResult(path.toString(), eventRepository.getAll().size())); | 68 | return Result.ok(new LoadResult(path.toString(), eventRepository.getAll().size())); |
| 69 | } catch (Exception e) { | 69 | } catch (Exception e) { |
diff --git a/service/src/main/java/market/guess/service/domain/Event.java b/service/src/main/java/market/guess/service/domain/Event.java index 4c78486..e1b366e 100644 --- a/service/src/main/java/market/guess/service/domain/Event.java +++ b/service/src/main/java/market/guess/service/domain/Event.java | |||
| @@ -10,9 +10,11 @@ import market.guess.api.MarketStateDTO; | |||
| 10 | import market.guess.api.TradeRowDTO; | 10 | import market.guess.api.TradeRowDTO; |
| 11 | import market.guess.model.event.EventStatus; | 11 | import market.guess.model.event.EventStatus; |
| 12 | import market.guess.model.event.EventSummaryDTO; | 12 | import market.guess.model.event.EventSummaryDTO; |
| 13 | import market.guess.model.ledger.LedgerType; | ||
| 13 | import market.guess.service.helpers.BigDecimalOptions; | 14 | import market.guess.service.helpers.BigDecimalOptions; |
| 14 | import market.guess.service.helpers.InstantOptions; | 15 | import market.guess.service.helpers.InstantOptions; |
| 15 | import market.guess.service.ledger.Ledger; | 16 | import market.guess.service.ledger.Ledger; |
| 17 | import market.guess.service.ledger.LedgerEntry; | ||
| 16 | import market.guess.service.mechanism.TradingMechanism; | 18 | import market.guess.service.mechanism.TradingMechanism; |
| 17 | 19 | ||
| 18 | public final class Event { | 20 | public final class Event { |
| @@ -54,6 +56,12 @@ public final class Event { | |||
| 54 | this.markets = markets; | 56 | this.markets = markets; |
| 55 | this.marketMaker = marketMaker; | 57 | this.marketMaker = marketMaker; |
| 56 | this.ledger = new Ledger(eventKey, BigDecimalOptions.ZERO_MONEY); | 58 | this.ledger = new Ledger(eventKey, BigDecimalOptions.ZERO_MONEY); |
| 59 | var seed = mechanism.maxLoss(); | ||
| 60 | if (seed.signum() > 0) { | ||
| 61 | ledger.record( | ||
| 62 | new LedgerEntry( | ||
| 63 | 0, Instant.now(), LedgerType.SUBSIDY, seed, seed, "Market maker subsidy (max loss)")); | ||
| 64 | } | ||
| 57 | this.state = status; | 65 | this.state = status; |
| 58 | } | 66 | } |
| 59 | 67 | ||
| @@ -151,6 +159,10 @@ public final class Event { | |||
| 151 | return winningOptionKey; | 159 | return winningOptionKey; |
| 152 | } | 160 | } |
| 153 | 161 | ||
| 162 | public String getWinningOptionName() { | ||
| 163 | return winningOptionKey == null ? "" : getOption(winningOptionKey).getName(); | ||
| 164 | } | ||
| 165 | |||
| 154 | public void setWinningOptionKey(String winningOptionKey) { | 166 | public void setWinningOptionKey(String winningOptionKey) { |
| 155 | this.winningOptionKey = winningOptionKey; | 167 | this.winningOptionKey = winningOptionKey; |
| 156 | } | 168 | } |
diff --git a/service/src/main/java/market/guess/service/fulfillment/LocalFulfillmentContext.java b/service/src/main/java/market/guess/service/fulfillment/LocalFulfillmentContext.java index 64887dc..cbbfafd 100644 --- a/service/src/main/java/market/guess/service/fulfillment/LocalFulfillmentContext.java +++ b/service/src/main/java/market/guess/service/fulfillment/LocalFulfillmentContext.java | |||
| @@ -43,6 +43,11 @@ public final class LocalFulfillmentContext implements FulfillmentContext { | |||
| 43 | LedgerType.PURCHASE, | 43 | LedgerType.PURCHASE, |
| 44 | trade.totalPaid(), | 44 | trade.totalPaid(), |
| 45 | "Purchase: " + order.market().getName()); | 45 | "Purchase: " + order.market().getName()); |
| 46 | ledger.credit( | ||
| 47 | event.getLedger(), | ||
| 48 | LedgerType.PURCHASE, | ||
| 49 | trade.totalPaid(), | ||
| 50 | "Purchase: " + order.market().getName()); | ||
| 46 | order.market().addVolume(trade.quantity()); | 51 | order.market().addVolume(trade.quantity()); |
| 47 | recorded.add(trade); | 52 | recorded.add(trade); |
| 48 | } | 53 | } |
diff --git a/service/src/main/java/market/guess/service/ledger/LedgerContext.java b/service/src/main/java/market/guess/service/ledger/LedgerContext.java index bb1bf97..fb58107 100644 --- a/service/src/main/java/market/guess/service/ledger/LedgerContext.java +++ b/service/src/main/java/market/guess/service/ledger/LedgerContext.java | |||
| @@ -27,19 +27,23 @@ public final class LedgerContext { | |||
| 27 | return true; | 27 | return true; |
| 28 | } | 28 | } |
| 29 | 29 | ||
| 30 | public boolean credit(Ledger ledger, LedgerType type, BigDecimal amount, String note) { | ||
| 31 | record(ledger, type, amount, note); | ||
| 32 | return true; | ||
| 33 | } | ||
| 34 | |||
| 35 | public boolean debit(Ledger ledger, LedgerType type, BigDecimal amount, String note) { | ||
| 36 | record(ledger, type, amount.negate(), note); | ||
| 37 | return true; | ||
| 38 | } | ||
| 39 | |||
| 30 | private void record(String name, LedgerType type, BigDecimal amount, String note) { | 40 | private void record(String name, LedgerType type, BigDecimal amount, String note) { |
| 31 | users | 41 | users.get(name).ifPresent(u -> record(u.getLedger(), type, amount, note)); |
| 32 | .get(name) | 42 | } |
| 33 | .ifPresent( | 43 | |
| 34 | u -> | 44 | private void record(Ledger ledger, LedgerType type, BigDecimal amount, String note) { |
| 35 | u.getLedger() | 45 | ledger.record( |
| 36 | .record( | 46 | new LedgerEntry( |
| 37 | new LedgerEntry( | 47 | runningId++, clock.instant(), type, amount, ledger.getBalance().add(amount), note)); |
| 38 | runningId++, | ||
| 39 | clock.instant(), | ||
| 40 | type, | ||
| 41 | amount, | ||
| 42 | u.getLedger().getBalance().add(amount), | ||
| 43 | note))); | ||
| 44 | } | 48 | } |
| 45 | } | 49 | } |
diff --git a/service/src/main/java/market/guess/service/mechanism/LmsrTradingMechanism.java b/service/src/main/java/market/guess/service/mechanism/LmsrTradingMechanism.java index 062a095..981e733 100644 --- a/service/src/main/java/market/guess/service/mechanism/LmsrTradingMechanism.java +++ b/service/src/main/java/market/guess/service/mechanism/LmsrTradingMechanism.java | |||
| @@ -63,6 +63,11 @@ public final class LmsrTradingMechanism implements TradingMechanism { | |||
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | @Override | 65 | @Override |
| 66 | public BigDecimal maxLoss() { | ||
| 67 | return BigDecimalOptions.toMoney(cost(new int[q.length])); | ||
| 68 | } | ||
| 69 | |||
| 70 | @Override | ||
| 66 | public BigDecimal[] prices() { | 71 | public BigDecimal[] prices() { |
| 67 | var max = Arrays.stream(q).mapToDouble(qi -> (double) qi / liquidity).max().orElse(0); | 72 | var max = Arrays.stream(q).mapToDouble(qi -> (double) qi / liquidity).max().orElse(0); |
| 68 | 73 | ||
diff --git a/service/src/main/java/market/guess/service/mechanism/TradingMechanism.java b/service/src/main/java/market/guess/service/mechanism/TradingMechanism.java index 6fc5a9a..30d076d 100644 --- a/service/src/main/java/market/guess/service/mechanism/TradingMechanism.java +++ b/service/src/main/java/market/guess/service/mechanism/TradingMechanism.java | |||
| @@ -7,6 +7,7 @@ import market.guess.api.MechanismType; | |||
| 7 | import market.guess.service.domain.Event; | 7 | import market.guess.service.domain.Event; |
| 8 | import market.guess.service.domain.Market; | 8 | import market.guess.service.domain.Market; |
| 9 | import market.guess.service.domain.Trade; | 9 | import market.guess.service.domain.Trade; |
| 10 | import market.guess.service.helpers.BigDecimalOptions; | ||
| 10 | 11 | ||
| 11 | public sealed interface TradingMechanism permits LmsrTradingMechanism, OrderBookTradingMechanism { | 12 | public sealed interface TradingMechanism permits LmsrTradingMechanism, OrderBookTradingMechanism { |
| 12 | 13 | ||
| @@ -15,4 +16,9 @@ public sealed interface TradingMechanism permits LmsrTradingMechanism, OrderBook | |||
| 15 | List<Trade> buy(Event event, Market market, Instant at, long quantity); | 16 | List<Trade> buy(Event event, Market market, Instant at, long quantity); |
| 16 | 17 | ||
| 17 | BigDecimal[] prices(); | 18 | BigDecimal[] prices(); |
| 19 | |||
| 20 | /** The subsidy needed to cover the market maker's worst-case loss, if any. */ | ||
| 21 | default BigDecimal maxLoss() { | ||
| 22 | return BigDecimalOptions.ZERO_MONEY; | ||
| 23 | } | ||
| 18 | } | 24 | } |
diff --git a/service/src/main/java/market/guess/service/settlement/LocalSettlementContext.java b/service/src/main/java/market/guess/service/settlement/LocalSettlementContext.java index 118e349..f6e9b67 100644 --- a/service/src/main/java/market/guess/service/settlement/LocalSettlementContext.java +++ b/service/src/main/java/market/guess/service/settlement/LocalSettlementContext.java | |||
| @@ -40,6 +40,8 @@ public final class LocalSettlementContext implements SettlementContext { | |||
| 40 | var net = gross.subtract(commission); | 40 | var net = gross.subtract(commission); |
| 41 | 41 | ||
| 42 | ledger.credit(entry.getKey(), LedgerType.PAYOUT, net, "Payout: " + winningOption.getName()); | 42 | ledger.credit(entry.getKey(), LedgerType.PAYOUT, net, "Payout: " + winningOption.getName()); |
| 43 | ledger.debit( | ||
| 44 | event.getLedger(), LedgerType.PAYOUT, net, "Payout: " + winningOption.getName()); | ||
| 43 | event.addSettlementCommission(commission); | 45 | event.addSettlementCommission(commission); |
| 44 | totalPayout = totalPayout.add(net); | 46 | totalPayout = totalPayout.add(net); |
| 45 | } | 47 | } |