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:
1 parent
58dd93eca6
commit
98e80412e6
12 files changed
+371
-9
No files matched your search
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user