Prediction UI: show cost and payout instead of share counts

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ZHU MINCHAOandClaude Sonnet 5.5 committed 2026-11-04 07:39:03 +08:00
1 parent 723724aa4b
commit ca3230e7d2
4 files changed
+12 -11

No files matched your search

+1
View File
@@ -6,6 +6,7 @@
- Web3 页"预测"子页(游戏第 8 天起,Web3 治理社区已买下):每个盘口是一道是非题,开盘当天到窗口开始前可以买卖,窗口最后一天夜里结算;每天开门后补盘,同时开放 3–6 个,每天最多新开 2 个。资金走链上钱包的 CRC:买入、全部卖出都是合约调用,要在钱包上签名(和质押一样;买入的手续费在核对页选档、用 CRC 付,卖出用价值最高的币付);持仓记在签名的钱包名下,结算时兑付回这个钱包,同一盘口各钱包只能押同一边,持仓上限和内幕判定按盘口合计(拆到几个钱包躲不过)。污点与成本按花掉的价值比例随资金进持仓,赢的钱继承押注资金的污点比例,卖回时按比例退。
- 盘口类型:新闻事件("出现某常规事件",先验 = 游戏掷骰规则:5 天后每天 50 / 35 / 25% 有事件,再按权重抽)、派系行动("某派系有行动开始",每天开始概率 6%,估计值)、水纯度(明天上层 / 下层水纯度 ≥ 阈值,先验精确)、PSC 价格(窗口最后一天夜间结算前的价格 ≥ 阈值,先验用价格过程的正态近似)。事件和派系行动靠夜间对比"昨晚生效的事件"得到当天新出现的;窗口里缺任何一天的记录(没睡觉结算)盘口作废、退回本金。
- 界面不再出现"份":持仓直接写成本和"押中得多少"(每份押中兑付 1 信用点),盘口列表、右栏的各钱包持仓和买入预览都是这种写法,右栏另给"现在卖出得多少"。
- 定价:LMSR,初始价 = 先验,单盘系统最大亏损 = 300 + 10 × 天数,流动性参数由它反推;买卖各收 2%;单人单盘份额上限 = 最大亏损 × 3;一个盘口只持有一边。
- 内幕:下注时这个事件(或派系行动)已经以"玩家看得到"的形式排进日程(传闻纸条、派系特权),而且落在窗口里,押「是」算内幕单。内幕持仓达到份额上限的 40% 后,结算时 50% 概率被查:只退本金,收益的一半(上限 400)记 FRAUD 罪证。情报顾客没接。
- 复核(ops `research/predsim`):不知情随机押期望为负;谨慎的内幕(压在查处线下)在低先验盘口一盘净赚 270–520(第 30 天最大亏损 600),买满上限的期望反而更低。行情先验和真实 `Market` 过程的蒙特卡洛对得上(单元测试,误差 < 4%)。
@@ -541,23 +541,23 @@ predict.acct,On-chain wallet {0}: CRC {1}
predict.none,No open markets today.
predict.closed,closed
predict.row,Yes {0}% No {1}%
predict.held,holding {0} x{1}
predict.held,"holding {0}: cost {1}, pays {2}"
predict.yes,Yes
predict.no,No
predict.void,void
predict.result,Day {0} {1} result: {2} {3}
predict.pick,Trade
predict.price,Yes {0}% No {1}%
predict.pos,"{0}: {1} x{2}"
predict.pos2,"Cost {0} sells for {1}"
predict.pos,"{0}: {1}, pays {2}"
predict.pos2,"Cost {0} sells for {1} now"
predict.sum.buy,"Buy {1} for {2} CRC: {0}"
predict.sum.sell,Sell prediction position: {0}
predict.closed.note,"Closed, waiting for settlement."
predict.preview,"Buy {0}: about {1} shares, net {2} if right"
predict.preview,"Buy {0}: pays {1}, net {2} if right"
predict.buy.yes,Buy Yes
predict.buy.no,Buy No
predict.sell,Sell all
predict.bought,Bought {0} x{1} for {2}.
predict.bought,"Bought {0} for {2}, pays {1} if right."
predict.sold,"Sold, received {0}."
predict.err.Closed,This market is closed.
predict.err.Amount,Invalid amount.
Can't render this file because it contains an unexpected character in line 271 and column 1616.
@@ -540,23 +540,23 @@ predict.acct,链上钱包 {0}:CRC {1}
predict.none,今天没有开放的盘口。
predict.closed,已封盘
predict.row,是 {0}% 否 {1}%
predict.held,持有「{0}」{1} 份
predict.held,持有「{0}」成本 {1},押中得 {2}
predict.yes,是
predict.no,否
predict.void,作废
predict.result,第 {0} 天 {1} 结果:{2} {3}
predict.pick,买卖
predict.price,是 {0}% 否 {1}%
predict.pos,{0}:「{1}」{2} 份
predict.pos2,成本 {0} 全部卖出可得 {1}
predict.pos,{0}:押「{1}」,押中得 {2}
predict.pos2,成本 {0} 现在卖出得 {1}
predict.sum.buy,"买入「{1}」,花 {2} CRC:{0}"
predict.sum.sell,卖出预测持仓:{0}
predict.closed.note,已封盘,等结算。
predict.preview,买「{0}」约 {1} 份,押中净赚 {2}
predict.preview,买「{0}」:押中得 {1},净赚 {2}
predict.buy.yes,买入「是」
predict.buy.no,买入「否」
predict.sell,全部卖出
predict.bought,买入「{0}」{1} 份,花 {2}。
predict.bought,买入「{0}」,花 {2},押中可得 {1}。
predict.sold,卖出,收回 {0}。
predict.err.Closed,这个盘口已经封盘。
predict.err.Amount,金额不对。
Can't render this file because it contains an unexpected character in line 270 and column 2407.
+1 -1
View File
@@ -376,7 +376,7 @@ namespace Decentralized
l.AddButton(m.Id == _predPick ? "[" + q + "]" : q, () => { _predPick = mk.Id; _message = null; Open(); });
l.End();
string state = m.IsOpen(day) ? "" : " " + L.T("predict.closed");
l.AddLabel(L.T("predict.row", (m.PYes * 100).ToString("0"), ((1 - m.PYes) * 100).ToString("0")) + (all.Count > 0 ? " " + L.T("predict.held", L.T(all[0].Yes ? "predict.yes" : "predict.no"), Fmt.Num(all.Sum(x => x.Shares))) : "") + state);
l.AddLabel(L.T("predict.row", (m.PYes * 100).ToString("0"), ((1 - m.PYes) * 100).ToString("0")) + (all.Count > 0 ? " " + L.T("predict.held", L.T(all[0].Yes ? "predict.yes" : "predict.no"), Fmt.Num(all.Sum(x => x.Cost)), Fmt.Num(all.Sum(x => x.Shares))) : "") + state);
}
if (bk.Recent.Count > 0)
{