版本 1.0.0-rc8:卖货橱窗重构、收款币种、Gas 档位速度、区块自然增长、钱包持仓
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
018ee7d0d2
commit
93e26fc4f5
20 files changed
+582
-498
No files matched your search
@@ -1,5 +1,15 @@
|
||||
# Changelog
|
||||
|
||||
## 1.0.0-rc8
|
||||
|
||||
- 灰网商店卖货重构:卖货默认是已上架的橱窗(同一商品聚合成一张卡,同一商品倍率相同);“上架更多”进备货页,左边选标价倍率,货架卡片显示聚合库存,用 − / + 调整本次要上架的数量;右下角“货架 N”进付费页,在清单里核对、选币付上架费后才上架。橱窗里每点一次“下架”预备 +1,右下角“确定下架 N”确认,货回储藏区,上架费不退。上架上限改为同时最多 6 种、每种最多 5 件(原来总共 10 件);倍率表不再显示成交天数。
|
||||
- 购物车按钮只在买货页;订单页只显示在途订单(买入未取、卖出待托管放款);取消改价。
|
||||
- 收款币种:橱窗页的“收款币种”选愿意接受的币(PSC、CRT、CRA、Ponero,默认只有 CRT)。每接受一种币,每件在架货每晚多一轮成交判定(轮次概率 = 成交概率 × 该币买家权重,顺序随机),货款以命中那一轮的币到账。
|
||||
- Gas 档位越高,确认越快、进度条走得越快(快档约普通档的一半时间,慢档约一倍半)。
|
||||
- PLEDGER 区块高度每晚随机自然增长 120–170。
|
||||
- 钱包页:选中(连接)的钱包下方列出它持有的币和数量。
|
||||
- 手册出售一节按新流程改写(8 种语言)。
|
||||
|
||||
## 1.0.0-rc7
|
||||
|
||||
- 终端页签重新分组:一级页签为首页、银行、Poinbase、Web3、挖矿、灰网、钱包。挖矿(原 Web3 的挖矿页)提到一级;混币器和商店合成“灰网”(解锁了任一项才出现,两项都解锁时里面再分两页);浏览器挪进钱包页,和钱包列表并成两个子页;Web3 页剩交易、质押、空投、预测、理财。
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Probably Decentralized
|
||||
|
||||
A mod for *Probably Stolen*: crypto mining, a fictional coin market, stablecoins, laundering and its risks, a Web3 black market, built on the game's own power, events and law systems. Current version: 1.0.0-rc7 (release candidate).
|
||||
A mod for *Probably Stolen*: crypto mining, a fictional coin market, stablecoins, laundering and its risks, a Web3 black market, built on the game's own power, events and law systems. Current version: 1.0.0-rc8 (release candidate).
|
||||
|
||||
All coins, exchanges and events are fictional and have no real-world value.
|
||||
|
||||
|
||||
@@ -24,8 +24,14 @@ namespace Decentralized.Domain
|
||||
/// <summary>成交后扣掉抽成的货款(信用点)与其中带的污点。</summary>
|
||||
public int Proceeds;
|
||||
public double Taint;
|
||||
/// <summary>成交那一轮的收款币(空 = CRT,旧存档):货款到期后以这个币付给钱包。</summary>
|
||||
public string PayAsset;
|
||||
/// <summary>终态原因:fake(买家看穿假卡退货)/ rug / delist。</summary>
|
||||
public string Why;
|
||||
|
||||
/// <summary>聚合键:同一种商品(标识、型号、真伪、成色取整)算一组,同组倍率相同。</summary>
|
||||
public static string KeyOf(string item, string model, string fakeOf, double health) => item + "|" + model + "|" + fakeOf + "|" + Math.Round(health);
|
||||
public string Key => KeyOf(Item, Model, FakeOf, Health);
|
||||
}
|
||||
|
||||
public sealed partial class BlackMarket
|
||||
@@ -57,7 +63,41 @@ namespace Decentralized.Domain
|
||||
return Math.Min(Tuning.BmVolumeTaintMax, v / Tuning.BmVolumeRef * Tuning.BmVolumeTaintMax);
|
||||
}
|
||||
|
||||
/// <summary>收款币:愿意接受的币(存档),至少一种;默认只有 CRT。</summary>
|
||||
public List<string> SellAccepts = new List<string> { Assets.CRT };
|
||||
public static readonly string[] SellCoins = { Assets.PSC, Assets.CRT, Assets.CRA, Assets.Ponero };
|
||||
|
||||
public static double CoinWeight(string asset) =>
|
||||
asset == Assets.PSC ? Tuning.BmWeightPsc : asset == Assets.CRT ? Tuning.BmWeightCrt : asset == Assets.CRA ? Tuning.BmWeightCra : asset == Assets.Ponero ? Tuning.BmWeightPonero : 0;
|
||||
|
||||
public IEnumerable<string> AcceptedCoins => SellAccepts.Count == 0 ? new[] { Assets.CRT } : SellAccepts.Where(a => CoinWeight(a) > 0).Distinct().ToArray();
|
||||
|
||||
/// <summary>开关一种收款币;最后一种不能关掉。</summary>
|
||||
public bool ToggleCoin(string asset)
|
||||
{
|
||||
if (SellAccepts.Count == 0) SellAccepts.Add(Assets.CRT);
|
||||
if (SellAccepts.Contains(asset)) { if (SellAccepts.Count <= 1) return false; SellAccepts.Remove(asset); return true; }
|
||||
if (CoinWeight(asset) <= 0) return false;
|
||||
SellAccepts.Add(asset);
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>在架的件数(全部)、种数、某一组的件数与倍率(没有在架返回 null)。</summary>
|
||||
public int ActiveListings => Sales.Count(x => x.State == SaleState.Listed);
|
||||
public int ActiveKinds => Sales.Where(x => x.State == SaleState.Listed).Select(x => x.Key).Distinct().Count();
|
||||
public int ActiveOf(string key) => Sales.Count(x => x.State == SaleState.Listed && x.Key == key);
|
||||
public double? MultOf(string key) { var s = Sales.FirstOrDefault(x => x.State == SaleState.Listed && x.Key == key); return s == null ? (double?)null : s.Mult; }
|
||||
|
||||
/// <summary>某一组再上架 add 件、倍率 m 时的限制:null = 可以;stack = 超过每种上限;kinds = 超过种数上限;mult = 与已在架的同种货倍率不同。</summary>
|
||||
public string ListBlock(string key, double m, int add = 1)
|
||||
{
|
||||
int have = ActiveOf(key);
|
||||
if (have + add > Tuning.BmMaxStack) return "stack";
|
||||
if (have == 0 && ActiveKinds >= Tuning.BmMaxKinds) return "kinds";
|
||||
var cur = MultOf(key);
|
||||
if (cur != null && Math.Abs(cur.Value - m) > 1e-9) return "mult";
|
||||
return null;
|
||||
}
|
||||
|
||||
public static int ListPriceOf(long refValue, double m) => (int)Math.Max(1, Math.Round(refValue * m));
|
||||
public static int ListFee(int listPrice) => (int)Math.Ceiling(listPrice * Tuning.BmListFee);
|
||||
@@ -65,7 +105,7 @@ namespace Decentralized.Domain
|
||||
/// <summary>上架:交付一件货,收上架费(付给 feeAsset 币,污点与成本按比例带走)。倍率超出范围、平台关闭或余额不足返回 null。</summary>
|
||||
public BmSale List(string item, string model, string fakeOf, double health, long refValue, double m, Wallet w, string feeAsset, int day, Func<string, double> price)
|
||||
{
|
||||
if (m < Tuning.BmSellMin - 1e-9 || m > Tuning.BmSellMax + 1e-9 || refValue <= 0 || Closed(day) || feeAsset == Assets.CRC || ActiveListings >= Tuning.BmMaxListings) return null;
|
||||
if (m < Tuning.BmSellMin - 1e-9 || m > Tuning.BmSellMax + 1e-9 || refValue <= 0 || Closed(day) || feeAsset == Assets.CRC || ListBlock(BmSale.KeyOf(item, model, fakeOf, health), m) != null) return null;
|
||||
int listPrice = ListPriceOf(refValue, m);
|
||||
double p = price(feeAsset);
|
||||
if (p <= 0) return null;
|
||||
@@ -80,26 +120,6 @@ namespace Decentralized.Domain
|
||||
return s;
|
||||
}
|
||||
|
||||
public static int RepriceFee(int newPrice) => (int)Math.Ceiling(newPrice * Tuning.BmRepriceFee);
|
||||
|
||||
/// <summary>改价:上架中的货换一个倍率,按参考价重算标价,收改价费;不改变上架日。</summary>
|
||||
public bool Reprice(BmSale s, double m, Wallet w, string feeAsset, int day, Func<string, double> price)
|
||||
{
|
||||
if (s == null || s.State != SaleState.Listed || s.Ref <= 0 || Math.Abs(m - s.Mult) < 1e-9 || m < Tuning.BmSellMin - 1e-9 || m > Tuning.BmSellMax + 1e-9 || Closed(day) || feeAsset == Assets.CRC) return false;
|
||||
int listPrice = ListPriceOf(s.Ref, m);
|
||||
double p = price(feeAsset);
|
||||
if (p <= 0) return false;
|
||||
int fee = RepriceFee(listPrice);
|
||||
double qty = fee / p;
|
||||
if (w.Avail(feeAsset) + 1e-9 < qty) return false;
|
||||
double total = w.Value(price);
|
||||
double share = total > 0 ? Math.Min(1, fee / total) : 0;
|
||||
w.Taint -= w.Taint * share; w.Basis -= w.Basis * share;
|
||||
w.Add(feeAsset, -qty);
|
||||
s.Mult = m; s.ListPrice = listPrice;
|
||||
return true;
|
||||
}
|
||||
|
||||
public void Delist(BmSale s) { s.State = SaleState.Delisted; s.Why = "delist"; }
|
||||
|
||||
/// <summary>未到账的货款(信用点):跑路时一并归零,也推高跑路概率。</summary>
|
||||
@@ -111,7 +131,13 @@ namespace Decentralized.Domain
|
||||
if (crackdown) return;
|
||||
foreach (var s in Sales.Where(x => x.State == SaleState.Listed && x.ListedDay < day).ToList())
|
||||
{
|
||||
if (!rng.Chance(SaleChance(s.Mult))) continue;
|
||||
// 每接受一种币算一轮成交:轮次顺序随机,任一轮命中即成交,货款用命中的币付
|
||||
string hit = null;
|
||||
double chance = SaleChance(s.Mult);
|
||||
foreach (var c in AcceptedCoins.OrderBy(_ => rng.NextDouble()).ToList())
|
||||
if (rng.Chance(Math.Min(1, chance * CoinWeight(c)))) { hit = c; break; }
|
||||
if (hit == null) continue;
|
||||
s.PayAsset = hit;
|
||||
if (s.FakeOf != null && rng.Chance(Tuning.BmFakeDetect))
|
||||
{
|
||||
s.State = SaleState.Delisted; s.Why = "fake";
|
||||
@@ -130,10 +156,11 @@ namespace Decentralized.Domain
|
||||
}
|
||||
foreach (var s in Sales.Where(x => x.State == SaleState.Sold && day >= x.PayDay).ToList())
|
||||
{
|
||||
double p = price(Assets.CRT);
|
||||
string pa = s.PayAsset ?? Assets.CRT;
|
||||
double p = price(pa);
|
||||
if (p <= 0) continue;
|
||||
var w = wallet(s.Wallet);
|
||||
w.Add(Assets.CRT, s.Proceeds / p);
|
||||
w.Add(pa, s.Proceeds / p);
|
||||
w.Taint += s.Taint;
|
||||
w.Basis += s.Proceeds;
|
||||
s.State = SaleState.Paid;
|
||||
|
||||
@@ -134,16 +134,22 @@ namespace Decentralized.Domain
|
||||
public const double BmTrapShare = 0.4, BmTrapWindowCap = 400;
|
||||
/// <summary>货架上除违禁品外的两类货:高科技物品(需中档声望)和显卡的出现概率、加价(在现货溢价 / 订单价之外再加),显卡里夹假卡的比例、是全新卡(成色 100、封条完好、不会是假卡)的概率。</summary>
|
||||
public const double BmTechChance = 0.30, BmGpuChance = 0.30, BmTechMarkup = 0.5, BmGpuMarkup = 0.2, BmGpuFake = 0.20, BmGpuNew = 0.15;
|
||||
/// <summary>玩家上架出售:标价倍率范围(相对参考价)、上架费、改价费、成交抽成、成交后货款托管天数、假卡被买家看穿的概率;
|
||||
/// <summary>玩家上架出售:标价倍率范围(相对参考价)、上架费、成交抽成、成交后货款托管天数、假卡被买家看穿的概率;
|
||||
/// 倍率 ≤0.9 / 1.0 / 1.8 时的期望成交天数(之间插值);货款带污点的概率与比例随倍率从下限涨到上限;卖家好评的初始值、看穿一次扣的点数、同时上架的件数上限。</summary>
|
||||
public const double BmListFee = 0.05, BmRepriceFee = 0.02, BmCommission = 0.08, BmSellMin = 0.6, BmSellMax = 1.8, BmFakeDetect = 0.5;
|
||||
public const double BmListFee = 0.05, BmCommission = 0.08, BmSellMin = 0.6, BmSellMax = 1.8, BmFakeDetect = 0.5;
|
||||
/// <summary>出售成交天数的倍率界线:不高于 BmSellFastMult 倍用 BmSellDaysFast 天,BmSellDay1Mult 倍用 BmSellDays1 天,之间线性,再往上指数到 BmSellMax。</summary>
|
||||
public const double BmSellFastMult = 0.9, BmSellDay1Mult = 1.0;
|
||||
/// <summary>出售页可选的标价倍率档位。</summary>
|
||||
public static readonly double[] BmSellMults = { 0.6, 0.8, 0.9, 1.0, 1.2, 1.5, 1.8 };
|
||||
public const double BmSellDaysFast = 1, BmSellDays1 = 2, BmSellDaysMax = 14;
|
||||
public const double BmSaleTaintChanceMin = 0.2, BmSaleTaintChanceMax = 0.9, BmSaleTaintRatioMin = 0.2, BmSaleTaintRatioMax = 0.8;
|
||||
public const int BmSaleHold = 3, BmRatingStart = 90, BmRatingFakeLoss = 10, BmMaxListings = 10;
|
||||
public const int BmSaleHold = 3, BmRatingStart = 90, BmRatingFakeLoss = 10;
|
||||
/// <summary>同时上架的货:最多几种(按商品标识),每种最多几件。</summary>
|
||||
public const int BmMaxKinds = 6, BmMaxStack = 5;
|
||||
/// <summary>收款币的买家权重:每接受一种币,夜间多一轮成交判定,轮次概率 = 成交概率 × 权重(CRT 为 1 即原有节奏)。</summary>
|
||||
public const double BmWeightPsc = 0.8, BmWeightCrt = 1, BmWeightCra = 0.6, BmWeightPonero = 0.4;
|
||||
/// <summary>PLEDGER 区块高度每晚自然增长的范围(区块数,含两端)。</summary>
|
||||
public const int BlocksPerDayMin = 120, BlocksPerDayMax = 170;
|
||||
/// <summary>商家货架:每周的商家数(其中 2 家从矿卡 / 矿架 / 模组 4 类里抽,其余从其他类型里抽)、每家的货种数、每种货的库存范围;大宗商家出现概率、库存范围、送货天数;
|
||||
/// 各类商家的价格系数范围(订单价 = 基础价 × 系数);批量折扣档(件数、折扣)。</summary>
|
||||
public const int BmMerchantCount = 7, BmCoreMerchants = 2, BmMerchantListings = 3, BmQtyMin = 2, BmQtyMax = 6, BmBulkQtyMin = 10, BmBulkQtyMax = 25, BmBulkDays = 6;
|
||||
@@ -174,6 +180,8 @@ namespace Decentralized.Domain
|
||||
|
||||
/// <summary>转账手续费(信用点等值,按转出的币扣):慢 / 普通 / 快;拥堵时乘以倍数。</summary>
|
||||
public const double TxFeeSlow = 0.5, TxFeeNormal = 1.5, TxFeeFast = 4, TxCongestedFeeMult = 4;
|
||||
/// <summary>Gas 档位的确认速度倍数(时间乘它):Gas 越高确认越快、进度条走得越快;Poinbase 出金固定普通档。</summary>
|
||||
public const double TxSpeedSlow = 1.5, TxSpeedNormal = 1, TxSpeedFast = 0.5;
|
||||
/// <summary>Gas 价格指数:以 GasPeriod 天为周期正弦涨跌,振幅 GasAmp(0.5×–1.5×),每天再乘 1 ± GasNoise 的随机波动。</summary>
|
||||
public const int TxGasPeriod = 7;
|
||||
public const double TxGasAmp = 0.5, TxGasNoise = 0.15;
|
||||
|
||||
@@ -38,6 +38,8 @@ namespace Decentralized.Domain
|
||||
["AsicWeightM2"] = Tuning.AsicWeightM2,
|
||||
["AsicWeightM3"] = Tuning.AsicWeightM3,
|
||||
["BlockReward"] = Tuning.BlockReward,
|
||||
["BlocksPerDayMax"] = Tuning.BlocksPerDayMax,
|
||||
["BlocksPerDayMin"] = Tuning.BlocksPerDayMin,
|
||||
["BmAdvanceDiscount"] = Tuning.BmAdvanceDiscount,
|
||||
["BmAdvanceMinTrades"] = Tuning.BmAdvanceMinTrades,
|
||||
["BmAutoSwapSlip"] = Tuning.BmAutoSwapSlip,
|
||||
@@ -90,7 +92,8 @@ namespace Decentralized.Domain
|
||||
["BmInterceptCrackdown"] = Tuning.BmInterceptCrackdown,
|
||||
["BmInterceptDoor"] = Tuning.BmInterceptDoor,
|
||||
["BmListFee"] = Tuning.BmListFee,
|
||||
["BmMaxListings"] = Tuning.BmMaxListings,
|
||||
["BmMaxKinds"] = Tuning.BmMaxKinds,
|
||||
["BmMaxStack"] = Tuning.BmMaxStack,
|
||||
["BmMaxUnitValue"] = Tuning.BmMaxUnitValue,
|
||||
["BmMerchantCount"] = Tuning.BmMerchantCount,
|
||||
["BmMerchantListings"] = Tuning.BmMerchantListings,
|
||||
@@ -118,7 +121,6 @@ namespace Decentralized.Domain
|
||||
["BmRatingFakeLoss"] = Tuning.BmRatingFakeLoss,
|
||||
["BmRatingStart"] = Tuning.BmRatingStart,
|
||||
["BmRefreshDays"] = Tuning.BmRefreshDays,
|
||||
["BmRepriceFee"] = Tuning.BmRepriceFee,
|
||||
["BmRugBase"] = Tuning.BmRugBase,
|
||||
["BmRugClosedDays"] = Tuning.BmRugClosedDays,
|
||||
["BmRugMax"] = Tuning.BmRugMax,
|
||||
@@ -151,6 +153,10 @@ namespace Decentralized.Domain
|
||||
["BmUnlockPrice"] = Tuning.BmUnlockPrice,
|
||||
["BmVolumeRef"] = Tuning.BmVolumeRef,
|
||||
["BmVolumeTaintMax"] = Tuning.BmVolumeTaintMax,
|
||||
["BmWeightCra"] = Tuning.BmWeightCra,
|
||||
["BmWeightCrt"] = Tuning.BmWeightCrt,
|
||||
["BmWeightPonero"] = Tuning.BmWeightPonero,
|
||||
["BmWeightPsc"] = Tuning.BmWeightPsc,
|
||||
["CardBracketScratch"] = Tuning.CardBracketScratch,
|
||||
["CardFanChipped"] = Tuning.CardFanChipped,
|
||||
["CardFanDust"] = Tuning.CardFanDust,
|
||||
@@ -397,6 +403,9 @@ namespace Decentralized.Domain
|
||||
["TxPoisonChance"] = Tuning.TxPoisonChance,
|
||||
["TxPoisonDelayMax"] = Tuning.TxPoisonDelayMax,
|
||||
["TxSlowDrop"] = Tuning.TxSlowDrop,
|
||||
["TxSpeedFast"] = Tuning.TxSpeedFast,
|
||||
["TxSpeedNormal"] = Tuning.TxSpeedNormal,
|
||||
["TxSpeedSlow"] = Tuning.TxSpeedSlow,
|
||||
["UnlockPrice"] = Tuning.UnlockPrice,
|
||||
["UsedFakeMiddleman"] = Tuning.UsedFakeMiddleman,
|
||||
["UsedFakeScammer"] = Tuning.UsedFakeScammer,
|
||||
|
||||
@@ -31,12 +31,18 @@ namespace Decentralized.Domain
|
||||
public static int Confirmations(double valueCredits) =>
|
||||
valueCredits >= Tuning.TxConfirmBigValue ? Tuning.TxConfirmBig : valueCredits >= Tuning.TxConfirmMidValue ? Tuning.TxConfirmMid : Tuning.TxConfirmBase;
|
||||
|
||||
/// <summary>每次确认的间隔倍数:拥堵时慢档、普通档变慢。</summary>
|
||||
public static double Slowdown(FeeTier t, bool congested) => !congested ? 1 : t == FeeTier.Fast ? 1 : t == FeeTier.Normal ? Tuning.TxCongestedNormalSlow : Tuning.TxCongestedSlowSlow;
|
||||
/// <summary>Gas 档位本身的速度倍数:越高越快。</summary>
|
||||
public static double TierSpeed(FeeTier t) => t == FeeTier.Fast ? Tuning.TxSpeedFast : t == FeeTier.Normal ? Tuning.TxSpeedNormal : Tuning.TxSpeedSlow;
|
||||
|
||||
/// <summary>整条确认时间线的时间倍数:档位速度 × 拥堵时慢档、普通档变慢(快档不受拥堵影响)。</summary>
|
||||
public static double Slowdown(FeeTier t, bool congested) => TierSpeed(t) * (!congested ? 1 : t == FeeTier.Fast ? 1 : t == FeeTier.Normal ? Tuning.TxCongestedNormalSlow : Tuning.TxCongestedSlowSlow);
|
||||
|
||||
/// <summary>拥堵时慢档交易被挤出内存池的概率(交易作废,手续费照扣)。</summary>
|
||||
public static double DropChance(FeeTier t, bool congested) => congested && t == FeeTier.Slow ? Tuning.TxSlowDrop : 0;
|
||||
|
||||
/// <summary>夜间区块高度的自然增长。</summary>
|
||||
public static int BlocksPerDay(Rng rng) => rng.Range(Tuning.BlocksPerDayMin, Tuning.BlocksPerDayMax);
|
||||
|
||||
/// <summary>转账记录最多保留几条。</summary>
|
||||
public const int HistoryMax = 20;
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ namespace Decentralized
|
||||
{
|
||||
public const string Id = "probably_decentralized";
|
||||
public const string Name = "Probably Decentralized";
|
||||
public const string Version = "1.0.0-rc7";
|
||||
public const string Version = "1.0.0-rc8";
|
||||
}
|
||||
|
||||
/// <summary>本地化:游戏的 mod 本地化表(ModFiles/Localization/*.csv),当前语言缺失时回退英文。</summary>
|
||||
|
||||
@@ -247,7 +247,7 @@ black.kind.Contraband.3,Schmuggelware (hoch)
|
||||
black.kind.Tech,Hightech (Aufpreis)
|
||||
nightlog.bm.ready,"Schwarzmarkt: {0} eingetroffen; sobald du öffnest, kommt ein Kurier vorbei."
|
||||
guide.web3.title,Web3-Handbuch
|
||||
guide.web3.text,"Bank und Handel: Die Bankseite ist nur lesbar und zeigt Bargeld, Miete und das CRC auf dem Poinbase-Konto. Die Seite „Guthaben“ von Poinbase regelt Ein- und Auszahlungen; zuerst wird der Coin gewählt: CRC geht über das Bankkonto oder die Wallet, alle anderen Coins nur über die Wallet. Eine Einzahlung von der Bank wandelt Credits in CRC auf deinem Poinbase-Konto um; eine Auszahlung auf die Bank wandelt CRC zurück in Credits um und durchläuft eine Compliance-Prüfung, die die Kontamination des Poinbase-Kontos bewertet. Eine Auszahlung auf eine Wallet braucht die Zieladresse und mehrere Bestätigungen bis zur Gutschrift; die Gasgebühr ist fest auf Normal gesetzt und wird vom abgehenden Coin abgezogen. Ist das Adressformat oder die Prüfziffer falsch, wird abgelehnt; bei einer formal gültigen Adresse, die niemand nutzt, sind die Coins nach der Überweisung weg.¶Handel: PSC steht für Probably Stolen Coin, den durch Grafikkarten und Miner geschürften Coin. Käufe werden im Notierungs-Coin bezahlt, Verkäufe im gehandelten Coin.¶Auf der Web3-Handelsseite lassen sich beliebige zwei Coins tauschen, stets über CRC als Zwischenschritt: Ist CRC eine Seite, läuft der Tausch über einen Pool, sonst über zwei Pools mit zwei Gebühren und sich addierendem Slippage; die Vorschau zeigt Menge, Anzahl der Pools und Verlust.§Hardware-Wallets: On-Chain-Coins liegen auf PLEDGER-Hardware-Wallets, jede mit eigenem Guthaben und eigener Kontamination. Eine Wallet ist ein Gegenstand: Ziehe sie auf das Handelsterminal, um sie zu laden. Öffne sie auf der Wallets-Seite des Terminals; verbinde und trenne sie oben rechts im Terminal. Der Handel der Web3-Seite sowie Shop und Mixer der Graunetz-Seite nutzen die verbundene Wallet; ohne Wallet oder ohne Verbindung sind sie nur lesbar und alle Guthaben zeigen 0. Kunden, die in Coins zahlen, zahlen auf die verbundene Wallet.¶Zahlungen (Shop, Mixer, Ponero-Schalter, Einstellgebühren) beginnen als Rechnung auf dem Handelsterminal; gib die Empfängeradresse auf der Wallet ein und halte zum Signieren ✓ gedrückt. Die letzten beiden Zeichen einer Adresse bilden eine Prüfsumme, sodass ein einzelner Tippfehler meist abgefangen wird; gelegentlich ist die Eingabe dennoch gültig und die Coins gehen an eine ungenutzte Adresse. Auch DEX-Swaps erfordern eine Signatur auf der Wallet.¶Poinbase ist ein Verwahrkonto; Einzahlungen erfolgen von der Wallet an die Einzahlungsadresse von Poinbase (PSC, CRC, CRT, CRA und SPARK werden angenommen), Auszahlungen werden auf der Seite „Guthaben“ von Poinbase gestartet. Der Explorer auf der Wallets-Seite zeigt Überweisungen nach Adresse, ausschließlich tatsächlich erfolgte (deine Wallets, Auszahlungen, Miner-Erträge). Weitere Hardware-Wallets verkauft Dr. Jackson; ziehe eine auf das Handelsterminal, um sie hinzuzufügen, bis zu {WalletMax}. Im Shop gibt es günstigere Exemplare. Eine nicht mehr benötigte Wallet kann auf der Wallets-Seite zerstört werden; ihre Coins sind dauerhaft verloren, ebenso alles, was danach an ihre Adresse gesendet wird.¶Überweisungen kosten Gasgebühren: langsam, normal oder schnell, und die Gas-Preise steigen und fallen im Wochenverlauf; bei Netzwerküberlastung steigen die Gasgebühren und langsame Transaktionen können aus dem Mempool fliegen. Vor dem Senden die vollständige Adresse prüfen.§Staking: Im Revolution-Pool gestakte CRA erzielen einen Tageszinssatz, der dem Einsatz zugeschlagen wird; eine Auszahlung erfordert einen vorherigen Antrag und vier Tage Wartezeit – ohne Zinsen während des Wartens und ohne vorzeitige Entnahme. CRA ist teilbesichert: Jedes CRA wird von CRC-Reserven der Revolution und vom Ausgleichstoken SPARK gedeckt; Reservedeckung und Besicherungsquote stehen auf der Staking-Seite. Zinsen werden in neuem, unbesichertem CRA gezahlt, das die Reservedeckung verwässert, umso schneller, je mehr gestakt ist; bei zu niedriger Deckung senkt die Revolution den Zinssatz. Die Revolution greift manchmal in die Reserve; zuvor gibt es Gerüchte, das ist das Vorzeichen. Fällt die Deckung danach unter {CraCrashRatio:%}, bricht das System zusammen: CRA ist binnen drei Tagen wertlos und vier Tage Entsperrung sind zu langsam; darüber gibt es nur einen Abschlag, und Mittel aus Raubzügen gegen die Oberschicht füllen die Reserve allmählich wieder auf.¶Offizielles Prägen: CRC und SPARK einzahlen (Verhältnis nach aktueller Besicherungsquote, die Vorschau zeigt den Bedarf), um CRA zu prägen; Wartezeit {CraMintDaysMin}–{CraMintDaysMax} Tage, das geprägte CRA wandert direkt ins Staking. Verbrennen tauscht CRA zurück in CRC und SPARK, mit gleich langer Wartezeit wie die Entsperrung; reicht die Reserve nicht, wird der CRC-Anteil nach Deckung gekürzt. Wartende Präge- und Verbrennungsaufträge kann die Revolution komplett verweigern: Die nächtliche Wahrscheinlichkeit ist der Betrag, um den der CRA-Preis unter 1 liegt, mal {CraRugPerDepeg}; liegt der Preis nicht unter 1, passierLine truncated
|
||||
guide.web3.text,"Bank und Handel: Die Bankseite ist nur lesbar und zeigt Bargeld, Miete und das CRC auf dem Poinbase-Konto. Die Seite „Guthaben“ von Poinbase regelt Ein- und Auszahlungen; zuerst wird der Coin gewählt: CRC geht über das Bankkonto oder die Wallet, alle anderen Coins nur über die Wallet. Eine Einzahlung von der Bank wandelt Credits in CRC auf deinem Poinbase-Konto um; eine Auszahlung auf die Bank wandelt CRC zurück in Credits um und durchläuft eine Compliance-Prüfung, die die Kontamination des Poinbase-Kontos bewertet. Eine Auszahlung auf eine Wallet braucht die Zieladresse und mehrere Bestätigungen bis zur Gutschrift; die Gasgebühr ist fest auf Normal gesetzt und wird vom abgehenden Coin abgezogen. Ist das Adressformat oder die Prüfziffer falsch, wird abgelehnt; bei einer formal gültigen Adresse, die niemand nutzt, sind die Coins nach der Überweisung weg.¶Handel: PSC steht für Probably Stolen Coin, den durch Grafikkarten und Miner geschürften Coin. Käufe werden im Notierungs-Coin bezahlt, Verkäufe im gehandelten Coin.¶Auf der Web3-Handelsseite lassen sich beliebige zwei Coins tauschen, stets über CRC als Zwischenschritt: Ist CRC eine Seite, läuft der Tausch über einen Pool, sonst über zwei Pools mit zwei Gebühren und sich addierendem Slippage; die Vorschau zeigt Menge, Anzahl der Pools und Verlust.§Hardware-Wallets: On-Chain-Coins liegen auf PLEDGER-Hardware-Wallets, jede mit eigenem Guthaben und eigener Kontamination. Eine Wallet ist ein Gegenstand: Ziehe sie auf das Handelsterminal, um sie zu laden. Öffne sie auf der Wallets-Seite des Terminals; verbinde und trenne sie oben rechts im Terminal. Der Handel der Web3-Seite sowie Shop und Mixer der Graunetz-Seite nutzen die verbundene Wallet; ohne Wallet oder ohne Verbindung sind sie nur lesbar und alle Guthaben zeigen 0. Kunden, die in Coins zahlen, zahlen auf die verbundene Wallet.¶Zahlungen (Shop, Mixer, Ponero-Schalter, Einstellgebühren) beginnen als Rechnung auf dem Handelsterminal; gib die Empfängeradresse auf der Wallet ein und halte zum Signieren ✓ gedrückt. Die letzten beiden Zeichen einer Adresse bilden eine Prüfsumme, sodass ein einzelner Tippfehler meist abgefangen wird; gelegentlich ist die Eingabe dennoch gültig und die Coins gehen an eine ungenutzte Adresse. Auch DEX-Swaps erfordern eine Signatur auf der Wallet.¶Poinbase ist ein Verwahrkonto; Einzahlungen erfolgen von der Wallet an die Einzahlungsadresse von Poinbase (PSC, CRC, CRT, CRA und SPARK werden angenommen), Auszahlungen werden auf der Seite „Guthaben“ von Poinbase gestartet. Der Explorer auf der Wallets-Seite zeigt Überweisungen nach Adresse, ausschließlich tatsächlich erfolgte (deine Wallets, Auszahlungen, Miner-Erträge). Weitere Hardware-Wallets verkauft Dr. Jackson; ziehe eine auf das Handelsterminal, um sie hinzuzufügen, bis zu {WalletMax}. Im Shop gibt es günstigere Exemplare. Eine nicht mehr benötigte Wallet kann auf der Wallets-Seite zerstört werden; ihre Coins sind dauerhaft verloren, ebenso alles, was danach an ihre Adresse gesendet wird.¶Überweisungen kosten Gasgebühren: langsam, normal oder schnell, und die Gas-Preise steigen und fallen im Wochenverlauf; bei Netzwerküberlastung steigen die Gasgebühren und langsame Transaktionen können aus dem Mempool fliegen. Vor dem Senden die vollständige Adresse prüfen.§Staking: Im Revolution-Pool gestakte CRA erzielen einen Tageszinssatz, der dem Einsatz zugeschlagen wird; eine Auszahlung erfordert einen vorherigen Antrag und vier Tage Wartezeit – ohne Zinsen während des Wartens und ohne vorzeitige Entnahme. CRA ist teilbesichert: Jedes CRA wird von CRC-Reserven der Revolution und vom Ausgleichstoken SPARK gedeckt; Reservedeckung und Besicherungsquote stehen auf der Staking-Seite. Zinsen werden in neuem, unbesichertem CRA gezahlt, das die Reservedeckung verwässert, umso schneller, je mehr gestakt ist; bei zu niedriger Deckung senkt die Revolution den Zinssatz. Die Revolution greift manchmal in die Reserve; zuvor gibt es Gerüchte, das ist das Vorzeichen. Fällt die Deckung danach unter {CraCrashRatio:%}, bricht das System zusammen: CRA ist binnen drei Tagen wertlos und vier Tage Entsperrung sind zu langsam; darüber gibt es nur einen Abschlag, und Mittel aus Raubzügen gegen die Oberschicht füllen die Reserve allmählich wieder auf.¶Offizielles Prägen: CRC und SPARK einzahlen (Verhältnis nach aktueller Besicherungsquote, die Vorschau zeigt den Bedarf), um CRA zu prägen; Wartezeit {CraMintDaysMin}–{CraMintDaysMax} Tage, das geprägte CRA wandert direkt ins Staking. Verbrennen tauscht CRA zurück in CRC und SPARK, mit gleich langer Wartezeit wie die Entsperrung; reicht die Reserve nicht, wird der CRC-Anteil nach Deckung gekürzt. Wartende Präge- und Verbrennungsaufträge kann die Revolution komplett verweigern: Die nächtliche Wahrscheinlichkeit ist der Betrag, um den der CRA-Preis unter 1 liegt, mal {CraRugPerDepeg}; liegt der Preis nicht unter 1, passierLine truncated
|
||||
courier.odd1,...Paket ist da.
|
||||
courier.odd2,(Seine Hand bleibt in der Tasche.) Hier unterschreiben.
|
||||
courier.sign,Unterschreiben
|
||||
@@ -271,17 +271,11 @@ nightlog.bm.sale_rug,Schwarzmarkt: Die Plattform hat einen Rug Pull durchgezogen
|
||||
black.sub.sell,Verkaufen
|
||||
black.sell.h,Verkaufen
|
||||
black.sell.mult,Preismultiplikator
|
||||
black.sell.list,Einstellen
|
||||
black.sell.mult,Preismultiplikator
|
||||
black.sell.days,{0} Tg.
|
||||
black.sell.none,Keine verkaufbaren Gegenstände im Lager.
|
||||
black.sell.listed,Eingestellt: {0} für {1}.
|
||||
black.sell.delist,Entfernen
|
||||
black.sell.rating,Bewertung {0}%
|
||||
black.mine.sales,Meine Angebote
|
||||
black.mine.sale,{0} Ref. {1} Preis {2} (x{3}): {4}
|
||||
black.sale.Listed,eingestellt
|
||||
black.sale.Sold,"verkauft, Auszahlung an Tag {0}"
|
||||
black.sale.Paid,ausgezahlt
|
||||
black.sale.Lost,"Plattform-Rug-Pull, verloren"
|
||||
black.sale.Delisted,entfernt
|
||||
@@ -294,10 +288,7 @@ merchant.Docs,Keycards & Chips
|
||||
merchant.Pharma,Pharma
|
||||
merchant.Bulk,Massenware
|
||||
black.days,{0} Tg. Lieferzeit
|
||||
black.sell.all,Alle einstellen
|
||||
black.sell.listedall,{0} Artikel eingestellt.
|
||||
black.sell.slots,Eingestellt {0}/{1}
|
||||
black.sell.full,Maximal {0} Artikel gleichzeitig.
|
||||
merchant.Rigs,Rigs & Energie
|
||||
merchant.Modules,Module
|
||||
merchant.GunMods,Büchsenmacher-Teile
|
||||
@@ -318,16 +309,7 @@ black.pay.to,Empfängeradresse: {0}
|
||||
black.pay.cancel,Stornieren
|
||||
pay.mix,Mixer {0} {1}
|
||||
pay.swap,Ponero-Schalter {0} {1}
|
||||
pay.listfee," (Einstellgebühr x{0})"
|
||||
pay.repricefee," (Preisänderungsgebühr x{0})"
|
||||
black.sell.repriced,"Preis geändert: {0}, jetzt {1}."
|
||||
black.edit.ref,Referenzpreis {0}
|
||||
black.edit.input,Preis eingeben
|
||||
black.edit.price,Preis {0} (x{1})
|
||||
black.edit.ok,OK
|
||||
black.edit.cancel,Abbrechen
|
||||
black.edit.range,"Der Preis muss das 0,6- bis 1,8-Fache des Referenzpreises betragen ({0} bis {1})."
|
||||
black.sell.reprice,Preis ändern
|
||||
merchant.Platform,Plattform
|
||||
black.platform.line,Plattform-Spot Sofortlieferung
|
||||
black.orders.in,Gekauft
|
||||
@@ -945,3 +927,23 @@ entry.mining.l1,Rig-Status und nächtliche Erträge
|
||||
entry.gray.l1,Mixer und Shop
|
||||
entry.wallets.l1,Hardware-Wallets und Explorer
|
||||
entry.wallets.l2,Wallets {0} / {1}
|
||||
black.sell.add,Mehr einstellen
|
||||
black.sell.back,Zurück zur Vitrine
|
||||
black.sell.kinds,Eingestellt {0}/{1} Sorten
|
||||
black.sell.have,{0} eingestellt
|
||||
black.sell.coins,Akzeptierte Coins
|
||||
black.sell.off,Entfernen
|
||||
black.sell.off.n,Entfernen ×{0}
|
||||
black.sell.nocoin,Mindestens ein Coin muss akzeptiert werden.
|
||||
black.sell.empty,Nichts eingestellt.
|
||||
black.sell.delisted,{0} entfernt; die Ware liegt wieder im Lager.
|
||||
black.sell.partial,"{0} eingestellt, {1} konnten nicht eingestellt werden."
|
||||
black.sell.limit.stack,Pro Ware können höchstens {0} eingestellt werden.
|
||||
black.sell.limit.kinds,Es können höchstens {0} Sorten gleichzeitig eingestellt sein.
|
||||
shelf.fab,Regal {0}
|
||||
delist.fab,Entfernen bestätigen {0}
|
||||
black.fee.h,Zum Einstellen bereit
|
||||
black.fee.line,{0} ×{1} · Preis {2} ({3})
|
||||
black.fee.total,Einstellgebühr {0}
|
||||
black.fee.sum,Einstellgebühr ({0} Stück)
|
||||
black.sale.Sold,"verkauft, Auszahlung an Tag {0} in {1}"
|
||||
@@ -247,7 +247,7 @@ black.kind.Contraband.3,Contraband (high)
|
||||
black.kind.Tech,High-tech (markup)
|
||||
nightlog.bm.ready,Black market: {0} arrived; a courier will come by once you open.
|
||||
guide.web3.title,Web3 Handbook
|
||||
guide.web3.text,"Bank and trading: the Bank page is read-only and shows cash, rent and the CRC in your Poinbase account. Poinbase's Funds page handles deposits and withdrawals; pick the coin first: CRC can go through the bank account or a wallet, every other coin only through a wallet. Depositing from the bank turns credits into CRC in your Poinbase account; withdrawing to the bank turns CRC back into credits and goes through compliance screening, which looks at the Poinbase account's taint. Withdrawing to a wallet needs a payee address and a few confirmations before it arrives; the gas fee is fixed at the normal tier and taken from the coin sent. A wrong address format or checksum is rejected; a correctly formatted address nobody uses means the coins are gone.¶Trading: PSC stands for Probably Stolen Coin, the coin mined by GPUs and miners. Buys are paid in the quote coin, sells in the traded coin.¶The Web3 trade page can swap any two coins, always through CRC: with CRC on one side it uses one pool, otherwise two pools, with two fees and stacked slippage; the preview shows the amount received, the pools crossed and the loss.§Hardware wallets: on-chain coins sit in PLEDGER hardware wallets, each with its own balances and taint. A wallet is an item: drag it onto the trading terminal to load it. Open it on the terminal's Wallets page; connect and disconnect at the top right of the terminal. Trading on the Web3 page and the shop and mixer on the Gray Net page use the connected wallet; with no wallet or no connection they are view-only and every balance reads 0. Coin-paying customers pay into the connected wallet.¶Payments (shop, mixer, Ponero desk, listing fees) start as an invoice on the terminal; type the payee address on the wallet and hold ✓ to sign. The last two characters of an address are a checksum, so a one-character typo is usually caught; once in a while it happens to be valid and the coins go to an address nobody uses. DEX swaps also need a signature on the wallet.¶Poinbase is a custodial account; deposits are sent from a wallet to Poinbase's deposit address (PSC, CRC, CRT, CRA and SPARK are all accepted) and withdrawals are started on Poinbase's Funds page. The Explorer on the Wallets page looks up transfers by address and shows only transfers that really happened (your wallets, withdrawals, miner payouts). More hardware wallets are sold by Dr. Jackson; drag one onto the trading terminal to add it, up to {WalletMax}. The shop has cheaper ones. A wallet you no longer want can be destroyed on the Wallets page; its coins are lost for good, and anything sent to its address afterwards is lost too.¶Transfers pay a gas fee: slow, normal or fast, and gas prices rise and fall over roughly a week; when the network is congested gas fees rise and slow transactions may be dropped from the mempool. Check the full address before sending.§Staking: CRA staked in the Revolution pool earns a daily rate that compounds into the stake; withdrawing means requesting first and waiting four days, with no interest while waiting and no way to take it early. CRA is partly collateralized: each CRA is backed by the CRC reserve the Revolution holds and by the balance token SPARK; reserve coverage and the collateral ratio are shown on the staking page. Interest is paid in new uncollateralized CRA, which dilutes reserve coverage, faster the more is staked; when coverage is too low the Revolution cuts the rate. The Revolution sometimes diverts the reserve, preceded by rumors: that is the warning. If coverage then falls below {CraCrashRatio:%} it collapses: CRA is worthless within three days and four days of unlocking is too slow; above that there is only a discount, and money from raiding the upper class slowly refills the reserve.¶Official minting: deposit CRC and SPARK (ratio per the current collateral ratio; the preview shows what is needed) to mint CRA, queued {CraMintDaysMin}-{CraMintDaysMax} days; the minted CRA goes straight into staking. Burning turns CRA back into CRC and SPARK, waiting as long as the unlock period; when the reserve is short the CRC share is cut by coverage. Queued mints and burns may be dishonored in full by the Revolution: the nightly chance is how far the CRA price is below 1 times {CraRugPerDepeg}; if the price is not below 1 it cannot happen.¶Staking accepts CRA, CRC, CRT and SPARK: the last three are first swapped into CRA on the secondary market at the going price (through CRC, with fees and slippage). SPARK's price swings hard and crashes with the collapse. Staking, minting and burning are contract calls and need a signature on the wallet.§Miners: RatDigg miners (M1 / M2 / M3) are standalone machines with far more hash than a card and a lower power draw per hash; they need a battery, take modules and use no rig slots. Only the shop's miner dealers sell them, gated by black-market standing (M1 {AsicRepM1}, M2 {AsicRepM2}, M3 {AsicRepM3}), sometimes second-hand. When one burns out, repairLine truncated
|
||||
guide.web3.text,"Bank and trading: the Bank page is read-only and shows cash, rent and the CRC in your Poinbase account. Poinbase's Funds page handles deposits and withdrawals; pick the coin first: CRC can go through the bank account or a wallet, every other coin only through a wallet. Depositing from the bank turns credits into CRC in your Poinbase account; withdrawing to the bank turns CRC back into credits and goes through compliance screening, which looks at the Poinbase account's taint. Withdrawing to a wallet needs a payee address and a few confirmations before it arrives; the gas fee is fixed at the normal tier and taken from the coin sent. A wrong address format or checksum is rejected; a correctly formatted address nobody uses means the coins are gone.¶Trading: PSC stands for Probably Stolen Coin, the coin mined by GPUs and miners. Buys are paid in the quote coin, sells in the traded coin.¶The Web3 trade page can swap any two coins, always through CRC: with CRC on one side it uses one pool, otherwise two pools, with two fees and stacked slippage; the preview shows the amount received, the pools crossed and the loss.§Hardware wallets: on-chain coins sit in PLEDGER hardware wallets, each with its own balances and taint. A wallet is an item: drag it onto the trading terminal to load it. Open it on the terminal's Wallets page; connect and disconnect at the top right of the terminal. Trading on the Web3 page and the shop and mixer on the Gray Net page use the connected wallet; with no wallet or no connection they are view-only and every balance reads 0. Coin-paying customers pay into the connected wallet.¶Payments (shop, mixer, Ponero desk, listing fees) start as an invoice on the terminal; type the payee address on the wallet and hold ✓ to sign. The last two characters of an address are a checksum, so a one-character typo is usually caught; once in a while it happens to be valid and the coins go to an address nobody uses. DEX swaps also need a signature on the wallet.¶Poinbase is a custodial account; deposits are sent from a wallet to Poinbase's deposit address (PSC, CRC, CRT, CRA and SPARK are all accepted) and withdrawals are started on Poinbase's Funds page. The Explorer on the Wallets page looks up transfers by address and shows only transfers that really happened (your wallets, withdrawals, miner payouts). More hardware wallets are sold by Dr. Jackson; drag one onto the trading terminal to add it, up to {WalletMax}. The shop has cheaper ones. A wallet you no longer want can be destroyed on the Wallets page; its coins are lost for good, and anything sent to its address afterwards is lost too.¶Transfers pay a gas fee: slow, normal or fast, and gas prices rise and fall over roughly a week; when the network is congested gas fees rise and slow transactions may be dropped from the mempool. Check the full address before sending.§Staking: CRA staked in the Revolution pool earns a daily rate that compounds into the stake; withdrawing means requesting first and waiting four days, with no interest while waiting and no way to take it early. CRA is partly collateralized: each CRA is backed by the CRC reserve the Revolution holds and by the balance token SPARK; reserve coverage and the collateral ratio are shown on the staking page. Interest is paid in new uncollateralized CRA, which dilutes reserve coverage, faster the more is staked; when coverage is too low the Revolution cuts the rate. The Revolution sometimes diverts the reserve, preceded by rumors: that is the warning. If coverage then falls below {CraCrashRatio:%} it collapses: CRA is worthless within three days and four days of unlocking is too slow; above that there is only a discount, and money from raiding the upper class slowly refills the reserve.¶Official minting: deposit CRC and SPARK (ratio per the current collateral ratio; the preview shows what is needed) to mint CRA, queued {CraMintDaysMin}-{CraMintDaysMax} days; the minted CRA goes straight into staking. Burning turns CRA back into CRC and SPARK, waiting as long as the unlock period; when the reserve is short the CRC share is cut by coverage. Queued mints and burns may be dishonored in full by the Revolution: the nightly chance is how far the CRA price is below 1 times {CraRugPerDepeg}; if the price is not below 1 it cannot happen.¶Staking accepts CRA, CRC, CRT and SPARK: the last three are first swapped into CRA on the secondary market at the going price (through CRC, with fees and slippage). SPARK's price swings hard and crashes with the collapse. Staking, minting and burning are contract calls and need a signature on the wallet.§Miners: RatDigg miners (M1 / M2 / M3) are standalone machines with far more hash than a card and a lower power draw per hash; they need a battery, take modules and use no rig slots. Only the shop's miner dealers sell them, gated by black-market standing (M1 {AsicRepM1}, M2 {AsicRepM2}, M3 {AsicRepM3}), sometimes second-hand. When one burns out, repairLine truncated
|
||||
courier.odd1,...Package is here.
|
||||
courier.odd2,(His hand stays in his pocket.) Sign here.
|
||||
courier.sign,Sign
|
||||
@@ -271,17 +271,11 @@ nightlog.bm.sale_rug,Black market: the platform rugged; your {0} and the payout
|
||||
black.sub.sell,Sell
|
||||
black.sell.h,Sell
|
||||
black.sell.mult,Price x{0}
|
||||
black.sell.list,List
|
||||
black.sell.mult,Price multiplier
|
||||
black.sell.days,{0} d
|
||||
black.sell.none,Nothing sellable in storage.
|
||||
black.sell.listed,Listed: {0} at {1}.
|
||||
black.sell.delist,Take down
|
||||
black.sell.rating,Rating {0}%
|
||||
black.mine.sales,My listings
|
||||
black.mine.sale,{0} ref {1} price {2} (x{3}): {4}
|
||||
black.sale.Listed,listed
|
||||
black.sale.Sold,"sold, payout day {0}"
|
||||
black.sale.Paid,paid
|
||||
black.sale.Lost,"platform rugged, gone"
|
||||
black.sale.Delisted,taken down
|
||||
@@ -294,10 +288,7 @@ merchant.Docs,Keycards & chips
|
||||
merchant.Pharma,Pharma
|
||||
merchant.Bulk,Bulk
|
||||
black.days,{0} days delivery
|
||||
black.sell.all,List all
|
||||
black.sell.listedall,Listed {0} items.
|
||||
black.sell.slots,Listed {0}/{1}
|
||||
black.sell.full,At most {0} listings at a time.
|
||||
merchant.Rigs,Rigs & power
|
||||
merchant.Modules,Modules
|
||||
merchant.GunMods,Gunsmith parts
|
||||
@@ -318,16 +309,7 @@ black.pay.to,Payee address: {0}
|
||||
black.pay.cancel,Void
|
||||
pay.mix,Mixer {0} {1}
|
||||
pay.swap,Ponero desk {0} {1}
|
||||
pay.listfee," (listing fee x{0})"
|
||||
pay.repricefee," (repricing fee x{0})"
|
||||
black.sell.repriced,"Repriced: {0}, now {1}."
|
||||
black.edit.ref,Reference price {0}
|
||||
black.edit.input,Enter a price
|
||||
black.edit.price,Price {0} (x{1})
|
||||
black.edit.ok,OK
|
||||
black.edit.cancel,Cancel
|
||||
black.edit.range,The price must be 0.6 to 1.8 times the reference ({0} to {1}).
|
||||
black.sell.reprice,Reprice
|
||||
merchant.Platform,Platform
|
||||
black.platform.line,Platform spot instant delivery
|
||||
black.orders.in,Bought
|
||||
@@ -945,3 +927,23 @@ entry.mining.l1,Rig status and nightly payouts
|
||||
entry.gray.l1,Mixer and shop
|
||||
entry.wallets.l1,Hardware wallets and Explorer
|
||||
entry.wallets.l2,Wallets {0} / {1}
|
||||
black.sell.add,Add listings
|
||||
black.sell.back,Back to showcase
|
||||
black.sell.kinds,Listed {0}/{1} kinds
|
||||
black.sell.have,{0} listed
|
||||
black.sell.coins,Accepted coins
|
||||
black.sell.off,Take down
|
||||
black.sell.off.n,Take down ×{0}
|
||||
black.sell.nocoin,Accept at least one coin.
|
||||
black.sell.empty,Nothing listed.
|
||||
black.sell.delisted,Took down {0}; the goods are back in storage.
|
||||
black.sell.partial,Listed {0}; {1} could not be listed.
|
||||
black.sell.limit.stack,Up to {0} of each item can be listed.
|
||||
black.sell.limit.kinds,Up to {0} kinds can be listed at once.
|
||||
shelf.fab,Shelf {0}
|
||||
delist.fab,Confirm take-down {0}
|
||||
black.fee.h,Ready to list
|
||||
black.fee.line,{0} ×{1} · price {2} ({3})
|
||||
black.fee.total,Listing fee {0}
|
||||
black.fee.sum,Listing fee ({0} items)
|
||||
black.sale.Sold,"sold, payout day {0} in {1}"
|
||||
@@ -247,7 +247,7 @@ black.kind.Contraband.3,Contrabando (alto)
|
||||
black.kind.Tech,Alta tecnología (con sobreprecio)
|
||||
nightlog.bm.ready,Mercado negro: {0} ha llegado; un mensajero pasará en cuanto abras.
|
||||
guide.web3.title,Manual de Web3
|
||||
guide.web3.text,"Banco y comercio: la página del banco es de solo lectura y muestra efectivo, alquiler y el CRC de la cuenta de Poinbase. La página Fondos de Poinbase gestiona depósitos y retiros; primero se elige la moneda: el CRC puede ir por la cuenta bancaria o la billetera, las demás monedas solo por la billetera. Depositar desde el banco convierte créditos en CRC en tu cuenta de Poinbase; retirar al banco convierte CRC nuevamente en créditos y pasa por una revisión de cumplimiento que evalúa la contaminación de la cuenta de Poinbase. Retirar a una billetera exige la dirección de destino y varias confirmaciones hasta acreditarse; la comisión de gas es fija, nivel normal, y se descuenta de la moneda enviada. Si el formato de la dirección o el dígito de control es incorrecto, se rechaza; si el formato es válido pero nadie usa esa dirección, las monedas enviadas se pierden.¶Comercio: PSC significa Probably Stolen Coin, la moneda minada por tarjetas gráficas y mineros (máquinas). Las compras se pagan en la moneda de cotización y las ventas en la moneda negociada.¶La página de comercio de Web3 permite intercambiar cualquier par de monedas, siempre a través de CRC: si CRC está en un extremo se usa un fondo, si no, dos fondos, con dos comisiones y deslizamiento acumulado; la vista previa muestra la cantidad obtenida, los fondos recorridos y la pérdida.§Billeteras de hardware: las monedas en cadena residen en billeteras de hardware PLEDGER, cada una con sus propios saldos y contaminación. Una billetera es un objeto: arrástrala a la terminal de comercio para cargarla. Ábrela en la página Billeteras de la terminal; conéctala y desconéctala arriba a la derecha de la terminal. El comercio de la página Web3, la tienda y el mezclador de la página Red gris usan la billetera conectada; sin billetera o sin conexión, son solo de lectura y todos los saldos marcan 0. Los clientes que pagan con monedas pagan a la billetera conectada.¶Los pagos (tienda, mezclador, mostrador de Ponero, tarifas de publicación) comienzan como una factura en la terminal; ingresa la dirección del destinatario en la billetera y mantén presionado ✓ para firmar. Los dos últimos caracteres de una dirección son una suma de verificación, por lo que un error tipográfico de un carácter suele detectarse; de vez en cuando resulta válido y las monedas van a una dirección que nadie usa. Los intercambios en DEX también requieren firmar en la billetera.¶Poinbase es una cuenta de custodia; los depósitos se envían desde la billetera a la dirección de depósito de Poinbase (se aceptan PSC, CRC, CRT, CRA y SPARK) y los retiros se inician en la página Fondos de Poinbase. El Explorador de la página Billeteras permite consultar transferencias por dirección y solo muestra transferencias realmente ocurridas (tus billeteras, retiros, ingresos de mineros). El Dr. Jackson vende más billeteras de hardware; arrastra una a la terminal de comercio para agregarla, hasta {WalletMax}. La tienda tiene opciones más baratas. Una billetera que ya no desees puede destruirse en la página Billeteras; sus monedas se pierden para siempre, y todo lo que se envíe después a su dirección también.¶Las transferencias pagan una comisión de gas: lenta, normal o rápida, y los precios del gas suben y bajan en aproximadamente una semana; cuando la red se congestiona, las comisiones de gas suben y las transacciones lentas pueden ser descartadas del mempool. Verifica la dirección completa antes de enviar.§Staking: el CRA en staking en el fondo de la Revolución genera una tasa diaria que se capitaliza en el monto; retirar implica solicitarlo primero y esperar cuatro días, sin intereses durante la espera y sin forma de retirarlo antes. CRA está parcialmente colateralizado: cada CRA está respaldado por la reserva de CRC de la Revolución y por el token de balance SPARK; la cobertura de la reserva y la tasa de colateralización aparecen en la página de staking. Los intereses se pagan con CRA nuevo sin colateral, lo que diluye la cobertura de la reserva, más rápido cuanto más staking haya; si la cobertura es demasiado baja, la Revolución recorta la tasa. La Revolución a veces desvía la reserva, precedida de rumores: es la señal de aviso. Si tras ello la cobertura cae por debajo de {CraCrashRatio:%}, hay colapso: CRA pierde todo su valor en tres días y los cuatro días de desbloqueo serán demasiado lentos; si no baja de ahí, solo hay un descuento, y los fondos de los saqueos a la clase alta van reponiendo la reserva poco a poco.¶Acuñación oficial: depositar CRC y SPARK (proporción según la tasa de colateralización actual; la vista previa indica cuánto hace falta) para acuñar CRA, con una cola de {CraMintDaysMin} a {CraMintDaysMax} días; el CRA acuñado entra directamente en staking. La quema cambia CRA por CRC y SPARK, con una espera igual de larga que el desbloqueo; si la reserva no alcanza, la parte de CRC se redLine truncated
|
||||
guide.web3.text,"Banco y comercio: la página del banco es de solo lectura y muestra efectivo, alquiler y el CRC de la cuenta de Poinbase. La página Fondos de Poinbase gestiona depósitos y retiros; primero se elige la moneda: el CRC puede ir por la cuenta bancaria o la billetera, las demás monedas solo por la billetera. Depositar desde el banco convierte créditos en CRC en tu cuenta de Poinbase; retirar al banco convierte CRC nuevamente en créditos y pasa por una revisión de cumplimiento que evalúa la contaminación de la cuenta de Poinbase. Retirar a una billetera exige la dirección de destino y varias confirmaciones hasta acreditarse; la comisión de gas es fija, nivel normal, y se descuenta de la moneda enviada. Si el formato de la dirección o el dígito de control es incorrecto, se rechaza; si el formato es válido pero nadie usa esa dirección, las monedas enviadas se pierden.¶Comercio: PSC significa Probably Stolen Coin, la moneda minada por tarjetas gráficas y mineros (máquinas). Las compras se pagan en la moneda de cotización y las ventas en la moneda negociada.¶La página de comercio de Web3 permite intercambiar cualquier par de monedas, siempre a través de CRC: si CRC está en un extremo se usa un fondo, si no, dos fondos, con dos comisiones y deslizamiento acumulado; la vista previa muestra la cantidad obtenida, los fondos recorridos y la pérdida.§Billeteras de hardware: las monedas en cadena residen en billeteras de hardware PLEDGER, cada una con sus propios saldos y contaminación. Una billetera es un objeto: arrástrala a la terminal de comercio para cargarla. Ábrela en la página Billeteras de la terminal; conéctala y desconéctala arriba a la derecha de la terminal. El comercio de la página Web3, la tienda y el mezclador de la página Red gris usan la billetera conectada; sin billetera o sin conexión, son solo de lectura y todos los saldos marcan 0. Los clientes que pagan con monedas pagan a la billetera conectada.¶Los pagos (tienda, mezclador, mostrador de Ponero, tarifas de publicación) comienzan como una factura en la terminal; ingresa la dirección del destinatario en la billetera y mantén presionado ✓ para firmar. Los dos últimos caracteres de una dirección son una suma de verificación, por lo que un error tipográfico de un carácter suele detectarse; de vez en cuando resulta válido y las monedas van a una dirección que nadie usa. Los intercambios en DEX también requieren firmar en la billetera.¶Poinbase es una cuenta de custodia; los depósitos se envían desde la billetera a la dirección de depósito de Poinbase (se aceptan PSC, CRC, CRT, CRA y SPARK) y los retiros se inician en la página Fondos de Poinbase. El Explorador de la página Billeteras permite consultar transferencias por dirección y solo muestra transferencias realmente ocurridas (tus billeteras, retiros, ingresos de mineros). El Dr. Jackson vende más billeteras de hardware; arrastra una a la terminal de comercio para agregarla, hasta {WalletMax}. La tienda tiene opciones más baratas. Una billetera que ya no desees puede destruirse en la página Billeteras; sus monedas se pierden para siempre, y todo lo que se envíe después a su dirección también.¶Las transferencias pagan una comisión de gas: lenta, normal o rápida, y los precios del gas suben y bajan en aproximadamente una semana; cuando la red se congestiona, las comisiones de gas suben y las transacciones lentas pueden ser descartadas del mempool. Verifica la dirección completa antes de enviar.§Staking: el CRA en staking en el fondo de la Revolución genera una tasa diaria que se capitaliza en el monto; retirar implica solicitarlo primero y esperar cuatro días, sin intereses durante la espera y sin forma de retirarlo antes. CRA está parcialmente colateralizado: cada CRA está respaldado por la reserva de CRC de la Revolución y por el token de balance SPARK; la cobertura de la reserva y la tasa de colateralización aparecen en la página de staking. Los intereses se pagan con CRA nuevo sin colateral, lo que diluye la cobertura de la reserva, más rápido cuanto más staking haya; si la cobertura es demasiado baja, la Revolución recorta la tasa. La Revolución a veces desvía la reserva, precedida de rumores: es la señal de aviso. Si tras ello la cobertura cae por debajo de {CraCrashRatio:%}, hay colapso: CRA pierde todo su valor en tres días y los cuatro días de desbloqueo serán demasiado lentos; si no baja de ahí, solo hay un descuento, y los fondos de los saqueos a la clase alta van reponiendo la reserva poco a poco.¶Acuñación oficial: depositar CRC y SPARK (proporción según la tasa de colateralización actual; la vista previa indica cuánto hace falta) para acuñar CRA, con una cola de {CraMintDaysMin} a {CraMintDaysMax} días; el CRA acuñado entra directamente en staking. La quema cambia CRA por CRC y SPARK, con una espera igual de larga que el desbloqueo; si la reserva no alcanza, la parte de CRC se redLine truncated
|
||||
courier.odd1,...Llegó el paquete.
|
||||
courier.odd2,(Mantiene la mano en el bolsillo). Firma aquí.
|
||||
courier.sign,Firmar
|
||||
@@ -271,17 +271,11 @@ nightlog.bm.sale_rug,Mercado negro: la plataforma hizo un rug pull; tu {0} y el
|
||||
black.sub.sell,Vender
|
||||
black.sell.h,Venta
|
||||
black.sell.mult,Multiplicador de precio
|
||||
black.sell.list,Publicar
|
||||
black.sell.mult,Multiplicador de precio
|
||||
black.sell.days,{0} d
|
||||
black.sell.none,No hay nada vendible en el almacén.
|
||||
black.sell.listed,Publicado: {0} a {1}.
|
||||
black.sell.delist,Retirar
|
||||
black.sell.rating,Calificación {0}%
|
||||
black.mine.sales,Mis publicaciones
|
||||
black.mine.sale,{0} ref {1} precio {2} (x{3}): {4}
|
||||
black.sale.Listed,publicado
|
||||
black.sale.Sold,"vendido, pago el día {0}"
|
||||
black.sale.Paid,pagado
|
||||
black.sale.Lost,"rug pull en plataforma, perdido"
|
||||
black.sale.Delisted,retirado
|
||||
@@ -294,10 +288,7 @@ merchant.Docs,Tarjetas y chips
|
||||
merchant.Pharma,Fármacos
|
||||
merchant.Bulk,A granel
|
||||
black.days,Entrega en {0} d
|
||||
black.sell.all,Publicar todo
|
||||
black.sell.listedall,Artículos publicados: {0}.
|
||||
black.sell.slots,Publicados {0}/{1}
|
||||
black.sell.full,Máximo de publicaciones simultáneas: {0}.
|
||||
merchant.Rigs,Plataformas y energía
|
||||
merchant.Modules,Módulos
|
||||
merchant.GunMods,Piezas de armero
|
||||
@@ -318,16 +309,7 @@ black.pay.to,Dirección del destinatario: {0}
|
||||
black.pay.cancel,Anular
|
||||
pay.mix,Mezclador {0} {1}
|
||||
pay.swap,Mostrador de Ponero {0} {1}
|
||||
pay.listfee," (tarifa de publicación x{0})"
|
||||
pay.repricefee," (tarifa de cambio de precio x{0})"
|
||||
black.sell.repriced,"Precio actualizado: {0}, ahora {1}."
|
||||
black.edit.ref,Precio de referencia {0}
|
||||
black.edit.input,Ingresar precio
|
||||
black.edit.price,Precio {0} (x{1})
|
||||
black.edit.ok,Aceptar
|
||||
black.edit.cancel,Cancelar
|
||||
black.edit.range,El precio debe ser de 0.6 a 1.8 veces la referencia ({0} a {1}).
|
||||
black.sell.reprice,Cambiar precio
|
||||
merchant.Platform,Plataforma
|
||||
black.platform.line,Spot de plataforma entrega inmediata
|
||||
black.orders.in,Comprado
|
||||
@@ -945,3 +927,23 @@ entry.mining.l1,Estado de los equipos y ganancias nocturnas
|
||||
entry.gray.l1,Mezclador y tienda
|
||||
entry.wallets.l1,Billeteras de hardware y explorador
|
||||
entry.wallets.l2,Billeteras {0} / {1}
|
||||
black.sell.add,Añadir artículos
|
||||
black.sell.back,Volver al escaparate
|
||||
black.sell.kinds,En venta {0}/{1} tipos
|
||||
black.sell.have,{0} en venta
|
||||
black.sell.coins,Monedas aceptadas
|
||||
black.sell.off,Retirar
|
||||
black.sell.off.n,Retirar ×{0}
|
||||
black.sell.nocoin,Acepta al menos una moneda.
|
||||
black.sell.empty,Nada en venta.
|
||||
black.sell.delisted,{0} retirado(s); la mercancía vuelve al almacén.
|
||||
black.sell.partial,"{0} puestos en venta, {1} no se pudieron poner."
|
||||
black.sell.limit.stack,Máximo {0} unidades por artículo.
|
||||
black.sell.limit.kinds,Máximo {0} tipos a la vez.
|
||||
shelf.fab,Estante {0}
|
||||
delist.fab,Confirmar retirada {0}
|
||||
black.fee.h,Listo para publicar
|
||||
black.fee.line,{0} ×{1} · precio {2} ({3})
|
||||
black.fee.total,Tarifa de publicación {0}
|
||||
black.fee.sum,Tarifa de publicación ({0} art.)
|
||||
black.sale.Sold,"vendido, pago el día {0} en {1}"
|
||||
@@ -247,7 +247,7 @@ black.kind.Contraband.3,Contrebande (élevée)
|
||||
black.kind.Tech,High-tech (majoration)
|
||||
nightlog.bm.ready,Marché noir : {0} est arrivé ; un livreur passera dès l'ouverture.
|
||||
guide.web3.title,Manuel Web3
|
||||
guide.web3.text,"Banque et trading : la page Banque est en lecture seule et affiche les espèces, le loyer et les CRC du compte Poinbase. La page Fonds de Poinbase gère dépôts et retraits ; on choisit d'abord la pièce : le CRC passe par le compte bancaire ou le portefeuille, les autres pièces uniquement par le portefeuille. Le dépôt depuis la banque convertit les crédits en CRC sur votre compte Poinbase ; le retrait vers la banque reconvertit les CRC en crédits et passe par un contrôle de conformité, qui évalue la contamination du compte Poinbase. Un retrait vers un portefeuille demande l'adresse du destinataire et plusieurs confirmations avant d'arriver ; les frais de gas sont fixés au niveau normal et prélevés sur la pièce envoyée. Un format d'adresse ou un chiffre de contrôle incorrect est refusé ; une adresse au format valide mais que personne n'utilise fait perdre les pièces envoyées.¶Trading : PSC signifie Probably Stolen Coin, la pièce minée par les cartes graphiques et les mineurs (machines). Les achats sont payés dans la monnaie de cotation, les ventes dans la monnaie échangée.¶La page de trading Web3 permet d'échanger deux pièces au choix, toujours via le CRC : si le CRC est d'un côté, un seul pool est utilisé, sinon deux pools, avec deux frais et un glissement cumulé ; l'aperçu indique le montant obtenu, le nombre de pools traversés et la perte.§Portefeuilles matériels : les pièces sur la blockchain sont conservées dans des portefeuilles matériels PLEDGER, chacun avec ses propres soldes et sa contamination. Un portefeuille est un objet : glissez-le sur le terminal de trading pour le charger. Ouvrez-le sur la page Portefeuilles du terminal ; connectez et déconnectez-le en haut à droite du terminal. Le trading de la page Web3, la boutique et le mixeur de la page Réseau gris utilisent le portefeuille connecté ; sans portefeuille ou sans connexion, ils sont en lecture seule et tous les soldes affichent 0. Les clients qui paient en pièces paient sur le portefeuille connecté.¶Les paiements (boutique, mixeur, comptoir Ponero, frais de mise en vente) débutent par une facture sur le terminal ; saisissez l'adresse du destinataire sur le portefeuille et maintenez ✓ pour signer. Les deux derniers caractères d'une adresse sont une somme de contrôle, de sorte qu'une faute de frappe d'un caractère est généralement interceptée ; il arrive parfois qu'elle soit valide par hasard et les pièces partent alors vers une adresse inutilisée. Les échanges sur le DEX nécessitent également une signature sur le portefeuille.¶Poinbase est un compte dépositaire ; le dépôt s'effectue depuis le portefeuille vers l'adresse de dépôt de Poinbase (PSC, CRC, CRT, CRA et SPARK sont acceptés), le retrait se lance depuis la page Fonds de Poinbase. L'Explorateur de la page Portefeuilles permet de consulter les transferts par adresse, en n'affichant que les transferts réellement effectués (vos portefeuilles, retraits, gains des mineurs). D'autres portefeuilles matériels sont vendus par le Pr Jackson ; glissez-en un sur le terminal de trading pour l'ajouter, jusqu'à {WalletMax} au total. La boutique en propose des moins chers. Un portefeuille devenu inutile peut être détruit sur la page Portefeuilles ; ses pièces sont perdues définitivement, et tout ce qui est envoyé ensuite à son adresse l'est aussi.¶Les transferts sont soumis à des frais de gas : lent, normal ou rapide, et le prix du gas monte et descend sur environ une semaine ; lorsque le réseau est saturé, les frais de gas augmentent et les transactions lentes peuvent être rejetées de la mempool. Vérifiez l'adresse complète avant d'envoyer.§Staking : le CRA staké dans le pool de la Révolution rapporte un taux quotidien capitalisé dans le montant staké ; retirer nécessite d'en faire la demande préalable et d'attendre quatre jours, sans intérêt durant cette période ni moyen de récupérer les fonds plus tôt. Le CRA est partiellement collatéralisé : chaque CRA est soutenu par la réserve de CRC détenue par la Révolution et par le jeton d'équilibre SPARK ; le taux de couverture de la réserve et le taux de collatéralisation figurent sur la page de staking. Les intérêts sont versés en nouveaux CRA non collatéralisés, ce qui dilue la couverture de la réserve, d'autant plus vite que le staking est important ; si la couverture est trop faible, la Révolution réduit le taux. La Révolution détourne parfois la réserve, précédée de rumeurs : c'est le présage. Si la couverture tombe ensuite sous {CraCrashRatio:%}, c'est l'effondrement : le CRA perd toute valeur en trois jours et quatre jours de déverrouillage arrivent trop tard ; au-dessus, il y a seulement une décote, et l'argent des pillages de la haute société reconstitue peu à peu la réserve.¶Frappe officielle : déposer du CRC et du SPARK (proportion selon le taux de collatéralisation actuel, l'aperçu indique les monLine truncated
|
||||
guide.web3.text,"Banque et trading : la page Banque est en lecture seule et affiche les espèces, le loyer et les CRC du compte Poinbase. La page Fonds de Poinbase gère dépôts et retraits ; on choisit d'abord la pièce : le CRC passe par le compte bancaire ou le portefeuille, les autres pièces uniquement par le portefeuille. Le dépôt depuis la banque convertit les crédits en CRC sur votre compte Poinbase ; le retrait vers la banque reconvertit les CRC en crédits et passe par un contrôle de conformité, qui évalue la contamination du compte Poinbase. Un retrait vers un portefeuille demande l'adresse du destinataire et plusieurs confirmations avant d'arriver ; les frais de gas sont fixés au niveau normal et prélevés sur la pièce envoyée. Un format d'adresse ou un chiffre de contrôle incorrect est refusé ; une adresse au format valide mais que personne n'utilise fait perdre les pièces envoyées.¶Trading : PSC signifie Probably Stolen Coin, la pièce minée par les cartes graphiques et les mineurs (machines). Les achats sont payés dans la monnaie de cotation, les ventes dans la monnaie échangée.¶La page de trading Web3 permet d'échanger deux pièces au choix, toujours via le CRC : si le CRC est d'un côté, un seul pool est utilisé, sinon deux pools, avec deux frais et un glissement cumulé ; l'aperçu indique le montant obtenu, le nombre de pools traversés et la perte.§Portefeuilles matériels : les pièces sur la blockchain sont conservées dans des portefeuilles matériels PLEDGER, chacun avec ses propres soldes et sa contamination. Un portefeuille est un objet : glissez-le sur le terminal de trading pour le charger. Ouvrez-le sur la page Portefeuilles du terminal ; connectez et déconnectez-le en haut à droite du terminal. Le trading de la page Web3, la boutique et le mixeur de la page Réseau gris utilisent le portefeuille connecté ; sans portefeuille ou sans connexion, ils sont en lecture seule et tous les soldes affichent 0. Les clients qui paient en pièces paient sur le portefeuille connecté.¶Les paiements (boutique, mixeur, comptoir Ponero, frais de mise en vente) débutent par une facture sur le terminal ; saisissez l'adresse du destinataire sur le portefeuille et maintenez ✓ pour signer. Les deux derniers caractères d'une adresse sont une somme de contrôle, de sorte qu'une faute de frappe d'un caractère est généralement interceptée ; il arrive parfois qu'elle soit valide par hasard et les pièces partent alors vers une adresse inutilisée. Les échanges sur le DEX nécessitent également une signature sur le portefeuille.¶Poinbase est un compte dépositaire ; le dépôt s'effectue depuis le portefeuille vers l'adresse de dépôt de Poinbase (PSC, CRC, CRT, CRA et SPARK sont acceptés), le retrait se lance depuis la page Fonds de Poinbase. L'Explorateur de la page Portefeuilles permet de consulter les transferts par adresse, en n'affichant que les transferts réellement effectués (vos portefeuilles, retraits, gains des mineurs). D'autres portefeuilles matériels sont vendus par le Pr Jackson ; glissez-en un sur le terminal de trading pour l'ajouter, jusqu'à {WalletMax} au total. La boutique en propose des moins chers. Un portefeuille devenu inutile peut être détruit sur la page Portefeuilles ; ses pièces sont perdues définitivement, et tout ce qui est envoyé ensuite à son adresse l'est aussi.¶Les transferts sont soumis à des frais de gas : lent, normal ou rapide, et le prix du gas monte et descend sur environ une semaine ; lorsque le réseau est saturé, les frais de gas augmentent et les transactions lentes peuvent être rejetées de la mempool. Vérifiez l'adresse complète avant d'envoyer.§Staking : le CRA staké dans le pool de la Révolution rapporte un taux quotidien capitalisé dans le montant staké ; retirer nécessite d'en faire la demande préalable et d'attendre quatre jours, sans intérêt durant cette période ni moyen de récupérer les fonds plus tôt. Le CRA est partiellement collatéralisé : chaque CRA est soutenu par la réserve de CRC détenue par la Révolution et par le jeton d'équilibre SPARK ; le taux de couverture de la réserve et le taux de collatéralisation figurent sur la page de staking. Les intérêts sont versés en nouveaux CRA non collatéralisés, ce qui dilue la couverture de la réserve, d'autant plus vite que le staking est important ; si la couverture est trop faible, la Révolution réduit le taux. La Révolution détourne parfois la réserve, précédée de rumeurs : c'est le présage. Si la couverture tombe ensuite sous {CraCrashRatio:%}, c'est l'effondrement : le CRA perd toute valeur en trois jours et quatre jours de déverrouillage arrivent trop tard ; au-dessus, il y a seulement une décote, et l'argent des pillages de la haute société reconstitue peu à peu la réserve.¶Frappe officielle : déposer du CRC et du SPARK (proportion selon le taux de collatéralisation actuel, l'aperçu indique les monLine truncated
|
||||
courier.odd1,...Le colis est là.
|
||||
courier.odd2,(Sa main reste dans sa poche.) Signez ici.
|
||||
courier.sign,Signer
|
||||
@@ -271,17 +271,11 @@ nightlog.bm.sale_rug,Marché noir : la plateforme a fait un rug pull ; votre {0}
|
||||
black.sub.sell,Vente
|
||||
black.sell.h,Vente
|
||||
black.sell.mult,Multiplicateur de prix
|
||||
black.sell.list,Mettre en vente
|
||||
black.sell.mult,Multiplicateur de prix
|
||||
black.sell.days,{0} j
|
||||
black.sell.none,Rien de vendable en réserve.
|
||||
black.sell.listed,En vente : {0} à {1}.
|
||||
black.sell.delist,Retirer
|
||||
black.sell.rating,Évaluation {0} %
|
||||
black.mine.sales,Mes ventes
|
||||
black.mine.sale,{0} réf. {1} prix {2} (x{3}) : {4}
|
||||
black.sale.Listed,en vente
|
||||
black.sale.Sold,"vendu, paiement au jour {0}"
|
||||
black.sale.Paid,payé
|
||||
black.sale.Lost,"rug pull de la plateforme, perdu"
|
||||
black.sale.Delisted,retiré
|
||||
@@ -294,10 +288,7 @@ merchant.Docs,Cartes d'accès et puces
|
||||
merchant.Pharma,Pharma
|
||||
merchant.Bulk,En gros
|
||||
black.days,Livraison : {0} j
|
||||
black.sell.all,Tout mettre en vente
|
||||
black.sell.listedall,Objets mis en vente : {0}.
|
||||
black.sell.slots,En vente : {0}/{1}
|
||||
black.sell.full,Maximum d'articles en vente simultanés : {0}.
|
||||
merchant.Rigs,Plateformes et énergie
|
||||
merchant.Modules,Modules
|
||||
merchant.GunMods,Pièces d'armurerie
|
||||
@@ -318,16 +309,7 @@ black.pay.to,Adresse bénéficiaire : {0}
|
||||
black.pay.cancel,Annuler
|
||||
pay.mix,Mixeur {0} {1}
|
||||
pay.swap,Comptoir Ponero {0} {1}
|
||||
pay.listfee," (frais de mise en vente x{0})"
|
||||
pay.repricefee," (frais de changement de prix x{0})"
|
||||
black.sell.repriced,"Prix modifié : {0}, désormais {1}."
|
||||
black.edit.ref,Prix de référence {0}
|
||||
black.edit.input,Saisir un prix
|
||||
black.edit.price,Prix {0} (x{1})
|
||||
black.edit.ok,OK
|
||||
black.edit.cancel,Annuler
|
||||
black.edit.range,"Le prix doit être compris entre 0,6 et 1,8 fois la référence ({0} à {1})."
|
||||
black.sell.reprice,Modifier le prix
|
||||
merchant.Platform,Plateforme
|
||||
black.platform.line,Spot plateforme livraison immédiate
|
||||
black.orders.in,Achats
|
||||
@@ -945,3 +927,23 @@ entry.mining.l1,État des machines et gains nocturnes
|
||||
entry.gray.l1,Mixeur et boutique
|
||||
entry.wallets.l1,Portefeuilles matériels et explorateur
|
||||
entry.wallets.l2,Portefeuilles {0} / {1}
|
||||
black.sell.add,Ajouter des articles
|
||||
black.sell.back,Retour à la vitrine
|
||||
black.sell.kinds,En vente {0}/{1} types
|
||||
black.sell.have,{0} en vente
|
||||
black.sell.coins,Cryptos acceptées
|
||||
black.sell.off,Retirer
|
||||
black.sell.off.n,Retirer ×{0}
|
||||
black.sell.nocoin,Acceptez au moins une crypto.
|
||||
black.sell.empty,Rien en vente.
|
||||
black.sell.delisted,{0} retiré(s) ; la marchandise est de retour au stockage.
|
||||
black.sell.partial,"{0} mis en vente, {1} n'ont pas pu l'être."
|
||||
black.sell.limit.stack,{0} exemplaires maximum par article.
|
||||
black.sell.limit.kinds,{0} types maximum en même temps.
|
||||
shelf.fab,Étagère {0}
|
||||
delist.fab,Confirmer le retrait {0}
|
||||
black.fee.h,Prêt à mettre en vente
|
||||
black.fee.line,{0} ×{1} · prix {2} ({3})
|
||||
black.fee.total,Frais de mise en vente {0}
|
||||
black.fee.sum,Frais de mise en vente ({0} art.)
|
||||
black.sale.Sold,"vendu, paiement au jour {0} en {1}"
|
||||
@@ -247,7 +247,7 @@ black.kind.Contraband.3,禁制品(高)
|
||||
black.kind.Tech,ハイテク品(割増)
|
||||
nightlog.bm.ready,闇市場:{0} が到着。開店後に配達人が届けてくれる。
|
||||
guide.web3.title,Web3ハンドブック
|
||||
guide.web3.text,銀行と取引:銀行ページは閲覧専用で、現金、家賃、Poinbase口座のCRCを表示する。入金と出金はPoinbaseの資金ページで行い、先にコインを選ぶ。CRCは銀行口座またはウォレットを使え、他のコインはウォレットのみ。銀行からの入金はクレジットをPoinbase口座のCRCに変換し、銀行への出金はCRCをクレジットに戻すが、Poinbase口座の汚染を対象としたコンプライアンス審査が行われる。ウォレットへの出金は受取アドレスの入力が必要で、数回の承認を経て着金する。ガス代は通常ランクで固定され、送るコインから差し引かれる。アドレスの形式やチェックディジットが誤っていると拒否される。形式が正しくても誰も使っていないアドレスに送ったコインは失われる。¶取引:PSCは Probably Stolen Coin の略称で、グラフィックボードや専用採掘機で採掘されるコイン。買いは決済通貨で支払い、売りは取引対象のコインで行う。¶Web3の取引ページでは任意の2種類のコインを交換でき、必ずCRCを経由する。CRCが片側なら1つのプール、そうでなければ2つのプールを通り、手数料は2回、スリッページは重なる。プレビューに受取数量、経由するプール数、損失が表示される。§ハードウェアウォレット:チェーン上のコインはPLEDGERハードウェアウォレットに保管され、ウォレットごとに残高と汚染が個別に管理される。ウォレットはアイテムで、取引ターミナルにドラッグして読み込む。ターミナルのウォレットページで開き、ターミナル右上で接続・切断する。Web3ページの取引とグレーネットページのショップ、ミキサーは接続されたウォレットを使用する。ウォレットがない、または接続していないときは閲覧のみで、残高はすべて0になる。コイン決済の客は接続されたウォレットに支払う。¶支払い(ショップ、ミキサー、Ponero窓口、出品手数料)はまずターミナルで請求書を発行し、ウォレット側で送金先アドレスを入力して✓を長押しして署名する。アドレスの末尾2文字はチェックサムのため、1文字の誤入力なら通常は検出されるが、偶然有効なアドレスに一致した場合は誰も使っていないアドレスにコインが送られてしまう。DEXでのスワップもウォレットでの署名が必要となる。¶Poinbaseはカストディ口座で、入金はウォレットからPoinbaseの入金アドレスへ送金し(PSC、CRC、CRT、CRA、SPARKを受け付ける)、出金はPoinbaseの資金ページで行う。ウォレットページのエクスプローラーではアドレスで送金履歴を検索でき、実際に行われた送金(自分のウォレット、出金、採掘機の収益)のみが表示される。追加のハードウェアウォレットはジャックソン博士から購入し、取引ターミナルにドラッグして追加する(最大{WalletMax}個)。ショップにはより安価なものもある。不要になったウォレットは、ウォレットページで破棄できる。中のコインは永久に失われ、その後このアドレスに送られたものも失われる。¶送金にはガス代が必要で、低速・通常・高速の3段階があり、ガス価格は約1週間周期で上下する。ネットワーク混雑時はガス代が高騰し、低速のトランザクションはメムプールから除外されることがある。送金前にアドレス全体を必ず確認すること。§ステーキング:革命家のプールにCRAをステーキングすると日利が付与され、利息は元本に複利で組み入れられる。出金するにはまず申請して4日間待つ必要があり、待機期間中は利息が発生せず、早期引き出しもできない。CRAは部分担保で、CRA1枚ごとに革命家が保有するCRC準備金とバランストークンSPARKが裏付けとなる。準備金カバー率と担保率はステーキングページに表示される。利息は担保のない新規CRAで支払われるため準備金カバー率が希薄化し、ステーキングが多いほど速く進む。カバー率が低すぎると革命家は日利を引き下げる。革命家は時折準備金を流用し、事前に噂が流れる。それが予兆だ。流用後にカバー率が{CraCrashRatio:%}を割り込むと崩壊する。3日以内にCRAは無価値となり、4日間のロック解除期間では間に合わない。割り込まなければディスカウントにとどまり、上流階級への略奪で得た資金が準備金を徐々に補うLine truncated
|
||||
guide.web3.text,銀行と取引:銀行ページは閲覧専用で、現金、家賃、Poinbase口座のCRCを表示する。入金と出金はPoinbaseの資金ページで行い、先にコインを選ぶ。CRCは銀行口座またはウォレットを使え、他のコインはウォレットのみ。銀行からの入金はクレジットをPoinbase口座のCRCに変換し、銀行への出金はCRCをクレジットに戻すが、Poinbase口座の汚染を対象としたコンプライアンス審査が行われる。ウォレットへの出金は受取アドレスの入力が必要で、数回の承認を経て着金する。ガス代は通常ランクで固定され、送るコインから差し引かれる。アドレスの形式やチェックディジットが誤っていると拒否される。形式が正しくても誰も使っていないアドレスに送ったコインは失われる。¶取引:PSCは Probably Stolen Coin の略称で、グラフィックボードや専用採掘機で採掘されるコイン。買いは決済通貨で支払い、売りは取引対象のコインで行う。¶Web3の取引ページでは任意の2種類のコインを交換でき、必ずCRCを経由する。CRCが片側なら1つのプール、そうでなければ2つのプールを通り、手数料は2回、スリッページは重なる。プレビューに受取数量、経由するプール数、損失が表示される。§ハードウェアウォレット:チェーン上のコインはPLEDGERハードウェアウォレットに保管され、ウォレットごとに残高と汚染が個別に管理される。ウォレットはアイテムで、取引ターミナルにドラッグして読み込む。ターミナルのウォレットページで開き、ターミナル右上で接続・切断する。Web3ページの取引とグレーネットページのショップ、ミキサーは接続されたウォレットを使用する。ウォレットがない、または接続していないときは閲覧のみで、残高はすべて0になる。コイン決済の客は接続されたウォレットに支払う。¶支払い(ショップ、ミキサー、Ponero窓口、出品手数料)はまずターミナルで請求書を発行し、ウォレット側で送金先アドレスを入力して✓を長押しして署名する。アドレスの末尾2文字はチェックサムのため、1文字の誤入力なら通常は検出されるが、偶然有効なアドレスに一致した場合は誰も使っていないアドレスにコインが送られてしまう。DEXでのスワップもウォレットでの署名が必要となる。¶Poinbaseはカストディ口座で、入金はウォレットからPoinbaseの入金アドレスへ送金し(PSC、CRC、CRT、CRA、SPARKを受け付ける)、出金はPoinbaseの資金ページで行う。ウォレットページのエクスプローラーではアドレスで送金履歴を検索でき、実際に行われた送金(自分のウォレット、出金、採掘機の収益)のみが表示される。追加のハードウェアウォレットはジャックソン博士から購入し、取引ターミナルにドラッグして追加する(最大{WalletMax}個)。ショップにはより安価なものもある。不要になったウォレットは、ウォレットページで破棄できる。中のコインは永久に失われ、その後このアドレスに送られたものも失われる。¶送金にはガス代が必要で、低速・通常・高速の3段階があり、ガス価格は約1週間周期で上下する。ネットワーク混雑時はガス代が高騰し、低速のトランザクションはメムプールから除外されることがある。送金前にアドレス全体を必ず確認すること。§ステーキング:革命家のプールにCRAをステーキングすると日利が付与され、利息は元本に複利で組み入れられる。出金するにはまず申請して4日間待つ必要があり、待機期間中は利息が発生せず、早期引き出しもできない。CRAは部分担保で、CRA1枚ごとに革命家が保有するCRC準備金とバランストークンSPARKが裏付けとなる。準備金カバー率と担保率はステーキングページに表示される。利息は担保のない新規CRAで支払われるため準備金カバー率が希薄化し、ステーキングが多いほど速く進む。カバー率が低すぎると革命家は日利を引き下げる。革命家は時折準備金を流用し、事前に噂が流れる。それが予兆だ。流用後にカバー率が{CraCrashRatio:%}を割り込むと崩壊する。3日以内にCRAは無価値となり、4日間のロック解除期間では間に合わない。割り込まなければディスカウントにとどまり、上流階級への略奪で得た資金が準備金を徐々に補うLine truncated
|
||||
courier.odd1,……荷物が届いた。
|
||||
courier.odd2,(ポケットに手を入れたままだ)ここにサインを。
|
||||
courier.sign,サイン
|
||||
@@ -271,17 +271,11 @@ nightlog.bm.sale_rug,闇市場:プラットフォームがラグプルを起
|
||||
black.sub.sell,出品
|
||||
black.sell.h,出品
|
||||
black.sell.mult,価格倍率
|
||||
black.sell.list,出品
|
||||
black.sell.mult,価格倍率
|
||||
black.sell.days,{0}日
|
||||
black.sell.none,保管庫に出品可能なアイテムがありません。
|
||||
black.sell.listed,出品完了:{0}(価格 {1})
|
||||
black.sell.delist,出品取消
|
||||
black.sell.rating,高評価 {0}%
|
||||
black.mine.sales,出品一覧
|
||||
black.mine.sale,{0} 参考 {1} 価格 {2}(×{3}):{4}
|
||||
black.sale.Listed,出品中
|
||||
black.sale.Sold,成約済、{0}日目に入金
|
||||
black.sale.Paid,入金済
|
||||
black.sale.Lost,ラグプルにより消失
|
||||
black.sale.Delisted,出品取消済
|
||||
@@ -294,10 +288,7 @@ merchant.Docs,キーカード・チップ
|
||||
merchant.Pharma,医薬品
|
||||
merchant.Bulk,大口商品
|
||||
black.days,{0}日で到着
|
||||
black.sell.all,一括出品
|
||||
black.sell.listedall,{0}件を出品しました。
|
||||
black.sell.slots,出品中 {0}/{1}
|
||||
black.sell.full,同時出品は最大{0}件までです。
|
||||
merchant.Rigs,マイニングリグ・電源
|
||||
merchant.Modules,モジュール
|
||||
merchant.GunMods,ガンスミスパーツ
|
||||
@@ -318,16 +309,7 @@ black.pay.to,送金先アドレス:{0}
|
||||
black.pay.cancel,破棄
|
||||
pay.mix,ミキサー {0} {1}
|
||||
pay.swap,Ponero窓口 {0} {1}
|
||||
pay.listfee,(出品手数料 ×{0})
|
||||
pay.repricefee,(価格変更手数料 ×{0})
|
||||
black.sell.repriced,価格変更:{0}、現在 {1}。
|
||||
black.edit.ref,参考価格 {0}
|
||||
black.edit.input,価格を入力
|
||||
black.edit.price,価格 {0}(×{1})
|
||||
black.edit.ok,OK
|
||||
black.edit.cancel,キャンセル
|
||||
black.edit.range,価格は参考価格の0.6〜1.8倍({0}〜{1})にする必要があります。
|
||||
black.sell.reprice,価格変更
|
||||
merchant.Platform,プラットフォーム
|
||||
black.platform.line,プラットフォーム現物 即時配達
|
||||
black.orders.in,購入
|
||||
@@ -945,3 +927,23 @@ entry.mining.l1,採掘機の状態と夜間収益
|
||||
entry.gray.l1,ミキサーとショップ
|
||||
entry.wallets.l1,ハードウェアウォレットとエクスプローラー
|
||||
entry.wallets.l2,ウォレット {0} / {1}
|
||||
black.sell.add,出品を追加
|
||||
black.sell.back,ショーケースに戻る
|
||||
black.sell.kinds,出品中 {0}/{1} 種
|
||||
black.sell.have,出品中 {0} 個
|
||||
black.sell.coins,受取コイン
|
||||
black.sell.off,取り下げ
|
||||
black.sell.off.n,取り下げ ×{0}
|
||||
black.sell.nocoin,少なくとも1種類のコインを受け付ける必要がある。
|
||||
black.sell.empty,出品中の商品はない。
|
||||
black.sell.delisted,{0}個を取り下げた。商品は保管庫に戻った。
|
||||
black.sell.partial,{0}個を出品、{1}個は出品できなかった。
|
||||
black.sell.limit.stack,同じ商品は最大{0}個まで出品できる。
|
||||
black.sell.limit.kinds,同時に出品できるのは最大{0}種類まで。
|
||||
shelf.fab,棚 {0}
|
||||
delist.fab,取り下げを確定 {0}
|
||||
black.fee.h,出品予定
|
||||
black.fee.line,{0} ×{1} 価格 {2}({3})
|
||||
black.fee.total,出品手数料 {0}
|
||||
black.fee.sum,出品手数料({0}個)
|
||||
black.sale.Sold,成約済、{0}日目に{1}で入金
|
||||
@@ -247,7 +247,7 @@ black.kind.Contraband.3,Kontrabanda (wysoki poziom)
|
||||
black.kind.Tech,Zaawansowana technologia (marża)
|
||||
nightlog.bm.ready,Czarny Rynek: {0} na miejscu; kurier pojawi się po otwarciu lokalu.
|
||||
guide.web3.title,Podręcznik Web3
|
||||
guide.web3.text,"Bank i handel: strona banku jest tylko do odczytu i pokazuje gotówkę, czynsz oraz CRC na koncie Poinbase. Strona Środki w Poinbase obsługuje wpłaty i wypłaty; najpierw wybiera się monetę: CRC może iść przez konto bankowe lub portfel, pozostałe monety tylko przez portfel. Wpłata z banku zamienia kredyty na CRC na koncie Poinbase; wypłata do banku zamienia CRC z powrotem na kredyty i podlega kontroli zgodności, sprawdzającej skażenie konta Poinbase. Wypłata do portfela wymaga podania adresu odbiorcy i kilku potwierdzeń do zaksięgowania; opłata gas jest stała, na poziomie normalnym, i pobierana z wysyłanej monety. Błędny format adresu lub cyfra kontrolna powoduje odrzucenie; adres o poprawnym formacie, którego nikt nie używa, oznacza utratę wysłanych monet.¶Handel: PSC to skrót od Probably Stolen Coin, monety wydobywanej przez karty graficzne i koparki. Zakupy opłaca się w monecie kwotowanej, sprzedaż – w monecie bazowej.¶Strona handlu Web3 pozwala wymienić dowolne dwie monety, zawsze przez CRC: gdy CRC jest po jednej stronie, używana jest jedna pula, w przeciwnym razie dwie, z dwiema opłatami i sumującym się poślizgiem; podgląd pokazuje otrzymaną ilość, liczbę pul i stratę.§Portfele sprzętowe: monety w łańcuchu znajdują się w portfelach sprzętowych PLEDGER, a każdy z nich ma własne saldo i poziom skażenia. Portfel jest przedmiotem: przeciągnij go na terminal handlowy, aby go załadować. Otwórz go na stronie Portfele w terminalu; połącz i odłącz w prawym górnym rogu terminala. Handel na stronie Web3 oraz sklep i mikser na stronie Szara sieć korzystają z połączonego portfela; bez portfela lub bez połączenia są tylko do odczytu, a wszystkie salda wynoszą 0. Klienci płacący monetami płacą na połączony portfel.¶Płatności (sklep, mikser, kantor Ponero, opłaty za wystawienie) zaczynają się od rachunku w terminalu; wpisz adres odbiorcy w portfelu i przytrzymaj ✓, aby podpisać. Dwa ostatnie znaki adresu to suma kontrolna, więc pomyłka o jeden znak jest zwykle wychwytywana; sporadycznie zdarza się, że okazuje się poprawny i monety trafiają pod adres, z którego nikt nie korzysta. Wymiany na DEX również wymagają podpisu na portfelu.¶Poinbase to konto powiernicze; wpłaty wysyła się z portfela na adres wpłat Poinbase (przyjmowane są PSC, CRC, CRT, CRA i SPARK), a wypłaty zleca się na stronie Środki w Poinbase. Eksplorator na stronie Portfele pozwala sprawdzać przelewy według adresu i pokazuje wyłącznie przelewy, które faktycznie miały miejsce (twoje portfele, wypłaty, zyski koparek). Więcej portfeli sprzętowych sprzedaje Dr Jackson; przeciągnij portfel na terminal handlowy, aby go dodać – maksymalnie do {WalletMax}. W sklepie dostępne są tańsze. Niepotrzebny portfel można zniszczyć na stronie Portfele; jego monety przepadają na zawsze, podobnie jak wszystko, co zostanie później wysłane na jego adres.¶Przelewy wymagają opłaty gas: wolnej, normalnej lub szybkiej, a ceny gasu rosną i spadają w cyklu około tygodnia; gdy sieć jest przeciążona, opłaty gas rosną, a powolne transakcje mogą zostać usunięte z mempoola. Przed wysłaniem sprawdź pełny adres.§Staking: CRA ulokowane w puli Rewolucji przynosi dzienny zysk według stawki dziennej, doliczany do wkładu; wypłata wymaga wcześniejszego złożenia wniosku i odczekania czterech dni, bez naliczania odsetek w okresie oczekiwania i bez możliwości wcześniejszego odbioru. CRA jest częściowo zabezpieczone: każde CRA wspierają rezerwa CRC należąca do Rewolucji oraz token równoważący SPARK; pokrycie rezerwy i stopa zabezpieczenia widnieją na stronie stakingu. Odsetki wypłacane są w nowych, niezabezpieczonych CRA, co rozwadnia pokrycie rezerwy, tym szybciej, im więcej w stakingu; przy zbyt niskim pokryciu Rewolucja obniża stawkę. Rewolucja czasem sięga po rezerwę, a wcześniej krążą pogłoski: to zapowiedź. Jeśli potem pokrycie spadnie poniżej {CraCrashRatio:%}, następuje krach: CRA staje się bezwartościowe w ciągu trzech dni, a cztery dni na odblokowanie to za wolno; powyżej tego progu jest tylko dyskonto, a środki z grabieży elit stopniowo odbudowują rezerwę.¶Oficjalne wybijanie: wpłać CRC i SPARK (proporcja według bieżącej stopy zabezpieczenia, podgląd pokazuje wymagane ilości), aby wybić CRA, w kolejce {CraMintDaysMin}–{CraMintDaysMax} dni; wybite CRA trafia od razu do stakingu. Spalanie zamienia CRA z powrotem na CRC i SPARK, z oczekiwaniem tak długim jak odblokowanie; gdy rezerwy brakuje, udział CRC jest zmniejszany według pokrycia. Oczekujące wybijanie i spalanie Rewolucja może w całości nie zrealizować: nocne prawdopodobieństwo to wartość, o jaką cena CRA jest poniżej 1, razy {CraRugPerDepeg}; jeśli cena nie jest poniżej 1, nic się nie dzieje.¶Do stakingu można wpłacać CRA, CRC, CRT i SPARK: ostatnie trzy są najpierw wymieniane na CRA na rynku wtóLine truncated
|
||||
guide.web3.text,"Bank i handel: strona banku jest tylko do odczytu i pokazuje gotówkę, czynsz oraz CRC na koncie Poinbase. Strona Środki w Poinbase obsługuje wpłaty i wypłaty; najpierw wybiera się monetę: CRC może iść przez konto bankowe lub portfel, pozostałe monety tylko przez portfel. Wpłata z banku zamienia kredyty na CRC na koncie Poinbase; wypłata do banku zamienia CRC z powrotem na kredyty i podlega kontroli zgodności, sprawdzającej skażenie konta Poinbase. Wypłata do portfela wymaga podania adresu odbiorcy i kilku potwierdzeń do zaksięgowania; opłata gas jest stała, na poziomie normalnym, i pobierana z wysyłanej monety. Błędny format adresu lub cyfra kontrolna powoduje odrzucenie; adres o poprawnym formacie, którego nikt nie używa, oznacza utratę wysłanych monet.¶Handel: PSC to skrót od Probably Stolen Coin, monety wydobywanej przez karty graficzne i koparki. Zakupy opłaca się w monecie kwotowanej, sprzedaż – w monecie bazowej.¶Strona handlu Web3 pozwala wymienić dowolne dwie monety, zawsze przez CRC: gdy CRC jest po jednej stronie, używana jest jedna pula, w przeciwnym razie dwie, z dwiema opłatami i sumującym się poślizgiem; podgląd pokazuje otrzymaną ilość, liczbę pul i stratę.§Portfele sprzętowe: monety w łańcuchu znajdują się w portfelach sprzętowych PLEDGER, a każdy z nich ma własne saldo i poziom skażenia. Portfel jest przedmiotem: przeciągnij go na terminal handlowy, aby go załadować. Otwórz go na stronie Portfele w terminalu; połącz i odłącz w prawym górnym rogu terminala. Handel na stronie Web3 oraz sklep i mikser na stronie Szara sieć korzystają z połączonego portfela; bez portfela lub bez połączenia są tylko do odczytu, a wszystkie salda wynoszą 0. Klienci płacący monetami płacą na połączony portfel.¶Płatności (sklep, mikser, kantor Ponero, opłaty za wystawienie) zaczynają się od rachunku w terminalu; wpisz adres odbiorcy w portfelu i przytrzymaj ✓, aby podpisać. Dwa ostatnie znaki adresu to suma kontrolna, więc pomyłka o jeden znak jest zwykle wychwytywana; sporadycznie zdarza się, że okazuje się poprawny i monety trafiają pod adres, z którego nikt nie korzysta. Wymiany na DEX również wymagają podpisu na portfelu.¶Poinbase to konto powiernicze; wpłaty wysyła się z portfela na adres wpłat Poinbase (przyjmowane są PSC, CRC, CRT, CRA i SPARK), a wypłaty zleca się na stronie Środki w Poinbase. Eksplorator na stronie Portfele pozwala sprawdzać przelewy według adresu i pokazuje wyłącznie przelewy, które faktycznie miały miejsce (twoje portfele, wypłaty, zyski koparek). Więcej portfeli sprzętowych sprzedaje Dr Jackson; przeciągnij portfel na terminal handlowy, aby go dodać – maksymalnie do {WalletMax}. W sklepie dostępne są tańsze. Niepotrzebny portfel można zniszczyć na stronie Portfele; jego monety przepadają na zawsze, podobnie jak wszystko, co zostanie później wysłane na jego adres.¶Przelewy wymagają opłaty gas: wolnej, normalnej lub szybkiej, a ceny gasu rosną i spadają w cyklu około tygodnia; gdy sieć jest przeciążona, opłaty gas rosną, a powolne transakcje mogą zostać usunięte z mempoola. Przed wysłaniem sprawdź pełny adres.§Staking: CRA ulokowane w puli Rewolucji przynosi dzienny zysk według stawki dziennej, doliczany do wkładu; wypłata wymaga wcześniejszego złożenia wniosku i odczekania czterech dni, bez naliczania odsetek w okresie oczekiwania i bez możliwości wcześniejszego odbioru. CRA jest częściowo zabezpieczone: każde CRA wspierają rezerwa CRC należąca do Rewolucji oraz token równoważący SPARK; pokrycie rezerwy i stopa zabezpieczenia widnieją na stronie stakingu. Odsetki wypłacane są w nowych, niezabezpieczonych CRA, co rozwadnia pokrycie rezerwy, tym szybciej, im więcej w stakingu; przy zbyt niskim pokryciu Rewolucja obniża stawkę. Rewolucja czasem sięga po rezerwę, a wcześniej krążą pogłoski: to zapowiedź. Jeśli potem pokrycie spadnie poniżej {CraCrashRatio:%}, następuje krach: CRA staje się bezwartościowe w ciągu trzech dni, a cztery dni na odblokowanie to za wolno; powyżej tego progu jest tylko dyskonto, a środki z grabieży elit stopniowo odbudowują rezerwę.¶Oficjalne wybijanie: wpłać CRC i SPARK (proporcja według bieżącej stopy zabezpieczenia, podgląd pokazuje wymagane ilości), aby wybić CRA, w kolejce {CraMintDaysMin}–{CraMintDaysMax} dni; wybite CRA trafia od razu do stakingu. Spalanie zamienia CRA z powrotem na CRC i SPARK, z oczekiwaniem tak długim jak odblokowanie; gdy rezerwy brakuje, udział CRC jest zmniejszany według pokrycia. Oczekujące wybijanie i spalanie Rewolucja może w całości nie zrealizować: nocne prawdopodobieństwo to wartość, o jaką cena CRA jest poniżej 1, razy {CraRugPerDepeg}; jeśli cena nie jest poniżej 1, nic się nie dzieje.¶Do stakingu można wpłacać CRA, CRC, CRT i SPARK: ostatnie trzy są najpierw wymieniane na CRA na rynku wtóLine truncated
|
||||
courier.odd1,...Paczka dotarła.
|
||||
courier.odd2,(Trzyma rękę w kieszeni.) Podpisz tutaj.
|
||||
courier.sign,Podpisz
|
||||
@@ -271,17 +271,11 @@ nightlog.bm.sale_rug,Czarny Rynek: platforma zrobiła rug pull; twoje {0} i wyp
|
||||
black.sub.sell,Sprzedaż
|
||||
black.sell.h,Sprzedaż
|
||||
black.sell.mult,Mnożnik ceny
|
||||
black.sell.list,Wystaw
|
||||
black.sell.mult,Mnożnik ceny
|
||||
black.sell.days,{0} d
|
||||
black.sell.none,Brak przedmiotów na sprzedaż w magazynie.
|
||||
black.sell.listed,Wystawiono: {0} za {1}.
|
||||
black.sell.delist,Wycofaj
|
||||
black.sell.rating,Ocena {0}%
|
||||
black.mine.sales,Moje oferty
|
||||
black.mine.sale,{0} ref {1} cena {2} (x{3}): {4}
|
||||
black.sale.Listed,wystawiono
|
||||
black.sale.Sold,"sprzedano, wypłata: dzień {0}"
|
||||
black.sale.Paid,wypłacono
|
||||
black.sale.Lost,"rug pull platformy, przepadło"
|
||||
black.sale.Delisted,wycofano
|
||||
@@ -294,10 +288,7 @@ merchant.Docs,Karty dostępu i chipy
|
||||
merchant.Pharma,Farmaceutyki
|
||||
merchant.Bulk,Towary masowe
|
||||
black.days,Dostawa: {0} d.
|
||||
black.sell.all,Wystaw wszystko
|
||||
black.sell.listedall,Wystawiono: {0} szt.
|
||||
black.sell.slots,Wystawiono {0}/{1}
|
||||
black.sell.full,Maksymalna liczba ofert naraz: {0}.
|
||||
merchant.Rigs,Koparki i zasilanie
|
||||
merchant.Modules,Moduły
|
||||
merchant.GunMods,Części rusznikarskie
|
||||
@@ -318,16 +309,7 @@ black.pay.to,Adres odbiorcy: {0}
|
||||
black.pay.cancel,Unieważnij
|
||||
pay.mix,Mikser {0} {1}
|
||||
pay.swap,Kantor Ponero {0} {1}
|
||||
pay.listfee," (opłata za wystawienie x{0})"
|
||||
pay.repricefee," (opłata za zmianę ceny x{0})"
|
||||
black.sell.repriced,"Zmieniono cenę: {0}, teraz {1}."
|
||||
black.edit.ref,Cena referencyjna {0}
|
||||
black.edit.input,Wpisz cenę
|
||||
black.edit.price,Cena {0} (x{1})
|
||||
black.edit.ok,OK
|
||||
black.edit.cancel,Anuluj
|
||||
black.edit.range,"Cena musi wynosić od 0,6 do 1,8 ceny referencyjnej ({0} do {1})."
|
||||
black.sell.reprice,Zmień cenę
|
||||
merchant.Platform,Platforma
|
||||
black.platform.line,Spot platformy natychmiastowa dostawa
|
||||
black.orders.in,Kupione
|
||||
@@ -945,3 +927,23 @@ entry.mining.l1,Stan koparek i nocne zyski
|
||||
entry.gray.l1,Mikser i sklep
|
||||
entry.wallets.l1,Portfele sprzętowe i eksplorator
|
||||
entry.wallets.l2,Portfele {0} / {1}
|
||||
black.sell.add,Dodaj oferty
|
||||
black.sell.back,Wróć do witryny
|
||||
black.sell.kinds,Wystawiono {0}/{1} rodzajów
|
||||
black.sell.have,Wystawiono: {0}
|
||||
black.sell.coins,Akceptowane monety
|
||||
black.sell.off,Zdejmij
|
||||
black.sell.off.n,Zdejmij ×{0}
|
||||
black.sell.nocoin,Przyjmuj co najmniej jedną monetę.
|
||||
black.sell.empty,Brak wystawionych towarów.
|
||||
black.sell.delisted,Zdjęto {0}; towar wrócił do magazynu.
|
||||
black.sell.partial,"Wystawiono {0}, nie udało się wystawić {1}."
|
||||
black.sell.limit.stack,Maksymalnie {0} sztuk każdego towaru.
|
||||
black.sell.limit.kinds,Jednocześnie można wystawić maksymalnie {0} rodzajów.
|
||||
shelf.fab,Półka {0}
|
||||
delist.fab,Potwierdź zdjęcie {0}
|
||||
black.fee.h,Gotowe do wystawienia
|
||||
black.fee.line,{0} ×{1} · cena {2} ({3})
|
||||
black.fee.total,Opłata za wystawienie {0}
|
||||
black.fee.sum,Opłata za wystawienie ({0} szt.)
|
||||
black.sale.Sold,"sprzedane, wypłata w dniu {0} w {1}"
|
||||
@@ -247,7 +247,7 @@ black.kind.Contraband.3,Контрабанда (высок.)
|
||||
black.kind.Tech,Высокие технологии (наценка)
|
||||
nightlog.bm.ready,Чёрный рынок: доставлен товар «{0}»; курьер заглянет после открытия.
|
||||
guide.web3.title,Руководство по Web3
|
||||
guide.web3.text,"Банк и торговля: страница банка только для чтения и показывает наличные, аренду и CRC на счёте Poinbase. Страница «Средства» в Poinbase отвечает за ввод и вывод; сначала выбирается монета: CRC можно через банковский счёт или кошелёк, остальные монеты только через кошелёк. Депозит из банка конвертирует кредиты в CRC на счёте Poinbase; вывод в банк меняет CRC обратно на кредиты и проходит проверку соответствия, оценивающую загрязнение счёта Poinbase. Вывод на кошелёк требует адрес получателя и нескольких подтверждений до зачисления; комиссия за газ фиксирована на обычном уровне и списывается с отправляемой монеты. Неверный формат адреса или контрольная цифра приводят к отказу; адрес с верным форматом, которым никто не пользуется, означает потерю отправленных монет.¶Торговля: PSC означает Probably Stolen Coin — это монета, которую добывают видеокарты и асик-майнеры. Покупка оплачивается в котируемой монете (вводится её сумма), продажа — в торгуемой монете.¶На торговой странице Web3 можно обменять любые две монеты, всегда через CRC: если CRC с одной стороны, используется один пул, иначе два пула, две комиссии и суммирующееся проскальзывание; предпросмотр показывает получаемое количество, число пулов и потери.§Аппаратные кошельки: ончейн-монеты хранятся на аппаратных кошельках PLEDGER, баланс и загрязнение у каждого свои. Кошелёк — это предмет: перетащите его на торговый терминал, чтобы загрузить. Открывайте его на странице «Кошельки» терминала; подключайте и отключайте в правом верхнем углу терминала. Торговля на странице Web3, магазин и миксер на странице «Серая сеть» используют подключённый кошелёк; без кошелька или без подключения они доступны только для просмотра, а все балансы равны 0. Покупатели, платящие монетами, платят на подключённый кошелёк.¶Платежи (магазин, миксер, пункт обмена Ponero, комиссия за размещение) начинаются со счёта на терминале; введите адрес получателя на кошельке и удерживайте ✓, чтобы подписать. Последние два символа адреса — контрольная сумма, поэтому опечатка в один символ обычно отсекается; изредка адрес случайно оказывается валидным, и монеты уходят на адрес, которым никто не пользуется. Для обмена на DEX также требуется подпись на кошельке.¶Poinbase — кастодиальный аккаунт; депозит отправляется с кошелька на адрес депозита Poinbase (принимаются PSC, CRC, CRT, CRA и SPARK), вывод запускается на странице «Средства» в Poinbase. «Обозреватель» на странице «Кошельки» позволяет искать переводы по адресу и показывает только реально произошедшие переводы (ваши кошельки, выводы, доход майнеров). Дополнительные аппаратные кошельки продаёт Доктор Джексон; перетащите кошелёк на торговый терминал, чтобы добавить его (до {WalletMax}). В магазине есть варианты подешевле. Ненужный кошелёк можно уничтожить на странице «КошелькиLine truncated
|
||||
guide.web3.text,"Банк и торговля: страница банка только для чтения и показывает наличные, аренду и CRC на счёте Poinbase. Страница «Средства» в Poinbase отвечает за ввод и вывод; сначала выбирается монета: CRC можно через банковский счёт или кошелёк, остальные монеты только через кошелёк. Депозит из банка конвертирует кредиты в CRC на счёте Poinbase; вывод в банк меняет CRC обратно на кредиты и проходит проверку соответствия, оценивающую загрязнение счёта Poinbase. Вывод на кошелёк требует адрес получателя и нескольких подтверждений до зачисления; комиссия за газ фиксирована на обычном уровне и списывается с отправляемой монеты. Неверный формат адреса или контрольная цифра приводят к отказу; адрес с верным форматом, которым никто не пользуется, означает потерю отправленных монет.¶Торговля: PSC означает Probably Stolen Coin — это монета, которую добывают видеокарты и асик-майнеры. Покупка оплачивается в котируемой монете (вводится её сумма), продажа — в торгуемой монете.¶На торговой странице Web3 можно обменять любые две монеты, всегда через CRC: если CRC с одной стороны, используется один пул, иначе два пула, две комиссии и суммирующееся проскальзывание; предпросмотр показывает получаемое количество, число пулов и потери.§Аппаратные кошельки: ончейн-монеты хранятся на аппаратных кошельках PLEDGER, баланс и загрязнение у каждого свои. Кошелёк — это предмет: перетащите его на торговый терминал, чтобы загрузить. Открывайте его на странице «Кошельки» терминала; подключайте и отключайте в правом верхнем углу терминала. Торговля на странице Web3, магазин и миксер на странице «Серая сеть» используют подключённый кошелёк; без кошелька или без подключения они доступны только для просмотра, а все балансы равны 0. Покупатели, платящие монетами, платят на подключённый кошелёк.¶Платежи (магазин, миксер, пункт обмена Ponero, комиссия за размещение) начинаются со счёта на терминале; введите адрес получателя на кошельке и удерживайте ✓, чтобы подписать. Последние два символа адреса — контрольная сумма, поэтому опечатка в один символ обычно отсекается; изредка адрес случайно оказывается валидным, и монеты уходят на адрес, которым никто не пользуется. Для обмена на DEX также требуется подпись на кошельке.¶Poinbase — кастодиальный аккаунт; депозит отправляется с кошелька на адрес депозита Poinbase (принимаются PSC, CRC, CRT, CRA и SPARK), вывод запускается на странице «Средства» в Poinbase. «Обозреватель» на странице «Кошельки» позволяет искать переводы по адресу и показывает только реально произошедшие переводы (ваши кошельки, выводы, доход майнеров). Дополнительные аппаратные кошельки продаёт Доктор Джексон; перетащите кошелёк на торговый терминал, чтобы добавить его (до {WalletMax}). В магазине есть варианты подешевле. Ненужный кошелёк можно уничтожить на странице «КошелькиLine truncated
|
||||
courier.odd1,...Посылка пришла.
|
||||
courier.odd2,(Его рука остаётся в кармане.) Подпиши здесь.
|
||||
courier.sign,Подписать
|
||||
@@ -271,17 +271,11 @@ nightlog.bm.sale_rug,Чёрный рынок: платформа соверши
|
||||
black.sub.sell,Продажа
|
||||
black.sell.h,Продажа
|
||||
black.sell.mult,Множитель цены
|
||||
black.sell.list,Выставить
|
||||
black.sell.mult,Множитель цены
|
||||
black.sell.days,{0} дн.
|
||||
black.sell.none,На складе нет подходящих для продажи предметов.
|
||||
black.sell.listed,Выставлено: {0} за {1}.
|
||||
black.sell.delist,Снять
|
||||
black.sell.rating,Рейтинг: {0}%
|
||||
black.mine.sales,Мои лоты
|
||||
black.mine.sale,{0} справ. {1} цена {2} (x{3}): {4}
|
||||
black.sale.Listed,в продаже
|
||||
black.sale.Sold,"продано, выплата: день {0}"
|
||||
black.sale.Paid,выплачено
|
||||
black.sale.Lost,"рагпул платформы, пропало"
|
||||
black.sale.Delisted,снято
|
||||
@@ -294,10 +288,7 @@ merchant.Docs,Ключ-карты и чипы
|
||||
merchant.Pharma,Фарма
|
||||
merchant.Bulk,Опт
|
||||
black.days,Доставка: {0} дн.
|
||||
black.sell.all,Выставить всё
|
||||
black.sell.listedall,Выставлено: {0} шт.
|
||||
black.sell.slots,Выставлено: {0}/{1}
|
||||
black.sell.full,Максимум активных лотов: {0}.
|
||||
merchant.Rigs,Фермы и питание
|
||||
merchant.Modules,Модули
|
||||
merchant.GunMods,Оружейные детали
|
||||
@@ -318,16 +309,7 @@ black.pay.to,Адрес получателя: {0}
|
||||
black.pay.cancel,Аннулировать
|
||||
pay.mix,Миксер {0} {1}
|
||||
pay.swap,Пункт обмена Ponero {0} {1}
|
||||
pay.listfee," (комиссия за размещение x{0})"
|
||||
pay.repricefee," (комиссия за смену цены x{0})"
|
||||
black.sell.repriced,"Цена изменена: {0}, теперь {1}."
|
||||
black.edit.ref,Справочная цена {0}
|
||||
black.edit.input,Введите цену
|
||||
black.edit.price,Цена {0} (x{1})
|
||||
black.edit.ok,ОК
|
||||
black.edit.cancel,Отмена
|
||||
black.edit.range,"Цена должна быть в пределах от 0,6 до 1,8 справочной цены (от {0} до {1})."
|
||||
black.sell.reprice,Изменить цену
|
||||
merchant.Platform,Платформа
|
||||
black.platform.line,Спот платформы мгновенная доставка
|
||||
black.orders.in,Покупки
|
||||
@@ -945,3 +927,23 @@ entry.mining.l1,Состояние ферм и ночной доход
|
||||
entry.gray.l1,Миксер и магазин
|
||||
entry.wallets.l1,Аппаратные кошельки и обозреватель
|
||||
entry.wallets.l2,Кошельки {0} / {1}
|
||||
black.sell.add,Добавить товары
|
||||
black.sell.back,Назад к витрине
|
||||
black.sell.kinds,Выставлено {0}/{1} видов
|
||||
black.sell.have,Выставлено: {0}
|
||||
black.sell.coins,Принимаемые монеты
|
||||
black.sell.off,Снять
|
||||
black.sell.off.n,Снять ×{0}
|
||||
black.sell.nocoin,Нужно принимать хотя бы одну монету.
|
||||
black.sell.empty,Ничего не выставлено.
|
||||
black.sell.delisted,Снято: {0}; товар вернулся на склад.
|
||||
black.sell.partial,"Выставлено: {0}, не удалось выставить: {1}."
|
||||
black.sell.limit.stack,Не более {0} единиц каждого товара.
|
||||
black.sell.limit.kinds,Одновременно можно выставить не более {0} видов.
|
||||
shelf.fab,Полка {0}
|
||||
delist.fab,Подтвердить снятие {0}
|
||||
black.fee.h,Готово к выставлению
|
||||
black.fee.line,{0} ×{1} · цена {2} ({3})
|
||||
black.fee.total,Комиссия за размещение {0}
|
||||
black.fee.sum,Комиссия за размещение ({0} шт.)
|
||||
black.sale.Sold,"продано, выплата на день {0} в {1}"
|
||||
@@ -246,7 +246,7 @@ black.kind.Contraband.3,违禁品(高)
|
||||
black.kind.Tech,高科技物品(加价)
|
||||
nightlog.bm.ready,商店:{0} 到货,开店后会有快递员上门。
|
||||
guide.web3.title,Web3 手册
|
||||
guide.web3.text,"银行与交易:银行页只读,显示现金、房租和 Poinbase 账户里的 CRC。Poinbase 的资金页管入金和出金,先选币种:CRC 可以走银行账户或钱包,其他币只能走钱包。从银行入金把信用点换成 Poinbase 账户里的 CRC;出金到银行把 CRC 换回信用点,要过合规审查,审查看 Poinbase 账户的污点。出金到钱包要填收款地址,等几次确认才到账,Gas 费固定按普通档、从转出的币里扣;地址格式或校验位不对会被拒绝,格式对但没人用的地址,币转过去就没了。¶交易:PSC 全称 Probably Stolen Coin,是显卡和矿机挖出的币。买入按计价币的数量支付,卖出按所交易币的数量卖出。¶Web3 交易页可以任选两种币互换,实际都经 CRC 中转:CRC 在一端走一个池,否则走两个池,付两次手续费、滑点叠加,预览里会显示得到的数量、经过的池数和损耗。§硬件钱包:链上的币放在 PLEDGER 硬件钱包里,每个钱包的余额和污点分别计算。钱包是一件物品,拖到交易终端上加载;在终端的钱包页打开,在终端右上角连接或断开。Web3 页的交易和灰网页的商店、混币器用已连接的钱包,没有钱包或没有连接时只能看,余额都是 0;用币付款的顾客也进已连接的钱包。¶付款(商店、混币器、Ponero 兑换处、上架费)先在终端开账单,再在钱包里手输收款地址、按住 ✓ 签名;地址末尾两位是校验位,输错一位多半会被拦下,偶尔碰巧合法,币就转进了没人用的地址。DEX 兑换也要在钱包上签名。¶Poinbase 是托管账户,入金要从钱包转到它的充值地址(PSC、CRC、CRT、CRA、SPARK 都收),出金在 Poinbase 的资金页发起。钱包页的浏览器可以按地址查转账记录,只显示真实发生的转账(你的钱包、出金、矿机收益)。更多硬件钱包向杰克逊博士购买,拖到交易终端上添加,最多 {WalletMax} 个;商店里也有更便宜的。不要的钱包可以在钱包页销毁,里面的币永久丢失,之后发到这个地址的币也丢了。¶转账要付 Gas 费,分慢、普通、快三档,Gas 价格大约一周一个起落;网络拥堵时 Gas 费变贵,慢档可能被挤出内存池。转账前核对完整地址。§质押:把 CRA 质押进革命军质押池每天有日息,利息并入本金;取出要先申请,等四天才到账,等待期间没有利息,也不能提前拿。CRA 是部分抵押的:每份 CRA 由革命军持有的 CRC 储备和平衡代币 SPARK 共同支撑,储备覆盖率和抵押率显示在质押页。质押利息以没有抵押的新 CRA 付出,会稀释储备覆盖率,质押的人越多稀释越快;覆盖率太低革命军会降息。革命军有时会挪用储备,先有风声,那是预兆;挪用后覆盖率跌破 {CraCrashRatio:%} 就崩盘:三天内 CRA 归零,四天的解锁期来不及;没跌破只是折价,劫掠上层带来的资金会慢慢把储备补回来。¶官方铸造:存入 CRC 和 SPARK(比例按当前抵押率,界面预览需要多少)铸造 CRA,排 {CraMintDaysMin}~{CraMintDaysMax} 天,铸出的 CRA 直接进质押;销毁把 CRA 换回 CRC 和 SPARK,等待和解锁期一样长,储备不足时 CRC 份额按覆盖率打折。排队的铸造和销毁,官方可能整笔不兑现:每晚的概率是 CRA 价格低于 1 的幅度乘以 {CraRugPerDepeg},价格不低于 1 就不会。¶质押可以存 CRA、CRC、CRT、SPARK:后三种先在二级市场按市价换成 CRA(经 CRC 中转,付手续费和滑点)再质押。SPARK 价格波动很大,崩盘时会跟着暴跌。质押、铸造、销毁都是合约调用,要在钱包上签名。§矿机:RatDigg 矿机(M1 / M2 / M3)是独立的机器,算力比显卡大得多、耗电更省,要放电池才挖,可以放模块,不占矿架槽位;只在商店的矿机商那里有,要黑市声望(M1 {AsicRepM1}、M2 {AsicRepM2}、M3 {AsicRepM3}),偶尔有二手的。烧毁后须按顺序把电子元件拖到它身上修复,修复后健康降低 {AsicRepairHealthCut}。第 {EraMin} 到 {EraMax} 天之间会有一次""矿机时代"",提前几天上报纸预告,之后大矿场的耗电成本砍半,全网算力涨上去,显卡矿工的收益被摊薄,低档显卡几乎不赚钱,矿机受影响较小。¶收款地址:每台矿机(矿架和 ASIC 矿机)在自己的窗口里设置收款地址,挖矿产出每晚按算力占比发到这个地址,两台矿机可以发给两个地址。默认没设置,没设置或地址对应的钱包已销毁,这一份产出就丢了;换了钱包要记得改地址。§永续合约:Poinbase 的""永续""页,用账户里的 CRC 当保证金,PSC 最高 {PerpPscLev} 倍、SPARK 最高 {PerpSparkLev} 倍,只支持逐仓,同一时间只有一Line truncated
|
||||
guide.web3.text,"银行与交易:银行页只读,显示现金、房租和 Poinbase 账户里的 CRC。Poinbase 的资金页管入金和出金,先选币种:CRC 可以走银行账户或钱包,其他币只能走钱包。从银行入金把信用点换成 Poinbase 账户里的 CRC;出金到银行把 CRC 换回信用点,要过合规审查,审查看 Poinbase 账户的污点。出金到钱包要填收款地址,等几次确认才到账,Gas 费固定按普通档、从转出的币里扣;地址格式或校验位不对会被拒绝,格式对但没人用的地址,币转过去就没了。¶交易:PSC 全称 Probably Stolen Coin,是显卡和矿机挖出的币。买入按计价币的数量支付,卖出按所交易币的数量卖出。¶Web3 交易页可以任选两种币互换,实际都经 CRC 中转:CRC 在一端走一个池,否则走两个池,付两次手续费、滑点叠加,预览里会显示得到的数量、经过的池数和损耗。§硬件钱包:链上的币放在 PLEDGER 硬件钱包里,每个钱包的余额和污点分别计算。钱包是一件物品,拖到交易终端上加载;在终端的钱包页打开,在终端右上角连接或断开。Web3 页的交易和灰网页的商店、混币器用已连接的钱包,没有钱包或没有连接时只能看,余额都是 0;用币付款的顾客也进已连接的钱包。¶付款(商店、混币器、Ponero 兑换处、上架费)先在终端开账单,再在钱包里手输收款地址、按住 ✓ 签名;地址末尾两位是校验位,输错一位多半会被拦下,偶尔碰巧合法,币就转进了没人用的地址。DEX 兑换也要在钱包上签名。¶Poinbase 是托管账户,入金要从钱包转到它的充值地址(PSC、CRC、CRT、CRA、SPARK 都收),出金在 Poinbase 的资金页发起。钱包页的浏览器可以按地址查转账记录,只显示真实发生的转账(你的钱包、出金、矿机收益)。更多硬件钱包向杰克逊博士购买,拖到交易终端上添加,最多 {WalletMax} 个;商店里也有更便宜的。不要的钱包可以在钱包页销毁,里面的币永久丢失,之后发到这个地址的币也丢了。¶转账要付 Gas 费,分慢、普通、快三档,Gas 价格大约一周一个起落;网络拥堵时 Gas 费变贵,慢档可能被挤出内存池。转账前核对完整地址。§质押:把 CRA 质押进革命军质押池每天有日息,利息并入本金;取出要先申请,等四天才到账,等待期间没有利息,也不能提前拿。CRA 是部分抵押的:每份 CRA 由革命军持有的 CRC 储备和平衡代币 SPARK 共同支撑,储备覆盖率和抵押率显示在质押页。质押利息以没有抵押的新 CRA 付出,会稀释储备覆盖率,质押的人越多稀释越快;覆盖率太低革命军会降息。革命军有时会挪用储备,先有风声,那是预兆;挪用后覆盖率跌破 {CraCrashRatio:%} 就崩盘:三天内 CRA 归零,四天的解锁期来不及;没跌破只是折价,劫掠上层带来的资金会慢慢把储备补回来。¶官方铸造:存入 CRC 和 SPARK(比例按当前抵押率,界面预览需要多少)铸造 CRA,排 {CraMintDaysMin}~{CraMintDaysMax} 天,铸出的 CRA 直接进质押;销毁把 CRA 换回 CRC 和 SPARK,等待和解锁期一样长,储备不足时 CRC 份额按覆盖率打折。排队的铸造和销毁,官方可能整笔不兑现:每晚的概率是 CRA 价格低于 1 的幅度乘以 {CraRugPerDepeg},价格不低于 1 就不会。¶质押可以存 CRA、CRC、CRT、SPARK:后三种先在二级市场按市价换成 CRA(经 CRC 中转,付手续费和滑点)再质押。SPARK 价格波动很大,崩盘时会跟着暴跌。质押、铸造、销毁都是合约调用,要在钱包上签名。§矿机:RatDigg 矿机(M1 / M2 / M3)是独立的机器,算力比显卡大得多、耗电更省,要放电池才挖,可以放模块,不占矿架槽位;只在商店的矿机商那里有,要黑市声望(M1 {AsicRepM1}、M2 {AsicRepM2}、M3 {AsicRepM3}),偶尔有二手的。烧毁后须按顺序把电子元件拖到它身上修复,修复后健康降低 {AsicRepairHealthCut}。第 {EraMin} 到 {EraMax} 天之间会有一次""矿机时代"",提前几天上报纸预告,之后大矿场的耗电成本砍半,全网算力涨上去,显卡矿工的收益被摊薄,低档显卡几乎不赚钱,矿机受影响较小。¶收款地址:每台矿机(矿架和 ASIC 矿机)在自己的窗口里设置收款地址,挖矿产出每晚按算力占比发到这个地址,两台矿机可以发给两个地址。默认没设置,没设置或地址对应的钱包已销毁,这一份产出就丢了;换了钱包要记得改地址。§永续合约:Poinbase 的""永续""页,用账户里的 CRC 当保证金,PSC 最高 {PerpPscLev} 倍、SPARK 最高 {PerpSparkLev} 倍,只支持逐仓,同一时间只有一Line truncated
|
||||
courier.odd1,……东西到了。
|
||||
courier.odd2,"(他的手一直放在口袋里)在这儿签个字。"
|
||||
courier.sign,签收
|
||||
@@ -270,17 +270,11 @@ nightlog.bm.sale_rug,商店:平台跑路,你的 {0} 和货款({1})没了
|
||||
black.sub.sell,卖货
|
||||
black.sell.h,出售
|
||||
black.sell.mult,"标价 ×{0}"
|
||||
black.sell.list,上架
|
||||
black.sell.mult,标价倍率
|
||||
black.sell.days,{0} 天
|
||||
black.sell.none,储藏区无符合上架条件的物品。
|
||||
black.sell.listed,"已上架:{0},标价 {1}。"
|
||||
black.sell.delist,撤下
|
||||
black.sell.rating,"好评 {0}%"
|
||||
black.mine.sales,我的上架
|
||||
black.mine.sale,"{0} 参考 {1} 标价 {2}(×{3}):{4}"
|
||||
black.sale.Listed,上架中
|
||||
black.sale.Sold,"已成交,第 {0} 天放款"
|
||||
black.sale.Paid,已到账
|
||||
black.sale.Lost,平台跑路,没了
|
||||
black.sale.Delisted,已撤下
|
||||
@@ -293,10 +287,7 @@ merchant.Docs,证件芯片
|
||||
merchant.Pharma,药物
|
||||
merchant.Bulk,大宗
|
||||
black.days,"{0} 天到货"
|
||||
black.sell.all,全部上架
|
||||
black.sell.listedall,"已上架 {0} 件。"
|
||||
black.sell.slots,"上架 {0}/{1}"
|
||||
black.sell.full,"最多同时上架 {0} 件。"
|
||||
merchant.Rigs,矿架与能源
|
||||
merchant.Modules,模组
|
||||
merchant.GunMods,枪匠配件
|
||||
@@ -317,16 +308,7 @@ black.pay.to,"收款地址:{0}"
|
||||
black.pay.cancel,作废
|
||||
pay.mix,"混币器 {0} {1}"
|
||||
pay.swap,"Ponero 兑换处 {0} {1}"
|
||||
pay.listfee,"(上架费 ×{0})"
|
||||
pay.repricefee,"(改价费 ×{0})"
|
||||
black.sell.repriced,"已改价:{0},标价 {1}。"
|
||||
black.edit.ref,"参考价 {0}"
|
||||
black.edit.input,输入标价
|
||||
black.edit.price,"标价 {0}(×{1})"
|
||||
black.edit.ok,确定
|
||||
black.edit.cancel,取消
|
||||
black.edit.range,标价须在参考价的 0.6 至 1.8 倍之间({0} 至 {1})。
|
||||
black.sell.reprice,改价
|
||||
merchant.Platform,平台
|
||||
black.platform.line,平台现货 立即到货
|
||||
black.orders.in,买入
|
||||
@@ -944,3 +926,23 @@ entry.mining.l1,矿机状态与夜间收益
|
||||
entry.gray.l1,混币器与商店
|
||||
entry.wallets.l1,硬件钱包与浏览器
|
||||
entry.wallets.l2,钱包 {0} / {1}
|
||||
black.sell.add,上架更多
|
||||
black.sell.back,返回橱窗
|
||||
black.sell.kinds,上架 {0}/{1} 种
|
||||
black.sell.have,上架 {0} 件
|
||||
black.sell.coins,收款币种
|
||||
black.sell.off,下架
|
||||
black.sell.off.n,下架 ×{0}
|
||||
black.sell.nocoin,至少接受一种币。
|
||||
black.sell.empty,暂无上架的货。
|
||||
black.sell.delisted,已下架 {0} 件,货已回到储藏区。
|
||||
black.sell.partial,已上架 {0} 件,{1} 件未能上架。
|
||||
black.sell.limit.stack,每种商品最多上架 {0} 件。
|
||||
black.sell.limit.kinds,最多同时上架 {0} 种。
|
||||
shelf.fab,货架 {0}
|
||||
delist.fab,确定下架 {0}
|
||||
black.fee.h,准备上架
|
||||
black.fee.line,{0} ×{1} 标价 {2}({3})
|
||||
black.fee.total,上架费 {0}
|
||||
black.fee.sum,上架费({0} 件)
|
||||
black.sale.Sold,已成交,第 {0} 天以 {1} 放款
|
||||
@@ -3,7 +3,7 @@
|
||||
<ID>probably_decentralized</ID>
|
||||
<Name>Probably Decentralized</Name>
|
||||
<Author>edward</Author>
|
||||
<ModVersion>1.0.0-rc7</ModVersion>
|
||||
<ModVersion>1.0.0-rc8</ModVersion>
|
||||
<Description>Mine PSC with graphics cards, trade it on a fictional exchange, and cash it out past the compliance desk. Work in progress. All coins, exchanges and events are fictional and have no real-world value.</Description>
|
||||
<GameVersions>
|
||||
<Version>0.46</Version>
|
||||
|
||||
@@ -197,6 +197,7 @@ namespace Decentralized
|
||||
if (Unlock.BlackUnlocked) BlackDelivery.Night(d, day, events.Contains(MarketEvent.Crackdown));
|
||||
d.Network.Availability = (events.Contains(MarketEvent.Blackout) ? 0.8 : 1) * (events.Contains(MarketEvent.LowerUnrest) ? 0.9 : 1);
|
||||
|
||||
d.Block += TxRules.BlocksPerDay(d.Rng);
|
||||
var units = Session.TonightCards.Select(c => (item: c.Key, unit: Items.ToUnit(c.Key), bonus: c.Value)).ToList();
|
||||
double hash = units.Sum(x => x.unit.Hash(x.bonus));
|
||||
double mined = d.Network.Mine(hash);
|
||||
|
||||
+275
-300
@@ -32,9 +32,6 @@ namespace Decentralized
|
||||
private enum Page { Home, Bank, Poinbase, Web3, Mining, Gray, Wallets }
|
||||
|
||||
private static Page _page = Page.Home;
|
||||
private sealed class EditPrice { public GameItem Item; public BmSale Sale; public string Id; public long Ref; }
|
||||
private static EditPrice _edit;
|
||||
private static string _editPrice = "";
|
||||
private static string _amount = "";
|
||||
private static string _message;
|
||||
|
||||
@@ -59,7 +56,7 @@ namespace Decentralized
|
||||
TabRows(b, Enum.GetValues(typeof(Page)).Cast<Page>().Where(p => p != Page.Gray || GrayAvailable).Select(p =>
|
||||
{
|
||||
var page = p;
|
||||
return new TabDef { Name = L.T("tab." + p.ToString().ToLowerInvariant()), On = page == _page, Click = () => { _page = page; _message = null; _edit = null; Open(); } };
|
||||
return new TabDef { Name = L.T("tab." + p.ToString().ToLowerInvariant()), On = page == _page, Click = () => { _page = page; _message = null; Open(); } };
|
||||
}).ToList(), true);
|
||||
ConnectPicker(b);
|
||||
b.AddSeparator();
|
||||
@@ -86,7 +83,7 @@ namespace Decentralized
|
||||
Log.Guard("购物车按钮", () => CartFab(win));
|
||||
}
|
||||
|
||||
private static void Go(Page p) { _page = p; _message = null; _edit = null; Open(); }
|
||||
private static void Go(Page p) { _page = p; _message = null; Open(); }
|
||||
|
||||
/// <summary>钱包那边交易落地后刷新终端(开着的话),带上结果消息。</summary>
|
||||
public static void Refresh(string message)
|
||||
@@ -1169,7 +1166,7 @@ namespace Decentralized
|
||||
private static void WalletsPage(CustomUIBuilder b)
|
||||
{
|
||||
var d = Session.Data;
|
||||
TabRows(b, Enum.GetValues(typeof(WalletTab)).Cast<WalletTab>().Select(t => { var tab = t; return new TabDef { Name = L.T("wallets.sub." + t.ToString().ToLowerInvariant()), On = tab == _walletTab, Click = () => { _walletTab = tab; _message = null; _edit = null; Open(); } }; }).ToList(), false);
|
||||
TabRows(b, Enum.GetValues(typeof(WalletTab)).Cast<WalletTab>().Select(t => { var tab = t; return new TabDef { Name = L.T("wallets.sub." + t.ToString().ToLowerInvariant()), On = tab == _walletTab, Click = () => { _walletTab = tab; _message = null; Open(); } }; }).ToList(), false);
|
||||
if (_walletTab == WalletTab.Explorer) { ExplorerPage(b); return; }
|
||||
b.AddLabel(L.T("wallets.count", d.Wallets.Count, Tuning.WalletMax), "wallets_count_dim");
|
||||
if (d.Wallets.Count == 0) { b.AddLabel(L.T("wallets.none"), "wallets_none_dim"); return; }
|
||||
@@ -1220,6 +1217,13 @@ namespace Decentralized
|
||||
b.End();
|
||||
b.End();
|
||||
}
|
||||
if (d.Connected)
|
||||
{
|
||||
// 选中的钱包:下面列出它持有的币和数量
|
||||
b.AddSeparator();
|
||||
b.AddHeader(L.T("web3.wallet.h") + " " + WalletWindow.NameOf(d.Hot));
|
||||
Holdings(b, d.Hot, a => true);
|
||||
}
|
||||
if (_renamePick != null) RenameRow(b);
|
||||
}
|
||||
|
||||
@@ -1329,7 +1333,7 @@ namespace Decentralized
|
||||
if (_grayTab == GrayTab.Mixer && !Unlock.MixerUnlocked) _grayTab = GrayTab.Black;
|
||||
if (_grayTab == GrayTab.Black && !Unlock.BlackUnlocked) _grayTab = GrayTab.Mixer;
|
||||
if (Unlock.MixerUnlocked && Unlock.BlackUnlocked)
|
||||
TabRows(b, Enum.GetValues(typeof(GrayTab)).Cast<GrayTab>().Select(t => { var tab = t; return new TabDef { Name = L.T("gray.sub." + t.ToString().ToLowerInvariant()), On = tab == _grayTab, Click = () => { _grayTab = tab; _message = null; _edit = null; Open(); } }; }).ToList(), false);
|
||||
TabRows(b, Enum.GetValues(typeof(GrayTab)).Cast<GrayTab>().Select(t => { var tab = t; return new TabDef { Name = L.T("gray.sub." + t.ToString().ToLowerInvariant()), On = tab == _grayTab, Click = () => { _grayTab = tab; _message = null; Open(); } }; }).ToList(), false);
|
||||
if (!Session.Data.Connected) b.AddLabel(L.T("web3.err.noconn"), "term_note");
|
||||
if (_grayTab == GrayTab.Mixer) MixerPage(b); else BlackPage(b);
|
||||
}
|
||||
@@ -1341,7 +1345,7 @@ namespace Decentralized
|
||||
if (_web3Tab == Web3Tab.Predict && !PredictGame.Available(StoreStation.GetDayCounter())) _web3Tab = Web3Tab.Trade;
|
||||
TabRows(b, Enum.GetValues(typeof(Web3Tab)).Cast<Web3Tab>()
|
||||
.Where(t => t != Web3Tab.Predict || PredictGame.Available(StoreStation.GetDayCounter()))
|
||||
.Select(t => { var tab = t; return new TabDef { Name = L.T("web3.sub." + t.ToString().ToLowerInvariant()), On = tab == _web3Tab, Click = () => { _web3Tab = tab; _message = null; _edit = null; Open(); } }; }).ToList(), false);
|
||||
.Select(t => { var tab = t; return new TabDef { Name = L.T("web3.sub." + t.ToString().ToLowerInvariant()), On = tab == _web3Tab, Click = () => { _web3Tab = tab; _message = null; Open(); } }; }).ToList(), false);
|
||||
if (!Session.Data.Connected) b.AddLabel(L.T("web3.err.noconn"), "term_note");
|
||||
if (_web3Tab == Web3Tab.Stake) { StakePage(b); return; }
|
||||
if (_web3Tab == Web3Tab.Predict) { PredictPage(b); return; }
|
||||
@@ -1481,13 +1485,11 @@ namespace Decentralized
|
||||
{
|
||||
var tab = t;
|
||||
string name = L.T("black.sub." + t.ToString().ToLowerInvariant());
|
||||
PledgerSkin.Pick(b, name, tab == _blackTab, () => { _blackTab = tab; _message = null; _edit = null; _pay = null; _checkout = false; Open(); }, _picked);
|
||||
PledgerSkin.Pick(b, name, tab == _blackTab, () => { _blackTab = tab; _message = null; _sellView = SellView.Showcase; _stage.Clear(); _delist.Clear(); _coinsOpen = false; _checkout = false; Open(); }, _picked);
|
||||
}
|
||||
b.End();
|
||||
if (d.Black.Closed(day)) { b.AddLabel(L.T("black.rugged", d.Black.ClosedUntil - day + 1), "black_rugged_note"); return; }
|
||||
if (_checkout) { CheckoutPage(b, d); return; }
|
||||
if (_pay != null && _blackTab != BlackTab.Buy) { PayPanel(b); return; }
|
||||
if (_edit != null) { EditPage(b); return; }
|
||||
if (_blackTab == BlackTab.Orders) { OrdersPage(b, day); return; }
|
||||
if (_blackTab == BlackTab.Sell) { SellPage(b, day); return; }
|
||||
BuyPage(b, d, rep);
|
||||
@@ -1545,142 +1547,142 @@ namespace Decentralized
|
||||
});
|
||||
}
|
||||
|
||||
// ——— 付款面板 ———
|
||||
|
||||
/// <summary>一次付款的草稿:买什么、收款地址、商家收哪些币、可选数量与付款方式、合计,以及付款成功后做的事。</summary>
|
||||
private sealed class PayDraft
|
||||
{
|
||||
public string Title, Address, Asset, SwapFrom;
|
||||
public string[] Accepted;
|
||||
public int MaxQty = 1, Qty = 1;
|
||||
public bool Modes;
|
||||
public PayMode Mode = PayMode.Escrow;
|
||||
public Func<int, PayMode, double> Credits;
|
||||
public Action<string, int, PayMode, Wallet> Execute;
|
||||
}
|
||||
|
||||
private static PayDraft _pay;
|
||||
|
||||
private static void OpenPay(PayDraft p)
|
||||
{
|
||||
var w = Session.Data.Hot;
|
||||
p.Asset = p.Accepted.FirstOrDefault(a => w.Avail(a) * Session.Price(a) >= p.Credits(1, p.Mode)) ?? p.Accepted[0];
|
||||
p.SwapFrom = null;
|
||||
_pay = p;
|
||||
_message = null;
|
||||
Open();
|
||||
}
|
||||
|
||||
private static string Summary(PayDraft p) => p.Title + (p.Qty > 1 ? " ×" + p.Qty : "");
|
||||
|
||||
/// <summary>付款面板:数量、付款方式、合计、付款币种(商家收的币)、生成账单;下面是自动换币。</summary>
|
||||
private static void PayPanel(CustomUIBuilder b)
|
||||
{
|
||||
var d = Session.Data;
|
||||
var w = d.Hot;
|
||||
var p = _pay;
|
||||
if (p.Qty > p.MaxQty) p.Qty = p.MaxQty;
|
||||
b.AddHeader(L.T("bpay.h"));
|
||||
b.AddLabel(p.Title, "bpay_title");
|
||||
if (p.MaxQty > 1)
|
||||
{
|
||||
b.BeginRow(4f);
|
||||
b.AddLabel(L.T("bpay.qty"));
|
||||
foreach (var q in Qtys)
|
||||
{
|
||||
if (q > p.MaxQty && q != Qtys[0]) continue;
|
||||
int qq = q;
|
||||
PledgerSkin.Pick(b, "×" + qq, qq == p.Qty, () => { p.Qty = qq; Open(); }, _picked);
|
||||
}
|
||||
b.End();
|
||||
}
|
||||
if (p.Modes)
|
||||
{
|
||||
b.BeginRow(4f);
|
||||
foreach (PayMode m in Enum.GetValues(typeof(PayMode)))
|
||||
{
|
||||
var mode = m;
|
||||
PledgerSkin.Pick(b, L.T("black.mode." + m), mode == p.Mode, () => { p.Mode = mode; Open(); }, _picked);
|
||||
}
|
||||
b.End();
|
||||
}
|
||||
double credits = p.Credits(p.Qty, p.Mode);
|
||||
b.AddLabel(L.T("bpay.total", Fmt.Credits(credits)), "bpay_total");
|
||||
b.AddSeparator();
|
||||
b.AddLabel(L.T("bpay.coin"), "bpay_coin_dim");
|
||||
b.BeginRow(4f);
|
||||
foreach (var a in p.Accepted)
|
||||
{
|
||||
string asset = a;
|
||||
PledgerSkin.Pick(b, asset, asset == p.Asset, () => { p.Asset = asset; Open(); }, _picked);
|
||||
}
|
||||
b.End();
|
||||
double need = WalletWindow.RoundUp(credits / Session.Price(p.Asset));
|
||||
b.AddLabel(L.T("bpay.need", WalletWindow.Amt(need), p.Asset, Fmt.Num(w.Avail(p.Asset))), "bpay_need_dim");
|
||||
b.AddButton(L.T("bpay.invoice"), () =>
|
||||
{
|
||||
string asset = p.Asset; int q = p.Qty; var mode = p.Mode;
|
||||
string summary = Summary(p);
|
||||
_pay = null;
|
||||
BeginPay(p.Address, summary, asset, credits, pw => p.Execute(asset, q, mode, pw));
|
||||
});
|
||||
b.AddSeparator();
|
||||
// 自动换币:从钱包里别的币里换出商家收的币,多付滑点;是合约调用,签名后一步完成
|
||||
b.AddLabel(L.T("bpay.swap.h", p.Asset), "bpay_swap_dim");
|
||||
double slipped = credits * (1 + Tuning.BmAutoSwapSlip);
|
||||
var sources = w.Balances.Keys.Where(a => !p.Accepted.Contains(a) && a != Assets.Ponero && Session.Price(a) > 0 && w.Avail(a) * Session.Price(a) >= slipped).ToList();
|
||||
if (sources.Count == 0) b.AddLabel(L.T("bpay.swap.none"), "bpay_swap_none_dim");
|
||||
else
|
||||
{
|
||||
if (p.SwapFrom == null || !sources.Contains(p.SwapFrom)) p.SwapFrom = sources[0];
|
||||
b.BeginRow(4f);
|
||||
foreach (var s in sources)
|
||||
{
|
||||
string src = s;
|
||||
PledgerSkin.Pick(b, src, src == p.SwapFrom, () => { p.SwapFrom = src; Open(); }, _picked);
|
||||
}
|
||||
b.End();
|
||||
double needSrc = WalletWindow.RoundUp(slipped / Session.Price(p.SwapFrom));
|
||||
b.AddLabel(L.T("bpay.swap.need", WalletWindow.Amt(needSrc), p.SwapFrom, (Tuning.BmAutoSwapSlip * 100).ToString("0", CultureInfo.InvariantCulture)), "bpay_swap_need_dim");
|
||||
b.AddButton(L.T("bpay.swap.btn"), () => SwapAndPay(p, credits, needSrc));
|
||||
}
|
||||
b.AddSpace(4f);
|
||||
b.AddButton(L.T("bpay.back"), () => { _pay = null; _message = null; Open(); });
|
||||
}
|
||||
|
||||
/// <summary>自动换币并付款:一次合约调用,先把别的币按滑点换成商家收的币,再下单。</summary>
|
||||
private static void SwapAndPay(PayDraft p, double credits, double needSrc)
|
||||
{
|
||||
var d = Session.Data;
|
||||
string src = p.SwapFrom, asset = p.Asset; int q = p.Qty; var mode = p.Mode;
|
||||
_pay = null;
|
||||
_message = L.T("hw.wait");
|
||||
Open();
|
||||
WalletWindow.OpenForBill(new WalletWindow.Bill
|
||||
{
|
||||
Contract = true, Asset = src, Amount = needSrc, Spend = needSrc,
|
||||
Summary = L.T("bpay.swap.sum", Summary(p), src, WalletWindow.Amt(needSrc), asset),
|
||||
Execute = pw =>
|
||||
{
|
||||
if (pw.Avail(src) + 1e-9 < needSrc) { _message = L.T("msg.balance"); Open(); return; }
|
||||
double got = credits / Session.Price(asset) * 1.002;
|
||||
pw.Add(src, -needSrc);
|
||||
pw.Add(asset, got);
|
||||
pw.RecordBuy(asset, got, credits);
|
||||
CandleChart.Trade(src, credits); CandleChart.Trade(asset, credits);
|
||||
Log.Info($"自动换币:{needSrc:0.####} {src} → {got:0.####} {asset}({credits:0} 信用点等值)");
|
||||
p.Execute(asset, q, mode, pw);
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
private static double _sellMult = 1.0;
|
||||
|
||||
/// <summary>出售:储藏区里能上架的货做成货架,选标价倍率后上架。</summary>
|
||||
private static void SellPage(CustomUIBuilder b, int day)
|
||||
private enum SellView { Showcase, Add, Fee }
|
||||
private static SellView _sellView = SellView.Showcase;
|
||||
private static readonly Dictionary<string, int> _stage = new Dictionary<string, int>();
|
||||
private static readonly Dictionary<string, int> _delist = new Dictionary<string, int>();
|
||||
private static bool _coinsOpen;
|
||||
private static string _feeCoin;
|
||||
|
||||
/// <summary>储藏区里同一种货(标识、型号、真伪、成色都相同)聚成一组。</summary>
|
||||
private sealed class SellGroup
|
||||
{
|
||||
public string Key, Id, Model, FakeOf;
|
||||
public double Health;
|
||||
public long Ref;
|
||||
public GoodKind Kind;
|
||||
public readonly List<GameItem> Items = new List<GameItem>();
|
||||
}
|
||||
|
||||
private static List<SellGroup> SellGroups()
|
||||
{
|
||||
var map = new Dictionary<string, SellGroup>();
|
||||
var list = new List<SellGroup>();
|
||||
foreach (var it in BlackDelivery.Sellable())
|
||||
{
|
||||
string id = BlackDelivery.SellId(it);
|
||||
if (id == null) continue;
|
||||
var kind = BlackDelivery.KindOf(id);
|
||||
var u = kind == GoodKind.Gpu ? Items.ToUnit(it) : null;
|
||||
string key = BmSale.KeyOf(id, u?.Model, u?.FakeOf, u?.Health ?? 0);
|
||||
if (!map.TryGetValue(key, out var g))
|
||||
{
|
||||
g = new SellGroup { Key = key, Id = id, Model = u?.Model, FakeOf = u?.FakeOf, Health = u?.Health ?? 0, Ref = BlackDelivery.RefValue(it), Kind = kind };
|
||||
map[key] = g; list.Add(g);
|
||||
}
|
||||
g.Items.Add(it);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
private static double MultFor(string key) => Session.Data.Black.MultOf(key) ?? _sellMult;
|
||||
private static int Staged(string key) => _stage.TryGetValue(key, out int n) ? n : 0;
|
||||
|
||||
/// <summary>这一组预备数量再加一件会不会超限:返回提示文字,可以加返回 null。</summary>
|
||||
private static string StageBlock(SellGroup g)
|
||||
{
|
||||
var d = Session.Data;
|
||||
var items = BlackDelivery.Sellable();
|
||||
int have = d.Black.ActiveOf(g.Key), staged = Staged(g.Key);
|
||||
if (have + staged + 1 > Tuning.BmMaxStack) return L.T("black.sell.limit.stack", Tuning.BmMaxStack);
|
||||
if (have == 0 && staged == 0)
|
||||
{
|
||||
int kinds = d.Black.ActiveKinds + _stage.Count(kv => kv.Value > 0 && d.Black.ActiveOf(kv.Key) == 0);
|
||||
if (kinds >= Tuning.BmMaxKinds) return L.T("black.sell.limit.kinds", Tuning.BmMaxKinds);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static BmGood GoodOf(string id, GoodKind kind, string model, double health, int price) =>
|
||||
new BmGood { Item = id, Kind = kind, Level = kind == GoodKind.Gpu ? 2 : Merchants.Info(id).Level, Model = model, Health = health, Price = price };
|
||||
|
||||
/// <summary>卖货:默认是已上架的橱窗;"上架更多"进入备货页,"货架"付平台费后上架。</summary>
|
||||
private static void SellPage(CustomUIBuilder b, int day)
|
||||
{
|
||||
if (_sellView == SellView.Add) { SellAddPage(b); return; }
|
||||
if (_sellView == SellView.Fee) { SellFeePage(b); return; }
|
||||
ShowcasePage(b);
|
||||
}
|
||||
|
||||
private static void ShowcasePage(CustomUIBuilder b)
|
||||
{
|
||||
var d = Session.Data;
|
||||
var listed = d.Black.Sales.Where(x => x.State == SaleState.Listed).GroupBy(x => x.Key).ToList();
|
||||
b.AddLabel(L.T("black.sell.rating", d.Black.Rating) + " " + L.T("black.sell.kinds", d.Black.ActiveKinds, Tuning.BmMaxKinds), "sell_status_dim");
|
||||
b.BeginRow(6f);
|
||||
b.AddButton(L.T("black.sell.add"), () => { _sellView = SellView.Add; _delist.Clear(); _message = null; Open(); });
|
||||
PledgerSkin.Pick(b, L.T("black.sell.coins"), _coinsOpen, () => { _coinsOpen = !_coinsOpen; Open(); }, _picked);
|
||||
b.End();
|
||||
if (_coinsOpen)
|
||||
{
|
||||
b.BeginRow(4f);
|
||||
foreach (var c in BlackMarket.SellCoins)
|
||||
{
|
||||
string coin = c;
|
||||
PledgerSkin.Pick(b, coin, d.Black.AcceptedCoins.Contains(coin), () =>
|
||||
{
|
||||
if (!d.Black.ToggleCoin(coin)) _message = L.T("black.sell.nocoin");
|
||||
else { _message = null; Session.Save(); }
|
||||
Open();
|
||||
}, _picked);
|
||||
}
|
||||
b.End();
|
||||
}
|
||||
if (listed.Count == 0) { b.AddLabel(L.T("black.sell.empty"), "sell_none_dim"); return; }
|
||||
var cards = new Dictionary<BmGood, IGrouping<string, BmSale>>();
|
||||
Shelf(b, listed.Select(g =>
|
||||
{
|
||||
var s = g.First();
|
||||
var kind = BlackDelivery.KindOf(s.Item);
|
||||
var good = GoodOf(s.Item, kind, s.Model, s.Health, s.ListPrice);
|
||||
cards[good] = g;
|
||||
return good;
|
||||
}).ToList(), (c, good) =>
|
||||
{
|
||||
var g = cards[good];
|
||||
string key = g.Key; int count = g.Count();
|
||||
GoodHead(c, good, L.T("black.sell.have", count));
|
||||
c.AddLabel(L.T("black.price", good.Price));
|
||||
c.AddFlexibleSpace();
|
||||
int n = _delist.TryGetValue(key, out int cur) ? cur : 0;
|
||||
c.AddButton(n > 0 ? L.T("black.sell.off.n", n) : L.T("black.sell.off"), () => { _delist[key] = (n + 1) % (count + 1); _message = null; Open(); });
|
||||
});
|
||||
}
|
||||
|
||||
private static void ConfirmDelist()
|
||||
{
|
||||
var d = Session.Data;
|
||||
int n = 0;
|
||||
foreach (var kv in _delist.Where(kv => kv.Value > 0).ToList())
|
||||
foreach (var s in d.Black.Sales.Where(x => x.State == SaleState.Listed && x.Key == kv.Key).Take(kv.Value).ToList())
|
||||
{
|
||||
d.Black.Delist(s);
|
||||
Items.Give(BlackDelivery.Make(s.Item, s.Model, s.FakeOf, s.Health));
|
||||
n++;
|
||||
}
|
||||
_delist.Clear();
|
||||
_message = L.T("black.sell.delisted", n);
|
||||
Session.Save();
|
||||
Open();
|
||||
}
|
||||
|
||||
private static void SellAddPage(CustomUIBuilder b)
|
||||
{
|
||||
var d = Session.Data;
|
||||
var groups = SellGroups();
|
||||
_stage.Keys.Where(k => groups.All(g => g.Key != k)).ToList().ForEach(k => _stage.Remove(k));
|
||||
foreach (var g in groups) if (Staged(g.Key) > g.Items.Count) _stage[g.Key] = g.Items.Count;
|
||||
b.BeginRow(8f, TextAnchor.UpperLeft);
|
||||
b.BeginPanel(SellerW + 8f, -1f, TextAnchor.UpperLeft, 0f, 2f);
|
||||
_clear.Add(b.Last.image);
|
||||
@@ -1688,79 +1690,111 @@ namespace Decentralized
|
||||
foreach (var m in Tuning.BmSellMults)
|
||||
{
|
||||
double mult = m;
|
||||
TableRow(b, SellerW, new[] { 70f, SellerW - 78f }, new[] { TextAnchor.MiddleLeft, TextAnchor.MiddleRight },
|
||||
new[] { "×" + m.ToString("0.0", CultureInfo.InvariantCulture), L.T("black.sell.days", Math.Round(BlackMarket.ExpectedDays(m))) },
|
||||
TableRow(b, SellerW, new[] { SellerW - 8f }, new[] { TextAnchor.MiddleLeft },
|
||||
new[] { "×" + m.ToString("0.0", CultureInfo.InvariantCulture) },
|
||||
Math.Abs(mult - _sellMult) < 1e-9, () => { _sellMult = mult; Open(); });
|
||||
}
|
||||
b.AddSpace(4f);
|
||||
b.AddLabel(L.T("black.sell.rating", d.Black.Rating), "sell_status_dim");
|
||||
b.AddLabel(L.T("black.sell.slots", d.Black.ActiveListings, Tuning.BmMaxListings), "sell_status_dim");
|
||||
b.AddLabel(L.T("black.sell.kinds", d.Black.ActiveKinds, Tuning.BmMaxKinds), "sell_status_dim");
|
||||
b.AddSpace(4f);
|
||||
b.AddButton(L.T("black.sell.all"), () =>
|
||||
{
|
||||
double mult = _sellMult;
|
||||
double fee = BlackDelivery.Sellable().Sum(it => BlackMarket.ListFee(BlackMarket.ListPriceOf(BlackDelivery.RefValue(it), mult)));
|
||||
OpenPay(new PayDraft
|
||||
{
|
||||
Title = L.T("black.sell.all") + L.T("pay.listfee", mult.ToString("0.0", CultureInfo.InvariantCulture)), Address = d.Address("platform"), Accepted = Merchants.PlatformAccepts,
|
||||
Credits = (q, m) => fee, Execute = (asset, q, m, pw) => ListAll(asset, mult, pw),
|
||||
});
|
||||
});
|
||||
b.AddButton(L.T("black.sell.back"), () => { _sellView = SellView.Showcase; _stage.Clear(); _message = null; Open(); });
|
||||
b.End();
|
||||
b.BeginPanel(ShelfW, -1f, TextAnchor.UpperLeft, 0f, 4f);
|
||||
_clear.Add(b.Last.image);
|
||||
if (items.Count == 0) b.AddLabel(L.T("black.sell.none"), "sell_none_dim");
|
||||
else Shelf(b, items.Select(it =>
|
||||
if (groups.Count == 0) b.AddLabel(L.T("black.sell.none"), "sell_none_dim");
|
||||
else
|
||||
{
|
||||
string id = BlackDelivery.SellId(it);
|
||||
var kind = BlackDelivery.KindOf(id);
|
||||
var g = new BmGood { Item = id, Kind = kind, Level = kind == GoodKind.Gpu ? 2 : Merchants.Info(id).Level };
|
||||
if (kind == GoodKind.Gpu) { var uu = Items.ToUnit(it); g.Health = uu.Health; g.Model = uu.Model; }
|
||||
g.Price = BlackMarket.ListPriceOf(BlackDelivery.RefValue(it), _sellMult);
|
||||
return new { g, it };
|
||||
}).Select(x => { SellCards[x.g] = x.it; return x.g; }).ToList(), (c, g) =>
|
||||
{
|
||||
var it = SellCards[g];
|
||||
GoodHead(c, g, "");
|
||||
c.AddLabel(L.T("black.price", g.Price));
|
||||
c.AddFlexibleSpace();
|
||||
c.AddButton(L.T("black.sell.list"), () => BeginEdit(new EditPrice { Item = it, Id = g.Item, Ref = BlackDelivery.RefValue(it) }, g.Price));
|
||||
});
|
||||
b.End();
|
||||
b.End();
|
||||
}
|
||||
|
||||
private static readonly System.Collections.Generic.Dictionary<BmGood, GameItem> SellCards = new System.Collections.Generic.Dictionary<BmGood, GameItem>();
|
||||
|
||||
private static void ListAll(string asset, double mult, Wallet pw)
|
||||
{
|
||||
var d = Session.Data;
|
||||
int n = 0;
|
||||
foreach (var it in BlackDelivery.Sellable())
|
||||
{
|
||||
string id = BlackDelivery.SellId(it);
|
||||
if (id == null) continue;
|
||||
var u = Items.IsGpu(it) ? Items.ToUnit(it) : null;
|
||||
var s = d.Black.List(id, u?.Model, u?.FakeOf, u?.Health ?? 0, BlackDelivery.RefValue(it), mult, pw, asset, StoreStation.GetDayCounter(), Session.Price);
|
||||
if (s == null) break;
|
||||
it.Destroy();
|
||||
n++;
|
||||
var cards = new Dictionary<BmGood, SellGroup>();
|
||||
Shelf(b, groups.Select(g =>
|
||||
{
|
||||
var good = GoodOf(g.Id, g.Kind, g.Model, g.Health, BlackMarket.ListPriceOf(g.Ref, MultFor(g.Key)));
|
||||
cards[good] = g;
|
||||
return good;
|
||||
}).ToList(), (c, good) =>
|
||||
{
|
||||
var g = cards[good];
|
||||
GoodHead(c, good, "");
|
||||
c.AddLabel(L.T("black.price", good.Price));
|
||||
c.AddLabel(L.T("black.stock", g.Items.Count), "good_line2_dim");
|
||||
c.AddFlexibleSpace();
|
||||
c.BeginRow(4f, TextAnchor.MiddleCenter);
|
||||
RowKey(c, "-", () => { if (Staged(g.Key) > 0) _stage[g.Key] = Staged(g.Key) - 1; _message = null; Open(); });
|
||||
Cell(c, 34f, Staged(g.Key).ToString(), false, TextAnchor.MiddleCenter);
|
||||
RowKey(c, "+", () =>
|
||||
{
|
||||
string block = Staged(g.Key) >= g.Items.Count ? null : StageBlock(g);
|
||||
if (block != null) { _message = block; Open(); return; }
|
||||
if (Staged(g.Key) < g.Items.Count) _stage[g.Key] = Staged(g.Key) + 1;
|
||||
_message = null; Open();
|
||||
});
|
||||
c.End();
|
||||
});
|
||||
}
|
||||
_message = L.T("black.sell.listedall", n);
|
||||
Session.Save();
|
||||
Open();
|
||||
b.End();
|
||||
b.End();
|
||||
}
|
||||
|
||||
private static void ListItem(GameItem it, double mult, string asset, Wallet pw)
|
||||
private static double StageFee(List<SellGroup> groups) =>
|
||||
groups.Sum(g => Staged(g.Key) * (double)BlackMarket.ListFee(BlackMarket.ListPriceOf(g.Ref, MultFor(g.Key))));
|
||||
|
||||
/// <summary>货架:左栏是准备上架的清单,右栏选收款币付平台费,付完才上架。</summary>
|
||||
private static void SellFeePage(CustomUIBuilder b)
|
||||
{
|
||||
var d = Session.Data;
|
||||
string id = BlackDelivery.SellId(it);
|
||||
if (id == null) { Open(); return; }
|
||||
var u = Items.IsGpu(it) ? Items.ToUnit(it) : null;
|
||||
var s = d.Black.List(id, u?.Model, u?.FakeOf, u?.Health ?? 0, BlackDelivery.RefValue(it), mult, pw, asset, StoreStation.GetDayCounter(), Session.Price);
|
||||
if (s == null) { _message = d.Black.ActiveListings >= Tuning.BmMaxListings ? L.T("black.sell.full", Tuning.BmMaxListings) : L.T("msg.balance"); Open(); return; }
|
||||
it.Destroy();
|
||||
_message = L.T("black.sell.listed", ItemName(id), s.ListPrice);
|
||||
var w = d.Hot;
|
||||
var groups = SellGroups().Where(g => Staged(g.Key) > 0).ToList();
|
||||
if (groups.Count == 0) { _sellView = SellView.Add; Open(); return; }
|
||||
double fee = StageFee(groups);
|
||||
var acc = Merchants.PlatformAccepts;
|
||||
if (_feeCoin == null || !acc.Contains(_feeCoin)) _feeCoin = acc[0];
|
||||
Columns(b, l =>
|
||||
{
|
||||
l.AddHeader(L.T("black.fee.h"));
|
||||
foreach (var g in groups)
|
||||
l.AddLabel(L.T("black.fee.line", ItemName(g.Id), Staged(g.Key), BlackMarket.ListPriceOf(g.Ref, MultFor(g.Key)), "×" + MultFor(g.Key).ToString("0.0", CultureInfo.InvariantCulture)), "cart_shop");
|
||||
l.AddSeparator();
|
||||
l.AddLabel(L.T("black.fee.total", Fmt.Credits(fee)), "cart_total");
|
||||
}, r =>
|
||||
{
|
||||
r.AddHeader(L.T("bpay.h"));
|
||||
r.AddLabel(L.T("bpay.coin"), "bpay_coin_dim");
|
||||
r.BeginRow(4f);
|
||||
foreach (var a in acc) { string asset = a; PledgerSkin.Pick(r, asset, asset == _feeCoin, () => { _feeCoin = asset; Open(); }, _picked); }
|
||||
r.End();
|
||||
r.AddLabel(L.T("bpay.need", WalletWindow.Amt(WalletWindow.RoundUp(fee / Session.Price(_feeCoin))), _feeCoin, Fmt.Num(w.Avail(_feeCoin))), "bpay_need_dim");
|
||||
r.AddButton(L.T("bpay.invoice"), () =>
|
||||
{
|
||||
string coin = _feeCoin;
|
||||
string summary = L.T("black.fee.sum", groups.Sum(g => Staged(g.Key)));
|
||||
BeginPay(d.Address("platform"), summary, coin, fee, pw => ListStaged(coin, pw));
|
||||
});
|
||||
r.AddSpace(4f);
|
||||
r.AddButton(L.T("black.sell.back"), () => { _sellView = SellView.Add; _message = null; Open(); });
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>付完平台费后:按预备数量逐件上架,货从储藏区拿走。</summary>
|
||||
private static void ListStaged(string asset, Wallet pw)
|
||||
{
|
||||
var d = Session.Data;
|
||||
int day = StoreStation.GetDayCounter(), ok = 0, fail = 0;
|
||||
foreach (var g in SellGroups())
|
||||
{
|
||||
int n = Staged(g.Key);
|
||||
if (n <= 0) continue;
|
||||
double mult = MultFor(g.Key);
|
||||
foreach (var it in g.Items.Take(n))
|
||||
{
|
||||
var s = d.Black.List(g.Id, g.Model, g.FakeOf, g.Health, g.Ref, mult, pw, asset, day, Session.Price);
|
||||
if (s == null) { fail++; continue; }
|
||||
it.Destroy();
|
||||
ok++;
|
||||
}
|
||||
}
|
||||
_stage.Clear();
|
||||
_sellView = SellView.Showcase;
|
||||
_message = fail == 0 ? L.T("black.sell.listedall", ok) : L.T("black.sell.partial", ok, fail);
|
||||
Session.Save();
|
||||
Open();
|
||||
}
|
||||
@@ -1775,7 +1809,7 @@ namespace Decentralized
|
||||
private static readonly Dictionary<int, string> _ckGroupCoin = new Dictionary<int, string>();
|
||||
|
||||
/// <summary>读档或换局时清空购物车(货架对象已经不是同一批了)。</summary>
|
||||
public static void ClearCart() { _cart.Clear(); _checkout = false; _ckMode.Clear(); _ckGroupCoin.Clear(); _ckSwap.Clear(); }
|
||||
public static void ClearCart() { _stage.Clear(); _delist.Clear(); _sellView = SellView.Showcase; _cart.Clear(); _checkout = false; _ckMode.Clear(); _ckGroupCoin.Clear(); _ckSwap.Clear(); }
|
||||
|
||||
private static int StockOf(BmGood g) => g is BmOffer o ? o.Qty : ((BmListing)g).Qty;
|
||||
|
||||
@@ -1808,12 +1842,33 @@ namespace Decentralized
|
||||
private static double GroupCredits(SaveData d, int seller) => _cart.Where(l => l.Seller == seller).Sum(l => LineCredits(d, l));
|
||||
|
||||
/// <summary>悬浮购物车:商店页右下角一个常驻的小按钮,显示件数,点开进结算页。</summary>
|
||||
private sealed class Fab { public string Text; public bool On; public Action Click; }
|
||||
|
||||
/// <summary>右下角悬浮按钮:买货页是购物车,卖货的备货页是货架,橱窗里有预备下架时是确定下架;其余页面没有。</summary>
|
||||
private static Fab FabNow()
|
||||
{
|
||||
if (_page != Page.Gray || _grayTab != GrayTab.Black || _checkout || WalletWindow.Pending != null || !Unlock.BlackUnlocked) return null;
|
||||
if (_blackTab == BlackTab.Buy) return new Fab { Text = L.T("cart.fab", CartCount()), On = CartCount() > 0, Click = () => { _checkout = true; _message = null; Open(); } };
|
||||
if (_blackTab != BlackTab.Sell) return null;
|
||||
if (_sellView == SellView.Add)
|
||||
{
|
||||
int n = _stage.Values.Sum();
|
||||
return new Fab { Text = L.T("shelf.fab", n), On = n > 0, Click = () => { if (n > 0) { _sellView = SellView.Fee; _message = null; Open(); } } };
|
||||
}
|
||||
if (_sellView == SellView.Showcase)
|
||||
{
|
||||
int n = _delist.Values.Sum();
|
||||
return n > 0 ? new Fab { Text = L.T("delist.fab", n), On = true, Click = ConfirmDelist } : null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static void CartFab(CustomUIWindow win)
|
||||
{
|
||||
if (win?.root == null) return;
|
||||
var old = win.root.transform.Find("pd_cart_fab");
|
||||
bool show = _page == Page.Gray && _grayTab == GrayTab.Black && !_checkout && WalletWindow.Pending == null && Unlock.BlackUnlocked;
|
||||
if (!show) { if (old != null) UnityEngine.Object.Destroy(old.gameObject); return; }
|
||||
var fab = FabNow();
|
||||
if (fab == null) { if (old != null) UnityEngine.Object.Destroy(old.gameObject); return; }
|
||||
if (old != null) UnityEngine.Object.DestroyImmediate(old.gameObject);
|
||||
var go = new GameObject("pd_cart_fab", typeof(RectTransform), typeof(CanvasRenderer), typeof(Image), typeof(Button), typeof(LayoutElement));
|
||||
go.transform.SetParent(win.root.transform, false);
|
||||
@@ -1821,20 +1876,20 @@ namespace Decentralized
|
||||
var rt = (RectTransform)go.transform;
|
||||
rt.anchorMin = rt.anchorMax = new Vector2(1f, 0f);
|
||||
rt.pivot = new Vector2(1f, 0f);
|
||||
rt.sizeDelta = new Vector2(132f, 36f);
|
||||
rt.sizeDelta = new Vector2(Mathf.Max(132f, fab.Text.Length * 9f + 40f), 36f);
|
||||
rt.anchoredPosition = new Vector2(-34f, 34f);
|
||||
var img = go.GetComponent<Image>();
|
||||
PledgerSkin.KeyShape(img, CartCount() > 0 ? PledgerSkin.Ink : PledgerSkin.Key);
|
||||
PledgerSkin.KeyShape(img, fab.On ? PledgerSkin.Ink : PledgerSkin.Key);
|
||||
var btn = go.GetComponent<Button>();
|
||||
btn.transition = Selectable.Transition.None;
|
||||
btn.onClick.AddListener(() => { _checkout = true; _message = null; Open(); });
|
||||
btn.onClick.AddListener(() => fab.Click());
|
||||
var tgo = new GameObject("label", typeof(RectTransform), typeof(CanvasRenderer), typeof(TextMeshProUGUI));
|
||||
tgo.transform.SetParent(go.transform, false);
|
||||
var trt = (RectTransform)tgo.transform;
|
||||
trt.anchorMin = Vector2.zero; trt.anchorMax = Vector2.one; trt.offsetMin = trt.offsetMax = Vector2.zero;
|
||||
var tmp = tgo.GetComponent<TextMeshProUGUI>();
|
||||
if (win.frame?.titleText != null) { tmp.font = win.frame.titleText.font; tmp.fontSharedMaterial = win.frame.titleText.fontSharedMaterial; }
|
||||
tmp.text = L.T("cart.fab", CartCount());
|
||||
tmp.text = fab.Text;
|
||||
tmp.fontSize = 15f;
|
||||
tmp.fontStyle = FontStyles.Bold;
|
||||
tmp.alignment = TextAlignmentOptions.Center;
|
||||
@@ -2128,106 +2183,26 @@ namespace Decentralized
|
||||
Open();
|
||||
}
|
||||
|
||||
private static void BeginEdit(EditPrice e, int initial)
|
||||
{
|
||||
_edit = e;
|
||||
_editPrice = initial.ToString(CultureInfo.InvariantCulture);
|
||||
_message = null;
|
||||
Open();
|
||||
}
|
||||
|
||||
private static int MinPrice(long refValue) => (int)Math.Ceiling(Tuning.BmSellMin * refValue - 1e-9);
|
||||
private static int MaxPrice(long refValue) => (int)Math.Floor(Tuning.BmSellMax * refValue + 1e-9);
|
||||
|
||||
/// <summary>设定标价:显示参考价,档位按钮只是帮忙填价格,价格也可以手输;按 标价 / 参考价 的比例算成交和污点。</summary>
|
||||
private static void EditPage(CustomUIBuilder b)
|
||||
{
|
||||
var e = _edit;
|
||||
b.AddHeader(ItemName(e.Id));
|
||||
b.AddLabel(L.T("black.edit.ref", e.Ref), "edit_ref_dim");
|
||||
b.BeginPanel(RightW, -1f, TextAnchor.MiddleCenter, 0f, 0f);
|
||||
if (b.Last != null && b.Last.image != null) _clear.Add(b.Last.image);
|
||||
b.AddInput(L.T("black.edit.input"), _editPrice, s => _editPrice = s, "price", s => _editPrice = s);
|
||||
b.End();
|
||||
b.BeginRow(4f);
|
||||
foreach (var m in Tuning.BmSellMults)
|
||||
{
|
||||
double mult = m;
|
||||
string label = "×" + m.ToString("0.0", CultureInfo.InvariantCulture);
|
||||
int targetPrice = BlackMarket.ListPriceOf(e.Ref, mult);
|
||||
bool sel = int.TryParse((_editPrice ?? "").Trim(), NumberStyles.Integer, CultureInfo.InvariantCulture, out int curP) && curP == targetPrice;
|
||||
PledgerSkin.Pick(b, label, sel, () => { _editPrice = targetPrice.ToString(CultureInfo.InvariantCulture); Open(); }, _picked);
|
||||
}
|
||||
b.End();
|
||||
if (int.TryParse((_editPrice ?? "").Trim(), NumberStyles.Integer, CultureInfo.InvariantCulture, out int p) && p > 0)
|
||||
b.AddLabel(L.T("black.edit.price", p, (p / (double)e.Ref).ToString("0.00", CultureInfo.InvariantCulture)));
|
||||
b.BeginRow(6f);
|
||||
b.AddButton(L.T("black.edit.ok"), () =>
|
||||
{
|
||||
if (!int.TryParse((_editPrice ?? "").Trim(), NumberStyles.Integer, CultureInfo.InvariantCulture, out int price) || price < MinPrice(e.Ref) || price > MaxPrice(e.Ref))
|
||||
{ _message = L.T("black.edit.range", MinPrice(e.Ref), MaxPrice(e.Ref)); Open(); return; }
|
||||
double mult = price / (double)e.Ref;
|
||||
var d = Session.Data;
|
||||
int fee = e.Sale != null ? BlackMarket.RepriceFee(price) : BlackMarket.ListFee(price);
|
||||
_edit = null;
|
||||
OpenPay(new PayDraft
|
||||
{
|
||||
Title = ItemName(e.Id) + L.T(e.Sale != null ? "pay.repricefee" : "pay.listfee", mult.ToString("0.00", CultureInfo.InvariantCulture)), Address = d.Address("platform"), Accepted = Merchants.PlatformAccepts,
|
||||
Credits = (q, m) => fee,
|
||||
Execute = (asset, q, m, pw) => { if (e.Sale != null) RepriceSale(e.Sale, mult, asset, pw); else ListItem(e.Item, mult, asset, pw); },
|
||||
});
|
||||
});
|
||||
b.AddButton(L.T("black.edit.cancel"), () => { _edit = null; _message = null; Open(); });
|
||||
b.End();
|
||||
}
|
||||
|
||||
private static void RepriceSale(BmSale s, double mult, string asset, Wallet pw)
|
||||
{
|
||||
var d = Session.Data;
|
||||
if (!d.Black.Reprice(s, mult, pw, asset, StoreStation.GetDayCounter(), Session.Price)) { _message = L.T("msg.balance"); Open(); return; }
|
||||
_message = L.T("black.sell.repriced", ItemName(s.Item), s.ListPrice);
|
||||
Session.Save();
|
||||
Open();
|
||||
}
|
||||
|
||||
private static void Delist(BmSale s)
|
||||
{
|
||||
var d = Session.Data;
|
||||
d.Black.Delist(s);
|
||||
Items.Give(BlackDelivery.Make(s.Item, s.Model, s.FakeOf, s.Health));
|
||||
Session.Save();
|
||||
Open();
|
||||
}
|
||||
|
||||
/// <summary>我的订单与论坛情报。</summary>
|
||||
/// <summary>在途订单:买入还没取货的订单,和卖出已成交、货款在托管中的订单;每条显示状态与到期日。</summary>
|
||||
private static void OrdersPage(CustomUIBuilder b, int day)
|
||||
{
|
||||
var d = Session.Data;
|
||||
var buys = d.Black.Orders.Where(o => o.State == OrderState.Pending || o.State == OrderState.Ready).OrderByDescending(x => x.PlacedDay).ToList();
|
||||
var sells = d.Black.Sales.Where(x => x.State == SaleState.Sold).OrderByDescending(x => x.ListedDay).ToList();
|
||||
b.BeginRow(8f, TextAnchor.UpperLeft);
|
||||
b.BeginPanel((SellerW + 8f + ShelfW) * 0.45f, -1f, TextAnchor.UpperLeft, 4f, 4f);
|
||||
b.BeginPanel((SellerW + 8f + ShelfW) * 0.5f, -1f, TextAnchor.UpperLeft, 4f, 4f);
|
||||
_clear.Add(b.Last.image);
|
||||
b.AddHeader(L.T("black.orders.in"));
|
||||
if (d.Black.Orders.Count == 0) b.AddLabel(L.T("black.mine.none"), "orders_in_none_dim");
|
||||
foreach (var o in d.Black.Orders.OrderByDescending(x => x.PlacedDay))
|
||||
b.AddLabel(L.T("black.mine.line", ItemName(o.Item) + (o.Count > 1 ? " ×" + o.Count : ""), BlackDelivery.DisplayName(o.Seller), L.T("black.mode." + o.Mode), L.T("black.state." + o.State + (o.Why != null && o.State != OrderState.Done ? "." + o.Why : "")), o.DueDay));
|
||||
if (buys.Count == 0) b.AddLabel(L.T("black.mine.none"), "orders_in_none_dim");
|
||||
foreach (var o in buys)
|
||||
b.AddLabel(L.T("black.mine.line", ItemName(o.Item) + (o.Count > 1 ? " ×" + o.Count : ""), BlackDelivery.DisplayName(o.Seller), L.T("black.mode." + o.Mode), L.T("black.state." + o.State), o.DueDay));
|
||||
b.End();
|
||||
b.BeginPanel((SellerW + 8f + ShelfW) * 0.55f, -1f, TextAnchor.UpperLeft, 4f, 4f);
|
||||
b.BeginPanel((SellerW + 8f + ShelfW) * 0.5f, -1f, TextAnchor.UpperLeft, 4f, 4f);
|
||||
_clear.Add(b.Last.image);
|
||||
b.AddHeader(L.T("black.orders.out"));
|
||||
if (d.Black.Sales.Count == 0) b.AddLabel(L.T("black.mine.none"), "orders_out_none_dim");
|
||||
foreach (var sl in d.Black.Sales.Where(x => x.State != SaleState.Delisted || x.Why == "fake").OrderByDescending(x => x.ListedDay))
|
||||
{
|
||||
var sale = sl;
|
||||
string st = sale.State == SaleState.Sold ? L.T("black.sale.Sold", sale.PayDay) : L.T("black.sale." + sale.State + (sale.State == SaleState.Delisted && sale.Why != null ? "." + sale.Why : ""));
|
||||
b.AddLabel(L.T("black.mine.sale", ItemName(sale.Item), sale.Ref, sale.ListPrice, sale.Mult.ToString("0.00", CultureInfo.InvariantCulture), st));
|
||||
if (sale.State == SaleState.Listed)
|
||||
{
|
||||
b.BeginRow(6f);
|
||||
b.AddButton(L.T("black.sell.reprice"), () => BeginEdit(new EditPrice { Sale = sale, Id = sale.Item, Ref = sale.Ref }, sale.ListPrice));
|
||||
b.AddButton(L.T("black.sell.delist"), () => Delist(sale));
|
||||
b.End();
|
||||
}
|
||||
}
|
||||
if (sells.Count == 0) b.AddLabel(L.T("black.mine.none"), "orders_out_none_dim");
|
||||
foreach (var sale in sells)
|
||||
b.AddLabel(L.T("black.mine.sale", ItemName(sale.Item), sale.Ref, sale.ListPrice, sale.Mult.ToString("0.00", CultureInfo.InvariantCulture), L.T("black.sale.Sold", sale.PayDay, sale.PayAsset ?? Assets.CRT)));
|
||||
b.End();
|
||||
b.End();
|
||||
}
|
||||
|
||||
@@ -82,9 +82,9 @@ namespace Decentralized
|
||||
/// <summary>出块动画的时间表:签名 0.8 秒,内存池 1.2 秒,打包 1 秒,每次确认 0.6 秒;拥堵时按档位放慢。</summary>
|
||||
private static float[] Timeline(int confs, double slow, bool dropped)
|
||||
{
|
||||
var t = new List<float> { 0.8f, 0.8f + 1.2f * (float)slow };
|
||||
var t = new List<float> { 0.8f * (float)slow, (0.8f + 1.2f) * (float)slow };
|
||||
if (dropped) { t.Add(t[1] + 1.5f * (float)slow); return t.ToArray(); }
|
||||
t.Add(t[1] + 1.0f);
|
||||
t.Add(t[1] + 1.0f * (float)slow);
|
||||
for (int i = 0; i < confs; i++) t.Add(t[t.Count - 1] + 0.6f * (float)slow);
|
||||
return t.ToArray();
|
||||
}
|
||||
|
||||
@@ -902,20 +902,44 @@ internal static class Program
|
||||
Check(fake > 150 && fake < 250, $"假卡约一半被看穿退货:{fake}/400");
|
||||
// 平台跑路:上架的货与未放款货款都没了
|
||||
var b4 = new BlackMarket(); var w4 = new Wallet(); w4.Add(Assets.CRT, 100000);
|
||||
for (int i = 0; i < 30; i++) b4.List("c4", null, null, 0, 5000, 1.8, w4, Assets.CRT, 1, price);
|
||||
for (int i = 0; i < 30; i++) b4.List("c" + (i % 6), null, null, 0, 5000, 1.8, w4, Assets.CRT, 1, price);
|
||||
bool rugged = false;
|
||||
for (int d = 2; d < 400 && !rugged; d++) { var ev = b4.Night(d, false, w4, new Rng((ulong)d * 31), 0, price); rugged = ev.Any(e => e.Kind == "sale_rug"); }
|
||||
Check(rugged && b4.Sales.All(x => x.State != SaleState.Listed && x.State != SaleState.Sold), "跑路:上架与未放款全部归零");
|
||||
var b6 = new BlackMarket(); var w6 = new Wallet(); w6.Add(Assets.CRT, 100000);
|
||||
int ok6 = 0; for (int i = 0; i < 15; i++) if (b6.List("c4", null, null, 0, 500, 1.0, w6, Assets.CRT, 1, price) != null) ok6++;
|
||||
Check(ok6 == Tuning.BmMaxListings && b6.ActiveListings == 10, "同时最多上架 10 件");
|
||||
var b7 = new BlackMarket(); var w7 = new Wallet(); w7.Add(Assets.CRT, 5000);
|
||||
var s7 = b7.List("c4", null, null, 0, 500, 1.8, w7, Assets.CRT, 1, price);
|
||||
double c7 = w7.Get(Assets.CRT);
|
||||
Check(b7.Reprice(s7, 1.0, w7, Assets.CRT, 2, price) && s7.ListPrice == 500 && s7.Mult == 1.0 && Near(c7 - w7.Get(Assets.CRT), BlackMarket.RepriceFee(500), 1e-9), "改价:按参考价重算标价,收 2% 改价费");
|
||||
Check(!b7.Reprice(s7, 1.0, w7, Assets.CRT, 2, price) && !b7.Reprice(s7, 2.5, w7, Assets.CRT, 2, price) && Near(b7.SaleChance(s7.Mult), 0.5 * Math.Min(1.1, 90 / 90.0), 1e-9), "同倍率或超范围不改;改价后成交概率按新倍率");
|
||||
b7.Night(3, false, w7, new Rng(5), 0, price);
|
||||
Check(!b7.Reprice(s7, 0.6, w7, Assets.CRT, 4, price) || s7.State == SaleState.Listed, "已成交的货不能改价");
|
||||
int okStack = 0; for (int i = 0; i < 8; i++) if (b6.List("c4", null, null, 0, 500, 1.0, w6, Assets.CRT, 1, price) != null) okStack++;
|
||||
Check(okStack == Tuning.BmMaxStack && b6.ActiveKinds == 1 && b6.ActiveListings == 5, "同一种商品最多上架 5 件");
|
||||
int okKinds = 0; for (int k = 0; k < 9; k++) if (b6.List("k" + k, null, null, 0, 500, 1.0, w6, Assets.CRT, 1, price) != null) okKinds++;
|
||||
Check(b6.ActiveKinds == Tuning.BmMaxKinds && okKinds == Tuning.BmMaxKinds - 1, "同时最多上架 6 种");
|
||||
Check(b6.List("c4", null, null, 0, 500, 1.2, w6, Assets.CRT, 1, price) == null && b6.ListBlock(BmSale.KeyOf("c4", null, null, 0), 1.2, 1) != null && b6.ListBlock(BmSale.KeyOf("k0", null, null, 0), 1.2, 1) == "mult" && b6.ListBlock(BmSale.KeyOf("k0", null, null, 0), 1.0, 1) == null, "同一种商品倍率必须相同;种数满了新种不能上");
|
||||
b6.Delist(b6.Sales.First(x => x.Item == "k0"));
|
||||
Check(b6.ListBlock(BmSale.KeyOf("k0", null, null, 0), 1.2, 1) == null && b6.ListBlock(BmSale.KeyOf("zz", null, null, 0), 1.0, 1) == null, "下架后腾出名额,也可换倍率");
|
||||
// 收款币:每接受一种币多一轮成交判定,货款用命中的币付
|
||||
Func<int, string[], (int sold, int[] byCoin)> trial = (n, coins) =>
|
||||
{
|
||||
int sold = 0; var cnt = new int[4];
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
var bx = new BlackMarket(); var wx = new Wallet(); wx.Add(Assets.CRT, 1000);
|
||||
bx.SellAccepts = coins.ToList();
|
||||
var sx = bx.List("c4", null, null, 0, 500, 1.5, wx, Assets.CRT, 1, price);
|
||||
bx.Night(2, false, wx, new Rng((ulong)i + 11), 0, price);
|
||||
if (sx.State == SaleState.Sold) { sold++; cnt[Array.IndexOf(BlackMarket.SellCoins, sx.PayAsset)]++; }
|
||||
}
|
||||
return (sold, cnt);
|
||||
};
|
||||
var one = trial(4000, new[] { Assets.CRT });
|
||||
var all = trial(4000, BlackMarket.SellCoins);
|
||||
Check(all.sold > one.sold * 1.5 && one.byCoin.Skip(0).Where((c, i) => BlackMarket.SellCoins[i] != Assets.CRT).All(c => c == 0) && all.byCoin.All(c => c > 0), $"接受的币越多越容易成交,货款币种随机:{one.sold} → {all.sold}({string.Join("/", all.byCoin)})");
|
||||
var bt = new BlackMarket();
|
||||
Check(!bt.ToggleCoin(Assets.CRT) && bt.ToggleCoin(Assets.PSC) && bt.AcceptedCoins.Count() == 2 && bt.ToggleCoin(Assets.CRT) && !bt.ToggleCoin(Assets.PSC) && !bt.ToggleCoin(Assets.CRC), "收款币至少留一种,只有四种币可选");
|
||||
var b8 = new BlackMarket(); var w8 = new Wallet(); w8.Add(Assets.CRT, 1000);
|
||||
b8.SellAccepts = new List<string> { Assets.PSC };
|
||||
var s8 = b8.List("c4", null, null, 0, 500, 0.8, w8, Assets.CRT, 1, price);
|
||||
b8.Night(2, false, w8, new Rng(3), 0, price);
|
||||
double psc0 = w8.Get(Assets.PSC);
|
||||
b8.Night(5, false, w8, new Rng(4), 0, price);
|
||||
Check(s8.State == SaleState.Paid && s8.PayAsset == Assets.PSC && Near(w8.Get(Assets.PSC) - psc0, s8.Proceeds / 100.0, 1e-9), "货款以命中那一轮的币到账");
|
||||
// 镇压期间不推进
|
||||
var b5 = new BlackMarket(); var w5 = new Wallet(); w5.Add(Assets.CRT, 1000);
|
||||
var s5 = b5.List("c4", null, null, 0, 500, 0.8, w5, Assets.CRT, 1, price);
|
||||
@@ -923,6 +947,13 @@ internal static class Program
|
||||
Check(s5.State == SaleState.Listed, "镇压期间平台下线,不成交");
|
||||
});
|
||||
|
||||
Test("区块增长", () =>
|
||||
{
|
||||
var r = new Rng(5); int lo = int.MaxValue, hi = 0; long sum = 0;
|
||||
for (int i = 0; i < 2000; i++) { int n = TxRules.BlocksPerDay(r); lo = Math.Min(lo, n); hi = Math.Max(hi, n); sum += n; }
|
||||
Check(lo >= Tuning.BlocksPerDayMin && hi <= Tuning.BlocksPerDayMax && hi - lo > 30 && Near(sum / 2000.0, (Tuning.BlocksPerDayMin + Tuning.BlocksPerDayMax) / 2.0, 3), "每晚区块增量在范围内随机");
|
||||
});
|
||||
|
||||
Test("黑市全新卡", () =>
|
||||
{
|
||||
int fresh = 0, total = 0, bad = 0;
|
||||
@@ -1180,6 +1211,7 @@ internal static class Program
|
||||
Check(sameShort > 290, $"缩写看起来一样:{sameShort}/300");
|
||||
Check(TxRules.FeeCredits(FeeTier.Slow, false) < TxRules.FeeCredits(FeeTier.Normal, false) && TxRules.FeeCredits(FeeTier.Normal, false) < TxRules.FeeCredits(FeeTier.Fast, false), "慢 < 普通 < 快");
|
||||
Check(Math.Abs(TxRules.FeeCredits(FeeTier.Fast, true) - Tuning.TxFeeFast * Tuning.TxCongestedFeeMult) < 1e-9, "拥堵时手续费翻倍");
|
||||
Check(TxRules.Slowdown(FeeTier.Fast, false) < TxRules.Slowdown(FeeTier.Normal, false) && TxRules.Slowdown(FeeTier.Normal, false) < TxRules.Slowdown(FeeTier.Slow, false) && Near(TxRules.Slowdown(FeeTier.Normal, false), 1, 1e-9) && TxRules.Slowdown(FeeTier.Fast, true) < TxRules.Slowdown(FeeTier.Normal, true), "Gas 越高确认越快,拥堵时快档仍最快");
|
||||
Check(TxRules.Confirmations(100) == 3 && TxRules.Confirmations(5000) == 6 && TxRules.Confirmations(50000) == 12, "大额要更多确认");
|
||||
Check(TxRules.DropChance(FeeTier.Slow, true) > 0 && TxRules.DropChance(FeeTier.Slow, false) == 0 && TxRules.DropChance(FeeTier.Fast, true) == 0, "只有拥堵时的慢档会被丢");
|
||||
double lo = 9, hi = 0;
|
||||
|
||||
Reference in new issue
Block a user