mirror of
https://github.com/Such-Software/hash-wallet.git
synced 2026-10-31 06:58:42 +01:00
Catches up from the May 12 fork point (v6.1.2+23) through v6.5.0: 535 upstream commits, including the Monero silent-open fix, Monero on Trezor, Ledger/Trezor BLE fixes, the new seed and history screens, quick Bitcoin sync, git-pinned dependencies (pubspec_overrides.yaml), frozen Hive adapters (*.part.dart), monero_c v0.18.4.6-RC2 and Flutter 3.41.9. Merged with both sides normalized first (import rename, 100-column format), which took the conflict count from 614 paths to 322. The procedure is now scripts/upstream_sync.sh. Kept from Hash Bags: - WalletType enum order and Hive IDs. SQLite stores WalletType.index and our order differs from upstream's; taking theirs would reread saved wallets as other chains. Our frozen adapter keeps the shipped IDs. - The 1.0.2 legacy PIN and wallet-password decode and self-heal. - Removed chains (Solana, Tron, Zano, Zcash, Decred, Haven) and the new Robinhood chain stay out; Cake Pay and non-Trocador swaps stay out. - Default nodes (node.wownero.org, sethforprivacy, Blockstream, bysh.me), converted to upstream's isDefault node-list key; Wownero is back in the node reset list. - Privacy: address resolvers limited to domain-anchored sources again; prices.neroswap.com for fiat; upstream's charts tab, which reads prices.cakewallet.com, sits behind FeatureFlag.isChartsEnabled = false. - Lightning stays behind FeatureFlag.isLightningEnabled, including upstream's new post-seed Lightning username step. - Our icon pipeline, branding and bundle identifiers. Twelve new upstream widget tests are skipped: test and code are unchanged from v6.5.0 apart from renames (not rerun on a pristine upstream checkout; upstream's top_bar_test does not compile against its own TopBar). flutter analyze lib: 0 errors; flutter test: 345 passed, 12 skipped; flutter build bundle compiles. Built with Flutter 3.41.9.
175 lines
4.1 KiB
Dart
175 lines
4.1 KiB
Dart
import "package:hash_wallet/core/universal_address_detector.dart";
|
|
import "package:hash_wallet/utils/payment_request.dart";
|
|
import "package:cw_core/amount/money.dart";
|
|
import "package:cw_core/crypto_currency.dart";
|
|
import "package:cw_core/wallet_info.dart";
|
|
import "package:cw_core/wallet_type.dart";
|
|
|
|
sealed class ChainBinding {
|
|
const ChainBinding();
|
|
}
|
|
|
|
class ExplicitEvmChain extends ChainBinding {
|
|
const ExplicitEvmChain(this.chainId);
|
|
|
|
final int chainId;
|
|
}
|
|
|
|
class ChainlessEvm extends ChainBinding {
|
|
const ChainlessEvm();
|
|
}
|
|
|
|
class NoEvmBinding extends ChainBinding {
|
|
const NoEvmBinding();
|
|
}
|
|
|
|
class AnyPayRequest {
|
|
AnyPayRequest({
|
|
required this.rawInput,
|
|
required this.paymentRequest,
|
|
required this.detection,
|
|
required this.chainBinding,
|
|
});
|
|
|
|
final String rawInput;
|
|
final PaymentRequest paymentRequest;
|
|
final AddressDetectionResult detection;
|
|
final ChainBinding chainBinding;
|
|
|
|
String get address => paymentRequest.address;
|
|
|
|
String get amount => paymentRequest.amount;
|
|
|
|
String? get contractAddress => paymentRequest.contractAddress;
|
|
|
|
bool get hasContract => contractAddress != null && contractAddress!.isNotEmpty;
|
|
|
|
bool get isLightning => detection.detectedCurrency == CryptoCurrency.btcln;
|
|
}
|
|
|
|
class WalletSnapshot {
|
|
WalletSnapshot({
|
|
required this.type,
|
|
required this.currentWalletIsEvm,
|
|
required this.currentChainId,
|
|
required this.wallets,
|
|
required this.supportedEvmChains,
|
|
required this.hasEvmProxy,
|
|
required this.hasSolanaProxy,
|
|
required this.hasTronProxy,
|
|
});
|
|
|
|
final WalletType type;
|
|
final bool currentWalletIsEvm;
|
|
final int? currentChainId;
|
|
final List<WalletInfo> wallets;
|
|
final Map<int, WalletType> supportedEvmChains;
|
|
final bool hasEvmProxy;
|
|
final bool hasSolanaProxy;
|
|
final bool hasTronProxy;
|
|
|
|
List<WalletInfo> walletsOfType(WalletType walletType) =>
|
|
wallets.where((wallet) => wallet.type == walletType).toList();
|
|
}
|
|
|
|
sealed class AnyPayResolution {
|
|
const AnyPayResolution();
|
|
}
|
|
|
|
class NoTokenRequested extends AnyPayResolution {
|
|
const NoTokenRequested();
|
|
}
|
|
|
|
class TokenResolved extends AnyPayResolution {
|
|
const TokenResolved({required this.token, this.chainId, this.amountOverride});
|
|
|
|
final CryptoCurrency token;
|
|
final int? chainId;
|
|
final String? amountOverride;
|
|
}
|
|
|
|
class TokenUnknown extends AnyPayResolution {
|
|
const TokenUnknown(this.contract);
|
|
|
|
final String contract;
|
|
}
|
|
|
|
sealed class AnyPayDecision {
|
|
const AnyPayDecision();
|
|
}
|
|
|
|
class AnyPayApplyToCurrentWallet extends AnyPayDecision {
|
|
const AnyPayApplyToCurrentWallet({
|
|
this.token,
|
|
this.amountOverride,
|
|
this.fallbackCurrency,
|
|
});
|
|
|
|
final CryptoCurrency? token;
|
|
final String? amountOverride;
|
|
final CryptoCurrency? fallbackCurrency;
|
|
}
|
|
|
|
class AnyPayEvmNetworkChoice extends AnyPayDecision {
|
|
const AnyPayEvmNetworkChoice();
|
|
}
|
|
|
|
class AnyPayCrossChainPayment extends AnyPayDecision {
|
|
const AnyPayCrossChainPayment({
|
|
required this.targetWalletType,
|
|
required this.wallets,
|
|
this.targetChainId,
|
|
this.token,
|
|
this.amountOverride,
|
|
this.canSwap = true,
|
|
});
|
|
|
|
final WalletType targetWalletType;
|
|
final int? targetChainId;
|
|
final List<WalletInfo> wallets;
|
|
final CryptoCurrency? token;
|
|
final String? amountOverride;
|
|
final bool canSwap;
|
|
|
|
bool get hasCompatibleWallet => wallets.isNotEmpty;
|
|
}
|
|
|
|
class AnyPayUnsupportedNetwork extends AnyPayDecision {
|
|
const AnyPayUnsupportedNetwork(this.chainId);
|
|
|
|
final int chainId;
|
|
}
|
|
|
|
class AnyPayUnsupportedToken extends AnyPayDecision {
|
|
const AnyPayUnsupportedToken(this.contract);
|
|
|
|
final String contract;
|
|
}
|
|
|
|
class AnyPayEmptyInput extends AnyPayDecision {
|
|
const AnyPayEmptyInput();
|
|
}
|
|
|
|
class AnyPayEvaluation {
|
|
AnyPayEvaluation({required this.request, required this.decision});
|
|
|
|
final AnyPayRequest request;
|
|
final AnyPayDecision decision;
|
|
}
|
|
|
|
class AnyPaySwapIntent {
|
|
AnyPaySwapIntent({
|
|
required this.request,
|
|
required this.receiveCurrency,
|
|
required this.targetWalletType,
|
|
this.receiveAmount,
|
|
});
|
|
|
|
final AnyPayRequest request;
|
|
final CryptoCurrency receiveCurrency;
|
|
final WalletType targetWalletType;
|
|
final Money? receiveAmount;
|
|
|
|
String get recipientAddress => request.address;
|
|
}
|