mirror of
https://github.com/Such-Software/hash-wallet.git
synced 2026-10-26 06:08:40 +01:00
* fix android CI * feat: add anypay core models, parser and routing engine * feat: add anypay resolver, anypay service and wallet switch service * refactor: route the send page payment flow through anypay service * fix: show message when there's no swap providers for a pair and reset the trade guard on dismissal * refactor: merge the swap from network and send to network decision pages together and clean up anypay widgets * feat: reapply deep links to a currently open send flow and register the solana scheme * feat: add support for zcash address detection to anypay and other minor fixes * refactor: remove trailing icon * feat: hide swap flow for sp and mweb addresses * feat: enhance zcash address detection and deeplink handling * fix: pin bitcoin_base * refactor: Move the anypay decision navigation out of the send page and address minor review comments * refactor: Move the anypay decision navigation out of the send page and address minor review comments * feat: handle exception in switch service and mvoe balance compute to call site * refactor: combine anypay entry points to one and extract selected mode widget --------- Co-authored-by: Czarek Nakamoto <cyjan@mrcyjanek.net>
72 lines
2.1 KiB
Dart
72 lines
2.1 KiB
Dart
import "package:cake_wallet/core/anypay/anypay_models.dart";
|
|
import "package:cake_wallet/core/universal_address_detector.dart";
|
|
import "package:cake_wallet/utils/payment_request.dart";
|
|
import "package:cw_core/crypto_currency.dart";
|
|
import "package:cw_core/currency_for_wallet_type.dart";
|
|
import "package:cw_core/payment_uris.dart";
|
|
|
|
class AnyPayParser {
|
|
static AnyPayRequest fromRaw(String input) {
|
|
final paymentRequest = PaymentRequest.fromString(input);
|
|
|
|
return AnyPayRequest(
|
|
rawInput: input,
|
|
paymentRequest: paymentRequest,
|
|
detection: UniversalAddressDetector.detectAddress(input),
|
|
chainBinding: _bindingFor(paymentRequest),
|
|
);
|
|
}
|
|
|
|
static AnyPayRequest fromPaymentRequest(PaymentRequest request) {
|
|
final raw = _reconstructRawInput(request);
|
|
|
|
return AnyPayRequest(
|
|
rawInput: raw,
|
|
paymentRequest: request,
|
|
detection: UniversalAddressDetector.detectAddress(raw),
|
|
chainBinding: _bindingFor(request),
|
|
);
|
|
}
|
|
|
|
static String _reconstructRawInput(PaymentRequest request) {
|
|
final scheme = request.scheme.toLowerCase();
|
|
|
|
if (scheme.isEmpty || scheme == "lightning") {
|
|
return request.address;
|
|
}
|
|
|
|
if (scheme == "ethereum") {
|
|
return ERC681URI(
|
|
address: request.address,
|
|
amount: request.amount,
|
|
contractAddress: request.contractAddress,
|
|
chainId: request.chainId ?? 1,
|
|
rawTokenAmount: request.rawTokenAmount,
|
|
).toString();
|
|
}
|
|
|
|
final amount = request.amount.isNotEmpty ? "?amount=${request.amount}" : "";
|
|
return "${request.scheme}:${request.address}$amount";
|
|
}
|
|
|
|
static ChainBinding _bindingFor(PaymentRequest request) {
|
|
final scheme = request.scheme.toLowerCase();
|
|
|
|
if (scheme == "ethereum") {
|
|
final chainId = request.chainId;
|
|
return chainId != null ? ExplicitEvmChain(chainId) : const ChainlessEvm();
|
|
}
|
|
|
|
if (scheme.isNotEmpty) {
|
|
try {
|
|
final chainId = getChainIdByCryptoCurrency(CryptoCurrency.fromString(scheme));
|
|
if (chainId != null) {
|
|
return ExplicitEvmChain(chainId);
|
|
}
|
|
} catch (_) {}
|
|
}
|
|
|
|
return const NoEvmBinding();
|
|
}
|
|
}
|