summaryrefslogtreecommitdiffstats
path: root/service
diff options
context:
space:
mode:
Diffstat (limited to 'service')
-rw-r--r--service/src/main/java/market/guess/service/LocalGuessMarketContext.java2
-rw-r--r--service/src/main/java/market/guess/service/catalog/LocalCatalogContext.java6
-rw-r--r--service/src/main/java/market/guess/service/catalog/infrastructure/provider/v1/XMLLoaderV1.java2
-rw-r--r--service/src/main/java/market/guess/service/domain/Event.java12
-rw-r--r--service/src/main/java/market/guess/service/fulfillment/LocalFulfillmentContext.java5
-rw-r--r--service/src/main/java/market/guess/service/ledger/LedgerContext.java30
-rw-r--r--service/src/main/java/market/guess/service/mechanism/LmsrTradingMechanism.java5
-rw-r--r--service/src/main/java/market/guess/service/mechanism/TradingMechanism.java6
-rw-r--r--service/src/main/java/market/guess/service/settlement/LocalSettlementContext.java2
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;
10import market.guess.api.TradeRowDTO; 10import market.guess.api.TradeRowDTO;
11import market.guess.model.event.EventStatus; 11import market.guess.model.event.EventStatus;
12import market.guess.model.event.EventSummaryDTO; 12import market.guess.model.event.EventSummaryDTO;
13import market.guess.model.ledger.LedgerType;
13import market.guess.service.helpers.BigDecimalOptions; 14import market.guess.service.helpers.BigDecimalOptions;
14import market.guess.service.helpers.InstantOptions; 15import market.guess.service.helpers.InstantOptions;
15import market.guess.service.ledger.Ledger; 16import market.guess.service.ledger.Ledger;
17import market.guess.service.ledger.LedgerEntry;
16import market.guess.service.mechanism.TradingMechanism; 18import market.guess.service.mechanism.TradingMechanism;
17 19
18public final class Event { 20public 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;
7import market.guess.service.domain.Event; 7import market.guess.service.domain.Event;
8import market.guess.service.domain.Market; 8import market.guess.service.domain.Market;
9import market.guess.service.domain.Trade; 9import market.guess.service.domain.Trade;
10import market.guess.service.helpers.BigDecimalOptions;
10 11
11public sealed interface TradingMechanism permits LmsrTradingMechanism, OrderBookTradingMechanism { 12public 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 }