using System; namespace Decentralized.Domain { /// 一次出金到银行的结果。 public sealed class CashoutResult { public double Requested; public double Received; public double Tax; } /// /// 合规交易所 Poinbase:只收干净的币(钱包往充值地址最多转“价值 − 污点”,见 ),账户没有污点。 /// 出金到银行把 CRC 兑回信用点,扣手续费,只对超出成本的部分计税,不做审查。 /// public sealed class Exchange { /// Poinbase 上架的币:只有这些能充值、能在现货交易。黑市的 CRT、革命军的 CRA 合规交易所不收。 public static readonly string[] Listed = { Assets.PSC, Assets.CRC, Assets.SPARK }; /// 存档迁移(数据版本 5):旧存档里 Poinbase 账户和永续仓位带的污点额(信用点),清零后返回总数,由调用方挪到 1 号钱包一起摊。 public static double TakeLegacyTaint(Wallet account, System.Collections.Generic.IEnumerable positions) { double t = account.LegacyTaint; account.LegacyTaint = 0; foreach (var p in positions) { t += p.LegacyTaint; p.LegacyTaint = 0; } return t; } /// /// 从账户里取出 amount 个 CRC 兑成信用点(按 CRC 当前价格,平时为 1;脱锚期间按市价),扣手续费。成本按取出部分的价值比例带走, /// 只对超出成本的部分计税。 /// public CashoutResult Cashout(Wallet account, double amount, Func price) { amount = Math.Min(amount, account.Get(Assets.CRC)); var r = new CashoutResult { Requested = amount }; if (amount <= 0) return r; double total = account.Value(price); double value = amount * price(Assets.CRC); double share = total > 0 ? Math.Min(1, value / total) : 0; double basis = account.Basis * share; account.Add(Assets.CRC, -amount); account.Basis -= basis; double got = value * (1 - Tuning.ExchangeFee); r.Tax = Math.Max(0, got - basis) * Tuning.TaxRate; r.Received = got; return r; } } }