Stage 6.1: CRA staking pool, SPARK balance token with mint/burn

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ZHU MINCHAOandClaude Sonnet 5.5 committed 2026-11-04 00:06:16 +08:00
1 parent 58dd93eca6
commit 98e80412e6
12 files changed
+371 -9

No files matched your search

+37 -1
View File
@@ -15,6 +15,8 @@ namespace Decentralized.Domain
public double CraSubsidy = Tuning.CraSubsidy0;
public int CraWarnDay = -1, CraSpiralDay = -1;
public double RevPower = 50;
/// <summary>平衡代币 SPARK 的价格(信用点);SparkPre 是螺旋开始前一刻的价格,螺旋三天按它的倍数走。</summary>
public double Spark = Tuning.SparkStart, SparkPre = -1;
public List<double> RevHistory = new List<double>();
public double Price(string asset)
@@ -24,6 +26,7 @@ namespace Decentralized.Domain
case Assets.CRC: return Crc;
case Assets.CRT: return Crt;
case Assets.CRA: return Cra;
case Assets.SPARK: return Spark;
default: return 1;
}
}
@@ -42,6 +45,8 @@ namespace Decentralized.Domain
Crt = rng.Range(Tuning.CrtDepegMin, Tuning.CrtDepegMax);
CrtDepegEnd = day + rng.Range(Tuning.CrtDepegDaysMin, Tuning.CrtDepegDaysMax);
}
if (ev == MarketEvent.RevRaidUpper) Spark *= Tuning.SparkRaidShock;
if (ev == MarketEvent.LowerUnrest) Spark *= Tuning.SparkUnrestShock;
return 1;
}
@@ -52,6 +57,26 @@ namespace Decentralized.Domain
/// <summary>镇压开始时是否冻结玩家的 CRT:按黑市声望,声望越低越容易被黑市"出卖"。</summary>
public static bool CrtFrozenByCrackdown(double blackMarketRep, Rng rng) => rng.Chance(CrtFreezeChance(blackMarketRep));
/// <summary>铸造:用 CRA 按当前价换 SPARK,收手续费。余额不足返回 -1。</summary>
public double Mint(Wallet w, double cra)
{
if (cra <= 0 || Spark <= 0 || w.Avail(Assets.CRA) + 1e-9 < cra) return -1;
double got = cra * Cra / Spark * (1 - Tuning.SparkFee);
w.Add(Assets.CRA, -cra); w.Add(Assets.SPARK, got);
w.RecordBuy(Assets.SPARK, got, cra * Cra);
return got;
}
/// <summary>销毁:用 SPARK 按当前价换 CRA,收手续费。余额不足返回 -1。</summary>
public double Burn(Wallet w, double spark)
{
if (spark <= 0 || Cra <= 0 || w.Avail(Assets.SPARK) + 1e-9 < spark) return -1;
double got = spark * Spark / Cra * (1 - Tuning.SparkFee);
w.Add(Assets.SPARK, -spark); w.Add(Assets.CRA, got);
w.RecordBuy(Assets.CRA, got, spark * Spark);
return got;
}
public bool CraSubsidyLow => CraSubsidy <= Tuning.CraSubsidy0 * Tuning.CraSubsidyWarn;
/// <summary>CRA 的预兆:外生螺旋的新闻已出,或补贴池告急(利率下调)。螺旋开始后不再算预兆。</summary>
@@ -95,7 +120,18 @@ namespace Decentralized.Domain
}
}
if (CraSpiralDay > 0 && day >= CraSpiralDay)
Cra = Tuning.CraSpiralPath[Math.Min(day - CraSpiralDay, Tuning.CraSpiralPath.Length - 1)];
{
int k = Math.Min(day - CraSpiralDay, Tuning.CraSpiralPath.Length - 1);
Cra = Tuning.CraSpiralPath[k];
if (SparkPre < 0) SparkPre = Spark;
Spark = SparkPre * Tuning.SparkSpiralPath[Math.Min(day - CraSpiralDay, Tuning.SparkSpiralPath.Length - 1)];
}
else
{
Spark *= Math.Exp(rng.Gauss() * Tuning.SparkVol);
Spark += (Tuning.SparkStart - Spark) * Tuning.SparkRevert;
Spark = Math.Max(Tuning.SparkStart * Tuning.SparkMinMult, Math.Min(Tuning.SparkStart * Tuning.SparkMaxMult, Spark));
}
return crcFactor;
}
}