第十一阶段 stage 2:场外换币台(暗灯招换币客户)
- 新人脉升级“场外换币台”(OtcUnlockPrice 500),附赠一盏暗灯 - 包装原版暗灯工厂:切换顺序末尾加目标 pd_otc(只接管进出这一步,其余交给原切换函数);顾客工厂写进公开的 StoreClientListDict.storeClientDict,顾客面板与概率走原版逻辑 - 换色:底图换成原版熄灭的暗灯,叠加层画黄绿色光晕(otc_lamp_on),不进存档 - 换币客户(OtcClient)一半卖币、一半买币:卖币并入原收黑币(Domain/Otc.cs 取代 HotCoins.cs,HotCoinSeller 删除),污点比例随机、越脏越便宜、地址来历写进账本;买币三档报价,PLEDGER 转账确认后现金到账,当晚未付作废 - 只在生成顾客的回调窗口里生成报价、写账本(原版取名字也会调用工厂) - 存档数据版本 4:旧存档出块奖励、NPC 算力按 MiningScale 放大 - 8 种语言文字、手册“换币客户”一节;单元测试 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
bc23ae056b
commit
ec578a39d9
25 files changed
+833
-321
No files matched your search
@@ -12,6 +12,16 @@
|
|||||||
- 修正:内幕卖出的日志原来写“只退本金”,实际是全部没收。
|
- 修正:内幕卖出的日志原来写“只退本金”,实际是全部没收。
|
||||||
- 手册对应段落 8 种语言更新。
|
- 手册对应段落 8 种语言更新。
|
||||||
|
|
||||||
|
### 第十一阶段 stage 2:场外换币台
|
||||||
|
|
||||||
|
- 新人脉升级“场外换币台”(500,前提是 Web3 治理社区),附赠一盏暗灯。原版暗灯双击切换目标时多一个“换币客户”(解锁后才有),放进展示柜亮黄绿色的光;招客概率、顾客面板、灯的提示都沿用原版暗灯(每盏 15% + 黑市声望的一半,封顶 95%)。
|
||||||
|
- 换币客户一半来卖币、一半来买币,都用现金:
|
||||||
|
- 卖币(原来的收黑币并进来,不再单独上门):帮派火并、镇压期间多是 CRT,袭击上层、下层动荡期间多是 PSC,这类币全额污点;平时在 PSC、CRT、CRA 里随机,污点占市值 20%–90%,要价从市值的 80% 降到 45%。客户报出转出地址,地址的来历(混币器、黑市平台、骗局地址或 Poinbase、DEX)写进链上账本,浏览器里能查;污点同样不超过钱包价值。Ponero 兑换处开放后偶尔有人出手 Ponero;便衣规则不变。
|
||||||
|
- 买币:什么币都可能要,数量按房租 2–8 倍;三档报价(市价 +5% / +15% / +30%,客户接受的概率 95% / 65% / 30%)。谈妥后客户留下地址先走,在 PLEDGER 上把币转过去,确认后现金到账;当天睡觉前没转的账单作废。卖出的币不追查污点。
|
||||||
|
- 浏览器里换币客户的地址显示为“换币客户”。
|
||||||
|
- 存档数据版本 4:读旧存档时出块奖励和 NPC 算力按 stage 1 的新数值放大 10 倍(保留减半进度)。
|
||||||
|
- 手册“收黑币”一节改写为“换币客户”,8 种语言。
|
||||||
|
|
||||||
## 1.1.0
|
## 1.1.0
|
||||||
|
|
||||||
市场与洗钱的平衡调整:Poinbase 改为订单簿、DEX 稳定币对改为稳定币池、保险基金和爆仓新闻、预测市场流动性、收黑币、浏览器记录钱包的每一笔进出。存档兼容,读旧存档时自动升级。
|
市场与洗钱的平衡调整:Poinbase 改为订单簿、DEX 稳定币对改为稳定币池、保险基金和爆仓新闻、预测市场流动性、收黑币、浏览器记录钱包的每一笔进出。存档兼容,读旧存档时自动升级。
|
||||||
|
|||||||
Binary file not shown.
+29
-2
@@ -44,6 +44,9 @@ C = {
|
|||||||
'P': (0xD8, 0xDA, 0xD0), # 墨水屏
|
'P': (0xD8, 0xDA, 0xD0), # 墨水屏
|
||||||
'K': (0x3C, 0x3F, 0x48), # 石墨机身
|
'K': (0x3C, 0x3F, 0x48), # 石墨机身
|
||||||
'E': (0x5A, 0x5E, 0x6A), # 机身受光边
|
'E': (0x5A, 0x5E, 0x6A), # 机身受光边
|
||||||
|
# 换币灯的黄绿色霓虹(带透明度:光晕由外向内 20% / 40% / 60% / 80%,灯芯不透明)
|
||||||
|
'N1': (0xB6, 0xF0, 0x5A, 52), 'N2': (0xB6, 0xF0, 0x5A, 103), 'N3': (0xB6, 0xF0, 0x5A, 153), 'N4': (0xB6, 0xF0, 0x5A, 204),
|
||||||
|
'N5': (0xD8, 0xFF, 0x7A), 'N6': (0x6E, 0xA8, 0x2E), 'N7': (0x3E, 0x6A, 0x1E),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -73,7 +76,7 @@ class Canvas:
|
|||||||
for row in self.px:
|
for row in self.px:
|
||||||
line = bytearray()
|
line = bytearray()
|
||||||
for c in row:
|
for c in row:
|
||||||
r, g, b, a = (0, 0, 0, 0) if c is None else C[c] + (255,)
|
r, g, b, a = (0, 0, 0, 0) if c is None else (C[c] + (255,))[:4]
|
||||||
if bg is not None:
|
if bg is not None:
|
||||||
r, g, b = (round(v * a / 255 + w * (255 - a) / 255) for v, w in zip((r, g, b), bg))
|
r, g, b = (round(v * a / 255 + w * (255 - a) / 255) for v, w in zip((r, g, b), bg))
|
||||||
a = 255
|
a = 255
|
||||||
@@ -665,8 +668,31 @@ def key_drive():
|
|||||||
return c
|
return c
|
||||||
|
|
||||||
|
|
||||||
|
def otc_lamp_on():
|
||||||
|
"""换币灯的点亮叠加图(32×48,和原版暗灯同尺寸,(0,0) 对齐):只画灯罩下面的光晕和灯芯,叠在熄灭的暗灯上。
|
||||||
|
光晕是灯罩下沿的椭圆(第 25–40 行),越靠中心越不透明;灯芯是中间一根竖条,底下一圈灯座光。"""
|
||||||
|
c = Canvas(32, 48)
|
||||||
|
rows = { # 每行光晕的左右边界(含)
|
||||||
|
25: (5, 26), 26: (4, 27), 27: (4, 27), 28: (3, 28), 29: (3, 28), 30: (3, 28), 31: (2, 29), 32: (2, 29),
|
||||||
|
33: (2, 29), 34: (3, 28), 35: (3, 28), 36: (4, 27), 37: (5, 26), 38: (6, 25), 39: (9, 22), 40: (13, 18),
|
||||||
|
}
|
||||||
|
for y, (x0, x1) in rows.items():
|
||||||
|
for x in range(x0, x1 + 1):
|
||||||
|
if y == 25 and 7 <= x <= 24:
|
||||||
|
continue # 灯罩下沿正中还是灯罩
|
||||||
|
d = (((x - 15.5) / 14) ** 2 + ((y - 32) / 8.5) ** 2) ** 0.5
|
||||||
|
c.put(x, y, 'N4' if d < 0.45 else 'N3' if d < 0.65 else 'N2' if d < 0.85 else 'N1')
|
||||||
|
for y in range(27, 37): # 灯芯
|
||||||
|
c.put(15, y, 'N5'); c.put(16, y, 'N6')
|
||||||
|
for y, (x0, x1) in {37: (13, 18), 38: (11, 20), 39: (11, 20), 40: (13, 18)}.items():
|
||||||
|
for x in range(x0, x1 + 1): # 灯座反光
|
||||||
|
c.put(x, y, 'N6' if y < 40 else 'N7')
|
||||||
|
for x in range(14, 18):
|
||||||
|
c.put(x, 38, 'N5')
|
||||||
|
return c
|
||||||
|
|
||||||
|
|
||||||
SPRITES = {
|
SPRITES = {
|
||||||
'gpu_guide': guide,
|
|
||||||
'gpu_burnt_f': lambda: gpu_front('e', 'c', burnt=True),
|
'gpu_burnt_f': lambda: gpu_front('e', 'c', burnt=True),
|
||||||
'gpu_burnt_b': lambda: gpu_back('e', 'c', burnt=True),
|
'gpu_burnt_b': lambda: gpu_back('e', 'c', burnt=True),
|
||||||
'gpu_probidia_b': lambda: gpu_back('G', 'g2'),
|
'gpu_probidia_b': lambda: gpu_back('G', 'g2'),
|
||||||
@@ -779,6 +805,7 @@ OVERLAYS = {
|
|||||||
'gpu_ov_fin1': lambda: ov_fingers(1), 'gpu_ov_fin2': lambda: ov_fingers(2),
|
'gpu_ov_fin1': lambda: ov_fingers(1), 'gpu_ov_fin2': lambda: ov_fingers(2),
|
||||||
'gpu_ov_brk1': lambda: ov_bracket(1),
|
'gpu_ov_brk1': lambda: ov_bracket(1),
|
||||||
'gpu_ov_stk2': lambda: ov_sticker(2),
|
'gpu_ov_stk2': lambda: ov_sticker(2),
|
||||||
|
'otc_lamp_on': otc_lamp_on,
|
||||||
}
|
}
|
||||||
for _n in (1, 2, 3):
|
for _n in (1, 2, 3):
|
||||||
OVERLAYS['gpu_ov_fan1_%d' % _n] = (lambda n=_n: ov_fan(1, n))
|
OVERLAYS['gpu_ov_fan1_%d' % _n] = (lambda n=_n: ov_fan(1, n))
|
||||||
|
|||||||
@@ -1,55 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace Decentralized.Domain
|
|
||||||
{
|
|
||||||
/// <summary>一笔黑币报价:卖家手里的币、按现价的市值和他要的现金。Sting 是钓鱼执法(收下就记罪证,币不会到)。</summary>
|
|
||||||
public sealed class HotOffer
|
|
||||||
{
|
|
||||||
public string Asset;
|
|
||||||
public double Qty, Value;
|
|
||||||
public int Cash;
|
|
||||||
public bool Sting;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 收黑币:游戏里出了事,手里有来路不明的币的人上门,折价换现金。
|
|
||||||
/// 帮派火并、镇压期间黑市的人出手 CRT;革命军袭击上层、下层动荡期间有人出手抢来的 PSC;黑市声望够了以后偶尔有人出手勒索得来的 Ponero。
|
|
||||||
/// PSC、CRT 链上可追,收下的币按市值全额带污点;Ponero 不可追、不带污点,折扣也小,出口只有 Ponero 兑换处。
|
|
||||||
/// </summary>
|
|
||||||
public static class HotCoins
|
|
||||||
{
|
|
||||||
/// <summary>今天哪种黑币可能有人上门(按游戏当前的事件),没有返回 null。poneroOpen:Ponero 兑换处已开放。</summary>
|
|
||||||
public static string Pick(ICollection<MarketEvent> active, bool poneroOpen, Rng rng)
|
|
||||||
{
|
|
||||||
var c = new List<string>();
|
|
||||||
if (active.Contains(MarketEvent.GangWar) || active.Contains(MarketEvent.Crackdown)) c.Add(Assets.CRT);
|
|
||||||
if (active.Contains(MarketEvent.RevRaidUpper) || active.Contains(MarketEvent.LowerUnrest)) c.Add(Assets.PSC);
|
|
||||||
if (c.Count > 0 && rng.Chance(Tuning.HotEventChance)) return c[rng.Range(0, c.Count - 1)];
|
|
||||||
if (poneroOpen && rng.Chance(Tuning.HotPoneroChance)) return Assets.Ponero;
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>开价:市值 = 房租 × 区间,现金要价 = 市值 × 折扣(Ponero 折扣小)。crackdown:镇压期间钓鱼执法更多。</summary>
|
|
||||||
public static HotOffer Make(string asset, double coinPrice, double rent, bool crackdown, Rng rng)
|
|
||||||
{
|
|
||||||
if (coinPrice <= 0 || rent <= 0) return null;
|
|
||||||
double value = rent * rng.Range(Tuning.HotValueMinRents, Tuning.HotValueMaxRents);
|
|
||||||
bool ponero = asset == Assets.Ponero;
|
|
||||||
double cut = ponero ? rng.Range(Tuning.HotPoneroCutMin, Tuning.HotPoneroCutMax) : rng.Range(Tuning.HotCutMin, Tuning.HotCutMax);
|
|
||||||
return new HotOffer
|
|
||||||
{
|
|
||||||
Asset = asset, Qty = value / coinPrice, Value = value, Cash = (int)Math.Round(value * cut),
|
|
||||||
Sting = rng.Chance(Tuning.HotSting + (crackdown ? Tuning.HotStingCrackdown : 0)),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>收下:币进钱包,成本是付出的现金;PSC、CRT 按市值记污点,Ponero 不记。钓鱼执法不在这里处理。</summary>
|
|
||||||
public static void Receive(Wallet w, HotOffer o)
|
|
||||||
{
|
|
||||||
w.Add(o.Asset, o.Qty);
|
|
||||||
w.Basis += o.Cash;
|
|
||||||
if (o.Asset != Assets.Ponero) w.Taint += o.Value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,129 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Decentralized.Domain
|
||||||
|
{
|
||||||
|
/// <summary>换币客户的来意:卖币给玩家(玩家付现金收币),或者向玩家买币(玩家转币收现金)。</summary>
|
||||||
|
public enum OtcSide { Sell, Buy }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 一位换币客户的报价。Sell:客户手里的币(Qty、按现价的市值 Value、污点比例 TaintRatio)和他要的现金 Cash;Sting 是便衣(收下就记罪证,币不会到)。
|
||||||
|
/// Buy:客户要买的币和数量,Value 是按现价的市值,成交价按玩家选的报价档加溢价。
|
||||||
|
/// </summary>
|
||||||
|
public sealed class OtcOffer
|
||||||
|
{
|
||||||
|
public OtcSide Side;
|
||||||
|
public string Asset;
|
||||||
|
public double Qty, Value, TaintRatio;
|
||||||
|
public int Cash;
|
||||||
|
public bool Sting;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>换币台的累计统计(存档):成交额(信用点)、笔数、客户地址编号;混币器提议是否已经发过(第三阶段用)。</summary>
|
||||||
|
public sealed class OtcDesk
|
||||||
|
{
|
||||||
|
public double Volume;
|
||||||
|
public int Deals, Seq;
|
||||||
|
public bool MixerOffered;
|
||||||
|
|
||||||
|
public void Record(double cash) { Volume += Math.Max(0, cash); Deals++; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 换币客户(场外换币台):小偷灯切到"换币客户"后招来,一半来卖币、一半来买币。
|
||||||
|
/// 卖币沿用原来的收黑币:帮派火并、镇压期间多是 CRT,革命军袭击上层、下层动荡期间多是 PSC,这类币全额带污点;
|
||||||
|
/// 其他时候在 PSC、CRT、CRA 里随机,污点比例随机,现金价按污点比例打折;Ponero 兑换处开放后偶尔有人出手 Ponero(不带污点)。
|
||||||
|
/// 买币:什么币都可能要,玩家选报价档,溢价越高越难成交;卖出的币不追查污点。
|
||||||
|
/// </summary>
|
||||||
|
public static class Otc
|
||||||
|
{
|
||||||
|
/// <summary>客户卖币时可能出手的币(没有相关事件时随机)。</summary>
|
||||||
|
public static readonly string[] SellAssets = { Assets.PSC, Assets.CRT, Assets.CRA };
|
||||||
|
/// <summary>客户买币时可能要的币。</summary>
|
||||||
|
public static readonly string[] BuyAssets = { Assets.PSC, Assets.CRC, Assets.CRT, Assets.CRA, Assets.SPARK };
|
||||||
|
|
||||||
|
public static OtcSide PickSide(Rng rng) => rng.Chance(Tuning.OtcSellShare) ? OtcSide.Sell : OtcSide.Buy;
|
||||||
|
|
||||||
|
/// <summary>和当前事件有关的币(帮派火并、镇压 → CRT;袭击上层、下层动荡 → PSC),没有返回 null。</summary>
|
||||||
|
public static string EventAsset(ICollection<MarketEvent> active, Rng rng)
|
||||||
|
{
|
||||||
|
var c = new List<string>();
|
||||||
|
if (active.Contains(MarketEvent.GangWar) || active.Contains(MarketEvent.Crackdown)) c.Add(Assets.CRT);
|
||||||
|
if (active.Contains(MarketEvent.RevRaidUpper) || active.Contains(MarketEvent.LowerUnrest)) c.Add(Assets.PSC);
|
||||||
|
return c.Count == 0 ? null : c[rng.Range(0, c.Count - 1)];
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 卖币客户的报价。有相关事件时按 OtcEventChance 出手事件里来的币(全额污点);Ponero 兑换处开放时按 OtcPoneroChance 出手 Ponero;
|
||||||
|
/// 否则在 PSC、CRT、CRA 里随机,污点比例在 OtcTaintMin–OtcTaintMax 之间。市值 = 房租 × 区间;现金价 = 市值 × 折扣,折扣按污点比例从 OtcCutClean 线性降到 OtcCutDirty。
|
||||||
|
/// crackdown:镇压期间便衣更多。
|
||||||
|
/// </summary>
|
||||||
|
public static OtcOffer MakeSell(ICollection<MarketEvent> active, bool poneroOpen, Func<string, double> price, double rent, Rng rng)
|
||||||
|
{
|
||||||
|
if (rent <= 0) return null;
|
||||||
|
string asset = null; double ratio;
|
||||||
|
string ev = EventAsset(active, rng);
|
||||||
|
if (ev != null && rng.Chance(Tuning.OtcEventChance)) { asset = ev; ratio = 1; }
|
||||||
|
else if (poneroOpen && rng.Chance(Tuning.OtcPoneroChance)) { asset = Assets.Ponero; ratio = 0; }
|
||||||
|
else { asset = SellAssets[rng.Range(0, SellAssets.Length - 1)]; ratio = rng.Range(Tuning.OtcTaintMin, Tuning.OtcTaintMax); }
|
||||||
|
double p = price(asset);
|
||||||
|
if (p <= 0) return null;
|
||||||
|
double value = rent * rng.Range(Tuning.OtcValueMinRents, Tuning.OtcValueMaxRents);
|
||||||
|
double cut = asset == Assets.Ponero ? rng.Range(Tuning.OtcPoneroCutMin, Tuning.OtcPoneroCutMax) : CutFor(ratio);
|
||||||
|
bool crackdown = active.Contains(MarketEvent.Crackdown);
|
||||||
|
return new OtcOffer
|
||||||
|
{
|
||||||
|
Side = OtcSide.Sell, Asset = asset, Qty = value / p, Value = value, TaintRatio = ratio, Cash = (int)Math.Round(value * cut),
|
||||||
|
Sting = rng.Chance(Tuning.OtcSting + (crackdown ? Tuning.OtcStingCrackdown : 0)),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>现金价占市值的比例:污点比例 0 时 OtcCutClean,1 时 OtcCutDirty,之间线性。</summary>
|
||||||
|
public static double CutFor(double taintRatio) => Tuning.OtcCutClean + (Tuning.OtcCutDirty - Tuning.OtcCutClean) * Math.Max(0, Math.Min(1, taintRatio));
|
||||||
|
|
||||||
|
/// <summary>买币客户的来意:随机一种币,市值 = 房租 × OtcBuyMinRents–OtcBuyMaxRents。</summary>
|
||||||
|
public static OtcOffer MakeBuy(Func<string, double> price, double rent, Rng rng)
|
||||||
|
{
|
||||||
|
if (rent <= 0) return null;
|
||||||
|
string asset = BuyAssets[rng.Range(0, BuyAssets.Length - 1)];
|
||||||
|
double p = price(asset);
|
||||||
|
if (p <= 0) return null;
|
||||||
|
double value = rent * rng.Range(Tuning.OtcBuyMinRents, Tuning.OtcBuyMaxRents);
|
||||||
|
return new OtcOffer { Side = OtcSide.Buy, Asset = asset, Qty = value / p, Value = value };
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>买币客户在第 tier 档(0–2)的成交价(信用点):市值 × (1 + 溢价)。</summary>
|
||||||
|
public static int Quote(OtcOffer o, int tier) => (int)Math.Round(o.Value * (1 + Tuning.OtcPremium[tier]));
|
||||||
|
|
||||||
|
/// <summary>客户接不接受第 tier 档的报价。</summary>
|
||||||
|
public static bool Accepts(int tier, Rng rng) => rng.Chance(Tuning.OtcAccept[tier]);
|
||||||
|
|
||||||
|
/// <summary>收下卖币客户的币:币进钱包,成本是付出的现金;污点 = 市值 × 污点比例(带上限)。返回超出钱包价值、没加进去的污点。</summary>
|
||||||
|
public static double Receive(Wallet w, OtcOffer o, Func<string, double> price)
|
||||||
|
{
|
||||||
|
w.Add(o.Asset, o.Qty);
|
||||||
|
w.Basis += o.Cash;
|
||||||
|
return o.TaintRatio > 0 ? w.AddTaintCapped(o.Value * o.TaintRatio, price) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 客户地址的来历(写进链上账本,玩家在浏览器里能查到):1–OtcHistoryMax 笔转入,每一笔按污点比例的概率来自"脏"的来源(混币器、黑市平台、骗局地址),否则来自 Poinbase 或 DEX。
|
||||||
|
/// 返回 (来源地址, 数量占比) 列表;dirty 和 clean 由接入层给出地址。
|
||||||
|
/// </summary>
|
||||||
|
public static List<KeyValuePair<string, double>> History(OtcOffer o, IList<string> dirty, IList<string> clean, Rng rng)
|
||||||
|
{
|
||||||
|
var list = new List<KeyValuePair<string, double>>();
|
||||||
|
int n = rng.Range(1, Tuning.OtcHistoryMax);
|
||||||
|
double left = 1;
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
bool isDirty = dirty.Count > 0 && rng.Chance(o.TaintRatio);
|
||||||
|
var src = isDirty ? dirty[rng.Range(0, dirty.Count - 1)] : clean[rng.Range(0, clean.Count - 1)];
|
||||||
|
double share = i == n - 1 ? left : left * rng.Range(0.3, 0.7);
|
||||||
|
left -= share;
|
||||||
|
list.Add(new KeyValuePair<string, double>(src, share));
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,6 +10,8 @@ namespace Decentralized.Domain
|
|||||||
|
|
||||||
// 挖矿
|
// 挖矿
|
||||||
public const double PscStartPrice = 100;
|
public const double PscStartPrice = 100;
|
||||||
|
/// <summary>第十一阶段把出块奖励和 NPC 初始算力同乘的倍数(100 → 1000、360 → 3600);读旧存档时按它放大全网。</summary>
|
||||||
|
public const double MiningScale = 10;
|
||||||
public const double BlockReward = 1000;
|
public const double BlockReward = 1000;
|
||||||
public const int HalvingDays = 90;
|
public const int HalvingDays = 90;
|
||||||
/// <summary>减半对币价的传导:每次减半在区间内随机一个指数,价格锚上移 2^指数 倍(0.15–0.85 即约 +11% 到 +80%)。
|
/// <summary>减半对币价的传导:每次减半在区间内随机一个指数,价格锚上移 2^指数 倍(0.15–0.85 即约 +11% 到 +80%)。
|
||||||
@@ -289,10 +291,18 @@ namespace Decentralized.Domain
|
|||||||
public const double YieldPoolChance = 0.25, YieldRugNightly = 0.18, YieldCap0 = 4000, YieldCapPerDay = 120, YieldReserveDays = 25;
|
public const double YieldPoolChance = 0.25, YieldRugNightly = 0.18, YieldCap0 = 4000, YieldCapPerDay = 120, YieldReserveDays = 25;
|
||||||
public static readonly double[] YieldRates = { 0.01, 0.02, 0.03 }, YieldScamByRate = { 0.15, 0.40, 0.75 };
|
public static readonly double[] YieldRates = { 0.01, 0.02, 0.03 }, YieldScamByRate = { 0.15, 0.40, 0.75 };
|
||||||
public const double YieldScamTimelock = 0.25, YieldScamAudit = 0.20;
|
public const double YieldScamTimelock = 0.25, YieldScamAudit = 0.20;
|
||||||
/// <summary>收黑币:相关事件期间每天有人上门的概率(PSC、CRT),Ponero 兑换处开放后每天的概率;币的市值(房租的倍数);
|
/// <summary>换币客户(场外换币台):人脉升级价格;来卖币的比例(其余来买币)。</summary>
|
||||||
/// 现金要价占市值的比例(PSC、CRT 与 Ponero 分开);钓鱼执法的概率与镇压期间的加成。</summary>
|
public const int OtcUnlockPrice = 500;
|
||||||
public const double HotEventChance = 0.35, HotPoneroChance = 0.05, HotValueMinRents = 4, HotValueMaxRents = 15;
|
public const double OtcSellShare = 0.5;
|
||||||
public const double HotCutMin = 0.45, HotCutMax = 0.60, HotPoneroCutMin = 0.70, HotPoneroCutMax = 0.80, HotSting = 0.05, HotStingCrackdown = 0.10;
|
/// <summary>卖币客户:有相关事件时出手事件里来的币(全额污点)的概率,Ponero 兑换处开放后出手 Ponero 的概率;币的市值(房租的倍数);
|
||||||
|
/// 其他币的污点比例范围;现金价占市值的比例(污点比例 0 时、1 时,之间线性;Ponero 单独一档);便衣的概率与镇压期间的加成;客户地址来历的最多笔数。</summary>
|
||||||
|
public const double OtcEventChance = 0.7, OtcPoneroChance = 0.15, OtcValueMinRents = 4, OtcValueMaxRents = 15;
|
||||||
|
public const double OtcTaintMin = 0.2, OtcTaintMax = 0.9, OtcCutClean = 0.80, OtcCutDirty = 0.45, OtcPoneroCutMin = 0.70, OtcPoneroCutMax = 0.80;
|
||||||
|
public const double OtcSting = 0.05, OtcStingCrackdown = 0.10;
|
||||||
|
public const int OtcHistoryMax = 3;
|
||||||
|
/// <summary>买币客户:要买的币的市值(房租的倍数);三档报价的溢价与客户接受的概率。</summary>
|
||||||
|
public const double OtcBuyMinRents = 2, OtcBuyMaxRents = 8;
|
||||||
|
public static readonly double[] OtcPremium = { 0.05, 0.15, 0.30 }, OtcAccept = { 0.95, 0.65, 0.30 };
|
||||||
/// <summary>假客服:每天上门的概率;伪造转账:用币付款的顾客里是骗子的比例;两者都从第几天起。</summary>
|
/// <summary>假客服:每天上门的概率;伪造转账:用币付款的顾客里是骗子的比例;两者都从第几天起。</summary>
|
||||||
public const double FakeSupportChance = 0.04, FakeTransferShare = 0.08;
|
public const double FakeSupportChance = 0.04, FakeTransferShare = 0.08;
|
||||||
public const int ScamMinDay = 10;
|
public const int ScamMinDay = 10;
|
||||||
|
|||||||
@@ -249,16 +249,6 @@ namespace Decentralized.Domain
|
|||||||
["HalvingPassMin"] = Tuning.HalvingPassMin,
|
["HalvingPassMin"] = Tuning.HalvingPassMin,
|
||||||
["HalvingRamp"] = Tuning.HalvingRamp,
|
["HalvingRamp"] = Tuning.HalvingRamp,
|
||||||
["HalvingRampDays"] = Tuning.HalvingRampDays,
|
["HalvingRampDays"] = Tuning.HalvingRampDays,
|
||||||
["HotCutMax"] = Tuning.HotCutMax,
|
|
||||||
["HotCutMin"] = Tuning.HotCutMin,
|
|
||||||
["HotEventChance"] = Tuning.HotEventChance,
|
|
||||||
["HotPoneroChance"] = Tuning.HotPoneroChance,
|
|
||||||
["HotPoneroCutMax"] = Tuning.HotPoneroCutMax,
|
|
||||||
["HotPoneroCutMin"] = Tuning.HotPoneroCutMin,
|
|
||||||
["HotSting"] = Tuning.HotSting,
|
|
||||||
["HotStingCrackdown"] = Tuning.HotStingCrackdown,
|
|
||||||
["HotValueMaxRents"] = Tuning.HotValueMaxRents,
|
|
||||||
["HotValueMinRents"] = Tuning.HotValueMinRents,
|
|
||||||
["IntelBriefPrice"] = Tuning.IntelBriefPrice,
|
["IntelBriefPrice"] = Tuning.IntelBriefPrice,
|
||||||
["IntelFake"] = Tuning.IntelFake,
|
["IntelFake"] = Tuning.IntelFake,
|
||||||
["IntelRep"] = Tuning.IntelRep,
|
["IntelRep"] = Tuning.IntelRep,
|
||||||
@@ -268,6 +258,7 @@ namespace Decentralized.Domain
|
|||||||
["ManipFree"] = Tuning.ManipFree,
|
["ManipFree"] = Tuning.ManipFree,
|
||||||
["ManipMax"] = Tuning.ManipMax,
|
["ManipMax"] = Tuning.ManipMax,
|
||||||
["ManipSlope"] = Tuning.ManipSlope,
|
["ManipSlope"] = Tuning.ManipSlope,
|
||||||
|
["MiningScale"] = Tuning.MiningScale,
|
||||||
["MixerCleanRate"] = Tuning.MixerCleanRate,
|
["MixerCleanRate"] = Tuning.MixerCleanRate,
|
||||||
["MixerFee"] = Tuning.MixerFee,
|
["MixerFee"] = Tuning.MixerFee,
|
||||||
["MixerMaxRounds"] = Tuning.MixerMaxRounds,
|
["MixerMaxRounds"] = Tuning.MixerMaxRounds,
|
||||||
@@ -285,6 +276,23 @@ namespace Decentralized.Domain
|
|||||||
["NpcHash0"] = Tuning.NpcHash0,
|
["NpcHash0"] = Tuning.NpcHash0,
|
||||||
["NpcKjPerH"] = Tuning.NpcKjPerH,
|
["NpcKjPerH"] = Tuning.NpcKjPerH,
|
||||||
["NpcTargetRatio"] = Tuning.NpcTargetRatio,
|
["NpcTargetRatio"] = Tuning.NpcTargetRatio,
|
||||||
|
["OtcBuyMaxRents"] = Tuning.OtcBuyMaxRents,
|
||||||
|
["OtcBuyMinRents"] = Tuning.OtcBuyMinRents,
|
||||||
|
["OtcCutClean"] = Tuning.OtcCutClean,
|
||||||
|
["OtcCutDirty"] = Tuning.OtcCutDirty,
|
||||||
|
["OtcEventChance"] = Tuning.OtcEventChance,
|
||||||
|
["OtcHistoryMax"] = Tuning.OtcHistoryMax,
|
||||||
|
["OtcPoneroChance"] = Tuning.OtcPoneroChance,
|
||||||
|
["OtcPoneroCutMax"] = Tuning.OtcPoneroCutMax,
|
||||||
|
["OtcPoneroCutMin"] = Tuning.OtcPoneroCutMin,
|
||||||
|
["OtcSellShare"] = Tuning.OtcSellShare,
|
||||||
|
["OtcSting"] = Tuning.OtcSting,
|
||||||
|
["OtcStingCrackdown"] = Tuning.OtcStingCrackdown,
|
||||||
|
["OtcTaintMax"] = Tuning.OtcTaintMax,
|
||||||
|
["OtcTaintMin"] = Tuning.OtcTaintMin,
|
||||||
|
["OtcUnlockPrice"] = Tuning.OtcUnlockPrice,
|
||||||
|
["OtcValueMaxRents"] = Tuning.OtcValueMaxRents,
|
||||||
|
["OtcValueMinRents"] = Tuning.OtcValueMinRents,
|
||||||
["PerpAdlHaircut"] = Tuning.PerpAdlHaircut,
|
["PerpAdlHaircut"] = Tuning.PerpAdlHaircut,
|
||||||
["PerpBanDays"] = Tuning.PerpBanDays,
|
["PerpBanDays"] = Tuning.PerpBanDays,
|
||||||
["PerpDebtDays"] = Tuning.PerpDebtDays,
|
["PerpDebtDays"] = Tuning.PerpDebtDays,
|
||||||
@@ -480,6 +488,8 @@ namespace Decentralized.Domain
|
|||||||
["CraSpiralPath"] = Array.ConvertAll(Tuning.CraSpiralPath, v => (double)v),
|
["CraSpiralPath"] = Array.ConvertAll(Tuning.CraSpiralPath, v => (double)v),
|
||||||
["IntelTipAcc"] = Array.ConvertAll(Tuning.IntelTipAcc, v => (double)v),
|
["IntelTipAcc"] = Array.ConvertAll(Tuning.IntelTipAcc, v => (double)v),
|
||||||
["IntelTipPrice"] = Array.ConvertAll(Tuning.IntelTipPrice, v => (double)v),
|
["IntelTipPrice"] = Array.ConvertAll(Tuning.IntelTipPrice, v => (double)v),
|
||||||
|
["OtcAccept"] = Array.ConvertAll(Tuning.OtcAccept, v => (double)v),
|
||||||
|
["OtcPremium"] = Array.ConvertAll(Tuning.OtcPremium, v => (double)v),
|
||||||
["PonziRates"] = Array.ConvertAll(Tuning.PonziRates, v => (double)v),
|
["PonziRates"] = Array.ConvertAll(Tuning.PonziRates, v => (double)v),
|
||||||
["SparkSpiralPath"] = Array.ConvertAll(Tuning.SparkSpiralPath, v => (double)v),
|
["SparkSpiralPath"] = Array.ConvertAll(Tuning.SparkSpiralPath, v => (double)v),
|
||||||
["UsedHealthMax"] = Array.ConvertAll(Tuning.UsedHealthMax, v => (double)v),
|
["UsedHealthMax"] = Array.ConvertAll(Tuning.UsedHealthMax, v => (double)v),
|
||||||
|
|||||||
@@ -1,107 +0,0 @@
|
|||||||
using System;
|
|
||||||
using Decentralized.Domain;
|
|
||||||
|
|
||||||
namespace Decentralized
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 收黑币的上门顾客(游戏的对话顾客):游戏里出了事,有人拿着来路不明的币折价换现金,见 <see cref="HotCoins"/>。
|
|
||||||
/// 一天最多一位。收下:付现金,币进已连接的钱包(PSC、CRT 全额带污点);钓鱼执法:现金被没收并记销赃罪证,币不会到。
|
|
||||||
/// </summary>
|
|
||||||
public static class HotCoinSeller
|
|
||||||
{
|
|
||||||
private static int seenDay = -1;
|
|
||||||
|
|
||||||
public static void Subscribe()
|
|
||||||
{
|
|
||||||
ModHook.OnGenerateCustomerLate += OnGenerate;
|
|
||||||
ModHelper.AddDebugFunction(ModInfo.Id, ModInfo.Name, "Hot coin seller (test)", () => Log.Guard("收黑币(测试)", () =>
|
|
||||||
{
|
|
||||||
var d = Session.Data;
|
|
||||||
string[] assets = { Assets.CRT, Assets.PSC, Assets.Ponero };
|
|
||||||
var c = Create(assets[d.Rng.Range(0, assets.Length - 1)]);
|
|
||||||
if (c == null) return;
|
|
||||||
PlayerStore.Instance.currentClientInstance = null;
|
|
||||||
PlayerStore.Instance.storeClientManager.clientStack.Insert(0, c);
|
|
||||||
PlayerStore.Instance.TryCallNextClient();
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void Unsubscribe() => ModHook.OnGenerateCustomerLate -= OnGenerate;
|
|
||||||
|
|
||||||
private static void OnGenerate(StoreClientManager manager)
|
|
||||||
{
|
|
||||||
var d = Session.Data;
|
|
||||||
if (d == null || !Unlock.IsUnlocked || !d.Connected) return;
|
|
||||||
Log.Guard("收黑币", () =>
|
|
||||||
{
|
|
||||||
int day = StoreStation.GetDayCounter();
|
|
||||||
if (day == seenDay) return;
|
|
||||||
seenDay = day;
|
|
||||||
bool ponero = Unlock.BlackUnlocked && BlackMarket.DeskOpen(StoreReputation.GetBMReputation());
|
|
||||||
string asset = HotCoins.Pick(Night.ActiveEvents(), ponero, d.Rng);
|
|
||||||
if (asset == null) return;
|
|
||||||
var c = Create(asset);
|
|
||||||
if (c != null) manager.AddClient(c);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private static StoreClient Create(string asset)
|
|
||||||
{
|
|
||||||
var d = Session.Data;
|
|
||||||
bool crackdown = Night.ActiveEvents().Contains(MarketEvent.Crackdown);
|
|
||||||
var o = HotCoins.Make(asset, Session.Price(asset), Session.Rent(), crackdown, d.Rng);
|
|
||||||
if (o == null) return null;
|
|
||||||
var c = new StoreClient
|
|
||||||
{
|
|
||||||
identifier = "pd_hot_coins", displayName = L.T("hot.name"),
|
|
||||||
spriteName = asset == Assets.CRT ? SpriteDict.GetRandomBMMaleSpriteName() : asset == Assets.PSC ? SpriteDict.GetRandomRevSpriteName() : SpriteDict.GetRandomShadySpriteName(),
|
|
||||||
clientIntent = StoreClient.ClientIntent.DIALOGUE,
|
|
||||||
};
|
|
||||||
// 选项的动作先于下一句执行:在动作里结算,再把卖家的回话换成结果
|
|
||||||
var yes = new Dialogue();
|
|
||||||
var reply = yes.SetText("PLAYER", L.T("hot.say.yes")).NextDialogue();
|
|
||||||
reply.SetText(c.displayName, L.T("hot.refused")).SetEndAction(Leave);
|
|
||||||
var no = new Dialogue();
|
|
||||||
no.SetText("PLAYER", L.T("hot.say.no")).NextDialogue().SetText(c.displayName, L.T("hot.refused")).SetEndAction(Leave);
|
|
||||||
c.mainDialogue.SetText(c.displayName, L.T("hot.intro." + asset)).NextDialogue()
|
|
||||||
.SetText(c.displayName, L.T("hot.offer", Fmt.Num(o.Qty), asset, Fmt.Credits(o.Value), Fmt.Credits(o.Cash)))
|
|
||||||
.AddChoice(DirectoryMaster.Item("yes"), L.T("hot.choice.yes"), "", yes, () => reply.SetText(c.displayName, L.T(Accept(o))))
|
|
||||||
.AddChoice(DirectoryMaster.Item("cancel"), L.T("hot.choice.no"), "", no, null);
|
|
||||||
ModHelper.SetClientSource(c, ModInfo.Id);
|
|
||||||
c.AddBasicDialog();
|
|
||||||
c.CompleteClientCreation();
|
|
||||||
Log.Info($"收黑币上门:{o.Qty:0.##} {asset},市值 {o.Value:0},要价 {o.Cash}{(o.Sting ? "(钓鱼执法)" : "")}");
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>选了收下:现金不够或没连钱包就作罢;钓鱼执法没收现金、记罪证;否则付现金、币进钱包。返回卖家回话的键。</summary>
|
|
||||||
private static string Accept(HotOffer o)
|
|
||||||
{
|
|
||||||
string line = "hot.refused";
|
|
||||||
Log.Guard("收黑币成交", () =>
|
|
||||||
{
|
|
||||||
var d = Session.Data;
|
|
||||||
if (!d.Connected) { line = "hot.nowallet"; return; }
|
|
||||||
if (PlayerStore.Instance.playerCash < o.Cash) { line = "hot.nocash"; return; }
|
|
||||||
ModHelper.AddCredit(-o.Cash, false);
|
|
||||||
if (o.Sting)
|
|
||||||
{
|
|
||||||
PlayerStore.Instance.secData.CommitCrime("FENCING", (int)Math.Min(Tuning.CrimeEventCap, o.Cash));
|
|
||||||
line = "hot.sting";
|
|
||||||
Log.Info($"收黑币:钓鱼执法,现金 {o.Cash} 没收,记销赃罪证");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
HotCoins.Receive(d.Hot, o);
|
|
||||||
d.Chain(ChainAddress.Make(d.Rng.NextUInt()), d.Hot.Address, o.Asset, o.Qty);
|
|
||||||
line = "hot.done";
|
|
||||||
Log.Info($"收黑币:{o.Qty:0.##} {o.Asset} 进 {WalletWindow.NameOf(d.Hot)},付现金 {o.Cash},钱包污点 {d.Hot.Taint:0}");
|
|
||||||
}
|
|
||||||
Session.Save();
|
|
||||||
});
|
|
||||||
return line;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void Leave() => DialogUIManager.Instance.CurrentClientLeave();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -58,6 +58,7 @@ namespace Decentralized
|
|||||||
dir.Add(Rig, CreateRig);
|
dir.Add(Rig, CreateRig);
|
||||||
WrapElectronics(dir);
|
WrapElectronics(dir);
|
||||||
WrapTurbos(dir);
|
WrapTurbos(dir);
|
||||||
|
OtcLamp.Wrap(dir);
|
||||||
dir.Add(Guide, CreateGuide);
|
dir.Add(Guide, CreateGuide);
|
||||||
dir.Add(HwWallet, CreateHwWallet);
|
dir.Add(HwWallet, CreateHwWallet);
|
||||||
dir.Add(KeyDrive, CreateKeyDrive);
|
dir.Add(KeyDrive, CreateKeyDrive);
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ namespace Decentralized
|
|||||||
DealerStock.Subscribe();
|
DealerStock.Subscribe();
|
||||||
UsedDealerClient.Subscribe();
|
UsedDealerClient.Subscribe();
|
||||||
CoinCustomers.Subscribe();
|
CoinCustomers.Subscribe();
|
||||||
HotCoinSeller.Subscribe();
|
OtcClient.Subscribe();
|
||||||
BlackDelivery.Subscribe();
|
BlackDelivery.Subscribe();
|
||||||
TumblerStory.Subscribe();
|
TumblerStory.Subscribe();
|
||||||
GpuInspectView.Ensure();
|
GpuInspectView.Ensure();
|
||||||
@@ -38,7 +38,7 @@ namespace Decentralized
|
|||||||
DealerStock.Unsubscribe();
|
DealerStock.Unsubscribe();
|
||||||
UsedDealerClient.Unsubscribe();
|
UsedDealerClient.Unsubscribe();
|
||||||
CoinCustomers.Unsubscribe();
|
CoinCustomers.Unsubscribe();
|
||||||
HotCoinSeller.Unsubscribe();
|
OtcClient.Unsubscribe();
|
||||||
BlackDelivery.Unsubscribe();
|
BlackDelivery.Unsubscribe();
|
||||||
TumblerStory.Unsubscribe();
|
TumblerStory.Unsubscribe();
|
||||||
GpuInspectView.Remove();
|
GpuInspectView.Remove();
|
||||||
|
|||||||
@@ -247,7 +247,7 @@ black.kind.Contraband.3,Schmuggelware (hoch)
|
|||||||
black.kind.Tech,Hightech (Aufpreis)
|
black.kind.Tech,Hightech (Aufpreis)
|
||||||
nightlog.bm.ready,"Schwarzmarkt: {0} eingetroffen; sobald du öffnest, kommt ein Kurier vorbei."
|
nightlog.bm.ready,"Schwarzmarkt: {0} eingetroffen; sobald du öffnest, kommt ein Kurier vorbei."
|
||||||
guide.web3.title,Web3-Handbuch
|
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. Der Poinbase-Spotmarkt hat zwei Paare, PSC/CRC und SPARK/CRC, je nach dem im Chart gewählten Coin. Käufe und Verkäufe werden beide als Menge des gehandelten Coins eingegeben; die Vorschau zeigt den gezahlten oder erhaltenen Notierungs-Coin, der Durchschnittspreis enthält die Gebühr, die Slippage nicht.¶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 addierender Slippage; die Vorschau zeigt Menge, Anzahl der Pools und Verlust. Stablecoin-Tausch (CRT oder CRA gegen CRC) läuft über Stable-Pools: {StableFee:%} Gebühr und kaum Slippage nahe der Bindung; beim Depeg wird die Liquidität dünner, beim Zusammenbruch wird sie abgezogen und die Slippage springt.§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 (nur PSC, CRC und SPARK; die regulierte Börse nimmt weder das CRT des Schwarzmarkts noch das CRA der Revolution, und die Wallet blockiert Überweisungen dieser Coins an die Einzahlungsadresse), Auszahlungen werden auf der Seite „Guthaben“ von Poinbase gestartet. Der Explorer auf der Wallets-Seite zeigt Überweisungen nach Adresse, ausschließlich tatsächlich erfolgte: jede Bewegung in und aus deinen Wallets (Überweisungen, DEX-Tausch und andere Vertragsaufrufe, Miner-Erträge, Auszahlungen, Coins, die andere dir schicken); Ponero ist ein Privacy Coin und erscheint nie. 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 langLine 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. Der Poinbase-Spotmarkt hat zwei Paare, PSC/CRC und SPARK/CRC, je nach dem im Chart gewählten Coin. Käufe und Verkäufe werden beide als Menge des gehandelten Coins eingegeben; die Vorschau zeigt den gezahlten oder erhaltenen Notierungs-Coin, der Durchschnittspreis enthält die Gebühr, die Slippage nicht.¶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 addierender Slippage; die Vorschau zeigt Menge, Anzahl der Pools und Verlust. Stablecoin-Tausch (CRT oder CRA gegen CRC) läuft über Stable-Pools: {StableFee:%} Gebühr und kaum Slippage nahe der Bindung; beim Depeg wird die Liquidität dünner, beim Zusammenbruch wird sie abgezogen und die Slippage springt.§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 (nur PSC, CRC und SPARK; die regulierte Börse nimmt weder das CRT des Schwarzmarkts noch das CRA der Revolution, und die Wallet blockiert Überweisungen dieser Coins an die Einzahlungsadresse), Auszahlungen werden auf der Seite „Guthaben“ von Poinbase gestartet. Der Explorer auf der Wallets-Seite zeigt Überweisungen nach Adresse, ausschließlich tatsächlich erfolgte: jede Bewegung in und aus deinen Wallets (Überweisungen, DEX-Tausch und andere Vertragsaufrufe, Miner-Erträge, Auszahlungen, Coins, die andere dir schicken); Ponero ist ein Privacy Coin und erscheint nie. 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 langLine truncated
|
||||||
courier.odd1,...Paket ist da.
|
courier.odd1,...Paket ist da.
|
||||||
courier.odd2,(Seine Hand bleibt in der Tasche.) Hier unterschreiben.
|
courier.odd2,(Seine Hand bleibt in der Tasche.) Hier unterschreiben.
|
||||||
courier.sign,Unterschreiben
|
courier.sign,Unterschreiben
|
||||||
@@ -964,18 +964,30 @@ news.wipe.down.title,"{0} fällt an einem Tag um {1}%, {2} Trader liquidiert"
|
|||||||
news.wipe.down.desc,"Am vergangenen Tag wurden {1} Long-Positionen auf {0}-Perps liquidiert, insgesamt {2} Credits. Der Versicherungsfonds von Poinbase steht bei {3} Credits."
|
news.wipe.down.desc,"Am vergangenen Tag wurden {1} Long-Positionen auf {0}-Perps liquidiert, insgesamt {2} Credits. Der Versicherungsfonds von Poinbase steht bei {3} Credits."
|
||||||
news.wipe.up.title,"{0} steigt an einem Tag um {1}%, {2} Trader liquidiert"
|
news.wipe.up.title,"{0} steigt an einem Tag um {1}%, {2} Trader liquidiert"
|
||||||
news.wipe.up.desc,"Am vergangenen Tag wurden {1} Short-Positionen auf {0}-Perps liquidiert, insgesamt {2} Credits. Der Versicherungsfonds von Poinbase steht bei {3} Credits."
|
news.wipe.up.desc,"Am vergangenen Tag wurden {1} Short-Positionen auf {0}-Perps liquidiert, insgesamt {2} Credits. Der Versicherungsfonds von Poinbase steht bei {3} Credits."
|
||||||
hot.name,Verkäufer
|
otc.name,OTC-Kunde
|
||||||
hot.intro.CRT,"Gerade ist die Lage angespannt, und dieses CRT ist mir zu heiß. Ich brauche schnell Bargeld."
|
otc.intro.CRT,"Gerade ist die Lage angespannt, und dieses CRT ist mir zu heiß. Ich brauche schnell Bargeld."
|
||||||
hot.intro.PSC,"Die Wallet einer Mining-Farm hat letzte Nacht den Besitzer gewechselt. Das PSC liegt jetzt bei mir, und ich nehme nur Bargeld."
|
otc.intro.PSC,"Die Wallet einer Mining-Farm hat letzte Nacht den Besitzer gewechselt. Das PSC liegt jetzt bei mir, und ich nehme nur Bargeld."
|
||||||
hot.intro.PONERO,"Lösegeld, in Ponero. Niemand kann es zurückverfolgen. Nur Bargeld."
|
otc.intro.PONERO,"Lösegeld, in Ponero. Niemand kann es zurückverfolgen. Nur Bargeld."
|
||||||
hot.offer,"{0} {1}, zum heutigen Kurs {2} wert. Gib mir {3} in bar, und die Coins gehören sofort dir."
|
otc.offer,"{0} {1}, zum heutigen Preis {2} wert, gesendet von {4}. Gib mir {3} in bar und die Coins gehören sofort dir."
|
||||||
hot.choice.yes,Annehmen
|
otc.intro.sell,"Habe etwas {0}, das ich zu Bargeld machen will. Prüf die Herkunft, wenn du willst."
|
||||||
hot.choice.no,Ablehnen
|
otc.buy.ask,"Ich will {0} {1}, zum heutigen Preis {2} wert. Bargeld. Nenn deinen Preis."
|
||||||
hot.say.yes,Abgemacht.
|
otc.tier,Markt +{0}%: {1}
|
||||||
hot.say.no,Davon lasse ich die Finger.
|
otc.buy.say,"{0}, keinen Credit weniger."
|
||||||
hot.done,Coins sind raus. Wir haben uns nie gesehen.
|
otc.buy.accept,"In Ordnung, {0}. Sende die Coins an {1}; Bargeld, sobald sie ankommen."
|
||||||
hot.refused,Andere nehmen es gern.
|
otc.buy.reject,Zu teuer. Vergiss es.
|
||||||
hot.nocash,Du hast nicht mal das Bargeld? Vergiss es.
|
otc.buy.no,Das verkaufe ich nicht.
|
||||||
hot.nowallet,"Keine Wallet verbunden, wohin sollen die Coins? Vergiss es."
|
pay.otc,OTC-Kunde {0} {1} (Bargeld {2})
|
||||||
hot.sting,"Keine Bewegung. Security. Ankauf gestohlener Gelder: Das Bargeld wird beschlagnahmt, und das kommt in deine Akte."
|
nightlog.otc.paid,Der OTC-Kunde hat {0} {1} erhalten und {2} in bar bezahlt.
|
||||||
|
nightlog.otc.unpaid,Der OTC-Kunde hat {0} {1} nicht erhalten; die Rechnung ist verfallen.
|
||||||
|
otc.upgrade.title,OTC-Schalter
|
||||||
|
otc.upgrade.desc,"Fügt der Schwarzen Lampe ein neues Ziel hinzu: OTC-Kunden. Einige verkaufen Coins unbekannter Herkunft, andere kaufen Coins; alle Geschäfte werden in bar abgewickelt. Enthält eine Schwarze Lampe."
|
||||||
|
otc.choice.yes,Annehmen
|
||||||
|
otc.choice.no,Ablehnen
|
||||||
|
otc.say.yes,Abgemacht.
|
||||||
|
otc.say.no,Davon lasse ich die Finger.
|
||||||
|
otc.done,Coins sind raus. Wir haben uns nie gesehen.
|
||||||
|
otc.refused,Andere nehmen es gern.
|
||||||
|
otc.nocash,Du hast nicht mal das Bargeld? Vergiss es.
|
||||||
|
otc.nowallet,"Keine Wallet verbunden, wohin sollen die Coins? Vergiss es."
|
||||||
|
otc.sting,"Keine Bewegung. Security. Ankauf gestohlener Gelder: Das Bargeld wird beschlagnahmt, und das kommt in deine Akte."
|
||||||
hw.err.poinbase,Poinbase nimmt kein {0} an.
|
hw.err.poinbase,Poinbase nimmt kein {0} an.
|
||||||
@@ -247,7 +247,7 @@ black.kind.Contraband.3,Contraband (high)
|
|||||||
black.kind.Tech,High-tech (markup)
|
black.kind.Tech,High-tech (markup)
|
||||||
nightlog.bm.ready,Black market: {0} arrived; a courier will come by once you open.
|
nightlog.bm.ready,Black market: {0} arrived; a courier will come by once you open.
|
||||||
guide.web3.title,Web3 Handbook
|
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. Poinbase spot has two pairs, PSC/CRC and SPARK/CRC, following the coin picked on the chart. Buys and sells are both entered as an amount of the traded coin; the preview shows the quote coin paid or received, the average price includes the fee and the slippage does not.¶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. Stablecoin swaps (CRT or CRA against CRC) use stable pools: a {StableFee:%} fee and almost no slippage near the peg; during a depeg liquidity thins, and in a collapse it is pulled and slippage jumps.§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 (only PSC, CRC and SPARK; the compliant exchange takes neither the black market's CRT nor the Revolution's CRA, and the wallet blocks sending them to the deposit address) 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: every movement in and out of your wallets (transfers, DEX swaps and other contract calls, miner payouts, withdrawals, coins others send you); Ponero is a privacy coin and never shows. 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 cLine 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. Poinbase spot has two pairs, PSC/CRC and SPARK/CRC, following the coin picked on the chart. Buys and sells are both entered as an amount of the traded coin; the preview shows the quote coin paid or received, the average price includes the fee and the slippage does not.¶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. Stablecoin swaps (CRT or CRA against CRC) use stable pools: a {StableFee:%} fee and almost no slippage near the peg; during a depeg liquidity thins, and in a collapse it is pulled and slippage jumps.§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 (only PSC, CRC and SPARK; the compliant exchange takes neither the black market's CRT nor the Revolution's CRA, and the wallet blocks sending them to the deposit address) 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: every movement in and out of your wallets (transfers, DEX swaps and other contract calls, miner payouts, withdrawals, coins others send you); Ponero is a privacy coin and never shows. 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 cLine truncated
|
||||||
courier.odd1,...Package is here.
|
courier.odd1,...Package is here.
|
||||||
courier.odd2,(His hand stays in his pocket.) Sign here.
|
courier.odd2,(His hand stays in his pocket.) Sign here.
|
||||||
courier.sign,Sign
|
courier.sign,Sign
|
||||||
@@ -964,18 +964,30 @@ news.wipe.down.title,"{0} falls {1}% in a day, {2} traders liquidated"
|
|||||||
news.wipe.down.desc,"Over the past day {1} long positions on {0} perps were liquidated, {2} credits in total. The Poinbase insurance fund stands at {3} credits."
|
news.wipe.down.desc,"Over the past day {1} long positions on {0} perps were liquidated, {2} credits in total. The Poinbase insurance fund stands at {3} credits."
|
||||||
news.wipe.up.title,"{0} jumps {1}% in a day, {2} traders liquidated"
|
news.wipe.up.title,"{0} jumps {1}% in a day, {2} traders liquidated"
|
||||||
news.wipe.up.desc,"Over the past day {1} short positions on {0} perps were liquidated, {2} credits in total. The Poinbase insurance fund stands at {3} credits."
|
news.wipe.up.desc,"Over the past day {1} short positions on {0} perps were liquidated, {2} credits in total. The Poinbase insurance fund stands at {3} credits."
|
||||||
hot.name,Seller
|
otc.name,OTC client
|
||||||
hot.intro.CRT,"Things are tense lately and this CRT is too hot to hold. I need cash, fast."
|
otc.intro.CRT,"Things are tense lately and this CRT is too hot to hold. I need cash, fast."
|
||||||
hot.intro.PSC,"A mining farm's wallet changed hands last night. The PSC is with me now, and I only take cash."
|
otc.intro.PSC,"A mining farm's wallet changed hands last night. The PSC is with me now, and I only take cash."
|
||||||
hot.intro.PONERO,"Ransom money, in Ponero. Nobody can trace it. Cash only."
|
otc.intro.PONERO,"Ransom money, in Ponero. Nobody can trace it. Cash only."
|
||||||
hot.offer,"{0} {1}, worth {2} at today's price. Give me {3} in cash and the coins are yours right now."
|
otc.offer,"{0} {1}, worth {2} at today's price, sent from {4}. Give me {3} in cash and the coins are yours right now."
|
||||||
hot.choice.yes,Take it
|
otc.intro.sell,Got some {0} I want to turn into cash. Check where it came from if you like.
|
||||||
hot.choice.no,Pass
|
otc.buy.ask,"I want {0} {1}, worth {2} at today's price. Cash. Name your price."
|
||||||
hot.say.yes,Deal.
|
otc.tier,Market +{0}%: {1}
|
||||||
hot.say.no,I'm not touching that.
|
otc.buy.say,"{0}, not a credit less."
|
||||||
hot.done,Coins sent. We never met.
|
otc.buy.accept,"Fine, {0}. Send the coins to {1}; cash when they land."
|
||||||
hot.refused,Plenty of others will take it.
|
otc.buy.reject,Too steep. Forget it.
|
||||||
hot.nocash,You can't even put up the cash? Forget it.
|
otc.buy.no,Not selling that.
|
||||||
hot.nowallet,"No wallet connected, so where would the coins go? Forget it."
|
pay.otc,OTC client {0} {1} (cash {2})
|
||||||
hot.sting,Don't move. Security. Buying stolen funds: the cash is confiscated and this goes on your record.
|
nightlog.otc.paid,The OTC client received {0} {1} and paid {2} in cash.
|
||||||
|
nightlog.otc.unpaid,The OTC client never got the {0} {1}; the bill is void.
|
||||||
|
otc.upgrade.title,OTC Desk
|
||||||
|
otc.upgrade.desc,"Adds a Black Lamp target: OTC clients. Some come to sell coins of unknown origin, some come to buy coins; all deals are settled in cash. Includes one Black Lamp."
|
||||||
|
otc.choice.yes,Take it
|
||||||
|
otc.choice.no,Pass
|
||||||
|
otc.say.yes,Deal.
|
||||||
|
otc.say.no,I'm not touching that.
|
||||||
|
otc.done,Coins sent. We never met.
|
||||||
|
otc.refused,Plenty of others will take it.
|
||||||
|
otc.nocash,You can't even put up the cash? Forget it.
|
||||||
|
otc.nowallet,"No wallet connected, so where would the coins go? Forget it."
|
||||||
|
otc.sting,Don't move. Security. Buying stolen funds: the cash is confiscated and this goes on your record.
|
||||||
hw.err.poinbase,Poinbase does not accept {0}.
|
hw.err.poinbase,Poinbase does not accept {0}.
|
||||||
@@ -247,7 +247,7 @@ black.kind.Contraband.3,Contrabando (alto)
|
|||||||
black.kind.Tech,Alta tecnología (con sobreprecio)
|
black.kind.Tech,Alta tecnología (con sobreprecio)
|
||||||
nightlog.bm.ready,Mercado negro: {0} ha llegado; un mensajero pasará en cuanto abras.
|
nightlog.bm.ready,Mercado negro: {0} ha llegado; un mensajero pasará en cuanto abras.
|
||||||
guide.web3.title,Manual de Web3
|
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). El mercado spot de Poinbase tiene dos pares, PSC/CRC y SPARK/CRC, según la moneda elegida en el gráfico. Tanto las compras como las ventas se introducen como cantidad de la moneda negociada; la vista previa muestra la moneda de cotización pagada o recibida, el precio medio incluye la comisión y el deslizamiento no.¶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. Los canjes entre stablecoins (CRT o CRA contra CRC) usan fondos estables: comisión de {StableFee:%} y casi sin deslizamiento cerca de la paridad; durante una pérdida de paridad la liquidez se reduce, y en un colapso se retira y el deslizamiento se dispara.§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 (solo PSC, CRC y SPARK; la plataforma regulada no acepta el CRT del mercado negro ni el CRA de la Revolución, y la billetera bloquea su envío a la dirección de depósito) 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: cada entrada y salida de tus billeteras (transferencias, canjes en DEX y otras llamadas a contratos, ingresos de mineros, retiros, monedas que otros te envían); Ponero es una moneda de privacidad y nunca aparece. 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 Line 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). El mercado spot de Poinbase tiene dos pares, PSC/CRC y SPARK/CRC, según la moneda elegida en el gráfico. Tanto las compras como las ventas se introducen como cantidad de la moneda negociada; la vista previa muestra la moneda de cotización pagada o recibida, el precio medio incluye la comisión y el deslizamiento no.¶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. Los canjes entre stablecoins (CRT o CRA contra CRC) usan fondos estables: comisión de {StableFee:%} y casi sin deslizamiento cerca de la paridad; durante una pérdida de paridad la liquidez se reduce, y en un colapso se retira y el deslizamiento se dispara.§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 (solo PSC, CRC y SPARK; la plataforma regulada no acepta el CRT del mercado negro ni el CRA de la Revolución, y la billetera bloquea su envío a la dirección de depósito) 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: cada entrada y salida de tus billeteras (transferencias, canjes en DEX y otras llamadas a contratos, ingresos de mineros, retiros, monedas que otros te envían); Ponero es una moneda de privacidad y nunca aparece. 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 Line truncated
|
||||||
courier.odd1,...Llegó el paquete.
|
courier.odd1,...Llegó el paquete.
|
||||||
courier.odd2,(Mantiene la mano en el bolsillo). Firma aquí.
|
courier.odd2,(Mantiene la mano en el bolsillo). Firma aquí.
|
||||||
courier.sign,Firmar
|
courier.sign,Firmar
|
||||||
@@ -964,18 +964,30 @@ news.wipe.down.title,{0} cae un {1}% en un día: {2} traders liquidados
|
|||||||
news.wipe.down.desc,"En el último día se liquidaron {1} posiciones largas en perpetuos de {0}, por un total de {2} créditos. El fondo de seguro de Poinbase queda en {3} créditos."
|
news.wipe.down.desc,"En el último día se liquidaron {1} posiciones largas en perpetuos de {0}, por un total de {2} créditos. El fondo de seguro de Poinbase queda en {3} créditos."
|
||||||
news.wipe.up.title,{0} sube un {1}% en un día: {2} traders liquidados
|
news.wipe.up.title,{0} sube un {1}% en un día: {2} traders liquidados
|
||||||
news.wipe.up.desc,"En el último día se liquidaron {1} posiciones cortas en perpetuos de {0}, por un total de {2} créditos. El fondo de seguro de Poinbase queda en {3} créditos."
|
news.wipe.up.desc,"En el último día se liquidaron {1} posiciones cortas en perpetuos de {0}, por un total de {2} créditos. El fondo de seguro de Poinbase queda en {3} créditos."
|
||||||
hot.name,Vendedor
|
otc.name,Cliente OTC
|
||||||
hot.intro.CRT,"Las cosas están tensas y este CRT quema. Necesito efectivo, rápido."
|
otc.intro.CRT,"Las cosas están tensas y este CRT quema. Necesito efectivo, rápido."
|
||||||
hot.intro.PSC,"La billetera de una granja de minería cambió de dueño anoche. El PSC lo tengo yo, y solo acepto efectivo."
|
otc.intro.PSC,"La billetera de una granja de minería cambió de dueño anoche. El PSC lo tengo yo, y solo acepto efectivo."
|
||||||
hot.intro.PONERO,"Un rescate, en Ponero. Nadie puede rastrearlo. Solo efectivo."
|
otc.intro.PONERO,"Un rescate, en Ponero. Nadie puede rastrearlo. Solo efectivo."
|
||||||
hot.offer,"{0} {1}, que valen {2} al precio de hoy. Dame {3} en efectivo y las monedas son tuyas ahora mismo."
|
otc.offer,"{0} {1}, con un valor de {2} al precio de hoy, enviados desde {4}. Dame {3} en efectivo y las monedas son tuyas ahora mismo."
|
||||||
hot.choice.yes,Aceptar
|
otc.intro.sell,Tengo algo de {0} que quiero convertir en efectivo. Revisa de dónde viene si quieres.
|
||||||
hot.choice.no,Rechazar
|
otc.buy.ask,"Quiero {0} {1}, con un valor de {2} al precio de hoy. En efectivo. Ponle precio."
|
||||||
hot.say.yes,Trato hecho.
|
otc.tier,Mercado +{0}%: {1}
|
||||||
hot.say.no,No pienso tocar eso.
|
otc.buy.say,"{0}, ni un crédito menos."
|
||||||
hot.done,Monedas enviadas. Nunca nos vimos.
|
otc.buy.accept,"De acuerdo, {0}. Envía las monedas a {1}; efectivo cuando lleguen."
|
||||||
hot.refused,Ya habrá otro que lo quiera.
|
otc.buy.reject,Demasiado caro. Olvídalo.
|
||||||
hot.nocash,¿Ni siquiera tienes el efectivo? Olvídalo.
|
otc.buy.no,No vendo eso.
|
||||||
hot.nowallet,"No hay billetera conectada, ¿adónde mando las monedas? Olvídalo."
|
pay.otc,Cliente OTC {0} {1} (efectivo {2})
|
||||||
hot.sting,Quieto. Seguridad. Compra de fondos robados: el efectivo queda confiscado y esto va a tu expediente.
|
nightlog.otc.paid,El cliente OTC recibió {0} {1} y pagó {2} en efectivo.
|
||||||
|
nightlog.otc.unpaid,El cliente OTC nunca recibió {0} {1}; la factura queda anulada.
|
||||||
|
otc.upgrade.title,Mostrador OTC
|
||||||
|
otc.upgrade.desc,Añade un objetivo a la Lámpara negra: Clientes OTC. Algunos vienen a vender monedas de origen desconocido y otros a comprar; todos los tratos se liquidan en efectivo. Incluye una Lámpara negra.
|
||||||
|
otc.choice.yes,Aceptar
|
||||||
|
otc.choice.no,Rechazar
|
||||||
|
otc.say.yes,Trato hecho.
|
||||||
|
otc.say.no,No pienso tocar eso.
|
||||||
|
otc.done,Monedas enviadas. Nunca nos vimos.
|
||||||
|
otc.refused,Ya habrá otro que lo quiera.
|
||||||
|
otc.nocash,¿Ni siquiera tienes el efectivo? Olvídalo.
|
||||||
|
otc.nowallet,"No hay billetera conectada, ¿adónde mando las monedas? Olvídalo."
|
||||||
|
otc.sting,Quieto. Seguridad. Compra de fondos robados: el efectivo queda confiscado y esto va a tu expediente.
|
||||||
hw.err.poinbase,Poinbase no acepta {0}.
|
hw.err.poinbase,Poinbase no acepta {0}.
|
||||||
@@ -247,7 +247,7 @@ black.kind.Contraband.3,Contrebande (élevée)
|
|||||||
black.kind.Tech,High-tech (majoration)
|
black.kind.Tech,High-tech (majoration)
|
||||||
nightlog.bm.ready,Marché noir : {0} est arrivé ; un livreur passera dès l'ouverture.
|
nightlog.bm.ready,Marché noir : {0} est arrivé ; un livreur passera dès l'ouverture.
|
||||||
guide.web3.title,Manuel Web3
|
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). Le spot de Poinbase propose deux paires, PSC/CRC et SPARK/CRC, selon la pièce choisie sur le graphique. Les achats comme les ventes se saisissent en quantité de la monnaie échangée ; l'aperçu indique la monnaie de cotation payée ou reçue, le prix moyen inclut les frais et le glissement non.¶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. Les échanges entre stablecoins (CRT ou CRA contre CRC) passent par des pools stables : {StableFee:%} de frais et quasiment aucun glissement près de l'ancrage ; en cas de désancrage la liquidité s'amincit, et en cas d'effondrement elle est retirée et le glissement s'envole.§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 (uniquement PSC, CRC et SPARK ; la plateforme réglementée n'accepte ni le CRT du Marché noir ni le CRA de la Révolution, et le portefeuille bloque leur envoi vers l'adresse de dépôt), 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 : chaque entrée et sortie de vos portefeuilles (transferts, échanges DEX et autres appels de contrat, gains des mineurs, retraits, pièces que d'autres vous envoient) ; Ponero est une monnaie de confidentialité et n'apparaît jamais. 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 évincé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 laLine 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). Le spot de Poinbase propose deux paires, PSC/CRC et SPARK/CRC, selon la pièce choisie sur le graphique. Les achats comme les ventes se saisissent en quantité de la monnaie échangée ; l'aperçu indique la monnaie de cotation payée ou reçue, le prix moyen inclut les frais et le glissement non.¶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. Les échanges entre stablecoins (CRT ou CRA contre CRC) passent par des pools stables : {StableFee:%} de frais et quasiment aucun glissement près de l'ancrage ; en cas de désancrage la liquidité s'amincit, et en cas d'effondrement elle est retirée et le glissement s'envole.§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 (uniquement PSC, CRC et SPARK ; la plateforme réglementée n'accepte ni le CRT du Marché noir ni le CRA de la Révolution, et le portefeuille bloque leur envoi vers l'adresse de dépôt), 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 : chaque entrée et sortie de vos portefeuilles (transferts, échanges DEX et autres appels de contrat, gains des mineurs, retraits, pièces que d'autres vous envoient) ; Ponero est une monnaie de confidentialité et n'apparaît jamais. 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 évincé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 laLine truncated
|
||||||
courier.odd1,...Le colis est là.
|
courier.odd1,...Le colis est là.
|
||||||
courier.odd2,(Sa main reste dans sa poche.) Signez ici.
|
courier.odd2,(Sa main reste dans sa poche.) Signez ici.
|
||||||
courier.sign,Signer
|
courier.sign,Signer
|
||||||
@@ -964,18 +964,30 @@ news.wipe.down.title,"{0} chute de {1}% en un jour, {2} traders liquidés"
|
|||||||
news.wipe.down.desc,"Au cours de la dernière journée, {1} positions longues sur les perps {0} ont été liquidées, pour {2} crédits au total. Le fonds d'assurance de Poinbase s'établit à {3} crédits."
|
news.wipe.down.desc,"Au cours de la dernière journée, {1} positions longues sur les perps {0} ont été liquidées, pour {2} crédits au total. Le fonds d'assurance de Poinbase s'établit à {3} crédits."
|
||||||
news.wipe.up.title,"{0} bondit de {1}% en un jour, {2} traders liquidés"
|
news.wipe.up.title,"{0} bondit de {1}% en un jour, {2} traders liquidés"
|
||||||
news.wipe.up.desc,"Au cours de la dernière journée, {1} positions courtes sur les perps {0} ont été liquidées, pour {2} crédits au total. Le fonds d'assurance de Poinbase s'établit à {3} crédits."
|
news.wipe.up.desc,"Au cours de la dernière journée, {1} positions courtes sur les perps {0} ont été liquidées, pour {2} crédits au total. Le fonds d'assurance de Poinbase s'établit à {3} crédits."
|
||||||
hot.name,Vendeur
|
otc.name,Client OTC
|
||||||
hot.intro.CRT,"Ça chauffe en ce moment et ce CRT me brûle les doigts. Il me faut du liquide, vite."
|
otc.intro.CRT,"Ça chauffe en ce moment et ce CRT me brûle les doigts. Il me faut du liquide, vite."
|
||||||
hot.intro.PSC,"Le portefeuille d'une ferme de minage a changé de main cette nuit. Le PSC est chez moi, et je ne prends que du liquide."
|
otc.intro.PSC,"Le portefeuille d'une ferme de minage a changé de main cette nuit. Le PSC est chez moi, et je ne prends que du liquide."
|
||||||
hot.intro.PONERO,"Une rançon, en Ponero. Personne ne peut la tracer. Liquide uniquement."
|
otc.intro.PONERO,"Une rançon, en Ponero. Personne ne peut la tracer. Liquide uniquement."
|
||||||
hot.offer,"{0} {1}, soit {2} au cours du jour. Donnez-moi {3} en liquide et les pièces sont à vous tout de suite."
|
otc.offer,"{0} {1}, d'une valeur de {2} au cours du jour, envoyés depuis {4}. Donne-moi {3} en liquide et les jetons sont à toi tout de suite."
|
||||||
hot.choice.yes,Accepter
|
otc.intro.sell,J'ai du {0} à convertir en liquide. Vérifie la provenance si tu veux.
|
||||||
hot.choice.no,Refuser
|
otc.buy.ask,"Je veux {0} {1}, d'une valeur de {2} au cours du jour. En liquide. Donne ton prix."
|
||||||
hot.say.yes,Marché conclu.
|
otc.tier,Marché +{0} % : {1}
|
||||||
hot.say.no,Je n'y touche pas.
|
otc.buy.say,"{0}, pas un crédit de moins."
|
||||||
hot.done,Pièces envoyées. On ne s'est jamais vus.
|
otc.buy.accept,"D'accord, {0}. Envoie les jetons à {1} ; le liquide dès réception."
|
||||||
hot.refused,D'autres le prendront.
|
otc.buy.reject,Trop cher. Laisse tomber.
|
||||||
hot.nocash,Vous n'avez même pas le liquide ? Laissez tomber.
|
otc.buy.no,Je ne vends pas ça.
|
||||||
hot.nowallet,"Aucun portefeuille connecté, où envoyer les pièces ? Laissez tomber."
|
pay.otc,Client OTC {0} {1} (liquide {2})
|
||||||
hot.sting,Pas un geste. Sécurité. Achat de fonds volés : le liquide est confisqué et ce sera inscrit à votre dossier.
|
nightlog.otc.paid,Le client OTC a reçu {0} {1} et a payé {2} en liquide.
|
||||||
|
nightlog.otc.unpaid,Le client OTC n'a jamais reçu {0} {1} ; la facture est annulée.
|
||||||
|
otc.upgrade.title,Comptoir OTC
|
||||||
|
otc.upgrade.desc,"Ajoute une cible à la Lampe noire : Clients OTC. Certains viennent vendre des jetons d'origine inconnue, d'autres viennent en acheter ; toutes les transactions se règlent en liquide. Inclut une Lampe noire."
|
||||||
|
otc.choice.yes,Accepter
|
||||||
|
otc.choice.no,Refuser
|
||||||
|
otc.say.yes,Marché conclu.
|
||||||
|
otc.say.no,Je n'y touche pas.
|
||||||
|
otc.done,Pièces envoyées. On ne s'est jamais vus.
|
||||||
|
otc.refused,D'autres le prendront.
|
||||||
|
otc.nocash,Vous n'avez même pas le liquide ? Laissez tomber.
|
||||||
|
otc.nowallet,"Aucun portefeuille connecté, où envoyer les pièces ? Laissez tomber."
|
||||||
|
otc.sting,Pas un geste. Sécurité. Achat de fonds volés : le liquide est confisqué et ce sera inscrit à votre dossier.
|
||||||
hw.err.poinbase,Poinbase n'accepte pas le {0}.
|
hw.err.poinbase,Poinbase n'accepte pas le {0}.
|
||||||
@@ -247,7 +247,7 @@ black.kind.Contraband.3,禁制品(高)
|
|||||||
black.kind.Tech,ハイテク品(割増)
|
black.kind.Tech,ハイテク品(割増)
|
||||||
nightlog.bm.ready,闇市場:{0} が到着。開店後に配達人が届けてくれる。
|
nightlog.bm.ready,闇市場:{0} が到着。開店後に配達人が届けてくれる。
|
||||||
guide.web3.title,Web3ハンドブック
|
guide.web3.title,Web3ハンドブック
|
||||||
guide.web3.text,銀行と取引:銀行ページは閲覧専用で、現金、家賃、Poinbase口座のCRCを表示する。入金と出金はPoinbaseの資金ページで行い、先にコインを選ぶ。CRCは銀行口座とウォレットのどちらでも可能で、他のコインはウォレットのみ。銀行からの入金はクレジットをPoinbase口座のCRCに変換し、銀行への出金はCRCをクレジットに戻すが、Poinbase口座の汚染を対象としたコンプライアンス審査が行われる。ウォレットへの出金は受取アドレスの入力が必要で、数回の承認を経て着金する。ガス代は通常の段階で固定され、送るコインから差し引かれる。アドレスの形式やチェックディジットが誤っていると拒否される。形式が正しくても誰も使っていないアドレスに送ったコインは失われる。¶取引:PSCは Probably Stolen Coin の略称で、グラフィックボードや専用採掘機で採掘されるコイン。Poinbaseの現物にはPSC/CRCとSPARK/CRCの2つのペアがあり、チャートで選んだコインに合わせて切り替わる。買いも売りも取引対象のコインの数量で入力する。プレビューには支払う・受け取る決済通貨が表示され、平均価格は手数料込み、スリッページは手数料を含まない。¶Web3の取引ページでは任意の2種類のコインを交換でき、必ずCRCを経由する。CRCが片側なら1つのプール、そうでなければ2つのプールを通り、手数料は2回、スリッページは重なる。プレビューに受取数量、経由するプール数、損失が表示される。ステーブルコイン同士(CRT・CRAとCRC)はステーブルプールを使い、手数料は{StableFee:%}、ペッグ付近ではスリッページがほぼない。ペッグが外れると流動性が薄くなり、崩壊時には流動性が引き揚げられてスリッページが急増する。§ハードウェアウォレット:チェーン上のコインはPLEDGERハードウェアウォレットに保管され、ウォレットごとに残高と汚染が個別に管理される。ウォレットはアイテムで、取引ターミナルにドラッグして読み込む。ターミナルのウォレットページで開き、ターミナル右上で接続・切断する。Web3ページの取引とグレーネットページのショップ、ミキサーは接続されたウォレットを使用する。ウォレットがない、または接続していないときは閲覧のみで、残高はすべて0になる。コイン決済の客は接続されたウォレットに支払う。¶支払い(ショップ、ミキサー、Ponero窓口、出品手数料)はまずターミナルで請求書を発行し、ウォレット側で送金先アドレスを入力して✓を長押しして署名する。アドレスの末尾2文字はチェックサムのため、1文字の誤入力なら通常は検出されるが、偶然有効なアドレスに一致した場合は誰も使っていないアドレスにコインが送られてしまう。DEXでのスワップもウォレットでの署名が必要となる。¶Poinbaseはカストディ口座で、入金はウォレットからPoinbaseの入金アドレスへ送金し(受け付けるのはPSC、CRC、SPARKのみ。規制下の取引所なので闇市場のCRTと革命軍のCRAは受け付けず、入金アドレスへの送金はウォレットが止める)、出金はPoinbaseの資金ページで行う。ウォレットページのエクスプローラーではアドレスで送金履歴を検索でき、実際に行われた送金のみが表示される:自分のウォレットのすべての入出金(送金、DEXスワップなどのコントラクト呼び出し、採掘機の収益、出金、他人から送られたコイン)。Poneroはプライバシーコインのため表示されない。追加のハードウェアウォレットはジャックソン博士から購入し、取引ターミナルにドラッグして追加する(最大{WalletMax}個)。ショップにはより安価なものもある。不要になったウォレットは、ウォレットページで破棄できる。中のコインは永久に失われ、その後このアドレスに送られたものも失われる。¶送金にはガス代が必要で、低速・通常・高速の3段階があり、ガス価格は約1週間周期で上下する。ネットワーク混雑時はガス代が高騰し、低速のトランザクションはメムプールから除外されることがある。送金前にアドレス全体を必ず確認すること。§ステーキング:革命家のプールにCRAをステーキングすると日利が付与され、利息は元本に複利で組み入れられる。出金するにはまず申請しLine truncated
|
guide.web3.text,銀行と取引:銀行ページは閲覧専用で、現金、家賃、Poinbase口座のCRCを表示する。入金と出金はPoinbaseの資金ページで行い、先にコインを選ぶ。CRCは銀行口座とウォレットのどちらでも可能で、他のコインはウォレットのみ。銀行からの入金はクレジットをPoinbase口座のCRCに変換し、銀行への出金はCRCをクレジットに戻すが、Poinbase口座の汚染を対象としたコンプライアンス審査が行われる。ウォレットへの出金は受取アドレスの入力が必要で、数回の承認を経て着金する。ガス代は通常の段階で固定され、送るコインから差し引かれる。アドレスの形式やチェックディジットが誤っていると拒否される。形式が正しくても誰も使っていないアドレスに送ったコインは失われる。¶取引:PSCは Probably Stolen Coin の略称で、グラフィックボードや専用採掘機で採掘されるコイン。Poinbaseの現物にはPSC/CRCとSPARK/CRCの2つのペアがあり、チャートで選んだコインに合わせて切り替わる。買いも売りも取引対象のコインの数量で入力する。プレビューには支払う・受け取る決済通貨が表示され、平均価格は手数料込み、スリッページは手数料を含まない。¶Web3の取引ページでは任意の2種類のコインを交換でき、必ずCRCを経由する。CRCが片側なら1つのプール、そうでなければ2つのプールを通り、手数料は2回、スリッページは重なる。プレビューに受取数量、経由するプール数、損失が表示される。ステーブルコイン同士(CRT・CRAとCRC)はステーブルプールを使い、手数料は{StableFee:%}、ペッグ付近ではスリッページがほぼない。ペッグが外れると流動性が薄くなり、崩壊時には流動性が引き揚げられてスリッページが急増する。§ハードウェアウォレット:チェーン上のコインはPLEDGERハードウェアウォレットに保管され、ウォレットごとに残高と汚染が個別に管理される。ウォレットはアイテムで、取引ターミナルにドラッグして読み込む。ターミナルのウォレットページで開き、ターミナル右上で接続・切断する。Web3ページの取引とグレーネットページのショップ、ミキサーは接続されたウォレットを使用する。ウォレットがない、または接続していないときは閲覧のみで、残高はすべて0になる。コイン決済の客は接続されたウォレットに支払う。¶支払い(ショップ、ミキサー、Ponero窓口、出品手数料)はまずターミナルで請求書を発行し、ウォレット側で送金先アドレスを入力して✓を長押しして署名する。アドレスの末尾2文字はチェックサムのため、1文字の誤入力なら通常は検出されるが、偶然有効なアドレスに一致した場合は誰も使っていないアドレスにコインが送られてしまう。DEXでのスワップもウォレットでの署名が必要となる。¶Poinbaseはカストディ口座で、入金はウォレットからPoinbaseの入金アドレスへ送金し(受け付けるのはPSC、CRC、SPARKのみ。規制下の取引所なので闇市場のCRTと革命軍のCRAは受け付けず、入金アドレスへの送金はウォレットが止める)、出金はPoinbaseの資金ページで行う。ウォレットページのエクスプローラーではアドレスで送金履歴を検索でき、実際に行われた送金のみが表示される:自分のウォレットのすべての入出金(送金、DEXスワップなどのコントラクト呼び出し、採掘機の収益、出金、他人から送られたコイン)。Poneroはプライバシーコインのため表示されない。追加のハードウェアウォレットはジャックソン博士から購入し、取引ターミナルにドラッグして追加する(最大{WalletMax}個)。ショップにはより安価なものもある。不要になったウォレットは、ウォレットページで破棄できる。中のコインは永久に失われ、その後このアドレスに送られたものも失われる。¶送金にはガス代が必要で、低速・通常・高速の3段階があり、ガス価格は約1週間周期で上下する。ネットワーク混雑時はガス代が高騰し、低速のトランザクションはメムプールから除外されることがある。送金前にアドレス全体を必ず確認すること。§ステーキング:革命家のプールにCRAをステーキングすると日利が付与され、利息は元本に複利で組み入れられる。出金するにはまず申請しLine truncated
|
||||||
courier.odd1,……荷物が届いた。
|
courier.odd1,……荷物が届いた。
|
||||||
courier.odd2,(ポケットに手を入れたままだ)ここにサインを。
|
courier.odd2,(ポケットに手を入れたままだ)ここにサインを。
|
||||||
courier.sign,サイン
|
courier.sign,サイン
|
||||||
@@ -964,18 +964,30 @@ news.wipe.down.title,{0}が1日で{1}%下落、{2}人がロスカット
|
|||||||
news.wipe.down.desc,この1日で{0}無期限先物のロングポジション{1}件がロスカットされ、総額は{2}クレジットに上った。Poinbaseの保険基金残高は{3}クレジット。
|
news.wipe.down.desc,この1日で{0}無期限先物のロングポジション{1}件がロスカットされ、総額は{2}クレジットに上った。Poinbaseの保険基金残高は{3}クレジット。
|
||||||
news.wipe.up.title,{0}が1日で{1}%上昇、{2}人がロスカット
|
news.wipe.up.title,{0}が1日で{1}%上昇、{2}人がロスカット
|
||||||
news.wipe.up.desc,この1日で{0}無期限先物のショートポジション{1}件がロスカットされ、総額は{2}クレジットに上った。Poinbaseの保険基金残高は{3}クレジット。
|
news.wipe.up.desc,この1日で{0}無期限先物のショートポジション{1}件がロスカットされ、総額は{2}クレジットに上った。Poinbaseの保険基金残高は{3}クレジット。
|
||||||
hot.name,売り手
|
otc.name,OTC客
|
||||||
hot.intro.CRT,最近は物騒で、このCRTを持っているのは危ない。急いで現金にしたい。
|
otc.intro.CRT,最近は物騒で、このCRTを持っているのは危ない。急いで現金にしたい。
|
||||||
hot.intro.PSC,ある採掘場のウォレットが昨夜持ち主を変えた。PSCは今こっちにある。現金しか受け取らない。
|
otc.intro.PSC,ある採掘場のウォレットが昨夜持ち主を変えた。PSCは今こっちにある。現金しか受け取らない。
|
||||||
hot.intro.PONERO,身代金だ、Poneroで。出所は誰にも追えない。現金のみ。
|
otc.intro.PONERO,身代金だ、Poneroで。出所は誰にも追えない。現金のみ。
|
||||||
hot.offer,{0} {1}、今の相場で{2}相当だ。現金{3}で、コインはこの場で送る。
|
otc.offer,{0} {1}、今日の相場なら{2}相当、送金元は{4}だ。現金{3}をくれれば、今すぐコインを渡す。
|
||||||
hot.choice.yes,受け取る
|
otc.intro.sell,手持ちの{0}を現金に換えたい。出所は自分で調べてくれ。
|
||||||
hot.choice.no,断る
|
otc.buy.ask,{0} {1}を買いたい。今日の相場なら{2}相当だ。現金で払う、価格を提示してくれ。
|
||||||
hot.say.yes,取引成立だ。
|
otc.tier,市価 +{0}%: {1}
|
||||||
hot.say.no,それには手を出さない。
|
otc.buy.say,{0}だ、1クレジットも負けない。
|
||||||
hot.done,送った。俺たちは会っていない。
|
otc.buy.accept,分かった、{0}だ。コインを{1}に送ってくれ。着金したら現金を渡す。
|
||||||
hot.refused,欲しがる奴はいくらでもいる。
|
otc.buy.reject,高すぎる。やめておく。
|
||||||
hot.nocash,現金も用意できないのか?ならやめだ。
|
otc.buy.no,それは売らない。
|
||||||
hot.nowallet,ウォレットがつながっていない。コインをどこに送れと?やめだ。
|
pay.otc,OTC客 {0} {1}(現金 {2})
|
||||||
hot.sting,動くな、警察だ。盗まれた資金の買い取りだな。現金は没収、記録にも残る。
|
nightlog.otc.paid,OTC客が{0} {1}を受け取り、現金{2}を支払った。
|
||||||
|
nightlog.otc.unpaid,OTC客に{0} {1}が届かず、請求書は無効となった。
|
||||||
|
otc.upgrade.title,OTCデスク
|
||||||
|
otc.upgrade.desc,黒いランプの対象に「OTC客」が追加される。出所不明のコインを売りに来る者や、コインを買いに来る者が訪れ、すべての取引は現金で決済される。黒いランプが1個付属。
|
||||||
|
otc.choice.yes,受け取る
|
||||||
|
otc.choice.no,断る
|
||||||
|
otc.say.yes,取引成立だ。
|
||||||
|
otc.say.no,それには手を出さない。
|
||||||
|
otc.done,送った。俺たちは会っていない。
|
||||||
|
otc.refused,欲しがる奴はいくらでもいる。
|
||||||
|
otc.nocash,現金も用意できないのか?ならやめだ。
|
||||||
|
otc.nowallet,ウォレットがつながっていない。コインをどこに送れと?やめだ。
|
||||||
|
otc.sting,動くな、警察だ。盗まれた資金の買い取りだな。現金は没収、記録にも残る。
|
||||||
hw.err.poinbase,Poinbaseは{0}を受け付けない。
|
hw.err.poinbase,Poinbaseは{0}を受け付けない。
|
||||||
@@ -247,7 +247,7 @@ black.kind.Contraband.3,Kontrabanda (wysoki poziom)
|
|||||||
black.kind.Tech,Zaawansowana technologia (marża)
|
black.kind.Tech,Zaawansowana technologia (marża)
|
||||||
nightlog.bm.ready,Czarny Rynek: {0} na miejscu; kurier pojawi się po otwarciu lokalu.
|
nightlog.bm.ready,Czarny Rynek: {0} na miejscu; kurier pojawi się po otwarciu lokalu.
|
||||||
guide.web3.title,Podręcznik Web3
|
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. Rynek spot Poinbase ma dwie pary, PSC/CRC i SPARK/CRC, zależnie od monety wybranej na wykresie. Zarówno zakup, jak i sprzedaż wpisuje się jako ilość monety bazowej; podgląd pokazuje zapłaconą lub otrzymaną monetę kwotowaną, średnia cena zawiera prowizję, a poślizg nie.¶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ę. Wymiany między stablecoinami (CRT lub CRA na CRC) idą przez pule stabilne: prowizja {StableFee:%} i prawie zerowy poślizg blisko powiązania; przy utracie powiązania płynność maleje, a przy krachu zostaje wycofana i poślizg gwałtownie rośnie.§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 (tylko PSC, CRC i SPARK; regulowana giełda nie przyjmuje CRT Czarnego Rynku ani CRA Rewolucji, a portfel blokuje wysłanie ich na adres wpłat), 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: każdy ruch do i z twoich portfeli (przelewy, wymiany na DEX i inne wywołania kontraktów, zyski koparek, wypłaty, monety wysyłane ci przez innych); Ponero to moneta prywatności i nigdy się nie pojawia. 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 Górnego poziomu stopniowo odbudowują rezerwę.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. Rynek spot Poinbase ma dwie pary, PSC/CRC i SPARK/CRC, zależnie od monety wybranej na wykresie. Zarówno zakup, jak i sprzedaż wpisuje się jako ilość monety bazowej; podgląd pokazuje zapłaconą lub otrzymaną monetę kwotowaną, średnia cena zawiera prowizję, a poślizg nie.¶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ę. Wymiany między stablecoinami (CRT lub CRA na CRC) idą przez pule stabilne: prowizja {StableFee:%} i prawie zerowy poślizg blisko powiązania; przy utracie powiązania płynność maleje, a przy krachu zostaje wycofana i poślizg gwałtownie rośnie.§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 (tylko PSC, CRC i SPARK; regulowana giełda nie przyjmuje CRT Czarnego Rynku ani CRA Rewolucji, a portfel blokuje wysłanie ich na adres wpłat), 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: każdy ruch do i z twoich portfeli (przelewy, wymiany na DEX i inne wywołania kontraktów, zyski koparek, wypłaty, monety wysyłane ci przez innych); Ponero to moneta prywatności i nigdy się nie pojawia. 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 Górnego poziomu stopniowo odbudowują rezerwę.Line truncated
|
||||||
courier.odd1,...Paczka dotarła.
|
courier.odd1,...Paczka dotarła.
|
||||||
courier.odd2,(Trzyma rękę w kieszeni.) Podpisz tutaj.
|
courier.odd2,(Trzyma rękę w kieszeni.) Podpisz tutaj.
|
||||||
courier.sign,Podpisz
|
courier.sign,Podpisz
|
||||||
@@ -964,18 +964,30 @@ news.wipe.down.title,"{0} spada o {1}% w jeden dzień, {2} traderów zlikwidowan
|
|||||||
news.wipe.down.desc,"W ciągu ostatniego dnia zlikwidowano {1} długich pozycji na kontraktach perp {0}, łącznie {2} kredytów. Fundusz ubezpieczeniowy Poinbase wynosi {3} kredytów."
|
news.wipe.down.desc,"W ciągu ostatniego dnia zlikwidowano {1} długich pozycji na kontraktach perp {0}, łącznie {2} kredytów. Fundusz ubezpieczeniowy Poinbase wynosi {3} kredytów."
|
||||||
news.wipe.up.title,"{0} rośnie o {1}% w jeden dzień, {2} traderów zlikwidowanych"
|
news.wipe.up.title,"{0} rośnie o {1}% w jeden dzień, {2} traderów zlikwidowanych"
|
||||||
news.wipe.up.desc,"W ciągu ostatniego dnia zlikwidowano {1} krótkich pozycji na kontraktach perp {0}, łącznie {2} kredytów. Fundusz ubezpieczeniowy Poinbase wynosi {3} kredytów."
|
news.wipe.up.desc,"W ciągu ostatniego dnia zlikwidowano {1} krótkich pozycji na kontraktach perp {0}, łącznie {2} kredytów. Fundusz ubezpieczeniowy Poinbase wynosi {3} kredytów."
|
||||||
hot.name,Sprzedawca
|
otc.name,Klient OTC
|
||||||
hot.intro.CRT,"Ostatnio jest gorąco, a te CRT parzą w ręce. Potrzebuję gotówki, szybko."
|
otc.intro.CRT,"Ostatnio jest gorąco, a te CRT parzą w ręce. Potrzebuję gotówki, szybko."
|
||||||
hot.intro.PSC,Portfel pewnej kopalni zmienił wczoraj właściciela. PSC jest teraz u mnie i biorę tylko gotówkę.
|
otc.intro.PSC,Portfel pewnej kopalni zmienił wczoraj właściciela. PSC jest teraz u mnie i biorę tylko gotówkę.
|
||||||
hot.intro.PONERO,"Okup, w Ponero. Nikt tego nie wyśledzi. Tylko gotówka."
|
otc.intro.PONERO,"Okup, w Ponero. Nikt tego nie wyśledzi. Tylko gotówka."
|
||||||
hot.offer,"{0} {1}, warte {2} po dzisiejszym kursie. Daj mi {3} w gotówce, a monety są twoje od razu."
|
otc.offer,"{0} {1}, o wartości {2} po dzisiejszej cenie, wysłane z {4}. Daj mi {3} w gotówce, a monety są twoje od ręki."
|
||||||
hot.choice.yes,Przyjmij
|
otc.intro.sell,"Mam trochę {0}, chcę to wymienić na gotówkę. Sprawdź, skąd pochodzą, jeśli chcesz."
|
||||||
hot.choice.no,Odmów
|
otc.buy.ask,"Chcę kupić {0} {1}, o wartości {2} po dzisiejszej cenie. Gotówka. Podaj swoją cenę."
|
||||||
hot.say.yes,Umowa stoi.
|
otc.tier,Rynek +{0}%: {1}
|
||||||
hot.say.no,Nie tknę tego.
|
otc.buy.say,"{0}, ani kredytu mniej."
|
||||||
hot.done,Monety wysłane. Nigdy się nie spotkaliśmy.
|
otc.buy.accept,"W porządku, {0}. Wyślij monety na {1}; gotówka, gdy dotrą."
|
||||||
hot.refused,Inni chętnie wezmą.
|
otc.buy.reject,Za drogo. Zapomnij.
|
||||||
hot.nocash,Nie masz nawet gotówki? Daj spokój.
|
otc.buy.no,Tego nie sprzedaję.
|
||||||
hot.nowallet,"Brak podłączonego portfela, gdzie mam wysłać monety? Daj spokój."
|
pay.otc,Klient OTC {0} {1} (gotówka {2})
|
||||||
hot.sting,"Nie ruszaj się. Ochrona. Skup kradzionych środków: gotówka zostaje skonfiskowana, a to trafi do twoich akt."
|
nightlog.otc.paid,Klient OTC otrzymał {0} {1} i zapłacił {2} w gotówce.
|
||||||
|
nightlog.otc.unpaid,Klient OTC nie otrzymał {0} {1}; rachunek został unieważniony.
|
||||||
|
otc.upgrade.title,Punkt OTC
|
||||||
|
otc.upgrade.desc,"Dodaje cel Czarnej lampy: Klienci OTC. Jedni przychodzą sprzedać monety nieznanego pochodzenia, inni kupić monety; wszystkie transakcje są rozliczane w gotówce. Zawiera jedną Czarną lampę."
|
||||||
|
otc.choice.yes,Przyjmij
|
||||||
|
otc.choice.no,Odmów
|
||||||
|
otc.say.yes,Umowa stoi.
|
||||||
|
otc.say.no,Nie tknę tego.
|
||||||
|
otc.done,Monety wysłane. Nigdy się nie spotkaliśmy.
|
||||||
|
otc.refused,Inni chętnie wezmą.
|
||||||
|
otc.nocash,Nie masz nawet gotówki? Daj spokój.
|
||||||
|
otc.nowallet,"Brak podłączonego portfela, gdzie mam wysłać monety? Daj spokój."
|
||||||
|
otc.sting,"Nie ruszaj się. Ochrona. Skup kradzionych środków: gotówka zostaje skonfiskowana, a to trafi do twoich akt."
|
||||||
hw.err.poinbase,Poinbase nie przyjmuje {0}.
|
hw.err.poinbase,Poinbase nie przyjmuje {0}.
|
||||||
@@ -247,7 +247,7 @@ black.kind.Contraband.3,Контрабанда (высок.)
|
|||||||
black.kind.Tech,Высокие технологии (наценка)
|
black.kind.Tech,Высокие технологии (наценка)
|
||||||
nightlog.bm.ready,Чёрный рынок: доставлен товар «{0}»; курьер заглянет после открытия.
|
nightlog.bm.ready,Чёрный рынок: доставлен товар «{0}»; курьер заглянет после открытия.
|
||||||
guide.web3.title,Руководство по Web3
|
guide.web3.title,Руководство по Web3
|
||||||
guide.web3.text,"Банк и торговля: страница банка только для чтения и показывает наличные, аренду и CRC на счёте Poinbase. Страница «Средства» в Poinbase отвечает за ввод и вывод; сначала выбирается монета: CRC можно вводить и выводить через банковский счёт или кошелёк, остальные монеты только через кошелёк. Депозит из банка конвертирует кредиты в CRC на счёте Poinbase; вывод в банк меняет CRC обратно на кредиты и проходит проверку соответствия, оценивающую загрязнение счёта Poinbase. Вывод на кошелёк требует адрес получателя и нескольких подтверждений до зачисления; комиссия за газ фиксирована на обычном уровне и списывается с отправляемой монеты. Неверный формат адреса или контрольная сумма приводят к отказу; адрес с верным форматом, которым никто не пользуется, означает потерю отправленных монет.¶Торговля: PSC означает Probably Stolen Coin — это монета, которую добывают видеокарты и асик-майнеры. На спотовом рынке Poinbase две пары, PSC/CRC и SPARK/CRC, по монете, выбранной на графике. И покупка, и продажа вводятся как количество торгуемой монеты; в предпросмотре видно, сколько котируемой монеты уйдёт или придёт, средняя цена включает комиссию, проскальзывание — нет.¶На торговой странице Web3 можно обменять любые две монеты, всегда через CRC: если CRC с одной стороны, используется один пул, иначе два пула, две комиссии и суммирующееся проскальзывание; предпросмотр показывает получаемое количество, число пулов и потери. Обмен стейблкоинов (CRT или CRA на CRC) идёт через стабильные пулы: комиссия {StableFee:%} и почти нулевое проскальзывание возле привязки; при отвязке ликвидность редеет, при обвале её выводят, и проскальзывание резко растёт.§Аппаратные кошельки: ончейн-монеты хранятся на аппаратных кошельках PLEDGER, баланс и загрязнение у каждого свои. Кошелёк — это предмет: перетащите его на торговый терминал, чтобы загрузить. Открывайте его на странице «Кошельки» терминала; подключайте и отключайте в правом верхнем углу терминала. Торговля на странице Web3, магазин и миксер на странице «Серая сеть» используют подключённый кошелёк; без кошелька или без подключения они доступны только для просмотра, а все балансы равны 0. Покупатели, платящие монетами, платят на подключённый кошелёк.¶Платежи (магазин, миксер, пункт обмена Ponero, комиссия за размещение) начинаются со счёта на терминале; введите адрес получателя на кошельке и удерживайте ✓, чтобы подписать. Последние два символа адреса — контрольная сумма, поэтому опечатка в один символ обычно отсекается; изредка адрес случайно оказывается валидным, и монеты уходят на адрес, которым никто не пользуется. Для обмена на DEX также требуется подпись на кошельке.¶Poinbase — кастодиальный аккаунт; депозит отправляется с кошелька на адрес депозита Poinbase (только PSC, CRC и SPARK; регулируемая биржа не принимает ни CRT чёрного рынLine truncated
|
guide.web3.text,"Банк и торговля: страница банка только для чтения и показывает наличные, аренду и CRC на счёте Poinbase. Страница «Средства» в Poinbase отвечает за ввод и вывод; сначала выбирается монета: CRC можно вводить и выводить через банковский счёт или кошелёк, остальные монеты только через кошелёк. Депозит из банка конвертирует кредиты в CRC на счёте Poinbase; вывод в банк меняет CRC обратно на кредиты и проходит проверку соответствия, оценивающую загрязнение счёта Poinbase. Вывод на кошелёк требует адрес получателя и нескольких подтверждений до зачисления; комиссия за газ фиксирована на обычном уровне и списывается с отправляемой монеты. Неверный формат адреса или контрольная сумма приводят к отказу; адрес с верным форматом, которым никто не пользуется, означает потерю отправленных монет.¶Торговля: PSC означает Probably Stolen Coin — это монета, которую добывают видеокарты и асик-майнеры. На спотовом рынке Poinbase две пары, PSC/CRC и SPARK/CRC, по монете, выбранной на графике. И покупка, и продажа вводятся как количество торгуемой монеты; в предпросмотре видно, сколько котируемой монеты уйдёт или придёт, средняя цена включает комиссию, проскальзывание — нет.¶На торговой странице Web3 можно обменять любые две монеты, всегда через CRC: если CRC с одной стороны, используется один пул, иначе два пула, две комиссии и суммирующееся проскальзывание; предпросмотр показывает получаемое количество, число пулов и потери. Обмен стейблкоинов (CRT или CRA на CRC) идёт через стабильные пулы: комиссия {StableFee:%} и почти нулевое проскальзывание возле привязки; при отвязке ликвидность редеет, при обвале её выводят, и проскальзывание резко растёт.§Аппаратные кошельки: ончейн-монеты хранятся на аппаратных кошельках PLEDGER, баланс и загрязнение у каждого свои. Кошелёк — это предмет: перетащите его на торговый терминал, чтобы загрузить. Открывайте его на странице «Кошельки» терминала; подключайте и отключайте в правом верхнем углу терминала. Торговля на странице Web3, магазин и миксер на странице «Серая сеть» используют подключённый кошелёк; без кошелька или без подключения они доступны только для просмотра, а все балансы равны 0. Покупатели, платящие монетами, платят на подключённый кошелёк.¶Платежи (магазин, миксер, пункт обмена Ponero, комиссия за размещение) начинаются со счёта на терминале; введите адрес получателя на кошельке и удерживайте ✓, чтобы подписать. Последние два символа адреса — контрольная сумма, поэтому опечатка в один символ обычно отсекается; изредка адрес случайно оказывается валидным, и монеты уходят на адрес, которым никто не пользуется. Для обмена на DEX также требуется подпись на кошельке.¶Poinbase — кастодиальный аккаунт; депозит отправляется с кошелька на адрес депозита Poinbase (только PSC, CRC и SPARK; регулируемая биржа не принимает ни CRT чёрного рынLine truncated
|
||||||
courier.odd1,...Посылка пришла.
|
courier.odd1,...Посылка пришла.
|
||||||
courier.odd2,(Его рука остаётся в кармане.) Подпиши здесь.
|
courier.odd2,(Его рука остаётся в кармане.) Подпиши здесь.
|
||||||
courier.sign,Подписать
|
courier.sign,Подписать
|
||||||
@@ -964,18 +964,30 @@ news.wipe.down.title,"{0} упал на {1}% за день, ликвидиров
|
|||||||
news.wipe.down.desc,За прошедшие сутки ликвидировано {1} длинных позиций по бессрочным контрактам {0} на общую сумму {2} кредитов. Страховой фонд Poinbase составляет {3} кредитов.
|
news.wipe.down.desc,За прошедшие сутки ликвидировано {1} длинных позиций по бессрочным контрактам {0} на общую сумму {2} кредитов. Страховой фонд Poinbase составляет {3} кредитов.
|
||||||
news.wipe.up.title,"{0} вырос на {1}% за день, ликвидировано трейдеров: {2}"
|
news.wipe.up.title,"{0} вырос на {1}% за день, ликвидировано трейдеров: {2}"
|
||||||
news.wipe.up.desc,За прошедшие сутки ликвидировано {1} коротких позиций по бессрочным контрактам {0} на общую сумму {2} кредитов. Страховой фонд Poinbase составляет {3} кредитов.
|
news.wipe.up.desc,За прошедшие сутки ликвидировано {1} коротких позиций по бессрочным контрактам {0} на общую сумму {2} кредитов. Страховой фонд Poinbase составляет {3} кредитов.
|
||||||
hot.name,Продавец
|
otc.name,OTC-клиент
|
||||||
hot.intro.CRT,"Сейчас неспокойно, а этот CRT жжёт руки. Мне нужны наличные, быстро."
|
otc.intro.CRT,"Сейчас неспокойно, а этот CRT жжёт руки. Мне нужны наличные, быстро."
|
||||||
hot.intro.PSC,"Кошелёк одной майнинг-фермы прошлой ночью сменил владельца. PSC теперь у меня, и я беру только наличные."
|
otc.intro.PSC,"Кошелёк одной майнинг-фермы прошлой ночью сменил владельца. PSC теперь у меня, и я беру только наличные."
|
||||||
hot.intro.PONERO,"Выкуп, в Ponero. Никто не отследит. Только наличные."
|
otc.intro.PONERO,"Выкуп, в Ponero. Никто не отследит. Только наличные."
|
||||||
hot.offer,"{0} {1}, по сегодняшнему курсу это {2}. Дайте мне {3} наличными, и монеты сразу ваши."
|
otc.offer,"{0} {1} стоимостью {2} по сегодняшнему курсу, отправка с {4}. Дай мне {3} наличными, и монеты твои прямо сейчас."
|
||||||
hot.choice.yes,Взять
|
otc.intro.sell,"Есть немного {0}, хочу обменять на наличные. Можешь проверить, откуда они, если хочешь."
|
||||||
hot.choice.no,Отказаться
|
otc.buy.ask,Хочу купить {0} {1} стоимостью {2} по сегодняшнему курсу. Наличные. Назови свою цену.
|
||||||
hot.say.yes,По рукам.
|
otc.tier,Рынок +{0}%: {1}
|
||||||
hot.say.no,Я в это не полезу.
|
otc.buy.say,"{0}, ни кредитом меньше."
|
||||||
hot.done,Монеты отправлены. Мы не встречались.
|
otc.buy.accept,"Ладно, {0}. Переводи монеты на {1}; наличные — как дойдут."
|
||||||
hot.refused,Найдутся другие.
|
otc.buy.reject,Слишком дорого. Забудь.
|
||||||
hot.nocash,Даже наличных нет? Забудьте.
|
otc.buy.no,Это я не продаю.
|
||||||
hot.nowallet,"Кошелёк не подключён, куда слать монеты? Забудьте."
|
pay.otc,OTC-клиент {0} {1} (наличные {2})
|
||||||
hot.sting,"Не двигаться. Служба безопасности. Скупка краденых средств: наличные изъяты, это пойдёт в ваше досье."
|
nightlog.otc.paid,OTC-клиент получил {0} {1} и выплатил {2} наличными.
|
||||||
|
nightlog.otc.unpaid,OTC-клиент так и не получил {0} {1}; счёт аннулирован.
|
||||||
|
otc.upgrade.title,OTC-стойка
|
||||||
|
otc.upgrade.desc,"Добавляет новую цель для Чёрной лампы: OTC-клиенты. Одни приходят продать монеты неизвестного происхождения, другие — купить монеты; все сделки рассчитываются наличными. Включает одну Чёрную лампу."
|
||||||
|
otc.choice.yes,Взять
|
||||||
|
otc.choice.no,Отказаться
|
||||||
|
otc.say.yes,По рукам.
|
||||||
|
otc.say.no,Я в это не полезу.
|
||||||
|
otc.done,Монеты отправлены. Мы не встречались.
|
||||||
|
otc.refused,Найдутся другие.
|
||||||
|
otc.nocash,Даже наличных нет? Забудьте.
|
||||||
|
otc.nowallet,"Кошелёк не подключён, куда слать монеты? Забудьте."
|
||||||
|
otc.sting,"Не двигаться. Служба безопасности. Скупка краденых средств: наличные изъяты, это пойдёт в ваше досье."
|
||||||
hw.err.poinbase,Poinbase не принимает {0}.
|
hw.err.poinbase,Poinbase не принимает {0}.
|
||||||
@@ -246,7 +246,7 @@ black.kind.Contraband.3,违禁品(高)
|
|||||||
black.kind.Tech,高科技物品(加价)
|
black.kind.Tech,高科技物品(加价)
|
||||||
nightlog.bm.ready,商店:{0} 到货,开店后会有快递员上门。
|
nightlog.bm.ready,商店:{0} 到货,开店后会有快递员上门。
|
||||||
guide.web3.title,Web3 手册
|
guide.web3.title,Web3 手册
|
||||||
guide.web3.text,"银行与交易:银行页只读,显示现金、房租和 Poinbase 账户里的 CRC。Poinbase 的资金页管入金和出金,先选币种:CRC 可以走银行账户或钱包,其他币只能走钱包。从银行入金把信用点换成 Poinbase 账户里的 CRC;出金到银行把 CRC 换回信用点,要过合规审查,审查看 Poinbase 账户的污点。出金到钱包要填收款地址,等几次确认才到账,Gas 费固定按普通档、从转出的币里扣;地址格式或校验位不对会被拒绝,格式对但没人用的地址,币转过去就没了。¶交易:PSC 全称 Probably Stolen Coin,是显卡和矿机挖出的币。Poinbase 现货有 PSC/CRC 和 SPARK/CRC 两个交易对,跟着行情图选中的币切换。买入和卖出都填所交易币的数量,预览显示要付或能得到的计价币,均价含手续费,滑点不含。¶Web3 交易页可以任选两种币互换,实际都经 CRC 中转:CRC 在一端走一个池,否则走两个池,付两次手续费、滑点叠加,预览里会显示得到的数量、经过的池数和损耗。稳定币之间(CRT、CRA 对 CRC)走稳定币池:手续费 {StableFee:%},挂钩附近几乎没有滑点;脱锚时流动性变差,崩盘时流动性被撤走,滑点急剧变大。§硬件钱包:链上的币放在 PLEDGER 硬件钱包里,每个钱包的余额和污点分别计算。钱包是一件物品,拖到交易终端上加载;在终端的钱包页打开,在终端右上角连接或断开。Web3 页的交易和灰网页的商店、混币器用已连接的钱包,没有钱包或没有连接时只能看,余额都是 0;用币付款的顾客也进已连接的钱包。¶付款(商店、混币器、Ponero 兑换处、上架费)先在终端开账单,再在钱包里手输收款地址、按住 ✓ 签名;地址末尾两位是校验位,输错一位多半会被拦下,偶尔碰巧合法,币就转进了没人用的地址。DEX 兑换也要在钱包上签名。¶Poinbase 是托管账户,入金要从钱包转到它的充值地址(只收 PSC、CRC、SPARK;黑市的 CRT、革命军的 CRA 合规交易所不收,往充值地址转会被钱包拦下),出金在 Poinbase 的资金页发起。钱包页的浏览器可以按地址查转账记录,只显示真实发生的转账:你的钱包的每一笔进出(转账、DEX 兑换和其他合约调用、矿机收益、出金、别人转来的币);Ponero 是隐私币,不显示。更多硬件钱包向杰克逊博士购买,拖到交易终端上添加,最多 {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} 天之间会有一次""矿机时代"",提前几天上报纸预告,之后大矿场的耗电成本砍半,全网算力涨上去,显卡矿工的收益被摊薄,低档显卡Line truncated
|
guide.web3.text,"银行与交易:银行页只读,显示现金、房租和 Poinbase 账户里的 CRC。Poinbase 的资金页管入金和出金,先选币种:CRC 可以走银行账户或钱包,其他币只能走钱包。从银行入金把信用点换成 Poinbase 账户里的 CRC;出金到银行把 CRC 换回信用点,要过合规审查,审查看 Poinbase 账户的污点。出金到钱包要填收款地址,等几次确认才到账,Gas 费固定按普通档、从转出的币里扣;地址格式或校验位不对会被拒绝,格式对但没人用的地址,币转过去就没了。¶交易:PSC 全称 Probably Stolen Coin,是显卡和矿机挖出的币。Poinbase 现货有 PSC/CRC 和 SPARK/CRC 两个交易对,跟着行情图选中的币切换。买入和卖出都填所交易币的数量,预览显示要付或能得到的计价币,均价含手续费,滑点不含。¶Web3 交易页可以任选两种币互换,实际都经 CRC 中转:CRC 在一端走一个池,否则走两个池,付两次手续费、滑点叠加,预览里会显示得到的数量、经过的池数和损耗。稳定币之间(CRT、CRA 对 CRC)走稳定币池:手续费 {StableFee:%},挂钩附近几乎没有滑点;脱锚时流动性变差,崩盘时流动性被撤走,滑点急剧变大。§硬件钱包:链上的币放在 PLEDGER 硬件钱包里,每个钱包的余额和污点分别计算。钱包是一件物品,拖到交易终端上加载;在终端的钱包页打开,在终端右上角连接或断开。Web3 页的交易和灰网页的商店、混币器用已连接的钱包,没有钱包或没有连接时只能看,余额都是 0;用币付款的顾客也进已连接的钱包。¶付款(商店、混币器、Ponero 兑换处、上架费)先在终端开账单,再在钱包里手输收款地址、按住 ✓ 签名;地址末尾两位是校验位,输错一位多半会被拦下,偶尔碰巧合法,币就转进了没人用的地址。DEX 兑换也要在钱包上签名。¶Poinbase 是托管账户,入金要从钱包转到它的充值地址(只收 PSC、CRC、SPARK;黑市的 CRT、革命军的 CRA 合规交易所不收,往充值地址转会被钱包拦下),出金在 Poinbase 的资金页发起。钱包页的浏览器可以按地址查转账记录,只显示真实发生的转账:你的钱包的每一笔进出(转账、DEX 兑换和其他合约调用、矿机收益、出金、别人转来的币);Ponero 是隐私币,不显示。更多硬件钱包向杰克逊博士购买,拖到交易终端上添加,最多 {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} 天之间会有一次""矿机时代"",提前几天上报纸预告,之后大矿场的耗电成本砍半,全网算力涨上去,显卡矿工的收益被摊薄,低档显卡Line truncated
|
||||||
courier.odd1,……东西到了。
|
courier.odd1,……东西到了。
|
||||||
courier.odd2,"(他的手一直放在口袋里)在这儿签个字。"
|
courier.odd2,"(他的手一直放在口袋里)在这儿签个字。"
|
||||||
courier.sign,签收
|
courier.sign,签收
|
||||||
@@ -963,18 +963,30 @@ news.wipe.down.title,{0} 单日下跌 {1}%,{2} 人爆仓
|
|||||||
news.wipe.down.desc,过去一天,{0} 永续合约有 {1} 个多头仓位爆仓,爆仓总额 {2} 信用点。Poinbase 保险基金余额 {3} 信用点。
|
news.wipe.down.desc,过去一天,{0} 永续合约有 {1} 个多头仓位爆仓,爆仓总额 {2} 信用点。Poinbase 保险基金余额 {3} 信用点。
|
||||||
news.wipe.up.title,{0} 单日上涨 {1}%,{2} 人爆仓
|
news.wipe.up.title,{0} 单日上涨 {1}%,{2} 人爆仓
|
||||||
news.wipe.up.desc,过去一天,{0} 永续合约有 {1} 个空头仓位爆仓,爆仓总额 {2} 信用点。Poinbase 保险基金余额 {3} 信用点。
|
news.wipe.up.desc,过去一天,{0} 永续合约有 {1} 个空头仓位爆仓,爆仓总额 {2} 信用点。Poinbase 保险基金余额 {3} 信用点。
|
||||||
hot.name,出货人
|
otc.name,换币客户
|
||||||
hot.intro.CRT,最近风声紧,这批 CRT 留在手里烫手,得尽快换成现金。
|
otc.intro.CRT,最近风声紧,这批 CRT 留在手里烫手,得尽快换成现金。
|
||||||
hot.intro.PSC,有家矿场的钱包昨晚换了主人。PSC 在我这儿,我只要现金。
|
otc.intro.PSC,有家矿场的钱包昨晚换了主人。PSC 在我这儿,我只要现金。
|
||||||
hot.intro.PONERO,一笔赎金,Ponero,查不到来路。我只收现金。
|
otc.intro.PONERO,一笔赎金,Ponero,查不到来路。我只收现金。
|
||||||
hot.offer,{0} {1},按现价值 {2}。给我 {3} 现金,币当场转给你。
|
otc.offer,{0} {1},按现价值 {2},从 {4} 转出。给我 {3} 现金,币当场转给你。
|
||||||
hot.choice.yes,收下
|
otc.intro.sell,手上有点 {0} 想换成现金。来路你自己查。
|
||||||
hot.choice.no,不要
|
otc.buy.ask,我想买 {0} {1},按现价值 {2}。付现金,你开个价。
|
||||||
hot.say.yes,成交。
|
otc.tier,市价 +{0}%:{1}
|
||||||
hot.say.no,这钱我不碰。
|
otc.buy.say,{0},少一分不卖。
|
||||||
hot.done,币转过去了。我们没见过。
|
otc.buy.accept,行,{0}。币转到 {1},到账我就付现金。
|
||||||
hot.refused,有的是人要。
|
otc.buy.reject,太贵了,算了。
|
||||||
hot.nocash,现金都拿不出来?那算了。
|
otc.buy.no,这个我不卖。
|
||||||
hot.nowallet,钱包都没连上,币往哪儿转?算了。
|
pay.otc,换币客户 {0} {1}(现金 {2})
|
||||||
hot.sting,别动,治安部。收购赃款,现金没收,这笔会记进你的档案。
|
nightlog.otc.paid,换币客户收到 {0} {1},付了现金 {2}。
|
||||||
|
nightlog.otc.unpaid,换币客户没等到 {0} {1},账单作废。
|
||||||
|
otc.upgrade.title,场外换币台
|
||||||
|
otc.upgrade.desc,暗灯多一个目标:换币客户。有人来卖来路不明的币,有人来买币,都用现金结算。附赠一盏暗灯。
|
||||||
|
otc.choice.yes,收下
|
||||||
|
otc.choice.no,不要
|
||||||
|
otc.say.yes,成交。
|
||||||
|
otc.say.no,这钱我不碰。
|
||||||
|
otc.done,币转过去了。我们没见过。
|
||||||
|
otc.refused,有的是人要。
|
||||||
|
otc.nocash,现金都拿不出来?那算了。
|
||||||
|
otc.nowallet,钱包都没连上,币往哪儿转?算了。
|
||||||
|
otc.sting,别动,治安部。收购赃款,现金没收,这笔会记进你的档案。
|
||||||
hw.err.poinbase,Poinbase 不收 {0}。
|
hw.err.poinbase,Poinbase 不收 {0}。
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 240 B |
@@ -0,0 +1,222 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Decentralized.Domain;
|
||||||
|
|
||||||
|
namespace Decentralized
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 换币客户(游戏的对话顾客),由切到"换币客户"的小偷灯招来,见 <see cref="OtcLamp"/> 与 <see cref="Otc"/>。
|
||||||
|
/// 卖币:付现金,币进已连接的钱包(污点按比例、带上限),便衣会没收现金并记销赃罪证。
|
||||||
|
/// 买币:玩家选报价档,客户接受后离开,玩家在 PLEDGER 上把币转到客户地址,确认后现金到账;当晚没付的账单作废。
|
||||||
|
/// 原版取顾客名字时也会调用工厂:只有在生成顾客的那段时间里(普通顾客回调之间,原版在这里按展示柜生成顾客)才生成报价、写链上账本。
|
||||||
|
/// </summary>
|
||||||
|
public static class OtcClient
|
||||||
|
{
|
||||||
|
public const string Id = OtcLamp.Target;
|
||||||
|
private static bool spawning;
|
||||||
|
/// <summary>买币客户开出的账单:夜里还没付就作废。</summary>
|
||||||
|
private static WalletWindow.Bill pendingBill;
|
||||||
|
|
||||||
|
public static void Subscribe()
|
||||||
|
{
|
||||||
|
StoreClientListDict.storeClientDict[Id] = Create;
|
||||||
|
ModHook.OnGenerateCustomerNormal += Open;
|
||||||
|
ModHook.OnGenerateCustomerLate += Close;
|
||||||
|
ModHook.OnGoingSleepEarly += VoidUnpaid;
|
||||||
|
ModHelper.AddDebugFunction(ModInfo.Id, ModInfo.Name, "OTC client (test)", () => Log.Guard("换币客户(测试)", () =>
|
||||||
|
{
|
||||||
|
spawning = true;
|
||||||
|
StoreClient c;
|
||||||
|
try { c = Create(); } finally { spawning = false; }
|
||||||
|
PlayerStore.Instance.currentClientInstance = null;
|
||||||
|
PlayerStore.Instance.storeClientManager.clientStack.Insert(0, c);
|
||||||
|
PlayerStore.Instance.TryCallNextClient();
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Unsubscribe()
|
||||||
|
{
|
||||||
|
StoreClientListDict.storeClientDict.Remove(Id);
|
||||||
|
ModHook.OnGenerateCustomerNormal -= Open;
|
||||||
|
ModHook.OnGenerateCustomerLate -= Close;
|
||||||
|
ModHook.OnGoingSleepEarly -= VoidUnpaid;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void Open(StoreClientManager _) => spawning = true;
|
||||||
|
private static void Close(StoreClientManager _) => spawning = false;
|
||||||
|
|
||||||
|
/// <summary>顾客表里的工厂。</summary>
|
||||||
|
private static StoreClient Create()
|
||||||
|
{
|
||||||
|
StoreClient c = null;
|
||||||
|
if (spawning && Session.Data != null && Unlock.OtcUnlocked) Log.Guard("换币客户上门", () => c = Real());
|
||||||
|
return c ?? Shell();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>只有名字的顾客(原版取名字时用;生成失败时上门说一句就走)。</summary>
|
||||||
|
private static StoreClient Shell()
|
||||||
|
{
|
||||||
|
var c = Base();
|
||||||
|
c.mainDialogue.SetText(c.displayName, L.T("otc.refused")).SetEndAction(Leave);
|
||||||
|
Finish(c);
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static StoreClient Base() => new StoreClient
|
||||||
|
{
|
||||||
|
identifier = Id, displayName = L.T("otc.name"), spriteName = SpriteDict.GetRandomShadySpriteName(),
|
||||||
|
clientIntent = StoreClient.ClientIntent.DIALOGUE,
|
||||||
|
};
|
||||||
|
|
||||||
|
private static void Finish(StoreClient c)
|
||||||
|
{
|
||||||
|
ModHelper.SetClientSource(c, ModInfo.Id);
|
||||||
|
c.AddBasicDialog();
|
||||||
|
c.CompleteClientCreation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static StoreClient Real()
|
||||||
|
{
|
||||||
|
var d = Session.Data;
|
||||||
|
var side = Otc.PickSide(d.Rng);
|
||||||
|
bool ponero = Unlock.BlackUnlocked && BlackMarket.DeskOpen(StoreReputation.GetBMReputation());
|
||||||
|
var o = side == OtcSide.Sell ? Otc.MakeSell(Night.ActiveEvents(), ponero, Session.Price, Session.Rent(), d.Rng) : Otc.MakeBuy(Session.Price, Session.Rent(), d.Rng);
|
||||||
|
if (o == null) return null;
|
||||||
|
string addr = d.Address("otc:" + (++d.Otc.Seq));
|
||||||
|
var c = Base();
|
||||||
|
if (o.Side == OtcSide.Sell) { WriteHistory(d, o, addr); BuildSell(c, o, addr); }
|
||||||
|
else BuildBuy(c, o, addr);
|
||||||
|
Finish(c);
|
||||||
|
Log.Info(o.Side == OtcSide.Sell
|
||||||
|
? $"换币客户(卖币):{o.Qty:0.##} {o.Asset},市值 {o.Value:0},污点比例 {o.TaintRatio:0.00},要价 {o.Cash}{(o.Sting ? "(便衣)" : "")}"
|
||||||
|
: $"换币客户(买币):{o.Qty:0.##} {o.Asset},市值 {o.Value:0}");
|
||||||
|
Session.Save();
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>客户地址的来历写进链上账本(Ponero 不上账本):脏的来源是混币器、黑市平台和骗局地址,干净的是 Poinbase 和 DEX。</summary>
|
||||||
|
private static void WriteHistory(SaveData d, OtcOffer o, string addr)
|
||||||
|
{
|
||||||
|
if (o.Asset == Assets.Ponero) return;
|
||||||
|
var dirty = new List<string> { d.Address("mixer"), d.Address("platform") };
|
||||||
|
dirty.AddRange(d.Scams.ScamAddrs);
|
||||||
|
var clean = new List<string> { d.Address("poinbase"), d.Address("dex") };
|
||||||
|
foreach (var kv in Otc.History(o, dirty, clean, d.Rng)) d.Chain(kv.Key, addr, o.Asset, o.Qty * kv.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- 卖币给玩家 ----------
|
||||||
|
|
||||||
|
private static void BuildSell(StoreClient c, OtcOffer o, string addr)
|
||||||
|
{
|
||||||
|
// 选项的动作先于下一句执行:在动作里结算,再把客户的回话换成结果
|
||||||
|
var yes = new Dialogue();
|
||||||
|
var reply = yes.SetText("PLAYER", L.T("otc.say.yes")).NextDialogue();
|
||||||
|
reply.SetText(c.displayName, L.T("otc.refused")).SetEndAction(Leave);
|
||||||
|
var no = new Dialogue();
|
||||||
|
no.SetText("PLAYER", L.T("otc.say.no")).NextDialogue().SetText(c.displayName, L.T("otc.refused")).SetEndAction(Leave);
|
||||||
|
string intro = o.TaintRatio >= 1 || o.Asset == Assets.Ponero ? "otc.intro." + o.Asset : "otc.intro.sell";
|
||||||
|
c.mainDialogue.SetText(c.displayName, L.T(intro, o.Asset)).NextDialogue()
|
||||||
|
.SetText(c.displayName, L.T("otc.offer", Fmt.Num(o.Qty), o.Asset, Fmt.Credits(o.Value), Fmt.Credits(o.Cash), ChainAddress.Short(addr)))
|
||||||
|
.AddChoice(DirectoryMaster.Item("yes"), L.T("otc.choice.yes"), "", yes, () => reply.SetText(c.displayName, L.T(AcceptSell(o, addr))))
|
||||||
|
.AddChoice(DirectoryMaster.Item("cancel"), L.T("otc.choice.no"), "", no, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>收下:现金不够或没连钱包就作罢;便衣没收现金、记销赃罪证;否则付现金、币进钱包。返回客户回话的键。</summary>
|
||||||
|
private static string AcceptSell(OtcOffer o, string addr)
|
||||||
|
{
|
||||||
|
string line = "otc.refused";
|
||||||
|
Log.Guard("换币客户成交(卖币)", () =>
|
||||||
|
{
|
||||||
|
var d = Session.Data;
|
||||||
|
var ps = PlayerStore.Instance;
|
||||||
|
if (!d.Connected) { line = "otc.nowallet"; return; }
|
||||||
|
if (ps.playerCash < o.Cash) { line = "otc.nocash"; return; }
|
||||||
|
ModHelper.AddCredit(-o.Cash, false);
|
||||||
|
if (o.Sting)
|
||||||
|
{
|
||||||
|
ps.secData.CommitCrime("FENCING", (int)Math.Min(Tuning.CrimeEventCap, o.Cash));
|
||||||
|
line = "otc.sting";
|
||||||
|
Log.Info($"换币客户:便衣,现金 {o.Cash} 没收,记销赃罪证");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
double over = Otc.Receive(d.Hot, o, Session.Price);
|
||||||
|
d.Chain(addr, d.Hot.Address, o.Asset, o.Qty);
|
||||||
|
d.Otc.Record(o.Cash);
|
||||||
|
string extra = TaintCrime.Commit(over);
|
||||||
|
if (extra.Length > 0) ps.AddNightLog(extra.Trim(), "cc7755");
|
||||||
|
line = "otc.done";
|
||||||
|
Log.Info($"换币客户:{o.Qty:0.##} {o.Asset} 进 {WalletWindow.NameOf(d.Hot)},付现金 {o.Cash},钱包污点 {d.Hot.Taint:0},超出 {over:0}");
|
||||||
|
}
|
||||||
|
Session.Save();
|
||||||
|
});
|
||||||
|
return line;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- 向玩家买币 ----------
|
||||||
|
|
||||||
|
private static void BuildBuy(StoreClient c, OtcOffer o, string addr)
|
||||||
|
{
|
||||||
|
var ask = c.mainDialogue.SetText(c.displayName, L.T("otc.buy.ask", Fmt.Num(o.Qty), o.Asset, Fmt.Credits(o.Value)));
|
||||||
|
for (int tier = 0; tier < Tuning.OtcPremium.Length; tier++)
|
||||||
|
{
|
||||||
|
int t = tier, price = Otc.Quote(o, t);
|
||||||
|
var say = new Dialogue();
|
||||||
|
var reply = say.SetText("PLAYER", L.T("otc.buy.say", Fmt.Credits(price))).NextDialogue();
|
||||||
|
reply.SetText(c.displayName, L.T("otc.buy.reject")).SetEndAction(Leave);
|
||||||
|
ask.AddChoice(DirectoryMaster.Item("$"), L.T("otc.tier", (Tuning.OtcPremium[t] * 100).ToString("0"), Fmt.Credits(price)), "", say,
|
||||||
|
() => reply.SetText(c.displayName, AcceptBuy(o, addr, t, price)));
|
||||||
|
}
|
||||||
|
var no = new Dialogue();
|
||||||
|
no.SetText("PLAYER", L.T("otc.buy.no")).NextDialogue().SetText(c.displayName, L.T("otc.refused")).SetEndAction(Leave);
|
||||||
|
ask.AddChoice(DirectoryMaster.Item("cancel"), L.T("otc.choice.no"), "", no, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>报价:客户按这一档的概率接受。接受就开账单(转到客户地址),确认后现金到账。返回客户的回话。</summary>
|
||||||
|
private static string AcceptBuy(OtcOffer o, string addr, int tier, int price)
|
||||||
|
{
|
||||||
|
string line = L.T("otc.buy.reject");
|
||||||
|
Log.Guard("换币客户报价(买币)", () =>
|
||||||
|
{
|
||||||
|
var d = Session.Data;
|
||||||
|
if (!Otc.Accepts(tier, d.Rng)) { Log.Info($"换币客户:第 {tier + 1} 档 {price} 没接受"); return; }
|
||||||
|
double qty = WalletWindow.RoundUp(o.Qty);
|
||||||
|
string asset = o.Asset;
|
||||||
|
WalletWindow.Bill bill = null;
|
||||||
|
bill = new WalletWindow.Bill
|
||||||
|
{
|
||||||
|
Address = addr, Asset = asset, Amount = qty, Summary = L.T("pay.otc", WalletWindow.Amt(qty), asset, Fmt.Credits(price)),
|
||||||
|
Execute = pw => Log.Guard("换币客户到账", () =>
|
||||||
|
{
|
||||||
|
pw.Spend(asset, qty, Session.Price);
|
||||||
|
ModHelper.AddCredit(price, true);
|
||||||
|
Session.Data.Otc.Record(price);
|
||||||
|
if (pendingBill == bill) pendingBill = null;
|
||||||
|
PlayerStore.Instance.AddNightLog(L.T("nightlog.otc.paid", WalletWindow.Amt(qty), asset, Fmt.Credits(price)));
|
||||||
|
Log.Info($"换币客户:{qty} {asset} 到账,收现金 {price}");
|
||||||
|
Session.Save();
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
WalletWindow.Pending = pendingBill = bill;
|
||||||
|
line = L.T("otc.buy.accept", Fmt.Credits(price), ChainAddress.Short(addr));
|
||||||
|
Log.Info($"换币客户:第 {tier + 1} 档 {price} 成交,待转 {qty} {asset} 到 {addr}");
|
||||||
|
});
|
||||||
|
return line;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>睡觉前:买币客户的账单还没付(仍是待付账单),作废。已经签名、还在确认中的照常到账。</summary>
|
||||||
|
private static void VoidUnpaid()
|
||||||
|
{
|
||||||
|
if (pendingBill == null || WalletWindow.Pending != pendingBill) return;
|
||||||
|
Log.Guard("换币账单作废", () =>
|
||||||
|
{
|
||||||
|
WalletWindow.Pending = null;
|
||||||
|
PlayerStore.Instance.AddNightLog(L.T("nightlog.otc.unpaid", WalletWindow.Amt(pendingBill.Amount), pendingBill.Asset), "cc7755");
|
||||||
|
Log.Info("换币客户的账单当天没付,作废");
|
||||||
|
});
|
||||||
|
pendingBill = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void Leave() => DialogUIManager.Instance.CurrentClientLeave();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,112 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace Decentralized
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 借用原版小偷灯招揽换币客户:在原版小偷灯的工厂外包一层,切换顺序末尾加一个目标"换币客户"(解锁换币台后才有)。
|
||||||
|
/// 原版按灯的目标去公开的顾客表(<see cref="StoreClientListDict.storeClientDict"/>)里造顾客,所以顾客面板、灯的提示、概率都走原版逻辑。
|
||||||
|
/// 霓虹色:底图换成原版图集里熄灭的暗灯(存档里记的仍是原版的图,卸载后不缺图),上面用原版的图片叠加层
|
||||||
|
/// (getItemSpriteModifierForItemFunc,运行时委托,不进存档)画黄绿色光晕。原版遇到不认识的目标会点亮成第一种颜色,我们排在它后面改回熄灭的底图。
|
||||||
|
/// 切换只接管进出我们目标的那一步,其余交给原来的切换函数,别的 mod 往灯上加的目标也照样能切到。
|
||||||
|
/// </summary>
|
||||||
|
public static class OtcLamp
|
||||||
|
{
|
||||||
|
/// <summary>灯的目标 = 顾客表里的顾客标识。</summary>
|
||||||
|
public const string Target = "pd_otc";
|
||||||
|
private const string OverlaySprite = "otc_lamp_on";
|
||||||
|
/// <summary>原版暗灯所在的图集与熄灭时的图(BlackLampHelper 里是私有常量)。</summary>
|
||||||
|
private const string LampAtlas = "Items/items_sign", LampOff = "black_lamp";
|
||||||
|
|
||||||
|
private static readonly Action<GameItem, GameInventory, SlotMarker> OnShowcaseChanged = (item, _, __) => Log.Guard("展示柜刷新换币灯", () => Refresh(item));
|
||||||
|
|
||||||
|
public static bool IsLamp(GameItem item) => item != null && item.identifier == BlackLampHelper.BLACK_LAMP_ID;
|
||||||
|
public static bool IsOurs(GameItem item) => IsLamp(item) && BlackLampHelper.GetTarget(item) == Target;
|
||||||
|
|
||||||
|
/// <summary>在原版小偷灯的工厂外包一层(物品目录初始化时)。</summary>
|
||||||
|
public static void Wrap(ModItemDirectory dir)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var make = DirectoryMaster.GetFactory<GameItem>(BlackLampHelper.BLACK_LAMP_ID);
|
||||||
|
if (make == null) { Log.Warn("[OTC] 找不到原版小偷灯"); return; }
|
||||||
|
dir.Set(BlackLampHelper.BLACK_LAMP_ID, () =>
|
||||||
|
{
|
||||||
|
var lamp = make();
|
||||||
|
var prev = lamp.onActivateSlotItemFunc;
|
||||||
|
lamp.onActivateSlotItemFunc = (it, inv, slot) => Log.Guard("小偷灯切换", () => Cycle(it, inv, slot, prev));
|
||||||
|
var prevSprites = lamp.getItemSpriteModifierForItemFunc;
|
||||||
|
lamp.getItemSpriteModifierForItemFunc = it => Overlay(it, prevSprites);
|
||||||
|
return lamp;
|
||||||
|
});
|
||||||
|
Log.Info("[OTC] 已包装原版小偷灯");
|
||||||
|
}
|
||||||
|
catch (Exception ex) { Log.Error("[OTC] 包装小偷灯失败:" + ex); }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 切换:当前是"换币客户"时回到原版第一个目标;否则先走原来的切换,原来的切换绕回第一个目标、而且换币台已解锁时,改成"换币客户"。
|
||||||
|
/// </summary>
|
||||||
|
private static void Cycle(GameItem lamp, GameInventory inv, SlotMarker slot, Action<GameItem, GameInventory, SlotMarker> prev)
|
||||||
|
{
|
||||||
|
string first = BlackLampHelper.TARGETS[0];
|
||||||
|
if (IsOurs(lamp))
|
||||||
|
{
|
||||||
|
SetTarget(lamp, first);
|
||||||
|
BlackLampHelper.RefreshLampSprite(lamp);
|
||||||
|
AudioManager.Instance.Play2("click_vintage");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
string before = BlackLampHelper.GetTarget(lamp);
|
||||||
|
prev?.Invoke(lamp, inv, slot);
|
||||||
|
if (Unlock.OtcUnlocked && before != first && BlackLampHelper.GetTarget(lamp) == first) SetTarget(lamp, Target);
|
||||||
|
}
|
||||||
|
Refresh(lamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SetTarget(GameItem lamp, string target) => lamp.ModifyTag(BlackLampHelper.LAMP_TARGET_TAG, s => { s.Enable().SetString(target); });
|
||||||
|
|
||||||
|
/// <summary>目标是"换币客户"、而且灯在展示柜里时,叠一层霓虹灯图(盖住原版退回的点亮图)。</summary>
|
||||||
|
private static List<ItemSpriteModifier> Overlay(GameItem lamp, Func<GameItem, List<ItemSpriteModifier>> prev)
|
||||||
|
{
|
||||||
|
var list = prev?.Invoke(lamp) ?? new List<ItemSpriteModifier>();
|
||||||
|
if (IsOurs(lamp) && InShowcase(lamp))
|
||||||
|
{
|
||||||
|
var sprite = Items.ModSprite(OverlaySprite);
|
||||||
|
if (sprite != null) list.Add(new ItemSpriteModifier(sprite, Vector2.zero, 0, isFlipped: false, 10, haveMask: false, Color.white));
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool InShowcase(GameItem item)
|
||||||
|
{
|
||||||
|
var sc = EmporiumEntry.Instance?.showcaseElement;
|
||||||
|
return sc != null && sc.childItems.Contains(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>换币灯在展示柜里:底图改成熄灭的暗灯(光晕由叠加层画);然后重画。</summary>
|
||||||
|
private static void Refresh(GameItem item)
|
||||||
|
{
|
||||||
|
if (!IsLamp(item)) return;
|
||||||
|
if (IsOurs(item) && InShowcase(item)) item.SetSpriteQuick(LampAtlas, LampOff);
|
||||||
|
item.Validate();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 读档、开新游戏后:在展示柜的放入、取出回调后面挂上刷新(原版在这两个回调里重设灯的底图,我们排在它后面重画叠加层),
|
||||||
|
/// 先解绑再挂,避免读档几次挂几次;再把展示柜里的灯刷新一遍。
|
||||||
|
/// </summary>
|
||||||
|
public static void Attach()
|
||||||
|
{
|
||||||
|
var sc = EmporiumEntry.Instance?.showcaseElement;
|
||||||
|
if (sc == null) return;
|
||||||
|
sc.onSlotAddItemLateFunc = (Action<GameItem, GameInventory, SlotMarker>)Delegate.Remove(sc.onSlotAddItemLateFunc, OnShowcaseChanged);
|
||||||
|
sc.onSlotAddItemLateFunc = (Action<GameItem, GameInventory, SlotMarker>)Delegate.Combine(sc.onSlotAddItemLateFunc, OnShowcaseChanged);
|
||||||
|
sc.onSlotRemoveItemEndFunc = (Action<GameItem, GameInventory, SlotMarker>)Delegate.Remove(sc.onSlotRemoveItemEndFunc, OnShowcaseChanged);
|
||||||
|
sc.onSlotRemoveItemEndFunc = (Action<GameItem, GameInventory, SlotMarker>)Delegate.Combine(sc.onSlotRemoveItemEndFunc, OnShowcaseChanged);
|
||||||
|
foreach (var item in sc.childItems) Refresh(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -25,8 +25,8 @@ namespace Decentralized
|
|||||||
/// <summary>一局的 mod 状态。整体序列化成 JSON 存进游戏的 mod 存档数据;显卡的健康度等存在显卡物品的标签上。</summary>
|
/// <summary>一局的 mod 状态。整体序列化成 JSON 存进游戏的 mod 存档数据;显卡的健康度等存在显卡物品的标签上。</summary>
|
||||||
public sealed class SaveData
|
public sealed class SaveData
|
||||||
{
|
{
|
||||||
/// <summary>存档数据的版本:2 起保险基金用新的数值,3 起 Poinbase 主池是订单簿。</summary>
|
/// <summary>存档数据的版本:2 起保险基金用新的数值,3 起 Poinbase 主池是订单簿,4 起出块奖励和 NPC 算力 ×10(第十一阶段)。</summary>
|
||||||
public int Version = 3;
|
public int Version = 4;
|
||||||
public int Day;
|
public int Day;
|
||||||
public Rng Rng = new Rng((ulong)DateTime.UtcNow.Ticks);
|
public Rng Rng = new Rng((ulong)DateTime.UtcNow.Ticks);
|
||||||
public Market Market;
|
public Market Market;
|
||||||
@@ -88,6 +88,8 @@ namespace Decentralized
|
|||||||
public double ChainValue(Func<string, double> price) { double v = 0; foreach (var w in Wallets) v += w.Value(price); return v; }
|
public double ChainValue(Func<string, double> price) { double v = 0; foreach (var w in Wallets) v += w.Value(price); return v; }
|
||||||
public Exchange Exchange = new Exchange();
|
public Exchange Exchange = new Exchange();
|
||||||
public Mixer Mixer = new Mixer();
|
public Mixer Mixer = new Mixer();
|
||||||
|
/// <summary>换币台的累计成交与客户地址编号。</summary>
|
||||||
|
public OtcDesk Otc = new OtcDesk();
|
||||||
public BlackMarket Black = new BlackMarket();
|
public BlackMarket Black = new BlackMarket();
|
||||||
public List<MarketEvent> ActiveEvents = new List<MarketEvent>();
|
public List<MarketEvent> ActiveEvents = new List<MarketEvent>();
|
||||||
public NightReport LastNight;
|
public NightReport LastNight;
|
||||||
@@ -189,9 +191,19 @@ namespace Decentralized
|
|||||||
Data.Market.AddPoinSpark(Data.Stable.Spark, StoreStation.GetDayCounter());
|
Data.Market.AddPoinSpark(Data.Stable.Spark, StoreStation.GetDayCounter());
|
||||||
Data.Market.UpgradeDexPools(StoreStation.GetDayCounter());
|
Data.Market.UpgradeDexPools(StoreStation.GetDayCounter());
|
||||||
if (Data.Version < 3) { Data.Version = 3; Log.Info("存档数据升级到版本 3:保险基金、Poinbase 订单簿"); }
|
if (Data.Version < 3) { Data.Version = 3; Log.Info("存档数据升级到版本 3:保险基金、Poinbase 订单簿"); }
|
||||||
|
// 第十一阶段:出块奖励和 NPC 算力同乘 10(均衡时每 H 收入不变,玩家算力占比变低);旧存档按当时的减半进度一起放大
|
||||||
|
if (Data.Version < 4)
|
||||||
|
{
|
||||||
|
Data.Network.Reward *= Tuning.MiningScale;
|
||||||
|
Data.Network.NpcHash *= Tuning.MiningScale;
|
||||||
|
Data.Version = 4;
|
||||||
|
Log.Info($"存档数据升级到版本 4:出块奖励 {Data.Network.Reward:0}、NPC 算力 {Data.Network.NpcHash:0}");
|
||||||
|
}
|
||||||
|
if (Data.Otc == null) Data.Otc = new OtcDesk();
|
||||||
if (Data.Story == null) Data.Story = new StoryMods();
|
if (Data.Story == null) Data.Story = new StoryMods();
|
||||||
StoryMods.Current = Data.Story;
|
StoryMods.Current = Data.Story;
|
||||||
Log.Info($"状态已载入(第 {Data.Day} 天,PSC {Data.Market.Price:0.00})");
|
Log.Info($"状态已载入(第 {Data.Day} 天,PSC {Data.Market.Price:0.00})");
|
||||||
|
Log.Guard("换币灯", OtcLamp.Attach);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Save()
|
public static void Save()
|
||||||
|
|||||||
@@ -1576,6 +1576,7 @@ namespace Decentralized
|
|||||||
if (key != null)
|
if (key != null)
|
||||||
{
|
{
|
||||||
if (key.StartsWith("airdrop:") || key.StartsWith("yield:")) return key.Substring(key.IndexOf(':') + 1);
|
if (key.StartsWith("airdrop:") || key.StartsWith("yield:")) return key.Substring(key.IndexOf(':') + 1);
|
||||||
|
if (key.StartsWith("otc:")) return L.T("otc.name");
|
||||||
switch (key)
|
switch (key)
|
||||||
{
|
{
|
||||||
case "mixer": return L.T("explorer.mixer");
|
case "mixer": return L.T("explorer.mixer");
|
||||||
|
|||||||
@@ -15,6 +15,10 @@ namespace Decentralized
|
|||||||
public static bool MixerUnlocked => PlayerStore.Instance != null && ModHelper.IsNetworkUpgradeUnlocked(MixerId);
|
public static bool MixerUnlocked => PlayerStore.Instance != null && ModHelper.IsNetworkUpgradeUnlocked(MixerId);
|
||||||
|
|
||||||
public const string BlackId = "PD_BLACKMARKET";
|
public const string BlackId = "PD_BLACKMARKET";
|
||||||
|
|
||||||
|
/// <summary>场外换币台:小偷灯多一个目标"换币客户",买下时附赠一盏小偷灯(已切到这个目标)。</summary>
|
||||||
|
public const string OtcId = "PD_OTC";
|
||||||
|
public static bool OtcUnlocked => PlayerStore.Instance != null && ModHelper.IsNetworkUpgradeUnlocked(OtcId);
|
||||||
public static bool BlackUnlocked => PlayerStore.Instance != null && ModHelper.IsNetworkUpgradeUnlocked(BlackId);
|
public static bool BlackUnlocked => PlayerStore.Instance != null && ModHelper.IsNetworkUpgradeUnlocked(BlackId);
|
||||||
|
|
||||||
public static bool IsUnlocked => PlayerStore.Instance != null && ModHelper.IsNetworkUpgradeUnlocked(Id);
|
public static bool IsUnlocked => PlayerStore.Instance != null && ModHelper.IsNetworkUpgradeUnlocked(Id);
|
||||||
@@ -27,6 +31,7 @@ namespace Decentralized
|
|||||||
Add(Id, Price, () => L.T("upgrade.title"), () => L.T("upgrade.desc"), OnPurchased, "terminal", null);
|
Add(Id, Price, () => L.T("upgrade.title"), () => L.T("upgrade.desc"), OnPurchased, "terminal", null);
|
||||||
Add(MixerId, MixerPrice, () => L.T("mixer.upgrade.title"), () => L.T("mixer.upgrade.desc"), () => Log.Info("混币器已解锁"), "ui_web3", new[] { Id });
|
Add(MixerId, MixerPrice, () => L.T("mixer.upgrade.title"), () => L.T("mixer.upgrade.desc"), () => Log.Info("混币器已解锁"), "ui_web3", new[] { Id });
|
||||||
Add(BlackId, Domain.Tuning.BmUnlockPrice, () => L.T("black.upgrade.title"), () => L.T("black.upgrade.desc"), () => Log.Info("Web3 黑市已解锁"), "ui_web3", new[] { Id });
|
Add(BlackId, Domain.Tuning.BmUnlockPrice, () => L.T("black.upgrade.title"), () => L.T("black.upgrade.desc"), () => Log.Info("Web3 黑市已解锁"), "ui_web3", new[] { Id });
|
||||||
|
Add(OtcId, Domain.Tuning.OtcUnlockPrice, () => L.T("otc.upgrade.title"), () => L.T("otc.upgrade.desc"), OnOtcPurchased, "ui_web3", new[] { Id });
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void Add(string id, int price, Func<string> title, Func<string> desc, Action onUnlock, string icon, string[] prerequisites)
|
private static void Add(string id, int price, Func<string> title, Func<string> desc, Action onUnlock, string icon, string[] prerequisites)
|
||||||
@@ -35,6 +40,14 @@ namespace Decentralized
|
|||||||
catch (NullReferenceException) { Log.Info($"人脉升级 {id} 已登记(主菜单阶段访问 PlayerStore 失败,已忽略)"); }
|
catch (NullReferenceException) { Log.Info($"人脉升级 {id} 已登记(主菜单阶段访问 PlayerStore 失败,已忽略)"); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void OnOtcPurchased()
|
||||||
|
{
|
||||||
|
var lamp = ModHelper.SpawnItem(BlackLampHelper.BLACK_LAMP_ID);
|
||||||
|
OtcLamp.SetTarget(lamp, OtcLamp.Target);
|
||||||
|
Items.GiveToFront(lamp);
|
||||||
|
Log.Info("场外换币台已解锁,附赠小偷灯");
|
||||||
|
}
|
||||||
|
|
||||||
private static void OnPurchased()
|
private static void OnPurchased()
|
||||||
{
|
{
|
||||||
Items.GiveToFront(ModHelper.SpawnItem(Items.Terminal));
|
Items.GiveToFront(ModHelper.SpawnItem(Items.Terminal));
|
||||||
|
|||||||
@@ -1357,32 +1357,63 @@ internal static class Program
|
|||||||
Check(ps > 12 && ps < 20, $"夜里向 SPARK 参考价靠拢:{ps:0.00}");
|
Check(ps > 12 && ps < 20, $"夜里向 SPARK 参考价靠拢:{ps:0.00}");
|
||||||
});
|
});
|
||||||
|
|
||||||
Test("收黑币:事件对应币种、报价、收下后的污点", () =>
|
Test("换币客户:卖币的事件币种、污点比例与折扣、收下后的污点;买币的报价档;成交统计", () =>
|
||||||
{
|
{
|
||||||
|
Func<string, double> pr = a => a == Assets.Ponero ? 50 : 1;
|
||||||
|
var none = new List<MarketEvent>();
|
||||||
var rng = new Rng(3);
|
var rng = new Rng(3);
|
||||||
int crt = 0, psc = 0, pon = 0;
|
int ev = 0, sides = 0;
|
||||||
for (int i = 0; i < 4000; i++)
|
for (int i = 0; i < 4000; i++)
|
||||||
{
|
{
|
||||||
string a1 = HotCoins.Pick(new[] { MarketEvent.GangWar }, false, rng);
|
var o = Otc.MakeSell(new List<MarketEvent> { MarketEvent.GangWar }, false, pr, 500, rng);
|
||||||
if (a1 == Assets.CRT) crt++; else if (a1 != null) psc++;
|
if (o.Asset == Assets.CRT && o.TaintRatio == 1) ev++;
|
||||||
if (HotCoins.Pick(new MarketEvent[0], true, rng) == Assets.Ponero) pon++;
|
if (Otc.PickSide(rng) == OtcSide.Sell) sides++;
|
||||||
}
|
}
|
||||||
Check(psc == 0 && Math.Abs(crt / 4000.0 - Tuning.HotEventChance) < 0.03, $"帮派火并期间只有 CRT:{crt}/4000");
|
Check(Math.Abs(ev / 4000.0 - Tuning.OtcEventChance) < 0.03, $"帮派火并期间多是 CRT、全额污点:{ev}/4000");
|
||||||
Check(Math.Abs(pon / 4000.0 - Tuning.HotPoneroChance) < 0.015, $"兑换处开放后的 Ponero:{pon}/4000");
|
Check(Math.Abs(sides / 4000.0 - Tuning.OtcSellShare) < 0.03, $"卖币、买币各占一半:{sides}/4000");
|
||||||
Check(HotCoins.Pick(new[] { MarketEvent.RevRaidUpper }, false, new Rng(1)) is string sa ? sa == Assets.PSC : true, "革命军袭击上层是 PSC");
|
Check(Otc.EventAsset(new List<MarketEvent> { MarketEvent.RevRaidUpper }, new Rng(1)) == Assets.PSC && Otc.EventAsset(none, new Rng(1)) == null, "革命军袭击上层是 PSC;没有事件时没有事件币");
|
||||||
Check(HotCoins.Pick(new MarketEvent[0], false, rng) == null, "没有事件、兑换处没开:没人上门");
|
// 平时:PSC/CRT/CRA 随机,污点比例在区间内,越脏越便宜
|
||||||
var o = HotCoins.Make(Assets.CRT, 1, 500, false, new Rng(9));
|
for (int i = 0; i < 200; i++)
|
||||||
Check(o.Value >= 500 * Tuning.HotValueMinRents && o.Value <= 500 * Tuning.HotValueMaxRents && o.Cash >= o.Value * Tuning.HotCutMin - 1 && o.Cash <= o.Value * Tuning.HotCutMax + 1, $"报价:市值 {o.Value:0},现金 {o.Cash}");
|
{
|
||||||
|
var o = Otc.MakeSell(none, false, pr, 500, rng);
|
||||||
|
Check(Array.IndexOf(Otc.SellAssets, o.Asset) >= 0 && o.TaintRatio >= Tuning.OtcTaintMin && o.TaintRatio <= Tuning.OtcTaintMax, "平时的币种与污点比例");
|
||||||
|
Check(o.Value >= 500 * Tuning.OtcValueMinRents && o.Value <= 500 * Tuning.OtcValueMaxRents && Math.Abs(o.Cash - o.Value * Otc.CutFor(o.TaintRatio)) <= 1, $"市值与现金价:{o.Value:0} / {o.Cash}");
|
||||||
|
}
|
||||||
|
Check(Otc.CutFor(0) == Tuning.OtcCutClean && Otc.CutFor(1) == Tuning.OtcCutDirty && Otc.CutFor(0.3) > Otc.CutFor(0.7), "折扣按污点比例线性降低");
|
||||||
|
// 收下:币进钱包,成本是付的现金,污点 = 市值 × 比例(带上限)
|
||||||
|
var oc = new OtcOffer { Side = OtcSide.Sell, Asset = Assets.CRT, Qty = 1000, Value = 1000, TaintRatio = 0.4, Cash = 700 };
|
||||||
var w = new Wallet();
|
var w = new Wallet();
|
||||||
HotCoins.Receive(w, o);
|
Check(Otc.Receive(w, oc, pr) == 0 && Near(w.Get(Assets.CRT), 1000, 1e-9) && Near(w.Taint, 400, 1e-9) && Near(w.Basis, 700, 1e-9), "污点按比例,成本是付的现金");
|
||||||
Check(Near(w.Get(Assets.CRT), o.Qty, 1e-9) && Near(w.Taint, o.Value, 1e-9) && Near(w.Basis, o.Cash, 1e-9), "CRT 全额带污点,成本是付的现金");
|
var wf = new Wallet(); wf.Add(Assets.CRC, 100); wf.Taint = 1000;
|
||||||
var op = HotCoins.Make(Assets.Ponero, 50, 500, false, new Rng(9));
|
Check(Near(Otc.Receive(wf, oc, pr), 300, 1e-9) && Near(wf.Taint, 1100, 1e-9), "原有污点多时超出的部分返回");
|
||||||
var wp = new Wallet();
|
// Ponero:兑换处开放后偶尔有,不带污点
|
||||||
HotCoins.Receive(wp, op);
|
int pon = 0;
|
||||||
Check(wp.Taint == 0 && op.Cash >= op.Value * Tuning.HotPoneroCutMin - 1, "Ponero 不带污点、折扣小");
|
for (int i = 0; i < 4000; i++) { var o = Otc.MakeSell(none, true, pr, 500, rng); if (o.Asset == Assets.Ponero) { pon++; Check(o.TaintRatio == 0 && o.Cash >= o.Value * Tuning.OtcPoneroCutMin - 1, "Ponero 不带污点"); } }
|
||||||
|
Check(Math.Abs(pon / 4000.0 - Tuning.OtcPoneroChance) < 0.02, $"兑换处开放后的 Ponero:{pon}/4000");
|
||||||
int stings = 0, stingsCd = 0;
|
int stings = 0, stingsCd = 0;
|
||||||
for (int i = 0; i < 4000; i++) { if (HotCoins.Make(Assets.CRT, 1, 500, false, rng).Sting) stings++; if (HotCoins.Make(Assets.CRT, 1, 500, true, rng).Sting) stingsCd++; }
|
for (int i = 0; i < 4000; i++)
|
||||||
Check(stingsCd > stings * 2, $"镇压期间钓鱼执法更多:{stings} → {stingsCd}");
|
{
|
||||||
|
if (Otc.MakeSell(none, false, pr, 500, rng).Sting) stings++;
|
||||||
|
if (Otc.MakeSell(new List<MarketEvent> { MarketEvent.Crackdown }, false, pr, 500, rng).Sting) stingsCd++;
|
||||||
|
}
|
||||||
|
Check(stingsCd > stings * 2, $"镇压期间便衣更多:{stings} → {stingsCd}");
|
||||||
|
// 买币:市值按房租,三档溢价,越高越难成交
|
||||||
|
var ob = Otc.MakeBuy(pr, 500, new Rng(7));
|
||||||
|
Check(Array.IndexOf(Otc.BuyAssets, ob.Asset) >= 0 && ob.Value >= 500 * Tuning.OtcBuyMinRents && ob.Value <= 500 * Tuning.OtcBuyMaxRents && Near(ob.Qty * pr(ob.Asset), ob.Value, 1e-6), "买币的币种与数量");
|
||||||
|
Check(Otc.Quote(ob, 0) < Otc.Quote(ob, 1) && Otc.Quote(ob, 1) < Otc.Quote(ob, 2) && Otc.Quote(ob, 2) == (int)Math.Round(ob.Value * (1 + Tuning.OtcPremium[2])), "三档报价");
|
||||||
|
for (int t = 0; t < 3; t++)
|
||||||
|
{
|
||||||
|
int ok = 0; var r = new Rng((ulong)(t + 11));
|
||||||
|
for (int i = 0; i < 4000; i++) if (Otc.Accepts(t, r)) ok++;
|
||||||
|
Check(Math.Abs(ok / 4000.0 - Tuning.OtcAccept[t]) < 0.03, $"第 {t + 1} 档成交概率:{ok}/4000");
|
||||||
|
}
|
||||||
|
// 来历:脏的来源按污点比例出现,数量占比合计为 1
|
||||||
|
var hist = Otc.History(new OtcOffer { TaintRatio = 1 }, new[] { "dirty" }, new[] { "clean" }, new Rng(2));
|
||||||
|
Check(hist.Count >= 1 && hist.Count <= Tuning.OtcHistoryMax && hist.TrueForAll(kv => kv.Key == "dirty") && Near(hist.Sum(kv => kv.Value), 1, 1e-9), "全脏的币来历都是脏来源");
|
||||||
|
var histC = Otc.History(new OtcOffer { TaintRatio = 0 }, new[] { "dirty" }, new[] { "clean" }, new Rng(2));
|
||||||
|
Check(histC.TrueForAll(kv => kv.Key == "clean"), "干净的币来历都是干净来源");
|
||||||
|
var desk = new OtcDesk(); desk.Record(700); desk.Record(300);
|
||||||
|
Check(desk.Volume == 1000 && desk.Deals == 2, "成交统计");
|
||||||
});
|
});
|
||||||
|
|
||||||
Test("预测市场:LMSR 定价、最大亏损、买卖", () =>
|
Test("预测市场:LMSR 定价、最大亏损、买卖", () =>
|
||||||
|
|||||||
Reference in new issue
Block a user