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:
1 parent
5b7013f240
commit
add61a6b5e
16 files changed
+768
-63
No files matched your search
@@ -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),
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user