第十阶段 stage 2(三):Poinbase 资金页(入金、出金、确认进度条)、银行页只读、Poinbase 接收所有币
This commit is contained in:
1 parent
d0dfa93226
commit
e3e5ec2d6e
14 files changed
+344
-84
No files matched your search
@@ -201,24 +201,10 @@ namespace Decentralized
|
||||
{
|
||||
var ps = PlayerStore.Instance;
|
||||
var w = new[] { 180f, 220f };
|
||||
Columns(b, l =>
|
||||
{
|
||||
l.AddHeader(L.T("entry.bank"));
|
||||
TableRow(l, w, L.T("bank.cash.k"), ps.playerCash.ToString());
|
||||
TableRow(l, w, L.T("bank.rent.k"), L.T("bank.rent.v", Session.Rent(), ps.GetRentDayCounter()));
|
||||
TableRow(l, w, L.T("bank.crc.k"), Fmt.Num(Session.Data.Poinbase.Get(Assets.CRC)));
|
||||
}, r =>
|
||||
{
|
||||
r.AddHeader(L.T("bank.ops"));
|
||||
AmountRow(r);
|
||||
AmlPreview(r);
|
||||
r.AddSpace(6f);
|
||||
r.AddButton(L.T("trade.deposit"), Deposit);
|
||||
r.Last?.SetPreferredSize(RightW - 30f, 28f * F);
|
||||
r.AddSpace(4f);
|
||||
r.AddButton(L.T("trade.withdraw"), Withdraw);
|
||||
r.Last?.SetPreferredSize(RightW - 30f, 28f * F);
|
||||
});
|
||||
b.AddHeader(L.T("entry.bank"));
|
||||
TableRow(b, w, L.T("bank.cash.k"), ps.playerCash.ToString());
|
||||
TableRow(b, w, L.T("bank.rent.k"), L.T("bank.rent.v", Session.Rent(), ps.GetRentDayCounter()));
|
||||
TableRow(b, w, L.T("bank.crc.k"), Fmt.Num(Session.Data.Poinbase.Get(Assets.CRC)));
|
||||
}
|
||||
|
||||
/// <summary>提取前的合规审查提示:仅保留账户污点比例(额度与命中概率按设计不公开)。</summary>
|
||||
@@ -338,11 +324,11 @@ namespace Decentralized
|
||||
{
|
||||
any = true;
|
||||
string asset = kv.Key;
|
||||
bool selected = (_page == Page.Poinbase && asset == _poinAsset);
|
||||
bool selected = (_page == Page.Poinbase && _poinTab == PoinTab.Funds && asset == _fundsAsset);
|
||||
TableRow(b, HoldW.Sum() + 8f, HoldW, HoldAligns,
|
||||
new[] { kv.Key, Fmt.Num(kv.Value), Fmt.Credits(kv.Value * Session.Price(kv.Key)), AvgText(w, kv.Key) },
|
||||
selected,
|
||||
() => { if (_page == Page.Poinbase) { _poinAsset = asset; Open(); } });
|
||||
() => { if (_page == Page.Poinbase && _poinTab == PoinTab.Funds) { _fundsAsset = asset; if (asset != Assets.CRC) _fundsBank = false; Open(); } });
|
||||
}
|
||||
if (!any) b.AddLabel(L.T(w == Session.Data.Poinbase ? "poin.empty" : "wallet.empty"), "hold_empty_dim");
|
||||
foreach (var kv in w.Frozen.OrderBy(k => k.Key).Where(k => show(k.Key)))
|
||||
@@ -350,8 +336,8 @@ namespace Decentralized
|
||||
}
|
||||
|
||||
/// <summary>Poinbase:合规交易所。左边账户持仓,右边交易;信用点的存取在银行。</summary>
|
||||
private enum PoinTab { Spot, Perp }
|
||||
private static PoinTab _poinTab = PoinTab.Spot;
|
||||
private enum PoinTab { Funds, Spot, Perp }
|
||||
private static PoinTab _poinTab = PoinTab.Funds;
|
||||
|
||||
private static void ExchangePage(CustomUIBuilder b, Venue venue)
|
||||
{
|
||||
@@ -366,6 +352,7 @@ namespace Decentralized
|
||||
}
|
||||
b.End();
|
||||
if (_poinTab == PoinTab.Perp) { PerpPage(b); return; }
|
||||
if (_poinTab == PoinTab.Funds) { FundsPage(b); return; }
|
||||
Columns(b, l =>
|
||||
{
|
||||
CandleChart.AddPicker(l, "poin", Assets.PSC, Open, _picked);
|
||||
@@ -373,29 +360,108 @@ namespace Decentralized
|
||||
l.AddHeader(L.T("poin.account.h"));
|
||||
Holdings(l, w, a => true);
|
||||
if (w.Taint > 0.5) l.AddLabel(L.T("wallet.taint", Fmt.Credits(w.Taint)), "taint_note");
|
||||
l.AddSeparator();
|
||||
l.BeginRow(8f, TextAnchor.MiddleLeft);
|
||||
l.AddLabel(L.T("poin.deposit", d.Address("poinbase")), "deposit_dim");
|
||||
l.AddButton(L.T("hw.copy"), () => { Clipboard.Copy(d.Address("poinbase")); _message = L.T("hw.copied.addr", d.Address("poinbase")); Open(); });
|
||||
l.End();
|
||||
}, r =>
|
||||
{
|
||||
r.AddHeader(L.T("trade.h"));
|
||||
AmountRow(r);
|
||||
TradeRows(r, venue);
|
||||
r.AddSeparator();
|
||||
r.BeginRow(4f);
|
||||
foreach (var a in new[] { Assets.CRC, Assets.PSC })
|
||||
{
|
||||
var asset = a;
|
||||
PledgerSkin.Pick(r, asset, asset == _poinAsset, () => { _poinAsset = asset; Open(); }, _picked);
|
||||
}
|
||||
r.End();
|
||||
r.AddButton(L.T("poin.out", WalletWindow.NameOf(d.Hot)), PoinbaseOut);
|
||||
});
|
||||
}
|
||||
|
||||
private static string _poinAsset = Assets.CRC;
|
||||
private enum FundsMode { Receive, Send }
|
||||
private static FundsMode _fundsMode = FundsMode.Receive;
|
||||
private static string _fundsAsset = Assets.CRC, _fundsTo = "";
|
||||
private static bool _fundsBank = true;
|
||||
|
||||
/// <summary>资金页:入金和出金,先选币种。CRC 可以走银行账户或钱包,其他币只能走钱包。</summary>
|
||||
private static void FundsPage(CustomUIBuilder b)
|
||||
{
|
||||
var d = Session.Data;
|
||||
var w = d.Poinbase;
|
||||
if (_fundsAsset != Assets.CRC) _fundsBank = false;
|
||||
Columns(b, l =>
|
||||
{
|
||||
l.AddHeader(L.T("poin.account.h"));
|
||||
Holdings(l, w, a => true);
|
||||
if (w.Taint > 0.5) l.AddLabel(L.T("wallet.taint", Fmt.Credits(w.Taint)), "taint_note");
|
||||
}, r =>
|
||||
{
|
||||
r.BeginRow(4f);
|
||||
foreach (FundsMode m in Enum.GetValues(typeof(FundsMode)))
|
||||
{
|
||||
var mode = m;
|
||||
PledgerSkin.Pick(r, L.T("funds." + m.ToString().ToLowerInvariant()), mode == _fundsMode, () => { _fundsMode = mode; _message = null; Open(); }, _picked);
|
||||
}
|
||||
r.End();
|
||||
r.BeginRow(4f);
|
||||
foreach (var c in SwapCoins)
|
||||
{
|
||||
var coin = c;
|
||||
PledgerSkin.Pick(r, coin, coin == _fundsAsset, () => { _fundsAsset = coin; if (coin != Assets.CRC) _fundsBank = false; Open(); }, _picked);
|
||||
}
|
||||
r.End();
|
||||
if (_fundsAsset == Assets.CRC)
|
||||
{
|
||||
r.BeginRow(4f);
|
||||
PledgerSkin.Pick(r, L.T("funds.bank"), _fundsBank, () => { _fundsBank = true; Open(); }, _picked);
|
||||
PledgerSkin.Pick(r, L.T("funds.wallet"), !_fundsBank, () => { _fundsBank = false; Open(); }, _picked);
|
||||
r.End();
|
||||
}
|
||||
r.AddSeparator();
|
||||
if (_fundsMode == FundsMode.Receive)
|
||||
{
|
||||
if (_fundsBank)
|
||||
{
|
||||
AmountRow(r);
|
||||
r.AddButton(L.T("trade.deposit"), Deposit);
|
||||
}
|
||||
else
|
||||
{
|
||||
r.AddLabel(L.T("poin.deposit", d.Address("poinbase")), "deposit_dim");
|
||||
r.AddButton(L.T("hw.copy"), () => { Clipboard.Copy(d.Address("poinbase")); _message = L.T("hw.copied.addr", d.Address("poinbase")); Open(); });
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (_fundsBank)
|
||||
{
|
||||
AmountRow(r);
|
||||
AmlPreview(r);
|
||||
r.AddButton(L.T("trade.withdraw"), Withdraw);
|
||||
return;
|
||||
}
|
||||
r.AddLabel(L.T("funds.to"));
|
||||
r.BeginPanel(RightW - 30f, -1f, TextAnchor.MiddleCenter, 0f, 0f);
|
||||
_clear.Add(r.Last.image);
|
||||
r.AddInput("0x", _fundsTo, s => _fundsTo = s, "funds_to", s => _fundsTo = s);
|
||||
r.End();
|
||||
if (d.Wallets.Count > 0)
|
||||
{
|
||||
r.BeginRow(4f);
|
||||
foreach (var ow in d.Wallets)
|
||||
{
|
||||
var own = ow;
|
||||
PledgerSkin.Pick(r, WalletWindow.NameOf(own), ChainAddress.Same(_fundsTo, own.Address), () => { _fundsTo = own.Address; Open(); }, _picked);
|
||||
}
|
||||
r.End();
|
||||
}
|
||||
AmountRow(r);
|
||||
r.AddButton(L.T("funds.go"), FundsSend);
|
||||
foreach (var t in Funds.Active)
|
||||
{
|
||||
r.AddLabel(L.T("funds.sending", Fmt.Num(t.Amount), t.Asset, ChainAddress.Short(t.To)), "funds_sending_dim");
|
||||
r.AddLabel(Funds.StatusText(t), "funds_status_" + t.Id);
|
||||
r.AddProgressBar(Funds.Progress(t), "funds_prog_" + t.Id);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void FundsSend()
|
||||
{
|
||||
if (!ReadAmount(out double v)) return;
|
||||
string err = Funds.Start(_fundsAsset, v, _fundsTo);
|
||||
_message = err != null ? L.T(err) : null;
|
||||
Open();
|
||||
}
|
||||
|
||||
private static string _perpProduct = "PSC";
|
||||
private static bool _perpLong = true;
|
||||
@@ -1079,18 +1145,6 @@ namespace Decentralized
|
||||
}
|
||||
|
||||
/// <summary>Poinbase 提到当前钱包:托管账户直接转,不用签名。污点按比例随币走。</summary>
|
||||
private static void PoinbaseOut()
|
||||
{
|
||||
if (!ReadAmount(out double v)) return;
|
||||
var d = Session.Data;
|
||||
if (d.Poinbase.Avail(_poinAsset) + 1e-9 < v) { _message = L.T("msg.balance"); Open(); return; }
|
||||
Wallet.Transfer(d.Poinbase, d.Hot, _poinAsset, v, Session.Price);
|
||||
_message = L.T("poin.out.done", Fmt.Num(v), _poinAsset, WalletWindow.NameOf(d.Hot));
|
||||
Session.Save();
|
||||
WalletWindow.RefreshDevice(d.Hot);
|
||||
Open();
|
||||
}
|
||||
|
||||
/// <summary>钱包页:全部硬件钱包,连接(设为当前)、打开实体钱包。</summary>
|
||||
private static void WalletsPage(CustomUIBuilder b)
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user