Phase 2: CRT freeze during crackdowns (frozen balance, thaw, news, test entry)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
be18078f69
commit
c295e72a48
10 files changed
+91
-5
No files matched your search
@@ -47,7 +47,7 @@ namespace Decentralized.Domain
|
||||
/// <summary>存入:从钱包按价值比例带走污点与成本。轮数超出范围或余额不足返回 null。</summary>
|
||||
public MixDeposit Deposit(Wallet w, string asset, double amount, int rounds, int day, Func<string, double> price)
|
||||
{
|
||||
if (rounds < 1 || rounds > Tuning.MixerMaxRounds || amount <= 0 || w.Get(asset) + 1e-9 < amount) return null;
|
||||
if (rounds < 1 || rounds > Tuning.MixerMaxRounds || amount <= 0 || w.Avail(asset) + 1e-9 < amount) return null;
|
||||
double value = amount * price(asset);
|
||||
if (value < Tuning.MixerMin) return null;
|
||||
double total = w.Value(price);
|
||||
|
||||
@@ -49,6 +49,9 @@ namespace Decentralized.Domain
|
||||
public static double CrtFreezeChance(double blackMarketRep) =>
|
||||
Math.Max(0, Tuning.CrtFreezeBase - blackMarketRep * Tuning.CrtFreezePerRep);
|
||||
|
||||
/// <summary>镇压开始时是否冻结玩家的 CRT:按黑市声望,声望越低越容易被黑市"出卖"。</summary>
|
||||
public static bool CrtFrozenByCrackdown(double blackMarketRep, Rng rng) => rng.Chance(CrtFreezeChance(blackMarketRep));
|
||||
|
||||
public bool CraSubsidyLow => CraSubsidy <= Tuning.CraSubsidy0 * Tuning.CraSubsidyWarn;
|
||||
|
||||
/// <summary>CRA 的预兆:外生螺旋的新闻已出,或补贴池告急(利率下调)。螺旋开始后不再算预兆。</summary>
|
||||
|
||||
@@ -32,6 +32,36 @@ namespace Decentralized.Domain
|
||||
/// <summary>买入均价(信用点);没有买入记录(例如全是挖出来的)返回 null。</summary>
|
||||
public double? AvgBuy(string asset) => BuyQty.TryGetValue(asset, out var q) && q > 1e-9 ? BuyCost[asset] / q : (double?)null;
|
||||
|
||||
/// <summary>被发行方冻结的数量(只有可冻结的币:CRT 在镇压期间、CRC),和解冻的日子。冻结的币仍计入余额与估值,但不能花、不能转。</summary>
|
||||
public Dictionary<string, double> Frozen = new Dictionary<string, double>();
|
||||
public Dictionary<string, int> FrozenUntil = new Dictionary<string, int>();
|
||||
|
||||
/// <summary>可动用的余额(扣掉冻结部分)。</summary>
|
||||
public double Avail(string asset) => Math.Max(0, Get(asset) - (Frozen.TryGetValue(asset, out var f) ? f : 0));
|
||||
|
||||
/// <summary>冻结该币当前余额的 share 比例,直到 untilDay(含)。已冻结的不重复冻。返回冻结的数量。</summary>
|
||||
public double Freeze(string asset, double share, int untilDay)
|
||||
{
|
||||
double amount = Avail(asset) * Math.Max(0, Math.Min(1, share));
|
||||
if (amount <= 1e-9) return 0;
|
||||
Frozen[asset] = (Frozen.TryGetValue(asset, out var f) ? f : 0) + amount;
|
||||
FrozenUntil[asset] = Math.Max(untilDay, FrozenUntil.TryGetValue(asset, out var u) ? u : 0);
|
||||
return amount;
|
||||
}
|
||||
|
||||
/// <summary>解冻到期的币,返回 (币种, 数量) 列表。</summary>
|
||||
public List<KeyValuePair<string, double>> Thaw(int day)
|
||||
{
|
||||
var list = new List<KeyValuePair<string, double>>();
|
||||
foreach (var a in new List<string>(FrozenUntil.Keys))
|
||||
if (day >= FrozenUntil[a])
|
||||
{
|
||||
list.Add(new KeyValuePair<string, double>(a, Frozen.TryGetValue(a, out var f) ? f : 0));
|
||||
Frozen.Remove(a); FrozenUntil.Remove(a);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public double Get(string asset) => Balances.TryGetValue(asset, out var v) ? v : 0;
|
||||
|
||||
public void Add(string asset, double amount)
|
||||
|
||||
Reference in new issue
Block a user