Hardware wallet window: invoices paid from PLEDGER, checksummed addresses, DEX signing, block confirmation animation

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ZHU MINCHAOandClaude Opus 5.5 committed 2026-11-03 22:29:42 +08:00
1 parent 5b7013f240
commit add61a6b5e
16 files changed
+768 -63

No files matched your search

+1 -1
View File
@@ -198,7 +198,7 @@ namespace Decentralized.Domain
double hi = t == MerchantType.Elite ? Tuning.BmFactorEliteMax : t == MerchantType.GpuNew ? Tuning.BmFactorNewMax : t == MerchantType.GpuUsed ? Tuning.BmFactorUsedMax : t == MerchantType.Bulk ? Tuning.BmFactorBulkMax : Tuning.BmFactorMax;
var s = new BmSeller
{
Name = "0x" + rng.NextUInt().ToString("x8").Substring(0, 6),
Name = ChainAddress.Make(rng.NextUInt()),
Scam = scam, Type = t, Factor = personal ? 1.0 : F(rng, lo, hi),
Trades = fresh ? rng.Range(0, Tuning.BmFreshTradesMax) : rng.Range(Tuning.BmOldTradesMin, Tuning.BmOldTradesMax),
Rating = scam && !fresh ? rng.Range(Tuning.BmScamOldRatingMin, Tuning.BmScamOldRatingMax) : fresh ? rng.Range(Tuning.BmFreshRatingMin, Tuning.BmFreshRatingMax) : rng.Range(Tuning.BmOldRatingMin, Tuning.BmOldRatingMax),
+45
View File
@@ -0,0 +1,45 @@
namespace Decentralized.Domain
{
/// <summary>
/// 链上地址:"0x" + 6 位随机十六进制 + 2 位校验位。手输地址时输错一位,校验位几乎总能发现(约 1/256 恰好也合法,币就转进了没人用的地址)。
/// </summary>
public static class ChainAddress
{
public const int BodyLength = 6, CheckLength = 2, Length = 2 + BodyLength + CheckLength;
public static string Make(uint r)
{
string body = (r & 0xFFFFFF).ToString("x6");
return "0x" + body + Check(body);
}
/// <summary>校验位:地址主体的 FNV-1a 散列取高 8 位(低位对单字符改动是一一对应的,永远不会碰巧合法)。</summary>
public static string Check(string body)
{
uint h = 2166136261;
foreach (char c in body) { h ^= c; h *= 16777619; }
return (h >> 24).ToString("x2");
}
public static string Normalize(string s) => (s ?? "").Trim().ToLowerInvariant();
/// <summary>格式对(0x 开头、十六进制、长度对)。</summary>
public static bool WellFormed(string s)
{
s = Normalize(s);
if (s.Length != Length || !s.StartsWith("0x")) return false;
for (int i = 2; i < s.Length; i++)
if (!(s[i] >= '0' && s[i] <= '9' || s[i] >= 'a' && s[i] <= 'f')) return false;
return true;
}
/// <summary>格式对且校验位对得上。</summary>
public static bool Valid(string s)
{
s = Normalize(s);
return WellFormed(s) && Check(s.Substring(2, BodyLength)) == s.Substring(2 + BodyLength);
}
public static bool Same(string a, string b) => Normalize(a) == Normalize(b);
}
}