Multiple hardware wallets: per-wallet devices, wallets page, Poinbase custodial account, PLEDGER item with supply-chain poisoning

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ZHU MINCHAOandClaude Opus 5.5 committed 2026-11-03 22:58:24 +08:00
1 parent add61a6b5e
commit 783f73989d
19 files changed
+557 -199

No files matched your search

+8 -3
View File
@@ -44,6 +44,8 @@ namespace Decentralized.Domain
public int Price;
public string Asset;
public double Qty;
/// <summary>付款的钱包地址:退款回这里。</summary>
public string Wallet;
/// <summary>付款时留在卖家那边的污点与成本:退款时一并还回,免得"付脏币再退款"洗钱。</summary>
public double Taint, Basis;
public int PlacedDay, DueDay;
@@ -232,7 +234,7 @@ namespace Decentralized.Domain
var o = new BmOrder
{
Id = NextOrderId++, Item = l.Item, Seller = seller.Name, SellerScam = seller.Scam, Mode = mode, Count = count, Model = l.Model, FakeOf = l.FakeOf, Health = l.Health, Price = credits, Asset = asset, Qty = qty,
Taint = taint, Basis = basis, PlacedDay = day, DueDay = day + seller.Days,
Taint = taint, Basis = basis, PlacedDay = day, DueDay = day + seller.Days, Wallet = w.Address,
};
l.Qty -= count;
if (l.Qty <= 0) Catalog.Remove(l);
@@ -248,7 +250,10 @@ namespace Decentralized.Domain
}
/// <summary>每晚推进订单:平台跑路、到期的订单(卖家跑路、被截获、死投被挖走)、转入可取状态。镇压期间到期顺延一天。</summary>
public List<BmEvent> Night(int day, bool crackdown, Wallet w, Rng rng, int secRep = 0, Func<string, double> price = null)
public List<BmEvent> Night(int day, bool crackdown, Wallet w, Rng rng, int secRep = 0, Func<string, double> price = null) => Night(day, crackdown, _ => w, rng, secRep, price);
/// <summary>每晚(多钱包):退款回付款的钱包,出售回款进上架时付费的钱包。</summary>
public List<BmEvent> Night(int day, bool crackdown, Func<string, Wallet> w, Rng rng, int secRep = 0, Func<string, double> price = null)
{
var ev = new List<BmEvent>();
if (!Honeypot(day) && rng.Chance(HoneypotChance(secRep))) { HoneypotUntil = day + Tuning.BmHoneypotDays; HoneypotStart = day; if (!Forum.Contains("easy")) Forum.Add("easy"); }
@@ -275,7 +280,7 @@ namespace Decentralized.Domain
if (crackdown) { o.DueDay = day + 1; continue; }
if (o.SellerScam)
{
if (o.Mode == PayMode.Escrow) { Refund(w, o); o.State = OrderState.Refunded; o.Why = "scam"; DropTraps(o); ev.Add(new BmEvent { Kind = "scam_refund", Order = o, Amount = o.Price }); }
if (o.Mode == PayMode.Escrow) { Refund(w(o.Wallet), o); o.State = OrderState.Refunded; o.Why = "scam"; DropTraps(o); ev.Add(new BmEvent { Kind = "scam_refund", Order = o, Amount = o.Price }); }
else { o.State = OrderState.Lost; o.Why = "scam"; DropTraps(o); ev.Add(new BmEvent { Kind = "scam_loss", Order = o, Amount = o.Price }); }
continue;
}
+5 -2
View File
@@ -17,6 +17,8 @@ namespace Decentralized.Domain
/// <summary>参考价:改价时按它重算标价。</summary>
public long Ref;
public int ListPrice;
/// <summary>上架时付费的钱包地址:回款进这里。</summary>
public string Wallet;
public int ListedDay, PayDay;
public SaleState State = SaleState.Listed;
/// <summary>成交后扣掉抽成的货款(信用点)与其中带的污点。</summary>
@@ -73,7 +75,7 @@ namespace Decentralized.Domain
double share = total > 0 ? Math.Min(1, ListFee(listPrice) / total) : 0;
w.Taint -= w.Taint * share; w.Basis -= w.Basis * share;
w.Add(feeAsset, -qty);
var s = new BmSale { Item = item, Model = model, FakeOf = fakeOf, Health = health, Ref = refValue, Mult = m, ListPrice = listPrice, ListedDay = day };
var s = new BmSale { Item = item, Model = model, FakeOf = fakeOf, Health = health, Ref = refValue, Mult = m, ListPrice = listPrice, ListedDay = day, Wallet = w.Address };
Sales.Add(s);
return s;
}
@@ -104,7 +106,7 @@ namespace Decentralized.Domain
public double HeldSales => Sales.Where(x => x.State == SaleState.Sold).Sum(x => (double)x.Proceeds);
/// <summary>每晚推进出售:上架的货按概率成交(假卡可能被看穿退货),成交的货款托管到期后进钱包。镇压期间平台下线,不推进。</summary>
private void SalesNight(int day, bool crackdown, Wallet w, Func<string, double> price, Rng rng, List<BmEvent> ev)
private void SalesNight(int day, bool crackdown, Func<string, Wallet> wallet, Func<string, double> price, Rng rng, List<BmEvent> ev)
{
if (crackdown) return;
foreach (var s in Sales.Where(x => x.State == SaleState.Listed && x.ListedDay < day).ToList())
@@ -130,6 +132,7 @@ namespace Decentralized.Domain
{
double p = price(Assets.CRT);
if (p <= 0) continue;
var w = wallet(s.Wallet);
w.Add(Assets.CRT, s.Proceeds / p);
w.Taint += s.Taint;
w.Basis += s.Proceeds;
+8 -2
View File
@@ -13,6 +13,8 @@ namespace Decentralized.Domain
public double Taint, Basis;
public int Rounds;
public int ReadyDay;
/// <summary>存入的钱包地址:到期提回这里。</summary>
public string Wallet;
}
/// <summary>一笔混币结束时的结果,供夜间日志使用。</summary>
@@ -56,7 +58,7 @@ namespace Decentralized.Domain
w.Add(asset, -amount);
w.Taint -= taint;
w.Basis -= basis;
var d = new MixDeposit { Asset = asset, Amount = amount, Taint = taint, Basis = basis, Rounds = rounds, ReadyDay = day + rounds };
var d = new MixDeposit { Asset = asset, Amount = amount, Taint = taint, Basis = basis, Rounds = rounds, ReadyDay = day + rounds, Wallet = w.Address };
Pending.Add(d);
return d;
}
@@ -68,7 +70,10 @@ namespace Decentralized.Domain
}
/// <summary>每晚:到期的存入提回钱包(污点按轮数降低),在途的各有小概率跑路。</summary>
public List<MixResult> Night(Wallet w, int day, Func<string, double> price, Rng rng)
public List<MixResult> Night(Wallet w, int day, Func<string, double> price, Rng rng) => Night(_ => w, day, price, rng);
/// <summary>每晚(多钱包):到期的存入按存入时的地址提回原钱包。</summary>
public List<MixResult> Night(Func<string, Wallet> wallet, int day, Func<string, double> price, Rng rng)
{
var results = new List<MixResult>();
foreach (var d in Pending.ToList())
@@ -85,6 +90,7 @@ namespace Decentralized.Domain
double taint = d.Taint * Math.Pow(1 - rate, d.Rounds);
double amount = d.Amount * Math.Pow(1 - Tuning.MixerFee, d.Rounds);
bool flagged = Sanctioned(day);
var w = wallet(d.Wallet);
w.Add(d.Asset, amount);
w.Taint += taint;
w.Basis += d.Basis;
+6
View File
@@ -136,6 +136,12 @@ namespace Decentralized.Domain
/// <summary>单个金融违规事件记入的罪证上限。</summary>
public const double CrimeEventCap = 400;
/// <summary>硬件钱包:最多几个(含主钱包);杰克逊博士的售价与每次进货上架的概率;Web3 商城的价格范围、每周平台现货上架的概率与件数上限;商城货里被投毒的比例。</summary>
public const int WalletMax = 5, WalletJacksonPrice = 240, WalletMallMin = 150, WalletMallMax = 180, WalletMallQtyMax = 2;
public const double WalletJacksonChance = 0.5, WalletMallChance = 0.5, WalletPoisonShare = 0.2;
/// <summary>被投毒的钱包:币的总价值达到 DrainMin 起,每晚有概率被转空;价值越高越快:每晚概率从门槛处的 1 / SlowDays(平均 7 天)按价值线性升到 DrainFull 处的 1(当晚就转走)。</summary>
public const double WalletDrainMin = 3000, WalletDrainFull = 20000, WalletDrainSlowDays = 7;
/// <summary>主交易对(信用点一侧)的深度随天数增长。</summary>
public static double PoolDepth(int day) => PoolDepth0 * (1 + day / 60.0);
}
+21
View File
@@ -18,6 +18,27 @@ namespace Decentralized.Domain
public double Basis;
/// <summary>被执法标记。</summary>
public bool Flagged;
/// <summary>显示名(终端钱包页、硬件钱包标题)。</summary>
public string Name;
/// <summary>硬件钱包被动过手脚(供应链投毒):别人手里有助记词。玩家看不到。</summary>
public bool Poisoned;
/// <summary>被投毒的钱包今晚被转空的概率:总价值不到门槛时为 0,越多越高(1–7 天)。</summary>
public static double DrainChance(double value)
{
if (value < Tuning.WalletDrainMin) return 0;
double slow = 1 / Tuning.WalletDrainSlowDays, t = Math.Min(1, (value - Tuning.WalletDrainMin) / (Tuning.WalletDrainFull - Tuning.WalletDrainMin));
return slow + (1 - slow) * t;
}
/// <summary>转空:全部余额(含冻结的)连同污点、成本一起转走,返回转走的价值(信用点)。</summary>
public double Drain(Func<string, double> price)
{
double v = Value(price);
Balances.Clear(); Frozen.Clear(); FrozenUntil.Clear(); BuyQty.Clear(); BuyCost.Clear();
Taint = 0; Basis = 0;
return v;
}
/// <summary>买入记录:每种币买入的数量与花费(信用点等值),用来显示买入均价。卖出或转出时按比例减少。</summary>
public Dictionary<string, double> BuyQty = new Dictionary<string, double>(), BuyCost = new Dictionary<string, double>();