From ec34b0fe93a3a9b1d5c85ca887868f4cdd6dbe1b Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Wed, 29 Oct 2025 08:47:21 +0100 Subject: [PATCH 001/105] feat: add Lightning Network support for Bitcoin wallets --- .../lib/bitcoin_receive_page_option.dart | 7 + cw_bitcoin/lib/bitcoin_wallet.dart | 98 ++++++++------ cw_bitcoin/lib/bitcoin_wallet_addresses.dart | 1 + cw_bitcoin/lib/electrum_wallet_addresses.dart | 30 ++++- .../lib/lightning/lightning_addres_type.dart | 22 ++++ .../lib/lightning/lightning_wallet.dart | 124 ++++++++++++++++++ .../pending_lightning_transaction.dart | 44 +++++++ cw_bitcoin/pubspec.lock | 9 ++ cw_bitcoin/pubspec.yaml | 3 + .../dashboard/balance_view_model.dart | 56 ++++---- 10 files changed, 324 insertions(+), 70 deletions(-) create mode 100644 cw_bitcoin/lib/lightning/lightning_addres_type.dart create mode 100644 cw_bitcoin/lib/lightning/lightning_wallet.dart create mode 100644 cw_bitcoin/lib/lightning/pending_lightning_transaction.dart diff --git a/cw_bitcoin/lib/bitcoin_receive_page_option.dart b/cw_bitcoin/lib/bitcoin_receive_page_option.dart index 8491ae8e3f..5e07ac63b8 100644 --- a/cw_bitcoin/lib/bitcoin_receive_page_option.dart +++ b/cw_bitcoin/lib/bitcoin_receive_page_option.dart @@ -1,4 +1,5 @@ import 'package:bitcoin_base/bitcoin_base.dart'; +import 'package:cw_bitcoin/lightning/lightning_addres_type.dart'; import 'package:cw_core/receive_page_option.dart'; class BitcoinReceivePageOption implements ReceivePageOption { @@ -10,6 +11,7 @@ class BitcoinReceivePageOption implements ReceivePageOption { static const mweb = BitcoinReceivePageOption._('MWEB'); static const silent_payments = BitcoinReceivePageOption._('Silent Payments'); + static const lightning = BitcoinReceivePageOption._('Lightning'); const BitcoinReceivePageOption._(this.value); @@ -20,6 +22,7 @@ class BitcoinReceivePageOption implements ReceivePageOption { } static const all = [ + BitcoinReceivePageOption.lightning, BitcoinReceivePageOption.silent_payments, BitcoinReceivePageOption.p2wpkh, BitcoinReceivePageOption.p2tr, @@ -55,6 +58,8 @@ class BitcoinReceivePageOption implements ReceivePageOption { return P2shAddressType.p2wpkhInP2sh; case BitcoinReceivePageOption.silent_payments: return SilentPaymentsAddresType.p2sp; + case BitcoinReceivePageOption.lightning: + return LightningAddressType.p2l; case BitcoinReceivePageOption.mweb: return SegwitAddresType.mweb; case BitcoinReceivePageOption.p2wpkh: @@ -77,6 +82,8 @@ class BitcoinReceivePageOption implements ReceivePageOption { return BitcoinReceivePageOption.p2sh; case SilentPaymentsAddresType.p2sp: return BitcoinReceivePageOption.silent_payments; + case LightningAddressType.p2l: + return BitcoinReceivePageOption.lightning; case SegwitAddresType.p2wpkh: default: return BitcoinReceivePageOption.p2wpkh; diff --git a/cw_bitcoin/lib/bitcoin_wallet.dart b/cw_bitcoin/lib/bitcoin_wallet.dart index 0a2b54913a..6b3cc56f64 100644 --- a/cw_bitcoin/lib/bitcoin_wallet.dart +++ b/cw_bitcoin/lib/bitcoin_wallet.dart @@ -13,6 +13,7 @@ import 'package:cw_bitcoin/electrum_derivations.dart'; import 'package:cw_bitcoin/electrum_wallet.dart'; import 'package:cw_bitcoin/electrum_wallet_snapshot.dart'; import 'package:cw_bitcoin/hardware/bitcoin_hardware_wallet_service.dart'; +import 'package:cw_bitcoin/lightning/lightning_wallet.dart'; import 'package:cw_bitcoin/payjoin/manager.dart'; import 'package:cw_bitcoin/payjoin/storage.dart'; import 'package:cw_bitcoin/pending_bitcoin_transaction.dart'; @@ -23,6 +24,7 @@ import 'package:cw_bitcoin/psbt/v0_finalizer.dart'; import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/encryption_file_utils.dart'; import 'package:cw_core/output_info.dart'; +import 'package:cw_core/parse_fixed.dart'; import 'package:cw_core/payjoin_session.dart'; import 'package:cw_core/pending_transaction.dart'; import 'package:cw_core/unspent_coins_info.dart'; @@ -31,9 +33,7 @@ import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_keys_file.dart'; import 'package:flutter/foundation.dart'; import 'package:hive/hive.dart'; -import 'package:ledger_bitcoin/ledger_bitcoin.dart'; import 'package:ledger_bitcoin/psbt.dart'; -import 'package:ledger_flutter_plus/ledger_flutter_plus.dart'; import 'package:mobx/mobx.dart'; import 'package:ur/cbor_lite.dart'; import 'package:ur/ur.dart'; @@ -92,24 +92,38 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { // String sideDerivationPath = derivationPath.substring(0, derivationPath.length - 1) + "1"; // final hd = bitcoin.HDWallet.fromSeed(seedBytes, network: networkType); + if (mnemonic != null) { + lightningWallet = LightningWallet( + mnemonic: mnemonic, + apiKey: + "MIIBdzCCASmgAwIBAgIHPpJHKP1qXzAFBgMrZXAwEDEOMAwGA1UEAxMFQnJlZXowHhcNMjUxMDIzMTQwNDQ4WhcNMzUxMDIxMTQwNDQ4WjAxMRQwEgYDVQQKEwtDYWtlIFdhbGxldDEZMBcGA1UEAxMQU2V0aCBGb3IgUHJpdmFjeTAqMAUGAytlcAMhANCD9cvfIDwcoiDKKYdT9BunHLS2/OuKzV8NS0SzqV13o4GAMH4wDgYDVR0PAQH/BAQDAgWgMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFNo5o+5ea0sNMlW/75VgGJCv2AcJMB8GA1UdIwQYMBaAFN6q1pJW843ndJIW/Ey2ILJrKJhrMB4GA1UdEQQXMBWBE3NldGhAY2FrZXdhbGxldC5jb20wBQYDK2VwA0EAl+naPfCBseV7eS4SoP0q0kvo2GHCywXoIbnlBa0y+/wlfu+oILtsGv3jGQ2egCnpgHe87yzR0ygclzz8r/jdAQ==", + lnurlDomain: "breez.tips", + ); + } + payjoinManager = PayjoinManager(PayjoinStorage(payjoinBox), this); - walletAddresses = BitcoinWalletAddresses(walletInfo, - initialAddresses: initialAddresses, - initialRegularAddressIndex: initialRegularAddressIndex, - initialChangeAddressIndex: initialChangeAddressIndex, - initialSilentAddresses: initialSilentAddresses, - initialSilentAddressIndex: initialSilentAddressIndex, - mainHd: hd, - sideHd: accountHD.childKey(Bip32KeyIndex(1)), - network: networkParam ?? network, - masterHd: - seedBytes != null ? Bip32Slip10Secp256k1.fromSeed(seedBytes) : null, - isHardwareWallet: walletInfo.isHardwareWallet, - payjoinManager: payjoinManager); + walletAddresses = BitcoinWalletAddresses( + walletInfo, + initialAddresses: initialAddresses, + initialRegularAddressIndex: initialRegularAddressIndex, + initialChangeAddressIndex: initialChangeAddressIndex, + initialSilentAddresses: initialSilentAddresses, + initialSilentAddressIndex: initialSilentAddressIndex, + mainHd: hd, + sideHd: accountHD.childKey(Bip32KeyIndex(1)), + network: networkParam ?? network, + masterHd: seedBytes != null ? Bip32Slip10Secp256k1.fromSeed(seedBytes) : null, + isHardwareWallet: walletInfo.isHardwareWallet, + payjoinManager: payjoinManager, + lightningWallet: lightningWallet, + ); + + if (lightningWallet != null) { + walletAddresses.setLightningAddress(walletInfo.name); + } autorun((_) { - this.walletAddresses.isEnabledAutoGenerateSubaddress = - this.isEnabledAutoGenerateSubaddress; + this.walletAddresses.isEnabledAutoGenerateSubaddress = this.isEnabledAutoGenerateSubaddress; }); } @@ -146,8 +160,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { break; case DerivationType.electrum: default: - seedBytes = - await mnemonicToSeedBytes(mnemonic, passphrase: passphrase ?? ""); + seedBytes = await mnemonicToSeedBytes(mnemonic, passphrase: passphrase ?? ""); break; } @@ -233,8 +246,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { if (mnemonic != null) { switch (derivationInfo.derivationType) { case DerivationType.electrum: - seedBytes = - await mnemonicToSeedBytes(mnemonic, passphrase: passphrase ?? ""); + seedBytes = await mnemonicToSeedBytes(mnemonic, passphrase: passphrase ?? ""); break; case DerivationType.bip39: default: @@ -274,11 +286,24 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { super.close(shouldCleanup: shouldCleanup); } + @override + Future fetchBalances() async { + final balance = await super.fetchBalances(); + if (lightningWallet == null) { + return balance; + } + + final lBalance = await lightningWallet!.getBalance(); + + return ElectrumBalance(confirmed: balance.confirmed, unconfirmed: balance.unconfirmed, frozen: balance.frozen, secondConfirmed: lBalance.toInt()); + } + + late final LightningWallet? lightningWallet; + late final PayjoinManager payjoinManager; bool get isPayjoinAvailable => unspentCoinsInfo.values - .where((element) => - element.walletId == id && element.isSending && !element.isFrozen) + .where((element) => element.walletId == id && element.isSending && !element.isFrozen) .isNotEmpty; Future buildPsbt({ @@ -296,10 +321,8 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { }) async { final psbtReadyInputs = []; for (final utxo in utxos) { - final rawTx = - await electrumClient.getTransactionHex(hash: utxo.utxo.txHash); - final publicKeyAndDerivationPath = - publicKeys[utxo.ownerDetails.address.pubKeyHash()]!; + final rawTx = await electrumClient.getTransactionHex(hash: utxo.utxo.txHash); + final publicKeyAndDerivationPath = publicKeys[utxo.ownerDetails.address.pubKeyHash()]!; psbtReadyInputs.add(PSBTReadyUtxoWithAddress( utxo: utxo.utxo, @@ -355,8 +378,12 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { Future createTransaction(Object credentials) async { credentials = credentials as BitcoinTransactionCredentials; - final tx = (await super.createTransaction(credentials)) - as PendingBitcoinTransaction; + if (lightningWallet?.isCompatible(credentials.outputs.first.address) == true) { + return lightningWallet!.createTransaction(credentials.outputs.first.address, + parseFixed(credentials.outputs.first.cryptoAmount ?? "0", 9)); + } + + final tx = (await super.createTransaction(credentials)) as PendingBitcoinTransaction; final payjoinUri = credentials.payjoinUri; if (payjoinUri == null && !tx.shouldCommitUR()) return tx; @@ -381,8 +408,8 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { masterFingerprint: Uint8List.fromList([0, 0, 0, 0])); if (tx.shouldCommitUR()) { - tx.unsignedPsbt = transaction.asPsbtV0(); - return tx; + tx.unsignedPsbt = transaction.asPsbtV0(); + return tx; } final originalPsbt = @@ -406,8 +433,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { Future commitPsbt(String finalizedPsbt) { final psbt = PsbtV2()..deserializeV0(base64.decode(finalizedPsbt)); - final btcTx = - BtcTransaction.fromRaw(BytesUtils.toHexString(psbt.extract())); + final btcTx = BtcTransaction.fromRaw(BytesUtils.toHexString(psbt.extract())); return PendingBitcoinTransaction( btcTx, @@ -422,8 +448,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { ).commit(); } - Future signPsbt( - String preProcessedPsbt, List utxos) async { + Future signPsbt(String preProcessedPsbt, List utxos) async { final psbt = PsbtV2()..deserializeV0(base64Decode(preProcessedPsbt)); await psbt.signWithUTXO(utxos, (txDigest, utxo, key, sighash) { @@ -486,8 +511,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { Future signMessage(String message, {String? address = null}) async { if (walletInfo.isHardwareWallet) { final addressEntry = address != null - ? walletAddresses.allAddresses - .firstWhere((element) => element.address == address) + ? walletAddresses.allAddresses.firstWhere((element) => element.address == address) : null; final index = addressEntry?.index ?? 0; final isChange = addressEntry?.isHidden == true ? 1 : 0; diff --git a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart index fcd0b7d8cc..8e36ffebf8 100644 --- a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart +++ b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart @@ -27,6 +27,7 @@ abstract class BitcoinWalletAddressesBase extends ElectrumWalletAddresses with S super.initialSilentAddresses, super.initialSilentAddressIndex = 0, super.masterHd, + super.lightningWallet, }) : super(walletInfo); final PayjoinManager payjoinManager; diff --git a/cw_bitcoin/lib/electrum_wallet_addresses.dart b/cw_bitcoin/lib/electrum_wallet_addresses.dart index 18d2898b4d..eddcadb563 100644 --- a/cw_bitcoin/lib/electrum_wallet_addresses.dart +++ b/cw_bitcoin/lib/electrum_wallet_addresses.dart @@ -3,9 +3,12 @@ import 'dart:io' show Platform; import 'package:bitcoin_base/bitcoin_base.dart'; import 'package:blockchain_utils/blockchain_utils.dart'; import 'package:cw_bitcoin/bitcoin_address_record.dart'; +import 'package:cw_bitcoin/bitcoin_unspent.dart'; +import 'package:cw_bitcoin/lightning/lightning_addres_type.dart'; +import 'package:cw_bitcoin/lightning/lightning_wallet.dart'; +import 'package:cw_core/pathForWallet.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/utils/print_verbose.dart'; -import 'package:cw_bitcoin/bitcoin_unspent.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_type.dart'; @@ -51,6 +54,7 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { List? initialMwebAddresses, Bip32Slip10Secp256k1? masterHd, BitcoinAddressType? initialAddressPageType, + this.lightningWallet, }) : _addresses = ObservableList.of((initialAddresses ?? []).toSet()), addressesByReceiveType = ObservableList.of(([]).toSet()), @@ -64,7 +68,9 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { currentChangeAddressIndexByType = initialChangeAddressIndex ?? {}, _addressPageType = initialAddressPageType ?? (walletInfo.addressPageType != null - ? BitcoinAddressType.fromValue(walletInfo.addressPageType!) + ? walletInfo.addressPageType == LightningAddressType.p2l.value + ? LightningAddressType.p2l + : BitcoinAddressType.fromValue(walletInfo.addressPageType!) : SegwitAddresType.p2wpkh), silentAddresses = ObservableList.of( (initialSilentAddresses ?? []).toSet()), @@ -103,7 +109,6 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { )); } } - updateAddressesByMatch(); } @@ -123,6 +128,7 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { final Bip32Slip10Secp256k1 mainHd; final Bip32Slip10Secp256k1 sideHd; final bool isHardwareWallet; + final LightningWallet? lightningWallet; @observable ObservableMap lockedReceiveAddressByType; @@ -139,6 +145,9 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { @observable String? activeSilentAddress; + @observable + String? lightningAddress; + @computed List get allAddresses => _addresses; @@ -153,6 +162,10 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { return silentAddress.toString(); } + if (addressPageType == LightningAddressType.p2l) { + return lightningAddress ?? ":("; + } + final typeMatchingAddresses = _addresses.where((addr) => !addr.isHidden && _isAddressPageTypeMatch(addr)).toList(); final typeMatchingReceiveAddresses = @@ -220,7 +233,6 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { addressRecord.type == addressPageType) { lockedReceiveAddressByType[addressPageType] = addr; } - } catch (e) { printV("ElectrumWalletAddressBase: set address ($addr): $e"); } @@ -736,4 +748,14 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { silentAddresses.remove(addressRecord); updateAddressesByMatch(); } + + @action + Future setLightningAddress(String walletName) async { + if (lightningWallet == null) return; + + final path = await pathForWalletDir(name: walletName, type: WalletType.bitcoin); + await lightningWallet!.init(path); + lightningAddress = await lightningWallet!.registerAddress(walletName.replaceAll(" ", "")); + + } } diff --git a/cw_bitcoin/lib/lightning/lightning_addres_type.dart b/cw_bitcoin/lib/lightning/lightning_addres_type.dart new file mode 100644 index 0000000000..275867b34f --- /dev/null +++ b/cw_bitcoin/lib/lightning/lightning_addres_type.dart @@ -0,0 +1,22 @@ +import 'package:bitcoin_base/src/bitcoin/address/address.dart'; + +class LightningAddressType implements BitcoinAddressType { + const LightningAddressType._(this.value); + static const LightningAddressType p2l = LightningAddressType._("Lightning"); + + @override + bool get isP2sh => false; + @override + bool get isSegwit => false; + + @override + final String value; + + @override + int get hashLength { + return 32; + } + + @override + String toString() => value; +} diff --git a/cw_bitcoin/lib/lightning/lightning_wallet.dart b/cw_bitcoin/lib/lightning/lightning_wallet.dart new file mode 100644 index 0000000000..cf2520c16a --- /dev/null +++ b/cw_bitcoin/lib/lightning/lightning_wallet.dart @@ -0,0 +1,124 @@ +import 'package:breez_sdk_spark_flutter/breez_sdk_spark.dart'; +import 'package:cw_bitcoin/lightning/pending_lightning_transaction.dart'; +import 'package:cw_core/pending_transaction.dart'; + +class LightningWallet { + final String mnemonic; + final String apiKey; + final String lnurlDomain; + final Network network; + late BreezSdk sdk; + + LightningWallet({ + required this.mnemonic, + required this.apiKey, + required this.lnurlDomain, + this.network = Network.mainnet, + }); + + Future init(String appPath) async { + await BreezSdkSparkLib.init(); + + final seed = Seed.mnemonic(mnemonic: mnemonic, passphrase: null); + final config = defaultConfig(network: Network.mainnet).copyWith( + lnurlDomain: lnurlDomain, + apiKey: apiKey, + ); + + final connectRequest = ConnectRequest( + config: config, + seed: seed, + storageDir: "$appPath/", + ); + + sdk = await connect(request: connectRequest); + } + + Future getAddress() async => (await sdk.getLightningAddress())?.lightningAddress; + + Future getBalance() async => + (await sdk.getInfo(request: GetInfoRequest(ensureSynced: true))).balanceSats; + + Future registerAddress(String username) async => (await sdk.registerLightningAddress( + request: RegisterLightningAddressRequest(username: username))) + .lightningAddress; + + Future isCompatible(String input) async { + try { + final inputType = await sdk.parse(input: input); + return (inputType is InputType_Bolt11Invoice) || (inputType is InputType_LightningAddress); + } catch (_) { + return false; + } + } + + Future createTransaction(String address, BigInt? amountSats) async { + final inputType = await sdk.parse(input: address); + + if (inputType is InputType_Bolt11Invoice) { + final request = PrepareSendPaymentRequest( + paymentRequest: inputType.field0.invoice.bolt11, amount: amountSats); + final prepareResponse = await sdk.prepareSendPayment(request: request); + + final paymentMethod = prepareResponse.paymentMethod; + if (paymentMethod is SendPaymentMethod_Bolt11Invoice) { + // Fees to pay via Lightning + final lightningFeeSats = paymentMethod.lightningFeeSats; + // Or fees to pay (if available) via a Spark transfer + final sparkTransferFeeSats = paymentMethod.sparkTransferFeeSats; + + return PendingLightningTransaction( + id: paymentMethod.invoiceDetails.paymentHash, + amount: paymentMethod.invoiceDetails.amountMsat?.toInt() ?? 0, + fee: lightningFeeSats.toInt() + (sparkTransferFeeSats?.toInt() ?? 0), + commitOverride: () => + sdk.sendPayment(request: SendPaymentRequest(prepareResponse: prepareResponse)), + ); + } + } else if (inputType is InputType_LightningAddress) { + final optionalValidateSuccessActionUrl = true; + + final request = PrepareLnurlPayRequest( + amountSats: amountSats!, + payRequest: inputType.field0.payRequest, + validateSuccessActionUrl: optionalValidateSuccessActionUrl, + ); + final prepareResponse = await sdk.prepareLnurlPay(request: request); + + final feeSats = prepareResponse.feeSats; + + return PendingLightningTransaction( + id: prepareResponse.invoiceDetails.paymentHash, + amount: prepareResponse.invoiceDetails.amountMsat?.toInt() ?? 0, + fee: feeSats.toInt(), + commitOverride: () => + sdk.lnurlPay(request: LnurlPayRequest(prepareResponse: prepareResponse)), + ); + } + + // If not returned earlier + throw UnimplementedError(); + } +} + +extension _ConfigCopyWith on Config { + Config copyWith({ + String? apiKey, + String? lnurlDomain, + Network? network, + int? syncIntervalSecs, + Fee? maxDepositClaimFee, + bool? preferSparkOverLightning, + bool? useDefaultExternalInputParsers, + }) => + Config( + lnurlDomain: lnurlDomain ?? this.lnurlDomain, + apiKey: apiKey ?? this.apiKey, + network: network ?? this.network, + syncIntervalSecs: syncIntervalSecs ?? this.syncIntervalSecs, + maxDepositClaimFee: maxDepositClaimFee ?? this.maxDepositClaimFee, + preferSparkOverLightning: preferSparkOverLightning ?? this.preferSparkOverLightning, + useDefaultExternalInputParsers: + useDefaultExternalInputParsers ?? this.useDefaultExternalInputParsers, + ); +} diff --git a/cw_bitcoin/lib/lightning/pending_lightning_transaction.dart b/cw_bitcoin/lib/lightning/pending_lightning_transaction.dart new file mode 100644 index 0000000000..72b4423783 --- /dev/null +++ b/cw_bitcoin/lib/lightning/pending_lightning_transaction.dart @@ -0,0 +1,44 @@ +import 'package:cw_bitcoin/bitcoin_amount_format.dart'; +import 'package:cw_core/pending_transaction.dart'; + +class PendingLightningTransaction with PendingTransaction { + PendingLightningTransaction({ + required this.id, + required this.amount, + required this.fee, + this.isSendAll = false, + required this.commitOverride, + }); + + final int amount; + final int fee; + final bool isSendAll; + Future Function() commitOverride; + + @override + final String id; + + @override + String get hex => ""; + + @override + String get amountFormatted => bitcoinAmountToString(amount: amount); + + @override + String get feeFormatted => "$feeFormattedValue BTC"; + + @override + String get feeFormattedValue => bitcoinAmountToString(amount: fee); + + @override + int? get outputCount => 1; + + @override + Future commit() => commitOverride.call(); + + @override + bool shouldCommitUR() => false; + + @override + Future> commitUR() => throw UnimplementedError(); +} diff --git a/cw_bitcoin/pubspec.lock b/cw_bitcoin/pubspec.lock index 681e68d478..38aea938ca 100644 --- a/cw_bitcoin/pubspec.lock +++ b/cw_bitcoin/pubspec.lock @@ -130,6 +130,15 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.2" + breez_sdk_spark_flutter: + dependency: "direct main" + description: + path: "." + ref: HEAD + resolved-ref: "5bc8fb5f3a5c84e2e3dd55f5d48b01152f425765" + url: "https://github.com/breez/breez-sdk-spark-flutter" + source: git + version: "0.3.2" bs58check: dependency: transitive description: diff --git a/cw_bitcoin/pubspec.yaml b/cw_bitcoin/pubspec.yaml index 942a5069a2..940ce80b6a 100644 --- a/cw_bitcoin/pubspec.yaml +++ b/cw_bitcoin/pubspec.yaml @@ -72,6 +72,9 @@ dependencies: git: url: https://github.com/mrcyjanek/bbqrdart ref: e867e3d0156d0b29858100f30adc2625b9dae586 + breez_sdk_spark_flutter: + git: + url: https://github.com/breez/breez-sdk-spark-flutter dev_dependencies: flutter_test: diff --git a/lib/view_model/dashboard/balance_view_model.dart b/lib/view_model/dashboard/balance_view_model.dart index 552d318e4a..8d57356f37 100644 --- a/lib/view_model/dashboard/balance_view_model.dart +++ b/lib/view_model/dashboard/balance_view_model.dart @@ -1,27 +1,26 @@ import 'package:cake_wallet/bitcoin/bitcoin.dart'; +import 'package:cake_wallet/entities/balance_display_mode.dart'; +import 'package:cake_wallet/entities/calculate_fiat_amount.dart'; import 'package:cake_wallet/entities/fiat_api_mode.dart'; import 'package:cake_wallet/entities/sort_balance_types.dart'; +import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/reactions/wallet_connect.dart'; -import 'package:cw_core/transaction_history.dart'; -import 'package:cw_core/wallet_base.dart'; +import 'package:cake_wallet/store/app_store.dart'; +import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart'; +import 'package:cake_wallet/store/settings_store.dart'; import 'package:cw_core/balance.dart'; import 'package:cw_core/crypto_currency.dart'; +import 'package:cw_core/transaction_history.dart'; import 'package:cw_core/transaction_info.dart'; +import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_type.dart'; -import 'package:cake_wallet/generated/i18n.dart'; -import 'package:cake_wallet/entities/balance_display_mode.dart'; -import 'package:cake_wallet/entities/calculate_fiat_amount.dart'; -import 'package:cake_wallet/store/app_store.dart'; -import 'package:cake_wallet/store/settings_store.dart'; -import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart'; import 'package:mobx/mobx.dart'; part 'balance_view_model.g.dart'; class BalanceRecord { const BalanceRecord( - { - required this.availableBalance, + {required this.availableBalance, required this.additionalBalance, required this.secondAvailableBalance, required this.secondAdditionalBalance, @@ -150,18 +149,15 @@ abstract class BalanceViewModelBase with Store { @computed String get availableBalanceLabel { - if (displayMode == BalanceDisplayMode.hiddenBalance) { return S.current.show_balance; - } - else { + } else { return S.current.xmr_available_balance; } } @computed String get additionalBalanceLabel { - switch (wallet.type) { case WalletType.haven: case WalletType.ethereum: @@ -225,8 +221,10 @@ abstract class BalanceViewModelBase with Store { fiatAdditionalBalance: isFiatDisabled ? '' : '${fiatCurrency.toString()} ●●●●●', fiatAvailableBalance: isFiatDisabled ? '' : '${fiatCurrency.toString()} ●●●●●', fiatFrozenBalance: isFiatDisabled ? '' : '', - fiatSecondAvailableBalance: isFiatDisabled ? '' : '${fiatCurrency.toString()} ●●●●●', - fiatSecondAdditionalBalance: isFiatDisabled ? '' : '${fiatCurrency.toString()} ●●●●●', + fiatSecondAvailableBalance: + isFiatDisabled ? '' : '${fiatCurrency.toString()} ●●●●●', + fiatSecondAdditionalBalance: + isFiatDisabled ? '' : '${fiatCurrency.toString()} ●●●●●', asset: key, formattedAssetTitle: _formatterAsset(key))); } @@ -300,8 +298,16 @@ abstract class BalanceViewModelBase with Store { mwebEnabled && _hasSecondAdditionalBalanceForWalletType(wallet.type); @computed - bool get hasSecondAvailableBalance => - mwebEnabled && _hasSecondAvailableBalanceForWalletType(wallet.type); + bool get hasSecondAvailableBalance { + switch (wallet.type) { + case WalletType.bitcoin: + return true; + case WalletType.litecoin: + return mwebEnabled; + default: + return false; + } + } bool _hasAdditionalBalanceForWalletType(WalletType type) { switch (type) { @@ -317,16 +323,9 @@ abstract class BalanceViewModelBase with Store { bool _hasSecondAdditionalBalanceForWalletType(WalletType type) { if (wallet.type == WalletType.litecoin) { - if ((wallet.balance[CryptoCurrency.ltc]?.secondAdditional ?? 0) != 0) { - return true; - } - } - return false; - } - - bool _hasSecondAvailableBalanceForWalletType(WalletType type) { - if (wallet.type == WalletType.litecoin) { - return true; + return (wallet.balance[CryptoCurrency.ltc]?.secondAdditional ?? 0) != 0; + } else if (wallet.type == WalletType.bitcoin) { + return (wallet.balance[CryptoCurrency.btc]?.secondAdditional ?? 0) != 0; } return false; } @@ -395,7 +394,6 @@ abstract class BalanceViewModelBase with Store { return balance; } - @observable bool isShowCard; From 288085f01838169a5a760490f89cb768b999b61d Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Wed, 29 Oct 2025 12:32:44 +0100 Subject: [PATCH 002/105] refactor: rename `fiatConvertationStore` to `fiatConversionStore` for consistency and update related occurrences across codebase --- lib/di.dart | 2 +- .../dashboard/balance_view_model.dart | 143 ++++++------------ .../dashboard/home_settings_view_model.dart | 2 +- .../dashboard/transaction_list_item.dart | 12 +- 4 files changed, 58 insertions(+), 101 deletions(-) diff --git a/lib/di.dart b/lib/di.dart index fde64bd72d..4138842595 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -543,7 +543,7 @@ Future setup({ getIt.registerFactory(() => BalanceViewModel( appStore: getIt.get(), settingsStore: getIt.get(), - fiatConvertationStore: getIt.get())); + fiatConversionStore: getIt.get())); getIt.registerFactory( () => ExchangeViewModel( diff --git a/lib/view_model/dashboard/balance_view_model.dart b/lib/view_model/dashboard/balance_view_model.dart index 8d57356f37..ef203ceae6 100644 --- a/lib/view_model/dashboard/balance_view_model.dart +++ b/lib/view_model/dashboard/balance_view_model.dart @@ -19,19 +19,20 @@ import 'package:mobx/mobx.dart'; part 'balance_view_model.g.dart'; class BalanceRecord { - const BalanceRecord( - {required this.availableBalance, - required this.additionalBalance, - required this.secondAvailableBalance, - required this.secondAdditionalBalance, - required this.frozenBalance, - required this.fiatAvailableBalance, - required this.fiatAdditionalBalance, - required this.fiatFrozenBalance, - required this.fiatSecondAvailableBalance, - required this.fiatSecondAdditionalBalance, - required this.asset, - required this.formattedAssetTitle}); + const BalanceRecord({ + required this.availableBalance, + required this.additionalBalance, + required this.secondAvailableBalance, + required this.secondAdditionalBalance, + required this.frozenBalance, + required this.fiatAvailableBalance, + required this.fiatAdditionalBalance, + required this.fiatFrozenBalance, + required this.fiatSecondAvailableBalance, + required this.fiatSecondAdditionalBalance, + required this.asset, + required this.formattedAssetTitle, + }); final String fiatAdditionalBalance; final String fiatAvailableBalance; @@ -51,7 +52,7 @@ class BalanceViewModel = BalanceViewModelBase with _$BalanceViewModel; abstract class BalanceViewModelBase with Store { BalanceViewModelBase( - {required this.appStore, required this.settingsStore, required this.fiatConvertationStore}) + {required this.appStore, required this.settingsStore, required this.fiatConversionStore}) : isReversing = false, isShowCard = appStore.wallet?.walletInfo.isShowIntroCakePayCard ?? false, wallet = appStore.wallet! { @@ -62,9 +63,7 @@ abstract class BalanceViewModelBase with Store { _checkMweb(); - reaction((_) => settingsStore.mwebAlwaysScan, (bool value) { - _checkMweb(); - }); + reaction((_) => settingsStore.mwebAlwaysScan, (_) => _checkMweb()); } void _checkMweb() { @@ -75,9 +74,7 @@ abstract class BalanceViewModelBase with Store { final AppStore appStore; final SettingsStore settingsStore; - final FiatConversionStore fiatConvertationStore; - - bool get canReverse => false; + final FiatConversionStore fiatConversionStore; @observable bool isReversing; @@ -85,17 +82,12 @@ abstract class BalanceViewModelBase with Store { @observable WalletBase, TransactionInfo> wallet; - @computed - bool get hasSilentPayments => wallet.type == WalletType.bitcoin && !wallet.isHardwareWallet; - @computed double get price { - final price = fiatConvertationStore.prices[appStore.wallet!.currency]; + final price = fiatConversionStore.prices[appStore.wallet!.currency]; - if (price == null) { - // price should update on next fetch: - return 0; - } + // price should update on next fetch: + if (price == null) return 0; return price; } @@ -109,12 +101,10 @@ abstract class BalanceViewModelBase with Store { @computed bool get isHomeScreenSettingsEnabled => isEVMCompatibleChain(wallet.type) || - wallet.type == WalletType.solana || - wallet.type == WalletType.tron || - wallet.type == WalletType.zano; + [WalletType.solana, WalletType.tron, WalletType.zano].contains(wallet.type); @computed - bool get hasAccounts => wallet.type == WalletType.monero || wallet.type == WalletType.wownero; + bool get hasAccounts => [WalletType.monero, WalletType.wownero].contains(wallet.type); @computed SortBalanceBy get sortBalanceBy => settingsStore.sortBalanceBy; @@ -198,9 +188,7 @@ abstract class BalanceViewModelBase with Store { String additionalBalance(CryptoCurrency cryptoCurrency) { final balance = _currencyBalance(cryptoCurrency); - if (displayMode == BalanceDisplayMode.hiddenBalance) { - return '0.0'; - } + if (displayMode == BalanceDisplayMode.hiddenBalance) return '0.0'; return balance.formattedAdditionalBalance; } @@ -229,7 +217,7 @@ abstract class BalanceViewModelBase with Store { formattedAssetTitle: _formatterAsset(key))); } final fiatCurrency = settingsStore.fiatCurrency; - final price = key.isPotentialScam ? 0.0 : fiatConvertationStore.prices[key] ?? 0; + final price = key.isPotentialScam ? 0.0 : fiatConversionStore.prices[key] ?? 0; // if (price == null) { // throw Exception('Price is null for: $key'); @@ -287,15 +275,21 @@ abstract class BalanceViewModelBase with Store { bool mwebEnabled = false; bool hasAdditionalBalance(CryptoCurrency currency) { - bool isWalletTypeActivated = _hasAdditionalBalanceForWalletType(wallet.type); - bool isNotZeroAmount = additionalBalance(currency) != "0.0"; + final isWalletTypeActivated = _hasAdditionalBalanceForWalletType(wallet.type); + final isNotZeroAmount = additionalBalance(currency) != "0.0"; return isWalletTypeActivated && isNotZeroAmount; } @computed - bool get hasSecondAdditionalBalance => - mwebEnabled && _hasSecondAdditionalBalanceForWalletType(wallet.type); + bool get hasSecondAdditionalBalance { + if (wallet.type == WalletType.litecoin && mwebEnabled) { + return (wallet.balance[CryptoCurrency.ltc]?.secondAdditional ?? 0) != 0; + } else if (wallet.type == WalletType.bitcoin) { + return (wallet.balance[CryptoCurrency.btc]?.secondAdditional ?? 0) != 0; + } + return false; + } @computed bool get hasSecondAvailableBalance { @@ -309,26 +303,8 @@ abstract class BalanceViewModelBase with Store { } } - bool _hasAdditionalBalanceForWalletType(WalletType type) { - switch (type) { - case WalletType.monero: - case WalletType.wownero: - case WalletType.zano: - case WalletType.decred: - return true; - default: - return false; - } - } - - bool _hasSecondAdditionalBalanceForWalletType(WalletType type) { - if (wallet.type == WalletType.litecoin) { - return (wallet.balance[CryptoCurrency.ltc]?.secondAdditional ?? 0) != 0; - } else if (wallet.type == WalletType.bitcoin) { - return (wallet.balance[CryptoCurrency.btc]?.secondAdditional ?? 0) != 0; - } - return false; - } + bool _hasAdditionalBalanceForWalletType(WalletType type) => + [WalletType.monero, WalletType.wownero, WalletType.zano, WalletType.decred].contains(type); @computed List get formattedBalances { @@ -336,25 +312,15 @@ abstract class BalanceViewModelBase with Store { balance.sort((BalanceRecord a, BalanceRecord b) { if (wallet.currency == CryptoCurrency.xhv) { - if (b.asset == CryptoCurrency.xhv) { - return 1; - } + if (b.asset == CryptoCurrency.xhv) return 1; if (b.asset == CryptoCurrency.xusd) { - if (a.asset == CryptoCurrency.xhv) { - return -1; - } - - return 1; - } - - if (b.asset == CryptoCurrency.xbtc) { + if (a.asset == CryptoCurrency.xhv) return -1; return 1; } - if (b.asset == CryptoCurrency.xeur) { - return 1; - } + if (b.asset == CryptoCurrency.xbtc) return 1; + if (b.asset == CryptoCurrency.xeur) return 1; return 0; } @@ -367,9 +333,9 @@ abstract class BalanceViewModelBase with Store { switch (sortBalanceBy) { case SortBalanceBy.FiatBalance: final aFiatBalance = _getFiatBalance( - price: fiatConvertationStore.prices[a.asset] ?? 0, cryptoAmount: a.availableBalance); + price: fiatConversionStore.prices[a.asset] ?? 0, cryptoAmount: a.availableBalance); final bFiatBalance = _getFiatBalance( - price: fiatConvertationStore.prices[b.asset] ?? 0, cryptoAmount: b.availableBalance); + price: fiatConversionStore.prices[b.asset] ?? 0, cryptoAmount: b.availableBalance); return (double.tryParse(bFiatBalance) ?? 0) .compareTo((double.tryParse(aFiatBalance)) ?? 0); @@ -387,9 +353,7 @@ abstract class BalanceViewModelBase with Store { Balance _currencyBalance(CryptoCurrency cryptoCurrency) { final balance = wallet.balance[cryptoCurrency]; - if (balance == null) { - throw Exception('No balance for ${wallet.currency}'); - } + if (balance == null) throw Exception('No balance for ${wallet.currency}'); return balance; } @@ -402,9 +366,7 @@ abstract class BalanceViewModelBase with Store { @action void _onWalletChange( WalletBase, TransactionInfo>? wallet) { - if (wallet == null) { - return; - } + if (wallet == null) return; this.wallet = wallet; _onCurrentWalletChangeReaction?.reaction.dispose(); @@ -437,18 +399,13 @@ abstract class BalanceViewModelBase with Store { } String _formatterAsset(CryptoCurrency asset) { - switch (wallet.type) { - case WalletType.haven: - final assetStringified = asset.toString(); - - if (asset != CryptoCurrency.xhv && assetStringified[0].toUpperCase() == 'X') { - return assetStringified.replaceFirst('X', 'x'); - } - - return asset.toString(); - default: - return asset.toString(); + final assetString = asset.toString(); + if (wallet.type == WalletType.haven && asset != CryptoCurrency.xhv && + assetString[0].toUpperCase() == 'X') { + return assetString.replaceFirst('X', 'x'); } + + return asset.toString(); } String getFormattedFrozenBalance(Balance walletBalance) => diff --git a/lib/view_model/dashboard/home_settings_view_model.dart b/lib/view_model/dashboard/home_settings_view_model.dart index 7ec420de73..ec55b00578 100644 --- a/lib/view_model/dashboard/home_settings_view_model.dart +++ b/lib/view_model/dashboard/home_settings_view_model.dart @@ -427,7 +427,7 @@ abstract class HomeSettingsViewModelBase with Store { void _updateFiatPrices(CryptoCurrency token) async { if (token.isPotentialScam) return; // don't fetch price data for potential scam tokens try { - _balanceViewModel.fiatConvertationStore.prices[token] = + _balanceViewModel.fiatConversionStore.prices[token] = await FiatConversionService.fetchPrice( crypto: token, fiat: _settingsStore.fiatCurrency, diff --git a/lib/view_model/dashboard/transaction_list_item.dart b/lib/view_model/dashboard/transaction_list_item.dart index 33df3ea241..8336a2374c 100644 --- a/lib/view_model/dashboard/transaction_list_item.dart +++ b/lib/view_model/dashboard/transaction_list_item.dart @@ -185,21 +185,21 @@ class TransactionListItem extends ActionListItem with Keyable { break; case WalletType.ethereum: final asset = ethereum!.assetOfTransaction(balanceViewModel.wallet, transaction); - final price = balanceViewModel.fiatConvertationStore.prices[asset]; + final price = balanceViewModel.fiatConversionStore.prices[asset]; amount = calculateFiatAmountRaw( cryptoAmount: ethereum!.formatterEthereumAmountToDouble(transaction: transaction), price: price); break; case WalletType.polygon: final asset = polygon!.assetOfTransaction(balanceViewModel.wallet, transaction); - final price = balanceViewModel.fiatConvertationStore.prices[asset]; + final price = balanceViewModel.fiatConversionStore.prices[asset]; amount = calculateFiatAmountRaw( cryptoAmount: polygon!.formatterPolygonAmountToDouble(transaction: transaction), price: price); break; case WalletType.base: final asset = base!.assetOfTransaction(balanceViewModel.wallet, transaction); - final price = balanceViewModel.fiatConvertationStore.prices[asset]; + final price = balanceViewModel.fiatConversionStore.prices[asset]; amount = calculateFiatAmountRaw( cryptoAmount: base!.formatterBaseAmountToDouble(transaction: transaction), price: price); @@ -219,7 +219,7 @@ class TransactionListItem extends ActionListItem with Keyable { break; case WalletType.solana: final asset = solana!.assetOfTransaction(balanceViewModel.wallet, transaction); - final price = balanceViewModel.fiatConvertationStore.prices[asset]; + final price = balanceViewModel.fiatConversionStore.prices[asset]; amount = calculateFiatAmountRaw( cryptoAmount: solana!.getTransactionAmountRaw(transaction), price: price, @@ -227,7 +227,7 @@ class TransactionListItem extends ActionListItem with Keyable { break; case WalletType.tron: final asset = tron!.assetOfTransaction(balanceViewModel.wallet, transaction); - final price = balanceViewModel.fiatConvertationStore.prices[asset]; + final price = balanceViewModel.fiatConversionStore.prices[asset]; final cryptoAmount = tron!.getTransactionAmountRaw(transaction); amount = calculateFiatAmountRaw( cryptoAmount: cryptoAmount, @@ -240,7 +240,7 @@ class TransactionListItem extends ActionListItem with Keyable { amount = "0.00"; break; } - final price = balanceViewModel.fiatConvertationStore.prices[asset]; + final price = balanceViewModel.fiatConversionStore.prices[asset]; amount = calculateFiatAmountRaw( cryptoAmount: zano!.formatterIntAmountToDouble(amount: transaction.amount, currency: asset, forFee: false), price: price); From 068adeef963a2e7c0a47e2c92c34d0dcbfb1368b Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Thu, 30 Oct 2025 16:26:56 +0100 Subject: [PATCH 003/105] feat: enhance address validation with Lightning Network invoice support for BTC & refactor wallet type/token checks in view model --- cw_bitcoin/lib/bitcoin_wallet.dart | 6 +- cw_bitcoin/lib/electrum_wallet_addresses.dart | 9 +- .../lib/lightning/lightning_addres_type.dart | 2 + .../lib/lightning/lightning_wallet.dart | 15 +- cw_bitcoin/test/cw_bitcoin_test.dart | 25 ++- integration_test/robots/send_page_robot.dart | 4 + lib/bitcoin/cw_bitcoin.dart | 2 + lib/core/address_validator.dart | 39 +++-- lib/src/screens/send/send_page.dart | 156 +++++++++--------- lib/view_model/send/send_view_model.dart | 96 +++++------ tool/configure.dart | 1 + 11 files changed, 197 insertions(+), 158 deletions(-) diff --git a/cw_bitcoin/lib/bitcoin_wallet.dart b/cw_bitcoin/lib/bitcoin_wallet.dart index 6b3cc56f64..997a5dfb89 100644 --- a/cw_bitcoin/lib/bitcoin_wallet.dart +++ b/cw_bitcoin/lib/bitcoin_wallet.dart @@ -378,9 +378,11 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { Future createTransaction(Object credentials) async { credentials = credentials as BitcoinTransactionCredentials; - if (lightningWallet?.isCompatible(credentials.outputs.first.address) == true) { + if ((await lightningWallet?.isCompatible(credentials.outputs.first.address)) == true) { + final amount = parseFixed(credentials.outputs.first.cryptoAmount ?? "0", 9); + return lightningWallet!.createTransaction(credentials.outputs.first.address, - parseFixed(credentials.outputs.first.cryptoAmount ?? "0", 9)); + amount > BigInt.zero ? amount : null); } final tx = (await super.createTransaction(credentials)) as PendingBitcoinTransaction; diff --git a/cw_bitcoin/lib/electrum_wallet_addresses.dart b/cw_bitcoin/lib/electrum_wallet_addresses.dart index eddcadb563..7ef455793f 100644 --- a/cw_bitcoin/lib/electrum_wallet_addresses.dart +++ b/cw_bitcoin/lib/electrum_wallet_addresses.dart @@ -120,8 +120,10 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { final ObservableList addressesByReceiveType; final ObservableList receiveAddresses; final ObservableList changeAddresses; + // TODO: add this variable in `bitcoin_wallet_addresses` and just add a cast in cw_bitcoin to use it final ObservableList silentAddresses; + // TODO: add this variable in `litecoin_wallet_addresses` and just add a cast in cw_bitcoin to use it final ObservableList mwebAddresses; final BasedUtxoNetwork network; @@ -755,7 +757,12 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { final path = await pathForWalletDir(name: walletName, type: WalletType.bitcoin); await lightningWallet!.init(path); - lightningAddress = await lightningWallet!.registerAddress(walletName.replaceAll(" ", "")); + lightningAddress = await lightningWallet!.getAddress(); + + if (lightningAddress == null) { + lightningAddress = + await lightningWallet!.registerAddress(walletName.replaceAll(" ", "").toLowerCase()); + } } } diff --git a/cw_bitcoin/lib/lightning/lightning_addres_type.dart b/cw_bitcoin/lib/lightning/lightning_addres_type.dart index 275867b34f..c12f980e77 100644 --- a/cw_bitcoin/lib/lightning/lightning_addres_type.dart +++ b/cw_bitcoin/lib/lightning/lightning_addres_type.dart @@ -4,6 +4,8 @@ class LightningAddressType implements BitcoinAddressType { const LightningAddressType._(this.value); static const LightningAddressType p2l = LightningAddressType._("Lightning"); + static const String Bolt11InvoiceMatcher = r'^(lightning:)?(lnbc|lntb|lnbs|lnbcrt)[a-z0-9]+$'; + @override bool get isP2sh => false; @override diff --git a/cw_bitcoin/lib/lightning/lightning_wallet.dart b/cw_bitcoin/lib/lightning/lightning_wallet.dart index cf2520c16a..b19105c52b 100644 --- a/cw_bitcoin/lib/lightning/lightning_wallet.dart +++ b/cw_bitcoin/lib/lightning/lightning_wallet.dart @@ -2,6 +2,8 @@ import 'package:breez_sdk_spark_flutter/breez_sdk_spark.dart'; import 'package:cw_bitcoin/lightning/pending_lightning_transaction.dart'; import 'package:cw_core/pending_transaction.dart'; +bool _breezSdkSparkLibUninitialized = true; + class LightningWallet { final String mnemonic; final String apiKey; @@ -17,7 +19,10 @@ class LightningWallet { }); Future init(String appPath) async { - await BreezSdkSparkLib.init(); + if(_breezSdkSparkLibUninitialized) { + await BreezSdkSparkLib.init(); + _breezSdkSparkLibUninitialized = false; + } final seed = Seed.mnemonic(mnemonic: mnemonic, passphrase: null); final config = defaultConfig(network: Network.mainnet).copyWith( @@ -39,9 +44,11 @@ class LightningWallet { Future getBalance() async => (await sdk.getInfo(request: GetInfoRequest(ensureSynced: true))).balanceSats; - Future registerAddress(String username) async => (await sdk.registerLightningAddress( - request: RegisterLightningAddressRequest(username: username))) - .lightningAddress; + Future registerAddress(String username) async { + return (await sdk.registerLightningAddress( + request: RegisterLightningAddressRequest(username: username))) + .lightningAddress; + } Future isCompatible(String input) async { try { diff --git a/cw_bitcoin/test/cw_bitcoin_test.dart b/cw_bitcoin/test/cw_bitcoin_test.dart index 2a7ad6fe46..3fb24b185a 100644 --- a/cw_bitcoin/test/cw_bitcoin_test.dart +++ b/cw_bitcoin/test/cw_bitcoin_test.dart @@ -1,12 +1,23 @@ import 'package:flutter_test/flutter_test.dart'; -import 'package:cw_bitcoin/cw_bitcoin.dart'; - void main() { - test('adds one to input values', () { - final calculator = Calculator(); - expect(calculator.addOne(2), 3); - expect(calculator.addOne(-7), -6); - expect(calculator.addOne(0), 1); + group('lightning matchers', () { + final RegExp lightningInvoiceRegex = + RegExp(r'^(lightning:)?(lnbc|lntb|lnbs|lnbcrt)[a-z0-9]+$', caseSensitive: false); + + test('Valid invoice', () { + final content = + "lnbc2500u1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5xysxxatsyp3k7enxv4jsxqzpuaztrnwngzn3kdzw508d6qejxtdg4y5r3zarvary0c5xw7kpqdxssqfsqqqyqqqqlgqqqqqeqqjq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgqfsqqqyqqqqlgqqqqqeqqjq9qrsgq"; + expect(lightningInvoiceRegex.hasMatch(content), true); + }); + test('Valid invoice with prefix', () { + final content = + "lightning:lnbc2500u1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5xysxxatsyp3k7enxv4jsxqzpuaztrnwngzn3kdzw508d6qejxtdg4y5r3zarvary0c5xw7kpqdxssqfsqqqyqqqqlgqqqqqeqqjq9qrsgq"; + expect(lightningInvoiceRegex.hasMatch(content), true); + }); + test('Invalid invoice', () { + final content = "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq"; // This is a Bitcoin address + expect(lightningInvoiceRegex.hasMatch(content), false); + }); }); } diff --git a/integration_test/robots/send_page_robot.dart b/integration_test/robots/send_page_robot.dart index 84d0156eaa..72ab1d9a03 100644 --- a/integration_test/robots/send_page_robot.dart +++ b/integration_test/robots/send_page_robot.dart @@ -104,6 +104,10 @@ class SendPageRobot { commonTestCases.hasValueKey('send_page_unspent_coin_button_key'); } + if (sendViewModel.hasCurrencyChanger) { + commonTestCases.hasValueKey('send_page_change_asset_button_key'); + } + if (sendViewModel.sendTemplateViewModel.hasMultiRecipient) { commonTestCases.hasValueKey('send_page_add_receiver_button_key'); } diff --git a/lib/bitcoin/cw_bitcoin.dart b/lib/bitcoin/cw_bitcoin.dart index 4a9b2f1f64..b04fe0294d 100644 --- a/lib/bitcoin/cw_bitcoin.dart +++ b/lib/bitcoin/cw_bitcoin.dart @@ -687,6 +687,8 @@ class CWBitcoin extends Bitcoin { } List updateOutputs(PendingTransaction pendingTransaction, List outputs) { + if (pendingTransaction is PendingLightningTransaction) return outputs; + final pendingTx = pendingTransaction as PendingBitcoinTransaction; if (!pendingTx.hasSilentPayment) { diff --git a/lib/core/address_validator.dart b/lib/core/address_validator.dart index 059a92c448..df072f8a32 100644 --- a/lib/core/address_validator.dart +++ b/lib/core/address_validator.dart @@ -12,21 +12,29 @@ const AFTER_REGEX = '(\$|\\s)'; class AddressValidator extends TextValidator { AddressValidator({required CryptoCurrency type, bool isTestnet = false}) : super( - errorMessage: S.current.error_text_address, - useAdditionalValidation: type == CryptoCurrency.btc || type == CryptoCurrency.ltc - ? (String txt) => BitcoinAddressUtils.validateAddress( - address: txt, - network: type == CryptoCurrency.btc - ? isTestnet - ? BitcoinNetwork.testnet - : BitcoinNetwork.mainnet - : LitecoinNetwork.mainnet, - ) - : type == CryptoCurrency.zano - ? zano?.validateAddress - : null, - pattern: getPattern(type, isTestnet: isTestnet), - length: getLength(type)); + errorMessage: S.current.error_text_address, + useAdditionalValidation: [CryptoCurrency.btc, CryptoCurrency.ltc].contains(type) + ? (String txt) { + final RegExp lightningInvoiceRegex = RegExp( + r'^(lightning:)?(lnbc|lntb|lnbs|lnbcrt)[a-z0-9]+$', + caseSensitive: false); + if (lightningInvoiceRegex.hasMatch(txt)) return true; + + return BitcoinAddressUtils.validateAddress( + address: txt, + network: type == CryptoCurrency.btc + ? isTestnet + ? BitcoinNetwork.testnet + : BitcoinNetwork.mainnet + : LitecoinNetwork.mainnet, + ); + } + : type == CryptoCurrency.zano + ? zano?.validateAddress + : null, + pattern: getPattern(type, isTestnet: isTestnet), + length: getLength(type), + ); static String getPattern(CryptoCurrency type, {bool isTestnet = false}) { var pattern = ""; @@ -53,6 +61,7 @@ class AddressValidator extends TextValidator { '|(bc1q[ac-hj-np-z02-9]{25,39})' '|(bc1p([ac-hj-np-z02-9]{39}|[ac-hj-np-z02-9]{59}|[ac-hj-np-z02-9]{8,89}))' '|(bc1q[ac-hj-np-z02-9]{40,80})' + '|(lightning:)?(lnbc|lntb|lnbs|lnbcrt)[a-z0-9]' '|(${silentPaymentAddressPatternMainnet})(\$|\s)'; } case CryptoCurrency.ltc: diff --git a/lib/src/screens/send/send_page.dart b/lib/src/screens/send/send_page.dart index f5b151482b..cd3e695aa3 100644 --- a/lib/src/screens/send/send_page.dart +++ b/lib/src/screens/send/send_page.dart @@ -1,13 +1,13 @@ import 'package:cake_wallet/bitcoin/bitcoin.dart'; import 'package:cake_wallet/core/address_validator.dart'; import 'package:cake_wallet/core/auth_service.dart'; -import 'package:cake_wallet/entities/contact_record.dart'; import 'package:cake_wallet/core/execution_state.dart'; +import 'package:cake_wallet/entities/contact_record.dart'; import 'package:cake_wallet/entities/fiat_currency.dart'; import 'package:cake_wallet/entities/template.dart'; +import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/monero/monero.dart'; import 'package:cake_wallet/reactions/wallet_connect.dart'; -import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/src/screens/connect_device/connect_device_page.dart'; @@ -32,12 +32,12 @@ import 'package:cake_wallet/utils/responsive_layout_util.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/view_model/payment/payment_view_model.dart'; import 'package:cake_wallet/view_model/send/output.dart'; -import 'package:cake_wallet/view_model/wallet_switcher_view_model.dart'; -import 'package:cw_core/utils/print_verbose.dart'; -import 'package:cw_core/wallet_type.dart'; import 'package:cake_wallet/view_model/send/send_view_model.dart'; import 'package:cake_wallet/view_model/send/send_view_model_state.dart'; +import 'package:cake_wallet/view_model/wallet_switcher_view_model.dart'; import 'package:cw_core/crypto_currency.dart'; +import 'package:cw_core/utils/print_verbose.dart'; +import 'package:cw_core/wallet_type.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:keyboard_actions/keyboard_actions.dart'; @@ -93,8 +93,7 @@ class SendPage extends BasePage { size: 16, ); final _closeButton = currentTheme.isDark ? closeButtonImageDarkTheme : closeButtonImage; - - bool isMobileView = responsiveLayoutUtil.shouldRenderMobileUI; + final isMobileView = responsiveLayoutUtil.shouldRenderMobileUI; return MergeSemantics( child: SizedBox( @@ -145,27 +144,25 @@ class SendPage extends BasePage { @override Widget trailing(context) => Observer( - builder: (_) { - return sendViewModel.isBatchSending - ? TrailButton( - caption: S.of(context).remove, - onPressed: () { - var pageToJump = (controller.page?.round() ?? 0) - 1; - pageToJump = pageToJump > 0 ? pageToJump : 0; - final output = _defineCurrentOutput(); - sendViewModel.removeOutput(output); - controller.jumpToPage(pageToJump); - }, - ) - : TrailButton( - caption: S.of(context).clear, - onPressed: () { - final output = _defineCurrentOutput(); - _formKey.currentState?.reset(); - output.reset(); - }, - ); - }, + builder: (_) => sendViewModel.isBatchSending + ? TrailButton( + caption: S.of(context).remove, + onPressed: () { + var pageToJump = (controller.page?.round() ?? 0) - 1; + pageToJump = pageToJump > 0 ? pageToJump : 0; + final output = _defineCurrentOutput(); + sendViewModel.removeOutput(output); + controller.jumpToPage(pageToJump); + }, + ) + : TrailButton( + caption: S.of(context).clear, + onPressed: () { + final output = _defineCurrentOutput(); + _formKey.currentState?.reset(); + output.reset(); + }, + ), ); @override @@ -175,9 +172,9 @@ class SendPage extends BasePage { return Observer(builder: (_) { List sendCards = []; List keyboardActions = []; - for (var output in sendViewModel.outputs) { - var cryptoAmountFocus = FocusNode(); - var fiatAmountFocus = FocusNode(); + for (final output in sendViewModel.outputs) { + final cryptoAmountFocus = FocusNode(); + final fiatAmountFocus = FocusNode(); sendCards.add( SendCard( currentTheme: currentTheme, @@ -376,6 +373,19 @@ class SendPage extends BasePage { bottomSectionPadding: EdgeInsets.only(left: 24, right: 24, bottom: 24), bottomSection: Column( children: [ + if (sendViewModel.hasCurrencyChanger) + Observer( + builder: (_) => Padding( + padding: EdgeInsets.only(bottom: 12), + child: PrimaryButton( + key: ValueKey('send_page_change_asset_button_key'), + onPressed: () => presentCurrencyPicker(context), + text: 'Change your asset (${sendViewModel.selectedCryptoCurrency})', + color: Colors.transparent, + textColor: Theme.of(context).colorScheme.onSurfaceVariant, + ), + ), + ), if (sendViewModel.sendTemplateViewModel.hasMultiRecipient) Padding( padding: EdgeInsets.only(bottom: 12), @@ -474,7 +484,8 @@ class SendPage extends BasePage { sendViewModel.state is TransactionCommitting || sendViewModel.state is IsAwaitingDeviceResponseState || sendViewModel.state is LoadingTemplateExecutingState, - isDisabled: !sendViewModel.isReadyForSend || sendViewModel.state is ExecutedSuccessfullyState, + isDisabled: !sendViewModel.isReadyForSend || + sendViewModel.state is ExecutedSuccessfullyState, ); }, ) @@ -491,9 +502,7 @@ class SendPage extends BasePage { BuildContext? loadingBottomSheetContext; void _setEffects(BuildContext context) { - if (_effectsInstalled) { - return; - } + if (_effectsInstalled) return; if (sendViewModel.isElectrumWallet) { bitcoin!.updateFeeRates(sendViewModel.wallet); @@ -515,16 +524,14 @@ class SendPage extends BasePage { (_) { showPopUp( context: context, - builder: (BuildContext context) { - return AlertWithOneAction( - key: ValueKey('send_page_send_failure_dialog_key'), - buttonKey: ValueKey('send_page_send_failure_dialog_button_key'), - alertTitle: S.of(context).error, - alertContent: state.error, - buttonText: S.of(context).ok, - buttonAction: () => Navigator.of(context).pop(), - ); - }, + builder: (context) => AlertWithOneAction( + key: ValueKey('send_page_send_failure_dialog_key'), + buttonKey: ValueKey('send_page_send_failure_dialog_button_key'), + alertTitle: S.of(context).error, + alertContent: state.error, + buttonText: S.of(context).ok, + buttonAction: () => Navigator.of(context).pop(), + ), ); }, ); @@ -543,7 +550,7 @@ class SendPage extends BasePage { showModalBottomSheet( context: context, isDismissible: false, - builder: (BuildContext context) { + builder: (context) { loadingBottomSheetContext = context; return LoadingBottomSheet( titleText: S.of(context).generating_transaction, @@ -597,9 +604,7 @@ class SendPage extends BasePage { if (state is TransactionCommitted) { WidgetsBinding.instance.addPostFrameCallback((_) async { - if (!context.mounted) { - return; - } + if (!context.mounted) return; newContactAddress = newContactAddress ?? sendViewModel.newContactAddress(); @@ -770,24 +775,32 @@ class SendPage extends BasePage { } Output _defineCurrentOutput() { - if (controller.page == null) { - throw Exception('Controller page is null'); - } + if (controller.page == null) throw Exception('Controller page is null'); final itemCount = controller.page!.round(); return sendViewModel.outputs[itemCount]; } - void showErrorValidationAlert(BuildContext context) async { - await showPopUp( + void showErrorValidationAlert(BuildContext context) => showPopUp( context: context, - builder: (BuildContext context) { - return AlertWithOneAction( - alertTitle: S.of(context).error, - alertContent: 'Please, check receiver forms', - buttonText: S.of(context).ok, - buttonAction: () => Navigator.of(context).pop()); - }); - } + builder: (context) => AlertWithOneAction( + alertTitle: S.of(context).error, + alertContent: 'Please, check receiver forms', + buttonText: S.of(context).ok, + buttonAction: () => Navigator.of(context).pop(), + ), + ); + + void presentCurrencyPicker(BuildContext context) => showPopUp( + builder: (_) => Picker( + items: sendViewModel.currencies, + displayItem: (item) => item.toString(), + selectedAtIndex: sendViewModel.currencies.indexOf(sendViewModel.selectedCryptoCurrency), + title: S.of(context).please_select, + mainAxisAlignment: MainAxisAlignment.center, + onItemSelected: (cur) => sendViewModel.selectedCryptoCurrency = cur, + ), + context: context, + ); bool isRegularElectrumAddress(String address) { final supportedTypes = [CryptoCurrency.btc, CryptoCurrency.ltc, CryptoCurrency.bch]; @@ -800,7 +813,7 @@ class SendPage extends BasePage { final trimmed = address.trim(); bool isValid = false; - for (var type in supportedTypes) { + for (final type in supportedTypes) { final addressPattern = AddressValidator.getAddressFromStringPattern(type); if (addressPattern != null) { final regex = RegExp('^$addressPattern\$'); @@ -811,23 +824,16 @@ class SendPage extends BasePage { } } - for (var pattern in excludedPatterns) { - if (pattern.hasMatch(trimmed)) { - return false; - } + for (final pattern in excludedPatterns) { + if (pattern.hasMatch(trimmed)) return false; } return isValid; } String _sendButtonText(BuildContext context) { - if (!sendViewModel.isReadyForSend) { - return S.of(context).synchronizing; - } - if (sendViewModel.payjoinUri != null) { - return S.of(context).send_payjoin; - } else { - return S.of(context).send; - } + if (!sendViewModel.isReadyForSend) return S.of(context).synchronizing; + if (sendViewModel.payjoinUri != null) return S.of(context).send_payjoin; + return S.of(context).send; } } diff --git a/lib/view_model/send/send_view_model.dart b/lib/view_model/send/send_view_model.dart index 1b446e0203..734eb6c71c 100644 --- a/lib/view_model/send/send_view_model.dart +++ b/lib/view_model/send/send_view_model.dart @@ -57,6 +57,7 @@ import 'package:cw_core/sync_status.dart'; import 'package:cw_core/transaction_info.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/utils/print_verbose.dart'; +import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:flutter/material.dart'; import 'package:hive/hive.dart'; @@ -100,7 +101,8 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor this.transactionDescriptionBox, this.hardwareWalletViewModel, this.unspentCoinsListViewModel, - this.feesViewModel, { + this.feesViewModel, + this.walletInfoSource, { this.coinTypeToSpendFrom = UnspentCoinType.nonMweb, }) : state = InitialExecutionState(), currencies = appStore.wallet!.balance.keys.toList(), @@ -138,21 +140,15 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor bool get isEVMWallet => isEVMCompatibleChain(walletType); @action - void setShowAddressBookPopup(bool value) { - _settingsStore.showAddressBookPopupEnabled = value; - } + void setShowAddressBookPopup(bool value) => _settingsStore.showAddressBookPopupEnabled = value; @action - void addOutput() { - outputs - .add(Output(wallet, _settingsStore, _fiatConversationStore, () => selectedCryptoCurrency)); - } + void addOutput() => outputs + .add(Output(wallet, _settingsStore, _fiatConversationStore, () => selectedCryptoCurrency)); @action void removeOutput(Output output) { - if (isBatchSending) { - outputs.remove(output); - } + if (isBatchSending) outputs.remove(output); } @action @@ -185,9 +181,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor @computed String get pendingTransactionFiatAmount { - if (pendingTransaction == null) { - return '0.00'; - } + if (pendingTransaction == null) return '0.00'; try { final fiat = calculateFiatAmount( @@ -310,11 +304,11 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor @computed String get pendingTransactionFiatAmountFormatted => - isFiatDisabled ? '' : pendingTransactionFiatAmount + ' ' + fiat.title; + isFiatDisabled ? '' : '$pendingTransactionFiatAmount ${fiat.title}'; @computed String get pendingTransactionFeeFiatAmountFormatted => - isFiatDisabled ? '' : pendingTransactionFeeFiatAmount + ' ' + fiat.title; + isFiatDisabled ? '' : '$pendingTransactionFeeFiatAmount ${fiat.title}'; @computed bool get isReadyForSend => @@ -360,13 +354,12 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor List currencies; - bool get hasYat => outputs - .any((out) => out.isParsedAddress && out.parsedAddress.parseFrom == ParseFrom.yatRecord); - WalletType get walletType => wallet.type; String? get walletCurrencyName => wallet.currency.fullName?.toLowerCase() ?? wallet.currency.name; + bool get hasCurrencyChanger => walletType == WalletType.haven; + @computed FiatCurrency get fiatCurrency => _settingsStore.fiatCurrency; @@ -393,19 +386,12 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor .toList(); @action - bool checkIfAddressIsAContact(String address) { - final contactList = contactsToShow.where((element) => element.address == address).toList(); - - return contactList.isNotEmpty; - } + bool checkIfAddressIsAContact(String address) => + contactsToShow.where((element) => element.address == address).toList().isNotEmpty; @action - bool checkIfWalletIsAnInternalWallet(String address) { - final walletContactList = - walletContactsToShow.where((element) => element.address == address).toList(); - - return walletContactList.isNotEmpty; - } + bool checkIfWalletIsAnInternalWallet(String address) => + walletContactsToShow.where((element) => element.address == address).toList().isNotEmpty; @computed bool get shouldDisplayTOTP2FAForContact => _settingsStore.shouldRequireTOTP2FAForSendsToContact; @@ -499,13 +485,14 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor if (wallet.isHardwareWallet) { state = IsAwaitingDeviceResponseState(); - if (walletType == WalletType.monero) + if (walletType == WalletType.monero) { _ledgerTxStateTimer = Timer.periodic(Duration(seconds: 1), (timer) { if (monero!.getLastLedgerCommand() == "INS_CLSAG") { timer.cancel(); state = IsDeviceSigningResponseState(); } }); + } } // Swaps.xyz (EVM) path @@ -873,11 +860,13 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor final priority = _settingsStore.priority[wallet.type]; if (priority == null && - wallet.type != WalletType.nano && - wallet.type != WalletType.banano && - wallet.type != WalletType.solana && - wallet.type != WalletType.tron && - wallet.type != WalletType.arbitrum) { + [ + WalletType.nano, + WalletType.banano, + WalletType.solana, + WalletType.tron, + WalletType.arbitrium + ].contains(wallet.type)) { throw Exception('Priority is null for wallet type: ${wallet.type}'); } @@ -962,24 +951,21 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor Set.from(contactListViewModel.contacts.map((contact) => contact.address)) ..addAll(contactListViewModel.walletContacts.map((contact) => contact.address)); - for (var output in outputs) { - String address; - if (output.isParsedAddress) { - address = output.parsedAddress.addresses.first; - } else { - address = output.address; - } + for (final output in outputs) { + final address = + output.isParsedAddress ? output.parsedAddress.addresses.first : output.address; if (address.isNotEmpty && !contactAddresses.contains(address) && selectedCryptoCurrency.raw != -1) { return ContactRecord( - contactListViewModel.contactSource, - Contact( - name: '', - address: address, - type: selectedCryptoCurrency, - )); + contactListViewModel.contactSource, + Contact( + name: '', + address: address, + type: selectedCryptoCurrency, + ), + ); } } return null; @@ -1054,11 +1040,13 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor return errorMessage; } - if (walletType == WalletType.ethereum || - walletType == WalletType.polygon || - walletType == WalletType.base || - walletType == WalletType.arbitrum || - walletType == WalletType.haven) { + if ([ + WalletType.ethereum, + WalletType.polygon, + WalletType.base, + WalletType.haven, + WalletType.arbitrium + ].contains(walletType)) { if (errorMessage.contains('gas required exceeds allowance')) { return S.current.gas_exceeds_allowance; } diff --git a/tool/configure.dart b/tool/configure.dart index 47b3379406..fb934083ee 100644 --- a/tool/configure.dart +++ b/tool/configure.dart @@ -144,6 +144,7 @@ import 'package:cw_bitcoin/bitcoin_amount_format.dart'; import 'package:cw_bitcoin/bitcoin_address_record.dart'; import 'package:cw_bitcoin/bitcoin_wallet_addresses.dart'; import 'package:cw_bitcoin/bitcoin_transaction_credentials.dart'; +import 'package:cw_bitcoin/lightning/pending_lightning_transaction.dart'; import 'package:cw_bitcoin/litecoin_wallet_service.dart'; import 'package:cw_bitcoin/litecoin_wallet.dart'; import 'package:cw_bitcoin/hardware/bitcoin_ledger_service.dart'; From 9cccb6d6629aef3b3aff23ddcb0bc905dad84aed Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Fri, 31 Oct 2025 16:16:22 +0100 Subject: [PATCH 004/105] feat: add support for Lightning invoice detection, refactor MWEB deposit/withdraw actions, and integrate Lightning transaction creation with updated priority handling --- cw_bitcoin/lib/bitcoin_wallet.dart | 8 +- cw_bitcoin/lib/electrum_wallet.dart | 1 + .../lib/lightning/lightning_wallet.dart | 56 +++++++++- cw_core/lib/unspent_coin_type.dart | 2 +- lib/bitcoin/cw_bitcoin.dart | 10 ++ .../pages/balance/balance_row_widget.dart | 102 +++++++++--------- lib/src/screens/send/widgets/send_card.dart | 4 + lib/view_model/send/send_view_model.dart | 7 ++ 8 files changed, 133 insertions(+), 57 deletions(-) diff --git a/cw_bitcoin/lib/bitcoin_wallet.dart b/cw_bitcoin/lib/bitcoin_wallet.dart index 997a5dfb89..e5147a536a 100644 --- a/cw_bitcoin/lib/bitcoin_wallet.dart +++ b/cw_bitcoin/lib/bitcoin_wallet.dart @@ -27,6 +27,7 @@ import 'package:cw_core/output_info.dart'; import 'package:cw_core/parse_fixed.dart'; import 'package:cw_core/payjoin_session.dart'; import 'package:cw_core/pending_transaction.dart'; +import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/unspent_coins_info.dart'; import 'package:cw_core/utils/zpub.dart'; import 'package:cw_core/wallet_info.dart'; @@ -378,11 +379,12 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { Future createTransaction(Object credentials) async { credentials = credentials as BitcoinTransactionCredentials; - if ((await lightningWallet?.isCompatible(credentials.outputs.first.address)) == true) { - final amount = parseFixed(credentials.outputs.first.cryptoAmount ?? "0", 9); + if ((credentials.coinTypeToSpendFrom == UnspentCoinType.lightning && lightningWallet != null) || + (await lightningWallet?.isCompatible(credentials.outputs.first.address)) == true) { + final amount = parseFixed(credentials.outputs.first.cryptoAmount?.isNotEmpty == true ? credentials.outputs.first.cryptoAmount! : "0", 9); return lightningWallet!.createTransaction(credentials.outputs.first.address, - amount > BigInt.zero ? amount : null); + amount > BigInt.zero ? amount : null, credentials.priority); } final tx = (await super.createTransaction(credentials)) as PendingBitcoinTransaction; diff --git a/cw_bitcoin/lib/electrum_wallet.dart b/cw_bitcoin/lib/electrum_wallet.dart index 7a0fecd3e7..73591a643d 100644 --- a/cw_bitcoin/lib/electrum_wallet.dart +++ b/cw_bitcoin/lib/electrum_wallet.dart @@ -714,6 +714,7 @@ abstract class ElectrumWalletBase case UnspentCoinType.nonMweb: return utx.bitcoinAddressRecord.type != SegwitAddresType.mweb; case UnspentCoinType.any: + case UnspentCoinType.lightning: return true; } }).toList(); diff --git a/cw_bitcoin/lib/lightning/lightning_wallet.dart b/cw_bitcoin/lib/lightning/lightning_wallet.dart index b19105c52b..b015f8d0c2 100644 --- a/cw_bitcoin/lib/lightning/lightning_wallet.dart +++ b/cw_bitcoin/lib/lightning/lightning_wallet.dart @@ -1,4 +1,5 @@ import 'package:breez_sdk_spark_flutter/breez_sdk_spark.dart'; +import 'package:cw_bitcoin/bitcoin_transaction_priority.dart'; import 'package:cw_bitcoin/lightning/pending_lightning_transaction.dart'; import 'package:cw_core/pending_transaction.dart'; @@ -19,7 +20,7 @@ class LightningWallet { }); Future init(String appPath) async { - if(_breezSdkSparkLibUninitialized) { + if (_breezSdkSparkLibUninitialized) { await BreezSdkSparkLib.init(); _breezSdkSparkLibUninitialized = false; } @@ -41,12 +42,17 @@ class LightningWallet { Future getAddress() async => (await sdk.getLightningAddress())?.lightningAddress; + Future getDepositAddress() async => + (await sdk.receivePayment( + request: ReceivePaymentRequest(paymentMethod: ReceivePaymentMethod.bitcoinAddress()))) + .paymentRequest; + Future getBalance() async => (await sdk.getInfo(request: GetInfoRequest(ensureSynced: true))).balanceSats; Future registerAddress(String username) async { return (await sdk.registerLightningAddress( - request: RegisterLightningAddressRequest(username: username))) + request: RegisterLightningAddressRequest(username: username))) .lightningAddress; } @@ -59,7 +65,8 @@ class LightningWallet { } } - Future createTransaction(String address, BigInt? amountSats) async { + Future createTransaction(String address, BigInt? amountSats, + BitcoinTransactionPriority? priority) async { final inputType = await sdk.parse(input: address); if (inputType is InputType_Bolt11Invoice) { @@ -76,7 +83,7 @@ class LightningWallet { return PendingLightningTransaction( id: paymentMethod.invoiceDetails.paymentHash, - amount: paymentMethod.invoiceDetails.amountMsat?.toInt() ?? 0, + amount: ((paymentMethod.invoiceDetails.amountMsat?.toInt() ?? 0) / 1000).round(), fee: lightningFeeSats.toInt() + (sparkTransferFeeSats?.toInt() ?? 0), commitOverride: () => sdk.sendPayment(request: SendPaymentRequest(prepareResponse: prepareResponse)), @@ -101,6 +108,45 @@ class LightningWallet { commitOverride: () => sdk.lnurlPay(request: LnurlPayRequest(prepareResponse: prepareResponse)), ); + } else if (inputType is InputType_BitcoinAddress) { + final request = PrepareSendPaymentRequest( + paymentRequest: inputType.field0.address, amount: amountSats); + final prepareResponse = await sdk.prepareSendPayment(request: request); + + final paymentMethod = prepareResponse.paymentMethod; + if (paymentMethod is SendPaymentMethod_BitcoinAddress) { + final feeQuote = paymentMethod.feeQuote; + OnchainConfirmationSpeed onchainConfirmationSpeed; + int fee; + + switch (priority) { + case BitcoinTransactionPriority.fast: + fee = (feeQuote.speedFast.userFeeSat + feeQuote.speedFast.l1BroadcastFeeSat).toInt(); + onchainConfirmationSpeed = OnchainConfirmationSpeed.fast; + break; + case BitcoinTransactionPriority.medium: + fee = + (feeQuote.speedMedium.userFeeSat + feeQuote.speedMedium.l1BroadcastFeeSat).toInt(); + onchainConfirmationSpeed = OnchainConfirmationSpeed.medium; + break; + case BitcoinTransactionPriority.slow: + default: + fee = (feeQuote.speedSlow.userFeeSat + feeQuote.speedSlow.l1BroadcastFeeSat).toInt(); + onchainConfirmationSpeed = OnchainConfirmationSpeed.slow; + } + + return PendingLightningTransaction( + id: "", // ToDo: Find out where to get it + amount: prepareResponse.amount.toInt(), + fee: fee, + commitOverride: () async { + final options = + SendPaymentOptions.bitcoinAddress(confirmationSpeed: onchainConfirmationSpeed); + await sdk.sendPayment( + request: SendPaymentRequest(prepareResponse: prepareResponse, options: options)); + }, + ); + } } // If not returned earlier @@ -126,6 +172,6 @@ extension _ConfigCopyWith on Config { maxDepositClaimFee: maxDepositClaimFee ?? this.maxDepositClaimFee, preferSparkOverLightning: preferSparkOverLightning ?? this.preferSparkOverLightning, useDefaultExternalInputParsers: - useDefaultExternalInputParsers ?? this.useDefaultExternalInputParsers, + useDefaultExternalInputParsers ?? this.useDefaultExternalInputParsers, ); } diff --git a/cw_core/lib/unspent_coin_type.dart b/cw_core/lib/unspent_coin_type.dart index a042610fc9..859457c498 100644 --- a/cw_core/lib/unspent_coin_type.dart +++ b/cw_core/lib/unspent_coin_type.dart @@ -1 +1 @@ -enum UnspentCoinType { mweb, nonMweb, any } \ No newline at end of file +enum UnspentCoinType { mweb, nonMweb, any, lightning } diff --git a/lib/bitcoin/cw_bitcoin.dart b/lib/bitcoin/cw_bitcoin.dart index b04fe0294d..27ffcef0d0 100644 --- a/lib/bitcoin/cw_bitcoin.dart +++ b/lib/bitcoin/cw_bitcoin.dart @@ -248,6 +248,7 @@ class CWBitcoin extends Bitcoin { return element.bitcoinAddressRecord.type == SegwitAddresType.mweb; case UnspentCoinType.nonMweb: return element.bitcoinAddressRecord.type != SegwitAddresType.mweb; + case UnspentCoinType.lightning: case UnspentCoinType.any: return true; } @@ -766,6 +767,15 @@ class CWBitcoin extends Bitcoin { } } + Future getUnusedSpakDepositAddress(Object wallet) async { + try { + final bitcoinWallet = wallet as BitcoinWallet; + return wallet.lightningWallet?.getDepositAddress(); + } catch (_) { + return null; + } + } + @override Future commitPsbtUR(Object wallet, List urCodes) { final _wallet = wallet as BitcoinWalletBase; diff --git a/lib/src/screens/dashboard/pages/balance/balance_row_widget.dart b/lib/src/screens/dashboard/pages/balance/balance_row_widget.dart index 766914f769..3dac4cea13 100644 --- a/lib/src/screens/dashboard/pages/balance/balance_row_widget.dart +++ b/lib/src/screens/dashboard/pages/balance/balance_row_widget.dart @@ -12,6 +12,7 @@ import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/unspent_coin_type.dart'; +import 'package:cw_core/wallet_type.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -505,23 +506,7 @@ class BalanceRowWidget extends StatelessWidget { child: Semantics( label: S.of(context).litecoin_mweb_pegin, child: OutlinedButton( - onPressed: () { - final mwebAddress = - bitcoin!.getUnusedMwebAddress(dashboardViewModel.wallet); - PaymentRequest? paymentRequest = null; - if ((mwebAddress?.isNotEmpty ?? false)) { - paymentRequest = PaymentRequest.fromUri( - Uri.parse("litecoin:${mwebAddress}")); - } - Navigator.pushNamed( - context, - Routes.send, - arguments: { - 'paymentRequest': paymentRequest, - 'coinTypeToSpendFrom': UnspentCoinType.nonMweb, - }, - ); - }, + onPressed: () => depositToL2(context), style: OutlinedButton.styleFrom( backgroundColor: Theme.of(context).colorScheme.primary, side: BorderSide( @@ -563,23 +548,7 @@ class BalanceRowWidget extends StatelessWidget { child: Semantics( label: S.of(context).litecoin_mweb_pegout, child: OutlinedButton( - onPressed: () { - final litecoinAddress = - bitcoin!.getUnusedSegwitAddress(dashboardViewModel.wallet); - PaymentRequest? paymentRequest = null; - if ((litecoinAddress?.isNotEmpty ?? false)) { - paymentRequest = PaymentRequest.fromUri( - Uri.parse("litecoin:${litecoinAddress}")); - } - Navigator.pushNamed( - context, - Routes.send, - arguments: { - 'paymentRequest': paymentRequest, - 'coinTypeToSpendFrom': UnspentCoinType.mweb, - }, - ); - }, + onPressed: () => withdrawFromL2(context), style: OutlinedButton.styleFrom( backgroundColor: Theme.of(context).colorScheme.surface, side: BorderSide( @@ -632,20 +601,57 @@ class BalanceRowWidget extends StatelessWidget { ); } - // double getShadowSpread(){ - // double spread = 3; - // else if (!dashboardViewModel.settingsStore.currentTheme.isDark) spread = 3; - // else if (dashboardViewModel.settingsStore.currentTheme.isDark) spread = 1; - // return spread; - // } - // - // - // double getShadowBlur(){ - // double blur = 7; - // else if (dashboardViewModel.settingsStore.currentTheme.isDark) blur = 7; - // else if (dashboardViewModel.settingsStore.currentTheme.isDark) blur = 3; - // return blur; - // } + Future depositToL2(BuildContext context) async { + PaymentRequest? paymentRequest = null; + + if (dashboardViewModel.type == WalletType.litecoin) { + final depositAddress = bitcoin!.getUnusedMwebAddress(dashboardViewModel.wallet); + if ((depositAddress?.isNotEmpty ?? false)) { + paymentRequest = PaymentRequest.fromUri(Uri.parse("litecoin:$depositAddress")); + } + } else if (dashboardViewModel.type == WalletType.bitcoin) { + final depositAddress = await bitcoin!.getUnusedSpakDepositAddress(dashboardViewModel.wallet); + if ((depositAddress?.isNotEmpty ?? false)) { + paymentRequest = PaymentRequest.fromUri(Uri.parse("bitcoin:$depositAddress")); + } + } + + Navigator.pushNamed( + context, + Routes.send, + arguments: { + 'paymentRequest': paymentRequest, + 'coinTypeToSpendFrom': UnspentCoinType.nonMweb, + }, + ); + } + + Future withdrawFromL2(BuildContext context) async { + PaymentRequest? paymentRequest = null; + UnspentCoinType unspentCoinType = UnspentCoinType.any; + final withdrawAddress = bitcoin!.getUnusedSegwitAddress(dashboardViewModel.wallet); + + if (dashboardViewModel.type == WalletType.litecoin) { + if ((withdrawAddress?.isNotEmpty ?? false)) { + paymentRequest = PaymentRequest.fromUri(Uri.parse("litecoin:$withdrawAddress")); + } + unspentCoinType = UnspentCoinType.mweb; + } else if (dashboardViewModel.type == WalletType.bitcoin) { + if ((withdrawAddress?.isNotEmpty ?? false)) { + paymentRequest = PaymentRequest.fromUri(Uri.parse("bitcoin:$withdrawAddress")); + } + unspentCoinType = UnspentCoinType.lightning; + } + + Navigator.pushNamed( + context, + Routes.send, + arguments: { + 'paymentRequest': paymentRequest, + 'coinTypeToSpendFrom': unspentCoinType, + }, + ); + } void _showBalanceDescription(BuildContext context, String content) { showPopUp(context: context, builder: (_) => InformationPage(information: content)); diff --git a/lib/src/screens/send/widgets/send_card.dart b/lib/src/screens/send/widgets/send_card.dart index b0d4f767ef..20e3b2ceb3 100644 --- a/lib/src/screens/send/widgets/send_card.dart +++ b/lib/src/screens/send/widgets/send_card.dart @@ -818,6 +818,10 @@ class SendCardState extends State with AutomaticKeepAliveClientMixin Date: Fri, 31 Oct 2025 16:16:45 +0100 Subject: [PATCH 005/105] feat: add method to retrieve unused Spark deposit address for Bitcoin wallets --- tool/configure.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/tool/configure.dart b/tool/configure.dart index fb934083ee..dbca11d49f 100644 --- a/tool/configure.dart +++ b/tool/configure.dart @@ -269,6 +269,7 @@ abstract class Bitcoin { bool getMwebEnabled(Object wallet); String? getUnusedMwebAddress(Object wallet); String? getUnusedSegwitAddress(Object wallet); + Future getUnusedSpakDepositAddress(Object wallet); Future commitPsbtUR(Object wallet, List urCodes); void updatePayjoinState(Object wallet, bool state); From 345196927fc5083902f6ef82bcf85be2431ccc28 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Sat, 1 Nov 2025 00:32:21 +0100 Subject: [PATCH 006/105] feat: add Breez API key support and update secrets handling for Bitcoin Lightning wallet integration in workflows --- .github/workflows/automated_integration_test.yml | 2 ++ .github/workflows/pr_test_build_android.yml | 4 +++- .github/workflows/pr_test_build_linux.yml | 2 ++ cw_bitcoin/lib/bitcoin_wallet.dart | 4 ++-- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/automated_integration_test.yml b/.github/workflows/automated_integration_test.yml index 95a3197d4f..eee1407c1d 100644 --- a/.github/workflows/automated_integration_test.yml +++ b/.github/workflows/automated_integration_test.yml @@ -57,6 +57,7 @@ jobs: - name: Add secrets run: | touch lib/.secrets.g.dart + touch cw_bitcoin/lib/.secrets.g.dart touch cw_evm/lib/.secrets.g.dart touch cw_solana/lib/.secrets.g.dart touch cw_core/lib/.secrets.g.dart @@ -130,6 +131,7 @@ jobs: echo "const etherScanApiKey = '${{ secrets.ETHER_SCAN_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const moralisApiKey = '${{ secrets.MORALIS_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const nowNodesApiKey = '${{ secrets.EVM_NOWNODES_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart + echo "const breezApiKey = '${{ secrets.BREEZ_API_KEY }}';" >> cw_bitcoin/lib/.secrets.g.dart echo "const chatwootWebsiteToken = '${{ secrets.CHATWOOT_WEBSITE_TOKEN }}';" >> lib/.secrets.g.dart echo "const exolixCakeWalletApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart echo "const exolixMoneroApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart diff --git a/.github/workflows/pr_test_build_android.yml b/.github/workflows/pr_test_build_android.yml index 05753d8d36..625a1e50d9 100644 --- a/.github/workflows/pr_test_build_android.yml +++ b/.github/workflows/pr_test_build_android.yml @@ -51,6 +51,7 @@ jobs: - name: Add secrets run: | touch lib/.secrets.g.dart + touch cw_bitcoin/lib/.secrets.g.dart touch cw_evm/lib/.secrets.g.dart touch cw_solana/lib/.secrets.g.dart touch cw_core/lib/.secrets.g.dart @@ -124,6 +125,7 @@ jobs: echo "const etherScanApiKey = '${{ secrets.ETHER_SCAN_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const moralisApiKey = '${{ secrets.MORALIS_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const nowNodesApiKey = '${{ secrets.EVM_NOWNODES_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart + echo "const breezApiKey = '${{ secrets.BREEZ_API_KEY }}';" >> cw_bitcoin/lib/.secrets.g.dart echo "const chatwootWebsiteToken = '${{ secrets.CHATWOOT_WEBSITE_TOKEN }}';" >> lib/.secrets.g.dart echo "const exolixCakeWalletApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart echo "const exolixMoneroApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart @@ -337,4 +339,4 @@ jobs: cd build/app/outputs/flutter-apk for i in arm64-v8a x86_64; do ../../../../scripts/android/check_16kb_align.sh app-$i-release.apk - done \ No newline at end of file + done diff --git a/.github/workflows/pr_test_build_linux.yml b/.github/workflows/pr_test_build_linux.yml index 92eae19db2..10bd5557b7 100644 --- a/.github/workflows/pr_test_build_linux.yml +++ b/.github/workflows/pr_test_build_linux.yml @@ -44,6 +44,7 @@ jobs: - name: Add secrets run: | touch lib/.secrets.g.dart + touch cw_bitcoin/lib/.secrets.g.dart touch cw_evm/lib/.secrets.g.dart touch cw_solana/lib/.secrets.g.dart touch cw_core/lib/.secrets.g.dart @@ -117,6 +118,7 @@ jobs: echo "const etherScanApiKey = '${{ secrets.ETHER_SCAN_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const moralisApiKey = '${{ secrets.MORALIS_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const nowNodesApiKey = '${{ secrets.EVM_NOWNODES_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart + echo "const breezApiKey = '${{ secrets.BREEZ_API_KEY }}';" >> cw_bitcoin/lib/.secrets.g.dart echo "const chatwootWebsiteToken = '${{ secrets.CHATWOOT_WEBSITE_TOKEN }}';" >> lib/.secrets.g.dart echo "const exolixCakeWalletApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart echo "const exolixMoneroApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart diff --git a/cw_bitcoin/lib/bitcoin_wallet.dart b/cw_bitcoin/lib/bitcoin_wallet.dart index e5147a536a..561c31528d 100644 --- a/cw_bitcoin/lib/bitcoin_wallet.dart +++ b/cw_bitcoin/lib/bitcoin_wallet.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:bip39/bip39.dart' as bip39; import 'package:bitcoin_base/bitcoin_base.dart'; import 'package:blockchain_utils/blockchain_utils.dart'; +import 'package:cw_bitcoin/.secrets.g.dart' as secrets; import 'package:cw_bitcoin/address_from_output.dart'; import 'package:cw_bitcoin/bitcoin_address_record.dart'; import 'package:cw_bitcoin/bitcoin_mnemonic.dart'; @@ -96,8 +97,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { if (mnemonic != null) { lightningWallet = LightningWallet( mnemonic: mnemonic, - apiKey: - "MIIBdzCCASmgAwIBAgIHPpJHKP1qXzAFBgMrZXAwEDEOMAwGA1UEAxMFQnJlZXowHhcNMjUxMDIzMTQwNDQ4WhcNMzUxMDIxMTQwNDQ4WjAxMRQwEgYDVQQKEwtDYWtlIFdhbGxldDEZMBcGA1UEAxMQU2V0aCBGb3IgUHJpdmFjeTAqMAUGAytlcAMhANCD9cvfIDwcoiDKKYdT9BunHLS2/OuKzV8NS0SzqV13o4GAMH4wDgYDVR0PAQH/BAQDAgWgMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFNo5o+5ea0sNMlW/75VgGJCv2AcJMB8GA1UdIwQYMBaAFN6q1pJW843ndJIW/Ey2ILJrKJhrMB4GA1UdEQQXMBWBE3NldGhAY2FrZXdhbGxldC5jb20wBQYDK2VwA0EAl+naPfCBseV7eS4SoP0q0kvo2GHCywXoIbnlBa0y+/wlfu+oILtsGv3jGQ2egCnpgHe87yzR0ygclzz8r/jdAQ==", + apiKey: secrets.breezApiKey, lnurlDomain: "breez.tips", ); } From b06aea3b00754970f6fe2abf1c2b9d596cd20c10 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Sat, 1 Nov 2025 00:33:45 +0100 Subject: [PATCH 007/105] chore: update Breez SDK dependency to version 0.3.4 in pubspec files --- cw_bitcoin/pubspec.lock | 6 +++--- cw_bitcoin/pubspec.yaml | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/cw_bitcoin/pubspec.lock b/cw_bitcoin/pubspec.lock index 38aea938ca..e281c7f7b4 100644 --- a/cw_bitcoin/pubspec.lock +++ b/cw_bitcoin/pubspec.lock @@ -134,11 +134,11 @@ packages: dependency: "direct main" description: path: "." - ref: HEAD - resolved-ref: "5bc8fb5f3a5c84e2e3dd55f5d48b01152f425765" + ref: "92f62dc2037cf08003e418aadda58f451c021f42" + resolved-ref: "92f62dc2037cf08003e418aadda58f451c021f42" url: "https://github.com/breez/breez-sdk-spark-flutter" source: git - version: "0.3.2" + version: "0.3.4" bs58check: dependency: transitive description: diff --git a/cw_bitcoin/pubspec.yaml b/cw_bitcoin/pubspec.yaml index 940ce80b6a..439492bda0 100644 --- a/cw_bitcoin/pubspec.yaml +++ b/cw_bitcoin/pubspec.yaml @@ -75,6 +75,7 @@ dependencies: breez_sdk_spark_flutter: git: url: https://github.com/breez/breez-sdk-spark-flutter + ref: 92f62dc2037cf08003e418aadda58f451c021f42 dev_dependencies: flutter_test: From e11f468212832856a44601096455e12ad27e2a02 Mon Sep 17 00:00:00 2001 From: OmarHatem Date: Sat, 1 Nov 2025 13:28:12 +0100 Subject: [PATCH 008/105] Add bitcoin secrets config [skip ci] --- .gitignore | 1 + scripts/android/app_env.sh | 4 ++-- tool/generate_secrets_config.dart | 3 +++ tool/import_secrets_config.dart | 3 +++ tool/utils/secret_key.dart | 4 ++++ 5 files changed, 13 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index cd2230504d..018d05ca22 100644 --- a/.gitignore +++ b/.gitignore @@ -97,6 +97,7 @@ android/app/key.jks **/tool/.solana-secrets-config.json **/tool/.nano-secrets-config.json **/tool/.tron-secrets-config.json +**/tool/.bitcoin-secrets-config.json **/lib/.secrets.g.dart **/cw_evm/lib/.secrets.g.dart **/cw_solana/lib/.secrets.g.dart diff --git a/scripts/android/app_env.sh b/scripts/android/app_env.sh index 21bf2c1e99..99e0380e07 100644 --- a/scripts/android/app_env.sh +++ b/scripts/android/app_env.sh @@ -21,8 +21,8 @@ MONERO_COM_PACKAGE="com.monero.app" MONERO_COM_SCHEME="monero.com" CAKEWALLET_NAME="Cake Wallet" -CAKEWALLET_VERSION="5.5.2" -CAKEWALLET_BUILD_NUMBER=4284 +CAKEWALLET_VERSION="5.6.0" +CAKEWALLET_BUILD_NUMBER=4285 CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet" CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet" CAKEWALLET_SCHEME="cakewallet" diff --git a/tool/generate_secrets_config.dart b/tool/generate_secrets_config.dart index 8e9762b7a0..0b32e60ad5 100644 --- a/tool/generate_secrets_config.dart +++ b/tool/generate_secrets_config.dart @@ -8,6 +8,7 @@ const evmChainsConfigPath = 'tool/.evm-secrets-config.json'; const solanaConfigPath = 'tool/.solana-secrets-config.json'; const nanoConfigPath = 'tool/.nano-secrets-config.json'; const tronConfigPath = 'tool/.tron-secrets-config.json'; +const bitcoinConfigPath = 'tool/.bitcoin-secrets-config.json'; Future main(List args) async => generateSecretsConfig(args); @@ -41,6 +42,7 @@ Future generateSecretsConfig(List args) async { final solanaConfigFile = File(solanaConfigPath); final nanoConfigFile = File(nanoConfigPath); final tronConfigFile = File(tronConfigPath); + final bitcoinConfigFile = File(bitcoinConfigPath); final secrets = {}; @@ -66,4 +68,5 @@ Future generateSecretsConfig(List args) async { await writeConfig(solanaConfigFile, SecretKey.solanaSecrets); await writeConfig(nanoConfigFile, SecretKey.nanoSecrets); await writeConfig(tronConfigFile, SecretKey.tronSecrets); + await writeConfig(bitcoinConfigFile, SecretKey.bitcoinSecrets); } diff --git a/tool/import_secrets_config.dart b/tool/import_secrets_config.dart index 42379021f5..dd333c7e2b 100644 --- a/tool/import_secrets_config.dart +++ b/tool/import_secrets_config.dart @@ -14,6 +14,9 @@ const solanaOutputPath = 'cw_solana/lib/.secrets.g.dart'; const tronConfigPath = 'tool/.tron-secrets-config.json'; const tronOutputPath = 'cw_tron/lib/.secrets.g.dart'; +const bitcoinConfigPath = 'tool/.bitcoin-secrets-config.json'; +const bitcoinOutputPath = 'cw_bitcoin/lib/.secrets.g.dart'; + const nanoConfigPath = 'tool/.nano-secrets-config.json'; const nanoOutputPath = 'cw_nano/lib/.secrets.g.dart'; diff --git a/tool/utils/secret_key.dart b/tool/utils/secret_key.dart index 61ccea60b9..8e6a6c6c9e 100644 --- a/tool/utils/secret_key.dart +++ b/tool/utils/secret_key.dart @@ -111,6 +111,10 @@ class SecretKey { SecretKey('tronNowNodesApiKey', () => ''), ]; + static final bitcoinSecrets = [ + SecretKey('breezApiKey', () => ''), + ]; + final String name; final String Function() generate; } From 0273df79977beca316cf91481e125403a7fcd43d Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Mon, 3 Nov 2025 19:46:02 +0100 Subject: [PATCH 009/105] feat: extend Lightning wallet functionality with transaction history fetching --- cw_bitcoin/lib/bitcoin_wallet.dart | 29 ++++++-- .../lib/lightning/lightning_addres_type.dart | 1 + .../lib/lightning/lightning_wallet.dart | 72 ++++++++++++++----- 3 files changed, 82 insertions(+), 20 deletions(-) diff --git a/cw_bitcoin/lib/bitcoin_wallet.dart b/cw_bitcoin/lib/bitcoin_wallet.dart index 561c31528d..9b212ff5f9 100644 --- a/cw_bitcoin/lib/bitcoin_wallet.dart +++ b/cw_bitcoin/lib/bitcoin_wallet.dart @@ -11,6 +11,7 @@ import 'package:cw_bitcoin/bitcoin_transaction_credentials.dart'; import 'package:cw_bitcoin/bitcoin_wallet_addresses.dart'; import 'package:cw_bitcoin/electrum_balance.dart'; import 'package:cw_bitcoin/electrum_derivations.dart'; +import 'package:cw_bitcoin/electrum_transaction_info.dart'; import 'package:cw_bitcoin/electrum_wallet.dart'; import 'package:cw_bitcoin/electrum_wallet_snapshot.dart'; import 'package:cw_bitcoin/hardware/bitcoin_hardware_wallet_service.dart'; @@ -119,7 +120,6 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { lightningWallet: lightningWallet, ); - if (lightningWallet != null) { walletAddresses.setLightningAddress(walletInfo.name); } @@ -296,7 +296,23 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { final lBalance = await lightningWallet!.getBalance(); - return ElectrumBalance(confirmed: balance.confirmed, unconfirmed: balance.unconfirmed, frozen: balance.frozen, secondConfirmed: lBalance.toInt()); + return ElectrumBalance( + confirmed: balance.confirmed, + unconfirmed: balance.unconfirmed, + frozen: balance.frozen, + secondConfirmed: lBalance.toInt(), + ); + } + + @override + Future> fetchTransactions() async { + if (lightningWallet != null) { + final lnHistory = await lightningWallet!.getTransactionHistory(); + transactionHistory.addMany(lnHistory); + await transactionHistory.save(); + } + + return super.fetchTransactions(); } late final LightningWallet? lightningWallet; @@ -379,9 +395,14 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { Future createTransaction(Object credentials) async { credentials = credentials as BitcoinTransactionCredentials; + final isLNCompatible = await lightningWallet?.isCompatible(credentials.outputs.first.address); if ((credentials.coinTypeToSpendFrom == UnspentCoinType.lightning && lightningWallet != null) || - (await lightningWallet?.isCompatible(credentials.outputs.first.address)) == true) { - final amount = parseFixed(credentials.outputs.first.cryptoAmount?.isNotEmpty == true ? credentials.outputs.first.cryptoAmount! : "0", 9); + isLNCompatible == true) { + final amount = parseFixed( + credentials.outputs.first.cryptoAmount?.isNotEmpty == true + ? credentials.outputs.first.cryptoAmount! + : "0", + 9); return lightningWallet!.createTransaction(credentials.outputs.first.address, amount > BigInt.zero ? amount : null, credentials.priority); diff --git a/cw_bitcoin/lib/lightning/lightning_addres_type.dart b/cw_bitcoin/lib/lightning/lightning_addres_type.dart index c12f980e77..f0b13fca18 100644 --- a/cw_bitcoin/lib/lightning/lightning_addres_type.dart +++ b/cw_bitcoin/lib/lightning/lightning_addres_type.dart @@ -5,6 +5,7 @@ class LightningAddressType implements BitcoinAddressType { static const LightningAddressType p2l = LightningAddressType._("Lightning"); static const String Bolt11InvoiceMatcher = r'^(lightning:)?(lnbc|lntb|lnbs|lnbcrt)[a-z0-9]+$'; + static const String Bolt12OfferMatcher = r'^(lightning:)?(lno1)[a-z0-9]+$'; @override bool get isP2sh => false; diff --git a/cw_bitcoin/lib/lightning/lightning_wallet.dart b/cw_bitcoin/lib/lightning/lightning_wallet.dart index b015f8d0c2..6ae40da518 100644 --- a/cw_bitcoin/lib/lightning/lightning_wallet.dart +++ b/cw_bitcoin/lib/lightning/lightning_wallet.dart @@ -1,7 +1,11 @@ import 'package:breez_sdk_spark_flutter/breez_sdk_spark.dart'; import 'package:cw_bitcoin/bitcoin_transaction_priority.dart'; +import 'package:cw_bitcoin/electrum_transaction_info.dart'; import 'package:cw_bitcoin/lightning/pending_lightning_transaction.dart'; import 'package:cw_core/pending_transaction.dart'; +import 'package:cw_core/transaction_direction.dart'; +import 'package:cw_core/utils/print_verbose.dart'; +import 'package:cw_core/wallet_type.dart'; bool _breezSdkSparkLibUninitialized = true; @@ -42,17 +46,16 @@ class LightningWallet { Future getAddress() async => (await sdk.getLightningAddress())?.lightningAddress; - Future getDepositAddress() async => - (await sdk.receivePayment( + Future getDepositAddress() async => (await sdk.receivePayment( request: ReceivePaymentRequest(paymentMethod: ReceivePaymentMethod.bitcoinAddress()))) - .paymentRequest; + .paymentRequest; Future getBalance() async => (await sdk.getInfo(request: GetInfoRequest(ensureSynced: true))).balanceSats; Future registerAddress(String username) async { return (await sdk.registerLightningAddress( - request: RegisterLightningAddressRequest(username: username))) + request: RegisterLightningAddressRequest(username: username))) .lightningAddress; } @@ -65,8 +68,8 @@ class LightningWallet { } } - Future createTransaction(String address, BigInt? amountSats, - BitcoinTransactionPriority? priority) async { + Future createTransaction( + String address, BigInt? amountSats, BitcoinTransactionPriority? priority) async { final inputType = await sdk.parse(input: address); if (inputType is InputType_Bolt11Invoice) { @@ -76,17 +79,18 @@ class LightningWallet { final paymentMethod = prepareResponse.paymentMethod; if (paymentMethod is SendPaymentMethod_Bolt11Invoice) { - // Fees to pay via Lightning final lightningFeeSats = paymentMethod.lightningFeeSats; - // Or fees to pay (if available) via a Spark transfer final sparkTransferFeeSats = paymentMethod.sparkTransferFeeSats; return PendingLightningTransaction( id: paymentMethod.invoiceDetails.paymentHash, amount: ((paymentMethod.invoiceDetails.amountMsat?.toInt() ?? 0) / 1000).round(), fee: lightningFeeSats.toInt() + (sparkTransferFeeSats?.toInt() ?? 0), - commitOverride: () => - sdk.sendPayment(request: SendPaymentRequest(prepareResponse: prepareResponse)), + commitOverride: () async { + final res = await sdk.sendPayment( + request: SendPaymentRequest(prepareResponse: prepareResponse)); + printV(res.payment.status.name); + }, ); } } else if (inputType is InputType_LightningAddress) { @@ -105,20 +109,21 @@ class LightningWallet { id: prepareResponse.invoiceDetails.paymentHash, amount: prepareResponse.invoiceDetails.amountMsat?.toInt() ?? 0, fee: feeSats.toInt(), - commitOverride: () => - sdk.lnurlPay(request: LnurlPayRequest(prepareResponse: prepareResponse)), + commitOverride: () async { + await sdk.lnurlPay(request: LnurlPayRequest(prepareResponse: prepareResponse)); + }, ); } else if (inputType is InputType_BitcoinAddress) { - final request = PrepareSendPaymentRequest( - paymentRequest: inputType.field0.address, amount: amountSats); + final request = + PrepareSendPaymentRequest(paymentRequest: inputType.field0.address, amount: amountSats); final prepareResponse = await sdk.prepareSendPayment(request: request); final paymentMethod = prepareResponse.paymentMethod; if (paymentMethod is SendPaymentMethod_BitcoinAddress) { final feeQuote = paymentMethod.feeQuote; + OnchainConfirmationSpeed onchainConfirmationSpeed; int fee; - switch (priority) { case BitcoinTransactionPriority.fast: fee = (feeQuote.speedFast.userFeeSat + feeQuote.speedFast.l1BroadcastFeeSat).toInt(); @@ -152,6 +157,41 @@ class LightningWallet { // If not returned earlier throw UnimplementedError(); } + + Future> getTransactionHistory() async { + final request = ListPaymentsRequest( + typeFilter: [PaymentType.send, PaymentType.receive], + // statusFilter: [PaymentStatus.completed], + assetFilter: AssetFilter.bitcoin(), + offset: 0, + limit: 50, + sortAscending: false, // Sort order (true = oldest first, false = newest first) + ); + final response = await sdk.listPayments(request: request); + final payments = response.payments; + + Map txHistory = {}; + for (final payment in payments) { + TransactionDirection direction = TransactionDirection.outgoing; + + if (payment.method == PaymentMethod.deposit) { + direction = TransactionDirection.incoming; + } + + txHistory[payment.id] = ElectrumTransactionInfo( + WalletType.bitcoin, + id: payment.id, + amount: payment.amount.toInt(), + direction: direction, + isPending: payment.status == PaymentStatus.pending, + date: DateTime.fromMillisecondsSinceEpoch(payment.timestamp.toInt() * 1000), + confirmations: payment.status == PaymentStatus.pending ? 0 : 10, + + ); + } + + return txHistory; + } } extension _ConfigCopyWith on Config { @@ -172,6 +212,6 @@ extension _ConfigCopyWith on Config { maxDepositClaimFee: maxDepositClaimFee ?? this.maxDepositClaimFee, preferSparkOverLightning: preferSparkOverLightning ?? this.preferSparkOverLightning, useDefaultExternalInputParsers: - useDefaultExternalInputParsers ?? this.useDefaultExternalInputParsers, + useDefaultExternalInputParsers ?? this.useDefaultExternalInputParsers, ); } From 3f507e51d16bbebf63faee8a2d32cb0453140864 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Tue, 4 Nov 2025 10:06:01 +0100 Subject: [PATCH 010/105] feat: add LNURL-pay address detection and support in address parsing flow for Bitcoin Lightning integration --- lib/core/address_validator.dart | 1 + lib/entities/lnurlpay_record.dart | 75 +++++++++++++++++++ lib/entities/parse_address_from_domain.dart | 9 +++ lib/entities/parsed_address.dart | 11 ++- .../widgets/extract_address_from_parsed.dart | 5 ++ 5 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 lib/entities/lnurlpay_record.dart diff --git a/lib/core/address_validator.dart b/lib/core/address_validator.dart index df072f8a32..c700835341 100644 --- a/lib/core/address_validator.dart +++ b/lib/core/address_validator.dart @@ -19,6 +19,7 @@ class AddressValidator extends TextValidator { r'^(lightning:)?(lnbc|lntb|lnbs|lnbcrt)[a-z0-9]+$', caseSensitive: false); if (lightningInvoiceRegex.hasMatch(txt)) return true; + if (txt.contains("@")) return true; return BitcoinAddressUtils.validateAddress( address: txt, diff --git a/lib/entities/lnurlpay_record.dart b/lib/entities/lnurlpay_record.dart new file mode 100644 index 0000000000..3fbb01bc3a --- /dev/null +++ b/lib/entities/lnurlpay_record.dart @@ -0,0 +1,75 @@ +import 'dart:convert'; + +import 'package:cw_core/crypto_currency.dart'; +import 'package:cw_core/utils/print_verbose.dart'; +import 'package:cw_core/utils/proxy_wrapper.dart'; + +class LNUrlPayRecord { + LNUrlPayRecord({ + required this.address, + required this.name, + }); + + final String name; + final String address; + + static Future checkWellKnownUsername(String username, CryptoCurrency currency) async { + if (currency != CryptoCurrency.btc) return null; + + // split the string by the @ symbol: + try { + final List splitStrs = username.split("@"); + String name = splitStrs.first.toLowerCase(); + final String domain = splitStrs.last; + + if (splitStrs.length == 3) { + // for username like @alice@domain.org instead of alice@domain.org + name = splitStrs[1]; + } + + if (name.isEmpty) { + name = "_"; + } + + // lookup domain/.well-known/nano-currency.json and check if it has a nano address: + final response = await ProxyWrapper().get( + clearnetUri: Uri.parse("https://$domain/.well-known/lnurlp/$name"), + headers: {"Accept": "application/json"}, + ); + + if (response.statusCode == 200) { + return username; + } + } catch (e) { + printV("error checking well-known username: $e"); + } + return null; + } + + static String formatDomainName(String name) { + String formattedName = name; + + if (name.contains("@")) { + formattedName = name.replaceAll("@", "."); + } + + return formattedName; + } + + static Future fetchAddressAndName({ + required String formattedName, + required CryptoCurrency currency, + }) async { + String name = formattedName; + + printV("formattedName: $formattedName"); + + final address = await checkWellKnownUsername(formattedName, currency); + + if (address == null) { + return null; + } + + return LNUrlPayRecord(address: address, name: name); + } +} diff --git a/lib/entities/parse_address_from_domain.dart b/lib/entities/parse_address_from_domain.dart index 4428108752..a772f49514 100644 --- a/lib/entities/parse_address_from_domain.dart +++ b/lib/entities/parse_address_from_domain.dart @@ -1,6 +1,7 @@ import 'package:cake_wallet/core/address_validator.dart'; import 'package:cake_wallet/core/yat_service.dart'; import 'package:cake_wallet/entities/ens_record.dart'; +import 'package:cake_wallet/entities/lnurlpay_record.dart'; import 'package:cake_wallet/entities/openalias_record.dart'; import 'package:cake_wallet/entities/parsed_address.dart'; import 'package:cake_wallet/entities/unstoppable_domain_address.dart'; @@ -297,6 +298,14 @@ class AddressResolver { return ParsedAddress.fetchWellKnownAddress(address: record.address, name: text); } } + + if (walletType == WalletType.bitcoin && currency == CryptoCurrency.btc) { + final record = + await LNUrlPayRecord.fetchAddressAndName(formattedName: text, currency: currency); + if (record != null) { + return ParsedAddress.fetchLNUrlPayAddress(address: record.address, name: text); + } + } } if (!text.startsWith('@') && text.contains('@') && !text.contains('.')) { diff --git a/lib/entities/parsed_address.dart b/lib/entities/parsed_address.dart index 74acab80a7..a5159cbcf0 100644 --- a/lib/entities/parsed_address.dart +++ b/lib/entities/parsed_address.dart @@ -15,7 +15,8 @@ enum ParseFrom { thorChain, wellKnown, zanoAlias, - bip353 + bip353, + lnurlpay } class ParsedAddress { @@ -175,6 +176,14 @@ class ParsedAddress { ); } + factory ParsedAddress.fetchLNUrlPayAddress({required String address, required String name}) { + return ParsedAddress( + addresses: [address], + name: name, + parseFrom: ParseFrom.lnurlpay, + ); + } + final List addresses; final String name; final String description; diff --git a/lib/src/screens/send/widgets/extract_address_from_parsed.dart b/lib/src/screens/send/widgets/extract_address_from_parsed.dart index b37f87b7ff..74b7439356 100644 --- a/lib/src/screens/send/widgets/extract_address_from_parsed.dart +++ b/lib/src/screens/send/widgets/extract_address_from_parsed.dart @@ -78,6 +78,11 @@ Future extractAddressFromParsed( content = S.of(context).extracted_address_content('${parsedAddress.name} (BIP-353)'); address = parsedAddress.addresses.first; break; + case ParseFrom.lnurlpay: + title = S.of(context).address_detected; + content = S.of(context).extracted_address_content('${parsedAddress.name} (Lightning)'); + address = parsedAddress.addresses.first; + break; case ParseFrom.yatRecord: if (parsedAddress.name.isEmpty) { title = S.of(context).yat_error; From 3b139de3d44138cbdfbdcb4eae8264408785fdeb Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Tue, 4 Nov 2025 14:43:22 +0100 Subject: [PATCH 011/105] refactor: simplify `ReceivePageOption` logic --- cw_bitcoin/lib/bitcoin_wallet.dart | 2 + cw_bitcoin/lib/bitcoin_wallet_addresses.dart | 16 ++++ cw_bitcoin/lib/litecoin_wallet_addresses.dart | 20 ++++- {lib/core => cw_core/lib}/payment_uris.dart | 79 +++++-------------- cw_core/lib/wallet_addresses.dart | 8 +- cw_core/pubspec.yaml | 3 +- cw_decred/lib/wallet.dart | 2 +- cw_decred/lib/wallet_addresses.dart | 25 +++--- lib/bitcoin/cw_bitcoin.dart | 24 ------ .../screens/dashboard/pages/address_page.dart | 3 +- .../screens/receive/widgets/qr_widget.dart | 2 +- lib/utils/payment_request.dart | 2 +- .../dashboard/receive_option_view_model.dart | 48 ++--------- .../exchange/exchange_trade_view_model.dart | 2 +- .../wallet_address_list_view_model.dart | 2 +- tool/configure.dart | 2 - 16 files changed, 89 insertions(+), 151 deletions(-) rename {lib/core => cw_core/lib}/payment_uris.dart (87%) diff --git a/cw_bitcoin/lib/bitcoin_wallet.dart b/cw_bitcoin/lib/bitcoin_wallet.dart index 9b212ff5f9..304618e714 100644 --- a/cw_bitcoin/lib/bitcoin_wallet.dart +++ b/cw_bitcoin/lib/bitcoin_wallet.dart @@ -101,6 +101,8 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { apiKey: secrets.breezApiKey, lnurlDomain: "breez.tips", ); + } else { + lightningWallet = null; } payjoinManager = PayjoinManager(PayjoinStorage(payjoinBox), this); diff --git a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart index 8e36ffebf8..91308f630e 100644 --- a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart +++ b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart @@ -1,8 +1,10 @@ import 'package:bitcoin_base/bitcoin_base.dart'; import 'package:blockchain_utils/bip/bip/bip32/bip32.dart'; +import 'package:cw_bitcoin/bitcoin_receive_page_option.dart'; import 'package:cw_bitcoin/electrum_wallet_addresses.dart'; import 'package:cw_bitcoin/payjoin/manager.dart'; import 'package:cw_bitcoin/utils.dart'; +import 'package:cw_core/receive_page_option.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_info.dart'; @@ -89,4 +91,18 @@ abstract class BitcoinWalletAddressesBase extends ElectrumWalletAddresses with S if (!_isPayjoinConnectivityError(e.toString())) rethrow; } } + + @override + List get receivePageOptions { + if (isHardwareWallet) { + return [ + ...BitcoinReceivePageOption.allViewOnly, + ...ReceivePageOptions.where((element) => element != ReceivePageOption.mainnet) + ]; + } + return [ + ...BitcoinReceivePageOption.all, + ...ReceivePageOptions.where((element) => element != ReceivePageOption.mainnet) + ]; + } } diff --git a/cw_bitcoin/lib/litecoin_wallet_addresses.dart b/cw_bitcoin/lib/litecoin_wallet_addresses.dart index 76228c16de..2095d4bd4e 100644 --- a/cw_bitcoin/lib/litecoin_wallet_addresses.dart +++ b/cw_bitcoin/lib/litecoin_wallet_addresses.dart @@ -5,9 +5,11 @@ import 'dart:typed_data'; import 'package:bitcoin_base/bitcoin_base.dart'; import 'package:blockchain_utils/blockchain_utils.dart'; import 'package:cw_bitcoin/bitcoin_address_record.dart'; +import 'package:cw_bitcoin/bitcoin_receive_page_option.dart'; import 'package:cw_bitcoin/bitcoin_unspent.dart'; -import 'package:cw_bitcoin/utils.dart'; import 'package:cw_bitcoin/electrum_wallet_addresses.dart'; +import 'package:cw_bitcoin/utils.dart'; +import 'package:cw_core/receive_page_option.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_info.dart'; @@ -46,6 +48,7 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with bool generating = false; List get scanSecret => mwebHd!.childKey(Bip32KeyIndex(0x80000000)).privateKey.privKey.raw; + List get spendPubkey => mwebHd!.childKey(Bip32KeyIndex(0x80000001)).publicKey.pubKey.compressed; @@ -208,4 +211,19 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with .where((element) => element.type == SegwitAddresType.p2wpkh && !element.isUsed); return addresses.first.address; } + + @override + List get receivePageOptions { + if (Platform.isLinux || Platform.isMacOS || Platform.isWindows || isHardwareWallet) { + return [ + ...BitcoinReceivePageOption.allLitecoin + .where((element) => element != BitcoinReceivePageOption.mweb), + ...ReceivePageOptions.where((element) => element != ReceivePageOption.mainnet) + ]; + } + return [ + ...BitcoinReceivePageOption.allLitecoin, + ...ReceivePageOptions.where((element) => element != ReceivePageOption.mainnet) + ]; + } } diff --git a/lib/core/payment_uris.dart b/cw_core/lib/payment_uris.dart similarity index 87% rename from lib/core/payment_uris.dart rename to cw_core/lib/payment_uris.dart index 38f4f6d2ef..fc2bd2b880 100644 --- a/lib/core/payment_uris.dart +++ b/cw_core/lib/payment_uris.dart @@ -13,10 +13,7 @@ class MoneroURI extends PaymentURI { @override String toString() { var base = 'monero:$address'; - - if (amount.isNotEmpty) { - base += '?tx_amount=${amount.replaceAll(',', '.')}'; - } + if (amount.isNotEmpty) base += '?tx_amount=${amount.replaceAll(',', '.')}'; return base; } @@ -28,10 +25,7 @@ class HavenURI extends PaymentURI { @override String toString() { var base = 'haven:$address'; - - if (amount.isNotEmpty) { - base += '?tx_amount=${amount.replaceAll(',', '.')}'; - } + if (amount.isNotEmpty) base += '?tx_amount=${amount.replaceAll(',', '.')}'; return base; } @@ -62,10 +56,7 @@ class LitecoinURI extends PaymentURI { @override String toString() { var base = 'litecoin:$address'; - - if (amount.isNotEmpty) { - base += '?amount=${amount.replaceAll(',', '.')}'; - } + if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; return base; } @@ -77,10 +68,7 @@ class EthereumURI extends PaymentURI { @override String toString() { var base = 'ethereum:$address'; - - if (amount.isNotEmpty) { - base += '?amount=${amount.replaceAll(',', '.')}'; - } + if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; return base; } @@ -92,10 +80,7 @@ class BaseURI extends PaymentURI { @override String toString() { var base = 'base:$address'; - - if (amount.isNotEmpty) { - base += '?amount=${amount.replaceAll(',', '.')}'; - } + if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; return base; } @@ -122,10 +107,7 @@ class BitcoinCashURI extends PaymentURI { @override String toString() { var base = address; - - if (amount.isNotEmpty) { - base += '?amount=${amount.replaceAll(',', '.')}'; - } + if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; return base; } @@ -151,10 +133,7 @@ class PolygonURI extends PaymentURI { @override String toString() { var base = 'polygon:$address'; - - if (amount.isNotEmpty) { - base += '?amount=${amount.replaceAll(',', '.')}'; - } + if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; return base; } @@ -166,10 +145,7 @@ class SolanaURI extends PaymentURI { @override String toString() { var base = 'solana:$address'; - - if (amount.isNotEmpty) { - base += '?amount=${amount.replaceAll(',', '.')}'; - } + if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; return base; } @@ -181,10 +157,7 @@ class TronURI extends PaymentURI { @override String toString() { var base = 'tron:$address'; - - if (amount.isNotEmpty) { - base += '?amount=${amount.replaceAll(',', '.')}'; - } + if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; return base; } @@ -196,10 +169,7 @@ class WowneroURI extends PaymentURI { @override String toString() { var base = 'wownero:$address'; - - if (amount.isNotEmpty) { - base += '?tx_amount=${amount.replaceAll(',', '.')}'; - } + if (amount.isNotEmpty) base += '?tx_amount=${amount.replaceAll(',', '.')}'; return base; } @@ -211,11 +181,8 @@ class ZanoURI extends PaymentURI { @override String toString() { - var base = 'zano:' + address; - - if (amount.isNotEmpty) { - base += '?amount=${amount.replaceAll(',', '.')}'; - } + var base = 'zano:$address'; + if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; return base; } @@ -227,11 +194,8 @@ class DecredURI extends PaymentURI { @override String toString() { - var base = 'decred:' + address; - - if (amount.isNotEmpty) { - base += '?amount=${amount.replaceAll(',', '.')}'; - } + var base = 'decred:$address'; + if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; return base; } @@ -243,11 +207,8 @@ class DogeURI extends PaymentURI { @override String toString() { - var base = 'doge:' + address; - - if (amount.isNotEmpty) { - base += '?amount=${amount.replaceAll(',', '.')}'; - } + var base = 'doge:$address'; + if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; return base; } @@ -271,13 +232,9 @@ class ERC681URI extends PaymentURI { final targetAddress = contractAddress ?? address; uri += targetAddress; - if (chainId != 1) { - uri += '@$chainId'; - } + if (chainId != 1) uri += '@$chainId'; - if (contractAddress != null) { - uri += '/transfer'; - } + if (contractAddress != null) uri += '/transfer'; final params = {}; diff --git a/cw_core/lib/wallet_addresses.dart b/cw_core/lib/wallet_addresses.dart index 4d4d2c0a5a..ac4128e427 100644 --- a/cw_core/lib/wallet_addresses.dart +++ b/cw_core/lib/wallet_addresses.dart @@ -1,9 +1,10 @@ +import 'package:cw_core/receive_page_option.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_type.dart'; abstract class WalletAddresses { - WalletAddresses(this.walletInfo) + WalletAddresses(this.walletInfo, [this.isTestnet = false]) : addressesMap = {}, allAddressesMap = {}, addressInfos = {}, @@ -17,6 +18,8 @@ abstract class WalletAddresses { final WalletInfo walletInfo; + final bool isTestnet; + String get address; String get latestAddress { @@ -79,4 +82,7 @@ abstract class WalletAddresses { bool containsAddress(String address) => addressesMap.containsKey(address) || allAddressesMap.containsKey(address); + + List get receivePageOptions => ReceivePageOptions; + } diff --git a/cw_core/pubspec.yaml b/cw_core/pubspec.yaml index 7c963f246e..49188f5177 100644 --- a/cw_core/pubspec.yaml +++ b/cw_core/pubspec.yaml @@ -2,11 +2,10 @@ name: cw_core description: A new Flutter package project. version: 0.0.1 publish_to: none -author: Cake Wallet homepage: https://cakewallet.com environment: - sdk: ">=2.17.5 <3.0.0" + sdk: '>=3.0.6 <4.0.0' flutter: ">=1.20.0" dependencies: diff --git a/cw_decred/lib/wallet.dart b/cw_decred/lib/wallet.dart index 432edb4bc0..97c118331b 100644 --- a/cw_decred/lib/wallet.dart +++ b/cw_decred/lib/wallet.dart @@ -54,7 +54,7 @@ abstract class DecredWalletBase derivationInfo.derivationPath == DecredWalletService.pubkeyRestorePathTestnet, super(walletInfo, derivationInfo) { - walletAddresses = DecredWalletAddresses(walletInfo, libwallet); + walletAddresses = DecredWalletAddresses(walletInfo, libwallet, isTestnet); transactionHistory = DecredTransactionHistory(); reaction((_) => isEnabledAutoGenerateSubaddress, (bool enabled) { diff --git a/cw_decred/lib/wallet_addresses.dart b/cw_decred/lib/wallet_addresses.dart index e4af108b9d..96f007c5cc 100644 --- a/cw_decred/lib/wallet_addresses.dart +++ b/cw_decred/lib/wallet_addresses.dart @@ -1,8 +1,8 @@ import 'dart:convert'; +import 'package:cw_core/receive_page_option.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:mobx/mobx.dart'; -import 'package:cw_core/address_info.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:cw_decred/api/libdcrwallet.dart'; @@ -12,9 +12,8 @@ part 'wallet_addresses.g.dart'; class DecredWalletAddresses = DecredWalletAddressesBase with _$DecredWalletAddresses; abstract class DecredWalletAddressesBase extends WalletAddresses with Store { - DecredWalletAddressesBase(WalletInfo walletInfo, Libwallet libwallet) - : _libwallet = libwallet, - super(walletInfo); + DecredWalletAddressesBase(super.walletInfo, Libwallet libwallet, super.isTestnet) + : _libwallet = libwallet; final Libwallet _libwallet; String currentAddr = ''; @@ -26,14 +25,10 @@ abstract class DecredWalletAddressesBase extends WalletAddresses with Store { @override @computed - String get address { - return selectedAddr; - } + String get address => selectedAddr; @override - set address(value) { - selectedAddr = value; - } + set address(value) => selectedAddr = value; @override Future init() async { @@ -145,6 +140,16 @@ abstract class DecredWalletAddressesBase extends WalletAddresses with Store { selectedAddr = addr; await saveAddressesInBox(); } + + @override + List get receivePageOptions { + return isTestnet + ? [ + ReceivePageOption.testnet, + ...ReceivePageOptions.where((element) => element != ReceivePageOption.mainnet) + ] + : ReceivePageOptions; + } } class LibAddresses { diff --git a/lib/bitcoin/cw_bitcoin.dart b/lib/bitcoin/cw_bitcoin.dart index 27ffcef0d0..d26bc20e08 100644 --- a/lib/bitcoin/cw_bitcoin.dart +++ b/lib/bitcoin/cw_bitcoin.dart @@ -304,30 +304,6 @@ class CWBitcoin extends Bitcoin { return bitcoinWallet.walletAddresses.addressPageType == SilentPaymentsAddresType.p2sp; } - @override - List getBitcoinReceivePageOptions(Object wallet) { - final bitcoinWallet = wallet as ElectrumWallet; - final keys = bitcoinWallet.keys; - if (keys.privateKey.isEmpty) { - return BitcoinReceivePageOption.allViewOnly; - } - return BitcoinReceivePageOption.all; - } - - @override - List getLitecoinReceivePageOptions(Object wallet) { - final litecoinWallet = wallet as ElectrumWallet; - if (Platform.isLinux || - Platform.isMacOS || - Platform.isWindows || - litecoinWallet.isHardwareWallet) { - return BitcoinReceivePageOption.allLitecoin - .where((element) => element != BitcoinReceivePageOption.mweb) - .toList(); - } - return BitcoinReceivePageOption.allLitecoin; - } - @override BitcoinAddressType getBitcoinAddressType(ReceivePageOption option) { switch (option) { diff --git a/lib/src/screens/dashboard/pages/address_page.dart b/lib/src/screens/dashboard/pages/address_page.dart index c7e5c8793c..d4a71e37c0 100644 --- a/lib/src/screens/dashboard/pages/address_page.dart +++ b/lib/src/screens/dashboard/pages/address_page.dart @@ -306,8 +306,7 @@ class AddressPage extends BasePage { } break; default: - if (addressListViewModel.type == WalletType.bitcoin || - addressListViewModel.type == WalletType.litecoin) { + if ([WalletType.bitcoin, WalletType.litecoin].contains(addressListViewModel.type)) { addressListViewModel.setAddressType(bitcoin!.getBitcoinAddressType(option)); } } diff --git a/lib/src/screens/receive/widgets/qr_widget.dart b/lib/src/screens/receive/widgets/qr_widget.dart index 6a40850b64..7e4df944c8 100644 --- a/lib/src/screens/receive/widgets/qr_widget.dart +++ b/lib/src/screens/receive/widgets/qr_widget.dart @@ -1,4 +1,4 @@ -import 'package:cake_wallet/core/payment_uris.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cake_wallet/entities/qr_view_data.dart'; import 'package:cake_wallet/src/widgets/primary_button.dart'; import 'package:cake_wallet/routes.dart'; diff --git a/lib/utils/payment_request.dart b/lib/utils/payment_request.dart index b574ab260d..6149379d71 100644 --- a/lib/utils/payment_request.dart +++ b/lib/utils/payment_request.dart @@ -1,4 +1,4 @@ -import 'package:cake_wallet/core/payment_uris.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cake_wallet/nano/nano.dart'; class PaymentRequest { diff --git a/lib/view_model/dashboard/receive_option_view_model.dart b/lib/view_model/dashboard/receive_option_view_model.dart index 8aab2736d6..69b47e7b9f 100644 --- a/lib/view_model/dashboard/receive_option_view_model.dart +++ b/lib/view_model/dashboard/receive_option_view_model.dart @@ -11,59 +11,21 @@ class ReceiveOptionViewModel = ReceiveOptionViewModelBase with _$ReceiveOptionVi abstract class ReceiveOptionViewModelBase with Store { ReceiveOptionViewModelBase(this._wallet, this.initialPageOption) : selectedReceiveOption = initialPageOption ?? - (_wallet.type == WalletType.bitcoin || - _wallet.type == WalletType.litecoin + ([WalletType.bitcoin, WalletType.litecoin].contains(_wallet.type) ? bitcoin!.getSelectedAddressType(_wallet) - : (_wallet.type == WalletType.decred && _wallet.isTestnet) + : (_wallet.type == WalletType.decred && _wallet.isTestnet) ? ReceivePageOption.testnet - : ReceivePageOption.mainnet), - _options = [] { - final walletType = _wallet.type; - switch (walletType) { - case WalletType.bitcoin: - _options = [ - ...bitcoin!.getBitcoinReceivePageOptions(_wallet), - ...ReceivePageOptions.where((element) => element != ReceivePageOption.mainnet) - ]; - break; - case WalletType.litecoin: - _options = [ - ...bitcoin!.getLitecoinReceivePageOptions(_wallet), - ...ReceivePageOptions.where((element) => element != ReceivePageOption.mainnet) - ]; - break; - case WalletType.haven: - _options = [ReceivePageOption.mainnet]; - break; - case WalletType.decred: - if (_wallet.isTestnet) { - _options = [ - ReceivePageOption.testnet, - ...ReceivePageOptions.where( - (element) => element != ReceivePageOption.mainnet) - ]; - } else { - _options = ReceivePageOptions; - } - break; - default: - _options = ReceivePageOptions; - } - } + : ReceivePageOption.mainnet); final WalletBase _wallet; final ReceivePageOption? initialPageOption; - List _options; - @observable ReceivePageOption selectedReceiveOption; - List get options => _options; + List get options => _wallet.walletAddresses.receivePageOptions; @action - void selectReceiveOption(ReceivePageOption option) { - selectedReceiveOption = option; - } + void selectReceiveOption(ReceivePageOption option) => selectedReceiveOption = option; } diff --git a/lib/view_model/exchange/exchange_trade_view_model.dart b/lib/view_model/exchange/exchange_trade_view_model.dart index fec47f3f35..3f4240cf21 100644 --- a/lib/view_model/exchange/exchange_trade_view_model.dart +++ b/lib/view_model/exchange/exchange_trade_view_model.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'package:cake_wallet/core/payment_uris.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cake_wallet/entities/calculate_fiat_amount.dart'; import 'package:cake_wallet/entities/fiat_currency.dart'; import 'package:cake_wallet/exchange/exchange_provider_description.dart'; diff --git a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart index fd6b29bdd5..adc60cad02 100644 --- a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart +++ b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart @@ -4,7 +4,7 @@ import 'dart:core'; import 'package:cake_wallet/base/base.dart'; import 'package:cake_wallet/bitcoin/bitcoin.dart'; import 'package:cake_wallet/core/fiat_conversion_service.dart'; -import 'package:cake_wallet/core/payment_uris.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cake_wallet/core/wallet_change_listener_view_model.dart'; import 'package:cake_wallet/entities/auto_generate_subaddress_status.dart'; import 'package:cake_wallet/entities/fiat_api_mode.dart'; diff --git a/tool/configure.dart b/tool/configure.dart index dbca11d49f..7534457aca 100644 --- a/tool/configure.dart +++ b/tool/configure.dart @@ -228,8 +228,6 @@ abstract class Bitcoin { Map> getElectrumDerivations(); Future setAddressType(Object wallet, dynamic option); ReceivePageOption getSelectedAddressType(Object wallet); - List getBitcoinReceivePageOptions(Object wallet); - List getLitecoinReceivePageOptions(Object wallet); BitcoinAddressType getBitcoinAddressType(ReceivePageOption option); bool isPayjoinAvailable(Object wallet); bool hasSelectedSilentPayments(Object wallet); From 0c0b04cee9fa47322fe0f127abbe747f653aee30 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Tue, 4 Nov 2025 16:24:15 +0100 Subject: [PATCH 012/105] refactor: centralize `PaymentURI` generation logic across wallet types --- cw_bitcoin/lib/bitcoin_wallet_addresses.dart | 5 +++++ cw_bitcoin/lib/electrum_wallet_addresses.dart | 4 ++++ cw_bitcoin/lib/litecoin_wallet_addresses.dart | 4 ++++ .../lib/src/bitcoin_cash_wallet_addresses.dart | 4 ++++ cw_core/lib/payment_uris.dart | 12 ------------ cw_core/lib/wallet_addresses.dart | 6 ++++-- cw_decred/lib/wallet_addresses.dart | 4 ++++ .../lib/src/dogecoin_wallet_addresses.dart | 4 ++++ cw_evm/lib/evm_chain_wallet.dart | 2 +- cw_evm/lib/evm_chain_wallet_addresses.dart | 17 ++++++++++++++++- cw_monero/lib/monero_wallet_addresses.dart | 5 ++++- cw_nano/lib/nano_wallet_addresses.dart | 5 +++++ cw_solana/lib/solana_wallet_addresses.dart | 4 ++++ cw_tron/lib/tron_wallet_addresses.dart | 4 ++++ cw_wownero/lib/wownero_wallet_addresses.dart | 6 ++++-- cw_zano/lib/zano_wallet_addresses.dart | 5 ++++- .../exchange/exchange_trade_view_model.dart | 2 -- 17 files changed, 71 insertions(+), 22 deletions(-) diff --git a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart index 91308f630e..3f572e2401 100644 --- a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart +++ b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart @@ -4,6 +4,7 @@ import 'package:cw_bitcoin/bitcoin_receive_page_option.dart'; import 'package:cw_bitcoin/electrum_wallet_addresses.dart'; import 'package:cw_bitcoin/payjoin/manager.dart'; import 'package:cw_bitcoin/utils.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/receive_page_option.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/utils/print_verbose.dart'; @@ -105,4 +106,8 @@ abstract class BitcoinWalletAddressesBase extends ElectrumWalletAddresses with S ...ReceivePageOptions.where((element) => element != ReceivePageOption.mainnet) ]; } + + @override + PaymentURI getPaymentUri(String amount) => + BitcoinURI(amount: amount, address: address, pjUri: payjoinEndpoint ?? ''); } diff --git a/cw_bitcoin/lib/electrum_wallet_addresses.dart b/cw_bitcoin/lib/electrum_wallet_addresses.dart index 7ef455793f..18de7eb3ad 100644 --- a/cw_bitcoin/lib/electrum_wallet_addresses.dart +++ b/cw_bitcoin/lib/electrum_wallet_addresses.dart @@ -7,6 +7,7 @@ import 'package:cw_bitcoin/bitcoin_unspent.dart'; import 'package:cw_bitcoin/lightning/lightning_addres_type.dart'; import 'package:cw_bitcoin/lightning/lightning_wallet.dart'; import 'package:cw_core/pathForWallet.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_addresses.dart'; @@ -765,4 +766,7 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { await lightningWallet!.registerAddress(walletName.replaceAll(" ", "").toLowerCase()); } } + + @override + PaymentURI getPaymentUri(String amount) => BitcoinURI(amount: amount, address: address); } diff --git a/cw_bitcoin/lib/litecoin_wallet_addresses.dart b/cw_bitcoin/lib/litecoin_wallet_addresses.dart index 2095d4bd4e..8d6e24b5f8 100644 --- a/cw_bitcoin/lib/litecoin_wallet_addresses.dart +++ b/cw_bitcoin/lib/litecoin_wallet_addresses.dart @@ -9,6 +9,7 @@ import 'package:cw_bitcoin/bitcoin_receive_page_option.dart'; import 'package:cw_bitcoin/bitcoin_unspent.dart'; import 'package:cw_bitcoin/electrum_wallet_addresses.dart'; import 'package:cw_bitcoin/utils.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/receive_page_option.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/utils/print_verbose.dart'; @@ -226,4 +227,7 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with ...ReceivePageOptions.where((element) => element != ReceivePageOption.mainnet) ]; } + + @override + PaymentURI getPaymentUri(String amount) => LitecoinURI(amount: amount, address: address); } diff --git a/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_addresses.dart b/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_addresses.dart index fe0ebc8284..681fc00d73 100644 --- a/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_addresses.dart +++ b/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_addresses.dart @@ -2,6 +2,7 @@ import 'package:bitcoin_base/bitcoin_base.dart'; import 'package:blockchain_utils/blockchain_utils.dart'; import 'package:cw_bitcoin/electrum_wallet_addresses.dart'; import 'package:cw_bitcoin/utils.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:mobx/mobx.dart'; @@ -28,4 +29,7 @@ abstract class BitcoinCashWalletAddressesBase extends ElectrumWalletAddresses wi required Bip32Slip10Secp256k1 hd, BitcoinAddressType? addressType}) => generateP2PKHAddress(hd: hd, index: index, network: network); + + @override + PaymentURI getPaymentUri(String amount) => BitcoinCashURI(amount: amount, address: address); } diff --git a/cw_core/lib/payment_uris.dart b/cw_core/lib/payment_uris.dart index fc2bd2b880..b4ba788e51 100644 --- a/cw_core/lib/payment_uris.dart +++ b/cw_core/lib/payment_uris.dart @@ -19,18 +19,6 @@ class MoneroURI extends PaymentURI { } } -class HavenURI extends PaymentURI { - HavenURI({required super.amount, required super.address}); - - @override - String toString() { - var base = 'haven:$address'; - if (amount.isNotEmpty) base += '?tx_amount=${amount.replaceAll(',', '.')}'; - - return base; - } -} - class BitcoinURI extends PaymentURI { BitcoinURI({required super.amount, required super.address, this.pjUri = ''}); diff --git a/cw_core/lib/wallet_addresses.dart b/cw_core/lib/wallet_addresses.dart index ac4128e427..b2d28df7df 100644 --- a/cw_core/lib/wallet_addresses.dart +++ b/cw_core/lib/wallet_addresses.dart @@ -1,3 +1,4 @@ +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/receive_page_option.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_info.dart'; @@ -23,8 +24,8 @@ abstract class WalletAddresses { String get address; String get latestAddress { - if (walletInfo.type == WalletType.monero || walletInfo.type == WalletType.wownero) { - if (addressesMap.keys.length == 0) return address; + if ([WalletType.monero, WalletType.wownero].contains(walletInfo.type)) { + if (addressesMap.keys.isEmpty) return address; return addressesMap[addressesMap.keys.last] ?? address; } return _localAddress ?? address; @@ -85,4 +86,5 @@ abstract class WalletAddresses { List get receivePageOptions => ReceivePageOptions; + PaymentURI getPaymentUri(String amount); } diff --git a/cw_decred/lib/wallet_addresses.dart b/cw_decred/lib/wallet_addresses.dart index 96f007c5cc..f7d0a8baec 100644 --- a/cw_decred/lib/wallet_addresses.dart +++ b/cw_decred/lib/wallet_addresses.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/receive_page_option.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:mobx/mobx.dart'; @@ -150,6 +151,9 @@ abstract class DecredWalletAddressesBase extends WalletAddresses with Store { ] : ReceivePageOptions; } + + @override + PaymentURI getPaymentUri(String amount) => DecredURI(amount: amount, address: address); } class LibAddresses { diff --git a/cw_dogecoin/lib/src/dogecoin_wallet_addresses.dart b/cw_dogecoin/lib/src/dogecoin_wallet_addresses.dart index 75d06c1484..3dc72526fd 100644 --- a/cw_dogecoin/lib/src/dogecoin_wallet_addresses.dart +++ b/cw_dogecoin/lib/src/dogecoin_wallet_addresses.dart @@ -2,6 +2,7 @@ import 'package:bitcoin_base/bitcoin_base.dart'; import 'package:blockchain_utils/blockchain_utils.dart'; import 'package:cw_bitcoin/electrum_wallet_addresses.dart'; import 'package:cw_bitcoin/utils.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:mobx/mobx.dart'; @@ -26,4 +27,7 @@ abstract class DogeCoinWalletAddressesBase extends ElectrumWalletAddresses with required Bip32Slip10Secp256k1 hd, BitcoinAddressType? addressType}) => generateP2PKHAddress(hd: hd, index: index, network: network); + + @override + PaymentURI getPaymentUri(String amount) => DogeURI(amount: amount, address: address); } diff --git a/cw_evm/lib/evm_chain_wallet.dart b/cw_evm/lib/evm_chain_wallet.dart index 0db8781c7a..f952117485 100644 --- a/cw_evm/lib/evm_chain_wallet.dart +++ b/cw_evm/lib/evm_chain_wallet.dart @@ -82,7 +82,7 @@ abstract class EVMChainWalletBase _hexPrivateKey = privateKey, _isTransactionUpdating = false, _client = client, - walletAddresses = EVMChainWalletAddresses(walletInfo), + walletAddresses = EVMChainWalletAddresses(walletInfo, client.chainId), balance = ObservableMap.of( { // Not sure of this yet, will it work? will it not? diff --git a/cw_evm/lib/evm_chain_wallet_addresses.dart b/cw_evm/lib/evm_chain_wallet_addresses.dart index 7dd501cc5e..bfa4938a32 100644 --- a/cw_evm/lib/evm_chain_wallet_addresses.dart +++ b/cw_evm/lib/evm_chain_wallet_addresses.dart @@ -1,5 +1,6 @@ import 'dart:developer'; +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:mobx/mobx.dart'; @@ -9,10 +10,12 @@ part 'evm_chain_wallet_addresses.g.dart'; class EVMChainWalletAddresses = EVMChainWalletAddressesBase with _$EVMChainWalletAddresses; abstract class EVMChainWalletAddressesBase extends WalletAddresses with Store { - EVMChainWalletAddressesBase(WalletInfo walletInfo) + EVMChainWalletAddressesBase(WalletInfo walletInfo, this.chainId) : address = '', super(walletInfo); + final int chainId; + @override @observable String address; @@ -36,4 +39,16 @@ abstract class EVMChainWalletAddressesBase extends WalletAddresses with Store { log(e.toString()); } } + + @override + PaymentURI getPaymentUri(String amount) { + switch (chainId) { + case 8453: + return BaseURI(amount: amount, address: address); + case 137: + return PolygonURI(amount: amount, address: address); + default: + return EthereumURI(amount: amount, address: address); + } + } } diff --git a/cw_monero/lib/monero_wallet_addresses.dart b/cw_monero/lib/monero_wallet_addresses.dart index 0b38ac5fd6..51c3e0f0a9 100644 --- a/cw_monero/lib/monero_wallet_addresses.dart +++ b/cw_monero/lib/monero_wallet_addresses.dart @@ -1,5 +1,5 @@ import 'package:cw_core/account.dart'; -import 'package:cw_core/address_info.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/subaddress.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_addresses.dart'; @@ -155,4 +155,7 @@ abstract class MoneroWalletAddressesBase extends WalletAddresses with Store { @override bool containsAddress(String address) => addressInfos[account?.id ?? 0]?.any((it) => it.address == address) ?? false; + + @override + PaymentURI getPaymentUri(String amount) => MoneroURI(amount: amount, address: address); } diff --git a/cw_nano/lib/nano_wallet_addresses.dart b/cw_nano/lib/nano_wallet_addresses.dart index f1ff14a854..f52cf4ca1f 100644 --- a/cw_nano/lib/nano_wallet_addresses.dart +++ b/cw_nano/lib/nano_wallet_addresses.dart @@ -1,4 +1,5 @@ import 'package:cw_core/cake_hive.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; @@ -15,6 +16,7 @@ abstract class NanoWalletAddressesBase extends WalletAddresses with Store { : accountList = NanoAccountList(walletInfo.address), address = '', super(walletInfo); + @override @observable String address; @@ -51,4 +53,7 @@ abstract class NanoWalletAddressesBase extends WalletAddresses with Store { printV(e.toString()); } } + + @override + PaymentURI getPaymentUri(String amount) => NanoURI(amount: amount, address: address); } diff --git a/cw_solana/lib/solana_wallet_addresses.dart b/cw_solana/lib/solana_wallet_addresses.dart index 7e9bd90089..634c73f375 100644 --- a/cw_solana/lib/solana_wallet_addresses.dart +++ b/cw_solana/lib/solana_wallet_addresses.dart @@ -1,3 +1,4 @@ +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; @@ -34,4 +35,7 @@ abstract class SolanaWalletAddressesBase extends WalletAddresses with Store { printV(e.toString()); } } + + @override + PaymentURI getPaymentUri(String amount) => SolanaURI(amount: amount, address: address); } diff --git a/cw_tron/lib/tron_wallet_addresses.dart b/cw_tron/lib/tron_wallet_addresses.dart index 095f97fa9a..99767e9654 100644 --- a/cw_tron/lib/tron_wallet_addresses.dart +++ b/cw_tron/lib/tron_wallet_addresses.dart @@ -1,5 +1,6 @@ import 'dart:developer'; +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:mobx/mobx.dart'; @@ -36,4 +37,7 @@ abstract class TronWalletAddressesBase extends WalletAddresses with Store { log(e.toString()); } } + + @override + PaymentURI getPaymentUri(String amount) => TronURI(amount: amount, address: address); } diff --git a/cw_wownero/lib/wownero_wallet_addresses.dart b/cw_wownero/lib/wownero_wallet_addresses.dart index 936c187247..c95d397631 100644 --- a/cw_wownero/lib/wownero_wallet_addresses.dart +++ b/cw_wownero/lib/wownero_wallet_addresses.dart @@ -1,10 +1,9 @@ import 'package:cw_core/account.dart'; -import 'package:cw_core/address_info.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/subaddress.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; -import 'package:cw_wownero/api/transaction_history.dart'; import 'package:cw_wownero/api/subaddress_list.dart' as subaddress_list; import 'package:cw_wownero/api/wallet.dart'; import 'package:cw_wownero/wownero_account_list.dart'; @@ -151,4 +150,7 @@ abstract class WowneroWalletAddressesBase extends WalletAddresses with Store { @override bool containsAddress(String address) => addressInfos[account?.id ?? 0]?.any((it) => it.address == address) ?? false; + + @override + PaymentURI getPaymentUri(String amount) => WowneroURI(amount: amount, address: address); } diff --git a/cw_zano/lib/zano_wallet_addresses.dart b/cw_zano/lib/zano_wallet_addresses.dart index 39e61be7f0..1562ea8eee 100644 --- a/cw_zano/lib/zano_wallet_addresses.dart +++ b/cw_zano/lib/zano_wallet_addresses.dart @@ -1,7 +1,7 @@ +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; -import 'package:cw_zano/zano_wallet_api.dart'; import 'package:mobx/mobx.dart'; part 'zano_wallet_addresses.g.dart'; @@ -38,4 +38,7 @@ abstract class ZanoWalletAddressesBase extends WalletAddresses with Store { printV(e.toString()); } } + + @override + PaymentURI getPaymentUri(String amount) => ZanoURI(amount: amount, address: address); } diff --git a/lib/view_model/exchange/exchange_trade_view_model.dart b/lib/view_model/exchange/exchange_trade_view_model.dart index 3f4240cf21..09b478da79 100644 --- a/lib/view_model/exchange/exchange_trade_view_model.dart +++ b/lib/view_model/exchange/exchange_trade_view_model.dart @@ -442,8 +442,6 @@ abstract class ExchangeTradeViewModelBase with Store { return ZanoURI(amount: amount, address: inputAddress); case WalletType.decred: return DecredURI(amount: amount, address: inputAddress); - case WalletType.haven: - return HavenURI(amount: amount, address: inputAddress); case WalletType.nano: return NanoURI(amount: amount, address: inputAddress); default: From 1d8c612198425f8d7c00623f838cc63929011eba Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Tue, 4 Nov 2025 20:51:58 +0100 Subject: [PATCH 013/105] feat: enhance `PaymentURI` handling with asynchronous support and Lightning-specific functionality --- cw_bitcoin/lib/bitcoin_wallet_addresses.dart | 12 ++++ .../lib/lightning/lightning_wallet.dart | 14 +++- cw_core/lib/payment_uris.dart | 14 ++++ cw_core/lib/wallet_addresses.dart | 7 ++ .../wallet_address_list_view_model.dart | 70 ++++++------------- 5 files changed, 66 insertions(+), 51 deletions(-) diff --git a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart index 3f572e2401..9cc085587c 100644 --- a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart +++ b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart @@ -2,8 +2,10 @@ import 'package:bitcoin_base/bitcoin_base.dart'; import 'package:blockchain_utils/bip/bip/bip32/bip32.dart'; import 'package:cw_bitcoin/bitcoin_receive_page_option.dart'; import 'package:cw_bitcoin/electrum_wallet_addresses.dart'; +import 'package:cw_bitcoin/lightning/lightning_addres_type.dart'; import 'package:cw_bitcoin/payjoin/manager.dart'; import 'package:cw_bitcoin/utils.dart'; +import 'package:cw_core/parse_fixed.dart'; import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/receive_page_option.dart'; import 'package:cw_core/unspent_coin_type.dart'; @@ -110,4 +112,14 @@ abstract class BitcoinWalletAddressesBase extends ElectrumWalletAddresses with S @override PaymentURI getPaymentUri(String amount) => BitcoinURI(amount: amount, address: address, pjUri: payjoinEndpoint ?? ''); + + Future getPaymentRequestUri(String amount) async { + if (addressPageType is LightningAddressType && lightningWallet != null) { + final amountSats = amount.isNotEmpty ? parseFixed(amount, 9) : null; + final invoice = await lightningWallet!.getBolt11Invoice(amountSats, "Send to Cake Wallet"); + return LightningPaymentRequest(address: address, amount: amount, bolt11Invoice: invoice); + } + print(amount); + return getPaymentUri(amount); + } } diff --git a/cw_bitcoin/lib/lightning/lightning_wallet.dart b/cw_bitcoin/lib/lightning/lightning_wallet.dart index 6ae40da518..4d44dc3b58 100644 --- a/cw_bitcoin/lib/lightning/lightning_wallet.dart +++ b/cw_bitcoin/lib/lightning/lightning_wallet.dart @@ -59,6 +59,19 @@ class LightningWallet { .lightningAddress; } + Future getBolt11Invoice(BigInt? amount, String description) async { + final response = await sdk.receivePayment( + request: ReceivePaymentRequest( + paymentMethod: ReceivePaymentMethod.bolt11Invoice( + description: description, + amountSats: amount, + ), + ), + ); + + return response.paymentRequest; + } + Future isCompatible(String input) async { try { final inputType = await sdk.parse(input: input); @@ -186,7 +199,6 @@ class LightningWallet { isPending: payment.status == PaymentStatus.pending, date: DateTime.fromMillisecondsSinceEpoch(payment.timestamp.toInt() * 1000), confirmations: payment.status == PaymentStatus.pending ? 0 : 10, - ); } diff --git a/cw_core/lib/payment_uris.dart b/cw_core/lib/payment_uris.dart index b4ba788e51..806726d4d9 100644 --- a/cw_core/lib/payment_uris.dart +++ b/cw_core/lib/payment_uris.dart @@ -34,10 +34,24 @@ class BitcoinURI extends PaymentURI { qp['pj'] = pjUri; } + print(qp); return Uri(scheme: 'bitcoin', path: address, queryParameters: qp).toString(); } } +class LightningPaymentRequest extends PaymentURI { + LightningPaymentRequest({ + required super.amount, + required super.address, + required this.bolt11Invoice, + }); + + final String bolt11Invoice; + + @override + String toString() => bolt11Invoice; +} + class LitecoinURI extends PaymentURI { LitecoinURI({required super.amount, required super.address}); diff --git a/cw_core/lib/wallet_addresses.dart b/cw_core/lib/wallet_addresses.dart index b2d28df7df..c802065202 100644 --- a/cw_core/lib/wallet_addresses.dart +++ b/cw_core/lib/wallet_addresses.dart @@ -86,5 +86,12 @@ abstract class WalletAddresses { List get receivePageOptions => ReceivePageOptions; + /// Get a [PaymentURI] for the current [address] + /// e.g. ethereum:0x0 PaymentURI getPaymentUri(String amount); + + + /// Get a [PaymentURI] for the current [address] asynchronously + /// this can be used if a payment requires a api call beforehand + Future getPaymentRequestUri(String amount) async => getPaymentRequestUri(amount); } diff --git a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart index adc60cad02..92f4c24a78 100644 --- a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart +++ b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart @@ -1,11 +1,11 @@ -import 'dart:developer' as dev; import 'dart:core'; +import 'dart:developer' as dev; import 'package:cake_wallet/base/base.dart'; import 'package:cake_wallet/bitcoin/bitcoin.dart'; import 'package:cake_wallet/core/fiat_conversion_service.dart'; -import 'package:cw_core/payment_uris.dart'; import 'package:cake_wallet/core/wallet_change_listener_view_model.dart'; +import 'package:cake_wallet/decred/decred.dart'; import 'package:cake_wallet/entities/auto_generate_subaddress_status.dart'; import 'package:cake_wallet/entities/fiat_api_mode.dart'; import 'package:cake_wallet/entities/fiat_currency.dart'; @@ -16,23 +16,23 @@ import 'package:cake_wallet/polygon/polygon.dart'; import 'package:cake_wallet/arbitrum/arbitrum.dart'; import 'package:cake_wallet/reactions/wallet_utils.dart'; import 'package:cake_wallet/solana/solana.dart'; -import 'package:cake_wallet/decred/decred.dart'; import 'package:cake_wallet/store/app_store.dart'; import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart'; import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/store/yat/yat_store.dart'; import 'package:cake_wallet/tron/tron.dart'; -import 'package:cake_wallet/utils/qr_util.dart'; -import 'package:cake_wallet/zano/zano.dart'; import 'package:cake_wallet/utils/list_item.dart'; +import 'package:cake_wallet/utils/qr_util.dart'; import 'package:cake_wallet/view_model/wallet_address_list/wallet_account_list_header.dart'; import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_hidden_list_header.dart'; import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_header.dart'; import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_item.dart'; import 'package:cake_wallet/wownero/wownero.dart'; +import 'package:cake_wallet/zano/zano.dart'; import 'package:cw_core/amount_converter.dart'; import 'package:cw_core/currency.dart'; import 'package:cw_core/currency_for_wallet_type.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:intl/intl.dart'; import 'package:mobx/mobx.dart'; @@ -49,9 +49,7 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo }) : _baseItems = [], selectedCurrency = walletTypeToCryptoCurrency(appStore.wallet!.type), _cryptoNumberFormat = NumberFormat(_cryptoNumberPattern), - hasAccounts = [WalletType.monero, WalletType.wownero, WalletType.haven] - .contains(appStore.wallet!.type), - amount = '', + hasAccounts = [WalletType.monero, WalletType.wownero].contains(appStore.wallet!.type), _settingsStore = appStore.settingsStore, super(appStore: appStore) { _init(); @@ -62,7 +60,7 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo _init(); selectedCurrency = walletTypeToCryptoCurrency(wallet.type); - hasAccounts = [WalletType.monero, WalletType.wownero, WalletType.haven].contains(wallet.type); + hasAccounts = [WalletType.monero, WalletType.wownero].contains(wallet.type); } static const String _cryptoNumberPattern = '0.00000000'; @@ -95,7 +93,7 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo int get selectedCurrencyIndex => currencies.indexOf(selectedCurrency); @observable - String amount; + String amount = ''; @computed WalletType get type => wallet.type; @@ -112,46 +110,14 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo bool get isPayjoinUnavailable => wallet.type == WalletType.bitcoin && _settingsStore.usePayjoin && payjoinEndpoint.isEmpty; - @computed - PaymentURI get uri { - switch (wallet.type) { - case WalletType.monero: - return MoneroURI(amount: amount, address: address.address); - case WalletType.haven: - return HavenURI(amount: amount, address: address.address); - case WalletType.bitcoin: - return BitcoinURI(amount: amount, address: address.address, pjUri: payjoinEndpoint); - case WalletType.litecoin: - return LitecoinURI(amount: amount, address: address.address); - case WalletType.ethereum: - return EthereumURI(amount: amount, address: address.address); - case WalletType.bitcoinCash: - return BitcoinCashURI(amount: amount, address: address.address); - case WalletType.banano: - return NanoURI(amount: amount, address: address.address); - case WalletType.nano: - return NanoURI(amount: amount, address: address.address); - case WalletType.polygon: - return PolygonURI(amount: amount, address: address.address); - case WalletType.solana: - return SolanaURI(amount: amount, address: address.address); - case WalletType.tron: - return TronURI(amount: amount, address: address.address); - case WalletType.wownero: - return WowneroURI(amount: amount, address: address.address); - case WalletType.zano: - return ZanoURI(amount: amount, address: address.address); - case WalletType.decred: - return DecredURI(amount: amount, address: address.address); - case WalletType.dogecoin: - return DogeURI(amount: amount, address: address.address); - case WalletType.base: - return BaseURI(amount: amount, address: address.address); - case WalletType.arbitrum: - return ArbitrumURI(amount: amount, address: address.address); - case WalletType.none: - throw Exception('Unexpected type: ${type.toString()}'); - } + @observable + late PaymentURI uri; + + @action + Future refreshUri() async { + print(amount); + uri = await wallet.walletAddresses.getPaymentRequestUri(amount); + print(uri); } @computed @@ -518,6 +484,7 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo void _init() { _baseItems = []; + uri = wallet.walletAddresses.getPaymentUri(amount); if (wallet.walletAddresses.hiddenAddresses.isNotEmpty) { _baseItems.add(WalletAddressHiddenListHeader()); @@ -537,6 +504,9 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo if (wallet.isEnabledAutoGenerateSubaddress) { wallet.walletAddresses.address = wallet.walletAddresses.latestAddress; } + + reaction((_) => amount, (_) => refreshUri()); + reaction((_) => address, (_) => refreshUri()); } @action From eedd44ee5f6c7e54337b953e254a0289750dbd61 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Tue, 4 Nov 2025 21:52:00 +0100 Subject: [PATCH 014/105] refactor: streamline `PaymentURI` logic and remove redundant URI implementations across wallet types --- cw_bitcoin/lib/bitcoin_wallet_addresses.dart | 2 +- cw_bitcoin/lib/electrum_wallet_addresses.dart | 4 - cw_bitcoin/lib/litecoin_wallet_addresses.dart | 4 - .../src/bitcoin_cash_wallet_addresses.dart | 2 +- .../lib/hardware/device_connection_type.dart | 6 + cw_core/lib/payment_uris.dart | 249 ++++++------------ cw_core/lib/wallet_addresses.dart | 9 +- cw_decred/lib/wallet_addresses.dart | 77 +++--- .../lib/src/dogecoin_wallet_addresses.dart | 14 +- cw_evm/lib/evm_chain_wallet.dart | 2 +- cw_evm/lib/evm_chain_wallet_addresses.dart | 17 +- cw_monero/lib/monero_wallet_addresses.dart | 2 +- cw_nano/lib/nano_wallet_addresses.dart | 4 - cw_solana/lib/solana_wallet_addresses.dart | 4 - cw_tron/lib/tron_wallet_addresses.dart | 4 - cw_wownero/lib/wownero_wallet_addresses.dart | 5 +- cw_zano/lib/zano_wallet_addresses.dart | 4 - .../exchange/exchange_trade_view_model.dart | 26 +- .../wallet_address_list_view_model.dart | 2 - 19 files changed, 147 insertions(+), 290 deletions(-) diff --git a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart index 9cc085587c..7df16b020e 100644 --- a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart +++ b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart @@ -111,7 +111,7 @@ abstract class BitcoinWalletAddressesBase extends ElectrumWalletAddresses with S @override PaymentURI getPaymentUri(String amount) => - BitcoinURI(amount: amount, address: address, pjUri: payjoinEndpoint ?? ''); + BitcoinURI(address: address, amount: amount, pjUri: payjoinEndpoint ?? ''); Future getPaymentRequestUri(String amount) async { if (addressPageType is LightningAddressType && lightningWallet != null) { diff --git a/cw_bitcoin/lib/electrum_wallet_addresses.dart b/cw_bitcoin/lib/electrum_wallet_addresses.dart index 18de7eb3ad..7ef455793f 100644 --- a/cw_bitcoin/lib/electrum_wallet_addresses.dart +++ b/cw_bitcoin/lib/electrum_wallet_addresses.dart @@ -7,7 +7,6 @@ import 'package:cw_bitcoin/bitcoin_unspent.dart'; import 'package:cw_bitcoin/lightning/lightning_addres_type.dart'; import 'package:cw_bitcoin/lightning/lightning_wallet.dart'; import 'package:cw_core/pathForWallet.dart'; -import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_addresses.dart'; @@ -766,7 +765,4 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { await lightningWallet!.registerAddress(walletName.replaceAll(" ", "").toLowerCase()); } } - - @override - PaymentURI getPaymentUri(String amount) => BitcoinURI(amount: amount, address: address); } diff --git a/cw_bitcoin/lib/litecoin_wallet_addresses.dart b/cw_bitcoin/lib/litecoin_wallet_addresses.dart index 8d6e24b5f8..2095d4bd4e 100644 --- a/cw_bitcoin/lib/litecoin_wallet_addresses.dart +++ b/cw_bitcoin/lib/litecoin_wallet_addresses.dart @@ -9,7 +9,6 @@ import 'package:cw_bitcoin/bitcoin_receive_page_option.dart'; import 'package:cw_bitcoin/bitcoin_unspent.dart'; import 'package:cw_bitcoin/electrum_wallet_addresses.dart'; import 'package:cw_bitcoin/utils.dart'; -import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/receive_page_option.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/utils/print_verbose.dart'; @@ -227,7 +226,4 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with ...ReceivePageOptions.where((element) => element != ReceivePageOption.mainnet) ]; } - - @override - PaymentURI getPaymentUri(String amount) => LitecoinURI(amount: amount, address: address); } diff --git a/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_addresses.dart b/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_addresses.dart index 681fc00d73..25c11b7639 100644 --- a/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_addresses.dart +++ b/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_addresses.dart @@ -31,5 +31,5 @@ abstract class BitcoinCashWalletAddressesBase extends ElectrumWalletAddresses wi generateP2PKHAddress(hd: hd, index: index, network: network); @override - PaymentURI getPaymentUri(String amount) => BitcoinCashURI(amount: amount, address: address); + PaymentURI getPaymentUri(String amount) => BitcoinCashURI(address: address, amount: amount); } diff --git a/cw_core/lib/hardware/device_connection_type.dart b/cw_core/lib/hardware/device_connection_type.dart index 76f07edf18..fcdb1545ae 100644 --- a/cw_core/lib/hardware/device_connection_type.dart +++ b/cw_core/lib/hardware/device_connection_type.dart @@ -36,6 +36,12 @@ enum DeviceConnectionType { WalletType.polygon, ].contains(walletType); break; + case HardwareWalletType.cupcake: + case HardwareWalletType.coldcard: + case HardwareWalletType.seedsigner: + case HardwareWalletType.keystone: + // This should not be thrown since it should never reach this code for these HardwareWalletTypes + throw UnimplementedError(); } return isSupported diff --git a/cw_core/lib/payment_uris.dart b/cw_core/lib/payment_uris.dart index 806726d4d9..ed172ca044 100644 --- a/cw_core/lib/payment_uris.dart +++ b/cw_core/lib/payment_uris.dart @@ -1,26 +1,41 @@ -import 'package:cw_core/format_fixed.dart'; +import "package:cw_core/format_fixed.dart"; -abstract class PaymentURI { - PaymentURI({required this.amount, required this.address}); +class PaymentURI { + const PaymentURI({required this.scheme, required this.address, required this.amount}); - final String amount; + final String scheme; final String address; + final String amount; + + String toString() { + final queryParameters = {}; + + if (amount.isNotEmpty) queryParameters["amount"] = amount.replaceAll(",", "."); + + return Uri(scheme: scheme, path: address, queryParameters: queryParameters).toString(); + } } class MoneroURI extends PaymentURI { - MoneroURI({required super.amount, required super.address}); + const MoneroURI({required super.address, required super.amount, super.scheme = "monero"}); @override String toString() { - var base = 'monero:$address'; - if (amount.isNotEmpty) base += '?tx_amount=${amount.replaceAll(',', '.')}'; + final queryParameters = {}; - return base; + if (amount.isNotEmpty) queryParameters["tx_amount"] = amount.replaceAll(",", "."); + + return Uri(scheme: scheme, path: address, queryParameters: queryParameters).toString(); } } class BitcoinURI extends PaymentURI { - BitcoinURI({required super.amount, required super.address, this.pjUri = ''}); + const BitcoinURI({ + required super.address, + required super.amount, + this.pjUri = "", + super.scheme = "bitcoin", + }); final String pjUri; @@ -28,23 +43,22 @@ class BitcoinURI extends PaymentURI { String toString() { final qp = {}; - if (amount.isNotEmpty) qp['amount'] = amount.replaceAll(',', '.'); + if (amount.isNotEmpty) qp["amount"] = amount.replaceAll(",", "."); if (pjUri.isNotEmpty && !address.startsWith("sp")) { - qp['pjos'] = '0'; - qp['pj'] = pjUri; + qp["pjos"] = "0"; + qp["pj"] = pjUri; } - print(qp); - return Uri(scheme: 'bitcoin', path: address, queryParameters: qp).toString(); + return Uri(scheme: "bitcoin", path: address, queryParameters: qp).toString(); } } class LightningPaymentRequest extends PaymentURI { - LightningPaymentRequest({ - required super.amount, - required super.address, - required this.bolt11Invoice, - }); + const LightningPaymentRequest( + {required super.address, + required super.amount, + required this.bolt11Invoice, + super.scheme = "lightning"}); final String bolt11Invoice; @@ -104,7 +118,7 @@ class ArbitrumURI extends PaymentURI { } class BitcoinCashURI extends PaymentURI { - BitcoinCashURI({required super.amount, required super.address}); + const BitcoinCashURI({required super.address, required super.amount, super.scheme = ""}); @override String toString() { @@ -115,145 +129,40 @@ class BitcoinCashURI extends PaymentURI { } } -class NanoURI extends PaymentURI { - NanoURI({required super.amount, required super.address}); - - @override - String toString() { - var base = 'nano:$address'; - if (amount.isNotEmpty) { - base += '?amount=${amount.replaceAll(',', '.')}'; - } - - return base; - } -} - -class PolygonURI extends PaymentURI { - PolygonURI({required super.amount, required super.address}); - - @override - String toString() { - var base = 'polygon:$address'; - if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; - - return base; - } -} - -class SolanaURI extends PaymentURI { - SolanaURI({required super.amount, required super.address}); - - @override - String toString() { - var base = 'solana:$address'; - if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; - - return base; - } -} - -class TronURI extends PaymentURI { - TronURI({required super.amount, required super.address}); - - @override - String toString() { - var base = 'tron:$address'; - if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; - - return base; - } -} - -class WowneroURI extends PaymentURI { - WowneroURI({required super.amount, required super.address}); - - @override - String toString() { - var base = 'wownero:$address'; - if (amount.isNotEmpty) base += '?tx_amount=${amount.replaceAll(',', '.')}'; - - return base; - } -} - -class ZanoURI extends PaymentURI { - ZanoURI({required String amount, required String address}) - : super(amount: amount, address: address); - - @override - String toString() { - var base = 'zano:$address'; - if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; - - return base; - } -} - -class DecredURI extends PaymentURI { - DecredURI({required String amount, required String address}) - : super(amount: amount, address: address); - - @override - String toString() { - var base = 'decred:$address'; - if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; - - return base; - } -} - -class DogeURI extends PaymentURI { - DogeURI({required String amount, required String address}) - : super(amount: amount, address: address); - - @override - String toString() { - var base = 'doge:$address'; - if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; - - return base; - } -} - class ERC681URI extends PaymentURI { final int chainId; final String? contractAddress; - ERC681URI({ + const ERC681URI({ required this.chainId, required super.address, required super.amount, required this.contractAddress, + super.scheme = "ethereum", }); @override String toString() { - var uri = 'ethereum:'; + var uri = '$scheme:'; final targetAddress = contractAddress ?? address; uri += targetAddress; - if (chainId != 1) uri += '@$chainId'; + if (chainId != 1) uri += "@$chainId"; - if (contractAddress != null) uri += '/transfer'; + if (contractAddress != null) uri += "/transfer"; final params = {}; if (contractAddress != null) { - params['address'] = address; - if (amount.isNotEmpty) { - params['uint256'] = _formatAmountForERC20(amount); - } + params["address"] = address; + if (amount.isNotEmpty) params["uint256"] = _formatAmountForERC20(amount); } else { - if (amount.isNotEmpty) { - params['value'] = _formatAmountForNative(amount); - } + if (amount.isNotEmpty) params["value"] = _formatAmountForNative(amount); } if (params.isNotEmpty) { - uri += '?'; - uri += params.entries.map((e) => '${e.key}=${e.value}').join('&'); + uri += "?${params.entries.map((e) => "${e.key}=${e.value}").join("&")}"; } return uri; @@ -263,12 +172,11 @@ class ERC681URI extends PaymentURI { String _formatAmountForERC20(String amount) { try { // Convert decimal amount to BigInt (assuming 18 decimals) - final amountDouble = double.parse(amount.replaceAll(',', '.')); + final amountDouble = double.parse(amount.replaceAll(",", ".")); final amountBigInt = BigInt.from(amountDouble * 1e18); return amountBigInt.toString(); } catch (e) { - // Fallback to original amount if parsing fails - return amount.replaceAll(',', '.'); + return amount.replaceAll(",", "."); } } @@ -276,13 +184,12 @@ class ERC681URI extends PaymentURI { String _formatAmountForNative(String amount) { try { // Convert decimal amount to double for scientific notation - final amountDouble = double.parse(amount.replaceAll(',', '.')); + final amountDouble = double.parse(amount.replaceAll(",", ".")); // Use scientific notation as recommended by ERC-681 - return '${amountDouble}e18'; + return "${amountDouble}e18"; } catch (e) { - // Fallback to original amount if parsing fails - return amount.replaceAll(',', '.'); + return amount.replaceAll(",", "."); } } @@ -290,7 +197,7 @@ class ERC681URI extends PaymentURI { final (isContract, targetAddress) = _getTargetAddress(uri.path); final chainId = _getChainID(uri.path); - final address = isContract ? uri.queryParameters["address"] ?? '' : targetAddress; + final address = isContract ? uri.queryParameters["address"] ?? "" : targetAddress; final amountParam = isContract ? uri.queryParameters["uint256"] : uri.queryParameters["value"]; var formatedAmount = ""; @@ -311,15 +218,12 @@ class ERC681URI extends PaymentURI { } static int _getChainID(String path) { - return int.parse(RegExp( - r'@\d*', - ).firstMatch(path)?.group(0)?.replaceAll("@", "") ?? - "1"); + return int.parse(RegExp(r"@\d*").firstMatch(path)?.group(0)?.replaceAll("@", "") ?? "1"); } static (bool, String) _getTargetAddress(String path) { final targetAddress = - RegExp(r'^(0x)?[0-9a-f]{40}', caseSensitive: false).firstMatch(path)!.group(0)!; + RegExp(r"^(0x)?[0-9a-f]{40}", caseSensitive: false).firstMatch(path)!.group(0)!; return (path.contains("/"), targetAddress); } @@ -330,70 +234,67 @@ class ERC681URI extends PaymentURI { /// - Scientific notation: "0.123e18", "1e6" → expanded to integer /// - Decimal ETH: "0.123456" → shifted by 18 decimals static String _normalizeToIntegerWei(String input) { - final raw = input.replaceAll(',', '.').trim(); + final raw = input.replaceAll(",", ".").trim(); // First we check if it's already a plain integer (basically just a number with no dot, no exponent) try { - final isPlainInteger = RegExp(r'^[+-]?\d+$').hasMatch(raw) && - !raw.contains('.') && - !raw.toLowerCase().contains('e'); - if (isPlainInteger) return raw.replaceFirst(RegExp(r'^\+'), ''); + final isPlainInteger = RegExp(r"^[+-]?\d+$").hasMatch(raw) && + !raw.contains(".") && + !raw.toLowerCase().contains("e"); + if (isPlainInteger) return raw.replaceFirst(RegExp(r"^\+"), ""); // Then we check if it's a scientific notation - final sci = RegExp(r'^[+-]?(\d+\.?\d*|\d*\.?\d+)[eE][+-]?\d+$'); + final sci = RegExp(r"^[+-]?(\d+\.?\d*|\d*\.?\d+)[eE][+-]?\d+$"); if (sci.hasMatch(raw)) { - final mantissaStr = raw.toLowerCase().split('e')[0]; - final exp = int.parse(raw.toLowerCase().split('e')[1]); + final mantissaStr = raw.toLowerCase().split("e")[0]; + final exp = int.parse(raw.toLowerCase().split("e")[1]); return _expandDecimal(mantissaStr, exp); } // Lastly, we check if it's a fixed decimal ETH amount, here we shift by 18 to get wei for the amount - if (raw.contains('.')) { + if (raw.contains(".")) { return _expandDecimal(raw, 18); } return raw; } catch (e) { return raw; } - - // If none of these checks work, we return the raw input } /// Expands a decimal string by shifting the decimal point `expShift` places /// to the right and returns an integer string (digits only, optional leading minus). /// Examples: - /// _expandDecimal('0.123456', 18) -> '123456000000000000' - /// _expandDecimal('1.2', 3) -> '1200' + /// _expandDecimal("0.123456", 18) -> "123456000000000000" + /// _expandDecimal("1.2", 3) -> "1200" static String _expandDecimal(String decimalStr, int expShift) { var s = decimalStr.trim(); - var sign = ''; - if (s.startsWith('-') || s.startsWith('+')) { - sign = s[0] == '-' ? '-' : ''; + var sign = ""; + if (s.startsWith("-") || s.startsWith("+")) { + sign = s[0] == "-" ? "-" : ""; s = s.substring(1); } // First we split the integer and fractional parts - final parts = s.split('.'); - final intPart = parts[0].isEmpty ? '0' : parts[0]; - final fracPart = parts.length > 1 ? parts[1] : ''; - final digits = (intPart + fracPart).replaceFirst(RegExp(r'^0+'), ''); + final parts = s.split("."); + final intPart = parts[0].isEmpty ? "0" : parts[0]; + final fracPart = parts.length > 1 ? parts[1] : ""; + final digits = (intPart + fracPart).replaceFirst(RegExp(r"^0+"), ""); final fracLen = fracPart.length; // Then we calculate the effective shift = desired shift minus existing fractional digits final shift = expShift - fracLen; if (shift >= 0) { - final head = digits.isEmpty ? '0' : digits; - final zeros = List.filled(shift, '0').join(); + final head = digits.isEmpty ? "0" : digits; + final zeros = List.filled(shift, "0").join(); final res = head + zeros; - return sign + (res.isEmpty ? '0' : res); + return sign + (res.isEmpty ? "0" : res); } else { // Need to insert a decimal point within digits; return integer by truncating final cut = digits.length + shift; - if (cut <= 0) { - return '0'; - } + if (cut <= 0) return "0"; + final res = digits.substring(0, cut); - return sign + (res.isEmpty ? '0' : res); + return sign + (res.isEmpty ? "0" : res); } } } diff --git a/cw_core/lib/wallet_addresses.dart b/cw_core/lib/wallet_addresses.dart index c802065202..44fa821789 100644 --- a/cw_core/lib/wallet_addresses.dart +++ b/cw_core/lib/wallet_addresses.dart @@ -88,10 +88,13 @@ abstract class WalletAddresses { /// Get a [PaymentURI] for the current [address] /// e.g. ethereum:0x0 - PaymentURI getPaymentUri(String amount); - + PaymentURI getPaymentUri(String amount) => PaymentURI( + scheme: walletTypeToString(walletInfo.type).toLowerCase(), + address: address, + amount: amount, + ); /// Get a [PaymentURI] for the current [address] asynchronously /// this can be used if a payment requires a api call beforehand - Future getPaymentRequestUri(String amount) async => getPaymentRequestUri(amount); + Future getPaymentRequestUri(String amount) async => getPaymentUri(amount); } diff --git a/cw_decred/lib/wallet_addresses.dart b/cw_decred/lib/wallet_addresses.dart index f7d0a8baec..273a8e0510 100644 --- a/cw_decred/lib/wallet_addresses.dart +++ b/cw_decred/lib/wallet_addresses.dart @@ -1,5 +1,4 @@ import 'dart:convert'; -import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/receive_page_option.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:mobx/mobx.dart'; @@ -13,10 +12,10 @@ part 'wallet_addresses.g.dart'; class DecredWalletAddresses = DecredWalletAddressesBase with _$DecredWalletAddresses; abstract class DecredWalletAddressesBase extends WalletAddresses with Store { - DecredWalletAddressesBase(super.walletInfo, Libwallet libwallet, super.isTestnet) - : _libwallet = libwallet; + DecredWalletAddressesBase(super.walletInfo, this._libwallet, super.isTestnet); + final Libwallet _libwallet; - String currentAddr = ''; + String _currentAddr = ''; @observable bool isEnabledAutoGenerateSubaddress = true; @@ -43,14 +42,13 @@ abstract class DecredWalletAddressesBase extends WalletAddresses with Store { @override Future updateAddressesInBox() async { - final addrs = await libAddresses(); - final allAddrs = new List.from(addrs.usedAddrs)..addAll(addrs.unusedAddrs); + final addrs = await _libAddresses(); + final allAddrs = List.from(addrs.usedAddrs)..addAll(addrs.unusedAddrs); // Add all addresses. allAddrs.forEach((addr) { - if (addressesMap.containsKey(addr)) { - return; - } + if (addressesMap.containsKey(addr)) return; + addressesMap[addr] = ""; addressInfos[0] ??= []; addressInfos[0]?.add( @@ -66,44 +64,37 @@ abstract class DecredWalletAddressesBase extends WalletAddresses with Store { // Add used addresses. addrs.usedAddrs.forEach((addr) { - if (!usedAddresses.contains(addr)) { - usedAddresses.add(addr); - } + if (!usedAddresses.contains(addr)) usedAddresses.add(addr); }); - if (addrs.unusedAddrs.length > 0 && addrs.unusedAddrs[0] != currentAddr) { - currentAddr = addrs.unusedAddrs[0]; - selectedAddr = currentAddr; + if (addrs.unusedAddrs.length > 0 && addrs.unusedAddrs[0] != _currentAddr) { + _currentAddr = addrs.unusedAddrs[0]; + selectedAddr = _currentAddr; } await saveAddressesInBox(); } List getAddressInfos() { - if (addressInfos.containsKey(0)) { - return addressInfos[0]!; - } + if (addressInfos.containsKey(0)) return addressInfos[0]!; + return []; } Future updateAddress(String address, String label) async { - if (!addressInfos.containsKey(0)) { - return; - } + if (!addressInfos.containsKey(0)) return; + addressInfos[0]!.forEach((info) { - if (info.address == address) { - info.label = label; - } + if (info.address == address) info.label = label; }); await saveAddressesInBox(); } - Future libAddresses() async { + Future<_LibAddresses> _libAddresses() async { final nUsed = "10"; var nUnused = "1"; - if (this.isEnabledAutoGenerateSubaddress) { - nUnused = "3"; - } + if (this.isEnabledAutoGenerateSubaddress) nUnused = "3"; + try { final res = await _libwallet.addresses(walletInfo.name, nUsed, nUnused); final decoded = json.decode(res); @@ -111,10 +102,10 @@ abstract class DecredWalletAddressesBase extends WalletAddresses with Store { final unusedAddrs = List.from(decoded["unused"] ?? []); // index is the index of the first unused address. final index = decoded["index"] ?? 0; - return new LibAddresses(usedAddrs, unusedAddrs, index); + return _LibAddresses(usedAddrs, unusedAddrs, index); } catch (e) { printV(e); - return LibAddresses([], [], 0); + return _LibAddresses([], [], 0); } } @@ -122,9 +113,8 @@ abstract class DecredWalletAddressesBase extends WalletAddresses with Store { // NOTE: This will ignore the gap limit and may cause problems when restoring from seed if too // many addresses are taken and not used. final addr = await _libwallet.newExternalAddress(walletInfo.name) ?? ''; - if (addr == "") { - return; - } + if (addr == "") return; + if (!addressesMap.containsKey(addr)) { addressesMap[addr] = ""; addressInfos[0] ??= []; @@ -143,22 +133,17 @@ abstract class DecredWalletAddressesBase extends WalletAddresses with Store { } @override - List get receivePageOptions { - return isTestnet - ? [ - ReceivePageOption.testnet, - ...ReceivePageOptions.where((element) => element != ReceivePageOption.mainnet) - ] - : ReceivePageOptions; - } - - @override - PaymentURI getPaymentUri(String amount) => DecredURI(amount: amount, address: address); + List get receivePageOptions => isTestnet + ? [ + ReceivePageOption.testnet, + ...ReceivePageOptions.where((element) => element != ReceivePageOption.mainnet) + ] + : ReceivePageOptions; } -class LibAddresses { +class _LibAddresses { final List usedAddrs, unusedAddrs; final int firstUnusedAddrIndex; - LibAddresses(this.usedAddrs, this.unusedAddrs, this.firstUnusedAddrIndex); + _LibAddresses(this.usedAddrs, this.unusedAddrs, this.firstUnusedAddrIndex); } diff --git a/cw_dogecoin/lib/src/dogecoin_wallet_addresses.dart b/cw_dogecoin/lib/src/dogecoin_wallet_addresses.dart index 3dc72526fd..8f12dcc1ca 100644 --- a/cw_dogecoin/lib/src/dogecoin_wallet_addresses.dart +++ b/cw_dogecoin/lib/src/dogecoin_wallet_addresses.dart @@ -11,7 +11,8 @@ part 'dogecoin_wallet_addresses.g.dart'; class DogeCoinWalletAddresses = DogeCoinWalletAddressesBase with _$DogeCoinWalletAddresses; abstract class DogeCoinWalletAddressesBase extends ElectrumWalletAddresses with Store { - DogeCoinWalletAddressesBase(WalletInfo walletInfo, { + DogeCoinWalletAddressesBase( + WalletInfo walletInfo, { required super.mainHd, required super.sideHd, required super.network, @@ -19,15 +20,18 @@ abstract class DogeCoinWalletAddressesBase extends ElectrumWalletAddresses with super.initialAddresses, super.initialRegularAddressIndex, super.initialChangeAddressIndex, - super.initialAddressPageType + super.initialAddressPageType, }) : super(walletInfo); @override - String getAddress({required int index, + String getAddress({ + required int index, required Bip32Slip10Secp256k1 hd, - BitcoinAddressType? addressType}) => + BitcoinAddressType? addressType, + }) => generateP2PKHAddress(hd: hd, index: index, network: network); @override - PaymentURI getPaymentUri(String amount) => DogeURI(amount: amount, address: address); + PaymentURI getPaymentUri(String amount) => + PaymentURI(scheme: "doge", address: address, amount: amount); } diff --git a/cw_evm/lib/evm_chain_wallet.dart b/cw_evm/lib/evm_chain_wallet.dart index f952117485..0db8781c7a 100644 --- a/cw_evm/lib/evm_chain_wallet.dart +++ b/cw_evm/lib/evm_chain_wallet.dart @@ -82,7 +82,7 @@ abstract class EVMChainWalletBase _hexPrivateKey = privateKey, _isTransactionUpdating = false, _client = client, - walletAddresses = EVMChainWalletAddresses(walletInfo, client.chainId), + walletAddresses = EVMChainWalletAddresses(walletInfo), balance = ObservableMap.of( { // Not sure of this yet, will it work? will it not? diff --git a/cw_evm/lib/evm_chain_wallet_addresses.dart b/cw_evm/lib/evm_chain_wallet_addresses.dart index bfa4938a32..7dd501cc5e 100644 --- a/cw_evm/lib/evm_chain_wallet_addresses.dart +++ b/cw_evm/lib/evm_chain_wallet_addresses.dart @@ -1,6 +1,5 @@ import 'dart:developer'; -import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:mobx/mobx.dart'; @@ -10,12 +9,10 @@ part 'evm_chain_wallet_addresses.g.dart'; class EVMChainWalletAddresses = EVMChainWalletAddressesBase with _$EVMChainWalletAddresses; abstract class EVMChainWalletAddressesBase extends WalletAddresses with Store { - EVMChainWalletAddressesBase(WalletInfo walletInfo, this.chainId) + EVMChainWalletAddressesBase(WalletInfo walletInfo) : address = '', super(walletInfo); - final int chainId; - @override @observable String address; @@ -39,16 +36,4 @@ abstract class EVMChainWalletAddressesBase extends WalletAddresses with Store { log(e.toString()); } } - - @override - PaymentURI getPaymentUri(String amount) { - switch (chainId) { - case 8453: - return BaseURI(amount: amount, address: address); - case 137: - return PolygonURI(amount: amount, address: address); - default: - return EthereumURI(amount: amount, address: address); - } - } } diff --git a/cw_monero/lib/monero_wallet_addresses.dart b/cw_monero/lib/monero_wallet_addresses.dart index 51c3e0f0a9..9a7264c035 100644 --- a/cw_monero/lib/monero_wallet_addresses.dart +++ b/cw_monero/lib/monero_wallet_addresses.dart @@ -157,5 +157,5 @@ abstract class MoneroWalletAddressesBase extends WalletAddresses with Store { addressInfos[account?.id ?? 0]?.any((it) => it.address == address) ?? false; @override - PaymentURI getPaymentUri(String amount) => MoneroURI(amount: amount, address: address); + PaymentURI getPaymentUri(String amount) => MoneroURI(address: address, amount: amount); } diff --git a/cw_nano/lib/nano_wallet_addresses.dart b/cw_nano/lib/nano_wallet_addresses.dart index f52cf4ca1f..d29433e39e 100644 --- a/cw_nano/lib/nano_wallet_addresses.dart +++ b/cw_nano/lib/nano_wallet_addresses.dart @@ -1,5 +1,4 @@ import 'package:cw_core/cake_hive.dart'; -import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; @@ -53,7 +52,4 @@ abstract class NanoWalletAddressesBase extends WalletAddresses with Store { printV(e.toString()); } } - - @override - PaymentURI getPaymentUri(String amount) => NanoURI(amount: amount, address: address); } diff --git a/cw_solana/lib/solana_wallet_addresses.dart b/cw_solana/lib/solana_wallet_addresses.dart index 634c73f375..7e9bd90089 100644 --- a/cw_solana/lib/solana_wallet_addresses.dart +++ b/cw_solana/lib/solana_wallet_addresses.dart @@ -1,4 +1,3 @@ -import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; @@ -35,7 +34,4 @@ abstract class SolanaWalletAddressesBase extends WalletAddresses with Store { printV(e.toString()); } } - - @override - PaymentURI getPaymentUri(String amount) => SolanaURI(amount: amount, address: address); } diff --git a/cw_tron/lib/tron_wallet_addresses.dart b/cw_tron/lib/tron_wallet_addresses.dart index 99767e9654..095f97fa9a 100644 --- a/cw_tron/lib/tron_wallet_addresses.dart +++ b/cw_tron/lib/tron_wallet_addresses.dart @@ -1,6 +1,5 @@ import 'dart:developer'; -import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:mobx/mobx.dart'; @@ -37,7 +36,4 @@ abstract class TronWalletAddressesBase extends WalletAddresses with Store { log(e.toString()); } } - - @override - PaymentURI getPaymentUri(String amount) => TronURI(amount: amount, address: address); } diff --git a/cw_wownero/lib/wownero_wallet_addresses.dart b/cw_wownero/lib/wownero_wallet_addresses.dart index c95d397631..ef17237f48 100644 --- a/cw_wownero/lib/wownero_wallet_addresses.dart +++ b/cw_wownero/lib/wownero_wallet_addresses.dart @@ -62,7 +62,7 @@ abstract class WowneroWalletAddressesBase extends WalletAddresses with Store { WowneroSubaddressList subaddressList; WowneroAccountList accountList; - + @override Set usedAddresses = Set(); @@ -152,5 +152,6 @@ abstract class WowneroWalletAddressesBase extends WalletAddresses with Store { addressInfos[account?.id ?? 0]?.any((it) => it.address == address) ?? false; @override - PaymentURI getPaymentUri(String amount) => WowneroURI(amount: amount, address: address); + PaymentURI getPaymentUri(String amount) => + MoneroURI(scheme: "wownero", address: address, amount: amount); } diff --git a/cw_zano/lib/zano_wallet_addresses.dart b/cw_zano/lib/zano_wallet_addresses.dart index 1562ea8eee..be25c9383e 100644 --- a/cw_zano/lib/zano_wallet_addresses.dart +++ b/cw_zano/lib/zano_wallet_addresses.dart @@ -1,4 +1,3 @@ -import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; @@ -38,7 +37,4 @@ abstract class ZanoWalletAddressesBase extends WalletAddresses with Store { printV(e.toString()); } } - - @override - PaymentURI getPaymentUri(String amount) => ZanoURI(amount: amount, address: address); } diff --git a/lib/view_model/exchange/exchange_trade_view_model.dart b/lib/view_model/exchange/exchange_trade_view_model.dart index 09b478da79..a2cf0d738e 100644 --- a/lib/view_model/exchange/exchange_trade_view_model.dart +++ b/lib/view_model/exchange/exchange_trade_view_model.dart @@ -414,13 +414,11 @@ abstract class ExchangeTradeViewModelBase with Store { switch (wallet.type) { case WalletType.bitcoin: - return BitcoinURI(amount: amount, address: inputAddress); - case WalletType.litecoin: - return LitecoinURI(amount: amount, address: inputAddress); + return BitcoinURI(address: inputAddress, amount: amount); case WalletType.bitcoinCash: - return BitcoinCashURI(amount: amount, address: inputAddress); + return BitcoinCashURI(address: inputAddress, amount: amount); case WalletType.dogecoin: - return DogeURI(amount: amount, address: inputAddress); + return PaymentURI(scheme: "doge", address: inputAddress, amount: amount); case WalletType.ethereum: return _createERC681URI(fromCurrency, inputAddress, amount); // TODO: Expand ERC681URI support to Polygon(modify decoding flow for QRs, pay anything, and deep link handling) @@ -435,17 +433,17 @@ abstract class ExchangeTradeViewModelBase with Store { case WalletType.tron: return TronURI(amount: amount, address: inputAddress); case WalletType.monero: - return MoneroURI(amount: amount, address: inputAddress); + return MoneroURI(address: inputAddress, amount: amount); case WalletType.wownero: - return WowneroURI(amount: amount, address: inputAddress); - case WalletType.zano: - return ZanoURI(amount: amount, address: inputAddress); - case WalletType.decred: - return DecredURI(amount: amount, address: inputAddress); - case WalletType.nano: - return NanoURI(amount: amount, address: inputAddress); + return MoneroURI( + scheme: walletTypeToString(wallet.type).toLowerCase(), + address: inputAddress, + amount: amount); default: - return null; + return PaymentURI( + scheme: walletTypeToString(wallet.type).toLowerCase(), + address: inputAddress, + amount: amount); } } diff --git a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart index 92f4c24a78..db7111017a 100644 --- a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart +++ b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart @@ -115,9 +115,7 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo @action Future refreshUri() async { - print(amount); uri = await wallet.walletAddresses.getPaymentRequestUri(amount); - print(uri); } @computed From 008f2af20dbb80f1c403a7e82b8dc2c2cf096434 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Tue, 4 Nov 2025 21:53:54 +0100 Subject: [PATCH 015/105] refactor: remove redundant debug print statement from `bitcoin_wallet_addresses.dart` --- cw_bitcoin/lib/bitcoin_wallet_addresses.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart index 7df16b020e..c14ab11849 100644 --- a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart +++ b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart @@ -119,7 +119,6 @@ abstract class BitcoinWalletAddressesBase extends ElectrumWalletAddresses with S final invoice = await lightningWallet!.getBolt11Invoice(amountSats, "Send to Cake Wallet"); return LightningPaymentRequest(address: address, amount: amount, bolt11Invoice: invoice); } - print(amount); return getPaymentUri(amount); } } From db80ebfe493dcc9b066ef8836475d8a4ef479da0 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Wed, 5 Nov 2025 14:39:07 +0100 Subject: [PATCH 016/105] refactor: improve consistency in widget styling and centralized label logic, add Bitcoin Lightning deposit/withdraw support --- .../pages/balance/balance_row_widget.dart | 144 ++++++++++-------- res/values/strings_ar.arb | 2 + res/values/strings_bg.arb | 2 + res/values/strings_cs.arb | 2 + res/values/strings_de.arb | 4 +- res/values/strings_en.arb | 2 + res/values/strings_es.arb | 2 + res/values/strings_fr.arb | 2 + res/values/strings_ha.arb | 2 + res/values/strings_hi.arb | 2 + res/values/strings_hr.arb | 2 + res/values/strings_hy.arb | 2 + res/values/strings_id.arb | 2 + res/values/strings_it.arb | 2 + res/values/strings_ja.arb | 2 + res/values/strings_ko.arb | 2 + res/values/strings_my.arb | 2 + res/values/strings_nl.arb | 2 + res/values/strings_pl.arb | 2 + res/values/strings_pt.arb | 2 + res/values/strings_ru.arb | 2 + res/values/strings_th.arb | 2 + res/values/strings_tl.arb | 2 + res/values/strings_tr.arb | 2 + res/values/strings_uk.arb | 2 + res/values/strings_ur.arb | 2 + res/values/strings_vi.arb | 2 + res/values/strings_yo.arb | 2 + res/values/strings_zh.arb | 2 + 29 files changed, 139 insertions(+), 63 deletions(-) diff --git a/lib/src/screens/dashboard/pages/balance/balance_row_widget.dart b/lib/src/screens/dashboard/pages/balance/balance_row_widget.dart index 3dac4cea13..68d2ca2782 100644 --- a/lib/src/screens/dashboard/pages/balance/balance_row_widget.dart +++ b/lib/src/screens/dashboard/pages/balance/balance_row_widget.dart @@ -14,6 +14,7 @@ import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -148,14 +149,12 @@ class BalanceRowWidget extends StatelessWidget { maxLines: 1, textAlign: TextAlign.start, ), - SizedBox(height: 6), + const SizedBox(height: 6), if (isTestnet) Text( S.of(context).testnet_coins_no_value, textAlign: TextAlign.center, - style: Theme.of(context).textTheme.bodyMedium?.copyWith( - height: 1, - ), + style: Theme.of(context).textTheme.bodyMedium?.copyWith(height: 1), ), if (!isTestnet) Text( @@ -216,7 +215,7 @@ class BalanceRowWidget extends StatelessWidget { if (currency.isPotentialScam) Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 2), - margin: EdgeInsets.only(top: 4), + margin: const EdgeInsets.only(top: 4), decoration: BoxDecoration( color: Theme.of(context).colorScheme.errorContainer, borderRadius: BorderRadius.circular(8), @@ -244,7 +243,7 @@ class BalanceRowWidget extends StatelessWidget { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - SizedBox(height: 26), + const SizedBox(height: 26), Row( children: [ Text( @@ -257,7 +256,7 @@ class BalanceRowWidget extends StatelessWidget { ), ], ), - SizedBox(height: 8), + const SizedBox(height: 8), AutoSizeText( frozenBalance, style: Theme.of(context).textTheme.bodyLarge!.copyWith( @@ -268,14 +267,12 @@ class BalanceRowWidget extends StatelessWidget { maxLines: 1, textAlign: TextAlign.center, ), - SizedBox(height: 4), + const SizedBox(height: 4), if (!isTestnet) Text( frozenFiatBalance, textAlign: TextAlign.center, - style: Theme.of(context).textTheme.bodySmall!.copyWith( - height: 1, - ), + style: Theme.of(context).textTheme.bodySmall!.copyWith(height: 1), ), ], ), @@ -283,7 +280,7 @@ class BalanceRowWidget extends StatelessWidget { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - SizedBox(height: 24), + const SizedBox(height: 24), Text( '${additionalBalanceLabel}', textAlign: TextAlign.center, @@ -292,7 +289,7 @@ class BalanceRowWidget extends StatelessWidget { height: 1, ), ), - SizedBox(height: 8), + const SizedBox(height: 8), AutoSizeText( additionalBalance, style: Theme.of(context).textTheme.bodyLarge!.copyWith( @@ -303,14 +300,12 @@ class BalanceRowWidget extends StatelessWidget { maxLines: 1, textAlign: TextAlign.center, ), - SizedBox(height: 4), + const SizedBox(height: 4), if (!isTestnet) Text( '${additionalFiatBalance}', textAlign: TextAlign.center, - style: Theme.of(context).textTheme.bodySmall!.copyWith( - height: 1, - ), + style: Theme.of(context).textTheme.bodySmall!.copyWith(height: 1), ), ], ), @@ -333,15 +328,6 @@ class BalanceRowWidget extends StatelessWidget { begin: Alignment.topCenter, end: Alignment.bottomCenter, ), - // boxShadow: [ - // BoxShadow( - // color: Theme.of(context) - // .extension()! - // .cardBorderColor - // .withAlpha(50), - // spreadRadius: dashboardViewModel.getShadowSpread(), - // blurRadius: dashboardViewModel.getShadowBlur()) - // ], ), child: TextButton( onPressed: _showToast, @@ -360,27 +346,48 @@ class BalanceRowWidget extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.end, children: [ - Container( - child: Column( - children: [ - Container( - child: ImageIcon( - AssetImage('assets/images/mweb_logo.png'), - size: 40, - ), - ), - const SizedBox(height: 10), - Text( - 'MWEB', - style: Theme.of(context).textTheme.bodyMedium?.copyWith( - fontSize: 16, - fontWeight: FontWeight.w700, - color: Theme.of(context).colorScheme.onSurface, - height: 1, - ), - ), - ], - ), + Column( + children: [ + ImageIcon( + AssetImage('assets/images/mweb_logo.png'), + size: 40, + ), + const SizedBox(height: 10), + Text( + 'MWEB', + style: Theme.of(context).textTheme.bodyMedium?.copyWith( + fontSize: 16, + fontWeight: FontWeight.w700, + color: Theme.of(context).colorScheme.onSurface, + height: 1, + ), + ), + ], + ), + ], + ), + if (currency == CryptoCurrency.btc) + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Column( + children: [ + SvgPicture.asset( + 'assets/images/lightning-icon.svg', + width: 40, + height: 40, + ), + const SizedBox(height: 10), + Text( + 'Lightning', + style: Theme.of(context).textTheme.bodyMedium?.copyWith( + fontSize: 16, + fontWeight: FontWeight.w700, + color: Theme.of(context).colorScheme.onSurface, + height: 1, + ), + ), + ], ), ], ), @@ -392,15 +399,11 @@ class BalanceRowWidget extends StatelessWidget { children: [ GestureDetector( behavior: HitTestBehavior.opaque, - onTap: () => launchUrl( - Uri.parse( - "https://docs.cakewallet.com/cryptos/litecoin#mweb"), - mode: LaunchMode.externalApplication, - ), + onTap: onPressedHelp, child: Row( children: [ Text( - '${secondAvailableBalanceLabel}', + secondAvailableBalanceLabel, textAlign: TextAlign.center, style: Theme.of(context).textTheme.bodySmall?.copyWith( color: @@ -434,7 +437,7 @@ class BalanceRowWidget extends StatelessWidget { SizedBox(height: 6), if (!isTestnet) Text( - '${secondAvailableFiatBalance}', + secondAvailableFiatBalance, textAlign: TextAlign.center, style: Theme.of(context).textTheme.bodyMedium?.copyWith( fontSize: 16, @@ -462,7 +465,7 @@ class BalanceRowWidget extends StatelessWidget { children: [ SizedBox(height: 24), Text( - '${secondAdditionalBalanceLabel}', + secondAdditionalBalanceLabel, textAlign: TextAlign.center, style: Theme.of(context).textTheme.bodySmall?.copyWith( color: Theme.of(context).colorScheme.onSurfaceVariant, @@ -498,13 +501,13 @@ class BalanceRowWidget extends StatelessWidget { ), IntrinsicHeight( child: Container( - padding: EdgeInsets.symmetric(horizontal: 12), + padding: const EdgeInsets.symmetric(horizontal: 12), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Semantics( - label: S.of(context).litecoin_mweb_pegin, + label: depositToL2Label, child: OutlinedButton( onPressed: () => depositToL2(context), style: OutlinedButton.styleFrom( @@ -519,7 +522,7 @@ class BalanceRowWidget extends StatelessWidget { ), ), child: Container( - padding: EdgeInsets.symmetric(vertical: 12), + padding: const EdgeInsets.symmetric(vertical: 12), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -531,7 +534,7 @@ class BalanceRowWidget extends StatelessWidget { ), const SizedBox(width: 8), Text( - S.of(context).litecoin_mweb_pegin, + depositToL2Label, style: Theme.of(context).textTheme.bodyMedium?.copyWith( color: Theme.of(context).colorScheme.onPrimary, fontWeight: FontWeight.w700, @@ -546,7 +549,7 @@ class BalanceRowWidget extends StatelessWidget { SizedBox(width: 16), Expanded( child: Semantics( - label: S.of(context).litecoin_mweb_pegout, + label: withdrawFromL2Label, child: OutlinedButton( onPressed: () => withdrawFromL2(context), style: OutlinedButton.styleFrom( @@ -573,7 +576,7 @@ class BalanceRowWidget extends StatelessWidget { ), const SizedBox(width: 8), Text( - S.of(context).litecoin_mweb_pegout, + withdrawFromL2Label, style: Theme.of(context).textTheme.bodyMedium?.copyWith( color: Theme.of(context) .colorScheme @@ -591,7 +594,7 @@ class BalanceRowWidget extends StatelessWidget { ), ), ), - SizedBox(height: 16), + const SizedBox(height: 16), ], ), ), @@ -601,6 +604,14 @@ class BalanceRowWidget extends StatelessWidget { ); } + String get depositToL2Label => dashboardViewModel.type == WalletType.litecoin + ? S.current.litecoin_mweb_pegin + : S.current.bitcoin_lightning_deposit; + + String get withdrawFromL2Label => dashboardViewModel.type == WalletType.litecoin + ? S.current.litecoin_mweb_pegout + : S.current.bitcoin_lightning_withdraw; + Future depositToL2(BuildContext context) async { PaymentRequest? paymentRequest = null; @@ -653,6 +664,15 @@ class BalanceRowWidget extends StatelessWidget { ); } + void onPressedHelp() { + var helpUri = Uri.parse("https://docs.cakewallet.com/cryptos/bitcoin#lightning"); + if (dashboardViewModel.type == WalletType.litecoin) { + helpUri = Uri.parse("https://docs.cakewallet.com/cryptos/litecoin#mweb"); + } + + launchUrl(helpUri, mode: LaunchMode.externalApplication); + } + void _showBalanceDescription(BuildContext context, String content) { showPopUp(context: context, builder: (_) => InformationPage(information: content)); } diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index 22dec10127..6421af3f3b 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "امسح بصمة إصبعك للمصادقة", "bitcoin_dark_theme": "موضوع البيتكوين الظلام", "bitcoin_light_theme": "موضوع البيتكوين الخفيفة", + "bitcoin_lightning_deposit": "إيداع", + "bitcoin_lightning_withdraw": "ينسحب", "bitcoin_payments_require_1_confirmation": "تتطلب مدفوعات Bitcoin تأكيدًا واحدًا ، والذي قد يستغرق 20 دقيقة أو أكثر. شكرا لصبرك! سيتم إرسال بريد إلكتروني إليك عند تأكيد الدفع.", "block_height": "ارتفاع كتلة", "block_remaining": "1 كتلة متبقية", diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index 5ccf69bd9b..8bbf2603c5 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "Сканирайте своя пръстов отпечатък", "bitcoin_dark_theme": "Тъмна тема за биткойн", "bitcoin_light_theme": "Лека биткойн тема", + "bitcoin_lightning_deposit": "Депозит", + "bitcoin_lightning_withdraw": "Оттегляне", "bitcoin_payments_require_1_confirmation": "Плащанията с Bitcoin изискват потвърждение, което може да отнеме 20 минути или повече. Благодарим за търпението! Ще получите имейл, когато плащането е потвърдено.", "block_height": "Височина на блока", "block_remaining": "1 блок останал", diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index d34969614c..a0be8ad828 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "Naskenujte otisk prstu pro ověření", "bitcoin_dark_theme": "Tmavé téma bitcoinů", "bitcoin_light_theme": "Světlé téma bitcoinů", + "bitcoin_lightning_deposit": "Vklad", + "bitcoin_lightning_withdraw": "Odebrat", "bitcoin_payments_require_1_confirmation": "U plateb Bitcoinem je vyžadováno alespoň 1 potvrzení, což může trvat 20 minut i déle. Děkujeme za vaši trpělivost! Až bude platba potvrzena, budete informováni e-mailem.", "block_height": "Výška bloku", "block_remaining": "1 blok zbývající", diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index b238504450..91647c2d3b 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "Scannen Sie Ihren Fingerabdruck zur Authentifizierung", "bitcoin_dark_theme": "Dunkles Bitcoin-Thema", "bitcoin_light_theme": "Bitcoin Light-Thema", + "bitcoin_lightning_deposit": "Einzahlen", + "bitcoin_lightning_withdraw": "Auszahlen", "bitcoin_payments_require_1_confirmation": "Bitcoin-Zahlungen erfordern 1 Bestätigung, was 20 Minuten oder länger dauern kann. Danke für Ihre Geduld! Sie erhalten eine E-Mail, wenn die Zahlung bestätigt ist.", "block_height": "Blockhöhe", "block_remaining": "1 Block verbleibend", @@ -1162,4 +1164,4 @@ "youCanGoBackToYourDapp": "Sie können jetzt zu Ihrem Dapp zurückkehren", "your": "Dein", "yy": "YY" -} \ No newline at end of file +} diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index f436f41ac0..9702c20216 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "Scan your fingerprint to authenticate", "bitcoin_dark_theme": "Bitcoin Dark Theme", "bitcoin_light_theme": "Bitcoin Light Theme", + "bitcoin_lightning_deposit": "Deposit", + "bitcoin_lightning_withdraw": "Withdraw", "bitcoin_payments_require_1_confirmation": "Bitcoin payments require 1 confirmation, which can take 20 minutes or longer. Thanks for your patience! You will be emailed when the payment is confirmed.", "block_height": "Block height", "block_remaining": "1 Block Remaining", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index f3fd8c57d5..c93208f14e 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "Escanee su huella dactilar para autenticarse", "bitcoin_dark_theme": "Tema oscuro de Bitcoin", "bitcoin_light_theme": "Tema claro de Bitcoin", + "bitcoin_lightning_deposit": "Depósito", + "bitcoin_lightning_withdraw": "Retirar", "bitcoin_payments_require_1_confirmation": "Los pagos de Bitcoin requieren 1 confirmación, que puede tardar 20 minutos o más. ¡Gracias por tu paciencia! Recibirás un correo electrónico cuando se confirme el pago.", "block_height": "Altura del bloque", "block_remaining": "1 bloque restante", diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index 67c62b7a48..76508d39d9 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "Scannez votre empreinte digitale pour vous authentifier", "bitcoin_dark_theme": "Thème sombre Bitcoin", "bitcoin_light_theme": "Thème clair Bitcoin", + "bitcoin_lightning_deposit": "Dépôt", + "bitcoin_lightning_withdraw": "Retirer", "bitcoin_payments_require_1_confirmation": "Les paiements Bitcoin nécessitent 1 confirmation, ce qui peut prendre 20 minutes ou plus. Merci pour votre patience ! Vous serez averti par e-mail lorsque le paiement sera confirmé.", "block_height": "Hauteur de bloc", "block_remaining": "1 bloc restant", diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index 5058e465a3..f9593dd0e3 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "Duba hoton yatsa don tantancewa", "bitcoin_dark_theme": "Bitcoin Dark Jigo", "bitcoin_light_theme": "Jigon Hasken Bitcoin", + "bitcoin_lightning_deposit": "Yi ajiya", + "bitcoin_lightning_withdraw": "Janye", "bitcoin_payments_require_1_confirmation": "Akwatin Bitcoin na buɗe 1 sambumbu, da yake za ta samu mintuna 20 ko yawa. Ina kira ga sabuwar lafiya! Zaka sanarwa ta email lokacin da aka samu akwatin samun lambar waya.", "block_height": "Toshe tsawo", "block_remaining": "1 toshe ragowar", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 625b8e1b55..9a81ce8bee 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "प्रमाणित करने के लिए अपने फ़िंगरप्रिंट को स्कैन करें", "bitcoin_dark_theme": "बिटकॉइन डार्क थीम", "bitcoin_light_theme": "बिटकॉइन लाइट थीम", + "bitcoin_lightning_deposit": "जमा", + "bitcoin_lightning_withdraw": "निकालना", "bitcoin_payments_require_1_confirmation": "बिटकॉइन भुगतान के लिए 1 पुष्टिकरण की आवश्यकता होती है, जिसमें 20 मिनट या अधिक समय लग सकता है। आपके धैर्य के लिए धन्यवाद! भुगतान की पुष्टि होने पर आपको ईमेल किया जाएगा।", "block_height": "ब्लॉक ऊंचाई", "block_remaining": "1 ब्लॉक शेष", diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index 726e00bad1..18192d1af6 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "Skenirajte svoj otisak prsta za autentifikaciju", "bitcoin_dark_theme": "Bitcoin Tamna tema", "bitcoin_light_theme": "Bitcoin Light Theme", + "bitcoin_lightning_deposit": "Polog", + "bitcoin_lightning_withdraw": "Povući", "bitcoin_payments_require_1_confirmation": "Bitcoin plaćanja zahtijevaju 1 potvrdu, što može potrajati 20 minuta ili dulje. Hvala na Vašem strpljenju! Dobit ćete e-poruku kada plaćanje bude potvrđeno.", "block_height": "Visina bloka", "block_remaining": "Preostalo 1 blok", diff --git a/res/values/strings_hy.arb b/res/values/strings_hy.arb index b750b1e61a..c49e612709 100644 --- a/res/values/strings_hy.arb +++ b/res/values/strings_hy.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "Սկանավեք ձեր մատնահետքը նույնականացման համար", "bitcoin_dark_theme": "Bitcoin մութ տեսք", "bitcoin_light_theme": "Bitcoin պայծառ տեսք", + "bitcoin_lightning_deposit": "Ավանդ", + "bitcoin_lightning_withdraw": "Հանել", "bitcoin_payments_require_1_confirmation": "Bitcoin վճարումները պահանջում են 1 հաստատում, որը կարող է տևել 20 րոպե կամ ավելի: Շնորհակալություն ձեր համբերության համար: Դուք էլ. նամակ կստանաք, երբ վճարումը հաստատվի։", "block_height": "Բլոկի բարձրությունը", "block_remaining": "1 Բլոկ է մնացել", diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index 12489e80ac..cb02ce7d28 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "Pindai sidik jari Anda untuk mengautentikasi", "bitcoin_dark_theme": "Tema Gelap Bitcoin", "bitcoin_light_theme": "Tema Cahaya Bitcoin", + "bitcoin_lightning_deposit": "Deposito", + "bitcoin_lightning_withdraw": "Menarik", "bitcoin_payments_require_1_confirmation": "Pembayaran Bitcoin memerlukan 1 konfirmasi, yang bisa memakan waktu 20 menit atau lebih. Terima kasih atas kesabaran Anda! Anda akan diemail saat pembayaran dikonfirmasi.", "block_height": "Tinggi blok", "block_remaining": "1 blok tersisa", diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index 55f676cf39..cb95a595b0 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "Scansiona la tua impronta per autenticarti", "bitcoin_dark_theme": "Tema scuro Bitcoin", "bitcoin_light_theme": "Tema chiaro Bitcoin", + "bitcoin_lightning_deposit": "Depositare", + "bitcoin_lightning_withdraw": "Ritirare", "bitcoin_payments_require_1_confirmation": "I pagamenti in bitcoin richiedono 1 conferma, che può richiedere 20 minuti o più. Grazie per la vostra pazienza! Riceverai un'e-mail quando il pagamento sarà confermato.", "block_height": "Altezza del blocco", "block_remaining": "1 blocco rimanente", diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 261943d259..41d34a7edb 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "प指紋をスキャンして認証する", "bitcoin_dark_theme": "ビットコインダークテーマ", "bitcoin_light_theme": "ビットコインライトテーマ", + "bitcoin_lightning_deposit": "デポジット", + "bitcoin_lightning_withdraw": "撤回する", "bitcoin_payments_require_1_confirmation": "ビットコインの支払いには 1 回の確認が必要で、これには 20 分以上かかる場合があります。お待ち頂きまして、ありがとうございます!支払いが確認されると、メールが送信されます。", "block_height": "ブロックの高さ", "block_remaining": "残り1ブロック", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index f2f4cd5979..a281f0aafb 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "인증하려면 지문을 스캔하세요", "bitcoin_dark_theme": "비트코인 다크 테마", "bitcoin_light_theme": "비트코인 라이트 테마", + "bitcoin_lightning_deposit": "보증금", + "bitcoin_lightning_withdraw": "철회하다", "bitcoin_payments_require_1_confirmation": "비트코인 결제는 1번의 확인이 필요하며, 이는 20분 이상 소요될 수 있습니다. 기다려 주셔서 감사합니다! 결제가 확인되면 이메일로 알려드립니다.", "block_height": "블록 높이", "block_remaining": "1 블록 남음", diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index 39eabdfbc0..d1c539a177 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "စစ်မှန်ကြောင်းအထောက်အထားပြရန် သင့်လက်ဗွေကို စကန်ဖတ်ပါ။", "bitcoin_dark_theme": "Bitcoin Dark Theme", "bitcoin_light_theme": "Bitcoin Light အပြင်အဆင်", + "bitcoin_lightning_deposit": "အပ်ငေှ", + "bitcoin_lightning_withdraw": "ဆုတ်ခွာ", "bitcoin_payments_require_1_confirmation": "Bitcoin ငွေပေးချေမှုများသည် မိနစ် 20 သို့မဟုတ် ထို့ထက်ပိုကြာနိုင်သည် 1 အတည်ပြုချက် လိုအပ်သည်။ မင်းရဲ့စိတ်ရှည်မှုအတွက် ကျေးဇူးတင်ပါတယ်။ ငွေပေးချေမှုကို အတည်ပြုပြီးသောအခါ သင့်ထံ အီးမေးလ်ပို့ပါမည်။", "block_height": "ပိတ်ပင်တားဆီးမှုအမြင့်", "block_remaining": "ကျန်ရှိနေသေးသော block", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index dd9ad4e3ca..9e26107024 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "Scan uw vingerafdruk om te verifiëren", "bitcoin_dark_theme": "Bitcoin donker thema", "bitcoin_light_theme": "Bitcoin Light-thema", + "bitcoin_lightning_deposit": "Borg", + "bitcoin_lightning_withdraw": "Terugtrekken", "bitcoin_payments_require_1_confirmation": "Bitcoin-betalingen vereisen 1 bevestiging, wat 20 minuten of langer kan duren. Dank voor uw geduld! U ontvangt een e-mail wanneer de betaling is bevestigd.", "block_height": "Blokhoogte", "block_remaining": "1 blok resterend", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index 5b27af5109..757da393f1 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "Zeskanuj odcisk palca, aby się uwierzytelnić", "bitcoin_dark_theme": "Ciemny motyw Bitcoin", "bitcoin_light_theme": "Jasny motyw Bitcoin", + "bitcoin_lightning_deposit": "Depozyt", + "bitcoin_lightning_withdraw": "Wycofać", "bitcoin_payments_require_1_confirmation": "Płatności Bitcoin wymagają jednego potwierdzenia, co może zająć 20 minut lub dłużej. Dziękujemy za cierpliwość! Otrzymasz e‑mail, gdy płatność zostanie potwierdzona.", "block_height": "Wysokość bloku", "block_remaining": "Pozostał 1 blok", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index f8831534e7..93611fddb5 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "Digitalize sua impressão digital para autenticar", "bitcoin_dark_theme": "Tema escuro Bitcoin", "bitcoin_light_theme": "Tema claro de bitcoin", + "bitcoin_lightning_deposit": "Depósito", + "bitcoin_lightning_withdraw": "Retirar", "bitcoin_payments_require_1_confirmation": "Os pagamentos em Bitcoin exigem 1 confirmação, o que pode levar 20 minutos ou mais. Obrigado pela sua paciência! Você receberá um e-mail quando o pagamento for confirmado.", "block_height": "Altura do bloco", "block_remaining": "1 bloco restante", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index de31f95f46..425a9b28f7 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "Отсканируйте свой отпечаток пальца для аутентификации", "bitcoin_dark_theme": "Биткойн Темная тема", "bitcoin_light_theme": "Светлая биткойн-тема", + "bitcoin_lightning_deposit": "Депозит", + "bitcoin_lightning_withdraw": "Отзывать", "bitcoin_payments_require_1_confirmation": "Биткойн-платежи требуют 1 подтверждения, что может занять 20 минут или дольше. Спасибо тебе за твое терпение! Вы получите электронное письмо, когда платеж будет подтвержден.", "block_height": "Высота блока", "block_remaining": "1 Блок остался", diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index 6b4fcbd559..6457e3ebcd 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "สแกนลายนิ้วมือของคุณเพื่อยืนยันตัวตน", "bitcoin_dark_theme": "ธีมมืด Bitcoin", "bitcoin_light_theme": "ธีมแสง Bitcoin", + "bitcoin_lightning_deposit": "เงินฝาก", + "bitcoin_lightning_withdraw": "ถอน", "bitcoin_payments_require_1_confirmation": "การชำระเงินด้วย Bitcoin ต้องการการยืนยัน 1 ครั้ง ซึ่งอาจใช้เวลา 20 นาทีหรือนานกว่านั้น ขอบคุณสำหรับความอดทนของคุณ! คุณจะได้รับอีเมลเมื่อการชำระเงินได้รับการยืนยัน", "block_height": "ความสูงของบล็อก", "block_remaining": "เหลือ 1 บล็อก", diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb index 31f530b520..f4c7202077 100644 --- a/res/values/strings_tl.arb +++ b/res/values/strings_tl.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "I-scan ang iyong fingerprint para ma-authenticate", "bitcoin_dark_theme": "Bitcoin Dark Theme", "bitcoin_light_theme": "Bitcoin Light Theme", + "bitcoin_lightning_deposit": "Deposito", + "bitcoin_lightning_withdraw": "Umatras", "bitcoin_payments_require_1_confirmation": "Ang mga pagbabayad sa Bitcoin ay nangangailangan ng 1 kumpirmasyon, na maaaring tumagal ng 20 minuto o mas mahaba. Salamat sa iyong pasensya! Mag-email ka kapag nakumpirma ang pagbabayad.", "block_height": "I -block ang taas", "block_remaining": "1 Bloke ang Natitira", diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index 1236c3c83e..b290c0030e 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "Kimlik doğrulaması için parmak izini okutun", "bitcoin_dark_theme": "Bitcoin Karanlık Teması", "bitcoin_light_theme": "Bitcoin Hafif Tema", + "bitcoin_lightning_deposit": "Mevduat", + "bitcoin_lightning_withdraw": "Geri çekilmek", "bitcoin_payments_require_1_confirmation": "Bitcoin ödemeleri, 20 dakika veya daha uzun sürebilen 1 onay gerektirir. Sabrınız için teşekkürler! Ödeme onaylandığında e-posta ile bilgilendirileceksiniz.", "block_height": "Blok yüksekliği", "block_remaining": "Kalan 1 blok", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index cabc4a937c..bab1edf2d8 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "Відскануйте свій відбиток пальця для аутентифікації", "bitcoin_dark_theme": "Темна тема Bitcoin", "bitcoin_light_theme": "Світла тема Bitcoin", + "bitcoin_lightning_deposit": "депозит", + "bitcoin_lightning_withdraw": "Вилучити", "bitcoin_payments_require_1_confirmation": "Платежі Bitcoin потребують 1 підтвердження, яке може зайняти 20 хвилин або більше. Дякую за Ваше терпіння! Ви отримаєте електронний лист, коли платіж буде підтверджено.", "block_height": "Висота блоку", "block_remaining": "1 блок, що залишився", diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index 8f361ae6a0..fd3240d4a7 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "تصدیق کرنے کے لیے اپنے فنگر پرنٹ کو اسکین کریں۔", "bitcoin_dark_theme": "بٹ کوائن ڈارک تھیم", "bitcoin_light_theme": "بٹ کوائن لائٹ تھیم", + "bitcoin_lightning_deposit": "جمع کروائیں", + "bitcoin_lightning_withdraw": "واپس لے لو", "bitcoin_payments_require_1_confirmation": "بٹ کوائن کی ادائیگی میں 1 تصدیق کی ضرورت ہوتی ہے ، جس میں 20 منٹ یا اس سے زیادہ وقت لگ سکتا ہے۔ آپ کے صبر کا شکریہ! ادائیگی کی تصدیق ہونے پر آپ کو ای میل کیا جائے گا۔", "block_height": "اونچائی کو بلاک کریں", "block_remaining": "1 بلاک باقی", diff --git a/res/values/strings_vi.arb b/res/values/strings_vi.arb index be4d2a4010..b93e252ed4 100644 --- a/res/values/strings_vi.arb +++ b/res/values/strings_vi.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "Quét vân tay để xác thực", "bitcoin_dark_theme": "Chủ đề Bitcoin tối", "bitcoin_light_theme": "Chủ đề Bitcoin sáng", + "bitcoin_lightning_deposit": "Tiền gửi", + "bitcoin_lightning_withdraw": "Rút", "bitcoin_payments_require_1_confirmation": "Các khoản thanh toán Bitcoin yêu cầu 1 xác nhận, có thể mất 20 phút hoặc lâu hơn. Cảm ơn bạn đã kiên nhẫn! Bạn sẽ nhận được email khi thanh toán được xác nhận.", "block_height": "Chiều cao khối", "block_remaining": "1 khối còn lại", diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index 7f2a603479..ff53fd283b 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "Ya ìka ọwọ́ yín láti ṣe ìfẹ̀rílàdí", "bitcoin_dark_theme": "Bitcoin Dark Akori", "bitcoin_light_theme": "Bitcoin Light Akori", + "bitcoin_lightning_deposit": "Owo ifipamọ", + "bitcoin_lightning_withdraw": "Yọkuro", "bitcoin_payments_require_1_confirmation": "Àwọn àránṣẹ́ Bitcoin nílò ìjẹ́rìísí kan. Ó lè lo ìṣéjú ogun tàbí ìṣéjú jù. A dúpẹ́ fún sùúrù yín! Ẹ máa gba ímeèlì t'ó bá jẹ́rìísí àránṣẹ́ náà.", "block_height": "Dènà giga", "block_remaining": "1 bulọọki to ku", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index cee2aa801c..a08d072f8b 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -95,6 +95,8 @@ "biometric_auth_reason": "扫描指纹进行身份认证", "bitcoin_dark_theme": "比特币黑暗主题", "bitcoin_light_theme": "比特币浅色主题", + "bitcoin_lightning_deposit": "订金", + "bitcoin_lightning_withdraw": "提取", "bitcoin_payments_require_1_confirmation": "比特币支付需要 1 次确认,这可能需要 20 分钟或更长时间。谢谢你的耐心!确认付款后,您将收到电子邮件。", "block_height": "块高度", "block_remaining": "剩下1个块", From 37bf40d118727f39c04fb7c24e503607825954e0 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Wed, 5 Nov 2025 16:16:37 +0100 Subject: [PATCH 017/105] feat: reload balance and tx history after sending a lightning transaction --- assets/images/lightning-icon.svg | 46 +++++++++++++++++++ .../lib/lightning/lightning_wallet.dart | 8 ++-- .../pending_lightning_transaction.dart | 8 +++- cw_bitcoin/pubspec.yaml | 2 +- lib/view_model/send/send_view_model.dart | 5 +- 5 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 assets/images/lightning-icon.svg diff --git a/assets/images/lightning-icon.svg b/assets/images/lightning-icon.svg new file mode 100644 index 0000000000..aa4d3a9225 --- /dev/null +++ b/assets/images/lightning-icon.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cw_bitcoin/lib/lightning/lightning_wallet.dart b/cw_bitcoin/lib/lightning/lightning_wallet.dart index 4d44dc3b58..087bfa1079 100644 --- a/cw_bitcoin/lib/lightning/lightning_wallet.dart +++ b/cw_bitcoin/lib/lightning/lightning_wallet.dart @@ -2,7 +2,6 @@ import 'package:breez_sdk_spark_flutter/breez_sdk_spark.dart'; import 'package:cw_bitcoin/bitcoin_transaction_priority.dart'; import 'package:cw_bitcoin/electrum_transaction_info.dart'; import 'package:cw_bitcoin/lightning/pending_lightning_transaction.dart'; -import 'package:cw_core/pending_transaction.dart'; import 'package:cw_core/transaction_direction.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_type.dart'; @@ -81,7 +80,7 @@ class LightningWallet { } } - Future createTransaction( + Future createTransaction( String address, BigInt? amountSats, BitcoinTransactionPriority? priority) async { final inputType = await sdk.parse(input: address); @@ -120,10 +119,11 @@ class LightningWallet { return PendingLightningTransaction( id: prepareResponse.invoiceDetails.paymentHash, - amount: prepareResponse.invoiceDetails.amountMsat?.toInt() ?? 0, + amount: ((prepareResponse.invoiceDetails.amountMsat?.toInt() ?? 0) / 1000).round(), fee: feeSats.toInt(), commitOverride: () async { - await sdk.lnurlPay(request: LnurlPayRequest(prepareResponse: prepareResponse)); + final res = await sdk.lnurlPay(request: LnurlPayRequest(prepareResponse: prepareResponse)); + printV(res.payment.status.name); }, ); } else if (inputType is InputType_BitcoinAddress) { diff --git a/cw_bitcoin/lib/lightning/pending_lightning_transaction.dart b/cw_bitcoin/lib/lightning/pending_lightning_transaction.dart index 72b4423783..cb75b7d2b3 100644 --- a/cw_bitcoin/lib/lightning/pending_lightning_transaction.dart +++ b/cw_bitcoin/lib/lightning/pending_lightning_transaction.dart @@ -14,6 +14,7 @@ class PendingLightningTransaction with PendingTransaction { final int fee; final bool isSendAll; Future Function() commitOverride; + final List _listeners =[]; @override final String id; @@ -34,11 +35,16 @@ class PendingLightningTransaction with PendingTransaction { int? get outputCount => 1; @override - Future commit() => commitOverride.call(); + Future commit() async { + await commitOverride.call(); + _listeners.forEach((e) => e.call()); + } @override bool shouldCommitUR() => false; @override Future> commitUR() => throw UnimplementedError(); + + void addListener(void Function() listener) => _listeners.add(listener); } diff --git a/cw_bitcoin/pubspec.yaml b/cw_bitcoin/pubspec.yaml index 439492bda0..ca6f75f0fa 100644 --- a/cw_bitcoin/pubspec.yaml +++ b/cw_bitcoin/pubspec.yaml @@ -75,7 +75,7 @@ dependencies: breez_sdk_spark_flutter: git: url: https://github.com/breez/breez-sdk-spark-flutter - ref: 92f62dc2037cf08003e418aadda58f451c021f42 + ref: bca05bc9085f778e95916d55e9a75133c27755a2 dev_dependencies: flutter_test: diff --git a/lib/view_model/send/send_view_model.dart b/lib/view_model/send/send_view_model.dart index 4090cb59e9..217d7cf45d 100644 --- a/lib/view_model/send/send_view_model.dart +++ b/lib/view_model/send/send_view_model.dart @@ -57,7 +57,6 @@ import 'package:cw_core/sync_status.dart'; import 'package:cw_core/transaction_info.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/utils/print_verbose.dart'; -import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:flutter/material.dart'; import 'package:hive/hive.dart'; @@ -807,9 +806,11 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor // Immediate transaction update for EVM chains, Solana, Tron, and Nano if (isEVMWallet || - [WalletType.solana, WalletType.tron, WalletType.nano].contains(walletType)) { + [WalletType.bitcoin, WalletType.solana, WalletType.tron, WalletType.nano] + .contains(walletType)) { Future.delayed(Duration(seconds: 4), () async { try { + await wallet.updateBalance(); await wallet.updateTransactionsHistory(); } catch (e) { printV('Failed to update transactions after send: $e'); From fda146c7f5a65128e3bb56af0d62d60ea2749c28 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Thu, 6 Nov 2025 09:53:07 +0100 Subject: [PATCH 018/105] feat: improve address formatting for human-readable addresses and update the default LNURL domain --- assets/images/btc_chain_qr_lightning.svg | 5 +++++ cw_bitcoin/lib/bitcoin_wallet.dart | 2 +- cw_bitcoin/lib/electrum_wallet_addresses.dart | 12 ++++++++++-- lib/utils/address_formatter.dart | 7 ++++++- .../wallet_address_list_view_model.dart | 5 ++++- 5 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 assets/images/btc_chain_qr_lightning.svg diff --git a/assets/images/btc_chain_qr_lightning.svg b/assets/images/btc_chain_qr_lightning.svg new file mode 100644 index 0000000000..b18ac0b9f8 --- /dev/null +++ b/assets/images/btc_chain_qr_lightning.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/cw_bitcoin/lib/bitcoin_wallet.dart b/cw_bitcoin/lib/bitcoin_wallet.dart index 304618e714..3b903897c1 100644 --- a/cw_bitcoin/lib/bitcoin_wallet.dart +++ b/cw_bitcoin/lib/bitcoin_wallet.dart @@ -99,7 +99,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { lightningWallet = LightningWallet( mnemonic: mnemonic, apiKey: secrets.breezApiKey, - lnurlDomain: "breez.tips", + lnurlDomain: "cake.cash", ); } else { lightningWallet = null; diff --git a/cw_bitcoin/lib/electrum_wallet_addresses.dart b/cw_bitcoin/lib/electrum_wallet_addresses.dart index 7ef455793f..03b32bf4e7 100644 --- a/cw_bitcoin/lib/electrum_wallet_addresses.dart +++ b/cw_bitcoin/lib/electrum_wallet_addresses.dart @@ -1,4 +1,5 @@ import 'dart:io' show Platform; +import 'dart:math'; import 'package:bitcoin_base/bitcoin_base.dart'; import 'package:blockchain_utils/blockchain_utils.dart'; @@ -761,8 +762,15 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { lightningAddress = await lightningWallet!.getAddress(); if (lightningAddress == null) { - lightningAddress = - await lightningWallet!.registerAddress(walletName.replaceAll(" ", "").toLowerCase()); + final randomNumber = Random.secure().nextInt(9999); + final username = "${walletName.replaceAll(" ", "")}$randomNumber".toLowerCase(); + try { + lightningAddress = await lightningWallet!.registerAddress(username); + } catch (e) { + printV(e); + printV(username); + rethrow; + } } } } diff --git a/lib/utils/address_formatter.dart b/lib/utils/address_formatter.dart index f2083c7724..bd46985828 100644 --- a/lib/utils/address_formatter.dart +++ b/lib/utils/address_formatter.dart @@ -15,6 +15,11 @@ class AddressFormatter { final cleanAddress = address.replaceAll('bitcoincash:', ''); final isMWEB = address.startsWith('ltcmweb'); final chunkSize = walletType != null ? _getChunkSize(walletType) : 4; + final isHumanReadable = address.contains("@"); + + if (isHumanReadable) { + return Text(address, style: evenTextStyle, textAlign: textAlign ?? TextAlign.start); + } if (shouldTruncate) { return _buildTruncatedAddress( @@ -158,4 +163,4 @@ class AddressFormatter { return 4; } } -} \ No newline at end of file +} diff --git a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart index db7111017a..d4d2a69add 100644 --- a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart +++ b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart @@ -435,7 +435,10 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo } @computed - String get qrImage => getQrImage(type); + String get qrImage { + if (uri is LightningPaymentRequest) return 'assets/images/btc_chain_qr_lightning.svg'; + return getQrImage(type); + } @computed String get monoImage => getChainMonoImage(type); From 0ee2d9f558dd23b80ed019fc90e4974ee75ffc3f Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Thu, 6 Nov 2025 10:34:46 +0100 Subject: [PATCH 019/105] fix: merge conflicts --- cw_bitcoin/pubspec.lock | 6 +++--- lib/view_model/dashboard/transaction_list_item.dart | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cw_bitcoin/pubspec.lock b/cw_bitcoin/pubspec.lock index e281c7f7b4..4bbd0c3dea 100644 --- a/cw_bitcoin/pubspec.lock +++ b/cw_bitcoin/pubspec.lock @@ -134,11 +134,11 @@ packages: dependency: "direct main" description: path: "." - ref: "92f62dc2037cf08003e418aadda58f451c021f42" - resolved-ref: "92f62dc2037cf08003e418aadda58f451c021f42" + ref: bca05bc9085f778e95916d55e9a75133c27755a2 + resolved-ref: bca05bc9085f778e95916d55e9a75133c27755a2 url: "https://github.com/breez/breez-sdk-spark-flutter" source: git - version: "0.3.4" + version: "0.3.5-rc1" bs58check: dependency: transitive description: diff --git a/lib/view_model/dashboard/transaction_list_item.dart b/lib/view_model/dashboard/transaction_list_item.dart index 8336a2374c..27c2ed1ab1 100644 --- a/lib/view_model/dashboard/transaction_list_item.dart +++ b/lib/view_model/dashboard/transaction_list_item.dart @@ -206,7 +206,7 @@ class TransactionListItem extends ActionListItem with Keyable { break; case WalletType.arbitrum: final asset = arbitrum!.assetOfTransaction(balanceViewModel.wallet, transaction); - final price = balanceViewModel.fiatConvertationStore.prices[asset]; + final price = balanceViewModel.fiatConversionStore.prices[asset]; amount = calculateFiatAmountRaw( cryptoAmount: arbitrum!.formatterArbitrumAmountToDouble(transaction: transaction), price: price); From c28e513d1b135f1071ad3d21035620a6f858424f Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Fri, 7 Nov 2025 14:42:52 +0100 Subject: [PATCH 020/105] feat: add error handling for LightningWallet initialization and adjust transaction direction logic --- cw_bitcoin/lib/bitcoin_wallet.dart | 15 ++++++++++----- cw_bitcoin/lib/lightning/lightning_wallet.dart | 6 ++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/cw_bitcoin/lib/bitcoin_wallet.dart b/cw_bitcoin/lib/bitcoin_wallet.dart index 3b903897c1..b1f7861f1e 100644 --- a/cw_bitcoin/lib/bitcoin_wallet.dart +++ b/cw_bitcoin/lib/bitcoin_wallet.dart @@ -31,6 +31,7 @@ import 'package:cw_core/payjoin_session.dart'; import 'package:cw_core/pending_transaction.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/unspent_coins_info.dart'; +import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/utils/zpub.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_keys_file.dart'; @@ -96,11 +97,15 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { // final hd = bitcoin.HDWallet.fromSeed(seedBytes, network: networkType); if (mnemonic != null) { - lightningWallet = LightningWallet( - mnemonic: mnemonic, - apiKey: secrets.breezApiKey, - lnurlDomain: "cake.cash", - ); + try { + lightningWallet = LightningWallet( + mnemonic: mnemonic, + apiKey: secrets.breezApiKey, + lnurlDomain: "cake.cash", + ); + } catch (e) { + printV(e); + } } else { lightningWallet = null; } diff --git a/cw_bitcoin/lib/lightning/lightning_wallet.dart b/cw_bitcoin/lib/lightning/lightning_wallet.dart index 087bfa1079..315d7406dd 100644 --- a/cw_bitcoin/lib/lightning/lightning_wallet.dart +++ b/cw_bitcoin/lib/lightning/lightning_wallet.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:breez_sdk_spark_flutter/breez_sdk_spark.dart'; import 'package:cw_bitcoin/bitcoin_transaction_priority.dart'; import 'package:cw_bitcoin/electrum_transaction_info.dart'; @@ -187,6 +189,10 @@ class LightningWallet { for (final payment in payments) { TransactionDirection direction = TransactionDirection.outgoing; + if (payment.paymentType == PaymentType.receive) { + direction = TransactionDirection.incoming; + } + if (payment.method == PaymentMethod.deposit) { direction = TransactionDirection.incoming; } From 1fea4061db7f2b37583e01d568353191adaa3028 Mon Sep 17 00:00:00 2001 From: Robert Malikowski Date: Sun, 16 Nov 2025 11:34:10 +0100 Subject: [PATCH 021/105] integrate homepage from new ui mockup --- .../WixMadeforText-VariableFont_wght.ttf | Bin 0 -> 152580 bytes assets/new-ui/3dots.svg | 3 + assets/new-ui/Apps.svg | 21 ++ assets/new-ui/Charts.svg | 10 + assets/new-ui/Contacts.svg | 3 + assets/new-ui/Home.svg | 16 + assets/new-ui/Wallets.svg | 3 + assets/new-ui/addr-book.svg | 3 + assets/new-ui/bitcoin.svg | 13 + assets/new-ui/btcqr.png | Bin 0 -> 188035 bytes assets/new-ui/copy-icon.svg | 11 + assets/new-ui/exchange.svg | 11 + assets/new-ui/history-received.svg | 3 + assets/new-ui/history-receiving.svg | 3 + assets/new-ui/history-sending.svg | 3 + assets/new-ui/history-sent.svg | 3 + assets/new-ui/lightning.svg | 14 + assets/new-ui/receive.svg | 10 + assets/new-ui/scan.svg | 10 + assets/new-ui/send.svg | 3 + assets/new-ui/settings.png | Bin 0 -> 1249 bytes assets/new-ui/switcher-bitcoin-off.svg | 3 + assets/new-ui/switcher-bitcoin.svg | 4 + assets/new-ui/switcher-lightning-off.svg | 3 + assets/new-ui/switcher-lightning.svg | 4 + assets/new-ui/top-settings.svg | 5 + assets/new-ui/wallet-trezor.svg | 10 + cw_core/lib/payment_uris.dart | 8 +- lib/di.dart | 19 +- lib/entities/new_main_actions.dart | 11 +- lib/new-ui/new_dashboard.dart | 100 ++++++ lib/new-ui/pages/receive_page.dart | 66 ++++ lib/new-ui/pages/scan_page.dart | 10 + lib/new-ui/pages/send_page.dart | 10 + .../action_row/coin_action_button.dart | 56 ++++ .../action_row/coin_action_row.dart | 65 ++++ .../coins_page/assets_history/asset_tile.dart | 74 +++++ .../assets_history/assets_section.dart | 23 ++ .../assets_history/assets_top_bar.dart | 64 ++++ .../assets_history/history_section.dart | 55 ++++ .../assets_history/history_tile.dart | 109 +++++++ .../assets_history/lightning_assets.dart | 39 +++ .../coins_page/cards/balance_card.dart | 127 ++++++++ .../widgets/coins_page/cards/cards_view.dart | 138 +++++++++ lib/new-ui/widgets/coins_page/top_bar.dart | 78 +++++ .../widgets/coins_page/wallet_info.dart | 50 +++ lib/new-ui/widgets/line_tab_switcher.dart | 134 ++++++++ lib/new-ui/widgets/modern_button.dart | 62 ++++ lib/new-ui/widgets/navbar/navbar.dart | 68 +++++ lib/new-ui/widgets/navbar/navbar_button.dart | 67 ++++ .../receive_page/receive_amount_input.dart | 90 ++++++ .../receive_page/receive_bottom_buttons.dart | 97 ++++++ .../widgets/receive_page/receive_qr_code.dart | 43 +++ .../receive_seed_type_selector.dart | 51 ++++ .../receive_page/receive_seed_widget.dart | 40 +++ .../widgets/receive_page/receive_top_bar.dart | 27 ++ lib/router.dart | 264 ++++++++++------ .../widgets/new_main_navbar_widget.dart | 286 ++++++++---------- lib/typography.dart | 4 +- lib/utils/feature_flag.dart | 4 +- .../exchange/exchange_trade_view_model.dart | 11 - lib/view_model/send/send_view_model.dart | 7 +- 62 files changed, 2237 insertions(+), 292 deletions(-) create mode 100644 assets/fonts/WixMadeforText-VariableFont_wght.ttf create mode 100644 assets/new-ui/3dots.svg create mode 100644 assets/new-ui/Apps.svg create mode 100644 assets/new-ui/Charts.svg create mode 100644 assets/new-ui/Contacts.svg create mode 100644 assets/new-ui/Home.svg create mode 100644 assets/new-ui/Wallets.svg create mode 100644 assets/new-ui/addr-book.svg create mode 100644 assets/new-ui/bitcoin.svg create mode 100644 assets/new-ui/btcqr.png create mode 100644 assets/new-ui/copy-icon.svg create mode 100644 assets/new-ui/exchange.svg create mode 100644 assets/new-ui/history-received.svg create mode 100644 assets/new-ui/history-receiving.svg create mode 100644 assets/new-ui/history-sending.svg create mode 100644 assets/new-ui/history-sent.svg create mode 100644 assets/new-ui/lightning.svg create mode 100644 assets/new-ui/receive.svg create mode 100644 assets/new-ui/scan.svg create mode 100644 assets/new-ui/send.svg create mode 100644 assets/new-ui/settings.png create mode 100644 assets/new-ui/switcher-bitcoin-off.svg create mode 100644 assets/new-ui/switcher-bitcoin.svg create mode 100644 assets/new-ui/switcher-lightning-off.svg create mode 100644 assets/new-ui/switcher-lightning.svg create mode 100644 assets/new-ui/top-settings.svg create mode 100644 assets/new-ui/wallet-trezor.svg create mode 100644 lib/new-ui/new_dashboard.dart create mode 100644 lib/new-ui/pages/receive_page.dart create mode 100644 lib/new-ui/pages/scan_page.dart create mode 100644 lib/new-ui/pages/send_page.dart create mode 100644 lib/new-ui/widgets/coins_page/action_row/coin_action_button.dart create mode 100644 lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart create mode 100644 lib/new-ui/widgets/coins_page/assets_history/asset_tile.dart create mode 100644 lib/new-ui/widgets/coins_page/assets_history/assets_section.dart create mode 100644 lib/new-ui/widgets/coins_page/assets_history/assets_top_bar.dart create mode 100644 lib/new-ui/widgets/coins_page/assets_history/history_section.dart create mode 100644 lib/new-ui/widgets/coins_page/assets_history/history_tile.dart create mode 100644 lib/new-ui/widgets/coins_page/assets_history/lightning_assets.dart create mode 100644 lib/new-ui/widgets/coins_page/cards/balance_card.dart create mode 100644 lib/new-ui/widgets/coins_page/cards/cards_view.dart create mode 100644 lib/new-ui/widgets/coins_page/top_bar.dart create mode 100644 lib/new-ui/widgets/coins_page/wallet_info.dart create mode 100644 lib/new-ui/widgets/line_tab_switcher.dart create mode 100644 lib/new-ui/widgets/modern_button.dart create mode 100644 lib/new-ui/widgets/navbar/navbar.dart create mode 100644 lib/new-ui/widgets/navbar/navbar_button.dart create mode 100644 lib/new-ui/widgets/receive_page/receive_amount_input.dart create mode 100644 lib/new-ui/widgets/receive_page/receive_bottom_buttons.dart create mode 100644 lib/new-ui/widgets/receive_page/receive_qr_code.dart create mode 100644 lib/new-ui/widgets/receive_page/receive_seed_type_selector.dart create mode 100644 lib/new-ui/widgets/receive_page/receive_seed_widget.dart create mode 100644 lib/new-ui/widgets/receive_page/receive_top_bar.dart diff --git a/assets/fonts/WixMadeforText-VariableFont_wght.ttf b/assets/fonts/WixMadeforText-VariableFont_wght.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5994d24be65d6829efef10c85d95cf116e221782 GIT binary patch literal 152580 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 + + \ No newline at end of file diff --git a/assets/new-ui/Apps.svg b/assets/new-ui/Apps.svg new file mode 100644 index 0000000000..334d800349 --- /dev/null +++ b/assets/new-ui/Apps.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/new-ui/Charts.svg b/assets/new-ui/Charts.svg new file mode 100644 index 0000000000..cc86078e64 --- /dev/null +++ b/assets/new-ui/Charts.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/new-ui/Contacts.svg b/assets/new-ui/Contacts.svg new file mode 100644 index 0000000000..a0b0f28945 --- /dev/null +++ b/assets/new-ui/Contacts.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/new-ui/Home.svg b/assets/new-ui/Home.svg new file mode 100644 index 0000000000..31a55b115b --- /dev/null +++ b/assets/new-ui/Home.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/assets/new-ui/Wallets.svg b/assets/new-ui/Wallets.svg new file mode 100644 index 0000000000..04c91d0e87 --- /dev/null +++ b/assets/new-ui/Wallets.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/new-ui/addr-book.svg b/assets/new-ui/addr-book.svg new file mode 100644 index 0000000000..c25d3b7dbc --- /dev/null +++ b/assets/new-ui/addr-book.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/new-ui/bitcoin.svg b/assets/new-ui/bitcoin.svg new file mode 100644 index 0000000000..391f3c289e --- /dev/null +++ b/assets/new-ui/bitcoin.svg @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/assets/new-ui/btcqr.png b/assets/new-ui/btcqr.png new file mode 100644 index 0000000000000000000000000000000000000000..a5c34ed1f5271059157fcf2f59bd435c077bd482 GIT binary patch literal 188035 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 literal 0 HcmV?d00001 diff --git a/assets/new-ui/copy-icon.svg b/assets/new-ui/copy-icon.svg new file mode 100644 index 0000000000..3cc98258d7 --- /dev/null +++ b/assets/new-ui/copy-icon.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/new-ui/exchange.svg b/assets/new-ui/exchange.svg new file mode 100644 index 0000000000..0bf048de8e --- /dev/null +++ b/assets/new-ui/exchange.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/new-ui/history-received.svg b/assets/new-ui/history-received.svg new file mode 100644 index 0000000000..3dab9e7312 --- /dev/null +++ b/assets/new-ui/history-received.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/new-ui/history-receiving.svg b/assets/new-ui/history-receiving.svg new file mode 100644 index 0000000000..cec2958dc6 --- /dev/null +++ b/assets/new-ui/history-receiving.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/new-ui/history-sending.svg b/assets/new-ui/history-sending.svg new file mode 100644 index 0000000000..f40ec89a0c --- /dev/null +++ b/assets/new-ui/history-sending.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/new-ui/history-sent.svg b/assets/new-ui/history-sent.svg new file mode 100644 index 0000000000..649e03d087 --- /dev/null +++ b/assets/new-ui/history-sent.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/new-ui/lightning.svg b/assets/new-ui/lightning.svg new file mode 100644 index 0000000000..9788dcc17e --- /dev/null +++ b/assets/new-ui/lightning.svg @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/assets/new-ui/receive.svg b/assets/new-ui/receive.svg new file mode 100644 index 0000000000..fc420ad694 --- /dev/null +++ b/assets/new-ui/receive.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/new-ui/scan.svg b/assets/new-ui/scan.svg new file mode 100644 index 0000000000..b3e6a3258b --- /dev/null +++ b/assets/new-ui/scan.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/new-ui/send.svg b/assets/new-ui/send.svg new file mode 100644 index 0000000000..cde7609f63 --- /dev/null +++ b/assets/new-ui/send.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/new-ui/settings.png b/assets/new-ui/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..b6cfb5b0884b7eea4d95b17850aa9c71f52da7b7 GIT binary patch literal 1249 zcmV<71Rnc|P)V$O*f<+AU@x+=XO*e|vAuHHn;D-V;}dwYa@iZ? z6Tl5JB&iC_kDBiZK?$bS-D;SaXJ9Oq35cKuNGTtLkSVn$1%wh}A%sjB2nvM#?#sF9X!N&>Y}9DnYOmcL zQUKI!0{cf7x2I9m#m_mZ)WMUDrBj{UAG*%i=JYSqqym8I2xemWK(^>CVQ| zo^38+Q$CUMToK*QUG7Io(r#}qzs@h5j7D9^HOT=&sU9|?lb_@H@nsXr?C00Q?~cs~ zQBrxzPmY^o{N2ZC3+HoG5^M;3;tb(+t0;Qej1WG`e`}bG(7v=)Ql5cb-hFm_xu+YO zF<}4XYN1NX=kQQ>amIl5`eF*st|ZX|7kQ1bz@osb~cv>IP|F^ zfDi0-3KCyoA{!&t*QH#cvf)vwfk4%Xq!uS4ij#N$->TK?Hx?oXkVt06GFx%24WS<$#T_Y2{)``Gc` ze~rdnoAL~nK}?^A0SDv&Da49t+?a`{QobS!Sdph2OKtK1%7-2mgvT6)DE{V)ioY2H z(t--b7V7pbTW!Oy4eus-BCTM@WA5N=C3asW$zkorjrdDLQUkb4;zlE_)lD7M7vRV1 z^4gfdYs2Bsop0a(p;VkC$r(pWVeDZI_}bmi!&e73Mta>y#hK9u*wF#`0J?j(lpO0R z5b!jw$rIiNOvd9k6bNXLV)BHy0rH0*o%&xVL{aHx=#w7g2{jo7V;3gV>9;pP2Bb&e zPj|=@l02PJSyFsCEo6&4pg#2Ep9-v|;EY&8F=WTptn~Iq=|qN*i_MEsIQBV-&Xf|n zNbfht<2#8`T!orx5}v4DU;P@A3Kj1wYYWRXjFi1M_4;*3S4!xRF>PGTnH>z3C>Uq2 z4h|Xk0LpFIpjE z{SyfM87KsplF?n)8lVhL^Sw}tTHM}P>Wd1|i_FX+&vbNSg--l*bGc_U0yT-`u!u}d zei-6OAK2zFDW8p-kvg=L-H+!w2JSa-NQm_uwVXaN0sVg)jkSDT!*kS-NAirFP5Dg5 zjx;AAb8;WdEU}JgEmKvR=$PNJVa!QoCB&g^E++$A@V!2>2K&&RD&*1}!FNI_&j|XZ zo*6T%40;F(h@b{A-Di`50YN{U1oMH9fWyDULErG>^?_rqQb4>1zMu?PHargg00000 LNkvXXu0mjfc7{ks literal 0 HcmV?d00001 diff --git a/assets/new-ui/switcher-bitcoin-off.svg b/assets/new-ui/switcher-bitcoin-off.svg new file mode 100644 index 0000000000..d529c77e28 --- /dev/null +++ b/assets/new-ui/switcher-bitcoin-off.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/new-ui/switcher-bitcoin.svg b/assets/new-ui/switcher-bitcoin.svg new file mode 100644 index 0000000000..1fadb6eb10 --- /dev/null +++ b/assets/new-ui/switcher-bitcoin.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/new-ui/switcher-lightning-off.svg b/assets/new-ui/switcher-lightning-off.svg new file mode 100644 index 0000000000..d72c681b09 --- /dev/null +++ b/assets/new-ui/switcher-lightning-off.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/new-ui/switcher-lightning.svg b/assets/new-ui/switcher-lightning.svg new file mode 100644 index 0000000000..f9c5f40a1f --- /dev/null +++ b/assets/new-ui/switcher-lightning.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/new-ui/top-settings.svg b/assets/new-ui/top-settings.svg new file mode 100644 index 0000000000..ba716f8d5f --- /dev/null +++ b/assets/new-ui/top-settings.svg @@ -0,0 +1,5 @@ + + + diff --git a/assets/new-ui/wallet-trezor.svg b/assets/new-ui/wallet-trezor.svg new file mode 100644 index 0000000000..d0747c4444 --- /dev/null +++ b/assets/new-ui/wallet-trezor.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/cw_core/lib/payment_uris.dart b/cw_core/lib/payment_uris.dart index ed172ca044..6a6a60b362 100644 --- a/cw_core/lib/payment_uris.dart +++ b/cw_core/lib/payment_uris.dart @@ -67,7 +67,7 @@ class LightningPaymentRequest extends PaymentURI { } class LitecoinURI extends PaymentURI { - LitecoinURI({required super.amount, required super.address}); + LitecoinURI({required super.amount, required super.address, required super.scheme}); @override String toString() { @@ -79,7 +79,7 @@ class LitecoinURI extends PaymentURI { } class EthereumURI extends PaymentURI { - EthereumURI({required super.amount, required super.address}); + EthereumURI({required super.amount, required super.address, required super.scheme}); @override String toString() { @@ -91,7 +91,7 @@ class EthereumURI extends PaymentURI { } class BaseURI extends PaymentURI { - BaseURI({required super.amount, required super.address}); + BaseURI({required super.amount, required super.address, required super.scheme}); @override String toString() { @@ -103,7 +103,7 @@ class BaseURI extends PaymentURI { } class ArbitrumURI extends PaymentURI { - ArbitrumURI({required super.amount, required super.address}); + ArbitrumURI({required super.amount, required super.address, required super.scheme}); @override String toString() { diff --git a/lib/di.dart b/lib/di.dart index 4138842595..5d970b06bb 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -11,6 +11,7 @@ import 'package:cake_wallet/bitcoin_cash/bitcoin_cash.dart'; import 'package:cake_wallet/buy/dfx/dfx_buy_provider.dart'; import 'package:cake_wallet/buy/moonpay/moonpay_provider.dart'; import 'package:cake_wallet/buy/onramper/onramper_buy_provider.dart'; +import 'package:cake_wallet/new-ui/new_dashboard.dart'; import 'package:cake_wallet/order/order.dart'; import 'package:cake_wallet/core/backup_service_v3.dart'; import 'package:cake_wallet/core/new_wallet_arguments.dart'; @@ -748,6 +749,10 @@ Future setup({ addressListViewModel: getIt.get(), )); + getIt.registerFactory(() => NewDashboard( + dashboardViewModel: getIt.get(), + )); + getIt.registerFactory(() { final GlobalKey _navigatorKey = GlobalKey(); return DesktopSidebarWrapper( @@ -1015,7 +1020,7 @@ Future setup({ getIt.registerFactory(() => WalletKeysViewModel(getIt.get())); getIt.registerFactory(() => WalletKeysPage(getIt.get())); - + getIt.registerFactory(() => AnimatedURModel(getIt.get())); getIt.registerFactoryParam, void>((Map urQr, _) => @@ -1581,24 +1586,24 @@ Future setup({ getIt.registerFactory(() => DevSharedPreferencesPage(getIt.get())); getIt.registerFactory(() => DevSecurePreferencesPage(getIt.get())); - + getIt.registerFactory(() => BackgroundSyncLogsViewModel()); - + getIt.registerFactory(() => DevBackgroundSyncLogsPage(getIt.get())); - + getIt.registerFactory(() => SocketHealthLogsViewModel()); getIt.registerFactory(() => DevSocketHealthLogsPage(getIt.get())); - + getIt.registerFactory(() => DevNetworkRequests()); - + getIt.registerFactory(() => DevQRToolsPage()); getIt.registerFactory(() => ExchangeProviderLogsViewModel()); getIt.registerFactory(() => DevExchangeProviderLogsPage(getIt.get())); getIt.registerFactory(() => StartTorPage(StartTorViewModel(),)); - + getIt.registerFactory(() => DEuroViewModel( getIt(), getIt(), diff --git a/lib/entities/new_main_actions.dart b/lib/entities/new_main_actions.dart index 0f904ae2a6..609b04cf4d 100644 --- a/lib/entities/new_main_actions.dart +++ b/lib/entities/new_main_actions.dart @@ -1,5 +1,4 @@ import 'package:cake_wallet/generated/i18n.dart'; -import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; import 'package:flutter/material.dart'; @@ -31,14 +30,14 @@ class NewMainActions { static NewMainActions homeAction = NewMainActions._( name: (context) => 'Home', //TODO S.of(context).home, - image: 'assets/images/main_actions/home.svg', + image: 'assets/new-ui/Home.svg', key: ValueKey('dashboard_page_home_action_button_key'), onTap: () {}, ); static NewMainActions walletsAction = NewMainActions._( name: (context) => S.of(context).wallets, - image: 'assets/images/main_actions/wallets.svg', + image: 'assets/new-ui/Wallets.svg', key: ValueKey('dashboard_page_wallets_action_button_key'), onTap: () {}, ); @@ -46,21 +45,21 @@ class NewMainActions { static NewMainActions contactsAction = NewMainActions._( name: (context) => 'Contacts', //TODO S.of(context).contacts, - image: 'assets/images/main_actions/contacts.svg', + image: 'assets/new-ui/Contacts.svg', key: ValueKey('dashboard_page_contacts_action_button_key'), onTap: () {}, ); static NewMainActions appsAction = NewMainActions._( name: (context) => 'Apps', //TODO S.of(context).apps, - image: 'assets/images/main_actions/apps.svg', + image: 'assets/new-ui/Apps.svg', key: ValueKey('dashboard_page_apps_action_button_key'), onTap: () {}, ); static NewMainActions chartsAction = NewMainActions._( name: (context) => 'Charts', //TODO S.of(context).charts, - image: 'assets/images/main_actions/charts.svg', + image: 'assets/new-ui/Charts.svg', key: ValueKey('dashboard_page_charts_action_button_key'), onTap: () {}, ); diff --git a/lib/new-ui/new_dashboard.dart b/lib/new-ui/new_dashboard.dart new file mode 100644 index 0000000000..ba8b88fd12 --- /dev/null +++ b/lib/new-ui/new_dashboard.dart @@ -0,0 +1,100 @@ +import 'package:cake_wallet/di.dart'; +import 'package:cake_wallet/new-ui/widgets/coins_page/assets_history/lightning_assets.dart'; +import 'package:cake_wallet/src/screens/dashboard/widgets/new_main_navbar_widget.dart'; +import 'package:cake_wallet/view_model/monero_account_list/monero_account_list_view_model.dart'; +import 'package:flutter/material.dart'; +import '../view_model/dashboard/dashboard_view_model.dart'; +import 'widgets/coins_page/cards/cards_view.dart'; +import 'widgets/coins_page/action_row/coin_action_row.dart'; +import 'widgets/coins_page/assets_history/history_section.dart'; +import 'widgets/coins_page/top_bar.dart'; +import 'widgets/coins_page/wallet_info.dart'; + +class NewDashboard extends StatefulWidget { + NewDashboard({super.key, required this.dashboardViewModel}) { + this.accountListViewModel = + dashboardViewModel.balanceViewModel.hasAccounts ? getIt.get() : null; + } + + final DashboardViewModel dashboardViewModel; + late final MoneroAccountListViewModel? accountListViewModel; + + + @override + State createState() => _NewDashboardState(); +} + +class _NewDashboardState extends State { + bool _lightningMode = false; + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + children: [ + SafeArea( + child: Container( + height: MediaQuery.of(context).size.height, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + Theme.of(context).colorScheme.surfaceBright, + Theme.of(context).colorScheme.surface, + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + child: SingleChildScrollView( + physics: BouncingScrollPhysics(), + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + TopBar( + dashboardViewModel: widget.dashboardViewModel, + lightningMode: _lightningMode, + onLightningSwitchPress: () { + setState(() { + _lightningMode = !_lightningMode; + }); + }, + ), + WalletInfo(lightningMode: _lightningMode, usesHardwareWallet: + widget.dashboardViewModel.wallet.isHardwareWallet, + name: widget.dashboardViewModel.wallet.name + ), + CardsView(dashboardViewModel: widget.dashboardViewModel, + accountListViewModel: widget.accountListViewModel, + lightningMode: _lightningMode, + ), + CoinActionRow(), + AnimatedSwitcher( + duration: const Duration(milliseconds: 200), + transitionBuilder: (child, animation) { + return FadeTransition(opacity: animation, child: child); + }, + layoutBuilder: (currentChild, previousChildren) { + return Stack( + alignment: Alignment.topCenter, + children: [ + ...previousChildren, + if (currentChild != null) currentChild, + ], + ); + }, + child: _lightningMode + ? LightningAssets(dashboardViewModel: widget.dashboardViewModel,) + : HistorySection(dashboardViewModel: widget.dashboardViewModel,), + ), + ], + ), + ), + ), + ), + NewMainNavBar(dashboardViewModel: widget.dashboardViewModel) + ], + ), + ); + } +} diff --git a/lib/new-ui/pages/receive_page.dart b/lib/new-ui/pages/receive_page.dart new file mode 100644 index 0000000000..a6a17cb7b6 --- /dev/null +++ b/lib/new-ui/pages/receive_page.dart @@ -0,0 +1,66 @@ +import 'package:cake_wallet/new-ui/widgets/receive_page/receive_amount_input.dart'; +import 'package:cake_wallet/new-ui/widgets/receive_page/receive_bottom_buttons.dart'; +import 'package:cake_wallet/new-ui/widgets/receive_page/receive_qr_code.dart'; +import 'package:cake_wallet/new-ui/widgets/receive_page/receive_seed_type_selector.dart'; +import 'package:flutter/material.dart'; + +import '../widgets/receive_page/receive_seed_widget.dart'; +import '../widgets/receive_page/receive_top_bar.dart'; + +class ReceivePage extends StatefulWidget { + const ReceivePage({super.key}); + + @override + State createState() => _ReceivePageState(); +} + +class _ReceivePageState extends State { + bool _largeQrMode = false; + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + Theme.of(context).colorScheme.surfaceBright, + Theme.of(context).colorScheme.surface, + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + borderRadius: BorderRadius.circular(30), + ), + child: SafeArea( + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox(height: 12), + ReceiveTopBar(), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + mainAxisSize: MainAxisSize.max, + children: [ + ReceiveQrCode( + onTap: () { + setState(() { + _largeQrMode = !_largeQrMode; + }); + }, + largeQrMode: _largeQrMode, + ), + ReceiveSeedTypeSelector(), + ReceiveSeedWidget(), + ReceiveAmountInput(largeQrMode: _largeQrMode), + ReceiveBottomButtons(largeQrMode: _largeQrMode), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/new-ui/pages/scan_page.dart b/lib/new-ui/pages/scan_page.dart new file mode 100644 index 0000000000..75bbddaa37 --- /dev/null +++ b/lib/new-ui/pages/scan_page.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class ScanPage extends StatelessWidget { + const ScanPage({super.key}); + + @override + Widget build(BuildContext context) { + return const Placeholder(); + } +} diff --git a/lib/new-ui/pages/send_page.dart b/lib/new-ui/pages/send_page.dart new file mode 100644 index 0000000000..c53515f2e1 --- /dev/null +++ b/lib/new-ui/pages/send_page.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class SendPage extends StatelessWidget { + const SendPage({super.key}); + + @override + Widget build(BuildContext context) { + return const Placeholder(); + } +} diff --git a/lib/new-ui/widgets/coins_page/action_row/coin_action_button.dart b/lib/new-ui/widgets/coins_page/action_row/coin_action_button.dart new file mode 100644 index 0000000000..d925cf8759 --- /dev/null +++ b/lib/new-ui/widgets/coins_page/action_row/coin_action_button.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +class CoinActionButton extends StatelessWidget { + const CoinActionButton({ + super.key, + required this.icon, + required this.label, + required this.action, + }); + + final SvgPicture icon; + final String label; + final VoidCallback action; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Container( + width: 80, + height: 80, + decoration: BoxDecoration( + shape: BoxShape.circle, + gradient: LinearGradient( + colors: [Color(0xFF2B3A67), Color(0xFF1C2A4F)], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + border: Border.all( + color: Theme.of(context).colorScheme.surfaceContainerHigh, + width: 1, + ), + ), + child: IconButton( + padding: EdgeInsets.zero, + constraints: BoxConstraints(), + onPressed: action, + icon: icon, + color: Theme.of(context).colorScheme.primary, + ), + ), + Padding( + padding: const EdgeInsets.all(10.0), + child: Text( + style: TextStyle( + fontSize: 15, + color: Theme.of(context).colorScheme.onSurface, + ), + label, + ), + ), + ], + ); + } +} diff --git a/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart b/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart new file mode 100644 index 0000000000..5ac17a11d8 --- /dev/null +++ b/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart @@ -0,0 +1,65 @@ +import 'package:cake_wallet/new-ui/pages/send_page.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +import '../../../pages/receive_page.dart'; +import '../../../pages/scan_page.dart'; +import 'coin_action_button.dart'; + +class CoinActionRow extends StatelessWidget { + const CoinActionRow({super.key}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 12.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + spacing: 24.0, + children: [ + CoinActionButton( + icon: SvgPicture.asset("assets/new-ui/send.svg"), + label: "Send", + action: () { + showModalBottomSheet( + context: context, + builder: (context) => SendPage(), + ); + }, + ), + CoinActionButton( + icon: SvgPicture.asset("assets/new-ui/receive.svg"), + label: "Receive", + action: () { + showModalBottomSheet( + context: context, + isScrollControlled: true, + builder: (context) => FractionallySizedBox( + heightFactor: 0.9, + child: ReceivePage(), + ), + ); + }, + ), + CoinActionButton( + icon: SvgPicture.asset("assets/new-ui/exchange.svg"), + label: "Swap", + action: () {}, + ), + CoinActionButton( + icon: SvgPicture.asset("assets/new-ui/scan.svg"), + label: "Scan", + action: () { + showModalBottomSheet( + context: context, + + builder: (context) => ScanPage(), + ); + }, + ), + ], + ), + ); + } +} diff --git a/lib/new-ui/widgets/coins_page/assets_history/asset_tile.dart b/lib/new-ui/widgets/coins_page/assets_history/asset_tile.dart new file mode 100644 index 0000000000..b811604fb6 --- /dev/null +++ b/lib/new-ui/widgets/coins_page/assets_history/asset_tile.dart @@ -0,0 +1,74 @@ +import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; +import 'package:flutter/material.dart'; + +class AssetTile extends StatelessWidget { + const AssetTile({super.key, required this.dashboardViewModel}); + + final DashboardViewModel dashboardViewModel; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0, vertical: 6.0), + child: Container( + width: double.infinity, + height: 80, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + Theme.of(context).colorScheme.surfaceContainerHigh, + Theme.of(context).colorScheme.surfaceContainer, + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + borderRadius: BorderRadius.all(Radius.circular(20)), + border: Border.all( + color: Theme.of(context).colorScheme.surfaceContainerHighest, + width: 1, + ), + ), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 12.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Container(width: 45, height: 45, child: Image.asset("assets/images/crypto/tether.webp")), + SizedBox(width: 8.0), + Column( + spacing: 4.0, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "DummyCoin", + style: TextStyle(fontWeight: FontWeight.bold), + ), + Text( + "0.000 DMC", + style: TextStyle( + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), + ), + ], + ), + ], + ), + + Text( + "\$0.00", + style: TextStyle( + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/new-ui/widgets/coins_page/assets_history/assets_section.dart b/lib/new-ui/widgets/coins_page/assets_history/assets_section.dart new file mode 100644 index 0000000000..44eff375b9 --- /dev/null +++ b/lib/new-ui/widgets/coins_page/assets_history/assets_section.dart @@ -0,0 +1,23 @@ +import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; +import 'package:flutter/material.dart'; + + +import 'asset_tile.dart'; + +class AssetsSection extends StatelessWidget { + const AssetsSection({super.key, required this.dashboardViewModel}); + + final DashboardViewModel dashboardViewModel; + + @override + Widget build(BuildContext context) { + return ListView.builder( + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: 1, + itemBuilder: (context, index) { + return AssetTile(dashboardViewModel: dashboardViewModel,); + }, + ); + } +} diff --git a/lib/new-ui/widgets/coins_page/assets_history/assets_top_bar.dart b/lib/new-ui/widgets/coins_page/assets_history/assets_top_bar.dart new file mode 100644 index 0000000000..2a282ef846 --- /dev/null +++ b/lib/new-ui/widgets/coins_page/assets_history/assets_top_bar.dart @@ -0,0 +1,64 @@ +import 'package:cake_wallet/new-ui/widgets/line_tab_switcher.dart'; +import 'package:cake_wallet/new-ui/widgets/modern_button.dart'; +import 'package:flutter/material.dart'; + +class AssetsTopBar extends StatelessWidget { + const AssetsTopBar({ + super.key, + required this.onTabChange, + required this.selectedTab, + }); + + final void Function(int) onTabChange; + final int selectedTab; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(12.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + LineTabSwitcher( + tabs: const ["Assets", "History"], + onTabChange: onTabChange, + selectedTab: selectedTab, + ), + Row( + spacing: 8.0, + mainAxisSize: MainAxisSize.min, + children: [ + Container( + height: 48, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(99999), + ), + child: ElevatedButton( + onPressed: () {}, + style: ElevatedButton.styleFrom( + padding: EdgeInsets.zero, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(999999), + ), + backgroundColor: Theme.of( + context, + ).colorScheme.surfaceContainer, + ), + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Row( + spacing: 4.0, + children: [Icon(Icons.settings, color: Theme.of(context).colorScheme.primary), Text("Tokens", style: TextStyle(color: Theme.of(context).colorScheme.primary),)], + ), + ), + ), + ), + ModernButton(size: 48, onPressed:(){}, icon: Icon(Icons.question_mark)), + ], + ), + ], + ), + ); + } +} diff --git a/lib/new-ui/widgets/coins_page/assets_history/history_section.dart b/lib/new-ui/widgets/coins_page/assets_history/history_section.dart new file mode 100644 index 0000000000..745517cbbc --- /dev/null +++ b/lib/new-ui/widgets/coins_page/assets_history/history_section.dart @@ -0,0 +1,55 @@ +import 'package:cake_wallet/new-ui/widgets/coins_page/assets_history/history_tile.dart'; +import 'package:cake_wallet/utils/date_formatter.dart'; +import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; +import 'package:cake_wallet/view_model/dashboard/date_section_item.dart'; +import 'package:cake_wallet/view_model/dashboard/transaction_list_item.dart'; +import 'package:flutter/material.dart'; + + +class HistorySection extends StatelessWidget { + const HistorySection({super.key, required this.dashboardViewModel}); + + final DashboardViewModel dashboardViewModel; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0, vertical: 8.0), + child: ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: dashboardViewModel.items.length, + itemBuilder: (context, index) { + final prevItem = index == 0 ? null : dashboardViewModel.items[index - 1]; + final item = dashboardViewModel.items[index]; + final nextItem = index == dashboardViewModel.items.length - 1 ? null : dashboardViewModel.items[index + 1]; + + + if(item is TransactionListItem) { + final transaction = item.transaction; + final transactionType = + dashboardViewModel.getTransactionType(transaction); + + return HistoryTile( + title: item.formattedTitle + item.formattedStatus + transactionType, + date: DateFormatter.convertDateTimeToReadableString(item.date), + amount: item.formattedCryptoAmount, + amountFiat: item.formattedFiatAmount, + roundedBottom: !(nextItem is TransactionListItem), + roundedTop: !(prevItem is TransactionListItem), + bottomSeparator: nextItem is TransactionListItem, + direction: item.transaction.direction, + pending: item.transaction.isPending + ); + + + } else if(item is DateSectionItem){ + return Text(DateFormatter.convertDateTimeToReadableString(item.date)); + } + + else return Text(item.runtimeType.toString()); + }, + ), + ); + } +} diff --git a/lib/new-ui/widgets/coins_page/assets_history/history_tile.dart b/lib/new-ui/widgets/coins_page/assets_history/history_tile.dart new file mode 100644 index 0000000000..185d753adc --- /dev/null +++ b/lib/new-ui/widgets/coins_page/assets_history/history_tile.dart @@ -0,0 +1,109 @@ +import 'package:cw_core/transaction_direction.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +class HistoryTile extends StatelessWidget { + const HistoryTile( + {super.key, + required this.title, + required this.date, + required this.amount, + required this.amountFiat, + required this.roundedTop, + required this.roundedBottom, + required this.direction, + required this.pending, + required this.bottomSeparator}); + + final String title; + final String date; + final String amount; + final String amountFiat; + final bool roundedTop; + final bool roundedBottom; + final bool bottomSeparator; + final TransactionDirection direction; + final bool pending; + + String _getDirectionIcon() { + if (pending) { + return direction == TransactionDirection.incoming + ? 'assets/new-ui/history-receiving.svg' + : 'assets/new-ui/history-sending.svg'; + } else { + return direction == TransactionDirection.incoming + ? 'assets/new-ui/history-received.svg' + : 'assets/new-ui/history-sent.svg'; + } + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Container( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surfaceContainer, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(roundedTop ? 12.0 : 0.0), + topRight: Radius.circular(roundedTop ? 12.0 : 0.0), + bottomLeft: Radius.circular(roundedBottom ? 12.0 : 0.0), + bottomRight: Radius.circular(roundedBottom ? 12.0 : 0.0), + )), + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 12.0, + horizontal: 12.0, + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(0.0, 0.0, 8.0, 0.0), + child: SizedBox( + height: 50, + width: 50, + child: SvgPicture.asset(_getDirectionIcon()), + ), + ), + Expanded( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title), + Text(date), + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text(amount), + Text(amountFiat), + ], + ), + ], + ), + ), + ], + ), + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 12.0), + child: SizedBox( + height: 1, + child: DecoratedBox( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surfaceContainerHigh, + ), + ), + ), + ), + ], + ); + } +} diff --git a/lib/new-ui/widgets/coins_page/assets_history/lightning_assets.dart b/lib/new-ui/widgets/coins_page/assets_history/lightning_assets.dart new file mode 100644 index 0000000000..3100d4331f --- /dev/null +++ b/lib/new-ui/widgets/coins_page/assets_history/lightning_assets.dart @@ -0,0 +1,39 @@ +import 'package:cake_wallet/new-ui/widgets/coins_page/assets_history/assets_top_bar.dart'; +import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; +import 'package:flutter/material.dart'; +import 'assets_section.dart'; +import 'history_section.dart'; + +class LightningAssets extends StatefulWidget { + const LightningAssets({super.key, required this.dashboardViewModel}); + + static const List tabs = ["Assets", "History"]; + final DashboardViewModel dashboardViewModel; + + @override + State createState() => _LightningAssetsState(); +} + +class _LightningAssetsState extends State { + int _selectedTab = 0; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + AssetsTopBar( + onTabChange: (index) { + setState(() { + _selectedTab = index; + }); + }, + selectedTab: _selectedTab, + ), + [ + AssetsSection(dashboardViewModel: widget.dashboardViewModel,), + HistorySection(dashboardViewModel: widget.dashboardViewModel,), + ][_selectedTab], + ], + ); + } +} diff --git a/lib/new-ui/widgets/coins_page/cards/balance_card.dart b/lib/new-ui/widgets/coins_page/cards/balance_card.dart new file mode 100644 index 0000000000..bcdf43bd89 --- /dev/null +++ b/lib/new-ui/widgets/coins_page/cards/balance_card.dart @@ -0,0 +1,127 @@ +import 'package:cake_wallet/view_model/dashboard/balance_view_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +class BalanceCard extends StatelessWidget { + const BalanceCard({ + super.key, + required this.width, + required this.balanceRecord, + required this.selected, required this.accountName, required this.accountBalance, + }); + + final double width; + final String accountBalance; + final String accountName; + final BalanceRecord balanceRecord; + final bool selected; + + @override + Widget build(BuildContext context) { + final Duration textFadeDuration = Duration(milliseconds: 80); + + return Container( + width: width, + height: width * 2.0 / 3, + decoration: BoxDecoration( + border: Border.all(color: Color(0x77FFFFFF), width: 1), + gradient: LinearGradient( + colors: [Colors.lightBlueAccent, Colors.blue], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + borderRadius: BorderRadius.circular(20), + ), + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + accountName, + style: TextStyle(color: Colors.black, fontSize: 20), + ), + + AnimatedOpacity( + opacity: selected ? 0 : 1, + duration: textFadeDuration, + child: Text( + accountBalance, + style: TextStyle(color: Colors.black, fontSize: 14), + ), + ), + ], + ), + AnimatedOpacity( + opacity: selected ? 1 : 0, + duration: textFadeDuration, + child: Row( + spacing: 8.0, + children: [ + Text( + balanceRecord.availableBalance, + style: TextStyle(color: Colors.black, fontSize: 28), + ), + Text( + balanceRecord.asset.name.toUpperCase(), + style: TextStyle(color: Colors.black45, fontSize: 28), + ), + ], + ), + ), + Text( + balanceRecord.fiatAvailableBalance, + style: TextStyle(color: Colors.black45, fontSize: 20), + ), + ], + ), + + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Container( + decoration: BoxDecoration( + color: Color(0x44FFFFFF), + borderRadius: BorderRadius.circular(10000000), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.all(6.0), + child: Text( + "Buy", + style: TextStyle(color: Colors.black, fontSize: 16), + ), + ), + Icon(Icons.arrow_forward, color: Colors.black45), + ], + ), + ), + SvgPicture.asset( + "assets/new-ui/switcher-bitcoin.svg", + height: 50, + width: 50, + colorFilter: const ColorFilter.mode( + Color(0x44FFFFFF), + BlendMode.srcIn, + ), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/new-ui/widgets/coins_page/cards/cards_view.dart b/lib/new-ui/widgets/coins_page/cards/cards_view.dart new file mode 100644 index 0000000000..b4b517e5c4 --- /dev/null +++ b/lib/new-ui/widgets/coins_page/cards/cards_view.dart @@ -0,0 +1,138 @@ +import 'dart:math'; + +import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; +import 'package:cake_wallet/view_model/monero_account_list/monero_account_list_view_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_mobx/flutter_mobx.dart'; + +import 'balance_card.dart'; + +class CardsView extends StatefulWidget { + const CardsView({super.key, required this.dashboardViewModel, required this.accountListViewModel, required this.lightningMode}); + + final DashboardViewModel dashboardViewModel; + final MoneroAccountListViewModel? accountListViewModel; + final bool lightningMode; + + + @override + _CardsViewState createState() => _CardsViewState(); +} + +class _CardsViewState extends State { + int? _selectedIndex = 0; + + static const Duration animDuration = Duration(milliseconds: 200); + static const double overlapAmount = 60.0; + late final double cardWidth = MediaQuery.of(context).size.width * 0.85; + late final int numCards; + + @override + void initState() { + super.initState(); + numCards = widget.accountListViewModel?.accounts.length ?? 1; + } + + Widget _buildCard(int index, double parentWidth) { + final int numCards = widget.accountListViewModel?.accounts.length ?? 1; + final double baseTop = overlapAmount * (numCards - 1); + final double scaleFactor = 0.96; + + final int howFarBehind = (_selectedIndex! - index + numCards) % numCards; + final double scale = pow(scaleFactor, howFarBehind).toDouble(); + + final double top = baseTop - (howFarBehind * overlapAmount); + + final double left = (parentWidth - cardWidth) / 2.0; + + return AnimatedPositioned( + key: ValueKey('box_$index'), + duration: animDuration, + curve: Curves.easeOut, + top: top, + left: left, + child: AnimatedScale( + duration: animDuration, + curve: Curves.easeOut, + scale: scale, + child: GestureDetector( + onTap: () { + setState(() { + if(widget.accountListViewModel != null) + widget.accountListViewModel!.select(widget.accountListViewModel!.accounts[index]); + _selectedIndex = index; + }); + }, + child: Observer( + builder: (_){return BalanceCard( + width: cardWidth, + accountName: (widget.accountListViewModel?.accounts[index].label) ?? "Primary account", + accountBalance: widget.accountListViewModel?.accounts[index].balance ?? "", + balanceRecord: widget.dashboardViewModel.balanceViewModel.formattedBalances.elementAt(0), + selected: _selectedIndex == index, + );} + ), + ), + ), + ); + } + + double _getBoxHeight() { + return + /* height of initial card */ + (2 / 3) * (cardWidth) + + /* height of bg card * amount of bg cards */ + overlapAmount * ((widget.accountListViewModel?.accounts.length ??1) - 1); + } + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, constraints) { + final double parentWidth = constraints.maxWidth; + List children = []; + + if (_selectedIndex! >= (widget.accountListViewModel?.accounts.length ?? 1)) { + _selectedIndex = 0; + } + + for ( + int i = _selectedIndex!; + i < (widget.accountListViewModel?.accounts.length ?? 1) + _selectedIndex!; + i++ + ) { + if (i != _selectedIndex) { + children.add(_buildCard(i % (widget.accountListViewModel?.accounts.length ?? 1), parentWidth)); + } + } + + if (_selectedIndex != null) { + children.add(_buildCard(_selectedIndex!, parentWidth)); + } + + return Observer( + builder: (_){return Padding( + padding: const EdgeInsets.symmetric(vertical: 16.0), + child: AnimatedContainer( + duration: Duration(milliseconds: 200), + curve: Curves.easeOut, + width: double.infinity, + height: _getBoxHeight(), + child: AnimatedSwitcher( + duration: Duration(milliseconds: 200), + transitionBuilder: (child, animation) => + FadeTransition(opacity: animation, child: child), + child: SizedBox( + key: ValueKey(_getBoxHeight()), + width: double.infinity, + height: _getBoxHeight(), + child: Stack(alignment: Alignment.center, children: children), + ), + ), + ), + );} + ); + }, + ); + } +} diff --git a/lib/new-ui/widgets/coins_page/top_bar.dart b/lib/new-ui/widgets/coins_page/top_bar.dart new file mode 100644 index 0000000000..0c7e0ce15f --- /dev/null +++ b/lib/new-ui/widgets/coins_page/top_bar.dart @@ -0,0 +1,78 @@ +import 'package:cake_wallet/new-ui/widgets/modern_button.dart'; +import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +class TopBar extends StatelessWidget { + const TopBar({ + super.key, + required this.lightningMode, + required this.onLightningSwitchPress, required this.dashboardViewModel, + }); + + final bool lightningMode; + final VoidCallback onLightningSwitchPress; + final DashboardViewModel dashboardViewModel; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(18.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + if(dashboardViewModel.balanceViewModel.hasSecondAdditionalBalance || + dashboardViewModel.balanceViewModel.hasSecondAvailableBalance) + SizedBox( + child: AnimatedSwitcher( + duration: Duration(milliseconds: 200), + transitionBuilder: (child, animation) => + FadeTransition(opacity: animation, child: child), + child: ElevatedButton( + key: ValueKey(lightningMode), + style: ElevatedButton.styleFrom( + padding: EdgeInsets.all(4), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(900.0)), + ), + backgroundColor: Theme.of( + context, + ).colorScheme.surfaceContainer, + ), + onPressed: onLightningSwitchPress, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SvgPicture.asset( + lightningMode + ? 'assets/new-ui/switcher-lightning.svg' + : 'assets/new-ui/switcher-bitcoin.svg', + width: 40, + height: 40, + colorFilter: ColorFilter.mode( + Theme.of(context).colorScheme.primary, + BlendMode.srcIn, + ), + ), + SvgPicture.asset( + lightningMode + ? 'assets/new-ui/switcher-bitcoin-off.svg' + : 'assets/new-ui/switcher-lightning-off.svg', + width: 40, + height: 40, + colorFilter: ColorFilter.mode( + Theme.of(context).colorScheme.primary, + BlendMode.srcIn, + ), + ), + ], + ), + ), + ), + ), + ModernButton.svg(size: 44, onPressed: (){}, svgPath: "assets/new-ui/top-settings.svg",), + ], + ), + ); + } +} diff --git a/lib/new-ui/widgets/coins_page/wallet_info.dart b/lib/new-ui/widgets/coins_page/wallet_info.dart new file mode 100644 index 0000000000..68adc8b130 --- /dev/null +++ b/lib/new-ui/widgets/coins_page/wallet_info.dart @@ -0,0 +1,50 @@ +import 'package:cake_wallet/new-ui/widgets/modern_button.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +class WalletInfo extends StatelessWidget { + const WalletInfo({super.key, required this.lightningMode, required this.name, required this.usesHardwareWallet}); + + final bool lightningMode; + final String name; + final bool usesHardwareWallet; + + @override + Widget build(BuildContext context) { + return Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + + children: [ + AnimatedSwitcher( + duration: Duration(milliseconds: 150), + transitionBuilder: (child, animation) { + return SizeTransition( + axis: Axis.horizontal, + sizeFactor: animation, + child: FadeTransition(opacity: animation, child: child), + ); + }, + child: !usesHardwareWallet + ? SizedBox.shrink(key: ValueKey("empty")) + : Padding( + padding: const EdgeInsets.fromLTRB(0.0, 0.0, 8.0, 0.0), + child: SvgPicture.asset( + "assets/new-ui/wallet-trezor.svg", + key: ValueKey("wallet"), + width: 24, + height: 24, + colorFilter: ColorFilter.mode( + Theme.of(context).colorScheme.onSurfaceVariant, + BlendMode.srcIn, + ), + ), + ), + ), + Text(name, style: TextStyle(fontSize: 20)), + SizedBox(width: 8), + ModernButton.svg(size: 20, onPressed: (){}, svgPath: "assets/new-ui/3dots.svg",) + ], + ); + } +} diff --git a/lib/new-ui/widgets/line_tab_switcher.dart b/lib/new-ui/widgets/line_tab_switcher.dart new file mode 100644 index 0000000000..6fdb533d02 --- /dev/null +++ b/lib/new-ui/widgets/line_tab_switcher.dart @@ -0,0 +1,134 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; + +class LineTabSwitcher extends StatefulWidget { + const LineTabSwitcher({ + super.key, + required this.tabs, + required this.onTabChange, + required this.selectedTab, + }); + + final List tabs; + final void Function(int index) onTabChange; + final int selectedTab; + + @override + State createState() => _LineTabSwitcherState(); +} + +class _LineTabSwitcherState extends State { + List textWidgetKeys = []; + List textWidgetSizes = []; + bool textWidgetsMeasured = false; + + double _calcBarLeft() { + double left = 0; + + if (textWidgetKeys.isEmpty || textWidgetSizes.isEmpty) { + return 0; + } + + for (int i = 0; i < widget.selectedTab; i++) { + left += textWidgetSizes[i].width + 16.0; + } + + left += 8.0; + + return left; + } + + @override + void initState() { + super.initState(); + textWidgetKeys = List.generate(widget.tabs.length, (index) => GlobalKey()); + WidgetsBinding.instance.addPostFrameCallback((_) => measure()); + } + + void measure() { + setState(() { + textWidgetSizes = textWidgetKeys + .map((k) => k.currentContext!.size) + .whereType() + .toList(); + textWidgetsMeasured = true; + }); + } + + @override + Widget build(BuildContext context) { + if (!textWidgetsMeasured) { + WidgetsBinding.instance.addPostFrameCallback((_) => measure()); + } + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Container( + width: 200, + height: 40, + child: ListView.builder( + physics: NeverScrollableScrollPhysics(), + scrollDirection: Axis.horizontal, + itemCount: widget.tabs.length, + itemBuilder: (context, index) { + return GestureDetector( + onTap: () { + widget.onTabChange(index); + }, + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + AnimatedDefaultTextStyle( + duration: Duration(milliseconds: 150), + style: DefaultTextStyle.of(context).style.copyWith( + inherit: true, + fontSize: 22, + color: widget.selectedTab == index + ? Theme.of(context).colorScheme.onSurface + : Theme.of(context).colorScheme.onSurfaceVariant, + ), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Text( + widget.tabs[index], + key: textWidgetKeys[index], + ), + ), + ), + ], + ), + ); + }, + ), + ), + Container( + width: 200, + height: 2, + child: Stack( + children: [ + AnimatedPositioned( + curve: Curves.easeOut, + left: _calcBarLeft(), + bottom: 0, + duration: Duration(milliseconds: 150), + child: AnimatedSize( + duration: Duration(milliseconds: 150), + child: Container( + height: 2, + width: textWidgetSizes.isEmpty + ? 0 + : textWidgetSizes[widget.selectedTab].width, + color: Theme.of(context).colorScheme.onSurface, + ), + ), + ), + ], + ), + ), + ], + ); + } +} diff --git a/lib/new-ui/widgets/modern_button.dart b/lib/new-ui/widgets/modern_button.dart new file mode 100644 index 0000000000..2c0db7f12a --- /dev/null +++ b/lib/new-ui/widgets/modern_button.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +class ModernButton extends StatelessWidget { + final double size; + final String? svgPath; + final Widget? icon; + final VoidCallback onPressed; + final Color? color; + + static const iconSvgSizeRatio = 2/3; + + + const ModernButton({ + super.key, + required this.size, + required this.icon, + required this.onPressed, + this.color + }) : svgPath = null; + + const ModernButton.svg({ + super.key, + required this.size, + required this.svgPath, + required this.onPressed, + this.color + }) : icon = null; + + @override + Widget build(BuildContext context) { + final color = Theme.of(context).colorScheme.primary; + final Widget resolvedIcon = svgPath != null + ? SvgPicture.asset( + svgPath!, + width: size, + height: size, + fit: BoxFit.contain, + alignment: Alignment.center, + allowDrawingOutsideViewBox: true, + colorFilter: ColorFilter.mode(color, BlendMode.srcIn), + ) + : IconTheme( + data: IconThemeData(color: color, size: size*iconSvgSizeRatio), + child: icon!, + ); + + return Container( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surfaceContainer, + borderRadius: BorderRadius.circular(size), + ), + width: size, + height: size, + child: IconButton( + padding: EdgeInsets.zero, + onPressed: onPressed, + icon: resolvedIcon, + ), + ); + } +} diff --git a/lib/new-ui/widgets/navbar/navbar.dart b/lib/new-ui/widgets/navbar/navbar.dart new file mode 100644 index 0000000000..f19f6e69b6 --- /dev/null +++ b/lib/new-ui/widgets/navbar/navbar.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; + +import 'navbar_button.dart'; + +class Navbar extends StatefulWidget { + const Navbar({super.key}); + + @override + State createState() => _NavbarState(); +} + +class NavbarItemData { + final String iconPath; + final String text; + + NavbarItemData(this.iconPath, this.text); +} + +class _NavbarState extends State { + int _selectedIndex = 0; + + final List _items = [ + NavbarItemData("assets/Home.svg", "Home"), + NavbarItemData("assets/Wallets.svg", "Wallets"), + NavbarItemData("assets/Contacts.svg", "Contacts"), + NavbarItemData("assets/Apps.svg", "Apps"), + NavbarItemData("assets/Charts.svg", "Charts"), + ]; + + @override + Widget build(BuildContext context) { + return Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.all(32.0), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(99999), + color: Theme.of( + context, + ).colorScheme.surfaceContainerHighest.withAlpha(170), + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 12.0, + vertical: 12.0, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: List.generate(_items.length, (index) { + return NavbarButton( + data: _items[index], + onPressed: () { + setState(() { + _selectedIndex = index; + }); + }, + selected: _selectedIndex == index, + ); + }), + ), + ), + ), + ), + ); + } +} diff --git a/lib/new-ui/widgets/navbar/navbar_button.dart b/lib/new-ui/widgets/navbar/navbar_button.dart new file mode 100644 index 0000000000..79c3af9eac --- /dev/null +++ b/lib/new-ui/widgets/navbar/navbar_button.dart @@ -0,0 +1,67 @@ +import 'package:cake_wallet/new-ui/widgets/navbar/navbar.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +class NavbarButton extends StatelessWidget { + const NavbarButton({ + super.key, + required this.data, + required this.selected, + required this.onPressed, + }); + + final NavbarItemData data; + final VoidCallback onPressed; + final bool selected; + + @override + Widget build(BuildContext context) { + return AnimatedSize( + curve: Curves.easeOut, + duration: Duration(milliseconds: 100), + child: AnimatedContainer( + curve: Curves.easeOut, + duration: Duration(milliseconds: 100), + decoration: BoxDecoration( + color: selected + ? Color(0x79BDCFFF) + : Theme.of( + context, + ).colorScheme.surfaceContainerHighest.withAlpha(0), + borderRadius: BorderRadius.circular(1242357), + ), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + IconButton( + constraints: BoxConstraints(), + padding: EdgeInsets.zero, + icon: SvgPicture.asset( + data.iconPath, + width: selected ? 24 : 36, + height: selected ? 24 : 36, + colorFilter: ColorFilter.mode( + selected + ? Theme.of(context).colorScheme.onSurface + : Theme.of(context).colorScheme.primary, + BlendMode.srcIn, + ), + ), + onPressed: onPressed, + ), + if (selected) + Padding( + padding: const EdgeInsets.fromLTRB(0.0, 0.0, 8.0, 0.0), + child: Text( + data.text, + style: TextStyle(fontWeight: FontWeight.bold), + textAlign: TextAlign.center, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/new-ui/widgets/receive_page/receive_amount_input.dart b/lib/new-ui/widgets/receive_page/receive_amount_input.dart new file mode 100644 index 0000000000..1a793d015c --- /dev/null +++ b/lib/new-ui/widgets/receive_page/receive_amount_input.dart @@ -0,0 +1,90 @@ +import 'package:flutter/material.dart'; + +class ReceiveAmountInput extends StatelessWidget { + const ReceiveAmountInput({super.key, required this.largeQrMode}); + + final bool largeQrMode; + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + AnimatedContainer( + duration: Duration(milliseconds: 300), + height: 56, + width: largeQrMode ? 250 : 160, + decoration: BoxDecoration( + // color: largeQrMode + // ? Theme.of(context).colorScheme.surface + // // no it can't just be transparent. might be framework bug actually + // : Theme.of(context).colorScheme.surface, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10), + bottomLeft: Radius.circular(10), + topRight: Radius.circular(0), + bottomRight: Radius.circular(0), + ), + border: Border.all( + color: Theme.of(context).colorScheme.surfaceContainer, + width: 2, + ), + ), + child: AnimatedScale( + duration: Duration(milliseconds: 500), + scale: largeQrMode ? 1.3 : 1, + curve: Curves.easeOut, + child: TextField( + enabled: !largeQrMode, + textAlign: TextAlign.center, + textAlignVertical: TextAlignVertical.center, + decoration: InputDecoration( + hint: Text( + "0.00000000", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16, + color: Theme.of( + context, + ).colorScheme.onSurface.withValues(alpha: 0.5), + ), + ), + border: InputBorder.none, + ), + style: TextStyle(color: Theme.of(context).colorScheme.onSurface), + ), + ), + ), + Container( + height: 56, + width: 74, + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(0), + bottomLeft: Radius.circular(0), + topRight: Radius.circular(10), + bottomRight: Radius.circular(10), + ), + color: Theme.of(context).colorScheme.surfaceContainer, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4.0, + children: [ + Text( + "BTC", + style: TextStyle( + color: Theme.of(context).colorScheme.onSurface, + ), + ), + Icon( + Icons.keyboard_arrow_down, + color: Theme.of(context).colorScheme.primary, + ), + ], + ), + ), + ], + ); + } +} diff --git a/lib/new-ui/widgets/receive_page/receive_bottom_buttons.dart b/lib/new-ui/widgets/receive_page/receive_bottom_buttons.dart new file mode 100644 index 0000000000..5df32e216b --- /dev/null +++ b/lib/new-ui/widgets/receive_page/receive_bottom_buttons.dart @@ -0,0 +1,97 @@ +import 'package:flutter/material.dart'; + +class ReceiveBottomButtons extends StatelessWidget { + final bool largeQrMode; + const ReceiveBottomButtons({super.key, required this.largeQrMode}); + + @override + Widget build(BuildContext context) { + final double targetHeight = largeQrMode ? 0 : 150; + final double targetOpacity = largeQrMode ? 0 : 1; + + return AnimatedContainer( + duration: const Duration(milliseconds: 300), + curve: Curves.easeOut, + height: targetHeight, + child: AnimatedOpacity( + duration: const Duration(milliseconds: 300), + opacity: targetOpacity, + curve: Curves.easeOut, + child: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of( + context, + ).colorScheme.surfaceContainer, + foregroundColor: Colors.white, + minimumSize: const Size(double.infinity, 50), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + padding: const EdgeInsets.symmetric(vertical: 16), + ), + onPressed: () {}, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.book_outlined, + size: 20, + color: Theme.of(context).colorScheme.primary, + ), + const SizedBox(width: 10), + Text( + 'Accounts & Addresses', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.primary, + ), + ), + ], + ), + ), + ), + Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).colorScheme.primary, + foregroundColor: Colors.white, + minimumSize: const Size(double.infinity, 50), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + padding: const EdgeInsets.symmetric(vertical: 16), + ), + onPressed: () {}, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Copy Address', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + color: Theme.of(context).colorScheme.onPrimary, + ), + ), + const SizedBox(width: 10), + Icon( + Icons.copy_all_outlined, + size: 20, + color: Theme.of(context).colorScheme.onPrimary, + ), + ], + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/new-ui/widgets/receive_page/receive_qr_code.dart b/lib/new-ui/widgets/receive_page/receive_qr_code.dart new file mode 100644 index 0000000000..055567d73e --- /dev/null +++ b/lib/new-ui/widgets/receive_page/receive_qr_code.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; + +class ReceiveQrCode extends StatelessWidget { + const ReceiveQrCode({ + super.key, + required this.onTap, + required this.largeQrMode, + }); + + final VoidCallback onTap; + final bool largeQrMode; + + @override + Widget build(BuildContext context) { + final double targetY = largeQrMode ? 40 : 0; + + return GestureDetector( + onTap: onTap, + child: TweenAnimationBuilder( + tween: Tween(begin: 0, end: targetY), + duration: const Duration(milliseconds: 500), + curve: Curves.easeOut, + builder: (context, value, child) { + return Transform.translate( + offset: Offset(0, value), + child: AnimatedContainer( + duration: const Duration(milliseconds: 500), + curve: Curves.easeOutCubic, + width: largeQrMode ? 400 : 250, + height: largeQrMode ? 400 : 250, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + color: Colors.white, + ), + padding: const EdgeInsets.all(8.0), + child: Image.asset("assets/btcqr.png"), + ), + ); + }, + ), + ); + } +} diff --git a/lib/new-ui/widgets/receive_page/receive_seed_type_selector.dart b/lib/new-ui/widgets/receive_page/receive_seed_type_selector.dart new file mode 100644 index 0000000000..d136604b4d --- /dev/null +++ b/lib/new-ui/widgets/receive_page/receive_seed_type_selector.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +class ReceiveSeedTypeSelector extends StatelessWidget { + const ReceiveSeedTypeSelector({super.key}); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + spacing: 12.0, + children: [ + SvgPicture.asset( + width: 32, + height: 32, + "assets/new-ui/switcher-bitcoin-off.svg", + colorFilter: ColorFilter.mode( + Theme.of(context).colorScheme.primary, + BlendMode.srcIn, + ), + ), + Text( + "Standard", + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.primary, + ), + ), + Container( + width: 24, + height: 24, + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surfaceContainer, + borderRadius: BorderRadius.circular(999999), + ), + child: IconButton( + padding: EdgeInsets.zero, + constraints: BoxConstraints(), + onPressed: () {}, + icon: (Icon( + color: Theme.of(context).colorScheme.primary, + size: 20, + Icons.keyboard_arrow_down, + )), + ), + ), + ], + ); + } +} diff --git a/lib/new-ui/widgets/receive_page/receive_seed_widget.dart b/lib/new-ui/widgets/receive_page/receive_seed_widget.dart new file mode 100644 index 0000000000..a95fcbb1b7 --- /dev/null +++ b/lib/new-ui/widgets/receive_page/receive_seed_widget.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; + +class ReceiveSeedWidget extends StatelessWidget { + const ReceiveSeedWidget({super.key}); + + static const List dummyWalletStrings = [ + 'bc1q', + 'xy2k', + 'gdyg', + 'jrsq', + 'tzq2', + 'n0yr', + 'f249', + '3p83', + 'kkfj', + 'hx0wlh', + ]; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 80.0), + child: Wrap( + alignment: WrapAlignment.center, + spacing: 8.0, + runSpacing: 4.0, + children: List.generate( + dummyWalletStrings.length, + (index) => Text( + dummyWalletStrings[index], + style: TextStyle( + fontSize: 16, + color: index % 2 != 0 ? Colors.grey : Colors.white, + ), + ), + ), + ), + ); + } +} diff --git a/lib/new-ui/widgets/receive_page/receive_top_bar.dart b/lib/new-ui/widgets/receive_page/receive_top_bar.dart new file mode 100644 index 0000000000..cbd80167b2 --- /dev/null +++ b/lib/new-ui/widgets/receive_page/receive_top_bar.dart @@ -0,0 +1,27 @@ +import 'package:cake_wallet/new-ui/widgets/modern_button.dart'; +import 'package:flutter/material.dart'; + +class ReceiveTopBar extends StatelessWidget { + const ReceiveTopBar({super.key}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ModernButton(size: 52, onPressed: () { + Navigator.of(context).pop(); + }, icon: Icon(Icons.close)), + + Text("Receive", style: TextStyle(fontSize: 22)), + ModernButton(size: 52, onPressed: () { + Navigator.of(context).pop(); + }, icon: Icon(Icons.share)), + ], + ), + ); + } +} diff --git a/lib/router.dart b/lib/router.dart index 02fe8275df..ee0a77c20b 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:cake_wallet/anonpay/anonpay_invoice_info.dart'; import 'package:cake_wallet/core/new_wallet_arguments.dart'; +import 'package:cake_wallet/new-ui/new_dashboard.dart'; import 'package:cake_wallet/order/order.dart'; import 'package:cake_wallet/core/new_wallet_type_arguments.dart'; import 'package:cake_wallet/core/totp_request_details.dart'; @@ -40,6 +41,7 @@ import 'package:cake_wallet/src/screens/dev/monero_background_sync.dart'; import 'package:cake_wallet/src/screens/dev/moneroc_cache_debug.dart'; import 'package:cake_wallet/src/screens/dev/moneroc_call_profiler.dart'; import 'package:cake_wallet/src/screens/dev/network_requests.dart'; +import 'package:cake_wallet/utils/feature_flag.dart'; import 'package:cake_wallet/src/screens/dev/qr_tools_page.dart'; import 'package:cake_wallet/src/screens/dev/secure_preferences_page.dart'; import 'package:cake_wallet/src/screens/dev/shared_preferences_page.dart'; @@ -148,6 +150,7 @@ import 'package:cw_core/nano_account.dart'; import 'package:cw_core/node.dart'; import 'package:cw_core/transaction_info.dart'; import 'package:cw_core/unspent_coin_type.dart'; +import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:flutter/cupertino.dart'; @@ -163,15 +166,19 @@ Route handleRouteWithPlatformAwareness( bool fullscreenDialog = false, }) { if (Platform.isIOS) { - return CupertinoPageRoute(builder: builder, fullscreenDialog: fullscreenDialog); + return CupertinoPageRoute( + builder: builder, fullscreenDialog: fullscreenDialog); } else { - return MaterialPageRoute(builder: builder, fullscreenDialog: fullscreenDialog); + return MaterialPageRoute( + builder: builder, fullscreenDialog: fullscreenDialog); } } Route createRoute(RouteSettings settings) { currentRouteSettings = settings; + printV(settings.name); + switch (settings.name) { case Routes.welcome: return MaterialPageRoute( @@ -222,7 +229,8 @@ Route createRoute(RouteSettings settings) { case Routes.walletGroupsDisplayPage: final type = settings.arguments as WalletType; - final walletGroupsDisplayVM = getIt.get(param1: type); + final walletGroupsDisplayVM = + getIt.get(param1: type); return handleRouteWithPlatformAwareness( (_) => WalletGroupsDisplayPage( @@ -247,21 +255,25 @@ Route createRoute(RouteSettings settings) { case Routes.chooseHardwareWalletAccount: final arguments = settings.arguments as List; final type = arguments[0] as WalletType; - final hardwareWallet = arguments [1] as HardwareWalletType; + final hardwareWallet = arguments[1] as HardwareWalletType; final walletVM = getIt.get( - param1: type, param2: getIt(param1: hardwareWallet)); + param1: type, + param2: getIt(param1: hardwareWallet)); if (type == WalletType.monero) - return handleRouteWithPlatformAwareness((_) => MoneroHardwareWalletOptionsPage(walletVM)); + return handleRouteWithPlatformAwareness( + (_) => MoneroHardwareWalletOptionsPage(walletVM)); - return handleRouteWithPlatformAwareness((_) => SelectHardwareWalletAccountPage(walletVM)); + return handleRouteWithPlatformAwareness( + (_) => SelectHardwareWalletAccountPage(walletVM)); case Routes.setupPin: Function(PinCodeState, String)? callback; if (settings.arguments is Function(PinCodeState, String)) { - callback = settings.arguments as Function(PinCodeState, String); + callback = + settings.arguments as Function(PinCodeState, String); } return handleRouteWithPlatformAwareness( @@ -274,7 +286,8 @@ Route createRoute(RouteSettings settings) { param1: NewWalletTypeArguments( onTypeSelected: (BuildContext context, WalletType type) { final arg = {'walletType': type}; - Navigator.of(context).pushNamed(Routes.restoreWallet, arguments: arg); + Navigator.of(context) + .pushNamed(Routes.restoreWallet, arguments: arg); }, isCreate: false, ), @@ -294,7 +307,8 @@ Route createRoute(RouteSettings settings) { case Routes.restoreWalletFromSeedKeys: if (isSingleCoin) { return handleRouteWithPlatformAwareness( - (context) => getIt.get(param1: availableWalletTypes.first), + (context) => + getIt.get(param1: availableWalletTypes.first), ); } return handleRouteWithPlatformAwareness( @@ -302,7 +316,8 @@ Route createRoute(RouteSettings settings) { param1: NewWalletTypeArguments( onTypeSelected: (BuildContext context, WalletType type) { final arg = {'walletType': type}; - Navigator.of(context).pushNamed(Routes.restoreWallet, arguments: arg); + Navigator.of(context) + .pushNamed(Routes.restoreWallet, arguments: arg); }, isCreate: false, ), @@ -312,19 +327,23 @@ Route createRoute(RouteSettings settings) { case Routes.restoreWalletFromHardwareWallet: final arguments = settings.arguments as Map?; final showUnavailable = (arguments?['showUnavailable'] as bool?) ?? true; - final onSelect = arguments?['onSelect'] as void Function(BuildContext, HardwareWalletType)?; + final onSelect = arguments?['onSelect'] as void Function( + BuildContext, HardwareWalletType)?; final availableHardwareWalletTypes = - arguments?['availableHardwareWalletTypes'] as List?; + arguments?['availableHardwareWalletTypes'] + as List?; - return handleRouteWithPlatformAwareness((_) => SelectDeviceManufacturerPage( - showUnavailable: showUnavailable, - onSelect: onSelect, - availableHardwareWalletTypes: availableHardwareWalletTypes, - )); + return handleRouteWithPlatformAwareness( + (_) => SelectDeviceManufacturerPage( + showUnavailable: showUnavailable, + onSelect: onSelect, + availableHardwareWalletTypes: availableHardwareWalletTypes, + )); case Routes.connectHardwareWallet: final arguments = settings.arguments as List; - final hardwareWalletType = (arguments[0] as HardwareWalletType?) ?? HardwareWalletType.ledger; + final hardwareWalletType = + (arguments[0] as HardwareWalletType?) ?? HardwareWalletType.ledger; if (isSingleCoin) { return handleRouteWithPlatformAwareness( @@ -332,9 +351,13 @@ Route createRoute(RouteSettings settings) { ConnectDevicePageParams( walletType: availableWalletTypes.first, hardwareWalletType: hardwareWalletType, - onConnectDevice: (BuildContext context, _) => Navigator.of(context).pushNamed( - Routes.chooseHardwareWalletAccount, - arguments: [availableWalletTypes.first, hardwareWalletType]), + onConnectDevice: (BuildContext context, _) => + Navigator.of(context).pushNamed( + Routes.chooseHardwareWalletAccount, + arguments: [ + availableWalletTypes.first, + hardwareWalletType + ]), isReconnect: false, ), getIt.get(), @@ -346,7 +369,8 @@ Route createRoute(RouteSettings settings) { param1: NewWalletTypeArguments( onTypeSelected: (BuildContext context, WalletType type) { if (hardwareWalletType == HardwareWalletType.trezor) { - Navigator.of(context).pushNamed(Routes.chooseHardwareWalletAccount, + Navigator.of(context).pushNamed( + Routes.chooseHardwareWalletAccount, arguments: [type, hardwareWalletType]); return; } @@ -354,13 +378,15 @@ Route createRoute(RouteSettings settings) { final arguments = ConnectDevicePageParams( walletType: type, hardwareWalletType: hardwareWalletType, - onConnectDevice: (BuildContext context, _) => Navigator.of(context).pushNamed( - Routes.chooseHardwareWalletAccount, - arguments: [type, hardwareWalletType]), + onConnectDevice: (BuildContext context, _) => + Navigator.of(context).pushNamed( + Routes.chooseHardwareWalletAccount, + arguments: [type, hardwareWalletType]), isReconnect: false, ); - Navigator.of(context).pushNamed(Routes.connectDevices, arguments: arguments); + Navigator.of(context) + .pushNamed(Routes.connectDevices, arguments: arguments); }, isCreate: false, hardwareWalletType: hardwareWalletType, @@ -381,14 +407,16 @@ Route createRoute(RouteSettings settings) { case Routes.seed: return handleRouteWithPlatformAwareness( - (context) => getIt.get(param1: settings.arguments as bool), + (context) => + getIt.get(param1: settings.arguments as bool), ); case Routes.restoreWallet: final args = settings.arguments as Map?; final walletType = args?['walletType'] as WalletType; return MaterialPageRoute( - builder: (_) => getIt.get(param1: walletType, param2: args)); + builder: (_) => + getIt.get(param1: walletType, param2: args)); case Routes.restoreWalletChooseDerivation: return MaterialPageRoute( @@ -396,16 +424,21 @@ Route createRoute(RouteSettings settings) { param1: settings.arguments as List)); case Routes.sweepingWalletPage: - return CupertinoPageRoute(builder: (_) => getIt.get()); + return CupertinoPageRoute( + builder: (_) => getIt.get()); case Routes.dashboard: return CupertinoPageRoute( - settings: settings, builder: (_) => getIt.get()); + settings: settings, builder: (_) => + FeatureFlag.hasNewUi? + getIt.get(): + getIt.get()); case Routes.send: final args = settings.arguments as Map?; final initialPaymentRequest = args?['paymentRequest'] as PaymentRequest?; - final coinTypeToSpendFrom = args?['coinTypeToSpendFrom'] as UnspentCoinType?; + final coinTypeToSpendFrom = + args?['coinTypeToSpendFrom'] as UnspentCoinType?; return handleRouteWithPlatformAwareness( (context) => getIt.get( @@ -416,10 +449,12 @@ Route createRoute(RouteSettings settings) { case Routes.sendTemplate: return CupertinoPageRoute( - fullscreenDialog: true, builder: (_) => getIt.get()); + fullscreenDialog: true, + builder: (_) => getIt.get()); case Routes.receive: - return CupertinoPageRoute(builder: (context) => getIt.get()); + return CupertinoPageRoute( + builder: (context) => getIt.get()); case Routes.addressPage: return handleRouteWithPlatformAwareness( @@ -429,29 +464,34 @@ Route createRoute(RouteSettings settings) { case Routes.transactionDetails: return CupertinoPageRoute( fullscreenDialog: true, - builder: (_) => - getIt.get(param1: settings.arguments as TransactionInfo)); + builder: (_) => getIt.get( + param1: settings.arguments as TransactionInfo)); case Routes.bumpFeePage: return CupertinoPageRoute( fullscreenDialog: true, - builder: (_) => getIt.get(param1: settings.arguments as List)); + builder: (_) => getIt.get( + param1: settings.arguments as List)); case Routes.newSubaddress: return CupertinoPageRoute( - builder: (_) => getIt.get(param1: settings.arguments)); + builder: (_) => + getIt.get(param1: settings.arguments)); case Routes.disclaimer: return CupertinoPageRoute(builder: (_) => DisclaimerPage()); case Routes.readDisclaimer: - return CupertinoPageRoute(builder: (_) => DisclaimerPage(isReadOnly: true)); + return CupertinoPageRoute( + builder: (_) => DisclaimerPage(isReadOnly: true)); case Routes.readThirdPartyDisclaimer: - return CupertinoPageRoute(builder: (_) => ThirdPartyDisclaimerPage()); + return CupertinoPageRoute( + builder: (_) => ThirdPartyDisclaimerPage()); case Routes.changeRep: - return CupertinoPageRoute(builder: (_) => getIt.get()); + return CupertinoPageRoute( + builder: (_) => getIt.get()); case Routes.walletList: final onWalletLoaded = settings.arguments as Function(BuildContext)?; @@ -463,8 +503,8 @@ Route createRoute(RouteSettings settings) { case Routes.walletEdit: return MaterialPageRoute( fullscreenDialog: true, - builder: (_) => - getIt.get(param1: settings.arguments as WalletEditPageArguments), + builder: (_) => getIt.get( + param1: settings.arguments as WalletEditPageArguments), ); case Routes.auth: @@ -477,7 +517,8 @@ Route createRoute(RouteSettings settings) { instanceName: 'wallet_unlock_verifiable', param2: true) : getIt.get( - param1: settings.arguments as OnAuthenticationFinished, param2: true)); + param1: settings.arguments as OnAuthenticationFinished, + param2: true)); case Routes.totpAuthCodePage: final args = settings.arguments as TotpAuthArgumentsModel; @@ -503,13 +544,15 @@ Route createRoute(RouteSettings settings) { ? WillPopScope( child: getIt.get( param1: WalletUnlockArguments( - callback: settings.arguments as OnAuthenticationFinished), + callback: + settings.arguments as OnAuthenticationFinished), param2: false, instanceName: 'wallet_unlock_verifiable'), onWillPop: () async => false) : WillPopScope( child: getIt.get( - param1: settings.arguments as OnAuthenticationFinished, param2: false), + param1: settings.arguments as OnAuthenticationFinished, + param2: false), onWillPop: () async => false)); case Routes.silentPaymentsSettings: @@ -554,11 +597,13 @@ Route createRoute(RouteSettings settings) { case Routes.trocadorProvidersPage: return CupertinoPageRoute( - fullscreenDialog: true, builder: (_) => getIt.get()); + fullscreenDialog: true, + builder: (_) => getIt.get()); case Routes.domainLookupsPage: return CupertinoPageRoute( - fullscreenDialog: true, builder: (_) => getIt.get()); + fullscreenDialog: true, + builder: (_) => getIt.get()); case Routes.displaySettingsPage: return handleRouteWithPlatformAwareness( @@ -574,17 +619,20 @@ Route createRoute(RouteSettings settings) { final args = settings.arguments as Map?; return CupertinoPageRoute( builder: (_) => getIt.get( - param1: args?['editingNode'] as Node?, param2: args?['isSelected'] as bool?)); + param1: args?['editingNode'] as Node?, + param2: args?['isSelected'] as bool?)); case Routes.login: return CupertinoPageRoute( builder: (context) => WillPopScope( child: SettingsStoreBase.walletPasswordDirectInput - ? getIt.get(instanceName: 'wallet_password_login') + ? getIt.get( + instanceName: 'wallet_password_login') : getIt.get(instanceName: 'login'), onWillPop: () async => // FIX-ME: Additional check does it works correctly - (await SystemChannels.platform.invokeMethod('SystemNavigator.pop') ?? + (await SystemChannels.platform + .invokeMethod('SystemNavigator.pop') ?? false)), fullscreenDialog: true); @@ -592,7 +640,8 @@ Route createRoute(RouteSettings settings) { final args = settings.arguments as Map?; return CupertinoPageRoute( builder: (_) => getIt.get( - param1: args?['editingNode'] as Node?, param2: args?['isSelected'] as bool?)); + param1: args?['editingNode'] as Node?, + param2: args?['isSelected'] as bool?)); case Routes.accountCreation: return CupertinoPageRoute( @@ -601,8 +650,8 @@ Route createRoute(RouteSettings settings) { case Routes.nanoAccountCreation: return CupertinoPageRoute( - builder: (_) => - getIt.get(param1: settings.arguments as NanoAccount?)); + builder: (_) => getIt.get( + param1: settings.arguments as NanoAccount?)); case Routes.addressBook: return handleRouteWithPlatformAwareness( @@ -615,11 +664,13 @@ Route createRoute(RouteSettings settings) { builder: (_) => getIt.get(param1: selectedCurrency)); case Routes.pickerWalletAddress: - return MaterialPageRoute(builder: (_) => getIt.get()); + return MaterialPageRoute( + builder: (_) => getIt.get()); case Routes.addressBookAddContact: return handleRouteWithPlatformAwareness( - (context) => getIt.get(param1: settings.arguments as ContactRecord?), + (context) => getIt.get( + param1: settings.arguments as ContactRecord?), ); case Routes.showKeys: @@ -628,19 +679,23 @@ Route createRoute(RouteSettings settings) { ); case Routes.exchangeTrade: - return CupertinoPageRoute(builder: (_) => getIt.get()); + return CupertinoPageRoute( + builder: (_) => getIt.get()); case Routes.exchangeConfirm: - return MaterialPageRoute(builder: (_) => getIt.get()); + return MaterialPageRoute( + builder: (_) => getIt.get()); case Routes.tradeDetails: return MaterialPageRoute( fullscreenDialog: true, - builder: (_) => getIt.get(param1: settings.arguments as Trade)); + builder: (_) => + getIt.get(param1: settings.arguments as Trade)); case Routes.orderDetails: return MaterialPageRoute( - builder: (_) => getIt.get(param1: settings.arguments as Order)); + builder: (_) => + getIt.get(param1: settings.arguments as Order)); case Routes.buySellPage: final args = settings.arguments as bool; @@ -650,7 +705,8 @@ Route createRoute(RouteSettings settings) { case Routes.buyOptionsPage: final args = settings.arguments as List; - return MaterialPageRoute(builder: (_) => getIt.get(param1: args)); + return MaterialPageRoute( + builder: (_) => getIt.get(param1: args)); case Routes.paymentMethodOptionsPage: final args = settings.arguments as List; @@ -661,15 +717,18 @@ Route createRoute(RouteSettings settings) { final args = settings.arguments as List; return MaterialPageRoute( - fullscreenDialog: true, builder: (_) => getIt.get(param1: args)); + fullscreenDialog: true, + builder: (_) => getIt.get(param1: args)); case Routes.exchange: return handleRouteWithPlatformAwareness( - (context) => getIt.get(param1: settings.arguments as PaymentRequest?), + (context) => getIt.get( + param1: settings.arguments as PaymentRequest?), ); case Routes.exchangeTemplate: - return CupertinoPageRoute(builder: (_) => getIt.get()); + return CupertinoPageRoute( + builder: (_) => getIt.get()); case Routes.rescan: return MaterialPageRoute(builder: (_) => getIt.get()); @@ -681,11 +740,13 @@ Route createRoute(RouteSettings settings) { return MaterialPageRoute(builder: (_) => getIt.get()); case Routes.walletGroupExistingSeedDescriptionPage: - return MaterialPageRoute(builder: (_) => WalletGroupExistingSeedDescriptionPage()); + return MaterialPageRoute( + builder: (_) => WalletGroupExistingSeedDescriptionPage()); case Routes.transactionSuccessPage: return MaterialPageRoute( - builder: (_) => getIt.get(param1: settings.arguments as String)); + builder: (_) => getIt.get( + param1: settings.arguments as String)); case Routes.backup: return handleRouteWithPlatformAwareness( @@ -693,11 +754,13 @@ Route createRoute(RouteSettings settings) { ); case Routes.editBackupPassword: - return CupertinoPageRoute(builder: (_) => getIt.get()); + return CupertinoPageRoute( + builder: (_) => getIt.get()); case Routes.restoreFromBackup: return CupertinoPageRoute( - fullscreenDialog: true, builder: (_) => getIt.get()); + fullscreenDialog: true, + builder: (_) => getIt.get()); case Routes.support: return handleRouteWithPlatformAwareness( @@ -705,7 +768,8 @@ Route createRoute(RouteSettings settings) { ); case Routes.supportLiveChat: - return CupertinoPageRoute(builder: (_) => getIt.get()); + return CupertinoPageRoute( + builder: (_) => getIt.get()); case Routes.supportOtherLinks: return handleRouteWithPlatformAwareness( @@ -715,7 +779,8 @@ Route createRoute(RouteSettings settings) { case Routes.unspentCoinsList: final coinTypeToSpendFrom = settings.arguments as UnspentCoinType?; return handleRouteWithPlatformAwareness( - (context) => getIt.get(param1: coinTypeToSpendFrom), + (context) => + getIt.get(param1: coinTypeToSpendFrom), ); case Routes.unspentCoinsDetails: @@ -752,7 +817,6 @@ Route createRoute(RouteSettings settings) { (context) => getIt.get(param1: args), ); - case Routes.cakePayAccountPage: return handleRouteWithPlatformAwareness( (context) => getIt.get(), @@ -782,41 +846,47 @@ Route createRoute(RouteSettings settings) { toggleUseTestnet: toggleTestnet, advancedPrivacySettingsViewModel: getIt.get(param1: type), - nodeViewModel: getIt.get(param1: type, param2: false), + nodeViewModel: + getIt.get(param1: type, param2: false), seedSettingsViewModel: getIt.get(), ), ); case Routes.anonPayInvoicePage: final args = settings.arguments as List; - return CupertinoPageRoute(builder: (_) => getIt.get(param1: args)); + return CupertinoPageRoute( + builder: (_) => getIt.get(param1: args)); case Routes.anonPayReceivePage: final anonReceivePageArgs = settings.arguments as AnonPayReceivePageArgs; return CupertinoPageRoute( - builder: (_) => getIt.get(param1: anonReceivePageArgs)); + builder: (_) => + getIt.get(param1: anonReceivePageArgs)); case Routes.anonPayDetailsPage: final anonInvoiceViewData = settings.arguments as AnonpayInvoiceInfo; return CupertinoPageRoute( - builder: (_) => getIt.get(param1: anonInvoiceViewData)); + builder: (_) => + getIt.get(param1: anonInvoiceViewData)); case Routes.payjoinDetails: final arguments = settings.arguments as List; final sessionId = arguments.first as String; final transactionInfo = arguments[1] as TransactionInfo?; return CupertinoPageRoute( - builder: (_) => - getIt.get(param1: sessionId, param2: transactionInfo)); + builder: (_) => getIt.get( + param1: sessionId, param2: transactionInfo)); case Routes.desktop_actions: return PageRouteBuilder( opaque: false, - pageBuilder: (_, __, ___) => DesktopDashboardActions(getIt()), + pageBuilder: (_, __, ___) => + DesktopDashboardActions(getIt()), ); case Routes.desktop_settings_page: - return CupertinoPageRoute(builder: (_) => getIt.get()); + return CupertinoPageRoute( + builder: (_) => getIt.get()); case Routes.empty_no_route: return MaterialPageRoute(builder: (_) => SizedBox.shrink()); @@ -831,17 +901,21 @@ Route createRoute(RouteSettings settings) { return MaterialPageRoute(builder: (_) => getIt.get()); case Routes.setup_2faQRPage: - return MaterialPageRoute(builder: (_) => getIt.get()); + return MaterialPageRoute( + builder: (_) => getIt.get()); case Routes.modify2FAPage: - return MaterialPageRoute(builder: (_) => getIt.get()); + return MaterialPageRoute( + builder: (_) => getIt.get()); case Routes.setup2faInfoPage: - return MaterialPageRoute(builder: (_) => getIt.get()); + return MaterialPageRoute( + builder: (_) => getIt.get()); case Routes.urqrAnimatedPage: return MaterialPageRoute( - builder: (_) => getIt.get(param1: settings.arguments)); + builder: (_) => + getIt.get(param1: settings.arguments)); case Routes.homeSettings: return CupertinoPageRoute( @@ -863,10 +937,12 @@ Route createRoute(RouteSettings settings) { ); case Routes.manageNodes: - return MaterialPageRoute(builder: (_) => getIt.get(param1: false)); + return MaterialPageRoute( + builder: (_) => getIt.get(param1: false)); case Routes.managePowNodes: - return MaterialPageRoute(builder: (_) => getIt.get(param1: true)); + return MaterialPageRoute( + builder: (_) => getIt.get(param1: true)); case Routes.walletConnectConnectionsListing: return MaterialPageRoute( @@ -902,7 +978,9 @@ Route createRoute(RouteSettings settings) { return MaterialPageRoute( builder: (_) => ConnectDevicePage( - params, getIt.get(param1: params.hardwareWalletType))); + params, + getIt.get( + param1: params.hardwareWalletType))); case Routes.walletGroupDescription: final walletType = settings.arguments as WalletType; @@ -942,12 +1020,12 @@ Route createRoute(RouteSettings settings) { return MaterialPageRoute( builder: (_) => getIt.get(), ); - + case Routes.devSocketHealthLogs: return CupertinoPageRoute( builder: (_) => getIt.get(), ); - + case Routes.devQRTools: return MaterialPageRoute( builder: (_) => getIt.get(), @@ -957,12 +1035,12 @@ Route createRoute(RouteSettings settings) { return MaterialPageRoute( builder: (_) => getIt.get(), ); - + case Routes.devExchangeProviderLogs: return MaterialPageRoute( builder: (_) => getIt.get(), ); - + case Routes.devMoneroCallProfiler: return MaterialPageRoute( builder: (_) => getIt.get(), @@ -977,7 +1055,7 @@ Route createRoute(RouteSettings settings) { return MaterialPageRoute( builder: (_) => getIt.get(), ); - + case Routes.startTor: return MaterialPageRoute( builder: (_) => getIt.get(), @@ -991,6 +1069,8 @@ Route createRoute(RouteSettings settings) { default: return MaterialPageRoute( builder: (_) => Scaffold( - body: Center(child: Text(S.current.router_no_route(settings.name ?? 'No route'))))); + body: Center( + child: Text(S.current + .router_no_route(settings.name ?? 'No route'))))); } } diff --git a/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart b/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart index 2c1dc74e96..2a708e4869 100644 --- a/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart +++ b/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart @@ -1,4 +1,3 @@ -import 'dart:math' as math; import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -20,36 +19,38 @@ class NewMainNavBar extends StatefulWidget { } class _NEWNewMainNavBarState extends State { - static const kBarFlex = 0.85; static const barHeight = 64.0; static const barBottomPadding = 32.0; static const iconWidth = 28.0; static const iconHeight = 28.0; + static const iconHorizontalPadding = 12.0; static const pillIconWidth = 20.0; static const pillIconHeight = 20.0; - static const pillIconSpacing = 8.0; - static const pillHorizontalPadding = 14.0; + static const pillIconSpacing = 4.0; + static const pillHorizontalPadding = 16.0; static const barBorderRadius = 50.0; static const pillBorderRadius = 50.0; - static const barResizeDuration = Duration(milliseconds: 400); + static const barHorizontalPadding = 12.0; + + static const barResizeDuration = Duration(milliseconds: 100); static const inactiveIconMoveDuration = Duration(milliseconds: 150); static const inactiveIconFadeDuration = Duration(milliseconds: 100); static const inactiveIconAppearDuration = Duration(milliseconds: 250); - static const pillMoveDuration = Duration(milliseconds: 300); - static const pillResizeDuration = Duration(milliseconds: 200); + static const pillMoveDuration = Duration(milliseconds: 150); + static const pillResizeDuration = Duration(milliseconds: 100); static const pillTextStyle = TextStyle( fontSize: 16, fontWeight: FontWeight.w500, ); - late int selectedIndex; - bool _fadeSelected = true; + int selectedIndex = 0; + bool _fadeSelected = false; bool _firstFrame = true; @override @@ -68,11 +69,11 @@ class _NEWNewMainNavBarState extends State { setState(() { selectedIndex = index; - _fadeSelected = false; + _fadeSelected = true; }); // delay fade (tweak duration) - Future.delayed(const Duration(milliseconds: 50), () { + Future.delayed(const Duration(milliseconds: 00), () { if (!mounted) return; if (index == selectedIndex) { setState(() => _fadeSelected = true); @@ -98,7 +99,21 @@ class _NEWNewMainNavBarState extends State { return pillIconWidth + pillIconSpacing + textPainter.width + - pillHorizontalPadding * 2; + pillHorizontalPadding; + } + + double calcLeft(int index, double pillWidth) { + final double baseOffset = (iconWidth+iconHorizontalPadding) * index; + + double additionalSpacing; + if (index > selectedIndex) additionalSpacing = pillWidth-iconWidth; + else additionalSpacing = 0; + + return baseOffset + additionalSpacing; + } + + double calcBarWidth(double pillWidth) { + return (iconWidth+iconHorizontalPadding)*NewMainActions.all.length+(pillWidth-iconWidth)+barHorizontalPadding; } @override @@ -115,56 +130,12 @@ class _NEWNewMainNavBarState extends State { (action) => action.canShow?.call(widget.dashboardViewModel) ?? true) .toList(); - final screenWidth = MediaQuery.of(context).size.width; final pillWidth = _estimatePillWidthForAction( context, visibleActions[selectedIndex], color: activeColor); - final baseWidth = screenWidth * 0.65; + final barWidth = calcBarWidth(pillWidth); - final double baselinePillWidth = - pillIconWidth + pillIconSpacing + (pillHorizontalPadding * 2) + 8; - - // Dynamic bar width - final barWidth = math.max( - baseWidth, - baseWidth + (pillWidth - baselinePillWidth) * kBarFlex, - ); - - final int itemCount = visibleActions.length; - const double edgePadding = 10.0; - final double firstItemLeft = edgePadding; - final double lastItemLeft = barWidth - pillWidth - edgePadding; - - // Center alignment for middle (3rd) icon - final double centerOfBar = barWidth / 2; - final double halfPill = pillWidth / 2; - final double centerItemLeft = centerOfBar - halfPill; - - // Base even spacing between first → center → last - final double secondItemLeft = - firstItemLeft + (centerItemLeft - firstItemLeft) / 2; - final double fourthItemLeft = - centerItemLeft + (lastItemLeft - centerItemLeft) / 2; - - // Spacing correction function - double spacingCorrection(int index) { - const double maxCorrection = 6.0; - final double factor = - (index - (itemCount - 1) / 2).abs() / ((itemCount - 1) / 2); - return maxCorrection * factor; - } - - // Apply correction: shift outer icons inward slightly - final List positions = [ - firstItemLeft + spacingCorrection(0), - secondItemLeft + spacingCorrection(1) / 2, - centerItemLeft, - fourthItemLeft - spacingCorrection(3) / 2, - lastItemLeft - spacingCorrection(4), - ]; - - final double left = positions[selectedIndex]; final currentAction = visibleActions[selectedIndex]; return Align( @@ -187,70 +158,67 @@ class _NEWNewMainNavBarState extends State { color: backgroundColor, borderRadius: BorderRadius.circular(barBorderRadius), ), - child: Stack( - alignment: Alignment.center, - children: [ - AnimatedPill( - left: left, - pillColor: pillColor, - currentAction: currentAction, - pillIconHeight: pillIconHeight, - pillIconWidth: pillIconWidth, - pillIconSpacing: pillIconSpacing, - pillBorderRadius: pillBorderRadius, - contentColor: activeColor, - estimateWidthForAction: pillWidth, - pillTextStyle: pillTextStyle, - pillMoveDuration: pillMoveDuration, - pillResizeDuration: pillResizeDuration, - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - for (int i = 0; i < visibleActions.length; i++) - GestureDetector( - onTap: () => _onItemTap(i), - child: AnimatedContainer( - duration: _firstFrame - ? Duration.zero - : inactiveIconMoveDuration, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: barHorizontalPadding), + child: Stack( + alignment: Alignment.center, + children: [ + AnimatedPill( + left: calcLeft(selectedIndex, pillWidth), + pillColor: pillColor, + currentAction: currentAction, + pillIconHeight: pillIconHeight, + pillIconWidth: pillIconWidth, + pillIconSpacing: pillIconSpacing, + pillBorderRadius: pillBorderRadius, + contentColor: activeColor, + estimateWidthForAction: pillWidth, + pillTextStyle: pillTextStyle, + pillMoveDuration: pillMoveDuration, + pillResizeDuration: pillResizeDuration, + ), + for (int i = 0; i < visibleActions.length; i++) + AnimatedPositioned( + duration: pillResizeDuration, + left: calcLeft(i, pillWidth), + curve: Curves.easeOutCubic, + child: GestureDetector( + onTap: () => _onItemTap(i), + child: AnimatedContainer( + duration: _firstFrame + ? Duration.zero + : inactiveIconMoveDuration, + curve: Curves.easeOutCubic, + width: + i == selectedIndex ? pillWidth : iconWidth, + height: iconHeight, + alignment: Alignment.center, + child: AnimatedOpacity( + duration: inactiveIconFadeDuration, curve: Curves.easeOutCubic, - width: i == selectedIndex - ? pillWidth - : iconWidth, - height: iconHeight, - alignment: Alignment.center, - child: AnimatedOpacity( - duration: inactiveIconFadeDuration, + opacity: (i == selectedIndex && _fadeSelected) + ? 0.0 + : 1.0, + child: AnimatedScale( + duration: inactiveIconAppearDuration, curve: Curves.easeOutCubic, - opacity: - (i == selectedIndex && _fadeSelected) - ? 0.0 - : 1.0, - child: AnimatedScale( - duration: inactiveIconAppearDuration, - curve: Curves.easeOutCubic, - scale: - (i == selectedIndex) ? 0.95 : 1.0, - child: SvgPicture.asset( - visibleActions[i].image, - width: iconWidth, - height: iconHeight, - colorFilter: ColorFilter.mode( - inactiveColor, - BlendMode.srcIn, - ), + scale: (i == selectedIndex) ? 0.95 : 1.0, + child: SvgPicture.asset( + visibleActions[i].image, + width: iconWidth, + height: iconHeight, + colorFilter: ColorFilter.mode( + inactiveColor, + BlendMode.srcIn, ), ), ), ), ), - ], - ), - ) - ], + ), + ), + ], + ), )), ), ), @@ -294,60 +262,46 @@ class AnimatedPill extends StatelessWidget { @override Widget build(BuildContext context) { return AnimatedPositioned( - duration: pillMoveDuration, - curve: Curves.easeOutCubic, - left: left, - top: 12, - bottom: 12, - child: TweenAnimationBuilder( - tween: Tween( - begin: estimateWidthForAction, - end: estimateWidthForAction, - ), - duration: pillResizeDuration, + duration: pillMoveDuration, curve: Curves.easeOutCubic, - builder: (context, width, child) { - return AnimatedContainer( - duration: pillResizeDuration, - curve: Curves.easeOutCubic, - width: width + 4, - decoration: BoxDecoration( - color: pillColor, - borderRadius: BorderRadius.circular(pillBorderRadius), - ), - clipBehavior: Clip.hardEdge, - alignment: Alignment.center, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 2), - child: FittedBox( - fit: BoxFit.scaleDown, - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SvgPicture.asset( - currentAction.image, - width: pillIconWidth, - height: pillIconHeight, - colorFilter: ColorFilter.mode( - contentColor, - BlendMode.srcIn, - ), - ), - SizedBox(width: pillIconSpacing), - Text( - currentAction.name(context), - style: pillTextStyle.copyWith(color: contentColor), - overflow: TextOverflow.fade, - softWrap: false, - ), - ], + left: left, + top: 12, + bottom: 12, + child: AnimatedContainer( + duration: pillResizeDuration, + curve: Curves.easeOutCubic, + width: estimateWidthForAction, + decoration: BoxDecoration( + color: pillColor, + borderRadius: BorderRadius.circular(pillBorderRadius), + ), + clipBehavior: Clip.hardEdge, + alignment: Alignment.center, + child: FittedBox( + fit: BoxFit.scaleDown, + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset( + currentAction.image, + width: pillIconWidth, + height: pillIconHeight, + colorFilter: ColorFilter.mode( + contentColor, + BlendMode.srcIn, + ), ), - ), + SizedBox(width: pillIconSpacing), + Text( + currentAction.name(context), + style: pillTextStyle.copyWith(color: contentColor), + overflow: TextOverflow.fade, + softWrap: false, + ), + ], ), - ); - }, - ), - ); + ), + )); } } diff --git a/lib/typography.dart b/lib/typography.dart index 816f116b41..c08a98e168 100644 --- a/lib/typography.dart +++ b/lib/typography.dart @@ -1,6 +1,8 @@ +import 'package:cake_wallet/utils/feature_flag.dart'; import 'package:flutter/material.dart'; const latoFont = "Lato"; +const wixFont = "Wix Madefor Text"; TextStyle textXxSmall({Color? color}) => _cakeRegular(10, color); @@ -54,7 +56,7 @@ TextStyle _textStyle({ Color? color, }) => TextStyle( - fontFamily: latoFont, + fontFamily: FeatureFlag.hasNewUi ? wixFont : latoFont, fontSize: size, fontWeight: fontWeight, color: color ?? Colors.white, diff --git a/lib/utils/feature_flag.dart b/lib/utils/feature_flag.dart index 661595a414..4591aeffdf 100644 --- a/lib/utils/feature_flag.dart +++ b/lib/utils/feature_flag.dart @@ -10,7 +10,9 @@ class FeatureFlag { static const bool isBackgroundSyncEnabled = true; static bool get isInAppTorEnabled => CakeTor.instance is! CakeTorDisabled; static const int verificationWordsCount = kDebugMode ? 0 : 2; - static const bool hasDevOptions = bool.fromEnvironment('hasDevOptions', defaultValue: kDebugMode); + static const bool hasDevOptions = + bool.fromEnvironment('hasDevOptions', defaultValue: kDebugMode); static const bool hasBitcoinViewOnly = true; static const bool customBackgroundEnabled = false; + static const bool hasNewUi = true; } diff --git a/lib/view_model/exchange/exchange_trade_view_model.dart b/lib/view_model/exchange/exchange_trade_view_model.dart index a2cf0d738e..40f0fe0057 100644 --- a/lib/view_model/exchange/exchange_trade_view_model.dart +++ b/lib/view_model/exchange/exchange_trade_view_model.dart @@ -18,7 +18,6 @@ import 'package:cake_wallet/exchange/provider/trocador_exchange_provider.dart'; import 'package:cake_wallet/exchange/provider/xoswap_exchange_provider.dart'; import 'package:cake_wallet/exchange/trade.dart'; import 'package:cake_wallet/generated/i18n.dart'; -import 'package:cake_wallet/arbitrum/arbitrum.dart'; import 'package:cake_wallet/reactions/wallet_connect.dart'; import 'package:cake_wallet/src/screens/exchange_trade/exchange_trade_item.dart'; import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart'; @@ -422,16 +421,6 @@ abstract class ExchangeTradeViewModelBase with Store { case WalletType.ethereum: return _createERC681URI(fromCurrency, inputAddress, amount); // TODO: Expand ERC681URI support to Polygon(modify decoding flow for QRs, pay anything, and deep link handling) - case WalletType.polygon: - return PolygonURI(amount: amount, address: inputAddress); - case WalletType.base: - return BaseURI(amount: amount, address: inputAddress); - case WalletType.arbitrum: - return ArbitrumURI(amount: amount, address: inputAddress); - case WalletType.solana: - return SolanaURI(amount: amount, address: inputAddress); - case WalletType.tron: - return TronURI(amount: amount, address: inputAddress); case WalletType.monero: return MoneroURI(address: inputAddress, amount: amount); case WalletType.wownero: diff --git a/lib/view_model/send/send_view_model.dart b/lib/view_model/send/send_view_model.dart index 217d7cf45d..aa7fe20fc5 100644 --- a/lib/view_model/send/send_view_model.dart +++ b/lib/view_model/send/send_view_model.dart @@ -100,8 +100,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor this.transactionDescriptionBox, this.hardwareWalletViewModel, this.unspentCoinsListViewModel, - this.feesViewModel, - this.walletInfoSource, { + this.feesViewModel, { this.coinTypeToSpendFrom = UnspentCoinType.nonMweb, }) : state = InitialExecutionState(), currencies = appStore.wallet!.balance.keys.toList(), @@ -873,7 +872,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor WalletType.banano, WalletType.solana, WalletType.tron, - WalletType.arbitrium + WalletType.arbitrum ].contains(wallet.type)) { throw Exception('Priority is null for wallet type: ${wallet.type}'); } @@ -1053,7 +1052,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor WalletType.polygon, WalletType.base, WalletType.haven, - WalletType.arbitrium + WalletType.arbitrum ].contains(walletType)) { if (errorMessage.contains('gas required exceeds allowance')) { return S.current.gas_exceeds_allowance; From c5399afa8f3240556f30e97a94c192a10f73d80d Mon Sep 17 00:00:00 2001 From: Robert Malikowski Date: Sun, 16 Nov 2025 11:50:31 +0100 Subject: [PATCH 022/105] fix import --- lib/src/screens/send/send_page.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/src/screens/send/send_page.dart b/lib/src/screens/send/send_page.dart index cd3e695aa3..d6547b3cfe 100644 --- a/lib/src/screens/send/send_page.dart +++ b/lib/src/screens/send/send_page.dart @@ -21,6 +21,7 @@ import 'package:cake_wallet/src/widgets/bottom_sheet/base_bottom_sheet_widget.da import 'package:cake_wallet/src/widgets/bottom_sheet/confirm_sending_bottom_sheet_widget.dart'; import 'package:cake_wallet/src/widgets/bottom_sheet/info_bottom_sheet_widget.dart'; import 'package:cake_wallet/src/widgets/keyboard_done_button.dart'; +import 'package:cake_wallet/src/widgets/picker.dart'; import 'package:cake_wallet/src/widgets/primary_button.dart'; import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart'; import 'package:cake_wallet/src/widgets/simple_checkbox.dart'; From c92afe6eb05481d16a94108242ab30d32eca1f71 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Wed, 29 Oct 2025 08:47:21 +0100 Subject: [PATCH 023/105] feat: add Lightning Network support for Bitcoin wallets --- .../lib/bitcoin_receive_page_option.dart | 7 + cw_bitcoin/lib/bitcoin_wallet.dart | 98 ++++++++------ cw_bitcoin/lib/bitcoin_wallet_addresses.dart | 1 + cw_bitcoin/lib/electrum_wallet_addresses.dart | 30 ++++- .../lib/lightning/lightning_addres_type.dart | 22 ++++ .../lib/lightning/lightning_wallet.dart | 124 ++++++++++++++++++ .../pending_lightning_transaction.dart | 44 +++++++ cw_bitcoin/pubspec.lock | 9 ++ cw_bitcoin/pubspec.yaml | 3 + .../dashboard/balance_view_model.dart | 56 ++++---- 10 files changed, 324 insertions(+), 70 deletions(-) create mode 100644 cw_bitcoin/lib/lightning/lightning_addres_type.dart create mode 100644 cw_bitcoin/lib/lightning/lightning_wallet.dart create mode 100644 cw_bitcoin/lib/lightning/pending_lightning_transaction.dart diff --git a/cw_bitcoin/lib/bitcoin_receive_page_option.dart b/cw_bitcoin/lib/bitcoin_receive_page_option.dart index 8491ae8e3f..5e07ac63b8 100644 --- a/cw_bitcoin/lib/bitcoin_receive_page_option.dart +++ b/cw_bitcoin/lib/bitcoin_receive_page_option.dart @@ -1,4 +1,5 @@ import 'package:bitcoin_base/bitcoin_base.dart'; +import 'package:cw_bitcoin/lightning/lightning_addres_type.dart'; import 'package:cw_core/receive_page_option.dart'; class BitcoinReceivePageOption implements ReceivePageOption { @@ -10,6 +11,7 @@ class BitcoinReceivePageOption implements ReceivePageOption { static const mweb = BitcoinReceivePageOption._('MWEB'); static const silent_payments = BitcoinReceivePageOption._('Silent Payments'); + static const lightning = BitcoinReceivePageOption._('Lightning'); const BitcoinReceivePageOption._(this.value); @@ -20,6 +22,7 @@ class BitcoinReceivePageOption implements ReceivePageOption { } static const all = [ + BitcoinReceivePageOption.lightning, BitcoinReceivePageOption.silent_payments, BitcoinReceivePageOption.p2wpkh, BitcoinReceivePageOption.p2tr, @@ -55,6 +58,8 @@ class BitcoinReceivePageOption implements ReceivePageOption { return P2shAddressType.p2wpkhInP2sh; case BitcoinReceivePageOption.silent_payments: return SilentPaymentsAddresType.p2sp; + case BitcoinReceivePageOption.lightning: + return LightningAddressType.p2l; case BitcoinReceivePageOption.mweb: return SegwitAddresType.mweb; case BitcoinReceivePageOption.p2wpkh: @@ -77,6 +82,8 @@ class BitcoinReceivePageOption implements ReceivePageOption { return BitcoinReceivePageOption.p2sh; case SilentPaymentsAddresType.p2sp: return BitcoinReceivePageOption.silent_payments; + case LightningAddressType.p2l: + return BitcoinReceivePageOption.lightning; case SegwitAddresType.p2wpkh: default: return BitcoinReceivePageOption.p2wpkh; diff --git a/cw_bitcoin/lib/bitcoin_wallet.dart b/cw_bitcoin/lib/bitcoin_wallet.dart index 0a2b54913a..6b3cc56f64 100644 --- a/cw_bitcoin/lib/bitcoin_wallet.dart +++ b/cw_bitcoin/lib/bitcoin_wallet.dart @@ -13,6 +13,7 @@ import 'package:cw_bitcoin/electrum_derivations.dart'; import 'package:cw_bitcoin/electrum_wallet.dart'; import 'package:cw_bitcoin/electrum_wallet_snapshot.dart'; import 'package:cw_bitcoin/hardware/bitcoin_hardware_wallet_service.dart'; +import 'package:cw_bitcoin/lightning/lightning_wallet.dart'; import 'package:cw_bitcoin/payjoin/manager.dart'; import 'package:cw_bitcoin/payjoin/storage.dart'; import 'package:cw_bitcoin/pending_bitcoin_transaction.dart'; @@ -23,6 +24,7 @@ import 'package:cw_bitcoin/psbt/v0_finalizer.dart'; import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/encryption_file_utils.dart'; import 'package:cw_core/output_info.dart'; +import 'package:cw_core/parse_fixed.dart'; import 'package:cw_core/payjoin_session.dart'; import 'package:cw_core/pending_transaction.dart'; import 'package:cw_core/unspent_coins_info.dart'; @@ -31,9 +33,7 @@ import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_keys_file.dart'; import 'package:flutter/foundation.dart'; import 'package:hive/hive.dart'; -import 'package:ledger_bitcoin/ledger_bitcoin.dart'; import 'package:ledger_bitcoin/psbt.dart'; -import 'package:ledger_flutter_plus/ledger_flutter_plus.dart'; import 'package:mobx/mobx.dart'; import 'package:ur/cbor_lite.dart'; import 'package:ur/ur.dart'; @@ -92,24 +92,38 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { // String sideDerivationPath = derivationPath.substring(0, derivationPath.length - 1) + "1"; // final hd = bitcoin.HDWallet.fromSeed(seedBytes, network: networkType); + if (mnemonic != null) { + lightningWallet = LightningWallet( + mnemonic: mnemonic, + apiKey: + "MIIBdzCCASmgAwIBAgIHPpJHKP1qXzAFBgMrZXAwEDEOMAwGA1UEAxMFQnJlZXowHhcNMjUxMDIzMTQwNDQ4WhcNMzUxMDIxMTQwNDQ4WjAxMRQwEgYDVQQKEwtDYWtlIFdhbGxldDEZMBcGA1UEAxMQU2V0aCBGb3IgUHJpdmFjeTAqMAUGAytlcAMhANCD9cvfIDwcoiDKKYdT9BunHLS2/OuKzV8NS0SzqV13o4GAMH4wDgYDVR0PAQH/BAQDAgWgMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFNo5o+5ea0sNMlW/75VgGJCv2AcJMB8GA1UdIwQYMBaAFN6q1pJW843ndJIW/Ey2ILJrKJhrMB4GA1UdEQQXMBWBE3NldGhAY2FrZXdhbGxldC5jb20wBQYDK2VwA0EAl+naPfCBseV7eS4SoP0q0kvo2GHCywXoIbnlBa0y+/wlfu+oILtsGv3jGQ2egCnpgHe87yzR0ygclzz8r/jdAQ==", + lnurlDomain: "breez.tips", + ); + } + payjoinManager = PayjoinManager(PayjoinStorage(payjoinBox), this); - walletAddresses = BitcoinWalletAddresses(walletInfo, - initialAddresses: initialAddresses, - initialRegularAddressIndex: initialRegularAddressIndex, - initialChangeAddressIndex: initialChangeAddressIndex, - initialSilentAddresses: initialSilentAddresses, - initialSilentAddressIndex: initialSilentAddressIndex, - mainHd: hd, - sideHd: accountHD.childKey(Bip32KeyIndex(1)), - network: networkParam ?? network, - masterHd: - seedBytes != null ? Bip32Slip10Secp256k1.fromSeed(seedBytes) : null, - isHardwareWallet: walletInfo.isHardwareWallet, - payjoinManager: payjoinManager); + walletAddresses = BitcoinWalletAddresses( + walletInfo, + initialAddresses: initialAddresses, + initialRegularAddressIndex: initialRegularAddressIndex, + initialChangeAddressIndex: initialChangeAddressIndex, + initialSilentAddresses: initialSilentAddresses, + initialSilentAddressIndex: initialSilentAddressIndex, + mainHd: hd, + sideHd: accountHD.childKey(Bip32KeyIndex(1)), + network: networkParam ?? network, + masterHd: seedBytes != null ? Bip32Slip10Secp256k1.fromSeed(seedBytes) : null, + isHardwareWallet: walletInfo.isHardwareWallet, + payjoinManager: payjoinManager, + lightningWallet: lightningWallet, + ); + + if (lightningWallet != null) { + walletAddresses.setLightningAddress(walletInfo.name); + } autorun((_) { - this.walletAddresses.isEnabledAutoGenerateSubaddress = - this.isEnabledAutoGenerateSubaddress; + this.walletAddresses.isEnabledAutoGenerateSubaddress = this.isEnabledAutoGenerateSubaddress; }); } @@ -146,8 +160,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { break; case DerivationType.electrum: default: - seedBytes = - await mnemonicToSeedBytes(mnemonic, passphrase: passphrase ?? ""); + seedBytes = await mnemonicToSeedBytes(mnemonic, passphrase: passphrase ?? ""); break; } @@ -233,8 +246,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { if (mnemonic != null) { switch (derivationInfo.derivationType) { case DerivationType.electrum: - seedBytes = - await mnemonicToSeedBytes(mnemonic, passphrase: passphrase ?? ""); + seedBytes = await mnemonicToSeedBytes(mnemonic, passphrase: passphrase ?? ""); break; case DerivationType.bip39: default: @@ -274,11 +286,24 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { super.close(shouldCleanup: shouldCleanup); } + @override + Future fetchBalances() async { + final balance = await super.fetchBalances(); + if (lightningWallet == null) { + return balance; + } + + final lBalance = await lightningWallet!.getBalance(); + + return ElectrumBalance(confirmed: balance.confirmed, unconfirmed: balance.unconfirmed, frozen: balance.frozen, secondConfirmed: lBalance.toInt()); + } + + late final LightningWallet? lightningWallet; + late final PayjoinManager payjoinManager; bool get isPayjoinAvailable => unspentCoinsInfo.values - .where((element) => - element.walletId == id && element.isSending && !element.isFrozen) + .where((element) => element.walletId == id && element.isSending && !element.isFrozen) .isNotEmpty; Future buildPsbt({ @@ -296,10 +321,8 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { }) async { final psbtReadyInputs = []; for (final utxo in utxos) { - final rawTx = - await electrumClient.getTransactionHex(hash: utxo.utxo.txHash); - final publicKeyAndDerivationPath = - publicKeys[utxo.ownerDetails.address.pubKeyHash()]!; + final rawTx = await electrumClient.getTransactionHex(hash: utxo.utxo.txHash); + final publicKeyAndDerivationPath = publicKeys[utxo.ownerDetails.address.pubKeyHash()]!; psbtReadyInputs.add(PSBTReadyUtxoWithAddress( utxo: utxo.utxo, @@ -355,8 +378,12 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { Future createTransaction(Object credentials) async { credentials = credentials as BitcoinTransactionCredentials; - final tx = (await super.createTransaction(credentials)) - as PendingBitcoinTransaction; + if (lightningWallet?.isCompatible(credentials.outputs.first.address) == true) { + return lightningWallet!.createTransaction(credentials.outputs.first.address, + parseFixed(credentials.outputs.first.cryptoAmount ?? "0", 9)); + } + + final tx = (await super.createTransaction(credentials)) as PendingBitcoinTransaction; final payjoinUri = credentials.payjoinUri; if (payjoinUri == null && !tx.shouldCommitUR()) return tx; @@ -381,8 +408,8 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { masterFingerprint: Uint8List.fromList([0, 0, 0, 0])); if (tx.shouldCommitUR()) { - tx.unsignedPsbt = transaction.asPsbtV0(); - return tx; + tx.unsignedPsbt = transaction.asPsbtV0(); + return tx; } final originalPsbt = @@ -406,8 +433,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { Future commitPsbt(String finalizedPsbt) { final psbt = PsbtV2()..deserializeV0(base64.decode(finalizedPsbt)); - final btcTx = - BtcTransaction.fromRaw(BytesUtils.toHexString(psbt.extract())); + final btcTx = BtcTransaction.fromRaw(BytesUtils.toHexString(psbt.extract())); return PendingBitcoinTransaction( btcTx, @@ -422,8 +448,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { ).commit(); } - Future signPsbt( - String preProcessedPsbt, List utxos) async { + Future signPsbt(String preProcessedPsbt, List utxos) async { final psbt = PsbtV2()..deserializeV0(base64Decode(preProcessedPsbt)); await psbt.signWithUTXO(utxos, (txDigest, utxo, key, sighash) { @@ -486,8 +511,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { Future signMessage(String message, {String? address = null}) async { if (walletInfo.isHardwareWallet) { final addressEntry = address != null - ? walletAddresses.allAddresses - .firstWhere((element) => element.address == address) + ? walletAddresses.allAddresses.firstWhere((element) => element.address == address) : null; final index = addressEntry?.index ?? 0; final isChange = addressEntry?.isHidden == true ? 1 : 0; diff --git a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart index fcd0b7d8cc..8e36ffebf8 100644 --- a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart +++ b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart @@ -27,6 +27,7 @@ abstract class BitcoinWalletAddressesBase extends ElectrumWalletAddresses with S super.initialSilentAddresses, super.initialSilentAddressIndex = 0, super.masterHd, + super.lightningWallet, }) : super(walletInfo); final PayjoinManager payjoinManager; diff --git a/cw_bitcoin/lib/electrum_wallet_addresses.dart b/cw_bitcoin/lib/electrum_wallet_addresses.dart index 18d2898b4d..eddcadb563 100644 --- a/cw_bitcoin/lib/electrum_wallet_addresses.dart +++ b/cw_bitcoin/lib/electrum_wallet_addresses.dart @@ -3,9 +3,12 @@ import 'dart:io' show Platform; import 'package:bitcoin_base/bitcoin_base.dart'; import 'package:blockchain_utils/blockchain_utils.dart'; import 'package:cw_bitcoin/bitcoin_address_record.dart'; +import 'package:cw_bitcoin/bitcoin_unspent.dart'; +import 'package:cw_bitcoin/lightning/lightning_addres_type.dart'; +import 'package:cw_bitcoin/lightning/lightning_wallet.dart'; +import 'package:cw_core/pathForWallet.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/utils/print_verbose.dart'; -import 'package:cw_bitcoin/bitcoin_unspent.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_type.dart'; @@ -51,6 +54,7 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { List? initialMwebAddresses, Bip32Slip10Secp256k1? masterHd, BitcoinAddressType? initialAddressPageType, + this.lightningWallet, }) : _addresses = ObservableList.of((initialAddresses ?? []).toSet()), addressesByReceiveType = ObservableList.of(([]).toSet()), @@ -64,7 +68,9 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { currentChangeAddressIndexByType = initialChangeAddressIndex ?? {}, _addressPageType = initialAddressPageType ?? (walletInfo.addressPageType != null - ? BitcoinAddressType.fromValue(walletInfo.addressPageType!) + ? walletInfo.addressPageType == LightningAddressType.p2l.value + ? LightningAddressType.p2l + : BitcoinAddressType.fromValue(walletInfo.addressPageType!) : SegwitAddresType.p2wpkh), silentAddresses = ObservableList.of( (initialSilentAddresses ?? []).toSet()), @@ -103,7 +109,6 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { )); } } - updateAddressesByMatch(); } @@ -123,6 +128,7 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { final Bip32Slip10Secp256k1 mainHd; final Bip32Slip10Secp256k1 sideHd; final bool isHardwareWallet; + final LightningWallet? lightningWallet; @observable ObservableMap lockedReceiveAddressByType; @@ -139,6 +145,9 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { @observable String? activeSilentAddress; + @observable + String? lightningAddress; + @computed List get allAddresses => _addresses; @@ -153,6 +162,10 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { return silentAddress.toString(); } + if (addressPageType == LightningAddressType.p2l) { + return lightningAddress ?? ":("; + } + final typeMatchingAddresses = _addresses.where((addr) => !addr.isHidden && _isAddressPageTypeMatch(addr)).toList(); final typeMatchingReceiveAddresses = @@ -220,7 +233,6 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { addressRecord.type == addressPageType) { lockedReceiveAddressByType[addressPageType] = addr; } - } catch (e) { printV("ElectrumWalletAddressBase: set address ($addr): $e"); } @@ -736,4 +748,14 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { silentAddresses.remove(addressRecord); updateAddressesByMatch(); } + + @action + Future setLightningAddress(String walletName) async { + if (lightningWallet == null) return; + + final path = await pathForWalletDir(name: walletName, type: WalletType.bitcoin); + await lightningWallet!.init(path); + lightningAddress = await lightningWallet!.registerAddress(walletName.replaceAll(" ", "")); + + } } diff --git a/cw_bitcoin/lib/lightning/lightning_addres_type.dart b/cw_bitcoin/lib/lightning/lightning_addres_type.dart new file mode 100644 index 0000000000..275867b34f --- /dev/null +++ b/cw_bitcoin/lib/lightning/lightning_addres_type.dart @@ -0,0 +1,22 @@ +import 'package:bitcoin_base/src/bitcoin/address/address.dart'; + +class LightningAddressType implements BitcoinAddressType { + const LightningAddressType._(this.value); + static const LightningAddressType p2l = LightningAddressType._("Lightning"); + + @override + bool get isP2sh => false; + @override + bool get isSegwit => false; + + @override + final String value; + + @override + int get hashLength { + return 32; + } + + @override + String toString() => value; +} diff --git a/cw_bitcoin/lib/lightning/lightning_wallet.dart b/cw_bitcoin/lib/lightning/lightning_wallet.dart new file mode 100644 index 0000000000..cf2520c16a --- /dev/null +++ b/cw_bitcoin/lib/lightning/lightning_wallet.dart @@ -0,0 +1,124 @@ +import 'package:breez_sdk_spark_flutter/breez_sdk_spark.dart'; +import 'package:cw_bitcoin/lightning/pending_lightning_transaction.dart'; +import 'package:cw_core/pending_transaction.dart'; + +class LightningWallet { + final String mnemonic; + final String apiKey; + final String lnurlDomain; + final Network network; + late BreezSdk sdk; + + LightningWallet({ + required this.mnemonic, + required this.apiKey, + required this.lnurlDomain, + this.network = Network.mainnet, + }); + + Future init(String appPath) async { + await BreezSdkSparkLib.init(); + + final seed = Seed.mnemonic(mnemonic: mnemonic, passphrase: null); + final config = defaultConfig(network: Network.mainnet).copyWith( + lnurlDomain: lnurlDomain, + apiKey: apiKey, + ); + + final connectRequest = ConnectRequest( + config: config, + seed: seed, + storageDir: "$appPath/", + ); + + sdk = await connect(request: connectRequest); + } + + Future getAddress() async => (await sdk.getLightningAddress())?.lightningAddress; + + Future getBalance() async => + (await sdk.getInfo(request: GetInfoRequest(ensureSynced: true))).balanceSats; + + Future registerAddress(String username) async => (await sdk.registerLightningAddress( + request: RegisterLightningAddressRequest(username: username))) + .lightningAddress; + + Future isCompatible(String input) async { + try { + final inputType = await sdk.parse(input: input); + return (inputType is InputType_Bolt11Invoice) || (inputType is InputType_LightningAddress); + } catch (_) { + return false; + } + } + + Future createTransaction(String address, BigInt? amountSats) async { + final inputType = await sdk.parse(input: address); + + if (inputType is InputType_Bolt11Invoice) { + final request = PrepareSendPaymentRequest( + paymentRequest: inputType.field0.invoice.bolt11, amount: amountSats); + final prepareResponse = await sdk.prepareSendPayment(request: request); + + final paymentMethod = prepareResponse.paymentMethod; + if (paymentMethod is SendPaymentMethod_Bolt11Invoice) { + // Fees to pay via Lightning + final lightningFeeSats = paymentMethod.lightningFeeSats; + // Or fees to pay (if available) via a Spark transfer + final sparkTransferFeeSats = paymentMethod.sparkTransferFeeSats; + + return PendingLightningTransaction( + id: paymentMethod.invoiceDetails.paymentHash, + amount: paymentMethod.invoiceDetails.amountMsat?.toInt() ?? 0, + fee: lightningFeeSats.toInt() + (sparkTransferFeeSats?.toInt() ?? 0), + commitOverride: () => + sdk.sendPayment(request: SendPaymentRequest(prepareResponse: prepareResponse)), + ); + } + } else if (inputType is InputType_LightningAddress) { + final optionalValidateSuccessActionUrl = true; + + final request = PrepareLnurlPayRequest( + amountSats: amountSats!, + payRequest: inputType.field0.payRequest, + validateSuccessActionUrl: optionalValidateSuccessActionUrl, + ); + final prepareResponse = await sdk.prepareLnurlPay(request: request); + + final feeSats = prepareResponse.feeSats; + + return PendingLightningTransaction( + id: prepareResponse.invoiceDetails.paymentHash, + amount: prepareResponse.invoiceDetails.amountMsat?.toInt() ?? 0, + fee: feeSats.toInt(), + commitOverride: () => + sdk.lnurlPay(request: LnurlPayRequest(prepareResponse: prepareResponse)), + ); + } + + // If not returned earlier + throw UnimplementedError(); + } +} + +extension _ConfigCopyWith on Config { + Config copyWith({ + String? apiKey, + String? lnurlDomain, + Network? network, + int? syncIntervalSecs, + Fee? maxDepositClaimFee, + bool? preferSparkOverLightning, + bool? useDefaultExternalInputParsers, + }) => + Config( + lnurlDomain: lnurlDomain ?? this.lnurlDomain, + apiKey: apiKey ?? this.apiKey, + network: network ?? this.network, + syncIntervalSecs: syncIntervalSecs ?? this.syncIntervalSecs, + maxDepositClaimFee: maxDepositClaimFee ?? this.maxDepositClaimFee, + preferSparkOverLightning: preferSparkOverLightning ?? this.preferSparkOverLightning, + useDefaultExternalInputParsers: + useDefaultExternalInputParsers ?? this.useDefaultExternalInputParsers, + ); +} diff --git a/cw_bitcoin/lib/lightning/pending_lightning_transaction.dart b/cw_bitcoin/lib/lightning/pending_lightning_transaction.dart new file mode 100644 index 0000000000..72b4423783 --- /dev/null +++ b/cw_bitcoin/lib/lightning/pending_lightning_transaction.dart @@ -0,0 +1,44 @@ +import 'package:cw_bitcoin/bitcoin_amount_format.dart'; +import 'package:cw_core/pending_transaction.dart'; + +class PendingLightningTransaction with PendingTransaction { + PendingLightningTransaction({ + required this.id, + required this.amount, + required this.fee, + this.isSendAll = false, + required this.commitOverride, + }); + + final int amount; + final int fee; + final bool isSendAll; + Future Function() commitOverride; + + @override + final String id; + + @override + String get hex => ""; + + @override + String get amountFormatted => bitcoinAmountToString(amount: amount); + + @override + String get feeFormatted => "$feeFormattedValue BTC"; + + @override + String get feeFormattedValue => bitcoinAmountToString(amount: fee); + + @override + int? get outputCount => 1; + + @override + Future commit() => commitOverride.call(); + + @override + bool shouldCommitUR() => false; + + @override + Future> commitUR() => throw UnimplementedError(); +} diff --git a/cw_bitcoin/pubspec.lock b/cw_bitcoin/pubspec.lock index 681e68d478..38aea938ca 100644 --- a/cw_bitcoin/pubspec.lock +++ b/cw_bitcoin/pubspec.lock @@ -130,6 +130,15 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.2" + breez_sdk_spark_flutter: + dependency: "direct main" + description: + path: "." + ref: HEAD + resolved-ref: "5bc8fb5f3a5c84e2e3dd55f5d48b01152f425765" + url: "https://github.com/breez/breez-sdk-spark-flutter" + source: git + version: "0.3.2" bs58check: dependency: transitive description: diff --git a/cw_bitcoin/pubspec.yaml b/cw_bitcoin/pubspec.yaml index 942a5069a2..940ce80b6a 100644 --- a/cw_bitcoin/pubspec.yaml +++ b/cw_bitcoin/pubspec.yaml @@ -72,6 +72,9 @@ dependencies: git: url: https://github.com/mrcyjanek/bbqrdart ref: e867e3d0156d0b29858100f30adc2625b9dae586 + breez_sdk_spark_flutter: + git: + url: https://github.com/breez/breez-sdk-spark-flutter dev_dependencies: flutter_test: diff --git a/lib/view_model/dashboard/balance_view_model.dart b/lib/view_model/dashboard/balance_view_model.dart index 552d318e4a..8d57356f37 100644 --- a/lib/view_model/dashboard/balance_view_model.dart +++ b/lib/view_model/dashboard/balance_view_model.dart @@ -1,27 +1,26 @@ import 'package:cake_wallet/bitcoin/bitcoin.dart'; +import 'package:cake_wallet/entities/balance_display_mode.dart'; +import 'package:cake_wallet/entities/calculate_fiat_amount.dart'; import 'package:cake_wallet/entities/fiat_api_mode.dart'; import 'package:cake_wallet/entities/sort_balance_types.dart'; +import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/reactions/wallet_connect.dart'; -import 'package:cw_core/transaction_history.dart'; -import 'package:cw_core/wallet_base.dart'; +import 'package:cake_wallet/store/app_store.dart'; +import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart'; +import 'package:cake_wallet/store/settings_store.dart'; import 'package:cw_core/balance.dart'; import 'package:cw_core/crypto_currency.dart'; +import 'package:cw_core/transaction_history.dart'; import 'package:cw_core/transaction_info.dart'; +import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_type.dart'; -import 'package:cake_wallet/generated/i18n.dart'; -import 'package:cake_wallet/entities/balance_display_mode.dart'; -import 'package:cake_wallet/entities/calculate_fiat_amount.dart'; -import 'package:cake_wallet/store/app_store.dart'; -import 'package:cake_wallet/store/settings_store.dart'; -import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart'; import 'package:mobx/mobx.dart'; part 'balance_view_model.g.dart'; class BalanceRecord { const BalanceRecord( - { - required this.availableBalance, + {required this.availableBalance, required this.additionalBalance, required this.secondAvailableBalance, required this.secondAdditionalBalance, @@ -150,18 +149,15 @@ abstract class BalanceViewModelBase with Store { @computed String get availableBalanceLabel { - if (displayMode == BalanceDisplayMode.hiddenBalance) { return S.current.show_balance; - } - else { + } else { return S.current.xmr_available_balance; } } @computed String get additionalBalanceLabel { - switch (wallet.type) { case WalletType.haven: case WalletType.ethereum: @@ -225,8 +221,10 @@ abstract class BalanceViewModelBase with Store { fiatAdditionalBalance: isFiatDisabled ? '' : '${fiatCurrency.toString()} ●●●●●', fiatAvailableBalance: isFiatDisabled ? '' : '${fiatCurrency.toString()} ●●●●●', fiatFrozenBalance: isFiatDisabled ? '' : '', - fiatSecondAvailableBalance: isFiatDisabled ? '' : '${fiatCurrency.toString()} ●●●●●', - fiatSecondAdditionalBalance: isFiatDisabled ? '' : '${fiatCurrency.toString()} ●●●●●', + fiatSecondAvailableBalance: + isFiatDisabled ? '' : '${fiatCurrency.toString()} ●●●●●', + fiatSecondAdditionalBalance: + isFiatDisabled ? '' : '${fiatCurrency.toString()} ●●●●●', asset: key, formattedAssetTitle: _formatterAsset(key))); } @@ -300,8 +298,16 @@ abstract class BalanceViewModelBase with Store { mwebEnabled && _hasSecondAdditionalBalanceForWalletType(wallet.type); @computed - bool get hasSecondAvailableBalance => - mwebEnabled && _hasSecondAvailableBalanceForWalletType(wallet.type); + bool get hasSecondAvailableBalance { + switch (wallet.type) { + case WalletType.bitcoin: + return true; + case WalletType.litecoin: + return mwebEnabled; + default: + return false; + } + } bool _hasAdditionalBalanceForWalletType(WalletType type) { switch (type) { @@ -317,16 +323,9 @@ abstract class BalanceViewModelBase with Store { bool _hasSecondAdditionalBalanceForWalletType(WalletType type) { if (wallet.type == WalletType.litecoin) { - if ((wallet.balance[CryptoCurrency.ltc]?.secondAdditional ?? 0) != 0) { - return true; - } - } - return false; - } - - bool _hasSecondAvailableBalanceForWalletType(WalletType type) { - if (wallet.type == WalletType.litecoin) { - return true; + return (wallet.balance[CryptoCurrency.ltc]?.secondAdditional ?? 0) != 0; + } else if (wallet.type == WalletType.bitcoin) { + return (wallet.balance[CryptoCurrency.btc]?.secondAdditional ?? 0) != 0; } return false; } @@ -395,7 +394,6 @@ abstract class BalanceViewModelBase with Store { return balance; } - @observable bool isShowCard; From c03783e9314c3ac081f81682e7662fff3e814cae Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Wed, 29 Oct 2025 12:32:44 +0100 Subject: [PATCH 024/105] refactor: rename `fiatConvertationStore` to `fiatConversionStore` for consistency and update related occurrences across codebase --- lib/di.dart | 2 +- .../dashboard/balance_view_model.dart | 143 ++++++------------ .../dashboard/home_settings_view_model.dart | 2 +- .../dashboard/transaction_list_item.dart | 12 +- 4 files changed, 58 insertions(+), 101 deletions(-) diff --git a/lib/di.dart b/lib/di.dart index fde64bd72d..4138842595 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -543,7 +543,7 @@ Future setup({ getIt.registerFactory(() => BalanceViewModel( appStore: getIt.get(), settingsStore: getIt.get(), - fiatConvertationStore: getIt.get())); + fiatConversionStore: getIt.get())); getIt.registerFactory( () => ExchangeViewModel( diff --git a/lib/view_model/dashboard/balance_view_model.dart b/lib/view_model/dashboard/balance_view_model.dart index 8d57356f37..ef203ceae6 100644 --- a/lib/view_model/dashboard/balance_view_model.dart +++ b/lib/view_model/dashboard/balance_view_model.dart @@ -19,19 +19,20 @@ import 'package:mobx/mobx.dart'; part 'balance_view_model.g.dart'; class BalanceRecord { - const BalanceRecord( - {required this.availableBalance, - required this.additionalBalance, - required this.secondAvailableBalance, - required this.secondAdditionalBalance, - required this.frozenBalance, - required this.fiatAvailableBalance, - required this.fiatAdditionalBalance, - required this.fiatFrozenBalance, - required this.fiatSecondAvailableBalance, - required this.fiatSecondAdditionalBalance, - required this.asset, - required this.formattedAssetTitle}); + const BalanceRecord({ + required this.availableBalance, + required this.additionalBalance, + required this.secondAvailableBalance, + required this.secondAdditionalBalance, + required this.frozenBalance, + required this.fiatAvailableBalance, + required this.fiatAdditionalBalance, + required this.fiatFrozenBalance, + required this.fiatSecondAvailableBalance, + required this.fiatSecondAdditionalBalance, + required this.asset, + required this.formattedAssetTitle, + }); final String fiatAdditionalBalance; final String fiatAvailableBalance; @@ -51,7 +52,7 @@ class BalanceViewModel = BalanceViewModelBase with _$BalanceViewModel; abstract class BalanceViewModelBase with Store { BalanceViewModelBase( - {required this.appStore, required this.settingsStore, required this.fiatConvertationStore}) + {required this.appStore, required this.settingsStore, required this.fiatConversionStore}) : isReversing = false, isShowCard = appStore.wallet?.walletInfo.isShowIntroCakePayCard ?? false, wallet = appStore.wallet! { @@ -62,9 +63,7 @@ abstract class BalanceViewModelBase with Store { _checkMweb(); - reaction((_) => settingsStore.mwebAlwaysScan, (bool value) { - _checkMweb(); - }); + reaction((_) => settingsStore.mwebAlwaysScan, (_) => _checkMweb()); } void _checkMweb() { @@ -75,9 +74,7 @@ abstract class BalanceViewModelBase with Store { final AppStore appStore; final SettingsStore settingsStore; - final FiatConversionStore fiatConvertationStore; - - bool get canReverse => false; + final FiatConversionStore fiatConversionStore; @observable bool isReversing; @@ -85,17 +82,12 @@ abstract class BalanceViewModelBase with Store { @observable WalletBase, TransactionInfo> wallet; - @computed - bool get hasSilentPayments => wallet.type == WalletType.bitcoin && !wallet.isHardwareWallet; - @computed double get price { - final price = fiatConvertationStore.prices[appStore.wallet!.currency]; + final price = fiatConversionStore.prices[appStore.wallet!.currency]; - if (price == null) { - // price should update on next fetch: - return 0; - } + // price should update on next fetch: + if (price == null) return 0; return price; } @@ -109,12 +101,10 @@ abstract class BalanceViewModelBase with Store { @computed bool get isHomeScreenSettingsEnabled => isEVMCompatibleChain(wallet.type) || - wallet.type == WalletType.solana || - wallet.type == WalletType.tron || - wallet.type == WalletType.zano; + [WalletType.solana, WalletType.tron, WalletType.zano].contains(wallet.type); @computed - bool get hasAccounts => wallet.type == WalletType.monero || wallet.type == WalletType.wownero; + bool get hasAccounts => [WalletType.monero, WalletType.wownero].contains(wallet.type); @computed SortBalanceBy get sortBalanceBy => settingsStore.sortBalanceBy; @@ -198,9 +188,7 @@ abstract class BalanceViewModelBase with Store { String additionalBalance(CryptoCurrency cryptoCurrency) { final balance = _currencyBalance(cryptoCurrency); - if (displayMode == BalanceDisplayMode.hiddenBalance) { - return '0.0'; - } + if (displayMode == BalanceDisplayMode.hiddenBalance) return '0.0'; return balance.formattedAdditionalBalance; } @@ -229,7 +217,7 @@ abstract class BalanceViewModelBase with Store { formattedAssetTitle: _formatterAsset(key))); } final fiatCurrency = settingsStore.fiatCurrency; - final price = key.isPotentialScam ? 0.0 : fiatConvertationStore.prices[key] ?? 0; + final price = key.isPotentialScam ? 0.0 : fiatConversionStore.prices[key] ?? 0; // if (price == null) { // throw Exception('Price is null for: $key'); @@ -287,15 +275,21 @@ abstract class BalanceViewModelBase with Store { bool mwebEnabled = false; bool hasAdditionalBalance(CryptoCurrency currency) { - bool isWalletTypeActivated = _hasAdditionalBalanceForWalletType(wallet.type); - bool isNotZeroAmount = additionalBalance(currency) != "0.0"; + final isWalletTypeActivated = _hasAdditionalBalanceForWalletType(wallet.type); + final isNotZeroAmount = additionalBalance(currency) != "0.0"; return isWalletTypeActivated && isNotZeroAmount; } @computed - bool get hasSecondAdditionalBalance => - mwebEnabled && _hasSecondAdditionalBalanceForWalletType(wallet.type); + bool get hasSecondAdditionalBalance { + if (wallet.type == WalletType.litecoin && mwebEnabled) { + return (wallet.balance[CryptoCurrency.ltc]?.secondAdditional ?? 0) != 0; + } else if (wallet.type == WalletType.bitcoin) { + return (wallet.balance[CryptoCurrency.btc]?.secondAdditional ?? 0) != 0; + } + return false; + } @computed bool get hasSecondAvailableBalance { @@ -309,26 +303,8 @@ abstract class BalanceViewModelBase with Store { } } - bool _hasAdditionalBalanceForWalletType(WalletType type) { - switch (type) { - case WalletType.monero: - case WalletType.wownero: - case WalletType.zano: - case WalletType.decred: - return true; - default: - return false; - } - } - - bool _hasSecondAdditionalBalanceForWalletType(WalletType type) { - if (wallet.type == WalletType.litecoin) { - return (wallet.balance[CryptoCurrency.ltc]?.secondAdditional ?? 0) != 0; - } else if (wallet.type == WalletType.bitcoin) { - return (wallet.balance[CryptoCurrency.btc]?.secondAdditional ?? 0) != 0; - } - return false; - } + bool _hasAdditionalBalanceForWalletType(WalletType type) => + [WalletType.monero, WalletType.wownero, WalletType.zano, WalletType.decred].contains(type); @computed List get formattedBalances { @@ -336,25 +312,15 @@ abstract class BalanceViewModelBase with Store { balance.sort((BalanceRecord a, BalanceRecord b) { if (wallet.currency == CryptoCurrency.xhv) { - if (b.asset == CryptoCurrency.xhv) { - return 1; - } + if (b.asset == CryptoCurrency.xhv) return 1; if (b.asset == CryptoCurrency.xusd) { - if (a.asset == CryptoCurrency.xhv) { - return -1; - } - - return 1; - } - - if (b.asset == CryptoCurrency.xbtc) { + if (a.asset == CryptoCurrency.xhv) return -1; return 1; } - if (b.asset == CryptoCurrency.xeur) { - return 1; - } + if (b.asset == CryptoCurrency.xbtc) return 1; + if (b.asset == CryptoCurrency.xeur) return 1; return 0; } @@ -367,9 +333,9 @@ abstract class BalanceViewModelBase with Store { switch (sortBalanceBy) { case SortBalanceBy.FiatBalance: final aFiatBalance = _getFiatBalance( - price: fiatConvertationStore.prices[a.asset] ?? 0, cryptoAmount: a.availableBalance); + price: fiatConversionStore.prices[a.asset] ?? 0, cryptoAmount: a.availableBalance); final bFiatBalance = _getFiatBalance( - price: fiatConvertationStore.prices[b.asset] ?? 0, cryptoAmount: b.availableBalance); + price: fiatConversionStore.prices[b.asset] ?? 0, cryptoAmount: b.availableBalance); return (double.tryParse(bFiatBalance) ?? 0) .compareTo((double.tryParse(aFiatBalance)) ?? 0); @@ -387,9 +353,7 @@ abstract class BalanceViewModelBase with Store { Balance _currencyBalance(CryptoCurrency cryptoCurrency) { final balance = wallet.balance[cryptoCurrency]; - if (balance == null) { - throw Exception('No balance for ${wallet.currency}'); - } + if (balance == null) throw Exception('No balance for ${wallet.currency}'); return balance; } @@ -402,9 +366,7 @@ abstract class BalanceViewModelBase with Store { @action void _onWalletChange( WalletBase, TransactionInfo>? wallet) { - if (wallet == null) { - return; - } + if (wallet == null) return; this.wallet = wallet; _onCurrentWalletChangeReaction?.reaction.dispose(); @@ -437,18 +399,13 @@ abstract class BalanceViewModelBase with Store { } String _formatterAsset(CryptoCurrency asset) { - switch (wallet.type) { - case WalletType.haven: - final assetStringified = asset.toString(); - - if (asset != CryptoCurrency.xhv && assetStringified[0].toUpperCase() == 'X') { - return assetStringified.replaceFirst('X', 'x'); - } - - return asset.toString(); - default: - return asset.toString(); + final assetString = asset.toString(); + if (wallet.type == WalletType.haven && asset != CryptoCurrency.xhv && + assetString[0].toUpperCase() == 'X') { + return assetString.replaceFirst('X', 'x'); } + + return asset.toString(); } String getFormattedFrozenBalance(Balance walletBalance) => diff --git a/lib/view_model/dashboard/home_settings_view_model.dart b/lib/view_model/dashboard/home_settings_view_model.dart index 7ec420de73..ec55b00578 100644 --- a/lib/view_model/dashboard/home_settings_view_model.dart +++ b/lib/view_model/dashboard/home_settings_view_model.dart @@ -427,7 +427,7 @@ abstract class HomeSettingsViewModelBase with Store { void _updateFiatPrices(CryptoCurrency token) async { if (token.isPotentialScam) return; // don't fetch price data for potential scam tokens try { - _balanceViewModel.fiatConvertationStore.prices[token] = + _balanceViewModel.fiatConversionStore.prices[token] = await FiatConversionService.fetchPrice( crypto: token, fiat: _settingsStore.fiatCurrency, diff --git a/lib/view_model/dashboard/transaction_list_item.dart b/lib/view_model/dashboard/transaction_list_item.dart index 33df3ea241..8336a2374c 100644 --- a/lib/view_model/dashboard/transaction_list_item.dart +++ b/lib/view_model/dashboard/transaction_list_item.dart @@ -185,21 +185,21 @@ class TransactionListItem extends ActionListItem with Keyable { break; case WalletType.ethereum: final asset = ethereum!.assetOfTransaction(balanceViewModel.wallet, transaction); - final price = balanceViewModel.fiatConvertationStore.prices[asset]; + final price = balanceViewModel.fiatConversionStore.prices[asset]; amount = calculateFiatAmountRaw( cryptoAmount: ethereum!.formatterEthereumAmountToDouble(transaction: transaction), price: price); break; case WalletType.polygon: final asset = polygon!.assetOfTransaction(balanceViewModel.wallet, transaction); - final price = balanceViewModel.fiatConvertationStore.prices[asset]; + final price = balanceViewModel.fiatConversionStore.prices[asset]; amount = calculateFiatAmountRaw( cryptoAmount: polygon!.formatterPolygonAmountToDouble(transaction: transaction), price: price); break; case WalletType.base: final asset = base!.assetOfTransaction(balanceViewModel.wallet, transaction); - final price = balanceViewModel.fiatConvertationStore.prices[asset]; + final price = balanceViewModel.fiatConversionStore.prices[asset]; amount = calculateFiatAmountRaw( cryptoAmount: base!.formatterBaseAmountToDouble(transaction: transaction), price: price); @@ -219,7 +219,7 @@ class TransactionListItem extends ActionListItem with Keyable { break; case WalletType.solana: final asset = solana!.assetOfTransaction(balanceViewModel.wallet, transaction); - final price = balanceViewModel.fiatConvertationStore.prices[asset]; + final price = balanceViewModel.fiatConversionStore.prices[asset]; amount = calculateFiatAmountRaw( cryptoAmount: solana!.getTransactionAmountRaw(transaction), price: price, @@ -227,7 +227,7 @@ class TransactionListItem extends ActionListItem with Keyable { break; case WalletType.tron: final asset = tron!.assetOfTransaction(balanceViewModel.wallet, transaction); - final price = balanceViewModel.fiatConvertationStore.prices[asset]; + final price = balanceViewModel.fiatConversionStore.prices[asset]; final cryptoAmount = tron!.getTransactionAmountRaw(transaction); amount = calculateFiatAmountRaw( cryptoAmount: cryptoAmount, @@ -240,7 +240,7 @@ class TransactionListItem extends ActionListItem with Keyable { amount = "0.00"; break; } - final price = balanceViewModel.fiatConvertationStore.prices[asset]; + final price = balanceViewModel.fiatConversionStore.prices[asset]; amount = calculateFiatAmountRaw( cryptoAmount: zano!.formatterIntAmountToDouble(amount: transaction.amount, currency: asset, forFee: false), price: price); From 7e26e842f8270f91ce3d8bcb20a87046aab6fa7f Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Thu, 30 Oct 2025 16:26:56 +0100 Subject: [PATCH 025/105] feat: enhance address validation with Lightning Network invoice support for BTC & refactor wallet type/token checks in view model --- cw_bitcoin/lib/bitcoin_wallet.dart | 6 +- cw_bitcoin/lib/electrum_wallet_addresses.dart | 9 +- .../lib/lightning/lightning_addres_type.dart | 2 + .../lib/lightning/lightning_wallet.dart | 15 +- cw_bitcoin/test/cw_bitcoin_test.dart | 25 ++- integration_test/robots/send_page_robot.dart | 4 + lib/bitcoin/cw_bitcoin.dart | 2 + lib/core/address_validator.dart | 39 +++-- lib/src/screens/send/send_page.dart | 156 +++++++++--------- lib/view_model/send/send_view_model.dart | 96 +++++------ tool/configure.dart | 1 + 11 files changed, 197 insertions(+), 158 deletions(-) diff --git a/cw_bitcoin/lib/bitcoin_wallet.dart b/cw_bitcoin/lib/bitcoin_wallet.dart index 6b3cc56f64..997a5dfb89 100644 --- a/cw_bitcoin/lib/bitcoin_wallet.dart +++ b/cw_bitcoin/lib/bitcoin_wallet.dart @@ -378,9 +378,11 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { Future createTransaction(Object credentials) async { credentials = credentials as BitcoinTransactionCredentials; - if (lightningWallet?.isCompatible(credentials.outputs.first.address) == true) { + if ((await lightningWallet?.isCompatible(credentials.outputs.first.address)) == true) { + final amount = parseFixed(credentials.outputs.first.cryptoAmount ?? "0", 9); + return lightningWallet!.createTransaction(credentials.outputs.first.address, - parseFixed(credentials.outputs.first.cryptoAmount ?? "0", 9)); + amount > BigInt.zero ? amount : null); } final tx = (await super.createTransaction(credentials)) as PendingBitcoinTransaction; diff --git a/cw_bitcoin/lib/electrum_wallet_addresses.dart b/cw_bitcoin/lib/electrum_wallet_addresses.dart index eddcadb563..7ef455793f 100644 --- a/cw_bitcoin/lib/electrum_wallet_addresses.dart +++ b/cw_bitcoin/lib/electrum_wallet_addresses.dart @@ -120,8 +120,10 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { final ObservableList addressesByReceiveType; final ObservableList receiveAddresses; final ObservableList changeAddresses; + // TODO: add this variable in `bitcoin_wallet_addresses` and just add a cast in cw_bitcoin to use it final ObservableList silentAddresses; + // TODO: add this variable in `litecoin_wallet_addresses` and just add a cast in cw_bitcoin to use it final ObservableList mwebAddresses; final BasedUtxoNetwork network; @@ -755,7 +757,12 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { final path = await pathForWalletDir(name: walletName, type: WalletType.bitcoin); await lightningWallet!.init(path); - lightningAddress = await lightningWallet!.registerAddress(walletName.replaceAll(" ", "")); + lightningAddress = await lightningWallet!.getAddress(); + + if (lightningAddress == null) { + lightningAddress = + await lightningWallet!.registerAddress(walletName.replaceAll(" ", "").toLowerCase()); + } } } diff --git a/cw_bitcoin/lib/lightning/lightning_addres_type.dart b/cw_bitcoin/lib/lightning/lightning_addres_type.dart index 275867b34f..c12f980e77 100644 --- a/cw_bitcoin/lib/lightning/lightning_addres_type.dart +++ b/cw_bitcoin/lib/lightning/lightning_addres_type.dart @@ -4,6 +4,8 @@ class LightningAddressType implements BitcoinAddressType { const LightningAddressType._(this.value); static const LightningAddressType p2l = LightningAddressType._("Lightning"); + static const String Bolt11InvoiceMatcher = r'^(lightning:)?(lnbc|lntb|lnbs|lnbcrt)[a-z0-9]+$'; + @override bool get isP2sh => false; @override diff --git a/cw_bitcoin/lib/lightning/lightning_wallet.dart b/cw_bitcoin/lib/lightning/lightning_wallet.dart index cf2520c16a..b19105c52b 100644 --- a/cw_bitcoin/lib/lightning/lightning_wallet.dart +++ b/cw_bitcoin/lib/lightning/lightning_wallet.dart @@ -2,6 +2,8 @@ import 'package:breez_sdk_spark_flutter/breez_sdk_spark.dart'; import 'package:cw_bitcoin/lightning/pending_lightning_transaction.dart'; import 'package:cw_core/pending_transaction.dart'; +bool _breezSdkSparkLibUninitialized = true; + class LightningWallet { final String mnemonic; final String apiKey; @@ -17,7 +19,10 @@ class LightningWallet { }); Future init(String appPath) async { - await BreezSdkSparkLib.init(); + if(_breezSdkSparkLibUninitialized) { + await BreezSdkSparkLib.init(); + _breezSdkSparkLibUninitialized = false; + } final seed = Seed.mnemonic(mnemonic: mnemonic, passphrase: null); final config = defaultConfig(network: Network.mainnet).copyWith( @@ -39,9 +44,11 @@ class LightningWallet { Future getBalance() async => (await sdk.getInfo(request: GetInfoRequest(ensureSynced: true))).balanceSats; - Future registerAddress(String username) async => (await sdk.registerLightningAddress( - request: RegisterLightningAddressRequest(username: username))) - .lightningAddress; + Future registerAddress(String username) async { + return (await sdk.registerLightningAddress( + request: RegisterLightningAddressRequest(username: username))) + .lightningAddress; + } Future isCompatible(String input) async { try { diff --git a/cw_bitcoin/test/cw_bitcoin_test.dart b/cw_bitcoin/test/cw_bitcoin_test.dart index 2a7ad6fe46..3fb24b185a 100644 --- a/cw_bitcoin/test/cw_bitcoin_test.dart +++ b/cw_bitcoin/test/cw_bitcoin_test.dart @@ -1,12 +1,23 @@ import 'package:flutter_test/flutter_test.dart'; -import 'package:cw_bitcoin/cw_bitcoin.dart'; - void main() { - test('adds one to input values', () { - final calculator = Calculator(); - expect(calculator.addOne(2), 3); - expect(calculator.addOne(-7), -6); - expect(calculator.addOne(0), 1); + group('lightning matchers', () { + final RegExp lightningInvoiceRegex = + RegExp(r'^(lightning:)?(lnbc|lntb|lnbs|lnbcrt)[a-z0-9]+$', caseSensitive: false); + + test('Valid invoice', () { + final content = + "lnbc2500u1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5xysxxatsyp3k7enxv4jsxqzpuaztrnwngzn3kdzw508d6qejxtdg4y5r3zarvary0c5xw7kpqdxssqfsqqqyqqqqlgqqqqqeqqjq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgq9qrsgqfsqqqyqqqqlgqqqqqeqqjq9qrsgq"; + expect(lightningInvoiceRegex.hasMatch(content), true); + }); + test('Valid invoice with prefix', () { + final content = + "lightning:lnbc2500u1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5xysxxatsyp3k7enxv4jsxqzpuaztrnwngzn3kdzw508d6qejxtdg4y5r3zarvary0c5xw7kpqdxssqfsqqqyqqqqlgqqqqqeqqjq9qrsgq"; + expect(lightningInvoiceRegex.hasMatch(content), true); + }); + test('Invalid invoice', () { + final content = "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq"; // This is a Bitcoin address + expect(lightningInvoiceRegex.hasMatch(content), false); + }); }); } diff --git a/integration_test/robots/send_page_robot.dart b/integration_test/robots/send_page_robot.dart index 84d0156eaa..72ab1d9a03 100644 --- a/integration_test/robots/send_page_robot.dart +++ b/integration_test/robots/send_page_robot.dart @@ -104,6 +104,10 @@ class SendPageRobot { commonTestCases.hasValueKey('send_page_unspent_coin_button_key'); } + if (sendViewModel.hasCurrencyChanger) { + commonTestCases.hasValueKey('send_page_change_asset_button_key'); + } + if (sendViewModel.sendTemplateViewModel.hasMultiRecipient) { commonTestCases.hasValueKey('send_page_add_receiver_button_key'); } diff --git a/lib/bitcoin/cw_bitcoin.dart b/lib/bitcoin/cw_bitcoin.dart index 4a9b2f1f64..b04fe0294d 100644 --- a/lib/bitcoin/cw_bitcoin.dart +++ b/lib/bitcoin/cw_bitcoin.dart @@ -687,6 +687,8 @@ class CWBitcoin extends Bitcoin { } List updateOutputs(PendingTransaction pendingTransaction, List outputs) { + if (pendingTransaction is PendingLightningTransaction) return outputs; + final pendingTx = pendingTransaction as PendingBitcoinTransaction; if (!pendingTx.hasSilentPayment) { diff --git a/lib/core/address_validator.dart b/lib/core/address_validator.dart index 059a92c448..df072f8a32 100644 --- a/lib/core/address_validator.dart +++ b/lib/core/address_validator.dart @@ -12,21 +12,29 @@ const AFTER_REGEX = '(\$|\\s)'; class AddressValidator extends TextValidator { AddressValidator({required CryptoCurrency type, bool isTestnet = false}) : super( - errorMessage: S.current.error_text_address, - useAdditionalValidation: type == CryptoCurrency.btc || type == CryptoCurrency.ltc - ? (String txt) => BitcoinAddressUtils.validateAddress( - address: txt, - network: type == CryptoCurrency.btc - ? isTestnet - ? BitcoinNetwork.testnet - : BitcoinNetwork.mainnet - : LitecoinNetwork.mainnet, - ) - : type == CryptoCurrency.zano - ? zano?.validateAddress - : null, - pattern: getPattern(type, isTestnet: isTestnet), - length: getLength(type)); + errorMessage: S.current.error_text_address, + useAdditionalValidation: [CryptoCurrency.btc, CryptoCurrency.ltc].contains(type) + ? (String txt) { + final RegExp lightningInvoiceRegex = RegExp( + r'^(lightning:)?(lnbc|lntb|lnbs|lnbcrt)[a-z0-9]+$', + caseSensitive: false); + if (lightningInvoiceRegex.hasMatch(txt)) return true; + + return BitcoinAddressUtils.validateAddress( + address: txt, + network: type == CryptoCurrency.btc + ? isTestnet + ? BitcoinNetwork.testnet + : BitcoinNetwork.mainnet + : LitecoinNetwork.mainnet, + ); + } + : type == CryptoCurrency.zano + ? zano?.validateAddress + : null, + pattern: getPattern(type, isTestnet: isTestnet), + length: getLength(type), + ); static String getPattern(CryptoCurrency type, {bool isTestnet = false}) { var pattern = ""; @@ -53,6 +61,7 @@ class AddressValidator extends TextValidator { '|(bc1q[ac-hj-np-z02-9]{25,39})' '|(bc1p([ac-hj-np-z02-9]{39}|[ac-hj-np-z02-9]{59}|[ac-hj-np-z02-9]{8,89}))' '|(bc1q[ac-hj-np-z02-9]{40,80})' + '|(lightning:)?(lnbc|lntb|lnbs|lnbcrt)[a-z0-9]' '|(${silentPaymentAddressPatternMainnet})(\$|\s)'; } case CryptoCurrency.ltc: diff --git a/lib/src/screens/send/send_page.dart b/lib/src/screens/send/send_page.dart index f5b151482b..cd3e695aa3 100644 --- a/lib/src/screens/send/send_page.dart +++ b/lib/src/screens/send/send_page.dart @@ -1,13 +1,13 @@ import 'package:cake_wallet/bitcoin/bitcoin.dart'; import 'package:cake_wallet/core/address_validator.dart'; import 'package:cake_wallet/core/auth_service.dart'; -import 'package:cake_wallet/entities/contact_record.dart'; import 'package:cake_wallet/core/execution_state.dart'; +import 'package:cake_wallet/entities/contact_record.dart'; import 'package:cake_wallet/entities/fiat_currency.dart'; import 'package:cake_wallet/entities/template.dart'; +import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/monero/monero.dart'; import 'package:cake_wallet/reactions/wallet_connect.dart'; -import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/src/screens/connect_device/connect_device_page.dart'; @@ -32,12 +32,12 @@ import 'package:cake_wallet/utils/responsive_layout_util.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/view_model/payment/payment_view_model.dart'; import 'package:cake_wallet/view_model/send/output.dart'; -import 'package:cake_wallet/view_model/wallet_switcher_view_model.dart'; -import 'package:cw_core/utils/print_verbose.dart'; -import 'package:cw_core/wallet_type.dart'; import 'package:cake_wallet/view_model/send/send_view_model.dart'; import 'package:cake_wallet/view_model/send/send_view_model_state.dart'; +import 'package:cake_wallet/view_model/wallet_switcher_view_model.dart'; import 'package:cw_core/crypto_currency.dart'; +import 'package:cw_core/utils/print_verbose.dart'; +import 'package:cw_core/wallet_type.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:keyboard_actions/keyboard_actions.dart'; @@ -93,8 +93,7 @@ class SendPage extends BasePage { size: 16, ); final _closeButton = currentTheme.isDark ? closeButtonImageDarkTheme : closeButtonImage; - - bool isMobileView = responsiveLayoutUtil.shouldRenderMobileUI; + final isMobileView = responsiveLayoutUtil.shouldRenderMobileUI; return MergeSemantics( child: SizedBox( @@ -145,27 +144,25 @@ class SendPage extends BasePage { @override Widget trailing(context) => Observer( - builder: (_) { - return sendViewModel.isBatchSending - ? TrailButton( - caption: S.of(context).remove, - onPressed: () { - var pageToJump = (controller.page?.round() ?? 0) - 1; - pageToJump = pageToJump > 0 ? pageToJump : 0; - final output = _defineCurrentOutput(); - sendViewModel.removeOutput(output); - controller.jumpToPage(pageToJump); - }, - ) - : TrailButton( - caption: S.of(context).clear, - onPressed: () { - final output = _defineCurrentOutput(); - _formKey.currentState?.reset(); - output.reset(); - }, - ); - }, + builder: (_) => sendViewModel.isBatchSending + ? TrailButton( + caption: S.of(context).remove, + onPressed: () { + var pageToJump = (controller.page?.round() ?? 0) - 1; + pageToJump = pageToJump > 0 ? pageToJump : 0; + final output = _defineCurrentOutput(); + sendViewModel.removeOutput(output); + controller.jumpToPage(pageToJump); + }, + ) + : TrailButton( + caption: S.of(context).clear, + onPressed: () { + final output = _defineCurrentOutput(); + _formKey.currentState?.reset(); + output.reset(); + }, + ), ); @override @@ -175,9 +172,9 @@ class SendPage extends BasePage { return Observer(builder: (_) { List sendCards = []; List keyboardActions = []; - for (var output in sendViewModel.outputs) { - var cryptoAmountFocus = FocusNode(); - var fiatAmountFocus = FocusNode(); + for (final output in sendViewModel.outputs) { + final cryptoAmountFocus = FocusNode(); + final fiatAmountFocus = FocusNode(); sendCards.add( SendCard( currentTheme: currentTheme, @@ -376,6 +373,19 @@ class SendPage extends BasePage { bottomSectionPadding: EdgeInsets.only(left: 24, right: 24, bottom: 24), bottomSection: Column( children: [ + if (sendViewModel.hasCurrencyChanger) + Observer( + builder: (_) => Padding( + padding: EdgeInsets.only(bottom: 12), + child: PrimaryButton( + key: ValueKey('send_page_change_asset_button_key'), + onPressed: () => presentCurrencyPicker(context), + text: 'Change your asset (${sendViewModel.selectedCryptoCurrency})', + color: Colors.transparent, + textColor: Theme.of(context).colorScheme.onSurfaceVariant, + ), + ), + ), if (sendViewModel.sendTemplateViewModel.hasMultiRecipient) Padding( padding: EdgeInsets.only(bottom: 12), @@ -474,7 +484,8 @@ class SendPage extends BasePage { sendViewModel.state is TransactionCommitting || sendViewModel.state is IsAwaitingDeviceResponseState || sendViewModel.state is LoadingTemplateExecutingState, - isDisabled: !sendViewModel.isReadyForSend || sendViewModel.state is ExecutedSuccessfullyState, + isDisabled: !sendViewModel.isReadyForSend || + sendViewModel.state is ExecutedSuccessfullyState, ); }, ) @@ -491,9 +502,7 @@ class SendPage extends BasePage { BuildContext? loadingBottomSheetContext; void _setEffects(BuildContext context) { - if (_effectsInstalled) { - return; - } + if (_effectsInstalled) return; if (sendViewModel.isElectrumWallet) { bitcoin!.updateFeeRates(sendViewModel.wallet); @@ -515,16 +524,14 @@ class SendPage extends BasePage { (_) { showPopUp( context: context, - builder: (BuildContext context) { - return AlertWithOneAction( - key: ValueKey('send_page_send_failure_dialog_key'), - buttonKey: ValueKey('send_page_send_failure_dialog_button_key'), - alertTitle: S.of(context).error, - alertContent: state.error, - buttonText: S.of(context).ok, - buttonAction: () => Navigator.of(context).pop(), - ); - }, + builder: (context) => AlertWithOneAction( + key: ValueKey('send_page_send_failure_dialog_key'), + buttonKey: ValueKey('send_page_send_failure_dialog_button_key'), + alertTitle: S.of(context).error, + alertContent: state.error, + buttonText: S.of(context).ok, + buttonAction: () => Navigator.of(context).pop(), + ), ); }, ); @@ -543,7 +550,7 @@ class SendPage extends BasePage { showModalBottomSheet( context: context, isDismissible: false, - builder: (BuildContext context) { + builder: (context) { loadingBottomSheetContext = context; return LoadingBottomSheet( titleText: S.of(context).generating_transaction, @@ -597,9 +604,7 @@ class SendPage extends BasePage { if (state is TransactionCommitted) { WidgetsBinding.instance.addPostFrameCallback((_) async { - if (!context.mounted) { - return; - } + if (!context.mounted) return; newContactAddress = newContactAddress ?? sendViewModel.newContactAddress(); @@ -770,24 +775,32 @@ class SendPage extends BasePage { } Output _defineCurrentOutput() { - if (controller.page == null) { - throw Exception('Controller page is null'); - } + if (controller.page == null) throw Exception('Controller page is null'); final itemCount = controller.page!.round(); return sendViewModel.outputs[itemCount]; } - void showErrorValidationAlert(BuildContext context) async { - await showPopUp( + void showErrorValidationAlert(BuildContext context) => showPopUp( context: context, - builder: (BuildContext context) { - return AlertWithOneAction( - alertTitle: S.of(context).error, - alertContent: 'Please, check receiver forms', - buttonText: S.of(context).ok, - buttonAction: () => Navigator.of(context).pop()); - }); - } + builder: (context) => AlertWithOneAction( + alertTitle: S.of(context).error, + alertContent: 'Please, check receiver forms', + buttonText: S.of(context).ok, + buttonAction: () => Navigator.of(context).pop(), + ), + ); + + void presentCurrencyPicker(BuildContext context) => showPopUp( + builder: (_) => Picker( + items: sendViewModel.currencies, + displayItem: (item) => item.toString(), + selectedAtIndex: sendViewModel.currencies.indexOf(sendViewModel.selectedCryptoCurrency), + title: S.of(context).please_select, + mainAxisAlignment: MainAxisAlignment.center, + onItemSelected: (cur) => sendViewModel.selectedCryptoCurrency = cur, + ), + context: context, + ); bool isRegularElectrumAddress(String address) { final supportedTypes = [CryptoCurrency.btc, CryptoCurrency.ltc, CryptoCurrency.bch]; @@ -800,7 +813,7 @@ class SendPage extends BasePage { final trimmed = address.trim(); bool isValid = false; - for (var type in supportedTypes) { + for (final type in supportedTypes) { final addressPattern = AddressValidator.getAddressFromStringPattern(type); if (addressPattern != null) { final regex = RegExp('^$addressPattern\$'); @@ -811,23 +824,16 @@ class SendPage extends BasePage { } } - for (var pattern in excludedPatterns) { - if (pattern.hasMatch(trimmed)) { - return false; - } + for (final pattern in excludedPatterns) { + if (pattern.hasMatch(trimmed)) return false; } return isValid; } String _sendButtonText(BuildContext context) { - if (!sendViewModel.isReadyForSend) { - return S.of(context).synchronizing; - } - if (sendViewModel.payjoinUri != null) { - return S.of(context).send_payjoin; - } else { - return S.of(context).send; - } + if (!sendViewModel.isReadyForSend) return S.of(context).synchronizing; + if (sendViewModel.payjoinUri != null) return S.of(context).send_payjoin; + return S.of(context).send; } } diff --git a/lib/view_model/send/send_view_model.dart b/lib/view_model/send/send_view_model.dart index 1b446e0203..734eb6c71c 100644 --- a/lib/view_model/send/send_view_model.dart +++ b/lib/view_model/send/send_view_model.dart @@ -57,6 +57,7 @@ import 'package:cw_core/sync_status.dart'; import 'package:cw_core/transaction_info.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/utils/print_verbose.dart'; +import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:flutter/material.dart'; import 'package:hive/hive.dart'; @@ -100,7 +101,8 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor this.transactionDescriptionBox, this.hardwareWalletViewModel, this.unspentCoinsListViewModel, - this.feesViewModel, { + this.feesViewModel, + this.walletInfoSource, { this.coinTypeToSpendFrom = UnspentCoinType.nonMweb, }) : state = InitialExecutionState(), currencies = appStore.wallet!.balance.keys.toList(), @@ -138,21 +140,15 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor bool get isEVMWallet => isEVMCompatibleChain(walletType); @action - void setShowAddressBookPopup(bool value) { - _settingsStore.showAddressBookPopupEnabled = value; - } + void setShowAddressBookPopup(bool value) => _settingsStore.showAddressBookPopupEnabled = value; @action - void addOutput() { - outputs - .add(Output(wallet, _settingsStore, _fiatConversationStore, () => selectedCryptoCurrency)); - } + void addOutput() => outputs + .add(Output(wallet, _settingsStore, _fiatConversationStore, () => selectedCryptoCurrency)); @action void removeOutput(Output output) { - if (isBatchSending) { - outputs.remove(output); - } + if (isBatchSending) outputs.remove(output); } @action @@ -185,9 +181,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor @computed String get pendingTransactionFiatAmount { - if (pendingTransaction == null) { - return '0.00'; - } + if (pendingTransaction == null) return '0.00'; try { final fiat = calculateFiatAmount( @@ -310,11 +304,11 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor @computed String get pendingTransactionFiatAmountFormatted => - isFiatDisabled ? '' : pendingTransactionFiatAmount + ' ' + fiat.title; + isFiatDisabled ? '' : '$pendingTransactionFiatAmount ${fiat.title}'; @computed String get pendingTransactionFeeFiatAmountFormatted => - isFiatDisabled ? '' : pendingTransactionFeeFiatAmount + ' ' + fiat.title; + isFiatDisabled ? '' : '$pendingTransactionFeeFiatAmount ${fiat.title}'; @computed bool get isReadyForSend => @@ -360,13 +354,12 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor List currencies; - bool get hasYat => outputs - .any((out) => out.isParsedAddress && out.parsedAddress.parseFrom == ParseFrom.yatRecord); - WalletType get walletType => wallet.type; String? get walletCurrencyName => wallet.currency.fullName?.toLowerCase() ?? wallet.currency.name; + bool get hasCurrencyChanger => walletType == WalletType.haven; + @computed FiatCurrency get fiatCurrency => _settingsStore.fiatCurrency; @@ -393,19 +386,12 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor .toList(); @action - bool checkIfAddressIsAContact(String address) { - final contactList = contactsToShow.where((element) => element.address == address).toList(); - - return contactList.isNotEmpty; - } + bool checkIfAddressIsAContact(String address) => + contactsToShow.where((element) => element.address == address).toList().isNotEmpty; @action - bool checkIfWalletIsAnInternalWallet(String address) { - final walletContactList = - walletContactsToShow.where((element) => element.address == address).toList(); - - return walletContactList.isNotEmpty; - } + bool checkIfWalletIsAnInternalWallet(String address) => + walletContactsToShow.where((element) => element.address == address).toList().isNotEmpty; @computed bool get shouldDisplayTOTP2FAForContact => _settingsStore.shouldRequireTOTP2FAForSendsToContact; @@ -499,13 +485,14 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor if (wallet.isHardwareWallet) { state = IsAwaitingDeviceResponseState(); - if (walletType == WalletType.monero) + if (walletType == WalletType.monero) { _ledgerTxStateTimer = Timer.periodic(Duration(seconds: 1), (timer) { if (monero!.getLastLedgerCommand() == "INS_CLSAG") { timer.cancel(); state = IsDeviceSigningResponseState(); } }); + } } // Swaps.xyz (EVM) path @@ -873,11 +860,13 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor final priority = _settingsStore.priority[wallet.type]; if (priority == null && - wallet.type != WalletType.nano && - wallet.type != WalletType.banano && - wallet.type != WalletType.solana && - wallet.type != WalletType.tron && - wallet.type != WalletType.arbitrum) { + [ + WalletType.nano, + WalletType.banano, + WalletType.solana, + WalletType.tron, + WalletType.arbitrium + ].contains(wallet.type)) { throw Exception('Priority is null for wallet type: ${wallet.type}'); } @@ -962,24 +951,21 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor Set.from(contactListViewModel.contacts.map((contact) => contact.address)) ..addAll(contactListViewModel.walletContacts.map((contact) => contact.address)); - for (var output in outputs) { - String address; - if (output.isParsedAddress) { - address = output.parsedAddress.addresses.first; - } else { - address = output.address; - } + for (final output in outputs) { + final address = + output.isParsedAddress ? output.parsedAddress.addresses.first : output.address; if (address.isNotEmpty && !contactAddresses.contains(address) && selectedCryptoCurrency.raw != -1) { return ContactRecord( - contactListViewModel.contactSource, - Contact( - name: '', - address: address, - type: selectedCryptoCurrency, - )); + contactListViewModel.contactSource, + Contact( + name: '', + address: address, + type: selectedCryptoCurrency, + ), + ); } } return null; @@ -1054,11 +1040,13 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor return errorMessage; } - if (walletType == WalletType.ethereum || - walletType == WalletType.polygon || - walletType == WalletType.base || - walletType == WalletType.arbitrum || - walletType == WalletType.haven) { + if ([ + WalletType.ethereum, + WalletType.polygon, + WalletType.base, + WalletType.haven, + WalletType.arbitrium + ].contains(walletType)) { if (errorMessage.contains('gas required exceeds allowance')) { return S.current.gas_exceeds_allowance; } diff --git a/tool/configure.dart b/tool/configure.dart index 47b3379406..fb934083ee 100644 --- a/tool/configure.dart +++ b/tool/configure.dart @@ -144,6 +144,7 @@ import 'package:cw_bitcoin/bitcoin_amount_format.dart'; import 'package:cw_bitcoin/bitcoin_address_record.dart'; import 'package:cw_bitcoin/bitcoin_wallet_addresses.dart'; import 'package:cw_bitcoin/bitcoin_transaction_credentials.dart'; +import 'package:cw_bitcoin/lightning/pending_lightning_transaction.dart'; import 'package:cw_bitcoin/litecoin_wallet_service.dart'; import 'package:cw_bitcoin/litecoin_wallet.dart'; import 'package:cw_bitcoin/hardware/bitcoin_ledger_service.dart'; From ab6d724c4090496e0aa32226f6d68a5946e898de Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Fri, 31 Oct 2025 16:16:22 +0100 Subject: [PATCH 026/105] feat: add support for Lightning invoice detection, refactor MWEB deposit/withdraw actions, and integrate Lightning transaction creation with updated priority handling --- cw_bitcoin/lib/bitcoin_wallet.dart | 8 +- cw_bitcoin/lib/electrum_wallet.dart | 1 + .../lib/lightning/lightning_wallet.dart | 56 +++++++++- cw_core/lib/unspent_coin_type.dart | 2 +- lib/bitcoin/cw_bitcoin.dart | 10 ++ .../pages/balance/balance_row_widget.dart | 102 +++++++++--------- lib/src/screens/send/widgets/send_card.dart | 4 + lib/view_model/send/send_view_model.dart | 7 ++ 8 files changed, 133 insertions(+), 57 deletions(-) diff --git a/cw_bitcoin/lib/bitcoin_wallet.dart b/cw_bitcoin/lib/bitcoin_wallet.dart index 997a5dfb89..e5147a536a 100644 --- a/cw_bitcoin/lib/bitcoin_wallet.dart +++ b/cw_bitcoin/lib/bitcoin_wallet.dart @@ -27,6 +27,7 @@ import 'package:cw_core/output_info.dart'; import 'package:cw_core/parse_fixed.dart'; import 'package:cw_core/payjoin_session.dart'; import 'package:cw_core/pending_transaction.dart'; +import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/unspent_coins_info.dart'; import 'package:cw_core/utils/zpub.dart'; import 'package:cw_core/wallet_info.dart'; @@ -378,11 +379,12 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { Future createTransaction(Object credentials) async { credentials = credentials as BitcoinTransactionCredentials; - if ((await lightningWallet?.isCompatible(credentials.outputs.first.address)) == true) { - final amount = parseFixed(credentials.outputs.first.cryptoAmount ?? "0", 9); + if ((credentials.coinTypeToSpendFrom == UnspentCoinType.lightning && lightningWallet != null) || + (await lightningWallet?.isCompatible(credentials.outputs.first.address)) == true) { + final amount = parseFixed(credentials.outputs.first.cryptoAmount?.isNotEmpty == true ? credentials.outputs.first.cryptoAmount! : "0", 9); return lightningWallet!.createTransaction(credentials.outputs.first.address, - amount > BigInt.zero ? amount : null); + amount > BigInt.zero ? amount : null, credentials.priority); } final tx = (await super.createTransaction(credentials)) as PendingBitcoinTransaction; diff --git a/cw_bitcoin/lib/electrum_wallet.dart b/cw_bitcoin/lib/electrum_wallet.dart index 7a0fecd3e7..73591a643d 100644 --- a/cw_bitcoin/lib/electrum_wallet.dart +++ b/cw_bitcoin/lib/electrum_wallet.dart @@ -714,6 +714,7 @@ abstract class ElectrumWalletBase case UnspentCoinType.nonMweb: return utx.bitcoinAddressRecord.type != SegwitAddresType.mweb; case UnspentCoinType.any: + case UnspentCoinType.lightning: return true; } }).toList(); diff --git a/cw_bitcoin/lib/lightning/lightning_wallet.dart b/cw_bitcoin/lib/lightning/lightning_wallet.dart index b19105c52b..b015f8d0c2 100644 --- a/cw_bitcoin/lib/lightning/lightning_wallet.dart +++ b/cw_bitcoin/lib/lightning/lightning_wallet.dart @@ -1,4 +1,5 @@ import 'package:breez_sdk_spark_flutter/breez_sdk_spark.dart'; +import 'package:cw_bitcoin/bitcoin_transaction_priority.dart'; import 'package:cw_bitcoin/lightning/pending_lightning_transaction.dart'; import 'package:cw_core/pending_transaction.dart'; @@ -19,7 +20,7 @@ class LightningWallet { }); Future init(String appPath) async { - if(_breezSdkSparkLibUninitialized) { + if (_breezSdkSparkLibUninitialized) { await BreezSdkSparkLib.init(); _breezSdkSparkLibUninitialized = false; } @@ -41,12 +42,17 @@ class LightningWallet { Future getAddress() async => (await sdk.getLightningAddress())?.lightningAddress; + Future getDepositAddress() async => + (await sdk.receivePayment( + request: ReceivePaymentRequest(paymentMethod: ReceivePaymentMethod.bitcoinAddress()))) + .paymentRequest; + Future getBalance() async => (await sdk.getInfo(request: GetInfoRequest(ensureSynced: true))).balanceSats; Future registerAddress(String username) async { return (await sdk.registerLightningAddress( - request: RegisterLightningAddressRequest(username: username))) + request: RegisterLightningAddressRequest(username: username))) .lightningAddress; } @@ -59,7 +65,8 @@ class LightningWallet { } } - Future createTransaction(String address, BigInt? amountSats) async { + Future createTransaction(String address, BigInt? amountSats, + BitcoinTransactionPriority? priority) async { final inputType = await sdk.parse(input: address); if (inputType is InputType_Bolt11Invoice) { @@ -76,7 +83,7 @@ class LightningWallet { return PendingLightningTransaction( id: paymentMethod.invoiceDetails.paymentHash, - amount: paymentMethod.invoiceDetails.amountMsat?.toInt() ?? 0, + amount: ((paymentMethod.invoiceDetails.amountMsat?.toInt() ?? 0) / 1000).round(), fee: lightningFeeSats.toInt() + (sparkTransferFeeSats?.toInt() ?? 0), commitOverride: () => sdk.sendPayment(request: SendPaymentRequest(prepareResponse: prepareResponse)), @@ -101,6 +108,45 @@ class LightningWallet { commitOverride: () => sdk.lnurlPay(request: LnurlPayRequest(prepareResponse: prepareResponse)), ); + } else if (inputType is InputType_BitcoinAddress) { + final request = PrepareSendPaymentRequest( + paymentRequest: inputType.field0.address, amount: amountSats); + final prepareResponse = await sdk.prepareSendPayment(request: request); + + final paymentMethod = prepareResponse.paymentMethod; + if (paymentMethod is SendPaymentMethod_BitcoinAddress) { + final feeQuote = paymentMethod.feeQuote; + OnchainConfirmationSpeed onchainConfirmationSpeed; + int fee; + + switch (priority) { + case BitcoinTransactionPriority.fast: + fee = (feeQuote.speedFast.userFeeSat + feeQuote.speedFast.l1BroadcastFeeSat).toInt(); + onchainConfirmationSpeed = OnchainConfirmationSpeed.fast; + break; + case BitcoinTransactionPriority.medium: + fee = + (feeQuote.speedMedium.userFeeSat + feeQuote.speedMedium.l1BroadcastFeeSat).toInt(); + onchainConfirmationSpeed = OnchainConfirmationSpeed.medium; + break; + case BitcoinTransactionPriority.slow: + default: + fee = (feeQuote.speedSlow.userFeeSat + feeQuote.speedSlow.l1BroadcastFeeSat).toInt(); + onchainConfirmationSpeed = OnchainConfirmationSpeed.slow; + } + + return PendingLightningTransaction( + id: "", // ToDo: Find out where to get it + amount: prepareResponse.amount.toInt(), + fee: fee, + commitOverride: () async { + final options = + SendPaymentOptions.bitcoinAddress(confirmationSpeed: onchainConfirmationSpeed); + await sdk.sendPayment( + request: SendPaymentRequest(prepareResponse: prepareResponse, options: options)); + }, + ); + } } // If not returned earlier @@ -126,6 +172,6 @@ extension _ConfigCopyWith on Config { maxDepositClaimFee: maxDepositClaimFee ?? this.maxDepositClaimFee, preferSparkOverLightning: preferSparkOverLightning ?? this.preferSparkOverLightning, useDefaultExternalInputParsers: - useDefaultExternalInputParsers ?? this.useDefaultExternalInputParsers, + useDefaultExternalInputParsers ?? this.useDefaultExternalInputParsers, ); } diff --git a/cw_core/lib/unspent_coin_type.dart b/cw_core/lib/unspent_coin_type.dart index a042610fc9..859457c498 100644 --- a/cw_core/lib/unspent_coin_type.dart +++ b/cw_core/lib/unspent_coin_type.dart @@ -1 +1 @@ -enum UnspentCoinType { mweb, nonMweb, any } \ No newline at end of file +enum UnspentCoinType { mweb, nonMweb, any, lightning } diff --git a/lib/bitcoin/cw_bitcoin.dart b/lib/bitcoin/cw_bitcoin.dart index b04fe0294d..27ffcef0d0 100644 --- a/lib/bitcoin/cw_bitcoin.dart +++ b/lib/bitcoin/cw_bitcoin.dart @@ -248,6 +248,7 @@ class CWBitcoin extends Bitcoin { return element.bitcoinAddressRecord.type == SegwitAddresType.mweb; case UnspentCoinType.nonMweb: return element.bitcoinAddressRecord.type != SegwitAddresType.mweb; + case UnspentCoinType.lightning: case UnspentCoinType.any: return true; } @@ -766,6 +767,15 @@ class CWBitcoin extends Bitcoin { } } + Future getUnusedSpakDepositAddress(Object wallet) async { + try { + final bitcoinWallet = wallet as BitcoinWallet; + return wallet.lightningWallet?.getDepositAddress(); + } catch (_) { + return null; + } + } + @override Future commitPsbtUR(Object wallet, List urCodes) { final _wallet = wallet as BitcoinWalletBase; diff --git a/lib/src/screens/dashboard/pages/balance/balance_row_widget.dart b/lib/src/screens/dashboard/pages/balance/balance_row_widget.dart index 766914f769..3dac4cea13 100644 --- a/lib/src/screens/dashboard/pages/balance/balance_row_widget.dart +++ b/lib/src/screens/dashboard/pages/balance/balance_row_widget.dart @@ -12,6 +12,7 @@ import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/unspent_coin_type.dart'; +import 'package:cw_core/wallet_type.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -505,23 +506,7 @@ class BalanceRowWidget extends StatelessWidget { child: Semantics( label: S.of(context).litecoin_mweb_pegin, child: OutlinedButton( - onPressed: () { - final mwebAddress = - bitcoin!.getUnusedMwebAddress(dashboardViewModel.wallet); - PaymentRequest? paymentRequest = null; - if ((mwebAddress?.isNotEmpty ?? false)) { - paymentRequest = PaymentRequest.fromUri( - Uri.parse("litecoin:${mwebAddress}")); - } - Navigator.pushNamed( - context, - Routes.send, - arguments: { - 'paymentRequest': paymentRequest, - 'coinTypeToSpendFrom': UnspentCoinType.nonMweb, - }, - ); - }, + onPressed: () => depositToL2(context), style: OutlinedButton.styleFrom( backgroundColor: Theme.of(context).colorScheme.primary, side: BorderSide( @@ -563,23 +548,7 @@ class BalanceRowWidget extends StatelessWidget { child: Semantics( label: S.of(context).litecoin_mweb_pegout, child: OutlinedButton( - onPressed: () { - final litecoinAddress = - bitcoin!.getUnusedSegwitAddress(dashboardViewModel.wallet); - PaymentRequest? paymentRequest = null; - if ((litecoinAddress?.isNotEmpty ?? false)) { - paymentRequest = PaymentRequest.fromUri( - Uri.parse("litecoin:${litecoinAddress}")); - } - Navigator.pushNamed( - context, - Routes.send, - arguments: { - 'paymentRequest': paymentRequest, - 'coinTypeToSpendFrom': UnspentCoinType.mweb, - }, - ); - }, + onPressed: () => withdrawFromL2(context), style: OutlinedButton.styleFrom( backgroundColor: Theme.of(context).colorScheme.surface, side: BorderSide( @@ -632,20 +601,57 @@ class BalanceRowWidget extends StatelessWidget { ); } - // double getShadowSpread(){ - // double spread = 3; - // else if (!dashboardViewModel.settingsStore.currentTheme.isDark) spread = 3; - // else if (dashboardViewModel.settingsStore.currentTheme.isDark) spread = 1; - // return spread; - // } - // - // - // double getShadowBlur(){ - // double blur = 7; - // else if (dashboardViewModel.settingsStore.currentTheme.isDark) blur = 7; - // else if (dashboardViewModel.settingsStore.currentTheme.isDark) blur = 3; - // return blur; - // } + Future depositToL2(BuildContext context) async { + PaymentRequest? paymentRequest = null; + + if (dashboardViewModel.type == WalletType.litecoin) { + final depositAddress = bitcoin!.getUnusedMwebAddress(dashboardViewModel.wallet); + if ((depositAddress?.isNotEmpty ?? false)) { + paymentRequest = PaymentRequest.fromUri(Uri.parse("litecoin:$depositAddress")); + } + } else if (dashboardViewModel.type == WalletType.bitcoin) { + final depositAddress = await bitcoin!.getUnusedSpakDepositAddress(dashboardViewModel.wallet); + if ((depositAddress?.isNotEmpty ?? false)) { + paymentRequest = PaymentRequest.fromUri(Uri.parse("bitcoin:$depositAddress")); + } + } + + Navigator.pushNamed( + context, + Routes.send, + arguments: { + 'paymentRequest': paymentRequest, + 'coinTypeToSpendFrom': UnspentCoinType.nonMweb, + }, + ); + } + + Future withdrawFromL2(BuildContext context) async { + PaymentRequest? paymentRequest = null; + UnspentCoinType unspentCoinType = UnspentCoinType.any; + final withdrawAddress = bitcoin!.getUnusedSegwitAddress(dashboardViewModel.wallet); + + if (dashboardViewModel.type == WalletType.litecoin) { + if ((withdrawAddress?.isNotEmpty ?? false)) { + paymentRequest = PaymentRequest.fromUri(Uri.parse("litecoin:$withdrawAddress")); + } + unspentCoinType = UnspentCoinType.mweb; + } else if (dashboardViewModel.type == WalletType.bitcoin) { + if ((withdrawAddress?.isNotEmpty ?? false)) { + paymentRequest = PaymentRequest.fromUri(Uri.parse("bitcoin:$withdrawAddress")); + } + unspentCoinType = UnspentCoinType.lightning; + } + + Navigator.pushNamed( + context, + Routes.send, + arguments: { + 'paymentRequest': paymentRequest, + 'coinTypeToSpendFrom': unspentCoinType, + }, + ); + } void _showBalanceDescription(BuildContext context, String content) { showPopUp(context: context, builder: (_) => InformationPage(information: content)); diff --git a/lib/src/screens/send/widgets/send_card.dart b/lib/src/screens/send/widgets/send_card.dart index b0d4f767ef..20e3b2ceb3 100644 --- a/lib/src/screens/send/widgets/send_card.dart +++ b/lib/src/screens/send/widgets/send_card.dart @@ -818,6 +818,10 @@ class SendCardState extends State with AutomaticKeepAliveClientMixin Date: Fri, 31 Oct 2025 16:16:45 +0100 Subject: [PATCH 027/105] feat: add method to retrieve unused Spark deposit address for Bitcoin wallets --- tool/configure.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/tool/configure.dart b/tool/configure.dart index fb934083ee..dbca11d49f 100644 --- a/tool/configure.dart +++ b/tool/configure.dart @@ -269,6 +269,7 @@ abstract class Bitcoin { bool getMwebEnabled(Object wallet); String? getUnusedMwebAddress(Object wallet); String? getUnusedSegwitAddress(Object wallet); + Future getUnusedSpakDepositAddress(Object wallet); Future commitPsbtUR(Object wallet, List urCodes); void updatePayjoinState(Object wallet, bool state); From 5995afba45bf7249693200fa334f94de04ef42db Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Sat, 1 Nov 2025 00:32:21 +0100 Subject: [PATCH 028/105] feat: add Breez API key support and update secrets handling for Bitcoin Lightning wallet integration in workflows --- .github/workflows/automated_integration_test.yml | 2 ++ .github/workflows/pr_test_build_android.yml | 4 +++- .github/workflows/pr_test_build_linux.yml | 2 ++ cw_bitcoin/lib/bitcoin_wallet.dart | 4 ++-- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/automated_integration_test.yml b/.github/workflows/automated_integration_test.yml index 95a3197d4f..eee1407c1d 100644 --- a/.github/workflows/automated_integration_test.yml +++ b/.github/workflows/automated_integration_test.yml @@ -57,6 +57,7 @@ jobs: - name: Add secrets run: | touch lib/.secrets.g.dart + touch cw_bitcoin/lib/.secrets.g.dart touch cw_evm/lib/.secrets.g.dart touch cw_solana/lib/.secrets.g.dart touch cw_core/lib/.secrets.g.dart @@ -130,6 +131,7 @@ jobs: echo "const etherScanApiKey = '${{ secrets.ETHER_SCAN_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const moralisApiKey = '${{ secrets.MORALIS_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const nowNodesApiKey = '${{ secrets.EVM_NOWNODES_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart + echo "const breezApiKey = '${{ secrets.BREEZ_API_KEY }}';" >> cw_bitcoin/lib/.secrets.g.dart echo "const chatwootWebsiteToken = '${{ secrets.CHATWOOT_WEBSITE_TOKEN }}';" >> lib/.secrets.g.dart echo "const exolixCakeWalletApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart echo "const exolixMoneroApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart diff --git a/.github/workflows/pr_test_build_android.yml b/.github/workflows/pr_test_build_android.yml index 7d7a196c13..53ce074e69 100644 --- a/.github/workflows/pr_test_build_android.yml +++ b/.github/workflows/pr_test_build_android.yml @@ -51,6 +51,7 @@ jobs: - name: Add secrets run: | touch lib/.secrets.g.dart + touch cw_bitcoin/lib/.secrets.g.dart touch cw_evm/lib/.secrets.g.dart touch cw_solana/lib/.secrets.g.dart touch cw_core/lib/.secrets.g.dart @@ -124,6 +125,7 @@ jobs: echo "const etherScanApiKey = '${{ secrets.ETHER_SCAN_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const moralisApiKey = '${{ secrets.MORALIS_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const nowNodesApiKey = '${{ secrets.EVM_NOWNODES_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart + echo "const breezApiKey = '${{ secrets.BREEZ_API_KEY }}';" >> cw_bitcoin/lib/.secrets.g.dart echo "const chatwootWebsiteToken = '${{ secrets.CHATWOOT_WEBSITE_TOKEN }}';" >> lib/.secrets.g.dart echo "const exolixCakeWalletApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart echo "const exolixMoneroApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart @@ -340,4 +342,4 @@ jobs: cd build/app/outputs/flutter-apk for i in arm64-v8a x86_64; do ../../../../scripts/android/check_16kb_align.sh app-$i-release.apk - done \ No newline at end of file + done diff --git a/.github/workflows/pr_test_build_linux.yml b/.github/workflows/pr_test_build_linux.yml index 92eae19db2..10bd5557b7 100644 --- a/.github/workflows/pr_test_build_linux.yml +++ b/.github/workflows/pr_test_build_linux.yml @@ -44,6 +44,7 @@ jobs: - name: Add secrets run: | touch lib/.secrets.g.dart + touch cw_bitcoin/lib/.secrets.g.dart touch cw_evm/lib/.secrets.g.dart touch cw_solana/lib/.secrets.g.dart touch cw_core/lib/.secrets.g.dart @@ -117,6 +118,7 @@ jobs: echo "const etherScanApiKey = '${{ secrets.ETHER_SCAN_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const moralisApiKey = '${{ secrets.MORALIS_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart echo "const nowNodesApiKey = '${{ secrets.EVM_NOWNODES_API_KEY }}';" >> cw_evm/lib/.secrets.g.dart + echo "const breezApiKey = '${{ secrets.BREEZ_API_KEY }}';" >> cw_bitcoin/lib/.secrets.g.dart echo "const chatwootWebsiteToken = '${{ secrets.CHATWOOT_WEBSITE_TOKEN }}';" >> lib/.secrets.g.dart echo "const exolixCakeWalletApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart echo "const exolixMoneroApiKey = '${{ secrets.EXOLIX_API_KEY }}';" >> lib/.secrets.g.dart diff --git a/cw_bitcoin/lib/bitcoin_wallet.dart b/cw_bitcoin/lib/bitcoin_wallet.dart index e5147a536a..561c31528d 100644 --- a/cw_bitcoin/lib/bitcoin_wallet.dart +++ b/cw_bitcoin/lib/bitcoin_wallet.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:bip39/bip39.dart' as bip39; import 'package:bitcoin_base/bitcoin_base.dart'; import 'package:blockchain_utils/blockchain_utils.dart'; +import 'package:cw_bitcoin/.secrets.g.dart' as secrets; import 'package:cw_bitcoin/address_from_output.dart'; import 'package:cw_bitcoin/bitcoin_address_record.dart'; import 'package:cw_bitcoin/bitcoin_mnemonic.dart'; @@ -96,8 +97,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { if (mnemonic != null) { lightningWallet = LightningWallet( mnemonic: mnemonic, - apiKey: - "MIIBdzCCASmgAwIBAgIHPpJHKP1qXzAFBgMrZXAwEDEOMAwGA1UEAxMFQnJlZXowHhcNMjUxMDIzMTQwNDQ4WhcNMzUxMDIxMTQwNDQ4WjAxMRQwEgYDVQQKEwtDYWtlIFdhbGxldDEZMBcGA1UEAxMQU2V0aCBGb3IgUHJpdmFjeTAqMAUGAytlcAMhANCD9cvfIDwcoiDKKYdT9BunHLS2/OuKzV8NS0SzqV13o4GAMH4wDgYDVR0PAQH/BAQDAgWgMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFNo5o+5ea0sNMlW/75VgGJCv2AcJMB8GA1UdIwQYMBaAFN6q1pJW843ndJIW/Ey2ILJrKJhrMB4GA1UdEQQXMBWBE3NldGhAY2FrZXdhbGxldC5jb20wBQYDK2VwA0EAl+naPfCBseV7eS4SoP0q0kvo2GHCywXoIbnlBa0y+/wlfu+oILtsGv3jGQ2egCnpgHe87yzR0ygclzz8r/jdAQ==", + apiKey: secrets.breezApiKey, lnurlDomain: "breez.tips", ); } From 7ab3997bba7cd01aad9e4344dc19404a1e882fb6 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Sat, 1 Nov 2025 00:33:45 +0100 Subject: [PATCH 029/105] chore: update Breez SDK dependency to version 0.3.4 in pubspec files --- cw_bitcoin/pubspec.lock | 6 +++--- cw_bitcoin/pubspec.yaml | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/cw_bitcoin/pubspec.lock b/cw_bitcoin/pubspec.lock index 38aea938ca..e281c7f7b4 100644 --- a/cw_bitcoin/pubspec.lock +++ b/cw_bitcoin/pubspec.lock @@ -134,11 +134,11 @@ packages: dependency: "direct main" description: path: "." - ref: HEAD - resolved-ref: "5bc8fb5f3a5c84e2e3dd55f5d48b01152f425765" + ref: "92f62dc2037cf08003e418aadda58f451c021f42" + resolved-ref: "92f62dc2037cf08003e418aadda58f451c021f42" url: "https://github.com/breez/breez-sdk-spark-flutter" source: git - version: "0.3.2" + version: "0.3.4" bs58check: dependency: transitive description: diff --git a/cw_bitcoin/pubspec.yaml b/cw_bitcoin/pubspec.yaml index 940ce80b6a..439492bda0 100644 --- a/cw_bitcoin/pubspec.yaml +++ b/cw_bitcoin/pubspec.yaml @@ -75,6 +75,7 @@ dependencies: breez_sdk_spark_flutter: git: url: https://github.com/breez/breez-sdk-spark-flutter + ref: 92f62dc2037cf08003e418aadda58f451c021f42 dev_dependencies: flutter_test: From c02775d09b21153f193606b152191f7c23497fb1 Mon Sep 17 00:00:00 2001 From: OmarHatem Date: Sat, 1 Nov 2025 13:28:12 +0100 Subject: [PATCH 030/105] Add bitcoin secrets config [skip ci] --- .gitignore | 1 + scripts/android/app_env.sh | 4 ++-- tool/generate_secrets_config.dart | 3 +++ tool/import_secrets_config.dart | 3 +++ tool/utils/secret_key.dart | 4 ++++ 5 files changed, 13 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index cd2230504d..018d05ca22 100644 --- a/.gitignore +++ b/.gitignore @@ -97,6 +97,7 @@ android/app/key.jks **/tool/.solana-secrets-config.json **/tool/.nano-secrets-config.json **/tool/.tron-secrets-config.json +**/tool/.bitcoin-secrets-config.json **/lib/.secrets.g.dart **/cw_evm/lib/.secrets.g.dart **/cw_solana/lib/.secrets.g.dart diff --git a/scripts/android/app_env.sh b/scripts/android/app_env.sh index 21bf2c1e99..99e0380e07 100644 --- a/scripts/android/app_env.sh +++ b/scripts/android/app_env.sh @@ -21,8 +21,8 @@ MONERO_COM_PACKAGE="com.monero.app" MONERO_COM_SCHEME="monero.com" CAKEWALLET_NAME="Cake Wallet" -CAKEWALLET_VERSION="5.5.2" -CAKEWALLET_BUILD_NUMBER=4284 +CAKEWALLET_VERSION="5.6.0" +CAKEWALLET_BUILD_NUMBER=4285 CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet" CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet" CAKEWALLET_SCHEME="cakewallet" diff --git a/tool/generate_secrets_config.dart b/tool/generate_secrets_config.dart index 8e9762b7a0..0b32e60ad5 100644 --- a/tool/generate_secrets_config.dart +++ b/tool/generate_secrets_config.dart @@ -8,6 +8,7 @@ const evmChainsConfigPath = 'tool/.evm-secrets-config.json'; const solanaConfigPath = 'tool/.solana-secrets-config.json'; const nanoConfigPath = 'tool/.nano-secrets-config.json'; const tronConfigPath = 'tool/.tron-secrets-config.json'; +const bitcoinConfigPath = 'tool/.bitcoin-secrets-config.json'; Future main(List args) async => generateSecretsConfig(args); @@ -41,6 +42,7 @@ Future generateSecretsConfig(List args) async { final solanaConfigFile = File(solanaConfigPath); final nanoConfigFile = File(nanoConfigPath); final tronConfigFile = File(tronConfigPath); + final bitcoinConfigFile = File(bitcoinConfigPath); final secrets = {}; @@ -66,4 +68,5 @@ Future generateSecretsConfig(List args) async { await writeConfig(solanaConfigFile, SecretKey.solanaSecrets); await writeConfig(nanoConfigFile, SecretKey.nanoSecrets); await writeConfig(tronConfigFile, SecretKey.tronSecrets); + await writeConfig(bitcoinConfigFile, SecretKey.bitcoinSecrets); } diff --git a/tool/import_secrets_config.dart b/tool/import_secrets_config.dart index 42379021f5..dd333c7e2b 100644 --- a/tool/import_secrets_config.dart +++ b/tool/import_secrets_config.dart @@ -14,6 +14,9 @@ const solanaOutputPath = 'cw_solana/lib/.secrets.g.dart'; const tronConfigPath = 'tool/.tron-secrets-config.json'; const tronOutputPath = 'cw_tron/lib/.secrets.g.dart'; +const bitcoinConfigPath = 'tool/.bitcoin-secrets-config.json'; +const bitcoinOutputPath = 'cw_bitcoin/lib/.secrets.g.dart'; + const nanoConfigPath = 'tool/.nano-secrets-config.json'; const nanoOutputPath = 'cw_nano/lib/.secrets.g.dart'; diff --git a/tool/utils/secret_key.dart b/tool/utils/secret_key.dart index 61ccea60b9..8e6a6c6c9e 100644 --- a/tool/utils/secret_key.dart +++ b/tool/utils/secret_key.dart @@ -111,6 +111,10 @@ class SecretKey { SecretKey('tronNowNodesApiKey', () => ''), ]; + static final bitcoinSecrets = [ + SecretKey('breezApiKey', () => ''), + ]; + final String name; final String Function() generate; } From a33a3750b3e3db792718d96314d7110642218c58 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Mon, 3 Nov 2025 19:46:02 +0100 Subject: [PATCH 031/105] feat: extend Lightning wallet functionality with transaction history fetching --- cw_bitcoin/lib/bitcoin_wallet.dart | 29 ++++++-- .../lib/lightning/lightning_addres_type.dart | 1 + .../lib/lightning/lightning_wallet.dart | 72 ++++++++++++++----- 3 files changed, 82 insertions(+), 20 deletions(-) diff --git a/cw_bitcoin/lib/bitcoin_wallet.dart b/cw_bitcoin/lib/bitcoin_wallet.dart index 561c31528d..9b212ff5f9 100644 --- a/cw_bitcoin/lib/bitcoin_wallet.dart +++ b/cw_bitcoin/lib/bitcoin_wallet.dart @@ -11,6 +11,7 @@ import 'package:cw_bitcoin/bitcoin_transaction_credentials.dart'; import 'package:cw_bitcoin/bitcoin_wallet_addresses.dart'; import 'package:cw_bitcoin/electrum_balance.dart'; import 'package:cw_bitcoin/electrum_derivations.dart'; +import 'package:cw_bitcoin/electrum_transaction_info.dart'; import 'package:cw_bitcoin/electrum_wallet.dart'; import 'package:cw_bitcoin/electrum_wallet_snapshot.dart'; import 'package:cw_bitcoin/hardware/bitcoin_hardware_wallet_service.dart'; @@ -119,7 +120,6 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { lightningWallet: lightningWallet, ); - if (lightningWallet != null) { walletAddresses.setLightningAddress(walletInfo.name); } @@ -296,7 +296,23 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { final lBalance = await lightningWallet!.getBalance(); - return ElectrumBalance(confirmed: balance.confirmed, unconfirmed: balance.unconfirmed, frozen: balance.frozen, secondConfirmed: lBalance.toInt()); + return ElectrumBalance( + confirmed: balance.confirmed, + unconfirmed: balance.unconfirmed, + frozen: balance.frozen, + secondConfirmed: lBalance.toInt(), + ); + } + + @override + Future> fetchTransactions() async { + if (lightningWallet != null) { + final lnHistory = await lightningWallet!.getTransactionHistory(); + transactionHistory.addMany(lnHistory); + await transactionHistory.save(); + } + + return super.fetchTransactions(); } late final LightningWallet? lightningWallet; @@ -379,9 +395,14 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { Future createTransaction(Object credentials) async { credentials = credentials as BitcoinTransactionCredentials; + final isLNCompatible = await lightningWallet?.isCompatible(credentials.outputs.first.address); if ((credentials.coinTypeToSpendFrom == UnspentCoinType.lightning && lightningWallet != null) || - (await lightningWallet?.isCompatible(credentials.outputs.first.address)) == true) { - final amount = parseFixed(credentials.outputs.first.cryptoAmount?.isNotEmpty == true ? credentials.outputs.first.cryptoAmount! : "0", 9); + isLNCompatible == true) { + final amount = parseFixed( + credentials.outputs.first.cryptoAmount?.isNotEmpty == true + ? credentials.outputs.first.cryptoAmount! + : "0", + 9); return lightningWallet!.createTransaction(credentials.outputs.first.address, amount > BigInt.zero ? amount : null, credentials.priority); diff --git a/cw_bitcoin/lib/lightning/lightning_addres_type.dart b/cw_bitcoin/lib/lightning/lightning_addres_type.dart index c12f980e77..f0b13fca18 100644 --- a/cw_bitcoin/lib/lightning/lightning_addres_type.dart +++ b/cw_bitcoin/lib/lightning/lightning_addres_type.dart @@ -5,6 +5,7 @@ class LightningAddressType implements BitcoinAddressType { static const LightningAddressType p2l = LightningAddressType._("Lightning"); static const String Bolt11InvoiceMatcher = r'^(lightning:)?(lnbc|lntb|lnbs|lnbcrt)[a-z0-9]+$'; + static const String Bolt12OfferMatcher = r'^(lightning:)?(lno1)[a-z0-9]+$'; @override bool get isP2sh => false; diff --git a/cw_bitcoin/lib/lightning/lightning_wallet.dart b/cw_bitcoin/lib/lightning/lightning_wallet.dart index b015f8d0c2..6ae40da518 100644 --- a/cw_bitcoin/lib/lightning/lightning_wallet.dart +++ b/cw_bitcoin/lib/lightning/lightning_wallet.dart @@ -1,7 +1,11 @@ import 'package:breez_sdk_spark_flutter/breez_sdk_spark.dart'; import 'package:cw_bitcoin/bitcoin_transaction_priority.dart'; +import 'package:cw_bitcoin/electrum_transaction_info.dart'; import 'package:cw_bitcoin/lightning/pending_lightning_transaction.dart'; import 'package:cw_core/pending_transaction.dart'; +import 'package:cw_core/transaction_direction.dart'; +import 'package:cw_core/utils/print_verbose.dart'; +import 'package:cw_core/wallet_type.dart'; bool _breezSdkSparkLibUninitialized = true; @@ -42,17 +46,16 @@ class LightningWallet { Future getAddress() async => (await sdk.getLightningAddress())?.lightningAddress; - Future getDepositAddress() async => - (await sdk.receivePayment( + Future getDepositAddress() async => (await sdk.receivePayment( request: ReceivePaymentRequest(paymentMethod: ReceivePaymentMethod.bitcoinAddress()))) - .paymentRequest; + .paymentRequest; Future getBalance() async => (await sdk.getInfo(request: GetInfoRequest(ensureSynced: true))).balanceSats; Future registerAddress(String username) async { return (await sdk.registerLightningAddress( - request: RegisterLightningAddressRequest(username: username))) + request: RegisterLightningAddressRequest(username: username))) .lightningAddress; } @@ -65,8 +68,8 @@ class LightningWallet { } } - Future createTransaction(String address, BigInt? amountSats, - BitcoinTransactionPriority? priority) async { + Future createTransaction( + String address, BigInt? amountSats, BitcoinTransactionPriority? priority) async { final inputType = await sdk.parse(input: address); if (inputType is InputType_Bolt11Invoice) { @@ -76,17 +79,18 @@ class LightningWallet { final paymentMethod = prepareResponse.paymentMethod; if (paymentMethod is SendPaymentMethod_Bolt11Invoice) { - // Fees to pay via Lightning final lightningFeeSats = paymentMethod.lightningFeeSats; - // Or fees to pay (if available) via a Spark transfer final sparkTransferFeeSats = paymentMethod.sparkTransferFeeSats; return PendingLightningTransaction( id: paymentMethod.invoiceDetails.paymentHash, amount: ((paymentMethod.invoiceDetails.amountMsat?.toInt() ?? 0) / 1000).round(), fee: lightningFeeSats.toInt() + (sparkTransferFeeSats?.toInt() ?? 0), - commitOverride: () => - sdk.sendPayment(request: SendPaymentRequest(prepareResponse: prepareResponse)), + commitOverride: () async { + final res = await sdk.sendPayment( + request: SendPaymentRequest(prepareResponse: prepareResponse)); + printV(res.payment.status.name); + }, ); } } else if (inputType is InputType_LightningAddress) { @@ -105,20 +109,21 @@ class LightningWallet { id: prepareResponse.invoiceDetails.paymentHash, amount: prepareResponse.invoiceDetails.amountMsat?.toInt() ?? 0, fee: feeSats.toInt(), - commitOverride: () => - sdk.lnurlPay(request: LnurlPayRequest(prepareResponse: prepareResponse)), + commitOverride: () async { + await sdk.lnurlPay(request: LnurlPayRequest(prepareResponse: prepareResponse)); + }, ); } else if (inputType is InputType_BitcoinAddress) { - final request = PrepareSendPaymentRequest( - paymentRequest: inputType.field0.address, amount: amountSats); + final request = + PrepareSendPaymentRequest(paymentRequest: inputType.field0.address, amount: amountSats); final prepareResponse = await sdk.prepareSendPayment(request: request); final paymentMethod = prepareResponse.paymentMethod; if (paymentMethod is SendPaymentMethod_BitcoinAddress) { final feeQuote = paymentMethod.feeQuote; + OnchainConfirmationSpeed onchainConfirmationSpeed; int fee; - switch (priority) { case BitcoinTransactionPriority.fast: fee = (feeQuote.speedFast.userFeeSat + feeQuote.speedFast.l1BroadcastFeeSat).toInt(); @@ -152,6 +157,41 @@ class LightningWallet { // If not returned earlier throw UnimplementedError(); } + + Future> getTransactionHistory() async { + final request = ListPaymentsRequest( + typeFilter: [PaymentType.send, PaymentType.receive], + // statusFilter: [PaymentStatus.completed], + assetFilter: AssetFilter.bitcoin(), + offset: 0, + limit: 50, + sortAscending: false, // Sort order (true = oldest first, false = newest first) + ); + final response = await sdk.listPayments(request: request); + final payments = response.payments; + + Map txHistory = {}; + for (final payment in payments) { + TransactionDirection direction = TransactionDirection.outgoing; + + if (payment.method == PaymentMethod.deposit) { + direction = TransactionDirection.incoming; + } + + txHistory[payment.id] = ElectrumTransactionInfo( + WalletType.bitcoin, + id: payment.id, + amount: payment.amount.toInt(), + direction: direction, + isPending: payment.status == PaymentStatus.pending, + date: DateTime.fromMillisecondsSinceEpoch(payment.timestamp.toInt() * 1000), + confirmations: payment.status == PaymentStatus.pending ? 0 : 10, + + ); + } + + return txHistory; + } } extension _ConfigCopyWith on Config { @@ -172,6 +212,6 @@ extension _ConfigCopyWith on Config { maxDepositClaimFee: maxDepositClaimFee ?? this.maxDepositClaimFee, preferSparkOverLightning: preferSparkOverLightning ?? this.preferSparkOverLightning, useDefaultExternalInputParsers: - useDefaultExternalInputParsers ?? this.useDefaultExternalInputParsers, + useDefaultExternalInputParsers ?? this.useDefaultExternalInputParsers, ); } From 2c311c9eb80a41f351bf6f857d1425b3b42087f8 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Tue, 4 Nov 2025 10:06:01 +0100 Subject: [PATCH 032/105] feat: add LNURL-pay address detection and support in address parsing flow for Bitcoin Lightning integration --- lib/core/address_validator.dart | 1 + lib/entities/lnurlpay_record.dart | 75 +++++++++++++++++++ lib/entities/parse_address_from_domain.dart | 9 +++ lib/entities/parsed_address.dart | 11 ++- .../widgets/extract_address_from_parsed.dart | 5 ++ 5 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 lib/entities/lnurlpay_record.dart diff --git a/lib/core/address_validator.dart b/lib/core/address_validator.dart index df072f8a32..c700835341 100644 --- a/lib/core/address_validator.dart +++ b/lib/core/address_validator.dart @@ -19,6 +19,7 @@ class AddressValidator extends TextValidator { r'^(lightning:)?(lnbc|lntb|lnbs|lnbcrt)[a-z0-9]+$', caseSensitive: false); if (lightningInvoiceRegex.hasMatch(txt)) return true; + if (txt.contains("@")) return true; return BitcoinAddressUtils.validateAddress( address: txt, diff --git a/lib/entities/lnurlpay_record.dart b/lib/entities/lnurlpay_record.dart new file mode 100644 index 0000000000..3fbb01bc3a --- /dev/null +++ b/lib/entities/lnurlpay_record.dart @@ -0,0 +1,75 @@ +import 'dart:convert'; + +import 'package:cw_core/crypto_currency.dart'; +import 'package:cw_core/utils/print_verbose.dart'; +import 'package:cw_core/utils/proxy_wrapper.dart'; + +class LNUrlPayRecord { + LNUrlPayRecord({ + required this.address, + required this.name, + }); + + final String name; + final String address; + + static Future checkWellKnownUsername(String username, CryptoCurrency currency) async { + if (currency != CryptoCurrency.btc) return null; + + // split the string by the @ symbol: + try { + final List splitStrs = username.split("@"); + String name = splitStrs.first.toLowerCase(); + final String domain = splitStrs.last; + + if (splitStrs.length == 3) { + // for username like @alice@domain.org instead of alice@domain.org + name = splitStrs[1]; + } + + if (name.isEmpty) { + name = "_"; + } + + // lookup domain/.well-known/nano-currency.json and check if it has a nano address: + final response = await ProxyWrapper().get( + clearnetUri: Uri.parse("https://$domain/.well-known/lnurlp/$name"), + headers: {"Accept": "application/json"}, + ); + + if (response.statusCode == 200) { + return username; + } + } catch (e) { + printV("error checking well-known username: $e"); + } + return null; + } + + static String formatDomainName(String name) { + String formattedName = name; + + if (name.contains("@")) { + formattedName = name.replaceAll("@", "."); + } + + return formattedName; + } + + static Future fetchAddressAndName({ + required String formattedName, + required CryptoCurrency currency, + }) async { + String name = formattedName; + + printV("formattedName: $formattedName"); + + final address = await checkWellKnownUsername(formattedName, currency); + + if (address == null) { + return null; + } + + return LNUrlPayRecord(address: address, name: name); + } +} diff --git a/lib/entities/parse_address_from_domain.dart b/lib/entities/parse_address_from_domain.dart index 4428108752..a772f49514 100644 --- a/lib/entities/parse_address_from_domain.dart +++ b/lib/entities/parse_address_from_domain.dart @@ -1,6 +1,7 @@ import 'package:cake_wallet/core/address_validator.dart'; import 'package:cake_wallet/core/yat_service.dart'; import 'package:cake_wallet/entities/ens_record.dart'; +import 'package:cake_wallet/entities/lnurlpay_record.dart'; import 'package:cake_wallet/entities/openalias_record.dart'; import 'package:cake_wallet/entities/parsed_address.dart'; import 'package:cake_wallet/entities/unstoppable_domain_address.dart'; @@ -297,6 +298,14 @@ class AddressResolver { return ParsedAddress.fetchWellKnownAddress(address: record.address, name: text); } } + + if (walletType == WalletType.bitcoin && currency == CryptoCurrency.btc) { + final record = + await LNUrlPayRecord.fetchAddressAndName(formattedName: text, currency: currency); + if (record != null) { + return ParsedAddress.fetchLNUrlPayAddress(address: record.address, name: text); + } + } } if (!text.startsWith('@') && text.contains('@') && !text.contains('.')) { diff --git a/lib/entities/parsed_address.dart b/lib/entities/parsed_address.dart index 74acab80a7..a5159cbcf0 100644 --- a/lib/entities/parsed_address.dart +++ b/lib/entities/parsed_address.dart @@ -15,7 +15,8 @@ enum ParseFrom { thorChain, wellKnown, zanoAlias, - bip353 + bip353, + lnurlpay } class ParsedAddress { @@ -175,6 +176,14 @@ class ParsedAddress { ); } + factory ParsedAddress.fetchLNUrlPayAddress({required String address, required String name}) { + return ParsedAddress( + addresses: [address], + name: name, + parseFrom: ParseFrom.lnurlpay, + ); + } + final List addresses; final String name; final String description; diff --git a/lib/src/screens/send/widgets/extract_address_from_parsed.dart b/lib/src/screens/send/widgets/extract_address_from_parsed.dart index b37f87b7ff..74b7439356 100644 --- a/lib/src/screens/send/widgets/extract_address_from_parsed.dart +++ b/lib/src/screens/send/widgets/extract_address_from_parsed.dart @@ -78,6 +78,11 @@ Future extractAddressFromParsed( content = S.of(context).extracted_address_content('${parsedAddress.name} (BIP-353)'); address = parsedAddress.addresses.first; break; + case ParseFrom.lnurlpay: + title = S.of(context).address_detected; + content = S.of(context).extracted_address_content('${parsedAddress.name} (Lightning)'); + address = parsedAddress.addresses.first; + break; case ParseFrom.yatRecord: if (parsedAddress.name.isEmpty) { title = S.of(context).yat_error; From 9ac2850bbeb69eb6ee0aeb001da8aaf22472490c Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Tue, 4 Nov 2025 14:43:22 +0100 Subject: [PATCH 033/105] refactor: simplify `ReceivePageOption` logic --- cw_bitcoin/lib/bitcoin_wallet.dart | 2 + cw_bitcoin/lib/bitcoin_wallet_addresses.dart | 16 ++++ cw_bitcoin/lib/litecoin_wallet_addresses.dart | 20 ++++- {lib/core => cw_core/lib}/payment_uris.dart | 79 +++++-------------- cw_core/lib/wallet_addresses.dart | 8 +- cw_core/pubspec.yaml | 3 +- cw_decred/lib/wallet.dart | 2 +- cw_decred/lib/wallet_addresses.dart | 25 +++--- lib/bitcoin/cw_bitcoin.dart | 24 ------ .../screens/dashboard/pages/address_page.dart | 3 +- .../screens/receive/widgets/qr_widget.dart | 2 +- lib/utils/payment_request.dart | 2 +- .../dashboard/receive_option_view_model.dart | 48 ++--------- .../exchange/exchange_trade_view_model.dart | 2 +- .../wallet_address_list_view_model.dart | 2 +- tool/configure.dart | 2 - 16 files changed, 89 insertions(+), 151 deletions(-) rename {lib/core => cw_core/lib}/payment_uris.dart (87%) diff --git a/cw_bitcoin/lib/bitcoin_wallet.dart b/cw_bitcoin/lib/bitcoin_wallet.dart index 9b212ff5f9..304618e714 100644 --- a/cw_bitcoin/lib/bitcoin_wallet.dart +++ b/cw_bitcoin/lib/bitcoin_wallet.dart @@ -101,6 +101,8 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { apiKey: secrets.breezApiKey, lnurlDomain: "breez.tips", ); + } else { + lightningWallet = null; } payjoinManager = PayjoinManager(PayjoinStorage(payjoinBox), this); diff --git a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart index 8e36ffebf8..91308f630e 100644 --- a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart +++ b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart @@ -1,8 +1,10 @@ import 'package:bitcoin_base/bitcoin_base.dart'; import 'package:blockchain_utils/bip/bip/bip32/bip32.dart'; +import 'package:cw_bitcoin/bitcoin_receive_page_option.dart'; import 'package:cw_bitcoin/electrum_wallet_addresses.dart'; import 'package:cw_bitcoin/payjoin/manager.dart'; import 'package:cw_bitcoin/utils.dart'; +import 'package:cw_core/receive_page_option.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_info.dart'; @@ -89,4 +91,18 @@ abstract class BitcoinWalletAddressesBase extends ElectrumWalletAddresses with S if (!_isPayjoinConnectivityError(e.toString())) rethrow; } } + + @override + List get receivePageOptions { + if (isHardwareWallet) { + return [ + ...BitcoinReceivePageOption.allViewOnly, + ...ReceivePageOptions.where((element) => element != ReceivePageOption.mainnet) + ]; + } + return [ + ...BitcoinReceivePageOption.all, + ...ReceivePageOptions.where((element) => element != ReceivePageOption.mainnet) + ]; + } } diff --git a/cw_bitcoin/lib/litecoin_wallet_addresses.dart b/cw_bitcoin/lib/litecoin_wallet_addresses.dart index 76228c16de..2095d4bd4e 100644 --- a/cw_bitcoin/lib/litecoin_wallet_addresses.dart +++ b/cw_bitcoin/lib/litecoin_wallet_addresses.dart @@ -5,9 +5,11 @@ import 'dart:typed_data'; import 'package:bitcoin_base/bitcoin_base.dart'; import 'package:blockchain_utils/blockchain_utils.dart'; import 'package:cw_bitcoin/bitcoin_address_record.dart'; +import 'package:cw_bitcoin/bitcoin_receive_page_option.dart'; import 'package:cw_bitcoin/bitcoin_unspent.dart'; -import 'package:cw_bitcoin/utils.dart'; import 'package:cw_bitcoin/electrum_wallet_addresses.dart'; +import 'package:cw_bitcoin/utils.dart'; +import 'package:cw_core/receive_page_option.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_info.dart'; @@ -46,6 +48,7 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with bool generating = false; List get scanSecret => mwebHd!.childKey(Bip32KeyIndex(0x80000000)).privateKey.privKey.raw; + List get spendPubkey => mwebHd!.childKey(Bip32KeyIndex(0x80000001)).publicKey.pubKey.compressed; @@ -208,4 +211,19 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with .where((element) => element.type == SegwitAddresType.p2wpkh && !element.isUsed); return addresses.first.address; } + + @override + List get receivePageOptions { + if (Platform.isLinux || Platform.isMacOS || Platform.isWindows || isHardwareWallet) { + return [ + ...BitcoinReceivePageOption.allLitecoin + .where((element) => element != BitcoinReceivePageOption.mweb), + ...ReceivePageOptions.where((element) => element != ReceivePageOption.mainnet) + ]; + } + return [ + ...BitcoinReceivePageOption.allLitecoin, + ...ReceivePageOptions.where((element) => element != ReceivePageOption.mainnet) + ]; + } } diff --git a/lib/core/payment_uris.dart b/cw_core/lib/payment_uris.dart similarity index 87% rename from lib/core/payment_uris.dart rename to cw_core/lib/payment_uris.dart index 38f4f6d2ef..fc2bd2b880 100644 --- a/lib/core/payment_uris.dart +++ b/cw_core/lib/payment_uris.dart @@ -13,10 +13,7 @@ class MoneroURI extends PaymentURI { @override String toString() { var base = 'monero:$address'; - - if (amount.isNotEmpty) { - base += '?tx_amount=${amount.replaceAll(',', '.')}'; - } + if (amount.isNotEmpty) base += '?tx_amount=${amount.replaceAll(',', '.')}'; return base; } @@ -28,10 +25,7 @@ class HavenURI extends PaymentURI { @override String toString() { var base = 'haven:$address'; - - if (amount.isNotEmpty) { - base += '?tx_amount=${amount.replaceAll(',', '.')}'; - } + if (amount.isNotEmpty) base += '?tx_amount=${amount.replaceAll(',', '.')}'; return base; } @@ -62,10 +56,7 @@ class LitecoinURI extends PaymentURI { @override String toString() { var base = 'litecoin:$address'; - - if (amount.isNotEmpty) { - base += '?amount=${amount.replaceAll(',', '.')}'; - } + if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; return base; } @@ -77,10 +68,7 @@ class EthereumURI extends PaymentURI { @override String toString() { var base = 'ethereum:$address'; - - if (amount.isNotEmpty) { - base += '?amount=${amount.replaceAll(',', '.')}'; - } + if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; return base; } @@ -92,10 +80,7 @@ class BaseURI extends PaymentURI { @override String toString() { var base = 'base:$address'; - - if (amount.isNotEmpty) { - base += '?amount=${amount.replaceAll(',', '.')}'; - } + if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; return base; } @@ -122,10 +107,7 @@ class BitcoinCashURI extends PaymentURI { @override String toString() { var base = address; - - if (amount.isNotEmpty) { - base += '?amount=${amount.replaceAll(',', '.')}'; - } + if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; return base; } @@ -151,10 +133,7 @@ class PolygonURI extends PaymentURI { @override String toString() { var base = 'polygon:$address'; - - if (amount.isNotEmpty) { - base += '?amount=${amount.replaceAll(',', '.')}'; - } + if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; return base; } @@ -166,10 +145,7 @@ class SolanaURI extends PaymentURI { @override String toString() { var base = 'solana:$address'; - - if (amount.isNotEmpty) { - base += '?amount=${amount.replaceAll(',', '.')}'; - } + if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; return base; } @@ -181,10 +157,7 @@ class TronURI extends PaymentURI { @override String toString() { var base = 'tron:$address'; - - if (amount.isNotEmpty) { - base += '?amount=${amount.replaceAll(',', '.')}'; - } + if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; return base; } @@ -196,10 +169,7 @@ class WowneroURI extends PaymentURI { @override String toString() { var base = 'wownero:$address'; - - if (amount.isNotEmpty) { - base += '?tx_amount=${amount.replaceAll(',', '.')}'; - } + if (amount.isNotEmpty) base += '?tx_amount=${amount.replaceAll(',', '.')}'; return base; } @@ -211,11 +181,8 @@ class ZanoURI extends PaymentURI { @override String toString() { - var base = 'zano:' + address; - - if (amount.isNotEmpty) { - base += '?amount=${amount.replaceAll(',', '.')}'; - } + var base = 'zano:$address'; + if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; return base; } @@ -227,11 +194,8 @@ class DecredURI extends PaymentURI { @override String toString() { - var base = 'decred:' + address; - - if (amount.isNotEmpty) { - base += '?amount=${amount.replaceAll(',', '.')}'; - } + var base = 'decred:$address'; + if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; return base; } @@ -243,11 +207,8 @@ class DogeURI extends PaymentURI { @override String toString() { - var base = 'doge:' + address; - - if (amount.isNotEmpty) { - base += '?amount=${amount.replaceAll(',', '.')}'; - } + var base = 'doge:$address'; + if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; return base; } @@ -271,13 +232,9 @@ class ERC681URI extends PaymentURI { final targetAddress = contractAddress ?? address; uri += targetAddress; - if (chainId != 1) { - uri += '@$chainId'; - } + if (chainId != 1) uri += '@$chainId'; - if (contractAddress != null) { - uri += '/transfer'; - } + if (contractAddress != null) uri += '/transfer'; final params = {}; diff --git a/cw_core/lib/wallet_addresses.dart b/cw_core/lib/wallet_addresses.dart index 4d4d2c0a5a..ac4128e427 100644 --- a/cw_core/lib/wallet_addresses.dart +++ b/cw_core/lib/wallet_addresses.dart @@ -1,9 +1,10 @@ +import 'package:cw_core/receive_page_option.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_type.dart'; abstract class WalletAddresses { - WalletAddresses(this.walletInfo) + WalletAddresses(this.walletInfo, [this.isTestnet = false]) : addressesMap = {}, allAddressesMap = {}, addressInfos = {}, @@ -17,6 +18,8 @@ abstract class WalletAddresses { final WalletInfo walletInfo; + final bool isTestnet; + String get address; String get latestAddress { @@ -79,4 +82,7 @@ abstract class WalletAddresses { bool containsAddress(String address) => addressesMap.containsKey(address) || allAddressesMap.containsKey(address); + + List get receivePageOptions => ReceivePageOptions; + } diff --git a/cw_core/pubspec.yaml b/cw_core/pubspec.yaml index 7c963f246e..49188f5177 100644 --- a/cw_core/pubspec.yaml +++ b/cw_core/pubspec.yaml @@ -2,11 +2,10 @@ name: cw_core description: A new Flutter package project. version: 0.0.1 publish_to: none -author: Cake Wallet homepage: https://cakewallet.com environment: - sdk: ">=2.17.5 <3.0.0" + sdk: '>=3.0.6 <4.0.0' flutter: ">=1.20.0" dependencies: diff --git a/cw_decred/lib/wallet.dart b/cw_decred/lib/wallet.dart index 432edb4bc0..97c118331b 100644 --- a/cw_decred/lib/wallet.dart +++ b/cw_decred/lib/wallet.dart @@ -54,7 +54,7 @@ abstract class DecredWalletBase derivationInfo.derivationPath == DecredWalletService.pubkeyRestorePathTestnet, super(walletInfo, derivationInfo) { - walletAddresses = DecredWalletAddresses(walletInfo, libwallet); + walletAddresses = DecredWalletAddresses(walletInfo, libwallet, isTestnet); transactionHistory = DecredTransactionHistory(); reaction((_) => isEnabledAutoGenerateSubaddress, (bool enabled) { diff --git a/cw_decred/lib/wallet_addresses.dart b/cw_decred/lib/wallet_addresses.dart index e4af108b9d..96f007c5cc 100644 --- a/cw_decred/lib/wallet_addresses.dart +++ b/cw_decred/lib/wallet_addresses.dart @@ -1,8 +1,8 @@ import 'dart:convert'; +import 'package:cw_core/receive_page_option.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:mobx/mobx.dart'; -import 'package:cw_core/address_info.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:cw_decred/api/libdcrwallet.dart'; @@ -12,9 +12,8 @@ part 'wallet_addresses.g.dart'; class DecredWalletAddresses = DecredWalletAddressesBase with _$DecredWalletAddresses; abstract class DecredWalletAddressesBase extends WalletAddresses with Store { - DecredWalletAddressesBase(WalletInfo walletInfo, Libwallet libwallet) - : _libwallet = libwallet, - super(walletInfo); + DecredWalletAddressesBase(super.walletInfo, Libwallet libwallet, super.isTestnet) + : _libwallet = libwallet; final Libwallet _libwallet; String currentAddr = ''; @@ -26,14 +25,10 @@ abstract class DecredWalletAddressesBase extends WalletAddresses with Store { @override @computed - String get address { - return selectedAddr; - } + String get address => selectedAddr; @override - set address(value) { - selectedAddr = value; - } + set address(value) => selectedAddr = value; @override Future init() async { @@ -145,6 +140,16 @@ abstract class DecredWalletAddressesBase extends WalletAddresses with Store { selectedAddr = addr; await saveAddressesInBox(); } + + @override + List get receivePageOptions { + return isTestnet + ? [ + ReceivePageOption.testnet, + ...ReceivePageOptions.where((element) => element != ReceivePageOption.mainnet) + ] + : ReceivePageOptions; + } } class LibAddresses { diff --git a/lib/bitcoin/cw_bitcoin.dart b/lib/bitcoin/cw_bitcoin.dart index 27ffcef0d0..d26bc20e08 100644 --- a/lib/bitcoin/cw_bitcoin.dart +++ b/lib/bitcoin/cw_bitcoin.dart @@ -304,30 +304,6 @@ class CWBitcoin extends Bitcoin { return bitcoinWallet.walletAddresses.addressPageType == SilentPaymentsAddresType.p2sp; } - @override - List getBitcoinReceivePageOptions(Object wallet) { - final bitcoinWallet = wallet as ElectrumWallet; - final keys = bitcoinWallet.keys; - if (keys.privateKey.isEmpty) { - return BitcoinReceivePageOption.allViewOnly; - } - return BitcoinReceivePageOption.all; - } - - @override - List getLitecoinReceivePageOptions(Object wallet) { - final litecoinWallet = wallet as ElectrumWallet; - if (Platform.isLinux || - Platform.isMacOS || - Platform.isWindows || - litecoinWallet.isHardwareWallet) { - return BitcoinReceivePageOption.allLitecoin - .where((element) => element != BitcoinReceivePageOption.mweb) - .toList(); - } - return BitcoinReceivePageOption.allLitecoin; - } - @override BitcoinAddressType getBitcoinAddressType(ReceivePageOption option) { switch (option) { diff --git a/lib/src/screens/dashboard/pages/address_page.dart b/lib/src/screens/dashboard/pages/address_page.dart index c7e5c8793c..d4a71e37c0 100644 --- a/lib/src/screens/dashboard/pages/address_page.dart +++ b/lib/src/screens/dashboard/pages/address_page.dart @@ -306,8 +306,7 @@ class AddressPage extends BasePage { } break; default: - if (addressListViewModel.type == WalletType.bitcoin || - addressListViewModel.type == WalletType.litecoin) { + if ([WalletType.bitcoin, WalletType.litecoin].contains(addressListViewModel.type)) { addressListViewModel.setAddressType(bitcoin!.getBitcoinAddressType(option)); } } diff --git a/lib/src/screens/receive/widgets/qr_widget.dart b/lib/src/screens/receive/widgets/qr_widget.dart index 6a40850b64..7e4df944c8 100644 --- a/lib/src/screens/receive/widgets/qr_widget.dart +++ b/lib/src/screens/receive/widgets/qr_widget.dart @@ -1,4 +1,4 @@ -import 'package:cake_wallet/core/payment_uris.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cake_wallet/entities/qr_view_data.dart'; import 'package:cake_wallet/src/widgets/primary_button.dart'; import 'package:cake_wallet/routes.dart'; diff --git a/lib/utils/payment_request.dart b/lib/utils/payment_request.dart index b574ab260d..6149379d71 100644 --- a/lib/utils/payment_request.dart +++ b/lib/utils/payment_request.dart @@ -1,4 +1,4 @@ -import 'package:cake_wallet/core/payment_uris.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cake_wallet/nano/nano.dart'; class PaymentRequest { diff --git a/lib/view_model/dashboard/receive_option_view_model.dart b/lib/view_model/dashboard/receive_option_view_model.dart index 8aab2736d6..69b47e7b9f 100644 --- a/lib/view_model/dashboard/receive_option_view_model.dart +++ b/lib/view_model/dashboard/receive_option_view_model.dart @@ -11,59 +11,21 @@ class ReceiveOptionViewModel = ReceiveOptionViewModelBase with _$ReceiveOptionVi abstract class ReceiveOptionViewModelBase with Store { ReceiveOptionViewModelBase(this._wallet, this.initialPageOption) : selectedReceiveOption = initialPageOption ?? - (_wallet.type == WalletType.bitcoin || - _wallet.type == WalletType.litecoin + ([WalletType.bitcoin, WalletType.litecoin].contains(_wallet.type) ? bitcoin!.getSelectedAddressType(_wallet) - : (_wallet.type == WalletType.decred && _wallet.isTestnet) + : (_wallet.type == WalletType.decred && _wallet.isTestnet) ? ReceivePageOption.testnet - : ReceivePageOption.mainnet), - _options = [] { - final walletType = _wallet.type; - switch (walletType) { - case WalletType.bitcoin: - _options = [ - ...bitcoin!.getBitcoinReceivePageOptions(_wallet), - ...ReceivePageOptions.where((element) => element != ReceivePageOption.mainnet) - ]; - break; - case WalletType.litecoin: - _options = [ - ...bitcoin!.getLitecoinReceivePageOptions(_wallet), - ...ReceivePageOptions.where((element) => element != ReceivePageOption.mainnet) - ]; - break; - case WalletType.haven: - _options = [ReceivePageOption.mainnet]; - break; - case WalletType.decred: - if (_wallet.isTestnet) { - _options = [ - ReceivePageOption.testnet, - ...ReceivePageOptions.where( - (element) => element != ReceivePageOption.mainnet) - ]; - } else { - _options = ReceivePageOptions; - } - break; - default: - _options = ReceivePageOptions; - } - } + : ReceivePageOption.mainnet); final WalletBase _wallet; final ReceivePageOption? initialPageOption; - List _options; - @observable ReceivePageOption selectedReceiveOption; - List get options => _options; + List get options => _wallet.walletAddresses.receivePageOptions; @action - void selectReceiveOption(ReceivePageOption option) { - selectedReceiveOption = option; - } + void selectReceiveOption(ReceivePageOption option) => selectedReceiveOption = option; } diff --git a/lib/view_model/exchange/exchange_trade_view_model.dart b/lib/view_model/exchange/exchange_trade_view_model.dart index fec47f3f35..3f4240cf21 100644 --- a/lib/view_model/exchange/exchange_trade_view_model.dart +++ b/lib/view_model/exchange/exchange_trade_view_model.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'package:cake_wallet/core/payment_uris.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cake_wallet/entities/calculate_fiat_amount.dart'; import 'package:cake_wallet/entities/fiat_currency.dart'; import 'package:cake_wallet/exchange/exchange_provider_description.dart'; diff --git a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart index fd6b29bdd5..adc60cad02 100644 --- a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart +++ b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart @@ -4,7 +4,7 @@ import 'dart:core'; import 'package:cake_wallet/base/base.dart'; import 'package:cake_wallet/bitcoin/bitcoin.dart'; import 'package:cake_wallet/core/fiat_conversion_service.dart'; -import 'package:cake_wallet/core/payment_uris.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cake_wallet/core/wallet_change_listener_view_model.dart'; import 'package:cake_wallet/entities/auto_generate_subaddress_status.dart'; import 'package:cake_wallet/entities/fiat_api_mode.dart'; diff --git a/tool/configure.dart b/tool/configure.dart index dbca11d49f..7534457aca 100644 --- a/tool/configure.dart +++ b/tool/configure.dart @@ -228,8 +228,6 @@ abstract class Bitcoin { Map> getElectrumDerivations(); Future setAddressType(Object wallet, dynamic option); ReceivePageOption getSelectedAddressType(Object wallet); - List getBitcoinReceivePageOptions(Object wallet); - List getLitecoinReceivePageOptions(Object wallet); BitcoinAddressType getBitcoinAddressType(ReceivePageOption option); bool isPayjoinAvailable(Object wallet); bool hasSelectedSilentPayments(Object wallet); From b0baf54dadfa27a35999f8dc597376535b718976 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Tue, 4 Nov 2025 16:24:15 +0100 Subject: [PATCH 034/105] refactor: centralize `PaymentURI` generation logic across wallet types --- cw_bitcoin/lib/bitcoin_wallet_addresses.dart | 5 +++++ cw_bitcoin/lib/electrum_wallet_addresses.dart | 4 ++++ cw_bitcoin/lib/litecoin_wallet_addresses.dart | 4 ++++ .../lib/src/bitcoin_cash_wallet_addresses.dart | 4 ++++ cw_core/lib/payment_uris.dart | 12 ------------ cw_core/lib/wallet_addresses.dart | 6 ++++-- cw_decred/lib/wallet_addresses.dart | 4 ++++ .../lib/src/dogecoin_wallet_addresses.dart | 4 ++++ cw_evm/lib/evm_chain_wallet.dart | 2 +- cw_evm/lib/evm_chain_wallet_addresses.dart | 17 ++++++++++++++++- cw_monero/lib/monero_wallet_addresses.dart | 5 ++++- cw_nano/lib/nano_wallet_addresses.dart | 5 +++++ cw_solana/lib/solana_wallet_addresses.dart | 4 ++++ cw_tron/lib/tron_wallet_addresses.dart | 4 ++++ cw_wownero/lib/wownero_wallet_addresses.dart | 6 ++++-- cw_zano/lib/zano_wallet_addresses.dart | 5 ++++- .../exchange/exchange_trade_view_model.dart | 2 -- 17 files changed, 71 insertions(+), 22 deletions(-) diff --git a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart index 91308f630e..3f572e2401 100644 --- a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart +++ b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart @@ -4,6 +4,7 @@ import 'package:cw_bitcoin/bitcoin_receive_page_option.dart'; import 'package:cw_bitcoin/electrum_wallet_addresses.dart'; import 'package:cw_bitcoin/payjoin/manager.dart'; import 'package:cw_bitcoin/utils.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/receive_page_option.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/utils/print_verbose.dart'; @@ -105,4 +106,8 @@ abstract class BitcoinWalletAddressesBase extends ElectrumWalletAddresses with S ...ReceivePageOptions.where((element) => element != ReceivePageOption.mainnet) ]; } + + @override + PaymentURI getPaymentUri(String amount) => + BitcoinURI(amount: amount, address: address, pjUri: payjoinEndpoint ?? ''); } diff --git a/cw_bitcoin/lib/electrum_wallet_addresses.dart b/cw_bitcoin/lib/electrum_wallet_addresses.dart index 7ef455793f..18de7eb3ad 100644 --- a/cw_bitcoin/lib/electrum_wallet_addresses.dart +++ b/cw_bitcoin/lib/electrum_wallet_addresses.dart @@ -7,6 +7,7 @@ import 'package:cw_bitcoin/bitcoin_unspent.dart'; import 'package:cw_bitcoin/lightning/lightning_addres_type.dart'; import 'package:cw_bitcoin/lightning/lightning_wallet.dart'; import 'package:cw_core/pathForWallet.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_addresses.dart'; @@ -765,4 +766,7 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { await lightningWallet!.registerAddress(walletName.replaceAll(" ", "").toLowerCase()); } } + + @override + PaymentURI getPaymentUri(String amount) => BitcoinURI(amount: amount, address: address); } diff --git a/cw_bitcoin/lib/litecoin_wallet_addresses.dart b/cw_bitcoin/lib/litecoin_wallet_addresses.dart index 2095d4bd4e..8d6e24b5f8 100644 --- a/cw_bitcoin/lib/litecoin_wallet_addresses.dart +++ b/cw_bitcoin/lib/litecoin_wallet_addresses.dart @@ -9,6 +9,7 @@ import 'package:cw_bitcoin/bitcoin_receive_page_option.dart'; import 'package:cw_bitcoin/bitcoin_unspent.dart'; import 'package:cw_bitcoin/electrum_wallet_addresses.dart'; import 'package:cw_bitcoin/utils.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/receive_page_option.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/utils/print_verbose.dart'; @@ -226,4 +227,7 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with ...ReceivePageOptions.where((element) => element != ReceivePageOption.mainnet) ]; } + + @override + PaymentURI getPaymentUri(String amount) => LitecoinURI(amount: amount, address: address); } diff --git a/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_addresses.dart b/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_addresses.dart index fe0ebc8284..681fc00d73 100644 --- a/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_addresses.dart +++ b/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_addresses.dart @@ -2,6 +2,7 @@ import 'package:bitcoin_base/bitcoin_base.dart'; import 'package:blockchain_utils/blockchain_utils.dart'; import 'package:cw_bitcoin/electrum_wallet_addresses.dart'; import 'package:cw_bitcoin/utils.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:mobx/mobx.dart'; @@ -28,4 +29,7 @@ abstract class BitcoinCashWalletAddressesBase extends ElectrumWalletAddresses wi required Bip32Slip10Secp256k1 hd, BitcoinAddressType? addressType}) => generateP2PKHAddress(hd: hd, index: index, network: network); + + @override + PaymentURI getPaymentUri(String amount) => BitcoinCashURI(amount: amount, address: address); } diff --git a/cw_core/lib/payment_uris.dart b/cw_core/lib/payment_uris.dart index fc2bd2b880..b4ba788e51 100644 --- a/cw_core/lib/payment_uris.dart +++ b/cw_core/lib/payment_uris.dart @@ -19,18 +19,6 @@ class MoneroURI extends PaymentURI { } } -class HavenURI extends PaymentURI { - HavenURI({required super.amount, required super.address}); - - @override - String toString() { - var base = 'haven:$address'; - if (amount.isNotEmpty) base += '?tx_amount=${amount.replaceAll(',', '.')}'; - - return base; - } -} - class BitcoinURI extends PaymentURI { BitcoinURI({required super.amount, required super.address, this.pjUri = ''}); diff --git a/cw_core/lib/wallet_addresses.dart b/cw_core/lib/wallet_addresses.dart index ac4128e427..b2d28df7df 100644 --- a/cw_core/lib/wallet_addresses.dart +++ b/cw_core/lib/wallet_addresses.dart @@ -1,3 +1,4 @@ +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/receive_page_option.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_info.dart'; @@ -23,8 +24,8 @@ abstract class WalletAddresses { String get address; String get latestAddress { - if (walletInfo.type == WalletType.monero || walletInfo.type == WalletType.wownero) { - if (addressesMap.keys.length == 0) return address; + if ([WalletType.monero, WalletType.wownero].contains(walletInfo.type)) { + if (addressesMap.keys.isEmpty) return address; return addressesMap[addressesMap.keys.last] ?? address; } return _localAddress ?? address; @@ -85,4 +86,5 @@ abstract class WalletAddresses { List get receivePageOptions => ReceivePageOptions; + PaymentURI getPaymentUri(String amount); } diff --git a/cw_decred/lib/wallet_addresses.dart b/cw_decred/lib/wallet_addresses.dart index 96f007c5cc..f7d0a8baec 100644 --- a/cw_decred/lib/wallet_addresses.dart +++ b/cw_decred/lib/wallet_addresses.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/receive_page_option.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:mobx/mobx.dart'; @@ -150,6 +151,9 @@ abstract class DecredWalletAddressesBase extends WalletAddresses with Store { ] : ReceivePageOptions; } + + @override + PaymentURI getPaymentUri(String amount) => DecredURI(amount: amount, address: address); } class LibAddresses { diff --git a/cw_dogecoin/lib/src/dogecoin_wallet_addresses.dart b/cw_dogecoin/lib/src/dogecoin_wallet_addresses.dart index 75d06c1484..3dc72526fd 100644 --- a/cw_dogecoin/lib/src/dogecoin_wallet_addresses.dart +++ b/cw_dogecoin/lib/src/dogecoin_wallet_addresses.dart @@ -2,6 +2,7 @@ import 'package:bitcoin_base/bitcoin_base.dart'; import 'package:blockchain_utils/blockchain_utils.dart'; import 'package:cw_bitcoin/electrum_wallet_addresses.dart'; import 'package:cw_bitcoin/utils.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:mobx/mobx.dart'; @@ -26,4 +27,7 @@ abstract class DogeCoinWalletAddressesBase extends ElectrumWalletAddresses with required Bip32Slip10Secp256k1 hd, BitcoinAddressType? addressType}) => generateP2PKHAddress(hd: hd, index: index, network: network); + + @override + PaymentURI getPaymentUri(String amount) => DogeURI(amount: amount, address: address); } diff --git a/cw_evm/lib/evm_chain_wallet.dart b/cw_evm/lib/evm_chain_wallet.dart index 0db8781c7a..f952117485 100644 --- a/cw_evm/lib/evm_chain_wallet.dart +++ b/cw_evm/lib/evm_chain_wallet.dart @@ -82,7 +82,7 @@ abstract class EVMChainWalletBase _hexPrivateKey = privateKey, _isTransactionUpdating = false, _client = client, - walletAddresses = EVMChainWalletAddresses(walletInfo), + walletAddresses = EVMChainWalletAddresses(walletInfo, client.chainId), balance = ObservableMap.of( { // Not sure of this yet, will it work? will it not? diff --git a/cw_evm/lib/evm_chain_wallet_addresses.dart b/cw_evm/lib/evm_chain_wallet_addresses.dart index 7dd501cc5e..bfa4938a32 100644 --- a/cw_evm/lib/evm_chain_wallet_addresses.dart +++ b/cw_evm/lib/evm_chain_wallet_addresses.dart @@ -1,5 +1,6 @@ import 'dart:developer'; +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:mobx/mobx.dart'; @@ -9,10 +10,12 @@ part 'evm_chain_wallet_addresses.g.dart'; class EVMChainWalletAddresses = EVMChainWalletAddressesBase with _$EVMChainWalletAddresses; abstract class EVMChainWalletAddressesBase extends WalletAddresses with Store { - EVMChainWalletAddressesBase(WalletInfo walletInfo) + EVMChainWalletAddressesBase(WalletInfo walletInfo, this.chainId) : address = '', super(walletInfo); + final int chainId; + @override @observable String address; @@ -36,4 +39,16 @@ abstract class EVMChainWalletAddressesBase extends WalletAddresses with Store { log(e.toString()); } } + + @override + PaymentURI getPaymentUri(String amount) { + switch (chainId) { + case 8453: + return BaseURI(amount: amount, address: address); + case 137: + return PolygonURI(amount: amount, address: address); + default: + return EthereumURI(amount: amount, address: address); + } + } } diff --git a/cw_monero/lib/monero_wallet_addresses.dart b/cw_monero/lib/monero_wallet_addresses.dart index 0b38ac5fd6..51c3e0f0a9 100644 --- a/cw_monero/lib/monero_wallet_addresses.dart +++ b/cw_monero/lib/monero_wallet_addresses.dart @@ -1,5 +1,5 @@ import 'package:cw_core/account.dart'; -import 'package:cw_core/address_info.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/subaddress.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_addresses.dart'; @@ -155,4 +155,7 @@ abstract class MoneroWalletAddressesBase extends WalletAddresses with Store { @override bool containsAddress(String address) => addressInfos[account?.id ?? 0]?.any((it) => it.address == address) ?? false; + + @override + PaymentURI getPaymentUri(String amount) => MoneroURI(amount: amount, address: address); } diff --git a/cw_nano/lib/nano_wallet_addresses.dart b/cw_nano/lib/nano_wallet_addresses.dart index f1ff14a854..f52cf4ca1f 100644 --- a/cw_nano/lib/nano_wallet_addresses.dart +++ b/cw_nano/lib/nano_wallet_addresses.dart @@ -1,4 +1,5 @@ import 'package:cw_core/cake_hive.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; @@ -15,6 +16,7 @@ abstract class NanoWalletAddressesBase extends WalletAddresses with Store { : accountList = NanoAccountList(walletInfo.address), address = '', super(walletInfo); + @override @observable String address; @@ -51,4 +53,7 @@ abstract class NanoWalletAddressesBase extends WalletAddresses with Store { printV(e.toString()); } } + + @override + PaymentURI getPaymentUri(String amount) => NanoURI(amount: amount, address: address); } diff --git a/cw_solana/lib/solana_wallet_addresses.dart b/cw_solana/lib/solana_wallet_addresses.dart index 7e9bd90089..634c73f375 100644 --- a/cw_solana/lib/solana_wallet_addresses.dart +++ b/cw_solana/lib/solana_wallet_addresses.dart @@ -1,3 +1,4 @@ +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; @@ -34,4 +35,7 @@ abstract class SolanaWalletAddressesBase extends WalletAddresses with Store { printV(e.toString()); } } + + @override + PaymentURI getPaymentUri(String amount) => SolanaURI(amount: amount, address: address); } diff --git a/cw_tron/lib/tron_wallet_addresses.dart b/cw_tron/lib/tron_wallet_addresses.dart index 095f97fa9a..99767e9654 100644 --- a/cw_tron/lib/tron_wallet_addresses.dart +++ b/cw_tron/lib/tron_wallet_addresses.dart @@ -1,5 +1,6 @@ import 'dart:developer'; +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:mobx/mobx.dart'; @@ -36,4 +37,7 @@ abstract class TronWalletAddressesBase extends WalletAddresses with Store { log(e.toString()); } } + + @override + PaymentURI getPaymentUri(String amount) => TronURI(amount: amount, address: address); } diff --git a/cw_wownero/lib/wownero_wallet_addresses.dart b/cw_wownero/lib/wownero_wallet_addresses.dart index 936c187247..c95d397631 100644 --- a/cw_wownero/lib/wownero_wallet_addresses.dart +++ b/cw_wownero/lib/wownero_wallet_addresses.dart @@ -1,10 +1,9 @@ import 'package:cw_core/account.dart'; -import 'package:cw_core/address_info.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/subaddress.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; -import 'package:cw_wownero/api/transaction_history.dart'; import 'package:cw_wownero/api/subaddress_list.dart' as subaddress_list; import 'package:cw_wownero/api/wallet.dart'; import 'package:cw_wownero/wownero_account_list.dart'; @@ -151,4 +150,7 @@ abstract class WowneroWalletAddressesBase extends WalletAddresses with Store { @override bool containsAddress(String address) => addressInfos[account?.id ?? 0]?.any((it) => it.address == address) ?? false; + + @override + PaymentURI getPaymentUri(String amount) => WowneroURI(amount: amount, address: address); } diff --git a/cw_zano/lib/zano_wallet_addresses.dart b/cw_zano/lib/zano_wallet_addresses.dart index 39e61be7f0..1562ea8eee 100644 --- a/cw_zano/lib/zano_wallet_addresses.dart +++ b/cw_zano/lib/zano_wallet_addresses.dart @@ -1,7 +1,7 @@ +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; -import 'package:cw_zano/zano_wallet_api.dart'; import 'package:mobx/mobx.dart'; part 'zano_wallet_addresses.g.dart'; @@ -38,4 +38,7 @@ abstract class ZanoWalletAddressesBase extends WalletAddresses with Store { printV(e.toString()); } } + + @override + PaymentURI getPaymentUri(String amount) => ZanoURI(amount: amount, address: address); } diff --git a/lib/view_model/exchange/exchange_trade_view_model.dart b/lib/view_model/exchange/exchange_trade_view_model.dart index 3f4240cf21..09b478da79 100644 --- a/lib/view_model/exchange/exchange_trade_view_model.dart +++ b/lib/view_model/exchange/exchange_trade_view_model.dart @@ -442,8 +442,6 @@ abstract class ExchangeTradeViewModelBase with Store { return ZanoURI(amount: amount, address: inputAddress); case WalletType.decred: return DecredURI(amount: amount, address: inputAddress); - case WalletType.haven: - return HavenURI(amount: amount, address: inputAddress); case WalletType.nano: return NanoURI(amount: amount, address: inputAddress); default: From 689c56ea8d7d09c191bab0306ae9f5852055ec04 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Tue, 4 Nov 2025 20:51:58 +0100 Subject: [PATCH 035/105] feat: enhance `PaymentURI` handling with asynchronous support and Lightning-specific functionality --- cw_bitcoin/lib/bitcoin_wallet_addresses.dart | 12 ++++ .../lib/lightning/lightning_wallet.dart | 14 +++- cw_core/lib/payment_uris.dart | 14 ++++ cw_core/lib/wallet_addresses.dart | 7 ++ .../wallet_address_list_view_model.dart | 70 ++++++------------- 5 files changed, 66 insertions(+), 51 deletions(-) diff --git a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart index 3f572e2401..9cc085587c 100644 --- a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart +++ b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart @@ -2,8 +2,10 @@ import 'package:bitcoin_base/bitcoin_base.dart'; import 'package:blockchain_utils/bip/bip/bip32/bip32.dart'; import 'package:cw_bitcoin/bitcoin_receive_page_option.dart'; import 'package:cw_bitcoin/electrum_wallet_addresses.dart'; +import 'package:cw_bitcoin/lightning/lightning_addres_type.dart'; import 'package:cw_bitcoin/payjoin/manager.dart'; import 'package:cw_bitcoin/utils.dart'; +import 'package:cw_core/parse_fixed.dart'; import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/receive_page_option.dart'; import 'package:cw_core/unspent_coin_type.dart'; @@ -110,4 +112,14 @@ abstract class BitcoinWalletAddressesBase extends ElectrumWalletAddresses with S @override PaymentURI getPaymentUri(String amount) => BitcoinURI(amount: amount, address: address, pjUri: payjoinEndpoint ?? ''); + + Future getPaymentRequestUri(String amount) async { + if (addressPageType is LightningAddressType && lightningWallet != null) { + final amountSats = amount.isNotEmpty ? parseFixed(amount, 9) : null; + final invoice = await lightningWallet!.getBolt11Invoice(amountSats, "Send to Cake Wallet"); + return LightningPaymentRequest(address: address, amount: amount, bolt11Invoice: invoice); + } + print(amount); + return getPaymentUri(amount); + } } diff --git a/cw_bitcoin/lib/lightning/lightning_wallet.dart b/cw_bitcoin/lib/lightning/lightning_wallet.dart index 6ae40da518..4d44dc3b58 100644 --- a/cw_bitcoin/lib/lightning/lightning_wallet.dart +++ b/cw_bitcoin/lib/lightning/lightning_wallet.dart @@ -59,6 +59,19 @@ class LightningWallet { .lightningAddress; } + Future getBolt11Invoice(BigInt? amount, String description) async { + final response = await sdk.receivePayment( + request: ReceivePaymentRequest( + paymentMethod: ReceivePaymentMethod.bolt11Invoice( + description: description, + amountSats: amount, + ), + ), + ); + + return response.paymentRequest; + } + Future isCompatible(String input) async { try { final inputType = await sdk.parse(input: input); @@ -186,7 +199,6 @@ class LightningWallet { isPending: payment.status == PaymentStatus.pending, date: DateTime.fromMillisecondsSinceEpoch(payment.timestamp.toInt() * 1000), confirmations: payment.status == PaymentStatus.pending ? 0 : 10, - ); } diff --git a/cw_core/lib/payment_uris.dart b/cw_core/lib/payment_uris.dart index b4ba788e51..806726d4d9 100644 --- a/cw_core/lib/payment_uris.dart +++ b/cw_core/lib/payment_uris.dart @@ -34,10 +34,24 @@ class BitcoinURI extends PaymentURI { qp['pj'] = pjUri; } + print(qp); return Uri(scheme: 'bitcoin', path: address, queryParameters: qp).toString(); } } +class LightningPaymentRequest extends PaymentURI { + LightningPaymentRequest({ + required super.amount, + required super.address, + required this.bolt11Invoice, + }); + + final String bolt11Invoice; + + @override + String toString() => bolt11Invoice; +} + class LitecoinURI extends PaymentURI { LitecoinURI({required super.amount, required super.address}); diff --git a/cw_core/lib/wallet_addresses.dart b/cw_core/lib/wallet_addresses.dart index b2d28df7df..c802065202 100644 --- a/cw_core/lib/wallet_addresses.dart +++ b/cw_core/lib/wallet_addresses.dart @@ -86,5 +86,12 @@ abstract class WalletAddresses { List get receivePageOptions => ReceivePageOptions; + /// Get a [PaymentURI] for the current [address] + /// e.g. ethereum:0x0 PaymentURI getPaymentUri(String amount); + + + /// Get a [PaymentURI] for the current [address] asynchronously + /// this can be used if a payment requires a api call beforehand + Future getPaymentRequestUri(String amount) async => getPaymentRequestUri(amount); } diff --git a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart index adc60cad02..92f4c24a78 100644 --- a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart +++ b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart @@ -1,11 +1,11 @@ -import 'dart:developer' as dev; import 'dart:core'; +import 'dart:developer' as dev; import 'package:cake_wallet/base/base.dart'; import 'package:cake_wallet/bitcoin/bitcoin.dart'; import 'package:cake_wallet/core/fiat_conversion_service.dart'; -import 'package:cw_core/payment_uris.dart'; import 'package:cake_wallet/core/wallet_change_listener_view_model.dart'; +import 'package:cake_wallet/decred/decred.dart'; import 'package:cake_wallet/entities/auto_generate_subaddress_status.dart'; import 'package:cake_wallet/entities/fiat_api_mode.dart'; import 'package:cake_wallet/entities/fiat_currency.dart'; @@ -16,23 +16,23 @@ import 'package:cake_wallet/polygon/polygon.dart'; import 'package:cake_wallet/arbitrum/arbitrum.dart'; import 'package:cake_wallet/reactions/wallet_utils.dart'; import 'package:cake_wallet/solana/solana.dart'; -import 'package:cake_wallet/decred/decred.dart'; import 'package:cake_wallet/store/app_store.dart'; import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart'; import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/store/yat/yat_store.dart'; import 'package:cake_wallet/tron/tron.dart'; -import 'package:cake_wallet/utils/qr_util.dart'; -import 'package:cake_wallet/zano/zano.dart'; import 'package:cake_wallet/utils/list_item.dart'; +import 'package:cake_wallet/utils/qr_util.dart'; import 'package:cake_wallet/view_model/wallet_address_list/wallet_account_list_header.dart'; import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_hidden_list_header.dart'; import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_header.dart'; import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_item.dart'; import 'package:cake_wallet/wownero/wownero.dart'; +import 'package:cake_wallet/zano/zano.dart'; import 'package:cw_core/amount_converter.dart'; import 'package:cw_core/currency.dart'; import 'package:cw_core/currency_for_wallet_type.dart'; +import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:intl/intl.dart'; import 'package:mobx/mobx.dart'; @@ -49,9 +49,7 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo }) : _baseItems = [], selectedCurrency = walletTypeToCryptoCurrency(appStore.wallet!.type), _cryptoNumberFormat = NumberFormat(_cryptoNumberPattern), - hasAccounts = [WalletType.monero, WalletType.wownero, WalletType.haven] - .contains(appStore.wallet!.type), - amount = '', + hasAccounts = [WalletType.monero, WalletType.wownero].contains(appStore.wallet!.type), _settingsStore = appStore.settingsStore, super(appStore: appStore) { _init(); @@ -62,7 +60,7 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo _init(); selectedCurrency = walletTypeToCryptoCurrency(wallet.type); - hasAccounts = [WalletType.monero, WalletType.wownero, WalletType.haven].contains(wallet.type); + hasAccounts = [WalletType.monero, WalletType.wownero].contains(wallet.type); } static const String _cryptoNumberPattern = '0.00000000'; @@ -95,7 +93,7 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo int get selectedCurrencyIndex => currencies.indexOf(selectedCurrency); @observable - String amount; + String amount = ''; @computed WalletType get type => wallet.type; @@ -112,46 +110,14 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo bool get isPayjoinUnavailable => wallet.type == WalletType.bitcoin && _settingsStore.usePayjoin && payjoinEndpoint.isEmpty; - @computed - PaymentURI get uri { - switch (wallet.type) { - case WalletType.monero: - return MoneroURI(amount: amount, address: address.address); - case WalletType.haven: - return HavenURI(amount: amount, address: address.address); - case WalletType.bitcoin: - return BitcoinURI(amount: amount, address: address.address, pjUri: payjoinEndpoint); - case WalletType.litecoin: - return LitecoinURI(amount: amount, address: address.address); - case WalletType.ethereum: - return EthereumURI(amount: amount, address: address.address); - case WalletType.bitcoinCash: - return BitcoinCashURI(amount: amount, address: address.address); - case WalletType.banano: - return NanoURI(amount: amount, address: address.address); - case WalletType.nano: - return NanoURI(amount: amount, address: address.address); - case WalletType.polygon: - return PolygonURI(amount: amount, address: address.address); - case WalletType.solana: - return SolanaURI(amount: amount, address: address.address); - case WalletType.tron: - return TronURI(amount: amount, address: address.address); - case WalletType.wownero: - return WowneroURI(amount: amount, address: address.address); - case WalletType.zano: - return ZanoURI(amount: amount, address: address.address); - case WalletType.decred: - return DecredURI(amount: amount, address: address.address); - case WalletType.dogecoin: - return DogeURI(amount: amount, address: address.address); - case WalletType.base: - return BaseURI(amount: amount, address: address.address); - case WalletType.arbitrum: - return ArbitrumURI(amount: amount, address: address.address); - case WalletType.none: - throw Exception('Unexpected type: ${type.toString()}'); - } + @observable + late PaymentURI uri; + + @action + Future refreshUri() async { + print(amount); + uri = await wallet.walletAddresses.getPaymentRequestUri(amount); + print(uri); } @computed @@ -518,6 +484,7 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo void _init() { _baseItems = []; + uri = wallet.walletAddresses.getPaymentUri(amount); if (wallet.walletAddresses.hiddenAddresses.isNotEmpty) { _baseItems.add(WalletAddressHiddenListHeader()); @@ -537,6 +504,9 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo if (wallet.isEnabledAutoGenerateSubaddress) { wallet.walletAddresses.address = wallet.walletAddresses.latestAddress; } + + reaction((_) => amount, (_) => refreshUri()); + reaction((_) => address, (_) => refreshUri()); } @action From e0932b4e9af2e331a54a92b423443d9d7167f13c Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Tue, 4 Nov 2025 21:52:00 +0100 Subject: [PATCH 036/105] refactor: streamline `PaymentURI` logic and remove redundant URI implementations across wallet types --- cw_bitcoin/lib/bitcoin_wallet_addresses.dart | 2 +- cw_bitcoin/lib/electrum_wallet_addresses.dart | 4 - cw_bitcoin/lib/litecoin_wallet_addresses.dart | 4 - .../src/bitcoin_cash_wallet_addresses.dart | 2 +- .../lib/hardware/device_connection_type.dart | 6 + cw_core/lib/payment_uris.dart | 249 ++++++------------ cw_core/lib/wallet_addresses.dart | 9 +- cw_decred/lib/wallet_addresses.dart | 77 +++--- .../lib/src/dogecoin_wallet_addresses.dart | 14 +- cw_evm/lib/evm_chain_wallet.dart | 2 +- cw_evm/lib/evm_chain_wallet_addresses.dart | 17 +- cw_monero/lib/monero_wallet_addresses.dart | 2 +- cw_nano/lib/nano_wallet_addresses.dart | 4 - cw_solana/lib/solana_wallet_addresses.dart | 4 - cw_tron/lib/tron_wallet_addresses.dart | 4 - cw_wownero/lib/wownero_wallet_addresses.dart | 5 +- cw_zano/lib/zano_wallet_addresses.dart | 4 - .../exchange/exchange_trade_view_model.dart | 26 +- .../wallet_address_list_view_model.dart | 2 - 19 files changed, 147 insertions(+), 290 deletions(-) diff --git a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart index 9cc085587c..7df16b020e 100644 --- a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart +++ b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart @@ -111,7 +111,7 @@ abstract class BitcoinWalletAddressesBase extends ElectrumWalletAddresses with S @override PaymentURI getPaymentUri(String amount) => - BitcoinURI(amount: amount, address: address, pjUri: payjoinEndpoint ?? ''); + BitcoinURI(address: address, amount: amount, pjUri: payjoinEndpoint ?? ''); Future getPaymentRequestUri(String amount) async { if (addressPageType is LightningAddressType && lightningWallet != null) { diff --git a/cw_bitcoin/lib/electrum_wallet_addresses.dart b/cw_bitcoin/lib/electrum_wallet_addresses.dart index 18de7eb3ad..7ef455793f 100644 --- a/cw_bitcoin/lib/electrum_wallet_addresses.dart +++ b/cw_bitcoin/lib/electrum_wallet_addresses.dart @@ -7,7 +7,6 @@ import 'package:cw_bitcoin/bitcoin_unspent.dart'; import 'package:cw_bitcoin/lightning/lightning_addres_type.dart'; import 'package:cw_bitcoin/lightning/lightning_wallet.dart'; import 'package:cw_core/pathForWallet.dart'; -import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_addresses.dart'; @@ -766,7 +765,4 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { await lightningWallet!.registerAddress(walletName.replaceAll(" ", "").toLowerCase()); } } - - @override - PaymentURI getPaymentUri(String amount) => BitcoinURI(amount: amount, address: address); } diff --git a/cw_bitcoin/lib/litecoin_wallet_addresses.dart b/cw_bitcoin/lib/litecoin_wallet_addresses.dart index 8d6e24b5f8..2095d4bd4e 100644 --- a/cw_bitcoin/lib/litecoin_wallet_addresses.dart +++ b/cw_bitcoin/lib/litecoin_wallet_addresses.dart @@ -9,7 +9,6 @@ import 'package:cw_bitcoin/bitcoin_receive_page_option.dart'; import 'package:cw_bitcoin/bitcoin_unspent.dart'; import 'package:cw_bitcoin/electrum_wallet_addresses.dart'; import 'package:cw_bitcoin/utils.dart'; -import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/receive_page_option.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/utils/print_verbose.dart'; @@ -227,7 +226,4 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with ...ReceivePageOptions.where((element) => element != ReceivePageOption.mainnet) ]; } - - @override - PaymentURI getPaymentUri(String amount) => LitecoinURI(amount: amount, address: address); } diff --git a/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_addresses.dart b/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_addresses.dart index 681fc00d73..25c11b7639 100644 --- a/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_addresses.dart +++ b/cw_bitcoin_cash/lib/src/bitcoin_cash_wallet_addresses.dart @@ -31,5 +31,5 @@ abstract class BitcoinCashWalletAddressesBase extends ElectrumWalletAddresses wi generateP2PKHAddress(hd: hd, index: index, network: network); @override - PaymentURI getPaymentUri(String amount) => BitcoinCashURI(amount: amount, address: address); + PaymentURI getPaymentUri(String amount) => BitcoinCashURI(address: address, amount: amount); } diff --git a/cw_core/lib/hardware/device_connection_type.dart b/cw_core/lib/hardware/device_connection_type.dart index 76f07edf18..fcdb1545ae 100644 --- a/cw_core/lib/hardware/device_connection_type.dart +++ b/cw_core/lib/hardware/device_connection_type.dart @@ -36,6 +36,12 @@ enum DeviceConnectionType { WalletType.polygon, ].contains(walletType); break; + case HardwareWalletType.cupcake: + case HardwareWalletType.coldcard: + case HardwareWalletType.seedsigner: + case HardwareWalletType.keystone: + // This should not be thrown since it should never reach this code for these HardwareWalletTypes + throw UnimplementedError(); } return isSupported diff --git a/cw_core/lib/payment_uris.dart b/cw_core/lib/payment_uris.dart index 806726d4d9..ed172ca044 100644 --- a/cw_core/lib/payment_uris.dart +++ b/cw_core/lib/payment_uris.dart @@ -1,26 +1,41 @@ -import 'package:cw_core/format_fixed.dart'; +import "package:cw_core/format_fixed.dart"; -abstract class PaymentURI { - PaymentURI({required this.amount, required this.address}); +class PaymentURI { + const PaymentURI({required this.scheme, required this.address, required this.amount}); - final String amount; + final String scheme; final String address; + final String amount; + + String toString() { + final queryParameters = {}; + + if (amount.isNotEmpty) queryParameters["amount"] = amount.replaceAll(",", "."); + + return Uri(scheme: scheme, path: address, queryParameters: queryParameters).toString(); + } } class MoneroURI extends PaymentURI { - MoneroURI({required super.amount, required super.address}); + const MoneroURI({required super.address, required super.amount, super.scheme = "monero"}); @override String toString() { - var base = 'monero:$address'; - if (amount.isNotEmpty) base += '?tx_amount=${amount.replaceAll(',', '.')}'; + final queryParameters = {}; - return base; + if (amount.isNotEmpty) queryParameters["tx_amount"] = amount.replaceAll(",", "."); + + return Uri(scheme: scheme, path: address, queryParameters: queryParameters).toString(); } } class BitcoinURI extends PaymentURI { - BitcoinURI({required super.amount, required super.address, this.pjUri = ''}); + const BitcoinURI({ + required super.address, + required super.amount, + this.pjUri = "", + super.scheme = "bitcoin", + }); final String pjUri; @@ -28,23 +43,22 @@ class BitcoinURI extends PaymentURI { String toString() { final qp = {}; - if (amount.isNotEmpty) qp['amount'] = amount.replaceAll(',', '.'); + if (amount.isNotEmpty) qp["amount"] = amount.replaceAll(",", "."); if (pjUri.isNotEmpty && !address.startsWith("sp")) { - qp['pjos'] = '0'; - qp['pj'] = pjUri; + qp["pjos"] = "0"; + qp["pj"] = pjUri; } - print(qp); - return Uri(scheme: 'bitcoin', path: address, queryParameters: qp).toString(); + return Uri(scheme: "bitcoin", path: address, queryParameters: qp).toString(); } } class LightningPaymentRequest extends PaymentURI { - LightningPaymentRequest({ - required super.amount, - required super.address, - required this.bolt11Invoice, - }); + const LightningPaymentRequest( + {required super.address, + required super.amount, + required this.bolt11Invoice, + super.scheme = "lightning"}); final String bolt11Invoice; @@ -104,7 +118,7 @@ class ArbitrumURI extends PaymentURI { } class BitcoinCashURI extends PaymentURI { - BitcoinCashURI({required super.amount, required super.address}); + const BitcoinCashURI({required super.address, required super.amount, super.scheme = ""}); @override String toString() { @@ -115,145 +129,40 @@ class BitcoinCashURI extends PaymentURI { } } -class NanoURI extends PaymentURI { - NanoURI({required super.amount, required super.address}); - - @override - String toString() { - var base = 'nano:$address'; - if (amount.isNotEmpty) { - base += '?amount=${amount.replaceAll(',', '.')}'; - } - - return base; - } -} - -class PolygonURI extends PaymentURI { - PolygonURI({required super.amount, required super.address}); - - @override - String toString() { - var base = 'polygon:$address'; - if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; - - return base; - } -} - -class SolanaURI extends PaymentURI { - SolanaURI({required super.amount, required super.address}); - - @override - String toString() { - var base = 'solana:$address'; - if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; - - return base; - } -} - -class TronURI extends PaymentURI { - TronURI({required super.amount, required super.address}); - - @override - String toString() { - var base = 'tron:$address'; - if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; - - return base; - } -} - -class WowneroURI extends PaymentURI { - WowneroURI({required super.amount, required super.address}); - - @override - String toString() { - var base = 'wownero:$address'; - if (amount.isNotEmpty) base += '?tx_amount=${amount.replaceAll(',', '.')}'; - - return base; - } -} - -class ZanoURI extends PaymentURI { - ZanoURI({required String amount, required String address}) - : super(amount: amount, address: address); - - @override - String toString() { - var base = 'zano:$address'; - if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; - - return base; - } -} - -class DecredURI extends PaymentURI { - DecredURI({required String amount, required String address}) - : super(amount: amount, address: address); - - @override - String toString() { - var base = 'decred:$address'; - if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; - - return base; - } -} - -class DogeURI extends PaymentURI { - DogeURI({required String amount, required String address}) - : super(amount: amount, address: address); - - @override - String toString() { - var base = 'doge:$address'; - if (amount.isNotEmpty) base += '?amount=${amount.replaceAll(',', '.')}'; - - return base; - } -} - class ERC681URI extends PaymentURI { final int chainId; final String? contractAddress; - ERC681URI({ + const ERC681URI({ required this.chainId, required super.address, required super.amount, required this.contractAddress, + super.scheme = "ethereum", }); @override String toString() { - var uri = 'ethereum:'; + var uri = '$scheme:'; final targetAddress = contractAddress ?? address; uri += targetAddress; - if (chainId != 1) uri += '@$chainId'; + if (chainId != 1) uri += "@$chainId"; - if (contractAddress != null) uri += '/transfer'; + if (contractAddress != null) uri += "/transfer"; final params = {}; if (contractAddress != null) { - params['address'] = address; - if (amount.isNotEmpty) { - params['uint256'] = _formatAmountForERC20(amount); - } + params["address"] = address; + if (amount.isNotEmpty) params["uint256"] = _formatAmountForERC20(amount); } else { - if (amount.isNotEmpty) { - params['value'] = _formatAmountForNative(amount); - } + if (amount.isNotEmpty) params["value"] = _formatAmountForNative(amount); } if (params.isNotEmpty) { - uri += '?'; - uri += params.entries.map((e) => '${e.key}=${e.value}').join('&'); + uri += "?${params.entries.map((e) => "${e.key}=${e.value}").join("&")}"; } return uri; @@ -263,12 +172,11 @@ class ERC681URI extends PaymentURI { String _formatAmountForERC20(String amount) { try { // Convert decimal amount to BigInt (assuming 18 decimals) - final amountDouble = double.parse(amount.replaceAll(',', '.')); + final amountDouble = double.parse(amount.replaceAll(",", ".")); final amountBigInt = BigInt.from(amountDouble * 1e18); return amountBigInt.toString(); } catch (e) { - // Fallback to original amount if parsing fails - return amount.replaceAll(',', '.'); + return amount.replaceAll(",", "."); } } @@ -276,13 +184,12 @@ class ERC681URI extends PaymentURI { String _formatAmountForNative(String amount) { try { // Convert decimal amount to double for scientific notation - final amountDouble = double.parse(amount.replaceAll(',', '.')); + final amountDouble = double.parse(amount.replaceAll(",", ".")); // Use scientific notation as recommended by ERC-681 - return '${amountDouble}e18'; + return "${amountDouble}e18"; } catch (e) { - // Fallback to original amount if parsing fails - return amount.replaceAll(',', '.'); + return amount.replaceAll(",", "."); } } @@ -290,7 +197,7 @@ class ERC681URI extends PaymentURI { final (isContract, targetAddress) = _getTargetAddress(uri.path); final chainId = _getChainID(uri.path); - final address = isContract ? uri.queryParameters["address"] ?? '' : targetAddress; + final address = isContract ? uri.queryParameters["address"] ?? "" : targetAddress; final amountParam = isContract ? uri.queryParameters["uint256"] : uri.queryParameters["value"]; var formatedAmount = ""; @@ -311,15 +218,12 @@ class ERC681URI extends PaymentURI { } static int _getChainID(String path) { - return int.parse(RegExp( - r'@\d*', - ).firstMatch(path)?.group(0)?.replaceAll("@", "") ?? - "1"); + return int.parse(RegExp(r"@\d*").firstMatch(path)?.group(0)?.replaceAll("@", "") ?? "1"); } static (bool, String) _getTargetAddress(String path) { final targetAddress = - RegExp(r'^(0x)?[0-9a-f]{40}', caseSensitive: false).firstMatch(path)!.group(0)!; + RegExp(r"^(0x)?[0-9a-f]{40}", caseSensitive: false).firstMatch(path)!.group(0)!; return (path.contains("/"), targetAddress); } @@ -330,70 +234,67 @@ class ERC681URI extends PaymentURI { /// - Scientific notation: "0.123e18", "1e6" → expanded to integer /// - Decimal ETH: "0.123456" → shifted by 18 decimals static String _normalizeToIntegerWei(String input) { - final raw = input.replaceAll(',', '.').trim(); + final raw = input.replaceAll(",", ".").trim(); // First we check if it's already a plain integer (basically just a number with no dot, no exponent) try { - final isPlainInteger = RegExp(r'^[+-]?\d+$').hasMatch(raw) && - !raw.contains('.') && - !raw.toLowerCase().contains('e'); - if (isPlainInteger) return raw.replaceFirst(RegExp(r'^\+'), ''); + final isPlainInteger = RegExp(r"^[+-]?\d+$").hasMatch(raw) && + !raw.contains(".") && + !raw.toLowerCase().contains("e"); + if (isPlainInteger) return raw.replaceFirst(RegExp(r"^\+"), ""); // Then we check if it's a scientific notation - final sci = RegExp(r'^[+-]?(\d+\.?\d*|\d*\.?\d+)[eE][+-]?\d+$'); + final sci = RegExp(r"^[+-]?(\d+\.?\d*|\d*\.?\d+)[eE][+-]?\d+$"); if (sci.hasMatch(raw)) { - final mantissaStr = raw.toLowerCase().split('e')[0]; - final exp = int.parse(raw.toLowerCase().split('e')[1]); + final mantissaStr = raw.toLowerCase().split("e")[0]; + final exp = int.parse(raw.toLowerCase().split("e")[1]); return _expandDecimal(mantissaStr, exp); } // Lastly, we check if it's a fixed decimal ETH amount, here we shift by 18 to get wei for the amount - if (raw.contains('.')) { + if (raw.contains(".")) { return _expandDecimal(raw, 18); } return raw; } catch (e) { return raw; } - - // If none of these checks work, we return the raw input } /// Expands a decimal string by shifting the decimal point `expShift` places /// to the right and returns an integer string (digits only, optional leading minus). /// Examples: - /// _expandDecimal('0.123456', 18) -> '123456000000000000' - /// _expandDecimal('1.2', 3) -> '1200' + /// _expandDecimal("0.123456", 18) -> "123456000000000000" + /// _expandDecimal("1.2", 3) -> "1200" static String _expandDecimal(String decimalStr, int expShift) { var s = decimalStr.trim(); - var sign = ''; - if (s.startsWith('-') || s.startsWith('+')) { - sign = s[0] == '-' ? '-' : ''; + var sign = ""; + if (s.startsWith("-") || s.startsWith("+")) { + sign = s[0] == "-" ? "-" : ""; s = s.substring(1); } // First we split the integer and fractional parts - final parts = s.split('.'); - final intPart = parts[0].isEmpty ? '0' : parts[0]; - final fracPart = parts.length > 1 ? parts[1] : ''; - final digits = (intPart + fracPart).replaceFirst(RegExp(r'^0+'), ''); + final parts = s.split("."); + final intPart = parts[0].isEmpty ? "0" : parts[0]; + final fracPart = parts.length > 1 ? parts[1] : ""; + final digits = (intPart + fracPart).replaceFirst(RegExp(r"^0+"), ""); final fracLen = fracPart.length; // Then we calculate the effective shift = desired shift minus existing fractional digits final shift = expShift - fracLen; if (shift >= 0) { - final head = digits.isEmpty ? '0' : digits; - final zeros = List.filled(shift, '0').join(); + final head = digits.isEmpty ? "0" : digits; + final zeros = List.filled(shift, "0").join(); final res = head + zeros; - return sign + (res.isEmpty ? '0' : res); + return sign + (res.isEmpty ? "0" : res); } else { // Need to insert a decimal point within digits; return integer by truncating final cut = digits.length + shift; - if (cut <= 0) { - return '0'; - } + if (cut <= 0) return "0"; + final res = digits.substring(0, cut); - return sign + (res.isEmpty ? '0' : res); + return sign + (res.isEmpty ? "0" : res); } } } diff --git a/cw_core/lib/wallet_addresses.dart b/cw_core/lib/wallet_addresses.dart index c802065202..44fa821789 100644 --- a/cw_core/lib/wallet_addresses.dart +++ b/cw_core/lib/wallet_addresses.dart @@ -88,10 +88,13 @@ abstract class WalletAddresses { /// Get a [PaymentURI] for the current [address] /// e.g. ethereum:0x0 - PaymentURI getPaymentUri(String amount); - + PaymentURI getPaymentUri(String amount) => PaymentURI( + scheme: walletTypeToString(walletInfo.type).toLowerCase(), + address: address, + amount: amount, + ); /// Get a [PaymentURI] for the current [address] asynchronously /// this can be used if a payment requires a api call beforehand - Future getPaymentRequestUri(String amount) async => getPaymentRequestUri(amount); + Future getPaymentRequestUri(String amount) async => getPaymentUri(amount); } diff --git a/cw_decred/lib/wallet_addresses.dart b/cw_decred/lib/wallet_addresses.dart index f7d0a8baec..273a8e0510 100644 --- a/cw_decred/lib/wallet_addresses.dart +++ b/cw_decred/lib/wallet_addresses.dart @@ -1,5 +1,4 @@ import 'dart:convert'; -import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/receive_page_option.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:mobx/mobx.dart'; @@ -13,10 +12,10 @@ part 'wallet_addresses.g.dart'; class DecredWalletAddresses = DecredWalletAddressesBase with _$DecredWalletAddresses; abstract class DecredWalletAddressesBase extends WalletAddresses with Store { - DecredWalletAddressesBase(super.walletInfo, Libwallet libwallet, super.isTestnet) - : _libwallet = libwallet; + DecredWalletAddressesBase(super.walletInfo, this._libwallet, super.isTestnet); + final Libwallet _libwallet; - String currentAddr = ''; + String _currentAddr = ''; @observable bool isEnabledAutoGenerateSubaddress = true; @@ -43,14 +42,13 @@ abstract class DecredWalletAddressesBase extends WalletAddresses with Store { @override Future updateAddressesInBox() async { - final addrs = await libAddresses(); - final allAddrs = new List.from(addrs.usedAddrs)..addAll(addrs.unusedAddrs); + final addrs = await _libAddresses(); + final allAddrs = List.from(addrs.usedAddrs)..addAll(addrs.unusedAddrs); // Add all addresses. allAddrs.forEach((addr) { - if (addressesMap.containsKey(addr)) { - return; - } + if (addressesMap.containsKey(addr)) return; + addressesMap[addr] = ""; addressInfos[0] ??= []; addressInfos[0]?.add( @@ -66,44 +64,37 @@ abstract class DecredWalletAddressesBase extends WalletAddresses with Store { // Add used addresses. addrs.usedAddrs.forEach((addr) { - if (!usedAddresses.contains(addr)) { - usedAddresses.add(addr); - } + if (!usedAddresses.contains(addr)) usedAddresses.add(addr); }); - if (addrs.unusedAddrs.length > 0 && addrs.unusedAddrs[0] != currentAddr) { - currentAddr = addrs.unusedAddrs[0]; - selectedAddr = currentAddr; + if (addrs.unusedAddrs.length > 0 && addrs.unusedAddrs[0] != _currentAddr) { + _currentAddr = addrs.unusedAddrs[0]; + selectedAddr = _currentAddr; } await saveAddressesInBox(); } List getAddressInfos() { - if (addressInfos.containsKey(0)) { - return addressInfos[0]!; - } + if (addressInfos.containsKey(0)) return addressInfos[0]!; + return []; } Future updateAddress(String address, String label) async { - if (!addressInfos.containsKey(0)) { - return; - } + if (!addressInfos.containsKey(0)) return; + addressInfos[0]!.forEach((info) { - if (info.address == address) { - info.label = label; - } + if (info.address == address) info.label = label; }); await saveAddressesInBox(); } - Future libAddresses() async { + Future<_LibAddresses> _libAddresses() async { final nUsed = "10"; var nUnused = "1"; - if (this.isEnabledAutoGenerateSubaddress) { - nUnused = "3"; - } + if (this.isEnabledAutoGenerateSubaddress) nUnused = "3"; + try { final res = await _libwallet.addresses(walletInfo.name, nUsed, nUnused); final decoded = json.decode(res); @@ -111,10 +102,10 @@ abstract class DecredWalletAddressesBase extends WalletAddresses with Store { final unusedAddrs = List.from(decoded["unused"] ?? []); // index is the index of the first unused address. final index = decoded["index"] ?? 0; - return new LibAddresses(usedAddrs, unusedAddrs, index); + return _LibAddresses(usedAddrs, unusedAddrs, index); } catch (e) { printV(e); - return LibAddresses([], [], 0); + return _LibAddresses([], [], 0); } } @@ -122,9 +113,8 @@ abstract class DecredWalletAddressesBase extends WalletAddresses with Store { // NOTE: This will ignore the gap limit and may cause problems when restoring from seed if too // many addresses are taken and not used. final addr = await _libwallet.newExternalAddress(walletInfo.name) ?? ''; - if (addr == "") { - return; - } + if (addr == "") return; + if (!addressesMap.containsKey(addr)) { addressesMap[addr] = ""; addressInfos[0] ??= []; @@ -143,22 +133,17 @@ abstract class DecredWalletAddressesBase extends WalletAddresses with Store { } @override - List get receivePageOptions { - return isTestnet - ? [ - ReceivePageOption.testnet, - ...ReceivePageOptions.where((element) => element != ReceivePageOption.mainnet) - ] - : ReceivePageOptions; - } - - @override - PaymentURI getPaymentUri(String amount) => DecredURI(amount: amount, address: address); + List get receivePageOptions => isTestnet + ? [ + ReceivePageOption.testnet, + ...ReceivePageOptions.where((element) => element != ReceivePageOption.mainnet) + ] + : ReceivePageOptions; } -class LibAddresses { +class _LibAddresses { final List usedAddrs, unusedAddrs; final int firstUnusedAddrIndex; - LibAddresses(this.usedAddrs, this.unusedAddrs, this.firstUnusedAddrIndex); + _LibAddresses(this.usedAddrs, this.unusedAddrs, this.firstUnusedAddrIndex); } diff --git a/cw_dogecoin/lib/src/dogecoin_wallet_addresses.dart b/cw_dogecoin/lib/src/dogecoin_wallet_addresses.dart index 3dc72526fd..8f12dcc1ca 100644 --- a/cw_dogecoin/lib/src/dogecoin_wallet_addresses.dart +++ b/cw_dogecoin/lib/src/dogecoin_wallet_addresses.dart @@ -11,7 +11,8 @@ part 'dogecoin_wallet_addresses.g.dart'; class DogeCoinWalletAddresses = DogeCoinWalletAddressesBase with _$DogeCoinWalletAddresses; abstract class DogeCoinWalletAddressesBase extends ElectrumWalletAddresses with Store { - DogeCoinWalletAddressesBase(WalletInfo walletInfo, { + DogeCoinWalletAddressesBase( + WalletInfo walletInfo, { required super.mainHd, required super.sideHd, required super.network, @@ -19,15 +20,18 @@ abstract class DogeCoinWalletAddressesBase extends ElectrumWalletAddresses with super.initialAddresses, super.initialRegularAddressIndex, super.initialChangeAddressIndex, - super.initialAddressPageType + super.initialAddressPageType, }) : super(walletInfo); @override - String getAddress({required int index, + String getAddress({ + required int index, required Bip32Slip10Secp256k1 hd, - BitcoinAddressType? addressType}) => + BitcoinAddressType? addressType, + }) => generateP2PKHAddress(hd: hd, index: index, network: network); @override - PaymentURI getPaymentUri(String amount) => DogeURI(amount: amount, address: address); + PaymentURI getPaymentUri(String amount) => + PaymentURI(scheme: "doge", address: address, amount: amount); } diff --git a/cw_evm/lib/evm_chain_wallet.dart b/cw_evm/lib/evm_chain_wallet.dart index f952117485..0db8781c7a 100644 --- a/cw_evm/lib/evm_chain_wallet.dart +++ b/cw_evm/lib/evm_chain_wallet.dart @@ -82,7 +82,7 @@ abstract class EVMChainWalletBase _hexPrivateKey = privateKey, _isTransactionUpdating = false, _client = client, - walletAddresses = EVMChainWalletAddresses(walletInfo, client.chainId), + walletAddresses = EVMChainWalletAddresses(walletInfo), balance = ObservableMap.of( { // Not sure of this yet, will it work? will it not? diff --git a/cw_evm/lib/evm_chain_wallet_addresses.dart b/cw_evm/lib/evm_chain_wallet_addresses.dart index bfa4938a32..7dd501cc5e 100644 --- a/cw_evm/lib/evm_chain_wallet_addresses.dart +++ b/cw_evm/lib/evm_chain_wallet_addresses.dart @@ -1,6 +1,5 @@ import 'dart:developer'; -import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:mobx/mobx.dart'; @@ -10,12 +9,10 @@ part 'evm_chain_wallet_addresses.g.dart'; class EVMChainWalletAddresses = EVMChainWalletAddressesBase with _$EVMChainWalletAddresses; abstract class EVMChainWalletAddressesBase extends WalletAddresses with Store { - EVMChainWalletAddressesBase(WalletInfo walletInfo, this.chainId) + EVMChainWalletAddressesBase(WalletInfo walletInfo) : address = '', super(walletInfo); - final int chainId; - @override @observable String address; @@ -39,16 +36,4 @@ abstract class EVMChainWalletAddressesBase extends WalletAddresses with Store { log(e.toString()); } } - - @override - PaymentURI getPaymentUri(String amount) { - switch (chainId) { - case 8453: - return BaseURI(amount: amount, address: address); - case 137: - return PolygonURI(amount: amount, address: address); - default: - return EthereumURI(amount: amount, address: address); - } - } } diff --git a/cw_monero/lib/monero_wallet_addresses.dart b/cw_monero/lib/monero_wallet_addresses.dart index 51c3e0f0a9..9a7264c035 100644 --- a/cw_monero/lib/monero_wallet_addresses.dart +++ b/cw_monero/lib/monero_wallet_addresses.dart @@ -157,5 +157,5 @@ abstract class MoneroWalletAddressesBase extends WalletAddresses with Store { addressInfos[account?.id ?? 0]?.any((it) => it.address == address) ?? false; @override - PaymentURI getPaymentUri(String amount) => MoneroURI(amount: amount, address: address); + PaymentURI getPaymentUri(String amount) => MoneroURI(address: address, amount: amount); } diff --git a/cw_nano/lib/nano_wallet_addresses.dart b/cw_nano/lib/nano_wallet_addresses.dart index f52cf4ca1f..d29433e39e 100644 --- a/cw_nano/lib/nano_wallet_addresses.dart +++ b/cw_nano/lib/nano_wallet_addresses.dart @@ -1,5 +1,4 @@ import 'package:cw_core/cake_hive.dart'; -import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; @@ -53,7 +52,4 @@ abstract class NanoWalletAddressesBase extends WalletAddresses with Store { printV(e.toString()); } } - - @override - PaymentURI getPaymentUri(String amount) => NanoURI(amount: amount, address: address); } diff --git a/cw_solana/lib/solana_wallet_addresses.dart b/cw_solana/lib/solana_wallet_addresses.dart index 634c73f375..7e9bd90089 100644 --- a/cw_solana/lib/solana_wallet_addresses.dart +++ b/cw_solana/lib/solana_wallet_addresses.dart @@ -1,4 +1,3 @@ -import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; @@ -35,7 +34,4 @@ abstract class SolanaWalletAddressesBase extends WalletAddresses with Store { printV(e.toString()); } } - - @override - PaymentURI getPaymentUri(String amount) => SolanaURI(amount: amount, address: address); } diff --git a/cw_tron/lib/tron_wallet_addresses.dart b/cw_tron/lib/tron_wallet_addresses.dart index 99767e9654..095f97fa9a 100644 --- a/cw_tron/lib/tron_wallet_addresses.dart +++ b/cw_tron/lib/tron_wallet_addresses.dart @@ -1,6 +1,5 @@ import 'dart:developer'; -import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:mobx/mobx.dart'; @@ -37,7 +36,4 @@ abstract class TronWalletAddressesBase extends WalletAddresses with Store { log(e.toString()); } } - - @override - PaymentURI getPaymentUri(String amount) => TronURI(amount: amount, address: address); } diff --git a/cw_wownero/lib/wownero_wallet_addresses.dart b/cw_wownero/lib/wownero_wallet_addresses.dart index c95d397631..ef17237f48 100644 --- a/cw_wownero/lib/wownero_wallet_addresses.dart +++ b/cw_wownero/lib/wownero_wallet_addresses.dart @@ -62,7 +62,7 @@ abstract class WowneroWalletAddressesBase extends WalletAddresses with Store { WowneroSubaddressList subaddressList; WowneroAccountList accountList; - + @override Set usedAddresses = Set(); @@ -152,5 +152,6 @@ abstract class WowneroWalletAddressesBase extends WalletAddresses with Store { addressInfos[account?.id ?? 0]?.any((it) => it.address == address) ?? false; @override - PaymentURI getPaymentUri(String amount) => WowneroURI(amount: amount, address: address); + PaymentURI getPaymentUri(String amount) => + MoneroURI(scheme: "wownero", address: address, amount: amount); } diff --git a/cw_zano/lib/zano_wallet_addresses.dart b/cw_zano/lib/zano_wallet_addresses.dart index 1562ea8eee..be25c9383e 100644 --- a/cw_zano/lib/zano_wallet_addresses.dart +++ b/cw_zano/lib/zano_wallet_addresses.dart @@ -1,4 +1,3 @@ -import 'package:cw_core/payment_uris.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_addresses.dart'; import 'package:cw_core/wallet_info.dart'; @@ -38,7 +37,4 @@ abstract class ZanoWalletAddressesBase extends WalletAddresses with Store { printV(e.toString()); } } - - @override - PaymentURI getPaymentUri(String amount) => ZanoURI(amount: amount, address: address); } diff --git a/lib/view_model/exchange/exchange_trade_view_model.dart b/lib/view_model/exchange/exchange_trade_view_model.dart index 09b478da79..a2cf0d738e 100644 --- a/lib/view_model/exchange/exchange_trade_view_model.dart +++ b/lib/view_model/exchange/exchange_trade_view_model.dart @@ -414,13 +414,11 @@ abstract class ExchangeTradeViewModelBase with Store { switch (wallet.type) { case WalletType.bitcoin: - return BitcoinURI(amount: amount, address: inputAddress); - case WalletType.litecoin: - return LitecoinURI(amount: amount, address: inputAddress); + return BitcoinURI(address: inputAddress, amount: amount); case WalletType.bitcoinCash: - return BitcoinCashURI(amount: amount, address: inputAddress); + return BitcoinCashURI(address: inputAddress, amount: amount); case WalletType.dogecoin: - return DogeURI(amount: amount, address: inputAddress); + return PaymentURI(scheme: "doge", address: inputAddress, amount: amount); case WalletType.ethereum: return _createERC681URI(fromCurrency, inputAddress, amount); // TODO: Expand ERC681URI support to Polygon(modify decoding flow for QRs, pay anything, and deep link handling) @@ -435,17 +433,17 @@ abstract class ExchangeTradeViewModelBase with Store { case WalletType.tron: return TronURI(amount: amount, address: inputAddress); case WalletType.monero: - return MoneroURI(amount: amount, address: inputAddress); + return MoneroURI(address: inputAddress, amount: amount); case WalletType.wownero: - return WowneroURI(amount: amount, address: inputAddress); - case WalletType.zano: - return ZanoURI(amount: amount, address: inputAddress); - case WalletType.decred: - return DecredURI(amount: amount, address: inputAddress); - case WalletType.nano: - return NanoURI(amount: amount, address: inputAddress); + return MoneroURI( + scheme: walletTypeToString(wallet.type).toLowerCase(), + address: inputAddress, + amount: amount); default: - return null; + return PaymentURI( + scheme: walletTypeToString(wallet.type).toLowerCase(), + address: inputAddress, + amount: amount); } } diff --git a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart index 92f4c24a78..db7111017a 100644 --- a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart +++ b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart @@ -115,9 +115,7 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo @action Future refreshUri() async { - print(amount); uri = await wallet.walletAddresses.getPaymentRequestUri(amount); - print(uri); } @computed From 21b4ad1654743c4aa4c696b4f6eb670e929b2c3c Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Tue, 4 Nov 2025 21:53:54 +0100 Subject: [PATCH 037/105] refactor: remove redundant debug print statement from `bitcoin_wallet_addresses.dart` --- cw_bitcoin/lib/bitcoin_wallet_addresses.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart index 7df16b020e..c14ab11849 100644 --- a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart +++ b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart @@ -119,7 +119,6 @@ abstract class BitcoinWalletAddressesBase extends ElectrumWalletAddresses with S final invoice = await lightningWallet!.getBolt11Invoice(amountSats, "Send to Cake Wallet"); return LightningPaymentRequest(address: address, amount: amount, bolt11Invoice: invoice); } - print(amount); return getPaymentUri(amount); } } From 193a26075d689550be1a6dafd69e83e964c56209 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Wed, 5 Nov 2025 14:39:07 +0100 Subject: [PATCH 038/105] refactor: improve consistency in widget styling and centralized label logic, add Bitcoin Lightning deposit/withdraw support --- .../pages/balance/balance_row_widget.dart | 144 ++++++++++-------- res/values/strings_ar.arb | 2 + res/values/strings_bg.arb | 2 + res/values/strings_cs.arb | 2 + res/values/strings_de.arb | 4 +- res/values/strings_en.arb | 2 + res/values/strings_es.arb | 2 + res/values/strings_fr.arb | 2 + res/values/strings_ha.arb | 2 + res/values/strings_hi.arb | 2 + res/values/strings_hr.arb | 2 + res/values/strings_hy.arb | 2 + res/values/strings_id.arb | 2 + res/values/strings_it.arb | 2 + res/values/strings_ja.arb | 2 + res/values/strings_ko.arb | 2 + res/values/strings_my.arb | 2 + res/values/strings_nl.arb | 2 + res/values/strings_pl.arb | 2 + res/values/strings_pt.arb | 2 + res/values/strings_ru.arb | 2 + res/values/strings_th.arb | 2 + res/values/strings_tl.arb | 2 + res/values/strings_tr.arb | 2 + res/values/strings_uk.arb | 2 + res/values/strings_ur.arb | 2 + res/values/strings_vi.arb | 2 + res/values/strings_yo.arb | 2 + res/values/strings_zh.arb | 2 + 29 files changed, 139 insertions(+), 63 deletions(-) diff --git a/lib/src/screens/dashboard/pages/balance/balance_row_widget.dart b/lib/src/screens/dashboard/pages/balance/balance_row_widget.dart index 3dac4cea13..68d2ca2782 100644 --- a/lib/src/screens/dashboard/pages/balance/balance_row_widget.dart +++ b/lib/src/screens/dashboard/pages/balance/balance_row_widget.dart @@ -14,6 +14,7 @@ import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -148,14 +149,12 @@ class BalanceRowWidget extends StatelessWidget { maxLines: 1, textAlign: TextAlign.start, ), - SizedBox(height: 6), + const SizedBox(height: 6), if (isTestnet) Text( S.of(context).testnet_coins_no_value, textAlign: TextAlign.center, - style: Theme.of(context).textTheme.bodyMedium?.copyWith( - height: 1, - ), + style: Theme.of(context).textTheme.bodyMedium?.copyWith(height: 1), ), if (!isTestnet) Text( @@ -216,7 +215,7 @@ class BalanceRowWidget extends StatelessWidget { if (currency.isPotentialScam) Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 2), - margin: EdgeInsets.only(top: 4), + margin: const EdgeInsets.only(top: 4), decoration: BoxDecoration( color: Theme.of(context).colorScheme.errorContainer, borderRadius: BorderRadius.circular(8), @@ -244,7 +243,7 @@ class BalanceRowWidget extends StatelessWidget { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - SizedBox(height: 26), + const SizedBox(height: 26), Row( children: [ Text( @@ -257,7 +256,7 @@ class BalanceRowWidget extends StatelessWidget { ), ], ), - SizedBox(height: 8), + const SizedBox(height: 8), AutoSizeText( frozenBalance, style: Theme.of(context).textTheme.bodyLarge!.copyWith( @@ -268,14 +267,12 @@ class BalanceRowWidget extends StatelessWidget { maxLines: 1, textAlign: TextAlign.center, ), - SizedBox(height: 4), + const SizedBox(height: 4), if (!isTestnet) Text( frozenFiatBalance, textAlign: TextAlign.center, - style: Theme.of(context).textTheme.bodySmall!.copyWith( - height: 1, - ), + style: Theme.of(context).textTheme.bodySmall!.copyWith(height: 1), ), ], ), @@ -283,7 +280,7 @@ class BalanceRowWidget extends StatelessWidget { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - SizedBox(height: 24), + const SizedBox(height: 24), Text( '${additionalBalanceLabel}', textAlign: TextAlign.center, @@ -292,7 +289,7 @@ class BalanceRowWidget extends StatelessWidget { height: 1, ), ), - SizedBox(height: 8), + const SizedBox(height: 8), AutoSizeText( additionalBalance, style: Theme.of(context).textTheme.bodyLarge!.copyWith( @@ -303,14 +300,12 @@ class BalanceRowWidget extends StatelessWidget { maxLines: 1, textAlign: TextAlign.center, ), - SizedBox(height: 4), + const SizedBox(height: 4), if (!isTestnet) Text( '${additionalFiatBalance}', textAlign: TextAlign.center, - style: Theme.of(context).textTheme.bodySmall!.copyWith( - height: 1, - ), + style: Theme.of(context).textTheme.bodySmall!.copyWith(height: 1), ), ], ), @@ -333,15 +328,6 @@ class BalanceRowWidget extends StatelessWidget { begin: Alignment.topCenter, end: Alignment.bottomCenter, ), - // boxShadow: [ - // BoxShadow( - // color: Theme.of(context) - // .extension()! - // .cardBorderColor - // .withAlpha(50), - // spreadRadius: dashboardViewModel.getShadowSpread(), - // blurRadius: dashboardViewModel.getShadowBlur()) - // ], ), child: TextButton( onPressed: _showToast, @@ -360,27 +346,48 @@ class BalanceRowWidget extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.end, children: [ - Container( - child: Column( - children: [ - Container( - child: ImageIcon( - AssetImage('assets/images/mweb_logo.png'), - size: 40, - ), - ), - const SizedBox(height: 10), - Text( - 'MWEB', - style: Theme.of(context).textTheme.bodyMedium?.copyWith( - fontSize: 16, - fontWeight: FontWeight.w700, - color: Theme.of(context).colorScheme.onSurface, - height: 1, - ), - ), - ], - ), + Column( + children: [ + ImageIcon( + AssetImage('assets/images/mweb_logo.png'), + size: 40, + ), + const SizedBox(height: 10), + Text( + 'MWEB', + style: Theme.of(context).textTheme.bodyMedium?.copyWith( + fontSize: 16, + fontWeight: FontWeight.w700, + color: Theme.of(context).colorScheme.onSurface, + height: 1, + ), + ), + ], + ), + ], + ), + if (currency == CryptoCurrency.btc) + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Column( + children: [ + SvgPicture.asset( + 'assets/images/lightning-icon.svg', + width: 40, + height: 40, + ), + const SizedBox(height: 10), + Text( + 'Lightning', + style: Theme.of(context).textTheme.bodyMedium?.copyWith( + fontSize: 16, + fontWeight: FontWeight.w700, + color: Theme.of(context).colorScheme.onSurface, + height: 1, + ), + ), + ], ), ], ), @@ -392,15 +399,11 @@ class BalanceRowWidget extends StatelessWidget { children: [ GestureDetector( behavior: HitTestBehavior.opaque, - onTap: () => launchUrl( - Uri.parse( - "https://docs.cakewallet.com/cryptos/litecoin#mweb"), - mode: LaunchMode.externalApplication, - ), + onTap: onPressedHelp, child: Row( children: [ Text( - '${secondAvailableBalanceLabel}', + secondAvailableBalanceLabel, textAlign: TextAlign.center, style: Theme.of(context).textTheme.bodySmall?.copyWith( color: @@ -434,7 +437,7 @@ class BalanceRowWidget extends StatelessWidget { SizedBox(height: 6), if (!isTestnet) Text( - '${secondAvailableFiatBalance}', + secondAvailableFiatBalance, textAlign: TextAlign.center, style: Theme.of(context).textTheme.bodyMedium?.copyWith( fontSize: 16, @@ -462,7 +465,7 @@ class BalanceRowWidget extends StatelessWidget { children: [ SizedBox(height: 24), Text( - '${secondAdditionalBalanceLabel}', + secondAdditionalBalanceLabel, textAlign: TextAlign.center, style: Theme.of(context).textTheme.bodySmall?.copyWith( color: Theme.of(context).colorScheme.onSurfaceVariant, @@ -498,13 +501,13 @@ class BalanceRowWidget extends StatelessWidget { ), IntrinsicHeight( child: Container( - padding: EdgeInsets.symmetric(horizontal: 12), + padding: const EdgeInsets.symmetric(horizontal: 12), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Semantics( - label: S.of(context).litecoin_mweb_pegin, + label: depositToL2Label, child: OutlinedButton( onPressed: () => depositToL2(context), style: OutlinedButton.styleFrom( @@ -519,7 +522,7 @@ class BalanceRowWidget extends StatelessWidget { ), ), child: Container( - padding: EdgeInsets.symmetric(vertical: 12), + padding: const EdgeInsets.symmetric(vertical: 12), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -531,7 +534,7 @@ class BalanceRowWidget extends StatelessWidget { ), const SizedBox(width: 8), Text( - S.of(context).litecoin_mweb_pegin, + depositToL2Label, style: Theme.of(context).textTheme.bodyMedium?.copyWith( color: Theme.of(context).colorScheme.onPrimary, fontWeight: FontWeight.w700, @@ -546,7 +549,7 @@ class BalanceRowWidget extends StatelessWidget { SizedBox(width: 16), Expanded( child: Semantics( - label: S.of(context).litecoin_mweb_pegout, + label: withdrawFromL2Label, child: OutlinedButton( onPressed: () => withdrawFromL2(context), style: OutlinedButton.styleFrom( @@ -573,7 +576,7 @@ class BalanceRowWidget extends StatelessWidget { ), const SizedBox(width: 8), Text( - S.of(context).litecoin_mweb_pegout, + withdrawFromL2Label, style: Theme.of(context).textTheme.bodyMedium?.copyWith( color: Theme.of(context) .colorScheme @@ -591,7 +594,7 @@ class BalanceRowWidget extends StatelessWidget { ), ), ), - SizedBox(height: 16), + const SizedBox(height: 16), ], ), ), @@ -601,6 +604,14 @@ class BalanceRowWidget extends StatelessWidget { ); } + String get depositToL2Label => dashboardViewModel.type == WalletType.litecoin + ? S.current.litecoin_mweb_pegin + : S.current.bitcoin_lightning_deposit; + + String get withdrawFromL2Label => dashboardViewModel.type == WalletType.litecoin + ? S.current.litecoin_mweb_pegout + : S.current.bitcoin_lightning_withdraw; + Future depositToL2(BuildContext context) async { PaymentRequest? paymentRequest = null; @@ -653,6 +664,15 @@ class BalanceRowWidget extends StatelessWidget { ); } + void onPressedHelp() { + var helpUri = Uri.parse("https://docs.cakewallet.com/cryptos/bitcoin#lightning"); + if (dashboardViewModel.type == WalletType.litecoin) { + helpUri = Uri.parse("https://docs.cakewallet.com/cryptos/litecoin#mweb"); + } + + launchUrl(helpUri, mode: LaunchMode.externalApplication); + } + void _showBalanceDescription(BuildContext context, String content) { showPopUp(context: context, builder: (_) => InformationPage(information: content)); } diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index 33709eb3e6..8af20ff642 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "امسح بصمة إصبعك للمصادقة", "bitcoin_dark_theme": "موضوع البيتكوين الظلام", "bitcoin_light_theme": "موضوع البيتكوين الخفيفة", + "bitcoin_lightning_deposit": "إيداع", + "bitcoin_lightning_withdraw": "ينسحب", "bitcoin_payments_require_1_confirmation": "تتطلب مدفوعات Bitcoin تأكيدًا واحدًا ، والذي قد يستغرق 20 دقيقة أو أكثر. شكرا لصبرك! سيتم إرسال بريد إلكتروني إليك عند تأكيد الدفع.", "block_height": "ارتفاع كتلة", "block_remaining": "1 كتلة متبقية", diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index 0484cc66fc..d8e4dcc266 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "Сканирайте своя пръстов отпечатък", "bitcoin_dark_theme": "Тъмна тема за биткойн", "bitcoin_light_theme": "Лека биткойн тема", + "bitcoin_lightning_deposit": "Депозит", + "bitcoin_lightning_withdraw": "Оттегляне", "bitcoin_payments_require_1_confirmation": "Плащанията с Bitcoin изискват потвърждение, което може да отнеме 20 минути или повече. Благодарим за търпението! Ще получите имейл, когато плащането е потвърдено.", "block_height": "Височина на блока", "block_remaining": "1 блок останал", diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index e73b1f4bcc..1d5321a564 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "Naskenujte otisk prstu pro ověření", "bitcoin_dark_theme": "Tmavé téma bitcoinů", "bitcoin_light_theme": "Světlé téma bitcoinů", + "bitcoin_lightning_deposit": "Vklad", + "bitcoin_lightning_withdraw": "Odebrat", "bitcoin_payments_require_1_confirmation": "U plateb Bitcoinem je vyžadováno alespoň 1 potvrzení, což může trvat 20 minut i déle. Děkujeme za vaši trpělivost! Až bude platba potvrzena, budete informováni e-mailem.", "block_height": "Výška bloku", "block_remaining": "1 blok zbývající", diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 5ed7982cda..98e3a75f2f 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "Scannen Sie Ihren Fingerabdruck zur Authentifizierung", "bitcoin_dark_theme": "Dunkles Bitcoin-Thema", "bitcoin_light_theme": "Bitcoin Light-Thema", + "bitcoin_lightning_deposit": "Einzahlen", + "bitcoin_lightning_withdraw": "Auszahlen", "bitcoin_payments_require_1_confirmation": "Bitcoin-Zahlungen erfordern 1 Bestätigung, was 20 Minuten oder länger dauern kann. Danke für Ihre Geduld! Sie erhalten eine E-Mail, wenn die Zahlung bestätigt ist.", "block_height": "Blockhöhe", "block_remaining": "1 Block verbleibend", @@ -1165,4 +1167,4 @@ "youCanGoBackToYourDapp": "Sie können jetzt zu Ihrem Dapp zurückkehren", "your": "Dein", "yy": "YY" -} \ No newline at end of file +} diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index bd6d22559b..a0eea1dcc3 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "Scan your fingerprint to authenticate", "bitcoin_dark_theme": "Bitcoin Dark Theme", "bitcoin_light_theme": "Bitcoin Light Theme", + "bitcoin_lightning_deposit": "Deposit", + "bitcoin_lightning_withdraw": "Withdraw", "bitcoin_payments_require_1_confirmation": "Bitcoin payments require 1 confirmation, which can take 20 minutes or longer. Thanks for your patience! You will be emailed when the payment is confirmed.", "block_height": "Block height", "block_remaining": "1 Block Remaining", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 0c28290b8f..314af00044 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "Escanee su huella dactilar para autenticarse", "bitcoin_dark_theme": "Tema oscuro de Bitcoin", "bitcoin_light_theme": "Tema claro de Bitcoin", + "bitcoin_lightning_deposit": "Depósito", + "bitcoin_lightning_withdraw": "Retirar", "bitcoin_payments_require_1_confirmation": "Los pagos de Bitcoin requieren 1 confirmación, que puede tardar 20 minutos o más. ¡Gracias por tu paciencia! Recibirás un correo electrónico cuando se confirme el pago.", "block_height": "Altura del bloque", "block_remaining": "1 bloque restante", diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index 94103b0e00..f5f82d0fd1 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "Scannez votre empreinte digitale pour vous authentifier", "bitcoin_dark_theme": "Thème sombre Bitcoin", "bitcoin_light_theme": "Thème clair Bitcoin", + "bitcoin_lightning_deposit": "Dépôt", + "bitcoin_lightning_withdraw": "Retirer", "bitcoin_payments_require_1_confirmation": "Les paiements Bitcoin nécessitent 1 confirmation, ce qui peut prendre 20 minutes ou plus. Merci pour votre patience ! Vous serez averti par e-mail lorsque le paiement sera confirmé.", "block_height": "Hauteur de bloc", "block_remaining": "1 bloc restant", diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index bb26fed0e5..797a39124e 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "Duba hoton yatsa don tantancewa", "bitcoin_dark_theme": "Bitcoin Dark Jigo", "bitcoin_light_theme": "Jigon Hasken Bitcoin", + "bitcoin_lightning_deposit": "Yi ajiya", + "bitcoin_lightning_withdraw": "Janye", "bitcoin_payments_require_1_confirmation": "Akwatin Bitcoin na buɗe 1 sambumbu, da yake za ta samu mintuna 20 ko yawa. Ina kira ga sabuwar lafiya! Zaka sanarwa ta email lokacin da aka samu akwatin samun lambar waya.", "block_height": "Toshe tsawo", "block_remaining": "1 toshe ragowar", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 4c83c23a54..e260b9b4f6 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "प्रमाणित करने के लिए अपने फ़िंगरप्रिंट को स्कैन करें", "bitcoin_dark_theme": "बिटकॉइन डार्क थीम", "bitcoin_light_theme": "बिटकॉइन लाइट थीम", + "bitcoin_lightning_deposit": "जमा", + "bitcoin_lightning_withdraw": "निकालना", "bitcoin_payments_require_1_confirmation": "बिटकॉइन भुगतान के लिए 1 पुष्टिकरण की आवश्यकता होती है, जिसमें 20 मिनट या अधिक समय लग सकता है। आपके धैर्य के लिए धन्यवाद! भुगतान की पुष्टि होने पर आपको ईमेल किया जाएगा।", "block_height": "ब्लॉक ऊंचाई", "block_remaining": "1 ब्लॉक शेष", diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index db714439e4..eb6a136329 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "Skenirajte svoj otisak prsta za autentifikaciju", "bitcoin_dark_theme": "Bitcoin Tamna tema", "bitcoin_light_theme": "Bitcoin Light Theme", + "bitcoin_lightning_deposit": "Polog", + "bitcoin_lightning_withdraw": "Povući", "bitcoin_payments_require_1_confirmation": "Bitcoin plaćanja zahtijevaju 1 potvrdu, što može potrajati 20 minuta ili dulje. Hvala na Vašem strpljenju! Dobit ćete e-poruku kada plaćanje bude potvrđeno.", "block_height": "Visina bloka", "block_remaining": "Preostalo 1 blok", diff --git a/res/values/strings_hy.arb b/res/values/strings_hy.arb index 694a01ddf8..cac4a9f079 100644 --- a/res/values/strings_hy.arb +++ b/res/values/strings_hy.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "Սկանավեք ձեր մատնահետքը նույնականացման համար", "bitcoin_dark_theme": "Bitcoin մութ տեսք", "bitcoin_light_theme": "Bitcoin պայծառ տեսք", + "bitcoin_lightning_deposit": "Ավանդ", + "bitcoin_lightning_withdraw": "Հանել", "bitcoin_payments_require_1_confirmation": "Bitcoin վճարումները պահանջում են 1 հաստատում, որը կարող է տևել 20 րոպե կամ ավելի: Շնորհակալություն ձեր համբերության համար: Դուք էլ. նամակ կստանաք, երբ վճարումը հաստատվի։", "block_height": "Բլոկի բարձրությունը", "block_remaining": "1 Բլոկ է մնացել", diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index c6e197261d..75393c9696 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "Pindai sidik jari Anda untuk mengautentikasi", "bitcoin_dark_theme": "Tema Gelap Bitcoin", "bitcoin_light_theme": "Tema Cahaya Bitcoin", + "bitcoin_lightning_deposit": "Deposito", + "bitcoin_lightning_withdraw": "Menarik", "bitcoin_payments_require_1_confirmation": "Pembayaran Bitcoin memerlukan 1 konfirmasi, yang bisa memakan waktu 20 menit atau lebih. Terima kasih atas kesabaran Anda! Anda akan diemail saat pembayaran dikonfirmasi.", "block_height": "Tinggi blok", "block_remaining": "1 blok tersisa", diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index 603c862a08..a7a8047de4 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "Scansiona la tua impronta per autenticarti", "bitcoin_dark_theme": "Tema scuro Bitcoin", "bitcoin_light_theme": "Tema chiaro Bitcoin", + "bitcoin_lightning_deposit": "Depositare", + "bitcoin_lightning_withdraw": "Ritirare", "bitcoin_payments_require_1_confirmation": "I pagamenti in bitcoin richiedono 1 conferma, che può richiedere 20 minuti o più. Grazie per la vostra pazienza! Riceverai un'e-mail quando il pagamento sarà confermato.", "block_height": "Altezza del blocco", "block_remaining": "1 blocco rimanente", diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 9b47ef5f6d..dfb3950c62 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "प指紋をスキャンして認証する", "bitcoin_dark_theme": "ビットコインダークテーマ", "bitcoin_light_theme": "ビットコインライトテーマ", + "bitcoin_lightning_deposit": "デポジット", + "bitcoin_lightning_withdraw": "撤回する", "bitcoin_payments_require_1_confirmation": "ビットコインの支払いには 1 回の確認が必要で、これには 20 分以上かかる場合があります。お待ち頂きまして、ありがとうございます!支払いが確認されると、メールが送信されます。", "block_height": "ブロックの高さ", "block_remaining": "残り1ブロック", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index be7f2106bd..22159aedbb 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "인증하려면 지문을 스캔하세요", "bitcoin_dark_theme": "비트코인 다크 테마", "bitcoin_light_theme": "비트코인 라이트 테마", + "bitcoin_lightning_deposit": "보증금", + "bitcoin_lightning_withdraw": "철회하다", "bitcoin_payments_require_1_confirmation": "비트코인 결제는 1번의 확인이 필요하며, 이는 20분 이상 소요될 수 있습니다. 기다려 주셔서 감사합니다! 결제가 확인되면 이메일로 알려드립니다.", "block_height": "블록 높이", "block_remaining": "1 블록 남음", diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index 2507dda1d4..f52f8b19b5 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "စစ်မှန်ကြောင်းအထောက်အထားပြရန် သင့်လက်ဗွေကို စကန်ဖတ်ပါ။", "bitcoin_dark_theme": "Bitcoin Dark Theme", "bitcoin_light_theme": "Bitcoin Light အပြင်အဆင်", + "bitcoin_lightning_deposit": "အပ်ငေှ", + "bitcoin_lightning_withdraw": "ဆုတ်ခွာ", "bitcoin_payments_require_1_confirmation": "Bitcoin ငွေပေးချေမှုများသည် မိနစ် 20 သို့မဟုတ် ထို့ထက်ပိုကြာနိုင်သည် 1 အတည်ပြုချက် လိုအပ်သည်။ မင်းရဲ့စိတ်ရှည်မှုအတွက် ကျေးဇူးတင်ပါတယ်။ ငွေပေးချေမှုကို အတည်ပြုပြီးသောအခါ သင့်ထံ အီးမေးလ်ပို့ပါမည်။", "block_height": "ပိတ်ပင်တားဆီးမှုအမြင့်", "block_remaining": "ကျန်ရှိနေသေးသော block", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 056908f1b0..9802b93c68 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "Scan uw vingerafdruk om te verifiëren", "bitcoin_dark_theme": "Bitcoin donker thema", "bitcoin_light_theme": "Bitcoin Light-thema", + "bitcoin_lightning_deposit": "Borg", + "bitcoin_lightning_withdraw": "Terugtrekken", "bitcoin_payments_require_1_confirmation": "Bitcoin-betalingen vereisen 1 bevestiging, wat 20 minuten of langer kan duren. Dank voor uw geduld! U ontvangt een e-mail wanneer de betaling is bevestigd.", "block_height": "Blokhoogte", "block_remaining": "1 blok resterend", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index c2509f821b..e3e43c3bb9 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "Zeskanuj odcisk palca, aby się uwierzytelnić", "bitcoin_dark_theme": "Ciemny motyw Bitcoin", "bitcoin_light_theme": "Jasny motyw Bitcoin", + "bitcoin_lightning_deposit": "Depozyt", + "bitcoin_lightning_withdraw": "Wycofać", "bitcoin_payments_require_1_confirmation": "Płatności Bitcoin wymagają jednego potwierdzenia, co może zająć 20 minut lub dłużej. Dziękujemy za cierpliwość! Otrzymasz e‑mail, gdy płatność zostanie potwierdzona.", "block_height": "Wysokość bloku", "block_remaining": "Pozostał 1 blok", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index e1b7d4c5a9..dcbf08f198 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "Digitalize sua impressão digital para autenticar", "bitcoin_dark_theme": "Tema escuro Bitcoin", "bitcoin_light_theme": "Tema claro de bitcoin", + "bitcoin_lightning_deposit": "Depósito", + "bitcoin_lightning_withdraw": "Retirar", "bitcoin_payments_require_1_confirmation": "Os pagamentos em Bitcoin exigem 1 confirmação, o que pode levar 20 minutos ou mais. Obrigado pela sua paciência! Você receberá um e-mail quando o pagamento for confirmado.", "block_height": "Altura do bloco", "block_remaining": "1 bloco restante", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 5993fd530a..426dd63116 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "Отсканируйте свой отпечаток пальца для аутентификации", "bitcoin_dark_theme": "Биткойн Темная тема", "bitcoin_light_theme": "Светлая биткойн-тема", + "bitcoin_lightning_deposit": "Депозит", + "bitcoin_lightning_withdraw": "Отзывать", "bitcoin_payments_require_1_confirmation": "Биткойн-платежи требуют 1 подтверждения, что может занять 20 минут или дольше. Спасибо тебе за твое терпение! Вы получите электронное письмо, когда платеж будет подтвержден.", "block_height": "Высота блока", "block_remaining": "1 Блок остался", diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index d5887fd734..7f161832cb 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "สแกนลายนิ้วมือของคุณเพื่อยืนยันตัวตน", "bitcoin_dark_theme": "ธีมมืด Bitcoin", "bitcoin_light_theme": "ธีมแสง Bitcoin", + "bitcoin_lightning_deposit": "เงินฝาก", + "bitcoin_lightning_withdraw": "ถอน", "bitcoin_payments_require_1_confirmation": "การชำระเงินด้วย Bitcoin ต้องการการยืนยัน 1 ครั้ง ซึ่งอาจใช้เวลา 20 นาทีหรือนานกว่านั้น ขอบคุณสำหรับความอดทนของคุณ! คุณจะได้รับอีเมลเมื่อการชำระเงินได้รับการยืนยัน", "block_height": "ความสูงของบล็อก", "block_remaining": "เหลือ 1 บล็อก", diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb index 97712fdba3..eee24ac822 100644 --- a/res/values/strings_tl.arb +++ b/res/values/strings_tl.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "I-scan ang iyong fingerprint para ma-authenticate", "bitcoin_dark_theme": "Bitcoin Dark Theme", "bitcoin_light_theme": "Bitcoin Light Theme", + "bitcoin_lightning_deposit": "Deposito", + "bitcoin_lightning_withdraw": "Umatras", "bitcoin_payments_require_1_confirmation": "Ang mga pagbabayad sa Bitcoin ay nangangailangan ng 1 kumpirmasyon, na maaaring tumagal ng 20 minuto o mas mahaba. Salamat sa iyong pasensya! Mag-email ka kapag nakumpirma ang pagbabayad.", "block_height": "I -block ang taas", "block_remaining": "1 Bloke ang Natitira", diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index be2dd8fd7d..26acfb0d2e 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "Kimlik doğrulaması için parmak izini okutun", "bitcoin_dark_theme": "Bitcoin Karanlık Teması", "bitcoin_light_theme": "Bitcoin Hafif Tema", + "bitcoin_lightning_deposit": "Mevduat", + "bitcoin_lightning_withdraw": "Geri çekilmek", "bitcoin_payments_require_1_confirmation": "Bitcoin ödemeleri, 20 dakika veya daha uzun sürebilen 1 onay gerektirir. Sabrınız için teşekkürler! Ödeme onaylandığında e-posta ile bilgilendirileceksiniz.", "block_height": "Blok yüksekliği", "block_remaining": "Kalan 1 blok", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index e64086e271..33ba350e25 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "Відскануйте свій відбиток пальця для аутентифікації", "bitcoin_dark_theme": "Темна тема Bitcoin", "bitcoin_light_theme": "Світла тема Bitcoin", + "bitcoin_lightning_deposit": "депозит", + "bitcoin_lightning_withdraw": "Вилучити", "bitcoin_payments_require_1_confirmation": "Платежі Bitcoin потребують 1 підтвердження, яке може зайняти 20 хвилин або більше. Дякую за Ваше терпіння! Ви отримаєте електронний лист, коли платіж буде підтверджено.", "block_height": "Висота блоку", "block_remaining": "1 блок, що залишився", diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index 5190195d15..9f180ae66f 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "تصدیق کرنے کے لیے اپنے فنگر پرنٹ کو اسکین کریں۔", "bitcoin_dark_theme": "بٹ کوائن ڈارک تھیم", "bitcoin_light_theme": "بٹ کوائن لائٹ تھیم", + "bitcoin_lightning_deposit": "جمع کروائیں", + "bitcoin_lightning_withdraw": "واپس لے لو", "bitcoin_payments_require_1_confirmation": "بٹ کوائن کی ادائیگی میں 1 تصدیق کی ضرورت ہوتی ہے ، جس میں 20 منٹ یا اس سے زیادہ وقت لگ سکتا ہے۔ آپ کے صبر کا شکریہ! ادائیگی کی تصدیق ہونے پر آپ کو ای میل کیا جائے گا۔", "block_height": "اونچائی کو بلاک کریں", "block_remaining": "1 بلاک باقی", diff --git a/res/values/strings_vi.arb b/res/values/strings_vi.arb index 4f3abc8de6..7961970d2d 100644 --- a/res/values/strings_vi.arb +++ b/res/values/strings_vi.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "Quét vân tay để xác thực", "bitcoin_dark_theme": "Chủ đề Bitcoin tối", "bitcoin_light_theme": "Chủ đề Bitcoin sáng", + "bitcoin_lightning_deposit": "Tiền gửi", + "bitcoin_lightning_withdraw": "Rút", "bitcoin_payments_require_1_confirmation": "Các khoản thanh toán Bitcoin yêu cầu 1 xác nhận, có thể mất 20 phút hoặc lâu hơn. Cảm ơn bạn đã kiên nhẫn! Bạn sẽ nhận được email khi thanh toán được xác nhận.", "block_height": "Chiều cao khối", "block_remaining": "1 khối còn lại", diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index ef80e77a0a..c8351ba770 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "Ya ìka ọwọ́ yín láti ṣe ìfẹ̀rílàdí", "bitcoin_dark_theme": "Bitcoin Dark Akori", "bitcoin_light_theme": "Bitcoin Light Akori", + "bitcoin_lightning_deposit": "Owo ifipamọ", + "bitcoin_lightning_withdraw": "Yọkuro", "bitcoin_payments_require_1_confirmation": "Àwọn àránṣẹ́ Bitcoin nílò ìjẹ́rìísí kan. Ó lè lo ìṣéjú ogun tàbí ìṣéjú jù. A dúpẹ́ fún sùúrù yín! Ẹ máa gba ímeèlì t'ó bá jẹ́rìísí àránṣẹ́ náà.", "block_height": "Dènà giga", "block_remaining": "1 bulọọki to ku", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index ba602b0241..cd7a33578f 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -96,6 +96,8 @@ "biometric_auth_reason": "扫描指纹进行身份认证", "bitcoin_dark_theme": "比特币黑暗主题", "bitcoin_light_theme": "比特币浅色主题", + "bitcoin_lightning_deposit": "订金", + "bitcoin_lightning_withdraw": "提取", "bitcoin_payments_require_1_confirmation": "比特币支付需要 1 次确认,这可能需要 20 分钟或更长时间。谢谢你的耐心!确认付款后,您将收到电子邮件。", "block_height": "块高度", "block_remaining": "剩下1个块", From 5ac24a9afe1e7e6d5c618f281920c37b05051553 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Wed, 5 Nov 2025 16:16:37 +0100 Subject: [PATCH 039/105] feat: reload balance and tx history after sending a lightning transaction --- assets/images/lightning-icon.svg | 46 +++++++++++++++++++ .../lib/lightning/lightning_wallet.dart | 8 ++-- .../pending_lightning_transaction.dart | 8 +++- cw_bitcoin/pubspec.yaml | 2 +- lib/view_model/send/send_view_model.dart | 5 +- 5 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 assets/images/lightning-icon.svg diff --git a/assets/images/lightning-icon.svg b/assets/images/lightning-icon.svg new file mode 100644 index 0000000000..aa4d3a9225 --- /dev/null +++ b/assets/images/lightning-icon.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cw_bitcoin/lib/lightning/lightning_wallet.dart b/cw_bitcoin/lib/lightning/lightning_wallet.dart index 4d44dc3b58..087bfa1079 100644 --- a/cw_bitcoin/lib/lightning/lightning_wallet.dart +++ b/cw_bitcoin/lib/lightning/lightning_wallet.dart @@ -2,7 +2,6 @@ import 'package:breez_sdk_spark_flutter/breez_sdk_spark.dart'; import 'package:cw_bitcoin/bitcoin_transaction_priority.dart'; import 'package:cw_bitcoin/electrum_transaction_info.dart'; import 'package:cw_bitcoin/lightning/pending_lightning_transaction.dart'; -import 'package:cw_core/pending_transaction.dart'; import 'package:cw_core/transaction_direction.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_type.dart'; @@ -81,7 +80,7 @@ class LightningWallet { } } - Future createTransaction( + Future createTransaction( String address, BigInt? amountSats, BitcoinTransactionPriority? priority) async { final inputType = await sdk.parse(input: address); @@ -120,10 +119,11 @@ class LightningWallet { return PendingLightningTransaction( id: prepareResponse.invoiceDetails.paymentHash, - amount: prepareResponse.invoiceDetails.amountMsat?.toInt() ?? 0, + amount: ((prepareResponse.invoiceDetails.amountMsat?.toInt() ?? 0) / 1000).round(), fee: feeSats.toInt(), commitOverride: () async { - await sdk.lnurlPay(request: LnurlPayRequest(prepareResponse: prepareResponse)); + final res = await sdk.lnurlPay(request: LnurlPayRequest(prepareResponse: prepareResponse)); + printV(res.payment.status.name); }, ); } else if (inputType is InputType_BitcoinAddress) { diff --git a/cw_bitcoin/lib/lightning/pending_lightning_transaction.dart b/cw_bitcoin/lib/lightning/pending_lightning_transaction.dart index 72b4423783..cb75b7d2b3 100644 --- a/cw_bitcoin/lib/lightning/pending_lightning_transaction.dart +++ b/cw_bitcoin/lib/lightning/pending_lightning_transaction.dart @@ -14,6 +14,7 @@ class PendingLightningTransaction with PendingTransaction { final int fee; final bool isSendAll; Future Function() commitOverride; + final List _listeners =[]; @override final String id; @@ -34,11 +35,16 @@ class PendingLightningTransaction with PendingTransaction { int? get outputCount => 1; @override - Future commit() => commitOverride.call(); + Future commit() async { + await commitOverride.call(); + _listeners.forEach((e) => e.call()); + } @override bool shouldCommitUR() => false; @override Future> commitUR() => throw UnimplementedError(); + + void addListener(void Function() listener) => _listeners.add(listener); } diff --git a/cw_bitcoin/pubspec.yaml b/cw_bitcoin/pubspec.yaml index 439492bda0..ca6f75f0fa 100644 --- a/cw_bitcoin/pubspec.yaml +++ b/cw_bitcoin/pubspec.yaml @@ -75,7 +75,7 @@ dependencies: breez_sdk_spark_flutter: git: url: https://github.com/breez/breez-sdk-spark-flutter - ref: 92f62dc2037cf08003e418aadda58f451c021f42 + ref: bca05bc9085f778e95916d55e9a75133c27755a2 dev_dependencies: flutter_test: diff --git a/lib/view_model/send/send_view_model.dart b/lib/view_model/send/send_view_model.dart index 4090cb59e9..217d7cf45d 100644 --- a/lib/view_model/send/send_view_model.dart +++ b/lib/view_model/send/send_view_model.dart @@ -57,7 +57,6 @@ import 'package:cw_core/sync_status.dart'; import 'package:cw_core/transaction_info.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/utils/print_verbose.dart'; -import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:flutter/material.dart'; import 'package:hive/hive.dart'; @@ -807,9 +806,11 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor // Immediate transaction update for EVM chains, Solana, Tron, and Nano if (isEVMWallet || - [WalletType.solana, WalletType.tron, WalletType.nano].contains(walletType)) { + [WalletType.bitcoin, WalletType.solana, WalletType.tron, WalletType.nano] + .contains(walletType)) { Future.delayed(Duration(seconds: 4), () async { try { + await wallet.updateBalance(); await wallet.updateTransactionsHistory(); } catch (e) { printV('Failed to update transactions after send: $e'); From b78ee5b5bc7872815eada6e8c29c53c2d09508d5 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Thu, 6 Nov 2025 09:53:07 +0100 Subject: [PATCH 040/105] feat: improve address formatting for human-readable addresses and update the default LNURL domain --- assets/images/btc_chain_qr_lightning.svg | 5 +++++ cw_bitcoin/lib/bitcoin_wallet.dart | 2 +- cw_bitcoin/lib/electrum_wallet_addresses.dart | 12 ++++++++++-- lib/utils/address_formatter.dart | 7 ++++++- .../wallet_address_list_view_model.dart | 5 ++++- 5 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 assets/images/btc_chain_qr_lightning.svg diff --git a/assets/images/btc_chain_qr_lightning.svg b/assets/images/btc_chain_qr_lightning.svg new file mode 100644 index 0000000000..b18ac0b9f8 --- /dev/null +++ b/assets/images/btc_chain_qr_lightning.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/cw_bitcoin/lib/bitcoin_wallet.dart b/cw_bitcoin/lib/bitcoin_wallet.dart index 304618e714..3b903897c1 100644 --- a/cw_bitcoin/lib/bitcoin_wallet.dart +++ b/cw_bitcoin/lib/bitcoin_wallet.dart @@ -99,7 +99,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { lightningWallet = LightningWallet( mnemonic: mnemonic, apiKey: secrets.breezApiKey, - lnurlDomain: "breez.tips", + lnurlDomain: "cake.cash", ); } else { lightningWallet = null; diff --git a/cw_bitcoin/lib/electrum_wallet_addresses.dart b/cw_bitcoin/lib/electrum_wallet_addresses.dart index 7ef455793f..03b32bf4e7 100644 --- a/cw_bitcoin/lib/electrum_wallet_addresses.dart +++ b/cw_bitcoin/lib/electrum_wallet_addresses.dart @@ -1,4 +1,5 @@ import 'dart:io' show Platform; +import 'dart:math'; import 'package:bitcoin_base/bitcoin_base.dart'; import 'package:blockchain_utils/blockchain_utils.dart'; @@ -761,8 +762,15 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { lightningAddress = await lightningWallet!.getAddress(); if (lightningAddress == null) { - lightningAddress = - await lightningWallet!.registerAddress(walletName.replaceAll(" ", "").toLowerCase()); + final randomNumber = Random.secure().nextInt(9999); + final username = "${walletName.replaceAll(" ", "")}$randomNumber".toLowerCase(); + try { + lightningAddress = await lightningWallet!.registerAddress(username); + } catch (e) { + printV(e); + printV(username); + rethrow; + } } } } diff --git a/lib/utils/address_formatter.dart b/lib/utils/address_formatter.dart index f2083c7724..bd46985828 100644 --- a/lib/utils/address_formatter.dart +++ b/lib/utils/address_formatter.dart @@ -15,6 +15,11 @@ class AddressFormatter { final cleanAddress = address.replaceAll('bitcoincash:', ''); final isMWEB = address.startsWith('ltcmweb'); final chunkSize = walletType != null ? _getChunkSize(walletType) : 4; + final isHumanReadable = address.contains("@"); + + if (isHumanReadable) { + return Text(address, style: evenTextStyle, textAlign: textAlign ?? TextAlign.start); + } if (shouldTruncate) { return _buildTruncatedAddress( @@ -158,4 +163,4 @@ class AddressFormatter { return 4; } } -} \ No newline at end of file +} diff --git a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart index db7111017a..d4d2a69add 100644 --- a/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart +++ b/lib/view_model/wallet_address_list/wallet_address_list_view_model.dart @@ -435,7 +435,10 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo } @computed - String get qrImage => getQrImage(type); + String get qrImage { + if (uri is LightningPaymentRequest) return 'assets/images/btc_chain_qr_lightning.svg'; + return getQrImage(type); + } @computed String get monoImage => getChainMonoImage(type); From f40f95025a7cdb4a546c1c3bbf323b96dd6ee270 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Thu, 6 Nov 2025 10:34:46 +0100 Subject: [PATCH 041/105] fix: merge conflicts --- cw_bitcoin/pubspec.lock | 6 +++--- lib/view_model/dashboard/transaction_list_item.dart | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cw_bitcoin/pubspec.lock b/cw_bitcoin/pubspec.lock index e281c7f7b4..4bbd0c3dea 100644 --- a/cw_bitcoin/pubspec.lock +++ b/cw_bitcoin/pubspec.lock @@ -134,11 +134,11 @@ packages: dependency: "direct main" description: path: "." - ref: "92f62dc2037cf08003e418aadda58f451c021f42" - resolved-ref: "92f62dc2037cf08003e418aadda58f451c021f42" + ref: bca05bc9085f778e95916d55e9a75133c27755a2 + resolved-ref: bca05bc9085f778e95916d55e9a75133c27755a2 url: "https://github.com/breez/breez-sdk-spark-flutter" source: git - version: "0.3.4" + version: "0.3.5-rc1" bs58check: dependency: transitive description: diff --git a/lib/view_model/dashboard/transaction_list_item.dart b/lib/view_model/dashboard/transaction_list_item.dart index 8336a2374c..27c2ed1ab1 100644 --- a/lib/view_model/dashboard/transaction_list_item.dart +++ b/lib/view_model/dashboard/transaction_list_item.dart @@ -206,7 +206,7 @@ class TransactionListItem extends ActionListItem with Keyable { break; case WalletType.arbitrum: final asset = arbitrum!.assetOfTransaction(balanceViewModel.wallet, transaction); - final price = balanceViewModel.fiatConvertationStore.prices[asset]; + final price = balanceViewModel.fiatConversionStore.prices[asset]; amount = calculateFiatAmountRaw( cryptoAmount: arbitrum!.formatterArbitrumAmountToDouble(transaction: transaction), price: price); From 5357efb77f3b6a38ba1efd4e383b82cd561355a8 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Fri, 7 Nov 2025 14:42:52 +0100 Subject: [PATCH 042/105] feat: add error handling for LightningWallet initialization and adjust transaction direction logic --- cw_bitcoin/lib/bitcoin_wallet.dart | 15 ++++++++++----- cw_bitcoin/lib/lightning/lightning_wallet.dart | 6 ++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/cw_bitcoin/lib/bitcoin_wallet.dart b/cw_bitcoin/lib/bitcoin_wallet.dart index 3b903897c1..b1f7861f1e 100644 --- a/cw_bitcoin/lib/bitcoin_wallet.dart +++ b/cw_bitcoin/lib/bitcoin_wallet.dart @@ -31,6 +31,7 @@ import 'package:cw_core/payjoin_session.dart'; import 'package:cw_core/pending_transaction.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:cw_core/unspent_coins_info.dart'; +import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/utils/zpub.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_keys_file.dart'; @@ -96,11 +97,15 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { // final hd = bitcoin.HDWallet.fromSeed(seedBytes, network: networkType); if (mnemonic != null) { - lightningWallet = LightningWallet( - mnemonic: mnemonic, - apiKey: secrets.breezApiKey, - lnurlDomain: "cake.cash", - ); + try { + lightningWallet = LightningWallet( + mnemonic: mnemonic, + apiKey: secrets.breezApiKey, + lnurlDomain: "cake.cash", + ); + } catch (e) { + printV(e); + } } else { lightningWallet = null; } diff --git a/cw_bitcoin/lib/lightning/lightning_wallet.dart b/cw_bitcoin/lib/lightning/lightning_wallet.dart index 087bfa1079..315d7406dd 100644 --- a/cw_bitcoin/lib/lightning/lightning_wallet.dart +++ b/cw_bitcoin/lib/lightning/lightning_wallet.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:breez_sdk_spark_flutter/breez_sdk_spark.dart'; import 'package:cw_bitcoin/bitcoin_transaction_priority.dart'; import 'package:cw_bitcoin/electrum_transaction_info.dart'; @@ -187,6 +189,10 @@ class LightningWallet { for (final payment in payments) { TransactionDirection direction = TransactionDirection.outgoing; + if (payment.paymentType == PaymentType.receive) { + direction = TransactionDirection.incoming; + } + if (payment.method == PaymentMethod.deposit) { direction = TransactionDirection.incoming; } From 14e7ed35a8763f63895f06573f6e374cbb684e15 Mon Sep 17 00:00:00 2001 From: Robert Malikowski Date: Sun, 16 Nov 2025 11:34:10 +0100 Subject: [PATCH 043/105] integrate homepage from new ui mockup --- .../WixMadeforText-VariableFont_wght.ttf | Bin 0 -> 152580 bytes assets/new-ui/3dots.svg | 3 + assets/new-ui/Apps.svg | 21 ++ assets/new-ui/Charts.svg | 10 + assets/new-ui/Contacts.svg | 3 + assets/new-ui/Home.svg | 16 + assets/new-ui/Wallets.svg | 3 + assets/new-ui/addr-book.svg | 3 + assets/new-ui/bitcoin.svg | 13 + assets/new-ui/btcqr.png | Bin 0 -> 188035 bytes assets/new-ui/copy-icon.svg | 11 + assets/new-ui/exchange.svg | 11 + assets/new-ui/history-received.svg | 3 + assets/new-ui/history-receiving.svg | 3 + assets/new-ui/history-sending.svg | 3 + assets/new-ui/history-sent.svg | 3 + assets/new-ui/lightning.svg | 14 + assets/new-ui/receive.svg | 10 + assets/new-ui/scan.svg | 10 + assets/new-ui/send.svg | 3 + assets/new-ui/settings.png | Bin 0 -> 1249 bytes assets/new-ui/switcher-bitcoin-off.svg | 3 + assets/new-ui/switcher-bitcoin.svg | 4 + assets/new-ui/switcher-lightning-off.svg | 3 + assets/new-ui/switcher-lightning.svg | 4 + assets/new-ui/top-settings.svg | 5 + assets/new-ui/wallet-trezor.svg | 10 + cw_core/lib/payment_uris.dart | 8 +- lib/di.dart | 19 +- lib/entities/new_main_actions.dart | 11 +- lib/new-ui/new_dashboard.dart | 100 ++++++ lib/new-ui/pages/receive_page.dart | 66 ++++ lib/new-ui/pages/scan_page.dart | 10 + lib/new-ui/pages/send_page.dart | 10 + .../action_row/coin_action_button.dart | 56 ++++ .../action_row/coin_action_row.dart | 65 ++++ .../coins_page/assets_history/asset_tile.dart | 74 +++++ .../assets_history/assets_section.dart | 23 ++ .../assets_history/assets_top_bar.dart | 64 ++++ .../assets_history/history_section.dart | 55 ++++ .../assets_history/history_tile.dart | 109 +++++++ .../assets_history/lightning_assets.dart | 39 +++ .../coins_page/cards/balance_card.dart | 127 ++++++++ .../widgets/coins_page/cards/cards_view.dart | 138 +++++++++ lib/new-ui/widgets/coins_page/top_bar.dart | 78 +++++ .../widgets/coins_page/wallet_info.dart | 50 +++ lib/new-ui/widgets/line_tab_switcher.dart | 134 ++++++++ lib/new-ui/widgets/modern_button.dart | 62 ++++ lib/new-ui/widgets/navbar/navbar.dart | 68 +++++ lib/new-ui/widgets/navbar/navbar_button.dart | 67 ++++ .../receive_page/receive_amount_input.dart | 90 ++++++ .../receive_page/receive_bottom_buttons.dart | 97 ++++++ .../widgets/receive_page/receive_qr_code.dart | 43 +++ .../receive_seed_type_selector.dart | 51 ++++ .../receive_page/receive_seed_widget.dart | 40 +++ .../widgets/receive_page/receive_top_bar.dart | 27 ++ lib/router.dart | 264 ++++++++++------ .../widgets/new_main_navbar_widget.dart | 286 ++++++++---------- lib/typography.dart | 4 +- lib/utils/feature_flag.dart | 4 +- .../exchange/exchange_trade_view_model.dart | 11 - lib/view_model/send/send_view_model.dart | 7 +- 62 files changed, 2237 insertions(+), 292 deletions(-) create mode 100644 assets/fonts/WixMadeforText-VariableFont_wght.ttf create mode 100644 assets/new-ui/3dots.svg create mode 100644 assets/new-ui/Apps.svg create mode 100644 assets/new-ui/Charts.svg create mode 100644 assets/new-ui/Contacts.svg create mode 100644 assets/new-ui/Home.svg create mode 100644 assets/new-ui/Wallets.svg create mode 100644 assets/new-ui/addr-book.svg create mode 100644 assets/new-ui/bitcoin.svg create mode 100644 assets/new-ui/btcqr.png create mode 100644 assets/new-ui/copy-icon.svg create mode 100644 assets/new-ui/exchange.svg create mode 100644 assets/new-ui/history-received.svg create mode 100644 assets/new-ui/history-receiving.svg create mode 100644 assets/new-ui/history-sending.svg create mode 100644 assets/new-ui/history-sent.svg create mode 100644 assets/new-ui/lightning.svg create mode 100644 assets/new-ui/receive.svg create mode 100644 assets/new-ui/scan.svg create mode 100644 assets/new-ui/send.svg create mode 100644 assets/new-ui/settings.png create mode 100644 assets/new-ui/switcher-bitcoin-off.svg create mode 100644 assets/new-ui/switcher-bitcoin.svg create mode 100644 assets/new-ui/switcher-lightning-off.svg create mode 100644 assets/new-ui/switcher-lightning.svg create mode 100644 assets/new-ui/top-settings.svg create mode 100644 assets/new-ui/wallet-trezor.svg create mode 100644 lib/new-ui/new_dashboard.dart create mode 100644 lib/new-ui/pages/receive_page.dart create mode 100644 lib/new-ui/pages/scan_page.dart create mode 100644 lib/new-ui/pages/send_page.dart create mode 100644 lib/new-ui/widgets/coins_page/action_row/coin_action_button.dart create mode 100644 lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart create mode 100644 lib/new-ui/widgets/coins_page/assets_history/asset_tile.dart create mode 100644 lib/new-ui/widgets/coins_page/assets_history/assets_section.dart create mode 100644 lib/new-ui/widgets/coins_page/assets_history/assets_top_bar.dart create mode 100644 lib/new-ui/widgets/coins_page/assets_history/history_section.dart create mode 100644 lib/new-ui/widgets/coins_page/assets_history/history_tile.dart create mode 100644 lib/new-ui/widgets/coins_page/assets_history/lightning_assets.dart create mode 100644 lib/new-ui/widgets/coins_page/cards/balance_card.dart create mode 100644 lib/new-ui/widgets/coins_page/cards/cards_view.dart create mode 100644 lib/new-ui/widgets/coins_page/top_bar.dart create mode 100644 lib/new-ui/widgets/coins_page/wallet_info.dart create mode 100644 lib/new-ui/widgets/line_tab_switcher.dart create mode 100644 lib/new-ui/widgets/modern_button.dart create mode 100644 lib/new-ui/widgets/navbar/navbar.dart create mode 100644 lib/new-ui/widgets/navbar/navbar_button.dart create mode 100644 lib/new-ui/widgets/receive_page/receive_amount_input.dart create mode 100644 lib/new-ui/widgets/receive_page/receive_bottom_buttons.dart create mode 100644 lib/new-ui/widgets/receive_page/receive_qr_code.dart create mode 100644 lib/new-ui/widgets/receive_page/receive_seed_type_selector.dart create mode 100644 lib/new-ui/widgets/receive_page/receive_seed_widget.dart create mode 100644 lib/new-ui/widgets/receive_page/receive_top_bar.dart diff --git a/assets/fonts/WixMadeforText-VariableFont_wght.ttf b/assets/fonts/WixMadeforText-VariableFont_wght.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5994d24be65d6829efef10c85d95cf116e221782 GIT binary patch literal 152580 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 + + \ No newline at end of file diff --git a/assets/new-ui/Apps.svg b/assets/new-ui/Apps.svg new file mode 100644 index 0000000000..334d800349 --- /dev/null +++ b/assets/new-ui/Apps.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/new-ui/Charts.svg b/assets/new-ui/Charts.svg new file mode 100644 index 0000000000..cc86078e64 --- /dev/null +++ b/assets/new-ui/Charts.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/new-ui/Contacts.svg b/assets/new-ui/Contacts.svg new file mode 100644 index 0000000000..a0b0f28945 --- /dev/null +++ b/assets/new-ui/Contacts.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/new-ui/Home.svg b/assets/new-ui/Home.svg new file mode 100644 index 0000000000..31a55b115b --- /dev/null +++ b/assets/new-ui/Home.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/assets/new-ui/Wallets.svg b/assets/new-ui/Wallets.svg new file mode 100644 index 0000000000..04c91d0e87 --- /dev/null +++ b/assets/new-ui/Wallets.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/new-ui/addr-book.svg b/assets/new-ui/addr-book.svg new file mode 100644 index 0000000000..c25d3b7dbc --- /dev/null +++ b/assets/new-ui/addr-book.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/new-ui/bitcoin.svg b/assets/new-ui/bitcoin.svg new file mode 100644 index 0000000000..391f3c289e --- /dev/null +++ b/assets/new-ui/bitcoin.svg @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/assets/new-ui/btcqr.png b/assets/new-ui/btcqr.png new file mode 100644 index 0000000000000000000000000000000000000000..a5c34ed1f5271059157fcf2f59bd435c077bd482 GIT binary patch literal 188035 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 literal 0 HcmV?d00001 diff --git a/assets/new-ui/copy-icon.svg b/assets/new-ui/copy-icon.svg new file mode 100644 index 0000000000..3cc98258d7 --- /dev/null +++ b/assets/new-ui/copy-icon.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/new-ui/exchange.svg b/assets/new-ui/exchange.svg new file mode 100644 index 0000000000..0bf048de8e --- /dev/null +++ b/assets/new-ui/exchange.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/new-ui/history-received.svg b/assets/new-ui/history-received.svg new file mode 100644 index 0000000000..3dab9e7312 --- /dev/null +++ b/assets/new-ui/history-received.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/new-ui/history-receiving.svg b/assets/new-ui/history-receiving.svg new file mode 100644 index 0000000000..cec2958dc6 --- /dev/null +++ b/assets/new-ui/history-receiving.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/new-ui/history-sending.svg b/assets/new-ui/history-sending.svg new file mode 100644 index 0000000000..f40ec89a0c --- /dev/null +++ b/assets/new-ui/history-sending.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/new-ui/history-sent.svg b/assets/new-ui/history-sent.svg new file mode 100644 index 0000000000..649e03d087 --- /dev/null +++ b/assets/new-ui/history-sent.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/new-ui/lightning.svg b/assets/new-ui/lightning.svg new file mode 100644 index 0000000000..9788dcc17e --- /dev/null +++ b/assets/new-ui/lightning.svg @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/assets/new-ui/receive.svg b/assets/new-ui/receive.svg new file mode 100644 index 0000000000..fc420ad694 --- /dev/null +++ b/assets/new-ui/receive.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/new-ui/scan.svg b/assets/new-ui/scan.svg new file mode 100644 index 0000000000..b3e6a3258b --- /dev/null +++ b/assets/new-ui/scan.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/new-ui/send.svg b/assets/new-ui/send.svg new file mode 100644 index 0000000000..cde7609f63 --- /dev/null +++ b/assets/new-ui/send.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/new-ui/settings.png b/assets/new-ui/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..b6cfb5b0884b7eea4d95b17850aa9c71f52da7b7 GIT binary patch literal 1249 zcmV<71Rnc|P)V$O*f<+AU@x+=XO*e|vAuHHn;D-V;}dwYa@iZ? z6Tl5JB&iC_kDBiZK?$bS-D;SaXJ9Oq35cKuNGTtLkSVn$1%wh}A%sjB2nvM#?#sF9X!N&>Y}9DnYOmcL zQUKI!0{cf7x2I9m#m_mZ)WMUDrBj{UAG*%i=JYSqqym8I2xemWK(^>CVQ| zo^38+Q$CUMToK*QUG7Io(r#}qzs@h5j7D9^HOT=&sU9|?lb_@H@nsXr?C00Q?~cs~ zQBrxzPmY^o{N2ZC3+HoG5^M;3;tb(+t0;Qej1WG`e`}bG(7v=)Ql5cb-hFm_xu+YO zF<}4XYN1NX=kQQ>amIl5`eF*st|ZX|7kQ1bz@osb~cv>IP|F^ zfDi0-3KCyoA{!&t*QH#cvf)vwfk4%Xq!uS4ij#N$->TK?Hx?oXkVt06GFx%24WS<$#T_Y2{)``Gc` ze~rdnoAL~nK}?^A0SDv&Da49t+?a`{QobS!Sdph2OKtK1%7-2mgvT6)DE{V)ioY2H z(t--b7V7pbTW!Oy4eus-BCTM@WA5N=C3asW$zkorjrdDLQUkb4;zlE_)lD7M7vRV1 z^4gfdYs2Bsop0a(p;VkC$r(pWVeDZI_}bmi!&e73Mta>y#hK9u*wF#`0J?j(lpO0R z5b!jw$rIiNOvd9k6bNXLV)BHy0rH0*o%&xVL{aHx=#w7g2{jo7V;3gV>9;pP2Bb&e zPj|=@l02PJSyFsCEo6&4pg#2Ep9-v|;EY&8F=WTptn~Iq=|qN*i_MEsIQBV-&Xf|n zNbfht<2#8`T!orx5}v4DU;P@A3Kj1wYYWRXjFi1M_4;*3S4!xRF>PGTnH>z3C>Uq2 z4h|Xk0LpFIpjE z{SyfM87KsplF?n)8lVhL^Sw}tTHM}P>Wd1|i_FX+&vbNSg--l*bGc_U0yT-`u!u}d zei-6OAK2zFDW8p-kvg=L-H+!w2JSa-NQm_uwVXaN0sVg)jkSDT!*kS-NAirFP5Dg5 zjx;AAb8;WdEU}JgEmKvR=$PNJVa!QoCB&g^E++$A@V!2>2K&&RD&*1}!FNI_&j|XZ zo*6T%40;F(h@b{A-Di`50YN{U1oMH9fWyDULErG>^?_rqQb4>1zMu?PHargg00000 LNkvXXu0mjfc7{ks literal 0 HcmV?d00001 diff --git a/assets/new-ui/switcher-bitcoin-off.svg b/assets/new-ui/switcher-bitcoin-off.svg new file mode 100644 index 0000000000..d529c77e28 --- /dev/null +++ b/assets/new-ui/switcher-bitcoin-off.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/new-ui/switcher-bitcoin.svg b/assets/new-ui/switcher-bitcoin.svg new file mode 100644 index 0000000000..1fadb6eb10 --- /dev/null +++ b/assets/new-ui/switcher-bitcoin.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/new-ui/switcher-lightning-off.svg b/assets/new-ui/switcher-lightning-off.svg new file mode 100644 index 0000000000..d72c681b09 --- /dev/null +++ b/assets/new-ui/switcher-lightning-off.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/new-ui/switcher-lightning.svg b/assets/new-ui/switcher-lightning.svg new file mode 100644 index 0000000000..f9c5f40a1f --- /dev/null +++ b/assets/new-ui/switcher-lightning.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/new-ui/top-settings.svg b/assets/new-ui/top-settings.svg new file mode 100644 index 0000000000..ba716f8d5f --- /dev/null +++ b/assets/new-ui/top-settings.svg @@ -0,0 +1,5 @@ + + + diff --git a/assets/new-ui/wallet-trezor.svg b/assets/new-ui/wallet-trezor.svg new file mode 100644 index 0000000000..d0747c4444 --- /dev/null +++ b/assets/new-ui/wallet-trezor.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/cw_core/lib/payment_uris.dart b/cw_core/lib/payment_uris.dart index ed172ca044..6a6a60b362 100644 --- a/cw_core/lib/payment_uris.dart +++ b/cw_core/lib/payment_uris.dart @@ -67,7 +67,7 @@ class LightningPaymentRequest extends PaymentURI { } class LitecoinURI extends PaymentURI { - LitecoinURI({required super.amount, required super.address}); + LitecoinURI({required super.amount, required super.address, required super.scheme}); @override String toString() { @@ -79,7 +79,7 @@ class LitecoinURI extends PaymentURI { } class EthereumURI extends PaymentURI { - EthereumURI({required super.amount, required super.address}); + EthereumURI({required super.amount, required super.address, required super.scheme}); @override String toString() { @@ -91,7 +91,7 @@ class EthereumURI extends PaymentURI { } class BaseURI extends PaymentURI { - BaseURI({required super.amount, required super.address}); + BaseURI({required super.amount, required super.address, required super.scheme}); @override String toString() { @@ -103,7 +103,7 @@ class BaseURI extends PaymentURI { } class ArbitrumURI extends PaymentURI { - ArbitrumURI({required super.amount, required super.address}); + ArbitrumURI({required super.amount, required super.address, required super.scheme}); @override String toString() { diff --git a/lib/di.dart b/lib/di.dart index 4138842595..5d970b06bb 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -11,6 +11,7 @@ import 'package:cake_wallet/bitcoin_cash/bitcoin_cash.dart'; import 'package:cake_wallet/buy/dfx/dfx_buy_provider.dart'; import 'package:cake_wallet/buy/moonpay/moonpay_provider.dart'; import 'package:cake_wallet/buy/onramper/onramper_buy_provider.dart'; +import 'package:cake_wallet/new-ui/new_dashboard.dart'; import 'package:cake_wallet/order/order.dart'; import 'package:cake_wallet/core/backup_service_v3.dart'; import 'package:cake_wallet/core/new_wallet_arguments.dart'; @@ -748,6 +749,10 @@ Future setup({ addressListViewModel: getIt.get(), )); + getIt.registerFactory(() => NewDashboard( + dashboardViewModel: getIt.get(), + )); + getIt.registerFactory(() { final GlobalKey _navigatorKey = GlobalKey(); return DesktopSidebarWrapper( @@ -1015,7 +1020,7 @@ Future setup({ getIt.registerFactory(() => WalletKeysViewModel(getIt.get())); getIt.registerFactory(() => WalletKeysPage(getIt.get())); - + getIt.registerFactory(() => AnimatedURModel(getIt.get())); getIt.registerFactoryParam, void>((Map urQr, _) => @@ -1581,24 +1586,24 @@ Future setup({ getIt.registerFactory(() => DevSharedPreferencesPage(getIt.get())); getIt.registerFactory(() => DevSecurePreferencesPage(getIt.get())); - + getIt.registerFactory(() => BackgroundSyncLogsViewModel()); - + getIt.registerFactory(() => DevBackgroundSyncLogsPage(getIt.get())); - + getIt.registerFactory(() => SocketHealthLogsViewModel()); getIt.registerFactory(() => DevSocketHealthLogsPage(getIt.get())); - + getIt.registerFactory(() => DevNetworkRequests()); - + getIt.registerFactory(() => DevQRToolsPage()); getIt.registerFactory(() => ExchangeProviderLogsViewModel()); getIt.registerFactory(() => DevExchangeProviderLogsPage(getIt.get())); getIt.registerFactory(() => StartTorPage(StartTorViewModel(),)); - + getIt.registerFactory(() => DEuroViewModel( getIt(), getIt(), diff --git a/lib/entities/new_main_actions.dart b/lib/entities/new_main_actions.dart index 0f904ae2a6..609b04cf4d 100644 --- a/lib/entities/new_main_actions.dart +++ b/lib/entities/new_main_actions.dart @@ -1,5 +1,4 @@ import 'package:cake_wallet/generated/i18n.dart'; -import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; import 'package:flutter/material.dart'; @@ -31,14 +30,14 @@ class NewMainActions { static NewMainActions homeAction = NewMainActions._( name: (context) => 'Home', //TODO S.of(context).home, - image: 'assets/images/main_actions/home.svg', + image: 'assets/new-ui/Home.svg', key: ValueKey('dashboard_page_home_action_button_key'), onTap: () {}, ); static NewMainActions walletsAction = NewMainActions._( name: (context) => S.of(context).wallets, - image: 'assets/images/main_actions/wallets.svg', + image: 'assets/new-ui/Wallets.svg', key: ValueKey('dashboard_page_wallets_action_button_key'), onTap: () {}, ); @@ -46,21 +45,21 @@ class NewMainActions { static NewMainActions contactsAction = NewMainActions._( name: (context) => 'Contacts', //TODO S.of(context).contacts, - image: 'assets/images/main_actions/contacts.svg', + image: 'assets/new-ui/Contacts.svg', key: ValueKey('dashboard_page_contacts_action_button_key'), onTap: () {}, ); static NewMainActions appsAction = NewMainActions._( name: (context) => 'Apps', //TODO S.of(context).apps, - image: 'assets/images/main_actions/apps.svg', + image: 'assets/new-ui/Apps.svg', key: ValueKey('dashboard_page_apps_action_button_key'), onTap: () {}, ); static NewMainActions chartsAction = NewMainActions._( name: (context) => 'Charts', //TODO S.of(context).charts, - image: 'assets/images/main_actions/charts.svg', + image: 'assets/new-ui/Charts.svg', key: ValueKey('dashboard_page_charts_action_button_key'), onTap: () {}, ); diff --git a/lib/new-ui/new_dashboard.dart b/lib/new-ui/new_dashboard.dart new file mode 100644 index 0000000000..ba8b88fd12 --- /dev/null +++ b/lib/new-ui/new_dashboard.dart @@ -0,0 +1,100 @@ +import 'package:cake_wallet/di.dart'; +import 'package:cake_wallet/new-ui/widgets/coins_page/assets_history/lightning_assets.dart'; +import 'package:cake_wallet/src/screens/dashboard/widgets/new_main_navbar_widget.dart'; +import 'package:cake_wallet/view_model/monero_account_list/monero_account_list_view_model.dart'; +import 'package:flutter/material.dart'; +import '../view_model/dashboard/dashboard_view_model.dart'; +import 'widgets/coins_page/cards/cards_view.dart'; +import 'widgets/coins_page/action_row/coin_action_row.dart'; +import 'widgets/coins_page/assets_history/history_section.dart'; +import 'widgets/coins_page/top_bar.dart'; +import 'widgets/coins_page/wallet_info.dart'; + +class NewDashboard extends StatefulWidget { + NewDashboard({super.key, required this.dashboardViewModel}) { + this.accountListViewModel = + dashboardViewModel.balanceViewModel.hasAccounts ? getIt.get() : null; + } + + final DashboardViewModel dashboardViewModel; + late final MoneroAccountListViewModel? accountListViewModel; + + + @override + State createState() => _NewDashboardState(); +} + +class _NewDashboardState extends State { + bool _lightningMode = false; + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + children: [ + SafeArea( + child: Container( + height: MediaQuery.of(context).size.height, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + Theme.of(context).colorScheme.surfaceBright, + Theme.of(context).colorScheme.surface, + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + child: SingleChildScrollView( + physics: BouncingScrollPhysics(), + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + TopBar( + dashboardViewModel: widget.dashboardViewModel, + lightningMode: _lightningMode, + onLightningSwitchPress: () { + setState(() { + _lightningMode = !_lightningMode; + }); + }, + ), + WalletInfo(lightningMode: _lightningMode, usesHardwareWallet: + widget.dashboardViewModel.wallet.isHardwareWallet, + name: widget.dashboardViewModel.wallet.name + ), + CardsView(dashboardViewModel: widget.dashboardViewModel, + accountListViewModel: widget.accountListViewModel, + lightningMode: _lightningMode, + ), + CoinActionRow(), + AnimatedSwitcher( + duration: const Duration(milliseconds: 200), + transitionBuilder: (child, animation) { + return FadeTransition(opacity: animation, child: child); + }, + layoutBuilder: (currentChild, previousChildren) { + return Stack( + alignment: Alignment.topCenter, + children: [ + ...previousChildren, + if (currentChild != null) currentChild, + ], + ); + }, + child: _lightningMode + ? LightningAssets(dashboardViewModel: widget.dashboardViewModel,) + : HistorySection(dashboardViewModel: widget.dashboardViewModel,), + ), + ], + ), + ), + ), + ), + NewMainNavBar(dashboardViewModel: widget.dashboardViewModel) + ], + ), + ); + } +} diff --git a/lib/new-ui/pages/receive_page.dart b/lib/new-ui/pages/receive_page.dart new file mode 100644 index 0000000000..a6a17cb7b6 --- /dev/null +++ b/lib/new-ui/pages/receive_page.dart @@ -0,0 +1,66 @@ +import 'package:cake_wallet/new-ui/widgets/receive_page/receive_amount_input.dart'; +import 'package:cake_wallet/new-ui/widgets/receive_page/receive_bottom_buttons.dart'; +import 'package:cake_wallet/new-ui/widgets/receive_page/receive_qr_code.dart'; +import 'package:cake_wallet/new-ui/widgets/receive_page/receive_seed_type_selector.dart'; +import 'package:flutter/material.dart'; + +import '../widgets/receive_page/receive_seed_widget.dart'; +import '../widgets/receive_page/receive_top_bar.dart'; + +class ReceivePage extends StatefulWidget { + const ReceivePage({super.key}); + + @override + State createState() => _ReceivePageState(); +} + +class _ReceivePageState extends State { + bool _largeQrMode = false; + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + Theme.of(context).colorScheme.surfaceBright, + Theme.of(context).colorScheme.surface, + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + borderRadius: BorderRadius.circular(30), + ), + child: SafeArea( + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox(height: 12), + ReceiveTopBar(), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + mainAxisSize: MainAxisSize.max, + children: [ + ReceiveQrCode( + onTap: () { + setState(() { + _largeQrMode = !_largeQrMode; + }); + }, + largeQrMode: _largeQrMode, + ), + ReceiveSeedTypeSelector(), + ReceiveSeedWidget(), + ReceiveAmountInput(largeQrMode: _largeQrMode), + ReceiveBottomButtons(largeQrMode: _largeQrMode), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/new-ui/pages/scan_page.dart b/lib/new-ui/pages/scan_page.dart new file mode 100644 index 0000000000..75bbddaa37 --- /dev/null +++ b/lib/new-ui/pages/scan_page.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class ScanPage extends StatelessWidget { + const ScanPage({super.key}); + + @override + Widget build(BuildContext context) { + return const Placeholder(); + } +} diff --git a/lib/new-ui/pages/send_page.dart b/lib/new-ui/pages/send_page.dart new file mode 100644 index 0000000000..c53515f2e1 --- /dev/null +++ b/lib/new-ui/pages/send_page.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class SendPage extends StatelessWidget { + const SendPage({super.key}); + + @override + Widget build(BuildContext context) { + return const Placeholder(); + } +} diff --git a/lib/new-ui/widgets/coins_page/action_row/coin_action_button.dart b/lib/new-ui/widgets/coins_page/action_row/coin_action_button.dart new file mode 100644 index 0000000000..d925cf8759 --- /dev/null +++ b/lib/new-ui/widgets/coins_page/action_row/coin_action_button.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +class CoinActionButton extends StatelessWidget { + const CoinActionButton({ + super.key, + required this.icon, + required this.label, + required this.action, + }); + + final SvgPicture icon; + final String label; + final VoidCallback action; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Container( + width: 80, + height: 80, + decoration: BoxDecoration( + shape: BoxShape.circle, + gradient: LinearGradient( + colors: [Color(0xFF2B3A67), Color(0xFF1C2A4F)], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + border: Border.all( + color: Theme.of(context).colorScheme.surfaceContainerHigh, + width: 1, + ), + ), + child: IconButton( + padding: EdgeInsets.zero, + constraints: BoxConstraints(), + onPressed: action, + icon: icon, + color: Theme.of(context).colorScheme.primary, + ), + ), + Padding( + padding: const EdgeInsets.all(10.0), + child: Text( + style: TextStyle( + fontSize: 15, + color: Theme.of(context).colorScheme.onSurface, + ), + label, + ), + ), + ], + ); + } +} diff --git a/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart b/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart new file mode 100644 index 0000000000..5ac17a11d8 --- /dev/null +++ b/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart @@ -0,0 +1,65 @@ +import 'package:cake_wallet/new-ui/pages/send_page.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +import '../../../pages/receive_page.dart'; +import '../../../pages/scan_page.dart'; +import 'coin_action_button.dart'; + +class CoinActionRow extends StatelessWidget { + const CoinActionRow({super.key}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 12.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + spacing: 24.0, + children: [ + CoinActionButton( + icon: SvgPicture.asset("assets/new-ui/send.svg"), + label: "Send", + action: () { + showModalBottomSheet( + context: context, + builder: (context) => SendPage(), + ); + }, + ), + CoinActionButton( + icon: SvgPicture.asset("assets/new-ui/receive.svg"), + label: "Receive", + action: () { + showModalBottomSheet( + context: context, + isScrollControlled: true, + builder: (context) => FractionallySizedBox( + heightFactor: 0.9, + child: ReceivePage(), + ), + ); + }, + ), + CoinActionButton( + icon: SvgPicture.asset("assets/new-ui/exchange.svg"), + label: "Swap", + action: () {}, + ), + CoinActionButton( + icon: SvgPicture.asset("assets/new-ui/scan.svg"), + label: "Scan", + action: () { + showModalBottomSheet( + context: context, + + builder: (context) => ScanPage(), + ); + }, + ), + ], + ), + ); + } +} diff --git a/lib/new-ui/widgets/coins_page/assets_history/asset_tile.dart b/lib/new-ui/widgets/coins_page/assets_history/asset_tile.dart new file mode 100644 index 0000000000..b811604fb6 --- /dev/null +++ b/lib/new-ui/widgets/coins_page/assets_history/asset_tile.dart @@ -0,0 +1,74 @@ +import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; +import 'package:flutter/material.dart'; + +class AssetTile extends StatelessWidget { + const AssetTile({super.key, required this.dashboardViewModel}); + + final DashboardViewModel dashboardViewModel; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0, vertical: 6.0), + child: Container( + width: double.infinity, + height: 80, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + Theme.of(context).colorScheme.surfaceContainerHigh, + Theme.of(context).colorScheme.surfaceContainer, + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + borderRadius: BorderRadius.all(Radius.circular(20)), + border: Border.all( + color: Theme.of(context).colorScheme.surfaceContainerHighest, + width: 1, + ), + ), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 12.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Container(width: 45, height: 45, child: Image.asset("assets/images/crypto/tether.webp")), + SizedBox(width: 8.0), + Column( + spacing: 4.0, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "DummyCoin", + style: TextStyle(fontWeight: FontWeight.bold), + ), + Text( + "0.000 DMC", + style: TextStyle( + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), + ), + ], + ), + ], + ), + + Text( + "\$0.00", + style: TextStyle( + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/new-ui/widgets/coins_page/assets_history/assets_section.dart b/lib/new-ui/widgets/coins_page/assets_history/assets_section.dart new file mode 100644 index 0000000000..44eff375b9 --- /dev/null +++ b/lib/new-ui/widgets/coins_page/assets_history/assets_section.dart @@ -0,0 +1,23 @@ +import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; +import 'package:flutter/material.dart'; + + +import 'asset_tile.dart'; + +class AssetsSection extends StatelessWidget { + const AssetsSection({super.key, required this.dashboardViewModel}); + + final DashboardViewModel dashboardViewModel; + + @override + Widget build(BuildContext context) { + return ListView.builder( + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: 1, + itemBuilder: (context, index) { + return AssetTile(dashboardViewModel: dashboardViewModel,); + }, + ); + } +} diff --git a/lib/new-ui/widgets/coins_page/assets_history/assets_top_bar.dart b/lib/new-ui/widgets/coins_page/assets_history/assets_top_bar.dart new file mode 100644 index 0000000000..2a282ef846 --- /dev/null +++ b/lib/new-ui/widgets/coins_page/assets_history/assets_top_bar.dart @@ -0,0 +1,64 @@ +import 'package:cake_wallet/new-ui/widgets/line_tab_switcher.dart'; +import 'package:cake_wallet/new-ui/widgets/modern_button.dart'; +import 'package:flutter/material.dart'; + +class AssetsTopBar extends StatelessWidget { + const AssetsTopBar({ + super.key, + required this.onTabChange, + required this.selectedTab, + }); + + final void Function(int) onTabChange; + final int selectedTab; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(12.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + LineTabSwitcher( + tabs: const ["Assets", "History"], + onTabChange: onTabChange, + selectedTab: selectedTab, + ), + Row( + spacing: 8.0, + mainAxisSize: MainAxisSize.min, + children: [ + Container( + height: 48, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(99999), + ), + child: ElevatedButton( + onPressed: () {}, + style: ElevatedButton.styleFrom( + padding: EdgeInsets.zero, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(999999), + ), + backgroundColor: Theme.of( + context, + ).colorScheme.surfaceContainer, + ), + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Row( + spacing: 4.0, + children: [Icon(Icons.settings, color: Theme.of(context).colorScheme.primary), Text("Tokens", style: TextStyle(color: Theme.of(context).colorScheme.primary),)], + ), + ), + ), + ), + ModernButton(size: 48, onPressed:(){}, icon: Icon(Icons.question_mark)), + ], + ), + ], + ), + ); + } +} diff --git a/lib/new-ui/widgets/coins_page/assets_history/history_section.dart b/lib/new-ui/widgets/coins_page/assets_history/history_section.dart new file mode 100644 index 0000000000..745517cbbc --- /dev/null +++ b/lib/new-ui/widgets/coins_page/assets_history/history_section.dart @@ -0,0 +1,55 @@ +import 'package:cake_wallet/new-ui/widgets/coins_page/assets_history/history_tile.dart'; +import 'package:cake_wallet/utils/date_formatter.dart'; +import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; +import 'package:cake_wallet/view_model/dashboard/date_section_item.dart'; +import 'package:cake_wallet/view_model/dashboard/transaction_list_item.dart'; +import 'package:flutter/material.dart'; + + +class HistorySection extends StatelessWidget { + const HistorySection({super.key, required this.dashboardViewModel}); + + final DashboardViewModel dashboardViewModel; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0, vertical: 8.0), + child: ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: dashboardViewModel.items.length, + itemBuilder: (context, index) { + final prevItem = index == 0 ? null : dashboardViewModel.items[index - 1]; + final item = dashboardViewModel.items[index]; + final nextItem = index == dashboardViewModel.items.length - 1 ? null : dashboardViewModel.items[index + 1]; + + + if(item is TransactionListItem) { + final transaction = item.transaction; + final transactionType = + dashboardViewModel.getTransactionType(transaction); + + return HistoryTile( + title: item.formattedTitle + item.formattedStatus + transactionType, + date: DateFormatter.convertDateTimeToReadableString(item.date), + amount: item.formattedCryptoAmount, + amountFiat: item.formattedFiatAmount, + roundedBottom: !(nextItem is TransactionListItem), + roundedTop: !(prevItem is TransactionListItem), + bottomSeparator: nextItem is TransactionListItem, + direction: item.transaction.direction, + pending: item.transaction.isPending + ); + + + } else if(item is DateSectionItem){ + return Text(DateFormatter.convertDateTimeToReadableString(item.date)); + } + + else return Text(item.runtimeType.toString()); + }, + ), + ); + } +} diff --git a/lib/new-ui/widgets/coins_page/assets_history/history_tile.dart b/lib/new-ui/widgets/coins_page/assets_history/history_tile.dart new file mode 100644 index 0000000000..185d753adc --- /dev/null +++ b/lib/new-ui/widgets/coins_page/assets_history/history_tile.dart @@ -0,0 +1,109 @@ +import 'package:cw_core/transaction_direction.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +class HistoryTile extends StatelessWidget { + const HistoryTile( + {super.key, + required this.title, + required this.date, + required this.amount, + required this.amountFiat, + required this.roundedTop, + required this.roundedBottom, + required this.direction, + required this.pending, + required this.bottomSeparator}); + + final String title; + final String date; + final String amount; + final String amountFiat; + final bool roundedTop; + final bool roundedBottom; + final bool bottomSeparator; + final TransactionDirection direction; + final bool pending; + + String _getDirectionIcon() { + if (pending) { + return direction == TransactionDirection.incoming + ? 'assets/new-ui/history-receiving.svg' + : 'assets/new-ui/history-sending.svg'; + } else { + return direction == TransactionDirection.incoming + ? 'assets/new-ui/history-received.svg' + : 'assets/new-ui/history-sent.svg'; + } + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Container( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surfaceContainer, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(roundedTop ? 12.0 : 0.0), + topRight: Radius.circular(roundedTop ? 12.0 : 0.0), + bottomLeft: Radius.circular(roundedBottom ? 12.0 : 0.0), + bottomRight: Radius.circular(roundedBottom ? 12.0 : 0.0), + )), + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 12.0, + horizontal: 12.0, + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(0.0, 0.0, 8.0, 0.0), + child: SizedBox( + height: 50, + width: 50, + child: SvgPicture.asset(_getDirectionIcon()), + ), + ), + Expanded( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title), + Text(date), + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text(amount), + Text(amountFiat), + ], + ), + ], + ), + ), + ], + ), + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 12.0), + child: SizedBox( + height: 1, + child: DecoratedBox( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surfaceContainerHigh, + ), + ), + ), + ), + ], + ); + } +} diff --git a/lib/new-ui/widgets/coins_page/assets_history/lightning_assets.dart b/lib/new-ui/widgets/coins_page/assets_history/lightning_assets.dart new file mode 100644 index 0000000000..3100d4331f --- /dev/null +++ b/lib/new-ui/widgets/coins_page/assets_history/lightning_assets.dart @@ -0,0 +1,39 @@ +import 'package:cake_wallet/new-ui/widgets/coins_page/assets_history/assets_top_bar.dart'; +import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; +import 'package:flutter/material.dart'; +import 'assets_section.dart'; +import 'history_section.dart'; + +class LightningAssets extends StatefulWidget { + const LightningAssets({super.key, required this.dashboardViewModel}); + + static const List tabs = ["Assets", "History"]; + final DashboardViewModel dashboardViewModel; + + @override + State createState() => _LightningAssetsState(); +} + +class _LightningAssetsState extends State { + int _selectedTab = 0; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + AssetsTopBar( + onTabChange: (index) { + setState(() { + _selectedTab = index; + }); + }, + selectedTab: _selectedTab, + ), + [ + AssetsSection(dashboardViewModel: widget.dashboardViewModel,), + HistorySection(dashboardViewModel: widget.dashboardViewModel,), + ][_selectedTab], + ], + ); + } +} diff --git a/lib/new-ui/widgets/coins_page/cards/balance_card.dart b/lib/new-ui/widgets/coins_page/cards/balance_card.dart new file mode 100644 index 0000000000..bcdf43bd89 --- /dev/null +++ b/lib/new-ui/widgets/coins_page/cards/balance_card.dart @@ -0,0 +1,127 @@ +import 'package:cake_wallet/view_model/dashboard/balance_view_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +class BalanceCard extends StatelessWidget { + const BalanceCard({ + super.key, + required this.width, + required this.balanceRecord, + required this.selected, required this.accountName, required this.accountBalance, + }); + + final double width; + final String accountBalance; + final String accountName; + final BalanceRecord balanceRecord; + final bool selected; + + @override + Widget build(BuildContext context) { + final Duration textFadeDuration = Duration(milliseconds: 80); + + return Container( + width: width, + height: width * 2.0 / 3, + decoration: BoxDecoration( + border: Border.all(color: Color(0x77FFFFFF), width: 1), + gradient: LinearGradient( + colors: [Colors.lightBlueAccent, Colors.blue], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + borderRadius: BorderRadius.circular(20), + ), + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + accountName, + style: TextStyle(color: Colors.black, fontSize: 20), + ), + + AnimatedOpacity( + opacity: selected ? 0 : 1, + duration: textFadeDuration, + child: Text( + accountBalance, + style: TextStyle(color: Colors.black, fontSize: 14), + ), + ), + ], + ), + AnimatedOpacity( + opacity: selected ? 1 : 0, + duration: textFadeDuration, + child: Row( + spacing: 8.0, + children: [ + Text( + balanceRecord.availableBalance, + style: TextStyle(color: Colors.black, fontSize: 28), + ), + Text( + balanceRecord.asset.name.toUpperCase(), + style: TextStyle(color: Colors.black45, fontSize: 28), + ), + ], + ), + ), + Text( + balanceRecord.fiatAvailableBalance, + style: TextStyle(color: Colors.black45, fontSize: 20), + ), + ], + ), + + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Container( + decoration: BoxDecoration( + color: Color(0x44FFFFFF), + borderRadius: BorderRadius.circular(10000000), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.all(6.0), + child: Text( + "Buy", + style: TextStyle(color: Colors.black, fontSize: 16), + ), + ), + Icon(Icons.arrow_forward, color: Colors.black45), + ], + ), + ), + SvgPicture.asset( + "assets/new-ui/switcher-bitcoin.svg", + height: 50, + width: 50, + colorFilter: const ColorFilter.mode( + Color(0x44FFFFFF), + BlendMode.srcIn, + ), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/new-ui/widgets/coins_page/cards/cards_view.dart b/lib/new-ui/widgets/coins_page/cards/cards_view.dart new file mode 100644 index 0000000000..b4b517e5c4 --- /dev/null +++ b/lib/new-ui/widgets/coins_page/cards/cards_view.dart @@ -0,0 +1,138 @@ +import 'dart:math'; + +import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; +import 'package:cake_wallet/view_model/monero_account_list/monero_account_list_view_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_mobx/flutter_mobx.dart'; + +import 'balance_card.dart'; + +class CardsView extends StatefulWidget { + const CardsView({super.key, required this.dashboardViewModel, required this.accountListViewModel, required this.lightningMode}); + + final DashboardViewModel dashboardViewModel; + final MoneroAccountListViewModel? accountListViewModel; + final bool lightningMode; + + + @override + _CardsViewState createState() => _CardsViewState(); +} + +class _CardsViewState extends State { + int? _selectedIndex = 0; + + static const Duration animDuration = Duration(milliseconds: 200); + static const double overlapAmount = 60.0; + late final double cardWidth = MediaQuery.of(context).size.width * 0.85; + late final int numCards; + + @override + void initState() { + super.initState(); + numCards = widget.accountListViewModel?.accounts.length ?? 1; + } + + Widget _buildCard(int index, double parentWidth) { + final int numCards = widget.accountListViewModel?.accounts.length ?? 1; + final double baseTop = overlapAmount * (numCards - 1); + final double scaleFactor = 0.96; + + final int howFarBehind = (_selectedIndex! - index + numCards) % numCards; + final double scale = pow(scaleFactor, howFarBehind).toDouble(); + + final double top = baseTop - (howFarBehind * overlapAmount); + + final double left = (parentWidth - cardWidth) / 2.0; + + return AnimatedPositioned( + key: ValueKey('box_$index'), + duration: animDuration, + curve: Curves.easeOut, + top: top, + left: left, + child: AnimatedScale( + duration: animDuration, + curve: Curves.easeOut, + scale: scale, + child: GestureDetector( + onTap: () { + setState(() { + if(widget.accountListViewModel != null) + widget.accountListViewModel!.select(widget.accountListViewModel!.accounts[index]); + _selectedIndex = index; + }); + }, + child: Observer( + builder: (_){return BalanceCard( + width: cardWidth, + accountName: (widget.accountListViewModel?.accounts[index].label) ?? "Primary account", + accountBalance: widget.accountListViewModel?.accounts[index].balance ?? "", + balanceRecord: widget.dashboardViewModel.balanceViewModel.formattedBalances.elementAt(0), + selected: _selectedIndex == index, + );} + ), + ), + ), + ); + } + + double _getBoxHeight() { + return + /* height of initial card */ + (2 / 3) * (cardWidth) + + /* height of bg card * amount of bg cards */ + overlapAmount * ((widget.accountListViewModel?.accounts.length ??1) - 1); + } + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, constraints) { + final double parentWidth = constraints.maxWidth; + List children = []; + + if (_selectedIndex! >= (widget.accountListViewModel?.accounts.length ?? 1)) { + _selectedIndex = 0; + } + + for ( + int i = _selectedIndex!; + i < (widget.accountListViewModel?.accounts.length ?? 1) + _selectedIndex!; + i++ + ) { + if (i != _selectedIndex) { + children.add(_buildCard(i % (widget.accountListViewModel?.accounts.length ?? 1), parentWidth)); + } + } + + if (_selectedIndex != null) { + children.add(_buildCard(_selectedIndex!, parentWidth)); + } + + return Observer( + builder: (_){return Padding( + padding: const EdgeInsets.symmetric(vertical: 16.0), + child: AnimatedContainer( + duration: Duration(milliseconds: 200), + curve: Curves.easeOut, + width: double.infinity, + height: _getBoxHeight(), + child: AnimatedSwitcher( + duration: Duration(milliseconds: 200), + transitionBuilder: (child, animation) => + FadeTransition(opacity: animation, child: child), + child: SizedBox( + key: ValueKey(_getBoxHeight()), + width: double.infinity, + height: _getBoxHeight(), + child: Stack(alignment: Alignment.center, children: children), + ), + ), + ), + );} + ); + }, + ); + } +} diff --git a/lib/new-ui/widgets/coins_page/top_bar.dart b/lib/new-ui/widgets/coins_page/top_bar.dart new file mode 100644 index 0000000000..0c7e0ce15f --- /dev/null +++ b/lib/new-ui/widgets/coins_page/top_bar.dart @@ -0,0 +1,78 @@ +import 'package:cake_wallet/new-ui/widgets/modern_button.dart'; +import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +class TopBar extends StatelessWidget { + const TopBar({ + super.key, + required this.lightningMode, + required this.onLightningSwitchPress, required this.dashboardViewModel, + }); + + final bool lightningMode; + final VoidCallback onLightningSwitchPress; + final DashboardViewModel dashboardViewModel; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(18.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + if(dashboardViewModel.balanceViewModel.hasSecondAdditionalBalance || + dashboardViewModel.balanceViewModel.hasSecondAvailableBalance) + SizedBox( + child: AnimatedSwitcher( + duration: Duration(milliseconds: 200), + transitionBuilder: (child, animation) => + FadeTransition(opacity: animation, child: child), + child: ElevatedButton( + key: ValueKey(lightningMode), + style: ElevatedButton.styleFrom( + padding: EdgeInsets.all(4), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(900.0)), + ), + backgroundColor: Theme.of( + context, + ).colorScheme.surfaceContainer, + ), + onPressed: onLightningSwitchPress, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SvgPicture.asset( + lightningMode + ? 'assets/new-ui/switcher-lightning.svg' + : 'assets/new-ui/switcher-bitcoin.svg', + width: 40, + height: 40, + colorFilter: ColorFilter.mode( + Theme.of(context).colorScheme.primary, + BlendMode.srcIn, + ), + ), + SvgPicture.asset( + lightningMode + ? 'assets/new-ui/switcher-bitcoin-off.svg' + : 'assets/new-ui/switcher-lightning-off.svg', + width: 40, + height: 40, + colorFilter: ColorFilter.mode( + Theme.of(context).colorScheme.primary, + BlendMode.srcIn, + ), + ), + ], + ), + ), + ), + ), + ModernButton.svg(size: 44, onPressed: (){}, svgPath: "assets/new-ui/top-settings.svg",), + ], + ), + ); + } +} diff --git a/lib/new-ui/widgets/coins_page/wallet_info.dart b/lib/new-ui/widgets/coins_page/wallet_info.dart new file mode 100644 index 0000000000..68adc8b130 --- /dev/null +++ b/lib/new-ui/widgets/coins_page/wallet_info.dart @@ -0,0 +1,50 @@ +import 'package:cake_wallet/new-ui/widgets/modern_button.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +class WalletInfo extends StatelessWidget { + const WalletInfo({super.key, required this.lightningMode, required this.name, required this.usesHardwareWallet}); + + final bool lightningMode; + final String name; + final bool usesHardwareWallet; + + @override + Widget build(BuildContext context) { + return Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + + children: [ + AnimatedSwitcher( + duration: Duration(milliseconds: 150), + transitionBuilder: (child, animation) { + return SizeTransition( + axis: Axis.horizontal, + sizeFactor: animation, + child: FadeTransition(opacity: animation, child: child), + ); + }, + child: !usesHardwareWallet + ? SizedBox.shrink(key: ValueKey("empty")) + : Padding( + padding: const EdgeInsets.fromLTRB(0.0, 0.0, 8.0, 0.0), + child: SvgPicture.asset( + "assets/new-ui/wallet-trezor.svg", + key: ValueKey("wallet"), + width: 24, + height: 24, + colorFilter: ColorFilter.mode( + Theme.of(context).colorScheme.onSurfaceVariant, + BlendMode.srcIn, + ), + ), + ), + ), + Text(name, style: TextStyle(fontSize: 20)), + SizedBox(width: 8), + ModernButton.svg(size: 20, onPressed: (){}, svgPath: "assets/new-ui/3dots.svg",) + ], + ); + } +} diff --git a/lib/new-ui/widgets/line_tab_switcher.dart b/lib/new-ui/widgets/line_tab_switcher.dart new file mode 100644 index 0000000000..6fdb533d02 --- /dev/null +++ b/lib/new-ui/widgets/line_tab_switcher.dart @@ -0,0 +1,134 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; + +class LineTabSwitcher extends StatefulWidget { + const LineTabSwitcher({ + super.key, + required this.tabs, + required this.onTabChange, + required this.selectedTab, + }); + + final List tabs; + final void Function(int index) onTabChange; + final int selectedTab; + + @override + State createState() => _LineTabSwitcherState(); +} + +class _LineTabSwitcherState extends State { + List textWidgetKeys = []; + List textWidgetSizes = []; + bool textWidgetsMeasured = false; + + double _calcBarLeft() { + double left = 0; + + if (textWidgetKeys.isEmpty || textWidgetSizes.isEmpty) { + return 0; + } + + for (int i = 0; i < widget.selectedTab; i++) { + left += textWidgetSizes[i].width + 16.0; + } + + left += 8.0; + + return left; + } + + @override + void initState() { + super.initState(); + textWidgetKeys = List.generate(widget.tabs.length, (index) => GlobalKey()); + WidgetsBinding.instance.addPostFrameCallback((_) => measure()); + } + + void measure() { + setState(() { + textWidgetSizes = textWidgetKeys + .map((k) => k.currentContext!.size) + .whereType() + .toList(); + textWidgetsMeasured = true; + }); + } + + @override + Widget build(BuildContext context) { + if (!textWidgetsMeasured) { + WidgetsBinding.instance.addPostFrameCallback((_) => measure()); + } + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Container( + width: 200, + height: 40, + child: ListView.builder( + physics: NeverScrollableScrollPhysics(), + scrollDirection: Axis.horizontal, + itemCount: widget.tabs.length, + itemBuilder: (context, index) { + return GestureDetector( + onTap: () { + widget.onTabChange(index); + }, + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + AnimatedDefaultTextStyle( + duration: Duration(milliseconds: 150), + style: DefaultTextStyle.of(context).style.copyWith( + inherit: true, + fontSize: 22, + color: widget.selectedTab == index + ? Theme.of(context).colorScheme.onSurface + : Theme.of(context).colorScheme.onSurfaceVariant, + ), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Text( + widget.tabs[index], + key: textWidgetKeys[index], + ), + ), + ), + ], + ), + ); + }, + ), + ), + Container( + width: 200, + height: 2, + child: Stack( + children: [ + AnimatedPositioned( + curve: Curves.easeOut, + left: _calcBarLeft(), + bottom: 0, + duration: Duration(milliseconds: 150), + child: AnimatedSize( + duration: Duration(milliseconds: 150), + child: Container( + height: 2, + width: textWidgetSizes.isEmpty + ? 0 + : textWidgetSizes[widget.selectedTab].width, + color: Theme.of(context).colorScheme.onSurface, + ), + ), + ), + ], + ), + ), + ], + ); + } +} diff --git a/lib/new-ui/widgets/modern_button.dart b/lib/new-ui/widgets/modern_button.dart new file mode 100644 index 0000000000..2c0db7f12a --- /dev/null +++ b/lib/new-ui/widgets/modern_button.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +class ModernButton extends StatelessWidget { + final double size; + final String? svgPath; + final Widget? icon; + final VoidCallback onPressed; + final Color? color; + + static const iconSvgSizeRatio = 2/3; + + + const ModernButton({ + super.key, + required this.size, + required this.icon, + required this.onPressed, + this.color + }) : svgPath = null; + + const ModernButton.svg({ + super.key, + required this.size, + required this.svgPath, + required this.onPressed, + this.color + }) : icon = null; + + @override + Widget build(BuildContext context) { + final color = Theme.of(context).colorScheme.primary; + final Widget resolvedIcon = svgPath != null + ? SvgPicture.asset( + svgPath!, + width: size, + height: size, + fit: BoxFit.contain, + alignment: Alignment.center, + allowDrawingOutsideViewBox: true, + colorFilter: ColorFilter.mode(color, BlendMode.srcIn), + ) + : IconTheme( + data: IconThemeData(color: color, size: size*iconSvgSizeRatio), + child: icon!, + ); + + return Container( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surfaceContainer, + borderRadius: BorderRadius.circular(size), + ), + width: size, + height: size, + child: IconButton( + padding: EdgeInsets.zero, + onPressed: onPressed, + icon: resolvedIcon, + ), + ); + } +} diff --git a/lib/new-ui/widgets/navbar/navbar.dart b/lib/new-ui/widgets/navbar/navbar.dart new file mode 100644 index 0000000000..f19f6e69b6 --- /dev/null +++ b/lib/new-ui/widgets/navbar/navbar.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; + +import 'navbar_button.dart'; + +class Navbar extends StatefulWidget { + const Navbar({super.key}); + + @override + State createState() => _NavbarState(); +} + +class NavbarItemData { + final String iconPath; + final String text; + + NavbarItemData(this.iconPath, this.text); +} + +class _NavbarState extends State { + int _selectedIndex = 0; + + final List _items = [ + NavbarItemData("assets/Home.svg", "Home"), + NavbarItemData("assets/Wallets.svg", "Wallets"), + NavbarItemData("assets/Contacts.svg", "Contacts"), + NavbarItemData("assets/Apps.svg", "Apps"), + NavbarItemData("assets/Charts.svg", "Charts"), + ]; + + @override + Widget build(BuildContext context) { + return Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.all(32.0), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(99999), + color: Theme.of( + context, + ).colorScheme.surfaceContainerHighest.withAlpha(170), + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 12.0, + vertical: 12.0, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: List.generate(_items.length, (index) { + return NavbarButton( + data: _items[index], + onPressed: () { + setState(() { + _selectedIndex = index; + }); + }, + selected: _selectedIndex == index, + ); + }), + ), + ), + ), + ), + ); + } +} diff --git a/lib/new-ui/widgets/navbar/navbar_button.dart b/lib/new-ui/widgets/navbar/navbar_button.dart new file mode 100644 index 0000000000..79c3af9eac --- /dev/null +++ b/lib/new-ui/widgets/navbar/navbar_button.dart @@ -0,0 +1,67 @@ +import 'package:cake_wallet/new-ui/widgets/navbar/navbar.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +class NavbarButton extends StatelessWidget { + const NavbarButton({ + super.key, + required this.data, + required this.selected, + required this.onPressed, + }); + + final NavbarItemData data; + final VoidCallback onPressed; + final bool selected; + + @override + Widget build(BuildContext context) { + return AnimatedSize( + curve: Curves.easeOut, + duration: Duration(milliseconds: 100), + child: AnimatedContainer( + curve: Curves.easeOut, + duration: Duration(milliseconds: 100), + decoration: BoxDecoration( + color: selected + ? Color(0x79BDCFFF) + : Theme.of( + context, + ).colorScheme.surfaceContainerHighest.withAlpha(0), + borderRadius: BorderRadius.circular(1242357), + ), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + IconButton( + constraints: BoxConstraints(), + padding: EdgeInsets.zero, + icon: SvgPicture.asset( + data.iconPath, + width: selected ? 24 : 36, + height: selected ? 24 : 36, + colorFilter: ColorFilter.mode( + selected + ? Theme.of(context).colorScheme.onSurface + : Theme.of(context).colorScheme.primary, + BlendMode.srcIn, + ), + ), + onPressed: onPressed, + ), + if (selected) + Padding( + padding: const EdgeInsets.fromLTRB(0.0, 0.0, 8.0, 0.0), + child: Text( + data.text, + style: TextStyle(fontWeight: FontWeight.bold), + textAlign: TextAlign.center, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/new-ui/widgets/receive_page/receive_amount_input.dart b/lib/new-ui/widgets/receive_page/receive_amount_input.dart new file mode 100644 index 0000000000..1a793d015c --- /dev/null +++ b/lib/new-ui/widgets/receive_page/receive_amount_input.dart @@ -0,0 +1,90 @@ +import 'package:flutter/material.dart'; + +class ReceiveAmountInput extends StatelessWidget { + const ReceiveAmountInput({super.key, required this.largeQrMode}); + + final bool largeQrMode; + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + AnimatedContainer( + duration: Duration(milliseconds: 300), + height: 56, + width: largeQrMode ? 250 : 160, + decoration: BoxDecoration( + // color: largeQrMode + // ? Theme.of(context).colorScheme.surface + // // no it can't just be transparent. might be framework bug actually + // : Theme.of(context).colorScheme.surface, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10), + bottomLeft: Radius.circular(10), + topRight: Radius.circular(0), + bottomRight: Radius.circular(0), + ), + border: Border.all( + color: Theme.of(context).colorScheme.surfaceContainer, + width: 2, + ), + ), + child: AnimatedScale( + duration: Duration(milliseconds: 500), + scale: largeQrMode ? 1.3 : 1, + curve: Curves.easeOut, + child: TextField( + enabled: !largeQrMode, + textAlign: TextAlign.center, + textAlignVertical: TextAlignVertical.center, + decoration: InputDecoration( + hint: Text( + "0.00000000", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16, + color: Theme.of( + context, + ).colorScheme.onSurface.withValues(alpha: 0.5), + ), + ), + border: InputBorder.none, + ), + style: TextStyle(color: Theme.of(context).colorScheme.onSurface), + ), + ), + ), + Container( + height: 56, + width: 74, + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(0), + bottomLeft: Radius.circular(0), + topRight: Radius.circular(10), + bottomRight: Radius.circular(10), + ), + color: Theme.of(context).colorScheme.surfaceContainer, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4.0, + children: [ + Text( + "BTC", + style: TextStyle( + color: Theme.of(context).colorScheme.onSurface, + ), + ), + Icon( + Icons.keyboard_arrow_down, + color: Theme.of(context).colorScheme.primary, + ), + ], + ), + ), + ], + ); + } +} diff --git a/lib/new-ui/widgets/receive_page/receive_bottom_buttons.dart b/lib/new-ui/widgets/receive_page/receive_bottom_buttons.dart new file mode 100644 index 0000000000..5df32e216b --- /dev/null +++ b/lib/new-ui/widgets/receive_page/receive_bottom_buttons.dart @@ -0,0 +1,97 @@ +import 'package:flutter/material.dart'; + +class ReceiveBottomButtons extends StatelessWidget { + final bool largeQrMode; + const ReceiveBottomButtons({super.key, required this.largeQrMode}); + + @override + Widget build(BuildContext context) { + final double targetHeight = largeQrMode ? 0 : 150; + final double targetOpacity = largeQrMode ? 0 : 1; + + return AnimatedContainer( + duration: const Duration(milliseconds: 300), + curve: Curves.easeOut, + height: targetHeight, + child: AnimatedOpacity( + duration: const Duration(milliseconds: 300), + opacity: targetOpacity, + curve: Curves.easeOut, + child: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of( + context, + ).colorScheme.surfaceContainer, + foregroundColor: Colors.white, + minimumSize: const Size(double.infinity, 50), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + padding: const EdgeInsets.symmetric(vertical: 16), + ), + onPressed: () {}, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.book_outlined, + size: 20, + color: Theme.of(context).colorScheme.primary, + ), + const SizedBox(width: 10), + Text( + 'Accounts & Addresses', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.primary, + ), + ), + ], + ), + ), + ), + Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).colorScheme.primary, + foregroundColor: Colors.white, + minimumSize: const Size(double.infinity, 50), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + padding: const EdgeInsets.symmetric(vertical: 16), + ), + onPressed: () {}, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Copy Address', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + color: Theme.of(context).colorScheme.onPrimary, + ), + ), + const SizedBox(width: 10), + Icon( + Icons.copy_all_outlined, + size: 20, + color: Theme.of(context).colorScheme.onPrimary, + ), + ], + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/new-ui/widgets/receive_page/receive_qr_code.dart b/lib/new-ui/widgets/receive_page/receive_qr_code.dart new file mode 100644 index 0000000000..055567d73e --- /dev/null +++ b/lib/new-ui/widgets/receive_page/receive_qr_code.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; + +class ReceiveQrCode extends StatelessWidget { + const ReceiveQrCode({ + super.key, + required this.onTap, + required this.largeQrMode, + }); + + final VoidCallback onTap; + final bool largeQrMode; + + @override + Widget build(BuildContext context) { + final double targetY = largeQrMode ? 40 : 0; + + return GestureDetector( + onTap: onTap, + child: TweenAnimationBuilder( + tween: Tween(begin: 0, end: targetY), + duration: const Duration(milliseconds: 500), + curve: Curves.easeOut, + builder: (context, value, child) { + return Transform.translate( + offset: Offset(0, value), + child: AnimatedContainer( + duration: const Duration(milliseconds: 500), + curve: Curves.easeOutCubic, + width: largeQrMode ? 400 : 250, + height: largeQrMode ? 400 : 250, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + color: Colors.white, + ), + padding: const EdgeInsets.all(8.0), + child: Image.asset("assets/btcqr.png"), + ), + ); + }, + ), + ); + } +} diff --git a/lib/new-ui/widgets/receive_page/receive_seed_type_selector.dart b/lib/new-ui/widgets/receive_page/receive_seed_type_selector.dart new file mode 100644 index 0000000000..d136604b4d --- /dev/null +++ b/lib/new-ui/widgets/receive_page/receive_seed_type_selector.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +class ReceiveSeedTypeSelector extends StatelessWidget { + const ReceiveSeedTypeSelector({super.key}); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + spacing: 12.0, + children: [ + SvgPicture.asset( + width: 32, + height: 32, + "assets/new-ui/switcher-bitcoin-off.svg", + colorFilter: ColorFilter.mode( + Theme.of(context).colorScheme.primary, + BlendMode.srcIn, + ), + ), + Text( + "Standard", + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.primary, + ), + ), + Container( + width: 24, + height: 24, + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surfaceContainer, + borderRadius: BorderRadius.circular(999999), + ), + child: IconButton( + padding: EdgeInsets.zero, + constraints: BoxConstraints(), + onPressed: () {}, + icon: (Icon( + color: Theme.of(context).colorScheme.primary, + size: 20, + Icons.keyboard_arrow_down, + )), + ), + ), + ], + ); + } +} diff --git a/lib/new-ui/widgets/receive_page/receive_seed_widget.dart b/lib/new-ui/widgets/receive_page/receive_seed_widget.dart new file mode 100644 index 0000000000..a95fcbb1b7 --- /dev/null +++ b/lib/new-ui/widgets/receive_page/receive_seed_widget.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; + +class ReceiveSeedWidget extends StatelessWidget { + const ReceiveSeedWidget({super.key}); + + static const List dummyWalletStrings = [ + 'bc1q', + 'xy2k', + 'gdyg', + 'jrsq', + 'tzq2', + 'n0yr', + 'f249', + '3p83', + 'kkfj', + 'hx0wlh', + ]; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 80.0), + child: Wrap( + alignment: WrapAlignment.center, + spacing: 8.0, + runSpacing: 4.0, + children: List.generate( + dummyWalletStrings.length, + (index) => Text( + dummyWalletStrings[index], + style: TextStyle( + fontSize: 16, + color: index % 2 != 0 ? Colors.grey : Colors.white, + ), + ), + ), + ), + ); + } +} diff --git a/lib/new-ui/widgets/receive_page/receive_top_bar.dart b/lib/new-ui/widgets/receive_page/receive_top_bar.dart new file mode 100644 index 0000000000..cbd80167b2 --- /dev/null +++ b/lib/new-ui/widgets/receive_page/receive_top_bar.dart @@ -0,0 +1,27 @@ +import 'package:cake_wallet/new-ui/widgets/modern_button.dart'; +import 'package:flutter/material.dart'; + +class ReceiveTopBar extends StatelessWidget { + const ReceiveTopBar({super.key}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ModernButton(size: 52, onPressed: () { + Navigator.of(context).pop(); + }, icon: Icon(Icons.close)), + + Text("Receive", style: TextStyle(fontSize: 22)), + ModernButton(size: 52, onPressed: () { + Navigator.of(context).pop(); + }, icon: Icon(Icons.share)), + ], + ), + ); + } +} diff --git a/lib/router.dart b/lib/router.dart index 02fe8275df..ee0a77c20b 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:cake_wallet/anonpay/anonpay_invoice_info.dart'; import 'package:cake_wallet/core/new_wallet_arguments.dart'; +import 'package:cake_wallet/new-ui/new_dashboard.dart'; import 'package:cake_wallet/order/order.dart'; import 'package:cake_wallet/core/new_wallet_type_arguments.dart'; import 'package:cake_wallet/core/totp_request_details.dart'; @@ -40,6 +41,7 @@ import 'package:cake_wallet/src/screens/dev/monero_background_sync.dart'; import 'package:cake_wallet/src/screens/dev/moneroc_cache_debug.dart'; import 'package:cake_wallet/src/screens/dev/moneroc_call_profiler.dart'; import 'package:cake_wallet/src/screens/dev/network_requests.dart'; +import 'package:cake_wallet/utils/feature_flag.dart'; import 'package:cake_wallet/src/screens/dev/qr_tools_page.dart'; import 'package:cake_wallet/src/screens/dev/secure_preferences_page.dart'; import 'package:cake_wallet/src/screens/dev/shared_preferences_page.dart'; @@ -148,6 +150,7 @@ import 'package:cw_core/nano_account.dart'; import 'package:cw_core/node.dart'; import 'package:cw_core/transaction_info.dart'; import 'package:cw_core/unspent_coin_type.dart'; +import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:flutter/cupertino.dart'; @@ -163,15 +166,19 @@ Route handleRouteWithPlatformAwareness( bool fullscreenDialog = false, }) { if (Platform.isIOS) { - return CupertinoPageRoute(builder: builder, fullscreenDialog: fullscreenDialog); + return CupertinoPageRoute( + builder: builder, fullscreenDialog: fullscreenDialog); } else { - return MaterialPageRoute(builder: builder, fullscreenDialog: fullscreenDialog); + return MaterialPageRoute( + builder: builder, fullscreenDialog: fullscreenDialog); } } Route createRoute(RouteSettings settings) { currentRouteSettings = settings; + printV(settings.name); + switch (settings.name) { case Routes.welcome: return MaterialPageRoute( @@ -222,7 +229,8 @@ Route createRoute(RouteSettings settings) { case Routes.walletGroupsDisplayPage: final type = settings.arguments as WalletType; - final walletGroupsDisplayVM = getIt.get(param1: type); + final walletGroupsDisplayVM = + getIt.get(param1: type); return handleRouteWithPlatformAwareness( (_) => WalletGroupsDisplayPage( @@ -247,21 +255,25 @@ Route createRoute(RouteSettings settings) { case Routes.chooseHardwareWalletAccount: final arguments = settings.arguments as List; final type = arguments[0] as WalletType; - final hardwareWallet = arguments [1] as HardwareWalletType; + final hardwareWallet = arguments[1] as HardwareWalletType; final walletVM = getIt.get( - param1: type, param2: getIt(param1: hardwareWallet)); + param1: type, + param2: getIt(param1: hardwareWallet)); if (type == WalletType.monero) - return handleRouteWithPlatformAwareness((_) => MoneroHardwareWalletOptionsPage(walletVM)); + return handleRouteWithPlatformAwareness( + (_) => MoneroHardwareWalletOptionsPage(walletVM)); - return handleRouteWithPlatformAwareness((_) => SelectHardwareWalletAccountPage(walletVM)); + return handleRouteWithPlatformAwareness( + (_) => SelectHardwareWalletAccountPage(walletVM)); case Routes.setupPin: Function(PinCodeState, String)? callback; if (settings.arguments is Function(PinCodeState, String)) { - callback = settings.arguments as Function(PinCodeState, String); + callback = + settings.arguments as Function(PinCodeState, String); } return handleRouteWithPlatformAwareness( @@ -274,7 +286,8 @@ Route createRoute(RouteSettings settings) { param1: NewWalletTypeArguments( onTypeSelected: (BuildContext context, WalletType type) { final arg = {'walletType': type}; - Navigator.of(context).pushNamed(Routes.restoreWallet, arguments: arg); + Navigator.of(context) + .pushNamed(Routes.restoreWallet, arguments: arg); }, isCreate: false, ), @@ -294,7 +307,8 @@ Route createRoute(RouteSettings settings) { case Routes.restoreWalletFromSeedKeys: if (isSingleCoin) { return handleRouteWithPlatformAwareness( - (context) => getIt.get(param1: availableWalletTypes.first), + (context) => + getIt.get(param1: availableWalletTypes.first), ); } return handleRouteWithPlatformAwareness( @@ -302,7 +316,8 @@ Route createRoute(RouteSettings settings) { param1: NewWalletTypeArguments( onTypeSelected: (BuildContext context, WalletType type) { final arg = {'walletType': type}; - Navigator.of(context).pushNamed(Routes.restoreWallet, arguments: arg); + Navigator.of(context) + .pushNamed(Routes.restoreWallet, arguments: arg); }, isCreate: false, ), @@ -312,19 +327,23 @@ Route createRoute(RouteSettings settings) { case Routes.restoreWalletFromHardwareWallet: final arguments = settings.arguments as Map?; final showUnavailable = (arguments?['showUnavailable'] as bool?) ?? true; - final onSelect = arguments?['onSelect'] as void Function(BuildContext, HardwareWalletType)?; + final onSelect = arguments?['onSelect'] as void Function( + BuildContext, HardwareWalletType)?; final availableHardwareWalletTypes = - arguments?['availableHardwareWalletTypes'] as List?; + arguments?['availableHardwareWalletTypes'] + as List?; - return handleRouteWithPlatformAwareness((_) => SelectDeviceManufacturerPage( - showUnavailable: showUnavailable, - onSelect: onSelect, - availableHardwareWalletTypes: availableHardwareWalletTypes, - )); + return handleRouteWithPlatformAwareness( + (_) => SelectDeviceManufacturerPage( + showUnavailable: showUnavailable, + onSelect: onSelect, + availableHardwareWalletTypes: availableHardwareWalletTypes, + )); case Routes.connectHardwareWallet: final arguments = settings.arguments as List; - final hardwareWalletType = (arguments[0] as HardwareWalletType?) ?? HardwareWalletType.ledger; + final hardwareWalletType = + (arguments[0] as HardwareWalletType?) ?? HardwareWalletType.ledger; if (isSingleCoin) { return handleRouteWithPlatformAwareness( @@ -332,9 +351,13 @@ Route createRoute(RouteSettings settings) { ConnectDevicePageParams( walletType: availableWalletTypes.first, hardwareWalletType: hardwareWalletType, - onConnectDevice: (BuildContext context, _) => Navigator.of(context).pushNamed( - Routes.chooseHardwareWalletAccount, - arguments: [availableWalletTypes.first, hardwareWalletType]), + onConnectDevice: (BuildContext context, _) => + Navigator.of(context).pushNamed( + Routes.chooseHardwareWalletAccount, + arguments: [ + availableWalletTypes.first, + hardwareWalletType + ]), isReconnect: false, ), getIt.get(), @@ -346,7 +369,8 @@ Route createRoute(RouteSettings settings) { param1: NewWalletTypeArguments( onTypeSelected: (BuildContext context, WalletType type) { if (hardwareWalletType == HardwareWalletType.trezor) { - Navigator.of(context).pushNamed(Routes.chooseHardwareWalletAccount, + Navigator.of(context).pushNamed( + Routes.chooseHardwareWalletAccount, arguments: [type, hardwareWalletType]); return; } @@ -354,13 +378,15 @@ Route createRoute(RouteSettings settings) { final arguments = ConnectDevicePageParams( walletType: type, hardwareWalletType: hardwareWalletType, - onConnectDevice: (BuildContext context, _) => Navigator.of(context).pushNamed( - Routes.chooseHardwareWalletAccount, - arguments: [type, hardwareWalletType]), + onConnectDevice: (BuildContext context, _) => + Navigator.of(context).pushNamed( + Routes.chooseHardwareWalletAccount, + arguments: [type, hardwareWalletType]), isReconnect: false, ); - Navigator.of(context).pushNamed(Routes.connectDevices, arguments: arguments); + Navigator.of(context) + .pushNamed(Routes.connectDevices, arguments: arguments); }, isCreate: false, hardwareWalletType: hardwareWalletType, @@ -381,14 +407,16 @@ Route createRoute(RouteSettings settings) { case Routes.seed: return handleRouteWithPlatformAwareness( - (context) => getIt.get(param1: settings.arguments as bool), + (context) => + getIt.get(param1: settings.arguments as bool), ); case Routes.restoreWallet: final args = settings.arguments as Map?; final walletType = args?['walletType'] as WalletType; return MaterialPageRoute( - builder: (_) => getIt.get(param1: walletType, param2: args)); + builder: (_) => + getIt.get(param1: walletType, param2: args)); case Routes.restoreWalletChooseDerivation: return MaterialPageRoute( @@ -396,16 +424,21 @@ Route createRoute(RouteSettings settings) { param1: settings.arguments as List)); case Routes.sweepingWalletPage: - return CupertinoPageRoute(builder: (_) => getIt.get()); + return CupertinoPageRoute( + builder: (_) => getIt.get()); case Routes.dashboard: return CupertinoPageRoute( - settings: settings, builder: (_) => getIt.get()); + settings: settings, builder: (_) => + FeatureFlag.hasNewUi? + getIt.get(): + getIt.get()); case Routes.send: final args = settings.arguments as Map?; final initialPaymentRequest = args?['paymentRequest'] as PaymentRequest?; - final coinTypeToSpendFrom = args?['coinTypeToSpendFrom'] as UnspentCoinType?; + final coinTypeToSpendFrom = + args?['coinTypeToSpendFrom'] as UnspentCoinType?; return handleRouteWithPlatformAwareness( (context) => getIt.get( @@ -416,10 +449,12 @@ Route createRoute(RouteSettings settings) { case Routes.sendTemplate: return CupertinoPageRoute( - fullscreenDialog: true, builder: (_) => getIt.get()); + fullscreenDialog: true, + builder: (_) => getIt.get()); case Routes.receive: - return CupertinoPageRoute(builder: (context) => getIt.get()); + return CupertinoPageRoute( + builder: (context) => getIt.get()); case Routes.addressPage: return handleRouteWithPlatformAwareness( @@ -429,29 +464,34 @@ Route createRoute(RouteSettings settings) { case Routes.transactionDetails: return CupertinoPageRoute( fullscreenDialog: true, - builder: (_) => - getIt.get(param1: settings.arguments as TransactionInfo)); + builder: (_) => getIt.get( + param1: settings.arguments as TransactionInfo)); case Routes.bumpFeePage: return CupertinoPageRoute( fullscreenDialog: true, - builder: (_) => getIt.get(param1: settings.arguments as List)); + builder: (_) => getIt.get( + param1: settings.arguments as List)); case Routes.newSubaddress: return CupertinoPageRoute( - builder: (_) => getIt.get(param1: settings.arguments)); + builder: (_) => + getIt.get(param1: settings.arguments)); case Routes.disclaimer: return CupertinoPageRoute(builder: (_) => DisclaimerPage()); case Routes.readDisclaimer: - return CupertinoPageRoute(builder: (_) => DisclaimerPage(isReadOnly: true)); + return CupertinoPageRoute( + builder: (_) => DisclaimerPage(isReadOnly: true)); case Routes.readThirdPartyDisclaimer: - return CupertinoPageRoute(builder: (_) => ThirdPartyDisclaimerPage()); + return CupertinoPageRoute( + builder: (_) => ThirdPartyDisclaimerPage()); case Routes.changeRep: - return CupertinoPageRoute(builder: (_) => getIt.get()); + return CupertinoPageRoute( + builder: (_) => getIt.get()); case Routes.walletList: final onWalletLoaded = settings.arguments as Function(BuildContext)?; @@ -463,8 +503,8 @@ Route createRoute(RouteSettings settings) { case Routes.walletEdit: return MaterialPageRoute( fullscreenDialog: true, - builder: (_) => - getIt.get(param1: settings.arguments as WalletEditPageArguments), + builder: (_) => getIt.get( + param1: settings.arguments as WalletEditPageArguments), ); case Routes.auth: @@ -477,7 +517,8 @@ Route createRoute(RouteSettings settings) { instanceName: 'wallet_unlock_verifiable', param2: true) : getIt.get( - param1: settings.arguments as OnAuthenticationFinished, param2: true)); + param1: settings.arguments as OnAuthenticationFinished, + param2: true)); case Routes.totpAuthCodePage: final args = settings.arguments as TotpAuthArgumentsModel; @@ -503,13 +544,15 @@ Route createRoute(RouteSettings settings) { ? WillPopScope( child: getIt.get( param1: WalletUnlockArguments( - callback: settings.arguments as OnAuthenticationFinished), + callback: + settings.arguments as OnAuthenticationFinished), param2: false, instanceName: 'wallet_unlock_verifiable'), onWillPop: () async => false) : WillPopScope( child: getIt.get( - param1: settings.arguments as OnAuthenticationFinished, param2: false), + param1: settings.arguments as OnAuthenticationFinished, + param2: false), onWillPop: () async => false)); case Routes.silentPaymentsSettings: @@ -554,11 +597,13 @@ Route createRoute(RouteSettings settings) { case Routes.trocadorProvidersPage: return CupertinoPageRoute( - fullscreenDialog: true, builder: (_) => getIt.get()); + fullscreenDialog: true, + builder: (_) => getIt.get()); case Routes.domainLookupsPage: return CupertinoPageRoute( - fullscreenDialog: true, builder: (_) => getIt.get()); + fullscreenDialog: true, + builder: (_) => getIt.get()); case Routes.displaySettingsPage: return handleRouteWithPlatformAwareness( @@ -574,17 +619,20 @@ Route createRoute(RouteSettings settings) { final args = settings.arguments as Map?; return CupertinoPageRoute( builder: (_) => getIt.get( - param1: args?['editingNode'] as Node?, param2: args?['isSelected'] as bool?)); + param1: args?['editingNode'] as Node?, + param2: args?['isSelected'] as bool?)); case Routes.login: return CupertinoPageRoute( builder: (context) => WillPopScope( child: SettingsStoreBase.walletPasswordDirectInput - ? getIt.get(instanceName: 'wallet_password_login') + ? getIt.get( + instanceName: 'wallet_password_login') : getIt.get(instanceName: 'login'), onWillPop: () async => // FIX-ME: Additional check does it works correctly - (await SystemChannels.platform.invokeMethod('SystemNavigator.pop') ?? + (await SystemChannels.platform + .invokeMethod('SystemNavigator.pop') ?? false)), fullscreenDialog: true); @@ -592,7 +640,8 @@ Route createRoute(RouteSettings settings) { final args = settings.arguments as Map?; return CupertinoPageRoute( builder: (_) => getIt.get( - param1: args?['editingNode'] as Node?, param2: args?['isSelected'] as bool?)); + param1: args?['editingNode'] as Node?, + param2: args?['isSelected'] as bool?)); case Routes.accountCreation: return CupertinoPageRoute( @@ -601,8 +650,8 @@ Route createRoute(RouteSettings settings) { case Routes.nanoAccountCreation: return CupertinoPageRoute( - builder: (_) => - getIt.get(param1: settings.arguments as NanoAccount?)); + builder: (_) => getIt.get( + param1: settings.arguments as NanoAccount?)); case Routes.addressBook: return handleRouteWithPlatformAwareness( @@ -615,11 +664,13 @@ Route createRoute(RouteSettings settings) { builder: (_) => getIt.get(param1: selectedCurrency)); case Routes.pickerWalletAddress: - return MaterialPageRoute(builder: (_) => getIt.get()); + return MaterialPageRoute( + builder: (_) => getIt.get()); case Routes.addressBookAddContact: return handleRouteWithPlatformAwareness( - (context) => getIt.get(param1: settings.arguments as ContactRecord?), + (context) => getIt.get( + param1: settings.arguments as ContactRecord?), ); case Routes.showKeys: @@ -628,19 +679,23 @@ Route createRoute(RouteSettings settings) { ); case Routes.exchangeTrade: - return CupertinoPageRoute(builder: (_) => getIt.get()); + return CupertinoPageRoute( + builder: (_) => getIt.get()); case Routes.exchangeConfirm: - return MaterialPageRoute(builder: (_) => getIt.get()); + return MaterialPageRoute( + builder: (_) => getIt.get()); case Routes.tradeDetails: return MaterialPageRoute( fullscreenDialog: true, - builder: (_) => getIt.get(param1: settings.arguments as Trade)); + builder: (_) => + getIt.get(param1: settings.arguments as Trade)); case Routes.orderDetails: return MaterialPageRoute( - builder: (_) => getIt.get(param1: settings.arguments as Order)); + builder: (_) => + getIt.get(param1: settings.arguments as Order)); case Routes.buySellPage: final args = settings.arguments as bool; @@ -650,7 +705,8 @@ Route createRoute(RouteSettings settings) { case Routes.buyOptionsPage: final args = settings.arguments as List; - return MaterialPageRoute(builder: (_) => getIt.get(param1: args)); + return MaterialPageRoute( + builder: (_) => getIt.get(param1: args)); case Routes.paymentMethodOptionsPage: final args = settings.arguments as List; @@ -661,15 +717,18 @@ Route createRoute(RouteSettings settings) { final args = settings.arguments as List; return MaterialPageRoute( - fullscreenDialog: true, builder: (_) => getIt.get(param1: args)); + fullscreenDialog: true, + builder: (_) => getIt.get(param1: args)); case Routes.exchange: return handleRouteWithPlatformAwareness( - (context) => getIt.get(param1: settings.arguments as PaymentRequest?), + (context) => getIt.get( + param1: settings.arguments as PaymentRequest?), ); case Routes.exchangeTemplate: - return CupertinoPageRoute(builder: (_) => getIt.get()); + return CupertinoPageRoute( + builder: (_) => getIt.get()); case Routes.rescan: return MaterialPageRoute(builder: (_) => getIt.get()); @@ -681,11 +740,13 @@ Route createRoute(RouteSettings settings) { return MaterialPageRoute(builder: (_) => getIt.get()); case Routes.walletGroupExistingSeedDescriptionPage: - return MaterialPageRoute(builder: (_) => WalletGroupExistingSeedDescriptionPage()); + return MaterialPageRoute( + builder: (_) => WalletGroupExistingSeedDescriptionPage()); case Routes.transactionSuccessPage: return MaterialPageRoute( - builder: (_) => getIt.get(param1: settings.arguments as String)); + builder: (_) => getIt.get( + param1: settings.arguments as String)); case Routes.backup: return handleRouteWithPlatformAwareness( @@ -693,11 +754,13 @@ Route createRoute(RouteSettings settings) { ); case Routes.editBackupPassword: - return CupertinoPageRoute(builder: (_) => getIt.get()); + return CupertinoPageRoute( + builder: (_) => getIt.get()); case Routes.restoreFromBackup: return CupertinoPageRoute( - fullscreenDialog: true, builder: (_) => getIt.get()); + fullscreenDialog: true, + builder: (_) => getIt.get()); case Routes.support: return handleRouteWithPlatformAwareness( @@ -705,7 +768,8 @@ Route createRoute(RouteSettings settings) { ); case Routes.supportLiveChat: - return CupertinoPageRoute(builder: (_) => getIt.get()); + return CupertinoPageRoute( + builder: (_) => getIt.get()); case Routes.supportOtherLinks: return handleRouteWithPlatformAwareness( @@ -715,7 +779,8 @@ Route createRoute(RouteSettings settings) { case Routes.unspentCoinsList: final coinTypeToSpendFrom = settings.arguments as UnspentCoinType?; return handleRouteWithPlatformAwareness( - (context) => getIt.get(param1: coinTypeToSpendFrom), + (context) => + getIt.get(param1: coinTypeToSpendFrom), ); case Routes.unspentCoinsDetails: @@ -752,7 +817,6 @@ Route createRoute(RouteSettings settings) { (context) => getIt.get(param1: args), ); - case Routes.cakePayAccountPage: return handleRouteWithPlatformAwareness( (context) => getIt.get(), @@ -782,41 +846,47 @@ Route createRoute(RouteSettings settings) { toggleUseTestnet: toggleTestnet, advancedPrivacySettingsViewModel: getIt.get(param1: type), - nodeViewModel: getIt.get(param1: type, param2: false), + nodeViewModel: + getIt.get(param1: type, param2: false), seedSettingsViewModel: getIt.get(), ), ); case Routes.anonPayInvoicePage: final args = settings.arguments as List; - return CupertinoPageRoute(builder: (_) => getIt.get(param1: args)); + return CupertinoPageRoute( + builder: (_) => getIt.get(param1: args)); case Routes.anonPayReceivePage: final anonReceivePageArgs = settings.arguments as AnonPayReceivePageArgs; return CupertinoPageRoute( - builder: (_) => getIt.get(param1: anonReceivePageArgs)); + builder: (_) => + getIt.get(param1: anonReceivePageArgs)); case Routes.anonPayDetailsPage: final anonInvoiceViewData = settings.arguments as AnonpayInvoiceInfo; return CupertinoPageRoute( - builder: (_) => getIt.get(param1: anonInvoiceViewData)); + builder: (_) => + getIt.get(param1: anonInvoiceViewData)); case Routes.payjoinDetails: final arguments = settings.arguments as List; final sessionId = arguments.first as String; final transactionInfo = arguments[1] as TransactionInfo?; return CupertinoPageRoute( - builder: (_) => - getIt.get(param1: sessionId, param2: transactionInfo)); + builder: (_) => getIt.get( + param1: sessionId, param2: transactionInfo)); case Routes.desktop_actions: return PageRouteBuilder( opaque: false, - pageBuilder: (_, __, ___) => DesktopDashboardActions(getIt()), + pageBuilder: (_, __, ___) => + DesktopDashboardActions(getIt()), ); case Routes.desktop_settings_page: - return CupertinoPageRoute(builder: (_) => getIt.get()); + return CupertinoPageRoute( + builder: (_) => getIt.get()); case Routes.empty_no_route: return MaterialPageRoute(builder: (_) => SizedBox.shrink()); @@ -831,17 +901,21 @@ Route createRoute(RouteSettings settings) { return MaterialPageRoute(builder: (_) => getIt.get()); case Routes.setup_2faQRPage: - return MaterialPageRoute(builder: (_) => getIt.get()); + return MaterialPageRoute( + builder: (_) => getIt.get()); case Routes.modify2FAPage: - return MaterialPageRoute(builder: (_) => getIt.get()); + return MaterialPageRoute( + builder: (_) => getIt.get()); case Routes.setup2faInfoPage: - return MaterialPageRoute(builder: (_) => getIt.get()); + return MaterialPageRoute( + builder: (_) => getIt.get()); case Routes.urqrAnimatedPage: return MaterialPageRoute( - builder: (_) => getIt.get(param1: settings.arguments)); + builder: (_) => + getIt.get(param1: settings.arguments)); case Routes.homeSettings: return CupertinoPageRoute( @@ -863,10 +937,12 @@ Route createRoute(RouteSettings settings) { ); case Routes.manageNodes: - return MaterialPageRoute(builder: (_) => getIt.get(param1: false)); + return MaterialPageRoute( + builder: (_) => getIt.get(param1: false)); case Routes.managePowNodes: - return MaterialPageRoute(builder: (_) => getIt.get(param1: true)); + return MaterialPageRoute( + builder: (_) => getIt.get(param1: true)); case Routes.walletConnectConnectionsListing: return MaterialPageRoute( @@ -902,7 +978,9 @@ Route createRoute(RouteSettings settings) { return MaterialPageRoute( builder: (_) => ConnectDevicePage( - params, getIt.get(param1: params.hardwareWalletType))); + params, + getIt.get( + param1: params.hardwareWalletType))); case Routes.walletGroupDescription: final walletType = settings.arguments as WalletType; @@ -942,12 +1020,12 @@ Route createRoute(RouteSettings settings) { return MaterialPageRoute( builder: (_) => getIt.get(), ); - + case Routes.devSocketHealthLogs: return CupertinoPageRoute( builder: (_) => getIt.get(), ); - + case Routes.devQRTools: return MaterialPageRoute( builder: (_) => getIt.get(), @@ -957,12 +1035,12 @@ Route createRoute(RouteSettings settings) { return MaterialPageRoute( builder: (_) => getIt.get(), ); - + case Routes.devExchangeProviderLogs: return MaterialPageRoute( builder: (_) => getIt.get(), ); - + case Routes.devMoneroCallProfiler: return MaterialPageRoute( builder: (_) => getIt.get(), @@ -977,7 +1055,7 @@ Route createRoute(RouteSettings settings) { return MaterialPageRoute( builder: (_) => getIt.get(), ); - + case Routes.startTor: return MaterialPageRoute( builder: (_) => getIt.get(), @@ -991,6 +1069,8 @@ Route createRoute(RouteSettings settings) { default: return MaterialPageRoute( builder: (_) => Scaffold( - body: Center(child: Text(S.current.router_no_route(settings.name ?? 'No route'))))); + body: Center( + child: Text(S.current + .router_no_route(settings.name ?? 'No route'))))); } } diff --git a/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart b/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart index 2c1dc74e96..2a708e4869 100644 --- a/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart +++ b/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart @@ -1,4 +1,3 @@ -import 'dart:math' as math; import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -20,36 +19,38 @@ class NewMainNavBar extends StatefulWidget { } class _NEWNewMainNavBarState extends State { - static const kBarFlex = 0.85; static const barHeight = 64.0; static const barBottomPadding = 32.0; static const iconWidth = 28.0; static const iconHeight = 28.0; + static const iconHorizontalPadding = 12.0; static const pillIconWidth = 20.0; static const pillIconHeight = 20.0; - static const pillIconSpacing = 8.0; - static const pillHorizontalPadding = 14.0; + static const pillIconSpacing = 4.0; + static const pillHorizontalPadding = 16.0; static const barBorderRadius = 50.0; static const pillBorderRadius = 50.0; - static const barResizeDuration = Duration(milliseconds: 400); + static const barHorizontalPadding = 12.0; + + static const barResizeDuration = Duration(milliseconds: 100); static const inactiveIconMoveDuration = Duration(milliseconds: 150); static const inactiveIconFadeDuration = Duration(milliseconds: 100); static const inactiveIconAppearDuration = Duration(milliseconds: 250); - static const pillMoveDuration = Duration(milliseconds: 300); - static const pillResizeDuration = Duration(milliseconds: 200); + static const pillMoveDuration = Duration(milliseconds: 150); + static const pillResizeDuration = Duration(milliseconds: 100); static const pillTextStyle = TextStyle( fontSize: 16, fontWeight: FontWeight.w500, ); - late int selectedIndex; - bool _fadeSelected = true; + int selectedIndex = 0; + bool _fadeSelected = false; bool _firstFrame = true; @override @@ -68,11 +69,11 @@ class _NEWNewMainNavBarState extends State { setState(() { selectedIndex = index; - _fadeSelected = false; + _fadeSelected = true; }); // delay fade (tweak duration) - Future.delayed(const Duration(milliseconds: 50), () { + Future.delayed(const Duration(milliseconds: 00), () { if (!mounted) return; if (index == selectedIndex) { setState(() => _fadeSelected = true); @@ -98,7 +99,21 @@ class _NEWNewMainNavBarState extends State { return pillIconWidth + pillIconSpacing + textPainter.width + - pillHorizontalPadding * 2; + pillHorizontalPadding; + } + + double calcLeft(int index, double pillWidth) { + final double baseOffset = (iconWidth+iconHorizontalPadding) * index; + + double additionalSpacing; + if (index > selectedIndex) additionalSpacing = pillWidth-iconWidth; + else additionalSpacing = 0; + + return baseOffset + additionalSpacing; + } + + double calcBarWidth(double pillWidth) { + return (iconWidth+iconHorizontalPadding)*NewMainActions.all.length+(pillWidth-iconWidth)+barHorizontalPadding; } @override @@ -115,56 +130,12 @@ class _NEWNewMainNavBarState extends State { (action) => action.canShow?.call(widget.dashboardViewModel) ?? true) .toList(); - final screenWidth = MediaQuery.of(context).size.width; final pillWidth = _estimatePillWidthForAction( context, visibleActions[selectedIndex], color: activeColor); - final baseWidth = screenWidth * 0.65; + final barWidth = calcBarWidth(pillWidth); - final double baselinePillWidth = - pillIconWidth + pillIconSpacing + (pillHorizontalPadding * 2) + 8; - - // Dynamic bar width - final barWidth = math.max( - baseWidth, - baseWidth + (pillWidth - baselinePillWidth) * kBarFlex, - ); - - final int itemCount = visibleActions.length; - const double edgePadding = 10.0; - final double firstItemLeft = edgePadding; - final double lastItemLeft = barWidth - pillWidth - edgePadding; - - // Center alignment for middle (3rd) icon - final double centerOfBar = barWidth / 2; - final double halfPill = pillWidth / 2; - final double centerItemLeft = centerOfBar - halfPill; - - // Base even spacing between first → center → last - final double secondItemLeft = - firstItemLeft + (centerItemLeft - firstItemLeft) / 2; - final double fourthItemLeft = - centerItemLeft + (lastItemLeft - centerItemLeft) / 2; - - // Spacing correction function - double spacingCorrection(int index) { - const double maxCorrection = 6.0; - final double factor = - (index - (itemCount - 1) / 2).abs() / ((itemCount - 1) / 2); - return maxCorrection * factor; - } - - // Apply correction: shift outer icons inward slightly - final List positions = [ - firstItemLeft + spacingCorrection(0), - secondItemLeft + spacingCorrection(1) / 2, - centerItemLeft, - fourthItemLeft - spacingCorrection(3) / 2, - lastItemLeft - spacingCorrection(4), - ]; - - final double left = positions[selectedIndex]; final currentAction = visibleActions[selectedIndex]; return Align( @@ -187,70 +158,67 @@ class _NEWNewMainNavBarState extends State { color: backgroundColor, borderRadius: BorderRadius.circular(barBorderRadius), ), - child: Stack( - alignment: Alignment.center, - children: [ - AnimatedPill( - left: left, - pillColor: pillColor, - currentAction: currentAction, - pillIconHeight: pillIconHeight, - pillIconWidth: pillIconWidth, - pillIconSpacing: pillIconSpacing, - pillBorderRadius: pillBorderRadius, - contentColor: activeColor, - estimateWidthForAction: pillWidth, - pillTextStyle: pillTextStyle, - pillMoveDuration: pillMoveDuration, - pillResizeDuration: pillResizeDuration, - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - for (int i = 0; i < visibleActions.length; i++) - GestureDetector( - onTap: () => _onItemTap(i), - child: AnimatedContainer( - duration: _firstFrame - ? Duration.zero - : inactiveIconMoveDuration, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: barHorizontalPadding), + child: Stack( + alignment: Alignment.center, + children: [ + AnimatedPill( + left: calcLeft(selectedIndex, pillWidth), + pillColor: pillColor, + currentAction: currentAction, + pillIconHeight: pillIconHeight, + pillIconWidth: pillIconWidth, + pillIconSpacing: pillIconSpacing, + pillBorderRadius: pillBorderRadius, + contentColor: activeColor, + estimateWidthForAction: pillWidth, + pillTextStyle: pillTextStyle, + pillMoveDuration: pillMoveDuration, + pillResizeDuration: pillResizeDuration, + ), + for (int i = 0; i < visibleActions.length; i++) + AnimatedPositioned( + duration: pillResizeDuration, + left: calcLeft(i, pillWidth), + curve: Curves.easeOutCubic, + child: GestureDetector( + onTap: () => _onItemTap(i), + child: AnimatedContainer( + duration: _firstFrame + ? Duration.zero + : inactiveIconMoveDuration, + curve: Curves.easeOutCubic, + width: + i == selectedIndex ? pillWidth : iconWidth, + height: iconHeight, + alignment: Alignment.center, + child: AnimatedOpacity( + duration: inactiveIconFadeDuration, curve: Curves.easeOutCubic, - width: i == selectedIndex - ? pillWidth - : iconWidth, - height: iconHeight, - alignment: Alignment.center, - child: AnimatedOpacity( - duration: inactiveIconFadeDuration, + opacity: (i == selectedIndex && _fadeSelected) + ? 0.0 + : 1.0, + child: AnimatedScale( + duration: inactiveIconAppearDuration, curve: Curves.easeOutCubic, - opacity: - (i == selectedIndex && _fadeSelected) - ? 0.0 - : 1.0, - child: AnimatedScale( - duration: inactiveIconAppearDuration, - curve: Curves.easeOutCubic, - scale: - (i == selectedIndex) ? 0.95 : 1.0, - child: SvgPicture.asset( - visibleActions[i].image, - width: iconWidth, - height: iconHeight, - colorFilter: ColorFilter.mode( - inactiveColor, - BlendMode.srcIn, - ), + scale: (i == selectedIndex) ? 0.95 : 1.0, + child: SvgPicture.asset( + visibleActions[i].image, + width: iconWidth, + height: iconHeight, + colorFilter: ColorFilter.mode( + inactiveColor, + BlendMode.srcIn, ), ), ), ), ), - ], - ), - ) - ], + ), + ), + ], + ), )), ), ), @@ -294,60 +262,46 @@ class AnimatedPill extends StatelessWidget { @override Widget build(BuildContext context) { return AnimatedPositioned( - duration: pillMoveDuration, - curve: Curves.easeOutCubic, - left: left, - top: 12, - bottom: 12, - child: TweenAnimationBuilder( - tween: Tween( - begin: estimateWidthForAction, - end: estimateWidthForAction, - ), - duration: pillResizeDuration, + duration: pillMoveDuration, curve: Curves.easeOutCubic, - builder: (context, width, child) { - return AnimatedContainer( - duration: pillResizeDuration, - curve: Curves.easeOutCubic, - width: width + 4, - decoration: BoxDecoration( - color: pillColor, - borderRadius: BorderRadius.circular(pillBorderRadius), - ), - clipBehavior: Clip.hardEdge, - alignment: Alignment.center, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 2), - child: FittedBox( - fit: BoxFit.scaleDown, - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SvgPicture.asset( - currentAction.image, - width: pillIconWidth, - height: pillIconHeight, - colorFilter: ColorFilter.mode( - contentColor, - BlendMode.srcIn, - ), - ), - SizedBox(width: pillIconSpacing), - Text( - currentAction.name(context), - style: pillTextStyle.copyWith(color: contentColor), - overflow: TextOverflow.fade, - softWrap: false, - ), - ], + left: left, + top: 12, + bottom: 12, + child: AnimatedContainer( + duration: pillResizeDuration, + curve: Curves.easeOutCubic, + width: estimateWidthForAction, + decoration: BoxDecoration( + color: pillColor, + borderRadius: BorderRadius.circular(pillBorderRadius), + ), + clipBehavior: Clip.hardEdge, + alignment: Alignment.center, + child: FittedBox( + fit: BoxFit.scaleDown, + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset( + currentAction.image, + width: pillIconWidth, + height: pillIconHeight, + colorFilter: ColorFilter.mode( + contentColor, + BlendMode.srcIn, + ), ), - ), + SizedBox(width: pillIconSpacing), + Text( + currentAction.name(context), + style: pillTextStyle.copyWith(color: contentColor), + overflow: TextOverflow.fade, + softWrap: false, + ), + ], ), - ); - }, - ), - ); + ), + )); } } diff --git a/lib/typography.dart b/lib/typography.dart index 816f116b41..c08a98e168 100644 --- a/lib/typography.dart +++ b/lib/typography.dart @@ -1,6 +1,8 @@ +import 'package:cake_wallet/utils/feature_flag.dart'; import 'package:flutter/material.dart'; const latoFont = "Lato"; +const wixFont = "Wix Madefor Text"; TextStyle textXxSmall({Color? color}) => _cakeRegular(10, color); @@ -54,7 +56,7 @@ TextStyle _textStyle({ Color? color, }) => TextStyle( - fontFamily: latoFont, + fontFamily: FeatureFlag.hasNewUi ? wixFont : latoFont, fontSize: size, fontWeight: fontWeight, color: color ?? Colors.white, diff --git a/lib/utils/feature_flag.dart b/lib/utils/feature_flag.dart index 661595a414..4591aeffdf 100644 --- a/lib/utils/feature_flag.dart +++ b/lib/utils/feature_flag.dart @@ -10,7 +10,9 @@ class FeatureFlag { static const bool isBackgroundSyncEnabled = true; static bool get isInAppTorEnabled => CakeTor.instance is! CakeTorDisabled; static const int verificationWordsCount = kDebugMode ? 0 : 2; - static const bool hasDevOptions = bool.fromEnvironment('hasDevOptions', defaultValue: kDebugMode); + static const bool hasDevOptions = + bool.fromEnvironment('hasDevOptions', defaultValue: kDebugMode); static const bool hasBitcoinViewOnly = true; static const bool customBackgroundEnabled = false; + static const bool hasNewUi = true; } diff --git a/lib/view_model/exchange/exchange_trade_view_model.dart b/lib/view_model/exchange/exchange_trade_view_model.dart index a2cf0d738e..40f0fe0057 100644 --- a/lib/view_model/exchange/exchange_trade_view_model.dart +++ b/lib/view_model/exchange/exchange_trade_view_model.dart @@ -18,7 +18,6 @@ import 'package:cake_wallet/exchange/provider/trocador_exchange_provider.dart'; import 'package:cake_wallet/exchange/provider/xoswap_exchange_provider.dart'; import 'package:cake_wallet/exchange/trade.dart'; import 'package:cake_wallet/generated/i18n.dart'; -import 'package:cake_wallet/arbitrum/arbitrum.dart'; import 'package:cake_wallet/reactions/wallet_connect.dart'; import 'package:cake_wallet/src/screens/exchange_trade/exchange_trade_item.dart'; import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart'; @@ -422,16 +421,6 @@ abstract class ExchangeTradeViewModelBase with Store { case WalletType.ethereum: return _createERC681URI(fromCurrency, inputAddress, amount); // TODO: Expand ERC681URI support to Polygon(modify decoding flow for QRs, pay anything, and deep link handling) - case WalletType.polygon: - return PolygonURI(amount: amount, address: inputAddress); - case WalletType.base: - return BaseURI(amount: amount, address: inputAddress); - case WalletType.arbitrum: - return ArbitrumURI(amount: amount, address: inputAddress); - case WalletType.solana: - return SolanaURI(amount: amount, address: inputAddress); - case WalletType.tron: - return TronURI(amount: amount, address: inputAddress); case WalletType.monero: return MoneroURI(address: inputAddress, amount: amount); case WalletType.wownero: diff --git a/lib/view_model/send/send_view_model.dart b/lib/view_model/send/send_view_model.dart index 217d7cf45d..aa7fe20fc5 100644 --- a/lib/view_model/send/send_view_model.dart +++ b/lib/view_model/send/send_view_model.dart @@ -100,8 +100,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor this.transactionDescriptionBox, this.hardwareWalletViewModel, this.unspentCoinsListViewModel, - this.feesViewModel, - this.walletInfoSource, { + this.feesViewModel, { this.coinTypeToSpendFrom = UnspentCoinType.nonMweb, }) : state = InitialExecutionState(), currencies = appStore.wallet!.balance.keys.toList(), @@ -873,7 +872,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor WalletType.banano, WalletType.solana, WalletType.tron, - WalletType.arbitrium + WalletType.arbitrum ].contains(wallet.type)) { throw Exception('Priority is null for wallet type: ${wallet.type}'); } @@ -1053,7 +1052,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor WalletType.polygon, WalletType.base, WalletType.haven, - WalletType.arbitrium + WalletType.arbitrum ].contains(walletType)) { if (errorMessage.contains('gas required exceeds allowance')) { return S.current.gas_exceeds_allowance; From b60abec0ca65e1dfd113b4e0d8585eee8fce4bf2 Mon Sep 17 00:00:00 2001 From: Robert Malikowski Date: Sun, 16 Nov 2025 11:50:31 +0100 Subject: [PATCH 044/105] fix import --- lib/src/screens/send/send_page.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/src/screens/send/send_page.dart b/lib/src/screens/send/send_page.dart index cd3e695aa3..d6547b3cfe 100644 --- a/lib/src/screens/send/send_page.dart +++ b/lib/src/screens/send/send_page.dart @@ -21,6 +21,7 @@ import 'package:cake_wallet/src/widgets/bottom_sheet/base_bottom_sheet_widget.da import 'package:cake_wallet/src/widgets/bottom_sheet/confirm_sending_bottom_sheet_widget.dart'; import 'package:cake_wallet/src/widgets/bottom_sheet/info_bottom_sheet_widget.dart'; import 'package:cake_wallet/src/widgets/keyboard_done_button.dart'; +import 'package:cake_wallet/src/widgets/picker.dart'; import 'package:cake_wallet/src/widgets/primary_button.dart'; import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart'; import 'package:cake_wallet/src/widgets/simple_checkbox.dart'; From dbd0e05b10ac16c6d89ce3b84440e8574ae5a736 Mon Sep 17 00:00:00 2001 From: Robert Malikowski Date: Sun, 16 Nov 2025 21:07:17 +0100 Subject: [PATCH 045/105] add new-ui dir to pubspec_base --- pubspec_base.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/pubspec_base.yaml b/pubspec_base.yaml index 274a97201e..79f4acc696 100644 --- a/pubspec_base.yaml +++ b/pubspec_base.yaml @@ -242,6 +242,7 @@ flutter: - assets/text/ - assets/faq/ - assets/animation/ + - assets/new-ui/ fonts: - family: Lato From 564f1932a943150bff4798cf4e892baeb8a2a8e2 Mon Sep 17 00:00:00 2001 From: Robert Malikowski Date: Sun, 16 Nov 2025 21:31:42 +0100 Subject: [PATCH 046/105] minor layout fixes --- .../widgets/coins_page/action_row/coin_action_button.dart | 7 +++++-- .../widgets/coins_page/action_row/coin_action_row.dart | 2 +- lib/new-ui/widgets/coins_page/top_bar.dart | 6 +++--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/new-ui/widgets/coins_page/action_row/coin_action_button.dart b/lib/new-ui/widgets/coins_page/action_row/coin_action_button.dart index d925cf8759..a3ae3f4431 100644 --- a/lib/new-ui/widgets/coins_page/action_row/coin_action_button.dart +++ b/lib/new-ui/widgets/coins_page/action_row/coin_action_button.dart @@ -13,13 +13,16 @@ class CoinActionButton extends StatelessWidget { final String label; final VoidCallback action; + static const sizeFactor = 0.18; + @override Widget build(BuildContext context) { + final double size = MediaQuery.of(context).size.width*sizeFactor; return Column( children: [ Container( - width: 80, - height: 80, + width: size, + height: size, decoration: BoxDecoration( shape: BoxShape.circle, gradient: LinearGradient( diff --git a/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart b/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart index 5ac17a11d8..5c4d4204d5 100644 --- a/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart +++ b/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart @@ -16,7 +16,7 @@ class CoinActionRow extends StatelessWidget { child: Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.center, - spacing: 24.0, + spacing: MediaQuery.of(context).size.width*0.05, children: [ CoinActionButton( icon: SvgPicture.asset("assets/new-ui/send.svg"), diff --git a/lib/new-ui/widgets/coins_page/top_bar.dart b/lib/new-ui/widgets/coins_page/top_bar.dart index 0c7e0ce15f..5e970dd7e3 100644 --- a/lib/new-ui/widgets/coins_page/top_bar.dart +++ b/lib/new-ui/widgets/coins_page/top_bar.dart @@ -21,8 +21,8 @@ class TopBar extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - if(dashboardViewModel.balanceViewModel.hasSecondAdditionalBalance || - dashboardViewModel.balanceViewModel.hasSecondAvailableBalance) + (dashboardViewModel.balanceViewModel.hasSecondAdditionalBalance || + dashboardViewModel.balanceViewModel.hasSecondAvailableBalance) ? SizedBox( child: AnimatedSwitcher( duration: Duration(milliseconds: 200), @@ -69,7 +69,7 @@ class TopBar extends StatelessWidget { ), ), ), - ), + ) : Container(), ModernButton.svg(size: 44, onPressed: (){}, svgPath: "assets/new-ui/top-settings.svg",), ], ), From 104119902ab4a85a9d6f44d589984b2fca250ab9 Mon Sep 17 00:00:00 2001 From: Robert Malikowski Date: Sun, 16 Nov 2025 21:37:20 +0100 Subject: [PATCH 047/105] cleanup navbar logic --- .../dashboard/widgets/new_main_navbar_widget.dart | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart b/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart index 2a708e4869..53bc21ab25 100644 --- a/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart +++ b/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart @@ -50,7 +50,6 @@ class _NEWNewMainNavBarState extends State { ); int selectedIndex = 0; - bool _fadeSelected = false; bool _firstFrame = true; @override @@ -69,15 +68,6 @@ class _NEWNewMainNavBarState extends State { setState(() { selectedIndex = index; - _fadeSelected = true; - }); - - // delay fade (tweak duration) - Future.delayed(const Duration(milliseconds: 00), () { - if (!mounted) return; - if (index == selectedIndex) { - setState(() => _fadeSelected = true); - } }); NewMainActions.all[index].onTap.call(); @@ -196,7 +186,7 @@ class _NEWNewMainNavBarState extends State { child: AnimatedOpacity( duration: inactiveIconFadeDuration, curve: Curves.easeOutCubic, - opacity: (i == selectedIndex && _fadeSelected) + opacity: (i == selectedIndex) ? 0.0 : 1.0, child: AnimatedScale( From cd8d43af7bc852c0dc696ebbe6d075eb75a9ab97 Mon Sep 17 00:00:00 2001 From: tuxsudo Date: Mon, 17 Nov 2025 11:36:17 -0500 Subject: [PATCH 048/105] Modify navbar behaviour --- .../widgets/new_main_navbar_widget.dart | 44 ++++++++----------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart b/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart index 53bc21ab25..a6b760865c 100644 --- a/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart +++ b/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart @@ -37,12 +37,12 @@ class _NEWNewMainNavBarState extends State { static const barHorizontalPadding = 12.0; - static const barResizeDuration = Duration(milliseconds: 100); - static const inactiveIconMoveDuration = Duration(milliseconds: 150); - static const inactiveIconFadeDuration = Duration(milliseconds: 100); - static const inactiveIconAppearDuration = Duration(milliseconds: 250); - static const pillMoveDuration = Duration(milliseconds: 150); - static const pillResizeDuration = Duration(milliseconds: 100); + static const barResizeDuration = Duration(milliseconds: 300); + static const inactiveIconMoveDuration = Duration(milliseconds: 300); + static const inactiveIconFadeDuration = Duration(milliseconds: 300); + static const inactiveIconAppearDuration = Duration(milliseconds: 300); + static const pillMoveDuration = Duration(milliseconds: 250); + static const pillResizeDuration = Duration(milliseconds: 250); static const pillTextStyle = TextStyle( fontSize: 16, @@ -50,6 +50,7 @@ class _NEWNewMainNavBarState extends State { ); int selectedIndex = 0; + bool _fadeSelected = false; bool _firstFrame = true; @override @@ -183,16 +184,14 @@ class _NEWNewMainNavBarState extends State { i == selectedIndex ? pillWidth : iconWidth, height: iconHeight, alignment: Alignment.center, - child: AnimatedOpacity( + child: AnimatedAlign( duration: inactiveIconFadeDuration, curve: Curves.easeOutCubic, - opacity: (i == selectedIndex) - ? 0.0 - : 1.0, + alignment: Alignment.centerLeft, child: AnimatedScale( duration: inactiveIconAppearDuration, curve: Curves.easeOutCubic, - scale: (i == selectedIndex) ? 0.95 : 1.0, + scale: (i == selectedIndex) ? 0.8 : 1.0, child: SvgPicture.asset( visibleActions[i].image, width: iconWidth, @@ -273,25 +272,18 @@ class AnimatedPill extends StatelessWidget { mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, children: [ - SvgPicture.asset( - currentAction.image, - width: pillIconWidth, - height: pillIconHeight, - colorFilter: ColorFilter.mode( - contentColor, - BlendMode.srcIn, - ), - ), SizedBox(width: pillIconSpacing), - Text( - currentAction.name(context), - style: pillTextStyle.copyWith(color: contentColor), - overflow: TextOverflow.fade, - softWrap: false, + Padding(padding: EdgeInsets.only(left: pillIconWidth), + child: Text( + currentAction.name(context), + style: pillTextStyle.copyWith(color: contentColor), + overflow: TextOverflow.fade, + softWrap: false, + ), ), ], ), ), )); } -} +} \ No newline at end of file From fd25cabad61d0c5c2db916162656b844ab10a74e Mon Sep 17 00:00:00 2001 From: Robert Malikowski Date: Mon, 17 Nov 2025 18:44:40 +0100 Subject: [PATCH 049/105] smooth color change when selecting navbar options --- .../widgets/new_main_navbar_widget.dart | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart b/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart index a6b760865c..79447b5b3e 100644 --- a/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart +++ b/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart @@ -43,6 +43,7 @@ class _NEWNewMainNavBarState extends State { static const inactiveIconAppearDuration = Duration(milliseconds: 300); static const pillMoveDuration = Duration(milliseconds: 250); static const pillResizeDuration = Duration(milliseconds: 250); + static const iconColorChangeDuration = Duration(milliseconds: 200); static const pillTextStyle = TextStyle( fontSize: 16, @@ -192,14 +193,23 @@ class _NEWNewMainNavBarState extends State { duration: inactiveIconAppearDuration, curve: Curves.easeOutCubic, scale: (i == selectedIndex) ? 0.8 : 1.0, - child: SvgPicture.asset( - visibleActions[i].image, - width: iconWidth, - height: iconHeight, - colorFilter: ColorFilter.mode( - inactiveColor, - BlendMode.srcIn, - ), + child: TweenAnimationBuilder( + tween: ColorTween( + begin: (i == selectedIndex) ? inactiveColor : activeColor, + end: (i==selectedIndex) ? activeColor : inactiveColor, + ), + duration: iconColorChangeDuration, + builder: (context, value, child) { + return SvgPicture.asset( + visibleActions[i].image, + width: iconWidth, + height: iconHeight, + colorFilter: ColorFilter.mode( + value ?? inactiveColor, + BlendMode.srcIn, + ), + ); + } ), ), ), From 37b08b61b28c933a4b2d55edcd9826166a2e0278 Mon Sep 17 00:00:00 2001 From: Robert Malikowski Date: Wed, 19 Nov 2025 13:26:52 +0100 Subject: [PATCH 050/105] open old ui pages with new ui action buttons --- lib/new-ui/pages/swap_page.dart | 10 +++++ .../action_row/coin_action_row.dart | 45 +++++++++++++++---- lib/utils/feature_flag.dart | 1 + 3 files changed, 48 insertions(+), 8 deletions(-) create mode 100644 lib/new-ui/pages/swap_page.dart diff --git a/lib/new-ui/pages/swap_page.dart b/lib/new-ui/pages/swap_page.dart new file mode 100644 index 0000000000..075608983f --- /dev/null +++ b/lib/new-ui/pages/swap_page.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class SwapPage extends StatelessWidget { + const SwapPage({super.key}); + + @override + Widget build(BuildContext context) { + return const Placeholder(); + } +} diff --git a/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart b/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart index 5c4d4204d5..18ff9bb51a 100644 --- a/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart +++ b/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart @@ -1,4 +1,9 @@ +import 'package:cake_wallet/entities/qr_scanner.dart'; +import 'package:cake_wallet/main.dart'; import 'package:cake_wallet/new-ui/pages/send_page.dart'; +import 'package:cake_wallet/new-ui/pages/swap_page.dart'; +import 'package:cake_wallet/routes.dart'; +import 'package:cake_wallet/utils/feature_flag.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; @@ -22,16 +27,18 @@ class CoinActionRow extends StatelessWidget { icon: SvgPicture.asset("assets/new-ui/send.svg"), label: "Send", action: () { + if(FeatureFlag.hasNewUiExtraPages) showModalBottomSheet( context: context, builder: (context) => SendPage(), - ); + ); else Navigator.of(context).pushNamed(Routes.send); }, ), CoinActionButton( icon: SvgPicture.asset("assets/new-ui/receive.svg"), label: "Receive", action: () { + if(FeatureFlag.hasNewUiExtraPages) showModalBottomSheet( context: context, isScrollControlled: true, @@ -39,23 +46,45 @@ class CoinActionRow extends StatelessWidget { heightFactor: 0.9, child: ReceivePage(), ), - ); + ); else Navigator.of(context).pushNamed(Routes.receive); }, ), CoinActionButton( icon: SvgPicture.asset("assets/new-ui/exchange.svg"), label: "Swap", - action: () {}, + action: () { + if(FeatureFlag.hasNewUiExtraPages) + showModalBottomSheet( + context: context, + isScrollControlled: true, + builder: (context) => FractionallySizedBox( + heightFactor: 0.9, + child: SwapPage(), + ), + ); else Navigator.of(context).pushNamed(Routes.exchange); + + }, ), CoinActionButton( icon: SvgPicture.asset("assets/new-ui/scan.svg"), label: "Scan", - action: () { - showModalBottomSheet( - context: context, + action: () async { + if(FeatureFlag.hasNewUiExtraPages) + showModalBottomSheet( + context: context, + isScrollControlled: true, + builder: (context) => FractionallySizedBox( + heightFactor: 0.9, + child: ScanPage(), + ), + ); else { + final code = await presentQRScanner(context); - builder: (context) => ScanPage(), - ); + if (code == null) return; + if (code.isEmpty) return; + final uri = Uri.parse(code); + rootKey.currentState?.handleDeepLinking(uri); + }; }, ), ], diff --git a/lib/utils/feature_flag.dart b/lib/utils/feature_flag.dart index 4591aeffdf..6b3e78fc0c 100644 --- a/lib/utils/feature_flag.dart +++ b/lib/utils/feature_flag.dart @@ -15,4 +15,5 @@ class FeatureFlag { static const bool hasBitcoinViewOnly = true; static const bool customBackgroundEnabled = false; static const bool hasNewUi = true; + static const bool hasNewUiExtraPages = false; } From ac1e0e68cb6d7c56f47688900e7debc1779c4d7c Mon Sep 17 00:00:00 2001 From: Robert Malikowski Date: Wed, 19 Nov 2025 19:24:04 +0100 Subject: [PATCH 051/105] feat: working navbar in new ui --- lib/di.dart | 9 ++ lib/new-ui/new_dashboard.dart | 97 +++--------- lib/new-ui/pages/home_page.dart | 92 ++++++++++++ lib/src/screens/dashboard/dashboard_page.dart | 3 +- .../dashboard/pages/cake_features_page.dart | 142 +++++++++--------- .../widgets/new_main_navbar_widget.dart | 35 ++--- 6 files changed, 215 insertions(+), 163 deletions(-) create mode 100644 lib/new-ui/pages/home_page.dart diff --git a/lib/di.dart b/lib/di.dart index 5d970b06bb..7b056ea679 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -12,6 +12,7 @@ import 'package:cake_wallet/buy/dfx/dfx_buy_provider.dart'; import 'package:cake_wallet/buy/moonpay/moonpay_provider.dart'; import 'package:cake_wallet/buy/onramper/onramper_buy_provider.dart'; import 'package:cake_wallet/new-ui/new_dashboard.dart'; +import 'package:cake_wallet/new-ui/pages/home_page.dart'; import 'package:cake_wallet/order/order.dart'; import 'package:cake_wallet/core/backup_service_v3.dart'; import 'package:cake_wallet/core/new_wallet_arguments.dart'; @@ -34,6 +35,7 @@ import 'package:cake_wallet/entities/hardware_wallet/require_hardware_wallet_con import 'package:cake_wallet/entities/parse_address_from_domain.dart'; import 'package:cake_wallet/exchange/provider/trocador_exchange_provider.dart'; import 'package:cake_wallet/haven/cw_haven.dart'; +import 'package:cake_wallet/src/screens/dashboard/pages/cake_features_page.dart'; import 'package:cake_wallet/src/screens/dev/monero_background_sync.dart'; import 'package:cake_wallet/src/screens/dev/moneroc_cache_debug.dart'; import 'package:cake_wallet/src/screens/dev/moneroc_call_profiler.dart'; @@ -753,6 +755,8 @@ Future setup({ dashboardViewModel: getIt.get(), )); + getIt.registerFactory(()=>NewHomePage(dashboardViewModel: getIt.get())); + getIt.registerFactory(() { final GlobalKey _navigatorKey = GlobalKey(); return DesktopSidebarWrapper( @@ -1340,6 +1344,11 @@ Future setup({ getIt.registerFactory(() => CakeFeaturesViewModel(getIt.get())); + + getIt.registerFactory(() => CakeFeaturesPage( + dashboardViewModel: getIt.get(), + cakeFeaturesViewModel: getIt.get())); + getIt.registerFactory(() => BackupServiceV3(getIt.get(), _transactionDescriptionBox, getIt.get(), getIt.get())); diff --git a/lib/new-ui/new_dashboard.dart b/lib/new-ui/new_dashboard.dart index ba8b88fd12..f1eaf15fb7 100644 --- a/lib/new-ui/new_dashboard.dart +++ b/lib/new-ui/new_dashboard.dart @@ -1,98 +1,45 @@ import 'package:cake_wallet/di.dart'; -import 'package:cake_wallet/new-ui/widgets/coins_page/assets_history/lightning_assets.dart'; +import 'package:cake_wallet/new-ui/pages/home_page.dart'; +import 'package:cake_wallet/src/screens/contact/contact_list_page.dart'; +import 'package:cake_wallet/src/screens/dashboard/pages/cake_features_page.dart'; import 'package:cake_wallet/src/screens/dashboard/widgets/new_main_navbar_widget.dart'; -import 'package:cake_wallet/view_model/monero_account_list/monero_account_list_view_model.dart'; +import 'package:cake_wallet/src/screens/wallet_list/wallet_list_page.dart'; import 'package:flutter/material.dart'; import '../view_model/dashboard/dashboard_view_model.dart'; -import 'widgets/coins_page/cards/cards_view.dart'; -import 'widgets/coins_page/action_row/coin_action_row.dart'; -import 'widgets/coins_page/assets_history/history_section.dart'; -import 'widgets/coins_page/top_bar.dart'; -import 'widgets/coins_page/wallet_info.dart'; class NewDashboard extends StatefulWidget { - NewDashboard({super.key, required this.dashboardViewModel}) { - this.accountListViewModel = - dashboardViewModel.balanceViewModel.hasAccounts ? getIt.get() : null; - } + NewDashboard({super.key, required this.dashboardViewModel}); final DashboardViewModel dashboardViewModel; - late final MoneroAccountListViewModel? accountListViewModel; - @override State createState() => _NewDashboardState(); } class _NewDashboardState extends State { - bool _lightningMode = false; + int _selectedPage = 0; @override Widget build(BuildContext context) { return Scaffold( body: Stack( children: [ - SafeArea( - child: Container( - height: MediaQuery.of(context).size.height, - decoration: BoxDecoration( - gradient: LinearGradient( - colors: [ - Theme.of(context).colorScheme.surfaceBright, - Theme.of(context).colorScheme.surface, - ], - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - ), - ), - child: SingleChildScrollView( - physics: BouncingScrollPhysics(), - child: Column( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - TopBar( - dashboardViewModel: widget.dashboardViewModel, - lightningMode: _lightningMode, - onLightningSwitchPress: () { - setState(() { - _lightningMode = !_lightningMode; - }); - }, - ), - WalletInfo(lightningMode: _lightningMode, usesHardwareWallet: - widget.dashboardViewModel.wallet.isHardwareWallet, - name: widget.dashboardViewModel.wallet.name - ), - CardsView(dashboardViewModel: widget.dashboardViewModel, - accountListViewModel: widget.accountListViewModel, - lightningMode: _lightningMode, - ), - CoinActionRow(), - AnimatedSwitcher( - duration: const Duration(milliseconds: 200), - transitionBuilder: (child, animation) { - return FadeTransition(opacity: animation, child: child); - }, - layoutBuilder: (currentChild, previousChildren) { - return Stack( - alignment: Alignment.topCenter, - children: [ - ...previousChildren, - if (currentChild != null) currentChild, - ], - ); - }, - child: _lightningMode - ? LightningAssets(dashboardViewModel: widget.dashboardViewModel,) - : HistorySection(dashboardViewModel: widget.dashboardViewModel,), - ), - ], - ), - ), - ), - ), - NewMainNavBar(dashboardViewModel: widget.dashboardViewModel) + [ + getIt.get(), + getIt.get(), + getIt.get(), + getIt.get(), + Placeholder(), + ][_selectedPage], + NewMainNavBar( + dashboardViewModel: widget.dashboardViewModel, + selectedIndex: _selectedPage, + onItemTap: (index) { + setState(() { + _selectedPage = index; + }); + }, + ) ], ), ); diff --git a/lib/new-ui/pages/home_page.dart b/lib/new-ui/pages/home_page.dart new file mode 100644 index 0000000000..21eda8140f --- /dev/null +++ b/lib/new-ui/pages/home_page.dart @@ -0,0 +1,92 @@ +import 'package:cake_wallet/di.dart'; +import 'package:cake_wallet/new-ui/widgets/coins_page/action_row/coin_action_row.dart'; +import 'package:cake_wallet/new-ui/widgets/coins_page/assets_history/history_section.dart'; +import 'package:cake_wallet/new-ui/widgets/coins_page/assets_history/lightning_assets.dart'; +import 'package:cake_wallet/new-ui/widgets/coins_page/cards/cards_view.dart'; +import 'package:cake_wallet/new-ui/widgets/coins_page/top_bar.dart'; +import 'package:cake_wallet/new-ui/widgets/coins_page/wallet_info.dart'; +import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; +import 'package:cake_wallet/view_model/monero_account_list/monero_account_list_view_model.dart'; +import 'package:flutter/material.dart'; + + +class NewHomePage extends StatefulWidget { + NewHomePage({super.key, required this.dashboardViewModel}) { + this.accountListViewModel = + dashboardViewModel.balanceViewModel.hasAccounts ? getIt.get() : null; + } + + final DashboardViewModel dashboardViewModel; + late final MoneroAccountListViewModel? accountListViewModel; + + @override + State createState() => _NewHomePageState(); +} + +class _NewHomePageState extends State { + bool _lightningMode = false; + + @override + Widget build(BuildContext context) { + return SafeArea( + child: Container( + height: MediaQuery.of(context).size.height, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + Theme.of(context).colorScheme.surfaceBright, + Theme.of(context).colorScheme.surface, + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + child: SingleChildScrollView( + physics: BouncingScrollPhysics(), + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + TopBar( + dashboardViewModel: widget.dashboardViewModel, + lightningMode: _lightningMode, + onLightningSwitchPress: () { + setState(() { + _lightningMode = !_lightningMode; + }); + }, + ), + WalletInfo(lightningMode: _lightningMode, usesHardwareWallet: + widget.dashboardViewModel.wallet.isHardwareWallet, + name: widget.dashboardViewModel.wallet.name + ), + CardsView(dashboardViewModel: widget.dashboardViewModel, + accountListViewModel: widget.accountListViewModel, + lightningMode: _lightningMode, + ), + CoinActionRow(), + AnimatedSwitcher( + duration: const Duration(milliseconds: 200), + transitionBuilder: (child, animation) { + return FadeTransition(opacity: animation, child: child); + }, + layoutBuilder: (currentChild, previousChildren) { + return Stack( + alignment: Alignment.topCenter, + children: [ + ...previousChildren, + if (currentChild != null) currentChild, + ], + ); + }, + child: _lightningMode + ? LightningAssets(dashboardViewModel: widget.dashboardViewModel,) + : HistorySection(dashboardViewModel: widget.dashboardViewModel,), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/src/screens/dashboard/dashboard_page.dart b/lib/src/screens/dashboard/dashboard_page.dart index b007881cc4..b4cb67e4d4 100644 --- a/lib/src/screens/dashboard/dashboard_page.dart +++ b/lib/src/screens/dashboard/dashboard_page.dart @@ -31,7 +31,6 @@ import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:mobx/mobx.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import 'package:smooth_page_indicator/smooth_page_indicator.dart'; import 'package:cake_wallet/main.dart'; import 'package:cake_wallet/src/screens/release_notes/release_notes_screen.dart'; @@ -252,6 +251,8 @@ class _DashboardPageView extends BasePage { ), NewMainNavBar( dashboardViewModel: dashboardViewModel, + selectedIndex: 0, + onItemTap: (index) {} ) ], ), diff --git a/lib/src/screens/dashboard/pages/cake_features_page.dart b/lib/src/screens/dashboard/pages/cake_features_page.dart index bd381a9687..e03b6a8893 100644 --- a/lib/src/screens/dashboard/pages/cake_features_page.dart +++ b/lib/src/screens/dashboard/pages/cake_features_page.dart @@ -21,80 +21,82 @@ class CakeFeaturesPage extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: EdgeInsets.only(left: 24, top: 16), - child: Text( - S.of(context).apps, - style: Theme.of(context).textTheme.headlineSmall?.copyWith( - fontWeight: FontWeight.w500, - color: Theme.of(context).colorScheme.onSurface, - ), + return SafeArea( + child: Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(left: 24, top: 16), + child: Text( + S.of(context).apps, + style: Theme.of(context).textTheme.headlineSmall?.copyWith( + fontWeight: FontWeight.w500, + color: Theme.of(context).colorScheme.onSurface, + ), + ), ), - ), - Expanded( - child: ListView( - children: [ - SizedBox(height: 2), - DashBoardRoundedCardWidget( - shadowBlur: dashboardViewModel.getShadowBlur(), - shadowSpread: dashboardViewModel.getShadowSpread(), - onTap: () { - if (Platform.isMacOS) { - _launchUrl("buy.cakepay.com"); - } else { - _navigatorToGiftCardsPage(context); - } - }, - title: 'Cake Pay', - subTitle: S.of(context).cake_pay_subtitle, - image: Image.asset( - 'assets/images/cakepay.png', - height: 74, - width: 70, - fit: BoxFit.cover, + Expanded( + child: ListView( + children: [ + SizedBox(height: 2), + DashBoardRoundedCardWidget( + shadowBlur: dashboardViewModel.getShadowBlur(), + shadowSpread: dashboardViewModel.getShadowSpread(), + onTap: () { + if (Platform.isMacOS) { + _launchUrl("buy.cakepay.com"); + } else { + _navigatorToGiftCardsPage(context); + } + }, + title: 'Cake Pay', + subTitle: S.of(context).cake_pay_subtitle, + image: Image.asset( + 'assets/images/cakepay.png', + height: 74, + width: 70, + fit: BoxFit.cover, + ), ), - ), - Observer(builder: (_) { - if (dashboardViewModel.type == WalletType.ethereum) { - return DashBoardRoundedCardWidget( - shadowBlur: dashboardViewModel.getShadowBlur(), - shadowSpread: dashboardViewModel.getShadowSpread(), - onTap: () => Navigator.of(context).pushNamed(Routes.dEuroSavings), - title: S.of(context).deuro_savings, - subTitle: S.of(context).deuro_savings_subtitle, - image: Image.asset( - 'assets/images/deuro_icon.png', - height: 80, - width: 80, - fit: BoxFit.cover, - ), - ); - } - - return const SizedBox(); - }), - DashBoardRoundedCardWidget( - shadowBlur: dashboardViewModel.getShadowBlur(), - shadowSpread: dashboardViewModel.getShadowSpread(), - onTap: () => _launchUrl("cake.nano-gpt.com"), - title: "NanoGPT", - subTitle: S.of(context).nanogpt_subtitle, - image: Image.asset( - 'assets/images/nanogpt.png', - height: 80, - width: 80, - fit: BoxFit.cover, + Observer(builder: (_) { + if (dashboardViewModel.type == WalletType.ethereum) { + return DashBoardRoundedCardWidget( + shadowBlur: dashboardViewModel.getShadowBlur(), + shadowSpread: dashboardViewModel.getShadowSpread(), + onTap: () => Navigator.of(context).pushNamed(Routes.dEuroSavings), + title: S.of(context).deuro_savings, + subTitle: S.of(context).deuro_savings_subtitle, + image: Image.asset( + 'assets/images/deuro_icon.png', + height: 80, + width: 80, + fit: BoxFit.cover, + ), + ); + } + + return const SizedBox(); + }), + DashBoardRoundedCardWidget( + shadowBlur: dashboardViewModel.getShadowBlur(), + shadowSpread: dashboardViewModel.getShadowSpread(), + onTap: () => _launchUrl("cake.nano-gpt.com"), + title: "NanoGPT", + subTitle: S.of(context).nanogpt_subtitle, + image: Image.asset( + 'assets/images/nanogpt.png', + height: 80, + width: 80, + fit: BoxFit.cover, + ), ), - ), - SizedBox(height: 125), - ], + SizedBox(height: 125), + ], + ), ), - ), - ], + ], + ), ), ); } diff --git a/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart b/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart index 79447b5b3e..824149e8dc 100644 --- a/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart +++ b/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart @@ -8,11 +8,13 @@ class NewMainNavBar extends StatefulWidget { const NewMainNavBar({ super.key, required this.dashboardViewModel, - this.initialIndex = 0, + required this.selectedIndex, + required this.onItemTap, }); final DashboardViewModel dashboardViewModel; - final int initialIndex; + final int selectedIndex; + final Function(int index) onItemTap; @override State createState() => _NEWNewMainNavBarState(); @@ -50,14 +52,11 @@ class _NEWNewMainNavBarState extends State { fontWeight: FontWeight.w500, ); - int selectedIndex = 0; - bool _fadeSelected = false; bool _firstFrame = true; @override void initState() { super.initState(); - selectedIndex = widget.initialIndex; WidgetsBinding.instance.addPostFrameCallback((_) { if (!mounted) return; @@ -66,11 +65,13 @@ class _NEWNewMainNavBarState extends State { } void _onItemTap(int index) { - if (index == selectedIndex) return; + // if (index == widget.selectedIndex) return; + // + // setState(() { + // widget.selectedIndex = index; + // }); - setState(() { - selectedIndex = index; - }); + widget.onItemTap(index); NewMainActions.all[index].onTap.call(); } @@ -98,7 +99,7 @@ class _NEWNewMainNavBarState extends State { final double baseOffset = (iconWidth+iconHorizontalPadding) * index; double additionalSpacing; - if (index > selectedIndex) additionalSpacing = pillWidth-iconWidth; + if (index > widget.selectedIndex) additionalSpacing = pillWidth-iconWidth; else additionalSpacing = 0; return baseOffset + additionalSpacing; @@ -123,12 +124,12 @@ class _NEWNewMainNavBarState extends State { .toList(); final pillWidth = _estimatePillWidthForAction( - context, visibleActions[selectedIndex], + context, visibleActions[widget.selectedIndex], color: activeColor); final barWidth = calcBarWidth(pillWidth); - final currentAction = visibleActions[selectedIndex]; + final currentAction = visibleActions[widget.selectedIndex]; return Align( alignment: Alignment.bottomCenter, @@ -156,7 +157,7 @@ class _NEWNewMainNavBarState extends State { alignment: Alignment.center, children: [ AnimatedPill( - left: calcLeft(selectedIndex, pillWidth), + left: calcLeft(widget.selectedIndex, pillWidth), pillColor: pillColor, currentAction: currentAction, pillIconHeight: pillIconHeight, @@ -182,7 +183,7 @@ class _NEWNewMainNavBarState extends State { : inactiveIconMoveDuration, curve: Curves.easeOutCubic, width: - i == selectedIndex ? pillWidth : iconWidth, + i == widget.selectedIndex ? pillWidth : iconWidth, height: iconHeight, alignment: Alignment.center, child: AnimatedAlign( @@ -192,11 +193,11 @@ class _NEWNewMainNavBarState extends State { child: AnimatedScale( duration: inactiveIconAppearDuration, curve: Curves.easeOutCubic, - scale: (i == selectedIndex) ? 0.8 : 1.0, + scale: (i == widget.selectedIndex) ? 0.8 : 1.0, child: TweenAnimationBuilder( tween: ColorTween( - begin: (i == selectedIndex) ? inactiveColor : activeColor, - end: (i==selectedIndex) ? activeColor : inactiveColor, + begin: (i == widget.selectedIndex) ? inactiveColor : activeColor, + end: (i==widget.selectedIndex) ? activeColor : inactiveColor, ), duration: iconColorChangeDuration, builder: (context, value, child) { From b94a8676c122446cee53d8e457a4d0c10741da12 Mon Sep 17 00:00:00 2001 From: Robert Malikowski Date: Thu, 20 Nov 2025 16:23:02 +0100 Subject: [PATCH 052/105] fix: minor sizing tweaks --- lib/new-ui/pages/home_page.dart | 1 + .../action_row/coin_action_button.dart | 6 ++--- .../action_row/coin_action_row.dart | 2 +- lib/new-ui/widgets/coins_page/top_bar.dart | 2 +- .../widgets/coins_page/wallet_info.dart | 4 +-- .../widgets/new_main_navbar_widget.dart | 25 ++++++++++--------- 6 files changed, 21 insertions(+), 19 deletions(-) diff --git a/lib/new-ui/pages/home_page.dart b/lib/new-ui/pages/home_page.dart index 21eda8140f..94539cde10 100644 --- a/lib/new-ui/pages/home_page.dart +++ b/lib/new-ui/pages/home_page.dart @@ -46,6 +46,7 @@ class _NewHomePageState extends State { child: Column( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.start, + spacing: 24.0, children: [ TopBar( dashboardViewModel: widget.dashboardViewModel, diff --git a/lib/new-ui/widgets/coins_page/action_row/coin_action_button.dart b/lib/new-ui/widgets/coins_page/action_row/coin_action_button.dart index a3ae3f4431..80db0ce091 100644 --- a/lib/new-ui/widgets/coins_page/action_row/coin_action_button.dart +++ b/lib/new-ui/widgets/coins_page/action_row/coin_action_button.dart @@ -13,7 +13,7 @@ class CoinActionButton extends StatelessWidget { final String label; final VoidCallback action; - static const sizeFactor = 0.18; + static const sizeFactor = 0.16; @override Widget build(BuildContext context) { @@ -44,10 +44,10 @@ class CoinActionButton extends StatelessWidget { ), ), Padding( - padding: const EdgeInsets.all(10.0), + padding: const EdgeInsets.only(top:8.0), child: Text( style: TextStyle( - fontSize: 15, + fontSize: 12, color: Theme.of(context).colorScheme.onSurface, ), label, diff --git a/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart b/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart index 18ff9bb51a..acb5a4eb35 100644 --- a/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart +++ b/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart @@ -17,7 +17,7 @@ class CoinActionRow extends StatelessWidget { @override Widget build(BuildContext context) { return Padding( - padding: const EdgeInsets.symmetric(vertical: 12.0), + padding: const EdgeInsets.symmetric(horizontal:18.0), child: Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.center, diff --git a/lib/new-ui/widgets/coins_page/top_bar.dart b/lib/new-ui/widgets/coins_page/top_bar.dart index 5e970dd7e3..bff5b0987a 100644 --- a/lib/new-ui/widgets/coins_page/top_bar.dart +++ b/lib/new-ui/widgets/coins_page/top_bar.dart @@ -17,7 +17,7 @@ class TopBar extends StatelessWidget { @override Widget build(BuildContext context) { return Padding( - padding: const EdgeInsets.all(18.0), + padding: const EdgeInsets.only(left: 18.0, right: 18.0, top: 10.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ diff --git a/lib/new-ui/widgets/coins_page/wallet_info.dart b/lib/new-ui/widgets/coins_page/wallet_info.dart index 68adc8b130..633b6cefad 100644 --- a/lib/new-ui/widgets/coins_page/wallet_info.dart +++ b/lib/new-ui/widgets/coins_page/wallet_info.dart @@ -41,9 +41,9 @@ class WalletInfo extends StatelessWidget { ), ), ), - Text(name, style: TextStyle(fontSize: 20)), + Text(name, style: TextStyle(fontSize: 20, fontWeight: FontWeight.w500)), SizedBox(width: 8), - ModernButton.svg(size: 20, onPressed: (){}, svgPath: "assets/new-ui/3dots.svg",) + ModernButton.svg(size: 24, onPressed: (){}, svgPath: "assets/new-ui/3dots.svg",) ], ); } diff --git a/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart b/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart index 824149e8dc..deecd97b08 100644 --- a/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart +++ b/lib/src/screens/dashboard/widgets/new_main_navbar_widget.dart @@ -29,10 +29,10 @@ class _NEWNewMainNavBarState extends State { static const iconHeight = 28.0; static const iconHorizontalPadding = 12.0; - static const pillIconWidth = 20.0; - static const pillIconHeight = 20.0; + static const pillIconWidth = 24.0; + static const pillIconHeight = 24.0; static const pillIconSpacing = 4.0; - static const pillHorizontalPadding = 16.0; + static const pillHorizontalPadding = 20.0; static const barBorderRadius = 50.0; static const pillBorderRadius = 50.0; @@ -99,22 +99,22 @@ class _NEWNewMainNavBarState extends State { final double baseOffset = (iconWidth+iconHorizontalPadding) * index; double additionalSpacing; - if (index > widget.selectedIndex) additionalSpacing = pillWidth-iconWidth; + if (index > widget.selectedIndex) additionalSpacing = pillWidth-iconWidth-iconHorizontalPadding/2; else additionalSpacing = 0; return baseOffset + additionalSpacing; } double calcBarWidth(double pillWidth) { - return (iconWidth+iconHorizontalPadding)*NewMainActions.all.length+(pillWidth-iconWidth)+barHorizontalPadding; + return (iconWidth+iconHorizontalPadding)*(NewMainActions.all.length)+(pillWidth-(iconWidth))+barHorizontalPadding+pillIconSpacing/2; } @override Widget build(BuildContext context) { final theme = Theme.of(context); final backgroundColor = - theme.colorScheme.surfaceContainerHighest.withAlpha(85); - final pillColor = theme.colorScheme.onSurfaceVariant.withAlpha(85); + theme.colorScheme.surfaceContainer.withAlpha(127); + final pillColor = theme.colorScheme.onSurface.withAlpha(25); final activeColor = theme.colorScheme.onSurface; final inactiveColor = theme.colorScheme.primary; @@ -149,6 +149,7 @@ class _NEWNewMainNavBarState extends State { height: barHeight, decoration: BoxDecoration( color: backgroundColor, + border: Border.all(color: Color(0x14FFFFFF), width: 1), borderRadius: BorderRadius.circular(barBorderRadius), ), child: Padding( @@ -173,7 +174,7 @@ class _NEWNewMainNavBarState extends State { for (int i = 0; i < visibleActions.length; i++) AnimatedPositioned( duration: pillResizeDuration, - left: calcLeft(i, pillWidth), + left: calcLeft(i, pillWidth)+((i == widget.selectedIndex) ? iconHorizontalPadding/2 : 0), curve: Curves.easeOutCubic, child: GestureDetector( onTap: () => _onItemTap(i), @@ -193,7 +194,7 @@ class _NEWNewMainNavBarState extends State { child: AnimatedScale( duration: inactiveIconAppearDuration, curve: Curves.easeOutCubic, - scale: (i == widget.selectedIndex) ? 0.8 : 1.0, + scale: (i == widget.selectedIndex) ? 0.857 : 1.0, child: TweenAnimationBuilder( tween: ColorTween( begin: (i == widget.selectedIndex) ? inactiveColor : activeColor, @@ -265,8 +266,8 @@ class AnimatedPill extends StatelessWidget { duration: pillMoveDuration, curve: Curves.easeOutCubic, left: left, - top: 12, - bottom: 12, + top: 8, + bottom: 8, child: AnimatedContainer( duration: pillResizeDuration, curve: Curves.easeOutCubic, @@ -283,7 +284,7 @@ class AnimatedPill extends StatelessWidget { mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, children: [ - SizedBox(width: pillIconSpacing), + // SizedBox(width: pillIconSpacing*10), Padding(padding: EdgeInsets.only(left: pillIconWidth), child: Text( currentAction.name(context), From e033f06d4a799a3e023cc62676b9c719d0eee15c Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Thu, 20 Nov 2025 21:47:25 +0100 Subject: [PATCH 053/105] CW-1266-integrate-bitcoin-lightning-through-spark-sdk (#2623) * feat: add Lightning Network support for Bitcoin wallets * refactor: rename `fiatConvertationStore` to `fiatConversionStore` for consistency and update related occurrences across codebase * feat: enhance address validation with Lightning Network invoice support for BTC & refactor wallet type/token checks in view model * feat: add support for Lightning invoice detection, refactor MWEB deposit/withdraw actions, and integrate Lightning transaction creation with updated priority handling * feat: add method to retrieve unused Spark deposit address for Bitcoin wallets * feat: add Breez API key support and update secrets handling for Bitcoin Lightning wallet integration in workflows * chore: update Breez SDK dependency to version 0.3.4 in pubspec files * Add bitcoin secrets config [skip ci] * feat: extend Lightning wallet functionality with transaction history fetching * feat: add LNURL-pay address detection and support in address parsing flow for Bitcoin Lightning integration * refactor: simplify `ReceivePageOption` logic * refactor: centralize `PaymentURI` generation logic across wallet types * feat: enhance `PaymentURI` handling with asynchronous support and Lightning-specific functionality * refactor: streamline `PaymentURI` logic and remove redundant URI implementations across wallet types * refactor: remove redundant debug print statement from `bitcoin_wallet_addresses.dart` * refactor: improve consistency in widget styling and centralized label logic, add Bitcoin Lightning deposit/withdraw support * feat: reload balance and tx history after sending a lightning transaction * feat: improve address formatting for human-readable addresses and update the default LNURL domain * fix: merge conflicts * feat: add error handling for LightningWallet initialization and adjust transaction direction logic * feat: enable private transactions by default in LightningWallet and update Breez SDK version to 0.4.2 * minor fixes [skip ci] * chore: fix some minor issues in comments (#2654) Signed-off-by: black5box * fix: handle send-all functionality for LightningWallet transactions and adjust amount calculation logic * fix-german (#2659) * chore: update German localization strings for consistency and accuracy * chore: update German localization strings for consistency and accuracy [skip-ci] * feat: add LNURL support for address validation and LightningWallet compatibility, enhance error handling for OpenCryptoPay * fix: adjust LightningWallet amount parsing from 9 to 8 decimal places * feat: add LNURL support in LightningPaymentRequest and LightningWallet * Fix navigation gradient (#2657) * Fix navigation gradient * Fix CONFIG_ARGS formatting in app_config.sh (#2660) * fix: block wrongly parsed addresses (#2656) * fix: block wrongly parsed addresses * fix: move parsed address check into handlePaymentFlow method * fix: Handle QR URLs separately for pay anything flow * feat: add electrum seed support for Lightning * refactor: improve `parseFixed` logic and add comprehensive unit tests for edge cases (#2661) * Update cw_bitcoin/lib/bitcoin_wallet.dart [skip ci] * resolve conflict issue --------- Signed-off-by: black5box Co-authored-by: Omar Hatem Co-authored-by: black5box Co-authored-by: tuxsudo Co-authored-by: cyan Co-authored-by: David Adegoke <64401859+Blazebrain@users.noreply.github.com> --- README.md | 2 +- cw_bitcoin/lib/bitcoin_wallet.dart | 33 ++++++---- cw_bitcoin/lib/bitcoin_wallet_addresses.dart | 11 +++- .../lib/lightning/lightning_addres_type.dart | 1 + .../lib/lightning/lightning_wallet.dart | 43 +++++++++--- cw_bitcoin/lib/lightning/utils.dart | 9 +++ cw_bitcoin/pubspec.lock | 8 +-- cw_bitcoin/pubspec.yaml | 5 +- .../lib}/lnurl.dart | 5 ++ cw_core/lib/parse_fixed.dart | 10 ++- cw_core/lib/payment_uris.dart | 17 +++-- cw_core/pubspec.lock | 9 +++ cw_core/pubspec.yaml | 3 + cw_core/test/lnurl_test.dart | 18 +++++ cw_core/test/parse_fixed_test.dart | 38 +++++++++++ cw_decred/pubspec.lock | 9 +++ cw_monero/pubspec.lock | 9 +++ cw_nano/pubspec.lock | 9 +++ cw_wownero/pubspec.lock | 9 +++ cw_zano/pubspec.lock | 9 +++ lib/core/address_validator.dart | 5 +- .../open_cryptopay_service.dart | 2 +- lib/entities/lnurlpay_record.dart | 11 ++-- .../dashboard/pages/navigation_dock.dart | 26 -------- lib/src/screens/send/widgets/send_card.dart | 4 +- .../settings/background_sync_page.dart | 4 +- lib/utils/tor.dart | 3 +- .../payment/payment_view_model.dart | 2 +- lib/view_model/send/send_view_model.dart | 25 +++---- res/values/strings_de.arb | 66 +++++++++---------- res/values/strings_en.arb | 4 +- scripts/ios/app_config.sh | 2 +- 32 files changed, 275 insertions(+), 136 deletions(-) create mode 100644 cw_bitcoin/lib/lightning/utils.dart rename {lib/core/open_crypto_pay => cw_core/lib}/lnurl.dart (94%) create mode 100644 cw_core/test/lnurl_test.dart create mode 100644 cw_core/test/parse_fixed_test.dart diff --git a/README.md b/README.md index 43a72e0ad7..da155cb846 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ Cake Wallet includes support for several cryptocurrencies, including: ### Ethereum Specific Features -* Store ETH and all ERc-20 tokens +* Store ETH and all ERC-20 tokens * Add custom tokens by contract address * Enable or disable Etherscan for transaction history diff --git a/cw_bitcoin/lib/bitcoin_wallet.dart b/cw_bitcoin/lib/bitcoin_wallet.dart index b1f7861f1e..a3e601b175 100644 --- a/cw_bitcoin/lib/bitcoin_wallet.dart +++ b/cw_bitcoin/lib/bitcoin_wallet.dart @@ -85,9 +85,8 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { initialBalance: initialBalance, seedBytes: seedBytes, encryptionFileUtils: encryptionFileUtils, - currency: networkParam == BitcoinNetwork.testnet - ? CryptoCurrency.tbtc - : CryptoCurrency.btc, + currency: + networkParam == BitcoinNetwork.testnet ? CryptoCurrency.tbtc : CryptoCurrency.btc, alwaysScan: alwaysScan, ) { // in a standard BIP44 wallet, mainHd derivation path = m/84'/0'/0'/0 (account 0, index unspecified here) @@ -100,11 +99,14 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { try { lightningWallet = LightningWallet( mnemonic: mnemonic, + passphrase: passphrase, + seedBytes: seedBytes, apiKey: secrets.breezApiKey, lnurlDomain: "cake.cash", ); } catch (e) { printV(e); + lightningWallet = null; } } else { lightningWallet = null; @@ -241,10 +243,8 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { final derivationInfo = await walletInfo.getDerivationInfo(); // set the default if not present: - derivationInfo.derivationPath ??= - snp?.derivationPath ?? electrum_path; - derivationInfo.derivationType ??= - snp?.derivationType ?? DerivationType.electrum; + derivationInfo.derivationPath ??= snp?.derivationPath ?? electrum_path; + derivationInfo.derivationType ??= snp?.derivationType ?? DerivationType.electrum; await derivationInfo.save(); Uint8List? seedBytes = null; @@ -405,11 +405,17 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { final isLNCompatible = await lightningWallet?.isCompatible(credentials.outputs.first.address); if ((credentials.coinTypeToSpendFrom == UnspentCoinType.lightning && lightningWallet != null) || isLNCompatible == true) { - final amount = parseFixed( - credentials.outputs.first.cryptoAmount?.isNotEmpty == true - ? credentials.outputs.first.cryptoAmount! - : "0", - 9); + + BigInt amount; + if (credentials.outputs.first.sendAll) { + amount = (await lightningWallet!.getBalance()) - BigInt.from(10); + } else { + amount = parseFixed( + credentials.outputs.first.cryptoAmount?.isNotEmpty == true + ? credentials.outputs.first.cryptoAmount! + : "0", + 8); + } return lightningWallet!.createTransaction(credentials.outputs.first.address, amount > BigInt.zero ? amount : null, credentials.priority); @@ -549,8 +555,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { final isChange = addressEntry?.isHidden == true ? 1 : 0; final derivationInfo = await walletInfo.getDerivationInfo(); final accountPath = derivationInfo.derivationPath; - final derivationPath = - accountPath != null ? "$accountPath/$isChange/$index" : null; + final derivationPath = accountPath != null ? "$accountPath/$isChange/$index" : null; final signature = await hardwareWalletService! .signMessage(message: ascii.encode(message), derivationPath: derivationPath); diff --git a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart index c14ab11849..c00ccac296 100644 --- a/cw_bitcoin/lib/bitcoin_wallet_addresses.dart +++ b/cw_bitcoin/lib/bitcoin_wallet_addresses.dart @@ -14,6 +14,8 @@ import 'package:cw_core/wallet_info.dart'; import 'package:mobx/mobx.dart'; import 'package:payjoin_flutter/receive.dart' as payjoin; +import 'lightning/utils.dart'; + part 'bitcoin_wallet_addresses.g.dart'; class BitcoinWalletAddresses = BitcoinWalletAddressesBase with _$BitcoinWalletAddresses; @@ -115,9 +117,14 @@ abstract class BitcoinWalletAddressesBase extends ElectrumWalletAddresses with S Future getPaymentRequestUri(String amount) async { if (addressPageType is LightningAddressType && lightningWallet != null) { - final amountSats = amount.isNotEmpty ? parseFixed(amount, 9) : null; + final amountSats = amount.isNotEmpty ? parseFixed(amount, 8) : null; + final lnUrl = getLnurlOfLightningAddress(address); + if (amountSats == null) { + return LightningPaymentRequest(address: address, lnURL: lnUrl, amount: amount); + } final invoice = await lightningWallet!.getBolt11Invoice(amountSats, "Send to Cake Wallet"); - return LightningPaymentRequest(address: address, amount: amount, bolt11Invoice: invoice); + return LightningPaymentRequest( + address: address, lnURL: lnUrl, amount: amount, bolt11Invoice: invoice); } return getPaymentUri(amount); } diff --git a/cw_bitcoin/lib/lightning/lightning_addres_type.dart b/cw_bitcoin/lib/lightning/lightning_addres_type.dart index f0b13fca18..733d9338bc 100644 --- a/cw_bitcoin/lib/lightning/lightning_addres_type.dart +++ b/cw_bitcoin/lib/lightning/lightning_addres_type.dart @@ -6,6 +6,7 @@ class LightningAddressType implements BitcoinAddressType { static const String Bolt11InvoiceMatcher = r'^(lightning:)?(lnbc|lntb|lnbs|lnbcrt)[a-z0-9]+$'; static const String Bolt12OfferMatcher = r'^(lightning:)?(lno1)[a-z0-9]+$'; + static const String LNURLMatcher = r'^(lightning:)?(lnurl)[a-z0-9]+$'; @override bool get isP2sh => false; diff --git a/cw_bitcoin/lib/lightning/lightning_wallet.dart b/cw_bitcoin/lib/lightning/lightning_wallet.dart index 315d7406dd..8225a265b1 100644 --- a/cw_bitcoin/lib/lightning/lightning_wallet.dart +++ b/cw_bitcoin/lib/lightning/lightning_wallet.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:typed_data'; import 'package:breez_sdk_spark_flutter/breez_sdk_spark.dart'; import 'package:cw_bitcoin/bitcoin_transaction_priority.dart'; @@ -12,6 +13,8 @@ bool _breezSdkSparkLibUninitialized = true; class LightningWallet { final String mnemonic; + final String? passphrase; + final Uint8List? seedBytes; final String apiKey; final String lnurlDomain; final Network network; @@ -19,6 +22,8 @@ class LightningWallet { LightningWallet({ required this.mnemonic, + this.passphrase, + this.seedBytes, required this.apiKey, required this.lnurlDomain, this.network = Network.mainnet, @@ -30,10 +35,13 @@ class LightningWallet { _breezSdkSparkLibUninitialized = false; } - final seed = Seed.mnemonic(mnemonic: mnemonic, passphrase: null); + final seed = seedBytes != null + ? Seed.entropy(seedBytes!) + : Seed.mnemonic(mnemonic: mnemonic, passphrase: passphrase); final config = defaultConfig(network: Network.mainnet).copyWith( lnurlDomain: lnurlDomain, apiKey: apiKey, + privateEnabledDefault: true, ); final connectRequest = ConnectRequest( @@ -47,6 +55,8 @@ class LightningWallet { Future getAddress() async => (await sdk.getLightningAddress())?.lightningAddress; + Future getLNURL() async => (await sdk.getLightningAddress())?.lnurl; + Future getDepositAddress() async => (await sdk.receivePayment( request: ReceivePaymentRequest(paymentMethod: ReceivePaymentMethod.bitcoinAddress()))) .paymentRequest; @@ -76,7 +86,9 @@ class LightningWallet { Future isCompatible(String input) async { try { final inputType = await sdk.parse(input: input); - return (inputType is InputType_Bolt11Invoice) || (inputType is InputType_LightningAddress); + return (inputType is InputType_Bolt11Invoice) || + (inputType is InputType_LightningAddress) || + (inputType is InputType_LnurlPay); } catch (_) { return false; } @@ -107,14 +119,24 @@ class LightningWallet { }, ); } - } else if (inputType is InputType_LightningAddress) { + } else if (inputType is InputType_LightningAddress || inputType is InputType_LnurlPay) { final optionalValidateSuccessActionUrl = true; - final request = PrepareLnurlPayRequest( - amountSats: amountSats!, - payRequest: inputType.field0.payRequest, - validateSuccessActionUrl: optionalValidateSuccessActionUrl, - ); + PrepareLnurlPayRequest request; + if (inputType is InputType_LightningAddress) { + request = PrepareLnurlPayRequest( + amountSats: amountSats!, + payRequest: inputType.field0.payRequest, + validateSuccessActionUrl: optionalValidateSuccessActionUrl, + ); + } else { + request = PrepareLnurlPayRequest( + amountSats: amountSats!, + payRequest: (inputType as InputType_LnurlPay).field0, + validateSuccessActionUrl: optionalValidateSuccessActionUrl, + ); + } + final prepareResponse = await sdk.prepareLnurlPay(request: request); final feeSats = prepareResponse.feeSats; @@ -124,7 +146,8 @@ class LightningWallet { amount: ((prepareResponse.invoiceDetails.amountMsat?.toInt() ?? 0) / 1000).round(), fee: feeSats.toInt(), commitOverride: () async { - final res = await sdk.lnurlPay(request: LnurlPayRequest(prepareResponse: prepareResponse)); + final res = + await sdk.lnurlPay(request: LnurlPayRequest(prepareResponse: prepareResponse)); printV(res.payment.status.name); }, ); @@ -221,6 +244,7 @@ extension _ConfigCopyWith on Config { Fee? maxDepositClaimFee, bool? preferSparkOverLightning, bool? useDefaultExternalInputParsers, + bool? privateEnabledDefault, }) => Config( lnurlDomain: lnurlDomain ?? this.lnurlDomain, @@ -231,5 +255,6 @@ extension _ConfigCopyWith on Config { preferSparkOverLightning: preferSparkOverLightning ?? this.preferSparkOverLightning, useDefaultExternalInputParsers: useDefaultExternalInputParsers ?? this.useDefaultExternalInputParsers, + privateEnabledDefault: privateEnabledDefault ?? this.privateEnabledDefault, ); } diff --git a/cw_bitcoin/lib/lightning/utils.dart b/cw_bitcoin/lib/lightning/utils.dart new file mode 100644 index 0000000000..f5267e5b0a --- /dev/null +++ b/cw_bitcoin/lib/lightning/utils.dart @@ -0,0 +1,9 @@ +import 'package:cw_core/lnurl.dart'; + +String getLnurlOfLightningAddress(String lightningAddress) { + final parts = lightningAddress.split("@"); + + final name = parts.first; + final domain = parts.last; + return encodeLNURL("https://$domain/.well-known/lnurlp/$name"); +} diff --git a/cw_bitcoin/pubspec.lock b/cw_bitcoin/pubspec.lock index 4bbd0c3dea..81f928606a 100644 --- a/cw_bitcoin/pubspec.lock +++ b/cw_bitcoin/pubspec.lock @@ -56,7 +56,7 @@ packages: source: git version: "1.0.0" bech32: - dependency: "direct main" + dependency: transitive description: path: "." ref: HEAD @@ -134,11 +134,11 @@ packages: dependency: "direct main" description: path: "." - ref: bca05bc9085f778e95916d55e9a75133c27755a2 - resolved-ref: bca05bc9085f778e95916d55e9a75133c27755a2 + ref: "9baaad9bdcef32bd0572a9bacaa67c7923c4e0a5" + resolved-ref: "9baaad9bdcef32bd0572a9bacaa67c7923c4e0a5" url: "https://github.com/breez/breez-sdk-spark-flutter" source: git - version: "0.3.5-rc1" + version: "0.4.2" bs58check: dependency: transitive description: diff --git a/cw_bitcoin/pubspec.yaml b/cw_bitcoin/pubspec.yaml index ca6f75f0fa..48f954b1fc 100644 --- a/cw_bitcoin/pubspec.yaml +++ b/cw_bitcoin/pubspec.yaml @@ -37,9 +37,6 @@ dependencies: git: url: https://github.com/cake-tech/sp_scanner ref: sp_v4.0.1 - bech32: - git: - url: https://github.com/cake-tech/bech32.git payjoin_flutter: git: url: https://github.com/konstantinullrich/payjoin-flutter @@ -75,7 +72,7 @@ dependencies: breez_sdk_spark_flutter: git: url: https://github.com/breez/breez-sdk-spark-flutter - ref: bca05bc9085f778e95916d55e9a75133c27755a2 + ref: 9baaad9bdcef32bd0572a9bacaa67c7923c4e0a5 dev_dependencies: flutter_test: diff --git a/lib/core/open_crypto_pay/lnurl.dart b/cw_core/lib/lnurl.dart similarity index 94% rename from lib/core/open_crypto_pay/lnurl.dart rename to cw_core/lib/lnurl.dart index 0087bab512..ba77478264 100644 --- a/lib/core/open_crypto_pay/lnurl.dart +++ b/cw_core/lib/lnurl.dart @@ -2,6 +2,11 @@ import 'dart:convert'; import 'package:bech32/bech32.dart'; +String encodeLNURL(String url) { + final raw = _convert(utf8.encode(url), 8, 5, true); + return const Bech32Codec().encode(Bech32('lnurl', raw), 255); +} + Uri decodeLNURL(String encodedUrl) { Uri decodedUri; diff --git a/cw_core/lib/parse_fixed.dart b/cw_core/lib/parse_fixed.dart index 2b8a7ec17b..321320ef2c 100644 --- a/cw_core/lib/parse_fixed.dart +++ b/cw_core/lib/parse_fixed.dart @@ -1,14 +1,13 @@ -BigInt parseFixed(String value, int? decimals) { - decimals ??= 0; +BigInt parseFixed(String value, int decimals) { final multiplier = getMultiplier(decimals); -// Is it negative? - final negative = (value.substring(0, 1) == "-"); + final negative = value.startsWith("-"); if (negative) value = value.substring(1); if (value == ".") throw Exception("missing value, value, $value"); -// Split it into a whole and fractional part + if (value.startsWith(".")) value = "0$value"; + final comps = value.split("."); if (comps.length > 2) { throw Exception("too many decimal points, value, $value"); @@ -17,7 +16,6 @@ BigInt parseFixed(String value, int? decimals) { var whole = comps.isNotEmpty ? comps[0] : "0"; var fraction = (comps.length == 2 ? comps[1] : "0").padRight(decimals, "0"); - // Check the fraction doesn't exceed our decimals size if (fraction.length > multiplier.length - 1) { throw Exception( "fractional component exceeds decimals, underflow, parseFixed"); diff --git a/cw_core/lib/payment_uris.dart b/cw_core/lib/payment_uris.dart index 6a6a60b362..ced3d9fe6c 100644 --- a/cw_core/lib/payment_uris.dart +++ b/cw_core/lib/payment_uris.dart @@ -54,16 +54,19 @@ class BitcoinURI extends PaymentURI { } class LightningPaymentRequest extends PaymentURI { - const LightningPaymentRequest( - {required super.address, - required super.amount, - required this.bolt11Invoice, - super.scheme = "lightning"}); + const LightningPaymentRequest({ + required super.address, + required super.amount, + required this.lnURL, + this.bolt11Invoice, + super.scheme = "lightning", + }); - final String bolt11Invoice; + final String lnURL; + final String? bolt11Invoice; @override - String toString() => bolt11Invoice; + String toString() => bolt11Invoice ?? lnURL; } class LitecoinURI extends PaymentURI { diff --git a/cw_core/pubspec.lock b/cw_core/pubspec.lock index 918a81a0b5..bb70a374db 100644 --- a/cw_core/pubspec.lock +++ b/cw_core/pubspec.lock @@ -46,6 +46,15 @@ packages: url: "https://pub.dev" source: hosted version: "2.13.0" + bech32: + dependency: "direct main" + description: + path: "." + ref: HEAD + resolved-ref: "05755063b593aa6cca0a4820a318e0ce17de6192" + url: "https://github.com/cake-tech/bech32.git" + source: git + version: "0.2.2" blockchain_utils: dependency: "direct main" description: diff --git a/cw_core/pubspec.yaml b/cw_core/pubspec.yaml index 49188f5177..c2b4970db5 100644 --- a/cw_core/pubspec.yaml +++ b/cw_core/pubspec.yaml @@ -45,6 +45,9 @@ dependencies: ref: cake-update-v2 sqflite: ^2.4.1 sqflite_common_ffi: ^2.3.4+4 + bech32: + git: + url: https://github.com/cake-tech/bech32.git dev_dependencies: flutter_test: diff --git a/cw_core/test/lnurl_test.dart b/cw_core/test/lnurl_test.dart new file mode 100644 index 0000000000..6b05506247 --- /dev/null +++ b/cw_core/test/lnurl_test.dart @@ -0,0 +1,18 @@ +import 'package:cw_core/lnurl.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('lnurl', () { + test('decode lnurl', () { + final content = decodeLNURL( + "lnurl1dp68gurn8ghj7cmpddjjucmpwd5z7tnhv4kxctttdehhwm30d3h82unvwqhkkmmwwd6xj9vpzq4"); + expect(content, Uri.parse("https://cake.cash/.well-known/lnurlp/konsti")); + }); + + test('encode lnurl', () { + final content = encodeLNURL("https://cake.cash/.well-known/lnurlp/konsti"); + expect(content, + "lnurl1dp68gurn8ghj7cmpddjjucmpwd5z7tnhv4kxctttdehhwm30d3h82unvwqhkkmmwwd6xj9vpzq4"); + }); + }); +} diff --git a/cw_core/test/parse_fixed_test.dart b/cw_core/test/parse_fixed_test.dart new file mode 100644 index 0000000000..5ce5201665 --- /dev/null +++ b/cw_core/test/parse_fixed_test.dart @@ -0,0 +1,38 @@ +import 'package:cw_core/parse_fixed.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('parseFixed', () { + group('parseFixed, positive', () { + test('should parse 1.000001 as 1000001', + () => expect(parseFixed("1.000001", 6), BigInt.from(1000001))); + + test('should parse 1 as 1000000', () => expect(parseFixed("1", 6), BigInt.from(1000000))); + + test('should parse 1. as 1000000', () => expect(parseFixed("1.", 6), BigInt.from(1000000))); + + test('should parse 1.1 as 1100000', () => expect(parseFixed("1.1", 6), BigInt.from(1100000))); + + test('should parse 01.1 as 1100000', + () => expect(parseFixed("01.1", 6), BigInt.from(1100000))); + + test('should parse 1100000 as 11000000', + () => expect(parseFixed("1100000", 1), BigInt.from(11000000))); + }); + + group('parseFixed, negative', () { + test('should parse -1.000001 as -1000001', + () => expect(parseFixed("-1.000001", 6), BigInt.from(-1000001))); + + test('should parse -1 as 1000000', () => expect(parseFixed("-1", 6), BigInt.from(-1000000))); + }); + + group('parseFixed, no leading 0', () { + test('should parse .000001 as 1', () => expect(parseFixed(".000001", 6), BigInt.from(1))); + + test('should parse .00002 as 20', () => expect(parseFixed(".00002", 6), BigInt.from(20))); + + test('should parse -.00002 as -20', () => expect(parseFixed("-.00002", 6), BigInt.from(-20))); + }); + }); +} diff --git a/cw_decred/pubspec.lock b/cw_decred/pubspec.lock index 8558572154..811ebbac61 100644 --- a/cw_decred/pubspec.lock +++ b/cw_decred/pubspec.lock @@ -46,6 +46,15 @@ packages: url: "https://pub.dev" source: hosted version: "2.13.0" + bech32: + dependency: transitive + description: + path: "." + ref: HEAD + resolved-ref: "05755063b593aa6cca0a4820a318e0ce17de6192" + url: "https://github.com/cake-tech/bech32.git" + source: git + version: "0.2.2" blockchain_utils: dependency: transitive description: diff --git a/cw_monero/pubspec.lock b/cw_monero/pubspec.lock index ae521ab8dd..5d00f8bac1 100644 --- a/cw_monero/pubspec.lock +++ b/cw_monero/pubspec.lock @@ -46,6 +46,15 @@ packages: url: "https://pub.dev" source: hosted version: "2.13.0" + bech32: + dependency: transitive + description: + path: "." + ref: HEAD + resolved-ref: "05755063b593aa6cca0a4820a318e0ce17de6192" + url: "https://github.com/cake-tech/bech32.git" + source: git + version: "0.2.2" bip32: dependency: "direct main" description: diff --git a/cw_nano/pubspec.lock b/cw_nano/pubspec.lock index c009b65024..034656704f 100644 --- a/cw_nano/pubspec.lock +++ b/cw_nano/pubspec.lock @@ -46,6 +46,15 @@ packages: url: "https://pub.dev" source: hosted version: "2.13.0" + bech32: + dependency: transitive + description: + path: "." + ref: HEAD + resolved-ref: "05755063b593aa6cca0a4820a318e0ce17de6192" + url: "https://github.com/cake-tech/bech32.git" + source: git + version: "0.2.2" bip32: dependency: "direct main" description: diff --git a/cw_wownero/pubspec.lock b/cw_wownero/pubspec.lock index 2e1b3fb093..a49a5f8c46 100644 --- a/cw_wownero/pubspec.lock +++ b/cw_wownero/pubspec.lock @@ -46,6 +46,15 @@ packages: url: "https://pub.dev" source: hosted version: "2.13.0" + bech32: + dependency: transitive + description: + path: "." + ref: HEAD + resolved-ref: "05755063b593aa6cca0a4820a318e0ce17de6192" + url: "https://github.com/cake-tech/bech32.git" + source: git + version: "0.2.2" blockchain_utils: dependency: transitive description: diff --git a/cw_zano/pubspec.lock b/cw_zano/pubspec.lock index 0c4a57658d..ac19ce2245 100644 --- a/cw_zano/pubspec.lock +++ b/cw_zano/pubspec.lock @@ -46,6 +46,15 @@ packages: url: "https://pub.dev" source: hosted version: "2.13.0" + bech32: + dependency: transitive + description: + path: "." + ref: HEAD + resolved-ref: "05755063b593aa6cca0a4820a318e0ce17de6192" + url: "https://github.com/cake-tech/bech32.git" + source: git + version: "0.2.2" blockchain_utils: dependency: transitive description: diff --git a/lib/core/address_validator.dart b/lib/core/address_validator.dart index c700835341..36e9d373f7 100644 --- a/lib/core/address_validator.dart +++ b/lib/core/address_validator.dart @@ -16,10 +16,9 @@ class AddressValidator extends TextValidator { useAdditionalValidation: [CryptoCurrency.btc, CryptoCurrency.ltc].contains(type) ? (String txt) { final RegExp lightningInvoiceRegex = RegExp( - r'^(lightning:)?(lnbc|lntb|lnbs|lnbcrt)[a-z0-9]+$', + r'^(lightning:)?(lnbc|lntb|lnbs|lnbcrt|lnurl)[a-z0-9]+$', caseSensitive: false); if (lightningInvoiceRegex.hasMatch(txt)) return true; - if (txt.contains("@")) return true; return BitcoinAddressUtils.validateAddress( address: txt, @@ -62,7 +61,7 @@ class AddressValidator extends TextValidator { '|(bc1q[ac-hj-np-z02-9]{25,39})' '|(bc1p([ac-hj-np-z02-9]{39}|[ac-hj-np-z02-9]{59}|[ac-hj-np-z02-9]{8,89}))' '|(bc1q[ac-hj-np-z02-9]{40,80})' - '|(lightning:)?(lnbc|lntb|lnbs|lnbcrt)[a-z0-9]' + '|(lightning:)?(lnbc|lntb|lnbs|lnbcrt|lnurl)[a-z0-9]+' '|(${silentPaymentAddressPatternMainnet})(\$|\s)'; } case CryptoCurrency.ltc: diff --git a/lib/core/open_crypto_pay/open_cryptopay_service.dart b/lib/core/open_crypto_pay/open_cryptopay_service.dart index cc94740f03..391f6ec5a0 100644 --- a/lib/core/open_crypto_pay/open_cryptopay_service.dart +++ b/lib/core/open_crypto_pay/open_cryptopay_service.dart @@ -2,9 +2,9 @@ import 'dart:convert'; import 'dart:developer'; import 'package:cake_wallet/core/open_crypto_pay/exceptions.dart'; -import 'package:cake_wallet/core/open_crypto_pay/lnurl.dart'; import 'package:cake_wallet/core/open_crypto_pay/models.dart'; import 'package:cw_core/crypto_currency.dart'; +import 'package:cw_core/lnurl.dart'; import 'package:cw_core/utils/proxy_wrapper.dart'; class OpenCryptoPayService { diff --git a/lib/entities/lnurlpay_record.dart b/lib/entities/lnurlpay_record.dart index 3fbb01bc3a..f62477d1ff 100644 --- a/lib/entities/lnurlpay_record.dart +++ b/lib/entities/lnurlpay_record.dart @@ -1,6 +1,5 @@ -import 'dart:convert'; - import 'package:cw_core/crypto_currency.dart'; +import 'package:cw_core/lnurl.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/utils/proxy_wrapper.dart'; @@ -31,14 +30,14 @@ class LNUrlPayRecord { name = "_"; } - // lookup domain/.well-known/nano-currency.json and check if it has a nano address: + final expectedUrl = "https://$domain/.well-known/lnurlp/$name"; final response = await ProxyWrapper().get( - clearnetUri: Uri.parse("https://$domain/.well-known/lnurlp/$name"), + clearnetUri: Uri.parse(expectedUrl), headers: {"Accept": "application/json"}, ); if (response.statusCode == 200) { - return username; + return encodeLNURL(expectedUrl); } } catch (e) { printV("error checking well-known username: $e"); @@ -60,7 +59,7 @@ class LNUrlPayRecord { required String formattedName, required CryptoCurrency currency, }) async { - String name = formattedName; + final name = formattedName; printV("formattedName: $formattedName"); diff --git a/lib/src/screens/dashboard/pages/navigation_dock.dart b/lib/src/screens/dashboard/pages/navigation_dock.dart index c4ee6b09bf..12fd55c224 100644 --- a/lib/src/screens/dashboard/pages/navigation_dock.dart +++ b/lib/src/screens/dashboard/pages/navigation_dock.dart @@ -21,23 +21,9 @@ class NavigationDock extends StatelessWidget { return Container( height: 84, alignment: Alignment.bottomCenter, - decoration: dashboardViewModel.settingsStore.backgroundImage.isEmpty - ? BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: _getColors(context), - ), - ) - : null, child: Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(50), - gradient: LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: _getColors(context), - ), ), margin: const EdgeInsets.only(left: 8, right: 8, bottom: 16), child: ClipRRect( @@ -105,16 +91,4 @@ class NavigationDock extends StatelessWidget { ), ); } - - List _getColors(BuildContext context) { - return [ - context.customColors.backgroundGradientColor.withAlpha(5), - context.customColors.backgroundGradientColor.withAlpha(50), - context.customColors.backgroundGradientColor.withAlpha(125), - context.customColors.backgroundGradientColor.withAlpha(150), - context.customColors.backgroundGradientColor.withAlpha(200), - context.customColors.backgroundGradientColor, - context.customColors.backgroundGradientColor, - ]; - } } diff --git a/lib/src/screens/send/widgets/send_card.dart b/lib/src/screens/send/widgets/send_card.dart index 20e3b2ceb3..2187b29216 100644 --- a/lib/src/screens/send/widgets/send_card.dart +++ b/lib/src/screens/send/widgets/send_card.dart @@ -149,6 +149,8 @@ class SendCardState extends State with AutomaticKeepAliveClientMixin _handlePaymentFlow(String uri, PaymentRequest paymentRequest) async { + if (uri.contains('@') || paymentRequest.address.contains('@')) return; + try { final result = await paymentViewModel.processAddress(uri); @@ -446,8 +448,6 @@ class SendCardState extends State with AutomaticKeepAliveClientMixin ensureTorStopped({required BuildContext? context}) async { - if (!didTorStart) { + if (!didTorStart || CakeTor.instance is CakeTorDisabled) { printV("Tor hasn't been initialized yet, so it can't be stopped."); return; } diff --git a/lib/view_model/payment/payment_view_model.dart b/lib/view_model/payment/payment_view_model.dart index 9e8bf3136c..1095a90117 100644 --- a/lib/view_model/payment/payment_view_model.dart +++ b/lib/view_model/payment/payment_view_model.dart @@ -45,7 +45,7 @@ abstract class PaymentViewModelBase with Store { return PaymentFlowResult.incompatible('Unable to detect address type'); } - if (_isEVMAddress(detectionResult.address)) { + if (!addressData.contains(':') && _isEVMAddress(detectionResult.address)) { return PaymentFlowResult.evmNetworkSelection(detectionResult); } diff --git a/lib/view_model/send/send_view_model.dart b/lib/view_model/send/send_view_model.dart index aa7fe20fc5..124a415a68 100644 --- a/lib/view_model/send/send_view_model.dart +++ b/lib/view_model/send/send_view_model.dart @@ -5,6 +5,7 @@ import 'package:cake_wallet/bitcoin/bitcoin.dart'; import 'package:cake_wallet/core/address_validator.dart'; import 'package:cake_wallet/core/amount_validator.dart'; import 'package:cake_wallet/core/execution_state.dart'; +import 'package:cake_wallet/core/open_crypto_pay/exceptions.dart'; import 'package:cake_wallet/core/open_crypto_pay/models.dart'; import 'package:cake_wallet/core/open_crypto_pay/open_cryptopay_service.dart'; import 'package:cake_wallet/core/validator.dart'; @@ -74,9 +75,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor currencies = wallet.balance.keys.toList(); selectedCryptoCurrency = wallet.currency; hasMultipleTokens = isEVMCompatibleChain(wallet.type) || - wallet.type == WalletType.solana || - wallet.type == WalletType.tron || - wallet.type == WalletType.zano; + [WalletType.solana, WalletType.tron, WalletType.zano].contains(wallet.type); for (final output in outputs) { output.updateWallet(wallet); @@ -106,9 +105,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor currencies = appStore.wallet!.balance.keys.toList(), selectedCryptoCurrency = appStore.wallet!.currency, hasMultipleTokens = isEVMCompatibleChain(appStore.wallet!.type) || - appStore.wallet!.type == WalletType.solana || - appStore.wallet!.type == WalletType.tron || - appStore.wallet!.type == WalletType.zano, + [WalletType.solana, WalletType.tron, WalletType.zano].contains(appStore.wallet!.type), outputs = ObservableList(), _settingsStore = appStore.settingsStore, fiatFromSettings = appStore.settingsStore.fiatCurrency, @@ -467,11 +464,18 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor outputs.first.note = ocpRequest!.receiverName; return createTransaction(); + } on OpenCryptoPayNotSupportedException catch (e) { + printV(e.message); + if (walletType == WalletType.bitcoin) { + state = InitialExecutionState(); + } else { + state = FailureState(translateErrorMessage(e, walletType, currency)); + } } catch (e) { printV(e); state = FailureState(translateErrorMessage(e, walletType, currency)); - return null; } + return null; } bool isLightningInvoice(String txt) { @@ -867,12 +871,12 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor final priority = _settingsStore.priority[wallet.type]; if (priority == null && - [ + ![ WalletType.nano, WalletType.banano, WalletType.solana, WalletType.tron, - WalletType.arbitrum + WalletType.arbitrum, ].contains(wallet.type)) { throw Exception('Priority is null for wallet type: ${wallet.type}'); } @@ -1051,8 +1055,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor WalletType.ethereum, WalletType.polygon, WalletType.base, - WalletType.haven, - WalletType.arbitrum + WalletType.arbitrum, ].contains(walletType)) { if (errorMessage.contains('gas required exceeds allowance')) { return S.current.gas_exceeds_allowance; diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 98e3a75f2f..ecca6a03c7 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -11,13 +11,13 @@ "add": "Hinzufügen", "add_contact": "Kontakt hinzufügen", "add_contact_to_address_book": "Möchten Sie diesen Kontakt zu Ihrem Adressbuch hinzufügen?", - "add_custom_node": "Neuen benutzerdefinierten Knoten hinzufügen", + "add_custom_node": "Neuen benutzerdefinierten Nodes hinzufügen", "add_custom_redemption": "Benutzerdefinierte Einlösung hinzufügen", "add_fund_to_card": "Prepaid-Guthaben zu den Karten hinzufügen (bis zu ${value})", - "add_new_node": "Neuen Knoten hinzufügen", + "add_new_node": "Neuen Nodes hinzufügen", "add_new_word": "Neues Wort hinzufügen", "add_passphrase": "Fügen Sie Passphrase hinzu", - "add_passphrase_warning_text": "Geben Sie nur eine Passphrase ein, wenn Sie in der Vergangenheit eine für diese Wallet verwendet haben. Wenn Sie die falsche Passphrase eingeben oder in dieser Wallet noch keine Passphrase verwendet haben, werden Sie keine vorhandenen Gelder oder Geschichte sehen.", + "add_passphrase_warning_text": "Geben Sie nur eine Passphrase ein, wenn Sie in der Vergangenheit eine für diese Wallet verwendet haben. Wenn Sie die falsche Passphrase eingeben oder in dieser Wallet noch keine Passphrase verwendet haben, werden Sie keine vorhandenen Gelder oder Verlauf sehen.", "add_receiver": "Fügen Sie einen weiteren Empfänger hinzu (optional)", "add_secret_code": "Oder fügen Sie diesen Geheimcode einer Authentifizierungs-App hinzu", "add_tip": "Tipp hinzufügen", @@ -61,7 +61,7 @@ "approve_request": "Anfrage genehmigen", "approve_tokens": "Token genehmigen", "apps": "Apps", - "arbiscan_history": "ArbiScan-Geschichte", + "arbiscan_history": "ArbiScan-Verlauf", "arrive_in_this_address": "${currency} ${tag} wird an dieser Adresse ankommen", "ascending": "Aufsteigend", "ask_each_time": "Jedes Mal fragen", @@ -143,8 +143,8 @@ "change": "Ändern", "change_backup_password_alert": "Ihre vorherigen Sicherungsdateien können nicht mit einem neuen Sicherungskennwort importiert werden. Das neue Sicherungskennwort wird nur für neue Sicherungsdateien verwendet. Sind Sie sicher, dass Sie das Sicherungskennwort ändern möchten?", "change_currency": "Währung ändern", - "change_current_node": "Möchten Sie den aktuellen Knoten wirklich zu ${node}? ändern?", - "change_current_node_title": "Aktuellen Knoten ändern", + "change_current_node": "Möchten Sie den aktuellen Node wirklich zu ${node}? ändern?", + "change_current_node_title": "Aktuellen Node ändern", "change_exchange_provider": "Swap-Anbieter ändern", "change_language": "Sprache ändern", "change_language_to": "Sprache zu ${language} ändern?", @@ -187,7 +187,7 @@ "confirm_fee_deduction_content": "Stimmen Sie zu, die Gebühr von der Ausgabe abzuziehen?", "confirm_passphrase": "Passphrase bestätigen", "confirm_sending": "Senden bestätigen", - "confirm_silent_payments_switch_node": "Ihr aktueller Knoten unterstützt keine Silent Payments.\\n\\nCake Wallet wechselt zu einem kompatiblen Knoten, nur zum Scannen", + "confirm_silent_payments_switch_node": "Ihr aktueller Node unterstützt keine Silent Payments.\\n\\nCake Wallet wechselt zu einem kompatiblen Node, nur zum Scannen", "confirm_transaction": "Transaktion bestätigen", "confirmations": "Bestätigungen", "confirmed": "Bestätigter Saldo", @@ -315,12 +315,12 @@ "e_sign_consent": "E-Sign-Zustimmung", "edit": "Bearbeiten", "edit_backup_password": "Sicherungskennwort bearbeiten", - "edit_node": "Knoten bearbeiten", + "edit_node": "Node bearbeiten", "edit_token": "Token bearbeiten", "electrum_address_disclaimer": "Wir generieren jedes Mal neue Adressen, wenn Sie eine verwenden, aber vorherige Adressen funktionieren weiterhin", "email_address": "E-Mail-Adresse", "enable": "Aktivieren", - "enable_auto_node_switching": "Aktivieren Sie die automatische Knotenschaltung", + "enable_auto_node_switching": "Aktivieren Sie die automatische Nodewechsel", "enable_builtin_tor": "Aktivieren Sie den bau-in tor", "enable_for_auto_switching": "Aktivieren Sie die automatische Schaltung", "enable_mempool_api": "Mempool-API für genaue Gebühren und Daten", @@ -353,7 +353,7 @@ "error_text_maximum_limit": "Handel für ${provider} wird nicht erstellt. Menge ist über dem Maximum: ${max} ${currency}", "error_text_minimal_limit": "Handel für ${provider} wird nicht erstellt. Menge ist unter dem Minimum: ${min} ${currency}", "error_text_node_address": "Bitte geben Sie eine iPv4-Adresse ein", - "error_text_node_port": "Der Knotenport darf nur Nummern zwischen 0 und 65535 enthalten", + "error_text_node_port": "Der Port darf nur Nummern zwischen 0 und 65535 enthalten", "error_text_node_proxy_address": "Bitte geben Sie : ein, zum Beispiel 127.0.0.1:9050", "error_text_payment_id": "Die Zahlungs-ID darf nur 16 bis 64 hexadezimale Zeichen enthalten", "error_text_subaddress_name": "Der Name der Unteradresse darf nicht die Zeichen ` , ' \" enthalten\nund muss zwischen 1 und 20 Zeichen lang sein", @@ -443,8 +443,8 @@ "hide": "Verstecken", "hide_details": "Details ausblenden", "high_contrast_theme": "Kontrastreiches Thema", - "history": "Geschichte", - "home": "Heim", + "history": "Verlauf", + "home": "Home", "home_screen_settings": "Einstellungen für den Startbildschirm", "how_to_connect": "Anleitung", "how_to_use": "Wie benutzt man", @@ -490,7 +490,7 @@ "litecoin_mweb_enable": "Aktivieren Sie MWeb", "litecoin_mweb_enable_later": "Sie können MWEB unter Anzeigeeinstellungen erneut aktivieren.", "litecoin_mweb_logs": "MWEB-Protokolle", - "litecoin_mweb_node": "MWEB-Knoten", + "litecoin_mweb_node": "MWEB-Node", "litecoin_mweb_pegin": "Peg in", "litecoin_mweb_pegout": "Peg out", "litecoin_mweb_scanning": "MWEB Scanning", @@ -505,8 +505,8 @@ "low_fee": "Niedrige Gebühr", "low_fee_alert": "Sie verwenden derzeit eine niedrige Netzwerkgebührenpriorität. Dies kann zu langen Wartezeiten, unterschiedlichen Kursen oder stornierten Trades führen. Wir empfehlen, für ein besseres Erlebnis eine höhere Gebühr festzulegen.", "made_easy": "leicht gemacht", - "manage_nodes": "Knoten verwalten", - "manage_pow_nodes": "PoW-Knoten verwalten", + "manage_nodes": "Node verwalten", + "manage_pow_nodes": "PoW-Node verwalten", "manage_yats": "Yats verwalten", "mark_as_redeemed": "Als eingelöst markieren", "market_place": "Marktplatz", @@ -542,7 +542,7 @@ "nanogpt_subtitle": "Alle neuesten Modelle (GPT-4, Claude).", "narrow": "Eng", "new_first_wallet_text": "Wenn Sie Ihren Krypto schützen, ist ein Kinderspiel", - "new_node_testing": "Neuen Knoten testen", + "new_node_testing": "Neuen Node testen", "new_subaddress_create": "Erstellen", "new_subaddress_label_name": "Bezeichnung", "new_subaddress_title": "Neue Adresse", @@ -559,14 +559,14 @@ "no_relay_on_domain": "Es gibt kein Relay für die Domäne des Benutzers oder das Relay ist nicht verfügbar. Bitte wählen Sie ein zu verwendendes Relais aus.", "no_relays": "Keine Relais", "no_relays_message": "Wir haben einen Nostr NIP-05-Eintrag für diesen Benutzer gefunden, der jedoch keine Relays enthält. Bitte weisen Sie den Empfänger an, Relays zu seinem Nostr-Datensatz hinzuzufügen.", - "node_address": "Knotenadresse", + "node_address": "Nodeadresse", "node_connection_failed": "Verbindung fehlgeschlagen", "node_connection_successful": "Die Verbindung war erfolgreich", - "node_new": "Neuer Knoten", - "node_port": "Knotenport", + "node_new": "Neuer node", + "node_port": "Port", "node_reset_settings_title": "Einstellungen zurücksetzen", "node_test": "Test", - "nodes": "Knoten", + "nodes": "Nodes", "nodes_list_reset_to_default_message": "Möchten Sie wirklich die Standardeinstellungen wiederherstellen?", "none_of_selected_providers_can_exchange": "Keiner der ausgewählten Anbieter kann diesen Tausch machen", "noNFTYet": "Noch keine NFTs", @@ -579,7 +579,7 @@ "offline": "offline", "ok": "OK", "old_fee": "Alte Gebühr", - "oled_mode": "OLED -Modus", + "oled_mode": "OLED-Modus", "onion_link": "Onion-Link", "online": "online", "onramper_option_description": "Kaufen Sie schnell Krypto mit vielen Zahlungsmethoden. In den meisten Ländern erhältlich. Spreads und Gebühren variieren.", @@ -589,7 +589,7 @@ "optional_email_hint": "Optionale Benachrichtigungs-E-Mail für den Zahlungsempfänger", "optional_name": "Optionaler Empfängername", "optionally_order_card": "Optional eine physische Karte bestellen.", - "orbot_running_alert": "Bitte stellen Sie sicher, dass Orbot läuft, bevor Sie sich mit diesem Knoten verbinden.", + "orbot_running_alert": "Bitte stellen Sie sicher, dass Orbot läuft, bevor Sie sich mit diesem Node verbinden.", "order_by": "Sortieren nach", "order_id": "Bestell-ID", "order_physical_card": "Physische Karte bestellen", @@ -634,7 +634,7 @@ "Please_reference_document": "Weitere Informationen finden Sie in den Dokumenten unten.", "please_select": "Bitte auswählen:", "please_select_backup_file": "Bitte wählen Sie die Sicherungsdatei und geben Sie das Sicherungskennwort ein.", - "please_try_to_connect_to_another_node": "Bitte versuchen Sie, sich mit einem anderen Knoten zu verbinden", + "please_try_to_connect_to_another_node": "Bitte versuchen Sie, sich mit einem anderen Node zu verbinden", "please_wait": "Warten Sie mal", "polygonscan_history": "PolygonScan-Verlauf", "potential_scam": "Potenzieller Betrug", @@ -683,8 +683,8 @@ "reject": "Ablehnen", "remaining": "Rest", "remove": "Entfernen", - "remove_node": "Knoten entfernen", - "remove_node_message": "Möchten Sie den ausgewählten Knoten wirklich entfernen?", + "remove_node": "Node entfernen", + "remove_node_message": "Möchten Sie den ausgewählten Node wirklich entfernen?", "rename": "Umbenennen", "rep_warning": "Repräsentative Warnung", "rep_warning_sub": "Ihr Vertreter scheint nicht gut zu sein. Tippen Sie hier, um eine neue auszuwählen", @@ -790,11 +790,11 @@ "seed_share": "Seed teilen", "seed_title": "Seed", "seed_verified": "Seed verifiziert", - "seed_verified_subtext": "Sie können Ihre Wallet mit dem gespeicherten Seed wiederherstelle, selbst wenn sie ihr Gerät verloren haben.", + "seed_verified_subtext": "Sie können Ihre Wallet mit dem gespeicherten Seed wiederherstellen, selbst wenn sie ihr Gerät verloren haben.", "seedtype": "Seedtyp", "seedtype_alert_content": "Das Teilen von Seeds mit anderen Wallet ist nur mit bip39 Seedype möglich.", "seedtype_alert_title": "Seedype-Alarm", - "select_a_wallet": "Wählen Sie eine Brieftasche", + "select_a_wallet": "Wählen Sie eine Wallet", "select_backup_file": "Sicherungsdatei auswählen", "select_buy_provider_notice": "Wählen Sie oben einen Anbieter kaufen. Sie können diese Seite überspringen, indem Sie Ihren Standard-Kaufanbieter in den App-Einstellungen festlegen.", "select_destination": "Bitte wählen Sie das Ziel für die Sicherungsdatei aus.", @@ -844,12 +844,12 @@ "settings_change_language": "Sprache ändern", "settings_change_pin": "PIN ändern", "settings_currency": "Währung", - "settings_current_node": "Aktueller Knoten", + "settings_current_node": "Aktueller Node", "settings_dark_mode": "Dunkler Modus", "settings_display_balance": "Kontostand anzeigen", "settings_display_on_dashboard_list": "Anzeige in der Dashboard-Liste", "settings_fee_priority": "Gebührenpriorität", - "settings_nodes": "Knoten", + "settings_nodes": "Nodes", "settings_none": "Keiner", "settings_only_trades": "Nur Handel", "settings_only_transactions": "Nur Transaktionen", @@ -883,9 +883,9 @@ "sign_message": "Nachricht unterschreiben", "sign_one": "Unterschreiben", "sign_up": "Anmelden", - "sign_verify_message": "Zeichen / überprüfen", + "sign_verify_message": "Unterschreiben / überprüfen", "sign_verify_message_sub": "Unterschreiben oder überprüfen Sie eine Nachricht mit Ihrem privaten Schlüssel", - "sign_verify_title": "Zeichen / überprüfen", + "sign_verify_title": "Unterschreiben / überprüfen", "signature": "Signatur", "signature_invalid_error": "Die Signatur gilt nicht für die angegebene Nachricht", "signTransaction": "Transaktion unterzeichnen", @@ -931,7 +931,7 @@ "swap": "Tauschen", "sweeping_wallet": "Wallet leeren", "sweeping_wallet_alert": "Das sollte nicht lange dauern. VERLASSEN SIE DIESEN BILDSCHIRM NICHT, ANDERNFALLS KÖNNEN DIE GELDER VERLOREN GEHEN", - "switch_wallet": "Brieftasche schalten", + "switch_wallet": "Wallet wechseln", "switchToETHWallet": "Bitte wechseln Sie zu einem Ethereum-Wallet und versuchen Sie es erneut", "switchToEVMCompatibleWallet": "Bitte wechseln Sie zu einem EVM-kompatiblen Wallet und versuchen Sie es erneut (Ethereum, Polygon)", "symbol": "Symbol", @@ -950,7 +950,7 @@ "sync_status_syncronized": "SYNCHRONISIERT", "sync_status_syncronizing": "SYNCHRONISIERE", "sync_status_timed_out": "Zeitlich abgestimmt", - "sync_status_unsupported": "Nicht unterstützter Knoten", + "sync_status_unsupported": "Nicht unterstützter Node", "synchronizing": "Synchronisierung", "syncing_wallet_alert_content": "Ihr Kontostand und Ihre Transaktionsliste sind möglicherweise erst vollständig, wenn oben „SYNCHRONISIERT“ steht. Klicken/tippen Sie, um mehr zu erfahren.", "syncing_wallet_alert_title": "Ihr Wallet wird synchronisiert", diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index a0eea1dcc3..5bfdc8be48 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -360,9 +360,9 @@ "error_text_template": "Template name and address can't contain ` , ' \" symbols\nand must be between 1 and 106 characters long", "error_text_wallet_name": "Wallet name can only contain letters, numbers, _ - symbols \nand must be between 1 and 33 characters long", "error_text_xmr": "XMR value can't exceed available balance.\nThe number of fraction digits must be less or equal to 12", - "error_while_processing": "An error occurred while proceessing", + "error_while_processing": "An error occurred while processing", "errorGettingCredentials": "Failed: Error while getting credentials", - "errorSigningTransaction": "An error has occured while signing transaction", + "errorSigningTransaction": "An error has occurred while signing transaction", "establishing_tor_connection": "Establishing Tor connection", "estimated": "Estimated", "estimated_new_fee": "Estimated new fee", diff --git a/scripts/ios/app_config.sh b/scripts/ios/app_config.sh index 9c2f99fdb6..d22b5ab3b6 100755 --- a/scripts/ios/app_config.sh +++ b/scripts/ios/app_config.sh @@ -31,7 +31,7 @@ case $APP_IOS_TYPE in ;; $CAKEWALLET) - CONFIG_ARGS="--monero --bitcoin --ethereum --polygon --nano --bitcoinCash --solana --tron --wownero --zano --decred --dogecoin --base"# --arbitrum + CONFIG_ARGS="--monero --bitcoin --ethereum --polygon --nano --bitcoinCash --solana --tron --wownero --zano --decred --dogecoin --base" # --arbitrum ;; esac From bdfbbc4e19c6b741329bc67dd60d1856d7c6e5e2 Mon Sep 17 00:00:00 2001 From: OmarHatem Date: Thu, 20 Nov 2025 23:29:10 +0100 Subject: [PATCH 054/105] remove old code [skip ci] --- lib/src/screens/send/send_page.dart | 26 ------------------------ lib/view_model/send/send_view_model.dart | 2 -- 2 files changed, 28 deletions(-) diff --git a/lib/src/screens/send/send_page.dart b/lib/src/screens/send/send_page.dart index d6547b3cfe..6e220fc845 100644 --- a/lib/src/screens/send/send_page.dart +++ b/lib/src/screens/send/send_page.dart @@ -21,7 +21,6 @@ import 'package:cake_wallet/src/widgets/bottom_sheet/base_bottom_sheet_widget.da import 'package:cake_wallet/src/widgets/bottom_sheet/confirm_sending_bottom_sheet_widget.dart'; import 'package:cake_wallet/src/widgets/bottom_sheet/info_bottom_sheet_widget.dart'; import 'package:cake_wallet/src/widgets/keyboard_done_button.dart'; -import 'package:cake_wallet/src/widgets/picker.dart'; import 'package:cake_wallet/src/widgets/primary_button.dart'; import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart'; import 'package:cake_wallet/src/widgets/simple_checkbox.dart'; @@ -374,19 +373,6 @@ class SendPage extends BasePage { bottomSectionPadding: EdgeInsets.only(left: 24, right: 24, bottom: 24), bottomSection: Column( children: [ - if (sendViewModel.hasCurrencyChanger) - Observer( - builder: (_) => Padding( - padding: EdgeInsets.only(bottom: 12), - child: PrimaryButton( - key: ValueKey('send_page_change_asset_button_key'), - onPressed: () => presentCurrencyPicker(context), - text: 'Change your asset (${sendViewModel.selectedCryptoCurrency})', - color: Colors.transparent, - textColor: Theme.of(context).colorScheme.onSurfaceVariant, - ), - ), - ), if (sendViewModel.sendTemplateViewModel.hasMultiRecipient) Padding( padding: EdgeInsets.only(bottom: 12), @@ -791,18 +777,6 @@ class SendPage extends BasePage { ), ); - void presentCurrencyPicker(BuildContext context) => showPopUp( - builder: (_) => Picker( - items: sendViewModel.currencies, - displayItem: (item) => item.toString(), - selectedAtIndex: sendViewModel.currencies.indexOf(sendViewModel.selectedCryptoCurrency), - title: S.of(context).please_select, - mainAxisAlignment: MainAxisAlignment.center, - onItemSelected: (cur) => sendViewModel.selectedCryptoCurrency = cur, - ), - context: context, - ); - bool isRegularElectrumAddress(String address) { final supportedTypes = [CryptoCurrency.btc, CryptoCurrency.ltc, CryptoCurrency.bch]; final excludedPatterns = [ diff --git a/lib/view_model/send/send_view_model.dart b/lib/view_model/send/send_view_model.dart index 124a415a68..756f9ffcf7 100644 --- a/lib/view_model/send/send_view_model.dart +++ b/lib/view_model/send/send_view_model.dart @@ -353,8 +353,6 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor String? get walletCurrencyName => wallet.currency.fullName?.toLowerCase() ?? wallet.currency.name; - bool get hasCurrencyChanger => walletType == WalletType.haven; - @computed FiatCurrency get fiatCurrency => _settingsStore.fiatCurrency; From 63136ec47ad72cebbb45c706e85f98e648fb1dc5 Mon Sep 17 00:00:00 2001 From: OmarHatem Date: Fri, 21 Nov 2025 01:50:59 +0100 Subject: [PATCH 055/105] ignore useless error [skip ci] --- lib/utils/exception_handler.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/utils/exception_handler.dart b/lib/utils/exception_handler.dart index 5733f648ad..cc91026e2f 100644 --- a/lib/utils/exception_handler.dart +++ b/lib/utils/exception_handler.dart @@ -292,6 +292,7 @@ class ExceptionHandler { "Wrong Device Status: 0x5515 (UNKNOWN)", "FocusScopeNode was used after being disposed", + "_getDismissibleFlushbar", ]; static Future _addDeviceInfo(File file) async { From 102ca90400987fb41e1c885ec9bd4c9087a7d1a3 Mon Sep 17 00:00:00 2001 From: Robert Malikowski Date: Fri, 21 Nov 2025 09:41:50 +0100 Subject: [PATCH 056/105] fix: page widgets rebuilt every time --- lib/new-ui/new_dashboard.dart | 16 ++++++++------ .../assets_history/lightning_assets.dart | 22 ++++++++++++++----- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/lib/new-ui/new_dashboard.dart b/lib/new-ui/new_dashboard.dart index f1eaf15fb7..7bb008fb7e 100644 --- a/lib/new-ui/new_dashboard.dart +++ b/lib/new-ui/new_dashboard.dart @@ -12,6 +12,14 @@ class NewDashboard extends StatefulWidget { final DashboardViewModel dashboardViewModel; + final List dashboardPageWidgets = [ + getIt.get(), + getIt.get(), + getIt.get(), + getIt.get(), + Placeholder(), + ]; + @override State createState() => _NewDashboardState(); } @@ -24,13 +32,7 @@ class _NewDashboardState extends State { return Scaffold( body: Stack( children: [ - [ - getIt.get(), - getIt.get(), - getIt.get(), - getIt.get(), - Placeholder(), - ][_selectedPage], + widget.dashboardPageWidgets[_selectedPage], NewMainNavBar( dashboardViewModel: widget.dashboardViewModel, selectedIndex: _selectedPage, diff --git a/lib/new-ui/widgets/coins_page/assets_history/lightning_assets.dart b/lib/new-ui/widgets/coins_page/assets_history/lightning_assets.dart index 3100d4331f..dbbc479d47 100644 --- a/lib/new-ui/widgets/coins_page/assets_history/lightning_assets.dart +++ b/lib/new-ui/widgets/coins_page/assets_history/lightning_assets.dart @@ -5,9 +5,8 @@ import 'assets_section.dart'; import 'history_section.dart'; class LightningAssets extends StatefulWidget { - const LightningAssets({super.key, required this.dashboardViewModel}); + LightningAssets({super.key, required this.dashboardViewModel}); - static const List tabs = ["Assets", "History"]; final DashboardViewModel dashboardViewModel; @override @@ -15,8 +14,22 @@ class LightningAssets extends StatefulWidget { } class _LightningAssetsState extends State { + late final List lightningTabs; int _selectedTab = 0; + @override + void initState() { + super.initState(); + lightningTabs = [ + AssetsSection( + dashboardViewModel: widget.dashboardViewModel, + ), + HistorySection( + dashboardViewModel: widget.dashboardViewModel, + ), + ]; + } + @override Widget build(BuildContext context) { return Column( @@ -29,10 +42,7 @@ class _LightningAssetsState extends State { }, selectedTab: _selectedTab, ), - [ - AssetsSection(dashboardViewModel: widget.dashboardViewModel,), - HistorySection(dashboardViewModel: widget.dashboardViewModel,), - ][_selectedTab], + lightningTabs[_selectedTab], ], ); } From b1c977398745386a1312b234b762b6d101669db9 Mon Sep 17 00:00:00 2001 From: Robert Malikowski Date: Fri, 21 Nov 2025 09:43:03 +0100 Subject: [PATCH 057/105] chore: formatting --- .../action_row/coin_action_row.dart | 53 ++-- .../assets_history/assets_top_bar.dart | 10 +- .../widgets/coins_page/cards/cards_view.dart | 86 +++--- lib/router.dart | 248 ++++++------------ 4 files changed, 170 insertions(+), 227 deletions(-) diff --git a/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart b/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart index acb5a4eb35..9a52178ed3 100644 --- a/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart +++ b/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart @@ -17,43 +17,49 @@ class CoinActionRow extends StatelessWidget { @override Widget build(BuildContext context) { return Padding( - padding: const EdgeInsets.symmetric(horizontal:18.0), + padding: const EdgeInsets.symmetric(horizontal: 18.0), child: Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.center, - spacing: MediaQuery.of(context).size.width*0.05, + spacing: MediaQuery.of(context).size.width * 0.05, children: [ CoinActionButton( icon: SvgPicture.asset("assets/new-ui/send.svg"), label: "Send", action: () { - if(FeatureFlag.hasNewUiExtraPages) - showModalBottomSheet( - context: context, - builder: (context) => SendPage(), - ); else Navigator.of(context).pushNamed(Routes.send); + if (FeatureFlag.hasNewUiExtraPages) { + showModalBottomSheet( + context: context, + builder: (context) => SendPage(), + ); + } else { + Navigator.of(context).pushNamed(Routes.send); + } }, ), CoinActionButton( icon: SvgPicture.asset("assets/new-ui/receive.svg"), label: "Receive", action: () { - if(FeatureFlag.hasNewUiExtraPages) - showModalBottomSheet( - context: context, - isScrollControlled: true, - builder: (context) => FractionallySizedBox( - heightFactor: 0.9, - child: ReceivePage(), - ), - ); else Navigator.of(context).pushNamed(Routes.receive); + if (FeatureFlag.hasNewUiExtraPages) { + showModalBottomSheet( + context: context, + isScrollControlled: true, + builder: (context) => FractionallySizedBox( + heightFactor: 0.9, + child: ReceivePage(), + ), + ); + } else { + Navigator.of(context).pushNamed(Routes.receive); + } }, ), CoinActionButton( icon: SvgPicture.asset("assets/new-ui/exchange.svg"), label: "Swap", action: () { - if(FeatureFlag.hasNewUiExtraPages) + if (FeatureFlag.hasNewUiExtraPages) { showModalBottomSheet( context: context, isScrollControlled: true, @@ -61,15 +67,17 @@ class CoinActionRow extends StatelessWidget { heightFactor: 0.9, child: SwapPage(), ), - ); else Navigator.of(context).pushNamed(Routes.exchange); - + ); + } else { + Navigator.of(context).pushNamed(Routes.exchange); + } }, ), CoinActionButton( icon: SvgPicture.asset("assets/new-ui/scan.svg"), label: "Scan", action: () async { - if(FeatureFlag.hasNewUiExtraPages) + if (FeatureFlag.hasNewUiExtraPages) { showModalBottomSheet( context: context, isScrollControlled: true, @@ -77,12 +85,13 @@ class CoinActionRow extends StatelessWidget { heightFactor: 0.9, child: ScanPage(), ), - ); else { + ); + } else { final code = await presentQRScanner(context); if (code == null) return; if (code.isEmpty) return; - final uri = Uri.parse(code); + final uri = Uri.tryParse(code); rootKey.currentState?.handleDeepLinking(uri); }; }, diff --git a/lib/new-ui/widgets/coins_page/assets_history/assets_top_bar.dart b/lib/new-ui/widgets/coins_page/assets_history/assets_top_bar.dart index 2a282ef846..bde605d667 100644 --- a/lib/new-ui/widgets/coins_page/assets_history/assets_top_bar.dart +++ b/lib/new-ui/widgets/coins_page/assets_history/assets_top_bar.dart @@ -49,12 +49,18 @@ class AssetsTopBar extends StatelessWidget { padding: const EdgeInsets.all(12.0), child: Row( spacing: 4.0, - children: [Icon(Icons.settings, color: Theme.of(context).colorScheme.primary), Text("Tokens", style: TextStyle(color: Theme.of(context).colorScheme.primary),)], + children: [ + Icon(Icons.settings, color: Theme.of(context).colorScheme.primary), + Text( + "Tokens", + style: TextStyle(color: Theme.of(context).colorScheme.primary), + ) + ], ), ), ), ), - ModernButton(size: 48, onPressed:(){}, icon: Icon(Icons.question_mark)), + ModernButton(size: 48, onPressed: () {}, icon: Icon(Icons.question_mark)), ], ), ], diff --git a/lib/new-ui/widgets/coins_page/cards/cards_view.dart b/lib/new-ui/widgets/coins_page/cards/cards_view.dart index b4b517e5c4..22d0bce9a8 100644 --- a/lib/new-ui/widgets/coins_page/cards/cards_view.dart +++ b/lib/new-ui/widgets/coins_page/cards/cards_view.dart @@ -8,13 +8,16 @@ import 'package:flutter_mobx/flutter_mobx.dart'; import 'balance_card.dart'; class CardsView extends StatefulWidget { - const CardsView({super.key, required this.dashboardViewModel, required this.accountListViewModel, required this.lightningMode}); + const CardsView( + {super.key, + required this.dashboardViewModel, + required this.accountListViewModel, + required this.lightningMode}); final DashboardViewModel dashboardViewModel; final MoneroAccountListViewModel? accountListViewModel; final bool lightningMode; - @override _CardsViewState createState() => _CardsViewState(); } @@ -58,20 +61,22 @@ class _CardsViewState extends State { child: GestureDetector( onTap: () { setState(() { - if(widget.accountListViewModel != null) - widget.accountListViewModel!.select(widget.accountListViewModel!.accounts[index]); + if (widget.accountListViewModel != null) + widget.accountListViewModel!.select(widget.accountListViewModel!.accounts[index]); _selectedIndex = index; }); }, - child: Observer( - builder: (_){return BalanceCard( + child: Observer(builder: (_) { + return BalanceCard( width: cardWidth, - accountName: (widget.accountListViewModel?.accounts[index].label) ?? "Primary account", + accountName: + (widget.accountListViewModel?.accounts[index].label) ?? "Primary account", accountBalance: widget.accountListViewModel?.accounts[index].balance ?? "", - balanceRecord: widget.dashboardViewModel.balanceViewModel.formattedBalances.elementAt(0), + balanceRecord: + widget.dashboardViewModel.balanceViewModel.formattedBalances.elementAt(0), selected: _selectedIndex == index, - );} - ), + ); + }), ), ), ); @@ -79,10 +84,10 @@ class _CardsViewState extends State { double _getBoxHeight() { return - /* height of initial card */ - (2 / 3) * (cardWidth) + - /* height of bg card * amount of bg cards */ - overlapAmount * ((widget.accountListViewModel?.accounts.length ??1) - 1); + /* height of initial card */ + (2 / 3) * (cardWidth) + + /* height of bg card * amount of bg cards */ + overlapAmount * ((widget.accountListViewModel?.accounts.length ?? 1) - 1); } @override @@ -96,13 +101,12 @@ class _CardsViewState extends State { _selectedIndex = 0; } - for ( - int i = _selectedIndex!; - i < (widget.accountListViewModel?.accounts.length ?? 1) + _selectedIndex!; - i++ - ) { + for (int i = _selectedIndex!; + i < (widget.accountListViewModel?.accounts.length ?? 1) + _selectedIndex!; + i++) { if (i != _selectedIndex) { - children.add(_buildCard(i % (widget.accountListViewModel?.accounts.length ?? 1), parentWidth)); + children.add( + _buildCard(i % (widget.accountListViewModel?.accounts.length ?? 1), parentWidth)); } } @@ -110,28 +114,26 @@ class _CardsViewState extends State { children.add(_buildCard(_selectedIndex!, parentWidth)); } - return Observer( - builder: (_){return Padding( - padding: const EdgeInsets.symmetric(vertical: 16.0), - child: AnimatedContainer( - duration: Duration(milliseconds: 200), - curve: Curves.easeOut, - width: double.infinity, - height: _getBoxHeight(), - child: AnimatedSwitcher( - duration: Duration(milliseconds: 200), - transitionBuilder: (child, animation) => - FadeTransition(opacity: animation, child: child), - child: SizedBox( - key: ValueKey(_getBoxHeight()), - width: double.infinity, - height: _getBoxHeight(), - child: Stack(alignment: Alignment.center, children: children), - ), - ), - ), - );} - ); + return Padding( + padding: const EdgeInsets.symmetric(vertical: 16.0), + child: AnimatedContainer( + duration: Duration(milliseconds: 200), + curve: Curves.easeOut, + width: double.infinity, + height: _getBoxHeight(), + child: AnimatedSwitcher( + duration: Duration(milliseconds: 200), + transitionBuilder: (child, animation) => + FadeTransition(opacity: animation, child: child), + child: SizedBox( + key: ValueKey(_getBoxHeight()), + width: double.infinity, + height: _getBoxHeight(), + child: Stack(alignment: Alignment.center, children: children), + ), + ), + ), + ); }, ); } diff --git a/lib/router.dart b/lib/router.dart index ee0a77c20b..4897460db5 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -166,11 +166,9 @@ Route handleRouteWithPlatformAwareness( bool fullscreenDialog = false, }) { if (Platform.isIOS) { - return CupertinoPageRoute( - builder: builder, fullscreenDialog: fullscreenDialog); + return CupertinoPageRoute(builder: builder, fullscreenDialog: fullscreenDialog); } else { - return MaterialPageRoute( - builder: builder, fullscreenDialog: fullscreenDialog); + return MaterialPageRoute(builder: builder, fullscreenDialog: fullscreenDialog); } } @@ -229,8 +227,7 @@ Route createRoute(RouteSettings settings) { case Routes.walletGroupsDisplayPage: final type = settings.arguments as WalletType; - final walletGroupsDisplayVM = - getIt.get(param1: type); + final walletGroupsDisplayVM = getIt.get(param1: type); return handleRouteWithPlatformAwareness( (_) => WalletGroupsDisplayPage( @@ -258,22 +255,18 @@ Route createRoute(RouteSettings settings) { final hardwareWallet = arguments[1] as HardwareWalletType; final walletVM = getIt.get( - param1: type, - param2: getIt(param1: hardwareWallet)); + param1: type, param2: getIt(param1: hardwareWallet)); if (type == WalletType.monero) - return handleRouteWithPlatformAwareness( - (_) => MoneroHardwareWalletOptionsPage(walletVM)); + return handleRouteWithPlatformAwareness((_) => MoneroHardwareWalletOptionsPage(walletVM)); - return handleRouteWithPlatformAwareness( - (_) => SelectHardwareWalletAccountPage(walletVM)); + return handleRouteWithPlatformAwareness((_) => SelectHardwareWalletAccountPage(walletVM)); case Routes.setupPin: Function(PinCodeState, String)? callback; if (settings.arguments is Function(PinCodeState, String)) { - callback = - settings.arguments as Function(PinCodeState, String); + callback = settings.arguments as Function(PinCodeState, String); } return handleRouteWithPlatformAwareness( @@ -286,8 +279,7 @@ Route createRoute(RouteSettings settings) { param1: NewWalletTypeArguments( onTypeSelected: (BuildContext context, WalletType type) { final arg = {'walletType': type}; - Navigator.of(context) - .pushNamed(Routes.restoreWallet, arguments: arg); + Navigator.of(context).pushNamed(Routes.restoreWallet, arguments: arg); }, isCreate: false, ), @@ -307,8 +299,7 @@ Route createRoute(RouteSettings settings) { case Routes.restoreWalletFromSeedKeys: if (isSingleCoin) { return handleRouteWithPlatformAwareness( - (context) => - getIt.get(param1: availableWalletTypes.first), + (context) => getIt.get(param1: availableWalletTypes.first), ); } return handleRouteWithPlatformAwareness( @@ -316,8 +307,7 @@ Route createRoute(RouteSettings settings) { param1: NewWalletTypeArguments( onTypeSelected: (BuildContext context, WalletType type) { final arg = {'walletType': type}; - Navigator.of(context) - .pushNamed(Routes.restoreWallet, arguments: arg); + Navigator.of(context).pushNamed(Routes.restoreWallet, arguments: arg); }, isCreate: false, ), @@ -327,23 +317,19 @@ Route createRoute(RouteSettings settings) { case Routes.restoreWalletFromHardwareWallet: final arguments = settings.arguments as Map?; final showUnavailable = (arguments?['showUnavailable'] as bool?) ?? true; - final onSelect = arguments?['onSelect'] as void Function( - BuildContext, HardwareWalletType)?; + final onSelect = arguments?['onSelect'] as void Function(BuildContext, HardwareWalletType)?; final availableHardwareWalletTypes = - arguments?['availableHardwareWalletTypes'] - as List?; + arguments?['availableHardwareWalletTypes'] as List?; - return handleRouteWithPlatformAwareness( - (_) => SelectDeviceManufacturerPage( - showUnavailable: showUnavailable, - onSelect: onSelect, - availableHardwareWalletTypes: availableHardwareWalletTypes, - )); + return handleRouteWithPlatformAwareness((_) => SelectDeviceManufacturerPage( + showUnavailable: showUnavailable, + onSelect: onSelect, + availableHardwareWalletTypes: availableHardwareWalletTypes, + )); case Routes.connectHardwareWallet: final arguments = settings.arguments as List; - final hardwareWalletType = - (arguments[0] as HardwareWalletType?) ?? HardwareWalletType.ledger; + final hardwareWalletType = (arguments[0] as HardwareWalletType?) ?? HardwareWalletType.ledger; if (isSingleCoin) { return handleRouteWithPlatformAwareness( @@ -351,13 +337,9 @@ Route createRoute(RouteSettings settings) { ConnectDevicePageParams( walletType: availableWalletTypes.first, hardwareWalletType: hardwareWalletType, - onConnectDevice: (BuildContext context, _) => - Navigator.of(context).pushNamed( - Routes.chooseHardwareWalletAccount, - arguments: [ - availableWalletTypes.first, - hardwareWalletType - ]), + onConnectDevice: (BuildContext context, _) => Navigator.of(context).pushNamed( + Routes.chooseHardwareWalletAccount, + arguments: [availableWalletTypes.first, hardwareWalletType]), isReconnect: false, ), getIt.get(), @@ -369,8 +351,7 @@ Route createRoute(RouteSettings settings) { param1: NewWalletTypeArguments( onTypeSelected: (BuildContext context, WalletType type) { if (hardwareWalletType == HardwareWalletType.trezor) { - Navigator.of(context).pushNamed( - Routes.chooseHardwareWalletAccount, + Navigator.of(context).pushNamed(Routes.chooseHardwareWalletAccount, arguments: [type, hardwareWalletType]); return; } @@ -378,15 +359,13 @@ Route createRoute(RouteSettings settings) { final arguments = ConnectDevicePageParams( walletType: type, hardwareWalletType: hardwareWalletType, - onConnectDevice: (BuildContext context, _) => - Navigator.of(context).pushNamed( - Routes.chooseHardwareWalletAccount, - arguments: [type, hardwareWalletType]), + onConnectDevice: (BuildContext context, _) => Navigator.of(context).pushNamed( + Routes.chooseHardwareWalletAccount, + arguments: [type, hardwareWalletType]), isReconnect: false, ); - Navigator.of(context) - .pushNamed(Routes.connectDevices, arguments: arguments); + Navigator.of(context).pushNamed(Routes.connectDevices, arguments: arguments); }, isCreate: false, hardwareWalletType: hardwareWalletType, @@ -407,16 +386,14 @@ Route createRoute(RouteSettings settings) { case Routes.seed: return handleRouteWithPlatformAwareness( - (context) => - getIt.get(param1: settings.arguments as bool), + (context) => getIt.get(param1: settings.arguments as bool), ); case Routes.restoreWallet: final args = settings.arguments as Map?; final walletType = args?['walletType'] as WalletType; return MaterialPageRoute( - builder: (_) => - getIt.get(param1: walletType, param2: args)); + builder: (_) => getIt.get(param1: walletType, param2: args)); case Routes.restoreWalletChooseDerivation: return MaterialPageRoute( @@ -424,21 +401,18 @@ Route createRoute(RouteSettings settings) { param1: settings.arguments as List)); case Routes.sweepingWalletPage: - return CupertinoPageRoute( - builder: (_) => getIt.get()); + return CupertinoPageRoute(builder: (_) => getIt.get()); case Routes.dashboard: return CupertinoPageRoute( - settings: settings, builder: (_) => - FeatureFlag.hasNewUi? - getIt.get(): - getIt.get()); + settings: settings, + builder: (_) => + FeatureFlag.hasNewUi ? getIt.get() : getIt.get()); case Routes.send: final args = settings.arguments as Map?; final initialPaymentRequest = args?['paymentRequest'] as PaymentRequest?; - final coinTypeToSpendFrom = - args?['coinTypeToSpendFrom'] as UnspentCoinType?; + final coinTypeToSpendFrom = args?['coinTypeToSpendFrom'] as UnspentCoinType?; return handleRouteWithPlatformAwareness( (context) => getIt.get( @@ -449,12 +423,10 @@ Route createRoute(RouteSettings settings) { case Routes.sendTemplate: return CupertinoPageRoute( - fullscreenDialog: true, - builder: (_) => getIt.get()); + fullscreenDialog: true, builder: (_) => getIt.get()); case Routes.receive: - return CupertinoPageRoute( - builder: (context) => getIt.get()); + return CupertinoPageRoute(builder: (context) => getIt.get()); case Routes.addressPage: return handleRouteWithPlatformAwareness( @@ -464,34 +436,29 @@ Route createRoute(RouteSettings settings) { case Routes.transactionDetails: return CupertinoPageRoute( fullscreenDialog: true, - builder: (_) => getIt.get( - param1: settings.arguments as TransactionInfo)); + builder: (_) => + getIt.get(param1: settings.arguments as TransactionInfo)); case Routes.bumpFeePage: return CupertinoPageRoute( fullscreenDialog: true, - builder: (_) => getIt.get( - param1: settings.arguments as List)); + builder: (_) => getIt.get(param1: settings.arguments as List)); case Routes.newSubaddress: return CupertinoPageRoute( - builder: (_) => - getIt.get(param1: settings.arguments)); + builder: (_) => getIt.get(param1: settings.arguments)); case Routes.disclaimer: return CupertinoPageRoute(builder: (_) => DisclaimerPage()); case Routes.readDisclaimer: - return CupertinoPageRoute( - builder: (_) => DisclaimerPage(isReadOnly: true)); + return CupertinoPageRoute(builder: (_) => DisclaimerPage(isReadOnly: true)); case Routes.readThirdPartyDisclaimer: - return CupertinoPageRoute( - builder: (_) => ThirdPartyDisclaimerPage()); + return CupertinoPageRoute(builder: (_) => ThirdPartyDisclaimerPage()); case Routes.changeRep: - return CupertinoPageRoute( - builder: (_) => getIt.get()); + return CupertinoPageRoute(builder: (_) => getIt.get()); case Routes.walletList: final onWalletLoaded = settings.arguments as Function(BuildContext)?; @@ -503,8 +470,8 @@ Route createRoute(RouteSettings settings) { case Routes.walletEdit: return MaterialPageRoute( fullscreenDialog: true, - builder: (_) => getIt.get( - param1: settings.arguments as WalletEditPageArguments), + builder: (_) => + getIt.get(param1: settings.arguments as WalletEditPageArguments), ); case Routes.auth: @@ -517,8 +484,7 @@ Route createRoute(RouteSettings settings) { instanceName: 'wallet_unlock_verifiable', param2: true) : getIt.get( - param1: settings.arguments as OnAuthenticationFinished, - param2: true)); + param1: settings.arguments as OnAuthenticationFinished, param2: true)); case Routes.totpAuthCodePage: final args = settings.arguments as TotpAuthArgumentsModel; @@ -544,15 +510,13 @@ Route createRoute(RouteSettings settings) { ? WillPopScope( child: getIt.get( param1: WalletUnlockArguments( - callback: - settings.arguments as OnAuthenticationFinished), + callback: settings.arguments as OnAuthenticationFinished), param2: false, instanceName: 'wallet_unlock_verifiable'), onWillPop: () async => false) : WillPopScope( child: getIt.get( - param1: settings.arguments as OnAuthenticationFinished, - param2: false), + param1: settings.arguments as OnAuthenticationFinished, param2: false), onWillPop: () async => false)); case Routes.silentPaymentsSettings: @@ -597,13 +561,11 @@ Route createRoute(RouteSettings settings) { case Routes.trocadorProvidersPage: return CupertinoPageRoute( - fullscreenDialog: true, - builder: (_) => getIt.get()); + fullscreenDialog: true, builder: (_) => getIt.get()); case Routes.domainLookupsPage: return CupertinoPageRoute( - fullscreenDialog: true, - builder: (_) => getIt.get()); + fullscreenDialog: true, builder: (_) => getIt.get()); case Routes.displaySettingsPage: return handleRouteWithPlatformAwareness( @@ -619,20 +581,17 @@ Route createRoute(RouteSettings settings) { final args = settings.arguments as Map?; return CupertinoPageRoute( builder: (_) => getIt.get( - param1: args?['editingNode'] as Node?, - param2: args?['isSelected'] as bool?)); + param1: args?['editingNode'] as Node?, param2: args?['isSelected'] as bool?)); case Routes.login: return CupertinoPageRoute( builder: (context) => WillPopScope( child: SettingsStoreBase.walletPasswordDirectInput - ? getIt.get( - instanceName: 'wallet_password_login') + ? getIt.get(instanceName: 'wallet_password_login') : getIt.get(instanceName: 'login'), onWillPop: () async => // FIX-ME: Additional check does it works correctly - (await SystemChannels.platform - .invokeMethod('SystemNavigator.pop') ?? + (await SystemChannels.platform.invokeMethod('SystemNavigator.pop') ?? false)), fullscreenDialog: true); @@ -640,8 +599,7 @@ Route createRoute(RouteSettings settings) { final args = settings.arguments as Map?; return CupertinoPageRoute( builder: (_) => getIt.get( - param1: args?['editingNode'] as Node?, - param2: args?['isSelected'] as bool?)); + param1: args?['editingNode'] as Node?, param2: args?['isSelected'] as bool?)); case Routes.accountCreation: return CupertinoPageRoute( @@ -650,8 +608,8 @@ Route createRoute(RouteSettings settings) { case Routes.nanoAccountCreation: return CupertinoPageRoute( - builder: (_) => getIt.get( - param1: settings.arguments as NanoAccount?)); + builder: (_) => + getIt.get(param1: settings.arguments as NanoAccount?)); case Routes.addressBook: return handleRouteWithPlatformAwareness( @@ -664,13 +622,11 @@ Route createRoute(RouteSettings settings) { builder: (_) => getIt.get(param1: selectedCurrency)); case Routes.pickerWalletAddress: - return MaterialPageRoute( - builder: (_) => getIt.get()); + return MaterialPageRoute(builder: (_) => getIt.get()); case Routes.addressBookAddContact: return handleRouteWithPlatformAwareness( - (context) => getIt.get( - param1: settings.arguments as ContactRecord?), + (context) => getIt.get(param1: settings.arguments as ContactRecord?), ); case Routes.showKeys: @@ -679,23 +635,19 @@ Route createRoute(RouteSettings settings) { ); case Routes.exchangeTrade: - return CupertinoPageRoute( - builder: (_) => getIt.get()); + return CupertinoPageRoute(builder: (_) => getIt.get()); case Routes.exchangeConfirm: - return MaterialPageRoute( - builder: (_) => getIt.get()); + return MaterialPageRoute(builder: (_) => getIt.get()); case Routes.tradeDetails: return MaterialPageRoute( fullscreenDialog: true, - builder: (_) => - getIt.get(param1: settings.arguments as Trade)); + builder: (_) => getIt.get(param1: settings.arguments as Trade)); case Routes.orderDetails: return MaterialPageRoute( - builder: (_) => - getIt.get(param1: settings.arguments as Order)); + builder: (_) => getIt.get(param1: settings.arguments as Order)); case Routes.buySellPage: final args = settings.arguments as bool; @@ -705,8 +657,7 @@ Route createRoute(RouteSettings settings) { case Routes.buyOptionsPage: final args = settings.arguments as List; - return MaterialPageRoute( - builder: (_) => getIt.get(param1: args)); + return MaterialPageRoute(builder: (_) => getIt.get(param1: args)); case Routes.paymentMethodOptionsPage: final args = settings.arguments as List; @@ -717,18 +668,15 @@ Route createRoute(RouteSettings settings) { final args = settings.arguments as List; return MaterialPageRoute( - fullscreenDialog: true, - builder: (_) => getIt.get(param1: args)); + fullscreenDialog: true, builder: (_) => getIt.get(param1: args)); case Routes.exchange: return handleRouteWithPlatformAwareness( - (context) => getIt.get( - param1: settings.arguments as PaymentRequest?), + (context) => getIt.get(param1: settings.arguments as PaymentRequest?), ); case Routes.exchangeTemplate: - return CupertinoPageRoute( - builder: (_) => getIt.get()); + return CupertinoPageRoute(builder: (_) => getIt.get()); case Routes.rescan: return MaterialPageRoute(builder: (_) => getIt.get()); @@ -740,13 +688,11 @@ Route createRoute(RouteSettings settings) { return MaterialPageRoute(builder: (_) => getIt.get()); case Routes.walletGroupExistingSeedDescriptionPage: - return MaterialPageRoute( - builder: (_) => WalletGroupExistingSeedDescriptionPage()); + return MaterialPageRoute(builder: (_) => WalletGroupExistingSeedDescriptionPage()); case Routes.transactionSuccessPage: return MaterialPageRoute( - builder: (_) => getIt.get( - param1: settings.arguments as String)); + builder: (_) => getIt.get(param1: settings.arguments as String)); case Routes.backup: return handleRouteWithPlatformAwareness( @@ -754,13 +700,11 @@ Route createRoute(RouteSettings settings) { ); case Routes.editBackupPassword: - return CupertinoPageRoute( - builder: (_) => getIt.get()); + return CupertinoPageRoute(builder: (_) => getIt.get()); case Routes.restoreFromBackup: return CupertinoPageRoute( - fullscreenDialog: true, - builder: (_) => getIt.get()); + fullscreenDialog: true, builder: (_) => getIt.get()); case Routes.support: return handleRouteWithPlatformAwareness( @@ -768,8 +712,7 @@ Route createRoute(RouteSettings settings) { ); case Routes.supportLiveChat: - return CupertinoPageRoute( - builder: (_) => getIt.get()); + return CupertinoPageRoute(builder: (_) => getIt.get()); case Routes.supportOtherLinks: return handleRouteWithPlatformAwareness( @@ -779,8 +722,7 @@ Route createRoute(RouteSettings settings) { case Routes.unspentCoinsList: final coinTypeToSpendFrom = settings.arguments as UnspentCoinType?; return handleRouteWithPlatformAwareness( - (context) => - getIt.get(param1: coinTypeToSpendFrom), + (context) => getIt.get(param1: coinTypeToSpendFrom), ); case Routes.unspentCoinsDetails: @@ -846,47 +788,41 @@ Route createRoute(RouteSettings settings) { toggleUseTestnet: toggleTestnet, advancedPrivacySettingsViewModel: getIt.get(param1: type), - nodeViewModel: - getIt.get(param1: type, param2: false), + nodeViewModel: getIt.get(param1: type, param2: false), seedSettingsViewModel: getIt.get(), ), ); case Routes.anonPayInvoicePage: final args = settings.arguments as List; - return CupertinoPageRoute( - builder: (_) => getIt.get(param1: args)); + return CupertinoPageRoute(builder: (_) => getIt.get(param1: args)); case Routes.anonPayReceivePage: final anonReceivePageArgs = settings.arguments as AnonPayReceivePageArgs; return CupertinoPageRoute( - builder: (_) => - getIt.get(param1: anonReceivePageArgs)); + builder: (_) => getIt.get(param1: anonReceivePageArgs)); case Routes.anonPayDetailsPage: final anonInvoiceViewData = settings.arguments as AnonpayInvoiceInfo; return CupertinoPageRoute( - builder: (_) => - getIt.get(param1: anonInvoiceViewData)); + builder: (_) => getIt.get(param1: anonInvoiceViewData)); case Routes.payjoinDetails: final arguments = settings.arguments as List; final sessionId = arguments.first as String; final transactionInfo = arguments[1] as TransactionInfo?; return CupertinoPageRoute( - builder: (_) => getIt.get( - param1: sessionId, param2: transactionInfo)); + builder: (_) => + getIt.get(param1: sessionId, param2: transactionInfo)); case Routes.desktop_actions: return PageRouteBuilder( opaque: false, - pageBuilder: (_, __, ___) => - DesktopDashboardActions(getIt()), + pageBuilder: (_, __, ___) => DesktopDashboardActions(getIt()), ); case Routes.desktop_settings_page: - return CupertinoPageRoute( - builder: (_) => getIt.get()); + return CupertinoPageRoute(builder: (_) => getIt.get()); case Routes.empty_no_route: return MaterialPageRoute(builder: (_) => SizedBox.shrink()); @@ -901,21 +837,17 @@ Route createRoute(RouteSettings settings) { return MaterialPageRoute(builder: (_) => getIt.get()); case Routes.setup_2faQRPage: - return MaterialPageRoute( - builder: (_) => getIt.get()); + return MaterialPageRoute(builder: (_) => getIt.get()); case Routes.modify2FAPage: - return MaterialPageRoute( - builder: (_) => getIt.get()); + return MaterialPageRoute(builder: (_) => getIt.get()); case Routes.setup2faInfoPage: - return MaterialPageRoute( - builder: (_) => getIt.get()); + return MaterialPageRoute(builder: (_) => getIt.get()); case Routes.urqrAnimatedPage: return MaterialPageRoute( - builder: (_) => - getIt.get(param1: settings.arguments)); + builder: (_) => getIt.get(param1: settings.arguments)); case Routes.homeSettings: return CupertinoPageRoute( @@ -937,12 +869,10 @@ Route createRoute(RouteSettings settings) { ); case Routes.manageNodes: - return MaterialPageRoute( - builder: (_) => getIt.get(param1: false)); + return MaterialPageRoute(builder: (_) => getIt.get(param1: false)); case Routes.managePowNodes: - return MaterialPageRoute( - builder: (_) => getIt.get(param1: true)); + return MaterialPageRoute(builder: (_) => getIt.get(param1: true)); case Routes.walletConnectConnectionsListing: return MaterialPageRoute( @@ -978,9 +908,7 @@ Route createRoute(RouteSettings settings) { return MaterialPageRoute( builder: (_) => ConnectDevicePage( - params, - getIt.get( - param1: params.hardwareWalletType))); + params, getIt.get(param1: params.hardwareWalletType))); case Routes.walletGroupDescription: final walletType = settings.arguments as WalletType; @@ -1069,8 +997,6 @@ Route createRoute(RouteSettings settings) { default: return MaterialPageRoute( builder: (_) => Scaffold( - body: Center( - child: Text(S.current - .router_no_route(settings.name ?? 'No route'))))); + body: Center(child: Text(S.current.router_no_route(settings.name ?? 'No route'))))); } } From f8e78e43afe72ff6e0cad2c599fcacf9d1664547 Mon Sep 17 00:00:00 2001 From: Robert Malikowski Date: Fri, 21 Nov 2025 10:25:21 +0100 Subject: [PATCH 058/105] remove unused navbar --- lib/new-ui/widgets/navbar/navbar.dart | 68 -------------------- lib/new-ui/widgets/navbar/navbar_button.dart | 67 ------------------- 2 files changed, 135 deletions(-) delete mode 100644 lib/new-ui/widgets/navbar/navbar.dart delete mode 100644 lib/new-ui/widgets/navbar/navbar_button.dart diff --git a/lib/new-ui/widgets/navbar/navbar.dart b/lib/new-ui/widgets/navbar/navbar.dart deleted file mode 100644 index f19f6e69b6..0000000000 --- a/lib/new-ui/widgets/navbar/navbar.dart +++ /dev/null @@ -1,68 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'navbar_button.dart'; - -class Navbar extends StatefulWidget { - const Navbar({super.key}); - - @override - State createState() => _NavbarState(); -} - -class NavbarItemData { - final String iconPath; - final String text; - - NavbarItemData(this.iconPath, this.text); -} - -class _NavbarState extends State { - int _selectedIndex = 0; - - final List _items = [ - NavbarItemData("assets/Home.svg", "Home"), - NavbarItemData("assets/Wallets.svg", "Wallets"), - NavbarItemData("assets/Contacts.svg", "Contacts"), - NavbarItemData("assets/Apps.svg", "Apps"), - NavbarItemData("assets/Charts.svg", "Charts"), - ]; - - @override - Widget build(BuildContext context) { - return Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.all(32.0), - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(99999), - color: Theme.of( - context, - ).colorScheme.surfaceContainerHighest.withAlpha(170), - ), - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 12.0, - vertical: 12.0, - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: List.generate(_items.length, (index) { - return NavbarButton( - data: _items[index], - onPressed: () { - setState(() { - _selectedIndex = index; - }); - }, - selected: _selectedIndex == index, - ); - }), - ), - ), - ), - ), - ); - } -} diff --git a/lib/new-ui/widgets/navbar/navbar_button.dart b/lib/new-ui/widgets/navbar/navbar_button.dart deleted file mode 100644 index 79c3af9eac..0000000000 --- a/lib/new-ui/widgets/navbar/navbar_button.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:cake_wallet/new-ui/widgets/navbar/navbar.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; - -class NavbarButton extends StatelessWidget { - const NavbarButton({ - super.key, - required this.data, - required this.selected, - required this.onPressed, - }); - - final NavbarItemData data; - final VoidCallback onPressed; - final bool selected; - - @override - Widget build(BuildContext context) { - return AnimatedSize( - curve: Curves.easeOut, - duration: Duration(milliseconds: 100), - child: AnimatedContainer( - curve: Curves.easeOut, - duration: Duration(milliseconds: 100), - decoration: BoxDecoration( - color: selected - ? Color(0x79BDCFFF) - : Theme.of( - context, - ).colorScheme.surfaceContainerHighest.withAlpha(0), - borderRadius: BorderRadius.circular(1242357), - ), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - IconButton( - constraints: BoxConstraints(), - padding: EdgeInsets.zero, - icon: SvgPicture.asset( - data.iconPath, - width: selected ? 24 : 36, - height: selected ? 24 : 36, - colorFilter: ColorFilter.mode( - selected - ? Theme.of(context).colorScheme.onSurface - : Theme.of(context).colorScheme.primary, - BlendMode.srcIn, - ), - ), - onPressed: onPressed, - ), - if (selected) - Padding( - padding: const EdgeInsets.fromLTRB(0.0, 0.0, 8.0, 0.0), - child: Text( - data.text, - style: TextStyle(fontWeight: FontWeight.bold), - textAlign: TextAlign.center, - ), - ), - ], - ), - ), - ); - } -} From d97b0db9d75968bfd572137c06ffc2312c44feb4 Mon Sep 17 00:00:00 2001 From: Robert Malikowski Date: Fri, 21 Nov 2025 11:53:02 +0100 Subject: [PATCH 059/105] fix: lightning balance on balance card in lightning mode --- .../coins_page/cards/balance_card.dart | 28 +++++++++++-------- .../widgets/coins_page/cards/cards_view.dart | 7 +++++ 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/lib/new-ui/widgets/coins_page/cards/balance_card.dart b/lib/new-ui/widgets/coins_page/cards/balance_card.dart index bcdf43bd89..f05cbbca78 100644 --- a/lib/new-ui/widgets/coins_page/cards/balance_card.dart +++ b/lib/new-ui/widgets/coins_page/cards/balance_card.dart @@ -7,14 +7,22 @@ class BalanceCard extends StatelessWidget { super.key, required this.width, required this.balanceRecord, - required this.selected, required this.accountName, required this.accountBalance, + required this.selected, + required this.accountName, + required this.accountBalance, + required this.gradient, + required this.svgPath, + required this.lightningMode, }); final double width; final String accountBalance; final String accountName; + final Gradient gradient; + final String svgPath; final BalanceRecord balanceRecord; final bool selected; + final bool lightningMode; @override Widget build(BuildContext context) { @@ -25,11 +33,7 @@ class BalanceCard extends StatelessWidget { height: width * 2.0 / 3, decoration: BoxDecoration( border: Border.all(color: Color(0x77FFFFFF), width: 1), - gradient: LinearGradient( - colors: [Colors.lightBlueAccent, Colors.blue], - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - ), + gradient: gradient, borderRadius: BorderRadius.circular(20), ), child: Padding( @@ -49,7 +53,6 @@ class BalanceCard extends StatelessWidget { accountName, style: TextStyle(color: Colors.black, fontSize: 20), ), - AnimatedOpacity( opacity: selected ? 0 : 1, duration: textFadeDuration, @@ -67,7 +70,9 @@ class BalanceCard extends StatelessWidget { spacing: 8.0, children: [ Text( - balanceRecord.availableBalance, + lightningMode + ? balanceRecord.secondAvailableBalance + : balanceRecord.availableBalance, style: TextStyle(color: Colors.black, fontSize: 28), ), Text( @@ -78,12 +83,13 @@ class BalanceCard extends StatelessWidget { ), ), Text( - balanceRecord.fiatAvailableBalance, + lightningMode + ? balanceRecord.fiatSecondAdditionalBalance + : balanceRecord.fiatAvailableBalance, style: TextStyle(color: Colors.black45, fontSize: 20), ), ], ), - Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -109,7 +115,7 @@ class BalanceCard extends StatelessWidget { ), ), SvgPicture.asset( - "assets/new-ui/switcher-bitcoin.svg", + svgPath, height: 50, width: 50, colorFilter: const ColorFilter.mode( diff --git a/lib/new-ui/widgets/coins_page/cards/cards_view.dart b/lib/new-ui/widgets/coins_page/cards/cards_view.dart index 22d0bce9a8..c1c4f37733 100644 --- a/lib/new-ui/widgets/coins_page/cards/cards_view.dart +++ b/lib/new-ui/widgets/coins_page/cards/cards_view.dart @@ -75,6 +75,13 @@ class _CardsViewState extends State { balanceRecord: widget.dashboardViewModel.balanceViewModel.formattedBalances.elementAt(0), selected: _selectedIndex == index, + gradient: LinearGradient( + colors: [Colors.lightBlue, Colors.blue], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + svgPath: widget.dashboardViewModel.balanceViewModel.balances.keys.elementAt(0).iconPath!, + lightningMode: widget.lightningMode, ); }), ), From 2c5f6cfb872f51c862f7e79b5d6bdf2e616f8168 Mon Sep 17 00:00:00 2001 From: malik1004x Date: Fri, 21 Nov 2025 12:55:08 +0100 Subject: [PATCH 060/105] fix: return if uri == null --- lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart b/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart index 9a52178ed3..2cb9d4d36a 100644 --- a/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart +++ b/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart @@ -92,6 +92,7 @@ class CoinActionRow extends StatelessWidget { if (code == null) return; if (code.isEmpty) return; final uri = Uri.tryParse(code); + if (uri == null) return; rootKey.currentState?.handleDeepLinking(uri); }; }, From 0e549ba1daa15fd11c4c1c79fec1beabe4717ec7 Mon Sep 17 00:00:00 2001 From: Karl Buys Date: Fri, 21 Nov 2025 17:09:17 +0200 Subject: [PATCH 061/105] fix: fixed text validator to accomodate minLength ints correctly (#2649) --- lib/core/validator.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/core/validator.dart b/lib/core/validator.dart index 34e985991d..58b3333dd6 100644 --- a/lib/core/validator.dart +++ b/lib/core/validator.dart @@ -34,8 +34,8 @@ class TextValidator extends Validator { return isAutovalidate ? true : false; } - final greaterThanMinLength = value.length > (minLength ?? 0); - if (!greaterThanMinLength) return false; + final greaterThanOrEqualToMinLength = value.length >= (minLength ?? 0); + if (!greaterThanOrEqualToMinLength) return false; final lengthMatched = length?.contains(value.length) ?? true; if (!lengthMatched) return false; From 842b958f8b35c3325d6f9dd703d036175ecc7cd1 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Fri, 21 Nov 2025 16:10:37 +0100 Subject: [PATCH 062/105] feat: add Wownero wallet seed backup during migration step 54 (#2667) * feat: add Wownero wallet seed backup during migration step 54 * feat: add Haven wallet seed backup support in configure tool interface --- lib/entities/default_settings_migration.dart | 10 ++++++++++ lib/main.dart | 2 +- lib/wownero/cw_wownero.dart | 16 ++++++++++++++++ tool/configure.dart | 8 ++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/lib/entities/default_settings_migration.dart b/lib/entities/default_settings_migration.dart index 9f2ac0bcea..9e57fd873b 100644 --- a/lib/entities/default_settings_migration.dart +++ b/lib/entities/default_settings_migration.dart @@ -5,6 +5,7 @@ import 'package:cake_wallet/core/secure_storage.dart'; import 'package:cake_wallet/entities/exchange_api_mode.dart'; import 'package:cake_wallet/entities/fiat_api_mode.dart'; import 'package:cake_wallet/entities/haven_seed_store.dart'; +import 'package:cake_wallet/wownero/wownero.dart'; import 'package:cw_core/cake_hive.dart'; import 'package:cw_core/pathForWallet.dart'; import 'package:cake_wallet/entities/secret_store_key.dart'; @@ -555,6 +556,9 @@ Future defaultSettingsMigration( currentNodePreferenceKey: PreferencesKey.currentArbitrumNodeIdKey, ); break; + case 54: + await _backupWowneroSeeds(havenSeedStore); + break; default: break; @@ -740,6 +744,12 @@ Future disableServiceStatusFiatDisabled(SharedPreferences sharedPreference } } +Future _backupWowneroSeeds(Box havenSeedStore) async { + final future = wownero?.backupSeeds(havenSeedStore); + if (future != null) await future; + return; +} + Future _updateMoneroPriority(SharedPreferences sharedPreferences) async { final currentPriority = await sharedPreferences.getInt(PreferencesKey.moneroTransactionPriority) ?? diff --git a/lib/main.dart b/lib/main.dart index 77430f08fe..6d96e67877 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -266,7 +266,7 @@ Future initializeAppConfigs({bool loadWallet = true}) async { payjoinSessionSource: payjoinSessionSource, anonpayInvoiceInfo: anonpayInvoiceInfo, havenSeedStore: havenSeedStore, - initialMigrationVersion: 53, + initialMigrationVersion: 54, ); } diff --git a/lib/wownero/cw_wownero.dart b/lib/wownero/cw_wownero.dart index 99c5405f88..364272835c 100644 --- a/lib/wownero/cw_wownero.dart +++ b/lib/wownero/cw_wownero.dart @@ -365,4 +365,20 @@ class CWWownero extends Wownero { Map> debugCallLength() { return wownero_wallet_api.debugCallLength(); } + + @override + Future backupSeeds(Box havenSeedStore) async { + final wallets = await WalletInfo.selectList('type = ?', [WalletType.wownero.index]); + final unspentCoinsInfo = await CakeHive.openBox(UnspentCoinsInfo.boxName); + for (final w in wallets) { + final walletService = WowneroWalletService(unspentCoinsInfo); + final flutterSecureStorage = secureStorageShared; + final keyService = KeyService(flutterSecureStorage); + final password = await keyService.getWalletPassword(walletName: w.name); + final wallet = await walletService.openWallet(w.name, password); + await havenSeedStore.add(HavenSeedStore(id: wallet.id, seed: wallet.seed)); + wallet.close(); + } + await havenSeedStore.flush(); + } } diff --git a/tool/configure.dart b/tool/configure.dart index 47b3379406..f04f009ef3 100644 --- a/tool/configure.dart +++ b/tool/configure.dart @@ -517,6 +517,13 @@ import 'package:cw_core/transaction_info.dart'; import 'package:cw_core/balance.dart'; import 'package:cw_core/output_info.dart'; import 'package:cake_wallet/view_model/send/output.dart'; +import 'package:cw_core/crypto_currency.dart'; +import 'package:cake_wallet/core/key_service.dart'; +import 'package:cake_wallet/core/secure_storage.dart'; +import 'package:cake_wallet/entities/haven_seed_store.dart'; +import 'package:cw_core/cake_hive.dart'; +import 'package:cw_core/wallet_info.dart'; +import 'package:cw_core/wallet_type.dart'; import 'package:cw_core/wallet_service.dart'; import 'package:hive/hive.dart'; import 'package:polyseed/polyseed.dart';"""; @@ -650,6 +657,7 @@ abstract class Wownero { Map pendingTransactionInfo(Object transaction); String getLegacySeed(Object wallet, String langName); Map> debugCallLength(); + Future backupSeeds(Box havenSeedStore); } abstract class WowneroSubaddressList { From 46ba15f3f01b3f7e8f801a6abe3ba5eb188364a3 Mon Sep 17 00:00:00 2001 From: malik1004x Date: Fri, 21 Nov 2025 18:08:21 +0100 Subject: [PATCH 063/105] feat: parsing addresses+unstoppable domains from twitter profiles (#2663) * feat: parsing addresses+unstoppable domains from twitter profiles * fix: address resolution --- lib/entities/parse_address_from_domain.dart | 77 ++++++++++++++++++++- lib/twitter/twitter_api.dart | 2 +- lib/twitter/twitter_user.dart | 3 + 3 files changed, 78 insertions(+), 4 deletions(-) diff --git a/lib/entities/parse_address_from_domain.dart b/lib/entities/parse_address_from_domain.dart index 4428108752..818a78184c 100644 --- a/lib/entities/parse_address_from_domain.dart +++ b/lib/entities/parse_address_from_domain.dart @@ -193,6 +193,17 @@ class AddressResolver { }); } + static String extractUnstoppableDomain(String raw) { + // sort by length to avoid matching shorter tld instead of longer + final domains = List.from(unstoppableDomains)..sort((a, b) => b.length.compareTo(a.length)); + for (final tld in domains) { + final pattern = RegExp(r'([A-Za-z0-9-]+)\.' + RegExp.escape(tld), caseSensitive: false); + final match = pattern.firstMatch(raw); + if (match != null) return match.group(0)!; + } + return ''; + } + bool isEmailFormat(String address) { final RegExp emailRegex = RegExp( r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$', @@ -228,19 +239,78 @@ class AddressResolver { name: text, profileImageUrl: twitterUser.profileImageUrl, profileName: twitterUser.name); + } else { + final domain = extractUnstoppableDomain(twitterUser.description); + if (domain.isNotEmpty) { + final parsedAddressFromDomain = await resolve(context, domain, currency); + if (parsedAddressFromDomain.addresses.isNotEmpty) { + return ParsedAddress( + addresses: parsedAddressFromDomain.addresses, + name: text, + profileImageUrl: twitterUser.profileImageUrl, + profileName: twitterUser.name, + parseFrom: ParseFrom.twitter, + ); + } + + } + + } + + final addressFromLocation = extractAddressByType( + raw: twitterUser.location, + type: CryptoCurrency.fromString(ticker, + walletCurrency: wallet.currency), requireSurroundingWhitespaces: false); + if (addressFromLocation != null && addressFromLocation.isNotEmpty) { + return ParsedAddress.fetchTwitterAddress( + address: addressFromLocation, + name: text, + profileImageUrl: twitterUser.profileImageUrl, + profileName: twitterUser.name); + } else { + final domain = extractUnstoppableDomain(twitterUser.location); + if (domain.isNotEmpty) { + final parsedAddressFromDomain = await resolve(context, domain, currency); + if (parsedAddressFromDomain.addresses.isNotEmpty) { + return ParsedAddress( + addresses: parsedAddressFromDomain.addresses, + name: text, + profileImageUrl: twitterUser.profileImageUrl, + profileName: twitterUser.name, + parseFrom: ParseFrom.twitter, + ); + } + + } + } final pinnedTweet = twitterUser.pinnedTweet?.text; if (pinnedTweet != null) { final addressFromPinnedTweet = extractAddressByType( raw: pinnedTweet, - type: CryptoCurrency.fromString(ticker, walletCurrency: wallet.currency)); + type: CryptoCurrency.fromString(ticker, walletCurrency: wallet.currency), + requireSurroundingWhitespaces: false); if (addressFromPinnedTweet != null) { return ParsedAddress.fetchTwitterAddress( address: addressFromPinnedTweet, name: text, profileImageUrl: twitterUser.profileImageUrl, profileName: twitterUser.name); + } else { + final domain = extractUnstoppableDomain(pinnedTweet); + if (domain.isNotEmpty) { + final parsedAddressFromDomain = await resolve(context, domain, currency); + if (parsedAddressFromDomain.addresses.isNotEmpty) { + return ParsedAddress( + addresses: parsedAddressFromDomain.addresses, + name: text, + profileImageUrl: twitterUser.profileImageUrl, + profileName: twitterUser.name, + parseFrom: ParseFrom.twitter, + ); + } + } } } } @@ -258,7 +328,7 @@ class AddressResolver { await MastodonAPI.lookupUserByUserName(userName: userName, apiHost: hostName); if (mastodonUser != null) { - String? addressFromBio = extractAddressByType(raw: mastodonUser.note, type: currency); + String? addressFromBio = extractAddressByType(raw: mastodonUser.note, type: currency, requireSurroundingWhitespaces: false); if (addressFromBio != null && addressFromBio.isNotEmpty) { return ParsedAddress.fetchMastodonAddress( @@ -273,7 +343,8 @@ class AddressResolver { if (pinnedPosts.isNotEmpty) { final userPinnedPostsText = pinnedPosts.map((item) => item.content).join('\n'); String? addressFromPinnedPost = - extractAddressByType(raw: userPinnedPostsText, type: currency); + extractAddressByType(raw: userPinnedPostsText, type: currency, + requireSurroundingWhitespaces: false); if (addressFromPinnedPost != null && addressFromPinnedPost.isNotEmpty) { return ParsedAddress.fetchMastodonAddress( diff --git a/lib/twitter/twitter_api.dart b/lib/twitter/twitter_api.dart index cccf769ad0..a508b3edf4 100644 --- a/lib/twitter/twitter_api.dart +++ b/lib/twitter/twitter_api.dart @@ -12,7 +12,7 @@ class TwitterApi { static Future lookupUserByName({required String userName}) async { final queryParams = { - 'user.fields': 'description,profile_image_url', + 'user.fields': 'description,profile_image_url,location', 'expansions': 'pinned_tweet_id', 'tweet.fields': 'note_tweet' }; diff --git a/lib/twitter/twitter_user.dart b/lib/twitter/twitter_user.dart index 01db256840..f124de4052 100644 --- a/lib/twitter/twitter_user.dart +++ b/lib/twitter/twitter_user.dart @@ -4,6 +4,7 @@ class TwitterUser { required this.username, required this.name, required this.description, + required this.location, required this.profileImageUrl, this.pinnedTweet}); @@ -11,6 +12,7 @@ class TwitterUser { final String username; final String name; final String description; + final String location; final String profileImageUrl; final Tweet? pinnedTweet; @@ -22,6 +24,7 @@ class TwitterUser { username: json['data']['username'] as String? ?? '', name: json['data']['name'] as String, description: json['data']['description'] as String? ?? '', + location: json['data']['location'] as String? ?? '', profileImageUrl: scaledProfileImageUrl, pinnedTweet: pinnedTweet, ); From f05d6ef1b2acaf8b79ebdf1f58cea84130e4aa6d Mon Sep 17 00:00:00 2001 From: Serhii Date: Fri, 21 Nov 2025 21:16:16 +0200 Subject: [PATCH 064/105] Update monero_wallet_service.dart (#2666) --- cw_monero/lib/monero_wallet_service.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/cw_monero/lib/monero_wallet_service.dart b/cw_monero/lib/monero_wallet_service.dart index f38341923a..d339d7ee13 100644 --- a/cw_monero/lib/monero_wallet_service.dart +++ b/cw_monero/lib/monero_wallet_service.dart @@ -394,7 +394,6 @@ class MoneroWalletService extends WalletService< derivationInfo.derivationType = DerivationType.bip39; derivationInfo.derivationPath = "m/44'/128'/0'/0/0"; await derivationInfo.save(); - walletInfo.save(); final legacyMnemonic = getLegacySeedFromBip39(mnemonic, passphrase: passphrase ?? ""); From 7172928e1ecd643fb06953b9256aac537b815c89 Mon Sep 17 00:00:00 2001 From: malik1004x Date: Fri, 21 Nov 2025 22:15:30 +0100 Subject: [PATCH 065/105] Hide available balance in send card (#2662) * hide available balance on send page when balance is hidden * hide available balance on send page when balance is hidden * allow show/hide of balance from send card --- lib/src/screens/send/widgets/send_card.dart | 38 +++++++++++++++++---- res/values/strings_ar.arb | 1 + res/values/strings_bg.arb | 1 + res/values/strings_cs.arb | 1 + res/values/strings_de.arb | 1 + res/values/strings_en.arb | 1 + res/values/strings_es.arb | 3 +- res/values/strings_fr.arb | 1 + res/values/strings_gn.arb | 1 + res/values/strings_ha.arb | 1 + res/values/strings_hi.arb | 1 + res/values/strings_hr.arb | 1 + res/values/strings_hy.arb | 1 + res/values/strings_id.arb | 1 + res/values/strings_it.arb | 1 + res/values/strings_ja.arb | 1 + res/values/strings_ko.arb | 1 + res/values/strings_my.arb | 1 + res/values/strings_nl.arb | 1 + res/values/strings_pl.arb | 3 +- res/values/strings_pt.arb | 1 + res/values/strings_ru.arb | 1 + res/values/strings_th.arb | 1 + res/values/strings_tl.arb | 1 + res/values/strings_tr.arb | 1 + res/values/strings_uk.arb | 1 + res/values/strings_ur.arb | 1 + res/values/strings_vi.arb | 1 + res/values/strings_yo.arb | 1 + res/values/strings_zh.arb | 1 + 30 files changed, 62 insertions(+), 9 deletions(-) diff --git a/lib/src/screens/send/widgets/send_card.dart b/lib/src/screens/send/widgets/send_card.dart index 76eec7dc1d..8335bd4fc3 100644 --- a/lib/src/screens/send/widgets/send_card.dart +++ b/lib/src/screens/send/widgets/send_card.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:cake_wallet/core/open_crypto_pay/open_cryptopay_service.dart'; +import 'package:cake_wallet/entities/balance_display_mode.dart'; import 'package:cake_wallet/entities/priority_for_wallet_type.dart'; import 'package:cake_wallet/src/screens/receive/widgets/currency_input_field.dart'; import 'package:cake_wallet/src/widgets/bottom_sheet/payment_confirmation_bottom_sheet.dart'; @@ -536,13 +537,36 @@ class SendCardState extends State with AutomaticKeepAliveClientMixin( future: sendViewModel.sendingBalance, builder: (context, snapshot) { - return Text( - snapshot.data ?? - sendViewModel.balance, // default to balance while loading - style: Theme.of(context).textTheme.bodySmall!.copyWith( - fontWeight: FontWeight.w600, - color: Theme.of(context).colorScheme.onSurfaceVariant, - ), + return GestureDetector( + onTap: () { + sendViewModel.balanceViewModel + .switchBalanceValue(); + }, + child: Observer(builder: (_) { + final hidden = sendViewModel + .balanceViewModel.displayMode == + BalanceDisplayMode.hiddenBalance; + return Text( + hidden + ? S.of(context).show_balance_send_page + : (snapshot.data ?? + sendViewModel.balance), + // default to balance while loading + style: Theme.of(context) + .textTheme + .bodySmall! + .copyWith( + fontWeight: FontWeight.w600, + color: hidden + ? Theme.of(context) + .colorScheme + .primary + : Theme.of(context) + .colorScheme + .onSurfaceVariant, + ), + ); + }), ); }, ) diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index 33709eb3e6..eb7fd50e95 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -871,6 +871,7 @@ "show": "يعرض", "show_address_book_popup": "عرض دفتر العناوين المنبثقة", "show_balance": "اضغط لفترة طويلة لإظهار التوازن", + "show_balance_send_page": "انقر للكشف", "show_balance_toast": "اضغط لفترة طويلة لإخفاء أو إظهار التوازن", "show_details": "اظهر التفاصيل", "show_keys": "اظهار السييد / المفاتيح", diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index 0484cc66fc..e304243f8f 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -871,6 +871,7 @@ "show": "Показване", "show_address_book_popup": "Показване на изскачащ прозорец на адресна книга", "show_balance": "Дълго натиснете, за да покажете баланса", + "show_balance_send_page": "Докоснете, за да разкриете", "show_balance_toast": "Дълго натискане, за да се скрие или покаже баланс", "show_details": "Показване на подробностите", "show_keys": "Покажи seed/keys", diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index e73b1f4bcc..8f81691f41 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -871,6 +871,7 @@ "show": "Show", "show_address_book_popup": "Zobrazit vyskakovací okno", "show_balance": "Dlouhý stisknutí zobrazí rovnováhu", + "show_balance_send_page": "Klepnutím zobrazíte", "show_balance_toast": "Dlouhý stiskněte pro skrytí nebo zobrazení rovnováhy", "show_details": "Zobrazit detaily", "show_keys": "Zobrazit seed/klíče", diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index fb5ff2f8b6..6407d92ed0 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -872,6 +872,7 @@ "show": "Zeigen", "show_address_book_popup": "Popup \"zum Adressbuch hinzufügen\" nach dem Senden anzeigen", "show_balance": "Lange drücken, um das Kontoguthaben zu zeigen", + "show_balance_send_page": "Zum Enthüllen tippen", "show_balance_toast": "Langes drücken, um das Kontoguthaben zu verbergen oder zu zeigen", "show_details": "Details anzeigen", "show_keys": "Seed/Schlüssel anzeigen", diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index 2cd95ea2ea..34074cb283 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -872,6 +872,7 @@ "show": "Show", "show_address_book_popup": "Show Address Book popup", "show_balance": "Long Press to Show Balance", + "show_balance_send_page": "Tap to reveal", "show_balance_toast": "Long press to hide or show balance", "show_details": "Show Details", "show_keys": "Show seed/keys", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 0c28290b8f..195299116a 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -366,8 +366,8 @@ "estimated_new_fee": "Nueva tarifa estimada", "estimated_receive_amount": "Cantidad estimada a recibir", "eta": "ETA", - "etherscan_history": "Historial de Etherscan", "ethereum_ecosystem": "Ecosistema Etereum", + "etherscan_history": "Historial de Etherscan", "event": "Evento", "events": "Eventos", "evm_ecosystem_description": "Si es necesario, modifica la red y el token que deseas utilizar para este pago.", @@ -872,6 +872,7 @@ "show": "Mostrar", "show_address_book_popup": "Mostrar la ventana emergente de la libreta de direcciones", "show_balance": "Mantén pulsado para mostrar saldo", + "show_balance_send_page": "Toca para revelar", "show_balance_toast": "Mantén pulsado para ocultar o mostrar el saldo", "show_details": "Mostrar detalles", "show_keys": "Mostrar semilla/claves", diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index 94103b0e00..58ba70f66c 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -871,6 +871,7 @@ "show": "Montrer", "show_address_book_popup": "Afficher la fenêtre contextuelle du carnet d'adresses", "show_balance": "Appuyez longtemps pour afficher votre solde", + "show_balance_send_page": "Appuyez pour révéler", "show_balance_toast": "Appuyez longtemps pour masquer ou afficher votre solde", "show_details": "Afficher les détails", "show_keys": "Visualiser la phrase secrète (seed) et les clefs", diff --git a/res/values/strings_gn.arb b/res/values/strings_gn.arb index 3b204e8744..93d3ab19d8 100644 --- a/res/values/strings_gn.arb +++ b/res/values/strings_gn.arb @@ -667,6 +667,7 @@ "setup_your_debit_card": "Emohenda nde tarjeta débito", "share": "Mbohasa", "share_address": "Mbohasa dirección", + "show_balance_send_page": "Tap ojekuaa haguã .", "show_details": "Hechauka umi mba’e", "show_keys": "Hechauka ñe’ẽñemi", "show_market_place": "Hechauka ñemuha renda", diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index bb26fed0e5..c942ae9e75 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -873,6 +873,7 @@ "show": "Nuna", "show_address_book_popup": "Nuna littafin littafin adireshi", "show_balance": "Dogon latsawa don nuna ma'auni", + "show_balance_send_page": "Matsa don bayyana", "show_balance_toast": "Latsa latsawa don ɓoye ko nuna ma'auni", "show_details": "Nuna Cikakkun bayanai", "show_keys": "Nuna iri/maɓallai", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 4c83c23a54..a7ee269e85 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -873,6 +873,7 @@ "show": "दिखाओ", "show_address_book_popup": "पता बुक पॉपअप दिखाएं", "show_balance": "बैलेंस दिखाने के लिए लॉन्ग प्रेस", + "show_balance_send_page": "प्रकट करने के लिए टैप करें", "show_balance_toast": "संतुलन को छिपाने या दिखाने के लिए लॉन्ग प्रेस", "show_details": "विवरण दिखाएं", "show_keys": "बीज / कुंजियाँ दिखाएँ", diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index db714439e4..690320164c 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -871,6 +871,7 @@ "show": "Pokazati", "show_address_book_popup": "Prikaži Popup adresara", "show_balance": "Dugački pritisak za pokazivanje ravnoteže", + "show_balance_send_page": "Dodirnite za otkrivanje", "show_balance_toast": "Dugo pritisnite da biste sakrili ili pokazali ravnotežu", "show_details": "Prikaži pojedinosti", "show_keys": "Prikaži pristupni izraz/ključ", diff --git a/res/values/strings_hy.arb b/res/values/strings_hy.arb index 694a01ddf8..f46b6a79dd 100644 --- a/res/values/strings_hy.arb +++ b/res/values/strings_hy.arb @@ -869,6 +869,7 @@ "show": "Ցուցահանդես", "show_address_book_popup": "Show ուցադրել հասցեի գրքի թռուցիկ", "show_balance": "Երկար մամուլ, հավասարակշռությունը ցույց տալու համար", + "show_balance_send_page": "Հպեք՝ բացահայտելու համար", "show_balance_toast": "Երկար սեղմեք `հավասարակշռությունը թաքցնելու կամ ցույց տալու համար", "show_details": "Ցուցադրել մանրամասներ", "show_keys": "Ցուցադրել բանալիներ", diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index c6e197261d..959dfbf1ed 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -874,6 +874,7 @@ "show": "Menunjukkan", "show_address_book_popup": "Tampilkan Alamat Buku Popup", "show_balance": "PRESS PANJANG UNTUK MENUNJUKKAN Balance", + "show_balance_send_page": "Ketuk untuk mengungkapkan", "show_balance_toast": "Tekan panjang untuk menyembunyikan atau menunjukkan keseimbangan", "show_details": "Tampilkan Rincian", "show_keys": "Tampilkan seed/kunci", diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index 603c862a08..cae8f9e448 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -872,6 +872,7 @@ "show": "Mostra", "show_address_book_popup": "Mostra popup della rubrica", "show_balance": "Tieni premuto per mostrare l'importo", + "show_balance_send_page": "Tocca per rivelare", "show_balance_toast": "Tieni premuto per nascondere o mostrare l'importo", "show_details": "Mostra dettagli", "show_keys": "Mostra seme/chiavi", diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 9b47ef5f6d..97ef756ee2 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -872,6 +872,7 @@ "show": "見せる", "show_address_book_popup": "アドレス帳のポップアップを表示します", "show_balance": "バランスを示すためにロングプレス", + "show_balance_send_page": "タップして表示します", "show_balance_toast": "バランスを隠したり表示したりするためにロングプレス", "show_details": "詳細を表示", "show_keys": "シード/キーを表示する", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index be7f2106bd..00d4ea975b 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -872,6 +872,7 @@ "show": "표시", "show_address_book_popup": "주소록 팝업 표시", "show_balance": "길게 눌러 잔액 표시", + "show_balance_send_page": "공개하려면 탭하세요.", "show_balance_toast": "길게 눌러 잔액 숨기기 또는 표시", "show_details": "세부 정보 표시", "show_keys": "시드/키 표시", diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index 2507dda1d4..43203af87f 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -871,6 +871,7 @@ "show": "ပြသ", "show_address_book_popup": "လိပ်စာစာအုပ် popup ပြပါ", "show_balance": "ချိန်ခွင်လျှာကိုပြသရန်ရှည်လျားသောစာနယ်ဇင်း", + "show_balance_send_page": "ထုတ်ဖေါ်ဖို့ကိုအသာပုတ်ပါ", "show_balance_toast": "ချိန်ခွင်လျှာကိုဖျောက်ရန်သို့မဟုတ်ပြသရန်ရှည်လျားသောစာနယ်ဇင်း", "show_details": "အသေးစိတ်ပြ", "show_keys": "မျိုးစေ့ /သော့များကို ပြပါ။", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 056908f1b0..26ddf31dd8 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -871,6 +871,7 @@ "show": "Show", "show_address_book_popup": "Toon adresboek pop -up", "show_balance": "Lange pers om evenwicht te tonen", + "show_balance_send_page": "Tik om te onthullen", "show_balance_toast": "Lange pers om evenwicht te verbergen of te tonen", "show_details": "Toon details", "show_keys": "Toon zaad/sleutels", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index c2509f821b..fcf9d5c607 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -366,8 +366,8 @@ "estimated_new_fee": "Szacowana nowa opłata", "estimated_receive_amount": "Szacowana kwota otrzymania", "eta": "ETA", - "etherscan_history": "Historia Etherscan", "ethereum_ecosystem": "Ekosystem Ethereum", + "etherscan_history": "Historia Etherscan", "event": "Zdarzenie", "events": "Zdarzenia", "exchange": "Wymiana", @@ -870,6 +870,7 @@ "show": "Pokaż", "show_address_book_popup": "Pokaż wyskakujące okno książki adresowej", "show_balance": "Przytrzymaj, aby wyświetlić saldo", + "show_balance_send_page": "Kliknij, aby odsłonić", "show_balance_toast": "Przytrzymaj, aby ukryć lub pokazać saldo", "show_details": "Pokaż Szczegóły", "show_keys": "Pokaż seed/klucze", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index e1b7d4c5a9..08afd17c31 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -873,6 +873,7 @@ "show": "Mostrar", "show_address_book_popup": "Mostrar pop -up de livro de endereços", "show_balance": "Pressione há muito tempo para mostrar o equilíbrio", + "show_balance_send_page": "Toque para revelar", "show_balance_toast": "Pressione há muito tempo para se esconder ou mostrar equilíbrio", "show_details": "Mostrar detalhes", "show_keys": "Mostrar semente/chaves", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 5993fd530a..257998488d 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -872,6 +872,7 @@ "show": "Показывать", "show_address_book_popup": "Показать адресную книгу всплывающее окно", "show_balance": "Длинная пресса, чтобы показать баланс", + "show_balance_send_page": "Нажмите, чтобы открыть", "show_balance_toast": "Длинная нажавка, чтобы скрыть или показать баланс", "show_details": "Показать детали", "show_keys": "Показать мнемоническую фразу/ключи", diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index d5887fd734..c45a125593 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -871,6 +871,7 @@ "show": "แสดง", "show_address_book_popup": "แสดงสมุดที่อยู่ป๊อปอัพ", "show_balance": "กดยาวเพื่อแสดงความสมดุล", + "show_balance_send_page": "แตะเพื่อเปิดเผย", "show_balance_toast": "กดนานเพื่อซ่อนหรือแสดงความสมดุล", "show_details": "แสดงรายละเอียด", "show_keys": "แสดงซีด/คีย์", diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb index 97712fdba3..05cb2aacb9 100644 --- a/res/values/strings_tl.arb +++ b/res/values/strings_tl.arb @@ -871,6 +871,7 @@ "show": "Ipakita", "show_address_book_popup": "Ipakita ang Address Book Popup", "show_balance": "Mahabang pindutin upang ipakita ang balanse", + "show_balance_send_page": "Tapikin upang ibunyag", "show_balance_toast": "Mahabang pindutin upang itago o ipakita ang balanse", "show_details": "Ipakita ang mga detalye", "show_keys": "Ipakita ang mga seed/key", diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index be2dd8fd7d..eb05ccb526 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -871,6 +871,7 @@ "show": "Göstermek", "show_address_book_popup": "Adres Kitabı Popup'ı Göster", "show_balance": "Dengeyi Göstermek İçin Uzun Basın", + "show_balance_send_page": "Ortaya çıkarmak için dokunun", "show_balance_toast": "Dengeyi gizlemek veya göstermek için uzun basın", "show_details": "Detayları Göster", "show_keys": "Tohumları/anahtarları göster", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index e64086e271..475d2764a9 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -872,6 +872,7 @@ "show": "Показувати", "show_address_book_popup": "Показати спливаюче вікно адреси книги", "show_balance": "Довга преса, щоб показати рівновагу", + "show_balance_send_page": "Торкніться, щоб відкрити", "show_balance_toast": "Довга преса, щоб приховати або показати рівновагу", "show_details": "Показати деталі", "show_keys": "Показати мнемонічну фразу/ключі", diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index 5190195d15..5fd0c22f0e 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -873,6 +873,7 @@ "show": "دکھائیں", "show_address_book_popup": "ایڈریس بک پاپ اپ دکھائیں", "show_balance": "توازن ظاہر کرنے کے لئے طویل پریس", + "show_balance_send_page": "ظاہر کرنے کے لئے ٹیپ کریں", "show_balance_toast": "توازن چھپانے یا ظاہر کرنے کے لئے طویل پریس", "show_details": "تفصیلات دکھائیں", "show_keys": "بیج / چابیاں دکھائیں۔", diff --git a/res/values/strings_vi.arb b/res/values/strings_vi.arb index 4f3abc8de6..f593c26f5c 100644 --- a/res/values/strings_vi.arb +++ b/res/values/strings_vi.arb @@ -868,6 +868,7 @@ "show": "Trình diễn", "show_address_book_popup": "Hiển thị cửa sổ bật lên sổ sách địa chỉ", "show_balance": "Báo chí dài để hiển thị sự cân bằng", + "show_balance_send_page": "Nhấn để tiết lộ", "show_balance_toast": "Nhấn dài để ẩn hoặc hiển thị sự cân bằng", "show_details": "Hiển thị chi tiết", "show_keys": "Hiển thị hạt giống/khóa", diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index ef80e77a0a..0292f1c2b4 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -872,6 +872,7 @@ "show": "Fihan", "show_address_book_popup": "Fihan Agbejade Iwe Adirẹsi", "show_balance": "Tẹ Tẹ lati ṣafihan iwọntunwọnsi", + "show_balance_send_page": "Fọwọ ba lati ṣafihan", "show_balance_toast": "Tẹ Tẹ lati tọju tabi ṣafihan iwọntunwọnsi", "show_details": "Fi ìsọfúnni kékeré hàn", "show_keys": "Wo hóró / àwọn kọ́kọ́rọ́", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index ba602b0241..0456e4dfc8 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -871,6 +871,7 @@ "show": "展示", "show_address_book_popup": "显示地址簿弹出", "show_balance": "长印刷以显示平衡", + "show_balance_send_page": "点击即可显示", "show_balance_toast": "长按以隐藏或显示平衡", "show_details": "显示详细信息", "show_keys": "显示种子/密钥", From c552ab86d25307959d0326a963f4c223947d2f10 Mon Sep 17 00:00:00 2001 From: Serhii Date: Fri, 21 Nov 2025 23:45:19 +0200 Subject: [PATCH 066/105] Cw 1294 fix xo swaps bug (#2645) * Improve currency parsing with tag support * changenow currency parsing fix * exolix currency parsing fix * letsExchange currency parsing fix * stealth currency parsing fix * trocador currency parsing fix --------- Co-authored-by: Omar Hatem --- cw_core/lib/crypto_currency.dart | 17 ++- cw_evm/lib/evm_chain_wallet.dart | 8 +- cw_solana/lib/solana_wallet.dart | 8 +- cw_tron/lib/tron_wallet.dart | 9 +- .../provider/changenow_exchange_provider.dart | 20 ++-- .../provider/exolix_exchange_provider.dart | 17 ++- .../letsexchange_exchange_provider.dart | 27 +++-- .../stealth_ex_exchange_provider.dart | 41 ++++--- .../provider/trocador_exchange_provider.dart | 21 ++-- .../provider/xoswap_exchange_provider.dart | 104 +++++++++++++++++- 10 files changed, 218 insertions(+), 54 deletions(-) diff --git a/cw_core/lib/crypto_currency.dart b/cw_core/lib/crypto_currency.dart index 0857c0072d..952d7c08ad 100644 --- a/cw_core/lib/crypto_currency.dart +++ b/cw_core/lib/crypto_currency.dart @@ -1,5 +1,6 @@ import 'package:cw_core/currency.dart'; import 'package:cw_core/enumerable_item.dart'; +import 'package:collection/collection.dart'; class CryptoCurrency extends EnumerableItem with Serializable implements Currency { const CryptoCurrency({ @@ -336,9 +337,23 @@ class CryptoCurrency extends EnumerableItem with Serializable implemen return CryptoCurrency._fullNameCurrencyMap[name.split("(").first.trim().toLowerCase()]!; } - static CryptoCurrency? safeParseCurrencyFromString(String? raw, {CryptoCurrency? walletCurrency}) { + static CryptoCurrency? safeParseCurrencyFromString( + String? raw, { + String? tag, + CryptoCurrency? walletCurrency, + }) { if (raw == null || raw.isEmpty) return null; + if (tag != null && tag.isNotEmpty) { + final match = CryptoCurrency.all.firstWhereOrNull( + (e) => + e.title.toUpperCase() == raw.toUpperCase() && + e.tag?.toUpperCase() == tag.toUpperCase(), + ); + if (match != null) return match; + return null; + } + try { return CryptoCurrency.fromString(raw, walletCurrency: walletCurrency); } catch (_) {} diff --git a/cw_evm/lib/evm_chain_wallet.dart b/cw_evm/lib/evm_chain_wallet.dart index 0db8781c7a..b03b180df5 100644 --- a/cw_evm/lib/evm_chain_wallet.dart +++ b/cw_evm/lib/evm_chain_wallet.dart @@ -476,8 +476,12 @@ abstract class EVMChainWalletBase '0x${opReturnMemo.codeUnits.map((char) => char.toRadixString(16).padLeft(2, '0')).join()}'; } - final CryptoCurrency transactionCurrency = - balance.keys.firstWhere((element) => element.title == _credentials.currency.title); + final transactionCurrency = balance.keys.firstWhere( + (currency) => + currency.title == _credentials.currency.title && + currency.tag == _credentials.currency.tag, + orElse: () => throw Exception( + 'Currency ${_credentials.currency.title} ${_credentials.currency.tag} is not accessible in the wallet, try to enable it first.')); final currencyBalance = balance[transactionCurrency]!; BigInt totalAmount = BigInt.zero; diff --git a/cw_solana/lib/solana_wallet.dart b/cw_solana/lib/solana_wallet.dart index 49af6deca0..8bb094ea78 100644 --- a/cw_solana/lib/solana_wallet.dart +++ b/cw_solana/lib/solana_wallet.dart @@ -226,8 +226,12 @@ abstract class SolanaWalletBase await _updateBalance(); - final CryptoCurrency transactionCurrency = - balance.keys.firstWhere((element) => element.title == solCredentials.currency.title); + final transactionCurrency = balance.keys.firstWhere( + (currency) => + currency.title == credentials.currency.title && + currency.tag == credentials.currency.tag, + orElse: () => throw Exception( + 'Currency ${credentials.currency.title} ${credentials.currency.tag} is not accessible in the wallet, try to enable it first.')); final walletBalanceForCurrency = balance[transactionCurrency]!.balance; diff --git a/cw_tron/lib/tron_wallet.dart b/cw_tron/lib/tron_wallet.dart index 80afb2f8ee..393c8ff979 100644 --- a/cw_tron/lib/tron_wallet.dart +++ b/cw_tron/lib/tron_wallet.dart @@ -312,8 +312,13 @@ abstract class TronWalletBase final hasMultiDestination = outputs.length > 1; - final CryptoCurrency transactionCurrency = - balance.keys.firstWhere((element) => element.title == tronCredentials.currency.title); + final transactionCurrency = balance.keys.firstWhere( + (currency) => + currency.title == tronCredentials.currency.title && + currency.tag == tronCredentials.currency.tag, + orElse: () => throw Exception( + 'Currency ${tronCredentials.currency.title} ${tronCredentials.currency.tag} is not accessible in the wallet, try to enable it first.')); + final walletBalanceForCurrency = balance[transactionCurrency]!.balance; diff --git a/lib/exchange/provider/changenow_exchange_provider.dart b/lib/exchange/provider/changenow_exchange_provider.dart index 8f6e7bc7c5..fef639b425 100644 --- a/lib/exchange/provider/changenow_exchange_provider.dart +++ b/lib/exchange/provider/changenow_exchange_provider.dart @@ -278,12 +278,21 @@ class ChangeNowExchangeProvider extends ExchangeProvider { throw Exception('Unexpected http status: ${response.statusCode}'); final responseJSON = json.decode(response.body) as Map; + + // Parsing 'from' currency final fromCurrency = responseJSON['fromCurrency'] as String; final fromNetwork = responseJSON['fromNetwork'] as String?; - final from = CryptoCurrency.safeParseCurrencyFromString(fromCurrency); + final _normalizedFromNetwork = _normalizeNetworkType(fromNetwork ?? ''); + final fromTag = fromCurrency == _normalizedFromNetwork ? null : _normalizedFromNetwork; + final from = CryptoCurrency.safeParseCurrencyFromString(fromCurrency, tag: fromTag); + + // Parsing 'to' currency final toCurrency = responseJSON['toCurrency'] as String; final toNetwork = responseJSON['toNetwork'] as String?; - final to = CryptoCurrency.safeParseCurrencyFromString(toCurrency); + final _normalizedToNetwork = _normalizeNetworkType(toNetwork ?? ''); + final toTag = toCurrency == _normalizedToNetwork ? null : _normalizedToNetwork; + final to = CryptoCurrency.safeParseCurrencyFromString(toCurrency, tag: toTag); + final inputAddress = responseJSON['payinAddress'] as String; final expectedSendAmount = responseJSON['expectedAmountFrom'].toString(); final status = responseJSON['status'] as String; @@ -294,9 +303,6 @@ class ChangeNowExchangeProvider extends ExchangeProvider { final payoutAddress = responseJSON['payoutAddress'] as String; final expiredAt = DateTime.tryParse(expiredAtRaw ?? '')?.toLocal(); - final _normalizedFromNetwork = _normalizeNetworkType(fromNetwork ?? ''); - final _normalizedToNetwork = _normalizeNetworkType(toNetwork ?? ''); - return Trade( id: id, from: from, @@ -309,8 +315,8 @@ class ChangeNowExchangeProvider extends ExchangeProvider { expiredAt: expiredAt, outputTransaction: outputTransaction, payoutAddress: payoutAddress, - userCurrencyFromRaw: '${fromCurrency.toUpperCase()}' + '_' + '${_normalizedFromNetwork.toUpperCase()}', - userCurrencyToRaw: '${toCurrency.toUpperCase()}' + '_' + '${_normalizedToNetwork.toUpperCase()}', + userCurrencyFromRaw: '${fromCurrency.toUpperCase()}' + '_' + '${fromTag?.toUpperCase() ?? ''}', + userCurrencyToRaw: '${toCurrency.toUpperCase()}' + '_' + '${toTag?.toUpperCase() ?? ''}', ); } diff --git a/lib/exchange/provider/exolix_exchange_provider.dart b/lib/exchange/provider/exolix_exchange_provider.dart index 252222b312..645426de07 100644 --- a/lib/exchange/provider/exolix_exchange_provider.dart +++ b/lib/exchange/provider/exolix_exchange_provider.dart @@ -360,10 +360,19 @@ class ExolixExchangeProvider extends ExchangeProvider { throw Exception('Unexpected http status: ${response.statusCode}'); final responseJSON = json.decode(response.body) as Map; + + // Parsing 'from' currency final coinFrom = responseJSON['coinFrom']['coinCode'] as String; final coinFromNetwork = responseJSON['coinFrom']['network'] as String?; + final fromTag = coinFrom == coinFromNetwork ? null : coinFromNetwork; + final from = CryptoCurrency.safeParseCurrencyFromString(coinFrom, tag: fromTag); + + // Parsing 'to' currency final coinTo = responseJSON['coinTo']['coinCode'] as String; final coinToNetwork = responseJSON['coinTo']['network'] as String?; + final toTag = coinTo == coinToNetwork ? null : coinToNetwork; + final to = CryptoCurrency.safeParseCurrencyFromString(coinTo, tag: toTag); + final inputAddress = responseJSON['depositAddress'] as String; final amount = responseJSON['amount'].toString(); final status = responseJSON['status'] as String; @@ -373,8 +382,8 @@ class ExolixExchangeProvider extends ExchangeProvider { return Trade( id: id, - from: CryptoCurrency.safeParseCurrencyFromString(coinFrom), - to: CryptoCurrency.safeParseCurrencyFromString(coinTo), + from: from, + to: to, provider: description, inputAddress: inputAddress, amount: amount, @@ -382,8 +391,8 @@ class ExolixExchangeProvider extends ExchangeProvider { extraId: extraId, outputTransaction: outputTransaction, payoutAddress: payoutAddress, - userCurrencyFromRaw: '${coinFrom.toUpperCase()}' + '_' + '${coinFromNetwork ?? ''}', - userCurrencyToRaw: '${coinTo.toUpperCase()}' + '_' + '${coinToNetwork ?? ''}', + userCurrencyFromRaw: '${coinFrom.toUpperCase()}' + '_' + '${fromTag?.toUpperCase() ?? ''}', + userCurrencyToRaw: '${coinTo.toUpperCase()}' + '_' + '${toTag?.toUpperCase() ?? ''}', ); } diff --git a/lib/exchange/provider/letsexchange_exchange_provider.dart b/lib/exchange/provider/letsexchange_exchange_provider.dart index d37c6a207c..fe9aebd12c 100644 --- a/lib/exchange/provider/letsexchange_exchange_provider.dart +++ b/lib/exchange/provider/letsexchange_exchange_provider.dart @@ -348,10 +348,22 @@ class LetsExchangeExchangeProvider extends ExchangeProvider { throw Exception('LetsExchange fetch trade failed: ${response.body}'); } final responseJSON = json.decode(response.body) as Map; - final from = responseJSON['coin_from'] as String; + + // Parsing 'from' currency + final fromCurrency = responseJSON['coin_from'] as String; final fromNetwork = responseJSON['coin_from_network'] as String?; - final to = responseJSON['coin_to'] as String; + final normalizedFromNetwork = _normalizeNetworkType(fromNetwork ?? ''); + final fromTag = fromCurrency == normalizedFromNetwork ? null : normalizedFromNetwork; + final from = CryptoCurrency.safeParseCurrencyFromString(fromCurrency, tag: fromTag); + + // Parsing 'to' currency + final toCurrency = responseJSON['coin_to'] as String; final toNetwork = responseJSON['coin_to_network'] as String?; + final normalizedToNetwork = _normalizeNetworkType(toNetwork ?? ''); + final toTag = toCurrency == normalizedToNetwork ? null : normalizedToNetwork; + final to = CryptoCurrency.safeParseCurrencyFromString(toCurrency, tag: toTag); + + final payoutAddress = responseJSON['withdrawal'] as String; final depositAddress = responseJSON['deposit'] as String; final refundAddress = responseJSON['return'] as String; @@ -365,13 +377,10 @@ class LetsExchangeExchangeProvider extends ExchangeProvider { final createdAt = DateTime.parse(createdAtString).toLocal(); final expiredAt = DateTime.fromMillisecondsSinceEpoch(expiredAtTimestamp * 1000).toLocal(); - final normalizedFromNetwork = _normalizeNetworkType(fromNetwork ?? ''); - final normalizedToNetwork = _normalizeNetworkType(toNetwork ?? ''); - return Trade( id: id, - from: CryptoCurrency.safeParseCurrencyFromString(from), - to: CryptoCurrency.safeParseCurrencyFromString(to), + from: from, + to: to, provider: description, inputAddress: depositAddress, payoutAddress: payoutAddress, @@ -383,8 +392,8 @@ class LetsExchangeExchangeProvider extends ExchangeProvider { expiredAt: expiredAt, isRefund: status == 'refund', extraId: extraId, - userCurrencyFromRaw: '$from' + '_' + normalizedFromNetwork, - userCurrencyToRaw: '$to' + '_' + '$normalizedToNetwork', + userCurrencyFromRaw: '${fromCurrency.toUpperCase()}' + '_' + '${fromTag?.toUpperCase() ?? ''}', + userCurrencyToRaw: '${toCurrency.toUpperCase()}' + '_' + '${toTag?.toUpperCase() ?? ''}', ); } diff --git a/lib/exchange/provider/stealth_ex_exchange_provider.dart b/lib/exchange/provider/stealth_ex_exchange_provider.dart index d23c0999c8..b87903fe71 100644 --- a/lib/exchange/provider/stealth_ex_exchange_provider.dart +++ b/lib/exchange/provider/stealth_ex_exchange_provider.dart @@ -74,8 +74,8 @@ class StealthExExchangeProvider extends ExchangeProvider { throw Exception('StealthEx fetch limits failed: ${response.body}'); } final responseJSON = json.decode(response.body) as Map; - final min = toDouble(responseJSON['min_amount']); - final max = responseJSON['max_amount'] as double?; + final min = _toDouble(responseJSON['min_amount']); + final max = _toDouble(responseJSON['max_amount']); return Limits(min: min, max: max); } catch (e) { log(e.toString()); @@ -230,8 +230,8 @@ class StealthExExchangeProvider extends ExchangeProvider { final payoutAddress = withdrawal['address'] as String; final depositAddress = deposit['address'] as String; final refundAddress = responseJSON['refund_address'] as String; - final depositAmount = toDouble(deposit['amount']); - final receiveAmount = toDouble(withdrawal['amount']); + final depositAmount = _toDouble(deposit['amount']); + final receiveAmount = _toDouble(withdrawal['amount']); final status = responseJSON['status'] as String; final createdAtString = responseJSON['created_at'] as String; final extraId = deposit['extra_id'] as String?; @@ -342,15 +342,24 @@ class StealthExExchangeProvider extends ExchangeProvider { final withdrawal = responseJSON['withdrawal'] as Map; final respId = responseJSON['id'] as String; - final from = deposit['symbol'] as String; + + // Parsing 'from' currency with network tag + final fromCurrency = deposit['symbol'] as String; final fromNetwork = deposit['network'] as String?; - final to = withdrawal['symbol'] as String; + final fromTag = fromNetwork == 'mainnet' ? null : fromNetwork; + final from = CryptoCurrency.safeParseCurrencyFromString(fromCurrency, tag: fromTag); + + // Parsing 'to' currency with network tag + final toCurrency = withdrawal['symbol'] as String; final toNetwork = withdrawal['network'] as String?; + final toTag = toNetwork == 'mainnet' ? null : toNetwork; + final to = CryptoCurrency.safeParseCurrencyFromString(toCurrency, tag: toTag); + final payoutAddress = withdrawal['address'] as String; final depositAddress = deposit['address'] as String; final refundAddress = responseJSON['refund_address'] as String; - final depositAmount = toDouble(deposit['amount']); - final receiveAmount = toDouble(withdrawal['amount']); + final depositAmount = _toDouble(deposit['amount']); + final receiveAmount = _toDouble(withdrawal['amount']); final status = responseJSON['status'] as String; final createdAtString = responseJSON['created_at'] as String; final createdAt = DateTime.parse(createdAtString).toLocal(); @@ -358,8 +367,8 @@ class StealthExExchangeProvider extends ExchangeProvider { return Trade( id: respId, - from: CryptoCurrency.safeParseCurrencyFromString(from), - to: CryptoCurrency.safeParseCurrencyFromString(to), + from: from, + to: to, provider: description, inputAddress: depositAddress, payoutAddress: payoutAddress, @@ -370,8 +379,8 @@ class StealthExExchangeProvider extends ExchangeProvider { createdAt: createdAt, isRefund: status == 'refunded', extraId: extraId, - userCurrencyFromRaw: '${from.toUpperCase()}' + '_' + '${fromNetwork?.toUpperCase() ?? ''}', - userCurrencyToRaw: '${to.toUpperCase()}' + '_' + '${toNetwork?.toUpperCase() ?? ''}', + userCurrencyFromRaw: '${fromCurrency.toUpperCase()}' + '_' + '${fromTag?.toUpperCase() ?? ''}', + userCurrencyToRaw: '${toCurrency.toUpperCase()}' + '_' + '${toTag?.toUpperCase() ?? ''}', ); } @@ -414,16 +423,18 @@ class StealthExExchangeProvider extends ExchangeProvider { } } - double toDouble(dynamic value) { + static double? _toDouble(dynamic value) { if (value is int) { return value.toDouble(); } else if (value is double) { return value; - } else { - return 0.0; + } else if (value is String) { + return double.tryParse(value); } + return null; } + String _getName(CryptoCurrency currency) { if (currency == CryptoCurrency.usdcEPoly) return 'usdce'; return currency.title.toLowerCase(); diff --git a/lib/exchange/provider/trocador_exchange_provider.dart b/lib/exchange/provider/trocador_exchange_provider.dart index 65dcfe0a77..fbb86872e6 100644 --- a/lib/exchange/provider/trocador_exchange_provider.dart +++ b/lib/exchange/provider/trocador_exchange_provider.dart @@ -420,15 +420,22 @@ class TrocadorExchangeProvider extends ExchangeProvider { final providerName = responseJSON['provider'] as String; final addressProviderMemo = responseJSON['address_provider_memo'] as String?; - final from = responseJSON['ticker_from'] as String; - final networkFrom = responseJSON['network_from'] as String?; - final to = responseJSON['ticker_to'] as String; + final fromCurrency = responseJSON['ticker_from'] as String; + final fromNetwork = responseJSON['network_from'] as String?; + final _normalizedFromNetwork = _normalizeNetworkType(fromNetwork ?? ''); + final fromTag = _normalizedFromNetwork.isEmpty || _normalizedFromNetwork == 'Mainnet' ? null : _normalizedFromNetwork; + final from = CryptoCurrency.safeParseCurrencyFromString(fromCurrency, tag: fromTag); + + final toCurrency = responseJSON['ticker_to'] as String; final networkTo = responseJSON['network_to'] as String?; + final _normalizedToNetwork = _normalizeNetworkType(networkTo ?? ''); + final toTag = _normalizedToNetwork.isEmpty || _normalizedToNetwork == 'Mainnet' ? null : _normalizedToNetwork; + final to = CryptoCurrency.safeParseCurrencyFromString(toCurrency, tag: toTag); return Trade( id: id, - from: CryptoCurrency.safeParseCurrencyFromString(from), - to: CryptoCurrency.safeParseCurrencyFromString(to), + from: from, + to: to, provider: description, inputAddress: inputAddress, refundAddress: refundAddress, @@ -440,8 +447,8 @@ class TrocadorExchangeProvider extends ExchangeProvider { providerId: providerId, providerName: providerName, extraId: addressProviderMemo, - userCurrencyFromRaw: '${from.toUpperCase()}' + '_' + _normalizeNetworkType(networkFrom ?? ''), - userCurrencyToRaw: '${to.toUpperCase()}' + '_' + _normalizeNetworkType(networkTo ?? ''), // Handle null network + userCurrencyFromRaw: '${fromCurrency.toUpperCase()}' + '_' + '${fromTag?.toUpperCase() ?? ''}', + userCurrencyToRaw: '${toCurrency.toUpperCase()}' + '_' + '${toTag?.toUpperCase() ?? ''}', ); }); } diff --git a/lib/exchange/provider/xoswap_exchange_provider.dart b/lib/exchange/provider/xoswap_exchange_provider.dart index b9d4aed136..35e0d9184f 100644 --- a/lib/exchange/provider/xoswap_exchange_provider.dart +++ b/lib/exchange/provider/xoswap_exchange_provider.dart @@ -43,8 +43,41 @@ class XOSwapExchangeProvider extends ExchangeProvider { 'LTC': 'litecoin', 'EOS': 'eosio', 'XLM': 'stellar', + 'BASE': 'basemainnet', }; - + + static const supportedTags = [ + 'POL', + 'ETH', + 'BTC', + 'BSC', + 'SOL', + 'TRX', + 'ZEC', + 'ADA', + 'DOGE', + 'XMR', + 'BCH', + 'BSV', + 'XRP', + 'LTC', + 'EOS', + 'XLM', + 'BASE', + ]; + + + String _normalizeXOSwapsNetwork(String string) { + final lower = string.toLowerCase(); + + if (lower.endsWith('matic0a883d9b')) return string.replaceFirst(RegExp(r'matic0a883d9b$', caseSensitive: false), 'POL'); + if (lower.endsWith('matic86e249c1')) return string.replaceFirst(RegExp(r'matic86e249c1$', caseSensitive: false), 'POL'); + if (lower.endsWith('bscddedf0f8')) return string.replaceFirst(RegExp(r'bscddedf0f8$', caseSensitive: false), 'BSC'); + if (lower.endsWith('basemainnetb5a52617')) return string.replaceFirst(RegExp(r'basemainnetb5a52617$', caseSensitive: false), 'BASE'); + + return string; + } + @override String get title => 'XOSwap'; @@ -422,9 +455,46 @@ class XOSwapExchangeProvider extends ExchangeProvider { final pairId = responseJSON['pairId'] as String; final pairParts = pairId.split('_'); final fromAsset = pairParts.isNotEmpty ? pairParts[0] : ''; + final normalizedFromAsset = _normalizeXOSwapsNetwork(fromAsset); + String? fromAssetTag = _extractTagFromAsset(normalizedFromAsset); + + String fromAssetBase = fromAssetTag != null + ? normalizedFromAsset.substring(0, normalizedFromAsset.length - fromAssetTag.length) + : normalizedFromAsset; + + // Special case for USDT defaulting to ETH tag + if (fromAssetBase == 'USDT' && fromAssetTag == null) { + fromAssetTag = 'ETH'; + } + + // Special case for BASE defaulting to BASE tag + if (fromAssetBase == 'BASE' && fromAssetTag == null) { + fromAssetTag = 'BASE'; + fromAssetBase = 'ETH'; + } + final toAsset = pairParts.length > 1 ? pairParts[1] : ''; - final fromCurrency = CryptoCurrency.safeParseCurrencyFromString(fromAsset); - final toCurrency = CryptoCurrency.safeParseCurrencyFromString(toAsset); + final normalizedToAsset = _normalizeXOSwapsNetwork(toAsset); + String? toAssetTag = _extractTagFromAsset(normalizedToAsset); + + String toAssetBase = toAssetTag != null + ? normalizedToAsset.substring(0, normalizedToAsset.length - toAssetTag.length) + : normalizedToAsset; + + // Special case for USDT defaulting to ETH tag + if (toAssetBase == 'USDT' && toAssetTag == null) { + toAssetTag = 'ETH'; + } + + // Special case for BASE defaulting to BASE tag + if (toAssetBase == 'BASE' && toAssetTag == null) { + toAssetTag = 'ETH'; + toAssetBase = 'BASE'; + } + + final fromCurrency = CryptoCurrency.safeParseCurrencyFromString(fromAssetBase,tag: fromAssetTag); + final toCurrency = CryptoCurrency.safeParseCurrencyFromString(toAssetBase,tag: toAssetTag); + final amount = responseJSON['amount'] as Map; final toAmount = responseJSON['toAmount'] as Map; @@ -439,6 +509,14 @@ class XOSwapExchangeProvider extends ExchangeProvider { final createdAt = DateTime.parse(createdAtString).toLocal(); final extraId = responseJSON['payInAddressTag'] as String?; + final userCurrencyFromRaw = fromCurrency != null + ? '${fromCurrency.title}' + '_' + '${fromCurrency.tag ?? ''}' + : '${fromAssetBase}' + '_' + '${fromAssetTag ?? ''}'; + + final userCurrencyToRaw = toCurrency != null + ? '${toCurrency.title}' + '_' + '${toCurrency.tag ?? ''}' + : '${toAssetBase}' + '_' + '${toAssetTag ?? ''}'; + return Trade( id: orderId, from: fromCurrency, @@ -452,8 +530,8 @@ class XOSwapExchangeProvider extends ExchangeProvider { receiveAmount: receiveAmount, payoutAddress: payoutAddress, extraId: extraId, - userCurrencyFromRaw: '$fromAsset' + '_', - userCurrencyToRaw: '$toAsset' + '_', + userCurrencyFromRaw: userCurrencyFromRaw, + userCurrencyToRaw: userCurrencyToRaw, ); } catch (e) { printV(e.toString()); @@ -461,6 +539,22 @@ class XOSwapExchangeProvider extends ExchangeProvider { } } + // ensure something remains before tag (at least 2 chars) + String? _extractTagFromAsset(String asset) { + + + + for (final tag in supportedTags) { + if (asset.endsWith(tag)) { + final prefixLength = asset.length - tag.length; + if (prefixLength >= 2) { + return tag; + } + } + } + return null; + } + double _toDouble(dynamic value) { if (value is int) { return value.toDouble(); From ccfe424b28a39abb4dd5f8e84789da5a3b5d98b8 Mon Sep 17 00:00:00 2001 From: Serhii Date: Sat, 22 Nov 2025 00:05:15 +0200 Subject: [PATCH 067/105] CW-1186-Show-the-fiat-amount-for-UTXOs-in-coin-control (#2595) * Add fiat amount display to unspent coins list * refactor fiat amount handling for unspent coins * Update lib/view_model/unspent_coins/unspent_coins_list_view_model.dart [skip ci] --------- Co-authored-by: Omar Hatem --- lib/di.dart | 2 + .../unspent_coins_list_page.dart | 48 ++++++++++--------- .../widgets/unspent_coins_list_item.dart | 18 +++++++ .../unspent_coins_list_view_model.dart | 37 +++++++++++++- 4 files changed, 82 insertions(+), 23 deletions(-) diff --git a/lib/di.dart b/lib/di.dart index fde64bd72d..90b8a5ba4a 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -1428,6 +1428,8 @@ Future setup({ return UnspentCoinsListViewModel( wallet: wallet!, unspentCoinsInfo: _unspentCoinsInfoSource, + fiatConversationStore: getIt.get(), + settingsStore: getIt.get(), coinTypeToSpendFrom: coinTypeToSpendFrom ?? UnspentCoinType.any, ); }); diff --git a/lib/src/screens/unspent_coins/unspent_coins_list_page.dart b/lib/src/screens/unspent_coins/unspent_coins_list_page.dart index 3c47ea2035..70812dcd94 100644 --- a/lib/src/screens/unspent_coins/unspent_coins_list_page.dart +++ b/lib/src/screens/unspent_coins/unspent_coins_list_page.dart @@ -178,28 +178,32 @@ class UnspentCoinsListFormState extends State { itemBuilder: (_, int index) { final item = unspentCoinsListViewModel.items[index]; return Observer( - builder: (_) => GestureDetector( - onTap: () => Navigator.of(context).pushNamed( - Routes.unspentCoinsDetails, - arguments: [item, unspentCoinsListViewModel], - ), - child: UnspentCoinsListItem( - note: item.note, - amount: item.amount, - address: item.address, - isSending: item.isSending, - isFrozen: item.isFrozen, - isChange: item.isChange, - isSilentPayment: item.isSilentPayment, - onCheckBoxTap: item.isFrozen - ? null - : () async { - item.isSending = !item.isSending; - await unspentCoinsListViewModel - .saveUnspentCoinInfo(item); - }, - ), - ), + builder: (_) { + final fiatAmount = unspentCoinsListViewModel.fiatAmounts[item.hash] ?? ''; + return GestureDetector( + onTap: () => Navigator.of(context).pushNamed( + Routes.unspentCoinsDetails, + arguments: [item, unspentCoinsListViewModel], + ), + child: UnspentCoinsListItem( + note: item.note, + amount: item.amount, + fiatAmount: fiatAmount, + address: item.address, + isSending: item.isSending, + isFrozen: item.isFrozen, + isChange: item.isChange, + isSilentPayment: item.isSilentPayment, + onCheckBoxTap: item.isFrozen + ? null + : () async { + item.isSending = !item.isSending; + await unspentCoinsListViewModel + .saveUnspentCoinInfo(item); + }, + ), + ); + } ); }, ), diff --git a/lib/src/screens/unspent_coins/widgets/unspent_coins_list_item.dart b/lib/src/screens/unspent_coins/widgets/unspent_coins_list_item.dart index fd9dc0c6d0..d95fd13474 100644 --- a/lib/src/screens/unspent_coins/widgets/unspent_coins_list_item.dart +++ b/lib/src/screens/unspent_coins/widgets/unspent_coins_list_item.dart @@ -7,6 +7,7 @@ class UnspentCoinsListItem extends StatelessWidget { UnspentCoinsListItem({ required this.note, required this.amount, + required this.fiatAmount, required this.address, required this.isSending, required this.isFrozen, @@ -17,6 +18,7 @@ class UnspentCoinsListItem extends StatelessWidget { final String note; final String amount; + final String fiatAmount; final String address; final bool isSending; final bool isFrozen; @@ -108,6 +110,22 @@ class UnspentCoinsListItem extends StatelessWidget { ), ], ), + if (fiatAmount.isNotEmpty) + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AutoSizeText( + fiatAmount, + style: Theme.of(context).textTheme.bodyMedium!.copyWith( + color: amountColor, + fontSize: 1, + fontWeight: FontWeight.w600, + ), + maxLines: 1, + ), + ], + ), Expanded( child: Row( crossAxisAlignment: CrossAxisAlignment.center, diff --git a/lib/view_model/unspent_coins/unspent_coins_list_view_model.dart b/lib/view_model/unspent_coins/unspent_coins_list_view_model.dart index a5103fa337..deca2bc33e 100644 --- a/lib/view_model/unspent_coins/unspent_coins_list_view_model.dart +++ b/lib/view_model/unspent_coins/unspent_coins_list_view_model.dart @@ -1,5 +1,10 @@ import 'package:cake_wallet/bitcoin/bitcoin.dart'; +import 'package:cake_wallet/entities/calculate_fiat_amount_raw.dart'; +import 'package:cake_wallet/entities/fiat_api_mode.dart'; +import 'package:cake_wallet/entities/fiat_currency.dart'; import 'package:cake_wallet/monero/monero.dart'; +import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart'; +import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/utils/exception_handler.dart'; import 'package:cake_wallet/decred/decred.dart'; import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_item.dart'; @@ -27,13 +32,19 @@ abstract class UnspentCoinsListViewModelBase with Store { required this.wallet, required Box unspentCoinsInfo, this.coinTypeToSpendFrom = UnspentCoinType.any, + required FiatConversionStore fiatConversationStore, + required SettingsStore settingsStore, }) : _unspentCoinsInfo = unspentCoinsInfo, + _fiatConversationStore = fiatConversationStore, + _settingsStore = settingsStore, items = ObservableList(), _originalState = {}; @observable WalletBase, TransactionInfo> wallet; final Box _unspentCoinsInfo; + final FiatConversionStore _fiatConversationStore; + final SettingsStore _settingsStore; final UnspentCoinType coinTypeToSpendFrom; @observable @@ -47,6 +58,30 @@ abstract class UnspentCoinsListViewModelBase with Store { @computed bool get isAllSelected => items.every((element) => element.isFrozen || element.isSending); + @computed + FiatCurrency get fiatCurrency => _settingsStore.fiatCurrency; + + @computed + bool get isFiatDisabled => _settingsStore.fiatApiMode == FiatApiMode.disabled; + + @computed + Map get fiatAmounts { + + final currency = wallet.currency; + final price = _fiatConversationStore.prices[currency]; + if (price == null || price == 0.0 || isFiatDisabled) return {}; + + final result = {}; + for (final item in items) { + final formatted = formatAmountToString(item.value); + final cryptoAmount = double.tryParse(formatted.replaceAll(',', '')) ?? 0.0; + final fiatValue = price * cryptoAmount; + result[item.hash] = fiatCurrency.title + ' ' + fiatValue.toStringAsFixed(2); + } + + return result; + } + Future initialSetup() async { await _updateUnspents(); _storeOriginalState(); @@ -176,7 +211,7 @@ abstract class UnspentCoinsListViewModelBase with Store { .map((elem) { try { final existingItem = _unspentCoinsInfo.values - .firstWhereOrNull((item) => item.walletId == wallet.id && item == elem); + .firstWhereOrNull((item) => item.walletId == wallet.id && item == elem);; if (existingItem == null) return null; From a74c97faa2d6c5fddbeb24e997c469d755966c4b Mon Sep 17 00:00:00 2001 From: OmarHatem Date: Sat, 22 Nov 2025 00:50:38 +0100 Subject: [PATCH 068/105] remove wownero from available wallet types [skip ci] --- tool/configure.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tool/configure.dart b/tool/configure.dart index f04f009ef3..3e292cf072 100644 --- a/tool/configure.dart +++ b/tool/configure.dart @@ -2043,9 +2043,9 @@ Future generateWalletTypes({ outputContent += '\tWalletType.decred,\n'; } - if (hasWownero) { - outputContent += '\tWalletType.wownero,\n'; - } + // if (hasWownero) { + // outputContent += '\tWalletType.wownero,\n'; + // } outputContent += '];\n'; await walletTypesFile.writeAsString(outputContent); From 36aca6e6dae5b68071b917f23eeca7a5d20d63c6 Mon Sep 17 00:00:00 2001 From: cyan Date: Sat, 22 Nov 2025 11:37:43 -0300 Subject: [PATCH 069/105] deps: update tor to latest version, fix torch build issues (#2669) --- .github/workflows/pr_test_build_android.yml | 2 +- .github/workflows/pr_test_build_linux.yml | 2 +- scripts/prepare_torch.sh | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/pr_test_build_android.yml b/.github/workflows/pr_test_build_android.yml index 7d7a196c13..e83cd0ac71 100644 --- a/.github/workflows/pr_test_build_android.yml +++ b/.github/workflows/pr_test_build_android.yml @@ -201,7 +201,7 @@ jobs: run: | set -x -e pushd scripts - wget https://github.com/MrCyjaneK/torch_dart/releases/download/v1.0.4/torch_dart-v1.0.4.tar.gz -O torch_dart.tar.gz + wget https://github.com/MrCyjaneK/torch_dart/releases/download/v1.0.17/torch_dart-v1.0.17.tar.gz -O torch_dart.tar.gz mkdir torch_dart pushd torch_dart tar -xzf ../torch_dart.tar.gz diff --git a/.github/workflows/pr_test_build_linux.yml b/.github/workflows/pr_test_build_linux.yml index 92eae19db2..ae39a87c06 100644 --- a/.github/workflows/pr_test_build_linux.yml +++ b/.github/workflows/pr_test_build_linux.yml @@ -185,7 +185,7 @@ jobs: run: | set -x -e pushd scripts - wget https://github.com/MrCyjaneK/torch_dart/releases/download/v1.0.4/torch_dart-v1.0.4.tar.gz -O torch_dart.tar.gz + wget https://github.com/MrCyjaneK/torch_dart/releases/download/v1.0.17/torch_dart-v1.0.17.tar.gz -O torch_dart.tar.gz mkdir torch_dart pushd torch_dart tar -xzf ../torch_dart.tar.gz diff --git a/scripts/prepare_torch.sh b/scripts/prepare_torch.sh index 4520b86302..d918051141 100755 --- a/scripts/prepare_torch.sh +++ b/scripts/prepare_torch.sh @@ -5,9 +5,9 @@ cd "$(dirname "$0")" # IMPORTANT: Make sure to update action 'Build Torch` in # - .github/workflows/pr_test_build_android.yml # - .github/workflows/pr_test_build_linux.yml -# https://github.com/MrCyjaneK/torch_dart/releases/download/v1.0.4/torch_dart-v1.0.4.tar.gz +# https://github.com/MrCyjaneK/torch_dart/releases/download/v1.0.17/torch_dart-v1.0.17.tar.gz -HASH=8d22697df9d1e43ac98dd55087190bae17d32c05 +HASH=85130c85ad80f4596896f5fa4dc1a160cf0f0487 if [[ ! -d "torch_dart/.git" ]]; then From 1b354c70d22e67513c0e3967e7abbd8756421be6 Mon Sep 17 00:00:00 2001 From: Serhii Date: Sat, 22 Nov 2025 20:24:46 +0200 Subject: [PATCH 070/105] CW-1290-Add-Duress-pin-feature (#2664) * add duress PIN feature * add localization * Update configure.dart * Update configure.dart * add duress PIN validation logic * - fix error popup - put behind a feature flag --------- Co-authored-by: OmarHatem --- lib/core/auth_service.dart | 141 +++++++++++++++++- lib/di.dart | 39 +++-- lib/entities/secret_store_key.dart | 10 +- lib/router.dart | 17 +++ lib/routes.dart | 2 + .../settings/security_backup_page.dart | 63 ++++++++ .../setup_pin_code/setup_pin_code.dart | 40 ++++- lib/store/settings_store.dart | 19 +++ lib/utils/feature_flag.dart | 1 + .../security_settings_view_model.dart | 14 +- lib/view_model/setup_pin_code_view_model.dart | 37 ++++- res/values/strings_ar.arb | 7 + res/values/strings_bg.arb | 7 + res/values/strings_cs.arb | 7 + res/values/strings_de.arb | 7 + res/values/strings_en.arb | 7 + res/values/strings_es.arb | 7 + res/values/strings_fr.arb | 7 + res/values/strings_gn.arb | 7 + res/values/strings_ha.arb | 7 + res/values/strings_hi.arb | 9 +- res/values/strings_hr.arb | 7 + res/values/strings_hy.arb | 7 + res/values/strings_id.arb | 7 + res/values/strings_it.arb | 7 + res/values/strings_ja.arb | 7 + res/values/strings_ko.arb | 7 + res/values/strings_my.arb | 7 + res/values/strings_nl.arb | 7 + res/values/strings_pl.arb | 7 + res/values/strings_pt.arb | 7 + res/values/strings_ru.arb | 7 + res/values/strings_th.arb | 7 + res/values/strings_tl.arb | 7 + res/values/strings_tr.arb | 7 + res/values/strings_uk.arb | 7 + res/values/strings_ur.arb | 7 + res/values/strings_vi.arb | 7 + res/values/strings_yo.arb | 7 + res/values/strings_zh.arb | 7 + tool/configure.dart | 6 + 41 files changed, 559 insertions(+), 35 deletions(-) diff --git a/lib/core/auth_service.dart b/lib/core/auth_service.dart index 378c52ec0e..899721fc27 100644 --- a/lib/core/auth_service.dart +++ b/lib/core/auth_service.dart @@ -1,10 +1,18 @@ import 'dart:async'; +import 'dart:io'; +import 'package:cake_wallet/core/reset_service.dart'; import 'package:cake_wallet/core/secure_storage.dart'; import 'package:cake_wallet/core/totp_request_details.dart'; +import 'package:cake_wallet/main.dart'; import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/src/screens/auth/auth_page.dart'; +import 'package:cake_wallet/store/app_store.dart' show AppStore; +import 'package:cake_wallet/store/authentication_store.dart'; +import 'package:cw_core/db/sqlite.dart'; +import 'package:cw_core/root_dir.dart'; import 'package:cw_core/utils/print_verbose.dart'; +import 'package:cw_core/wallet_info.dart'; import 'package:flutter/material.dart'; import 'package:mobx/mobx.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -20,6 +28,10 @@ class AuthService with Store { required this.secureStorage, required this.sharedPreferences, required this.settingsStore, + required this.authenticationStore, + required this.appStore, + required this.resetService, + required this.walletList, }); static const List _alwaysAuthenticateRoutes = [ @@ -32,11 +44,16 @@ class AuthService with Store { Routes.newWalletType, Routes.addressBookAddContact, Routes.restoreOptions, + Routes.securityBackupDuressPin, ]; final SecureStorage secureStorage; final SharedPreferences sharedPreferences; final SettingsStore settingsStore; + final AuthenticationStore authenticationStore; + final AppStore appStore; + final ResetService resetService; + final List walletList; Future setPassword(String password) async { final key = generateStoreKeyFor(key: SecretStoreKey.pinCodePassword); @@ -44,6 +61,17 @@ class AuthService with Store { await secureStorage.write(key: key, value: encodedPassword); } + Future setDuressPin(String pin) async { + final key = generateStoreKeyFor(key: SecretStoreKey.duressPinCodePassword); + final encodedPin = encodedPinCode(pin: pin); + await secureStorage.write(key: key, value: encodedPin); + } + + Future clearDuressPin() async { + final key = generateStoreKeyFor(key: SecretStoreKey.duressPinCodePassword); + await secureStorage.delete(key: key); + } + Future canAuthenticate() async { final key = generateStoreKeyFor(key: SecretStoreKey.pinCodePassword); final walletName = sharedPreferences.getString(PreferencesKey.currentWalletName) ?? ''; @@ -59,11 +87,40 @@ class AuthService with Store { } Future authenticate(String pin) async { - final key = generateStoreKeyFor(key: SecretStoreKey.pinCodePassword); - final encodedPin = await secureStorage.read(key: key); - final decodedPin = decodedPinCode(pin: encodedPin!); + final regularKey = generateStoreKeyFor(key: SecretStoreKey.pinCodePassword); + final encodedRegularPin = await secureStorage.read(key: regularKey); + final decodedRegularPin = decodedPinCode(pin: encodedRegularPin!); + + if (decodedRegularPin == pin) { + return true; + } + + // Check for duress pin + final duressKey = + generateStoreKeyFor(key: SecretStoreKey.duressPinCodePassword); + final encodedDuressPin = await secureStorage.read(key: duressKey); + + String? decodedDuressPin; + if (encodedDuressPin != null && encodedDuressPin.isNotEmpty) { + try { + decodedDuressPin = decodedPinCode(pin: encodedDuressPin); + } catch (e) { + printV("Failed to decode duress pin: $e"); + } + } + + if (decodedDuressPin == pin) { + await _handleDuressLogin(secureStorage, sharedPreferences, + authenticationStore, appStore, resetService, walletList); - return decodedPin == pin; + navigatorKey.currentState?.pushNamedAndRemoveUntil( + Routes.welcome, + (route) => false, + ); + + return false; + } + return false; } void saveLastAuthTime() { @@ -146,3 +203,79 @@ class AuthService with Store { }); } } + + +Future _handleDuressLogin( + SecureStorage secureStorage, + SharedPreferences sharedPreferences, + AuthenticationStore authenticationStore, + AppStore appStore, + ResetService resetService, + List wallets, + ) async { + printV('[DURESS] START FULL WIPE PROCESS'); + + // Close wallet instance if opened + try { + if (appStore.wallet != null) { + await appStore.wallet!.close(); + } + appStore.wallet = null; + } catch (e) { + printV('[DURESS] Failed to close wallet instance: $e'); + } + + // Reset shared preference flag for new install + try { + await sharedPreferences.setBool(PreferencesKey.isNewInstall, true); + printV('[DURESS] isNewInstall flag set to true'); + } catch (e) { + printV('[DURESS] Failed to set isNewInstall: $e'); + } + + // Reset auth data + await resetService.resetAuthDataOnNewInstall(sharedPreferences); + printV('[DURESS] Authentication data reset'); + + // wipe secure storage + try { + await secureStorage.deleteAll(); + printV('[DURESS] SecureStorage wiped'); + } catch (e) { + printV('[DURESS] SecureStorage wipe failed: $e'); + } + + // Delete wallet directories + try { + final appDir = await getAppDir(); + final walletsDir = Directory('${appDir.path}/wallets'); + + if (walletsDir.existsSync()) { + walletsDir.deleteSync(recursive: true); + printV('[DURESS] Wallet directories deleted'); + } + } catch (e) { + printV('[DURESS] Failed deleting wallet directories: $e'); + } + + // Wipe wallet-related database tables + try { + await db.transaction((txn) async { + await txn.delete(WalletInfoAddressInfo.tableName); + await txn.delete(WalletInfoAddressMap.tableName); + await txn.delete(WalletInfoAddress.tableName); + await txn.delete(DerivationInfo.tableName); + await txn.delete(WalletInfo.tableName); + }); + printV('[DURESS] SQLite wallet tables wiped'); + } catch (e) { + printV('[DURESS] SQLite wipe failed: $e'); + } + + //Force app state to uninitialized + authenticationStore.state = AuthenticationState.uninitialized; + printV('[DURESS] Authentication state set to "uninitialized"'); + + printV('[DURESS] FULL WIPE COMPLETED'); +} + diff --git a/lib/di.dart b/lib/di.dart index 90b8a5ba4a..2d793144e8 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -586,11 +586,14 @@ Future setup({ keyService: getIt.get())); getIt.registerFactory( - () => AuthService( - secureStorage: getIt.get(), - sharedPreferences: getIt.get(), - settingsStore: getIt.get(), - ), + () => AuthService( + secureStorage: getIt.get(), + sharedPreferences: getIt.get(), + settingsStore: getIt.get(), + authenticationStore: getIt.get(), + appStore: getIt.get(), + resetService: getIt.get(), + walletList: walletList), ); getIt.registerFactory( @@ -997,7 +1000,7 @@ Future setup({ getIt.get())); getIt.registerFactory(() => - SecuritySettingsViewModel(getIt.get())); + SecuritySettingsViewModel(getIt.get(), getIt.get())); getIt.registerFactory(() => WalletSeedViewModel(getIt.get().wallet!)); @@ -1236,13 +1239,25 @@ Future setup({ } }); - getIt.registerFactory( - () => SetupPinCodeViewModel(getIt.get(), getIt.get())); + getIt.registerFactoryParam( + (isDuressPin, _) => SetupPinCodeViewModel( + getIt.get(), + getIt.get(), + isDuressPin: isDuressPin ?? false, + ), + ); + - getIt.registerFactoryParam, String), - void>( - (onSuccessfulPinSetup, _) => SetupPinCodePage(getIt.get(), - onSuccessfulPinSetup: onSuccessfulPinSetup)); + getIt.registerFactoryParam< + SetupPinCodePage, + void Function(PinCodeState, String), + bool?>( + (onSuccessfulPinSetup, isDuressPin) => SetupPinCodePage( + getIt.get(param1: isDuressPin), + onSuccessfulPinSetup: onSuccessfulPinSetup, + isDuressPin: isDuressPin ?? false, + ), + ); getIt.registerFactory(() => WelcomePage()); diff --git a/lib/entities/secret_store_key.dart b/lib/entities/secret_store_key.dart index df6347ccab..60d1c9b373 100644 --- a/lib/entities/secret_store_key.dart +++ b/lib/entities/secret_store_key.dart @@ -1,11 +1,12 @@ import 'package:cake_wallet/core/secure_storage.dart'; import 'package:shared_preferences/shared_preferences.dart'; -enum SecretStoreKey { moneroWalletPassword, pinCodePassword, backupPassword } +enum SecretStoreKey { moneroWalletPassword, pinCodePassword, backupPassword, duressPinCodePassword } const moneroWalletPassword = "MONERO_WALLET_PASSWORD"; const pinCodePassword = "PIN_CODE_PASSWORD"; const backupPassword = "BACKUP_CODE_PASSWORD"; +const duressPinCodePassword = "DURESS_PIN_CODE_PASSWORD"; String generateStoreKeyFor({ required SecretStoreKey key, @@ -32,6 +33,12 @@ String generateStoreKeyFor({ } break; + case SecretStoreKey.duressPinCodePassword: + { + _key = duressPinCodePassword; + } + break; + default: {} } @@ -64,6 +71,7 @@ class SecureKey { static const totpSecretKey = 'totp_secret_key'; static const pinTimeOutDuration = 'pin_timeout_duration'; static const lastAuthTimeMilliseconds = 'last_auth_time_milliseconds'; + static const enableDuressPin = 'enable_duress_pin'; static Future getInt({ required SecureStorage secureStorage, diff --git a/lib/router.dart b/lib/router.dart index 02fe8275df..93d1eb3955 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -281,6 +281,17 @@ Route createRoute(RouteSettings settings) { ), ); + case Routes.setupDuressPin: + Function(PinCodeState, String)? callback; + + if (settings.arguments is Function(PinCodeState, String)) { + callback = settings.arguments as Function(PinCodeState, String); + } + + return handleRouteWithPlatformAwareness( + (_) => getIt.get(param1: callback, param2: true), + ); + case Routes.restoreOptions: if (SettingsStoreBase.walletPasswordDirectInput) { return createRoute(RouteSettings(name: Routes.restoreWalletType)); @@ -547,6 +558,12 @@ Route createRoute(RouteSettings settings) { (context) => getIt.get(), ); + case Routes.securityBackupDuressPin: + return handleRouteWithPlatformAwareness( + (context) => getIt.get(), + ); + + case Routes.privacyPage: return handleRouteWithPlatformAwareness( (context) => getIt.get(), diff --git a/lib/routes.dart b/lib/routes.dart index 3e18c36f6e..1032bee0c6 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -86,6 +86,8 @@ class Routes { static const mwebNode = '/mweb_node'; static const connectionSync = '/connection_sync_page'; static const securityBackupPage = '/security_and_backup_page'; + static const securityBackupDuressPin = '/security_and_backup_duress_pin'; + static const setupDuressPin = '/setup_duress_pin'; static const privacyPage = '/privacy_page'; static const trocadorProvidersPage = '/trocador_providers_page'; static const domainLookupsPage = '/domain_lookups_page'; diff --git a/lib/src/screens/settings/security_backup_page.dart b/lib/src/screens/settings/security_backup_page.dart index 9ab8d4663d..45abc835fa 100644 --- a/lib/src/screens/settings/security_backup_page.dart +++ b/lib/src/screens/settings/security_backup_page.dart @@ -9,8 +9,12 @@ import 'package:cake_wallet/src/screens/pin_code/pin_code_widget.dart'; import 'package:cake_wallet/src/screens/settings/widgets/settings_cell_with_arrow.dart'; import 'package:cake_wallet/src/screens/settings/widgets/settings_picker_cell.dart'; import 'package:cake_wallet/src/screens/settings/widgets/settings_switcher_cell.dart'; +import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; +import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; import 'package:cake_wallet/utils/device_info.dart'; import 'package:cake_wallet/store/settings_store.dart'; +import 'package:cake_wallet/utils/feature_flag.dart'; +import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/view_model/settings/security_settings_view_model.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; @@ -64,6 +68,41 @@ class SecurityBackupPage extends BasePage { } }); }), + if (FeatureFlag.duressPinEnabled) + Observer(builder: (_) { + return SettingsSwitcherCell( + key: ValueKey('security_backup_page_duress_pin_button_key'), + title: 'Duress PIN', + value: _securitySettingsViewModel.enableDuressPin, + onValueChange: (BuildContext context, bool value) { + _authService.authenticateAction(context, route: Routes.securityBackupDuressPin, + onAuthSuccess: (isAuthenticatedSuccessfully) async { + if (isAuthenticatedSuccessfully) { + if (!value) { + _securitySettingsViewModel.setEnableDuressPin(value); + _securitySettingsViewModel.clearDuressPin(); + return; + } + final res = await _showDuressPinDescription(context); + if (res) { + final confirmation = await _showDuressPinConfirmation(context); + + if (confirmation) { + Navigator.of(context).pushNamed( + Routes.setupDuressPin, + arguments: (PinCodeState pinCtx, String _) async { + pinCtx.close(); + _securitySettingsViewModel.setEnableDuressPin(true); + }, + ); + } + } + } + }, + conditionToDetermineIfToUse2FA: _securitySettingsViewModel + .shouldRequireTOTP2FAForAllSecurityAndBackupSettings); + }); + }), Observer(builder: (_) { return SettingsPickerCell( key: ValueKey('security_backup_page_require_pin_after_button_key'), @@ -139,3 +178,27 @@ class SecurityBackupPage extends BasePage { ); } } + +Future _showDuressPinDescription(BuildContext context) async { + final ok = await showPopUp( + context: context, + builder: (BuildContext context) => AlertWithOneAction( + alertTitle: S.of(context).alert_notice, + alertContent: S.current.duress_pin_description, + buttonText: S.of(context).ok, + buttonAction: () => Navigator.of(context).pop(true))); + return ok ?? false; +} + +Future _showDuressPinConfirmation(BuildContext context) async { + final ok = await showPopUp( + context: context, + builder: (BuildContext context) => AlertWithTwoActions( + alertTitle: S.of(context).confirm, + alertContent: S.current.did_you_back_up_seeds, + leftButtonText: S.current.no, + rightButtonText: S.current.yes, + actionLeftButton: () => Navigator.of(context).pop(false), + actionRightButton: () => Navigator.of(context).pop(true))); + return ok ?? false; +} diff --git a/lib/src/screens/setup_pin_code/setup_pin_code.dart b/lib/src/screens/setup_pin_code/setup_pin_code.dart index d78a2df635..07b66dcf7d 100644 --- a/lib/src/screens/setup_pin_code/setup_pin_code.dart +++ b/lib/src/screens/setup_pin_code/setup_pin_code.dart @@ -8,15 +8,16 @@ import 'package:cake_wallet/view_model/setup_pin_code_view_model.dart'; import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; class SetupPinCodePage extends BasePage { - SetupPinCodePage(this.pinCodeViewModel, {this.onSuccessfulPinSetup}) + SetupPinCodePage(this.pinCodeViewModel,{this.onSuccessfulPinSetup, this.isDuressPin = false}) : pinCodeStateKey = GlobalKey(); final SetupPinCodeViewModel pinCodeViewModel; final void Function(PinCodeState, String)? onSuccessfulPinSetup; + final bool isDuressPin; final GlobalKey pinCodeStateKey; @override - String get title => S.current.setup_pin; + String get title => isDuressPin ? S.current.durres_PIN : S.current.setup_pin; @override Widget body(BuildContext context) => PinCodeWidget( @@ -53,8 +54,10 @@ class SetupPinCodePage extends BasePage { builder: (BuildContext context) { return AlertWithOneAction( buttonKey: ValueKey('setup_pin_code_success_button_key'), - alertTitle: S.current.setup_pin, - alertContent: S.of(context).setup_successful, + alertTitle: isDuressPin ? S.current.durres_PIN : S.current.setup_pin, + alertContent: isDuressPin + ? S.current.durres_PIN_set_up_successfully + : S.current.setup_successful, buttonText: S.of(context).ok, buttonAction: () { Navigator.of(context).pop(); @@ -68,14 +71,13 @@ class SetupPinCodePage extends BasePage { ); }); } catch (e) { - // FIXME: Add translation for alert content text. await showPopUp( context: context, builder: (BuildContext context) { return AlertWithOneAction( - alertTitle: S.current.setup_pin, + alertTitle: isDuressPin ? S.current.durres_PIN : S.current.setup_pin, alertContent: - 'Setup pin is failed with error: ${e.toString()}', + '${S.current.setup_pin_is_failed} ${e.toString()}', buttonText: S.of(context).ok, buttonAction: () => Navigator.of(context).pop(), alertBarrierDismissible: false, @@ -83,7 +85,29 @@ class SetupPinCodePage extends BasePage { }); } }, - onChangedPin: (String pin) => pinCodeViewModel.pinCode = pin, + onChangedPin: (String pin) async { + try { + await pinCodeViewModel.setPinCode(pin); + } catch (e) { + await showPopUp( + context: context, + builder: (BuildContext context) { + return AlertWithOneAction( + alertTitle: S.current.durres_PIN, + alertContent: e.toString(), + buttonText: S.of(context).ok, + buttonAction: () { + Navigator.of(context).pop(); + }, + alertBarrierDismissible: false, + ); + }, + ); + + pinCodeStateKey.currentState?.reset(); + pinCodeViewModel.reset(); + } + }, onChangedPinLength: (int length) => pinCodeViewModel.pinCodeLength = length, initialPinLength: pinCodeViewModel.pinCodeLength); diff --git a/lib/store/settings_store.dart b/lib/store/settings_store.dart index a825ee2439..42809cc3e9 100644 --- a/lib/store/settings_store.dart +++ b/lib/store/settings_store.dart @@ -75,6 +75,7 @@ abstract class SettingsStoreBase with Store { required bool initialContactListAscending, required FiatApiMode initialFiatMode, required bool initialAllowBiometricalAuthentication, + required bool initialEnableDuressPin, required String initialTotpSecretKey, required bool initialUseTOTP2FA, required int initialFailedTokenTrial, @@ -160,6 +161,7 @@ abstract class SettingsStoreBase with Store { nanoSeedType = initialNanoSeedType, fiatApiMode = initialFiatMode, allowBiometricalAuthentication = initialAllowBiometricalAuthentication, + enableDuressPin = initialEnableDuressPin, selectedCake2FAPreset = initialCake2FAPresetOptions, totpSecretKey = initialTotpSecretKey, useTOTP2FA = initialUseTOTP2FA, @@ -543,6 +545,12 @@ abstract class SettingsStoreBase with Store { key: SecureKey.allowBiometricalAuthenticationKey, value: biometricalAuthentication.toString())); + reaction( + (_) => enableDuressPin, + (bool enableDuressPin) => secureStorage.write( + key: SecureKey.enableDuressPin, + value: enableDuressPin.toString())); + reaction( (_) => selectedCake2FAPreset, (Cake2FAPresetsOptions selectedCake2FAPreset) => secureStorage.write( @@ -757,6 +765,9 @@ abstract class SettingsStoreBase with Store { @observable bool allowBiometricalAuthentication; + @observable + bool enableDuressPin; + @observable bool shouldRequireTOTP2FAForAccessingWallet; @@ -1289,6 +1300,13 @@ abstract class SettingsStoreBase with Store { ) ?? false; + final enableDuressPin = await SecureKey.getBool( + secureStorage: secureStorage, + sharedPreferences: sharedPreferences, + key: SecureKey.enableDuressPin, + ) ?? + false; + final selectedCake2FAPreset = Cake2FAPresetsOptions.deserialize( raw: await SecureKey.getInt( secureStorage: secureStorage, @@ -1393,6 +1411,7 @@ abstract class SettingsStoreBase with Store { initialContactListAscending: contactListAscending, initialFiatMode: currentFiatApiMode, initialAllowBiometricalAuthentication: allowBiometricalAuthentication, + initialEnableDuressPin: enableDuressPin, initialCake2FAPresetOptions: selectedCake2FAPreset, initialUseTOTP2FA: useTOTP2FA, initialTotpSecretKey: totpSecretKey, diff --git a/lib/utils/feature_flag.dart b/lib/utils/feature_flag.dart index 661595a414..1a3062c258 100644 --- a/lib/utils/feature_flag.dart +++ b/lib/utils/feature_flag.dart @@ -13,4 +13,5 @@ class FeatureFlag { static const bool hasDevOptions = bool.fromEnvironment('hasDevOptions', defaultValue: kDebugMode); static const bool hasBitcoinViewOnly = true; static const bool customBackgroundEnabled = false; + static const bool duressPinEnabled = true; } diff --git a/lib/view_model/settings/security_settings_view_model.dart b/lib/view_model/settings/security_settings_view_model.dart index b8812e224e..c7ea6107c7 100644 --- a/lib/view_model/settings/security_settings_view_model.dart +++ b/lib/view_model/settings/security_settings_view_model.dart @@ -1,3 +1,4 @@ +import 'package:cake_wallet/core/auth_service.dart'; import 'package:cake_wallet/entities/biometric_auth.dart'; import 'package:cake_wallet/entities/pin_code_required_duration.dart'; import 'package:cake_wallet/store/settings_store.dart'; @@ -8,14 +9,18 @@ part 'security_settings_view_model.g.dart'; class SecuritySettingsViewModel = SecuritySettingsViewModelBase with _$SecuritySettingsViewModel; abstract class SecuritySettingsViewModelBase with Store { - SecuritySettingsViewModelBase(this._settingsStore) : _biometricAuth = BiometricAuth(); + SecuritySettingsViewModelBase(this._settingsStore, this._authService) : _biometricAuth = BiometricAuth(); final BiometricAuth _biometricAuth; final SettingsStore _settingsStore; + final AuthService _authService; @computed bool get allowBiometricalAuthentication => _settingsStore.allowBiometricalAuthentication; + @computed + bool get enableDuressPin => _settingsStore.enableDuressPin; + @computed bool get useTotp2FA => _settingsStore.useTOTP2FA; @@ -38,4 +43,11 @@ abstract class SecuritySettingsViewModelBase with Store { @action void setPinCodeRequiredDuration(PinCodeRequiredDuration duration) => _settingsStore.pinTimeOutDuration = duration; + + @action + void setEnableDuressPin(bool value) => + _settingsStore.enableDuressPin = value; + + Future clearDuressPin() async => await _authService.clearDuressPin(); + } diff --git a/lib/view_model/setup_pin_code_view_model.dart b/lib/view_model/setup_pin_code_view_model.dart index ad503b7dc6..65089613d0 100644 --- a/lib/view_model/setup_pin_code_view_model.dart +++ b/lib/view_model/setup_pin_code_view_model.dart @@ -1,17 +1,20 @@ import 'package:cake_wallet/core/auth_service.dart'; +import 'package:cake_wallet/entities/encrypt.dart'; +import 'package:cake_wallet/entities/secret_store_key.dart'; import 'package:cake_wallet/store/settings_store.dart'; class SetupPinCodeViewModel { - SetupPinCodeViewModel(this._authService, this._settingsStore) + SetupPinCodeViewModel(this._authService, this._settingsStore, + {this.isDuressPin = false}) : _pinCodeLength = _settingsStore.pinCodeLength; String originalPinCode = ''; String repeatedPinCode = ''; - set pinCode(String pinCode) { + Future setPinCode(String pinCode) async { if (!isOriginalPinCodeFull) { - setOriginalPinCode(pinCode); + await setOriginalPinCode(pinCode); return; } @@ -36,14 +39,26 @@ class SetupPinCodeViewModel { final SettingsStore _settingsStore; final AuthService _authService; + final bool isDuressPin; int _pinCodeLength; - void setOriginalPinCode(String pinCode) { - if (isOriginalPinCodeFull) { - return; - } + Future setOriginalPinCode(String pin) async { + originalPinCode = pin; + + if (isDuressPin && pin.length == pinCodeLength) { + + final regularKey = generateStoreKeyFor(key: SecretStoreKey.pinCodePassword); + final encodedRegularPin = await _authService.secureStorage.read(key: regularKey); + + if (encodedRegularPin != null && encodedRegularPin.isNotEmpty) { + final realPin = decodedPinCode(pin: encodedRegularPin); - originalPinCode = pinCode; + if (pin == realPin) { + reset(); + throw Exception('Duress PIN cannot be the same as regular PIN'); + } + } + } } void setRepeatedPinCode(String pinCode) { @@ -64,6 +79,12 @@ class SetupPinCodeViewModel { return; } + if (isDuressPin) { + await _authService.setDuressPin(repeatedPinCode); + return; + } + + await _authService.setPassword(repeatedPinCode); _settingsStore.pinCodeLength = pinCodeLength; } diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index eb7fd50e95..393315de39 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "قد يستغرق الأمر بضع ثوانٍ حتى يتم تأكيد المعاملة وينعكس على الشاشة", "device_is_signing": "الجهاز يوقع", "dfx_option_description": "شراء التشفير مع EUR & CHF. لعملاء البيع بالتجزئة والشركات في أوروبا", + "did_you_back_up_seeds": "هل قمت بعمل نسخة احتياطية من كل ما تبذلونه من البذور؟", "didnt_get_code": "لم تحصل على رمز؟", "digit_pin": "-رقم PIN", "digital_and_physical_card": " بطاقة ائتمان رقمية ومادية مسبقة الدفع", @@ -310,6 +311,9 @@ "domain_mismatch_description": "يحتوي هذا الموقع على مجال لا يتطابق مع مرسل هذا الطلب. قد تؤدي الموافقة على فقدان الأموال.", "donation_link_details": "تفاصيل رابط التبرع", "done": "منتهي", + "duress_pin_description": "سيؤدي هذا إلى إعداد رقم التعريف الشخصي للإكراه، وهي ميزة متقدمة لا ينبغي أن يستخدمها معظم المستخدمين. يجب استخدام رقم التعريف الشخصي هذا فقط إذا كنت في خطر. بعد استخدام رقم التعريف الشخصي هذا، سيتم حذف جميع محفظتك، لذا يرجى التأكد من عمل نسخة احتياطية لجميع البذور الخاصة بك قبل استخدامه.", + "durres_PIN": "رقم التعريف الشخصي للإكراه", + "durres_PIN_set_up_successfully": "تم إعداد رقم التعريف الشخصي للإكراه بنجاح", "e_sign_consent": "الموافقة على التوقيع الإلكتروني", "edit": "تعديل", "edit_backup_password": "تعديل كلمة مرور النسخ الاحتياطي", @@ -549,6 +553,7 @@ "new_transactions_notifications": "إرسال إشعارات حول المعاملات الجديدة", "new_wallet": "إنشاء محفظة جديدة", "newConnection": "ﺪﻳﺪﺟ ﻝﺎﺼﺗﺍ", + "no": "لا", "no_cards_found": "لم يتم العثور على بطاقات", "no_extra_detail": "لا توجد تفاصيل إضافية متاحة", "no_id_needed": "لا حاجة لID!", @@ -861,6 +866,7 @@ "setup_2fa": "تعيين 2 عامل المصادقة", "setup_2fa_text": " .ﻲﻧﺎﺜﻟﺍ ﺔﻗﺩﺎﺼﻤﻟﺍ ﻞﻣﺎﻌﻛ TOTP ﻡﺍﺪﺨﺘﺳﺎﺑ Cake 2FA ﻞﻤﻌﻳ", "setup_pin": "تعيين PIN", + "setup_pin_is_failed": "فشل دبوس الإعداد بسبب الخطأ:", "setup_successful": "تم إعداد PIN الخاص بك بنجاح!", "setup_totp_recommended": " TOTP ﺩﺍﺪﻋﺇ", "setup_warning_2fa_text": ".ﺩﺭﺎﺒﻟﺍ ﻦﻳﺰﺨﺘﻟﺍ ﻞﺜﻣ ﺔﻨﻣﺁ ﺖﺴﻴﻟ ﺎﻬﻧﺇ .ﺔﻈﻔﺤﻤﻟﺍ ﻲﻓ ﺔﻨﻴﻌﻣ ﺕﺍءﺍﺮﺟﻹ ﺔﻴﻧﺎﺛ ﺔﻗﺩﺎﺼﻣ ﺔﺑﺎﺜ", @@ -1154,6 +1160,7 @@ "yat_error_content": "لا توجد عناوين مرتبطة بهذا Yat. جرب يات آخر", "yat_popup_content": "يمكنك الآن إرسال واستلام العملات المشفرة في Cake Wallet باستخدام Yat - اسم مستخدم قصير يعتمد على الرموز التعبيرية. إدارة Yats في أي وقت على شاشة الإعدادات", "yat_popup_title": "يمكن تحويل عنوان محفظتك إلى رموز تعبيرية.", + "yes": "نعم", "yesterday": "الامس", "you_now_have_debit_card": "لديك الآن بطاقة ائتمان", "you_pay": "انت تدفع", diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index e304243f8f..b0019f5c70 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "Може да отнеме няколко секунди, за да може транзакцията да се потвърди и да бъде отразена на екрана", "device_is_signing": "Устройството подписва", "dfx_option_description": "Купете криптовалута с Eur & CHF. За търговски и корпоративни клиенти в Европа", + "did_you_back_up_seeds": "Архивирате ли всичките си семена?", "didnt_get_code": "Не получихте код?", "digit_pin": "-цифрен PIN", "digital_and_physical_card": " дигитална или физическа предплатена дебитна карта", @@ -310,6 +311,9 @@ "domain_mismatch_description": "Този уебсайт има домейн, който не съответства на подателя на тази заявка. Одобряването може да доведе до загуба на средства.", "donation_link_details": "Подробности за връзката за дарение", "done": "Готово", + "duress_pin_description": "Това ще настрои PIN за принуда, разширена функция, която не трябва да се използва от повечето потребители. Този ПИН трябва да се използва само ако сте в опасност. След като използвате този ПИН, всичките ви портфейли ще бъдат изтрити, така че, моля, уверете се, че всичките ви семена са архивирани, преди да го използвате.", + "durres_PIN": "ЕГН по принуда", + "durres_PIN_set_up_successfully": "ПИН кодът за принуда е настроен успешно", "e_sign_consent": "E-Sign съгласие", "edit": "Промени", "edit_backup_password": "Промяна на паролата за възстановяване", @@ -549,6 +553,7 @@ "new_transactions_notifications": "Изпратете известия за нови транзакции", "new_wallet": "Нов портфейл", "newConnection": "Нова връзка", + "no": "не", "no_cards_found": "Не са намерени карти", "no_extra_detail": "Няма налични допълнителни подробности", "no_id_needed": "Без нужда от документ за самоличност!", @@ -861,6 +866,7 @@ "setup_2fa": "Настройка на Cake 2FA", "setup_2fa_text": "Cake 2FA работи с помощта на TOTP като втори фактор за удостоверяване.\n\nTOTP на Cake 2FA изисква SHA-512 и поддръжка на 8 цифри; това осигурява повишена сигурност. Повече информация и поддържани приложения можете да намерите в ръководството.", "setup_pin": "Настройване на PIN", + "setup_pin_is_failed": "Пинът за настройка е неуспешен с грешка:", "setup_successful": "Вашият PIN бе успешно настроен!", "setup_totp_recommended": "Настройка на TOTP", "setup_warning_2fa_text": "Cake 2FA е второ удостоверяване за определени действия в портфейла. НЕ е толкова сигурно, колкото хладилното съхранение.\n\nАко загубите достъп до вашето 2FA приложение или TOTP ключове, ЩЕ загубите достъп до този портфейл. Ще трябва да възстановите портфейла си от мнемоничното семе.\n\nПоддръжката на Cake няма да може да ви помогне, ако загубите достъп до вашите 2FA или мнемонични семена.\nПреди да използвате Cake 2FA, препоръчваме да прочетете ръководството.", @@ -1154,6 +1160,7 @@ "yat_error_content": "Няма адреси, свързани с този Yat. Опитайте с друг Yat", "yat_popup_content": "Вече можете да изпращате и да получавате крипто в Cake Wallet с вашия Yat - кратко потребителско име във формата на емоджи. Управлявайте своите Yats по всяко време в настройките", "yat_popup_title": "Адресът на вашия портфейл може да съдържа емоджита.", + "yes": "да", "yesterday": "Вчера", "you_now_have_debit_card": "Вече имате дебитна карта", "you_pay": "Вие плащате", diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index 8f81691f41..ca75c515fc 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "Transakce může trvat několik sekund, aby se potvrdila a odrážela se na obrazovce", "device_is_signing": "Zařízení se podpisu", "dfx_option_description": "Koupit krypto s EUR & CHF. Pro maloobchodní a firemní zákazníky v Evropě", + "did_you_back_up_seeds": "Zálohovali jste všechna semena?", "didnt_get_code": "Nepřišel Vám kód?", "digit_pin": "-číselný PIN", "digital_and_physical_card": " digitální a fyzické předplacené debetní karty,", @@ -310,6 +311,9 @@ "domain_mismatch_description": "Tento web má doménu, která neodpovídá odesílateli této žádosti. Schválení může vést ke ztrátě finančních prostředků.", "donation_link_details": "Podrobnosti odkazu na darování", "done": "Hotovo", + "duress_pin_description": "Tím se nastaví nátlakový PIN, pokročilá funkce, kterou by většina uživatelů neměla používat. Tento PIN používejte pouze v případě nebezpečí. Po použití tohoto PIN budou všechny vaše peněženky smazány, proto se prosím před jeho použitím ujistěte, že jsou všechna vaše semena zálohována.", + "durres_PIN": "Nátlakový PIN", + "durres_PIN_set_up_successfully": "Nátlakový PIN byl úspěšně nastaven", "e_sign_consent": "E-Sign souhlas", "edit": "Upravit", "edit_backup_password": "Upravit heslo pro zálohy", @@ -549,6 +553,7 @@ "new_transactions_notifications": "Zašlete oznámení o nových transakcích", "new_wallet": "Nová peněženka", "newConnection": "Nové připojení", + "no": "Žádný", "no_cards_found": "Žádné karty nenalezeny", "no_extra_detail": "K dispozici nejsou žádné další podrobnosti", "no_id_needed": "Žádné ID není potřeba!", @@ -861,6 +866,7 @@ "setup_2fa": "Nastavení Cake 2FA", "setup_2fa_text": "Cake 2FA pracuje s použitím TOTP jako druhého autentizačního faktoru.\n\nTOTP Cake 2FA vyžaduje SHA-512 a podporu 8 číslic; to poskytuje zvýšenou bezpečnost. Další informace a podporované aplikace naleznete v průvodci.", "setup_pin": "Nastavit PIN", + "setup_pin_is_failed": "Nastavení PIN se nezdařilo s chybou:", "setup_successful": "Váš PIN byl úspěšně nastaven!", "setup_totp_recommended": "Nastavení TOTP", "setup_warning_2fa_text": "Budete muset obnovit svou peněženku z mnemotechnického semínka.\n\nPodpora dortů vám nebude schopna pomoci, pokud ztratíte přístup ke svým 2FA nebo mnemotechnickým semenům.\nCake 2FA je druhá autentizace pro určité akce v peněžence. Před použitím Cake 2FA doporučujeme přečíst si průvodce.NENÍ tak bezpečný jako skladování v chladu.\n\nPokud ztratíte přístup ke své aplikaci 2FA nebo klíčům TOTP, ztratíte přístup k této peněžence. ", @@ -1154,6 +1160,7 @@ "yat_error_content": "Žádná adresa není spojena s tímto Yatem. Zkuste jiný Yat", "yat_popup_content": "Nyní můžete posílat a přijímat crypto v Cake Wallet se svým Yatem - krátkým uživatelským jménem složeným z emoji. Spravujte kdykoliv Yaty na stránce s nastavením", "yat_popup_title": "Adresa Vaší peněženky může být emojifikována.", + "yes": "Ano", "yesterday": "Včera", "you_now_have_debit_card": "Nyní máte debetní kartu", "you_pay": "Zaplatíte", diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 6407d92ed0..f0879ea5de 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "Es kann ein paar Sekunden dauern, bis die Transaktion bestätigt und auf dem Bildschirm angezeigt", "device_is_signing": "Das Gerät unterschreibt", "dfx_option_description": "Kaufen Sie Krypto mit EUR & CHF. Für Einzelhandel und Unternehmenskunden in Europa", + "did_you_back_up_seeds": "Hast du alle deine Samen gesichert?", "didnt_get_code": "Kein Code?", "digit_pin": "-stellige PIN", "digital_and_physical_card": "digitale und physische Prepaid-Debitkarte", @@ -310,6 +311,9 @@ "domain_mismatch_description": "Diese Website hat eine Domain, die nicht mit dem Absender dieser Anfrage übereinstimmt. Die Genehmigung kann zum Verlust von Geldern führen.", "donation_link_details": "Details zum Spendenlink", "done": "Erledigt", + "duress_pin_description": "Dadurch wird eine Bedrohungs-PIN eingerichtet, eine erweiterte Funktion, die von den meisten Benutzern nicht verwendet werden sollte. Diese PIN sollte nur verwendet werden, wenn Sie in Gefahr sind. Nachdem Sie diese PIN verwendet haben, werden alle Ihre Wallets gelöscht. Stellen Sie daher bitte sicher, dass alle Ihre Samen gesichert sind, bevor Sie sie verwenden.", + "durres_PIN": "Nötigungs-PIN", + "durres_PIN_set_up_successfully": "Die Bedrohungs-PIN wurde erfolgreich eingerichtet", "e_sign_consent": "E-Sign-Zustimmung", "edit": "Bearbeiten", "edit_backup_password": "Sicherungskennwort bearbeiten", @@ -549,6 +553,7 @@ "new_transactions_notifications": "Senden Sie Benachrichtigungen über neue Transaktionen", "new_wallet": "Neue Wallet", "newConnection": "Neue Verbindung", + "no": "NEIN", "no_cards_found": "Keine Karten gefunden", "no_extra_detail": "Keine zusätzlichen Details verfügbar", "no_id_needed": "Keine ID erforderlich!", @@ -862,6 +867,7 @@ "setup_2fa": "Setup-Cake 2FA", "setup_2fa_text": "Cake 2FA verwendet TOTP als zweiten Authentifizierungsfaktor.\n\nDas TOTP von Cake 2FA erfordert SHA-512 und 8-stellige Unterstützung; Dies sorgt für erhöhte Sicherheit. Weitere Informationen und unterstützte Apps finden Sie im Leitfaden.", "setup_pin": "PIN einrichten", + "setup_pin_is_failed": "Der Setup-Pin ist mit folgendem Fehler fehlgeschlagen:", "setup_successful": "Ihre PIN wurde erfolgreich eingerichtet!", "setup_totp_recommended": "TOTP einrichten", "setup_warning_2fa_text": "Sie müssen Ihr Wallet aus dem mnemonischen Seed wiederherstellen.\n\nDer Cake-Support kann Ihnen nicht weiterhelfen, wenn Sie den Zugriff auf Ihre 2FA- oder Mnemonik-Seeds verlieren.\nCake 2FA ist eine zweite Authentifizierung für bestimmte Aktionen im Wallet. Bevor Sie Cake 2FA verwenden, empfehlen wir Ihnen, die Anleitung durchzulesen.Es ist NICHT so sicher wie eine Kühllagerung.\n\nWenn Sie den Zugriff auf Ihre 2FA-App oder Ihre TOTP-Schlüssel verlieren, verlieren Sie auch den Zugriff auf dieses Wallet. ", @@ -1157,6 +1163,7 @@ "yat_error_content": "Keine Adressen mit diesem Yat verknüpft. Versuchen Sie es mit einem anderen Yat", "yat_popup_content": "Sie können jetzt Krypto in Cake Wallet mit Ihrem Yat senden und empfangen - einem kurzen, Emoji-basierten Benutzernamen. Verwalten Sie Yats jederzeit auf dem Einstellungsbildschirm", "yat_popup_title": "Ihre Wallet-Adresse kann emojifiziert werden.", + "yes": "Ja", "yesterday": "Gestern", "you_now_have_debit_card": "Sie haben jetzt eine Debitkarte", "you_pay": "Sie bezahlen", diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index 34074cb283..f4bdc253c7 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "It might take a couple of seconds for the transaction to confirm and be reflected on screen", "device_is_signing": "Device is signing", "dfx_option_description": "Buy crypto with EUR & CHF. For retail and corporate customers in Europe", + "did_you_back_up_seeds": "Did you back up all your seeds?", "didnt_get_code": "Didn't get code?", "digit_pin": "-digit PIN", "digital_and_physical_card": " digital and physical prepaid debit card", @@ -310,6 +311,9 @@ "domain_mismatch_description": "This website has a domain that does not match the sender of this request. Approving may lead to loss of funds.", "donation_link_details": "Donation link details", "done": "Done", + "duress_pin_description": "This will set up a Duress PIN, an advanced feature that should not be used by most users. This PIN should only be used if you are in danger. After using this PIN, all your wallets will be deleted, so please make sure all your seeds are backed up before using it.", + "durres_PIN": "Duress PIN", + "durres_PIN_set_up_successfully": "Duress PIN has been set up successfully", "e_sign_consent": "E-Sign Consent", "edit": "Edit", "edit_backup_password": "Edit Backup Password", @@ -549,6 +553,7 @@ "new_transactions_notifications": "Send notifications about new transactions", "new_wallet": "New Wallet", "newConnection": "New Connection", + "no": "No", "no_cards_found": "No cards found", "no_extra_detail": "No extra details available", "no_id_needed": "No ID needed!", @@ -862,6 +867,7 @@ "setup_2fa": "Setup Cake 2FA", "setup_2fa_text": "Cake 2FA works using TOTP as the second authentication factor.\n\nCake 2FA's TOTP requires SHA-512 and 8 digit support; this provides increased security. More information and supported apps can be found in the guide.", "setup_pin": "Setup PIN", + "setup_pin_is_failed": "Setup pin is failed with error:", "setup_successful": "Your PIN has been set up successfully!", "setup_totp_recommended": "Setup TOTP", "setup_warning_2fa_text": "Cake 2FA is a second authentication for certain actions in the wallet. It is NOT as secure as cold storage.\n\nIf you lose access to your 2FA app or TOTP keys, you WILL lose access to this wallet. You will need to restore your wallet from the mnemonic seed.\n\nCake support will be unable to assist you if you lose access to your 2FA or mnemonic seeds.\nBefore using Cake 2FA, we recommend reading through the guide.", @@ -1155,6 +1161,7 @@ "yat_error_content": "No addresses linked with this Yat. Try another Yat", "yat_popup_content": "You can now send and receive crypto in Cake Wallet with your Yat - a short, emoji-based username. Manage Yats at any time on the settings screen", "yat_popup_title": "Your wallet address can be emojified.", + "yes": "Yes", "yesterday": "Yesterday", "you_now_have_debit_card": "You now have a debit card", "you_pay": "You Pay", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 195299116a..7076780382 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "Puede tardar un par de segundos en que la transacción se confirme y se refleje en pantalla", "device_is_signing": "El dispositivo está firmando", "dfx_option_description": "Compra cripto con EUR o CHF. Para clientes minoristas y corporativos en Europa", + "did_you_back_up_seeds": "¿Hiciste una copia de seguridad de todas tus semillas?", "didnt_get_code": "¿No recibiste el código?", "digit_pin": "-dígitos PIN", "digital_and_physical_card": " tarjeta de débito prepago digital y física", @@ -310,6 +311,9 @@ "domain_mismatch_description": "Este sitio web tiene un dominio que no coincide con el remitente de esta solicitud. Aprobar podría provocar la pérdida de fondos.", "donation_link_details": "Detalles del enlace de donación", "done": "Listo", + "duress_pin_description": "Esto configurará un PIN de coacción, una función avanzada que la mayoría de los usuarios no deberían utilizar. Este PIN sólo debe utilizarse si se encuentra en peligro. Después de usar este PIN, se eliminarán todas sus billeteras, así que asegúrese de que todas sus semillas tengan una copia de seguridad antes de usarlo.", + "durres_PIN": "PIN de coacción", + "durres_PIN_set_up_successfully": "El PIN de coacción se ha configurado correctamente", "e_sign_consent": "Consentimiento de firma electrónica", "edit": "Editar", "edit_backup_password": "Editar contraseña de copia de seguridad", @@ -549,6 +553,7 @@ "new_transactions_notifications": "Enviar notificaciones de nuevas transacciones", "new_wallet": "Nueva billetera", "newConnection": "Nueva Conexión", + "no": "No", "no_cards_found": "No se encontraron tarjetas", "no_extra_detail": "No hay detalles adicionales disponibles", "no_id_needed": "¡No se necesita ID!", @@ -862,6 +867,7 @@ "setup_2fa": "Configurar Cake 2FA", "setup_2fa_text": "Cake 2FA funciona utilizando TOTP como segundo factor de autenticación.\n\nEl TOTP de Cake 2FA requiere SHA-512 y soporte para 8 dígitos; esto proporciona una mayor seguridad. Puedes encontrar más información y aplicaciones compatibles en la guía.", "setup_pin": "Configurar PIN", + "setup_pin_is_failed": "El pin de configuración falló con el error:", "setup_successful": "¡Tu PIN se ha configurado correctamente!", "setup_totp_recommended": "Configurar TOTP", "setup_warning_2fa_text": "Deberás restaurar tu billetera a partir de la semilla mnemotécnica (lista de palabras).\n\nEl soporte de Cake no podrá ayudarte si pierde el acceso a su 2FA o a tus semillas.\nCake 2FA es una segunda autenticación para ciertas acciones en la billetera. Antes de usar Cake 2FA, recomendamos leer la guía. NO es tan seguro como el almacenamiento en frío.\n\nSi pierdes acceso a tu aplicación 2FA o tus claves TOTP, perderás el acceso a esta billetera. ", @@ -1156,6 +1162,7 @@ "yat_error_content": "No hay direcciones vinculadas a este Yat. Prueba con otro Yat", "yat_popup_content": "Ahora puedes enviar y recibir cripto en Cake Wallet con tu Yat, un nombre de usuario corto basado en emojis. Administra Yats en cualquier momento desde la pantalla de configuración", "yat_popup_title": "La dirección de tu billetera se puede emoji-ficar.", + "yes": "Sí", "yesterday": "Ayer", "you_now_have_debit_card": "Ahora tienes una tarjeta de débito", "you_pay": "Tú pagas", diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index 58ba70f66c..f243631ca8 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "La transaction peut prendre quelques secondes à se confirmer et à s'afficher à l'écran", "device_is_signing": "L'appareil signale", "dfx_option_description": "Achetez de la crypto avec EUR & CHF. Pour les clients de la vente au détail et des entreprises en Europe", + "did_you_back_up_seeds": "Avez-vous sauvegardé toutes vos graines ?", "didnt_get_code": "Vous n'avez pas reçu le code ?", "digit_pin": " chiffres", "digital_and_physical_card": "carte de débit prépayée numérique et physique", @@ -310,6 +311,9 @@ "domain_mismatch_description": "Ce site Web utilise un domaine qui ne correspond pas à l'expéditeur de cette requête. L'approbation peut entraîner une perte de fonds.", "donation_link_details": "Détails du lien de donation", "done": "Fait", + "duress_pin_description": "Cela configurera un code PIN sous contrainte, une fonctionnalité avancée qui ne devrait pas être utilisée par la plupart des utilisateurs. Ce code PIN ne doit être utilisé que si vous êtes en danger. Après avoir utilisé ce code PIN, tous vos portefeuilles seront supprimés, alors assurez-vous que toutes vos graines sont sauvegardées avant de l'utiliser.", + "durres_PIN": "Code PIN sous contrainte", + "durres_PIN_set_up_successfully": "Le code PIN sous contrainte a été configuré avec succès", "e_sign_consent": "Consentement de signature électronique", "edit": "Modifier", "edit_backup_password": "Modifier le Mot de Passe de Sauvegarde", @@ -549,6 +553,7 @@ "new_transactions_notifications": "Envoyer des notifications sur les nouvelles transactions", "new_wallet": "Nouveau Portefeuille (Wallet)", "newConnection": "Nouvelle connexion", + "no": "Non", "no_cards_found": "Pas de cartes trouvées", "no_extra_detail": "Aucun détail supplémentaire disponible", "no_id_needed": "Aucune pièce d'identité nécessaire !", @@ -861,6 +866,7 @@ "setup_2fa": "Paramétrer Cake 2FA", "setup_2fa_text": "Cake 2FA fonctionne en utilisant TOTP comme deuxième facteur d'authentification.\n\nLe TOTP de Cake 2FA nécessite la prise en charge de SHA-512 et de 8 chiffres ; cela offre une sécurité accrue. Plus d’informations et les applications prises en charge peuvent être trouvées dans le guide.", "setup_pin": "Configurer le code PIN", + "setup_pin_is_failed": "La broche de configuration a échoué avec l'erreur :", "setup_successful": "Votre code PIN a été configuré avec succès !", "setup_totp_recommended": "Configurer TOTP", "setup_warning_2fa_text": "Vous devrez restaurer votre portefeuille à partir de la graine mnémotechnique.\n\nLe support Cake ne pourra pas vous aider si vous perdez l'accès à vos graines 2FA ou mnémotechniques.\nCake 2FA est une seconde authentification pour certaines actions dans le portefeuille. Avant d'utiliser Cake 2FA, nous vous recommandons de lire le guide. Ce n’est PAS aussi sécurisé que l’entreposage frigorifique.\n\nSi vous perdez l'accès à votre application 2FA ou à vos clés TOTP, vous perdrez l'accès à ce portefeuille. ", @@ -1154,6 +1160,7 @@ "yat_error_content": "Aucune adresse associée à ce Yat. Essayez un autre Yat", "yat_popup_content": "Vous pouvez à présent envoyer et recevoir des cryptos dans Cake Wallet à l'aide de votre Yat - un nom d'utilisateur court à base d'emoji. Gérér les Yats à tout moment depuis l'écran de paramétrage", "yat_popup_title": "L'adresse de votre portefeuille (wallet) peut être emojifiée.", + "yes": "Oui", "yesterday": "Hier", "you_now_have_debit_card": "Vous avez maintenant une carte de débit", "you_pay": "Vous payez", diff --git a/res/values/strings_gn.arb b/res/values/strings_gn.arb index 93d3ab19d8..0bad6ddf0c 100644 --- a/res/values/strings_gn.arb +++ b/res/values/strings_gn.arb @@ -202,6 +202,7 @@ "description": "Techaukaha", "destination_tag": "Maranduhaipyre ojehupytyséva:", "dfx_option_description": "Ejogua criptografía EUR ha CHF(Franco suizo)reheve. Ñemuhãhara michĩ ha tuichavape guarã Europape.", + "did_you_back_up_seeds": "¿Rejapopa raʼe pe rrekuperasión opa mbaʼe nde raʼỹiva?", "didnt_get_code": "¿Nderejapyhýi papapy ñemi?", "digit_pin": "papapy ñemi", "digital_and_physical_card": "Tarjeta de débito prepago digital ha física", @@ -226,6 +227,9 @@ "do_not_show_me": "Ani rehechauka jey cheve kóva", "domain_looks_up": "Dominio jeheka", "donation_link_details": "umi sa'iha kuéra joaju ñeme'ẽrei rehegua", + "duress_pin_description": "Kóva omoĩta peteĩ pin jorreservación rehegua, peteĩ mba’e’oka ijyvatevéva ndoiporúiva’erã hetavéva puruhára. Ko pin ojepuruva’erã reime ramo peligro-pe añoite. Oipuru rire ko pin, opaite ne billetera oñembogueva’erã, upévare eñangareko opaite ne ra’ỹi ojejapoha peteĩ jejokópe reipuru mboyve.", + "durres_PIN": "Pin de Dueres rehegua .", + "durres_PIN_set_up_successfully": "Oñemohenda porãma pin .", "e_sign_consent": "Moneĩ teraguapy electronika rehegua", "edit": "Moambué", "edit_backup_password": "Moambué ñe'ẽñemí jokoha", @@ -405,6 +409,7 @@ "new_template": "Plantilla pyahu", "new_wallet": "Billetera pyahu", "newConnection": "Joaju pyahu", + "no": "nahániri", "no_cards_found": "Ndojejuhúi kuatiañe'ẽ", "no_id_needed": "Noñeikotevẽi ID", "no_id_required": "Noñeikotevẽi identificación rembohetave ha rehepyme'ê hág̃ua mamove hendape", @@ -661,6 +666,7 @@ "setup_2fa": "Emohenda cake 2FA", "setup_2fa_text": "Cake 2FA omba'apo oipuru rupi TOTP mokõi jehechaukaha ramo. Pe TOTP Cake 2FA oikotevẽ SHA-512 ha pytyvõ 8 papapy rehe, upéva oipytyvõ ñangareko porãve hag̃ua. Ikatu retopa marandu ha APP ojuehegua pe marandu nemoirũvape.", "setup_pin": "Pin ñemohenda", + "setup_pin_is_failed": "Pin ñembosako’i ndojejapói jejavy reheve:", "setup_successful": "Nde PIN oñembohenda porãmbaite", "setup_totp_recommended": "Emohenda TOTP", "setup_warning_2fa_text": "Reikotevẽta remopu’ã jey ne billetera ne ñe’ẽñemi mnemotécnica rupive. Pe pytyvõ Cake-gui ndaikatumo’ãi ne pytyvõ rehundi ramo ne jeike 2FA térã ne ñe’ẽñemi mnemotécnica-pe. Cake 2FA niko ha’e mokõiha jehechaukaha ojeiporuva heta jejapo oiva billetera-pe. Reipuru mboyve Cake 2FA, roikuaauka ndéve emoñe’ẽ hag̃ua pe moakãhara marandu . Ndaha’éi ñangareko porãitéva oñeñongatuva ramo ho’ysãhápe guáicha. Rehundíramo ne jeike 2FA térã ne TOTP papapy rehegua, ndaikatumo’ãvéima eike jey ko billetera-pe.", @@ -898,6 +904,7 @@ "yat_error_content": "Ndaipóri dirección-kuera ojoajúva ko Yat reheve. Eha’ã ambue Yat rehe.", "yat_popup_content": "Ko’ág̃a ikatu remondo ha rehupyty criptografía Cake Wallet-pe nde Yat rupive, peteĩ poruhára réra mbykymi rupive oñemopyendáva emoji rehe. Ikatu emohenda ne Yat oimeraẽ áravonte pe configuracioón guive.", "yat_popup_title": "Ikatu nde billetera dirección remo-emoji.", + "yes": "heẽ", "yesterday": "Kuehe", "you_now_have_debit_card": "Koʼág̃a reguereko peteî tarjeta débito.", "you_pay": "Nde rehepymeʼẽ", diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index c942ae9e75..4168df2a1e 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "Yana iya ɗaukar wasu secondsan seconds don ma'amala don tabbatarwa kuma a nuna shi a allon", "device_is_signing": "Na'urar tana shiga", "dfx_option_description": "Buy crypto tare da Eur & Chf. Don Retail da abokan ciniki na kamfanoni a Turai", + "did_you_back_up_seeds": "Shin kun dawo da duk tsaba?", "didnt_get_code": "Ba a samun code?", "digit_pin": "-lambar PIN", "digital_and_physical_card": "katin zare kudi na dijital da na zahiri", @@ -310,6 +311,9 @@ "domain_mismatch_description": "Wannan rukunin yanar gizon yana da yanki wanda bai dace da aika wannan bukatar ba. Yarda na iya haifar da asarar kudade.", "donation_link_details": "Bayanin hanyar sadaka", "done": "Yi", + "duress_pin_description": "Wannan zai kafa wani yanki na Duress, wanda aka ci gaba da ya kamata a yi amfani da shi da yawancin masu amfani. Wannan PIN zai yi amfani da wannan idan kun kasance cikin haɗari. Bayan amfani da wannan PIN, za a goge duk wuraren tafiyarku, don haka don Allah a tabbatar da cewa duk tsirar ku ana tallafawa kafin amfani da shi.", + "durres_PIN": "Duress Pin", + "durres_PIN_set_up_successfully": "DURES PIN an saita shi cikin nasara", "e_sign_consent": "Izinin Alamar E-Sign", "edit": "Gyara", "edit_backup_password": "Shirya Kalmar wucewa ta Ajiyayyen", @@ -549,6 +553,7 @@ "new_transactions_notifications": "Aika sanarwa game da sababbin ma'amaloli", "new_wallet": "Sabuwar Wallet", "newConnection": "Sabuwar Haɗi", + "no": "A'a", "no_cards_found": "Babu katunan da aka samo", "no_extra_detail": "Babu ƙarin cikakkun bayanai", "no_id_needed": "Babu ID da ake buƙata!", @@ -863,6 +868,7 @@ "setup_2fa": "Saiti 2FA", "setup_2fa_text": "Cake 2FA yana aiki ta amfani da TOTP azaman ƙimar tabbatarwa ta biyu.\n\nCake 2FA's TOTP yana buƙatar tallafin lambobi SHA-512 da 8; wannan yana ba da ƙarin tsaro. Ana iya samun ƙarin bayani da ƙa'idodi masu goyan baya a cikin jagorar.", "setup_pin": "Saita PIN", + "setup_pin_is_failed": "Anceta Saita Saiti Tare da Kuskure:", "setup_successful": "An saita PIN ɗinku da nasara!", "setup_totp_recommended": "Saita TOTP", "setup_warning_2fa_text": "Kuna buƙatar dawo da walat ɗin ku daga zuriyar mnemonic.\n\nTallafin kek ba zai iya taimaka muku ba idan kun rasa damar yin amfani da 2FA ko tsaba na mnemonic.\nCake 2FA tabbaci ne na biyu don wasu ayyuka a cikin walat. Kafin amfani da Cake 2FA, muna ba da shawarar karanta ta cikin jagorar.BA shi da tsaro kamar ajiyar sanyi.\n\nIdan ka rasa damar yin amfani da app ɗinka na 2FA ko maɓallan TOTP, ZA KA rasa damar shiga wannan wallet ɗin. ", @@ -1157,6 +1163,7 @@ "yat_error_content": "Babu adireshi da ke da alaƙa da wannan Yat. Gwada wani Yat", "yat_popup_content": "Yanzu zaku iya aikawa da karɓar crypto a cikin Cake Wallet tare da Yat - gajere, sunan mai amfani na tushen emoji. Sarrafa Yats a kowane lokaci akan allon saiti", "yat_popup_title": "Adireshin jakar ku na iya zama emojifid.", + "yes": "I", "yesterday": "Jiya", "you_now_have_debit_card": "Yanzu kana da katin zare kudi", "you_pay": "Ka Bayar", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index a7ee269e85..ad2c7cf45e 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "लेन -देन की पुष्टि करने और स्क्रीन पर प्रतिबिंबित होने के लिए कुछ सेकंड लग सकते हैं", "device_is_signing": "उपकरण हस्ताक्षर कर रहा है", "dfx_option_description": "EUR और CHF के साथ क्रिप्टो खरीदें। यूरोप में खुदरा और कॉर्पोरेट ग्राहकों के लिए", + "did_you_back_up_seeds": "क्या आपने अपने सभी बीजों का बैकअप ले लिया?", "didnt_get_code": "कोड नहीं मिला?", "digit_pin": "-अंक पिन", "digital_and_physical_card": "डिजिटल और भौतिक प्रीपेड डेबिट कार्ड", @@ -310,6 +311,9 @@ "domain_mismatch_description": "इस वेबसाइट में एक डोमेन है जो इस अनुरोध के प्रेषक से मेल नहीं खाता है। अनुमोदन से धन की हानि हो सकती है।", "donation_link_details": "दान लिंक विवरण", "done": "हो गया", + "duress_pin_description": "यह एक ड्यूरेस पिन स्थापित करेगा, एक उन्नत सुविधा जिसका उपयोग अधिकांश उपयोगकर्ताओं द्वारा नहीं किया जाना चाहिए। इस पिन का उपयोग केवल तभी किया जाना चाहिए जब आप खतरे में हों। इस पिन का उपयोग करने के बाद, आपके सभी वॉलेट हटा दिए जाएंगे, इसलिए कृपया सुनिश्चित करें कि इसका उपयोग करने से पहले आपके सभी बीजों का बैकअप ले लिया गया है।", + "durres_PIN": "ड्यूरेस पिन", + "durres_PIN_set_up_successfully": "ड्यूरेस पिन सफलतापूर्वक स्थापित किया गया है", "e_sign_consent": "ई-साइन सहमति", "edit": "संपादित करें", "edit_backup_password": "बैकअप पासवर्ड संपादित करें", @@ -549,6 +553,7 @@ "new_transactions_notifications": "नए लेनदेन के बारे में सूचनाएं भेजें", "new_wallet": "नया बटुआ", "newConnection": "नया कनेक्शन", + "no": "नहीं", "no_cards_found": "कोई कार्ड नहीं मिला", "no_extra_detail": "कोई अतिरिक्त विवरण उपलब्ध नहीं है", "no_id_needed": "कोई आईडी नहीं चाहिए!", @@ -616,8 +621,8 @@ "payjoin_unavailable_sheet_title": "Payjoin अनुपलब्ध क्यों है?", "payment_id": "भुगतान ID: ", "payment_made_easy": "भुगतान आसान किया गया", - "payment_was_received": "आपका भुगतान प्राप्त हुआ था।", "Payment_was_received": "आपका भुगतान प्राप्त हो गया था।", + "payment_was_received": "आपका भुगतान प्राप्त हुआ था।", "payments": "भुगतान", "pending": " (अपूर्ण)", "percentageOf": "${amount} का", @@ -863,6 +868,7 @@ "setup_2fa": "सेटअप केक 2FA", "setup_2fa_text": "केक 2FA दूसरे प्रमाणीकरण कारक के रूप में TOTP का उपयोग करके काम करता है।\n\nकेक 2FA के TOTP को SHA-512 और 8 अंकों के समर्थन की आवश्यकता है; इससे अधिक सुरक्षा मिलती है. अधिक जानकारी और समर्थित ऐप्स गाइड में पाए जा सकते हैं।", "setup_pin": "पिन सेट करें", + "setup_pin_is_failed": "सेटअप पिन त्रुटि के साथ विफल हो गया है:", "setup_successful": "आपका पिन सफलतापूर्वक सेट हो गया है", "setup_totp_recommended": "सेटअप टीओटीपी", "setup_warning_2fa_text": "केक 2एफए वॉलेट में कुछ कार्यों के लिए दूसरा प्रमाणीकरण है। यह कोल्ड स्टोरेज जितना सुरक्षित नहीं है।\n\nयदि आप अपने 2एफए ऐप या टीओटीपी कुंजियों तक पहुंच खो देते हैं, तो आप इस वॉलेट तक पहुंच खो देंगे। आपको अपने बटुए को स्मरक बीज से पुनर्स्थापित करने की आवश्यकता होगी।\n\nयदि आप अपने 2एफए या निमोनिक बीजों तक पहुंच खो देते हैं तो केक समर्थन आपकी सहायता करने में असमर्थ होगा।\nकेक 2एफए का उपयोग करने से पहले, हम गाइड को पढ़ने की सलाह देते हैं।", @@ -1156,6 +1162,7 @@ "yat_error_content": "इसके साथ कोई पता लिंक नहीं है Yat. कोई दूसरा आज़माएं Yat", "yat_popup_content": "अब आप क्रिप्टो भेज और प्राप्त कर सकते हैं Cake Wallet अपने Yat के साथ - एक छोटा, इमोजी-आधारित उपयोगकर्ता नाम। सेटिंग स्क्रीन पर किसी भी समय Yats को प्रबंधित करें", "yat_popup_title": "आपका वॉलेट पता इमोजी किया जा सकता है।", + "yes": "हाँ", "yesterday": "बिता कल", "you_now_have_debit_card": "अब आपके पास डेबिट कार्ड है", "you_pay": "आप भुगतान करते हैं", diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index 690320164c..33a13e4e1a 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "Možda će trebati nekoliko sekundi da se transakcija potvrdi i odrazi na zaslonu", "device_is_signing": "Uređaj se potpisuje", "dfx_option_description": "Kupite kriptovalute s Eur & CHF. Za maloprodajne i korporativne kupce u Europi", + "did_you_back_up_seeds": "Jeste li sigurnosno kopirali sve svoje sjemenke?", "didnt_get_code": "Ne dobivate kod?", "digit_pin": "-znamenkasti PIN", "digital_and_physical_card": "digitalna i fizička unaprijed plaćena debitna kartica", @@ -310,6 +311,9 @@ "domain_mismatch_description": "Ova web stranica ima domenu koja ne odgovara pošiljatelju ovog zahtjeva. Odobrenje može dovesti do gubitka sredstava.", "donation_link_details": "Detalji veza za donacije", "done": "Završen", + "duress_pin_description": "Ovo će postaviti PIN za prisilu, naprednu značajku koju većina korisnika ne bi trebala koristiti. Ovaj PIN treba koristiti samo ako ste u opasnosti. Nakon korištenja ovog PIN-a, svi će vaši novčanici biti izbrisani, pa provjerite jesu li svi vaši seedovi sigurnosno kopirani prije nego što ga upotrijebite.", + "durres_PIN": "PIN za prisilu", + "durres_PIN_set_up_successfully": "Prisilni PIN je uspješno postavljen", "e_sign_consent": "E-Sign pristanak", "edit": "Uredi", "edit_backup_password": "Uredi lozinku za sigurnosnu kopiju", @@ -549,6 +553,7 @@ "new_transactions_notifications": "Pošaljite obavijesti o novim transakcijama", "new_wallet": "Novi novčanik", "newConnection": "Nova veza", + "no": "Ne", "no_cards_found": "Nisu pronađene kartice", "no_extra_detail": "Nema dostupnih dodatnih detalja", "no_id_needed": "Nije potreban ID!", @@ -861,6 +866,7 @@ "setup_2fa": "Postavljanje torte 2FA", "setup_2fa_text": "Cake 2FA radi koristeći TOTP kao drugi faktor provjere autentičnosti.\n\nCake 2FA TOTP zahtijeva SHA-512 i podršku za 8 znamenki; ovo osigurava povećanu sigurnost. Više informacija i podržanih aplikacija možete pronaći u vodiču.", "setup_pin": "Podesi PIN", + "setup_pin_is_failed": "Pin za postavljanje nije uspio s pogreškom:", "setup_successful": "Vaš je pin uspješno postavljen!", "setup_totp_recommended": "Postavite TOTP", "setup_warning_2fa_text": "Morat ćete obnoviti svoj novčanik iz mnemoničkog sjemena.\n\nPodrška za kolače neće vam moći pomoći ako izgubite pristup svojim 2FA ili mnemoničkim izvorima.\nCake 2FA je druga provjera autentičnosti za određene radnje u novčaniku. Prije uporabe Cake 2FA preporučujemo da pročitate vodič.NIJE siguran kao hladno skladište.\n\nAko izgubite pristup svojoj 2FA aplikaciji ili TOTP ključevima, IZGUBIT ĆETE pristup ovom novčaniku. ", @@ -1154,6 +1160,7 @@ "yat_error_content": "Nema adresa povezanih s ovim Yat -om. Pokušajte s drugim Yat -om", "yat_popup_content": "Sada možete slati i primati kriptovalute u Cake Wallet s vašim Yat - kratkim korisničkim imenom zasnovanim na emojijima. Upravljajte Yatsom u bilo kojem trenutku na zaslonu postavki", "yat_popup_title": "Adresa vašeg novčanika može biti emojificirana.", + "yes": "Da", "yesterday": "Jučer", "you_now_have_debit_card": "Sada imate debitnu karticu", "you_pay": "Vi plaćate", diff --git a/res/values/strings_hy.arb b/res/values/strings_hy.arb index f46b6a79dd..6fb59d9f76 100644 --- a/res/values/strings_hy.arb +++ b/res/values/strings_hy.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "Գործարքի հաստատման եւ արտացոլվելու համար գործարքի համար կարող է տեւել մի քանի վայրկյան", "device_is_signing": "Սարքը ստորագրում է", "dfx_option_description": "Գնեք կրիպտոարժույթ EUR և CHF: Կորպորատիվ և մանրածախ հաճախորդների համար Եվրոպայում", + "did_you_back_up_seeds": "Դուք կրկնօրինակե՞լ եք ձեր բոլոր սերմերը:", "didnt_get_code": "Չեք ստացել կոդը?", "digit_pin": "-նիշ ՊԻՆ", "digital_and_physical_card": " թվային և ֆիզիկական նախավճարային դեբետային քարտ", @@ -310,6 +311,9 @@ "domain_mismatch_description": "Այս կայքը ունի տիրույթ, որը չի համապատասխանում այս խնդրանքի ուղարկողին: Հաստատումը կարող է հանգեցնել միջոցների կորստի:", "donation_link_details": "Նվիրատվության հղումի մանրամասներ", "done": "Արված", + "duress_pin_description": "Սա կստեղծի Duress PIN-ը, առաջադեմ գործառույթ, որը չպետք է օգտագործվի օգտատերերի մեծ մասի կողմից: Այս PIN-ը պետք է օգտագործվի միայն այն դեպքում, եթե դուք վտանգի տակ եք: Այս PIN-ն օգտագործելուց հետո ձեր բոլոր դրամապանակները կջնջվեն, ուստի նախքան այն օգտագործելը համոզվեք, որ ձեր բոլոր սերմերը պահուստավորված են:", + "durres_PIN": "Պարտադիր PIN", + "durres_PIN_set_up_successfully": "Duress PIN-ը հաջողությամբ կարգավորվել է", "e_sign_consent": "Էլեկտրոնային ստորագրության համաձայնություն", "edit": "Խմբագրել", "edit_backup_password": "Փոփոխել Կրկնօրինակի Գաղտնաբառը", @@ -549,6 +553,7 @@ "new_transactions_notifications": "Ուղարկեք ծանուցումներ նոր գործարքների վերաբերյալ", "new_wallet": "Նոր դրամապանակ", "newConnection": "Նոր կապ", + "no": "Ոչ", "no_cards_found": "Ոչ մի քարտ չի գտնվել", "no_extra_detail": "Լրացուցիչ մանրամասներ մատչելի չեն", "no_id_needed": "Ոչ մի փաստաթուղթ չի պահանջվում!", @@ -859,6 +864,7 @@ "setup_2fa": "Հավատարմագրել 2FA", "setup_2fa_text": "Cake 2FA-ն աշխատում է TOTP-ի հետ որպես երկրորդ հավատարմագրման գործոն։\n\nCake 2FA-ի TOTP-ը պահանջում է SHA-512 և 8 թվանշանների աջակցություն; դա ավելի մեծ անվտանգություն է ապահովում։ Ավելի շատ տեղեկություն և աջակցվող հավելվածներ կարելի է գտնել ուղեցույցում։", "setup_pin": "Հավատարմագրել PIN", + "setup_pin_is_failed": "Կարգավորման PIN-ը ձախողվեց սխալմամբ.", "setup_successful": "Ձեր PIN-ը հաջողությամբ հավատարմագրվել է!", "setup_totp_recommended": "Հավատարմագրել TOTP", "setup_warning_2fa_text": "Cake 2FA-ն երկրորդ վավերացում է որոշակի գործողությունների համար դրամապանակում։ Այն նույն անվտանգ չէ, ինչ ցուրտ պահեստավորումը.\n\nԵթե դուք կորցնեք ձեր 2FA հավելվածի կամատեղությունը կամ TOTP բանալիները, դուք կկորցնեք այս դրամապանակի հասանելիությունը։ Դուք կստիպվեք վերականգնել ձեր դրամապանակը մնեմոնիկ սերմերի միջոցով։\n\nCake աջակցությունը չի կարող օգնել ձեզ, եթե դուք կորցնեք ձեր 2FA կամ մնեմոնիկ սերմերը։ Խնդրում ենք կարդալ ուղեցույցը, նախքան Cake 2FA-ն օգտագործելը", @@ -1152,6 +1158,7 @@ "yat_error_content": "Այս Yat-ի հետ կապված հասցեներ չկան։ Փորձեք այլ Yat", "yat_popup_content": "Այժմ դուք կարող եք ուղարկել և ստանալ կրիպտո Cake Wallet-ում ձեր Yat-ով՝ կարճ, emoji-ների վրա հիմնված օգտագործողի անունով։ Կառավարեք Yat-երը ցանկացած ժամանակ կարգավորումների էկրանին", "yat_popup_title": "Ձեր դրամապանակի հասցեն կարող է emoji-ացվել։", + "yes": "Այո՛", "yesterday": "Երեկ", "you_now_have_debit_card": "Դուք այժմ ունեք դեբետային քարտ", "you_pay": "Դուք վճարում եք", diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index 959dfbf1ed..dc6c4fe78c 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "Mungkin butuh beberapa detik untuk transaksi untuk mengkonfirmasi dan direfleksikan di layar", "device_is_signing": "Perangkat sedang menandatangani", "dfx_option_description": "Beli crypto dengan EUR & CHF. Untuk pelanggan ritel dan perusahaan di Eropa", + "did_you_back_up_seeds": "Apakah Anda mencadangkan semua benih Anda?", "didnt_get_code": "Tidak mendapatkan kode?", "digit_pin": "-digit PIN", "digital_and_physical_card": " kartu debit pra-bayar digital dan fisik", @@ -310,6 +311,9 @@ "domain_mismatch_description": "Situs web ini memiliki domain yang tidak cocok dengan pengirim permintaan ini. Menyetujui dapat menyebabkan hilangnya dana.", "donation_link_details": "Detail tautan donasi", "done": "Selesai", + "duress_pin_description": "Ini akan menyiapkan PIN Paksaan, sebuah fitur lanjutan yang tidak boleh digunakan oleh sebagian besar pengguna. PIN ini hanya boleh digunakan jika Anda berada dalam bahaya. Setelah menggunakan PIN ini, semua dompet Anda akan terhapus, jadi pastikan semua seed Anda sudah dibackup sebelum menggunakannya.", + "durres_PIN": "PIN Paksaan", + "durres_PIN_set_up_successfully": "PIN Paksaan telah berhasil diatur", "e_sign_consent": "E-Sign Consent", "edit": "Edit", "edit_backup_password": "Edit Kata Sandi Cadangan", @@ -549,6 +553,7 @@ "new_transactions_notifications": "Kirim pemberitahuan tentang transaksi baru", "new_wallet": "Dompet Baru", "newConnection": "Koneksi Baru", + "no": "TIDAK", "no_cards_found": "Tidak ada kartu yang ditemukan", "no_extra_detail": "Tidak ada detail tambahan yang tersedia", "no_id_needed": "Tidak perlu ID!", @@ -864,6 +869,7 @@ "setup_2fa": "Siapkan Kue 2FA", "setup_2fa_text": "Cake 2FA bekerja menggunakan TOTP sebagai faktor otentikasi kedua.\n\nTOTP Cake 2FA memerlukan SHA-512 dan dukungan 8 digit; ini memberikan peningkatan keamanan. Informasi lebih lanjut dan aplikasi yang didukung dapat ditemukan di panduan.", "setup_pin": "Pasang PIN", + "setup_pin_is_failed": "Pin penyetelan gagal karena kesalahan:", "setup_successful": "PIN Anda telah berhasil diatur!", "setup_totp_recommended": "Pengaturan TOTP", "setup_warning_2fa_text": "Anda perlu memulihkan dompet Anda dari benih mnemonik.\n\nDukungan kue tidak akan dapat membantu Anda jika Anda kehilangan akses ke 2FA atau benih mnemonik.\nCake 2FA adalah otentikasi kedua untuk tindakan tertentu di dompet. Sebelum menggunakan Cake 2FA, kami sarankan untuk membaca panduannya.Ini TIDAK seaman penyimpanan dingin.\n\nJika Anda kehilangan akses ke aplikasi 2FA atau kunci TOTP, Anda AKAN kehilangan akses ke dompet ini. ", @@ -1157,6 +1163,7 @@ "yat_error_content": "Tidak ada alamat yang terkait dengan Yat ini. Coba Yat lain", "yat_popup_content": "Anda sekarang dapat mengirim dan menerima crypto di Cake Wallet dengan Yat Anda - nama pengguna berbasis emoji yang pendek. Kelola Yats kapan saja pada layar pengaturan", "yat_popup_title": "Alamat dompet Anda dapat diubah menjadi emoji.", + "yes": "Ya", "yesterday": "Kemarin", "you_now_have_debit_card": "Anda sekarang memiliki kartu debit", "you_pay": "Anda Membayar", diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index cae8f9e448..843ad7f4c9 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "Potrebbero essere necessari un paio di secondi per confermare la transazione ed essere riflessa sullo schermo", "device_is_signing": "Il dispositivo sta firmando", "dfx_option_description": "Acquista Crypto con EUR & CHF. Per i clienti al dettaglio e aziendali in Europa", + "did_you_back_up_seeds": "Hai eseguito il backup di tutti i semi?", "didnt_get_code": "Non hai ricevuto il codice?", "digit_pin": "-cifre PIN", "digital_and_physical_card": "carta di debito prepagata digitale e fisica", @@ -310,6 +311,9 @@ "domain_mismatch_description": "Questo sito Web ha un dominio che non corrisponde al mittente di questa richiesta. L'approvazione può comportare la perdita di fondi.", "donation_link_details": "Dettagli del link di donazione", "done": "Fatto", + "duress_pin_description": "Ciò imposterà un PIN anti-coercizione, una funzionalità avanzata che non dovrebbe essere utilizzata dalla maggior parte degli utenti. Questo PIN dovrebbe essere utilizzato solo se sei in pericolo. Dopo aver utilizzato questo PIN, tutti i tuoi portafogli verranno eliminati, quindi assicurati di aver eseguito il backup di tutti i tuoi seed prima di utilizzarlo.", + "durres_PIN": "PIN di coercizione", + "durres_PIN_set_up_successfully": "Il PIN anti-coercizione è stato impostato correttamente", "e_sign_consent": "Consenso alla firma elettronica", "edit": "Modifica", "edit_backup_password": "Modifica Password Backup", @@ -549,6 +553,7 @@ "new_transactions_notifications": "Invia notifiche su nuove transazioni", "new_wallet": "Nuovo portafoglio", "newConnection": "Nuova connessione", + "no": "NO", "no_cards_found": "Nessuna carta trovata", "no_extra_detail": "Nessun dettaglio extra disponibile", "no_id_needed": "Nessun ID necessario!", @@ -862,6 +867,7 @@ "setup_2fa": "Imposta Cake 2FA", "setup_2fa_text": "Cake 2FA funziona utilizzando TOTP come secondo fattore di autenticazione.\n\nIl TOTP di Cake 2FA richiede il supporto SHA-512 e 8 cifre; ciò fornisce una maggiore sicurezza. Maggiori informazioni e app supportate sono disponibili nella guida.", "setup_pin": "Imposta PIN", + "setup_pin_is_failed": "Il pin di installazione non è riuscito con errore:", "setup_successful": "Il tuo PIN è stato impostato con successo!", "setup_totp_recommended": "Imposta TOTP", "setup_warning_2fa_text": "Cake 2FA è un secondo fattore di autenticazione per determinate azioni nel portafoglio. NON è sicuro quanto il cold storage.\n\nSe perdi l'accesso alla tua app 2FA o chiavi TOTP, NON POTRAI ACCEDERE a questo portafoglio. Dovrai recuperare il portafoglio dal seme mnemonico.\n\nIl supporto di Cakenon potrà assisterti se perdi l'accesso alla tua 2FA, o semi mnemonici.\nPrima di usare Cake 2FA ti consigliamo di leggere la guida.", @@ -1157,6 +1163,7 @@ "yat_error_content": "Nessun indirizzo collegato a questo Yat. Prova un altro Yat", "yat_popup_content": "Ora puoi inviare e ricevere criptovalute in Cake Wallet con il tuo Yat, un breve nome utente basato su emoji. Gestisci gli Yat in qualsiasi momento nella schermata delle impostazioni", "yat_popup_title": "L'indirizzo del tuo portafoglio può essere composto da emoji.", + "yes": "SÌ", "yesterday": "Ieri", "you_now_have_debit_card": "Ora hai una carta di debito", "you_pay": "Tu paghi", diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 97ef756ee2..89fbbd4ba7 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "トランザクションが確認され、画面に反映されるまでに数秒かかる場合があります", "device_is_signing": "デバイスが署名しています", "dfx_option_description": "EUR&CHFで暗号を購入します。ヨーロッパの小売および企業の顧客向け", + "did_you_back_up_seeds": "すべてのシードをバックアップしましたか?", "didnt_get_code": "コードを取得しませんか?", "digit_pin": "桁ピン", "digital_and_physical_card": "デジタルおよび物理プリペイドデビットカード", @@ -310,6 +311,9 @@ "domain_mismatch_description": "このWebサイトには、このリクエストの送信者と一致しないドメインがあります。承認すると、資金の損失につながる可能性があります。", "donation_link_details": "寄付リンクの詳細", "done": "終わり", + "duress_pin_description": "これにより、ほとんどのユーザーが使用すべきではない高度な機能である Duress PIN が設定されます。この PIN は、危険な場合にのみ使用してください。この PIN を使用すると、すべてのウォレットが削除されるため、使用する前にすべてのシードがバックアップされていることを確認してください。", + "durres_PIN": "強要PIN", + "durres_PIN_set_up_successfully": "強迫PINが正常に設定されました", "e_sign_consent": "電子署名の同意", "edit": "編集", "edit_backup_password": "バックアップパスワードの編集", @@ -550,6 +554,7 @@ "new_transactions_notifications": "新しいトランザクションに関する通知を送信します", "new_wallet": "新しいウォレット", "newConnection": "新しい接続", + "no": "いいえ", "no_cards_found": "カードは見つかりません", "no_extra_detail": "追加の詳細はありません", "no_id_needed": "IDは必要ありません!", @@ -862,6 +867,7 @@ "setup_2fa": "セットアップ ケーキ 2FA", "setup_2fa_text": "Cake 2FA は、TOTP を 2 番目の認証要素として使用して機能します。\n\nCake 2FA の TOTP には SHA-512 と 8 桁のサポートが必要です。これによりセキュリティが強化されます。詳細とサポートされているアプリについてはガイドをご覧ください。", "setup_pin": "PINのセットアップ", + "setup_pin_is_failed": "ピンのセットアップがエラーで失敗しました:", "setup_successful": "PINは正常に設定されました!", "setup_totp_recommended": "TOTPのセットアップ", "setup_warning_2fa_text": "Cake 2FA は、ウォレット内の特定のアクションに対する 2 番目の認証です。冷蔵保存ほど安全ではありません。\n\n2FA アプリまたは TOTP キーにアクセスできなくなると、このウォレットにもアクセスできなくなります。ニーモニックシードからウォレットを復元する必要があります。\n\n2FA またはニーモニック シードにアクセスできなくなった場合、Cake サポートはサポートできません。\nCake 2FA を使用する前に、ガイドを一読することをお勧めします。", @@ -1155,6 +1161,7 @@ "yat_error_content": "このYatにリンクされているアドレスはありません。別のYatを試してください", "yat_popup_content": "Yat(短い絵文字ベースのユーザー名)を使用して、CakeWalletで暗号を送受信できるようになりました。 設定画面でいつでもYatsを管理", "yat_popup_title": "あなたの財布のアドレスは絵文字であることができます。", + "yes": "はい", "yesterday": "昨日", "you_now_have_debit_card": "デビットカードができました", "you_pay": "あなたが支払う", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index 00d4ea975b..8c3d1e713e 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "트랜잭션이 확인하고 화면에 반영되는 데 몇 초가 걸릴 수 있습니다.", "device_is_signing": "장치가 서명 중입니다", "dfx_option_description": "EUR 및 CHF로 암호화폐 구매. 유럽의 개인 및 기업 고객 대상", + "did_you_back_up_seeds": "씨앗을 모두 백업하셨나요?", "didnt_get_code": "코드를 받지 못했나요?", "digit_pin": "자리 PIN", "digital_and_physical_card": " 디지털 및 실물 선불 직불 카드", @@ -310,6 +311,9 @@ "domain_mismatch_description": "이 웹사이트의 도메인이 이 요청의 발신자와 일치하지 않습니다. 승인하면 자금 손실로 이어질 수 있습니다.", "donation_link_details": "기부 링크 세부 정보", "done": "완료", + "duress_pin_description": "이렇게 하면 대부분의 사용자가 사용해서는 안 되는 고급 기능인 협박 PIN이 설정됩니다. 이 PIN은 위험에 처한 경우에만 사용해야 합니다. 이 PIN을 사용하면 모든 지갑이 삭제되므로 사용하기 전에 모든 시드를 백업했는지 확인하십시오.", + "durres_PIN": "협박 PIN", + "durres_PIN_set_up_successfully": "협박 PIN이 성공적으로 설정되었습니다", "e_sign_consent": "전자 서명 동의", "edit": "편집", "edit_backup_password": "백업 비밀번호 편집", @@ -549,6 +553,7 @@ "new_transactions_notifications": "새 트랜잭션 알림 보내기", "new_wallet": "새 지갑", "newConnection": "새 연결", + "no": "아니요", "no_cards_found": "카드를 찾을 수 없습니다", "no_extra_detail": "추가 세부 정보 없음", "no_id_needed": "ID 필요 없음!", @@ -862,6 +867,7 @@ "setup_2fa": "Cake 2FA 설정", "setup_2fa_text": "Cake 2FA는 두 번째 인증 요소로 TOTP를 사용합니다.\n\nCake 2FA의 TOTP는 SHA-512 및 8자리 지원이 필요하며 이는 보안을 강화합니다. 자세한 정보 및 지원되는 앱은 가이드에서 찾을 수 있습니다.", "setup_pin": "PIN 설정", + "setup_pin_is_failed": "다음 오류로 인해 핀 설정이 실패했습니다.", "setup_successful": "PIN이 성공적으로 설정되었습니다!", "setup_totp_recommended": "TOTP 설정", "setup_warning_2fa_text": "Cake 2FA는 지갑의 특정 작업에 대한 두 번째 인증입니다. 콜드 스토리지처럼 안전하지는 않습니다.\n\n2FA 앱 또는 TOTP 키에 대한 액세스 권한을 잃으면 이 지갑에 대한 액세스 권한도 잃게 됩니다. 니모닉 시드에서 지갑을 복구해야 합니다.\n\n2FA 또는 니모닉 시드에 대한 액세스 권한을 잃으면 Cake 지원팀에서 도움을 드릴 수 없습니다.\nCake 2FA를 사용하기 전에 가이드를 읽어보는 것이 좋습니다.", @@ -1155,6 +1161,7 @@ "yat_error_content": "이 Yat과 연결된 주소가 없습니다. 다른 Yat을 시도하세요", "yat_popup_content": "이제 짧은 이모지 기반 사용자 이름인 Yat으로 Cake Wallet에서 암호화폐를 보내고 받을 수 있습니다. 설정 화면에서 언제든지 Yat을 관리하세요.", "yat_popup_title": "지갑 주소를 이모지로 만들 수 있습니다.", + "yes": "예", "yesterday": "어제", "you_now_have_debit_card": "이제 직불 카드가 있습니다", "you_pay": "지불 금액", diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index 43203af87f..38a8898a35 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "၎င်းသည်ငွေပေးငွေယူကိုအတည်ပြုရန်နှင့်မျက်နှာပြင်ပေါ်တွင်ထင်ဟပ်ရန်စက္ကန့်အနည်းငယ်ကြာနိုင်သည်", "device_is_signing": "ကိရိယာလက်မှတ်ထိုးနေသည်", "dfx_option_description": "Crypto ကို EUR & CHF ဖြင့် 0 ယ်ပါ။ လက်လီရောင်းဝယ်မှုနှင့်ဥရောပရှိကော်ပိုရိတ်ဖောက်သည်များအတွက်", + "did_you_back_up_seeds": "မင်းမျိုးစေ့တွေအားလုံးကိုအမ်းလိုက်လား", "didnt_get_code": "ကုဒ်ကို မရဘူးလား?", "digit_pin": "-ဂဏန်း PIN", "digital_and_physical_card": " ဒစ်ဂျစ်တယ်နှင့် ရုပ်ပိုင်းဆိုင်ရာ ကြိုတင်ငွေပေးချေသော ဒက်ဘစ်ကတ်", @@ -310,6 +311,9 @@ "domain_mismatch_description": "ဤ 0 က်ဘ်ဆိုက်တွင်ဤတောင်းဆိုမှုကိုပေးပို့သူနှင့်မကိုက်ညီသောဒိုမိန်းရှိသည်။ အတည်ပြုခြင်းသည်ရန်ပုံငွေများဆုံးရှုံးမှုကိုဖြစ်ပေါ်စေနိုင်သည်။", "donation_link_details": "လှူဒါန်းရန်လင့်ခ်အသေးစိတ်", "done": "ပြီးပြီ", + "duress_pin_description": "၎င်းသည်သုံးစွဲသူအများစုမှအသုံးမပြုသင့်သောအဆင့်မြင့်သောမျက်နှာပြင်တစ်ခု, သင်အန္တရာယ်ရှိပါကဤ PIN ကိုသာအသုံးပြုသင့်သည်။ ဤ PIN နံပါတ်ကိုအသုံးပြုပြီးနောက်သင်၏ပိုက်ဆံအိတ်အားလုံးကိုဖျက်ပစ်လိမ့်မည်။", + "durres_PIN": "duress pin", + "durres_PIN_set_up_successfully": "Duress Pin ကိုအောင်မြင်စွာသတ်မှတ်ထားသည်", "e_sign_consent": "E-Sign သဘောတူညီချက်", "edit": "တည်းဖြတ်ပါ။", "edit_backup_password": "Backup Password ကို တည်းဖြတ်ပါ။", @@ -549,6 +553,7 @@ "new_transactions_notifications": "အသစ်သောအရောင်းအဝယ်အကြောင်းသတိပေးချက်များပေးပို့ပါ", "new_wallet": "ပိုက်ဆံအိတ်အသစ်", "newConnection": "ချိတ်ဆက်မှုအသစ်", + "no": "မဟုတ်", "no_cards_found": "ကဒ်များမရှိပါ", "no_extra_detail": "အဘယ်သူမျှမအပိုအသေးစိတ်ကိုရရှိနိုင်", "no_id_needed": "ID မလိုအပ်ပါ။", @@ -861,6 +866,7 @@ "setup_2fa": "ကိတ်မုန့် 2FA စနစ်ထည့်သွင်းပါ။", "setup_2fa_text": "ကိတ်မုန့် 2FA သည် TOTP ကို ဒုတိယ စစ်မှန်ကြောင်းအထောက်အထားအဖြစ် အသုံးပြု၍ လုပ်ဆောင်သည်။\n\nကိတ်မုန့် 2FA ၏ TOTP သည် SHA-512 နှင့် 8 ဂဏန်းပံ့ပိုးမှု လိုအပ်သည်။ ဒါက လုံခြုံရေးကို တိုးမြှင့်ပေးတယ်။ နောက်ထပ်အချက်အလက်များနှင့် ပံ့ပိုးပေးထားသောအက်ပ်များကို လမ်းညွှန်တွင် တွေ့နိုင်ပါသည်။", "setup_pin": "ပင်နံပါတ်ကို စနစ်ထည့်သွင်းပါ။", + "setup_pin_is_failed": "Setup PIN ကိုအမှားနှင့်မအောင်မြင်ပါ။", "setup_successful": "သင့်ပင်နံပါတ်ကို အောင်မြင်စွာ သတ်မှတ်ပြီးပါပြီ။", "setup_totp_recommended": "TOTP စနစ်ထည့်သွင်းပါ။", "setup_warning_2fa_text": "ကိတ်မုန့် 2FA သည် ပိုက်ဆံအိတ်ရှိ အချို့သော လုပ်ဆောင်ချက်များ အတွက် ဒုတိယ စစ်မှန်ကြောင်း အထောက်အထား ဖြစ်သည်။ ၎င်းသည် အအေးခန်းကဲ့သို့ မလုံခြုံပါ။\n\nသင်၏ 2FA အက်ပ် သို့မဟုတ် TOTP သော့များကို အသုံးပြုခွင့် ဆုံးရှုံးပါက၊ သင်သည် ဤပိုက်ဆံအိတ်သို့ ဝင်ရောက်ခွင့် ဆုံးရှုံးမည်ဖြစ်သည်။ သင့်ပိုက်ဆံအိတ်ကို mnemonic မျိုးစေ့မှ ပြန်လည်ရယူရန် လိုအပ်မည်ဖြစ်သည်။\n\nသင်သည် သင်၏ 2FA သို့မဟုတ် mnemonic အစေ့များကို အသုံးပြုခွင့်ဆုံးရှုံးသွားပါက ကိတ်မုန့်ပံ့ပိုးကူညီမှု မပေးနိုင်ပါ။\nCake 2FA ကို အသုံးမပြုမီ၊ လမ်းညွှန်ချက်မှတစ်ဆင့် ဖတ်ရန် အကြံပြုအပ်ပါသည်။", @@ -1154,6 +1160,7 @@ "yat_error_content": "ဤ Yat နှင့် ချိတ်ဆက်ထားသော လိပ်စာမရှိပါ။ နောက်ထပ် Yat စမ်းကြည့်ပါ။", "yat_popup_content": "သင်၏ Yat - တိုတောင်းသော အီမိုဂျီအခြေခံအသုံးပြုသူအမည်ဖြင့် Cake Wallet တွင် crypto ကို ယခု ပေးပို့နိုင်ပါပြီ။ ဆက်တင်စခရင်ပေါ်တွင် Yats ကို အချိန်မရွေး စီမံခန့်ခွဲပါ။", "yat_popup_title": "သင့်ပိုက်ဆံအိတ်လိပ်စာကို emojified လုပ်နိုင်ပါသည်။", + "yes": "ဟုတ်ကဲ့", "yesterday": "မနေ့က", "you_now_have_debit_card": "ယခု သင့်တွင် ဒက်ဘစ်ကတ်တစ်ခုရှိသည်။", "you_pay": "သင်ပေးချေပါ။", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 26ddf31dd8..8103e0c77f 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "Het kan een paar seconden duren voordat de transactie wordt bevestigd en weerspiegeld op het scherm", "device_is_signing": "Apparaat ondertekent", "dfx_option_description": "Koop crypto met EUR & CHF. Voor retail- en zakelijke klanten in Europa", + "did_you_back_up_seeds": "Heb je een back-up gemaakt van al je zaden?", "didnt_get_code": "Geen code?", "digit_pin": "-cijferige PIN", "digital_and_physical_card": "digitale en fysieke prepaid debetkaart", @@ -310,6 +311,9 @@ "domain_mismatch_description": "Deze website heeft een domein dat niet overeenkomt met de afzender van dit verzoek. Goedkeuring kan leiden tot verlies van fondsen.", "donation_link_details": "Details van de donatielink", "done": "Klaar", + "duress_pin_description": "Hiermee wordt een dwangpincode ingesteld, een geavanceerde functie die door de meeste gebruikers niet mag worden gebruikt. Deze pincode mag alleen worden gebruikt als u in gevaar bent. Nadat u deze pincode heeft gebruikt, worden al uw portemonnees verwijderd. Zorg er dus voor dat er een back-up van al uw zaden is gemaakt voordat u deze gebruikt.", + "durres_PIN": "Dwang-PIN", + "durres_PIN_set_up_successfully": "De dwang-PIN is succesvol ingesteld", "e_sign_consent": "Toestemming e-ondertekenen", "edit": "Bewerk", "edit_backup_password": "Bewerk back-upwachtwoord", @@ -549,6 +553,7 @@ "new_transactions_notifications": "Stuur meldingen over nieuwe transacties", "new_wallet": "Nieuwe portemonnee", "newConnection": "Nieuwe verbinding", + "no": "Nee", "no_cards_found": "Geen kaarten gevonden", "no_extra_detail": "Geen extra details beschikbaar", "no_id_needed": "Geen ID nodig!", @@ -861,6 +866,7 @@ "setup_2fa": "Opstelling Taart 2FA", "setup_2fa_text": "Cake 2FA werkt met TOTP als tweede authenticatiefactor.\n\nCake 2FA's TOTP vereist SHA-512 en 8-cijferige ondersteuning; dit zorgt voor meer veiligheid. Meer informatie en ondersteunde apps vindt u in de gids.", "setup_pin": "PIN instellen", + "setup_pin_is_failed": "Installatiepin is mislukt met fout:", "setup_successful": "Uw PIN is succesvol ingesteld!", "setup_totp_recommended": "TOTP instellen", "setup_warning_2fa_text": "U moet uw portemonnee herstellen vanuit het geheugensteuntje.\n\nCake Support kan u niet helpen als u de toegang tot uw 2FA- of mnemonic-zaden verliest.\nCake 2FA is een tweede authenticatie voor bepaalde acties in de portemonnee. Voordat u Cake 2FA gebruikt, raden wij u aan de handleiding door te lezen.Het is NIET zo veilig als koude opslag.\n\nAls u de toegang tot uw 2FA-app of TOTP-sleutels verliest, verliest u de toegang tot deze portemonnee. ", @@ -1155,6 +1161,7 @@ "yat_error_content": "Geen adressen gekoppeld aan deze Yat. Probeer een andere Yato", "yat_popup_content": "Je kunt nu crypto verzenden en ontvangen in Cake Wallet met je Yat - een korte, op emoji gebaseerde gebruikersnaam. Beheer Yats op elk moment op het instellingenscherm", "yat_popup_title": "Uw portemonnee-adres kan worden ge-emojiificeerd.", + "yes": "Ja", "yesterday": "Gisteren", "you_now_have_debit_card": "Je hebt nu een debetkaart", "you_pay": "U betaalt", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index fcf9d5c607..dabdb744c7 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "Może to potrwać kilka sekund, zanim transakcja zostanie potwierdzona i wyświetlona na ekranie", "device_is_signing": "Urządzenie podpisuje", "dfx_option_description": "Kup kryptowaluty za EUR i CHF. Dla klientów detalicznych i korporacyjnych w Europie", + "did_you_back_up_seeds": "Czy wykonałeś kopię zapasową wszystkich nasion?", "didnt_get_code": "Nie otrzymałeś kodu?", "digit_pin": "-cyfrowy PIN", "digital_and_physical_card": " cyfrowa i fizyczna karta przedpłacona", @@ -310,6 +311,9 @@ "domain_mismatch_description": "Ta strona ma domenę, która nie zgadza się z nadawcą tego żądania. Zatwierdzenie może spowodować utratę środków.", "donation_link_details": "Szczegóły linku do darowizny", "done": "Gotowe", + "duress_pin_description": "Spowoduje to skonfigurowanie kodu PIN pod przymusem – zaawansowanej funkcji, z której większość użytkowników nie powinna korzystać. Tego kodu PIN należy używać wyłącznie w przypadku zagrożenia. Po użyciu tego kodu PIN wszystkie Twoje portfele zostaną usunięte, dlatego przed użyciem upewnij się, że wszystkie Twoje nasiona zostały utworzone w kopii zapasowej.", + "durres_PIN": "PIN pod przymusem", + "durres_PIN_set_up_successfully": "Kod PIN przymusu został pomyślnie skonfigurowany", "e_sign_consent": "Zgoda na podpis elektroniczny", "edit": "Edytuj", "edit_backup_password": "Edytuj hasło kopii zapasowej", @@ -548,6 +552,7 @@ "new_transactions_notifications": "Wysyłaj powiadomienia o nowych transakcjach", "new_wallet": "Nowy portfel", "newConnection": "Nowe Połączenie", + "no": "NIE", "no_cards_found": "Nie znaleziono żadnych kart", "no_extra_detail": "Brak dodatkowych szczegółów", "no_id_needed": "Nie wymaga dowodu!", @@ -860,6 +865,7 @@ "setup_2fa": "Skonfiguruj Cake 2FA", "setup_2fa_text": "Cake 2FA działa przy użyciu TOTP jako drugiego czynnika uwierzytelniającego.\n\nTOTP w Cake 2FA wymaga SHA-512 oraz obsługi 8-cyfrowych kodów; zapewnia to zwiększone bezpieczeństwo. Więcej informacji i obsługiwane aplikacje znajdziesz w przewodniku.", "setup_pin": "Ustaw PIN", + "setup_pin_is_failed": "Konfiguracja PIN nie powiodła się z powodu błędu:", "setup_successful": "Twój kod PIN został pomyślnie ustawiony!", "setup_totp_recommended": "Ustaw TOTP", "setup_warning_2fa_text": "Będziesz musiał przywrócić swój portfel z frazy seed.\n\nWsparcie Cake nie będzie w stanie Ci pomóc, jeśli utracisz dostęp do swoich kluczy 2FA lub frazy seed.\nCake 2FA to drugie uwierzytelnienie niektórych działań w portfelu. Przed użyciem Cake 2FA zalecamy zapoznanie się z instrukcją. Cake 2FA nie jest tak bezpieczne jak przechowywanie w zimnym lub sprzętowym portfelu.\n\nJeśli utracisz dostęp do aplikacji 2FA lub kluczy TOTP, Utracisz dostęp do tego portfela.", @@ -1153,6 +1159,7 @@ "yat_error_content": "Brak adresów powiązanych z tym Yatem. Wypróbuj inny Yat", "yat_popup_content": "Możesz teraz wysyłać i odbierać kryptowaluty w Cake Wallet za pomocą swojego Yat – krótką nazwą użytkownika opartą na emotikonach. Zarządzaj Yats w dowolnym momencie na ekranie ustawień", "yat_popup_title": "Twój adres portfela może zostać zamieniony na emoji.", + "yes": "Tak", "yesterday": "Wczoraj", "you_now_have_debit_card": "Masz już kartę debetową", "you_pay": "Płacisz", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 08afd17c31..cde199e6e2 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "Pode levar alguns segundos para a transação confirmar e se refletir na tela", "device_is_signing": "O dispositivo está assinando", "dfx_option_description": "Compre criptografia com EUR & CHF. Para clientes de varejo e corporativo na Europa", + "did_you_back_up_seeds": "Você fez backup de todas as suas sementes?", "didnt_get_code": "Não recebeu o código?", "digit_pin": "dígitos", "digital_and_physical_card": "cartão de débito pré-pago digital e físico", @@ -310,6 +311,9 @@ "domain_mismatch_description": "Este site possui um domínio que não corresponde ao remetente desta solicitação. A aprovação pode levar à perda de fundos.", "donation_link_details": "Detalhes do link de doação", "done": "Feito", + "duress_pin_description": "Isso configurará um PIN de coação, um recurso avançado que não deve ser usado pela maioria dos usuários. Este PIN só deve ser usado se você estiver em perigo. Depois de usar este PIN, todas as suas carteiras serão excluídas, portanto, certifique-se de fazer backup de todas as suas sementes antes de usá-lo.", + "durres_PIN": "PIN de coação", + "durres_PIN_set_up_successfully": "O PIN de coação foi configurado com sucesso", "e_sign_consent": "Consentimento de assinatura eletrônica", "edit": "Editar", "edit_backup_password": "Editar senha de backup", @@ -550,6 +554,7 @@ "new_transactions_notifications": "Envie notificações sobre novas transações", "new_wallet": "Nova carteira", "newConnection": "Nova conexão", + "no": "Não", "no_cards_found": "Nenhum cartão encontrado", "no_extra_detail": "Sem detalhes extras disponíveis", "no_id_needed": "Nenhum ID necessário!", @@ -863,6 +868,7 @@ "setup_2fa": "Configurar o Cake 2FA", "setup_2fa_text": "Cake 2FA funciona usando TOTP como segundo fator de autenticação.\n\nO TOTP do Cake 2FA requer suporte SHA-512 e 8 dígitos; isso proporciona maior segurança. Mais informações e aplicativos suportados podem ser encontrados no guia.", "setup_pin": "Configurar PIN", + "setup_pin_is_failed": "O pino de configuração falhou com erro:", "setup_successful": "Seu PIN foi configurado com sucesso!", "setup_totp_recommended": "Configurar TOTP", "setup_warning_2fa_text": "Você precisará restaurar sua carteira a partir da semente mnemônica.\n\nO suporte do Cake não poderá ajudá-lo se você perder o acesso ao seu 2FA ou sementes mnemônicas.\nCake 2FA é uma segunda autenticação para determinadas ações na carteira. Antes de usar o Cake 2FA, recomendamos a leitura do guia.NÃO é tão seguro quanto o armazenamento refrigerado.\n\nSe você perder o acesso ao seu aplicativo 2FA ou às chaves TOTP, você perderá o acesso a esta carteira. ", @@ -1157,6 +1163,7 @@ "yat_error_content": "Nenhum endereço vinculado a este Yat. Tente outro Yat", "yat_popup_content": "Agora você pode enviar e receber criptografia na Cake Wallet com seu Yat - um nome de usuário curto baseado em emoji. Gerenciar Yats a qualquer momento na tela de configurações", "yat_popup_title": "O endereço da sua carteira pode ser emojificado.", + "yes": "Sim", "yesterday": "Ontem", "you_now_have_debit_card": "Agora você tem um cartão de débito", "you_pay": "Você paga", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 257998488d..e4dbb8e5a1 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "Чтобы подтвердить, может потребоваться пару секунд, чтобы подтвердить и быть отраженным на экране", "device_is_signing": "Устройство подписывает", "dfx_option_description": "Купить крипто с Eur & CHF. Для розничных и корпоративных клиентов в Европе", + "did_you_back_up_seeds": "Вы сделали резервную копию всех своих семян?", "didnt_get_code": "Не получить код?", "digit_pin": "-значный PIN", "digital_and_physical_card": "цифровая и физическая предоплаченная дебетовая карта", @@ -310,6 +311,9 @@ "domain_mismatch_description": "Этот веб -сайт имеет домен, который не соответствует отправителю этого запроса. Утверждение может привести к потере средств.", "donation_link_details": "Информация о ссылке для пожертвований", "done": "Сделанный", + "duress_pin_description": "При этом будет установлен ПИН-код принуждения — расширенная функция, которую не следует использовать большинству пользователей. Этот PIN-код следует использовать только в том случае, если вы находитесь в опасности. После использования этого PIN-кода все ваши кошельки будут удалены, поэтому перед его использованием убедитесь, что все ваши начальные данные сохранены.", + "durres_PIN": "ПИН-код принуждения", + "durres_PIN_set_up_successfully": "PIN-код для принуждения успешно установлен.", "e_sign_consent": "Согласие электронной подписи", "edit": "Редактировать", "edit_backup_password": "Изменить пароль резервной копии", @@ -549,6 +553,7 @@ "new_transactions_notifications": "Отправить уведомления о новых транзакциях", "new_wallet": "Новый кошелёк", "newConnection": "Новое соединение", + "no": "Нет", "no_cards_found": "Карт не найдено", "no_extra_detail": "Нет дополнительных деталей", "no_id_needed": "Идентификатор не нужен!", @@ -862,6 +867,7 @@ "setup_2fa": "Настройка торта 2FA", "setup_2fa_text": "Cake 2FA работает с использованием TOTP в качестве второго фактора аутентификации.\n\nTOTP Cake 2FA требует SHA-512 и поддержки 8 цифр; это обеспечивает повышенную безопасность. Дополнительную информацию и поддерживаемые приложения можно найти в руководстве.", "setup_pin": "Настроить PIN", + "setup_pin_is_failed": "Установка PIN-кода не удалась из-за ошибки:", "setup_successful": "PIN был успешно установлен!", "setup_totp_recommended": "Настройка ТОТП", "setup_warning_2fa_text": "Cake 2FA — это вторая аутентификация для определенных действий в кошельке. Это НЕ так безопасно, как холодное хранение.\n\nЕсли вы потеряете доступ к своему приложению 2FA или ключам TOTP, вы потеряете доступ к этому кошельку. Вам нужно будет восстановить свой кошелек из мнемонического сида.\n\nСлужба поддержки Cake не сможет вам помочь, если вы потеряете доступ к своим 2FA или мнемоническим идентификаторам.\nПрежде чем использовать Cake 2FA, мы рекомендуем прочитать руководство.", @@ -1155,6 +1161,7 @@ "yat_error_content": "Нет адресов, связанных с этим Yat. Попробуйте другой Yat", "yat_popup_content": "Теперь вы можете отправлять и получать криптовалюту в Cake Wallet с помощью Yat - короткого имени пользователя на основе эмодзи. Управляйте Yat в любое время при помощи экрана настроек", "yat_popup_title": "Адрес вашего кошелька может быть связан с эмодзи", + "yes": "Да", "yesterday": "Вчера", "you_now_have_debit_card": "Теперь у вас есть дебетовая карта", "you_pay": "Вы платите", diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index c45a125593..45220a4290 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "อาจใช้เวลาสองสามวินาทีในการทำธุรกรรมเพื่อยืนยันและสะท้อนบนหน้าจอ", "device_is_signing": "อุปกรณ์กำลังลงนาม", "dfx_option_description": "ซื้อ crypto ด้วย Eur & CHF สำหรับลูกค้ารายย่อยและลูกค้าในยุโรป", + "did_you_back_up_seeds": "คุณได้สำรองเมล็ดพันธุ์ทั้งหมดของคุณแล้วหรือยัง?", "didnt_get_code": "ไม่ได้รับรหัส?", "digit_pin": "-หลัก PIN", "digital_and_physical_card": "บัตรเดบิตดิจิตอลและบัตรพื้นฐาน", @@ -310,6 +311,9 @@ "domain_mismatch_description": "เว็บไซต์นี้มีโดเมนที่ไม่ตรงกับผู้ส่งคำขอนี้ การอนุมัติอาจนำไปสู่การสูญเสียเงินทุน", "donation_link_details": "รายละเอียดลิงค์บริจาค", "done": "เสร็จแล้ว", + "duress_pin_description": "การดำเนินการนี้จะตั้งค่า Duress PIN ซึ่งเป็นคุณลักษณะขั้นสูงที่ผู้ใช้ส่วนใหญ่ไม่ควรใช้ ควรใช้ PIN นี้เฉพาะเมื่อคุณตกอยู่ในอันตรายเท่านั้น หลังจากใช้ PIN นี้ กระเป๋าเงินของคุณทั้งหมดจะถูกลบ ดังนั้นโปรดตรวจสอบให้แน่ใจว่าเมล็ดของคุณได้รับการสำรองข้อมูลทั้งหมดก่อนที่จะใช้งาน", + "durres_PIN": "PIN ข่มขู่", + "durres_PIN_set_up_successfully": "ตั้งค่า PIN การข่มขู่สำเร็จแล้ว", "e_sign_consent": "การยอมรับ E-Sign", "edit": "แก้ไข", "edit_backup_password": "แก้ไขรหัสผ่านสำรอง", @@ -549,6 +553,7 @@ "new_transactions_notifications": "ส่งการแจ้งเตือนเกี่ยวกับธุรกรรมใหม่", "new_wallet": "กระเป๋าใหม่", "newConnection": "การเชื่อมต่อใหม่", + "no": "เลขที่", "no_cards_found": "ไม่พบการ์ด", "no_extra_detail": "ไม่มีรายละเอียดเพิ่มเติม", "no_id_needed": "ไม่จำเป็นต้องใช้บัตรประชาชน!", @@ -861,6 +866,7 @@ "setup_2fa": "ตั้งค่าเค้ก 2FA", "setup_2fa_text": "Cake 2FA ทำงานโดยใช้ TOTP เป็นปัจจัยการตรวจสอบสิทธิ์ที่สอง\n\nTOTP ของ Cake 2FA ต้องการการสนับสนุน SHA-512 และ 8 หลัก สิ่งนี้ให้ความปลอดภัยเพิ่มขึ้น ข้อมูลเพิ่มเติมและแอปที่รองรับมีอยู่ในคำแนะนำ", "setup_pin": "ตั้งค่า PIN", + "setup_pin_is_failed": "PIN การตั้งค่าล้มเหลวโดยมีข้อผิดพลาด:", "setup_successful": "การตั้งค่า PIN ของคุณสำเร็จแล้ว!", "setup_totp_recommended": "ตั้งค่า TOTP", "setup_warning_2fa_text": "Cake 2FA เป็นการรับรองความถูกต้องครั้งที่สองสำหรับการกระทำบางอย่างในกระเป๋าเงิน มันไม่ปลอดภัยเท่ากับห้องเย็น\n\nหากคุณสูญเสียการเข้าถึงแอป 2FA หรือคีย์ TOTP คุณจะสูญเสียการเข้าถึงกระเป๋าเงินนี้ คุณจะต้องกู้คืนกระเป๋าเงินของคุณจากเมล็ดช่วยในการจำ\n\nการสนับสนุนเค้กจะไม่สามารถช่วยเหลือคุณได้หากคุณสูญเสียการเข้าถึง 2FA หรือเมล็ดช่วยในการจำ\nก่อนใช้ Cake 2FA เราขอแนะนำให้อ่านคำแนะนำโดยละเอียด", @@ -1154,6 +1160,7 @@ "yat_error_content": "ไม่มีที่อยู่ที่เชื่อมต่อกับ Yat นี้ ลองใช้ Yat อื่น", "yat_popup_content": "ขณะนี้คุณสามารถส่งและรับเหรียญคริปโตใน Cake Wallet ด้วย Yat ของคุณ - ชื่อผู้ใช้ที่สั้นมีอิโมจิ คุณสามารถจัดการ Yat ได้ทุกเวลาบนหน้าจอการตั้งค่า", "yat_popup_title": "ที่อยู่กระเป๋าของคุณสามารถถูกอัปโหลดเป็นอิโมจิ", + "yes": "ใช่", "yesterday": "เมื่อวาน", "you_now_have_debit_card": "ขณะนี้คุณมีบัตรเดบิต", "you_pay": "คุณจ่าย", diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb index 05cb2aacb9..197211f848 100644 --- a/res/values/strings_tl.arb +++ b/res/values/strings_tl.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "Maaaring tumagal ng ilang segundo para sa transaksyon upang kumpirmahin at maipakita sa screen", "device_is_signing": "Nag -sign ang aparato", "dfx_option_description": "Bumili ng crypto kasama ang EUR & CHF. Para sa mga retail customer at corporate customer sa Europe", + "did_you_back_up_seeds": "Na -back up mo ba ang lahat ng iyong mga buto?", "didnt_get_code": "Hindi nakuha ang code?", "digit_pin": "-digit PIN", "digital_and_physical_card": " digital at pisikal na prepaid debit card", @@ -310,6 +311,9 @@ "domain_mismatch_description": "Ang website na ito ay may isang domain na hindi tumutugma sa nagpadala ng kahilingan na ito. Ang pag -apruba ay maaaring humantong sa pagkawala ng mga pondo.", "donation_link_details": "Mga detalye ng link ng donasyon", "done": "Tapos na", + "duress_pin_description": "Mag -set up ito ng isang duress pin, isang advanced na tampok na hindi dapat gamitin ng karamihan sa mga gumagamit. Ang pin na ito ay dapat gamitin lamang kung nasa panganib ka. Matapos gamitin ang pin na ito, tatanggalin ang lahat ng iyong mga pitaka, kaya't tiyakin na ang lahat ng iyong mga buto ay nai -back up bago gamitin ito.", + "durres_PIN": "Duress pin", + "durres_PIN_set_up_successfully": "Matagumpay na na -set up ang Duress Pin", "e_sign_consent": "E-Sign Consent", "edit": "I-edit", "edit_backup_password": "I-edit ang backup na password", @@ -549,6 +553,7 @@ "new_transactions_notifications": "Magpadala ng mga abiso tungkol sa mga bagong transaksyon", "new_wallet": "Bagong Wallet", "newConnection": "Bagong Koneksyon", + "no": "Hindi", "no_cards_found": "Walang nahanap na mga card", "no_extra_detail": "Walang magagamit na mga dagdag na detalye", "no_id_needed": "Hindi kailangan ng ID!", @@ -861,6 +866,7 @@ "setup_2fa": "Setup Cake 2FA", "setup_2fa_text": "Gumagana ang Cake 2FA gamit ang TOTP bilang pangalawang kadahilanan sa pagpapatunay.\n\nAng TOTP ng Cake 2FA ay nangangailangan ng SHA-512 at 8 digit na suporta; nagbibigay ito ng mas mataas na seguridad. Higit pang impormasyon at suportadong app ang makikita sa guide.", "setup_pin": "I-Setup ang PIN", + "setup_pin_is_failed": "Nabigo ang Setup pin na may error:", "setup_successful": "Matagumpay na na-set up ang iyong PIN!", "setup_totp_recommended": "I-setup ang TOTP", "setup_warning_2fa_text": "Ang Cake 2FA ay pangalawang pagpapatotoo para sa ilang partikular na pagkilos sa wallet. HINDI ito kasing-secure ng cold wallet.\n\nKung mawalan ka ng access sa iyong 2FA app o TOTP keys, MAWAWALA ka ng access sa wallet na ito. Kakailanganin mong i-restore ang iyong wallet mula sa mnemonic seed.\n\nHindi ka matutulungan ng Cake support kung mawawalan ka ng access sa iyong 2FA o mnemonic seeds.\nBago gamitin ang Cake 2FA, inirerekomenda naming basahin ang guide.", @@ -1154,6 +1160,7 @@ "yat_error_content": "Walang mga address na naka-link sa Yat na ito. Subukan ang isa pang Yat", "yat_popup_content": "Maaari ka na ngayong magpadala at tumanggap ng crypto sa Cake Wallet gamit ang iyong Yat - isang maikling emoji-based na username. Pamahalaan ang Yats anumang oras sa screen ng mga setting", "yat_popup_title": "Ang iyong wallet address ay maaring ma-emojified.", + "yes": "Oo", "yesterday": "Kahapon", "you_now_have_debit_card": "Mayroon ka na ngayong debit card", "you_pay": "Magbayad ka", diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index eb05ccb526..7cdfe64194 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "İşlemin onaylaması ve ekrana yansıtılması birkaç saniye sürebilir", "device_is_signing": "Cihaz imzalıyor", "dfx_option_description": "Eur & chf ile kripto satın alın. Avrupa'daki perakende ve kurumsal müşteriler için", + "did_you_back_up_seeds": "Tüm tohumlarınızı yedeklediniz mi?", "didnt_get_code": "Kod gelmedi mi?", "digit_pin": " haneli PIN", "digital_and_physical_card": " Dijital para birimleri ile para yükleyebileceğiniz ve ek bilgiye gerek olmayan", @@ -310,6 +311,9 @@ "domain_mismatch_description": "Bu web sitesinde, bu isteğin göndereniyle eşleşmeyen bir etki alanı vardır. Onaylama fon kaybına yol açabilir.", "donation_link_details": "Bağış bağlantısı ayrıntıları", "done": "Tamamlamak", + "duress_pin_description": "Bu, çoğu kullanıcı tarafından kullanılmaması gereken gelişmiş bir özellik olan Duress PIN'ini oluşturacaktır. Bu PIN yalnızca tehlikede olduğunuzda kullanılmalıdır. Bu PIN'i kullandıktan sonra tüm cüzdanlarınız silinecektir, bu nedenle lütfen kullanmadan önce tüm tohumlarınızın yedeklendiğinden emin olun.", + "durres_PIN": "Zorlama PIN'i", + "durres_PIN_set_up_successfully": "Zorlama PIN'i başarıyla kuruldu", "e_sign_consent": "E-İmza Onayı", "edit": "Düzenle", "edit_backup_password": "Yedek parolasını değiştir", @@ -549,6 +553,7 @@ "new_transactions_notifications": "Yeni işlemler hakkında bildirimler gönderin", "new_wallet": "Yeni Cüzdan", "newConnection": "Yeni bağlantı", + "no": "HAYIR", "no_cards_found": "Kart bulunamadı", "no_extra_detail": "Ekstra ayrıntı yok", "no_id_needed": "Kimlik gerekmez!", @@ -861,6 +866,7 @@ "setup_2fa": "Kurulum Pastası 2FA", "setup_2fa_text": "Cake 2FA, ikinci kimlik doğrulama faktörü olarak TOTP'yi kullanarak çalışır.\n\nCake 2FA'nın TOTP'si SHA-512 ve 8 haneli destek gerektirir; bu daha fazla güvenlik sağlar. Daha fazla bilgi ve desteklenen uygulamalar kılavuzda bulunabilir.", "setup_pin": "PIN kodu kurulumu", + "setup_pin_is_failed": "Kurulum pini hatayla başarısız oldu:", "setup_successful": "PIN kodun başarıyla ayarlandı!", "setup_totp_recommended": "TOTP'yi kur", "setup_warning_2fa_text": "Cüzdanınızı anımsatıcı tohumdan geri yüklemeniz gerekecek.\n\n2FA veya anımsatıcı tohumlarınıza erişiminizi kaybederseniz pasta desteği size yardımcı olamayacaktır.\nCake 2FA, cüzdandaki belirli eylemler için ikinci bir kimlik doğrulamadır. Cake 2FA'yı kullanmadan önce kılavuzu okumanızı öneririz.Soğuk hava deposu kadar güvenli DEĞİLDİR.\n\n2FA uygulamanıza veya TOTP anahtarlarınıza erişiminizi kaybederseniz bu cüzdana erişimi KAYBEDECEKSİNİZ. ", @@ -1154,6 +1160,7 @@ "yat_error_content": "Bu Yat'a bağlı bir adres yok. Başka bir Yat'ı deneyin", "yat_popup_content": "Artık Cake Wallet'ta kısa, emoji tabanlı bir kullanıcı adı olan Yat'ınızla kripto gönderebilir ve alabilirsiniz. Yats'ı istediğiniz zaman ayarlar ekranından yönetebilirsiniz", "yat_popup_title": "Cüzdan adresiniz emojileştirilebilir.", + "yes": "Evet", "yesterday": "Dün", "you_now_have_debit_card": "Artık bir ön ödemeli kartın var", "you_pay": "Şu kadar ödeyeceksin: ", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index 475d2764a9..b651cf28dc 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "Це може знадобитися кілька секунд, щоб транзакція підтвердила та відображалася на екрані", "device_is_signing": "Пристрій підписується", "dfx_option_description": "Купуйте криптовалюту з EUR & CHF. Для роздрібних та корпоративних клієнтів у Європі", + "did_you_back_up_seeds": "Ви створили резервні копії всіх своїх насіння?", "didnt_get_code": "Не отримали код?", "digit_pin": "-значний PIN", "digital_and_physical_card": " цифрова та фізична передплачена дебетова картка", @@ -310,6 +311,9 @@ "domain_mismatch_description": "Цей веб -сайт має домен, який не відповідає відправнику цього запиту. Затвердження може призвести до втрати коштів.", "donation_link_details": "Деталі посилання для пожертв", "done": "Виконаний", + "duress_pin_description": "Це налаштує PIN-код примусу, розширену функцію, яку не слід використовувати більшості користувачів. Цей PIN-код слід використовувати, лише якщо вам загрожує небезпека. Після використання цього PIN-коду всі ваші гаманці буде видалено, тому, будь ласка, переконайтеся, що для всіх ваших початкових кодів створено резервні копії перед його використанням.", + "durres_PIN": "PIN-код із примусу", + "durres_PIN_set_up_successfully": "PIN-код для примусу успішно встановлено", "e_sign_consent": "Згода електронного підпису", "edit": "Редагувати", "edit_backup_password": "Змінити пароль резервної копії", @@ -549,6 +553,7 @@ "new_transactions_notifications": "Надішліть сповіщення про нові транзакції", "new_wallet": "Новий гаманець", "newConnection": "Нове підключення", + "no": "немає", "no_cards_found": "Карт не знайдено", "no_extra_detail": "Немає додаткових деталей", "no_id_needed": "Ідентифікатор не потрібен!", @@ -862,6 +867,7 @@ "setup_2fa": "Налаштування Cake 2FA", "setup_2fa_text": "Cake 2FA працює з використанням TOTP як другого фактора автентифікації.\n\nДля TOTP Cake 2FA потрібен SHA-512 і підтримка 8 цифр; це забезпечує підвищену безпеку. Додаткову інформацію та підтримувані програми можна знайти в посібнику.", "setup_pin": "Встановити PIN", + "setup_pin_is_failed": "Помилка встановлення PIN-коду з помилкою:", "setup_successful": "PIN було успішно встановлено!", "setup_totp_recommended": "Налаштувати TOTP", "setup_warning_2fa_text": "Cake 2FA — друга аутентифікація для певних дій у гаманці. Це НЕ так безпечно, як холодне зберігання.\n\nЯкщо ви втратите доступ до своєї програми 2FA або ключів TOTP, ви втратите доступ до цього гаманця. Вам потрібно буде відновити свій гаманець з мнемоніки.\n\nСлужба підтримки Cake не зможе вам допомогти, якщо ви втратите доступ до 2FA або мнемонічних насадок.\nПеред використанням Cake 2FA рекомендуємо прочитати інструкцію.", @@ -1155,6 +1161,7 @@ "yat_error_content": "Немає адрес, пов'язаних з цим Yat. Спробуйте інший Yat", "yat_popup_content": "Тепер ви можете відправляти і отримувати криптовалюту в Cake Wallet за допомогою Yat - короткого імені користувача на основі емодзі. Керуйте Yat в будь-який час за допомогою екрану налаштувань", "yat_popup_title": "Адреса вашого гаманця може бути пов'язаною з емодзі", + "yes": "так", "yesterday": "Вчора", "you_now_have_debit_card": "Тепер у вас є дебетова картка", "you_pay": "Ви платите", diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index 5fd0c22f0e..0789ff3a5a 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "لین دین کی تصدیق اور اسکرین پر عکاسی کرنے میں اس میں کچھ سیکنڈ لگ سکتے ہیں", "device_is_signing": "ڈیوائس پر دستخط کر رہے ہیں", "dfx_option_description": "یورو اور سی ایچ ایف کے ساتھ کرپٹو خریدیں۔ یورپ میں خوردہ اور کارپوریٹ صارفین کے لئے", + "did_you_back_up_seeds": "کیا آپ نے اپنے تمام بیجوں کا بیک اپ لیا؟", "didnt_get_code": "کوڈ نہیں ملتا؟", "digit_pin": "-ہندسوں کا پن", "digital_and_physical_card": " ڈیجیٹل اور فزیکل پری پیڈ ڈیبٹ کارڈ", @@ -310,6 +311,9 @@ "domain_mismatch_description": "اس ویب سائٹ میں ایک ڈومین ہے جو اس درخواست کے مرسل سے مماثل نہیں ہے۔ منظوری سے فنڈز کا نقصان ہوسکتا ہے۔", "donation_link_details": "عطیہ کے لنک کی تفصیلات", "done": "کیا", + "duress_pin_description": "اس سے ایک سخت پن قائم ہوگا ، ایک اعلی درجے کی خصوصیت جسے زیادہ تر صارفین استعمال نہیں کرنا چاہئے۔ اس پن کو صرف اس صورت میں استعمال کیا جانا چاہئے جب آپ کو خطرہ ہو۔ اس پن کو استعمال کرنے کے بعد ، آپ کے تمام بٹوے حذف ہوجائیں گے ، لہذا براہ کرم یقینی بنائیں کہ آپ کے تمام بیجوں کو استعمال کرنے سے پہلے اس کا بیک اپ لیا گیا ہے۔", + "durres_PIN": "ڈینیس پن", + "durres_PIN_set_up_successfully": "ڈینیس پن کو کامیابی کے ساتھ ترتیب دیا گیا ہے", "e_sign_consent": "ای سائن کنسنٹ", "edit": "ترمیم", "edit_backup_password": "بیک اپ پاس ورڈ میں ترمیم کریں۔", @@ -549,6 +553,7 @@ "new_transactions_notifications": "نئے لین دین کے بارے میں اطلاعات بھیجیں", "new_wallet": "نیا پرس", "newConnection": "ﻦﺸﮑﻨﮐ ﺎﯿﻧ", + "no": "نہیں", "no_cards_found": "کوئی کارڈ نہیں ملا", "no_extra_detail": "کوئی اضافی تفصیلات دستیاب نہیں ہیں", "no_id_needed": "شناخت کی ضرورت نہیں!", @@ -863,6 +868,7 @@ "setup_2fa": "سیٹ اپ کیک 2FA", "setup_2fa_text": " ۔ﮯﮨ ﺎﺗﺮﮐ ﻡﺎﮐ ﮯﺋﻮﮨ ﮯﺗﺮﮐ ﻝﺎﻤﻌﺘﺳﺍ ﺎﮐ TOTP ﺮﭘ ﺭﻮﻃ ﮯﮐ ﺮﺼﻨﻋ ﯽﻘﯾﺪﺼﺗ ﮮﺮﺳﻭﺩ 2FA ﮏﯿﮐ", "setup_pin": "PIN سیٹ اپ کریں۔", + "setup_pin_is_failed": "سیٹ اپ پن غلطی کے ساتھ ناکام ہے:", "setup_successful": "آپ کا PIN کامیابی کے ساتھ ترتیب دیا گیا ہے!", "setup_totp_recommended": "TOTP ۔ﮟﯾﺮﮐ ﭖﺍ ﭧﯿﺳ", "setup_warning_2fa_text": " ۔ﯽﮔﻮﮨ ﺕﺭﻭﺮﺿ ﯽﮐ ﮯﻧﺮﮐ ﻝﺎﺤﺑ ﻮﮐ ﮮﻮﭩﺑ ﮯﻨﭘﺍ ﮯﺳ ﺞﯿﺑ ﮯﮐ ﺖﺷﺍﺩﺩﺎﯾ ﻮﮐ ﭖﺁ", @@ -1156,6 +1162,7 @@ "yat_error_content": "اس Yat کے ساتھ کوئی پتے منسلک نہیں ہیں۔ ایک اور یات آزمائیں۔", "yat_popup_content": "اب آپ Cake Wallet میں اپنے Yat کے ساتھ کرپٹو بھیج اور وصول کر سکتے ہیں - ایک مختصر، ایموجی پر مبنی صارف نام۔ ترتیبات کی سکرین پر کسی بھی وقت Yats کا نظم کریں۔", "yat_popup_title": "آپ کے بٹوے کا پتہ ایموجائز کیا جا سکتا ہے۔", + "yes": "ہاں", "yesterday": "کل", "you_now_have_debit_card": "اب آپ کے پاس ڈیبٹ کارڈ ہے۔", "you_pay": "تم ادا کرو", diff --git a/res/values/strings_vi.arb b/res/values/strings_vi.arb index f593c26f5c..0e8b601dfa 100644 --- a/res/values/strings_vi.arb +++ b/res/values/strings_vi.arb @@ -278,6 +278,7 @@ "deuro_tx_commited_content": "Có thể mất vài giây để giao dịch xác nhận và được phản ánh trên màn hình", "device_is_signing": "Thiết bị đang ký", "dfx_option_description": "Mua tiền điện tử bằng EUR & CHF. Dành cho khách hàng bán lẻ và doanh nghiệp tại Châu Âu", + "did_you_back_up_seeds": "Bạn đã sao lưu tất cả hạt giống của mình chưa?", "didnt_get_code": "Không nhận được mã?", "digit_pin": "Mã PIN - số", "digital_and_physical_card": "thẻ ghi nợ trả trước kỹ thuật số và vật lý", @@ -309,6 +310,9 @@ "domain_mismatch_description": "Trang web này có một tên miền không khớp với người gửi yêu cầu này. Phê duyệt có thể dẫn đến mất tiền.", "donation_link_details": "Chi tiết liên kết quyên góp", "done": "Xong", + "duress_pin_description": "Thao tác này sẽ thiết lập mã PIN Duress, một tính năng nâng cao mà hầu hết người dùng không nên sử dụng. Mã PIN này chỉ nên được sử dụng nếu bạn gặp nguy hiểm. Sau khi sử dụng mã PIN này, tất cả ví của bạn sẽ bị xóa, vì vậy hãy đảm bảo rằng tất cả các hạt giống của bạn đã được sao lưu trước khi sử dụng.", + "durres_PIN": "Cưỡng bức mã PIN", + "durres_PIN_set_up_successfully": "Mã PIN cưỡng bức đã được thiết lập thành công", "e_sign_consent": "Đồng ý Ký Điện tử", "edit": "Chỉnh sửa", "edit_backup_password": "Chỉnh sửa mật khẩu sao lưu", @@ -548,6 +552,7 @@ "new_transactions_notifications": "Gửi thông báo về các giao dịch mới", "new_wallet": "Ví mới", "newConnection": "Kết nối mới", + "no": "KHÔNG", "no_cards_found": "Không tìm thấy thẻ", "no_extra_detail": "Không có thêm chi tiết có sẵn", "no_id_needed": "Không cần ID!", @@ -858,6 +863,7 @@ "setup_2fa": "Thiết lập Cake 2FA", "setup_2fa_text": "Cake 2FA hoạt động bằng cách sử dụng TOTP làm yếu tố xác thực thứ hai.\n\nTOTP của Cake 2FA yêu cầu hỗ trợ SHA-512 và 8 chữ số; điều này cung cấp bảo mật cao hơn. Thông tin thêm và các ứng dụng hỗ trợ có thể được tìm thấy trong hướng dẫn.", "setup_pin": "Thiết lập PIN", + "setup_pin_is_failed": "Pin thiết lập không thành công với lỗi:", "setup_successful": "PIN của bạn đã được thiết lập thành công!", "setup_totp_recommended": "Thiết lập TOTP", "setup_warning_2fa_text": "Cake 2FA là xác thực thứ hai cho một số hành động trong ví. Nó KHÔNG an toàn như lưu trữ lạnh.\n\nNếu bạn mất quyền truy cập vào ứng dụng 2FA hoặc các khóa TOTP, bạn SẼ mất quyền truy cập vào ví này. Bạn sẽ cần phải khôi phục ví của bạn từ hạt giống nhớ.\n\nHỗ trợ Cake sẽ không thể hỗ trợ bạn nếu bạn mất quyền truy cập vào 2FA hoặc hạt giống nhớ của bạn.\nTrước khi sử dụng Cake 2FA, chúng tôi khuyến nghị đọc kỹ hướng dẫn.", @@ -1151,6 +1157,7 @@ "yat_error_content": "Không có địa chỉ liên kết với Yat này. Thử Yat khác", "yat_popup_content": "Bây giờ bạn có thể gửi và nhận crypto trong Cake Wallet với Yat của bạn - một tên người dùng ngắn gọn dựa trên emoji. Quản lý Yats bất cứ lúc nào trên màn hình cài đặt", "yat_popup_title": "Địa chỉ ví của bạn có thể được chuyển thành emoji.", + "yes": "Đúng", "yesterday": "Hôm qua", "you_now_have_debit_card": "Bạn hiện có một thẻ ghi nợ", "you_pay": "Bạn thanh toán", diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index 0292f1c2b4..b1edd1a6e2 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "O le gba tọkọtaya kan ti awọn aaya fun idunadura lati jẹrisi ati ṣe afihan loju iboju", "device_is_signing": "Ẹrọ n forukọsilẹ", "dfx_option_description": "Ra Crypto pẹlu EUR & CHF. Fun soobu ati awọn alabara ile-iṣẹ ni Yuroopu", + "did_you_back_up_seeds": "Ṣe o ṣe afẹyinti gbogbo awọn irugbin rẹ?", "didnt_get_code": "Ko gba koodu?", "digit_pin": "-díjíìtì òǹkà ìdánimọ̀ àdáni", "digital_and_physical_card": " káàdì ìrajà t'ara àti ti ayélujára", @@ -311,6 +312,9 @@ "donation_link_details": "Iru awọn ẹya ọrọ ti o funni", "done": "Ṣe", "dont_get_code": "Ṣé ẹ ti gba ọ̀rọ̀ ìdánimọ̀?", + "duress_pin_description": "Eyi yoo ṣeto PIN kan ti o ga julọ, ẹya ti ilọsiwaju ti ko yẹ ki o ṣee lo nipasẹ ọpọlọpọ awọn olumulo. PIN yii yẹ ki o lo nikan ti o ba wa ninu ewu. Lẹhin lilo PIN yii, gbogbo awọn Wo inu rẹ yoo paarẹ, nitorinaa rii daju pe gbogbo awọn irugbin rẹ ti ṣe afẹyinti ṣaaju lilo rẹ.", + "durres_PIN": "Dushess PIN", + "durres_PIN_set_up_successfully": "O ti ṣeto PIN ti a ti ṣeto ni ifijišẹ", "e_sign_consent": "Jẹ́rìí sí lórí ayélujára", "edit": "Pààrọ̀", "edit_backup_password": "Pààrọ̀ ọ̀rọ̀ aṣínà", @@ -550,6 +554,7 @@ "new_transactions_notifications": "Firanṣẹ awọn iwifunni nipa awọn iṣowo tuntun", "new_wallet": "Àpamọ́wọ́ títun", "newConnection": "Tuntun Asopọ", + "no": "Kọ", "no_cards_found": "Ko si awọn kaadi ti a rii", "no_extra_detail": "Ko si awọn alaye afikun ti o wa", "no_id_needed": "Ẹ kò nílò àmì ìdánimọ̀!", @@ -862,6 +867,7 @@ "setup_2fa": "Ṣeto Cake 2FA", "setup_2fa_text": "Akara oyinbo 2FA ṣiṣẹ ni lilo TOTP bi ifosiwewe ijẹrisi keji.\n\nAkara oyinbo 2FA's TOTP nilo SHA-512 ati atilẹyin oni-nọmba 8; eyi pese aabo ti o pọ sii. Alaye diẹ sii ati awọn ohun elo atilẹyin ni a le rii ninu itọsọna naa.", "setup_pin": "Setup òǹkà ìdánimọ̀ àdáni", + "setup_pin_is_failed": "Pin PIN ti kuna pẹlu aṣiṣe:", "setup_successful": "Òǹkà ìdánimọ̀ àdáni yín ti ṣe!", "setup_totp_recommended": "Ṣeto TOTP", "setup_warning_2fa_text": "Iwọ yoo nilo lati mu pada apamọwọ rẹ lati inu irugbin mnemonic.\n\nAtilẹyin akara oyinbo kii yoo ni anfani lati ṣe iranlọwọ fun ọ ti o ba padanu iraye si 2FA tabi awọn irugbin mnemonic rẹ.\nAkara oyinbo 2FA jẹ ijẹrisi keji fun awọn iṣe kan ninu apamọwọ. Ṣaaju lilo akara oyinbo 2FA, a ṣeduro kika nipasẹ itọsọna naa.Ko ṣe aabo bi ibi ipamọ tutu.\n\nTi o ba padanu iraye si ohun elo 2FA tabi awọn bọtini TOTP, iwọ YOO padanu iraye si apamọwọ yii. ", @@ -1155,6 +1161,7 @@ "yat_error_content": "Kò sí àdírẹ́sìkádírẹ́sì tó so Yat yìí. Ẹ gbìyànjú Yat mìíràn", "yat_popup_content": "Ẹ lè fi Yat yín (orúkọ olùṣàmúlò kúkurú t'á dá lórí emójì) ránṣẹ́ àti gba owó nínú Cake Wallet lọ́wọ́lọ́wọ́. Bójú Yats lórí ojú ààtò lígbàkúgbà.", "yat_popup_title": "Ẹ lè dá àpamọ́wọ́ yín láti emójì.", + "yes": "Bẹẹni", "yesterday": "Lánàá", "you_now_have_debit_card": "Ẹ ni káàdì ìrajà lọ́wọ́lọ́wọ́", "you_pay": "Ẹ sàn", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 0456e4dfc8..e25e7e18f6 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -279,6 +279,7 @@ "deuro_tx_commited_content": "交易可能需要几秒钟才能确认并在屏幕上反射", "device_is_signing": "设备正在签名", "dfx_option_description": "用Eur&Chf购买加密货币。对于欧洲的零售和企业客户", + "did_you_back_up_seeds": "您备份了所有种子吗?", "didnt_get_code": "没有获取代码?", "digit_pin": "位 PIN", "digital_and_physical_card": "数字和物理预付借记卡", @@ -310,6 +311,9 @@ "domain_mismatch_description": "该网站的域与此请求的发件人的发件人不匹配。批准可能导致资金损失。", "donation_link_details": "捐赠链接详情", "done": "完毕", + "duress_pin_description": "这将设置胁迫 PIN,这是大多数用户不应使用的高级功能。仅当您遇到危险时才应使用此 PIN 码。使用此 PIN 码后,您的所有钱包都将被删除,因此请确保在使用之前备份您的所有种子。", + "durres_PIN": "胁迫密码", + "durres_PIN_set_up_successfully": "胁迫密码已成功设置", "e_sign_consent": "电子签名同意", "edit": "编辑", "edit_backup_password": "编辑备份密码", @@ -549,6 +553,7 @@ "new_transactions_notifications": "发送有关新交易的通知", "new_wallet": "新钱包", "newConnection": "新连接", + "no": "不", "no_cards_found": "找不到卡", "no_extra_detail": "没有其他详细信息", "no_id_needed": "不需要 ID!", @@ -861,6 +866,7 @@ "setup_2fa": "设置蛋糕 2FA", "setup_2fa_text": "Cake 2FA 使用 TOTP 作为第二个身份验证因素。\n\nCake 2FA 的 TOTP 需要 SHA-512 和 8 位数字支持;这提供了更高的安全性。更多信息和支持的应用程序可以在指南中找到。", "setup_pin": "设定PIN码", + "setup_pin_is_failed": "设置引脚失败并出现错误:", "setup_successful": "您的PIN码已成功设置!", "setup_totp_recommended": "设置 TOTP", "setup_warning_2fa_text": "Cake 2FA 是对钱包中某些操作的二次验证。它不如冷藏那么安全。\n\n如果您无法访问 2FA 应用程序或 TOTP 密钥,您将无法访问此钱包。您需要从助记词种子中恢复您的钱包。\n\n如果您无法访问 2FA 或助记词种子,Cake 支持将无法为您提供帮助。\n在使用 Cake 2FA 之前,我们建议您阅读该指南。", @@ -1154,6 +1160,7 @@ "yat_error_content": "沒有與此 Yat 相關聯的地址。 嘗試另一個 Yat", "yat_popup_content": "您現在可以使用 Yat 在 Cake Wallet 中發送和接收加密貨幣 - 一個基於表情符號的簡短用戶名。 在設置屏幕上隨時管理 Yats", "yat_popup_title": "您的錢包地址可以被表情化。", + "yes": "是的", "yesterday": "昨天", "you_now_have_debit_card": "你现在有一张借记卡", "you_pay": "你付钱", diff --git a/tool/configure.dart b/tool/configure.dart index 3e292cf072..caac8b3925 100644 --- a/tool/configure.dart +++ b/tool/configure.dart @@ -2062,6 +2062,7 @@ abstract class SecureStorage { Future read({required String key}); Future write({required String key, required String? value}); Future delete({required String key}); + Future deleteAll(); // Legacy Future readNoIOptions({required String key}); Future> readAll(); @@ -2094,6 +2095,9 @@ class DefaultSecureStorage extends SecureStorage { @override Future delete({required String key}) async => _secureStorage.delete(key: key); + + @override + Future deleteAll() async => _secureStorage.deleteAll(); @override Future readNoIOptions({required String key}) async => await _readInternal(key, true); @@ -2119,6 +2123,8 @@ class FakeSecureStorage extends SecureStorage { @override Future delete({required String key}) async {} @override + Future deleteAll() async {} + @override Future readNoIOptions({required String key}) async => null; @override Future> readAll() async => {}; From 66a8e895af43617df26ac53861117b700d4d8ec7 Mon Sep 17 00:00:00 2001 From: malik1004x Date: Sat, 22 Nov 2025 19:31:58 +0100 Subject: [PATCH 071/105] Show fiat amount for tokens on swipe confirmation sheet (#2670) * fix: fiat amount not showing for tokens on the swipe to send confirmation sheet * fix: fiat amount not showing for tokens on the swipe to send confirmation sheet --- cw_core/lib/crypto_currency.dart | 4 ++++ lib/view_model/send/send_view_model.dart | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/cw_core/lib/crypto_currency.dart b/cw_core/lib/crypto_currency.dart index 952d7c08ad..b35531b724 100644 --- a/cw_core/lib/crypto_currency.dart +++ b/cw_core/lib/crypto_currency.dart @@ -393,4 +393,8 @@ class CryptoCurrency extends EnumerableItem with Serializable implemen @override String toString() => title; + + bool titleAndTagEqual(CryptoCurrency other) { + return title == other.title && tag == other.tag; + } } diff --git a/lib/view_model/send/send_view_model.dart b/lib/view_model/send/send_view_model.dart index 1b446e0203..24f71cac44 100644 --- a/lib/view_model/send/send_view_model.dart +++ b/lib/view_model/send/send_view_model.dart @@ -191,7 +191,8 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor try { final fiat = calculateFiatAmount( - price: _fiatConversationStore.prices[selectedCryptoCurrency]!, + price: _fiatConversationStore.prices[_fiatConversationStore.prices.keys + .firstWhere((k) => k.titleAndTagEqual(selectedCryptoCurrency))], cryptoAmount: pendingTransaction!.amountFormatted); return fiat; } catch (_) { From 8ca44cd6203d85d2f52c6d3c47e4eb1ddc02b527 Mon Sep 17 00:00:00 2001 From: Robert Malikowski Date: Mon, 24 Nov 2025 13:03:43 +0100 Subject: [PATCH 072/105] feat: trade history in new ui --- .../assets_history/history_section.dart | 57 +++++--- .../assets_history/history_trade_tile.dart | 138 ++++++++++++++++++ 2 files changed, 175 insertions(+), 20 deletions(-) create mode 100644 lib/new-ui/widgets/coins_page/assets_history/history_trade_tile.dart diff --git a/lib/new-ui/widgets/coins_page/assets_history/history_section.dart b/lib/new-ui/widgets/coins_page/assets_history/history_section.dart index 745517cbbc..cc68de3456 100644 --- a/lib/new-ui/widgets/coins_page/assets_history/history_section.dart +++ b/lib/new-ui/widgets/coins_page/assets_history/history_section.dart @@ -1,11 +1,12 @@ import 'package:cake_wallet/new-ui/widgets/coins_page/assets_history/history_tile.dart'; +import 'package:cake_wallet/new-ui/widgets/coins_page/assets_history/history_trade_tile.dart'; import 'package:cake_wallet/utils/date_formatter.dart'; import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; import 'package:cake_wallet/view_model/dashboard/date_section_item.dart'; +import 'package:cake_wallet/view_model/dashboard/trade_list_item.dart'; import 'package:cake_wallet/view_model/dashboard/transaction_list_item.dart'; import 'package:flutter/material.dart'; - class HistorySection extends StatelessWidget { const HistorySection({super.key, required this.dashboardViewModel}); @@ -22,32 +23,48 @@ class HistorySection extends StatelessWidget { itemBuilder: (context, index) { final prevItem = index == 0 ? null : dashboardViewModel.items[index - 1]; final item = dashboardViewModel.items[index]; - final nextItem = index == dashboardViewModel.items.length - 1 ? null : dashboardViewModel.items[index + 1]; - + final nextItem = index == dashboardViewModel.items.length - 1 + ? null + : dashboardViewModel.items[index + 1]; - if(item is TransactionListItem) { + if (item is TransactionListItem) { final transaction = item.transaction; - final transactionType = - dashboardViewModel.getTransactionType(transaction); + final transactionType = dashboardViewModel.getTransactionType(transaction); return HistoryTile( - title: item.formattedTitle + item.formattedStatus + transactionType, - date: DateFormatter.convertDateTimeToReadableString(item.date), - amount: item.formattedCryptoAmount, - amountFiat: item.formattedFiatAmount, - roundedBottom: !(nextItem is TransactionListItem), - roundedTop: !(prevItem is TransactionListItem), - bottomSeparator: nextItem is TransactionListItem, - direction: item.transaction.direction, - pending: item.transaction.isPending - ); + title: item.formattedTitle + item.formattedStatus + transactionType, + date: DateFormatter.convertDateTimeToReadableString(item.date), + amount: item.formattedCryptoAmount, + amountFiat: item.formattedFiatAmount, + roundedBottom: !(nextItem is TransactionListItem || nextItem is TradeListItem), + roundedTop: !(prevItem is TransactionListItem || prevItem is TradeListItem), + bottomSeparator: nextItem is TransactionListItem || nextItem is TradeListItem, + direction: item.transaction.direction, + pending: item.transaction.isPending); + } else if (item is TradeListItem) { + final trade = item.trade; + final tradeFrom = trade.fromRaw >= 0 ? trade.from : trade.userCurrencyFrom; - } else if(item is DateSectionItem){ - return Text(DateFormatter.convertDateTimeToReadableString(item.date)); - } + final tradeTo = trade.toRaw >= 0 ? trade.to : trade.userCurrencyTo; - else return Text(item.runtimeType.toString()); + return HistoryTradeTile( + from: tradeFrom!, + to: tradeTo!, + date: DateFormatter.convertDateTimeToReadableString(item.date), + amount: trade.amountFormatted(), + receiveAmount: trade.receiveAmountFormatted(), + roundedBottom: !(nextItem is TransactionListItem || nextItem is TradeListItem), + roundedTop: !(prevItem is TransactionListItem || prevItem is TradeListItem), + bottomSeparator: nextItem is TransactionListItem || nextItem is TradeListItem, + swapState: trade.state, + ); + } else if (item is DateSectionItem) { + return Padding( + padding: EdgeInsets.only(left: 8.0, bottom: 8.0), + child: Text(DateFormatter.convertDateTimeToReadableString(item.date))); + } else + return Text(item.runtimeType.toString()); }, ), ); diff --git a/lib/new-ui/widgets/coins_page/assets_history/history_trade_tile.dart b/lib/new-ui/widgets/coins_page/assets_history/history_trade_tile.dart new file mode 100644 index 0000000000..5c746081c8 --- /dev/null +++ b/lib/new-ui/widgets/coins_page/assets_history/history_trade_tile.dart @@ -0,0 +1,138 @@ +import 'package:cake_wallet/exchange/trade_state.dart'; +import 'package:cw_core/crypto_currency.dart'; +import 'package:flutter/material.dart'; + +class HistoryTradeTile extends StatelessWidget { + const HistoryTradeTile( + {super.key, + required this.date, + required this.amount, + required this.receiveAmount, + required this.roundedTop, + required this.roundedBottom, + required this.bottomSeparator, + required this.from, + required this.to, + required this.swapState}); + + final CryptoCurrency from; + final CryptoCurrency to; + final String date; + final String amount; + final String receiveAmount; + final bool roundedTop; + final bool roundedBottom; + final bool bottomSeparator; + final TradeState swapState; + + @override + Widget build(BuildContext context) { + double currencyIconSize = 30.0; + + return Column( + children: [ + Container( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surfaceContainer, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(roundedTop ? 12.0 : 0.0), + topRight: Radius.circular(roundedTop ? 12.0 : 0.0), + bottomLeft: Radius.circular(roundedBottom ? 12.0 : 0.0), + bottomRight: Radius.circular(roundedBottom ? 12.0 : 0.0), + )), + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 12.0, + horizontal: 12.0, + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(0.0, 0.0, 8.0, 0.0), + child: SizedBox( + height: 50, + width: 50, + child: Stack( + children: [ + Image.asset(_getIconPath(from), + width: currencyIconSize, height: currencyIconSize), + Positioned( + top: currencyIconSize / 2, + left: currencyIconSize / 2, + child: Container( + decoration: BoxDecoration( + border: Border.all( + width: 1, + color: Theme.of(context).colorScheme.surfaceContainer), + shape: BoxShape.circle), + child: Image.asset(_getIconPath(to), + width: currencyIconSize, height: currencyIconSize))), + ], + ), + ), + ), + Expanded( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("${from.toString()} → ${to.toString()}"), + Text(date), + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text("$amount ${from.toString()}"), + Text("$receiveAmount ${to.toString()}"), + ], + ), + ], + ), + ), + ], + ), + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 12.0), + child: SizedBox( + height: 1, + child: DecoratedBox( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surfaceContainerHigh, + ), + ), + ), + ), + ], + ); + } + + String _getIconPath(CryptoCurrency currency) { + if (currency.iconPath != null) { + return currency.iconPath!; + } + + if (currency.name.isNotEmpty) { + final currencyFromName = CryptoCurrency.fromString(currency.name); + if (currencyFromName.iconPath != null) { + return currencyFromName.iconPath!; + } + } + + if (currency.title.isNotEmpty) { + final currencyFromTitle = CryptoCurrency.fromString(currency.title); + if (currencyFromTitle.iconPath != null) { + return currencyFromTitle.iconPath!; + } + } + + //TODO approporiate fallback + return ""; + } +} From 908c8de2e8e2dee691cbcaa56470905e70319ad7 Mon Sep 17 00:00:00 2001 From: malik1004x Date: Mon, 24 Nov 2025 14:44:21 +0100 Subject: [PATCH 073/105] Dark and tinted icons for iOS (#2671) * feat: new ios icon format with dark/tinted icons * feat: switch monero.com icons to new format * update gitignore --- .gitignore | 23 +- .../cakewallet_ios_icons/Contents.json | 533 ++++++++++++++++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 333235 bytes .../Icon-App-20x20@2x.png | Bin 0 -> 1516 bytes .../Icon-App-20x20@3x.png | Bin 0 -> 2716 bytes .../Icon-App-29x29@2x.png | Bin 0 -> 2502 bytes .../Icon-App-29x29@3x.png | Bin 0 -> 4617 bytes .../Icon-App-38x38@2x.png | Bin 0 -> 3616 bytes .../Icon-App-38x38@3x.png | Bin 0 -> 6322 bytes .../Icon-App-40x40@2x.png | Bin 0 -> 4003 bytes .../Icon-App-40x40@3x.png | Bin 0 -> 6659 bytes .../Icon-App-60x60@2x.png | Bin 0 -> 6659 bytes .../Icon-App-60x60@3x.png | Bin 0 -> 12860 bytes .../Icon-App-64x64@2x.png | Bin 0 -> 7172 bytes .../Icon-App-64x64@3x.png | Bin 0 -> 14393 bytes .../Icon-App-68x68@2x.png | Bin 0 -> 8174 bytes .../Icon-App-76x76@2x.png | Bin 0 -> 9839 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 12566 bytes .../Icon-App-Dark-1024x1024@1x.png | Bin 0 -> 394668 bytes .../Icon-App-Dark-20x20@2x.png | Bin 0 -> 1608 bytes .../Icon-App-Dark-20x20@3x.png | Bin 0 -> 2768 bytes .../Icon-App-Dark-29x29@2x.png | Bin 0 -> 2787 bytes .../Icon-App-Dark-29x29@3x.png | Bin 0 -> 4628 bytes .../Icon-App-Dark-38x38@2x.png | Bin 0 -> 3590 bytes .../Icon-App-Dark-38x38@3x.png | Bin 0 -> 6330 bytes .../Icon-App-Dark-40x40@2x.png | Bin 0 -> 4012 bytes .../Icon-App-Dark-40x40@3x.png | Bin 0 -> 6634 bytes .../Icon-App-Dark-60x60@2x.png | Bin 0 -> 6634 bytes .../Icon-App-Dark-60x60@3x.png | Bin 0 -> 13248 bytes .../Icon-App-Dark-64x64@2x.png | Bin 0 -> 6945 bytes .../Icon-App-Dark-64x64@3x.png | Bin 0 -> 14844 bytes .../Icon-App-Dark-68x68@2x.png | Bin 0 -> 8099 bytes .../Icon-App-Dark-76x76@2x.png | Bin 0 -> 9880 bytes .../Icon-App-Dark-83.5x83.5@2x.png | Bin 0 -> 13394 bytes .../Icon-App-Tinted-1024x1024@1x.png | Bin 0 -> 126024 bytes .../Icon-App-Tinted-20x20@2x.png | Bin 0 -> 1199 bytes .../Icon-App-Tinted-20x20@3x.png | Bin 0 -> 1881 bytes .../Icon-App-Tinted-29x29@2x.png | Bin 0 -> 1835 bytes .../Icon-App-Tinted-29x29@3x.png | Bin 0 -> 2822 bytes .../Icon-App-Tinted-38x38@2x.png | Bin 0 -> 2424 bytes .../Icon-App-Tinted-38x38@3x.png | Bin 0 -> 3690 bytes .../Icon-App-Tinted-40x40@2x.png | Bin 0 -> 2656 bytes .../Icon-App-Tinted-40x40@3x.png | Bin 0 -> 4020 bytes .../Icon-App-Tinted-60x60@2x.png | Bin 0 -> 4020 bytes .../Icon-App-Tinted-60x60@3x.png | Bin 0 -> 6792 bytes .../Icon-App-Tinted-64x64@2x.png | Bin 0 -> 4041 bytes .../Icon-App-Tinted-64x64@3x.png | Bin 0 -> 7434 bytes .../Icon-App-Tinted-68x68@2x.png | Bin 0 -> 4651 bytes .../Icon-App-Tinted-76x76@2x.png | Bin 0 -> 5221 bytes .../Icon-App-Tinted-83.5x83.5@2x.png | Bin 0 -> 5999 bytes .../monero_ios_icons/AppIcon-20@2x.png | Bin 1474 -> 0 bytes .../monero_ios_icons/AppIcon-20@2x~ipad.png | Bin 1474 -> 0 bytes .../monero_ios_icons/AppIcon-20@3x.png | Bin 2597 -> 0 bytes .../monero_ios_icons/AppIcon-20~ipad.png | Bin 688 -> 0 bytes .../ios_icons/monero_ios_icons/AppIcon-29.png | Bin 1112 -> 0 bytes .../monero_ios_icons/AppIcon-29@2x.png | Bin 2465 -> 0 bytes .../monero_ios_icons/AppIcon-29@2x~ipad.png | Bin 2465 -> 0 bytes .../monero_ios_icons/AppIcon-29@3x.png | Bin 3405 -> 0 bytes .../monero_ios_icons/AppIcon-29~ipad.png | Bin 1112 -> 0 bytes .../monero_ios_icons/AppIcon-40@2x.png | Bin 3006 -> 0 bytes .../monero_ios_icons/AppIcon-40@2x~ipad.png | Bin 3006 -> 0 bytes .../monero_ios_icons/AppIcon-40@3x.png | Bin 5335 -> 0 bytes .../monero_ios_icons/AppIcon-40~ipad.png | Bin 1474 -> 0 bytes .../monero_ios_icons/AppIcon-60@2x~car.png | Bin 5335 -> 0 bytes .../monero_ios_icons/AppIcon-60@3x~car.png | Bin 7344 -> 0 bytes .../monero_ios_icons/AppIcon-83.5@2x~ipad.png | Bin 6642 -> 0 bytes .../ios_icons/monero_ios_icons/AppIcon@2x.png | Bin 5335 -> 0 bytes .../monero_ios_icons/AppIcon@2x~ipad.png | Bin 5767 -> 0 bytes .../ios_icons/monero_ios_icons/AppIcon@3x.png | Bin 7344 -> 0 bytes .../AppIcon~ios-marketing.png | Bin 69847 -> 0 bytes .../monero_ios_icons/AppIcon~ipad.png | Bin 2851 -> 0 bytes .../ios_icons/monero_ios_icons/Contents.json | 1 + .../Icon-App-1024x1024@1x.png | Bin 0 -> 50680 bytes .../monero_ios_icons/Icon-App-20x20@1x.png | Bin 0 -> 667 bytes .../monero_ios_icons/Icon-App-20x20@2x.png | Bin 0 -> 1412 bytes .../monero_ios_icons/Icon-App-20x20@3x.png | Bin 0 -> 2158 bytes .../monero_ios_icons/Icon-App-29x29@1x.png | Bin 0 -> 1006 bytes .../monero_ios_icons/Icon-App-29x29@2x.png | Bin 0 -> 2090 bytes .../monero_ios_icons/Icon-App-29x29@3x.png | Bin 0 -> 3121 bytes .../monero_ios_icons/Icon-App-40x40@1x.png | Bin 0 -> 1412 bytes .../monero_ios_icons/Icon-App-40x40@2x.png | Bin 0 -> 2862 bytes .../monero_ios_icons/Icon-App-40x40@3x.png | Bin 0 -> 4283 bytes .../monero_ios_icons/Icon-App-50x50@1x.png | Bin 0 -> 1786 bytes .../monero_ios_icons/Icon-App-50x50@2x.png | Bin 0 -> 3581 bytes .../monero_ios_icons/Icon-App-57x57@1x.png | Bin 0 -> 2014 bytes .../monero_ios_icons/Icon-App-57x57@2x.png | Bin 0 -> 3999 bytes .../monero_ios_icons/Icon-App-60x60@2x.png | Bin 0 -> 4283 bytes .../monero_ios_icons/Icon-App-60x60@3x.png | Bin 0 -> 6573 bytes .../monero_ios_icons/Icon-App-72x72@1x.png | Bin 0 -> 2588 bytes .../monero_ios_icons/Icon-App-72x72@2x.png | Bin 0 -> 5151 bytes .../monero_ios_icons/Icon-App-76x76@1x.png | Bin 0 -> 2686 bytes .../monero_ios_icons/Icon-App-76x76@2x.png | Bin 0 -> 5389 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 6086 bytes .../AppIcon.appiconset/Contents.json | 134 ----- scripts/ios/app_icon.sh | 288 +++++++--- 95 files changed, 744 insertions(+), 235 deletions(-) create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Contents.json create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-1024x1024@1x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-20x20@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-20x20@3x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-29x29@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-29x29@3x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-38x38@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-38x38@3x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-40x40@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-40x40@3x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-60x60@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-60x60@3x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-64x64@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-64x64@3x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-68x68@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-76x76@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-83.5x83.5@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-1024x1024@1x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-20x20@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-20x20@3x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-29x29@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-29x29@3x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-38x38@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-38x38@3x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-40x40@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-40x40@3x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-60x60@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-60x60@3x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-64x64@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-64x64@3x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-68x68@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-76x76@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-83.5x83.5@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-1024x1024@1x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-20x20@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-20x20@3x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-29x29@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-29x29@3x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-38x38@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-38x38@3x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-40x40@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-40x40@3x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-60x60@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-60x60@3x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-64x64@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-64x64@3x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-68x68@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-76x76@2x.png create mode 100644 assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-83.5x83.5@2x.png delete mode 100644 assets/images/ios_icons/monero_ios_icons/AppIcon-20@2x.png delete mode 100644 assets/images/ios_icons/monero_ios_icons/AppIcon-20@2x~ipad.png delete mode 100644 assets/images/ios_icons/monero_ios_icons/AppIcon-20@3x.png delete mode 100644 assets/images/ios_icons/monero_ios_icons/AppIcon-20~ipad.png delete mode 100644 assets/images/ios_icons/monero_ios_icons/AppIcon-29.png delete mode 100644 assets/images/ios_icons/monero_ios_icons/AppIcon-29@2x.png delete mode 100644 assets/images/ios_icons/monero_ios_icons/AppIcon-29@2x~ipad.png delete mode 100644 assets/images/ios_icons/monero_ios_icons/AppIcon-29@3x.png delete mode 100644 assets/images/ios_icons/monero_ios_icons/AppIcon-29~ipad.png delete mode 100644 assets/images/ios_icons/monero_ios_icons/AppIcon-40@2x.png delete mode 100644 assets/images/ios_icons/monero_ios_icons/AppIcon-40@2x~ipad.png delete mode 100644 assets/images/ios_icons/monero_ios_icons/AppIcon-40@3x.png delete mode 100644 assets/images/ios_icons/monero_ios_icons/AppIcon-40~ipad.png delete mode 100644 assets/images/ios_icons/monero_ios_icons/AppIcon-60@2x~car.png delete mode 100644 assets/images/ios_icons/monero_ios_icons/AppIcon-60@3x~car.png delete mode 100644 assets/images/ios_icons/monero_ios_icons/AppIcon-83.5@2x~ipad.png delete mode 100644 assets/images/ios_icons/monero_ios_icons/AppIcon@2x.png delete mode 100644 assets/images/ios_icons/monero_ios_icons/AppIcon@2x~ipad.png delete mode 100644 assets/images/ios_icons/monero_ios_icons/AppIcon@3x.png delete mode 100644 assets/images/ios_icons/monero_ios_icons/AppIcon~ios-marketing.png delete mode 100644 assets/images/ios_icons/monero_ios_icons/AppIcon~ipad.png create mode 100644 assets/images/ios_icons/monero_ios_icons/Contents.json create mode 100644 assets/images/ios_icons/monero_ios_icons/Icon-App-1024x1024@1x.png create mode 100644 assets/images/ios_icons/monero_ios_icons/Icon-App-20x20@1x.png create mode 100644 assets/images/ios_icons/monero_ios_icons/Icon-App-20x20@2x.png create mode 100644 assets/images/ios_icons/monero_ios_icons/Icon-App-20x20@3x.png create mode 100644 assets/images/ios_icons/monero_ios_icons/Icon-App-29x29@1x.png create mode 100644 assets/images/ios_icons/monero_ios_icons/Icon-App-29x29@2x.png create mode 100644 assets/images/ios_icons/monero_ios_icons/Icon-App-29x29@3x.png create mode 100644 assets/images/ios_icons/monero_ios_icons/Icon-App-40x40@1x.png create mode 100644 assets/images/ios_icons/monero_ios_icons/Icon-App-40x40@2x.png create mode 100644 assets/images/ios_icons/monero_ios_icons/Icon-App-40x40@3x.png create mode 100644 assets/images/ios_icons/monero_ios_icons/Icon-App-50x50@1x.png create mode 100644 assets/images/ios_icons/monero_ios_icons/Icon-App-50x50@2x.png create mode 100644 assets/images/ios_icons/monero_ios_icons/Icon-App-57x57@1x.png create mode 100644 assets/images/ios_icons/monero_ios_icons/Icon-App-57x57@2x.png create mode 100644 assets/images/ios_icons/monero_ios_icons/Icon-App-60x60@2x.png create mode 100644 assets/images/ios_icons/monero_ios_icons/Icon-App-60x60@3x.png create mode 100644 assets/images/ios_icons/monero_ios_icons/Icon-App-72x72@1x.png create mode 100644 assets/images/ios_icons/monero_ios_icons/Icon-App-72x72@2x.png create mode 100644 assets/images/ios_icons/monero_ios_icons/Icon-App-76x76@1x.png create mode 100644 assets/images/ios_icons/monero_ios_icons/Icon-App-76x76@2x.png create mode 100644 assets/images/ios_icons/monero_ios_icons/Icon-App-83.5x83.5@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/.gitignore b/.gitignore index cd2230504d..10bd0b7a80 100644 --- a/.gitignore +++ b/.gitignore @@ -144,27 +144,8 @@ lib/dogecoin/dogecoin.dart lib/base/base.dart lib/arbitrum/arbitrum.dart -ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x.png -ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x~ipad.png -ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@3x.png -ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png -ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x~ipad.png -ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@3x.png -ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20~ipad.png -ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29.png -ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x.png -ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x~ipad.png -ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@3x.png -ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29~ipad.png -ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x.png -ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x~ipad.png -ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png -ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40~ipad.png -ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x~car.png -ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x~car.png -ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x~ipad.png -ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ios-marketing.png -ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ipad.png +ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +ios/Runner/Assets.xcassets/AppIcon.appiconset/*.png ios/Runner/Info.plist android/app/src/main/res/mipmap-* diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Contents.json b/assets/images/ios_icons/cakewallet_ios_icons/Contents.json new file mode 100644 index 0000000000..858a40ad8d --- /dev/null +++ b/assets/images/ios_icons/cakewallet_ios_icons/Contents.json @@ -0,0 +1,533 @@ +{ + "images" : [ + { + "filename" : "Icon-App-20x20@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "Icon-App-20x20@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "20x20" + }, + { + "filename" : "Icon-App-29x29@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "Icon-App-29x29@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "29x29" + }, + { + "filename" : "Icon-App-38x38@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "38x38" + }, + { + "filename" : "Icon-App-38x38@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "38x38" + }, + { + "filename" : "Icon-App-40x40@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "Icon-App-40x40@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "40x40" + }, + { + "filename" : "Icon-App-60x60@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "60x60" + }, + { + "filename" : "Icon-App-60x60@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "60x60" + }, + { + "filename" : "Icon-App-64x64@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "64x64" + }, + { + "filename" : "Icon-App-64x64@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "64x64" + }, + { + "filename" : "Icon-App-68x68@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "68x68" + }, + { + "filename" : "Icon-App-76x76@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "76x76" + }, + { + "filename" : "Icon-App-83.5x83.5@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "filename" : "Icon-App-1024x1024@1x.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-App-Dark-20x20@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "20x20" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-App-Dark-20x20@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "20x20" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-App-Dark-29x29@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "29x29" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-App-Dark-29x29@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "29x29" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-App-Dark-38x38@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "38x38" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-App-Dark-38x38@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "38x38" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-App-Dark-40x40@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "40x40" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-App-Dark-40x40@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "40x40" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-App-Dark-60x60@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "60x60" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-App-Dark-60x60@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "60x60" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-App-Dark-64x64@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "64x64" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-App-Dark-64x64@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "64x64" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-App-Dark-68x68@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "68x68" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-App-Dark-76x76@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "76x76" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-App-Dark-83.5x83.5@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-App-Dark-1024x1024@1x.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "filename" : "Icon-App-Tinted-20x20@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "20x20" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "filename" : "Icon-App-Tinted-20x20@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "20x20" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "filename" : "Icon-App-Tinted-29x29@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "29x29" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "filename" : "Icon-App-Tinted-29x29@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "29x29" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "filename" : "Icon-App-Tinted-38x38@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "38x38" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "filename" : "Icon-App-Tinted-38x38@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "38x38" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "filename" : "Icon-App-Tinted-40x40@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "40x40" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "filename" : "Icon-App-Tinted-40x40@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "40x40" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "filename" : "Icon-App-Tinted-60x60@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "60x60" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "filename" : "Icon-App-Tinted-60x60@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "60x60" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "filename" : "Icon-App-Tinted-64x64@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "64x64" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "filename" : "Icon-App-Tinted-64x64@3x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "3x", + "size" : "64x64" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "filename" : "Icon-App-Tinted-68x68@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "68x68" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "filename" : "Icon-App-Tinted-76x76@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "76x76" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "filename" : "Icon-App-Tinted-83.5x83.5@2x.png", + "idiom" : "universal", + "platform" : "ios", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "filename" : "Icon-App-Tinted-1024x1024@1x.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-1024x1024@1x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..97e29fa547f4b689cb003ed0068fe7a6cecfd4f3 GIT binary patch literal 333235 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

UC(MNnLnpO1*(- zrz&1QQSs1boghSB`pA{T-?z`lP`!WJ^P4PyiZ?IXHaxo;R6!rx_fbXwer<8+{{aj^ z^S*%b?XaSuHK8x|$H)z!e<0f;`1jhJJkS$Lh%c0`lXsDJDr0R~|Fq=)6#PE~`+u7G zzd6nPFZo-D(XxS2m{eEl*lQP9uG-&Uk*=Z-Kl`HC|HJ>U!pQ4wU93P6Nur2C(HGN@U<5k}7VWz6d^EA3*&&tNbm zlEKBatZCncS(Gn${2K5`6b4gvs(gkhsamN=`t2(g7ASRwRFOuSvVv*p_$qBO9%CU@ zc$>h2h9RRxuBF!+7qcPz&zubL%-IL68IA?;P>uy!Z7NeZZR()a+Tb0;?VD6FJ5%a+>nmD00OUYRjRy{__)hZ|n%b!w+^ zR3zfWt4N?w#+z!J&K09Wf%D0G@yTA`uT;_BK~H7L07@vuKKyfu-m)eFRE>?W1g3eC zi#`YGhXu~+vb7)s(SvwAcSEQ!e9XOnx0PMSj{bH>tRss+@6Y7K%RYxf)9{_6SvhhYCb_^)hZ0{#@-RUI$}CJV``5m0Wg zaCP~+NE$qF`;V|5{=dIF{QobX|9_hSmNTw4bd8qDm=c$dw18xjf#3_5WMs=4vOcnQ zygX;I1~HN{o;i6oJ8E>nfy?NU!5EoN2P`g)Qbih>zE))3CNq7l{2ZUCWHZaaK}n@p zb0JP{@97*SnKCvD` zfKK~H3j^Qi-TeyzV~p4bZY>xrOWly1lalk)y7Tj~En8M&I)j5E*sCrzgP3Hf+RK_B zJ~%kxPb`+HHGbqqHhb&sAhEcl*ANF@k^!!tFTXdd0d;vfw(4_|ikaA0e5x=I3+joi zFB3YE7~B}v_2mjoBmxC=X~0Q>>CQEgPN`F8-Og183Ow6t`-BzN6%kC}AlDiA&UGE? z7nc=0dM|b{yFuBUqU^fpf)lQ4kV66u4kbU1IVk|%E_6{-@Yz2yu^Y$D=t))r1ab}f z{q=8uwb=82|Lp%I`2PbVvg=uD2QH0u!i(gZ;HW}|m#O*RTje3`PotIfvlV$D_W$tz zsfEM;Cs+^v{}z9Q*YlBPDOy5=Y%qI*$VdRyf$8&iwoD=unvCHhqvlH}TFMAjMrOq* zdMRCo&}E%{jO}EKWIwB?^onIO0o1yR>j-=iGiX~&g_6^(SA|Cvh%#UFM6s@wF*nyV3=U2P+m?s|(BP~1Ymxnxa=?8K_luUnnhseSjMv|LDGjSQy zkqw3vwit9})j9Lch|lb_o$RlHU=qaJv!PruJY6y!f#Lh5r_pN-;B9nTEG+Rl=zRJ)1qg$E;;^9u+O3<2=h#`{F}&a$ zGh7w0aR?$r7ul3^o#>zk*$lm-t!k6Eee8P5f&vNXZqauc?bE>s=jppVwPf5A-=j@d z_A@_lt6Ok?qu6T;?>~mQ}F+dZO{LGxBoXE z{lm-5KQ*VTFtov>Y*U(Q1$@b$P+a<;s5IJoW*>Dw*#;TF`)L0U|39yH`2Rm$`G3g% z|80$Ye3oY*wA@Ot@p(NsD)5SI)>kI%vHglT)O!h+!dz$Xu&r!xS9S8f>=`Ov&w^I< zRS{<6u{Ittd#QLiJP{6bI5U3YwsOTZt`cSrRPwRUlvmwuCDbjUE7xNOwUUk4UhMlW za>+ETm!f6;KTP>QE!{r_`Il4q-)tZJ<@57t{nb*bs=w@g9JkKxt$ekK2VhA)^v<$) zg@$nPz`+AeAjpaBpV|BGtXuL1$~|q>W38=!hL#9#kSIBEWQvxomcQV8U-GMN}2EVlfn4e%l|2`w}bjlLH}t^YzwPIkIs)hge;SYI))M{|vqkZN zx$V~WBpNN>4WBUF8Zg-OaKSNvvU4^VXplswW4HsllHS>YUcrIA{FSZWGImzTh_Wmk z5+^=JWAm3gJ@1Y8K5af6kCb_rQ6+2no7N&QK* z1Er&yvjkTWs9GQKvLsiMl~Y1Drh(Nv7Za9`4YducZM)FcI8jS<1F@jdr?VcHbr6MF zVw;190S>Cv92fdMjS|oru9=jBu~bk7EcFl7Z{`-N)={qsArfeng_SUgevh*ntc*eH4B^y-qBMeL4RnYZtPCgbcdfiw z*ebqveVx%Q`@I^Um6B2%6|PEHYGu;G60;0eg|EUZvz?Vf$mo;NWv!rcg`ZuS5zWh1 z%2nxHXV356&*v%sr_b=c{{3z5{%J}751yng?&FX>H~xBgY2RtKH~6%D+Brh_XuyJku%(~AZ3=`5MXe4lm<|P;TSpW z#f)zKG?zDrKl;KgfzX}~*zQ3%5BH53Q^TXfR|9|!usv82=?$Ie7E(1QUS*?iT@8NL z2k>C?#DF-CnVmbg@zU+fYC@gk$tW|c4;QAipW7*P+!sK|nA-{d9fMhzjfproM>+wV zPpfa-kHBY8WAGRgCK}WU9&^Nvw)SQW=26p?+n#e?Yo5N4}BF4s3^@PGg9{|x>!qHem9tFJzNFb8_;CfR%cQVfULN;{Xr>bJpd zkHG_DNlnZitz1MH&)GK>JpBKl=Yy(|{$ct5a0Y-5R0jC|GfLhk zMzX5+@@3_4RQ0d9vOxnEJ?#7AKKwm1fz5pQ42YId2TEzG3IVUwGSIyXwvH3H38^Bh zm@#vSS4>_lCC?P|YW%U@kg>^_L4|Qe15`$lKKMHytE}JZU8DE)@;IeKCaiHRJm71B zkNs9YRk(20Zcny9d-*@j?%S+>eo&trnv*)RdzUM~J5`~B`e5~dEw_bbxpm99G&jum zdEJQ^dhE{gKHJ+lFl|s2p9Dg6Dvyt6Lc!k8z>$*=17U?$P2F^BWymZp;a0eFqtRaF z>dK{G(h4v$W+P?=F0jJ60qOp4S^hnSw*l%(>s?UDbWsGH{Yam|kGM3NCLJ>FHuxG~ z_SS;KUOS9916(iTuj)B$CT9YEQE!p}ga4qe)i&w#g>L|ddPW(MqJwdDS(7Bf7bYwQZ2U$m*7h!{J zWGdpu>!|2|I`+RE{y$t9k8&S}|Nr^Qe~t%uA`i&_UmgO;4YkDpqtmb!I)3Nnqwueo zbp=m_i!zTBO$jp(ce&}J|9G%(Zt9GuDwcey&PrggjKW^wsyJl0SHix6fv?`9L$g*Q z*@d`g&L-Yh$}$svueZ*``2h7^W#F*Ao{VFBzrMiHOZg$gWltGK$DjLf9GPy~-)ATP zr`i0|p8d-~eQ&f6-hV!4v>Gl$pTPv5(9Nja?Ns>@9GaqBv*pmu_X%(M!eFHt{mjt< z=Ma+!(+wUtehwdVvCrthdFCDz3}~OWC&*q;lLJiM+o#2B`81GovXtGRLm|sY<4$-u zbU>Q18^f||Dx~a3>FZw{VDb;3zwW^WeoPoDN;MwN)wkJn_(B4Hr(RG9@JvVEhaoc^ z@jM3=O`r{^bk!xkG#{Z|@q2ZO;99m;GZO|wY9WhE1SSIV6#@I#Y+Le9K~2sf!Lu%S zd94@C6i}w`*yfPfsje7G^SA`8qP!DZ(MxgmCinc7PJiZ# zgHK`qwO&g_yn<`bAJKlaJ=9li+TX+fzs46dIvoCg^?rRh9{0unzir{#V>17(L}Pq* z6c#aL)<@M=E^ukBbRSA<%JdGm;lY2Aki5jA3obR>k!e=+-BV~Qn&DWi1S=EzJ*7KZ zYwYCl`waH#QaWTpRE>ECKPsfkFx2oxJ>I2!C)}lWfn#L=t3&iMWnba5Pvi9-q^gad zto++j{>SgWdk*{`zx(t&<3IhBZpxaol$W3%oW_9;20G)Zr?b2|1Q+UXTXS=pZsDLi zj5aC9a-~p>1wA460nT6L#I@PJ9wWzgzzD2u4evvOvnhcgsnO~CUc9_J2`dNR&bEwB z-Rq96!>)Mf8bf@afnvwAm+)frEhxp_ww^NeI(ek=%K>!+@FC!t zVdo5ghw}yMYizWOv$3lRZ6*Rb4VCIKgd3|Eqe$1 zpI_+XsBg3?UzN-29{zt~lt^wW-!sF*%N+iHs9oTwb`!jld*c5m2>>Zx%v97J%(si* znda#UqIXpeaY-UBZOk)pn=x8^N+Sxt*LUTR!Jl1sDYGh9E427te`}dY=cqjQ#-bKh zUBXhspYUEsmh_Kj2n z>fULbx0;8o$FZRUt5hK-Gr1278Y=wZY#YV+sh^$f?O!k zs0rJTAKPcyj#r;D-)H%{C#hT7|7gYr(Ke@%)iV-DIHX#3n>9b*_-4Pbp`l4cAUbka^A_UrKf5C6Yx(_uUO|NHCz-)bXj zbnAvPrnp8>Gayk3w6t7)I;RdC!;O3TSP6{K=5@*}!k%Xsuc1fY-hSDP_7yW%^|vQ- zf@F@D;#BohD{!2F$uo5Pd#x<0zOFqP^_p?YlpXH9+Dg%Bvo*ceyu~ zyN_+%MgC7q_fJ9o<98olKF22q^<`BvB|4>_0{%W}zPE2b4JagPM)~K={z&nyk^s~R zD0Wov-q-d-)f)YXx@9`w+sRrCMy`AHRPaums@KMA^E7jF{9vE_lvB{3SRHtd<^yS& zyfwi~3Owo44ATvRtwqqu23L3!ILD!e7`Nv z9}W9~Gcy!i;gv2*o~_n}hTr_o*Uq#555fM=J^$G?LD4MjNN?#G4dTK;&VDk30tGVE zR>?o~XOOXwhX@|kunNaYN3Z--wOFy-;r}cBGUHRxSL<(24*!4Aek}V%^#5<8>%>bt z76*u?ktfmqg(L*`)OQZ}&!6Laa#_lceO)E~P{@29F*tE{kP`v)t!pSBh@>DSK|by6 zP7(v@6`JmW#$`Pk9v(N-H@Mfo>u2bQPcb;KIz7CNLB>`ZXJ-fhCeF&XhgT0~z{yDf z4p6W^CupUC`hXTk<~T=cUULzpC}8R2k1|_BF9Z0I*6v3dxyW(y!xbsez{Ep*@80m} zhva+jc#p6TAD1{wtQ3K@C4Fmfc%Kb8ByMqNMcZ+8%x+Ro{+f)&AZXPuVxu(1Q~ojV zL8#+-57^e+zT_1a7dWc;8PE)T>P8u9l4G(c$*8JyqrxUPgBt17B~_VUD`a|S7JI%H zUEW2fn+$*RwCDfZUwIJr{}TLvFE5KtXTf~wTV)pvZ1Q+h*unq{gNt%Glu4^PQEoj# z&g@pDu^0H2zz+E>wGaP)N6%JcQold^{|wjbW%Y~T|KA4pW@MeO6j?^RN>FtmtE(zs z2^2nCU3&6o#TYgil@iBi8P2uf)bCf%@qI52tZ3UiWul}NqQTynar@C3S}DeiukNO3 z_JlW|A&$5p&iO$e)s@pFHxAd(P-mX^`qH+ueQnp$u=;jw9H-N1{5ZRR+RGo;q6^)x z5dVSG)CDV88T_vI^smydi(h}mWy~n+$qeFEv!09y^OkqBw_S9->@8~}k^lLIXVzO| zgYCg1O(DAOlRk#c;7(RdrY>nFi`C)8l@2v);>0q6W*s}vaGvPC!K49Lphm%F8d;CV za#pZ)BS^iF9i%wvG7|%U1o83akT%PK7|l9WLi58~z{UheSa`>Vgk%ThhZmOH{Xn4M zt7Q0@LL10DAy+x??zm*Dd-i1Q(&e6>USA=phkig1Mm!s!5qH=*8F#XEAx974nXQB1z?KuYx{Wk|A+ry z;d1!@MhC8YTX$Fqo+6`57OMLS$tJ(E0armpXCqS<2AiG&*|w8ATY^{OM3uPj5qm8> zIc+y*c6YzbYPnL(a%OP!?qyjK?2T7G9+^NnUqtx1-8HUzO3`rHtHUwh$~d)Tj3VrD z47jY$A|tKq>|H(kjP^JhF&%?lCLsJz!ToFh+nbkz`rduop8No3_o1!8E5(Y%p+A85 zS*!wJ)4_kXI31r49!y;guy^&FWS?~6I_UO*z2(X^g8nHn#5b96++O3?0=D*tx4iCr zBqPr$6AM5u{=;Z-4p8J6PXjkNM#c;59Clo7zX~>xdBSYx_6b73A7`P9uaKvz2MmI% zFFVLD+TPe^+iXv^#Iwz$KugjYPJ(3Xz#_9I8hMV(#D~7{VOwa3xDf^8!C~CU%$=x6 z#T4YqXJc>$3F?Q8NAZgVNUxs7j_PtWSmF)AtQHgVl625R^Ey^057yQZY2$dqOXuT)QS(__C%G!%JwMIvFY6^VJqK7VKP@c4QEzQj z*0p8Dvp3t*)kaFPYlHvEp=ldQ`D8^vcFi``F%+K=_aLr5A2^aR^KWvGITPzkY7;gm zq&?t3AMwIN^E-zHaXLYvJMrBolugOa{nM4?sn+O&Y2{99pJOq{TMl;$OVK-IT9P19 zNriQ0g241z7^6sT4Zg?FXYODdTG;g12;eIM=!Ns+f{uMB3E;9jA=;jF2myC4*<<*WBBsCjUCrRw-!+Vdj9Jx*!jWHlf}w3>G^rHV9^-SFI@?pVcg?s~@UQys zLfci_``4g7vT2E(zkB8JQcurdNVdaKdwaC)o1k8!d@`77x<^>rj$v!_ME=uK{x`n= zhGWrjJYD{ye~|E)EE&&bd-jwYHmE}Wyah8e(AD4{z828sSR&zwLX&=_V7ph2nXPw}|KtEj zn~@)^Z;Tc3#SE40sF#~x|7@j5Rl73(qpN6-gat~DHsPVeWhd5p$@v4e4fmio}NQ0GL-Y9$sV zz`ptIuWft&_pi^}{-2lqzq>f?A7wNMr!-5+$LoDN>TgAhX>eq@eg?RjYwfebrJ=HO z8leG7+{QvAa6~DRZo&cy3c4XE9S=3Iw7yTXE zj0)o}#O%`;N2dl%+;rv!>*`Xm)Cy|_N7aA*d@o~K^^MOnTHS@YY8ZL)Wh`js^>{f} zjZ-g;puIJ4522ThQGR0=e0)uYY^6bS@ ze?2I0Ldn5>jcPQUJcFGFXOUib;M|x_dmqBa_Mj_II`7lIeyBE^>W%6SYG-rr2X=tJau-e-O3*?~b_3@C0RQ1w;yCM-OMfD3<+7EP@0>7oK8&*s(>Iua!*8Xp z`ltNJ_HV>TowGJ&rh;uw2ApZI^vFWHz#T;0suj|IMF5k@7IF4A?#{BR+gFz?oi%2( z)d2b#wh|I*k+vJm!#uH_?sah%&17#3Z5oqem4DJ)wq$#i2~{6hys}e0whUurG#}Gm zLUIlc8~nz1zJ3n=AA4i1EBTtGLg+NudAswc8EHrwOx;(|B=m!Hz&58cj(ofn z&L%M2K^FwDGM;TIoe%&2@c-lcRegl<)#Tstt9WfizZLD*JoD4=|M%+JcX0e z`>(e@`g{M)dBz_d&ABXfW&#{tnm{NV@Z4d^mNwndR%hrzToQGSooLDiQG*%5GEjZ@RbU}+5wBL5zO(dft+_Y?9F7)u7R3d5v#D228*vlAQLMV6)wXtMW2>5aA_ z(EuIB=uGplEap=0o9E#FtAI}vJ|>Jy%3NRO)$RYy^V5NUf5N|;v>xFP zg@W6q=hQ6lCIzGlTm%$#Atg#vGI{%wI5_}c^tt99 zpRJT^4ll#F*UvT1POQ@lqv*8V8-G2VB=%Jwu(49y4kL~`_f^p<7h=AuGPxpHuh_Xx zMo^hk;IB=Q;THd5_&Yb8P)+sc&>7i;PX?5|lhf>1hopr8qBB}xhSGq#Iv`MI-p^3Z zzSi(+rZ((L&TEx*rb|Cy|1R?5NDiKoCBw>fzL!2hhvL66A7LV)HJ2xvn3c9*zTe>< zaF`nO)uC1+xbba|<)_MY#=ZOj{f8O*ppwAh-F{b+tWxVRTf03HTOLz@)|xM>Mm%uy z1#SyTCiF1bb-59}ub+t|UtM)i_SgFBb3}u)3fdf{W|3tx3hE_qzwggB&9r$Zz33m?gv%jT( zXYCcQC&4qVXk*^n_}QO3{C_KP`2V5K;s0wH9ec;IzOIvzm~g5th0T9M0)SnZl^}5z zuBYXqP_39EL%;z(4S23}DvO#i5w@p-+voEf=lt4VqNDJRg1(iqxkkvdQ#cui#U$7Q z_B|!0b=K{z`sa*t#xGrXD-+b7&?38r)XV!=)4Vc%D;P4K+@p1MIZZ$Q_(l7pzxQ9A zm-{yi$+`q9=wqn;u$s6WnNa0+$+0eIz;a&=e*I1jKOYumzK&;bwXdn<=T-sux65C{ z>q@idFiIj}A!qK_^$=#^`32^r%_YPu(rs7oUKjf}lH_~iv8mxfmNl(;p4nf{pDMEF zx?6+g)^dWM+*ltA0BSDPOahOt%br#K=8P`P!Y{O%YH$jrgqEtMb38O%Vg-6GkIpd3 z1%W}w!ay+EC4wK1Ybmt2)g}g_Y>TgTP-g9No6t)B$NXEZn5nFP%OFI0sVpQQp#Huj z0$f+0sW}j@j-t=H^2{L>}igwYOo>Aaby{y{du~M1w z8wcui;NLgD!>9e5C7lG-&gss`gkb*f22*8&`=)o^0(S)b_hc* zs1;-KfX9LNI`umiVuxu(C?;mka25P}f?WNsu1M(kuBKfqyRLgtj$4WBMC>qzD|}Wk z3$(DWCs#78ICQU-%gBme*Iusd^fx=Lu54LID;yNANV71ZH1ctZdy6Vws1yvBJq7)L z^k4qh?c*Q)$lE7Ug3~+ZNA+6oH#3OG*kQ_=fZ*u3f@3@)O_djY+NNiSljneb^e$~23B3MnKAB={c= zxAUFtf%Y8=k^4nn5>;<+YdzGN+H>p;G@vYrzkgjLz~L{*5o>zB7#!4xuq>CxPyWN% ze3yY$9UUj-;Q{Yw5-p`zNzkhF>eGx?%p- zfO~3aOdchX1U7W{ZgAhuktDg~4&s4--}&14f9%`t@0e@ed7fGRMII z$U&TPmcujuER$?<;2(a15AA?AnOJCN{EL_1zy0jbN#hEq`3OM5-Z4|6cdY|3i@+mT1JM4YvI`jp>)@*n-(_P_k&|8;vBEw+7UI`(sF z`=x&}3B@=W;2a{evPoQXoSxlQc z)Dw0ar=fI*Bn;MrBtX|r0=?pcX)WawfU}js?dgo2CfW8@22A9!u~pz+pyS(gjBeNK z5~JUQ3uGNX7Z~EN-Xt-GNjH}zj0uSXlrbBZL|0=mxCode>`1h&uy0+Nq6FRj+IPNo zKJ@P)*#Gm)zXku31y|!~hDYoh*2`85sB4LR@u2Oa>_SR9j|%i;6+i|DK2*2__89!H zfUL(#-yi<};s57-==GDA|E%AK;{V6G72Wd75=P^42%sW%eM1DsZU!h``JTQZ3|qs* z?|b@}GeDK1XvyI1;c!<)k>il#cP$KCZ^f*nDyBF-d;Ml*uTioF2hY&0v$A_QUN?zz z?LKT(R5`4qSUqD(cb^d=k0I*t>0=N{N?+R@?iL>E;j&mc$V~8l`-cRW;bQIu`)B#ntCxELLn43O z_jg}^*{EQ0X6S2;jr0B|@8JPto!eO$!%#xSpZpqHNUFGd}AB`fU*C(`p26$MLV^-}k$#_!CcN$*4j_Q|wzfU;`jS zSd=6N)1)UkH)~!WFlfC;yIfJK%Da{QB)@xO#LM#mnxdidz`C8zIY>!hehAx4!+4;M zqGS@b#de%=+qMy?JlH^^e<6;j9TG?hg8Qww8Q@|ey0Qm8f5ja zg<PS>mEo6Ved1D-ie6c}*DHfY*`vf^DDmR*Ual7cVdWy74OjdA zYu#TfaEx$Pf|Mz>yU{w*%j>S_oGHY+c&aM_W{1)6`6vJQpPXm@Pb&btR*$gEnJJOM zz+Oz`AtY1Ungbt~RPnM=T_zmyMtJh~c*tE!Ht2Sa6a*$=pP0>Fss95rp{WBt7R&JQ9ea3T;;pwz*IE=CZDmrLB9#F3X&tUoU zY-J-3&$MG;#Wt!Jn!3A1E{hKy6{-hdIA!K6moa&bSAF12Vlg)adgVz%iEq*O68 zJr{+b_}?HXnQikwj$R^5fnrcs2PG*CuEGD^02);JyI(1b(vrtBJx5i@B+V4FG*SNb%Zaw7_glL)Qr_L_{Kv_#>8`>%cH z>#*$qe%pT!{u3-!4#+V~=%DCKphAA6J zB?dD^NcbnuRe7~KPOiEyDxLkTj(9l_dvR;5a`=5pZ5zDUln5^v_ z%m>Sj+xAJX3o<>Iw;A_kvrd~)!6ZQFM~2+wAN8IFmPxEVe+M4vfXDyO-uwL8wjAeS z-RE6Mqydc*Ab?4GXatC)DE6O_X)=$<_a6E9BSFTA^@|<^$RraZBgc@f0jb!sB+HIu zMN`GfKoa7}16#5bCWsVRBxQh^NEsQ_?O^Y{y6XGBs_M1&Ip^MYF1Z$P@7Zgu?&_-Q zs_Lrh9}DVa353QE#5I8V)1nz-OoY?>T%7?;8B>CROci^;d)0_k#plw@gx1;q^&JZF zfYNNTxc|sLCwkuDHNxq)Pbj7dy_U=l!d4*Tql|yppar5^CJ@Qdt75NJ!`7m2=9yKS)bKBARKvXCmu6EZp(M@FQ-hu>(6;+_LK zu5ykGTib~B<+=v{A8GK9yv;fPag6`h;QtT)I?%hVe)|7-F`lRY|8n&|!(ol%%klp!`QY)frnySc zy;>u~nIKmr%qV1vhK-_f7I)Rr+S%E3%GlxI^w*afy@SgMsV@^yMOy< z+TZyfekQoJaZmBqe`yx*rrEZZhLv@-mYL^@@}?>U=P` zq4&B@e7+hj1m4v)fE@Gtz6Z{M|4c5l-99%Ow#&!}Gu9p{bS}xjux!KNVyla<)V6JO z%RKXpA&JjZ?z4Eh%WR{gi%T4UP_xaU#pn-b;$AQ|&17uO7nG zElRu)m0kLbyLE6gfxdt#o=P}jOtFDI{hmZb5H4RaUWj8ZkN?b_IIF=Eoh;YgV4%)s z`k%pFUB+ifCd?#&u~f~Gnkr`y$POF?i3vWdlNc((W%96_d>Efw-w}4uYm<|$;lgLR z{c-(r{p{H4wc?dN@o7FQGyko{etIe6|HGgBqg(Lbv=6NVjj76XTQ(D0*KRY;Pma zt`33Yz%MiZKfMM2g$drAH;0p%TmLO5d2hkN>&=0sxH%!`#_Rams(FSK#c@G?tAVUo zW*Ni0iu`z=benxOU@pL&vgV82y_^MN+MGN);IQ#>eqJ{034wyHDJu~DAr5oaaHRT{ zF=>F!oP+g>1lm2{oO|#FacG0P4IECKD<4jnEq&(V!(iAF`|foao8AaT6#U?^b-TU3 zdi~l09OIs~w?W3k(*k#*bk1kp37DLL;9$F#T%1=1V}vaXEHpT&B1L%Y7RB7|hcz=m z)-(j<)gM#G8?IDN#{a!!nRiY8=_Ym}b6#r_AwL78QBBhXT)naNONZ43F)3KA1~J(| z+18HD7y$ZhG;q)jPm+s`o%4}p-OMZL2GRoZDF?`!K6LNz%kN9@f7$o{E{y;0{hNPu zTlSCSI&mo;&OX`BBS|e8V75oXe?&&@6aEc8V}e)e1i-$k>N1pItVLX2Z)4*pJos;? z|1X_$`v0f@-%?!Ol>e{t7cZ5qDoF(pA&K|O1zS6Fq=3Bgp3>z8j2YmJi`g4_!=g@+ZiMN>SEu6T{I(tfzb(D4@D@c_wS{o;AH@oNO=x{}&?p|J{G@4mY3# z+#pOF9!|F5G+nvqkawpUT>b{~eglloAUNGRDJAln4Ju@iaW4dQPQh6Sz(l~reRdHoxfZ#%Klo`k6Yt@U?h=k({?fW% z<>bb&Ye246tPPOS3|$;JrVk7Z*O4YLtj7{fBxOt)Q9+!1 zCIi6DIG1>)m=YocuTvL}Z3%rR26TjK2gdo^PP&e=bbZv-X5=e~3}w(MwY0v=9e}*-Xo8%S?>O`SY4erZ>HlxI&N^8?u)kGUm(%~Rusi*KDVx`AjmJB+**@Oo z@|e;73JYg@`o_o`jm&D&NMu^h{OAm5r}5uR=sGD9?zg#=eNFou_d2zHzgiBn&Z4bh zbG-_;wGc+bs*0_G&Fv%K^>1rBld>{AvoG=iLLD}jrP%Me9Mnmwb#^lH0N=BMqC6c{ ze#B7~xGm)h%T0VPr~UsoU-@sheV6WpHCgH%{1RBk3htx_1~v~nXTe1w)k$h&gW2tM z{C+*~HE~V{BLq%I=XTP;h=2yv8ua~;=WU(^05g5K*OnP4cF3OiujQWo+9edcJvfXr zpDQT2W5j!ry9ZJ2A=WYbu-SMEq`ZDNyu`LIoKcS-yZN^!bp!)`h;xH8mtzA;G6g}& zl&?X6G4P5Un@O>O$ul65VskW$Z#zHPF*5ru7%ZhU}W7$h)oD_ zb8mcx3)!3A#`k}^{rM06lAZQ{`v39$>Hk;wy-fXom;HZExMZ^L&#`ZATiSU1pYU+I z$1L-Tk;oOh8u%0$n%zqkXvMUabb2%hxuRj`^7AU=n77YN%QB$oI7PTsot)k}>!jEI z5~5^$<8CqwN8HW|#`N23@ zIj?^?<^R9<=)Y`#_GkYe1P5L?9^6#*a&M46z)%)KE%aX9NTrUWP@Ty{)~+Qjf{fvy zr_7!h#u-QonAEqEadf2p1N{!moIMyCR5zDRJ~zNg+Yy`*We(wCARGr^Jl}$WcEW=0Sr7C-LpJS}0s1ReAPz^voNmZR$=Q+8 zK&8iEzxjQ#q(6hv)u!{9wYmoOcg`)=$ECXCY6aG9KQ~~p@(9monCEq5?Z{W_XiJM} zDdRikD7Vep%4nbc=rh+t|1j8cUU2=7d;Gth_Wxs`05UKH^2Bi)i+&{*<^AR`aA^;= zk(_=?L0ba_vVoQ1U_I2q4t3F9dj-OAeBu`TkMH}mHFx^|r~hBUcidmD{SlgZzB_=?*EJ-lywmCS6{*{5meFlnAmLNYGb43w9O$JMj(TN3m z7_ifW8kGerlPtr>BU=A-kL5xX&6&C0N063P2p%C zEDj357Kq@M7K(vb0Csg*ga2sfdkse%)adAILT!l%|Go1oA#7i;-8t5*V9ClBNED); zul)|_M@T%;)&%O~IJUok4gUYLcVhg%9{BhBKjuRk)dj1h2w{6Y$sRVYj&`r~$w=%Z zOJhT>$k&8VL*>HPqvkPNiohDs50>b%=l=));dSQUq*7$*^#4!)A8~2zW$QoU`Y!ta z8IBmtujD1`D}1N$DFJ{)AoE!GxC~#|DG@4W*BBndJ#wfAcf3A#`0FeZw7L|wIs>J@ z>kMElzrrVGeX4#~UtF)3edG%0#$lb=)bD&EO)9MTJLj80?bx?kcLe!B_&Ur{pDY4Klii0U}N<4O}26vpk?TT!WTM=^*ZBPhB z0thd%$p;pZsEk$#Bs`3`;k6$?q``e)RAUF)?s;!=j2^2dht)5yl`p5G4s3%^nD(Uu zB20t#BG9SgCac@6?ieCU<|+F94E%K&{;VVMg*&SnYJAjYA6yiT_#Sb}DQxoKA_ zU2W=J^EyKup4R7f7skPZCjtbt)Rx)V1~j8lC4yu|H(@&qGBCCGRLe85_p8U-P4C6s z+FmOZQGTUeg~5LD`2a2b4fY0RX?WbJ+KmWhX9FBf1{hYmW*`;_+kFO>+x|i|r_ZIC z@CBRPp?paOtn_KHbqI0kW3EQvarhGWfA({F;NQy}|F3)gFTuYlQD+{j?m-(tNr;&% zpR3E?od59|+S&vcd!^Y|ZCk!BkqSYy02usdFi-#g^#4!)zvAbc@&7Zq;d2h+``TZQ zx~A}p1i(F?GKd6Yrx2Mg6ZY6PULbmzuL01TOr6f zTvepJzb1~(yIk?AcB)y0?7mXeimy7@Fb-^hZ|{yR={ZJ2)@Chp&6c-nMmf@!)6+~A zvo^o=&2P28^S6Hn`cnMFy~_?q>$fG%D7S{GyYk=)ASaC3+3f!;Zqlayl7I<*`frE^1ap1wKg(cm3jTUF730;`o8~BN`G+LKB zv?2gxNS7M#vQG8R105MX;U=?+$J_zyCP z1HXJg#cU-GnW$`_D!9sPHvGj1>4xHT|G*_-1~@Xe!v1MG>@&upR0baAt>M@+3@tge zG#UT9C5)N~RBmtVR&>zD`0LAhnS6t;Vn4%mu5wS&Y}gopK)IFBt_J^geG zE)IGJhoEqUT@GlMioB1fG|F5{8{(nx7()97@|GV!0=Lv&_ zvncN|p`hE}s;fu zs56%ccdyeT{2H&d;aD5Z4!$5hSNOT`)`xf~F63_xmXk`5BOjyuRmNSP>2jwbsQNpW zP1l3^P@IT!3)#(y)6f0ApT8yn!lf`lCFlS!6J{;iL*O6LL?gEGFC$_r<|R7wOn6A| zrd(_V)rqYJFb9IRW296BCKh(A_ry6F-OIXm2j|X3bzq zy<@+2!O8BU(hUiYz5GlD?aw6VQp@LM5bL8#v#U49LC_K3*$oE*ihVw!|KZhaWWSGD{rW+{>5>07zXJNP8da^I;lNd5Zgvqts8-H| zz5~KRsc+?-OE3gh54@Rn!)dp2qqX`&A9F01m6LD7^)x#z;x^A%Rng0SEegl5b>HlXicT5iFR(FtKM0}CJoY*?U5@D=( zfplep!mxT!26Gro{BxYwS7wx3P=t*BJp+*|@gBbUGOnnQk>9+}wqDYsvcP{wP-cCO zva8CwJ3b4KVj1!Z5+kE>ew+RO2S5As{IDUs#*T@2#OSnM^#%gA*4R-s$TmCFWG2s< zHeJMrssHAixTB+bkojE{ILz9HRN*k8gQa}f4W*A?%F@{q4&Lq;qVoa+X|dEEm$KIg z)Z?SKf%eAvzP1neNwKZoU|chtW#fiF!4uL4*RW)Z*nJN&`2Y0NXgH`_P(NXLVUs_b zIoE9ga#Z?gFl#*vb#HS*-xRbXLR#KrV-O#9B@z&}PLpoZ zPxfgJdcjWNtv0IuCA2|iuBs>P1OqVYex_l0#P&0q!*~g=uAln*ht~uD+OCeA{=f3# z^#70Gd;0(P`v3Zle9<1u#dmy8L?t^av#%RfXa|60IKx{Boh|{17 z`c)0G(z0jxq9QAe{&yT*b6lQ(7tVHzi_2QJv1}X5%dTZ()xzSkxokXXdD*sYKKJ|l z-v93Z@6Y+3bFOpY@9Q&~Pq0EQgkSqqdjfnj!EOd-15Yodze@iqT&B+16%9tKIOLSa zI=yOe+#&{MEJr)>w(_$Q&1DZ-P{|fzNHxzeu+ZyC8Gqa7HDCp@rj1*#FNKqHndTK< zHtg`tDj;5{0d}unqP!iBdLLTI+pNSIO+*CxIH&IQ#!0G45Pl&VFL(RZ3BvW+CsI>d z)Q<%-lKGY8v63NXti!Cnlp#3f^QPUzuSglg3P}>JI?9CVNL@z77~iD~Hr)PEAVx@c zXkV|@#H8`JBKs$MSrwb_zlU}rif@&1d9=m+SFZU(0`sKjTT4IoE_*tuF`a;S7e0cF zoIS#-|JJGYg-82Lsb0wVlfr>*T%;ra*X)}HzWSbC%yqcH{)anMknLXt$qd6>L~s}C zF2MZ+ns{S!RBBX6W*A`%61RwUwc1rS_r*S;$Q@A4BPkuA=+q0W1^n58>@YZA& zKJXso>vg!+4L-flAYVPd-85YicbsDlpX%w6P3>?2q!^2LeoV0lw@jf0`MX>gRMN5~ zc7@QLl$W8p72V#5Ux>?WyFW)l;*}G3%3D29N#e<*BVfnuFNaOz4pI21-=VgYe=GTf zA7a|`(YO8GnzMhEc>GT3O$-GKn;lm|+W->!-2ORs5D{>oYs2K9{KWi*A-{Ii;hE48 zvVY{To;IatBsFF67DCP@xEN@3JPT)aMGOh9%^(b zRy2coP|K>ttA+!UkMUWpX!n*%qJlK(yC9mEt^!fI(z4Kp=2fcsqi^n#N^bwVr7`~8i0sKQUB3+CNszS>3 zz$&1#{XTJdUAJ3FY^j zT0O06soX3_+)+AtQMi<3BU3#0&Kzy}li=t(i;k?61&VU%9N9zZwyvFp7=jWGGSI3M z*Xp~?yD4TO@er0$t)hhoEEm$iUxvHH8F| zd~#sIIy9uW&lgMolYShX`(RH*W6qOThTUi?(@W^0B>-Alc?=wtLxxhDPys}3_wRrd z$P5GyBE9DpX=XO9i1AhC9rQH{CQ)#*!wzDlmRXVM~_OgTvGN zNHy(?&sF3yvqe{;o$<-B6ek@+fqU+FYtud!@AzpMiFiy*Z{bb`x(ZF@VpTwRnqq%2 z`FihlT($7}t9ORI3&0jj>2MT4dco<5=C-?u)23x?^vCJ#x@E=bjTNXwBsA!69QyEz zF=BUp*<&3_%XHq=PWe)$BJ;}^$&sUY;^RkIW@0t_;Xi#G@eZ13$_~;n%KRi)4zieXyqqn$vx&2&r4`H-U$u$~{Jh}OLqJwQG zfiY6RVG>k;%YV#@<1_z>k`J@TER1WnAhQzI?T00&c_bA(KLe4GJ^{IG;%Pl#(nCO%WNXHwFN z9WmZ%gL$*=Db%ljV_rbjx+C*}RM?0!2sdb)MYEreDRm_&J_-GTe%kN;FgBre5m6Y- zu^4oy20Y#`E0wLjtcq!uv`ic(BE(dQjU_9RAxUi&I?q*b7CC@q5Gi#@>M$AuKv~ z<>|+nKTx`w3v99Cm%bNby8nkzL4Zi|NI*2=R^4o80cPLMKFuM|(Mk53;TY%!CDHqA zj?qmG`GeP|fC7q7DagpiS~8ZgQEZ&nv11krcA7{{#)GY@}YPmc4j8(d=r`zo$0jY5%b&QPE<2TO~33WGvCVc5hbJG>xHBL3{R0Xwh10 zPIkZYTS}H!C)V$85ay5Q1e+Q`iWUu%4D%_hew$JNvAqk!$Xiu?lae5wisQ-FWE*p$~i!Kqj6_rMwgS(YIbzLeMvLf4lzp4H?d z(PwM3glUG|XJbL#rzGR-4P4TYBt(3}YTu0$$D(?#W3s;c{phf$+xAb% z`MFLV_X>|WOKvlCQyb-WN>)?GiMW^b)kjKwR$2tuaKlmPAEXUy#1RnTiZ(ay4_fc| zaaBx2uj-9?c}HDpEz+<}*`1(QV7q6oeakYK8 z@`6_e7*s)+2Q&ESqAfROM+>uB7M7bLkD$O1sY7WF<>t1LB#9M|3cL6hl$?PcRuw!u zZfUm3j9~AoZt3qJZCu~TD--QfVFSrKp9T%(+GBFCw%F1brL5Vm$D|r=yN1s}v-G1{ zV!Ub|r@t?u7z;kvSjzE?dfEZ6z=Pm#bBqR{9*3eup#{OD5LUo2p2Xqo!xi_ObqXJ9 zrE0Q!4W8eGhrReu&T3Q`91Hl3VUa}ztPpEbPeHeUn&c2$b@_F?wD7~~n(XKk|_tlEVGVV zVlg3{D!>7xJokb#WT~V6I%7K+^f(wzY$6^lkx#Vp6pl~pTP)Zw;(Vva>@zG+yEktC zHe8@Zr>GU*K`FY%#>LpoGJ*9hd=hvdB-2cfku8ebmc4C8PL3r`Jmr*;u)=q`zWe4z zrJ=X#?BP7aLAqcaY7!BKL2B3*IrxhxTCvo8nTfDSsL=l@d{Y04^{A`$8W6YzY63cm z(d<_7KM0xE6Y~ar98`Nwf{MdSlB&v5XYAMp6FWq1RVjyejjb$&0OXzUz(CBWo<%PN z2;PjUyLNC4}I`bm+PY2)a2 z;nQRSLMpd=eWM7-{QEMc?uZiP0JwkdWJ!;m#!umj;P^Q|u2IGB|EJ*}gptq4j6uDK ztMryM}34Dh#?{peBs~53qes;R8^+)b>Gr)q)VK-2C|5;kC5EvHpwegx5u_UhKlRRNT z6lu<}e9%;C-N=5%-M^QS=geKoaa&zXm>DH9s}_x4o1_u9*L?!CmQ9QL-v;} zY;S1fJFQg zbKYm?SO?rj7@uCU4bMy4%FVhAo`c6~Gp0VM_n&gyTszrHMGAP#5LqS)5UK)k!aZoQ z*)0FNXJNcil7vIua(`v_ovO{DTN2bv2PKM+ zIgcdyhmI9r(ZRYI9*hUR4wU*onLLFpz+pK2zaz)FKp-yOUBLRS@5i`g5BG_RwxXVh^OU zf7>_;h_b6{mqjw5uVjuixKHFeW?~woD$uYO*UCq2$Kx1pNYK9w`u-(9&T+1dPwl^H z%Rlt3T5L&{0)Y_$>;9zZF({=E+68h$n4S`7B?1!b02k4Q1}?h6TK`znd! zlfK}mo?axXsG?s_>6^{)#%457a9pI}G==sH;w0avDY=p6h*YGjZkcAhlR>A{HX5K6E;L>m@nr3DHBnqH)>g0so@N(-!N}}3>g?+pmoZf zSWi_4>I<-Cp4IkR$kL{{Nh_m0|7uzt2dptULzp0v6-XsuBqP^>@6+r(%ATDNKjqGpC zLyLvN^q}X=+I-q|YIF*?H7G`{iGQw2kNHL6?Seqw9w;z67EG1JC*`dC{i+G8#UNwD z5f}PQ8nM&Bjw)EX^BWmj1$k=wjzDq-hF?(dh&_VCwprXxSI9?j>|O&CD`Hy9`@P<4 zPh}$rt~k6jOb(u`>}xg(Ml~55N3;KXcru+iwG&Q;b68j6sy)GhtCKIC34KpdXo+Z* zL&ELgddu?x@7K<98&f&B!D=f+qND7Vd#-P4AxEaKzZlG4vkr#MEO5HEpNVlH0;qPJ zsNk~RbMb?kEkUOr^u5?Z(|{_gO3)f3UR*wUB;evdYRs1JYL^?Rh-3F{k#oJ`PgU3t zPU>Z(?a%Od>eHwVxXl-@kV{m5+Q+nj_vIn1{gsX_*};{wH?CH--IN!ZHq##yhMK+9%?g# zQ-VIG&1d}NF9RzgF~jCJ9w+Xi)MpAR$8I_ner6ki5|rwW5K<@2_1)k03!+_x`L(>m ze6@($d}AcA8UTB##i%Hftd|?_+>+rZ|7qO907ufxHrG@lsvUdn;}tWSz0aY0gPu$6 ziN30-BH3Mh={G6-dcTf=b@zwh)X7RPXJGZ;9y&6hi?zhqbTuED0^MV+k?)n`Z&gGk z#GBgEqmNFx4zoT(!awbn%vpMMiX`n$em=Y9ZEbWt@1HOr%gM#?6wtW~-1mSsUtJP? zk1TN1)dbL23^*EcKfyc1($;^3tGqh76&b-UvuEK>3MEor<%Z~;Sf1!skv7D43<_Bx zs5GQ_uOSHa?Spm30~`PKLY+Qz_;Qv^SNPVTBUH+{8%(IYxYpVaQDAb zmNu7ds+MSDM^}f5{7mBG0-2sYoXjYuLi8g>g9~@yK_Esa zp>j^;K;^ORTRvlPK1X20IB+N|Wx|sD%4Yn2P^Hg)yXpvq$o@@WCjiRm*h;VAd#r(5 zP@x<}>UURFow#AHZ)fzGSxVn~$lwyHxBZH>nolW`x%nBLr@U zRYZ3A&BkZTy@e^%v0U+@fX}nB^i<;?3erAwvM;9CvYpwSw>*O*GJAzyP9f7fbp9%s zwgrT;`q6syK&lzo$bH*=xbhW+hGIm-^I-az&RJsw4#8N4J!dSyb&_63*xoR}QiV>W zw=GJ$+owgue{&iGBQBY}t)mt5{m?b~e;?MrxC3$_Nh(jPIO|_pQBXI9rGay-9+K#? z@syw{h*x~2E)`RaM+_kin_Tue3c-+vsxO|&!ui2|iI}zCWUMFNFcl=B)lSaD!mr|2 z6Gv(WcEwZHb-_2fk8F%oYm&5$6B4IdL^|Oh4n}!j=1ABWaw%RjLlJ0MzhKi%wfNzW zRTedDuZ(=F%(=whqCc&eTl=f?aI{%*W?AfE^gIy5utb^^zM#oz?QJ? z6HG(exbq$!ytwPJ>ti}L`s4gYnTK&R5F#CVMM*g{;3;LUQi+>mFe z_F0eB@?McCAHoSb@>GfC&VC@yvgplBQe%4aJOznan5h2Lb9#8N*HH{Dv}NW_vNoB# z{zhw`owPc#sx#3j-F$;pVepQGjPBu$rdwib7HBhCCCUCC8jB5?(Y_#BGU)uo0x zFy*szRh4f?#%S}(MO7|p_gyy?q{Lb_c2D@nE`)8ln-1Of{-wzd$FBpIJsDHR0;3MU zc^W#j;6w4^bSX;AXIP6`O4w~QQ?+6*B*H}Ui7<8$mAZg?%sSg#C?or~J{neY9)s?h zta!kOAdKlVC~o6EsNU#wN|3^l64UJ<_u4z-|4**nRW5hVk`>qVM5~3+KayoQ`xP<_ zk`cO>K3&f+A|j2oZAIsY}`-E;ADLme4oo$__7WL*69}Lk8-*SY4=B?XrSd~Y%dq;Kb zo?^Xq>X#z7kR&%j1mFlIY{}-~o=~$}d+2Co)f}Zr$jmeVWn5SPe2>$djLoJrSR-ZP zVLaf-^b&69LL32p^kKzXMJ5j?^q4Zs{^ldaV=5}Nv6gCKl?>6}364+}EmL?gt%x2> zQM4PIvK?40DFH{BVT&<`U6Lqg?w)T|rtgo!2TIyFdFfk(!K=tH525>99?mOBY_De{6&yU6wRrFM>^~TX#=7(?9I{tii|jMdNF9 zwJ9pcdzy}U>ximH z-ynDXD<{EoQPcwCl_#fO5I5ULO{zpf_4-`I*KJvL61VYX&5|-^g3ti0#0wY!1TUUX z=~Ds7V9>2(z)IkG&FRQy6YF}CNX!*s@&D^@VdwGz>D}vTQxY7QP#Fs}Ia)Y~N&_ZM zsi@IBy2!e5oglk`v-e_BBwi{mJG$3u1y+ugMrA7!@8!Sk)<386ub2q+TM9T&bqBJ? ztfpn-e=w@^cf*GUIkaN`*(+~<81**z2Pe`utRhnVfli~(o>ukR#_R5Q|I!k*M-{F) zs9erj__*UQ4cS^=?p$f-*zE^7nvk$m+Y%zo=tPFv-b^LOq!D1sv3DzOP zE|+ixbkuqs!j5Uqp-5!Z{E0^?(4vFG*I%dD%hZxWW*6ye55L(LNjdcYHU!jSJNklQnFX!3abQiIddf#c z2y9+NU5-?VuE^+-?sD+r2ED}`R&vK_2L=r%2T6bqkdP_*(MdM{2oDk)^qwAzVa3XD zGt6}kkR}3tbTSSBa>t=t@R=+wt@}0D>P-zoFI@AeM?WQM>qO)GmA_l;j{u=V^_-?t!BMY zUg85OE{A_tcrcUKKz!?~o^a8ZfK|GiovN)kjFMg$`lC{!^s|Tq`YS<#RXyRkDq17a z*QkbFrDN5 z=YR|E3;q(K2;N&lpPcCu{a%-aE5s8Ov?b}OdE@gVQSKulj!4&J^k1+_P3hI76P>|I z$>eHSEEAb--;(~^7>x<`yF6>Bd>>Bo`e*wPmN?7)rx$pIXnsssUH;=TTK9_5xo7Lz z8s-X<0(W#peD?1%x-k4Lw+ED@g)+`z>*~VGVcEBcwh8(t`R7z(i?a{U<4Y5 z#^h|HpyD8=3`7W=YHRAUGo{NvSv14w=ctJfJiBK}sUmtg66L%bBypI-&%} znWmA(*NtQ67rz$Wt-rqn+sq-XXZ&pr<*;{g>$nOg`{u3}1JifAZnO}Ofv76)wjo4} zao5hTn}@Hx1tj-Z0in7(iPH^(G&`L`xt$Yv)@EYA9;R9dtJUD$nIgyY^|pB9YBK+P z7|~NlB3Z-Xz`dp+*H?zk-I^{vX6Is-u>2Z?K4C_ihTwgWSfI>7-3kv9MN>{py6?Cj zPGET_UZTL* zE}Ewu?=_}}B0Y|y2{#Y9h!Q7|$eYG7QnEHRs^WFC9_jZB-j@vCl!|~-Nq{^ zBa9bqY%OYAcT7JRXcXhs3S14}Dh&_P0qU<4n82IEa^MUmM7(x6&e~#y3qTHaRQ~^; zTA9Fm9s`qw-JThvmXRL~w?&^_Yrr6NEGF72!n`m|MM*Qk8A@fTKTt$DTCcunn#Fsd zx_9Bf!E|S)%&Q}&Zl!;0#GyxHol{4up4uQ%pm8nGWfNyZ4c=Oe^~!_1Et76kX|oy& z)wgi*IR9SgU&4}?JqbzJ6%9-ReuQ5$w?+~U7iVOub%IW~u#9w0=M9?s4}b(4z9MZH?|Q(RazY~$71QH7?W|M0y**|Y?;U#yvo)4-af)P z*<;RvGtDzeO~q{5cQwZ&r_~5FDgW9re~xUQWZ(YE<_rU^nC$I8Ib&CT-R*;-vy`Tp z#>)wu{@J@QAJ}_iju4KEXeVHFnd-g=xAbnj-#)fkgcQyS2P?#D^EenkP{)yraz%s| zsB6vT*00eSc9uHM!!|>-$aGPv7*&(@638^=5lzF~@`wke;kN_Hq50q)aE8M9vn$f~ z_x$G<(n}+dK&-g$6Ix*ppXmOKNK4D%u-6B?4)LDpNJcGCwaW*8Q2Me2 zn5%C6MNU9mRuYb1(VR`qn20UaF z0_2c4Rs}AzKypda#Ib6bSMOUAA`YkihXX1d%hi1nlmatnZ2@|6TAHuHr?x;^MxgG) zrY!AgP&ti%2-qBdE9<|;$i$*&fMWgy@^uIf#9JfpedNCfv~r{JEryAtjW+|S^J5XVHgd6jo|o^J z8z(t_NPXfaZB>qJFjLKjKN|?$r*zFyoSJ8rpMZ9-II`H?yOsY$PRqHh9c}MSs=;i9 zWxT7@)-rOb%UJ9(ish)6-p_Pdjj3<5lt<)TnpL>}F{h@QO)e*Ao-Ig6UOtaep8X@2 zgsH+eDJ!Ybyp&#+@uxBj>Jsp-4F2DqEx3B-(W#KR*mS{3JPaQ)hx%pcuypD@ckXeI z=*lf|D}qV+j5{wIC)(xa81jJY_tR+LvhOJn8NB(sS9C>_c&$F;J0a6=cUbtXx}OD8 ztjro8vhMLnn!=WenEQBTO#OB=AY>M|1JMW4rLNFkWm>BEssCmgP})yRWk9swL8N05 zm>iYjAIIgMEC*^hA{oX$RQ=I6efO8<<7`4PkGD?Yu-q)9>{k-(z$e-Gq0f-sZQ!xQ z>^l&2W;9wF+da=2F{{DHt+ZV4Rl?cd)a^aV)_-IxsP=jBlG9iwQ;#>sn;~(U?79x( zA|jjUYA0*rs@vEWeGs*D%j{+kP8PgDAc95YG@Ocw|6@5701CfxdPISckSe(|-wl z^mDMrH;=r!|FplsEez}h5AyV+i?@OhDDSt()3racm^GY&!f6H?c*Mk@LrTsH$XbeW z4)OF6amsRzrlJCsFxq#|xUgYi<;|GGB>X=2h((W>i8~0bY3TnXxO*gA@^V}~Xdrsi zSyUhfoFH`() z-rI~`++8Zd*j#O1xtZ%-u|IS9;0QaFa9{fj9!Q&5FQJj0+0r4Q3%!l1Dt>?>=n^$_!5l6X%ac=~PAnDHq52#f<5K=Qs;AXYDpF^|!5h-8!vwXH5@?K8L%-S$ zAC#3&C5Jid#UCpdn6|s+@KO9GJwV#$TQHF7-P5A_d>_u+fA2Ajd{x%xK5T-kMz}#n z>y*T{`cF*W)S43dom{q&*ygEnZFp(i3g-?)_ri)-lEaHWNcSgM=|rlZ?lp^(gj(N8 ziHEw39%DccdvapOxq-kzO5A3|e`XQZ!Gfvc*UGbI03lGsV4iC*)D=A#mEzbVr|JE zwFEIL!8v=_ewSSjoF)d9(S-%_^@uW$1tbn`^Pcw|JFkqW3+i7cJ~VZA8fITl*vvsv zm{(;bi)aXYV?Wsm{`kyfK%E@H0;#$*ZS$-w2Vo;&(cIcXwGP z-}8l<5<%ER2!~xf#pU+gOZV{E(8s67FujLzR8q~RWtbPd&usJiQ?S^}$GCL1LmN6V zP7Q@XLMD`Fj%W?f6>wkx(@qn?__y-hFUclIh2($$&I;CQ$z%IRJ*ycO&F7L~D<&BI z!nTt-ybG3zVRNVr!5;Khw7#PJ?^YgFe>UBH)}@#YiGzPAT%Y z?kfF13r0uBNz9V3`>4l=eA(uki=fkhVs7}Jdo7}qlup!Nf3`@vS zb0fcr;)!s&VTY;XCVbbhQOTi%vY6YnU|<43N8i zKpkT3I_Wk%5rv~{9Vbt#Xc^>DXo0aXfRWxbK%`i5lD+PU#Aw@{01Ly(g#A79=d*Ac zI&K)isrUOMFNT3w+DDDvrxaNRO%_wvDd)VBgeC8aB=uI-4qYp80h19F25+BL&P(EK z@DnMKLR;=E2>8wXusItzL>@26r6=C8)eE8{G_HgWVy~GBOoCR~;~SALmgWVgC)ui} zS}owanAqp~^1NHnHBCGA0v?l~exGuPs{k+H;yWpFPbW)q?Owgs7m=jSbeSYh5Qr$L z&QG7A?}eW*C7VdCDpkT5aMOGiXrKF1s2^=oFqZ$*Foo6Q1<*XX1Cmc65ceVgDqZ_M z2i$Q6iSVIU)N;Vcq^o;4M&YUl4?p@$c%4IWPMIM&{_fR>jh09Mvokzq^Xi*+0}Y#2 zRR!KK7%aHF%PXkL>YLa?vf?eZvfe6--KtPrKvcfn;2;wjFZw2^0Z#F&gWf2mi53>C zLlkZyCr$NPymhNn>c_S^CXOuKvohP_l~zQEEpkA;N|~~dH296tM#4ztm>goqBYHY< zV}~l?UH!(wPf=R!6qktRg^8d9q_FqugsD{bq8k74Et07}EN^M60lJpY=mYVmPzTnR zeGGhcMGj(k5JHOc(4M?x9wTzer%OV=Zgb|q);*y}%{w25z62~r^PR}yhF=BDPgEqrNsmBrLrh#D;RIDst<3VxoZdkXj0{!`)H^K z4%<|npJkC4S^c28bUBThkTq`g(=yfvF<5{Jaqj(C#%Dta?>tmw@XS+-}gVh ziIuJ!p6>zSp;l%;cRIfF_C$l;NiV7d7G%XZq~dgySC>u-eoFM4M&@}wpi3yhrIT#T zAF&i}^nm29YUH4*mno}8yMu#9f)SJd8uZ+$){d_H4eN;=`=!^Di$S_?QI9qVd!zlH zB78fj@Xm^0<}@Nob>#gGbawd;dW4ynQVK4lXD5&V?{{wZ5<&UonT-3G3IRa-d*TC9w1@R?KPW&f0x$IvQ3+z(cX z`Ct(exVJ?Nu^Ikvt$W%3@0!%KF8Q^Xmk2e+R1j`C)P&3h&K3%Ohq|E7%A^~w8Y3U=>+Zk32Ubj}n#Rl4;@bXBk$^0$Vau=^lHG1%aR>NjS-`Z@N zN5Q3e1yJ9DP&M&V3$8A5>7rDXaxJ3Vz)zEg7nw~=6}s7NBRd6S_zi`Kv0^;>5B`73RX|L8~Ml1AdEEAK=*D55Gx zu~%y~f+m9y%>ELyoC~DmifM(ptb{ly;TEG{l-HG8;da5(kAqiay_y0 zF&N5T)R62A^!8t20T(LYw^x6T6b+0cQ`y!^)AZW?o#Ge5Z{Ek6oZ}e_>Pq8My`8QX z|GE|eIB(?=_-27J7Civ#;*r<$sz3klV35;&PPdQ2i;4l%FEd{~QTXmOnjH=ivBPsy z1O^x*kCTe`F0TO5QCB^-yeH8wP>cZ^n7M15?G@cCoLfHGjFmi|mQ<#OeUnUuRn4iE zzL%#!*Ns8tS@)l}#lPHe>U1WuR%|7lQkx%!oQj|w30dL{+JuVCkn@9J$YUAdphGIv zP_I$$-1`b$?hsi47z~=u9vrtmSGDQY|cec4T6`eKu_6e3s z%jW8%2G;?F=WNP}J*=Vh<<*H8sGdvD*LyP14RQQ@Y```-ZBKAK#gKm1ndm5N{ajNv zrPN!dnMD;t{?}DAwsE$lUEcU!Ci~!=QcwhYQT1N1cDsF~cw$EQa=L(o){sRO^r{=D zUS4$kR*5+yZ^hvS)fD_g)pQ!+r^sx~GD2p$HyaMEBW|DVm|2XUN+X)`0$z-r2@#>9 zF3IPZpeH?p2ViChh;#z0_^p6O$n9aN`m^#faGH^x*j-F}7-t%KMQp9Om(VTM3qI01 zNv4e3be=tf5P;mM-oVxK(=r0z`ou@3SB3xMTaate!y7Pv-wa{1YBS&lp*Tmlca0;N zxmS2`Dd=uLWi95^lBo?G4#S+!*P!wJlD*dN4TzN>3BKnFZLNsa8$860VRrK-$@QmN zIlk5AeS393>TOnK+gMAC!f4Rs7@B>r-G(A0kx;AmgaLwkYxrK=9mN#6*+xkwu{>i6 z)v}+A_Plk-c&;2K(30i)=0W|>r3RgC9T8e4H;nfIZDByQkVUU}W%XH+y-a$U;#$Nt z-1F`#42LLhoLlvIA~?tU7&^=?q8}v9mdwUT%yw@mo7~RUu+N zdTQGbDr~j%?2f{#MdD9Q$>mYlx6Srzq?O4M6PS4XM|BEJ;!!C0H{r{*0td7xb8_mJ zO{U|8?^AtCX9voPq;+99FUScIt?tET15+>9q{=V$CfCUQ^Xbb@a%~1zK)^^w8W-3k z1UStBrW|MT3c~C05qby5PvXXie|z+x>(cUQWuo7IXRd6_w~3HMueZ8CiMZ}9@igdp2wE+L+CJ?jn3p@SXS-({|~jR%*T{0W(Q*PH@HJMMmo@MX63**QRwdu32P z%IfNsC?T#M+r$$=W$=nHIVkVB6OVgE>d|Ix;E^w;b)QBYOT+Jvt=-u>Nfc4leT>5- z9I##0Yh0lj&#Y+|)P^0^OHYD7cAqk`qG~mdRSxBr=(x@6Q~N9KO^XLtcp`g~hBmdz z72?%ODi=hUAT`NjScR(968)^BAd5U&~7(ydP-@X z_<;#ZGl@>oT5Dg4Up=GD^$4CLx-Y)rF0=)HPnTAL9qLThq`IXt>d*4hnhO(7shp-8 zJ$UUT@TvGw@(NHN0v_!T$cd5PX7WTheNcq-woAVAL8&4JqdR=)1@*15_sYvVG(%Ic zUGUrjZdh-N81Eag-`Bm~GP+73R#JgzD$J1H^Juhb2M+Wj-|j?zXT^nj%;7px#HIU4 zlHS#h9r=vW5I#at2TNz0c=D|aMLEtopzN>OU!fSUzhhmJMi;ie#ZodkqG>ZE;Vmsf za(V06+9X{MW`8goIEQepu>?gVfnv!Z+SH&VD6Hzwq`BX0ovbsOOZA3Bn}W38_tGay zOt*sF-Gk|h7|=;>tKoXCxAxCNF{*4sVHw>-uFlH-Fu^nzzc-X6_Qr$m^S@|i9O}6= zH}Ch7uh@KSMHGG(>=!ZiXU~p(5*HeDSO|FO4L%uO^IgCD(u^Er|Ge!#x&keJr?fQJ z;#8g~hCEDYBkU_IWQNB-&%$7yJ79PW+)vJhW$GA#)$41y>qvt$gnobo6(+MN$zoi1 z_=QG{3jM$8cJDQoIB_U))J1GX$wQ_?q(K9Wc1w7!82 zao$=81i+iA?+{&kguE#mJ$?hnscnsAt7h#`l*f@*Dwm<6a@ zK7$=jL`h-1^?0_3N`}NY4MbcfnS2r27=KQl@_2XcCU$q}{NEv?gezKMzA9_0^ z(u`+VS=FVbVG(Ig`LZt4hX(znnOTpH72%l?EI~q;&AvSP!f-XBxV--id)6PJC*P&&0mXt# zP(aBEb+LpUkP)kPLY1#-Z|A+tKi>~6C~D$b@%kP#iGFb`D%&xeU4Sh9j&I}RS`Z5E zC*a8=nK_XiU=c8CP3bsAX4QBfIz;`KtC%#;m+?*MWx0T>LIK^Y%My0VV4KtaoM)T6+BSu?#I{hlv8>b<%sl*`+ zwBR{_o4dl|&qbK&`BG-GrU)ia5&*vu03J>tFrD(!qJb0W`FsI9tJ3t4`}WtvpcKGV zfq+jw{wl9P<-$e*SQ3W9s*bFoao3wCB5^F-FXegcRKz%sPs7Wee75~xOyDu0TkY&& zL%Nas;wh2{6btrF;b%V&(#lt%!3YWwoXf87ljVCEg%ei{QB$0)&JRS{r5M~PS;xb? zk7x13%hKK)Urq=(0ag!)E_KlG;isnzDHYqm z9UEml0=}s+g+#~C7Kg;?e^D3|`SuZk8gIp93>E1&=q;z?z|XgLmM77RLW^F~d>NSb zZdK)qqT~H%9pEbeeW4{<;`P09^XRGpzGA(D6kHm0%hjb zOB+Mbgs0FV<#jU1=qavyh@-p`1#fX2hwvgf}WM9gnSVdIK&H1SQuL~c|`FAzW z(VqK{)2t^AY|sWV6C;(9P#cSpN?*Ze?sk$b9l4y>#SG-8QbNu3kQTX^TQgeZde(qb zDL*uUysU=?iNYvWu~k0@KkbLX8IVVo6d(w(?N0yqYiB#?_EO5oCv(dAO8*?xERuPH z%EV`H3qXZLA$qG~xKQ=Do|)HEt;9eBlYFMWJOUhPV;<-I!5^V`?j!moetQB@FueEP zuw%%1+xK~y|7wfKTAGNz32gb+%)?UCj%@UvvinGj@qKi(Ioc$4Gkb<~hZC&f4C?!rT zqHT#2v8#I|)XRz{@yD6u&APFi6~?K@HgG(=(m%fEX@y+4aWi5ox31GDjk+iB{!-M5 z&G`k$Klrf#;6b{aNs1N#>I=Ufz7qUSIt|#tP<&p!?o%-+aS1Ga8OIc~`>vG%8e#wx zIv%2i1@^APL_OOQniMlC4)s=UTOZCxjN>$wz5R5St4$|@phKfagDKIDCLUM4FvD6} z;JC-F+?@})Le7n7%p@kKbZ$2zYNg+g$Q;}IY zc8E@%3>z{bnufMb1<8MKS! zD(KDhMV*W7fvtn{an)K6gwTiAx`$mHpY|1MkV2LNR@676L8AybK3iNkT;fGUG@nWM zcUfx@egs;{bY{48h=$pk$Wl~{7Mi{YEBQJ@SBLkl=YK4ng}c?oe7n z1SF(O0qKsROG+APP(Zr7ySqE3yM~y#p1FVT`#0>*IcJ}>*Z!^8(%cj_@ z@|g!|dWA}$%ZjZO`F1q?_WGXqJq^Na@>GVnNIWqbVNdM?Arq(|jxH!_N@$E?T>G(a zQvf}1y)oeYS3b3SUd`|JW*)c&O@c>xjV_WFD_I(5c=N!{+5B;jA%6I)FChU#Q%1YR zm=^3IJH0m}&rUK+u?p?S0vB%E1Ds}o^@61|INcR zJZ}tg1cRQ9=A~d>)$F-&g})RM!2RfRnc1~Y9q?FeB=gBj=Sqd(5C8G(&(sV#i@!4b zUaMYv0fc0xJ*g4<+bl{W+Y>f$7sRgs#AOQPMiPfaL6kKgNEPmk3ElHa7bV{Ku>xbU zz#uyS&fTRJAZ>Sfehl332MXu=QxSSs6~>|Whx!wmiB^bLB&8@D5VuBuJmz;-iN~18 z3G9z47GGHZmpN6b<6ud)bl6Uf$^W1%mVDkD-?t zTCPj5wLFhMIQl?O$mIzqYUGp5$<0Glw2r>-B!MI5B<M09k;FA1Y*}m*PnMOU2&F z7AttDtWd&*jrk9J-xpQ2P}g^m>2CD3^Kq2b(Rx-aVaao?XoBBn3rThS>!=VLJjFV9 zX5?%2>SaOd?MV>|$p=eyb_UZ=Jx zhcMd}ZiJh^>uYvhZq@jQpoI={pU-?#oA=muJb@F`Tt@IPoO+QwE_XYngw(?MMYj3ISnm)Nxb%X_My)T0l$3#R=$UPKi_LfOq2$1ZaE z_~?daXGwlT*=^L(Fh*40Y$&vnN``i$O1>(L?khYHGOve}h?msoQ`nHf%V z9yy&Thp%hmxL&bKqOz?NMF{_eBkEw5rFqQvq(K8{V*9vGWMldw9Qgoj(B>a~iUq7#S^P2WQkib|l9PSA*rhQSI^uRi?kY9fDqaW9|B-h$noO-b9i94C~h(`wmJ0L2CZ8&YmjW>G%C z;8fD*t$F}AAcqiW^Hk_+geWsd3xEo;Fk zSu>-Uer)ofaE6&U6Uk}7RE*MaXvDZ=1&ea1Pc7kR1_b@48e9r5!^NuYD#vaRauE_{m z9u=XboEt8UV)VLDV^|12esT$EG{K29HaOu5&dX)8AGYuj@3aC~yk;KaaxLR*nVR6d zww*mKrA`A=D3`r+Fdun&|1ogc{Y3o$$DGr|tT+eA7%ac&<2*X`;$ z{Xq=QznnDFWuw7gkaU`?)g9{*37;8AJ%^Uj=B?WK(Sn>%!SkwY{TmoNZn=kuri!7B zzLpeTY#rN11O_aPtiM6w*2GFUJ?m2JBrO2>L*|+&PG1|Xo3AUVwGYcY(hPY^qN3p8 z9XaJlU1@nbvxWTQ#)HU<20PlBDo$UB)oC=m{n=YEx1h&yy4TwC*M5nXyb$rDqU^7< zXFtVS{X>H{;Sn;(8Zc-zSWAmhQO=q?g+3kgKzkr_h zU@#KkFM|0$N-JTy5G9Z5)9D`~)XCv*lgK%1`%JJd*t_h}E}~xWLqMTTcc725WrfJrg>SmnxJ3b+) zDViO=iH0H6 z_6P!|&8m`;kAL{+v|%PoDDV4FjqLFGx*(Ki`9sMcR_M+5UTLB-yr!ncp z_VjpRd>d6Y;*;{WUy!lxeM03ik%ap`4e;21KW8V?L|w~O%Dc2WmI3&!0Gsy@L;oqbpr@2nH?h6< zY$5D0zQLmY5s&DId&Votv_=za>{4cL6!IxV_-h1?jci+qg$ud7!c0_vNGKI%xW zWxMSVnn~M#A8qez>47sY%c#+7P&1WDP{z_{{E#R)UX|)r35TkRV{o5$mLLf&$_x_> zjUx-uL$xgQwx86ai$!@cb|U&Mn6C*}J6`hTyEI^h1vPm9gJ4#rG!wi}xLB2@xpKE| zviWQQn0oPEd9lJdutVm;X(sYn^!%!c%+Yy#=f)Xk1*>i?rY}RFoWf= ziIGnFe>-Vz(VNJ?;_`&vFo!kIM}a+o060U zg1_N$(M~Zx3Hb_Mj>kFR@Y}n8#U8Mx=KH+kxRGS#woCuYBKepS96?ttCo5babQZ(1+WPb3omPXj~-O;QeA8B*0Iy>UIlhq&5CA9E7%1_73<;`%kQi1z|h(@_+eMF!R;|5X>)@I9dF)Mw`JcP5EmXj z-@cB+(Q%0%8-^riQ+K15MytG!AoG?y{6ee)RzpPM)ZU6f?%R;UwY_ikoX{a|n!+nz zPk5CPxs;cJbQX(g^F=ly$tFg+RmZ;rS~v`EnS2 z;M6@d&4}k$A@lf)zzl=;ywUhlrhQ|cuU$eSZ2=JT=}|~iJ%x8Pd{TBX>pXWa`>|%* zkTYdDkxmJgVdJ~bs*Q{4)Hw2los+-L@R^Mib#OjYu8*_$pHfm#$nhP zbmqp+DgKH)+3tPI(C!*m5^Ub9{2YIv4s-=R!0Ki=3n2Hia~UFRKZ%=uSnoKmAbN5J zZ|R|Chdp(S7k|mP9rKbj>9uuuXVBVyf>*&&_ct09M>geSd90=T0+|#}z(q$+Z!Xyt z)lZ77ntkt59wTkjs0%RK+fRDZ)>4yuX{T*bh<)hcf`xzU=7JhB$Jwm&ZN_rGir*%5 zZ-0)~ju`VfcQy*klLGNqdc&>JE=LpkOw&A);Rcm(I?3<~S$+@d3{9SV(1WLVp z2n!ll?>)v+oG9@L(MQEaBaP_V4kOR1D1d8`{c<~kiOM9qHW_X!C0AN^XRoe)ZV={E z3g}(fz{xD5O!R7y8rGoD!SPoKWyUwlXbMh|J8d#Ihs1%=pXuE|% z`fe_4x0%+$cZi?j1&r+k7eB4tbR4`I9p}?7E9N12*s0%jBj2)kE}1eZf~148$I`*Y z{}M8Fjdj0QNeNA+2vScv_2N4<{=HyeN4oAr<)+4aB(z2O!O1D1s57sSaSfg@1xb8B zg1_hD@p@#>Y*Bie(f@-L!RC|{ zRU&+wkcVkzOUtmHxJ)K(L|imTwwL@DpRGf)M5`2c>TDBybAM}HMjlY@FF%F<**L_C z=ZbM)8ekhMb>deMGQb<0zxV*0R@GUkttHLSW>#TxSOL7-O`(zd)Hp2cx716 zP?8sSh$zYE4DhBJ(kk_bmVW@S=qeegAFArcv?@;Vo7u# zcv#Yn)A$^^{V?m-zOF^1q8X{Mu6343n%oY_V{IO=8qKW&74^ggMo@b zQ#?gj{bq$N+BLtr2*W6|gF~RypfcXH_ET~?O|Xd4)^t%xKoK#nd%#r&TQh#~JsN?$f?J$rCu#G0%c$Vs}Jsk(^P z!5~m1=^dI7K%{C8(D){m1g%<&yYeJ}lS)eF{*pdC&rf}dna!gkVc!+}NElw{;^EWu zxRz#gNHTRa{ybDCh_~6gsms>$S2vaD@`RB?|H&6guc{RSIgrrk${~R6@n`Z+k1(|t zS!j#OJL#K#nyOYkQVdwPy&B=hoQ`QWq(V>T48T&qk+|>hg~SNUxH-+>=LnHzCBaXO{@{RkA{e~4srOw$Zok4mhIAB)?e!_B(melZ1P~+yF z0qI=ii+b3^b8($o9ffXBf^=Qy6x}WZPcMVq?F45fW`Qbp6KkY&AbWy+m^>ndd|eN1 zo;KiICS-#^JHi6CmBC|~C-bL_*8=h-oPKM98d;UEfJE43DBa2N0#JyW?mLG6xKrIM zN89-B#C3(sxZ^|j+fp~l10`g7D}Tc`7$}~y=Sq-90&IYze8|71j9E2uH>3igZSKz8 z!?cuufn%W9tK%I+kMi~bwpzJ)y0-`nG4S=;z_I7y;;z`Qweq@^m#2hAaum7>jNQ)v zVNe_mT`4J`U;ljndwu3WtwJF38wU+_>Glq(+P}w%;qgaN6LzrgdF7ZrV~FClvkhCF zT?&;)r<9Q4+JUwaHf1(`VRzHd_RNb8ninDKAD=!}z*#eWFd5d4a1<2Z{?2q;cUO@9w-f?(QL2Ub%ard|CfD%P zAY3X_ENQg&A}N%JBT)pNcbqIad{kML;wVr3eOW@L_UCh@SW$UH4a>Lr#hKk zI!pvIMadBf@I@A*Vn3`F5GIZ=o+u3+ zJNw(ei3XLcMynk>N6yqcUK_p<0Gsrd?9jTtC$JTV=sJ_Sb8VBb#E*kqisGT((F0So z$#vr#Xnwc;3$`kG>BtCeM205tH^Cn- zoZ#JL6Rf1ym2oDC9vso*!!J6JUJWI+X#KPH%!rk0?iWxrui>CpT~)igdRZa(3vojT zpG9e$w-kF%yI3c5PZ{}!JKqx7Hc8even0c6&|eBJ0>xj^kKv1%sO*URn!NvCJmmGl zbaH8B4WE*_)@3OX&c+UzdqNYxL zBBSd7LG{aDxCZuGob*M{#8^H_cvS{jgb^6WpZ;j|+Z@VHm5bPC7U_N{eX;9W%5M|o z62x`*CE}D+<5v4hjv(l(opnBM`tS=M^`DxjS=wqs90%HEgQUCpuj-k76-odO{>3l@ z`!dRLx&#L?*$!s3Hn6ml=;}Dc8PcgU&Ul)G?+}gLOSf~TK!(t(LI2exqgk$EiX&!V zkn5`c${!k-)pW?jwI6pnz5);y$jawpG`K1IW8Q$QqlB=SBK*>|Q*#t!-Bz~u+myr= z7BoF8p*)+|cnSzsKZQn~lZ*56Wr1Vg0O9A1w(ruW;(^DOy@PAJ`MYp3_{+aB^X&Ia zi`dFTB+&EJjTBj3IH5-{K-m}#Q*&4QHHhq0`yV}N_V4m`+%<%Ga*HPhvOEh~sj~yq zx^4#|G9owkp;Mn#zyt#O0?%*J4+4E--mVnlTcCSfnpMZK9DuERiv~!lB)wz)%LsF~ z0PjzL6EO&=Yx5TXs6BU0f?)&v@!?DMhG{+r`#ADN`3g zNrSr|y1$UgpT!@3^_8wGY8K4*$uX99*`G0gvTN6s10Y$!56je|oeEOuqqlbZ^J z%U^MP761D6O-2jv@u(FV0}D&F=dQ~-T_CxYt@0cNxwwKlBG%{H7@l%&zh5ifLn5ENCA)H3-QVngbVVh_e)<6r}Zm^_l!lw2@WN<|OA-+vlkq!*Mwu)8Au0 zu4Bj`nAz*ICQXw>Wkcr7w86q64>0Yt;w&>`!+ z5HG0@aoTe8MOjUf0O@O2{B^4J%ELiDum$yS@lbc3;4?7xjWEUDp_f%%6@dUG z#egELK>+=L0{lmyxGG~KT(d6$U88WHu&F-~N<0{F`pQryM`Cob)uo^x%*1sl!ozYu zx!+ACq5EcLC>%WHbYJ%9bLakAg49!K<@u&ozxQ4(_C-OKG8~f98B$K*F*rSn>64H; z+#-J!F5L-&1~ML|*V7uIEsg7|N}VT*tyUwoy~u4u{f&SN9P2$Q18g1_O5uz^o7WVh zaY<=kDRVI&SE5EcXEs}s@*B1HbJO_!c+gEjKh@{)2GPY^J^#I($CpUy@(r;+aQ|UZ zX}$vaavT^PFcDmtNhT%ONzzKwm{b%M{B)15f>G~4Ym)GtVS6-mpC7caqd=-8{Mt4$ z;IY_EN-(5D9n`Rr+l17mA`On{fa^HBj{DeaI=i~pT1-f1a zzu?#yFj1B4h0~q_ionz1=yvYc7x2)35073}s&0t@q#X#{0}Oy)<9}FnTnh+GL#KSo0(DOP9bV>h8xx#856~_5h&m8`vl8Up zsCK4cCkS|kK{P9N4Fpa23c`OSa+Q_7k)pqnOGYV`zkj-;IuGrL z*~0VD%Z3ut-^`yz!b_I2C{{`CLDMl)?2&JIuk`#KyADB(AG;K{D0V-_dx^-IgWQ!g z1HAeb5#Bfk4i6xvw4$d z8;_U2TxPzAcS}B9DQ-)jWsw)e`|+4L(E&LhUZNb!6_K>>&Ca_$w#avC^Y70RL^N4# z(U*|dcQbNQ>PP2q73pedW?Q}?k>8oDjlKE(PS5!`g8hT>W7hsv`X8TF)c(C9F^UR( z;or|)&*8yb;^z5T4X9M#4p1RvvF|jDkZD&hr<_|PEBYMu+S5@fUo+2*kjv0SU#FJY*%@1+R?DpU}h5j^ar(Jjgjn_1NU_?yV=(Glgv#htekIU)Cw zgM(FF``>PN)rK{6YZ2V_SlPQ%2Fqf_=d#iDs$xFMz#95?uk{G)1guVBoxo+^E9?w) zc>0P^Mh!eVH6e8yhg%I0LLl?w{U;k1rqVk47s`?4wL*&g%Iws;ZEP0xr~og?UY(=N z(tYk~r-|aK18VXCb$Wb{_LfGIl;Mb75|7A^AB26&Sjg|b31{s?fSu;HEYg#I-{bAn z))7((!PY^OplH-wntmgFhu_G}!CEzpM3wM92J?*vmx|`N<1gm%L0bL{R<$Mq+LlaL zwRQ?H{g1uY&=jAK#&|YqX3);xFk%U_@Ft zB!xTeN{RoLJ@l>m#acD`U~PGW`1Xz7FYZ&vKPck<23Xv5p3Msn!l29og5d+U5eYhqhDy zc`LVG_CSeQ4^^QjBAWUW9NJM3I)@kr8E)`pkKb1jx-6^#r|TuE_JBgEj@2NIfYD&! zA$1TK>V07wf7Nb5#yYSc{7M%5{mbTF`ewzc>((WVKOYWLeY%$VT(}1S5SN#OBFUp^ zM{h4XdcqW=!i6@@}C>@Y>hP&ED|;HUaSw~RpYef$x{53L)`xkC6`L2by2P( z5zfixhpc>0pM6&rPoOo?&7xbzaN3CvQCPg8g%| zncuk`=eHEoNCRIFXoK=bsLx!D9AupHUoSKznIxt!l*Tn4=-#3^=iF&Pw&2L__`r&y zBj)cKwR3@+!^#)vR@gPrcqlD?g&R9#q+{hRd-oh3ktT1m2D z0fkGcm0}}s8i^tVIPrP72EGH#ldtpx`@$?2BmRR#wX2dIJ0d)j0<%HZjsHu?1KoGF zcG^Jz#UsFYP0{p2ml-kW4>F!DHIP4$j30SJ+ zTA{M3=&QXL4O=6|f4wfGLX1QnPa$F!Q z2rJIUyR++RnJR!yScFA5K!(uXU*RRluBffrO3XX_KklSbj>?YcV;f zur>;h;B8c97PV%~>Go$>tz|r(?@FE96;!=7|5qjLWf%qR+lf}XmyrrOY3T2aVKVdx z-12ZLj)jx}86Sehu9_V&`0>|xlioMSDd-9O4gxirGhea(%jc?t()h1P-#@~>u69=- z{fFEFl;`&-d@B!TmrvVT7_)l4#_xYKkvPR((Kn@F2dteiE6uZr{hbMut_m;}27@g2 zfNXf4$yXct=E~8`OTh*FR_fz#90L-;KU19s+55(CJ#HKO zp(J2lvTl|7u~Qbl>c=`MT&d)_O1PNmH#jGA`#LD5Kh9@f8hthBiC8#r62bhGBHvC{ zrL^>ugR(1EWWTmPv95gUQfG7luC6zK_a0Bw6e=&h95@~xWxf^ONs>bpNH0i;6Ctvv z4}XL(UG4b&)eZXmV0q+QqC6QPxqcKxaGk-c#4X}HTtasCAwW&S#sn>lCA+5wKH?KZ zEAfQGsav)LHQtmSc{84cWof7msNj{Nd}G6)OdPqoX>4IC-c0h<%bjI1#nK>E44T3UV1}u6k(^9MCG~ zo5_~pXtcvqk3O?e;{&=Af}B2sSXkF7zbldU#_x5 zmu5WqXQ7SQ1%)NT@J}pz^7z<`ux#Rg#Zm-YfTMKW6F=zo`A+c+$aXkFVfucRdrMHi&cbVVx1!Nen5=c^j5S;tjr6?S+~8reI31(jo}AAmnxD%<-`zL|n>_Z% z6QzH^_*HWF%-QDl*FKz#nWQV+l*-J|Be|gFke4@gYbawDnWI z&3rt~>2=+b;}Bzms=}iU1vY|IjU4ZOqgLeHmczCeNlItZxL26J6!i`zBP>4vXGz$E zNwC-h5%Kht|3fFsJ{Me-$cDR_-e4RaD~}dDBrOQ))0Q&;2?4=EOCrzlpMM391qdhy z%%f^{7eWGt&$b&zcQ3>!cEFauDb(VZA7~q~x|f9h8F=yyt1&R7Y!UDg60B-M9_v3p zyxA8ZBDGDA3Ut=1FkGn>F8%jerhG>*n6;+-Fn1+S|(lcjFe8<|lp$Z6y%0tk=RDvk|*Z)t5MrV_;~ zGcn>1A0Zh2hF3aIS@10jsJ)wv&68L^wAUx2{J~f7SLi#O6HP((+&NWn0cXDVM_-5S zXnvoSp`A$=o01<`>^!bs;%OaWnITo7ILWW@-G!jqt+VVYa@D;UA#PfDxZg`OV@x98 zcL~+ENR#TZ+hUVg#`f4yo%t%UoV`OAs9swp_PmxcRfH(pBjez7kzNp?$sekw#{Cp$ z4haHT#Nv6u8ALW4Du`Eo;(xQKwKsB52%#L7Q|8y)bg2sgl4rDnHkAvVUmq7~_nCw& z72%qSzG9g-O>SANMJHZYabkR?2KTxk3E_7l?OG#x!iJk zsxsIEy@TV3#hsoYW+0U$@Q*`K`hOpBAX!qf8mI~Z39z}cipC=ag=gw6!p#?~byvLT zPW4d7*46e3*Jqr1mWbrPt5lpMc77V$2D)CP%>$lY+rnsm0FLhv%$~r$m%AnqZ}+6^ zfdLvYW6E6Zauchk!i>!;K>7^Q$eaSx_^r|R1D;2K;r{B35My5onw#EHK( z?BCZ5(ye3&&Pk z{Cj@cpZn8LkEXgrlm&aFm%by0W6LF%7%KePLfQCtzTy1n5`4rX4^;p(eTw>l<0utr zV*BOCeb(dNWw=HnADJ8eYc-o`;C76e7negmG*%rrV6O2iP{680@!`?anC?k@oCl>c z(qUd5{-{0#rTJ?Dz{M1_it?47mVy?(#myb&lE69>qYUXWjYuvokmDa$T08q$FDaAb zINE;UU&>e&0%ScE>jv~gw;H0V+qqtVJ?W{m-}u->4{gr9_$<<2z6|_fZQJ%61eTZh zp|D#QB>G%+bF_NA-5G`{Rg46ON|rM%xP2<_T$h+#optXWt`=GAfpWaKz@J0#R);m= zN^8`dsc3v-^Lxhil-y3psbT|ADs&;pYqW`5o@M~Duvlj?++2~86 zvM(8u)f<~l1;6s!pm9=)#KjItShw>Rb`pLCo9#vi^-ff}R;PI7*(tUR=CNa6o;f5z;o`yH(g7Tui^{+Z_gXY5Gh5uKvr{_!4FVb2$7uc*m1~fKsCA3+H|LSNYZ)(zLS@QjK z_s>uo_sf*fHQq*lP@M={wgbLL~>w&sX@q>W?p48FDM;I<7TT5*3PoX$PvMpA! z3Ciz`Dt^(jVB?oo2RJe&-EI3ae!ntfQZk9$4%MMvb?e?b*(qUvQyKG#u4x8mXVj3E zpjCL1o>0W$yth9orY}|&E&9dX5+mryNX}qp zaFp?2uS^W$=2Ue>oIf|d2YX5?+ZiXWo)JzTX5SYL<;Y<$Eh6Q-HE93sOUl|ENQZ@5 za8tcb;FOo9=^x9jQv1W(bHHNuB(RQFNU2sU_2O1bsVlqoBzPO!g6c>FvV~Z4n~wXN z(WP3Pfa#$}=Q4E@w|XEMswouSm=sm*3duFiHP_yhC7R0%n(Dqecbd zFMuteO}c&Z)zArLj*em&_I4Grv4j7rWxU<*K1)oE<&eIvx!~4!GT5a{(L?yQ>wZ+&|;gT-ukDlnDHvH*Vm*`(r#D*owcKVFNkG)Cea&!x9zy26c zNVdJJgO9L+eqKsaB#JdsKe?hMxy7k}&1u|! zp5i5deMIx!Tv3PN*!P=qY>BJO83eP+?L2;o4Tjr)lyEc+cWw z`3tjS0#Po!$&b)=nwkNL{i}mHm>FN{c1*D@eh1J2OoAXsZ4$R#r=wfM?zc*R<(_db zRbJ{DHLjhmDTYj7^&Hj`bqossG9j}(wkM~S(|yE3GkmDumw+hm8y zHO%%8{%f?|nGlkw+<-y$q6fiCqtU+zby!9G7%^=Y1|3xyLh)U~2sZi!V)Udu^o4#N z7;)7P8N!@H;j1$_W_J?ZrneQc;%tRCl_3Y5{_AND>wg}z#c{Z3orXs6emm^Y->_BV zq*;XwKwO9g=pN42ml0z`0`{sLHgUk;L$fDrNvJ0?;F)zx=t=W!slOG4s0~INrmvP_ zaL<;JR>_8PMWH1PI|Ue+Y2zPs8#-&BaAhJsH&c8+yCoD;m$kdrjSugiA;YF6AH9&Z znHrKyFbf#-u&&s}=lrYa`qC9P$MwsL+#hKHOT--fw>^;hD9c zU!(o!gv35%Kbz6X!VGq;z+<^8S~rziDo;BV5Kio6@`bzGTxX&N~FxI_yZ(wemSiI zHYc?pg=@u2py5JzVw+|`tA-=Qg>_9?cAceeEup7taDNKC_5VuO_TYF7njIfA*`;pm zjGLfmJC76Z_TDFh!^t3=WeIhUCYMpOdf?m@K`d0tGn;wj>T3>_3Na4I4bMXvY~ZXC z!80bS4d8|o9p1gEJg%46w$n0d;mn1O`_YcdB9>+zw zLRDj@92BcB$)DF-o#5zXZ>hJ3?ZwG_dFrS8qh|<_E^`lgKL^XyVNLUB^@t6l5c2YT zIc^SN%GRCEMLoo(zK3KrS$$1MRi2s)$CBUpZ-D`9J%Sqxhw`@ z9wJVzdtd%1%dSuk$$HD@(GMnVgI=k>-o^m*0dCKis~YRDXONi{x}*#jtLoIfdHm_J zj!jbgAqjAnM5;FVs7Ybf%SxAJcGHcFF4#o#KE2I;@=dTaz(Hs{EuS9OjD)V6#;SVh zJ@`h)#WJ*ayqR&LBUqyV_o2|?+XM4jhMfF>^!yqeBv^Qyj)f$v6zG|{XWVNnWP|Jq-QQc! z+Gmb-coIG{_4OpXQ}3%Tt<2$d2UdRXcN)y4-%##AxW`5Kz$S{7HBF~TqAFT>&Jr8- zwi+Mq&J)?_Vs&~PmpAQp`TDshe#9a2fdIMwKvE{XkTB`mnOIzGJt`>V!MJgLL?vA; z+-=^dlP^78X91UDKj;qnzx&kYmF7CF5V$CX=t)LxHxhdMb66O=e|;aM_s^nOkb;=5 z8q3Rp9b1u6iLrJp;XKcRPGTK^1Yg7kLv_M*^S_KSli3Kx;Ei6b;@$=!!<-b)BD{Iq<7!HZK96Ji_}hq&&dfs|e>W?Gt6Y{{O2SAzeD zGrkLDN{@&bOzAP$K9hn=67s}&Uo6|1^pu2!PDoF-)`+^SIgu9Qd1oJ}z-kTgrcR|b zLZAD}sadP2fA23=s5DuB&~Y(T@g&uhGsNWlz{N$bHe8S!e)j{aS2O==8bh2)4MTTM87 zH|fu;ms-@6Ddzk`+n~;z2kstci39-DAqCxR^WWaGZFc$xfj@^lszGK>N^xBej9x?% z0tSI8u*sS)EUEnz@V=3|E_aD=t2#gEU|Qv2y}^G!BM`C}xYWL9qm%H7RMU*Tro-g| z5{-n*uQkTduKKkXl&`t8pq_v?cyxFqe40NHt!G z!ta}CWPURza2fB6ngzFSQ}CJ=xNi~}2E;|!OUbqhKGu0!C!=kzFdk!$yiz3DxB`iEA=7Hi3; z69tIt#mAt(W(cY=zHZ|*j1w&e)$MGgdN66l;@;ucg_tY5elVp}4y>J`Lg-8h{cO(t zO?Jy%F++u-Tu8L`Z8b>dtocyxX~f3A(SKpZ+WAp1YSH%vz5LBI{9t2*r>w!wo<41c zmKG>Nbpw~Y2RYl7UEn zQJ$vjb%DE|#PaGt4Q>PYF$SfQ{dI`#*t9*1k=s&s@2{57CvJ0$nEhoREisT6uR$BM zl)=Du===G>1SKv00FZv(Yy%fc+td@yO`a0iq=7Nff3|-6Rf9bwSD|O@Bi#C;sFrgL z;10m z_JYX@`t^`UcZ_0fI}aaHNWLYP($&6vTuvO^MEl*YLqA0(E+{eS?}L0!SoKhMH3dJg zqH|2h%punlXtrg?2x9r>D}@35?|tPN6CpeX3%kl%h?a za6Htm1N6`GG~B?nH)p#V9v1=|1)@(hugSIz8h*M6ObGMaXTtO0wQt4al0!J{XHKqK zJMUW0fHLn@fc^#W1Um#&q*2fzsE*Rh6ihlo?$@@2eJ{05sH?Sa| zn?W!rlEZwh6MG>g+U~&H-hcEFaqx+otwi6Mn8~v@bQrg8zMu7*j6#vMAEBnY)OOvw zY0#8@80Xk;I_tHp*j*1w`8OA`!Hrj%Ma%(C=@j)}kjr)t3DI-)5cA!r3O?K0Pa?dx zVMsC_HxyK3;eO3Z@npqo&53JLUr7mA={(Gz{bV+;M)jbDa9c3{Rc4x03`{1x*szDA zIxRWIWrK1|;4fCk{!A0N7gs?QDHN>PGf*PgWuy_pZC`>_TT6izyr{~ja~DIjJsZyT zL(oSyME{+ZrGK9reKmQ%zc$X37#zyN&k(Ygg?H(38DJF*SprJjcY7ksT+CE~oNC@C z_h7oNH|~Sav*H5c#Fr!|G7Qra)(FM}i;H%BoKT8`c*u%Yz)tH}RqeLp;JU~*?UJaq z-(%z0lc~{Ho)Q z>69axyj&pwH{{=8Jd|b)_JH!g&YOIh*hi0L=aAs!)FM&4cq8j0FwdLaSHI6cEsBVa z=G~Awn4aQ+3jxo=h$F)B86arudk+XH6y$#rue93oN5@r{?f+={3V*u)KVEG(YP!2k zGaX}?X4-TdH91TkT~pIcZA^D}cbo3+?mnM;zQ23#-|%|8<9#%;H)hZ8Lb1mD^jy9l|_xecEcCWpB~r4Ns51kfQ`c{Tg? zYJmsAk=Z6JXX;VHRzo=hZ?W^l`;hZ3c1TV-Qp&bkee3p^_6%Kdgkq}q_GXNg%Bch(42W^FSw8FNpkwL(6>P@ zj?=M#@ERr@9G203A)7d5FoCtEfa_$L>G7Gd)0ADI20Qd!?_kfCq-q1)%=N)f_eF>w zH$t{0#bXqeWHuN9fWV_M!b4{{r4d8=^@w!FKmAqeJ3?GY*6S=*<8GB6JF5SK0sYy-Hz}RLfO18}In2mtX>FjP0F&1z8AJ}kN3*ouP3>#<9f*R6);5X|)g8pmbdt4UF z4aVIVy!qerO67J;0@%Hrqnt(5C~9MF(g3S|p3}M`LW?5p2x>uqjQ$_1VfHU+q9--S zukLHo5 zHy~)h!Yrnpjlv_l9<}9(CRa`GoMjf+I>vvyDP<{T4g!kykB(eViUf z5$J?NYv?ktY-(M6uE+NWH&;SBLIn;1vyhicGN%Sdht+tWXOMOHf&C zTzlk$fGulg3$tn)CtKVv+c^oUsNMDcxW7a5y@YXAnye=7!%6bP<~F@i%GvDjOoh|n ze`KQ^Mj+=47@eXu}4OP#!fnNl=i4*NRgvLU)%T}P%rB0P%i)~h^qK4cyP|H(DXQ3m`yXi40J~>h*yN> zya3}rV1{DwOYFVG;-!S`oIkPR0BX90%Y}|!cv&p_F*_)CF&78gXXO$q0=blp2?mZOUHxl5>VvRpJc~vq` zPfyIfQSZTAbj7q<(1J-eBl`ne#;C(QS(GH3H|MGEjl@H_!&~vo#IYYm(6UdKMaVF# zJtXKz9Q(f!#x4_uB1!Lju8CH*4sfPA1Wf5OHwDHnEW49N=(w`-d9c_e5mVQ+t2CwxTtX=fmqtU1Jo<7$e!sXa)ocqjCw!YqbeRj>Ffy1et0V6;?83 zCJXrJ3gCKqoj&y_c?wPgo}Hr6FZiCSO2kKpaK=#`a#Bu3fjH8?rm2y_>mkx1qS!gz zrl@n>4c?rXYK5;N>5CBv-JkCdw~-?mP(|aY(tNBWzhc#)BIc{_z*k_irG-_J->i9s z)|*^nj;}YuSS@prUw76};Hszt@+z{(XJ|7porX?q1J`(@Nw-sO`4EtbxKPi_AKGPL zDqKyx-+ls%ONmM`HmyVfDhgh)dq(8004jv{aohN&iCd@d_#7-NGtM!i=A(TK zgN9;?VLzrz7?%FYe1d8RZ<_9~->C|ql5Am6WVQ=3(QGvO^<7E^kL66JhV)IXRSYZQ zPc-#mk$jebxFNN4d^UQrpxwu7oT9{}Mi8%Y>x;ZiKSB)GOio#?kLw{G8NGn$5v}bW z=&-`qWzH#ltMG@ZU$rTDek_;l7fd%pl%A0=;%wVmHX|&faY{LL(0(PWFY2mD`kyH? zaA0}b`OL%SZnT0&(}m=r@987gy_4#1Pv^ZiH<7$8#OE9fD0jm;SWl?xs{$du9$Z7# zrsmNB2Yb@#w)&VJNOpCJ>i7G zbPcc!Q0z0n7?!7IPV$o5oY`2-Lp@)}3CcgR6Lu9*B8xm^*BpI#`G0Ha`n|8ti$rP+ zjgNM7dG#P($ou1>3YA7~-0SY}^3nj-gyX!oaA?{g%#ms?Bv$DLSDnM!HOikr76NQS zq?8N-JPcjs**c%C3e~&(h#mV1td0p!?2+)tHT`;pY>q(s2ZcKiZ&$8g;)k-*{^Wz0B@^teJ@4LW85TY=T-b_A`XbQ|^P9i#AUkir z<|OgweH$Oo4o|>T{`z;bV-*G>FzFoD+fn^B?5K5~lS04n`7g?q_j23(5jZY@`s@6O z?DNo#I_BLkibK%XTU7T^ozC)Zw}w&8|07DUyU&#`fivC)Qm4SIZQApFInQ!FgGz;A@tpDI821Jc5ZLhS z;?c9pD`9A<@Hh34(rbdS{Jr6))Y3gehK*D$#X59m5NZaSlF#o}u%*nDWz00lC zgceI#cv|$-u;@KGAs*x?F;M-97v|9yM?U$95!b@u<6zEj&Ya|t3ID6BdOXJb?JALH z7@dgt2kqKW(G5;w2fa37#nkSw>!h>Qw>Sb18bS`O7d8Z?{$o#P1`$vp@t`*By3;n>og#xP=13ci8BalBT`o}#4e#E!L` z_z<@Q++m3Wa$x07|9s|#PAp%)L$?dSzJc_nGh1#BwIeH&6T+*e|BK|kqicm zqqc1xp|}mW%!7=$zb&gA^+;t3RjY$wsRPEZ%v-$Kc$HKWz;+g7cdz>;Ird;QWqYC6 ziAL`d;D`Tln^;F45jnu|RcssfXaZ5dIw>%5RTp0zoe_l~!W@u!q%s`CC{nxDng!q4 zTMCj6*ro4WnW$7pKeAK{lVotTD}<>@)nKiJ-?e;b)qXD! zTlce=>JJZmC<%SDEStLpqQU6qIz4Dl53fvP)@I~nY6X4dwL!-lM#8Y{u0Qx$$)U?i z(Qoo-x_CrK#HaGfwS2%wzBLG?pLD|oVqeSDc@TYt#I$oj*5xt*|CHDf?#OTAIY{`A z1-yoO$KRC6b^i8H6Au_1u%Uri7%(QEV89rF8;;kPan1Z0C3!(N@5G_; zXxQHqC+vhkzqbw@K8uLOjZ!x|x|v6M=(iBUk>*gnS|0~tM?O}wRIIcPRb!ma&H5$W z_ic+z>UO^E!W4Jc@q|U|kI1Jx!E(f!Zw=+jcYgK&_#Wgp<|YdGyw!n7jbJOopw6#y z!<`j${VP|Wnok$eVkiC1Dc_B%0LSxEk^(p=KYIRL-g;%;0$YxL0S7-%#ghL!u!0Y$ zAuF=Oo5zy_6_&vYwonF!peJ1=R0a|BuZAqf#5yxL`N^|_@Xu12-&e1J5{MJYi$pU3 zqsT-bvb*ZXb=_GNEm9@(^Iz`55{`?=r*BGe~GTR8D;14#2x*m6q@LIB(ZRq#Z1Uo{0%-$qfxlA+#u9*Dco6(o<{V zAqg1F(J`?ceai6c4gQFulHn`G=-M9)VPC&2 zlT--^NvgUM);Go6+~xXcE6{iq9laj-7X|v#&I=2pk#47G8Lo1kNsw`enR7 z-QSW{`J&c`cx)W)d5{T7=4UUfmD=r~MtAW@1_FFVQ2HGeSBgv86gQ!9BV1pkPY3Gw-lnUuu!|=YfCqsP!zgwAp z)fkmeA7PVF3T|NU+*&OC%IgdbfEUiXoJ+0w5f73bd{AdVT8aqiQK1!FU3h2t0oQOH zX{NxiiCfA@(-AvE2c*6_=y$QZ{?vV0B$379BLe_eFyWV@pU1pnTJW=qJjUZB%|~NY zQzP-~+8=$WF^8}KVHCb$i**W7Cdt;TqtDq99S`0R9GFU|^>sV<34p!cklX!SH6^{g zvw!LyKb?l3Y3`S-mSdM{W}&F%2OHs&se2>=>(za ziyt0J0)=-;CC@+YmP{2R+QZPlBQ8JF!#xy4(vEe~hl=B#Fqm|VujlkY?8gdqsl34~ zghz0r6m`;?9Q!>MiXZ>Yz-Lkm@;DxKLiWGIONuW~ueaFVBa%}Hcm!27N)P7SM{#hk z5@`SSsy<4xP-w)!ciPZB{($4mJPcO^1!TGV`kN0sHcDc=>6yL%18hBtjJYFTE!>Hk z=;1x(nIo`b(f+J)kPSkiu|-sbgE6W>n^iPOgM;;_)wS8h_WVWr4EAl!+>KNhjviIn zpBm>{xNF14WpiSM9twvdb@VY4BWNHw^Fn{$^4`tnQ!0AdW=0XUS_ng*N-J2;*r=-^)`GI8KPmjyu zAHn)%klI28>)S=ex?+{}1~CyAS=AZuP`oT0GTJlviB^U5fZ9-v#nv#NfHf^fj9Avs zW6c3`kZnw8L@-444aEOa>tm-tN!J!T9qD~c>>?+dun2$FUsdywn7*+}X(Bn(j4HN; z(ze}n+&&jnoP*kPl9&0pV$0K8svW|NeFqAwBvb)T+BC1fKjrA#L=fl6@rkL45Gu^vcEllBc)E3Qdt$|LS=IZLF7zzGV(5LCb|dvqwVD zg@;aXi@*o59XG#>Tj}A%(O@{TJjU{D8+Pfb1ICR9y<;{| zXNda|2mNQ$W>v(HE*JJJ`~Z2KS*PlK83n`74Zs5EM3Y}R`DWYjU6Qrgiaumz*M)tJ zU*t^`x`u{WK1qIyHO4yHBms0@VH4NgFL)1CeWER6r4r4O5|)WeXhrSJxF38bI+P73 z>P5mYPuDBz?vd0?$nPeLd-wToj$~GKj40PXKjM72-;=`38@7prHG+5%A1V}#37Wim zco{tUaZELy*v_FUNHD;4Ps*&hUiN$m;?955TB`BL~1lOo_iB(M4YLnbjJz?um?Qt1GXc;Z4FRJ9Q76|3b{)-%G;9f|0D>$C&L$L$Qf}IeNyCui>S&)KxO#Jg}W5C7Ga}%f4u@&*0`O_{)gO@y*x4O^pjxf?p?cSCu z{I+B*6n!leANcs%@mAr}xQ4OYhW;MxTeiF1DRIK&tXl~@yaLbXFK4^JyGe%&Rex;8 zvpN2PgEOAf&uv2!VFvs-LsX19{3lvC)FO;-+!|{^NecppE=xcKj0XZ1!|s9gmopL4 z7ZI0i&pks~dAGT&HO_C9Wv2+r>$w4Ae4ol`m;dj1CIP|*4_+@NOb{)t^fq%UBM~_+ z=rGm88b=kzPm$p0$mny}?WH2ShmAwjYre``pn!g=ZWhXKK*Pyh%ox$?@P&p>2j(R<`8`}?GC@R-u-4FdEscGeP&ZHpKyZ3 z@8r)}Rb3zV{RZ2cx`U-dLRn7Y5m8#C z`uEXGyQVqHQrEsJ2ZZ&3wWw8mtUU6C+T&28MT^m9K6{<>x2}W_69)%T z64M2|b2S&%Q$~l?YaYCA+)QHAQJiCUR5AzjShwsgzn&eb;xzplEq!{=#q7AFN@W@? zNBic4ZmDQqRZ62n@_s6$7$%r)IKL(;w)(_?05QU=UoGW&Uj|$9QG6 zYpv(+mKt8tVCqaS~hZ<-Sm@rdGS zol}J+AK9)sz z@$a8D-$jBcEuin3QiO#aigu;$;uv7(6s3WK6eB#haPIQUDOdMH6hNf~d{$hC1!@Zm zzub@vylO$!Rk+}{;>ku^+K^3flTt#RP(mYglKjvwestan&FxxJ+8zm85G2pa-RW&! z=VOxm>?rZSxPH=6mAKX8cWhqdYTgyIZx^D=`v&^s>o+3ATa*@IVX1#Q-^S3xj4~ay z%NXouzY$lC*3w)!OqI+gpqt^mUH_I+{5C1Y>!&8%YtVx(Z~8Ep$@uf|_Vbb0B293B z;}|KA@}n3K@}4O`e^8{)_%U!{M;i`An9sg%u%-9HVv*;aD!dR2|3WNx5rl>n$x~6Q z^n(cgs?Ib+jTD#Rci(QcZ7SwUs{BTHpm7A@LZ>QiQNRR3YRvvyP})D#g~OdEG>f#> zum0`6aPEw-Xx(12^CT*Z2+qL>BkPey0+hjqE;zWj)?R5=e=$t2)n~!o(Nl~LLjUlh zuR}>7o#qeK_%%s@!D z0kren03y^=8lr!u;TeonPXt&xsYW;^1*NHv-4E4xBy27whweS3MHdyGw}C5vswtm zc839C4dufv(i&BA5BHt?dz6D?YMy$iha~aQw?;qp&u0RjoFaC+AldD?2qP&|;;WPx z%^GqwNiokc7u@5pE_OARUiZ?V$vwUaIKfPm-(5RM?H{2G7tY91{6QRJe@;FQ_s~L2 zOQs>eb6)n~Xb*)y#w6cZxeUc}9RKr9!~p~6jbFHH-;sjf33nBxJv;TNt0GuEG>Kd~ z7+f9OC!mM~oeY*?SmyMDB66>gk7G>$3C0;TO6&48Sj#9(T)`yxFi^kIPE4Sz7P8NN zCgq0<4-Q#s-(-{jD3HrG7!DEo^t!PP>zBHnFw7RO1P0O|GH%JqtWD@z zWCX61=O@C^%rP-xxBLY8Do4iIuO}nC&<-8g2Hc@=&I{FP)*7??YLPZXKt4#6FVZv2 zhaO+XjerfWbRDALgH=j7!uz4_zQr=;{}804%UCMO&9tOS^k+wipQ4K8&%bV&GpOb;ZKM0ze#qtTg) zS8U3dd&r|6LDs~SMI$?%O3{0jim~Y=qWTFs8moPkp5TBQ&(YWhL#%5rwtR3y zKp-a`VW*3xmTUyq-#jmOenoA;guLH}qkR}QIs=vn+LK_qizZ6w{s+zAfVD0{y7Pu# z7C{U_D9bEQ2BXW@DA+;^P||w8s5e4MJnb*b|Nm1AOGn!6l#rR-@OuR)@a~mn>f0j| z(3EA0g-(1H(caSBI*`}}PSw2&r{EDcHcEMgYztpIZif$C0>Te+GlrTuWjW6W9CBhI zq{|{D4MvUO8p|#zUL)Dw6OOQX{$5OOIobaYYlb9y2P-xRn{*s9@j>q|c75;0J{7gD zqxrKS9gU7H5J>Ydus4F?@zDM6N=OQLKVJI^1+uC0ch09_^oAtSmeLAtPlJ2C61>MX z^LU|WUpmw9=2R0ZKX5syaH(70diMQ_E;1PY+sG(3`9>4r=4YXY2v*I_Qj8q{d-vRSB0mF8&4A3#|h&>0jF#uYoWTF8Buwb6m~g9 zDZ;)5$I0Dr}v8(@xclAz!vpRid1}1p-{5y_-Hliho2HG4$Ws8==r`Tly6=`_1 zcoJE)X!8qLPUiaLhqi$$z$k!hA%~2i}rR2jd{R&L>c-2+z|=sc%G#FIg=LTheM)maIKLZCJJmzytu_$lO( zH$VYGR!n{5UYI}CAGdC6cT1sRY0Z>>%Ek5VbRNd2pTk5G9RaVf!S%awE6j^C>W$;Q zjf_pk+`4RrT;>aUnPxX4}pEJdV>k>EHC1(O#z5RE7L!sFCT`4$0NiN+J7#tE^z8 z`i7Dv4#(`2(zNW>0fHGH*KCnZ_InQ8%JD)1-8q))e-kpRt=NHfKN7zmSZzCV>D+%4 zg6?)YBz;=qyx?@Sc9R@lHBu?Ns8vLBI0WEPCo!0HHaHyLk8;^HOJECj3Cu_%9Yi5~ zFYgt{;JQukY^gffvarTJz-37;c!&5N>{7RAmrQRX4DawlizH5^=CzlM+vmgnHo&2{ z2-TZwKapOG23E;iFN*CW$Mf)Xi>OSUfoioG8JV`xI>mlJgqnFckwhSDmwk(z<@fY4 z@-Z!b7tiOPRM6#;s$R6_D9ck6uJLb6AodjCvgVk+9plDx%YlIcC^^Z^Pgz@)r9HAULo!mE z#^#IKft@@3xiXm%QFoC?e?FQwUwQ;E9I!t^8B?D*jQgi7rCN zhk!-qYI6l=>EJVcmvtLJ{y})UnAff-Hwb#iwF35>Su^eMrGg2qXZwSF`Rdk$FU}J- z{+pfMMMd6sjHbxw_8?=j7qY6}H$pnUhfd;IlD>WbKfEDrIYaV|-0tk?0HRX|HY8}> zNH+bDfd34_!Vj=0K(Qs6csDtYzWQGdxpBsuXvBV5$^J*x z0X8v!uYu{#Z?*bT)}cFG4~ibT%$oC8l1_XC8PIyj8xYh=)`qbU_h(3sm9cKo3k|8b z;sV-WurPm#b`9ecS4!F!0@4xAp1o0lt!$_20Ca1%;IuOtc`)d6r|@>+?hN&cyO2`D zlP4~LEx~vGTISNF_af+}C885x+nfZZHJX+-IV|n`2-20+rQYXZB+`^RtKK^2jX?4M z5@AYts-SU1YS0!hEQTo~mQK@(pJwyM_z=z)afR021rxq#m8acUHvl;SQ{8u4F`_)5_uVKRhzi+#4*eW2O6<&CC(mRc`Dq@NyppJ4-3^>(nv6W5>Qze9pwA5y1I{!$`etLZP zA$A@6RXhtY<^`U-(3>*E9O&q!#oyUIlihkUWrndqZ$ zG3>zpI5AMbdJCegvGPY5{{@`J=M+)o6L!&_S82f{t}C|-f|pOR(6l&;&!+CW7%hi$ zgfK{UMLir;tSy%MoO|$C{;ed28C?v!DbFi^mpotw!8_sBtN~O$ zY?Mu>Mm1UAU0JQm) zI17<#Yv0A3t@zyjV`9B`Mx%q0R7Koy<-aSrb~8h>QR2{ZH+wp}b(h^4TmQtkXp39? z4RYSUvFo*>rAMhJq7iFHlK963(GjnvnCbh8=zT&bxtmP215yR+B*6uqkkm{%z~!nr z?mv+q$Wure8lIbFi)M)HG$0F7u6!7KgxuaEKAe&&zN)V7^f4VfNyDhM1t?_V1@9Q1 z(yb1!nw;K12K2D%_W?er4$*V;!z!)1{uu8RcCktm2~>}}+k=r*LidKLWAVdC~PtQ#LY z7l7hspRBGG79%v*(iL0hJP1Ea9v13$Kq9RMz5_oo1B2`nt zl)p3P)x>Q`JKgxKTkVIoRsU!G2m?{{RN}dZWL+5J$1T42eqbC2bGUwgQ?`nB;(3zs zk{rLJk6W7Y&U>q#_&sTSfUtEOH+ZunrRymC&*T%*Cn#B0Zu)IZ?m@5vs{btWn#5#> z+bz#dCiu-nLFb!nf#r!be1C1ElXF`p+8;i`uR0mbC(QBZwb_-q+~$;Xg4)#x=*qet zolaN|(~~Y!Tg{w?8~8iqr9a*zsPsuFP~PgaXy&s|5F_viTjVPqC~2ozs_MC4U`+zj zC9&5CSnFiL2U0 zqqhbA}43cRcTh*)cxTh0p@`}TE zM?dvZeM)}P%Q>HBDKyAcpaXU$<-{&pV1B4XZ~NDMFViP=s5gn|4?yp%SZQ`AW^1}D zyb=2+Z_=VU1{^pprX~Kj25pnC#CR}Em#ql6TX&>sp8(40#E;SUVES0&p1P5qG~;Mk zO&$DOwIDIFpquXvlVSc=wMtvS-Z49(F6IxBnZBWb?wtP0e~Xrv&pG_8WJ zBUt%@o8~%3yY<-Y*7<7@LDK_!dQ-Il{oIG%?rw;7%+70YN#+)lT)6g<74L-PX5F3K z=XU$0cQ2HHc?#@e=L;D|*P-*q^7p!&`=JylP+CH7KS(Hcp$8p}i-3DWQysiE#$@M| z9YBlqnjAGe!!sOwoA!a?XAY4ltL@@4=}692FVEO{K+xEy$JeZIH@;Gqb$$# z*+^RiRs&h_4E6pX76WvEpdGK?f3OGIuo@}O(J1&IrswR7X0Fv<>rOsQt_Ij)WnO^>`l~`F*|~k=!1e2GUuU|_D9}LQV2ot z_c>As?g({1cU5{b1+)6E@li|2Vi?g1wWYJ7^MgnKY@6rpZW7khebm~S#$OE&97)7b z41z)A0Ienmmaw3Ad5-%^iKvAeO23+sWS=DxdScugvXG}VZ*5SNR!aZz8G4z!?1E&j zt1)J#Jd+4dYH+E$505ycF6&~tb5zd7eWfwDuy$CH-Q1iT;5VVHMmF73t{bD_JF9aGIX?bM#fBho%oLftzVyE0d#)@xP;Loj*!zUAgQv1Wpg|2 z(tY*ch7r2DwtW&m^k#-C!%$HO=}a;EAN9}TEYm--j($hH0|Aiizx#DnOI@)`!1gFW z!ZPut{KKJ_?eajTv11fpCFZ;zZXI5|J6brtYoE&31(L*Z!eV1T``3!<1``ePhkF>P zvm}}f^%gp@_BhtVQGWg2dIx0%k zn~`NZE0s;PMv*UEm-w^>Q=Ml^$2*r_BEA>t?stm_oo%wR6<}%>%ty={#pE0JB}6}z zvfO6{(NTQQRk4Nb_hj|!>f|wMXEy@fTPie&^oUYFw4%#751`bV}m#A2VoT+GPY*FI@@-}GOEx^fop zB6vPVlUFO)vIT!srxik#2`+M5{*d~2ZaetM%khm_mZJ#saC`|e$`ly;1<%vwtxnzO zSKem&fEqkIPquSJ4o}*pr68{B4dcTwq{qu=*b0B;eR;OrF`zZ^rJ$v`9CeU%OUXpp z#@K=@&;Aqp3OwFB4{p9SivUTJ5%X@Kc^`uLpS>-mOM-DaFEV;3f8i%evC5P1XkEFi z?Nnm)-UvsQe7_n4)&Zp^@VF{KSe=~N9 zL_DL!I{qoJnPJ0zh)Wob9fGiN=>cchWn%a@4+$AB19dpFPPdy7-9nQha%>h6CGerG zT?Hq!WeH@;MnwlZkUji$jwJloGdE|~N_I}vD>f2)qS~2aB^3sUNb}XoCUxR?Q)ThG zdvM=V-O(uKM>cIkbj?~qJeZuF+x(ef z{oG#P#jdHpdJhW*a=X8!#@-}v$pi(q@l`6Dc2sL?I2i~wre7wld%=)!n|V(QSjq*@ z1E9ao-&6qaE$`52IJn%0t5!K9)b%$L9&aIZM(BqjM(NL6BjBYD=G|_ux_^pcl%Z2&2W7E;QT3 z@hHhKk-NjFjDJ@0Z7SBS8|%XdCcffbwXBl-#fDrBOP@tEq;$G8mcG5NFtJ5A^1aeQ z(G#}cU+2!D{WjcxBitm_Sht3=5YzBJWfH(iA(21#{>ipGz1HB1u(G&tLtYUYren=a zQgtRIWX(r=V%)a{7p#~!;|q4dTREtE+niFxhH!6B*NQ!=E2wK-Q&!$ogQJ(dbzkgH7;o6 zxRUz2r}YcoGl}=&1*!Je(m4}j3bvK<#T}Y4b1v0{Umoy!kBZ)BpP=R=muktSFn{gR ztz)*w(|34j@#W8VtGpi>alT$i_a5;?uA~M%x!NHjbuNaPbe~T@v2C3>bvB{;89k@T z)QGN^AZnX!;8=(wsaAgwJXXylzeCf;HHN7CZfFnyonI0jjI*NF!ufu=(Pacb4iM=4 z^!ZBKI6Ir;iY|oN>aaN0xb4d?@!e!YMbbVqMHN1a;XZG@<*SNo6M>A+#=7}4uyS3& zMPjTczFffL^g|yBrL+0<&G@67RgfOh8#zi3m2KI<5*&Ja- z*1yWz7Emgak(HWBWZA;NSjgG?ynK>=9s2WG&4XBSv1IoN4EBx}3~-nkv#TfT4z8sB z{sJi-Jz|AzT8_Soh7E8hi_o}6-ZSH|jr*3_XZ8V-leXCJG9Y2s3oki4ysTx83hZw#amh2-p?bs~iZz8kLW$UxTvyaGq#5kQ z^Ew!NtROvlNzC(DGV;$_y0>W0^ee-a4e{YVA@&67#$u?sJVBPeLo304t-XTYx$}Rp z5zHbxjlDxreR!O7rg_YRv*0)Oo*Q?sO}k zCG-NjSziI?0ia={;31E{weWLh-%&ir{GE|cvf@|@Y*`ZAXSr%Wdp9H?D3Yhc00-tL zj{;ZH&}448-=2HM_Me^L)VoSAwq#>j`NnX|4d{3{FE@ci1XR}E{JD5iN)5{mDoAL- z$)GS6b7)3gGgb+`y?+;U^w9mF(Ru!*nwWkl9grY8ad@{);!X+HC3 zTVY)tAwiVmulJ=5k<9F41AjTdfm_w`bfy?T{o!@bq>jYx$91vbs{BQE9u?3{0I!3` zfX^H*lR1bv`L7%O`6pe%?%$1Z4!$X%0`+S~i#*sX#ZcpM+(r@NT}A9SQLu!dAF$WY z2v*o|3K(O*)Qmt2-UQZEA_u#!_l|)C{PWIZ*ezIOBK*A#i83j&J2I5RoNi>xYoU{U1$@cvD5v@KZUiUPPFL^ul(coh1mnyR5);) zugW_pMxS5?hZIUmX6U?to0~jEt;ef-L_%=a71`Nz$1u-8-X#cuhI4;ORzXM046Zb zyLIs0Lr0&Y_{V1}oPyT)knZ%W>0@VP@i4uvuqAxt1|MpdA2d@rz z7E;#T8D|a$N&AfwB)(Tt;CvwB{r(Fp){5`V`-JOsmrp_l!mvtF+S&CSxjDF0yE24M z83G4X^hpuW$=U3oL3K_<@4O{Y0dOARq{v+Z^IgDv(-TK~xQ8gY{>FiMvhTaK{YxI2 z&?5hZ2jU;?(_SpP-=o_RKK%`AgL8y=Phj6-m=6?k-C}AAi8<#h89>he31wi@I7 z(gUnpm(Baqh#ga-HeUWwcHRY zQ8Al=4Dm&^W-1jP`CP9Uq@H`G?BmavP+rVEnTo-H2to{dRurV3p0O z-T)73ZNd%nfw4>=UI1zJf6{LS#^;Gcx1dB4{Ev*{!;kOks9wL}v+7aB;_v^4 z@}>44$t;z!Ln&xa22MvN&eI@eFECS?+eL@U^Zc5FCr}>do#z-##K3erU0HLpn2Hhd z%&vcEqIci%z{?BWpYRLM_T9G?aQRMDx0Ux|egIqK_wQjO)b<#O-%8jI;JF@Fim{3X z{;Ik;>cZJTlACWa=-motn0{@qXgFWnl)_FWaK_SHXRv3%!D?cdY@U$5#OQKnafI3L zHJ26j52~>y63eOXjSjm+<;4bFY;YXNaQ76MtnW!ZLR2^1ck`RhQz}eaGLT!5!@5^k zRNk!Ot8#i68GAi=yc5y|ffqzr+rMt9If-1Rc@F^@JDND{RliOqSU1w{Nnl1sK>{?+8!hg48Q}HQzxB#BYJkr`ei{%h?_+ zgR9_aTLHOlY*0jR>SD9!%!2_dk$36!aMlvyq)j_N(c==`DAVLhTSoGLhEE|UVplKH z)Fa?&LbjVK!yHtIES!{(`vX;`R9B)pI|)M32$fM5i+u(zn)I zCg;>R!A5rAJ^1GVKiE~ab85qF5BQP&27oMH1DO@?-QEbn=}nwkBQ&sdOy#?s4K>I2 z$2w?&yLX)=x0TOMb`lt7&g<01Us}WftSYK(m|sEgbUpn#f0j$*7SS6BB`6o~{vE`F zI?|>d;eB3iEQkVhT+ELLtNo_cW27>>3j%m;5Gvm^;@yLkb$n! zpk}Y`d40HZoDOZyKCbZ=y_my2>VNV-q@4a|1g=rhmCZN&nV$lW3{qpnB98@&Le2FW zV1TC$%9OpW$gi8~UPUbL?Okj0fqve^l^BUDk#8&wts;~gLhvsH0pzLYJp@`B!4il+ zGZ&}T1R39Ie~WnWJYZ%?#)1vFFik&e%31F_c z-O-x-`cX=#J4S`s-VPiY-2o5K?37o;fATVNb{6$VxrmEpz5hyrk&bGd<^azmtFfyg$Rk z!XKzZp%ZV6NL$Pt5zWZqA#asY3BFn(gOoF;=zXd6WLqDGQG8|{t7*AMIMIgd%KC}+ zZRLUGYyw)6a|r@P0cz0h@~YKh)KAH?1-tJF1mNc}wv_SO^+rY3xJv0E1`%Sdo+w^y zjk?Db?TvovRz88liR^)qG*1OtWMPAxYZMD4irSVLgoTbJUE!*Rca7JmcStVaiDYO= z4J61aNSD?&aUxasn?rM{CBQueyz8d8IG_D=e2(zyb+5JbA5j7DTmwwT6Zto+qE4$> z3qF`dYS6Gm=L5of9;L^$4~;(eWfxIu-8-&Q4n(aWD1;*ARiYg5K!x6>c4020Pz^pK zl7MeE>K8!meJ&i2g|Bp^9zmHi->ee!=byoySq8m+0Xg@osDa08U`2#p^~Vn6r4dETsA^ zKAifp{ckAU@UJEB!2x~E?~H~mLdfy|ZrcoAEk5B&ODH~%g=q_Ga~XNUM^Whp-c#^z zr6v2hc@>cMOsev9LK_09s=rvx?Ecutc<9A?Q~quKhujjv*Sz})I+lw4$)yJ)98J4)**6!FXs{Hky( z(q=__+3#Q5s6jZW^~jz?95ypCn;H@bv>DDP)TLu2gf_-iMcMpYJOmfq@j^BZdM3s- ztiXgmwR5;R=})pAu7AM_wy`T>x!8ZlFc&aw{LqB4FUQj1RGp(`%QfrgkPJR$kL)Ii z?}$yBmc2i053}?)gR{E+n!@@yOv6?}$o`jUW)6eJYImY~(Bj_jYZTgKvL=FHCf}Rv z$N+GY#1=V3v))lYubnCn)mxlDG-kj_&^C#%Q?{zTzR_>m zF0M<*6h8prO9lR3fv*Qw(nj&KMjYa^^w_tN&P`Hz!bTXTDH1@!5wNgHdnfhhU=a7< zwXD8HsGj>|==LLg-8^o|M*9ZSO|KT$JxuRbl?g%>G(mslhr<5&8~`qYah>(DtJedc z63)b}UR*eWpFm(i#@~|QsvBklHP1WZ{d85deRJLu_pp2vtuC>F;%_HJK5${H$pegN zm}<6IEt2nKa*ZoHTE*bc&y$W`vO(a!=-ua^@b2A}B5&Il(d_dMsv)uLKir(fXi&Pg zk)MBDoh;9no02VOH~V)+AK!aShdd@fVDTw-1W&y_l~Ylmtoc(~FD2(&u;2-IoT>8H zK2asPJTPAI8*%3E33GNcb0b}6Elg>$L|U6J)ry8}ygT5Zutyjh4i8JPzMAw>-c|9T zEs;PSC~)~(E$2)xl1@8)9KTU4@VhSb{p}Lj(YH84m713fkwFQYIl-8EWCIFHO|L=L z6P_H^FvmJZT~WFmrzNr{lhE+dt`I8Ul#x$^ts@x7WVg6~wRg*nY#UVFEFlxg0b-B= zWCDDu#Z!22Ia@Q6P;FKAqn`gGOz8XC*gw{&2JJ_&bHW|Jr)ny75g%`s-`AtM2#9diSCV%Uz-dy_ZdqA`i!#zZ`@_AyX zgD!aGK7*)U-^owjXH1!>Yj2hLFV{&`Oq~&zQ||g&uA#fn57B93KP`PIOXA)QPpMT92z$hi6i-Uf1T{HIgcJEz7>qwCK>fig$nzDTjYmH{VE!EAmNa`xes ziUaN@`kS8xYQsJ}kaP#qz>ksJY{7o!-{bP=_U>D>Pyi(UO5KuX(o@`lI76OQT8hL~4VOq>C|d940I!@)EIiDImEUXv z0KNWiAP9bVQ48xpuL}}b2Y1m>94(hlpFCGrnqB*IJbdL|kN`j@w#~)1FIBa19&W1( z*KDlgL57G7XKv512}J{xVT@J^I)GjxVt*1<3wIqfb^UZ(L|QxX3ti3x7oO7r@NO# z9`EfA)dBX-+e2xaTM7MH?HT-v%2CmZC zKniPcmdP7K_EG|BY}SU=(~`1Nw8(3uAZz4M(^qEGA26Ze31Dgq-GG%M2{a6Zu@iOV z4Q?`WQ8=ld2nK`nSe;?y_<~kAUDnI}qko*sr_ZHchQT5>P+r}^>x6AU3aTY}sn*K5 z4jP(5-ID+6Hmjc3YO7j$gjzfP;VOm=HT7(B@_?lufTaI{!Jc;jHt7jSo_V0$EAYDy zNRi>>9uP&{wj#T_ah*Nz^zZy=U5l|UaM8^($=X6NB2RaqP{4&>8F-6y!Br*qLEpMJ zv!Jsj?AWurdsGWWUON{FUCnlP+%DKv?~R8?PH5CYmSMvhr=xt4XJmUi^Y0Cjr$eg& z)1Z<`9u&2sxxDeubycdOSB1_IBXHV1pz5UhYpcw$ z_~WZ1IUcK#?1l;@Jx%M~Ny{1D`qFvTMOkdJQAh zmp&eHU#9SW+sXt|aQ_`lj=fP)!hzCm0H*1$BgN2$7uq`m-f1}XbeWk}>{1)txIg)H zrPOnhsi}KKS5lN}U+w-H!ASSOWg}>3>lHW&0fDgco?5pwkGgzpujz&9^R!q(6pPnE zjFg}C6)PM$r*5r@Bk!(hf$1nn8qjM_iE#BlAq8;x1e&u5%KsQ*il?P~z@|aFohzpSIDc9q_LI zP?JoM%B7h|FWvft%XTuSx-PM>v$jT~J{C5$xtBua6Wv75pXhffZ+|Fi z&f;6XD2NaH>6_3Z{c+ygNHSXdWKCK>IA7q%Pa(Yl??wPoaXkxr@rmwVP&4NR`hJhD zXkPt#VO)=a8Y1Q}p5ZG3au23JLZ9rv1Ur${g>QT&X^~-c7{+Fp5>6lul@la7zKp(>U`k#s= zj-)YeGsySP?CggVT5m0mQxsuNaQL>J%h47mgR@7@F7XQTTre zMq|Cs%FO;TW#x|Xr8Gw8$CjgnU~dGw+xAc9B$8jpXNJEgz-*pmL8rYJot(_ zlU_D%-;=@L2__B>TETX4gehS9fiT?k)_z}ccl{A+=6}4ZC}c9x@k*{+=D``FiWa~4 zfA7K}mCOzLqpbvvX4%PRpAB}q;G%-4EwY%~D%=D$Hazm* zU({@}o5Gnf`W=l>T>Lmi8f~#WI9cn}MKadk#3KskIZAu_`qn)jrP7s=mNaguvE)@g z&&D$H)Xi1B1%}^20$^64ppW-2E=ysGOTM$|b*r`T!S~-TwP`c&29Fy%C(AY?yc~uFEXtpUHO6-w~ena{|aXbZ+C zoOmB_UMYY<)vQX!tls6tCs5){8~$lPg($tphBXSM^J5^cz4?g7ZhpWJKekvce$F0k zt(ZBpe>|u(;0ms7?_8O&Nx=6_?^I^?-^N2c|NPeio*hk_+e>YT4NX5fKxlk9LM@#V zY>@QncM{vDRT^!p9Vrxv;Fc8xt30cZtERzWLA!?tVT)CrwSeLS;J*)M`O7BM8Fv3q z#JMdBs#wfkH&6R{<3+cz3Eh&zj*G(W{bkkI$4nK?` z?FuR=bDf?t$P?(2;=tp5<}o$K#edw&L*)|)P=an`U%~*V_U} zo;1u*ur<5`2%k0Yr>m0NbQ&*9aXH|R9L#`$(aVxqis8c+%uh6`FZ|s=$tZT5++17V z0B%+C&AV|rnXzs=7#b8)!EGXA2vS-g=Ivtt*TFxKiM5-R^_s*s+CV5fRIH6!@=cQm zO4|+t#VS)1LUZ|x*Kl!LpO@nbSJ^z}KXJLCw=s1e#KMLET6jp~S_lX+i1WXKs ztQo%AzNgVP+rn>-lP(WV@Vu7J&PsvuZ4x;b?b$W|(1PpYMotk<<~KF3o3qAq7rCe? z(l^G*(S-be@!aj%q&Gc)CbMSK3$NO-UK48q6xH$CF_7MA!FcN~`KEGyRzMRno#uKc zLUHcqaY#~`kr2E*s>Nz#QMY8H+^8n|gacW1X*lZn^q;FfQAfB*v%smT>EmX*Z2g#> zOcgy7TPPUIv+lI;@xL*}a?L47db${sXzSpYtnlW1OPQKX_fh2z`fZ4gDmG+$tVJRu z>G&IG&y(XN;0>MXc?Mv58P_F{TS%RZ*6Hwv+sXDUY~*V0i&ulHwMQ4~)=w;x3Xv*( zFEFwL5C<;Nj+V8}y8@fQ+K8GvfSDc&9&)L&#FFX>M~8QzPPOqzmLB60-P`0K;A^2# z+2p5+Q5r56W)m#?jWzPj?v&%E98f)0J|Hq*MDscC$}IaXhaVx#F8td9tEO~fo^^)p zL1Z#2TN@G;zy2UDx4w$-7u=&s+q2ca+TJ!Ls2;qnkq)_jB-3PWx~%BiN^+e)24qVb znfbcK!-E_;51p9kW`{CiAZ*Qnr*i#ID7{|ybeP{wB1?~%DL@9>GclK}rwphHk6(7p za4)?O9p_e#iNw&VJYR#v^?tBu@J0m3nrW_-nN`T3UhrkLB7EkSYP#L@D?6CJ@x{@C z@Wt31Chk%qIp-s}UPQgb3}nV#Y*@@ywalsORLt)^uIKV{igE{XZke#F>EdDd1Iz?W zW?A0^TFeR8GPC+kyihbG|0<{_qv#=zYJTlPJeB-BQYFekRF>ySG<%>sLwUAu8*~X| z{MQo#^TNrQ=6vipdj$NC8BrL-(_R#RIb;-Yga1V*VZlNSyZUWJZ?G)S`69&4-{2nb z4uX|B;CGh^zg5=Q&P(Z7x5dR|Ec!x8*E9hAs+x7r8bviM5_~-4h#E?fojcrz&5gcn zu|;Gu6`1xHW?=y|-ARoUZv1RLXBL7oFUe->(nfgHP;_bzP3C)gUt6apsxwu=JHc%gXtE+0h$ONCYMBUqEkV3_J7C@2?FF&HuEs2 z(6O)JgZ;7U@%O$S&YX8Pq(v@o?S3Fsf~e3pW15i3nVn#!XI^rDR=|r z5xS6I_0&!IqKAGUIq__^b;Rtx)E%uo`TFk$wnl>se2pV)9~a*ND%<0k@L^~MH`o|B z4w!>FyHPbu*5bVIO(hb<#FK=BVzq1SXx@|zq=rUALZRtqw>q+;lO zruc#oh7<)a_u)91NKw<8DTW_$>=*mg?uh{`z@h$kcNmoX?_#t!+(xWqKXm-)7{ z$0{bXGaA%6OBp(T1uBrYf;vp>Ijio1sl*HCB~>BB@FK1ja=KRVU}m~{)DPqW+nUe5 z90~E1VW8~S!*4n5C&LU>jMgjsMbJaIN2mLpQ)-h_IOiDTE{z~(>p_=w+~gE%TPxfr z=_N4s!tt}64wT92iMPEDPJ1p7R&;W?QPo7 zsw>Z_-{(8Fv(b&JOw6+MD)+a%Ww!(mU{SEUpGA?6znWK1R2LJ>E|HJRSc{r;clpe^ zyyyF(6O$pSW2V94IInVaY`1$fOU|43=&=_#np}2Tc}yEjxo37%A|hjkc;L`$!`E=A{0m zo~P`s$gWaC>>_~W_b136*Nm0PAWI)#k~#XcYeI%2+*p2TtElp8+B2Ljvg^Jj9`%8_ z64%}P!S?$b35&v4+u@x=V=NlIcF+7b7`>Wp3?DAdPiB_6F3lUsn>1Gk6L-zj^A~gf zJzJB{z|XBC}Qj@ z;P{&O1cA1k=ItoX37hyq|Hqo#IR<_`sOi3d?V?wheX@ECKqtP#LNn?1Gbd6NaFd%v z$YksVJn!fXSWE47KHy^X(e&`8A_{tH}pVo;X<;kDhAEsB&`eEXD@+^HJ4k8__g*P`U<1Oi*oT-X3 zjeAdV`9~b<*F*z?KpH$z$@jJ*4gMZKY86J);%v4A-WyM&h_E1{&!9n#21}IZbLz3f z>)y{OWU4ObHRL8PzfoRwHj>#%UDdp4X!Mr__}{;7Zsa43{~q=xHKHypuEF6es`$Al|eM^ zZcvpZ6xl;ToH3;1Y@cpQ8|Hku0&?u4xH`trZDa=DeSdi@t4Owd;HV?lA+XJ=zyBjiz#O(j<;bes3NT1 z#%Hbd>njL7OEjehVeSew(rT%WT*NlR)mQEzmsmA!O2Yq*&!#y;NLFOT5icbL=hp72 z$+YUTlomqKSRhKadDW6^zg9%{W66jG8LbPJ_*hwuSrglrWoC*HW!wo+qc~G&+M|i+ zwvb=nF%^~QkBlVSsEL+Qu#xfLn>8%aE0*~SOFFcVAm-7?^A^WR5qC%F(lLT>`HaXP zCRuS3i`LR=5j~+<3r*G`%kP)o6|37O2heFMf5#1VOQRVzMWTey8m;G@02o{LWKmT%Za7i(paXw+Yb`{{K@OHP(7z&K>iuh z=P%7VYNBO{f8Q?l-8TOsB{W0Mj3l6C0#tj5UjI#|Fs^8aW;%2m|8na1{u+P{l|qL~ z*+S>=1ciPgRiw0$yo8y;i!Bh*Tu8&s!HJm0OTyv$i=dupFWh!TTTV!EKZ9U*C@&4< zKxGvDEqZchImUrah+rf`Q69zI*!~jW2h*{^ zG^3zjJ0K+`v+_euyeb?G5xjxn1=xwjquZ$ZG2{ zZNm)nt6^(j(Yfs->{b-G!OqEvyb{l9|6EBj>g<#! z_z{0Vsx`_DL<8pEk&lI!?i||f*`)`#6=&)Cz3p(wPwiNMN9W8kRbIt4&pL>s&W6{R zaFdEJI${B{_zTz}1reIiB)4j#R;_`(gSb{&pV{KyUhHc??uCN=xoqX$74s_x|5Px< z#s;##UmX8-&BrH1Sx3b_Bxkehj(xuLHZ5!3{EY`s#39-DN3}o@>v#w?2eIwOoaw2fD4&Mz|36RM^wXf33< zVYfWV(oi-<=O|mbXfe!h0<;os0I(0HzET8e8rtbZBjhBv;rYll)IaE=wJHs3=#Lm) zxHzHB=XHOMN)NM_00b#szBejV%`r9dK_>u^O*Gmg4+eLTWGvRV6Ae~}D(-;IYPMB>q0oo!j}1Dva2TI?XLNhz)RetJq&Oy-ZokfVKuPGeit8WmDMRBZ|Rxp4_y>pf;B__@UUm zr@{0vC zCA;P$Iwdt38Xp4|9G+98&qblr@f3_f8WBXSYdL884P-c!NVt$;+mt z5QpzxbM2U7NC#(V*jx^W&^J}Ic>Q}9U^R9E&_uj6c5_72$m~og{SWC#4uCXwKoOZ& z%6`|S`gwTfFIfA`?wIIs%!8{%W#B*ZvFIf7@Tt*Hr-1E+vBj5>_?zm_ z4^XQtYNhzO`d?p?{d!4;qOHtgtnestLLt2PtoB5U@B}gRt%eq;@Epj4bn$yw+bX;7 zX%IEvv}Vx@#wdnRlSM1yXVoTJ(RbX{N}%Cg6&R$3q>O-&53-HRI-W`$&H~2)u{Ckb zriTsNi@U$2Iv4-$mxt+;kaX#;1U~56Ralt>#RuA^oJ6GOU|CI{3Mh>S&u#GEVRVNl zKHnM!B(n1Njcw3a_m}RAy|Yr#gnUKL*oqux8mDESxMJ7n4Ki`x(PK5%MOhYRix2Qu zYa}+&j>KbZiCZDN-9Sn zd~4ptf2Gq7jBouO-ZRI~;or*%+$ICkzH$&M?kac-H)M0(@Cx3P zyo*AEX|F&q!|3NtDQ5A_CHJCTpR6-py;3{9*{=zMoo~Q5KI1k!t6!3yvASe0fgJAu zG>=K&WzfqkZQ=GTUktk}#h~HrTvltNpkG2FX=znrVw<*6#CC2b{j6{%a`IaUP~`22 zLG-iG7i*R;N8O$qzC(oe5exy=7n&eIl@wr#ASJJ#^ykF^e*CQD8WbT+rg7S)G0)sV zx{XOVL^Tnut?Kk9bik3RLs8$1?=>R`Q!U#AJvKw43=v^s)FiR=LH4$Bdf09N!S=y$ zgs)k{r@RtNq@oH}gK4don0yZFNdvE|jJzXp+S`5DJ< z2Km0ZlY1@w=u%nWcp$(fd(VeUfj}asAYS=gYNyZo7@m6O!8zpFxmv<_J&MF6_JIz< zVhWSKug<_JZr9scaJr+3@P6!b+?lQ6H>28E%qpC46;RNFl=M|928BKfOfD5hKI~s^2 ze@e*2J&jb-E1WQeazlYWn77z7pdwpfg=TuO`3-_Gx@3P1>g!0D;HufAtTs@1^L`Az zN10*8tBagM7bQBtXlzF<*++!mTp_#NeH%S76rX>!G>rf7))q#;NFm?a70P82QA~5m zvUaY~z8K{>D~NbEHhYeajyEq)AsD50Ed3D|Art+BHU@se=%Ds3$sJ~8gZ&XieE zZ9(YqivM@jJU^QG0OlgPN|G z{mG+yRt>e_YWTJ78Q!6)@3(!E%_36NKdIC zpsN&tP=*?Wj+alk#_l=}C2Oq5*6m$I6wNOiR6iCz{CV&sy_6(2nAkm+RJ+wmpq=2H$t- zOC9oZn!shi9r_ml78&fr^Jbs#iK|n_ckKiZr6a|BuD52o0VEU&m zPHrrHMv;!2?U*>i_145r&nV1??>y!t%5GZ~GH%nE`9Z(Zgq9d}iiWWitnrye^`e_Y zyCrKS$>&uHstF!E{?_#bJ?qjwR9}iOwHv8tq6CTOGKkOqmZd#u`%W&U_B}v#0m)wk z^D}dxRKV^2`ORI^f~6VFWcS8t&0i4P;Xf(_%v9_y*&U|ag)gb$25Fk$cpQQ;VH%x< z{+oUEC2_wTi{5fSm%x|))q*eBOJm5B|9EQ~?uKK%D7=F?vL!?? z;tUJtdtA;aQantHW8lZWo}+y;E$$ru%BYw|Vom^|-1Mk^oC7qNZT{|Li0F$F<)qMU&$)Mo%vRz(#G6y%fa^y1j< zyVZb&Qm17ad4WN>lH%OkxTWmT9#o5#_k3{nMvA)oc5KfzRf0G6T|njvF!AzT@p=W6 zeYiR7_UC9dd*OW@%4>?9Qn3)bcCmml)QHTcYCmlJ7@flp$PBy$wc|nu$UcQ~zwP8R zFe44yx%mOWEZ_xTcW$h|&^q}u(EYl39;KoiNcrPIYY$Lnw7iXuRrl)i{z+bk;(W=E z0?i>5*X}}_UHyT5(ZtXlQDKTk(RiNW*H@m$EatLx6+VGPJ5Y}GZpSu-7#W2;k3121 zLCsIwE83rFl>ljG#=89eJ;E_> z$Fm`kho*vSqB!Z058uf|ShcPcrUbUt1(N)Z6MKWm0zYc{BWc(bg%I=Jh>L%YrHDKR zY6nKAu~$M(mgC>-X)d33=U(-W0w15=st$gm!jFxVk#OX-Mr8ONBF0&}azk#WU59V+$frF}HhgDj1R)LiI)7nZT}X9Z52iT(jz1ZVT~=G{ zdy$@QxrbhdU|a$})!A4{dX=(l_yCky_R)Zm6q_BSRQ=zA_c6+%BaHI6dMSOc zjlvAg?ZV|GAk|QCT|){LKA2_UYMMdVHl^zN^r2B4wM;&_Vs|UVmUJ-#m-rgzbTe=1 z)o7duDX4BkBD@?v*YADwF;^NWe9xOk3(vu zMA6vARe{b;mfgG%jt;bw*4YZ^=JPo%`0_hc3v}QFgCzgy0`VhJ;QPg0>L-$2y`f7L zfr|;CtT9lJzC@G4xqx6>%LJ_PGOjvlZ?xZl*6%?`0QKN`a`0gNm9|u|bI99wLM~oQ zC2{cwy;4)jE3!}CQ`xeeIl8I4=!He4P^v^~08jmK(2!Jdn#&Qq!p%qEo zvEG6$pt{@7#aAd&pMq}G54@xwP2ZyVSU32I^#!x@rvTXy;(*>?X@a+ZU(cTkd{fSS z?K>4Vse|s{Us0JX9`$HN2&hY-co}51R~tS85XD!cx6Tt?(1bKl?y$ztd#<5RO{6)T zQXLR6F$317wHr?F89wGXC5YYeJaRHqh?qIN%Jhh03RZp3b_46cUP( zrA&Sh!41XYy%V{MlB77oV$MTHtyY+&?Giv3a^QO^-7EWxx z8s8dBrsMw{SqOW9B~`ZxSjO>eomZj{^o5P?i^i>0-OBXDIjp;6VKsmG5ZtaRz`%tZoc8-?NNcmynS+F z6&ZZsEYZ^|0%=wd8%N6A`W(f5pJg4D={3sD(QDwPZ+FgLM9iNs92Uer#X)eNcQyTR zp8i}alH^Uq+~*4^jyryYU+W6R%ryE_T^4b%|A?k~u(j?JXdV+F_O7I9_zZ$RipXJ8 zlPCNpjk}9XAY;R5>;5fXRlvFXtxm9*@uONZtD)GC9X;fiPb#pVt>mcHDbV*Jx*M_r zb$C!7;kcayi=Xj9@cbp{{*+tySRTZUqePp8AWs(R=|?o~$wdk?M-9d0k6Zpc^2yO- zymFN^N)v3lCH}cCk$H0@>m(g{*C`*a7;KwgyzXDy^Y=^-$_tUQeFoz~!QWP(5`icg zgW=~)^XxWKNZ7O9ODrt10E>#luQ7M#HzA4y8Ft%VUBELZ#M}72C@dcjOF6=Fs*?{@ z>7oJS(?Zf)28I`}$r4Uk{fMA?Ka#IiGwGvjj8sGjLFd9*)?dIq_oG7U@enkZ z=BcY|(LN|2@~)d*LGJoQ1DiQmiLm|R06Q*J*oUQ8^HNr5A(yM%>LixNFbFIdD1A{C zBIDC%iq0d-w7JKwco zP*Yc*Z&qx86}^J@2_o@6*J zt1QNGi(M;C%O_6BBt{pb{vz;p3s;)Sc^RBezReP2%M7|vxE)FWzF|Tq=AhsfTxinw znSW5M5i(pqPm*gk1GwJ~)y(|o&3wmASVZMvby;^O%RM&q@P5rL#=FlRd%)Ndm4393Y_ghk3( z;as-m<*KXQDTIHe%-A zm4Kz6M!kN$GGjK&c0BOlQJvsGBMw*@me+cxiyLq1S-5VS3#o8tfxnO?r{gss*U9pH zSs7kOxSO^uwslM@xFgMRFm^D>t+AD%!4i`@l=fV(-}+=wb)-Bf#KG5VVaB{0i-z>E z-5>d&k!OG9!uE-6ePV9|647qhBD?PRF?!9w1@YLjj7CyP!YMamFhZO=2kO3ns4|ZV z`C@gjoI@deb3Y&sPd(675gyfx8B+&*-xa75=M@(*#ZI>P6ktqa>WjB6lfy5D+;uvV zjAz$T9Nu#IOJSiQ>bm=5)C~0BhF})^sN#bipm@oRUMPxD)Bk=e%zI}c!_$NJO(Y{$ zxTQ9>=A-hruR+vbHT_!_yjP$g`AX1XkF5*rlY}6m_RoylQU>JbVQt#O{U_p~%u{yg zq(z=dPpb|0X1zm|wd8fVrMONvKZHFWA$b?DR}9Rb5V4!@)t}~}RD0mio&VYxK=>Qr zf*yt9b5}cNJOt=C)>sfFE}A0+$3$aoqYHQcu=tLN*@njesY%k97m&h zJA-#dcZz<8mfM2{1;jnl-G^w!Cr%}GZ`Cs3ebQRC|BeXEo`3S~*rNAy!`;JR=*`H4 z$A^WO+90n{2V6w>CQoOzb{k$Tv}tAiq)tLps)3bDN!<$+{V=Owv|;#D3KpLrZ(xdn z8*m!5w&=WCA`7G9k4-^!q5pK7psOThj2MGEWkzJYf%h6t@j_}@6@Ph|T7o6kjbDN{ z)!RC}hT76te`UH5Y$mnSc=$*}Qy}*%p`{ZbBJ%Q?kCy)KnAThA(^-&%?%H%uv|%g( zTqQKCy?%h)rlmzS09+96J@Tia-Mp9%I1l8;@PMqP(Jt&%m)1h!MC=*vi^ia|${0Vekz#RH+f?P2EMx9{NXZtjV|# z@rUeR9v}LaSQm2vi_8R{cKjDm zYr+e=dC;|x;HUUB*i{1OeOgEK$VmT2E<80vF%{Wdgxwk}>U0$pBoc~gL>n`-8_@=pOcAB)u8Olmt`$X4pU8hDA&GE6iqN#x0Y zR~W*y>IV~#@iU}KkPcL7WN3(@1jXdGPl4SP_z%2dOIE&3Rj40?BIcQ#;&pC@RA7rv zhkHjU*_03BB-o3i)vOV1SYpgHR)>Gf8IrmA^b_2xGbP9!dd0EdwncMf-X?M-0O3)p zX`y;yP_ox+Jva@qP#-XP%@>yEHt>hkn(6JfuGxw-y#rM!k(IY@f*zWsstoJYT;5CJ zTEU9k7EGvV9NNys6cg+Faz8#)J3FeYWZJbZ(iQ3bKi19#@mAHc8zoy4UU>RT$Utiv z=;**1c<2IP0z#TQlzPf!rEM@{y*&kPRmDFM9hJ&>Ejd2Lx~wt3KO}zHdy}fAk_3VU z&S}=vcjjQ_Ku-XX=0rGhA{{LT#9xU5xUO~T6w~6u&&c4V(tA5i}DmD=E5fI7z z!NRI0Vfv0g(7}dsE@5KZr>5R;7D>*bs>);)>r%uhN1xIsc~j%wPvMPFQFaiUg~X%+6|Qd7PapXd^rS5G{P&f3H4`td zqPL8ZvJBf2sJOYz3){1s!yv&r^^(vNho1u#p_Fil z-N^}-QMM|>d&>G9Tg(>|pDC7Xl<(Jo-&YTA>J&R1>!V^~ckD3?2_guXc?IQiSwfc7 zJIPao8*a_{6NWGO(fr%dcG1_CDaJbT914nw=HNU@!X-Orah3Pppl&CRpJ_rkd`=yW z!)%t-XfqBOOK6|}%|Otb=w<}AruQP=LTuI9s2>vVrI3JCoe`#lG>eBj1CniAa(sH+ z=$o{0IMUtta4ZfXSvubb=^GGv`reZH3J^8E4h3IN(8SF^*YwA~5RC7bb^dh>Dce+F zn=%VK*@GU!Lrxs#-PjhM*qiFDM)F>h&UK;e&Aqm17qNTU|K-DHFW*{0Wc}NN?TXR4GMP_Ih2Xn7&7?I+l6>XySQ>llZ zg=7ZCylQCDk+xpyt`<%(@<+yR= zyP6wXZ6ly3V(VH1wW^iO%{q+1h-%t3Uh`UmG z&qc`dr{6JFrsq!sKahXA6@&U%g^hH+LBr$17GfV=&GzyMw8)CYhhL0B`pIl-*z{=i()(h z<^rlb2F646bWoF{x4>R+MUqZvPo;QKS~f!evue|!_isrHp-8pAo@#IV;R`HL@7eoloDJ=ErnFborfcEAX;nS4-o6^Q!@a*!n(U<-qloY`c;y~2+z3_6pPu}g@k2DZ~a9W0D8`RqT};`7_7^^1h}oh_h9b< zQ{Wfy-c!j%^M5S|IQ(QAaJd1#l8=Xg*&o3_vHLsw$G;ZDgEOy=pK7Gk>akSwlD;iC zV&(8gTu5Q~QnT!0?Vsp8e0?cR{^WGmO3}LfxqEahwr9cuEEsT=Lx+ySOxWv0^(Dnv zFQTzX=SJ+LYI{%lG0wkdA-n>xh->_Z06=FgQMVwVM##ccS5Q(AoAC2A|NC+uK ze$Yh^`;zb0^W#b@^i&SJDd_>Ovc~!)JRRBnkvS+>ja`M|?2VRDR&VJ13_aE}R~-ScSmy=`7NO zmpXBM^Kk7pyY37?W<_R;Wlb?WWYFV0+7A6XR$yBUEovTg^_KSK<7Uaz`r&i#DKMvJ zwgR3;-)|ZW_LIId*!j)i_esSv*LO8E+3LApKf(?DMwCLHq99i*dn>>G^D4}Apz_{S z4_blaLMwcXluTTNnN5q?9b$@SH_GK0$o81Df?>w?Y4mf_h2G54mW3^BwbPp_6!alL zA8QgtJi_Qp+MU)ei1fuY@LVbhczB#hT{M0H78m*eSRm?TojwE(18I!0Ciqk5!WOpy z-R!-5=Hqzfn;E=rffBTeaaunjt}RDge=aa3r-gj78n=3JDoY-BjWP6T<0G=j<%DQ^ z8eDzoX6V?+@Ez?Re`J)3jXW8TRUyi-tCWa$9`&8Gm6xR%Sc0F!Anot7w)iu3Q$`*d}?zN`69`zcg8^c^&&3T%)l(!8^u`K%ut^Z+Vzyy zhEGp|^h8o;dzxyP+z=~*tp#I3)0)RjFZA-rxMVA2=Q>=XFUljn$8S}rPox(7_vi2m zab43Noq8Y8?=r=?J8oe$!(3O1M~%|#$%8rIT?S16Kaoo-AB8N^3#QN+dwM(e&LZ)w z@2`gPSX#}l737U7vC-uOAKe$f*mAs+W-X696W#>Cb1eDf&uT$sNl3@205jj-MR3JP!H0b z>$nlWP3#LEo`4c0eL&9Vl3Q{FIn>^uYZ5Vs@74x^*c`^$wjNwCi0Rg3-*;&HrLZKl z@{>P|nULe0{hpG)UGUr&C4MXGuI3LF5@P07G!q4mJ@*I3=`KurG8*?mlEQ@BVClO7 zBRu(-2zV^;A-0IX$M;k%sq}HuL%L+N!7dY?B2+Eh;m3eDCaMi5CqLeCq5ks z{un<3hk6x4b@@hmVYl^d*VR}Y`o=3OjxVNaS@MJ!!kVVZU0kCHya}qbH~can80A|PE8DlQYJU7F;Qs{Tizmt zY4$J+ux5tLA%g*eN%}OR<~`eCn~}@ zz6C@_GRz#PK&&ue^eWUV*D+QsD^q8c#` z;ze#uOveA**TwgrZ&{cb4}fRY4xyQF^Y5QWutu}FU*NG~)$W$$1e=F^eDRv*kK~6> z#(FQ;nr7A8RPL5ABp)-b;u36})g=!knDKHLi`71}67 z`Eka`zu=ji$`e#ti(P71@)n((V-PZN3^JIbKfNf^e*H?*fD@$@8~qe_bBvNTY= zW9VMtPVjjzTXmLlvwim6{r(7T{ud5*uj@Ib#KIXa@2=aSm%qgxXKQCf&8Wdb%g9># zyRm(|cJz%hhF;-~u9K*FhIc4+yfw#{1o`PPk*t3)w#^ClBK`Ya_#~+)P^O%$7Zkmi z%lEw(EQVAD&;g0C2>VM}*3Ka28{nXPbOcbKNS7h{;ni&?Fo;^!{ZpaA@Q}d#ZA2?{C%2iX@tN1b5Ea45`A<-0|J5xn+v&@nTMast#@`*cJYwrg6hF5wXU2~ zsdXM(HyHm`ebtcf%8K+0@fNze9czrmpUG7>#L_d3Gh-qVN3g zRqg2h>UvIw#%8;J`W2C}(!;PWUjdgt&HJa2635rB`9G!f;^6K$;)V&iOP0k|;Ptkt zotCw@u&Q{ja(L-q-E}-e`n`a0`%j(%_L_3A=BIax3!XJVHGG}@zS6a~K3b?uE*bM= zDO*_0yD`qaITZ6$5qCeL%i)B?5WvheDnT<|7umofr1GFMv^66!+Z7K&~5%?y`VyL$U$~^ObytpcIxv z+RD-=h6wb`gl`R|d`BVe#KKBVvd@ItV)(7hmu>5)||1ZZ8!YX1i6J&p-A3#`A1l@Q<=K=Xyg@BmS?5p6Fmj)A&P0RlU$t zLeY&}n*1}=KIu5qd~w2-#lwI4I2J7gtBwBxE5wV8*HzuUe@xlS@2Fi+UH{sS4z=if z>$^~ZJ^sOkt>#1C`GsJOfHU0_qrA{BPIu1d(&)C3XXtIGecs7$LQ!3R5GR_|NGs%+ z^fpH_ejr05-ec|AI&Azf`3#jViMuN4lY|!nIR)hQS3(0WyYaUD*&VbJt}o>h-z$68 zY4r%YPS@XW0Ic^LXUwrVp59|`N-43imTgXCBXB{!Z7OEvLKqRRbU=b^vsI4}I(T9G z6X>4!Iv=#+J}WcAe&(RA@D;bbd~>neeQl60x4$dF)Jp`rGh&=VKIpT!Uj@^v;WE2d zT{EO-@X~_zjKZJ{c~Pq7(1j38Yz<#_AX$?DVR!w%%Q6$!b<`Kx0(J*LFOa((p8qIX zu{~GMu;a6Ju5g|}@qhF-$vV?5;d9LF$%UR?>93d{^1t}QEAlBvt%rauk;3(efp)aF zRwGUHSM?J{p)dQW^M?nCX#J{d_|RgR0SH@!$C!exw{8|EUDuFcmz1ICtTA+Ya7%jV zsKGjDzv=1LUGurl=D;=&s-&pQ2bCgBX0gM!P8@mNpD!#ie0~cxwBZ-AOuc8pzm=$m z73_2H#jt%Wn(aSv2=-1`6(MDYO`v`o3Ustd=*hmcWRR#4?qYC2TV>Ts2)3_RR%<09 zrU{s3*ROkEzKw9EtYcr6ESP|!D%sB3YD#*f@-Y< z)=rx))qTD(xETg2l?b(BXzP0aC?5_&{c&ZLWvnpx9?g3JYbWRW3s3)_VllTM5roD~ zoD?S!LFz47h8cpGT=`Gwe%&O!-yP<6du6XH)PUVda@BrlnCe(Ei1q%!h{Tz`G6sqeXrnyAGG!cC=vEG|&Kj89+7*I6{0dwNhZ;56 zlI#YLMLMiGWTb!klu*EF>Z~0uL>X(??v$W@*3?ZC6$AYhXQczKw|l;*`@}0yZPU<{ zCTdbIw?Gk+fm@lTaKyDclU=Bvn7_V1c(TQ!5W3h|ytP(um&|slzx08!O>CD|uD zQ{%!cZfP-U`E^_J$w*`css;K<;~fm}P_QNG;a_623AhdEIxfwpVVp@iH*n4yDEKlt z>Q9bV)iVqYNNR{X8a9`q9(kMZEpuW`uDDsgSucI$;s1x!`lo2Ww zc=JnyZPRbi$I&t?$pGHJq^~*I2 z2}{v1RV|9qbLBRRVt&3%y)>%KOF0j(uZ2Twoj>fl_54sM0O^uaQ3fM zv3D9BnfatJ%cx&QYj};Iyr3@p2iu}YoUyTU$P6SS?Je)ubFubn$XoR6DL=BUuyxFk zIXq{AfUNsU72D1+3N&oU*Jr2&>%6eNA^L48q`^REQ2wF+1!7r2ed)aQ(Z3XzZ9_%By%d1cD)>zuHMR(P_i@qsF1w%-Yrt%0xqiXv9W`45 znBl+?@m%@HTH&j<$7vog&;B{bJ@}z;w+95wOhyaZZf^h(Xgna#4785`g&Vz3EBSD9 z#=)y|>%kz8O=)EU5p&n!y{lP;$4AN^hK1_gjkiqYg5_kw?}JTtYx-{$gk%gpG}teb~HRx`K6V!RMJ71QHBm_W1FN;cO2*&p!n z6F+Pza$kZ4!%ek&D9Y7_$KF8v%pkx_iR#Pe8p7L5U(dnwR6dp)&v7Z7Z}j!E7JQ80 zdnH!l#*X$5d+bact-VN}e68XJ`%ukMoE!aH!YSdbI;}`iqY>=lARXO!s$%E#%ac~T5MG704S|4Fw(QeGQnSr&7qy5gd z?(va!T;$slN1@H^`uC)lJwVLl8Upk{%rxv8%(G$f=-<}!@hpC(=YYEB(3#a8W!XUn z-T#-iU51P%y-;~|4zB@6VXJ6SmTaZAP^X&J&%%g%EyO?L>TUUl@7b>3y%ZrslcPJj z)h7#7at5aNu4W_1JZGg(;;hXIQTiA9+6;`U7aFeSXRlOs$aZ7(A=k8s_c48e{yIWcFJHl) z3xDzsUh5%MUFK#LXezA=`diW)tUu*Wtv}r6qNXv_!cJ`z^qg!-#>!h9??pJ4%-)_e zuQwn2T)gf;wI^5N4lS3kFa z$sSO9&h`HuYa1ZVl>GHri`=SLQ(Ma+!=R`v%V@{ClS=%c`IKM&#M}d>AqxIO-Lx^o z5`k|q;q|QRd&+*1utPks2UZR6ZKDgo%eUL2E`2EjIwNQrK!%5u9SvRF9&6q@oXPKX z-<%D3Xx~E{j=^W!R*eN_NOLY8Ko;=zyZ`@-1RtkT?Lr!yQTjq2KB;~3v6t?3;TDwE zO-bGfDO-|rV~|>BS0mq&Gy_95Ay=MGC1~r$@AT@PG#l;Km6F~{ zlq_LVbV7HY4vMpQO!tXbV)mUb7`u{$YAm6SS?NqQ_SFX^Z*U%FI8eF<_i0dZ-$K6E zYBXCcqd8trU)MX6RB(o^pWO=q1tXu&Gxn<7eaJY^`jbIU-rJxZ3){A@yO&Kz08+ZQ^XNI~_g30@ z#aWf+{qqB@pFS;{!=<|xUrwl5N*@2exO`YmH?S4aK7#G>LuA3uQt#dsC$PoHn}?RQJO z!vFYo0kc^yN0ncL9Fq`2@<(yXZ|0xP*z6)*l9K|q4sI}~)}fV?)fd@B0Y$B@0;M8f zlJ%{7CB;xn2M+yZBDa#C3fVvRNbENo9oHDDBd|PrF|*xwvAvpq^Gj|M-G11&vQ~&K zB6wSeJ!l0hOxOPST>Aanqk@jRe=gg=eOb&;XP;`HNS7IedGNOIXcO>5XUE*1wZ@Oi zn-xG2c-5twtp0U01&5dQ%fU~FtKmA5>+!qJG%n^l{+k}46#{4iuOfUAVVBY)(OFki zJVvI@$!|%j;L;Kwk5rfmOXjQG=|RlqV}dg<8=r){tSKgyXFAH=zjeP!`)_$axc-REMJri!bS= zSZtB0kX&6618MqIGAOM%1x`4p<({Riq+E3FXDzKTN6a*})okEuIGXG( zJbvo2F)+oxwW6Uav|-xRx(=&W^U^c!xPk~Bn?)ArNBRhua+#Cj%(4q{YaGe296#SX z*dtIBDA-c2qZqNh$4>~yLQC9bBVXk#lD_9Roe&&z%ai1kk_`M_Zw23YXMV-a@irwP zm;oH6iJ25IZXReLP$Do9hk05o1ItFe$q9v|fBo_dl&=uY*yDQ{h_O69oZ=xe<`Uwb zi7ltfM9N+>kBG`Nli0`y4BXOB#TYUI5<(2_fs5)vyypfB{c(v^AzUh??sa@q6j5}j zWnMUk;+tfLHTupe&*elZXmej@9d&~*n}A1W06MQz3CaxF!+{D9gGwCEHD>?jL=3+P zt>#|h!gg2V0#e4Y69x`)Q{GNf4gRfv9MeAR0dt6ek9GS+@0qa?t#~{^nP29Siqft3 zInbPO$^-!G+vXyuZcuU`NGu&ge#qdV_u{g^OU0Uk5sJA$t;?gyaa@tnu{9sD$phI? z3}_8Q>S}xCdEPU|b4~HmC^YN963t;rrVky9o`jtCzi0<3R+waKB_}iwd?fTsEs}jv zMFIw@aqmbED8qa4@*ehIx7VU!G#uTK5J%FX7U;btT820UX{LcXGn;(QaTtR2+Jzs(Byo@hg5Wd9jh4-))haI39Q}Ru`u|T1JEoGa$y{ zfK@Y>EBD|CAa@6B$jgOTC?X9@*RbOapwQDF2LQfro8Pm@Vz?cm7~|WqmZ?KbpGP|} zfS~yBWxb!d8B6U<9!gTKw1*|8P|l!RL-;GlG0(wuPi;BI%~szj`ij930b6#Ma5GN9 zm&%Vs$tvjI&TV`jnJsPkhfvj`&3wu273RGl5>>W!o+uh7mm0=JgKiT-y9F9(c7DwW6_pdUqGh>M8ReIVFN_<{8(zyI&W># zdr4x5+K^3%F=)4Ne>}jslA#>@q7#IJFdxT8Syt3Ez_k{O>to;+6jX3);j8E6>=(ju zah{eFToQ%7T_%A2+xvFGFyDiN_%rHR548Itz-PR;fkt<$HY@o*v$u#mU1k*nBb!iB z@Y|K(3p$G#UVFyQI&WiGfEzr+n)oVG^MyFgFc^?6KIxF_Tq)r-_xMP84zk=EuKO*eSW981*#GAslKS6BJ~i>Fxl+Jz#V<9k;Tf%lj2B- zFb^;@3-v`LPb-U0zboAf249?hHb%*>HN^S1zxt?-vMO9w^X1mMk?Bw;J&#WvY8iJ- zjtIU812cw$B$Xb4KTr^d`CZ8djIsHNe-$;9R_+8_4m0bYx2sT))(JXXO@U~GFh*?J z^99tIBe*)X+U2*hW9K$JM(l^G-WnzVhEF)&ccsJR6-qfj6*Fr$?jDxqQNZ7^=9Y>e zACH;y$^XF_!FNDc^HQ#Q>%2tk3y8)eR52A;l*@gpyw;noK^7iN=< zP0>6pFEtN&oGe(V*&$BqVck4@gnhvG3!0^P+U7IR{rh-JRSyB0*fyKwd^{ulV?qzV zN}q-l(M&10#TSy8d`+mv6j|^IYWup5l3X4aqUh?I)Lq;Qt;Os?vn$R77%VgM)+{wX zwq3O8Y#e&Rs4Hmdm4a?H^=H)T39!Xy1YIzb&a=ykWjIXVi4^sk(tZ|izbjKTClg~; z7$}lQXR#aUZN=LlmD5%!M+q3%Kt;&uMPuyCeI2z41o=Abq8G{Z^le(qQQZ+BcYTPeLXYX--76e80uJf6P67 z$oGlXTF{icYu=Vd9vktDm^z^Fp;PrD%Jp)!CFqd6UCR|?#c1_FI_IxGwQlJ)LYrCo ztHhhoVNG=k?>TNSw}T#JM4~=T%-c{#?5r3Cs`n*`Y;oWFUnKDA``?hDMMxS@4!XM4 zz(*v%K(eM{BmIE6>t(vLTL&- ztQAA5uhi;8vo88U+I31NeZ&^2QEzyj@az_;EDK2p-b7$6e+<6qx74RudHhb7 za6!XM4A)<>u2lT4A9!06^R-X#xkP>O58qf*b&+l3Q=NtD^Vgr+nKUFN#@WSYB*3yB zsILUr(dUm?x^T+DE>qYi-_GkrKMnFV&0tt~FKBo@+8>4k6JwU`7~w|;Hy;(B<8#!( zHOS}xc%)4E&3zUb*DQ>^t^$@`j?{vHFsVj~Q_L^l--T%T`v(aH-zw;n z7By@Lr^Ki}rUM*z^5T!cz6}JVVDWXv=kr!ru&L)b+Jukd_STF``0l~a z^fLnv&WE5j?a(cWt)DfI3CfvZ*Wj{I{?5aiV?YA9(1|$^xd(qZWA>?cjyOF*{*=NV z-*e#p_8uAS#0#W9`QoB@z38m>Z>|TKpQf+$(>MlCxaBgVdE~%a6`YY%lvw-D*0U!+ z7-gB^jLaxra&pqYMk%ov2+7zI*F>YLDk?EbeWZgB88(BR+Ufbk zF#nN+Cf-;vfxCMNNt2i@)zg6w{=tMdjYJ0xJ9=~IbL))e3FZGIGE?E7WgiEv{G`ea%Nevum$yS!YI28wfq|2rp7P4Z`x-y1qk zY-Xc9CEAXYNPR<8N?d~#T)1l^TzX8^5l*OvUIk`lGMhTe=+nMw0#5YevAGGw^x_*-?5FB2UTAHsL;?-TLmnFnxohd$Zn9oV%3mB0%En zhQS?4X}ijCNkgyig+?T7-v3xftLf~Y>4otgrJkn#Arsxym$rmZ=UKPqTEiobU**a?4v0b&-6VG^{u#3xvfu*SO82P5-gZ5pxF_^QWaAN%${$qjUloP1 zuZAEbE8EeLU0&5k?T`q)OthOyP+)eR{T{52mO%8fb@vLZ`}f9vv!e3KH7O@*xJ$B; zj`tpt$qYH4tY*GzZd^%+7v4+&eRZp^?A^|RN~Fq}o4!y90180_F(`6*0{K!m&OL$9 zmPw3V21+CEqQP-XQ))yzRhw0sfq9eM+DW?^i~<*%Y$u-WPhNX@mxNRJjqF+CSdRvg z5dLwI4mzs^1Nxs{i3s9$=0dMBU-U>x$2d%yS6=`oX{oyyTf!7dAu_Bwllng!cdVnS zIwmO>CiO~97h@nzh|k^F3Jb^&4Dr)*t*)=RUZxwv=J=Y02$<3%cD9fSrhFC@KuV@U zVntsb7RY2V$q@8jXzTWy!}Y3#Ms(C2u^GM_HJ>Ld8ODz+8bYM;+~qX0ERl?)m|Ka~ zEsXEl9CdJ;P5Ml)#7S$u@*3@Ph4x?CNtVQ_eoK4qCf{*chz;yo1M*Lg$y<#`eoMWJ zQjc^oA9M0MgAaZK$NMi&UZwOw)7^u2Z0R5x)!;TqNS6N7^?flQhYFe zRz#9GN=8sjH;Zi&NAN$lJaCbW3J=2l8j6g^DRRK}6EIcL?1#8ibzW9Wo%1;<>)9Sx zo1Dq3{2FaM*PXP!_R}pOcH8_(c&SBJf$gem!g6r1sezS!PTA8lV%d7T1ucsJNwWV} zCOO8S18s!`^O0B6Ldt~UAeq-xJ0obA0lOflbJ89ZlXi<6+Pmb|?zacYB6Rqb3G|bF9$TF@aA2_2lMl6L!R!9~#8?fK zv_E58>kwMqsQ4i+)tmF0KODB1*-cP@Gr(t43_(#OHsh;Nk0Mw=`n8Mmt0chCYV`ws zqdtjZUyoPmQH*00Gi8&rQ{a^}_1RcBQwpjA+HHjoM$<7CNsgO)-r~Mlgg(z~*y+GW zx9G5h(3MU;hH0v6=;~Br_7vJV7A~$kPX+?z4Uwp-X2+&^L|{OA9y)>wywTPnBNw&KE*U=0EU`SnWX0#DN|+ z&EX*5+oLC-(Zl=(q>a|iJ!AY_IF$L5^hE8ZE|To!c1zE zM}FpvgMW$z`*P)WXWWZ>WBjtV1&Sk%Ju6rj4l~zRYljHJV2VW-PUzeCIrQeIHib9@ zyVw=9jZSj^67cp!gQ(}GW$rCL)#g}l`-;+DGYo#ybo#}J&6cJ}!>ra8WP@_1= zH+&C&U~D zMSGYh<9g6o5$YjckZy_ZzH&u%Md@U|@U1(qWA1@J$B9S|4b-VJFqmO(@ z8Ob_Ks&a+f&HfU{P2Iwm=XkI0;TyHWAUA$X_?EpowAgMa#U!aT0&EGF5U#UYhz1g< zPRK&}lC2ukAF%2_eBWeE$jJ+T{f^xv*BRe^_!s33(<+x%tK>U$>EH2odCk`DOWyIv zD48|G;plzaw>O$kjQULnQ#E^X4!1NBfYM}xT zC{bDv{1ifXX>L@Z-eJdilVvoU9+j$tD0`>mrMLYg=e_7?5?;IaI86J~MgoQ{m zPA{CYIq8ioTYSwZ1=(0KT@}-?KlwGYlNZ#Ie-EQwA|bl`WvqsVa|c;$21Z^nQZDNg zWKjA?_hS-MDbVBH849Wq?6HQS(9eG|5l`RKN6+$yLAfO@Ze_nTs8bU`%k+gR5S$b# zr_dzpJ_FJ|S2ucj?}Xi#2R^638& z46Zl`cMYb`-s?3NfFb|w_JKS_sda#qt{!Q)>k2CD3Y!~6J8M2Y0vG*ZB7gcU(e)0B zdSg4L7Wa$m^nS6@`4Rl?fAH+G_vDh3ir(NbGAEG&)SRj>bVq-o8 zc%>4M4_lWz21@i%PRhneIx3x(Ys<}i4TbEeM@?~oD(KpYYPIAVS6(8Q zHNE9rCR*6yL8q)>l&Bzssxt?4&F)fVwbJknzq>a(Yx_`n^hjIB&}|=wLhack5i_(r z+ldsZ@pGG>3fpo#jJFTofx9pObhgLQFkjM{D3o^33=*8*VIeFQdYrEULeaAuLk0WM zT}14Y?=iZak*?^XD!!k?5OxCqzVWX0MG#ND1a4#7UI!3K>Ihkw{l4zTQ$k#y3RUmx zoW1x&u+SR@>g2jol-~F{a`rrpHt|+GKg}@cbnyL?8u82TMQPAKa~3%fLA#@ztfU}&+`_wRv^}mVr+xZn*Y>>( z^o#y`&lBb#N(-;)>$4`6sYSeGQP+5-Y|S5m%H5Jp!|e%eY$Y0HSn$7IrYg=Vv)}E$ zM22dba)_6Q7yQj|b_h4Nkc_cDrkq&A(R+WCa2xoP!&qmWMxXElFD9vry9)Gv^4=F@ zbEJ0OBQo$kKm3f;A^~7~86h^iNW?ovX60kt;npXi2XvWJ=Vrb`ES^X}D24Uu~$_90dnZ5;2p9YW9WHR%vhz596gffrVg2vC^i z2?TK(4%8l-hpxmO_}qVWnMn&@F`RE20#`4Eioblb?@WGR71k@$S@^e_a!dKzl38FH zn=9e%g|=&Z2Kb_SRg=W6430#~7tEHNxLi=D_BW9P50ZKWwQqYL1KR%2AHkBSu%>*C z5gAV}&mXSGn&OM{D#`lyX$z2t@Mf&?9J+Z*%#yDL$e;6lzA;&7tZka(4HD?2`%C zrERJJ8UJ!TW@rq|KtCG0gW`F6kz`y%i-w`pxW+cju+K4$p_yIbKEHXt*B><;?E_!w zWauxjcjEd$bCfI9a?WY8aiy?HKbbsVF`0fq#6*-QpGl^?kCLCGh@R;aH+ zFPt2Zhx=a?B#-#6)yv+2o<9Qe@RRj?;1zcP_)aiQStRHOc4^LZcl8908c|7*_mLoc z@tBhn*hekn{jGQy?&yeO71qV+6JwoRjRn*9^Bd!nzi#4V4ynqC$b|p`8@LxpILPo@ zHU!h_;cf%iMe+tvGk^9wz=UZ8;i`dR;In6-BFA^xh@3XL{l1p_XHU!Zbjj@2WJIYm zB8PHP_3-s2?fB-tjB6_PAtiyK`A+Fy-#Bv1c~dm@P#-fR0yFe1Ourp%@3OV{M?LdY z^qDB;Yi4N-M}}1DTE)nZyQC=??T4zct!HmS_YF~Tyz0AFc~DKBP$F~LIROLH-48~~ zx>@sDQaXHvgB)R1C7Z3NLVkj~jdv$o+z;u!xKWcSQjBuM(e_IRGS`cie7P+!Fu(Cv zt21asi>>%qDV?1Z;D6`%YYCNaS^L}#*%Yo4hIC^y4zgW6;YV-`)S zBRA)Q)+fipL9{h1eF%M9aa<{@^;IV z@C{75PY=GwY~?q2d>z|Fx6`P0Pps#f9DLYAD9Fa%ao2eVCrQvT@J5!;H2N$ZB_5GN z{&9!2J)AT*QM;Y_sS*G3bw%3I$7eCnuP<3ri2RVG z%O%aG=-Oe-`iSH?`N4gu+(GS;kZs^yVLUCt8x1k1KDdmzOfbCHCa_~AIgX)Pmm>xp zZ^vGt$<(&?F`(d6KMd26!}*p6kk7ydJXCG~ZSbvu*`uv*oA5JS!bESWsX8V3;$)8a z(rUIw6%6Oi{l72#6pAFCA|7Tg8&9wlAZsdQ-2$Of?<0xQ;(qf7pCI5%rENi5st->~ zK*K8B9|vI<*YY`38?C*`gJ>H0f9U_4U#cbtfY@430~dQ>7u^EJpIi3|vTon2HbzTO z?V4TAX_fzR98=yHhF9(;ktXUMJw+c1J%q#r8l>@ zf6hLm1aFY6Ymig0$=&&0%|-jD<=rG)T5YNBd<_R$d4Pj&awNJizI%9qDx|m81lNGZc(@tcTY|ue4 zO~w`iWC#^I_yAeywaC~tLzg{dbScS5V|k4aCyJI+!gPvH`T}NhugC=fhj)xd8BJ?A zr1yHOQ(iuJ7ce;j5DkE9+&(B9w)*luJU~u_^~tFTU&H6a(}H~|3a3vFE2S@*+m?Z* zIv@3iW&+u%<7>u>#9rCU9X?>c9U1Qxrw{+yHC|=XnbC0xauNWy%JD2Cc_^M;Hl)KW zzXq`iWs)ULl^;(81 zmn}`gbgsi>%z;3fM}>v+0XbSnL4WR@Zm5dk6xyp zr?=EazWvSEi*@w`HHj`y3vEw3gB_OYvj&_Q-8$y7 zy86<&QYn7;Rq-t)FXOECkc*+58l1j6`|yT-WQ6xpt=r(cFj*&4IV$j@MqzrPbLLyh z;xeFx6n{x(H=bz0lwmbeXBmi0)kNEaQkw@LwqS+&F<90-VI-N^yo%}Pei%U8Ow<<2 z_KeLBlVr0uFlYVX*Ev)i6KEHWWLb67=C&7OG$Oc)YYL>|&`B2vhzeeqi|kmD%{A0X zgNmVJ(Pu@?Yw2wd+(Ta?!1waYM@gsGgB-OzvsxCaHA)Bz?cq^qU}LL=|5~_aX6Bkd z@1#s)_$i~aB$N$EuJ=VO@k=zdY?=9Gp|q`S_x~@ZU=kA2`~a)~!OI|C{iZ~V9NR*) zB*QYFh*WW&D7nMaCeA+LWwBT3saYY$xl1nb?H^-x3zz&lq_-N*jf#9lPfY1T)z^h5 zjML#&PsOUqdb`BvF|(CST$B)3n<))9FO#TsimIVL>Vxo$KMdWr`Q zK4rY7?fdWx!#~7v(?9XB?5PMESeWO^#&X6LV)b#Q{j{q^vwva?+|{z1P*w|1!^8`y zVbW-yM0VI|JGyeq&HeWKgU`Uah-Z5ZBS}aoeWh)iJObb`yU*0{QzR=o62dLmZ(4PG zj+&T!CSLcMXy>(1OQ3#~h1$AnOgga94fd=9=-`hdc=ppvk?;vb%b)0lza+mKg3Y5} zMX7r4&w`wfKY=p9NwGa)A((%I@WNBm*S1{|ZkfI^!Jr#+w9~O|Q1b;S9U1?V3Nt6O zl@j`n)Ic@q?K;ngifrOPYykl+-CWLqAVruuTVpz$!9Riuj+^l=>$oRm%9sFPEsKBp5@yddC`04 zHzwA&GowMJseXM45hFoXz>}Z0qF+}Dg!1l(rjm_LstoE`$w-rX-x)i?HUcQfbex9>v(L2O zPKH?4{q01fB3$?Jvz2P##nM`7MY$sgJo6w0=X}fkked?xgjH<`o4{1vs_H9Rs++{} zd6Y8ESLdf|0a}13@J`Ns7XESvO9*s}BID$=~ zg5G^+!`J`*jcTfdd2Rnf0nvi|QxYHO8k@@a0p*5yaC{`!3j)0P10}>fHa=BN^!$H; zn)eK;QpYp^CIdVuAv}Y{Y5Rw_TJyMif@kmZmI6c%cKRP~dZvSZun7-+OE_{@w3Kj8 z;fY@Rp|;VXVk2?Lwi$o_we^Q=H|<~*hCl==dgkZ$_mM!${o2J5jiF%(qx$&;bM;L- z^r(WXeB3({0|HJZu#IWztvzZRK(EVh^GAB=2IF%m;ZO3}a21Ia&X^O6`cQd?=g-O$ z1#er_#ZVI}57_ruxyqDn7Z#WXZoF54t=ey<^gVmi>f+FhWm*#7MsxE@V04lNo0vK6)lyMBl2-pZJ^92Tp&t`z3ZLo~sk$Q$Zw66^)l! zVOrsl@S$b3(r{_f_@O!?!~2&?pY*LFmr*s-L5%FV+Gp62lkj*QB;wEEWfNdKmCpv-LfSvv|u)N zZbGbIMRR-WNr3*(F;wRmDaIk_IscUePwxC@+lf5L{&D6{r3hzFgQ?KWP zD3}rn^3jY2Xs+$=vmyeI$TP1LZKDrA(!Z{40P+!^wz$2fFA>kk8Cq)b5m0)4#N;#r zFzhm(lFDj-1U0K z`RgtZbl9Ug^QDeS6L+7{pS-t&Wv1L&XPK>_F^Pw1c8OD$bH|DcmJ_}dC!Zt~w2dDd z*0jr*)f-Kqw`7XSTvHPm0(Wr=3@z(+rG8(?22(A2{kkQ;teTP5+z2lEf`wzs8zLy+ z3NX*mU#-Io9MS$h{t>ZNgNY}F951}q&<{ognVj@39<|bWFTnF%#Af>u$!^j4j0bCi z=}FhJ(xb6~!uQmqYIKI5F|M65n>&vU?;nBV>gXHQQGk?3Fe`6}A$`P_Sq~wfIl^eu zpAoo#!ZB=VY}K%H=xV8+Ay|<6YL)=8R260&gUW@G5-Wy}@T_5;M*;+{$1z>UAum>R zQps@bs$Vk;tD&wCJY8alv$ulfo@)*8V>Z!L;{A*{BTf`&q>hT*$mg&Lw z^ac!zIr}5e0GoJMLQ#QKQRpu>0R7-f$baCh{0(#JyArkMMah**P93EwIzq-AWmN)!KuJFyPjf)_{f;uPw z6w%$r)s9BQOB}*5q0?={-exyDNZH^J=a)f8QB zy7mupncg@MOz!0WlRuEUscJdvs`}2jTi)wK3>W^_m&M^Sz2)-1;NqKM7=C8^nWPqr zuRrNMYSAs?^8-tt)8j>B@$`sy8fY0quEF=Z{x_|5=qrOG@`na}+0L_i?Fo}iNTp*^ zYDHzEI&gW(B~-mTCDy~p{;(7F+D$hUw?2P`ShK*AAk37L2DAH(HGHd+IrX$-mmQfo zBzWgqHhe{ph&ESeT}yq~BqjHbKv6CS=%{d5&$!;Sj|phxb#By%k&?(RF);R{RM;wo zhVY&~tmSar+5p1$;DF=pmJ3i}e*D^ zF&>-f=w9APL*A-Ih$=l?&$&zvw8r$1^zI*LHX}CgpiJ{yA(r|}gQ9*;fnNCO-`oYP z|EA8s%R*>;qm4ht=+EBchG2FRtvgzY_u?Q(nJ}v_F=o8oHppAtAZ(Qi`(+tbFQO)~ zPBwoeAgKd&9G3t^H5TxyK>T!!Zra&jr@a@(i(|cwIX!icUj;mt;?5=ZaTps|Ub~y6 z#T-j5yu1Ij5P&sgH}>i_8HIeJ9CluAfwkr8y9bqqJ{8ltMW_r8fkATBp6W~0aL{@E zEF;rKkEduPUxdpa_8VU*!X=5h&%qz{*SmeKKW5pF`eR|Ejj4;CNjN=%F07boC1a+0 zvzGwPkf(1!2>Kd25v}e?tG{?3gq$6yNDnDcL%951OiKMTYF56OFR98NMZ-8y=Clh0 zR;!9RmM4e7&l;gmo$a@XYW?7Z$2#CnX7vX2_7A1KnSQsx`0_K6wmV=c%P068xa`{6 z0H|A5lAbat?^6xYP@slG@5qh0&lP(krLnYJCMO5>RHy9`i3hpP-sizZmw&ECEvwHB z(Vuz$<$7CQR zk-9|J{+WMq5D^_-%|_{k*i-w|M><1c0tO7VURl}<)&^l5^)YOd##=0&3}dbjiC*K6YgT>bvTs zJllhwTS0&dCay`hB$aMG3Ic(Wn(h%q1K$~a0JtS0=8+N9e#%Lnr^USN{f+BX+UZe# z9>2x)5g4v+4nCW-IlJlp=hgM772yiA#Mx~pxi5z?KT^1geO*o>ZnI0IT2ms& zq-RCosaut`H-Ep(@&UJ;oho0FYER-%{Y&G5;V%=m$`V1oZ2Z@~$Jr`W2}3VSuR3ks zjc16Jrl~Jp23+n+nn*xH7+Cw+o=u1*+ST}l{Kh2O?!mW9AY+^S%xvhk8S-o5W#`i# z)zGZ?uHA}1ZPxbzTQg;tzI`l>04Ecl_ZZ#E?L+Sb5eYtm)M2jy-w9h;VnzXV55{sp zesyMy)p_Eld^ZkwmeJ=H_=-a_ffl6MwFG_@EWCVj0$_)Y|K*4E_j^rH;@m5 zjResbVrGwLy`8X%uY&klPyt_&Bim)!7 zq3Ek0baZj5=jz39)PQ{ju4uyuE@=rH>&|6#0sF)hyCD7~xgPJZhN52tA+F3~a zHVS`NdSr@z6+n78^1TtG>0AN4k&cFv+EcYU$1VduB?OaIIPG|Z{dUTtYIBAv4Xdpp z<=d(2%_J|~a-Bz>#jH=WKV@v^eY3l*uT$oJctHC9wr=>Qc5Z#@1$dJtQ=ez-h9!Y@lVCD!Y6a(?Dzks z-=L7Zbd6PYZ#gEYFqdwXF!pDvB?qq9>RE`6y5Kf!7z&q=95nY2j?ME83x{D|X z%mtkSB^S)z`c=ucHeb3iPWT} z*=zX=aA2wvfx7&EHzN}#JDIutFOZrJSC>oa6AuWvyvXMekNH3nWW`!B3u;Ve|G}z4kvx?-~As=ZxvTn_k9o3ozk7sNJ)1H zf}|iJ9SYLjaOe(ckZuGdMY_AYyBiL9$g}_F`~2SbVqfoz`B`g?Ip&ySfEH*aP@g-~ zmJPu`sKq{rQwaCHSixG+`F~pjNigNm6>zx$t$rJmPMkRbCxw(uTK_o8i=#ZWEcZp9 zgBvj@Y46geNZUrAWJSjU#&2Q9>gTlNC$$onX#7p5JM3QvXz8_YU&{2L*n^QDpG+h&m@} zJs`OC>zjI87Yw1Gz8&V}ptJ)aMR=9Zu6^Mcx386QHSW?ALv(CEO1tem%;EiWaDFQo(b>^XY5q}Uc<&M-| zki6yfBNp~x{B<2Jl*$UWtjPI5GXG0LZ<&5L8OfgdjpKkFoZ@-Zvv>58i|tV2Qr$#2 zwZ1Puel-J~2HpS?1!dCTbq2|$`D*a6|0!_ie+QZZW1Rs;-;I5~0hdKR@V=t-Wu4OC z$qv6Wm_h~CL3zV8D!IF!n$Md8S>0WCvIr&}DK6jVYj@F*-h{zVOTB(1c!nB>*xNooV3eVBT<2ulIu+-)SJB~h1QsJ_f=^1 zeeRQNAN)D~i%!hPAtb5~8z^ywaWL(Vzd#jvF^9UtRMGO1ko`}$K@D!KTua9$PuNiC z4B#&-nVcMkf_6?}EQO>q27xnm*JuVOVdlN_*Ck^|crU>jcB5piqbZbjS;2*$zjqqg znRBe+f3n6Xw5&K>m}}KHEBIaAfT~9IsaFGV?EnwI_Tz>fO%Q#;W`&QgD*A~U+2Mc1 zEV_Up$n73?4^v?AsmzMx4IJ6kKez}xA-;USvB)e-1*;I+ z2>EzEdx8dTW(0P5cDvbx1;Uxx$#UOF9vj4z-%>w}Va0b*Nf1T2NS2#CX)uO#46?x? z(6OUHdUU|WaIScEqwUnza@i5nZ(TRaa=QFtbds5hDhA+#du!(xNkuBn_$z|J+GxQE zqHC7l?+IPJhx4OXZ(V9L#)(gB3zbIAYinHKgK>R9?;M-odVZf+$in8~NoWvMaJcQy zP4Dyh)b-wRr5Y;9P6N%r-K={#e5)_6`Eb4>>GL8=`4VnKSKb@R@KeNnq8jhx*7VfE zq23PvXgM51?U~tX4p#QC(2>%R#bd|H^#lMri9^8S3ZMqPD1`ADz09c!|F@CVu~zkJT*?*IsCH(c*t4dOVk%{+ z&-U*m$=mn!Y!1&Cw#waCp-=qT5ys24q^oRWGL*)l$Hj zAL}<~W7fW>ZMtyf*0rDq(6|=YwPU1{Q~l5O{UI?kACfr2H(Mv6dLZii%uz`lYx}qw zXaMe$1QO5*k1MFmc04t$S`foAof1Fene{HtBb?(OI>*`oc23tm66>+xw@Bg@*aE3_ z*6&xCF9rx2UoOI_N+9IHr}SRo=>v7R{U_Z*4biD!yJNFl?s+(j114pHb0(=J?##e@ z>ASq+>I2t0EslST_8zdz@iEaSy=B08A9#oG@+WlA$Z75WH*~^v02X(gDNDQGkyAme zPyda^kU}?N9No6D4Bq|BNvNCYswI4*9bBD;mEEh2sV@Luc}vKA8)A)|%4gNb*VBPabWZm!gi7j2%`0$VPrcBVt2=~8SqAbx~bSJ{;m|PvG4Ve%z25##m&GttGeGm1I z{fP4h0w?u2D~jjBLP4@A9KSrMs-KCH;vT+@wS7p6l_sjx?G*j$l~ur}aCsNZho&Jy zrz#lnEfd9ufLP9xdudYpzIQvo(U1udN!mc(W{0^VvJg#V^SLw5^!Sf%c;wJTCZ1#7Xknpli zE$E|>|M?HchvyP5e^qJ_eh`qDHLmuul^aR!4pHHy-284H;fXvKCGsE|jW=^eb|kma zi{0zjxDSY4)^7m@=fFiaFbUw#TYk0XRdE!Nx^$EhfF9g;$~G1nH5LVA=395bg#?&E z<~{v6^YdDIapLcuDrT{P)QGE%{8yOD>WMArMg4wL8yY_cq9j_=UN5iw2O9>?-~9(% zVBTOZdZQiGQ)urBCsSaC!V!zEe{B_!Ip`DdgPGY{bNXpmEQB(=Ua2phdCZ8TQbPYN z(}xJpPMWiF<)z@+7pgVCky7dg%YI9nj1=nrePsq6Ch}n)9J5NA|G`kW--!N&JDPx! ztBIeJUaX1p$8Uaq4l=t`;{sD5X)I9vq(lRl(x=a3ABBd^AaYak;Z~is^4%i`e4KLJ zX4Ezfdw(+`cLOF+YH72#xBiB*}B9E`@4H{l$^0kmSN^3EQj%|qXJC-t)NSWrHoo42Eik6<5)8VB zoUw7pVg(d&9%}CtiCx)y4)mE)mEp+Ny{RLT^WY{j5ZSl`gj1V>Z0r-MKkl1~3)S19 zZ%rrM8kLL7n%&B(W2^Km!V^OG`c5e?KfovPWeUF8EWC!1L*wuy=G+xAs6i(`}%!frkS}KeY;Cgl5GAHjJ=}SCMX7w5m!(sUNRbJrd zwoEav&5N$iT$gKF7}AtPFMWL$I2G_!m+`WrbUwLrkC-GIxytwAKnMU@&y$`6NV8is9u@-Ph$d7{-*s`1I5ZP%1UI|`0~CUW()(~a z8GOeK{GWfcNshW+y_PL`#!xC$hC{FpqvSiZM&^6%Yrt}gN-Q&VPUQed$|72E1+cI@1)GswTbFvKQ zw>?39!YW;ojjyq(xLb#dKCB9e=~C|63UU!E-&WFdxwNg{#_k=bTQLff`i(gE`zzL- z@I&q&&!N64k^ub0XsxU;?(>mOhz?-*7-*SG^}ix2v=!yyo-E0NaZ#bB?+;wKl8&&_ zQMne5%Io+COk1wi&)|8W5_ov|kW|u~oZIafbtF%iuZhHiq{}l9S-t!Z@TKNXhloT4 z`@(+;iWDrO{De3W(Q5p~z5^DmIKAkZLnU(hd@^@ehKO1tGDx1FE+Vtz4uMoldT>s* z2{&$vh3hq|JOd?*MqwUM^wmtZtyK(YJSogFboc+eJ1qeh(p}YG7?P@HU338wn&H7q zTmCa-KhHWgN9ZTkEM!8JPx)-7St~<&LKc8=@Kz83NfI@_`%9Q>>Th^!IZ(tAF)~AG z%5+-x&Vi%FS~CsRB5B#LOzTzE5Yg}E?Fb_wxya0gh}W_b4%4yH(&~sBtnC~}CdfL- z%tlNF_%gwQNGlMN+hDlAv6fp-!l>^gMx*~!hfJYj^MFSE1s&Q;*%fD!f;;3bA5_ZN z^nUiSiYNq7p|E4~kg-F3;;N)3Th_~0$ z|JA>12}4AGtw8Zc%j38)9}WtxjNJoEHKMYh(5P5Q#ckD1J2qerBNu48q*6nEm6g27Z%qQ~XdG;6#&=<o``&B$mfIViXHW~My93dqHx5|x=*%G0fTxX{s(G?qsGsHr}Z^3 zHRa9h^+SV>c-5|VRReuK1+IHzG3oy`3m6x$iGatw8?4aN@U;Pj}d<6#9ND7t(jt1 zIiID+&mDpLB{k`pO8MwW4d4CTgKvBrUp@dMP$etid=I zeh^@?QcexN(AsooWn2vl9a;(e9-HH2*r7Int@F2LiGvkcL|pCm4bm-o4W{88%mroL z{JtxmXrW06@x5Hb6vc46o^2{J0Op>X-7~Z@xPrZ*M~TIRj6%9A~<2Y zT$7N?7cNw2cKs{Rw@5vF*lFtLkqXdN)H*bvKz~l}H!$_}wSGs5|j76p{Sj) ziE+KXhA*Iw!No*y_BM=*=@fkhcF!c4QNAV+mhFFj<8R%{2WMe{Xj?~rLr1%V6c7_( zZqFqb!_6?16bf-F@QzpR86zSqL`4xCNV&pt`o*&!^T0WLUDH#hy;_MQF?!Pf#3HPCwWU5Jz8CEwSlLj!S}J4k~Y7v?Xsg{d4|m$0wOb%(nDl_d$H2Vf}lj{ z3af|o%L3U#ohj=;^g~jKg!fsMV-=+DKFj|>5&+phnYs--k}a|jkb{F4tm(((ie)Cw zID1d2)^grkk{#!Vy`F4zpAU`MOGSq#lk_=UDMZ5EwZ!b;*6f5x-QNWezPu&vnZJ5p zmK5nWE38ZUulq$Qaon9!j-#J%32tMCWEX{2D%LinYAe6{jKwiKySDQAtHPYgw^pJS z*po@qr2mL(=i=AoB1R45c5*sAZA$)VTL}dB29zRoQv^@E1J6ROrxhbguFYG&n7v-S z4SiO4(|kn7u6yCvoAZX7co34;tf!MG{CFDIDcSzOn!hD{$A~0#{z28oV$5JAYbx0qPCdDx|;H zA;{_P2e>^r5%OZ9*M4U^9AA5ig%MV}|E!5%5EdQF!yI^}Tse77Z4!&KJMRObaI3Ne z)LBTaB-fC^vFIuiC3ZZ#YsQ`}HG@-YWI?M} zoJgjdi6@G^Od6CrxQ`MK<{uR9O$ut1TmEa2iPxL39XTQ%>?Sa%F~rw0D6sP|K^T6W zfp!y>MszS62F}lm^K?5Vc>Zzr`RzpBDl+#R%lL;u)1+m3f;=2L2`!Nbr0w5pWP%O^ zxuw``;p8ErPl~dINfK`1@Y=aM6iMh7HutM9|1O|$lH*Uai%2g`J5?3y@Hu%WXk4#s zG)Jd!aS18N+;BD%bhxsv)=GxhKlHC;qt9lF{5=-er%^3x9J>fhu_}Wp-7H=HAsl71 z?53@k0vDg5wYcu;REE$!3gBi?--VjLnj9{c9B4zsr~ZuT+Ok?iNx@y?pku!*+dI?Tye zCtWbTi>2J^-4q14fQ-MOM}QF_;ZMsa9+y}$LrUk528^=vRI@f{$n@hz1!({&nDJG~ z%u!evKIwXIb1nNGsIPE8%Rh(F;7r$YBSzg79HOP$13 zsWe94AeY;dR^2MltMv)`9m#ONsH+haqP}{Sy{2`7Jix|Ws>q!*&z(Mp02}24YLr2j zE*idAhM>-2vUAeE52o2n|Me*_HdVA1i0~PZb&6{$2_+KGV3!8 zDFjRcWINBc@Pl=eZ{!I{>9*}8ZY;~k$=p}!o%gv}xPy~m&7hMa1dbOK_&6Q?nOY_R zm>E8fd7s+v{4LJw$<0Fnv0s^+JgZ4v!mXXVDKe|D@$Rh6UgG z%HKXHo+htwlEO0C6rRaBZIi0cX?*_x?-hVP_85nwUX6I}h8fv=V)rgMt`M9K2h7{+R-KzUecwZ73s~QHkXdrK1$8hga8-V9os3d@) z7T;8q#vntFn81>G_K-~+1d~p{iVA~CkbB9~Pl?TfE45WtKXRAu*%(mh4>Cp=CRZKs zwrrmRQJF*^5YUs+Z96^$KUa~ydsEoT^VXCF|NBQtcZ-ORvYTO-j~sZI?X3JIzZ)r0 zJbVp%9R_<4Iq4}`9I|%t{xIIejTJcg_xMsHSdo0m{-kiF02o;ogpoyi=e)zCvHS53BF0T8@bEH{@)+B z=HQ)=vd%5+m%fnrjpmm^>Vb|h`H%y@l4O3AU6a(ej)lRp)$)d z=@WyWlqtv-?P?pB)xUa{)HWJ@4q-{eFa!*f*@Ip?)j<@z!4`;c#An2=)~IVCB~`*+ zKkOOPkUm=3w-{|bS8i;TXI~>ehXmelSH?$q7C`d}Jd2fHLRz^Dm%zXT#CTLcHwfoq z87ld-2_1Yr0Y!c3!IY(z1#yUls{h1V)5~{y%JsU3nf|cARLY&<_scK7g0KbYdzwo+ zm;?Hi+gOcD5Pfem%^Nr>v^DsAl%!k&oCen`8Ut)$zw6YWSl5vJyH>#Fa&WoQ*KX!~K{@kuwnAw&?x z%gJ7MW?{1WNf#Cv$*0nb;>tq1a6WqXp01|&uV?#MfTV##mLl9sSoc5bIg+e0Ah#Xj zwP4>o(yN{8Luf(AQI03{lWi}7q1+5TBK!fDN5(Ac1@V#DjAAT4GFy5iiLnq%8D(H; zOT*xsEm9L(kGl-sQ52S$#oKSKuCEQJSsv9!lQ)&65TA?oL*GsK_UDDyiB`ykQM-Tj zyba{y&;DL8Zi_iIxf85q{Z2mR3{TP!o4XrucQ(E0rgRX#vwi>I66ly6>#FW7A=Rla zp@k&nZn6WS&uKs}ST}HRX>uhwpr19&cL{&jA4!<^j9$zhUU$n>ZB1NPxuuEBF z>+I0p2pR<(9zo%Lqd+b*v@p2Or%Js*41Jv}3bO zT?^)xqMSBZG(1I_rItA5)6_lNObOGPOs+nB_3c!8nm2Vr4Zn0P>oxP9Q#{%}H2xv> zjdFfbSlnGmIZ05$LnypJV=6Y&&Q(z@jZ>$4qGCF`bARvY4I_j)Qv}r&Nk~}Z^|#o0 z5Gj*%dM~mV{_y*1=I4(-#b)Z?hlu$*PPDi`p5@O*@uoD>Zr1@L&!O9&@N+BQRjEop zaFB2NOo_InDIWUNM=#&a*|u+De0qqqO8e8J{`j{&b#Y=rp_6bc?hE&jg~10^oL*mY z%;qmxBHD0sbx#KP+&EOqsY^wa1aFg{Nkc9NCDV2Nt5wcH&ebZskmOwj|2>6`oL2(7 zv}X_Czh(?GXSVH3K`>h)r!A0&E+5C_O|;p2_VgA z14==?@3Qes0fROJ&+6 zAA&Mp6ohs*zr6s(o9$wcsPy07etNWGyXIdhjp-i}R)s|RL`XQjK$v{{0IAfL>X?X5 zdvz(^a(8k}op9)*!fobpuKx)axR2MX5>4FWg$8u(@4Ewfyfk|WchK)}LMZb6fga$n zOPS(4|M(Q|-LyQ-36#1o0ja>VP2&qt2os^dfat4~*f$_A+R*iI791R1w6ZHN#COtT zVR8)j{|$i=R7H!ZcNq94)JQo>WTe#pNatj(6)+cHvG4%K7zitYCl zX4Z)+K@p98Q?TO!ZFS0$?Xxg=++`0GUDNBnTDpq4I`k;_H4f1e6RnCcVh4HOX=VFA z7AwzLipTcTflcjWpO*aLo^Cu>c5-ih)1|7!9p|K*SS)rnzWV11XL-Q!1)WK($(@U| z5JODC2A^hcB3E~tuQ`bz0dUQIN)riSx?ls@@@;{5o0>Vv>eAR9)m1A?6`fK-Jl6~s z-+HP|@oXvP?I@x5yepTbl(S!Fs*07J7i`c8^aHXVX%BoKel{XasfjB?Mbi%(L5(3` zd}t$(>v?JXYOQ{lJpBs~OqzmjINgsYJz)|{s2OmAgLfUmV?}w~dJ!z~c`9PXCcx^? zuIV+5(72uy5Hr$$=~RZw-ZJ@7^Pp>U_OFq{MNuy=`QS9D(#H(;tGQWl^W``l0Z^X`=TTXoz$fFOS$y96LeXY3W{Q);1F z$)EaO_gQvp~$ysjE{v4Q`>hoq|#EDNl?E>dv;sO#&zIa?M)c z`Sa&wX&LPfZi4|#uL4(hY9Gp^v{q(cZ{u%TqwUF6dG~Q8Ptjqcap@i*{iR`8G}wCB z!4<>h6fBba(p)hg%9Opi%etsij+DCkNIU;}y^SmW(;$ZKh>;$!D0RLhPQ~fpqkGXE z(1S^Qr2Z=8uh!H^Wt<*yOG~Z^ZFyAGGrKOn373U?F8xGZl5uh-s+W>iz_jKDTf!Pk zp@}fZGQj_d8LC#7TNcuWK@^o?)(l`VuuHykM0Etl`;ZStX|<%^32eyn2pUCFkPt;CbVM z-Rvl{)(Yuxr@ruhFTR`EzS0E2GL*{v=a;T9cK&xcw+;@2ju8e8|5DtZTAluVab1vN zX+ifM?+?9p&-N&7P)w^K+Yu^KgY zQ}@eJhJvAv5$0Eagq&(-W$4G@q2%@NJ^Fq|R>Xk}RKp_(k7@VtV*Cq<#evYR4_WTC}3z3T%FeV1w!ZbuMShcu`s?95axjdth zRj!l3i(tDyJ(&g;CV7)EH`z-UZRDDoLDdfxo>~oYwsi= z`axt-7Jkca5O@Z?c$mFhb)FI0I9qt`&AtyYP5-StL|RXAxr~c}7qZ3)bnXMNyZLbk z6du`Tkp&55SbuP^{KRmf7a3Js<{FdthSW74e~>No9Wr`hyRf{dJr)9^WTifw&V8?#NEdx(T*Q0f$yh32j}AEM^znBsm%;;;D{MAE_ex zGa5a(W(6y9X5lV*iCYko(pdF1ewc@{N*iI}mdwLX-WRg0Qek)E-@Yf0W^|br3AKE& zFicxnj9cvnL723Ye3!7)NoM1=t9MBkwUIsTSrU_)S^7yWe6H7j%m>-C%`53BoR1K2 zG)ZO`hSZWUrT;Z`f~#U@lYHrwd~rXcIno^^0y-uAUueAP0(y^o#e3GTZXcMLaV$}n zHoX;n$k2O?;{Wt>3%0~{d<_m`w>4eWvs+98{^VBMT=GJJ>q{dh06(+3jWbu&bl<}Z zZf|I&`T+29mL9g8jjX%jjpbnT48*Pl{ZwKuzQehWL}JoNE|7K(U`J`=l`w%D+jaJ3paTH1Zc=*|cl-G|K; zC0{6V)7`sW;PywN$Ug}OUWA;~lZaf&O1ro@2PCG{2|Wt+_UyAur%dJu5$0Gbol)u@ zii*ls8I)`4`1e>XNN0axNhoy#U+1uWKTfyKI}-9PeqV%eNXdwjdU1=@F`(E7AADwh z9JFM!il=@{!n`|_tI@jeVx4-d{nq6pqRgVf+p#--uOh3g0=XD5AFG}1#NRf;b0xwb z6O0JDjM$~ehcC@4BoK^)z!9!Dm-o3J$evv3NT_vFp*9GwHxb2Zm})8}io-YLZRgyM z3WgQMCg>{_pW6ZcDcf{94c#JJ^O!zYZh*mCB?xz+@kI=|HGN*cew#!LQf5D2JBUXen0U#mMYKQGg>kytZ1!Nen0C6*5EhCJTm z2;$%P(g|ta2Rx0OTlN99Xn+c}w3BLcV$weCtqt|_2K@d+d6A)Ri$N)$*DwFI@Yqxj z<+D+#ruOO(w}W$bvy(pc8Uv?m)&46?FM?0_uB=hor7e7`c5yS08@LlFt!w4v2Ne#6 z@5-iB2lx+al)mEp5v`LDmFbaHJH^Om)ri zvp9zK-scr|VN%VNw3TrCz7#}G(acbG`usjyixoUF)(z?0v9D`nZX3)G4K@!MkGP5G zOevaBC0FV0;*0&w;N{;S;e5TuMKOoJjGr_SwI~jUKWaiI$ofxuXp`A<7BYQO ziYlnjqn^5r9CI1B?k1k2&eF6GWRt+^e1>w|4y$oIuzn`esrRq`SoDp)Jgc{D7_~iI(%4u- z8FZSci7}+AIMK(e3fgV?qWr5ntkq=t+INrV##bsa7M;>mki>7|B~SX#X~{tQfyQ~E-^|8I_%32^BLw3R?@QV zB13Ch{;LaNoYEp1^gd2N;j8_lWISX&2UvY@&?eLJr#9oFb9{94{sK8T@rj?WXT%{> zA1V4I%<`U8cByl9Cw(L1lFi6B$FV7DfGAzHjrR}VlyE$+eWhpq6m3_K2GJksz~-Bf zvTkw#kj-KlxFoEU>g{SKGz9|`?6v8P zvAaTe7}2!bwgk9-0OI(uq_8Mgbb_d}JmDH=c7;dGT;erRh3SczQW5BRtteOE+;SScjqzScKcOV>2f zSjgTCQU@}M{6MI?oG$BUhTWYgqPoDwtg+kqL~_vcSiB3YH+GOgfCtdeB|?+%uj`KR zme&qhoH@K07ZpEpQIgX{VXv(^CG5PyfRyk~=T1eN>#fj64^gJ)PC7*OqxYZO8x%AW z#uU8oW^{82v)|~1RLN5K9K&;YJ5deY#r#}w@8-+On)V_Fsk>F-k&m$pC`^W?XV9D( z*QY~RTG$>{iCZzg&0K$f-H6pUw_|F;1i6-%t%=I!^pK=X`y>8@)1#gE%0C-Ka#}l6 zFZkD}JF|#{ly-5<7h3>pJn_f4e>(oFa*Gu1`5w)1ktq!9z24s@`}Ws&>Q&$QQo!f&Llk z2A-%$U*{Thli1(s?kR=!2pWw+*)!VyHa`P^E)$Bp#~o>2?tA?1XWl^FmeM+p7TSsL z%pByF?$Lq*gT0L7X<;-k`_*Dl8rTQJRB;lI3L042#J)iw-Q=$C&@`y*Osv{NWzxhhO!XIswWY`hVj)>H-32YCz!04=-t;jsCN=NFeut2FSFh z5T>rnv>ibvcd{-05I|5UJ&+tAT6s}+KNxQ1^FQhlfYBKm67DaDL27=)U}fgy@9#** zn3vwRA>?(He=bB>OfiA@BlgG{56bVF>Aa>> ze;1h<@-_KztR(nLrp{&DXZ@-ML56o4EVnxY@fC`si&Godo*z~wYkg>9>Ro`Db!R6@ zWlxWgpO%O`$8~B;KQGmPxlsRZHFWEWJ7DOnm}BG}t*W}STY#A+8ZWJ~i1erI2PONj z3f-S=Jap*@6BF|8KM+3)%9Uf2Joq`*HzlB}LZdTV{sfk&1>M#(GOg!a`+QXJ|MgDo z*KWFJ`D?J14$j3GTS?YT$(#qZEj|Heqhw03 z=#CJXW4;8}L0`85Q8?F(hKM98Bkp(lF#mL>FN8(L6VOp$BEkVwuZ9(&VJ3XEIHX<^ zyPE>G&EiLq!DcEPZ`IJ)I0s)(lhVP;5J1 z+$Sd|X!=|To?l*!xuVbBIn}Ze^mtUtNaKFSvy|#*t|}N;yX|S-bt~=}E7vs^*gq ze_T4hDBgGkEEDQmHr?z<-$%6_seyHUVc0tz$q1vVrfb3e`U_G5 zce`s1?)5~3f=zWuLkz5?_yiI0u(x8Yy z&O%J(J5Ki{f}l2a=xufTVPLeJNje4gePg`XQ4?&_MQ=(lykT5rmVQm&dJ+2F-G?QB zA*b42_DT_^?6Mlg^bI~$nk*(@P+))=Y&`aEiVL>L(_|SS>Vchx4Rp*@b^dz*qC5F^ zXkIn={i1{mZDgSHA$eY%Zz_m?@0qjM2nIAnMfnjq?wVDUnZ5UiFJ25a>G|wg>g5ns zM#nwV_*Vw5QV4J0oa3oJ*H;$`z$O9A{=1ib4-i1ROBs{F9M2&CAB%#-M_RMAkuT~& z1AKpH>0Wb)lgR!E^wxU9iWxxKR5<<&)rWQ_AvZqP=K>!7uHHX4*)6OBHcj8*tsbC2wK3w}fvSRus;tIqp< zQ(mt2H%b)^n53d<{C%~QK&LVdz8|%9ZOfh(70H$r_Gnt9@_ui$LX2%pt*~F;YJ|fU zB2ldO<+iD@N~Nip$IPd-W02a>OW@F0l?!3vtG2rWBIOE)VhOdH+IwZ|-AT(8jZIw} zS2K}>*53V(O+ASx=-`tN?hfGi5HzOQ`137x1Ou#}wG{6TzJzHM?uB@B)`ma7Wu|rA zN%}1tp7vgi38?C8OPm{BipEBrU^xFVXN!DZWMoOIPAimXiI&s4g6$oxNp=}0<4LD8 zTDO_{`ss6Ma)Pmt>c4lkcvNz`&X#C+cha`<<|QW(>x0ArD*HvdE2nE9H0z~v<9}5( zynNa1TaIE{=AW`JKA(!rzlkE%L0y|}Qamm^RFOzl6E)nuM{?`(w1C|H>T%u3r}Nw}bSb%O-8;Dp+EzJfT^NTV0;Qa?IIF7LQ@-M*X#j zbbb_A?4qpYaWd%){QJFT!ih8&W7u+vQK}qk;2YM-R0~qT;Ap&Oj$Q z)Wn(;v(pl(=a+g&BA>IHAK)NFArEnpPgc2S1ovsxE3WeIEm&`{!qQH(TYzoSzoR0+(NiZTyoBK}QPNqC?ow9^$#5(I9F|@`=WSR8B9@?r8rNM_ij;TQJ zojI16vvcOXYQT zaimh~OwSi;<7H>npP>;!2jBQ`O6g>@m>Wvf9?w?pqEbw1?jTqUJ*??2W34tL3e3!@ zPTL2r-B+#(n>Bt_sDCEnRiFJch=risZ^4Ob-MUVi14yidvyvY!%SGSrPc zT=KWsINrMJqBuo=oVZ}Lpv1C%6TYPx`98kG*u7aXB5KR5(U6Jj$EOpu-p(BB!dC)S z>w3+F2YS=MMIVU>E~~j;vFPg`TWS*WEvN4fdOjteT-9B%OIRfNU)WpB&_^>m8Uqw?0b zYhYi81_1pyzrXaPwo?nSud)WF$fiuv=Eyev^uE64%Yyggm_!MHY-8i27=q<@XU|~) zuiS-F`0sVJH8PhoB`I@XbI5W5Wn0(nN7!if68PQ*(FaXVnZ^CM{pcldhh!V>$-8eL zT{wZ&qP1H_vX6>LbJE27Xi0ws%fw*Duz&1qF7b7BHX{S{MgSs`c+uHqOhZ#>7&z)m zGwWjamZjh?!XmqNc2`Y|oSdK3YznHiV{J(BywhSyuLnlR7x~FCZ`=@UI8z@ngN6~E zNzz7_w{k|!VG==$^2B9$J{@Dfua~y_ciq~;j;8gbWZF=_oWWK(>1_B{kf{egTnY0% znZ`^C*TO-wkZID0AG=viDe+!ducop;sJ)aQ(9Glrb*5TF_92|Zp4U9T{_(epU*P*M zpWyZNV53c#N&g9&3i+gs#&PSiGpT5>?SynGkWqzHaxrGF_~Z1E>+E{`vWuLKBkYJ8 zHIm_-F^PNB;~|s&Eq{RW##ICI3E``HcZgO_*x5{5){i+T9HA%KdeqIUrk|Awz_mum18y7=$-~aiOA2~bCrL;7$MjN$_zd1mxi-VQ>L&3gc7L{9 zs%C`(2=AU9CO&?2)!jO9fB5OIiN=z7bp5M4s-PNY&PKr{vh>%U5zny;3Kq6cC8ZE2 zbaKqYlU~?#k4}ue{0-LwMofB)e1bG+JMy^q0@(cDWBCfhJWaX8wwXDj$Rxqp*c!Rn zd~@?}c!vn(-wBmfUL3xBjQ(#JRf6`5hZpLW8?G6!{1>c=Qvo z?ztweZzJr!sF}7xte-^b=|*bg1tv<7h0ItWH$p8c^n{R7A${UCYGUg3VXeDCVOn=9 zuRs132%4~wgc}al^PRO;2;ab|m{XlREa@zw1PuS}@b=9lM78=R!7Y#~u<+9lFoc+7 zb(ZEpaYnY0&udO?N4-ux=@ZV^t%m?)MWu1R+u@=c{3reR*jGV+&mYKB0=SGkdf83o zo_@sYNi;!2m;X-sjCpkMtFSXN5Y(LhkWPK;iQdWXwJ+z3SV(C*wa9Fx1Pv6g|JvJ) zit2!cf2zPY8WZc1X*$+g5GAJn)_V@%#Hb({Zf4f%tsjE1xlNK&kUQ#0J3!oNeR-zL z{_QP6PpxN{Dzw8 zswFEkv;+z^t|dmVmsrn7Jr(-WWJ7k)e2Zz5EU%-JY^!`ZuD=XWnZM@OxIBc!xXZc` zpq*&|U#+&=}m9Kw&xA?6nG*@EOoo;&R*K$ zsKFsqw@|V*;}0zPEMk)ZH+|8jPv(b}EhaC1f*TD^6_Y_dZjkbz|$@Zq4qzc ze5&PtQ`gwKM>SU;7>#o_iW;+3nOZGvH@KjEpjbr|QE`iS*S?&$UuJV9l1n;{13DfE zi0yt9Exc8v8>V@q)d&@0`nII*^~R>>G*Wc2_!t@mUcY`+uzKPTNJ8gPiDJS#izAqq zOghqS8!~2ATb>?7u=aWehs3()NIBpQ(+55VA?g9$o$wycZh@*@s}+ckgigc3##~M5 zk(FP)JiYl)at|-@!7S4p`10%jkEOG4X!`x$KHc37igb6%Xb|b{5RjDa8j?y&NVkXr z(jYy0lyrA@=YX+2`+R@Tzp(f2`#$G7uj@JpAnBqoa3@S1BBp3^x$M0JALl#s;0iO( zli3tZps3ap`Ydjb)x0#|ElvNCj&h%uk}nNjC{g_A+m9d(^V^rtHX2_KVegM+e2MQ8 zg>y=!zcn6={&M$*@8yh}IN|eKml;q48Zp})s-5UYcp?w^?G<3-u2ARNbV5bn^c%4A+7^34z4UNdgo9yO4zBW%V`@uzwQ=BP*y z{7H!dNdfEP;WZ1e2QY7idA#^>ssE={olwN(D+LqYN4Q);ec-!?8?RND4}sR+XI=jN zWwZpJ&j(F7d{gL|?_|-X^+@l(5>c<1}DfR z@r%c=VpdnS$`^L@V=7MR`3|JVFOM3f*7Ul3Fk5hC+CB9Po4*Coj*Yx>YiqODXM5Mf z!YA~8fw4In_y z31?9MysCWLFUGm#J`j2Dwy`GITPHdt@znUWn9OO@=>vJ`HEF~(v9k8^3ydI_9Od9+ zv&X@AK3jNjK<<6|8Da})fEA;mP3>sxo}e`@MH6;SSi&MZ#iq2p-I16^B^#Wr)>00- zFbo9iin^0yc83vpp!;wn>G>Ofz$^G6nG_woDc<%&A3AHSv{~S?%kDQpHc9GNBLm}G zu4yqCb0?x0$flEd9d;_zaC4K5Pz-0_4_!}OjDj*p0t+D9J;0awE6&118bMwGX@2cK z->=>d_rMX<82|ji2yeu2t?++hL7@=r;`a07_#@z?$n2506{U!#GtjmRu@}`L@??~` zm;Ike`7yo?JeaM~G2-Ym&y^nz$@>6kQof#OnSo8=7Go4V&s;;Q~jn!?@7Z1$9FoT+^KPt}3OVxi6=Jg0KN`E1>x*I#*K zNGeYleQz&UM0%2Ncs|PfgT|->ol=At*NJmZ8SUp}6au;_%ao+^F26=Q*; zmN|Wj2Y-a}rMti8Y`_FBL)7wu{7SEJ=DK?~gVqA+go1f2l4nNjb%n{wp~s2W(QJ_= z7AaCV|K$L~5n{n=wAwO6?eGzWzKG43-a!zB@-qJ+SdFK#0m>1>u1x3cY;r*pq}>`vGbib=@+9k&9&MMn>!qhrU&2 z5LEE-(tJuALa>A(w|tfnmthl2iEAsH@qOd&QgdHYeSy)G0A`UJwRu;ued@Pruv|m! zjtfbkPtf^+VlLEzpmcN|sYN7>!R&Pm zUGji9R*1=0)Ikg5ibYi6#?N*@yrmz6%R8%;yo`dXDJloZ599P!=&jy`b#PYuMN68qT9Pd=%V#DeGBg7Vb+XvS2`Dm zY$9!h;e}AZDiE~{-}tHBjwmDKwO`H|Qj*5|F`0l@%hB6Y?DqG1QhU*eP`*%~Xa8js zMG`D0gvP9rloxA@sd{pwBRdlPMQA?5#I zTR0Un!3e(qzPRhla@+Xfl(H<>V=^3RIQ z%mp7B9U$j0Kjll^uU)^DwnxbSmTwwBZl>8gHm*uB|4xE=wl=*x*VE9zn1k=>D-LL% zaq0V#8^8|<$w@zpyeCS#xScNW#siM<&S>zZ5L+FV^k|=an}_Q;V<*X!!tpf)>15;w zqbO`dWi3}tFY0l$Vr6i>N-Of+J%sM-aA{}E!MNn50jM1^WC_5%wf@_w`kwlMelEIrW25st=3_&KsCG2x}Ae?fHFg(>ej{d3s*gj6hTgyBNG@Q zNB&PC_}dk9de2w*GQw+nh4NssX0L7tiH z01sYW_kxz+#9`A@>|De-bqLzhP~B2@3-#T_(u5d!ti*rWInlB?*1KB8ws=0SE@;`= zMe8$KR6BW>%9`Y*70GJM7!xKk?}_sMYR1KKcwSX+3xJSl2r}u7h+=E|p zO2YU{lEP%1N>Vg1UU+E!BaalF=vXQt1; z@X%=!Vr~G-4$E4<8UAMSeGpGd&xTbd<{AAwgnxNAq{i{mGZ$B0PMGi_Z9&Zpd8PlgknO8C*L)H;e-3PMR$0~eL*z|OH9Lu&IPuM6URJ#xRScN#m)IR%wo4hYP z0>4g)u)MO%ucF|rPcylU>|da zCAMqFi@zoav2kCmdQeOwKP3jZuTy2*xFD9Yuy|x=#GU~K3(iN88v=f+Erx)SE)=prLVz~HQvwOe-}=~WRmN>nqdH^W=hAPxFTmd3m@K$G z!l}=lt<)wEZKn1W{N2NZ9i?EG29jZJFuDAB!oN|vf`}>aox?6~g?)C0fN*{HmoL;*Rhy@y?TYE#%4BI`C7LG-E$- zm5w;nk+g_Ox1V^H*4UM_HSi@xAKLjyUN48AV&CB5edt#KZ4;$Qzh&o8pcyK_V2RnQ zdH?+co6AdWapBE^r3uxOx-)5dKTK>^q!N8_FAB)bKqqJgrJB8$pSYrbwz$Scwq`{o zd%-@Pv;DkV4l_F`>}3-hE{u-ly#kCXT@SZ<(?7oP>`i?xD{N8go%)4&L~>}|b%H>- z@1*uZnao*sZa=(%UDJCi#`@|d|Fwn-CkgpU%XJN~+KAPJpQ1(8K2Mh@KS&y_HDIgs zV*+6ICiiejM2RE)Uy?s07MF*?jEeT$yk-Hp{!meOU;hgUcDZXY@Jx9oB30YhH8UEODe6N%x`vu{T6La%U$9Epz-&X@^@4?nXAqic0p zQ3tMqr7M<-lSkPXs^_IJ$L0JB`x!$bHr9+BqCuIs*gKHIcfJS1;ht|q ze_OOYrS7d2nE~!!W`-UDci=nMz)x`%vxZx591l~VOByAVYP2ftybl_}D=j)Zc#uw` zt|hQpqg;1$zy;)Q->1TpTUgxAIYR8Y_>})PZ)M`*)@VB1+Mnfmgy}L7@=A}G& z|BZU1+SbHoRil9UU~V_ax5x3rVEisml8|Wajp_CM)i8XbTMGUkz}I_`08s%7n~tJ8 zg)Vy;*XIWh#D6#SXy-L+YYdFb{KaMtY1A_k-jfw#I`83c(*0#kQ9@5>%FbURz;YM3 z#DK_z_sfVLIb@THxzl;3j^RRuO#5h{}q;yx4FKG)>pr9#U1>Y(l`K1k|8?e&kkcHO~#lZ8e4Bj2Xa zz(`s2)0s|8ne_VTX2_CS;=+-C2#!;^xM%GVL`qyv{B&c<>vMPC8sCej*RKEVsDBd1 zLEV7b8>$So-l8Y>M|=Lha^JIWwisa{lroraO{ZeyRFC)4B+}zmXO8P1*!r%gb-di- zf6&X%tGUh(hSzSbb-(*0bCo0g8gFgZ!r%x`V~o7atlJVj^ZBD1PLN2g*eem!Oa*hL z(fNMpmDmmUp^udCg0?D3{AgCVx|zyjz%^Vc^!mSwhfhWw1}CyW9t6539_WqZe{a9M zn3Sx8@5QqE5rcSpzNZBWo%Z`tCENJu2JfwGeVzYHm~GXjo0z#~ZBze?8dW=dpDug9 z4h6~jtv3|J4TobqEahwtr%Gu=*p;mKAZ@;e7 zuV1RY%2)8__p@~>EJur2y!1I3n%lg`uuQsAHzLQlaj5=Uj*(URl83)Bpc2=v>~3$; zopa(yP_o)bzR}{eDSy_|ZblJAhRpA&N#0Lhvivf=>k+2&n7lAnehqp0+@ZQG5?K9Q zPYTzeqiPA<9=Dub)G?&>FPR4oh6g69v=e*QapKWnFiOttsG4}196MTPsX@4Bgs{DbumMyOr? zLD$~{kAu8N#HNtWniu7hc0-QFS+FRo;JWBJTu-Ui9RX+3?k;Y{ zZ+ayLQ}UbqtJQBDlIZDUY`;kPC*XTujM<1w(uV-%qy7yHX3?70aHQ_I7;V0gP`vfO z_P!O*mfGPkl^WObO|QUJU1-wyG#(K?%|P2xaO~08=`AQ_ew#bCYz5X-DgI2-zW4K! zz1f^Yb+h9rBzUM(_gm{VMtl2heV=(8&v@7f?XO$QSFD*Td=1HKwSuVS9jUHt3!Tu~ z=o_Zx!S{QP3V5*$L#Mvg$pg|kbFbN|^M3?FrJ@cJ8c&xC?{en4zPniUqo5{gD3$y^ zL2_l?(nt$*NwWAJ3JQ;{G3Z!2WlU+y+ChCh%WbRmVqxP*j3D&x`0;`|ZX__fClcG$ zqQYOX8`PPIE}9F{GD0;^8r_9EsPS1kLE&ard;Tz|F^!HMqj!S@x7QXuHEo-@G;D-P zY&}^P3RoD8@1ziBk(#4Nmd{?4_9_V8*`aw}kyJ%YtC-~{v#GkYa^_Q&(|s7K2k>@g zoS;Aqw((*GdW?c3AAhvWa5|I~VDXk0>SyYvon?-8rxSei-^67>+BQYtF8l91)S%4` z)K9)kK*oavfrZWIIz(}sjemBSEx+K8m~Os~7m{uQZtdZ!5KP3)5LVjEGayFV2xn96 zbl?C-$$<@)+OF>h5;_0S3F)^Ros7BxH>4$NsoDp%x0YChQoQTf;!q0^|I6AHnSypu zHMNSc#M>~#bB(I9jhFli$J-2;xYC~+7+Rl1F+Co*uv|REZG-Et=d{t4ewIVho+I*T z*hg4pntBv&MYsf24$YuhNyx5MSnm{r_9l`wqxiQsIY*}WZK<|43Zg2YnX{VBhh#!Y z>XRwT$qRE%t13muwHkGdn5ey{`l}3$Ud=H|z>63G9V?K?qv=|Ur%9IReQXOqe+B>M zsUPJ67C2}+>RqynSs{K0^vp2gWgVh{W|k!@nOQ<#E>bLOHW;$U9fB!i!yMBQ^XkdTUf zXjQ{uuhLW#~|{hillb z2Xhcg%w-wDBln5b<7c9`fe2`!_7(`ex)3q`QO|2_F2!$n+dZN&)lcDMn*P>vBhkMVv0J$eHQ>so&J4uti0n!^&3sF#H`Z*e=Q|I& z^wLTTW|(Hz@-m(^0qr>};Hw$PjM!QhLPq^fiMfMNEO(3O~>Qo!*)AfUo zQym>IfBl~h@6X?@V$jJH0|HGqGBM7O`VwayoB<4MFvxD&CI>P`>wv&i# z1g7E0V#ssSmRCNS{_ygaHQ-mZivlps@G}oEDaP#KE(0mUb$cg;KvPA_eJMT zW3ocX!Z>y~{x74h{M2Ld<)7&n=hYRw2FSCV>k`riKh9+vL8PYz`{T?nEA}%sb@laA z5`5=$`R&yUtP%zTX>9K6wYuetUvIm$wZ=Y?r7Eo8lje5PL6vFM+AWRR%mFv`VGaIZ zxB?#&arW<6Bkk;7Z(lb=_~SiJSV$r50dZ|a_TiS*4?E|=%~dSn-%C5|uy}yh)R&?P zmlU@-YY%h}{7{ulgq^#In;^x}-_1EPqSQ;o;sUmS)nU1rHLH%{x?wPQmHSw#O|4>4 z$gkWMHeqf|fWNrj_$+)B(=$ zoNp3d7Pc5YYztoG=^6vUol#ik9=)k`;n^L zaoJwx)o##K;JFak2(4CAC8<1o2rYtW#ZhsQ^tz+j%$n!dvfQG z#vL=Z{dFIXVj0%qa37@1LIC1EW(2v#Z%4OYW%#M8*un~6>)H9uR0;R=?A>?#n`HCK zWQyq&^rC%$1QSwE+}pWDpu3(V!q`6n4b8gpuS@Vmm|N5`PadKm?spM3XNFei9!CQW zzuqDR)Cxru3_=2Vu(qaal(Ga%(Z)5|O1Ri}Ruieozho3um`L?qX(su*=%cPtA6V9P z)}3wo<~(2zCHa3bd+#FJB4JuRRpv!eC3ZdO>CwRF{!0^J@UZwT?l z?rWrWPaON#>4={u#vA;?)B4IP6Ji_bJArXVQY8tjvbH>EbeHG9=o(l>X&L^Iqg2&r zQlUSHt^+3yidY6$nj^vY!AQF@sQzpc`b&MP@3W*;HSWi&9zQJs-I)^!wSWGzLFDFM zQ9H0>9G{>;FhC;n34~$WqgVNSAxF+5SJgWJO&F!jxBb+@3N8r|0<%6!fXy_^Xy$FC zGi=E+uBIh59w}kf+FPhwl4qUUh+80oMG%qW*`Q;5Bs>h_pAf+2$vm?khRku)d}q8W z-Kdm&gkHhVb3y(k;M($$xIhx{(>n|2zTPezy^NkEOm?HlzjS3s(Of1>n$O@Z^cu2g zogzlR#E!S?h%NNjz`cP%3fj|G0qkx`-(7sxuHh{-a9_Ma`z>*LG495^J?c4_CGq*F zu_SX4`ERZxul-NGr0?Z|l#;14@owG&{qZ`?E1joJGIoEDSR7bz_=&TxHeAumB)QuJ zOacUYZujpR;=X%NO1c@b=iq8)IK-A-nBLjjIbd{?D^8ra1%yq9Isr|FNv0{lE9j`O zlT0S1QhQJcKD#j~pp>tEmV|V%JM8?#i7Msda?Mx0L)gPIHTiMBCFX02AwOy012+3G z0glu~jTGYlBl=1V)4vAqE5_gfFgl5AVVJnrw%;wLKD z(&A8JhIFm~q+YHUkOpZ7Txd4qEIACySoExZ1%wVWDs{j`J_yGem`o|DbxVRmpkAq# zQomGP^JPj}X81k&D;7$hUzCX0kaB-DaQLXlAjY7ji3g!KgJAa>4n}(3kw`Px#vFZ+(6Ij~2UX5i>COUBvg7zxMCbYDfwAsi{-!(Bm$$8nLs~J+#X`u7NG}gAxw# z`ET1Z-E7Wu*S5U-x`V0*@&2z)aSms2BrFZuDYrqc7cU)-qZT7Qn)9UIORHC7(4N9y zE2E*vCBlJe&2t2s*ja2uVegvr5tt|KI>yOd&M99$#vL6sU-fe>`UCR{oYzFHW1XMD zF_L$|gFnV)GtOTdt>}Ynl_#VBGyICL^9cfn?7~lU8oL)s^-JB={dvF97;NTuJN*s+ zWBkMEIP%lldSc)Ol{H>LK-!CU%dhe}7q5&0WSQa2d;F(wX-3>cCz_ky!&QLKb5TH9 zb&vj+#RvBJ78~8^X0vvm+RkNF3l6ok{bRi!k1wLN_Zz%8#}|sZzK5Vg5D@G* zmT@s8v>m%Ha&NCv;Z+<+Pdz#|*5C9wgPEXUdJKA@sph0@>USBUUEJ@$6>9_L&TA9e z5naeHm5Zs~3D!L&LW*4V;k?1`_D4zXkU90xqkhg`ySQo97ln6E_NZ>vqOa0`KPbdgRm~R`i>XsbN|}IX@TKdN9-ZzALHX9 zsC3ODaGN6t6l~9?64>D4R3%Wv%zFah3VDb<-SI$4)li}6WTh-#glXth9l0M7q`K9u z{UUz)M8eo4^>w&mx4i|IwC~$IYIopQI5BB*uPz1YZ0;bU&ba~H{#21e233c1d0<^6 z%7PwXTQ5M~a6~)@==o)%ar?*?*$uxs;7$F%**#J=nV?&FnRMHda3k@&U(o{=w(2)l ze{7FJRdizl9`3F9Wpn;Qfp>_B8)s(k*4i$7&1zRCSpOH)b8kS?P?F$8V-L=ZizJ61 z_sX*8@hzTxj6*F+4|x(zsUf|&Sdpdgv7&#+YGnITh%F&XQbE#2HD`a)&`gt+S4n^) z(62ri{Cm{EPcvz6C$V%>;Ji$VYsz_}HeaxSLE#BsA=#Vr_%=VGt=Ksuh>y)-cLYwa zv8+;Ef--Jyv_$_yW(mJ`z~Iq93$Ps!)b~Ehwd5u$_#9g(K9jTvtf%U%%eNnHzfvzq zLaNhblnWBJ0E{Nwf2MhlpKMfIf6maw$wy(gL|6M3+gUD?d1O)Jjpi?jUeu8J(M8~p zV6eKdk@nYhUZe+g9E$*?rN+>pkHdGarLz6>Ai7P0kl^4@FMe6;EOx>{o0kIUQ};>( zkd$p0_HFXtn>Bp7(4UN^glY)q3ILW7D7!VCM@;DJHi-WaKc_s(!cM2G}XMmzcoNAd&B;H1wvR;Xfdl~B!J9}M7g!N70Y{onki0) z8g@RDeF-v$GHyU=(C8E42UmPOzlP0k7XP6o%f-;*#S38>ohH5X@H*^XH6J9#^Z=5@ zVKir;9e@Vy75;mW`y*&y5ph&Mfq_og_cga3&YOpd7WpvK%d;l*aXU$;SOO%F_w3bU+SlM;|T(Gu0}e20`xpKXq3vl`4{8aK2zj$ z!auwWP2bGhD>#UY?4f8;vY)ccGaXyThGs69v?jaJ^opvmwe?@GgG>l!OKTE}R!vA9FL`!r}PT{2JV zvVF7-`M2~EY^8bOz#|CA5Gf^+@l6`P7o|egLiuWn*Jt-)_{JUvX?0xhB+--Q`w0QZ zRgwL35j@#|-U1Bf9gwci|MIYU5Q#~WgL>Pb_JdoC4~xxvOe=_-9r8;OlbhrSZFC|dXyVK&b)TD>}j+@B1#0EmE*oVwDyl^n`2GkY0@0=GK2S^#$EBmc0hC z0rXfW#ooFaJ)VSS{%`yw8v)-jrg@ii2I!!PnxtI3$o28M;Wy-{&$hyvXI0psP=3P* z6H?c1DbFm2WH= z#-vw@KAMQJ21%8eN$Aszl!aSKlw)d;=vVy{yECIs1h< zGj1>4)PMVdsx?7^epO68Z>&)W%gy6B?a)N6#MP;2$9rI?nZ(KA_mS4Kq~??lg0`sD z#UJ`wmY`>gpeI&2I$XZ9dxkE+&|-jZfBhfHz{MkY{VCiR3WL zg=zhlY72h3cua-$3Jp?d*1MHt`NIak_)YQ^X`TLA#=&p~FJnN-0ZW{PIURo*E5Y#a z3?!=4fM}iO(T_qh4@a4a@SR)`W>%L8gr#O)??q!R(Voe!w3TSXIfFqnRas!`8=(Cv zt40UPsOxC~ED-F;6uD5WRg`{gn{cTGx;fxMzQYlp*(ev@4gsz&fFIYvH}MzcVSnBt z>2En_^Kq%{X?E%sqXwemkZ|*X>WzqEi9aO%3qaDZaFi(j4E(#~ zD0Cfl#+e^Roe(MZu69jsPh7P$QbbAa2~CNf!iW+#MvU%2eC?Xs2c;7wMsw)m`YS{* zR9$atBFzHKSZ04P)}|nzH3ZOrLC|i^Q~9PF$6m8tYoHG63NL9AGL62G_Equ?KLb3; zjUO1xn=aB6T#L2F?;BsN^Zw}x{q|bt-#f1_GR0`}J_I#K$c-dFhv8wMVa0PoALEAg zKB{kmpI;*%#rD-;oUW3svHkfS25o$H6j5t|m?D+`c$o?5SI`ZPY#*J9cp2++4i7rp zVK+-CLP4*_Fs99m*5TX3n1o`f#2HlXnKb|tm?i1VT>_4)NLcTd@8unP=s5YB;}K0T z;!8Jy;Rrngbni=latQd=Je~Uyww)dGBw51y$q`M&F)T*Avq%U+l1T95&pUoZ$*BD8 zBrS{+ZD#!wozyJMEEP`^;;JUu?9fRVw)F83hb;x3945J~_wZ%m1`L0&M(ysx1O*Q` z`hWRB(KjF_tIqa}$xe-n^~9+t4kXjJtMCzidDL?<#zxx2K`;7u(tWWEyMpn+jid^^ z_`q^B^xXfoN*Q9Rqwo8HFtZ?;Q<2@!tC1ty>GcD~TXH0F)4j^Fl%h<*%6!WT>F0L1EL9|cNQ6G;B(u0(&;#pgR`!n z-}OG4OA@GqX^*`lv^_Xu*s%*NzJu&=j!R(<->>+R9<%S~L;G#4K6kR_P8Y)nGSDcf zPU?y+1})!@sJt>G&B5EOeWy2EY?s}^7N{+|J%Rm`^k?|{`;8mCJSKiHlE*f3JCnn> zATwLB+^`22xv8)a#aUajrqM5dJutRNH(|098~b+>sXd#PB@IR!THmWLkicv3n<-OIx7VoT5ocyCs<*Y zcmcHcR<=u{uzmiAm{Pr|lNzio=6%HHw&?>ER@)#(2{pq2w)n5Ms!*+sC&+_v5;BYx zpUSpDIOO|==?=|<;8)#NnaaS0l4==drOrUL{N}z~JJv+@%(RH}baFD9(S;wxI5D44 z=IV0))fikoV#3Xdp}PO|!D3851;bFIJqE3R{=%%>&kWWF3z*DP(`IB&Mv|dFVlN}| z55~SoPO}^A*{gAm{*MDD*V-RN;4zn1fKY)M>fVVY%(t?i&&nEW%?2`@y*Ix3j(+sf zb|8{dTSWhv0V3MRcWxj>N&c)-BYv%mWi_=Oxskn9QP}unj^r);_&9 z-{&9z*=q`RF1CHPUbrmLPE;l()QB}(<4E3z?d84%{zy%<6T4Fj?K`fQl=)G<+4>NW zLg5<_@u(QvOTeMZ=t6Ru?n((;n3mh3)DR}!&$IY`Z1hT;p}~VH^HDvee_p4s!#3(> zXTqMeg)@ZxrBR*I(#o;t!z&|g-TP6|(HW8RR|DS6JDtzx;CfgHKQ3(ds_S&}?T8E8 zwK zHHg`lz+36ygag?b86$qO-4Vf&a%AyQz!^bE9@nQfBBg_K0Krb4fAypDB6d@r!wr9vhwdOJS za{@Y~M54l7>)Ai$^&{vt11D(Xf~vf?n@q8~+yRED!q%VwT^wsX=gYD^@<~}_}yg6&1 zBt?mllF&7ie17^d+!!NUig9LNd9r1F_zE+tLR>EB25dOaSW=1tqRM_;8V1xrjMk`Y=A z%HzTCE7`Rq#{q;`xfCc9=5RSKwK39%DF=bC)wUEeopXFB=^@2LNWzeESOkGd)Cw7| zvC%6gkj69IBlgPQp&Fo>euGG?vkEeQ0;S(W~G0E^1D!%C3f?{-QR*BMpP&PEUDvg4Gh^))s1lJ1}xmg#vd|AnPokM2mYv! z=ru%Bx^cKf!fa|WHXop^S|E;PD<&A|;TfK8`(`qM!KKysQn)j9OtfqDmM(}Zc2itt zRhg71eBo`V$k>cptikn94f>dEd30ol4fhEcB6rmN)-teu$7LE3m6fsYpAWBO;ElC$ z+*kqf^)p$SbC(+-31{%i^^@;ypM;X^e3|hl!Re|Yx~?YEcb`t8mCmZ9p0+?)~|@$%|)bj(D**o$$jNi z!Gh5TOfs<_$~75~Gd@=!N%#D0%`@`fJm5jobHIEnm*Ho{Rs|R3K+G8m!?+!3|cF$VB2KEfh_>RK+Hm{$q z;oH9lU0nNW_ePqt6$ zT-pYM&~_e6H2-bwq5lo8sK-`baqkFHiHhsV2)@XJ2(h|~he{;)J62SMaU}F!Kue+$ zS))0gYds{-$Cy8YSF~tH_LpPN_Qi#!((!vc*5fA0}nFk z-Y|SW)YsGssk0X4p({p472An;$$B4*Ev`d*yFri*HdIH06**4DV9Z$qV3px7F zu6mA$8NE9`+AdA{YgqY9gXig*gRiE|q*`T?aZv0={9VKYe%3-6i2JP}0i<-zN~UGr z=18<=r~ysBj=&b}w`TK#|DJV@}d*SnKg4Wtj#($mC#uLVsTa!6y zzU^ySm{WbS2|+M(3b|1t(}%e3VCmodc8;FoxGED1M+{xZX;-2J*Um%{RV@wfUZe0z z;9dJ3TnX{?0)wCrm8|y?$mFkcd3#acxb&hwtd|27IEgubu6bZUyP?m@@j7mBss=Z)u1VB zRFRD;-&Jzto%!HIATZjztH6W<{!9r^jNlpK{Iwoj!8 ztNeL52MRhz%+*g3$9ED8C-Bzd`%7Cyk4oFUOBo_m)Y0SzZ7gUZY9yXha`ndn`U5}7 z8dC(XF}H@GSP*nLmsZlDeZ%1q7d^)<>505U&0K7xnb##+(rNE#m?p|1>y3Mo*VGmYVVmKpc;|g~G=P!bSu`^_2U+ ziVENiy%4pIKuyf-A~jO5hRz$u1Zjt~^Zk^1^$#7bl7Cq7?`&yQU#&V&XJ2?KoyAoKEbd>!4kUgZs;AA`P{*jxXqImt*65-LAXG2I53x zzJbe^D{+Gp-t~7Cm&g?f@Bi5F5x%E315kqaLLff!*_X0eZ?gJ_jIpr+cwE(wg z730HPndx1tBiVqcKJ=Q{VYoko-*fqo+y8csJx(ygdKMz@sek8fvcnpq1dMIjMtn0F zivX3h2ZZ2!|dXI*R<)6sblkJ2}z>MW@ZovFYIxBJ94#5RO za|ruRvz>b-kzUWIwKdJ#_Ru@U4F44)I{yXb_Mjn3pJQTlYr#~f6*k_Al&iBU?0IEt^6P1ieNVo5$`*l zyBs4Cfst(^k^&9~X%yFKUBRq4i490LzIH|?vZZT$6Pqr^SF)^LW%v=A`Yb>DRFrGI zI6sZmGQARXjj4$^M(Oh_m0&(7B4(9pBU;RNH}|v!_l|#ZJ@m&};fi?&U>h_I)ms+` z71hE&fYiRCIdTlW-@!c68~z@tf3JiowS4~TNyb#T;3(@cH}Q{D#{iSfDNbekeagna z9n1?Gx_$pG)rCPN@iJTH21U-oc{DOzM-$K0Ax~^Px_Q_I8q(#>H5i?FT08=D*^h!Q z%td$gTWkfsWvJ2ZBT7*+8a{!|JcJuxhu12)wLIYSnC#t^Q`@(28sJ}Ubb!&BPn)5gv%9!Th*JJp+u=S*=GBG8Q*4Zhcer93?$B9PYmMpLh8z2s9oZ%f zdn?S_o%b7N zHBH$1Rl}P(R5*5Grh6ghGE(KZ%t7*XKd>TGEr#_V-S^!EPYFfwRH^*0-m!~9{z>33 zJ04&K6JvLSK^&Zzd1wrys5B`4%d{EXU&c|WQg|$xCk(4s6Ck{_ATK;} z=w3h;6aWR`uxcb*sUUpKa7%oGymFV%x22^)BMU-fV?qD!#`Ztsvxy6(agyQN6a+c! ze@NTZa3{q_ybNU;f`adxOEtf9XI?%Bck^Z*4~zE`2pU%rG*~@PUF4%(v?46dIN`l* ze5EyY`u=$xEVcAlO=3>^hBGJV{&Cgsv6G^TE43panploiXfVEffI^5s9{&H|%7M^$Wu_p~-n2dB$7=TB%X7=_oSO_W`m zj0&fZ1DnPQJCQstKLv;7aZs&SEq3QbGh;Uq+uaXK4pbL$N0yyVe*;mYrBxIQi>ZYA z#FWMm{lTXhFkhNV_ombi2*lm)Of&JnU;oWjNPX_A-2W6VSps!ef`M^eA_}3@J!vmG z1ZsU2xB~ogKJ(20jFY{b)|>0uF}<(LJ9deg2OlM@`)Ei55{VPb+P)UqjV=K_W`ai8 z#^MK#(Fb=z4yTi1&NjSx*{0J(KOwIw>`JgHu-&LUGxoAFg&ZWIZ;Ape{t@PiqhkVLV>Z1!WBXqYf1_(^N zbcpFnf?O0pGYQCpLwhl=0ANYGOiw$8G?`ATPF7BXtq$ndd+T{r6$7lfmFiF_(LC$+!)o&dAQ|NBmKPe{13;G#+;5S@5sCMyfJ!D!?@ zd*K{`a}<0`=`-kDg;I>nF?V$K%8Rz^3RhwNE9qD6U^#mm8W(PUwnkrg7-BH;i zkBTQqH@{;NmUfiKZeqxeyl7Gf%dq>B9dtllHwTQv#^;S6opYC)>M{lt=O7kLaRQNv z2I<~dBjBBheM&gO%uHH14_vK?puwYLa+{MRvYGtNU{XFSQO@!0N&pFRN2P<8{|_FZuMC>A{6Nw+huE`9L^#EPw(GQ>(!+J|nWst)tM|ws z0WnkY1;0B~_Ia;8emvkz!TWjb|CayX^8fFu{9odK@n8Fd^wZ+QB>3333R=_3|Ka=| z2Vh2@DSA&F5Jo^iDENKiRk$)fs<1Qna86W`i zVhP~0l2)12(Pk`9NuQid2aKin&J(MCQ<7^S$wT%}{UNMaN`?-w!39xHn7g@NCmo*< zRmXgCv_^0V9bT7YLUjnM4yo#B75Lu#1R!(jXZ9vN&4uTrlII+&O{TDKMt6pS1D@kY zG4(Y7+-OkuFL3hC-_L3Pnt1F5Pg%!#I|;y-$^Vxixy)PYv)^s}{~P~SExuHNV} zsG<$)TF+VC>mU-Fz`qU@oSV2?2Qfg)P(`>Qebf`|W`IpnS9z$sD*{ZVTRz7+P{(HJ zc_<7e>#(s&F$Zopy&(z?M8N(*U*4FFXOS15`}E7l|8cwmfW<)K#0=(2Yl9R_(1X~2 zB59zvcgGyMNa6|6Sq1(G$D; zANn#KTtqsH|Mv*AsuWxaVdELmt1PZ6=Z!8%S@_8VGlLV55&{dbl%l`qf=b2}5f&^T z>OlDY7=>5kp*QV{9-^2i@NS?(lsVdgPAKtaz7!pux0vXK#h=GeBSgNHMLI#Pa0YVe*88a^?WRRU>y0K$0!9<3;@ zNhA6ZhvPI5cNFv8Gh9|1)QMFT7$D!Hkdr=PmsvQhH)!rdZ%t0t6UWJ|NCaz711AOX z&*MZ{jM%5yMOY_>13aY|fXJ9&^PPvu|HE$o@bm!3)>vP-yxsW! z*B_Ss|3LshG>@LlcIo3UW5H7_X&0@sz4ld{3L`|u4v zF(+zHp2opO^LHetjT}ZiHtcav=!9TC4djj}X;nEO-PvNL^L?XpCGdVI_O zZ~1@np8MVMf1>nB@xR**7bcvIAx>&(mK|CD-zr&%G2oxqOKMO@G z86_acbap-{7&K%xfIROC)1P#pVj_(mhFb>Jt2Wp-0%@*(ERWG}Q76~=HAx{m-QAhG z#6+E?tEP=HNXe83MOT-b8lF1Ct`CY!-`I*Y~d0WRGYEqbpkCKC{1O_W7ho63m{pkDOO`-R7QW)5C?Q zPFl;1<&&J$mn7yc9xQ>JM`%dZ?7v{&=N>0uEj^Ir1(454v8o z-SYoi{(n9G`=S8riPG3@D@^N|LOoW6EQ@pP66(ORV-e-75fKpqapawkB4Rd|M79R z|5(XbC3_Wf117@nBL4sN-yD6zKj2fSO}YDz08PQ*=pDf_(d4#Z4Z*p5F-@`Zeniu? zdZDEz$7A6LFr*jx#WkqTxZuySPiZrX#Ujc~dvP1bG{p{zYE%ZmC z62`*{fXp}ICF1}4Un?GgpDZc#*g)=isXOa^-mKzK`hx=p{c2A30DcS%E-3raez4C8 za~!^8qytd@zVwt%3jx>S|9u&7 z4hSh)tKxM6@VlH7K2w10`7;x!ysB(SgbV7LtaO7!0p&e46l7*+pszk+TQm%I20^?F zGS0#Y9h6p-aD11)*Y9Cq1j)?P&kC)Hk5f#A$ruf{RK-CO8#v2S6J;;svKEHRAzYBI9^|*3qO|T%^eM_+)B5MUx3K4TyO4 zC#q%t8|9ZG)O?HfuSv>t9G7?ge|nv3GRMA}HRx@||A%+}|G^(fvSKtIFWURZja5LD zl>m87eZ5NtYpw)*0lz?f(x(igRF6%eKq|@rDFVgf0eY+jupRAW|G1ha-LLTv1D57@ z7t;%L>WB5{@L0#n{~{dZ>4@*WkNDL6o7E=i!7)B={J;Cw``l+eC6~BD&Wia-m{Y!o z0iqZSs;Kj2TdY#2+WGZ_V=?gTlb5rNWt&tbp=Smk!~SpifA&W@XB+>P|MM7smhyiW z|B)wXOXYxkp5P1MPmBNe2nZ3uiVO>~3zz?P!{T$d%!CPNCU&EChRc>k=B~HyfLOU#NIqcq;801YCuW`B;6Na((Odth=h>ztyKdBjSi2&HC~xm)C~ZI({y`=(53O?<`vY1$0Is3l7-c@{zC zgfY)ppEYSl<|uENy6#QGwC|cuX&UNBlZ|iPG2A2UFW5>ers6%P4ey z%l~=YTmJvun*aBMbI8J}7fje*v{3)__en#m0=v;f*{@Wsv*2K;)`Zs?=&2$~PRRS692d z*l~4dg!ho%x{k)N?%46sfN8GWmbiF+1ijPKb_K_`vdSO(5ss6!B`}C;aNpwFqLL(RF;`1*%5Sj8j&=XRr!`tLv9Hob4$W3jccg zhE_2OT;XvLFe0q|qj0aJYU}qTiCsUChXe_o{(<jfHL4vy`H3}fEEYOm+Tns4;SM1b10>m%5`2X2YPSUHFi2vi8 zU+a7loCr_arqk1{)%kh3;mQYt(h+Y=wI8Xt{jI*C(5A{8FI_=~ zJ7vrz4FcN zlSVZzkDpg?#1kEXre8NZhexaa$|INYWPpv8g5-**x7P3qy^2C8r{ z@B;CB>DzIg$WdDe0fThap5Qp8h|ze%lZt)~@AU*zTOj{bj|NE%N6M$^hQX`3F4gGE z>>aueYgKck8Zld+2c*a;{2>LVDohEl42SW?2`-U4*QI@MeLnlg#E+BJ6F|`&`opsS zhsl3+neBIWL;UwcyiEMZ$$vFqJ3}ASe#!)6{k^NzJT9kDx@cfv22JM=9qLIeeyVT~ zj5WDNcq@ME3aL(_%>{ukOUn?B13RVdFmN}=Su=|Nx@^9UuZcbn7-e_NBB5%}}MG0#s1ZMKzh1OG)0OKTvEMW8+ z=9d58^8Z`@|6K9^j7K3lsBKs`K3x32M}!y&Ms`v)3I`Y)!W{Ay5PLPKzkh)WmO?IJ zh{H5ER|RAmx{x8bj0BxU=L;W$V5=iQ`q^0AavQ`4@nB&)gLaDD6}D0h#kVF*6N~Gq}eHPkSRGLuId*tsP*bHauNyU zgl`C}nMf_BO-eKd$^a(+ZKNrBj$>`|M^64QQ`pe9Z0|^5M6Wc@K(tx+gxux_q8d-3 zB)8uNJHR9jgA3LQW)qCC(9AhkB2dr;2;z`e+^6Wq=C?nZt)NuakO%Kk$CZVP$!5%L z@+)d}1=m4bIP403^Q6CJJ%@6n4Wt1&;2Rn|BC9~~()QnC$~A^5?Q=f9@Bf{LPyL-d zp+S6hKKZ5N|HI_}SO4Hdg9qDx*%BK1Q8YxmU$WCNeSV=V#8?6^%oLsyvqR1fNm{{^ z2bklk`QqLexsle!2llWdja6Y(ydTZ} zZ~6Z%|8Jc8F323^Bc8=lJHlg0^8%$DxM__(Q>!+mubhumPym$LsS@maDeKbtA(?pp+INMgE+ApsWaYpdVNo+NCDzXYdrlYl6<99yqC9&z;o1AWSM5 zfDLEX>vHg#GQHw5hkJ{FCCnFEq2CWH8W;^$gy^?R53Dc|q$+??oy5~@eE`?exSQ`4 zhbB7sR5T>&xKAB5HVj#BCZwdNwQ^n~Jpz+#js??N@PgiwiJ?^sO%NvJfnHOoDDg+__`MYpNFvj z&wc9krG-hteQH3202RfE7QmR$X0nxCk_e@`_bpnkUklM4ASKUX)xqreTETyY|EAPmZH?YtL&E7jV?O1 zT`SxSJJYJK3KI&cj;R&A>FvxEc*RHFW@RLd_-#!=&x}9>FeWY}S0;a}_T$y6xRrN9 zu8l&bkW4=e;zBK~Uiu+39Lk)9*9@Sd1qok1l++Krrqz0?uA#@IC6p z;d<72OjAh@@VLH;!$L2g1G%bU;e*joOAMU)czF4*otm|B3jV+Nt=~0XnA<@8?d5%h z?LO_l@A)69$DOU}6z*R9Ig=F_w@M!%a_9_l14eS;hq|$I7fdqn?7Psay04fs{(aeh zd;MpLDvGiuHp#vWg5$w}k$5y6hmjzvd+fm}q<=2*>l65I^gC>uUZzE z)76dRF&qih)NIJnp`@T+7(L|;<^&1no9ZpI9*`*=_0#*@i~BVfXYz(+*PAH(whEuUMEJb}53MD_tY-1^J2%2--lpsI6sTtVh0A_jzCwPH z2Uyku=0@$a4uOzO?DOSWtoWinT!{_-b~+=SR6_`^IE31qmA7#Y19^y;~jQTX@)Mwz*!Pf*CSC z!U*Zpky}8C5GICF0bK638t=pZKm7m0|F2-X#{LH#E0|P=--rFb#Xn|QG)5R34S+TC zm9rET6w0`Z^9w>}6Cs}wKn1T7bh8X&^ijizOkWK=1~KuyY1Bk4+w16mEn$Xs=^2hb6(c8!(~Tz?zCzhooDU1GAwbA&svy9y;RgG!q5f%d1?t~ z?H1lR!|mgy9#NNjPA9oPhFw8j+7FW9SsDH=JK;`|R*qjm9wphiUcGt&>4h{5bnhaiD;b#(@(IY2p{3azerLZPzB*G2oqP(K3x*7^e zsed$C76Nf@yEnZpe7!QVmGIFkbGv-_|A+q{?0a0X|43K6IL;n(OB?45Nv;2 z5NC8!=IY5fv9QgBf4eWepPkm3Ky#*V#)nppo!*}*a>c7s6q?n;tZo%XV?fi*WM-Ic z^M>!tr7vD$OGLWB6sg7d4J#{6;eK+5^70P59#{k5rM{d39vw$}9Uk=oPYZvGykeqG zN}8C>T%s92j!s6kferFPi{}?4v-3?*Ty~h5%s$TgU zwPQPTx>;hvKE=>C<~@Agfo}nRW>5I5kf+gmH$D(>LW@UevpIguuQ{(+ui@)~W1OFX zsu}FRY)A4smrnrJbmseav;Xb&pUH3uvydu4`=okI;MC#Qqa;!iNp*T>zMy0RY#mDg z%+AIjViDo$ItBxgSzceb9JE?|PVMmjYaTxQe}?<;|L6AK3K~_if8X~1woCTTEHlk4 z%VQ$^6%tz1@zBhAh2U0(YOUWob2QJ;ZQ;PrT4J=Szco5&n>7uZVP=urvFUqrL0Q9n zKDOHSESp&2w%wP~BvnsJdRArvrgdtIHy;aB4yt(PaO9Iqr9$*Ok^uDrKJd4~GhU?w z7=?n%t%WtkxI6V|Z#}Z+$(*Uk6Q&t0JOsI6P*$iF{SyMC2VKUmFLaoZdKWB-5PCr-hC5m|!nP?l{oHbq=V#dWq$xQTj^+E#ByLFdfd#ZK|O7J#)iW@MC8 z952zOZQutYpMvrn`~?9c!7>shsuC(qGEoyvtKhSi#AHo~k6Y0o#BG6EGD6J@#kB4K32Yt6}00#e&bjT3OJ5|7rT@5=3cvW@` z_4wROL8JBTanR-P{}2B^<97J}>-OIY{>J11-MvTqe_LhmtY9ofYzDLr{tU=kaP|-- zO3rNM!LOJhu4@9VF{`$d+cs%4(`+5byxc`;wcSRoRI2(F{4<3+6WFS)SsMtS<7)+d zDgm7-^1WqG{h3k9_~55-*6CT|XXp_(a4v<;2tU0H#=UX|sD8mekx76+-&pDRax{1a zB}cUIgT*AgX&^qA~^5fEA?l zRE>kNbUuK#;tW#KC8|FW`QM?o{Ivf(^D)=;Rhiijong4E{XZ@Hf6qsRnuV;<(8Ep= zv$ZQ>EfDdK=Z(jWg>NETe*dvUP$_j>| z>q@nOI?fD(G)gf^03n#d05u-BsWFv9W+wLE##d`Pv*&oOI$C*)X@*ITcumI$^zq^U zAO8R0|F7Vu@G-wKEg#1I-y(8VgL?=(%X%pSCQB}us532AWtChQwZC;{FIt{5G7@}^ zz|1683{uX%tYrz4f7~q5ZC{yZsjy8oPL%=-hRkrTJBss6<6b7NGLjWa}ZUwA{&h9Q*$RKe6ojS5gXHT^za&^LSDBhZl9`F2aHk>$-*y zrUiRcW{C4zY5*EJ%(EV6ehH`lmi~%WGtqlvJ}!vWf!0cFlnTDd?J!-j%P<-B zera3e@!Q}2C|-FW``0|7E?c!u3SaPT-#5br<`e&H&JC zm~Aj@#rze3YYeiMtXX`q*NeV3Hbl?Q4scDroBtOg%nT zAL!`ivDogXf>qnA?$3CP`$vIdnr>wix1O!RoM*w-d47*^sbnZO_rgoH)#ztn5mCIs30g8e!GXdUQO1#-@t%a;WFz4JR` zH9#9dbz5e$x;G~stAoUVd;bwY8qp7FA~P{&pu^qanNVoCg)~)~#akdd5{mFz2X&-0 zutWMhTB8ELtvruw1i}Si>Yx%F#Dfy#2%fD;peD3iMkBV0r9*#)tkG0<4e%S1KI!f3qQNS2-|}2z!S8pi(b@kvd~HZolOUQ zL>5wahIC?-g{Ne8(ImkNE8R-N2_tYBbJfZIZj4arN1(lJ6$4Cf9R9!XYK6P@b@=~> z|6jeo#z$MY%wSo&Z*c~|dZ+lT%EIhHc#Q$pgtGT_#;w|$!M-&Zftw{^*n;7%WpAcv z?Y%yoVc@ctDXaHpeb26EW2%aK?LCHjAFSlGO_ow|+eTwuDd8Ecd>`V(0+%FX!x_mz z_IO^XWOW!)kTNL=ElypZ%<@$C-OX#*uLV!A8`!9=%kQH#?jSfd zoiJDyoY^+`B+IG?8YR7(4hpO|sge^bAP0;vz{BB%rPx3}8ZX>Wy~9b%_pg-y3H+y- z|1W;)cX8sbs{a@^NMXH;{r~nyRh4b(bEdXf!%iUk?BOSE>KM0{fRRE81E|haB`8(@RpLc) zu4q!>c$YHc0mf}xIal4U8HY82TpOpmpt;2#YuWCt{?hZVQv}Ox|G&G@9>%H!C1eOjGtfT;zpW(?xuEJ|#9gg_4CjN?T&9y$k05nyyZ2wsS;4bVLm27C zP(~cz^7wYmSs7peDZb{v) zjS2Ht=X{=&(>m{=ui+w@zI&_so1eTo@Pp>+ao5c$_&P4 zx!LH%#|c1Tw1J`KxU%e2--uj4h5YdUyVN=S|HJ>^56@O|;lAzv?W`gKgiJTjfb2;Q zc%4QDa}Ak!hG{*MSd~5S@4>-@@wNXMKHHz`>PN^| z036;SKZOH4#M@M~eu)^Wh3K`xBB2GZ4iAEzN(V<=$t$kJyk4hM{2&{^AO zLDxLST2H3H-*uGAKc`Y8*;7bDx3WL8`tlbY z`%laMtKgp*_A;*iXM^PBNX)@uovEN&Oc8248#GLcY*v@|>oWLgH)a6Esx7viY#VF2 zgR@?y3UA@l4m0>I-ep3B-s9VSoZmulkec8`GV3s=dnN@Ko{qyFt2$WfMqa`^So)@~ z>~Q-3!`c7me(ooLTCfsnGCs2sq=h7+_^v>px-C-Xs`O|6AdGQRS6%8&N@w1nu~wZ7 zxN+0C)L>gb&dTBcAO8R0|Id>Mvv(iT{@-dP+sOzF;5xyzUe%8d@K&7}oHMw$-q~Wz zYhc(%zd1wa_O{`=w(M1$TVq>|(=6*(EAnkzwrD=XdpHeXXNA z>$7UBx<7mV{U3;#e?yumV_1x#Q?^{LJ_A^e0h#i0&;96ip7p4?dL-Cdeulh(dNGm; zW=a0RX&*r%1n1sv#*Krr(T2s+@GkYt@RN$DtFc7~0rd2+57pN^mLIS|R7ccvZ^741 zwq?1#YnK!9?DxKl;n^y8wg2s-KQl(xbzZWc12NPambU`PIRGia64lOaMQ_5SM0pGf zS4xxLX-T74*OEZ=%nj|Pwz-y~+@ihg*VX;@@>j19|6kkNhU?mL`2W|HhqnLMz@T%Gfw!4|E0%+uJvbz%Xmi>CrHXd@8XqAHgggo5u zDl)_2908s*vuD0zU?>jhoSqI-3s1FUfY~Un#Mzh5J!S_tsRduTvC#iUpLd3%8Epx; zfbaM0Ya@Aw^KcT9YFDPMos+wzh)(BHhMwmpK#1QH>}CMrIWJ_m!xx0&K!u z{3*6&8~~G!r@TWn`9$P@qdcCynI*68rcY08f8YC;J^!*4n#f-Wb~%awW)-xDBJv7z zd_0NRi^*_vd?C5XtksLQD~RiZtj7IigO+RNaiwEO(I?v-3NCR4mLv&!LK5u5oJ64C zT0*xMb#-96@gS98h#1q7uLbt+c%|EKeCf&9|C^ulPXMx(XN##r&Nh=XR)}P!A8hE8 zJ~r)Puh6=)cPsiKm|*~F)+~GoIqZ+V3;>^|3yn9ANCfw)*5UupaX~m{wWM|p6;s8_rN>@13gZbrs{7^ zi98g8Z7H6ucV@!=I6|?~Wz5HC2{8!Tg$o^!s&VNP%8HNRb%4h{Mf*fe7s z{M1~JEtULl^Rf3Njrn2;=T*jLYR+`gK*Kc@ChI9Q(COn*IOqH9Ndn_B9GpFE?y-wp z=X$-)f3y9+1pg^&sCihrmR#4McUvBIlNn>Kz2wW*KYfW}H(nb$67@uZg4JVp(M>ZS zBbIU62KWDS-Y0i~xL_Uu3@ft zZ=SWN-+O!_&&oEl?h(W}K6}eG8KCO#**j}(-$fv!!)yB5lfBir zF^oTT#0GwRYHhqaT*z>|+_`k`bTQoJGEe9a<-7Z*2`$)N?sqY>;y-yQ@}Amonof~*>ITCLG%s{&eZ{hFblq&dbX)u6_ckpHb< ze7$Vj7If}s&h;J#;`=|);)e7i}VY0LP0BV({u2W=$RVY&xQ z-k{RBk?h9TGP3^bxI$|rALJ<}$#R$&bn-W3OU<}MrKhWO3T#_JaF+8--=+_Gx8M7& z*!zD?xr_bx&;QZA;>!PY9Osm!&X^Obgf_i~0W^PUq$T?=HiO`SZB(fb0?*n_i>`Xn z)Tmh4PR=3`kF1K-;s0YRj}7DD|L=eIS@Zv&7W=^kp8o5)7lPb1 z%d{mFxo;f+&In%W^xbf+;k4GjGSuA!Wxt}@quBT2a+kKNf{*TNS=64);hy(raGkG# zjmqGEcq8aRT6{Lk57Fwr|8n6qYewAn2;wcHrqZ?HJ*w2B0rVn!%uX~3MkBbZ14wo1 zsc&^b&=HsAmjpis9=&L^!*u#`zc)muI5?|1v#Ed>KfiYgb_23lN#UIWE=U_sNXXJ? zAA@r{bj(3`bw28Y-g4-=5s&rJFZVKc?`AGqhao|>pjQ1;fdiFJ_<2%`^(o%iBAPUX%)`|*dhNotbm%X z2!OBFU3gs+qjxFk>jB0b(nBUV5g-9GY}X?B2L(Fp^N>e5)$}YME$g2G<^~Gjkve)r zSJy*12{7V16XG}Oif>hhqSC*Kl9$`R?W;PS{GU*}XZwHq!S}AvQ<9&_R-ndcx&E-V zj3Wb1NI*g?Y*QP-i8&)${Jl@Ww_sQ!$bAjiHc@o|LEn#v9cRtF5>Z5 z_;T^;J=_1ASASygKm+>aZ5xGw?9jMhP7oa}V8AT)Lylau^m4NQmIkIl1x#EJudI!; zztFjV+_o?pX?<;|>Xr}xKfQbS|Jujl|L=MJB<+8B2Ecvn*VwylU=`HO%-_8KyOg^v z!)O|ljB<@)yCw^?C*#KV*0i}kdmJI!vKsqvzNWwX75Xc!-hH<<^n3liKHRsAL1Cwg z>~0wD19ayTmm{K6>gNPhPRSZt;K;P*`+DbD^=ek8^e6E|`L%=uB_j~G3T~d=pk>8= z-3Nh}2p&(e=H_U&1<3(>%fs=+6$qUN7bE(HV{Ei=p;-hjLCa3?d#61uX${Wk63!u3 z<$l$zzx#$Jpaav~81{68D(wXwb7X~`ac85xu$+Ee|FB2kb^xDJHsEba){~!CU zkCvtXPsaW~=llO<1wc!P$aw44tfapy2&BGLtluM}4%D8 zyH?;cZ3C-nSg!ED5C8x0|8qI~|2^eN+W%VwG-vU$bGR4y>jtK3oA2#i((pJ8u}^4l ziJxuIM5DMlZLZ0Hp@Q9)J*>wtWnM=P#+dcfDfmZ#Tjqa@PeT=_f5bsl&^wM$Y zI;mC_j4oTTzmyUJK`h`f!aIF$+x-Xd6zB^9!Y&> zJ3UB*%rhTkyus;WM@ZuJCS9}wX7axlhkR@>mB1FUp7?pxf02k7TS5?4XPv-O=m9}O zI$({LGuNf`GKu%9@lBY+m=4HbmVpJY%sqI`pANc2=`r}XhsSd%j6ZB;BF;ojf#sO!|u=g^s1pe+gW|BM_F-=A@p;pPL z*S&z)mp%gs46;)fShwqZzD9lAGxB&FdY$Pq5F;fTzZmR~01^YQz=BN&A>Rg1jD6** z3)f;ws81pY&%Wv{-Tv5b<$eE8!v5d<%#TW&vUgtI@5BDp&F_*|vYl>A@NhD-aKI7v zmXc|l1d#DgeY(Oo{w;7FdAve)Mj|`$NZ@nkwKu zw4>#dJNsT=xiWuu4c@!$+tNDQ_d4F6dZ_R|eJy_6l<=huAHo_tKpO5PClB{?cWi!w ztE_XSKn@#TmU*uQYlMyj(rv=KGvmh3Cf7pmApro|h=DMez!~@i>#Tp{hUhJaM;wOn zCj*)dBqLMxFzTSsI5Dty3I2_Ae}Q%hj|4qW~?Eo(wQ=ZSH7&kxIDc4 z!;=mE-QVvVp7lPy|NVa8Urzy1CwXq>NghlR%rK$0fW^C2fmtJ6mN*(@vlrY*e}hTu zw!+d2)z2&I^9l#|g(j_S^EIe^0{x z(-#0z;yA|2<)H!3HA-07V6xEr{3%mQ{1>{cQJ<~Ef7H)R74YxT8OY$G21A8P{mHmz zUV<;SeA!pbVL1H%l{OCl-=2{Cb9uV`e|YkS*#BE>v=ZFy4zq#W0HZ`qGl$r3C{T4J zdwTy@L%DBUAGf`{XXTo#+vAs!e7_QpYUz~2z17yHsG%7C|x|D58*>EJyntG%8gfg*?>bjEj<|_)vWXk8ZB|oxpsoZ)$pVS|yZ~^og(D zdTaKs7tOxyYt7#Iwr=0>qMh&MPS*i@_0wj*_*t``{Dj$0{$sOOKb@0o9pqn^n01si zSvhbnn#@#J3#zO18@$(nzux&av;Xur-|fWzyA-tl?US$D%}3!203se7*s|7Xj;OPSAyL0YzZQ==mWtHXaDjOS!|hk;kyI8&dOn~%Qs zUy%EU|No@R;s0}a7XAOH#s1&&gGw;5lYN~ja&~QOd z4<>xGy+_w%-S)OWsZqAQ7NcHQ<_2c-&1(S|&Ql}zgADfESK)*})pf&*6-TEA3tjrT z_|x@VuE(-eHxdnlZC|!p>`2D|0nY;{;jHkj;Y&!kj)T<_7g#ZI63!Y1iR9dglg2?0 zexE_$P{TQbU)*ER(ohc7Of;*T^k?MAmpl@XGq+fJKGH~X!dpe@vWFIUc!1w%sVbj% z9c0FnuZu4QtQBA~oV*@(WdQlG^1r|S795YS_%6Xe^fPoz4zRgrcEHEy>5A3VE!FeH zXI-C8{x3e;hYJ#H5*rb$Dq@qEY|QX?mX}clme{lWcl+{Nv)}d4cKesUHV6E7wg2Dn zw#&b7``XL9pZS%3P6WK~W6gf@A9wr3&uN72b_8Kt#sv;(T+N7VxOytPNTlEWb(hcm zefh5MOL4gm`+xJ(?=69?{86+od4(A)F_G?jkqGEr*Vc*6Net)q#CRKxCc+0Z5<>L3 z*U;0rbt_~sF|jdUl;d6R8?pY^cncaET8e+&1OrZ7+gx8go_f3ewo*qgz)dC=XYZiPuj z0`y;Wr}C!!SJtCr(t>A7Fp%&%NI4Bu7?xRqPd};f_q3(hx|j}y8N%_3gBM*nRrcQPgKIdOIHSf zzKZ4H(v-stb-v}-nEk$A-|d@!&798nW&dAzzS*~ZO+WuTmD37=pZs{Y_x^l4U$-Iu z2svx1M3YKa6lxUpG10qUk{zd${(r|i?k+d?VgGM`=Dp=}(o%BH3tt7Y`ZW|+J54eu z^;c685SAIvdqwDEFu*!v(xREdFPSt|(F_bca--dH6|{|~%QwHx`q%vPhyQ<7J9}V1 z{QrGzerfvu>*ZnX|LvAAW7ch(IQN--nzx0435Nz%S!d*V*{-uLh)la{+j7T$TbXVv zjkQu`_4X*DjaGMz-F=lXo)j$Ip*)!k?NZb~gKKoGv}!6~;Q1>7=n262*~pJ$Qki=o zciq1XFdV724wnZB<8S&-i_~Qzba%{Tw)gVMz`65Zg{4t9I|MY&dQG$c_&zw%5N{gH z8oIpKdz;tFWzYkE8{^c`DRdqMN3Ro6AjAR(61N9<+Yt}5{8y_K)>i?P9%iE1fN+wn zAF*ZC%2@pop9t)@Enu`Q`c^j-HXuToC+Hw!uHx5gv)p5q&x&3>$3v(~GnS|Q`~Swfy8Y|# z?8{958)N^!;k3QrZDzmc>rblzPAdbt{pf4WUi}p4FWG8=xP&~$0fH!pRZfj8OE>%G zuk7}RzXg~4zcKdz=990T_x~^240C+~Rjt$d99>mFlx-8GyOC}Yk&=`YRzT^L?k;IT z8kP=8MY=^m8bmslknZm8T)KAI_uuco+RMF|cjh^BX3m)f*Y${XLd; zj7iCA&WmF%OXPoScrI}dSc5-Rd}KaU*WbMCt%mWSxkj8LcSN(j9goj}yHvXwV4a)T z6;LHc6{5~>C7cN))4-(9eQTe(hxnnd3K8y#Pg$fqEWg;Sqqn_jUT-&OKla(|Si1Nl z{1WESP+mgOQZ?J$;`vl3s$+DlXPquifynO}Lh-(|TzoFx=#VB(U0rXGaFHr5u8Z-6 z{`SNUH{B>T`g5M!?8;6{r0&M+!l`b@t8|ojzeGkDN@G#`eTWOXJb7N%{^W#m`9azk zr~S-YQ@N%_MJAK%@vs4mdYfkS4_&)yHNMBKblPIpY_%`Rr}rD(QMuWh)oM#ih8IE} zv`_1;aMx6rBP8?=w)S6NO;r*o?8y1_gNuHf`cvBoSICAm?Sr{|I z`b#x`)KvfbE}L7yk6}m;(t84W+>^gmHOt`3>wZeQg#_NCqkM`2P$N=!jP{2M^xa{k z<-%qU{C?@@w7ZyY%hDFr=wksW?4jaL*aPcj4~=N@B}p&dzPiZ&JU7bt^ypem%Eo|~lTd)9*NhK|LX=F<+0 zVNR>OLEFQ!m(PvvILlkT6_;tjmJ=dNEIp?osu&W3HSCGMWV%2iQBgpF(N2}wnjSS+ z2es>8S3iV9^!NJ`OiQdd_T}aIU)e30fsCck7Y+RxK1rXi_UYH5Q*2kmF0H(18-;4d zy$dAz?g=;~Ob8s_E9D${n4iwSnzx$qpICkxS;J>kDpaK&5Siv0v+s5F)Xo8sUZ-Hl zhZx`gmQe`o*n6RuE+zc{acrJLooqqQNACi{(bHbvI5vNszTj}Ne_I?gMb7x>PR zl!W5a4C@U>$pTND#X0jV?kcZ|U6iP3YVt40@qETpfvXsgH~8@s;1C6|p}qbusb>1K zp6+?mk-xlVG&Q?d9;>Ofiz*Nd9?0RY3*;)rW&L7EhZ!WdD4(?tzQ&d{8tj+VpQjpa zguiv-=R3%7V2ls1r|3vt9-jbeEgeQ0yvE-0XP1RNXJk@b-7>-I#w_sh!%_mtzoLLk ziY)TB_jKH6A?nLY{5g?@QWe?G!8l#B0kB;((=^f)>IaJ3HgKSc0{66jE8t%Dv&ofO zhsA;E7;k@&0q)*NRxZg{m6)rh+u?6e$PQ{PhP+ubaAoZgEC&_32lx$C`a>N;DqcqM zXR~525&E~GcTM^-yS+hadyd^vG_G{YwomyW(fRVuHfTtnK_g=;)sAN~CFNtiu-5nZ zP|Y!n{t5%LY}tKpK%zLrlCU?r)-mqT)%B%wI+Oi|bja5=wvB$8LjJD9yojS3`W8`g zW*@>FZT?J-3iN%0wd?iLU!I5}N^@pDb^hF*P7x=CMyuf50~B2^F(yL+2gSWc*${)%`cF>-RrUOY}eLhWE=~@gn5865lUay&>=1>S_HW;D0{)lh<*@ z(n-DK0Vr_oIJx1a%lv_aZ+YKQ&7PDR*K09OKo9P9d5`^Ry!dU8rCKuY^t}GHmVnHf zPH%5q>#k_9OEy5`_v6FKe}M6)?r}rdzhf5QI>&1dZEO15c}V5!J$^3=c>Kt>9l3&8 z8+=8&7y%Vd7H0RVm_~U-=YjeOSoXne@H3&AG!Zy^DfdEB{@buEggO3aSd7vRa4=U%>=!Ji#-@fL*xc1>*WL*BvoerKb!zjQt_?uOXp{g)-?XefQ zP8C1NdT&8`@bB``jli)<#ir%KuIPLQ6zRaY;`1cDbTcL)8Z6aXS|DCYkJK5sEp+qB z-Ps7uIaKDW=f=BJ2_=Kd!%~X(&s z4mFnsqWj1VUxLUq0uLs3znxodd@Z+|`qXm4__9H4F_l^y)YB}~(C`@Vc;o;|<{@G>?c35GkBeSx(gK15rg7i8;`!_mWYQmPldzJ<0FtLd{VI}l4 z^mB$=M7%cUXfywn7q$j^xax;Z<=n?*j<6;eej@*)V=9cc@rA$ z1K;ryqhj!nJKLP&%1Oq+8V?-}xhLIk+IqREQGQV;Z*$pt@_spaCC6(uf3_%Gce#yN zM?j6h7pHN2TRzBq`bY$TD|2`y0l?uED=ME=2X|W&k~o^UiW@P>so*Kl=RNv(YiI!t zt^8WUMJs8q?&DZ~Ym7{Jqwxkddt zQt1+WP2t&s+-|(iqa<#z8%(>5;L%RS*^u`oRsKDQ!#4*6xHG{kNv^mpAL`b2Cq4*} zc|;M|joC&S&E@`9%1pF5LpAJr5%V%)ryMniL5PP|)ol#|2bEq*LR$ll63t_3XhYMu zfu<>2r*b#b;(s<#DerRh!3Pl+Z?Mg|Nn{52*>Z=K!BQ0cR!a{%UCH82z@n1RE#@!fT~}c#;xpjqqn30h-+LJ_qUn8TDbp zisFXC(6qB!jgO#30P^>ucOC9;e~YB3PLlwUUjc^?fV!+0J4zC>QMiL5$LwxF#(|&Z z7V}&;WX;S345kxg$!%;c+L_CPS}hSN2gu*T6Sn)B-og<-eGU4b{L(2!Zuxy$GM^GR znnRRniM~qAFk*ZsWg-l_<1c=mPktTQE;Zuw%g@JW73XH@(tvwSz4A5bn3s9?&q=A% z__x6n=or%H3xGDkdw~nly7Dg~{ofhVgAM4jEQ&4!g-9zB4ZNHhK72+arm@EE@9$>y zm@r}WNnyi8*K)!Mtt5N%;$Jjkt3h0$^qYCp>y_YPJ3WY7?HJ*g%n!tV$rLD~VHzcG zNSfGW=6_AL-f;qY;t3uSnt5j@yYz6#5q~{c`#S_fCiXTbM>F@y^KfIPNNr*zU+O3b zbQ4OBNj<^!6pN1Yq?NxguOu_D=^2=8H@tTZCx(1TgAusZ@N&StI}BEeq%BG)t6c7qfYwyIP5>-(3obYAFmFA?F z)9YW-KzWZFu=>52U>7ESSreOn5&9Hwi2RqfRrX)_2i5-xqVByCb>8Y?@F7(b5@mBE zdM8SqjDp9i>}go`%KxA5Q9bpA+{pdBN5hBLCgKBQc#ndWN@yD7Br~D1LXXmsnwgUV zHY}vwk~G5@dROiDB>MSN5jzC2j-q*Rr&ap+SVU7DJ9B3@*b{zl z{<=Cd!Zw$wuoxea!5VWnKY4R?X@J;zTTPO#VRj?~`c8G>UVF{3E&Q{SKUoqdXFj?* z=DvLh_yl^GC|x|U3>2L$x*q|%1|;C*K4|9Mk&1I1e$%yy`n=wBY1=IL=qOtJN{(oJ z!iq87&4~W!T2#}-oPm2ym3h$f?dUB)wLW)hgvbaVv;e$QMY<87yF0|!di4%0P4I#7 zA8EISf1ZQw1JPA2pO%=7^$cT27VeL_S?7vtj+i&L%x4vB367FvYh`#-=~qLwCbuV* zp*7$~7~p?wcH51dA74WL1K(|Jq_<#oMJ^N+0_GhPTJNq!UhXzBRQg8~=(wOoLcgh8 znfg;W3U1DW|3?h};ra|#Uw>17TXLx4tGjCnM^{&nQAy^Rrto~)(s@Pw`Ve}6oG5h{ z=(N?lgn{UAxFRFVY0F6hWh4K6A2Z4w4SwziSDTu|d9h&11wIyy?skloLpT4p_i4fP zV%o|KqA!wkam?Q@e_klvATvM6|B?d4pheC<#G;6KaYBNa+qN%;ITl{C`xCHwvDnvL z6a}k6clHOKOA{!#3?yMQtV+iJl?$P0kE`oVGR$bpf+%Y!j@#qfHuS~Si2^3y#nl#$ z>mOEkAZ4yGB@OF!F%06E0C-!+9{f=4`$W1U0ehyLe?gBwrHUImgDo|<1yZ)|L+-3w zv(f*&MGh6t>Gp{lgyzb+kXLPiE7#-OF)A)U##_Ll0Vr7nCL}gJOoO>+SdJoli8y(m zC&D%xB)d=_!@qZ3%s4AnFyn0N-O!xRZVT5NT`En*v+^ex<#qE?H}N>X^?P^*2MqkL z8>&?mSDui|8B9OvFClYtb=!d6&C_Dw0)Uqq%wcY7fO_6!@Ix89WE|I$=>diLJw^y+ z(cqhE4W)aro*Y+|=nVR+@>J84s0Z;qgIGkBE4UR>4}-Y{7;g>}oZijD)(V~G9=Qy& zw_4L&{5H%^`lArBS11IKRc@z&AiNp6FXCa9jQ)?h!L9ly;#LbH9yL~T^_t3JO9Vdc zx!a0{bUC7+Lh}!G{+9W;7o@u<+BysSev8tBn+Z{jHR*Xv4hg9vP04~7DEk}WLvq`T zW4V+CmFfE|7*lMIQJkXk`Sxd58}6d`+=^AQ8@s~qhnY}fpO=4&Q>eKbq74JzJ*>l= z7&>k?%$9i}7*iH1E$=T<;NIq@-?*|*cdmFyaF zi%1IvAa{%60kHFg+d@QDH41n2dPu3^<4!6bAYRAoPh6s$c}4^?gnW7X4OSt@yP`Ma zYrF|Dov=HV3fenHIuaCAZW;i4b}su>Hi-h6AhTiksdi*9H?X@rvsk%1{kR)AbRe&x z_C@01g+vrrHl|a3qFX0%&Tt*A?SpBk1DSE&Qk%mm*}H)X*1+0efg5KGSRJ1yNjEcp z{)=zanCSAK>P2PM$kEnbp53TFP(^FV39!biW`(z#ye=CzBJIr9m!@`k73~}rILCCRoNG2y0c!uq33OEpaum)VWWu0 z^5h>%HIg@yxg|E^7L5vsu+j{dzwNz{uquKVw`N2*aj-=!Z8H`Qjy4%t`Yo+2wJ9r# zrn)HG_Z|HjO#l2&{}W9DgEyW9_k9el(AdD6a}FoS5xEkUils`ffum7e0m3u)Wuf}{$vj|cU^~sZk{{BX4GJ{s5QRP4E=;#^-u`C{qu2oY&nO#w-% zyWgrqxX963q>y)sP&+JYc>lgzSRB_3_J@0w?$>-F(*9x-9wn7*thkaat@fhZ`(w9E zA7Sc#|02o<`j_2GQm@3U3GYL~wuU2e@lgU6X_9Ms+l=BUc2M}3_%s|pgAOHdo(;C2 z5#UdLI(0grEZ>vdwMvq_zeEv?${-y5c&2`9n;wZch4g3uDvr*e$$*k3ZkZKIBTYR%WqV< zjV!mokt@%|*|uNoz~y|*uT#ujxc&`&YY-^=z4X56*0!LE!vJEbTdmbj6DY{5d++j; zW6{DDR3=1IvH}*9euG+_E&cn?{2z+^X>k1Vr=a_6UMOZ>!Pnl*6-Qiw&z79`O+XPe zYu62uf}&1N+10I(Ha0$QDrbjHT^crV6Cp=IgY`uAbo^)ZquPBRShl)rJ55`$Kazg| z>me~>J``;Emvfth2rbb8X(pH;O*X`(zfxk#JV38lsDzMrjg5bmG2zbh%jBOer+KFu z;XP?gGp>fnpkU2&Z`$@^o^4?F^9B&mE|x5SSX=5qdh ztf{yYR4~1{A$q7sPD03ZjbSCIJHyeDbSQE1TI_7L1WlFGe*bedD#FHmq5E{Y6Y?4H z_pXwK^Vl>jQGOCPBFDbx{`PCVh5bJ-CRYL6*vy_6F(pSLVZNN7FFhd44Ys` z57?x(p~qHiVrA1t96B^+Ur$$m(de}7hMN{%ehscZryLl^ZERd?xGF&ej3YxpQ)SnM zXjF%{Ndjw3adO<0f}5Wxc*oLmg<4*qZdo`%v0>mkj0c?XBgeljj4OQ%P2XpI&4J`} z=CuXADdlgkidHYD$O%?0&mos{pp z-?#1ji3V>-<|#&m3y2`Z)OQ4?GX}uhUPhm)(fjjOqwT3P=aXk0Z)~EsYiI8m+Z;Dd zs$D7H{+#D`(Xp-4Y|pSb?|j*nFkJCRU9-=zg&}`9&M(jlOb5+$LT841RHTHSyRUve z2ThRth%=9MM&W9Op_}0im5pIpaJO-bHgRePsJn*HSNdt;|0@r7Ph1zJkba)1r@Wh+8f2M*z~z%klAV(y zX?2Z#Ue8Rhp}X-%rC%TAD`)T5Nn#vejH#)s-RiD<-T6^iDZCxjef9}WMelW&EAPQZ zd5+p&zr&Q_5g^vpETy{#$m?o&I!QvxI=~7rh~3DwWM=;Hs!KVRErSa?o*K&Pih;dg zT`)NsA9KKcfSmQHla7kmu>EDHsW)E)XMO<0cCLQJZgtGhpnsB4dC=wNjUctZMc!=I z^ntkXr-+b*OBKeCIH=>Yo6v3vgGU*N&pS-Wg&$Y7yoq;%JLMRI{bf38-!4Vmuwf{9 zF#Tn9436YHGi_HL3M~d%p)PTp*e?q4ZGp3b*#c$x0qi<_OpBytzVvv%gp3*HMN@wR ztY7!_9sJCEk}fL{a;9;j^j$f$8&MP}{BEHqCinL%%|j*}KJn8^OhW4|<19gHUSmSO z9p*u9qHMO@!TGmjjxcc}X~9P?w@e3rnM;s+jonydP8b+;3U-l26Hv#>XWh068FMH= z2_A!UfXLNiZ}qWQ?;A<~c0UN{;byzJ$me*OtyXHP2z1~qR$^%Ria$)Rs2ER zMrV`Ajv9$i2<+UlE2Uf>dmQz^y>-*FFl3CFc<3*|HeztF|MOdLW#yLu^gUfy)O4oz zeB{)loI7JqLnjMfH>M=dWiZ2`w5SshU+}N)x(*Qb=Gt)n*XgAYVpQ2=e~-w8Bd`(a z2^XrYSs$yNXyXz@Vp~`?;!(5-gJ`9{zG>%A%4v?IG0>X3I}Wyzl;q|+g`~X*yAwc@ zdS-N^Fd%DKmc(q8g~P=Jn=QTI{1>JM&wt@9`tnySmf=QdNURHC(m3{(ia$FhAF-m= zJcUZ3jFe=E!%mmJGOH67HjdgO>(fbQor8%2QIWLVu~jF2t&WA;EY82w#lN9)L$>v- zg)u0S8zlYqMz82DGzdT$X9+~PJZk&MmE{VU-J{{U1adv^Hut%JLxhwQwS1ZvCkKk+ zP(C@gVpw#WRhvfM$L!F&S`0aYclpq+oL^#@cYl}{TH|Ra)dmhq+iFJO{^yCFk|)6G z5FK*BE%mTua|p(-(?Vkd|0Md8>uhx?(a-JsSLfD7mnhuBCHc{F!dbvD=`Ff+uQ2T` zd+fs^mELMk6uFc*_y{_lf{loOM2>C-08Zm50Ak8Ghp_W$thTdxfiis^ zFrN`fs6mifC5B;bq(Ae}BPCs`{#YK}o?4&5@qNnSI5pgCdH44E*|?aAcKVk1K`WMj zv1Z=i7-*}2kqAcJM{L|>f{wm^f5AcTFptv*JOsygS#WbuA{jclyjd7n72}@)Dq}*U z+eX&kte;|k#>FM;M7eYN*3btctG?A>!4#cwx4fJf-$~DyIlf&WQA?m@?fe~4>eVK? z@X1-=*~UN3=MmYOETWUWgyz{t^ev&gOi{l=LFO4ap)3K2FupFz5K6W3zArBJnuu@0 zj&h`38zK~~D$e^tD%9GNK8~#U0qDD66Q~!A9ORYpAip7>^frTS0X-{-VPnPfiX^*{ z=F7*jOwrHHUKbG0Bdboct>BCx+@J4BbQA~2vCnek1R}d2T3>24{a}ivnB%ilAEC;c8!Lph$Zu~w@G5jDSvg3 z9F^_4q|4N_D>f={Q*cf1G`V`_^!2lK>qZWpPy#1xhch@gXYBkVOkfRN(T>h6YBeI2 zHnwKNL|kJ_k%@zG#C~1V6yviQo6UkCnZ(slCTG*D_?eZ|Gm+OrGJXUq?xn677;XkB zi?^Hf*?`l|3qjqDk0IG6q4ku~$cvO7tgNB--{VLISxZbHMQsgVEJRf$2a?E85nO6o zB9W8awiJcmlvis%pxmZyNe56LUsL@T!GQSf48x1@cU ze#^3`q35t|IjIF7kmEtU}cr?+v_P>|SJA}DI7)8z+HH}g_b)H5Db)U{E z2+4boz*hd#HcuOvLKzvc!hGjvR#2}@efzVScX~aG6EwsQOPdN~u!Gsp7-i%9B@@_c z@AceUaCA@ouvo|F^%MyX=yLi(wnAl^G?!o1o>C z(fyn>{5uQ>POnnO2$TA=$>nX6=&3VUw-*6Ly2@RP?lQrCL9LI;s76K8q7j0fP^n*V zJ#mUCrZ4BMK-Zsrh?}nFUO6vw9E*nfr=+rsgwU%W$5Zvcx;~gGFn?wQ@W~0r6v9>y z^FK31DOaJ|NbY>Qks!vx29QcOB-m?A-t>Ju0Zy^k>0pTM80F(&+I5Q`N7Y67m3mpn zDvKZed2Zqv5>GuC(v5eS`0QOk8l?S`!sXIf4n|4MN;fxYYZj0;3}80*QX83En~zCg z2{`y@KfVT_ID1nyvi-2i4Ky~%e^Q;e!&&~E5-lP7`DOH!0Lr-f&pdfq*y!@GLC>4) za;Yl`hDT>z-0O-8elH&6HOsljDdC$8)H-Lbqh@nwj*zk-%x%*Tlxm*}Val@xNzvolX595N_?)z+FInbi+ zV~I2_ozSM{plne^@guT<3R-K`i#SlZFV_06)eL_Y;6#FH%N9lBSHfOoKlIC@)*Y=1 zfFA#raol0G8+9C>8(>U~Y8oX2W1a+3zc<|23CM6*9hjBs8)wYg=4-@S-hWwoHv7I6 zYs}|E>yb@cH8z*6gyn4~67pHkGUnJm0b3yJXMA!&7y*@nR~eDgkcH5XVu2g4tZJry z=1`-mESW#gPhR&@M z=GH>_r!l~t)O`m$nsK!cInNkA0dqFxSbh|r(ekIc zG~0~9%~tT?e|_WrYf?3l`&kvnrvMG3Q19K9L>F#g#B0%PUAdzf5w)4$Zi47JF^{uhM2jwT`*N1 zY8;llJ|9gwO|WBdHS0|Bd27#Rpsn?MOeo)|GQwqB1yvU+P@zjA<#zOAHm9+D&g{$A z9ZJ=?^CQXWvNwCESvcdyZalbv-|8bGQ??3fs`VE##5`uce$?8nl@k2m6qT-3M|?0}J0E4qk13zSl#QNpTa8w|n9;takraxn2=Q@6{i4r11QLRftqe9x2~ zcp|tYYUX;_DhFkdVU?Kr+-Z^9t4W!H`~=qO&NXx@(v#f_Bu0i8J9v`|Yx2J-z_iAQ){*Z>jf+ zUfXx+-S`m4##>Ba{b_&1)K6Zqu(`VEfDr-Q!lK|v^PjdeB-Ho}#CkaiRQZ_pP@erj z8OZs2ZHdw$#fNu7z;Y%bB5Y+$#o2B~>W5G1TtfMBq|CbDcU2+OT6HLh(|CZw%SwNv zzSxuN@mKJ(1HX{@i&3Hr+A#{k_=6^*`MLIt&e2?F$#nr;Q}+37cZ2QP(#znYCccoC zksogwqIMWMZxTMXPMjN5&yZr3YzQ^8TA_uRTD4WER(FA-pRp%43YWLS<2q|eO+!lB zT6R|+-pEU%=3&pHc>H8!WcES8G&u-#sM&&XSK3oqCp0~e0>kvu@YV71(U%=CIhYXt z9KM>$iWkxy3>2V8q)odCIZXNX-2{eo5M~-Feo#6y)@1yMXr!NlAU0jVr?aciJMh5S zl?6#6b3_pyM={?zhwaSj(CiNsxJtO+D-1VcyIaFZU3ggRL(|l$c-vyqkT`u^cX-0B5z*2VrnqP`Q!ak zXwB%KBT6b;gCU0p+Jrg`!~@7L=~@Y1H6r)B|4&9(odPGvnA~A+MvOe)FSu~Y>7$RK zroS!f zz^bVDvH)4#IybzH+a{ifsNZQkllJSI+>!g;3$y*ZfSOcXVkZtthS&@5&-5>z%LLdd z26HNE$S32LBrr^pDWKcY=lFCY1y`5Yih3;-&j=mNHL_IfM|QQkDaf11vzOe4-RQ=) z{_aXgrO{0&L-Jk|e5v9f_}EOxWFeQ6ZxnQFh-EY6WMgfQinZ?zm8k8${R;@E)3HeqIDH3>Z9gGECsM z3yh|jEVW)xY0`|Jlu493ciGTf{Y(}WdEsP%^ZW{nC(k6wlc+o_3)2j^(rlz!o9PPy zmp)nmrQ`K2DvcsYqpN`Hu-jtbfp{4?y@R|(cMgGF9mdi8rP^+bF?ZBnjAqK+|F{%g zFuKJI3fc+iY7oE=zryII!~Och=UkYR_FL7sV(=AL$p%0SpLoy$<0$UcPk{exe?iko zpS$K$4kb+K5@{H?=1L%b$YLyDDBBVR8KmU=nO>O{p&*io?;#`KnM6z!+mb zzGTVLsAGG`);4sJ2uF~~W3P5%bnzBr>t{*UOW|))AM!0+>H;xk(e9_lV$(L5KsO?E z#3%bm2fK%HPo$DbWC~#eNi-Iu>o$(%T&!(-@5+JMZfoqGEx|GJ#wI%@u+On_eWOHo zsh=76phxH8+!#vk?29dLF`}H$a_T1IRX0W2J&tv$f;&%_Q{34x7|(>{MGj`U4IwpM>AE&HrJBb^{Ch_a8ek z55Lj>HtzE^6MP=idq>$r}+G%Gifots-wwTD3V zoc6w%)%}}iJ)}iULVHqJzEJ%=g57H`>S+TK`IY=k+MLhaF}aM6NRExm0;tm}hw4d_ zRz}iz_6W)+Z8cREY8rLnbLY|i|)O7LG0)lR>oRX58Ch@HbN=Dg73 z94vOa{_=V}Ae9XX*{|AVk<2;h;N1EI%%=A^Mhlp+0>d;Y5tctg2GIqqEWJ-Y--Z`l z-q{h1O1)=-tffM~5XwaKgf=mwbG5aL!Y!3+1U$Yhu_HAV4_YsbM#{c6lu2m4tn*6Q zJ03};E2UOhp7RszC?(Lu1me^j@f@)9`dIIEVDdD-F`HlZ#mT*A^3`Q*kRQTEuR5Qc z{_~qtI{(AlO1BC0Klkq!EQNMao*PC?Jg9~%i867hLI%TDVT2d4Npg@gtzc{|Pc_iTT z_FcV`HRcA&BnqMKLAO?4m`<(wMsPM>O#OQiaE#by*Dhqj01Q~!GCdJsK~<_V8s6(j zZnJ-G(wHN-&}+Bn*r<_4R^q{qs}ex}@z0(zR}AfoM`JaAvs<{g|9-5v?3V=qIb+I` zy1KIgKP2kI&S514_=Z$}@0)rRtFK(kie_=sYp3uTf;McPxtoL}?dJLOC}J#|UXppt z=|19`MorpSY3vqFhk(I|HaOFy(OrqE^%in^?uo>I7CYtgSLmdf+VK3VF6{gH-4$^XxiW3-7%uiC=6~rHM?|-M^+`u8k_n97saC5R-Y*U9#|9Vs$fM+f9{ECjD)v^9A>JRet-l zy}6t{gOKePs6FN#ZXZn$2E=cF!0jYHbCm1?xFs@!rOQ7~7g|=?XsM*dj)w_eEiDbr z5sQzZP-603kKzpJTjYJ}IB#1d&c1{HM-esvjo>@5=s3L53{f;JIqhW|wP!=eM}JU8 zw7|4qI=n79!?wT?E_t^+@LEH!k_}7UJ9TVn3U`Tvr(&KR@qinVmbL-xdXtC4G8TbNW9zn(Z-a*j$iLNp{qv}+~xLFaq7sW5HNMR zFS!<>RYiU#Y~cBz!6DT?-sdt}n{F3l=V_fSu(Cw?Wi@`)#WTolOeOm{(dRU;dHRU5 zdlFI859i}|3yOCyuRGtVpfzcwgaWT2FS$cd2b*{k%=%kwg70pU^qoJ|?(NV~vxh@KWMB43rlPY*>V@jDc z;-ao2OT}x#8f$r8u5ccw%(JuHoe@)Z>XXA`JBAkNZ+UlDUi48wmoH)}y)N~Q=~ZZ4 z{^F97w7?pL3CYWj^*(=trrL2eupnecNV8CL`>i*=lfh7-XQ!lfMy@aK-xPQk+v5sYN>`oNoXD)Zqo3btTO)Bmt3~4zF9YoV5@FN(_9xAuoAWI+6cN_ zU+}2zSTB9Afo<0-CX)HK&o7Qg`5dzYOVP7Ygg%K?EYQ)UX!^&=*uE@AuUT}hJia!w zwA7VKD|TPgV`ms}H3BAXXK;^$tE-ryofXQ;5-w<8BzIF*Vj=ZhS6Gmp|2) zaAS_D@F+*PJSw4>>fL>xgpf332}HB0m+RM0m9z+IUNi21Jf|b}fV+OQ3e&nU&zD$eo~!Q!7oT@YirLQ$ zKA?VVXj`Titsz?{C2J>$tMGvz*y? zJ6+aTqfuX&rvyJdlNod#qtS_GoNvxmFd|GVT5Ys zw^O?5tdWU7+w8)OlfipyltCM8m9lKF*@yiQjYX~=XKPF@L*Z=nPtj+1r8enEwyJ1Q z4Qfl3f_BDo9Zc*iOVzvSYO$tc->#Rc>f zbfR=YJM~`YhQp~I0VwcO>iVA?ORnTmj_2Am5PJ_$k(>?xE4_t6?`$$Oi2Dl+wZV`e!#C$x%fR$dWLDmz(d~*lz~g^5ORTUR zF-CjKJ@(`#k$2R^qAbToPL0H z;u$Q~J(_z`>>h-iu`(z_d|oSQG~SM0njWvrBiF3{vu}oI-sUZj**RJ-Np`^3kMI*Z z=hjlbMibDFPcaMd2Y-pg!T#gozouT#{eglscPYksH-w6*nJe(J;LU6>=2-pnIvF== z1Vv1^T^aL;0FNDBtot}#W;~}T7kObmf&LBHH|p?DUlXo}W@rn$Z4)V1#*)3`DRXLb zZ6^N9hULu+35J!7NEtab3s0d}#6-T_koZ@Vc5D3vaO#G4p`l>Rce_?i);Qil?xHS4 zAYGc(H%fR-tlGU{F*ou#Qi!q3bwRqnM5_HNB-_|7qCXAdX2Vrhz`SdB?%^r;`YErD zu{6}c^Jb{#zV5OaY;BJVj(!i*zAuuTmHw8Z3K0qQGFMZE#$YL&W6-_<$#=T%NOQ{s z{~(CAHo%;D8V2ub!$C~rqF(sV_286UFMe5h9#FxzI^_bW%(+hFHz+P4w(;V~?`3)1 zkVH)BR`A*Et`>L|(VRv>)E@MB0tvjG_JV=imUCgtwD+ue7d`^cl*^nP9fDPP09)(B zM4}NAIG;3Q<_qqcBI@TLmlXcjx5H)s{|@#V4J0a=eXf>q(qJ_Jd)rb!c+Eu$F4g*Q zfIU78UuHLDZR&SV;1o> z_DiBiiTTz+t{b_lgecLC3bwRqeA9#s@X&rjev#IBT7SYW@k>pkv)we?NF zjyfp;Y1uDlmF_#EWGIyjU$^ayi_iF>^xG2}P97hV|787>lV6A5ra*u+cuS*PDU99t zD1-n`0TB)&jr@AQq&_RcNokE2fozJ3-jzQJVvS>&=WYtRVcj6wPW=vB@w6ku43%Ih zp=$h$MlyAgjhx;lU$t)}_h}&WT4o~>AM>g#Y*2C%R;lC*H3wGRA}Q|{lI6Sl1We_2 zlqLl7>Dkx`?(tDqgvM3~G7AbYwfkdLTO1}5O`=!&nfb0bl@=<3B;P51{BHLL&NQ<< z_2!(1-~+ZT@{0I#bd$($m0Vr39?S)JHN=MM^UP=#EWucbD|)&lF8PIj9UWyrnV9@E z1G|WaR3aY~0qeGAV^iCXN>p&Yt?r;Ng$%dIiswT}$nV&^UvTgqzAdnmr=+m+j>=zF z>l=NvVsL1=FIL5e;{55xbgmvuR&CMjxYm%c1n1s#+QrD>r>k55TH|pJR3L3grOwk% zZmSU&r1$KcM4HAME5HFnYu`>el@Q#@E$O_g={&~kMrD9L?XL1E^qwJ!8ixS1;d9b zf#T>#E;6$D28WzG(^{Pukb>>NTkFIJXF zZEd{zH8}A_+e4m4!KP>e5KLTQQg49+j==`r%kd zp|MWflp?H)Cn7s`d(1Vv2j``83I2}z-{H>5tTvC)3)+xGXT`u1E4g3YSAgI=Oewar z`EE6GTw{#;d-Q6wS zT_U2ibk6|N-3^0)G(*=6oOhnz|GM5UGvCiT`#yW!d+oJ42UR!ghO`b%XMCNEG0^o6 z?Blj|dUZ!z)6KPIx>&~X*k*-l8{Nky?{v3coU%>k6jUeoUOo89S6GIrcNazGtS^a> z>Ro#lPGQHgb#NfT%j|*~GtRn6gZTYwj|GES*HTue&40@nvi@5?+<&qcJKx~>i;H4V;*R$F6REP-47lw0?eM%ud3T9#`u4geG_l$4Tc(r*Z|px zG%R3H@ zR+&>rT#|3Cz%nM=`%cYf=R2@T!sfL$HrGdDE2HFWF1fKb@l!*lxX?$0LZ=TZ^}sP-NsT+oonb#N(BBMZ$jclXxGAJ}}S3 z=l&~{8mbX3*mkwK_`3Gh4p)RL7|S>cJ!E439d_!gCnUXYuj65+D9d*p2dQGyjQ%v; z|3rpWBT+EL`KjM=Cb3bxt1z;ue#^92KN~tnLlTvnYyOMnv78XD_>8-g{GFm&(PR>X z>f7wz9>3fsF*wOqS_Pl$TAyMvCIisgZ=(?~r$N#>_N>8Gp|C_6;pg0~BJv$c2H_X!9`O`BC{*>xrMLo(K>jLlk1+Z4%*Be>WXo3Tr^%E zrkou}?06u;kdPKivGSR@$9X;*hib6~%`%Y~qPTL#m9NXb)EtiTIes=5H#JFt zKz!oo$0xZ{J{9i7^ct)jN->?U+55?}(hQlY*Nqu_B0qT1ECQV!)Iy_cDEDT-qKQv#!KJUDG8z;E;D5Ia+Vs`O(~GSp9Y zqy4(3ADlP;_|*w&|Bf`)`|TV1;g*IK2Uq4cM>O|{cD$4XK6B`t;A z@$9g*B)58%_qPwrc@hP8MTjeE_^0eY&qt5SF-8i2fbemb7|L_xM}?R}}oOwEIrU za^%+Ej&!LvzLbYbn`#S4=SNZk45a2dbEMXN_E9NBCW=X58%5aFlr!?zz zeMD>nFDQLT&~>WmclhFhuj`h<&+H;BjF|4fQKR%a_d0xb;)8;m$?I~h)nX5V)K}ha z&t=leQRN4|OMR(C}`CtS}g8_yz4^`BCNfg7CAGc0H};cNfbf$XC|YAPTInC!WJ_kHUO+VyEe3UWHxIw+Z0_srpVHTQqBwv_VcKOgJOP zmp|n?DJ*|1tD8`J9JpgsdjbXXFnuYZu)!^PUf%y`Alw1`b>LwkWPx`ySp0AA*mC>k zHn89FMfpFC3lL&kdw_)cRUmml+m z@J?t#SBtznYz*d5)pu$w6v1PpRHcg}Xi=y1lCs>x_p8%IN4uo1vxD`IdcnY9K_OOx zc!X2a7_%Uuc3ZP9C&8Hq&u-o+?yA)@AEdLr!T--!!mwh$@lB}J5qH*8cJk#!TE0> z(ECR1iV?CqoH%? zUBR!|`f8;uQEha7a;lg=3(J0|YoX}%;DyKr-IrXN31<~jdG%NhEiej^tR`mh{XjBJ zSn>JJJ-j~{48&^(te;#J8)|&` zM>16JLy7xcnIuH@TFC3;>0xiuj{M>G%h+QH&GGupCN9aA_xVGDmv**b2u z!}h*W?aH$D;+izTx@XbQ~pWAa5_Mjn_2c8y;|?jux%8CSl+qxXv@b z`9MyGMk-=OG^MB)R7SkV!mMNCFjydM7irs4!MdYu@`?Z@bNt}CspL2AFqdqG#o~Tq zu$!1}Vn8a{ty|o)2sLw>ecHA(?ZKaW8!o#Ap@RmRAr{_!3zky&yM61EDlI7w>9Kq1 z;>5xXjwXXo;Dy#^?hDbDWLj%FMI;-pf!2>}ZFHvkJT^%(+EY;G#p>H3_j`lF$>d31 zxPFfd>!< z8JtFlNP1!*bT8hVD+iJL3ZEn3$yN!;b7g8boOzRF{3!%W?5m3h<9nVI5eSCoV-!= zj#?kx$39?Sv z_qI_pZeWSL+(xcXL@GQq#DHA@%Oh-RpoCD&In@34$s$eu*U=h=;d*XlokR=SYLCtV zJesP6EYI0GgAsCHN%ELSVG)wHnlg2&Dyz%e6d|^Bke`0*Gm6yh|HoiZO;vY zLRqf>jh}(7Ydt_Y;LHU?b!BQV^;nX(x~O)|a`7sU7;0d`F9WPTXXAZoclpd@xUk&~ zX~#g8O83e1-u0!*DL4;D(k;Oq?v_3mb3NPnq9~?6i>)Akjxw8t3D^ESY{uN?=4JT& z8Gp9*U&Ox-kL6XyQiy8TwbD3T{l4+_=?z}*8UMZ=B#|4SdAIH&-Eh^o3nw*wFn2_oLbVs>Qa;#9 z1SQt=XGb>;h|cKjpQWRmuiQ=E?fMK;L%aq9(DwOwEC!>W^W1c)fT|O2s}ACGxf{j! zj6eP;ms{oB)g=+1HcXu%Y!adxEFbMF=}2VSohz4&Uw(zqrBIGAiRpPtUtIqJNj{14 z3IbE%PpwnIt34+%fH>mf4E9s49H?y6;CQAR>Bt{dB&4Mku<0FpwN{E;^I8g3__&a` z%(Tr+LIp?H2g~7|oaD4XMz3|!dl6u@Uir+(9mw%@rr8ZWu>&XFW~i&#&n#I* zgYcKzU1}7oEK)G9NIfuzDc*NtGtd5BF_ zL`C0Nu7rU16%n7{4ZGSv>3=h`=2$vW8VhpI`L@QSesowHKHsrcJYAQfIt>|V_)18A zMe#kFOf~7WVJ6X>Rnd>DAN~Q^zA>PB!AV~F*^?UeG-B%*+f)~#vnvD(FgfJ$0V`TO zV||>S%c)CzL784X+?ZB5_!W93D%KN}+l}zNwU~Jhx!q*FT|KQNG=kl1MJwE(3n~Q_ zhN)uo<|1ifBg>Ve(&J=ke<^20rgW5*SCvE0ucT?Nq@>4omPb8=vHUo;PV9&)@Vlc~^=B2x5->rd1(Brl>Jt>(>i3C@xQN(g8o$@iP zj|L_dOpJrw``0`~jDzAnXZg@N1^J#NEuyaul3VAeJyN}?- zz@Jyiwqn3&!p)~pJDh8Gd_Q(o*Qg;1mXnJg_1*l}MciDs8%vNTaADObc+?~{rmKgC$p3Yl2O&hlb zrrIuhL}%OZg1L8JWXorX3j^x*%2HKhFa1CDPC!*E_J`Hph_vLPkyA4xGZKsnM1S)A z{hTYcF3yd)htYX%|3WJ)`t${PnS)iic~C&#I2rQeItY0)pXp4gSf$cliBzTfVyG*OX~EO9Ul4D zfPR|o*BUB4dEszXiTtv2x^%&akk>H;Cyyf8y%4|)0jDys*mL$u(nkFmqRh`D3ioaR zVFpt+V8(;S(5|DxybfQHC?=Zx(b1t9H#Z3*{F6kRmMl^T7TimeKJ|ITK=m*b37G%t zBq}=6Uf;P2F0_mmeNRVBz~aaiF>oCiMyR z6O&}@n1v{2iy(s$3}OAZ1-k+H0Kgdl!h->oy8v>WPPWvz7Q>bf<26_viS+mq>CT`& zXib5hiB%sv|M~0|C(b_2n!oC}fyB7Kl%i;K+)nrL#AFErr=zt3nx@$4=uqccaM-p{ z87V?7BC=F%RNjvBRX~(8j@^k_YS^~B;q;i_IY6RYJ9yC4N`5kSp9kZSDmh<$eo3kr zl_1IsX|jm}i4yGcmhA*L4e!!GFr_qhsqc3lntew;<(nz6=k$Kw>oMVDfhi<@ND6oe zBRMYQQ}=Y%dmT?~6x0sF2a`6^!c$>~sDY3Bq*7o>i9IgI!a zJwJn3AW`Yl!iHsUbl*Cs&doh__7jNU77#B6vTrv-Za~ZTjgm4>c|q!&j|RO*c5?N} z%&Rzkx#;O3ag!-0QOvJKl|`V!oNCy==Q#4%QjIH(($2?tzco?@np8w4r}mAvk(_mm z;!!r8Kw6e5X_FiXwKIY%PLm=`U)Mc89bh3xrV z=XR{aN#W@xr8aN(bOscwXn#`m;|Zqt&qyn&r~gmpQfQZ;-j zbsA}Ap)K9?V~BDj2oe4T>NZM%L@HVPqM6z5Vq|a%q)nI z>w|J%Dc{{rWz&wpjZv;X>mA<3W+?}Kp$7X|x4^HR8554S<}Q(c)N$`r#774^XKlxf z9;q@JsKGJYPUL9)xgT@5-Pp#CF>6)9;Rjs3`vyUeVvt>R?4%vZV!;W+6~f-At|&es zp1G2<>T?W(8wZTJYWA-tZLAr?6hB(y0WYHeyfEYQi17PCfU zq4jC@HlRc&()W_dlu@{ZzAd?Mz1?}mwNJA$MG+_*w!KWiC%}l5DlB3kl6%PBjrYLo z$h`i zq#~v%=`({>#wmlHZ!VyG+tzmMqc64g0rwo+cki*(nH~<>Q0#FO(GSx7{I3p|%Gwu3 zV-EH&nh>5j@rV`i=A>Q*MU?8Gyyn1DRAH{;OYb|N@!8l_a|`rVqMEoy&(iY_5MAy5 z^b}G)R+Sc_fOH*|qY(4A_*YyN_=G5vtq-XR*?_Yq(vM|%z{@GNTxGz3(WLhGu|rf$ zFm0JnjgJze#SMR-i0Hq#JlwF;^Fs+mf!AZLy6~q>mPq04{BroD6uX#s5ht?Z`kQ=x z{8AIh-cxf0_oP0W0-l|MaEZuU1tP0rWK+VF>oTVm*3fruHgbg=>jJKuWpPd)w&P36 zTlLKmc9keG(%g8rZn_m+9+tX{lRw8{8#D0|XPr*Sv9*1}+H>xgHe~Ra;nG&Wdc?88 zjQlMmcjU$@v_px)_}s%*I{m3Du3yd-vl(SF^fwcIB*hRH_0VwoFcSG!aFy$!+^+r$ zGpuX(U9+Ec(S~v{HXO*wDq(MK-wp=Pzmod#nS|I>iJ2Krw!g_LfdPa(pf1i{EuH`Y zA;B z`@QVJ-yaR|S^<=n_?VyEZ^&4^qL)LHD1A4cLONjpei!02Ua4!f24GnbXnZOHNKdKP zjbC4gX0R9S83s+wdk}+{~SB91hmTC}wjsTMBZmSrQH* z?|BC)eSCqOL(+9A11I)^noOaUAgxQ&MyyhL?%t6dnQKN*@`VZ(IFLz1fqV~-R8W5f zb?`)RY^H&YNbAY6rRmE0L#1WtZPL(gOZKCVvYQ&(o6lklIfh@fttt*z)|udE3Z5n)miH z8NL-OA17ck;2FW!23ML;vFo>Z{ssEi8)CHc;{>og2R1{Vt}6Oo5Y@~k3%p+;_+~iB zt@>SAq*ex>No9ABUTJf;z**>?;@tD<9L`2jp<%CDnAy?fNOky@13F2eH90$D9um8ySmkI zjvT}N9V_ZOIXvzF=zoWA9bY#M4Ag1*9sb@7S?XVpm{ehke{|UvC^YoW=`)qCfYK7v z(cY`)1Krn;w{vma-3g}H7Z4rf{uZ(`T;~?7FQ5!tlUFcWW$VsQ1Oa;mUIiGO=>GOl zy>2;T4rff7CWpp=VFymi+pU{wl*&`K({Ns*`f2_NcG_3>;$sV(79aO9e`}t6Ic5PD zw5bH03k1ZN?MhPqnbZwK!vJ2~RjY0Hdmgenn}xc?f`2tG1;^&CF4MFZ{_t0N!-7mH zhQ%0UgB8@)v{6tiT6PLX-umu;rGWGeqcUH55)6~Uaf_{Mi`^01M(KJ1KK3IeS|@Sv zbNkJEm=i#RnnXFOvwjONP{eUj=J)Tp+|p7R)U+)riyc8yMEXGj(fnMGnw7i$?(YXE z{sD+2^U&S;R`U66BNR4#aX)wpnu3?vzs8hDNczCALX@&8Pg_x1BA!gz@wT$FI=v&S zO%jp@cRqPxuDZiHy1H;c7Z~z*WwvezHt5Jv@M6L^Bp{@yj6F_6C4ez1+IZ4mIE-K@7UOmd6&f3Uh7@;CE z>0V<8u0P8K@lYH-LdWiM6}|)+09q}TE&-9qyTAYVk5b`O{55pbi`ozR8vqSZMIF?% z_=!<%L-_FIoN#Yq5pTy?$aL|VFn^jNSvvMHK}EBPe(7t}^P&nnZ-7^uw#w`SPRwl8 z9|;?Vn6J6k51Ct(d^Oa3d2ulvZOzDPd9+iW9^OBL&u%JbqZa6zU7OJ%8ee)-dZzbt!? zwC6TC$UJT8JNRCSS|nl@cpdJ~4nuW{o~&gPRrC6-E*64zJ{@tHB#3ONFr$VTBg?%b zGP?nDf8J3j+Ns3Bx41@ZctaKZzYRD0Gp~tSkQz;m7X{D7Bq6+If8D$q13mibv>MOy zZdf=k-OCu?o&i;s?sq^y+m`?z00cdzgaHkE2$+3`+P04K#TnkAy^%+)n7O*qmvvwYZ-5!3h%T;*n9GH4Bhh!%Q!<` zLokr`SCGrn3$}@*#pLN%smm}P1{y`FCoeORdVjgq2K;eDyTm^LUr}UngkW(TXP?qyjGs4b;*g_qoJWH;FhTdpUDdU7CL^j%Du>3Xj zGueNxjeI6apYPo;$!-V`$FJctGnsApd`~8pu;ULJZT8eeZ|YahRH)EjL|L0l$$k`D z3!{N46KdsUDKW5~TRm*+8%Vj8U>%BZYtOJ9__2523bJ;gKMc){?92sNf>Y5AVo(-m zY=p9q)T)h(D1?8eA`iS{K9Ki?zwa~t2kY3TQ*#Klk+c1mc!}(MD3T@qJ%d)iK&XaK zm1#NGF|g;4l1_$!fC37dI1NqBn&O!jJA2B#frNM=2MG1d%T5%tUeew{AGtAOIZnFw zXWzNjZt>~yDt4xeut_i7*wcCm(^vpYKL!n514Vr?XTUiivJA{M03lBv{4dc2lUm1K zd2pjAVizYbg=xIu|HZv~tmLgfxtYMw>jtK_K}Aj=$kjW?p7D}ekkhNT)>w;ks*{gF z4VCS)T*x?fefYqDDh<2C{1t)y&HX@E|1Hrx&0GW7v|qTxvej>j2v2zuW9tjV-6yZ+ zxeL|9{@xfPpxyHr;{aIm(xBO;Nj_2ySzlT%+{*&-6L{`<7%k$K25dbSrC33oRovnDJ z_caAqx_+acvIJ}Kx|+SIlCY*q{_4XwZC-IRt@k?lK3D3m=0RnNd)VoxTCK_H;60ph zW|<2W~VtF1v0L)7*eV42JEhf%rE^8Y#_r?HSubVypgF1-lDGOEE? zGCFGMw?p%F{8^s-9|j<0AyfZaCD|zZS*beoZ>FQehRLWr5n=MniwRx%{FjeydZ}xN zgI@+v$)d5mjRN(~DW_8{lFgG@C!@((edxbz!Q8sP6N%V5H(f92_Wh0(LbGux^P{%J zKgk!rGHEbp!2KC3YF6K$xjn%gjyaF&N*LpC`yDUFiTfFaX=_J9$317Dcbq5C(1kxM z-HkczOuzR=wIsh$fsL(zQiZuS&*NV)<5Py+$OFGFd?2FgB^G5O<%JH?W{V7FLT34c z?yAfichbw17xrfAB7-oviiL9odl-1vpF+9c;PLxZD0t6b`Vw@2n{H!6ByQMZ?HesS zhtoFB5Hm4$6XmTtn)nYB188+d*iAYB;LWQCv-f5FAKx!Y1yf#_w{BqBYR$ySrb|v3 z<_Ic6xQ7#j#wW`hv&7eKKTPt+%E^SYiH)=dw>fOWJTm`TEVPS34~ys3Pa|9e3?P42 z5=O?e*rXf<3vFn~uM-DLL!Q>dRqz^|t*a~5vqe}Otj?jB&*D{Z+o@DiuAZ$uTSk$a0|*hmm4x{jTp~70%?qtp#EsgS3S}_|n@-|;2xgwV za?Ks~>ccHxMuQy}^b3gm+iPg33q#{(XcXlKYmPy;jp;#eJ>OErt&9`sm8VNU$!xdu z2H37B|Y2kBgn;cApjmsP~G6dz59 zHR7sObw|f@h<|zc#<3i!DUoPoH5xFuo}zDobPMb-HicaOvLxTkLd=5Z8T4bWMBBxR zy<9b7QG~I`UnaG1w~gCY7Njg7p5bkucrF#5 zyOl0oLx7ul019gcxj-M_E>hS})#2AByIX$ste?lLd;9gKJso==+0PUYxbz4N-p3uFlnQDo&PUxe~dt#krgy_)C`XNYBa zVBZEX3xl^}hn}=~Kl(nppIPc-2g|pSG46b0+BEBwAe||kU1OJfGJ$&Vy{+RT z`}4OSKX~}X2ER-h)AVH5b`(_g^ZTLa7U3)GRgjr6^BU_;pTWT|G}U7J-{O?V#9i#c z#6wx(lXGZ11X^7a(YNYvFRj@ceoK z(nWvscWdI`p^TO%=kbXyhk3sfZtRKXn{1N`@Js>~`x!gZ9~-S4i;3Xru+0+O2~iDI z5bAQY)XR_CoLB@uuGReqX7`g^Mk{C?Afcc|*)k#fATl>$L0aN>c^+Ngp{OTP;hO%HLsze-v9u2e;rcivv+9UkVMrAd8$u%#rHKAP>M=@$>66U8vJT~`{3?`v?8&2D&&C!)p~ z-G;GPRGJ>P82*-xqq4Pscxk@#$3&5C_8Jt;W=NfLXU4Ap;_FlX2UF%A(>L(&z7Y6@ z8DY&3<>*IK{QD@{#*l>(<2)h_bw78wVO)234Fg!ZN7ef($gSry^zs>lFe3j|aY3J& z_q&J4_%3o*GB7LymFN&@Fl<5oP-{__T<061;P|LAXK~s00(pt|I|1wJqP~YG8RnTP zYnv6N$J6HPvr?O)c91ZA#tk0pKk(tb{mKB-6!=`w?4oPj9i+pnor!$&EUh-;+o$I~ zsTmv^cDhT8{@}+8FeteT;Vd3h41?`Mwx&BNjWbGWaE7zfyfMow6;ius@$$Nk%pm&1 zpr(j7UrWT0Nnmvn)K?h)f>d;0PK*RK@KbifJB#SZNtp;<_*#ma)+nLpf7>&bobGuh zEuOvfL)YE7fp%EpaXDnD>}+8eF{kCIgES*TO4b^OL)vR+_=BE~gBA?h5cJ~C>+BiS ze0zQd_&9abUIO))-(DF9woLZCW?aTtJdJc5>f+34!WY#3@&q|}>KUg5z2(C9T*#Op z!&?pBQU_^UMU7EnN=R99mlW3Ptv{lw>htN=pW6KvU~UFPqE~D{TtAOtt8QED3$!*N zN(7cmBIL_h$n5v6{iRn%KOwZ5p?+b6JazHk;%&MkHQvC^klBata@vQeiFq)u66Mg| zaU}}Ej>UUuZrW=H5_EW~2!x2ujq3BZ1%*oZ!-+~Tsc-jc?P?_;<-cp{_}e>Yx~f1c zN(H754K@i_)KOt$gRoBr7b#4Zw_H}0Aj~WNth|^>@{uiKu&9dAPQ`J+6YS)MtLtTL zHUnU^)k<9(CxGlE%{PdpDr@DjXsGwK{>yyiN=oO@nz{rJ3>ZGP0H%5Ym!`dOE6ZTv zSM;#FH;KICc!9c#kgg+lWHmR({_|9d^8KR7GBKsEZ~ajaFQmU6GH6p~SUW)GT>1rN zTc=}|j&5PObGRZ`+0lZYT_PH2ekc=pQ*d>nz^OknANxjAK8d_D-Rl7yb5cb&2QfPa z;Xl-A^ISI032*e8h4p?6(S$)){l#}de_gn_mNMF5z~U^Tqw%Tlp}hnNp_(s9FBuFK zbV@G-9Quv;rbO|6wZys1er%W1kD0b$`>=!)qG!uCzY=1t@1<5vf$JsG@!UZ8CilcT5DEqdMG(>kAk67EuIYj)Tj zoFzInE=*r{EQU%>3w#&oGn-uGH7&dd(_O!~KE)o#kQh7XM#0Y%pFX)Iu3)X%r{r_; zE%Z#oLTSkbReahHji(OR=MQPBw}2H{BC77a_2({XCb0?7T!=NRupgGKb=;KO!vW4( zuB?ZHLDPXXVrc_6&$_0wCfCGiD_3zD|^Xr&ztU-H*=27F{h*%2Qmi12GyVXFId@d45X!dHjvl zZ$UM`VkQ;eJ9k3eDfx!f^c_NiOvoIa?`BE(wfz&INkiUkr+70;^>yrZPS8O`$$`|O zxXFJ6hkI%MV1b+q+WTk?s;4JGV`bv?Md>yvHS?@Fb(bXie4B;qH(%OuI8<{Fh17lj z?2W#}cyyey`4}!;|F)y~pFFW~bLr=|9xC4+!i2{DC2en&OWgWMQjEz`41Fkg@F^|* z@q^tBtr$HL>ANb&$UZ8uOQH4TSfA(*_Dr z&`!UX%35LDk3i;ZYxoO}JmV3OH+#Ds6Bu}aks|HL(IOJ{tVAV^d9nSqY7#@0$2R3n z=^R4C`mIhFiXL85h)YgoTz8rMacfsyWe>t;I#sCg7pa~+MT{7F61W;7cm>? z^99W#SfFnB%8#?s>j(qA(TFjhzU1ilQ2odDqlkC9)H*U27)-~fbv&0x|Uh?hvQ zMR4`ux_Ib>nx2JQKqSk?P<2I81LX>>lEvCo2nkeNdm*MQ&#_$>)s(douD)z&)(z<9 zhJ219QvyuKzV|0E>kAj^lkoh`pG4=Mz(YYE=Tk8zZ|4H=l6m89(`!=?%?mKD{CA}%~GA)4nbfl43`+t#~og13XE>C8-3_dWL z1@B+ZF)IlCYydxBK>bz#g5hwR_WrsrwBG@JZP?GG&>J~xIJ}*GXl`?AeHNkX= zPg4>}?7ppwfWoTA_>1mN8e`k|?h*(jx8k|=cm1ZK$&9`5IJ3Z}OiTKgk$d}u_GeC( z;+?^B&H?yIw7j2q_P6lth$Q`94Emf#vBu$dSMeTx zz$rmapovt4d|ls94bcq!w$3Kdly8=JmfcjDxKKG=D>`2M9gPup5T5=A4O28-{*$*ynF;KG;5bWw~^cn2Q+sh7xBrqJ5flx!4SC zh0I_7c1^>f$a1MkqLZ`q4VHEj;Fb((J+6PBMi%OzZmB+Nd zEd3pCa7zk7@5&0~aZRJmie#P9^_gQP#bXIPn*{R@%RuXf6B%SZJAY6Cb#>m zhO$$$M*egyvy4%CA@j8Qb7VN(rUU{!j7m-t-1TZ~=|VxgzB&#FuE2Q^I6~lwV0{S8 zs*b&Pfl^7=osQ8Z{_i9vasMLHr4d;L>o398XDO`KC}_jz(H7Ev62I(+~MN@PEvAJh7HuDS+RydF(# zh-`FWr)f7{6fUP$fC`hxzDVc|lkK|?((X)qUm|!BMOc6w;?~gx=&KPB*bs3YU^JG> zQ#BevofDsz@zT%k_PCL@^D=_w(PDZvWTN3{cL@xT?U%Qs2B3l9zgOVGP9e(0rVrUa z`3x39&$FEWunO0aPd?AB+G3xxFc9q^Nl&xrK@2@agYZ-$o-HW?&))_{vd%whnY$EU-f&t_{@S!Y67L**EjkCWedA;|~^m|?II0}uM&aO#*IAS5$L?_Fo` zPXsRyASZNki`RX^Tk2nK-bSfF)xzWo;l!KtRD%ah${k#DEr8nj6<-Ju-UC|IFHV44NN!ad#7Y@4eb}q9&wGFE1psv$Gev{U%E_ zX(safM;8qz(ho7wyp>Z22U@d;h&y8Cu`=Nd@#V$@Ths$05Y0ulNSE2m;v}tT=r$)Z zW0mK$_NfLq_eu0~8GEtqE*Uc3+iP+678mPVb?A@OyMQyTgKxUpTbM#O`K#9LE;Fx1 zjIf~$#L~+c&QT@3lFLrRl6)p;W}524_a8?jvrMQ$%oeHD|HM=HzK3Abpr+F zPuf09!u^*+iXS9zz7_9&u&v+zh$r)HLfAcQs=gfV@ILpxFY76l4dV#UlY#j6j2#?} zNH)b_6^nJPni|8GhHDBr8sro5dh7+vPXK(hC-U({)y3`WlBD16_!0}dIw>c=3S`55 zX?KMrgGZ+w5ZtFs z#(l7h4vx(E`QCMS#Nja_`5TKaW52>=<4OC%RRgfp{|tH+9>S%oHt9nmRXmXPDU>q` zW9jRVY=O!w=TCm!-74Qq9S(Gd&mj~>8EHS3NV(Xs`fIDwkXjg@n*^lbbW2L(HWQlx z%RGxT-^fQKFLdNCbJGJ*=;T2jQsJm6ND|TlNz2l%rdhCSDoH!DCpY|OvrzbZ3GGo0 zTW~#m?SfDgqxcejyBDJKd4~&5GZmMcMI+U+XATGQ@U6JQrK-Akss97On6bh za1r*dW0%n2&7Z{d{3Mz_2oqfFd%GG2L4Dum6ccAZ+tefS&^}$#@1zs_c9WpBr4iYc zX?V)}AojL&tIA}dkda;%O@0l87DHT^M#no-8*yPkMtqhm)*pYtDH6#v`d-zK7ghWn zM3~n%R5S2B3w$&-)4(M1hmY@=IX4{yo1KGbK_BmMujTWSX zO8^DhyaErinX|HDx4B>&*4YE;{Q+C%jO_+F+V+@K~tEEy}ss+GPbGF*Bm zGl%V`2ZG_dv?$y0;Ir~12ekMv3{1c}KKz^_@9D;~A3A9%vDX7gJXXF*NSe`+&q@W4 z5;RWhZbQ$htcE`+B$(HPkIO_u&!v+1GqSSn>N)Cge)re(r>i^r*j7|3^G-}y`MhXx ztj!`0kd5z0&dqtHi+&9iIXQlY!Sl7Lce}LccN&E_-C(PK0N?lDb7wH-BbN%$)#$z# zw4Tyj5}0z}!YL;ELhN^$oqP+{UnHo~3kQjOD*Cj*3 zM0sltrv0ats^ZF{pCkyb&!z|PKlND@3A>HMitKL);5Wo9N#|t9OvMonbF?fEBP4KW zt)4C5aK3eotiwlcY!7kQyzA>f6>>M(csGsyj}-p?b<-u`b?Frvy_9zjuZgB<50M2} z{zb4ly2d2N>+7jh7HR|&9O*|PeepTSn3xa*zp&Rh< zwglz_5|iKTAo9tu_k`3lF$m-4Y_z*mw*V6Q>d+q?EiJ+F8qK+SuEE&hlfbh2Vs^yn zcSi3GHf}5Ic7m5B@`9Df4vp^21rB3-Pm^=L!#M@mGfLT*o#>7yttb-2|AgZ`N;>xU zhC!y2`?M)EclD=b%%O}H-hnd=HhiVoxlfXZcq19c=QGsW=vTTPC$lZw2lB(5D%np=5#Zxe^l%u88?= zI<Y4pN_#8|YCnBG4(_a8VHrGuP1`;R zEtUHe3LLNI%tj|`@+2N*Wxha@?{3icK;_+n`srn|H@ZsFw#{$J1{CU7bf>vXX-y*s z*SN{(Z*%**Ejy=B3>w=feBJ#D2J$!$%nx5Y`J^fv3@O()Nmgr}@+i3pX{e)~@ zP=Bt{6HkVzckg!bL)}3;cfN8yAWG@2j<>( zdPop00<<*%5h{i&a)k&`JG1wOQ=rmiqi?5k0CKl>3C;RTMOFz-$bVr>u|*H-AMjy9 zRbPJ{u>>(?M0{9D*L?YwUs{@Pra$9Y=@V{udJA=Q<%sm!-`2z1dh{jL#y_$zIW=Y< z+~Oy88i3@We@!T%M!#?Gu2KQy+mH{r$AJxw`KTs5Tj(Mqt^X6vnDsj#{tKA_LhOWI zbMV*6QdBgxeK05+djLgu%dHrHbZkzzv&WG?l!i$U8Iof&fYsT9P*AB=2I{^!CG{RM zH)${Yb}(r75meh_lUIE{;T4!>-Fb3O*-8MaO-L>Ar0Arj<*pd@H)*AE&?@Zz&g-?n z!?`V!xvi!JO;C-yQwOolV%qdN+SIdPc3~5bHNWki*uRq@)O@0tq!R6Gcqg;4&=?O0 z$h}s+BkQqIma@<}A6EV=V{poGv1ExGlyv&gc-8euRC_rptO<}(l zBl6IYIwP~%9o0qp5ThU7l5xEs?#m`}EJ=v|H_UHCcNczy7Pi2WAAuZmg^NUkjczry zU3{%fqezR%B6eNB(i9cgtDm&lD?xKF-z!OU7c~mX3^jL3sl5Go?=9GwOCP?9kiJaA z{x=;$JkC4+F+g_7E!RY-fxF;PHnICf=wpu&&a5r5?XM+XvsL04%npgV8*TchhyO>@ zTlhu&b>G``cXufuUD7SxCEXGOO1IR|CEZAaba!`mNlT6h(k0EjfAhJ&&+|8&*EwhJ zwbs7&fejy<(K~;p$-7QQLr?Uv&K)x!#~X)1A&V7NKCdo;#*3cDb4#-p^Nc^%S%Io} zcTSHB1zvT0Z;wUduALTDl}fFBHLp}JL&>kM8)<7?+7D>Ld9%3wImdR z8aZ|cTLx#}hGx6C1wlBexxNY-p$A#Ti==K|#QqLmv};9+I+|VctDQPSM9BJjn9>@c zDfD;2f2-gxEt9ig5n}L65#2&i-kXy3zgz?nE~@r5mvSUI@llKk#M@-kQ#?02M}>?m zIp$N4EMjDLBsDl+`fKy4<=Hvj=#U9seDU|ZQRq#XYNcU$>t(&quIs?rCfMjMUnAQ| zn?TqwQVFjkf~PN?q5RFw%@232(kEJj&nVc*FqW5mZ>ZP87nv>j*E=hziB@}f(N!;@ zHO>RCtRI+QE2Is$jeD4v`oY(Zfq*|gCLuuRVG5QOS zRT3BJ%eQwKnJhlshUjK7@d>nptR;hT!YQt)ESJAm|GqOUTW&gkG7Rn&fLvGQD z@*5dE;Ex}&i4}1&^)kp%i(6n(^-4b0uChK>w-dFj3#k$767>3Fqu66oP!>OB6l8_P zktRngqfyPs?cUd=qMN~0lJC0HOtb}$h1mNc(oDxy-7?@{lh=AY|H8d)RX^_$tI6p>LtEgKwu@bXOb0)EkthY|OBUoH@* z%pz7iSLCGwCTjDIQ^2(;?J&Wm3jjKwfHnpI_Zvx3({~;vx>8mX1Q%w_m{g9a+SvZ9 z(Sw1d-X|>8{4_0_NG$ibrh1aj)4K0WTd1Elga7dCd3AZ~Jzd??#Cj=5T#r zC3dh?=4a1B&f|a@m^CeYZ?N7mANzz+oksKSlsKPy=PVX|x;BW9-$T2Ms?>VeJ$L`~ zQSB!#RY*u{?B`=M?T@#n^A~X^U8DhW7Lw@kKPadF(4xho=lk*Yo9iLGGvr${2rd$d zOyI@p$XKt=3=S!!?tQq{m?(@ozY3?3{2 z9p!v?w5WQ5bs-)?W!;Z{5IJpoocI-w8)ZsER9#{BA5mKZ5<8bPwD46`&(3GK9(86) zmfK0xaGfbN+;#eeE9OJ4z9Zni4qU7(>bhzRqI$BKzG<+I9!s1=o0x}dTWulEXig&T zoi6Z;4HWdC(TPhf_facZ z)k$#FYt+D~$*3Ii@ME3bmwg;JcnBg52H!QzW#&r!(+@4nU;wD)`X!GxFHQmF(f)Ji zucUSQT)_V&M&G;wlt}<4I^68_(T+nkK{NBum?Zs(7El=bmpHhKr-4pgP0oQ@gb0_P zjH=XF61z`WfyA&K-s#~HSSKisR8>UDY5O|zi-C!#tWC?V$EjaUp=q&!_Akw+2iHBC zcd!7dfxTuL9_zPSu|>q^fsHZqiC(wt%JC)#RtYR@-db{eJ8VOdx!t4>9+9(OMpZtD z<`{mOI!wgUWKnF2#c}kxR_G|*VY!Fvn;UQAQzephHo&&i#9_Q`SnR3f&7!TRb)1RC zzxHN>Rt;E-VNsn$1u@J^l5|)lCkjC&nNP0sQtOx$qvpdM^|DtPKQ3cv z307;(!DX*H(J3gVA;v~@YJHhMSS7rz z&^)-o>W^{`@#(8y6KlCR)!~J)*K}u*1~hLB$~Nj*@-zXg9Uz|*2bdr zb#nJ@AIn8en61HqF2~a95TmR-L`aak@lEp|`r1`W!t!ujOPjhZAtUZP&zwcmrD{7@ zv%+*gXGE%+cl=^#vs#JKzdjl%JF&-F=_J{Y+JP%bG?hJUt_V$tVu!d%wvj;s6jc&Z z9iP66>K2tNKWO_JMZC`;*3hB}$^7e);{-yh^Nf?wpXfl1dIO^I~8c1*;b!ODXNBsrQg zX5KX4-VVXWP@Mm0&~F#Lg0Y}G_n49?|Hd5;j(u3qf!pMkt1?u(ZhXzNK?Sc7_iE0GW{3tMc4)H z^8q2>{2gDITC25brXS#tMbELtsr_g#d6+?I^lw%DP+cdwp%134jz z@)sy=oO2cWy0(b1X{}kPe@}VSe&xZ-oIRcG&Rto**3CR zmMmg*xvMV+JMv>lhcur(d_*bA2|qAO9eHEKKf?Lkz-k z9*j~xo{gyILRca%(tUKL9uqLKR_!<@L0{h{Dt)2DLna`eiM##_BxfHjN*0mqxV0|n z(<_2bWk21`kB$(w? z;X~_FU{KkKWl=8U=Y{KDaAy`2~<@_Kr`gIPd%for0lvAMWhr#a+9_Ox_rVNl82hImJxVszyAYZAk8)@i*w zQvuG^ckJ)EyBH+{0(6gK`~+6x641@Bdm%#-^#Dwh4$Hb|dimj3>Ro(Ea^Zq39UGM2 zeDMlt400K?Mi;T=(pyz`KK&R2aaIz%pbWh-LCKY~yF)w1X5PkoG^Z9RIj-6$Jh0Ra zQz*>tZo26}mdJ@ucoahZrF611XWybF7JCu<9+eL?$fRaveQ@gth=NXn?xU^=fap0i zyTg(&;bb^PTdnEJuX>9K{|K)gh6a3DuFW_2Fyh~Ledw-Hf-A{D5>Hs26FYwdY*)&@ z^gxeK!Lu)b(|!^{H>jC`)HJvk{-Z9Tk2_kbyY7S!@i!L@ePdfI_Rv2l(+pMV(Ng1p zi}#vsIeN<#oyORqAo+b(JNa7`*&S^C9Pw(!}Ct->f`&$WjaILvg^u@ngO{0uW#4RHDBicHS7odPtew<3AzU(LV-A# zqJ0dVjLqDd;$@3p7RQ$#XS`txVM94i_j|{4`RJq(>G5uIUkW+^g~ZL%7PbSMvnC zUP;tLBf{Toou}RYL(zy5-rCl64w*f6ZPYR4j&}SCNW)Y}DZ??bGd1c6*Jc%Y{j8lm zcuoGG!O74N<=`LnV4h)TaZUVpn-$uCjig!J>#J$vI?qFEu)Uon9`EH?leN6s2q~3Q zzAlA*IE6JYo=2n>H3&s5PjEj}1f!`PU-fZqZsGv{%fd4~5Cj$$t0x4(dA9Ht^iIjU zFyW;Th&RQ)J@lXSbFHa2Z^iYGpMg|UO!h6nM`emo$VSkpD1|<(WjE{(qLnV(|Lyj> zlJ3jqq>FA6s5v|EyUP*1lo7x-08F4>tJ^5gY-XPGF?|pbj#E#% zPN&S_I5gtJoZtF_qdo-8SCkeC>{x^0Z1BzI{0Dm=MIF-zi=^g$4&7~{1eQ9S|>vc}~_C02{$v^wK-)R08>xO5KZSEFP7kRkhu^(p1&-2D~yl128t zzZO+Ov+LyJW(JYgH;vW7Rt}41q&O30gE%GuEQv#vw&=O*@x{$uIa=6o!b0c@OXL_& z?E(+05-P4_q~Z?FfB0~#5BJ=Tg9C(`W~7JL@F2cDRhvXE36(>h>ZMpQ`Yv4&q6@-G z-9r3xa7>LX6H`lM%o+r$nFM%&3OQ@RWOl{v2rpv8T8_Bnq9 z|GP7P9=1TXQJEr}z%gI*4&T!|pxyaj*O7mKJz7s6FtA|%DDnVo98P5b5H`5y)7*@| z7i`6Ei#_}K`p5Cc6QkI9O>3M>2M0sAvxC#g(--pyG|5R^Y3H}|F42s2yN_3D|CU=_fe2 zspDHJ+>-*0gFo+(AzHqB-@x*wH)Ko_y$a#%l9d2Q`>$~4ifqvNUR$Zebr)wNNbEWM zp-Gx{H97nOkCn;sy&;C`zVM4#D>{`$6%b#p@D18LA<-4IQ9pXaluQud;Q(dxDBRwD*Klw7$vh9k*y(Y~VY8BYwd$hXt?zxb#xSqb)HX}<`Xza7j6oYOPC*o*GWPb- zWoYa&D$aD)F45h~H&t3-ANgv|7dd!o%hmrEVTTqIhHGrRNQYOuDIwTuRkP3+<$Qqp zUfZ_fh|?S~XP6{kt8CV;b?1@`$)v}?sD7z%xdy?eHU7g8#5{uq>wF>70?E;1 zwiiWNF*jJ_yLeCID(NpohwzQdNa>ZJ4mfyfVJq)Bsd5F9FOhJQ@dM0>P0OEN{}mnN zpP}LAaMeU!ukjxB}ZlaC^zx({A`a z`HPCW?O|vdjNW(=J>6PoR$EZgBn4o5JJ>6MIHh;OnNqMTuzs?n z9VLU=lbGj}0{s&7x%EWas82}RpBS!xNnYRJbwmb2%GE!n9(d)DEzQjRo~MWZ8@)>mkL z-Ap5qIj;JovEl8*OZ~+b>u+?kRk-OCQ#TqV8(Hr1INP&S_hT+amOpsZwd7$5y)w%v zaPAC02`gZX&oKq({B0rE5f9sQWHpf%yj<7SEOjrZAIloNz3mNEuJW;<0pf-ul@aR; zRS5K4L_X`D*y=9ZC6#gIBbGJciLW@z#as#rIdbGpRVNmRb>{6jWVff>x--&dx}OUk z(No;!Az|HHSoeOup0RL&)^~iW4SS-IK({AqPtFN%MINexe(0U~N~*GOv_i@P6ctO) z@(c-3Z;ygcabEqzE-##44rUG2vcp9H-E|=I5eVh7#VbIoq@p$1J1=W|fO9>hw9s|8B2idI$q zLHN)t-Qje!gh6-Qy2LMpQ64ZGH+VldWpx+<+F{(XF=not_ zPJm06wg82k3#jCAnRgKY93KD!VS5d{ST@CPKWf1lPV&i1W#OSxKOcB8rCE-i!#>O* z&-uD)pO2$U(ifqn!zDUy+hzd~bB0>>U@XK4D@GxtgK@0VpN4ZkZdFsc>1MLNqV^x$ z<|4_=i0J1@fA^4ACZ5K?4Xa}twe^h)N7W*BQVIl=v=ik3S3;eSPlI$KU$!G{Jtoq7m3UzBG5DLCvND|?Tz^Ra*hxt zJWn>)mA-BgrWD>igNEDzGrTbU;_+Xh-9fUB5#Y~s!80L3o@Je7P06|A! z1jQY0?O84$XmYB@+3>#y^?%(Zac>3(fNL<1YJ^%bRc%-LDTCiCIMpFCi&!*qf*ETdsNtF zqTg|S|5%mR>nV^C@5l7v2{@I->k`-YZf)1sJkM3(mZxcyHK_I{kDd>v#EmfL2^DU> z^XaWqrrQ&VwAaugPZ|oJ?D^jL70;g>l4&4?YCye2-y}y-z#sp&1XH0{w2;T7tn6AFxp13%15TXAtCTO-1a^No)~7jsG)BJSb{5Glbl zjj!~jc3*gfJ*&~`sirE;iGP31LG_{ktGRn9>$)s1B_g-CTL0OKS86@>u4CaRVX^B*Nc_n^DviY zX71#$==0ai-b+fi1_>P$pwN!>fFF#-`IVU6*Rpm_V0G42Zz+N+L|yvy2L1PW)G@q6 z2QF-gu@9j!BKP&O>0Atsc8w~ZMO`2zt5e6A5-Icg15II|N6$PvkB2+{a#}W7a zqINnPSuKY1klJOrFa}}xyB7-v&8y%yOmY)@sO=bHTCA?_OXHEP6#q^x7X%fh=EPcW zZef@c4gWjXplI9%koMAqEAk_DfADn$)_45R_l3!GTSxyZXsX4r&rD2x@7@yo5DPd7 zqHf;nli7r&ML+OSI_R^hzN3l}B6J`)%`rVi3Ffns59J6>wVrS8#Shgr(zl&|ie_WO z{xRV2)LJV31%q|~#QxlA+FFaZWzo&2@JO8-NtL~X2$Se>8!i;X5< zyzgJWmyg;>BT`$r+<#JparM!dD(y-BtZB!HCBK*bUR^hYglY46#y$n17ar-yn(Ls8 z^}#gFv;)@$w~$@G^}N0d*U^q?0E>6L0$uDO!eygX&Rx-Q@QnlS+WC7zj&dlRx5?eL zy300?-KA5ZIbU(-8tLeiDZyYwY_q-)O@eE}rXL^ZokP4IK+`Et;; zGV+&n=eb>$pIKb$&~RV9gh8A#2tlLT^^YGpcn+eBIhE)W0WCXYZoS#(gK(w&=>jXX^JiW~d z(1kAa$z`rHe}b(hHBMj~x~@Es-0XqPQ^25wPcYB(Z5B zaz4bcja;+nHt;GoQGR27ql3_8sd8TZ;G@j0A&v{(!h@dlIj`qyR$1F}_RpKKq!=s1 z8W}B)%%+3E)QC1K!Hhy;M^pOc%~|S48@dPkbETImX~1zQPdMDvgWz-cZ+Z8?fq4=I z5-J0{=s>wk=Qxu@+Q1S1gkGw6_1a>(2aJKaBM&LfBC*u~^#08cQ0`DTa)ga#ilEyG z9#JHZ;vZph1QkyfBh z!j%RjUC*h9Dw0!alXhZ-joM6wf<1{Uu}@EzZ60CEwqWbAfa09TL#d4-$wsv*M5gGt zb<0X=&-j6kt+PNDyUz=F1KW>$u?AwoM`6J}$H?=``=o{2ZiZ}1K{&|s*>59L?0HZO zFv#wNbWgUVmCfLIH^F>YX9eVym`5h2LKWnJ&g8kQMIk;fV_nW(iM4YTm*=p4&zigNVA>I zL5~wWIsk_g^@P;@Bh1y>rqxzLz(tH~*m7_u!2p|2zUHd=`Lo_;@r z(Jvj~K3~{P-Am}~a%{ra_P%#=`P~_Ow=^vWKGJh}vvpN;K%1L4s>PFj!c!WXyPg29 z8i8%Vx{%kSpnfbm?R$k9-(4nv$4B*h*T!C12L&=wr-TMxgB0+|4hMp2mM)AzwV%3i z;KJc0z8PNP8{$!iU(Zd%{!k!wHBUjhyiT&fY5c%YaqC&|BN|ndK)YB2&Cj?Un{LzH zihsZCn2Xk(*j(MKv=cw!@cqrj6m*8wc_;6+?t15$e|hy}`q%%&^E$D?i*u;tcAw}A zu$c%%#_xSB__*6K)a0)H%4zL1W5Q^aW~BC~7DtbuR_C2zJ}gaH)H^o}>T!q+d4H6h zrfyS7RnGcTggci&z!L9=J8x~gzLh3p(*)Lr4Qx*#y=tVi&Bv^UfgrLEId617Rlclq z8{%WJAv6iFSEAhpl+~|Xd@QK6^zcs|jV7%S{I*Vy4*km&G^9@PlDEF{(>6!oJf&i3 z^}G(rAE|Me^-Iv8RmdsgP3U5Cd0ZptfQ2th6jK~SDJC`&vLHtfU zxR}$VTn5i4Of7tH1;ibu-hceVyW`hQI@nn>#U*r1WxQ-l90i~ST17;yt>p0XoE6UV#h}NL(Q0xfJaLZ0dp@w zksvCz9EvZlgMUu~3NWBA-gIi+`J3lL^?qQZ+%4s;oc^(Nfi z)9HC&{t(q|9XR;}%v8RVO_wIJl_)u3@R+|EpI`AHhdRsF?P8h*>j1!6|vH zbo@)f(>ml~JqO!{d2grPS&JLoq}mPWty?Q}{BuJvZq#MX7S!XudaD%?OWd>;g9;FF z%J;45>6i|>4irt~Ep?wfFv7xnSf7;n&Izyds5pG84-vto5eR!)Yt1`2dPI5t=cDRZ z)Au+s7+$){34MJB#?YA8KJzDnKZpZ7r#T%SpR*(s>)20ZWZ_MAzX|eg&qs?^fgVms z5$fwYd*PI^T+Uslx~95!NGQMA8;0E%T;N~E30IYz)t0JKePA5uGaIspKOi(Q`JNCR z7pj*s#T}n!H+7NXebf;TpDTEEptXPqWSSyx7(X)X#kz8QV)VjAqzx+xb;rTRNnFbL zMq;(b_>M@8Ps_KTZ*0x`T2dz%pRiZ)@qTAno&QLUCNcs145QOf0JDWO$S6H?5_x^E zZ9A|t-362cZ*brA5_C%ABnl-6RN!3GPrPBjIl@7u8e@O@$biYpR4o@m*BFeG-{xEj zfdu?kMs}7V^n;f@{1)Oyi;P>CkUJ--8Bnzu+lc8v>J$;mrwkq{=l8k4=dz! z1yHWje*@sMsHz$~wT#zt@A3Nl%~V4sBvzQwKFUkBuf(FVjL5|u(JZAyEqWIWf556! z7_tEWk#U~IARr@DH~&q|N8v2;1@tr%NzMR0)%>>jBr^E0jvO%+Nd1z`%0E^?98-JeK_)Yojsxz#zEC31DRWf{?&`L`-v%}rx* zp>dkwX6nDcEg@rxzm7uVp4}yTf8E24P3>XNF!7o&A}(r=^oUfk>4=kh7tqIB^zHqN zzo3AeB7JWXrmFAozZ1{7D+@^V*Q|a^8$qUwOW-EVNmXkrUcth`%_`1kS3YXYhe7eO zT7w-ILH1gJEOCl_a5LamA~IuE|Kct1p>CMRb7xG$4_d`nA|PU1eo+Nk_~+ob_0-h{ zKr1AluZMRwl`oTQpl zet54U_H7Y4Q)#5_>@8_sZNZdkr&qiv1#vYaQ(<++i5sx!B-v$kE z_Dc*9eNB~qwYbzEOjKi+Z3@=e-Lut!CV-d2-;?Igu!*YiqVf#s4<@ZXV)IG5_qhGaL>SaB1jftx;7UK9cFyd#~f#sxp=bU*=wT8&U;s zn@@-7lJ830BNQvwP~zF5uw9@t;2*aH(e-d*vM$vOcH1@+y)AW)G*7=c8n7``qC{g5 z>BBfwp7<;Z?IINVSnbZM8dbF);jwtw<$94i3E8=L-3Gc{JMp%$(oo!+?}u^RX)j=` z)4v_V_HX%%kpL2mWEnohqekRif_Fn?IA4wS{T!I{EEi?&1srU%j00|3Ok-;#trYw% zl-5w_mgDo;6n-@q^z%$PZ>die&gGq%w<`e`v%*w z9Tu^6NBIX6tCBwr79I%UuR;BGeY5_%uQ$m+uIcgGKc366C8+lkX>O#tq?h^$Y*gd! z8CamXZ3a`Lrepc4T9G$cd1h9a#@j^EJ|7&p74qhwDORC1QOOZURr$F*#RL$F2+ikY zaGiNdKRQx*%RGKCs-x0_OUx!6#E78>##X)~(%ol#ib~8&^e-3xoyDpgM6?+i;|yKC znFdz-fR+|m^RXVKFRbFz6WSmp!Z zz^?g7nWJCEvnc55y7FT;<@|rMCKX<*d@e!tYimMie@FdHC4R8f8Ey!lp%Rz#+{M}2 z78B=aZ1IpI&JPnK3|mwtuFM9wdzN|)_C*?s_9Hy5X2qDj=yxRhMsLwtH7fE2Rvbe2`5R$#{pi)yS7_K@l*o(=;SP(`JZ}-?e-Uq(q z!jmDAgR!0;+Gcew!4sA;%qEVA=~}N5LST+Nz+-o34oJ+pc*GTTUBNCdvlUi@cAJBb z)&>(=_-NIBn;T;DG1sMA23|PKAxnQWj@M;k)vF%dq`k$HocZFAG$j6S?Om>VD zUd&niZR0fXf78MLSLrxDg6BWP8q6VWb;(u|=ttMZ79I3p*DTTZ>9DJZ5xu;1Q4kub zInhrGBJk&bSM7hi>p8o7ew>N4%{f-9{}$&9ZZ`Uj_j_&&&Zb_Ck>#Lmwqo~Y)qr;< zYzAFB%kMtg6i${vtaPK;20$W(pD6EofRTH7gdnQMA@c7UbMZHcy{q*2U$YhTwbdbm zEACn2)CXd?5DE|_9xjdz{ivyD zpC*J#q~?_|d@qHu(sKnF^nB)?YTzECo9w{oUC3uV!oe;!_P8Q8#r?8WVKa$nLWu_I z`xOSDppFjFxN+W~ArXae zt-1#>u4jPkrSG2Tr4RYN@a?KlzJ|2d8;?+4oL~QX-8@&0em{z}ed5nHL)f_sk=;Kf z2rqA7zm?UU>R5iuZ}#eMK0HV^<9+=1qqrzTYs?tkruq%U+=%{t_}#;D<_8RU&Yw=> zz+3VU7(Bujqu85<<)0iNJP$yVhX3rJ)t>wfwzs}&r;<~Bv$E&8_r@uJ!^MA44A@nS zse

P_!`>b$2YKoUXgYLP*Ate()ull)Op!ewB@oF_-U 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

sE}TU*fs&!`x{K0GcvS8q@?u8y1ZLrXpRde%V`^ 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 S=8Yi$0000d;< literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-20x20@3x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a2f3f60d02742dd990deb9c4a24704f20c97e8ff GIT binary patch literal 2716 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 W#n1C7@4*}Z0000^dBn# literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-29x29@2x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a263c8caab2e824d0eb19f4bc769ea4d6e33b0fe GIT binary patch literal 2502 zcmV;%2|4zOP)$ zdvH`&9ml`t+$CeOOLs%T4o<}+AcVYApmmfwt<`CTJPK{qqSX#F+R+*D4+=@FAf=(W z6d^z(*mgSpfz&!W!c@oU_@}MVT3R6QcOef#5+F$}PWEw*bIyJ4?%mz&%_bR#U*=}- zp8GiWbAI3RJHK=8x)@^|(=q~Jny04C(pRTz`lrq{WP0mN0rdadZXZxSABvm@yL~)5 z-w!ZXmJ+CtIU%VZn~9~X&XoITqVs2~zlXzNT<+^f_97pA**-^gy5?tmOl)JL*U{C{ zBe$N;Ui9@`fy<>}_lvdgWqTdnbKd*ttxx}p&W>($wRfXSe)eE|d;)|JV{^ORsC#}p za`Kiru4m4Nmx2C4v^BS*t)&C)tsS^>c|huq5E=oeZ<(2ysN1t0D^@NC8TkWvRzA49 zEaiG<)uWRWlM<%2r5zouo#<%q!Y7lT*Z@%wFc9k>Cvbb*_(gpURu!xS9X$ooyB$3L zl%r=!8)zU9KxccGglZF8a~p;Rhhwf5 zY;+8lE;Qrfg-d9<*eoG~!4Rk|hz`jTf>Lz{pUKQLA&1`t?XFRW5lS4#P6xva!>+nL zc>8bvkl)pDjA;8Y0@VI&q^Xqx6abU=5NEiv+}P{ig@U5hAXnc6?W#5E;F*Qs?ovm? zSjry#*E{F%_rJcaq7k!&Iw0)NbNx>K9 zOGu{pWdq8MR4QId6lae*a7YntG__(koUs z8U1^jau&(J;l_g~Dk%c(I|JpyeiJf#B|`U|K+xsIE5ef&$gkbSu-ucnbm1sr;A${3 z9Ap!H6Uo`*_TcD=1{4$(KNFP)st4p^-CC@`1~AZMtU&PA3Qqn zB$BhoorQ+q9FmZ<=PfAb56FNdA$>Ure)$+eE+0;G5?mYyDCKh8UAu_k$z>dv903X3 z0$-eyPS7}G5?9GMvGHmGIg99e^mqe`ON&7}Ps4S-L4zb?^zu0nM&vAnWq%QYhx`a;cyaIo!AI9kxr$qT z!NZZ`;c%UL0c5lfTpZL}(kW=_nMPDUj0iwl&TH|so@9uWR}?aD9s*zYBP1X{BKY?R zOh~8`nj#+uCa!^Yy{q0+q|5T8*x|*RkVKn)%)vB`o6_a5&48lEQ@slD$$Tpic(`85 z)&Bv(``2{H$N-YJ5TJw20B1(I*yT1JozBXnvp%Zd!7c-`$XO07gc}Or-es6tw^at7 z7vBfYT{Gv>dXVFCFaqw*;vgfv0ApH9Fei^{n1ep5Niiw_85s~Fh5{-e~1`cfgFUm3hEVN;ybq3QG4`aPLy^g-bxjdXaHvFA$oNS(C7E(ZdLAenI*r=+(hD$0j^{toGMu_uV$@;6~;UzCG7gS_6j73BsySb>@2x{RYdBEDG0J$*$ z*O5)Y^~>N2Q4@(M*l^J|O~^D@%AjTC<=E%nkDu4nX|VQVr?nAupRW5HfZ=Y?!<&GK zAuy^gl2OXciT%BvCh&fy5T&KT55sIIE6mh;5gowZv()2Eh~)k!X+t zmX~kD)RrTFfK0Q^=tXeVqt){2=QLQ3nCPTRSC7`=FgW7|nEFD3fpH3c?_&r(bqt_N zoS|Z7HselE{iu*JMeWWS2^+nbt-b-%JSt)hGo=bn)$sGB$HAUzgfZiu1xw3|;EJkB zO~$ogddg-EM#d(*YI;t!njYnHW4dI&@?DT0 z9@peLyO!2B-U3!c+q#+>8IAQ+(7H-58bSDy-@gU)M<>!YP9`&Bg(1-_9WYZV9u--m z&k@mBz}D>8sr6YN8C*nN>$iYDqe7;m&Uj_kV=*t8;#soP&|0>!vQnbe3Rn?oxw-s7 zAKD7#nZ~4$sn%&%W<54*Kh~(ItdvQ`&S#%B{7E1DKIrQ8b0$}-O#{@rmJ?@DJC1Fr z*eK=O(%d4ir3GJ|=9SLtjCXC41#IiZcKgXq$XH6*vZOLSb6%(2we$YVvAMF_2Q+%N zZZ~_khIiefL%#Lgcte%7e6H(^SgB9;dxq(T@?^h*n2$PdAL-8b1I(5E57$ID@uuA6 QY5)KL07*qoM6N<$f^PZGkpKVy literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-29x29@3x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-29x29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..800bbd19dd83a12d455f37991d25157ae80c2953 GIT binary patch literal 4617 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 literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-38x38@2x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-38x38@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9012cbd7f08dda0654b5b07c3bd92a16a5e195b4 GIT binary patch literal 3616 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 literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-40x40@2x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2007f0abd164b7b5423b3a982dccde3cec4dbda3 GIT binary patch literal 4003 zcmV;U4_xqxP)z0Q-Vk#J0v6u$k5v9ADt1~>5MZv?zSVlxK?akrh-_JVbM@lMM7BO zHq%Zw(Jp^7<5h^7idx8*<5Y~`@1m3%+bI)?`x%b`s@|J4=&6k0kd+)j5J>Tzr z`?)VcU8fW#DMJwcKLIGEAcR1j>3)xO-#3L{F!BNRiINF*=N7|)zux?UF+O#GJZJ#G zBxwM^B*_;54R=9E3=_YG{DLw2-WZtrNmmNL0TWJ=1^`Tw1^`TwTmg*L=?=_`5=3Hk zx>wdb>L}%se{O;%tS&^3y%%>W_=Q3t9N6EE*5>_aX>3JHQyVfeGqB|4MZT^tN-Z1< zQ|CCDTp@9OhE{ZTbfUSb70nH;Xl`u5{?-EwL}L69g3RnpJn_sUNvzR*eOF`<>FGYp zz-p>*Mq_<51FZW@4+9FUqryQmekcL5vNG`e(q}O?cZ~0AVE{_!DD7L0rNfNoWZmxZ zlb=ByM~-4&O+D&r>aee-0f*WTi#f#9Fg~A{AWBM0y9x`JJj1{<_-V&~4LbaGKuh&y zeP$4`bp@lG^CIUxiSj#l_8c1Oo6xYY5%qPAXliK2=~G>7!4fbC4dZTz`y$G(DEukX z($nzVl4p=tFph(F_*c*ltweapbWk$P7kMwK35UaBw6*Li+__K_2^>+uqy$;nS$JXDb0{dvW6zS{AxTf|q<#gk<46ZH#eKDPXsBys zzN`0qF9*oO9Hm}yyaZg-@NEJ(z|=$urs4BmT(O90o_c5`1M2G zW?-$8@cjiMv;~UdNC*{^R8ZpJQOi!9X3hCOB#)u+)l3P*o@DbP$SwiUu1;n6=~$NxJ;u(gdq2QflP%vDEU?LHs#K%q;NSU{>{0jjEviI{cPkZe?}Uy1P( zirJJvb0q@JuR6dZ2v2wc`gM1+rg=rhg}jB-uo;1d&GuBqh_(}-hW;%9o)IvF&r@T- zcSq<*aa0+J$Q!ktr5?w!S0J^;0uDk05yh-6ZS*v27~rL2)%psIFB#7RMtv3gXHQiO zvt5AjxceDcd%Fm>?kCXg(FfCp>G<(jEBYoXuR71SAVS5*M+9)PNe~HYq&C87)b4+QwRT+8Pf0V6EI6PeKDp%f2{qrUn-_#K6uFjHY($xW)HUvny$``49db!Aon?y!Y2ar}^iDuS3S{td#hRXF8cs1J) z+_zoPJdNEQzTsyG=W*~pJq~Pc);M??huD}kAq$w7rz2pj=fpvzy!`|&%&YbfK-I+5 zDC%`ynjvozD6hea`BY@+7LbZ5+sxWMTBoI_W8KCzC}v4AMX;tC!P@Ew?;b9H6rsF3 z8NZ#!fQ^kB`#>0YI{%%U0X&qiBWO(OI?BK!-N$Sne4_Hoc|rqeL`3cDyn0NbY9K^| zQ$|%UvyP0`8VTT)H7_%t#}>Eu4fanIuJQ>8m(NG2=stF|`#8aC_0ntsqXlUg`Op;L zkwP7*8U^V-?g?HZ@|ybMXCe*i%=d`!X8Lg-P@McV%b|YWd-ggk(^CtIs1}a2n zU6s(}#}O{Noy{@8TU%@SJY6Hubil}&AIQ~_5u^;Xl(!y-cIvP%qB_Z^MB3~ph$35P zpa>i`vliFwfrWp%H%^_x=k**#;IlVHBUDCd4WY@8n&9m^MzFfZh_;H)(+v=Tf=r-v z2n8;DiIle&fShO-`ys^SY70@Fr_PRR$GL5{VG50r!E+&4~^T=zs&N9lFlmbnWPmiZfO zK#CI0#jGLH7-`n_&%}CQXv$oK$8+#LIzq5&4{tJPgjnDyAeIfK>_p(R9j0pm)uFVf z?T?CAUgdn$J&|ZFAN4*NMC?g4HA^wGEOTfh9MPJZ{A5W-5V~;|LZx@IlRJ+B6`z4? zo)IuKL$B;0W~Bn71_R`13vlkVwI?D#l$w}~yej#ZNSk{UmNq)eGU8||IHR?x8loBr zO`DHU$*t_vCmq1@T~41D3F4S^@xgR7DbngT5dG{X`1Y1QH5&tp1}bG4VlZpfv@U*o zKEeXLkBW0bvn+uhM|;U(2~@hiiof+Ciks2E88? z0id(B<>pKyt_eR#L}OGYDz?Dl(QQ$qwUx32*qIO7fu$cqB-z4Tb%Lp*C>|;Yt{DvU z>cH+!;9w8%og83XCV(%`K>K{RqJb8ObYzjOj7vmbb=>Ekh?g@}$JA^jP|+lSQpVXE z39e>sw(TvRA07ghe#8R?QOtFEF2#b$mJSWlfSYoFo0K)Be6Se^^$Jb1K%`d}p!fc@ zX5F2ryz1DoE9d1Q+|Db#B1CGSTZcuB(6(qztzyQYu3m~?{u{WUi`PMf&%0$Duwata zlF~X`K{JMfrVZt53H2iQ;Ts74Ym1yAe(Rvu6rgv;>!9hw6j>6L*ShAhFYF|@^Gcma zp=h8mUunupzGvT9a@ji;{Mt?f=Pq)yCBosp%ihqMf@h?(=}@dBD%7 z3P3yCFzEIBK)Q~YIUWP<>`4nao6pO``B_y!h7&x0$gD)5^!e3sta}7<4=p0cqq6>_ zF`2b3Vby_~^MGfkiFdJ1v}4d~cd@1@h?1TdV~WU#J0h2XXJ{yKR20d|8?h(ioDkQZ zh+LerRqv=c+{{{y*6Op32F#E0frU2-%{$qS)D3rlocba{%iKWJM;4%WPBm!8)t>Ss zDz7@v7ZXlRNl`Qq5gSL*%vz1sD&3N+fOn!DDQj;7PPMa^7I7rU&apl+AH8$m0L>WT zhj>xR7Xa_R_a40W?hc&k?vAZ=^Dt}Kuq+q~EdHM8qjt6-u=WlUJekk%v`6N6vfkC9 zj~tKQ2j6DVxj)Dk0E>!?P_=z4=FFUp?laxC94|hz=9D!^4BBfESaS!^bIjaFR`X)w z&_F$B0?yBW2k0m8peE8@&Q&GndG)xgybPPFDjA4ho;zm+hB(dITti0_NX2cSJ;%8! zTAOjMAnI4=Gw@hS6N602%4-G@c`;fx?seXI&kd6%VaxWdm_PSHbe}mBQM$Rk=3zH$ z!SK`V3>dM<49{vYHYxluQCI$A+b9JX=_H{isW=9HlKk>C0pFk+Y2rIZ8Q&pDZU$9uz^4WDR$ z$ODUWV_j&V?8s1C62pFUowD-H1WR3pEb2#>;=*IUb0o=qug_0;V<_d^N|?SECqbMe zHPP%?N9)K~?2WHT$ZZiK_IqubckM)ke)@X_y!h7Vm%K6Wi8#rbxw~cb&cNbY#!3HZ zXr^Go5_9n#6KS%#1kt!Rrx^MIOY;(4pC9tZyeHyyt*^ZUE3nLCDGr5uM~2GWP?R+c zOo!iN8aZYn@YK89=lQU{WaaIb@5*ryw_(oASqwyYydS78mdaNQ6cEXna?q!D^lP5i z7xmkh4JVeBp=#SU%$+%l2Nr3rj-H?-rwNm><-oJ=ePvyhM5$lDt;qsQ^)}3#H3wZ? zUF@9NopIWS`CYr*>p_0;r^^mJc(t><_5mb$IaKwU*SxZ_GE{DNbO{0r-?s&fuX26y@^fux^_8W^>WIDgm6excYjrgqoHGYqr@KrIq|SwpyB;Zv z{|sb~=-2hd!|#%PW8DC8%l7SZ3}~8ogQ`#9`fq)G5vzqQr%EE;%1kt4kB47L zX$k(YV+V!}A0F|?UlZZy_xhsoa|Dsd8Hr}>@$$#rL1n z{obuxRex1|_up!{FYUUVBP7P4k+@@~2lqG_xnaxerFqvPuehf9t9;ALHw_5R%+C-d zkuGYa`RTP_M)RpUMIEZHD&I=*O_L%81=|q)p zF?`brxl2fcZFrS$v3x58aFvFNssN92sscR9DNSQ0N=fmSd2N2?sw+9}tMV-+-!#2p zBlBL|HT@KgD73CB-_r9fi;7O_NI9v>H%e6-Jj$sG@F=G$z@wb10FQF20zAqoov#N- zUGg~hyc|^JJGlDNYMCmTD5KJJ_RobcCyVx#?{8XXnqTMRsgUxclkd^PN72>UjjlZz zba(ckr>hs|UvMtI@a4~ym2VuSRRNIoL}pZCrkMhoQ%oO1%ELwp?&4;Z(8p>w|ts~%+I*{W`j){S$sV;d+@;P=<4Xk9#29$ zy3x~>LEnj!VG$P20W*#Dl9kuus*ikN$oiXy7oE!x4EFx;*LPBG9@jo&RV=JGB3fBWSD?0+ z)i1=tWmjwMabADO2Y0AwL<8J+q7NPId(ht6j?4C1EK0!TE7U3S6-{t=Yh+5Z&3-w`hA0-5e4v(!$y?0rr9@S+f#~J3f*?d+nY;l*3xvktAZyd%Q-?$UM z`o+`Q2|HD1X#0edBkIamg?hG_bLA*W*z!=@5#T9r#gjP<>o#16s~3J;3t>_oxS2bH z{HEk`2F}vpldq`AI7h;yLYAe9UBdEg>YDoX*uU>JIe=l4$kRxkcz-;(nmLLg6LT}& z{vaf)^JrkCXzhm8xO$O3L*?||2Pb1lE&-W4DY$dK4|m#!at)KDV#nDmS1}vBt?6;> z+q<6(fl$9(g6v;QTgAc#heI9X0T)EZbfT#Vbg6~L%ez?rsnz(qMW4{BbTaoL)$^So zv$h@(RKVeZdoSGSA1$=CC7~h#Hf&2C^vu)G>LtUG^rerim~fSWSYSk@I8Pf(XC-{~ zotKwwq%h!|}qi;YQ)%=eM%zFSwx#wfYx-wt=iC!#m=qQb}7qyhk@%vel%JRLoH zREmQpy*#|8K!>N-{VT?G-$X&%hB0+0r|t5J}_4RN)}hwxF1& zqH)biG^}2s_1EdXAE~Z;lv)-K8xy_*kiFnG@I-LSHO~6Av7-azCO1Cg6`DPtUM~-U zmC_qN?OaS)5b3q5?F9R*H9d#d9XPedlM&->H+bN#S*i8I>GHt6H+G;oOCfu~t>86_ zWx0NrVM`A~?F5d$nPohzB_3z=9o6FZIIxKzBpYEAl3QZWXZkg8*pnDDGwUJ=5B@^M;K14L3A8S zKF+E>KA6*m@t<5{Zb~tO0!c|TG_?&0G!y1HYM+_i35$5!MX2vp>l%F3O#9{Rc@U}2 z@9FlRfb4}r*^9mwfGhe7U~9&~j-x?dCj_nB<4p5a>~x`!VjhTV2((?AN$?~*EyF%T z+U%Ta8{~GPw;cd?-MU7sT3fFbO=TWKs{KACHuPx;@y=fORk*WsaGQD@Jb$=|O#^vS zKC$u;%taGWc~qJM@GWW^)ILL^qub{=Z(ApGtXbHC)$3RJ(n~3o*$$`W+X_j;cKSB= zowvZ9y;$p^C%HbjP(=!vqAV3v6kz?WZGltcAx5QHO0S`|mA7qi%%pwR)wc4sb+rvy zN-7AfUbo7ZUP?~)Hl%!TVYR#7%gC}9eHm^o0ha?!9=LDl;2K{mMim5DI2EDSN}Y;a zYFqQRiQUueGn0;vRc#w;m3mm7`vw++BL!{b%7|t!wDM%IP4$Qv|eAb6$8BcOGa4ni*oWn7HYKgt9JgBJCg~gHb z^SQB$QF*>fqPe(+B~~s(ZIdv9?gIJD=Rb|5E0^d?YZ6=mtRcCKAv^!;aBDs+(*^{% zN7Vx)ferIaOmS?Sh@|??w4CubE@3`nezW`Z?FoBNSVrN*@ zHc0Gv!B>!-{kNpG2Do}>{O@VTas7EN&Y4ui zIF*1ZtD-fz+hNqVbpGg@Ys@y;;wY|{; zx84A^c{9>2n-w}1^_-n|6S8NiMSjobKD38n$I34i=oPS z(R4Z^oc!hCqc0&O(~Z#5h?FFRRj>dpqji3 zyPmh~f&2R-OfM!u4tTCOo8wXn?m!=$%nrEcUtWUI%%5TaHvId7$SkX3R46$NAmb_= zia1@S+D14jVhgL3kv8mekZ1jdwLZX;=P#Cgyd}Q}+Zld$gldy0U0ciXzB4GeCz1Z~ zm*DjLE&w=jtV}9qoJnaemkaH`7a&xn8OG?V7a~plAcP1>=yI1-(PD0pS)@4xTEa}i zp?D_@y4ofZzHY-hth-)-8>FRnHX*&MDP~nDQ0>`y8!>R+B3Yly86Ie3cm2na9ACc$^JN0JyXfHA**{Y&-^|Z2aB~mFz-b=MV zh15%%1UGVAFf7X)3|w+OvKQ*>xtm%Uo<4|(&DS*m&~UDc@u~1$wjX0Wa9e(v=lWoY zXEqF~_kX zJ2XZO5IY_tbL#6`#_;^=$5)zXyK%dT}$t zXP+W?aj-*O(a{aXiOYou$5u^QX=q;I5PH7QfVS*?j&;IxwQV|P+As?>{N6RlUZ`)g zx#M@hZx5OiCy~a644HO0E(OdOAKrTNkHGOaiE1`NW*(zhDnJ!qE`*XdV?ja2LBu{2 zRSsw;4ed@CeFQ>c4E^t2i-C8mqo4g*;GaBj53tB0Qtn;^{OcyEErION9;uC@s+pcn zuROw)lVDCdX}XCpH?+stXSrbx29%+Fwt$sA`*I*XPF{PG`>hv&XAdYl&!Bs~F&)sR zDzBVL;@|zdbJ$;o$kcL$sH6ZVx%6g&9>f|O0=K^aJo}o` zrjD#tfjnm_aM_t0)5ZZu`heX>7~1|6#M<7>)<@0)uBuc0bvmDoN~q1r8Z%*V15Eps zBXklJ36so_$rh8DZam4MdBU_jRnb!WGGq5-642CM17s_XdB8<)lngZheDitWnf<1z zRIT#nlW$xAyua4$C&!;o0+}~~nn}P+i4zAqycbUI%Q@{Y#!f``T^}s}I2++o;>$>r zuI&y3ODN9`P(i{TZHd7Gs&LFq;MJ6-d1zeg6M%2O2t2)y3|x564NH08e&sS?!RhvX zP8|y@m=W!7`q!IC-;Byd8zxRc--_?SojO~a@F>qX>(_bzC`UXcmDdMdfd zk$L7Qs1a{Fa?((zyI%r+-W5OFGd=~}dIfNC1i<7zrCxmssU1(~v9c+0<0hbQ`FG*Y zdRIP`=fyYwdtCe|M@+_SPF0ewsF zhC6$15i=gej1Vef{nR)8T^W9TW5$D@Rtr9UGT4bX!H(=DhLl;xnFZk1 z{{ZgUm*g>Cr5k56e}%#%(h!A403wlQVx38x3|*Rqq}t92Yu%xN(2p@c{SwkIY}di-KjF_*$=^QG)_5&~=7GE7UIK2V$ST2=;!T|^4uX)9 zX2=#*oRgj)$yBnZ#WN-`NV1HTlGV@vo9{(+*-z|R8+Ckg;Lris8G^uiS~Ie zZ#yzcB5Zb4M|;(eNd@4}Cz8ufzKyZ>FN4$lyuJy(K#=*kN$6X(32yDhgB+yNFGy6( z1~am)L7gqq&;5cE1+3ZUs3Rs-xoMw?tw+dlj01e*eNk}J57vY2c`no_^nC)kq*kTz zNmJ3cdNbVGc^HmVF@WFo?zz~vU%YKr*p&EAz`c^+u63HzWRSe*p|M6zDx3weFlaVS{`oP*r z!DRbPov?UsThRy3G2V@F;uumtSOM1g9Js^COAHCfk=C2XTL3=sH1w@)8rI;Vk^rAs zQ-iJBx1oO7@&IJ*6n?xkOSMf-KOmR4O-KXx_*-!9T?p3wQedmy@X2zN&ebG2GH((( zRO3$>5#XX&fRo($qwNi&9O^ENpIi z1S^*=$Du=q!u||7$(Txe^-I5&FXp=lcuBZlaC?mdCLX%Hyd;_hxLw|h!g9#4ckyCiHdxszwNqk5|X^8 zVU-a=#i(tB(n}^uV42(2Tg}zGKM;cK&3HNafy~FBij$sNuB#Ndr5)$AuCi>*#68ok zjBA)}R=})FNm*T89UlJC7R@G0pbOect4=4H&7!C3rS!T{kZJpTkS9(?|EGTf_pAk4 zn+Mb1N{@3oTG-YQb8g7?-DJ)a^5|4oSBpot3!A(zkHvlaYyLI0En$Z-yTxKa)`yKx zn2do9+riJ8pQA5@_qUScoHi4Z8wNzP<4aw*U!YM(ig@W`I5P(rZ|xG*5@l$)(wp?uFcV)vnDE9NVBEA zk|v$zgNwSkk)^lc*56X_E%b0t^N#Hko_%b$l@rZge}h95%B!nW<(ab060 zdNaL#n%o#~k_YY=p9DK=^u@WkXv6}H5ai8GO@U25c)-3N^4v=>=4<~6cFz1EY2#4S zhz1y82<6*kUy_5#5Gus1_MJo4w&6f|04yWUJjj-}kn+Wq^H!mn9(@#RR;@x$cQ>3= zsv>-cs=tNsO{<%f^pzI#r^9nIS9Ne=7xi6%HfN}KzB6Z@fo+dJj<(iTj2}O)Vtj|H zzxnb_+kY{eN4|?6?#O?YBbrfP{wh7+$&)AJy_a1U8#0uOZ?ul#!?%Fbg?V!niaw;*v#V(aq`Id|C{{voL3RSZjFe?B6 N002ovPDHLkV1m5O77hRa literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-60x60@2x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..277de169cc002a7370f159869cd7043bfa36dee0 GIT binary patch literal 6659 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 N002ovPDHLkV1m5O77hRa literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-60x60@3x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..fd0150fecf8ababe37465feab0e04b5a3a988496 GIT binary patch literal 12860 zcmZ{LRa9L)7cK4wDNwYyQ{0{6^b~g~THM{;U5dL)ad&q(xVv+3cfEZ7xG(qNKJ4s~ z6&cA|$x3E26DBV!2|&U}f`EVkNK1(+e*WwK`w-whLxFKPRtN}IXlbz@%B~q_UWh5* z2As|}A2#sxr%-1iRfR2~B5Qgs+_t@z`hl-J6JV3BOG;T=A{~QW++CAh249wR^@e-^ z#CL-DMZM*{(;y z{%5Q?6Oo=!aEO>%5&X2iG1F35H?DMreA$)zlM=D;p|Fx{W~Sx-sSgMa_kmxaf1^!T z6Res@nuwwos&%ZK8=VrOoyqNNT%TF~2{d6ygmQbHJ`@H>_!NHjZFuWMn>y#^1pyDq z?1-OxhLCp=@i14d+57*-xP0yF3n<6QTYMSu^U?OpxCS>7{+CqFt7f|InffKBCuHY_ zAFU!Jdv}OmjwXv~e)_Y4Y(h3)sqKOa9klUiD^vv(L#{`GU@hJzN7PIk?vSMO1O8I# z3t?#>xF@b>s%6{PI@qsFO_LWb8YOswfk_f5kx&n@9*;rEAl&pvOd5HL0Z(BD%JEaI zd>poP%hfttawrc3`!Q@LyQhhRe+netas@7z$eRGcgAMZ~pE487=OXNzO@1^1rXc!K zsco5~b_zHB>Hn-mDM0V;1B)+_U~sNzWGx8$M%Py0ddMwzW!v&!^8Rl4oP1XAZALm3 zy*AK1S>cqyu%#ktf`k2^D0m}_D1kmvzpyR|uESr236f5+i0O{A_N_Ak&zsl9$w_}P zdVQ(ZjK0xkJ#47yqW`ZPf0WS6F#OfF(1%_ZJ5jh@<#6h)T?vW6<{@&)38SJ95bVC+ zpr+e*5T#Y4zfM)I)j+h`BoJ+GGmpNs_d(P9w=LTmKl81%?@p~37K<;tIA=~ji->M= zHn00>O1RMxHSyx;Xkg-7TeZ{=UZiRbKHHE_f6ASl;jXZ@zQdEcsh$ zH5#raeH-ZtfJdV`imU02YgssASr%jY`69(|bBm{ByF9NuIQ^H3Q`_XpWp^kQQnNMP zT)N|lfPq{WY_6gYj?P@Fb|xo!=}X(Y7<;)d=D>ijT8HCuXd1Bkqo>N^t74zPURAq` zwaJoFypxt**?q_&$sq<-hV#jI(aU`yd#m8GVV2CAm=tKk(c-ciT3}eMHhVL+Ty7Ug z1(^j{yt^zxZAK>%4!uy9fkdbWHHam{=rWb4wy!NZBc}}|&|d5qPaE^~L1fd}gFiQU z1qdBC9%jZy3an;>$Cp~&2pX+7qH(f(An`lgXM!UsDKfZ%49tz#j?rNpEGwdd;P~K* zCNqNRD_`iMQ~P-wsH!UAqcZ?vg|>3(rWpY?ULn01uT2F7STlQ1rbOO4=5>8;gytQlrVcByv@26D7m`8`?{+g#|oTT48;&YomZe}m!1q-Kxa>%fY;&k zjUwPQ+-;Rvs&%t42+Ll-(T3CHGaK7V@l^>>%?4K31tw6^Sf!tR#IdrA1!x3l=MlLR zE$|dV>t^4mL=t%=EF~X~1ks#zlD;VjkhpL%Cy9nd{S<%=|5*`4`Icxr_q62~u+-@U z&uO*hA9cb-Sy@+{<;j~mrC||&_9vT$z=)6xniDsLqd}g%i~$;8>=#@>vgk-&5dr0K zd`tT{c$d6=Xc+zVMbX_n4%VTFE75px(D(Z#u~ZQJ&*S;0Za--CyTi0V!Tt}<%FW1) z4V~m0{Hg#!)l?VA!Js5XMDg$J{4QxVYlFQjVLC};>UJqNsSOem8mzyIWKa4tTGaGU zn^_FHeolI$6|OHnIN@513LEC%4gQ1-Be&*jJnMdLAgI<~AM8iESZU!y#Ixu`vhqUk z?GMv5&bTZ1W%MCF2OXzzLg52CuTaAwJbjxi*J+la&*?YHJ=$d5dsc7qEL$!{d=Q*I z?PdGd;p;D+vr471(a)a!<6383D9^`P6s2;*Y?4$>6F|YRu z<=&Qng>sz`wTG^qN~bA^g}`!{mP()M)A(2WZn~&si{P>q!>|#Ykfs!Ue3qYt} z>4Ml?jLmR{Ls8g6Br7*w3C`;&Z&Pg6Uxub20XP* zTQ|X!Cfy{vuYcMpcbURvMM6R%O@)UTYa1*U@F0c=T|eH{B3D6BDgMFNS_jYzs*|n+ z6v#3H0B?$zMdSd5ZboEz z4pp7cpc^TiURrDt>|CE5%@%K`rFTY0^D|$xkEEKmCZ*0qZ$lsJBOfk3zn^o(Y}H7r zZBK6s1^G8bD&OHgM!WmD; znJm8BtAO0H8mK~g+W~j=e|T&OeVOd5^T;xCOS#EbJ`VKZF~#!Z(1<%ww@_bCsAbq! z_%c@2(hyzCA1;3Jz56UmaA+{9M_o_phVN-1)ALKM zSV3#@u39i^CiJk>tWa zsTXXKnu%=or0lfjCXcx>Tfek*hov)y@h^~TBUwsbhtTKlAIIZd5DsMz0Jm*BU{QU- zR~%!JUCO#H(p`PZcM6@Gem+u#^DFo1%It7mx3Ovlyiu)e%MZM~WQV$evV$Unjd+59 zjmViwBbu`mplPr$7w%a}v=@Q9TnlEX#NCl5Dmy2I8BK__qk3I&F@c({9fNzTM=e`w zV$>}Y&eFZzuP2s8g*XUAa9L#Afh;~^YEgl|-7!rqrc}P?US+~xf7a-rg&`3VD#5I^ zWxo^a7CMxJ%rSY{Zjc#VK0&{T+E8}L@#(7H%n80NCAUt|3~>EVzRy1(W3RHFWPPClZXzRX+lIQ-3sT`_^tT zHN8w4tq*l@c9RiSBE>emc^r5%#rJ}mqrAq-6~XSR8;u@wmVN^6`S6sg^oyen3#L(} z`Qli;MasVb*~N{6a9lyPyeCchEQScb##Gi?Kbl`R2CO*x`GJn?b3hi3z-QiVFa;ZnbLWuaJn@ zELW(Ca{~s01IoedxjF7Qu9Riq%roR+wOVd7nf99J`jtOPEMB%oov;G|@z=Lqj4#yX z-;WCP2pyyOA0vMT|c(ACM%q8g=_kU^7q zeRGQ`U*+;)K3gTW^_9WF*_XUFy$pCMVhE?+Fy)~spl1zdDdiU6i<-J(CibzRlmG`rs^@$c)1$p&+W=(yMQ!?; z>GyQ!0=2*Bw%8#FiFN_I!H>b6cdG51wrHJGgV9<_=S|9pK@Y;-iP~RpP;AXxT&mDr z-V9HunLuts*Gaj?lkfBMejbZamu3&-Cmkl3LoaX0CC$l5GZ-o)ZM54j?~$6g6qk$Z zjl`R^yXif_lm|X1HEsr9Cj~j%Hhaj@i*P&M9lGQ^+>QBOW1QkcSKW!JcXIR|ykSVF z{d3)gK_nIp1yFYh=w7kKo&MQIfl%cUx{%G;as^O`TS}4%>SH*?m%wFICz$RgCLBPm z5;I>ckU*k6WD0Uyq>jLR>2IKR7425r-2bkSDQL+1b+Zv-_lr=S&_v<7OMbf>Mka;) z_4!PsrKi$ZdCxBi3CIpQ=$kPp8@9d;l%-H9f}_-osV1_U;844tF0knp+NqFSNr{OL zKVxmH&)CPy)ISi=-I|7fZPY;*pkDb&(*et38KiS_BJC>7Q1;cWe@b`b92BSW^6}Y? zu zf!ml6Z&mFp{WdAJvT%ZKcxIJlaU3ZdNX~PRYPSw z@GYNWa9r~15g+~Q4DaVu>F|o%N&^eSv;$yjN$3ZoBay4sdu89vrA#*G^y`654gQum!S$`pcl< zR?*Q-H4$@+Irj$om<>*#nndSuU0o=dH`q-j}ns5yP_=B?Gy#1YY*(rq@=ZJ z`L-_uWMgJ?-}haL7I)fNow^w;>`&Jpn2L<$GQ@?{0RDyM#bjf<-d~B!~@W&snSqKcClJu|R3~YU>-Nj=wFSr?2pqEy5zRuZZ=KL zvlQonWq@MLeCz@D;`j&p6fywQfoM~`zR9D?WdvFLALSgm1VrR~ zU+#w6NtKFzNq=`h2N9^{wLft}9ZW@3a8~ddbGlFHFwR6~(Or&zgG^I6Ri6E+1g-hy z!3vX$GLgA@-!xwff3A|=pl#fX0)mgwhs1*OR&J4i^=2tmz1dRdv-8s3?Pi5QHky&$EqHsaG#`)kb27tdt0bYHbe~_S! zJ$9Xh$9xzs8WpDq7qCl6Cp%dpikK_VzWMhQuRygBIb8qu^@Uv}3~cTT8T>eSOZ3ZO zCM+7oAlkmZ!=IE%ZqwIKhZ(Hmgvq19s|p*gAsvtr?Nja`t?8QsSa}u`Rco&ru0D0+ z6}5R|WcaT48xvu^+7&ye zcs9XCA3LP1NetW8n$AFdH*7O+ANdQjC@%QA(L+I}K{)iirvnqQ_Mf3~E|>wBL-!6| z+CdwnV&BE)6lv{*Xx`+{4M&qhyD>g$)+iY1AavhPZLnpmnjd6kwxTFWP70;F3~iJn zzMT-O{}N+}a~a&f5s3>@Dw4(U(A4pvraQT)7Kb9WL^?j6wh@`s!VyvNj0fW2^B9Wy zfgnqL*{EqePhBY)rSMT_)_jYw(iC8_h5&(=D4y$e45nP6cA@qBXNHNPfkB-jiG>4t zI!_hY#!$nbo`zUn!-X2)vO+)!Vb0MR4`3g!t!T zD5I~D&C4t(B>f$UTUWlb@mL9n?qUdl?TuL4S>Br0i9-Ffn)~#U@|PlpLv>T$h=#37 zA_uD0O-><%gG4Q|*Y}`$AB?uiM8_`4?(%#rK`#;Pvo9%V=aTg{Xv#xj2E=JH<`BH6 zEW>j2WLQMGtqD)MYwjfMX3C8jr|7wrB~$g;zPx*1{}pdnHbIwb+@J{AlK5mj{i-30 zm#O=Qvdd8y#+&&vYNi5j}9<@-DosC1I#J^zwP-$j??DrEwZ)L zDk#K`PzE+wwoG8sq9<}9$L46*^HXK(aRJ-3*MxSQF~#=jI0ok_@D2z1ORzVM!`f48 z0$Yfwgk`EBGg{^CWG(d%+V0;?1QVde`%zW7XVYl<8D+jH4Do9k;@xJ0^aPgNT(WxFn$MSI z{GeEI3lxd_$gD?U7Hn%2WDq(OVMlLiny=F?-70$GLa1zEmovI^QP6n%Ru5ueeSY`vTt`lb7c(D)#@Ge`qPhFqJg1wp-ZSW@XJRw)&D6(SL|rS>6)b4n**NH zb%R~E&>1p|asRJx%0v31h6Rb|bL>t6zmj;SCw^YLbiRc`z~4dP=a9({W?7+K#~R{& z86naAnv3of1z`mJzTX)_?o_Rl9nugE$0k`_RK3B;wMCKnc&YGx06Kr=w`V&fuxv2b zghB&X1Lz0y;!c%l5P!$|LT7iJ(Uu{#Ej_~4RGDepgMETCf4mbXd)e^c+`i!3wj=VOoW*r{ z=tTp*fcFEjod0=%X^hz*rp0eBim+fg{`Mby zk7)hBk5$W<;*Icb$vTs2KUy4ZI>@5~1aQ=-;Q)`EMM<@+x8;3tC=JWJqDg87_Yj4pNN2Yhvo3 zMR3NC=xW>ju!3fLw!P;LvIFrZt8IqN{L3z0k0xsk54uc|7~b;78<*vY6=l>8>(3zZ zU}_^05X_yj6gM(aC-`H9AcGO0(6Jus-Udq~OmviHOz42$I?+aiOR04bR7TF=EYO19qW)}L?Avet4Dp) zCrZOApo!I?nM$1g_5f{TNz=os!U>W%q64d%K??`u^6(D3Yq!B4*Hk*EyLJtx~LwI^^D?D@9H zwp`g;0NQJc#7>KNr)FOLudVN<(Fg}itecmnflf^5HgJWTd!1V+sfPh{3+~5pNV}^t zb<(NVt-7f;wC2zGv>i^VVmo^t)rHKQq1?n(XewJ3xqf`rir!g+6&e-K@tfb>OA)99 z@I}^?N#zhws^4tuaNPAb(EUPP4UJn`+SK5jgp{eXgDYKr6BOXx5JyzsyZu&Vq6$Y6 zhx#@O8Kg8wCpmQ3GUS(>MdqMrocK+?P0ruAPom@;X_7=xV#JMBKv_^3r;4e{p;J6~ z`FJ785K}ZJ9HzVhV!9Jz^@7?*i_c^B&$XpvhX<;1`&4M6TLXOadmO?^*5oMcntg`% z-qoSfV9V#;_Ninj@h%z4v4U~kr2}g`7;vPWEvTbgaMd|SO8t{j(aNn>9}Oa15#BvZ zo2+f=8)K(H?KTA8wGAs1IY+7;_Y1dU$IA*9=-21|BV*GjDOCZX^K{meF`5z6iN$R2 z&jPMm*CFkh*A?*?Z@-NWMCfovZVYSe5<;fUam*t9n~<9%TF@y&&B+A$G&nGNT}7~@ z$IAYmTaAMWeH-*wPJGd$Dj2Ex!1_s`+SmqFa>3i^O=x#+re#sZcf=C9a3+gk!j}eo zFr8liw+e7*)5%U!J!AR_1c#}Eo*i|dY1lD~-oJmnOjM(j$kt>U+Vv(~Mnf9D;0m(b+dBun;< zc`dH_9)yyTnn`6L+TswGim_jDP(}Om=CVugA1|35x?iY}rR*YZHFQC$3SD%WDblx} zwQ~J=W{Kj!>v%=6J;WB_*pdev-zY7+iXX6z_erJ^Ohw{r5`NL5w;I@Q%M`%R!=&_0 zTR8$n6qAm6MN{cTGdPfBc+HY`|Lce|wTeSFzyEDFn0+^yTD}};4dGqbuL7Pxc-o2G zCY1pk&M7X5KeOJ7co_aMA|s7Tu^p?}p4*}C{p--pZ^nt*@jy4t@$i$&_D(dA?WUx8 zFA4MOw-yVrH{OYqVd_8v+<{?ejw6$^5fP=&8M*=+Wk@h$W-%k;>k_k-YWob6tVJD> z1~X1bt73cDv5D}UTJ>Co3;N1E@e`?sL6TTbZ~=jm$W>Fy*4=X5gma5<=)8Lv4#MVpb%Hn~$x%|yxxv}8zKAsEYw8uED7jZwoX|IvG5X)#iD*z|53NKz4Ox@F-ZoWv_-Vwj@bGu@h#zd z192bS%i87Q2d4TPp~Z0O(o@oNeLi-lqw_JaXqW#AVXMHdJDaGgx(iwTj{kDa5BCzu zL@vB5WG6O$uetpo`G;C&GYth$u6xbx%fBHID_e?jAKYZ0pw5MAKXxA20n)Uxfy^m> z-tIY<=xLv9+ARm9EB?dknHUM!)_sp#U0Y@8_E(}=Zf|O)u6lwtrOFGz^;E+pH;%7o z7TWyB+xsq-;7#zYp@7>ie=C5y7!w8NoLdrJN5t)}3kKq}V@RCHqQ)pIuoCU}>fVy= zB)rHb%2yG}jWpzMyyK;k{{n`dGF^qRy7ccfgxu94bVaXq>EY*MePuR9_eT%igRa6# zyPZB@Utg?oL>>L%Z6{NDUt-_|J&G1#o_=p~H@$5ZmVRhJRf`F+2F(><+8+8-${SME zg(x`akh%@Y4{%E?pGxU z@w%;H&gBIyT^2L{92i$1x5&k!pH&LGX2{;!J1bdNI`$SnrwFrexX9Icwq~Kx3a5bQP0@4au-K?x0O8Do z6Dmf~@C~%pjA42rDGST!*uB~Cm zgT8UFB|G`=EPe|yY=!dJqiCS;9zuMJpu>3_`IT$E=c1ARBl&OCl&`8#(zmCa^#YGp3B)Z!nGk6# z2=FQf%r0Jz8b8^PblEgaiUmwEu8)t9IklhJA(%!MyeUF%YJ1e)x#t>qWm^`}XJUhQ6(m|NIrkE5D#d4VUF2Ej3sWQ~CU5Z}8+Nd8(1g^2K z19FI92WOHo{-Cic&-;@}9rpXZj9(?8D_*{;H#>$dF z?xMAzc)ut+LI#l67vhZ3TFsjX4vse=XQILMCLdHwwl{9gc=WQHqJTMoX3Bq?h{gs}J`EAmi#qSJ$V1(D-p6GGU{kCw|;IBok93`XZ=VI1$j*JH6Uec1p3%T&~=iByB3SI0{fDCYD1tp%4| zGV7-O^2U_+C%AD?x}S<6liM}Qsje7eG~FP7%2gOv#_`LGreOU{S`jE7blRF4Iv;)o z-2vJ3$th$$uH3^#%spuyU@0lWQxTMq^T|*Fq^gU);>GZ5o(fpKbqaje$6j^5lbPR! z>wK72)Utvg;(Tsem3Riwb04Uf3Hh%+_gQGe*nDnYEMLj-%w;){G9+s-6loHH6r81W`n`AErdBKhPIQS9UL&(%v_5A}O zub69v+P5c9hk&rUQ8NJDw};HvkPnT3Ie!`QtUek!~ad#HrRj9zrPZ z@s4g#@uQtIzMp4<4Y~PQJLmh^WbFr!a*{X9bmfrZ0Qofr(OV`Kl6ghjP-z%;ai=kx zBHi{VywFo-9~{WkS@>gKlBv57O&}89`%UMu#jEd6*id!IYrUUT`6sct-dy!z+C|0ACR%)^eM}n-2AT+$EPPTi!51GKrld zhdvSMD}zSlSeG;2`%|%y!-BH#&O)%!;{ra%qmyeG-5v?ARjiZ<3q^I;CCn)D2Trv~ z#Cq5yZ^b6O|X8)+!`n@mtC$DhwFXryM`)>D{Og9QHVOtz!%!DhGm0;nrg@s z@e0EqP&J>3S~UE4e|vm*A)YdUbwAZQ4fV~sxQWR?%(~tPyiyErsmStynqK=rY`^^D z%+$)ygK&(nXZ1~%eh>C}-cHHxP-zp`y_S8rCM@m+4@J;k-X!E$0_ly?<3}QH?Mg%> zjua&E)Uu?=q~lJ{_;dKqfjWheYsGPaXeEUEr#97B|pDarQb%6V;mXFopSKB;Z!T^J7p{BsC0Nx(u=p=kN> z#B*Av^2zrVV&f+_1YO)V4^LhLRDuFjE&Zs61iy2Q*t8f@)=PC- z!;o`{-MhV>A-mWiot%1=37>D#{4Lm?c_-W!%Qb4YH4ZgL0g(t)H4^W*b7|hqISXVW zEsswbIguw<=y0V?$j8qQ(32OVjQr3wJC}jb23DmEZ#fevO$lkv_^3L!eV>&b6NBa7 zjRz$#U3rc(VGEuxpY2Wzv~RhxdqvR%K<1=XGNi(ySQX=fOqr`>F_%FF#RSJKnal7D z+W|{2022eL&`?;XMq1=dntx$RClGAU{1c+|cPIQ(zLgKM^i*g068cYP^jAKD$unpS zS$B6j@hY_{(f%B+6fEuWeFxRVTy#+8>YW*|3S$4h*erV7qBw@>5vAA>shgEg@c1&$ z#5T}a>%6yx_IjNxl_=y_n~qd`>M*+xx~p^Z``Il&(K&IdtGXkfyN5E&9}B2b>OcO) zA60;3%d@5nc)NDudBe@X%E?!+Mw`K{D2F#E6aeRNCtV ztTqsjdLz6;IXZv*nI24*p|Z<;ow{iCXH30IFIUh@vn9w6)Zo@9gm0afV!1k`>^6>T zObYdg1ZrppTb$cOL!!brg)0UNJS(po@_s!zVPUsedU$B<%(T5)_#`u!k|o6?Y!O$e zRWAay$4!`3$NY^J(qVz8{gbElr&qfuy_H6S=ihI2?3rx$mWuGf&toXj6BEv@Z!w$2 z0E?lnipeg+2$#r+3VLNuxV!P21FE4T|Ds<_bNu1Fm1PaCMe(t?h`7cx!t*e^?j zyK9z9B~zehDCu|{H5UT4pfM@48GtH1Kk-aU1w#=r@cUae2Z03xbb1v){|}|4iDBk= zi05Jd6laqE(u&P!q1~&7yl!)dr5Sycq>+$-U^okP*6F zL4yX~f5-M?uvFfCcN&10UoV<&8c6W&&&hJ+pDPri-7>M3mO>>Ews^K1F=2A<-3vn~ zkaJ_FC`8;^O6q6E@5qydmrd}}jSYAX*8jX{w%_=;|}O4#CUhR-j3Ez5)0d`s+`KZqvQghtO(4iRN}HWa>UbMuv*Cy$yr zcap)RP8@M=^p8F;qFyfABacr`TX|G_l;bC4oUIuqPmHei3!Dviz)+Or%&}8N8Uv!NH}a_N3u4|hCQ^cVISLnZ zJ{qr@Yri-u?dbNnJP(7Sw{-Yg5a}C!u0y-%?Ap_f?MSX@^T*-?<_G($EmD{(Z2OcS zDnyDq8J+HnbR*2|B?0)8^eiGbW%#Uy#BxB3{>%`hOj%fffR5J1sR{l`d8g!a6p>t% zgg-|{zBPEWiX?rSX3@3-MooDsb2xNii@6a#(GInjO5CGWQ!Z#@QkLtudk_cX&fR}uPQja6V@v8fuhUuX88cZ}EyUCxCvO^Ro;SFB(ryy25B8Qf13|>z;Z5{xv&` z+Lts8tpifHn{5gPVeoLG+V7y`hcmWY(F?~vsykpQl!MVlADzF(^#wIEfxbyaI-=xZ z4~9KZk>B`GT|OQqM|k@934P$ETUe0_h2Gieh+A4mde-=NwYAMpv>~S2YUSNo0v=P#%RJv5iK2Jc)H3Ng z|B_+1g)g~V25IYmT0caSvf2L0a}E%5%_>^RHZ?uH-Eq9R#)~#&SE*~#h@B!Es&3>x zz?nTKuZ|%U)uf`V`AMR`7hggGy=4{)8ydfORpb{se5{;Xv>Yt7AVSkKm`QII!X73? z(wITEQj-7F^tB!djsKdX#hO>}Kk*d=L&r1gR31_%vqr(I-v2oG?oONpStpS*=`H** zw|p0{gJh#$Rk9lY$K+>HLJT2$b5JCA`=;CrKPq|`;#k6A%aEzXJL?|sc}gp-Be)Sp zW)xmOzv-^Ui(_Fyak!R-)%gF?_WwU@{#(2$@r^^k=WR&x2$KeCLcJr=6YqylE<;`t V-tYOc&sQN3(&DmWl_Gln{|B$nFo^&F literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-64x64@2x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-64x64@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a1d384727eaa001a30b9df71ae2dc9a90e34fcc8 GIT binary patch literal 7172 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 literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-76x76@2x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-76x76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8d3d0e0cdb0d9492d085ebf2f8f159d2c4f3487 GIT binary patch literal 9839 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 VC|0X+fad@J002ovPDHLkV1fXVA!`5t literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-83.5x83.5@2x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f39b97cd20a6adbd7051f5a5801d4600dd213305 GIT binary patch literal 12566 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

S%d2rJ&Qw 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 Q80ZgJLG9_+C+5Nb15(QYh5!Hn literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-20x20@2x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fa9200cd22ef0a5ead471b732730a42754fb25bd GIT binary patch literal 1608 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 literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-29x29@3x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-29x29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..574f334f46020d764f0160ff84a5c95ccfcb49c5 GIT binary patch literal 4628 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 M07*qoM6N<$g6XH?G5`Po literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-38x38@3x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-38x38@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f424dbca369db883c5375996a653a11dad58aa69 GIT binary patch literal 6330 zcmV;r7)9raP)i6KpICD}0RTb>EXx8b1OyhW;Fr55JG&*+J<)n}lUGWc zGi8id$j&U0D?rW?(Eu42`Xz$3)(5QP>oLuzx^CKDk~(M37;U|Ej@v2BDTCXjzMimK zaqXGyC?tkqn$wRrX`*8)x1d>WwSl+rE>nLdJ z*E-;}tXPh8Iu+y@8qDJKhl5kzx61&ejFFkLv~sm)CiV66(dK~G=72^uk7{7#aSYEc zW{0xazG*i;{NTeWA7cz_Or? zs;a6O5ZLEN7rf0L$2Sm&?ATyO2T)XO;K-(yQi<=fZ*P;ML%_AbF zGe{N6K#||Ai-Ndga|Z|Fy2}V6lA(?NQ zoJR6NU&5XH|EnmyJZ>M~5ucJ**VJH5+iC|e3Le$Ay7_ex6Ujc88wJ6Vq|5g^`L!@j zW@@uTXB-eup6Cy1P=gp9BijRT@Dk}Ul=B*u$P)q+i3tWvAg0xHDvf0=%RInb(3UNy zgd}C4RXPyjwKJ^Cq@EB=3gS)*;>rG?%=*@GEr@aPTh(= zD)G7B`y4)f!}X3UP+eUenQSOco?LU(>1yo^%kT?B=P#bgQV=^GP4tBlo34F>N)SiK ztjUS?D`axXj@Nz5x-QRTLlJT0LR^`y-ApwDjYA4^eo(yHPXRs?Nh~pM^eS48| z9Frka!dg3S-R%UMLru_uK$vtL2y#;k>E0=?D~=2~nz)q`8{XNE(?km5q2pD$DJi=s zfYb%HW!ta%+Prylal^0O80zOxL#Cx$u(Gw}l0;AhM zDLbVgQg&)FAa?Jg>{LFH)SNmX_Ejl$i51y=$uLlP^0N8@_rnB#6S^!NDj`g|*A=ga zzPVM0$oL-krWOgcQHlkj3Ly{(SvxXFEpoBOIon(PjAB;|FBhB z#&qsv*r;$SulpfeE)+!B8^l~O%PA{;hhC$ddY8nU3^`%9p)7W9+as{k9J=>@gj$Lb zp-%x6Iduy_WcI{4SG8dEpYMk~cYgWY4+AMLYn61IfPXJuhIMd_*-PWiZM=H{Lo#$G zo5ikeojf~j$)UURW7N)}XDNUb-Cqw(DTqs45G(2$P|W8PqnsR>68D3>!@!Fi){x!G z>M{?_Me{RM!fW=-nKRfO0Wpv6&hsvaeptl^5h;x2fSq?Xav)N3y81R3M1vWL3AiPf z5+C)@>6IY9Y1OeJSqq$Y#+lntJE7b=3Flq_uAk_DcrrAn8(Rz5zk3+9Rh9>0$}8i8 zNU-a!1vtd8)2bz{t~q5vEEZzssJwQ!M2$?=3GE&k1F#RMXlkK!F?5e-_~|t4_E8kX zmLj@#UP4W!1Vk%^v2lW3chASc3y@kn`G|(ae>YAMNKoyM)WztyWsd+N(6tSy z_{MvNhka-1+M7X9wC>~!b&tyWsP_;6!wh;bnx^L_U^oud1R4b<1!1~TP$x+OfemC zHIjnZd7uI>^`(PrmCdba-P?sUYfiy{384SGU&opMeOwa2RE>s6@|xHyJ}={bm;{Sd z=VChl8~t(!0+22L{wt@Q(T?j(Z>XKo@EncQ?A^H!LxbV_7#o+R(6u>@no8m!&YDvS zB0=W^X}s_=ivzJ`k6=!PPM!L@fu?h zu@k~=GD>JVZ`tF-Q2k;Xm!{CQDT7)L#1yBA9S;I89uGg?S=rQz<((39%Jkub|GEc* zPdyU!r!E7W8`s;mIGt2sAft{pjPQ=nqh@F%2%7s2M%+#>b4wyQ2$7E3|9?Bo-d;FA>f7MVN02&RxI;Dl$ld%x*tD)51)7-C^NSL zxbH@SKYk|q{&L)$m0}l(G1-YzrI_oofPmbGi~~?7Vg7-W1L)kbHvo~!b-$EG*O#kN zOWiU;R$zwZsoP!R9Gsff0E#7vrj zBrsv-cR%9tDXxd6Rjoz34x57OU!gD3?A^K7iQM?|D=jwe`IB1Ia3F>nnadZ^@y|uP z&==NCL0r14+a)$63LrhsKL04*|MzbNU8=1h4v6a)5EMw69=aQ zy#M`wFk!DG&*e;#MrXuG*$0szqXAtzwl1S|`h2EEaM5U)|1tNbs3e zRk-sH>QIsPK_mi*DRe$Eg6BjKcX}WqN^0mq{_G&$d+4u$qT5dg#2a$hxPTo~9EFUV z3>l@7Q6M*u9W5YM8kxqJZJMu-WvyYV+F){549u^e|Ioq1c>Aqi1f_3UNkLrTf=DOa z;v+V>LJFP#GK}Z?@6QwoF>@zp2J;zzGv3i71qEySYDUCyt{#SkZVOoN066AB+v zw=YdlgN3^vDtZe=G*G-IiWOn4kv9BI$sc^gbQriJTz`CRa4X6c2yXj97C-vga8M#$ zw+M^29Dv=p6zm$4fyt&_I`PvW^TzoFNq~dZOtz=uyvd@b;+(2P&haI8KjQ3clI7&4 zt6mp~o(V-QNh#LuMVjK%sI%Yk*l9fX*2N%Gdfp-|-0XoU0x0;4BEVzszvZ0QWe65m zu}qa^+-~MVq(8cSsZ?_p9xI>O(V6T-+%tI8L-sU|yvB$T4L}uIW(gHrHzCLsD2N|8 zAo}SP#6}8Y!&2Uy#%ZHxTgFeHaMD|Aiym-_P1Op!mqbd92U)rhovy;9jp;&k(XT<3 z=%O%1s5$L;?0q~NXrc#V`vIgI6y{U_Q@lQY`W+O<-1=737I<2te7#IlesWg@2OGlTDqE`JvMd>d4%*Fefn8sQYp1VoKg2Q%SfeZ1uAA667&jIl)ym zOjLWLqP%KP1YAiey9qsWMvvjq=&j}(tO-h zxd+-C%gP1eW31TvxO~zFl;b5)@PmE!kvLz-#k|ko0jstl=qEer6x4J7a|bTI_>l1! zsmt;0U%r5))%j3mggugK;`YOH@bXYvIUPzx6A8LbB$E*P%D_agL(5u`6f$KeSogzj zT8&i0a){0P*6+fTye86YzukNZf3$SOIe&Y&0`HEbadtd~ObS>vuYlib9>e?$2?1m) zv@DF~;ewb=8!1~ky#h?_YjvfwI<4sq8e#Hhs)ICN&--f#w=T{s$U=n(85cSj@YGddt1slmal_>H`&6|g?kiA< z(!651I6ADk9^8*)7Mm%RiLh+hOQa-JBsR^Re}du1{}yAt{~4rLQ4rT>@vHTt!X&Cp zXjEHAiz#gDnTMC-%&F;|%Fg3N$Ztm$OW8&8I3$U#Rx^_-DbFNv^F}rCiLV79((Dw( z{p*Hs{roYBl@eZX6!%C^TStpl)38> z%UqeoLT@CGJaIe5dLIkYs!{~|+lFv`odm?75yrg`_ehK2Qo+L3p7}WRQASaLq+7;0 zCsuaSS?kEi2p)XkpRjprJJRW>qs+PnYSFDthM;(oALvECzb81aNfmKlTNam`QJK@t_9G*h^oSDd6GN zLujcg5k$b*6So}oK~%IaJ2p)#!<_mulqA%?5q#8MyAo_CTh|4NBZQcYso#yvM1(h{kV4_pWri&UV z$i;$%_SYKGb8dQrD9UC1OFRLX?f#xAW2p-Ggg`gJSTtwLx@CMMJvhIKGb ze2=$hQq8pOG~bNEhZH*zyvJ&R3!rO?1mb|$*N9gyWF~Elk@B*7VqzXje2Dm{M;x6_ zk{-tv1?f?lSx$5-oNzyEe1Q8Why&uAz9z=>eS%|5Jg4Gyje8>BBMqzpYmjB&v1O~wA^EiYonC*rsdy{q+rrLZ&Ultp_%peaAo)|!RRT7H^1G8-iy;S z0A7knJ}L-_viqWnuEgzUVvsi;iJqP#C>9E6-_q_7plJTkq*^|~@$1pBRtLm)D2Nqd z{>wB*c^xW)E=vo~6(1E8J0x}_sq&lD!FJZY)_b%U-Cg%%vje6bxgKqT2-=asTiKfSQ&9Z zJlWuC;xrp$Z2OS`M#YXS4AY%lwlEC5gIHQF$>)MeHFGluCf6MMgn+GVmhlbKDLS>_$HO-rJcks_0Fz-L$+%<7DlX>!u{U)qyS_ua8 zX?$Uz5$}vgKVC9j$Edre>uZer5ogG!UR=#Q;Ap09&m7F9@r6?%h-#UBV=P4s{t{1; zwHhbo2_idt=KZ{xB|)$i=o_oR=LZ@wkoTiQGjEJZ+nnNnK=}rE?3iF?8986HaK2~? zV!36i+jHCGHxHHnstN>}mSxj)l-^{wXYx`o4^S}M+c7*mET`;ofzoL{My)HuXylZP}ujDk)ccqoZR6xysw-bZd{> zT>gLTCbP3WCTJcfy0vAp?sV?BiIn2PCv9iujxoU>0@dY9;v%!hrMTfq$|h}R=8kb% z-jBQ@$%SXFGODhk-cV@2DoCQMQ)P|f>e98TvygH95$l-&W3<^c_U&)~JZN9M#+-=f zS|R%OoMS&Q&F0mOn?z5Qn9R~Ka_&bGcgWN|(@81qO?0=Ltz%TY9~pN?RaLF*MoW@_ zbeye`g*`;uCkv(M(q_jP6|7aaZsIyQk@9i*P1bPScw}iae~edH>nxEgK+Y23-&j@! wCLl?di7B-fMN2b<_Qm#8b?COnSvbc30|IsRftsct?f?J)07*qoM6N<$f;curf&c&j literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-40x40@2x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1a93825076394bb664a5b4c47d728d3f2b65b708 GIT binary patch literal 4012 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 literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-60x60@2x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..14128555a4c181a8339e9d243c998ce69164f0c3 GIT binary patch literal 6634 zcmV6#-BY*kqpEJzeRR4z!1RAkpT4(V zf7SohU;qDC-P;|SIPzQ#05na5q9~wAg9Zf(G~_||kdx|$R&@|uV@(sluZgrzfygbuu2=+EJS3NKf-k4&M-e z=)qU9y!Ql7Kv7d^zRBU6w!ujzawt!L)6YB| zBSwwTfgCYvI0m0S2pJg}g3gK6#RgiVq^Af$w!now-dUG7VD|4Cu=%g~2_K)h!}jG# z=SAn`=V8pa(HJ*=jIN;s(CqANM>)9$DjvH@^uaB=Y_DBSfost9Q<`*edx}nIfU~oE zVd(IoI*3F=M~obfveO3Y;R{Rj(&4_$>Q6&x5CZLHgV#U)q!8RYuB(e@XbB_Ai}w4B zkSveB7uDnQP4dsTu&5u#PaJP(=vX}lbuP8ykj2VXoVFAKz)YY;-Z8An5v#m@%?3R2 z_(mq5fP3c+e!)$ioCOcvi5R$bOm^>Q2UgyGpFTMlHe#5inM6xVOG_L`IJJ-f<9C^b zB@7wRZp${wdgAd7`iG|Lr!>20ZffNm(%^J%lSwo$^P1Smp~Hq?I016xaQ*wVpOrba zN8ruE1!Sw5!j=`KyOVR-Ccr+(j-ak06nmUGBr%1fR9mbC(pUUT)y zWl?dV?f{J$H%4D>hYTHpP$+|{AQryUn`QHOkl8%hZWC*w+$Vs&I_Tg&&4GJ`JGe}@ zQXpsO087uUd^GB3I#L5FEG)#_%G>daUtS<^gy;&2i)}PP5WH3?ts`&GYtry_G%bpU zSFFZ!0m1F+0(Kwh#ST;SEuw&O?vXI5PfiXVUQ>-z2c9Yg%}%Ga&rPE>Bi#!awmmt2 zZ*TjNs`$XYV@)ys`@EH8BzxDRo7gFQ%*f4)(6Rx3t}ykZz{k6jMuX5oo@4I zHJY5~K3cU3&pq=zQ^yaucdaeP>%00$%OsN|0E=96o_NE+yY6fo=brx$dXi==tupO{ zi#>JIK0pk#TU&530XE37_8zHPg{?ZccAA$%MT$PKsSrDM%D_#$ocRdB zid=U)EiXS`@TR(A*iwElZkrInoiO>z0Ec%hszbt{t%kR3woJAk=Umn3?1Vu?a|yVy zz31*2*kE$z>sns4%u$nt)S^1B4xy%5F(s_uq%gJFs2>OzFAemg&32oz)q!kaJh^rQ zGu~S+Z*m3K)Z7=1g9VWclO|`b&5-vT5MR69i$iZs{96-7Pi>&Z-myrV;R3YHifzw* z=ZbBM0Qui-;n56NkyM3n1_*)%f{=t)LH|ignW=(CuoGY6FO*P6! z9qOio`xXVRs^W}WA3)(blhJYX{}Q*;;d6H?@m{oaDG+I}V*MPD7W2R;ZH|@ox2XZw zWj3f2CIa`?sjZmv+g1Zy16b;sXzsrgn@fQURl(q!@7BT9TPB4PMLs7=%EBa#0ob&| zVBVi)v{^@*wx|9!HN5tY+1Qv}9Y~%C+#4=z$DAwLjLs4=fVHkQJn&RM2e@a<{4cb;WiMXn@753+sGYsV=q|LeOAoGo-dzqrxD&Knz^gM&3BN6O~t+;Bvq! zQADG_!p#ME@l7feQWOlHeh-Q+xQykXMg6OuFLKJ6rzB~x(+!B(U{NRh856hIS?+|n zZ+X(?2(TO0v6_41WlN`7=T^K>-m7TVoCEto>X>c^EV&SuW z@cdi7Z7zz6LDTL*(fNkv8g7NHVDj<%mx*^Co$sx|f^Z25x+uyo?Lzsb5l(CErI~D7-nB6Yuk5rB57bZ=2H&y}1(PPj zTBsEJCm8gkXcSUPl$^PIahSwQRCCGmN;jKu0BlrX>UoFo)&>b>tNCTyEd&BJ3074b z;8N_$|0#;{OS&kVYlcIrUNIVt;?4~@*s(jyb_i7!gJv#7-?Jx!3I=TL)qrTnG1Pzf zrn@W?AZMP$8XV8m@nC9ibWk3&Sx;em9b^o_Hb~5vS;M2%k71jsxhA-mXehr}W8++% zVjA3~0spos2Rn9U+Wa#!F=)mj9b9vG=Bi{a(Ot)yad7!;9Q*cwf0@N8XP&r6cBGz2 zoWyF4aHE4FKXzC~3NuNZ+6+pgSFI%AZez-oUrauVZF6<9uQg4@J)1M}$_JFlR24tF zc@g@a6$6*nS`%a~+=(wA{v%qy-sg}>;z-nHEG;BoBNEA6v_u;u#f{T+VF`Y@wvD;S z+a|Vi^}{B(cHhb`%0T%=N-T`AHZV*LR`q`0yCnlJ?^LZiWc%^7n-?MftjV@RrErc_ zR~NondpDX7>=DW&u_SbDQ~21dV536}qKh6|70K&V_lviycSk#sIJh9|3k&oZ`+fEc*_H)FGBuA16)dL?cd_o z@ZIJ`sNem%Rj-!{oLd6C^+WJ6b%#7PI8jVZ8w`iu`qp1bu9uBguyOrHY*^36xw9wt zLivasFoBJr%qdh{0X*0#b~XO^!=8_IQq^@Ry_jls$Xc>-#`Es z+uvk>3oA^bc{=?Rac{&nUHZ*zbg5ih zHn8Nuy2bw)#nbOhq#FZvX*UW%`i} zIrAicyUsrVKk0w~4XoiKp}rO|viTjq(e#DVxhJ&4}Wmmx<<5 zn-Z#mQ*T^^+zH01kR%-X@s%~G`LE4%H7q`-3%@M2W;wO1<040|d>1+M)H6;N?QNO~ z0zk!6!H;(hJp1%>PH=yngYsYJaLY2RrI{ozeJz5`?@-5js)EvM??vu}DV9Se3Wpj$ z*nyv3U29d#R5cyki_7S#ndtDyn*;#M)(*kC>L@F^H{)Q*d9Y7cO26Y-YJAz)_cvc3 z;!cG$+;mJ{RGT<< zi_eMRlCr2#SfL!b&#;}I@}j#_J&F|cBXh8=QV!YmTibqhwIl) z%Ef|<`WnY|a5z)M<}TUMhNs@`q&lNwz%}(2rfcq`FfJJw zrfaLJQ1PgI!X&yS1Oo!3BxN!)}J!K4Vxm0#xn`_U&>v68$H{&aCa)Kcx>1YB_?c&W1}Np zrW$91$$%9f!xhen_?;|?TP`gl+p6@Mt5h3~RZhTP z0oztj4 zf&R(%_?Et4a^}+IVUpMW0es|BZ8I7y=#U@JSv(L?2W%HTW)&0)TooFkxaZ|YZ2!mx zmpD}YuU~|mu~Vc62ecg~*X=)ifpGngdiC=ML{QX=cdF=aDonpT2JV!hPdW1>e{5Fc zz5_PwD5e=&?0D*mCc$Xq2&pu_P3mDe;!xf9YCQw463RsJbq}I90T*_I3Y;-7?UT0d z-)XgRZn0^1DMJl@X1K^NL2~9PWY>1t4smeua@XnJ#O`IMNxr@6xZDmyu$mdF0r$Lm z6x%;;vD;HKP;_k!T<}hmz?r8NvF)pmEIwljBGdsix7t`B(`Y6~&ipkMCi$I8qB7pD zJP)wG`)*#2>|ogd1wz;)PM%2S2_Y<-FT{&OpHNM2N~y@2IK zCtJ?^wd-k;|7{3&ia9=1m?W}Mj<(&bvbW*l=f#pYYVpEHP4*mDR1{wGAbO9PVkw>s zWYKCH4Ywmw|AT&AlC2>xB#3*#Ia(g>j$9W0NTk!QUUVEbU0T-EVDG^wwihbuwF@!z zDZUTAQHzZq)Z67Uve56E2a!E`isOk7ht~3G23{RUzOYuLp?O_Kp2ozzOqc{sI;j&W zXZ}8QZ#DoDFWP=C!?_m9Tq>5_@?JmCg7yft0w^j9{tyEf0IR*6*7A0k2D^FpYgU_M ziT$PRt_WmLo0}X;9KaraL%bUuj7{T61}uHYfSZwtg5Upz(OeOro!@_k_Rrr$SIbd^ z^7|uu$j^~|`UE|cB0FJC?`}cUdt0q`|8YQ=ZG@SXrgsJ$i=g}D$3LTpIuE91n&k{A zRAan{CRj?D3%0!U)fLH&2s~DPayN^WhFL&G->d(EUZbZ-wHD!a)V=foj(z+p+yB=e zLq={fvQ8b2aP474>b|p@9h4Kr#C|k#iW6)oI=DOjmXUNh^Zf`pV>Heib104}70p@P zAyn#~J`bil%%S1{k9UkE+AJ$Co>~He&_4T58dD zpw_|h)*)@4>wH64!L0YQ@qMe}XxF+9+adI6(^DzuZgj zLiWVp+Wp|{YP7Q*b(?0R^PAni+B500ft|Rrti#UdV_*$v>muOx#@>3_&qnzlN8mD= zAWRa8Q5-@C?5FUlO81Bdt2^YI7Gso`e!Q8L4iwJ zBioKcawGVuUB%(H5F*s`0fkvn{PW;;+QDBMR8z8$#5G`&TG~p?P%CMn*o>5zYJ=@f?>_bRAa4lY6||= zmVuUtio8q>gZf0B&s}p{l0jN)h!BQCw|tO?y^R?z(@{o=kuy&rW|l(K zFWG;T2V>-Q9xNse$qo6~lA z5(?e2D<69s_#Y@2bXw5AM9G;admV9Wh|i0IDg9hD{i+z-lt8N;g=C(y-GU>;B==pN zXx=ghk;5Na>Af>FtQ%j0Nd+AoxU$DMxCvl*%g4G1xP7tL&$66kIrAhvO-huTZju(2 zJ+i}clY{Q3Pl^>HndS8BNGDofn2+#b+vetEXn1T)4JPGxI9+cGWP6*@vA=B8sSm4| zwYx7qX^hXIO0=ALlJ+XmOb;D8gref2*p2Ae#%0-dTZ-9uSU{0Zv}~J;@K^6yNjVu& ztRGX0v-@_4wZ?Lm`988Bw?2n=%nEB@R)!MtzYCNQd6UPw ztX|=gtc;!3x&IC7QCXmm8pUHHYjJj-09**zI*$HgW$HUJFmq2~x4=yWr2ycVMC$76 zv1IWQEcn+2C@m=sxD*Fnrft6VZ&NAAC7L_31{3o;gQ*S!vVxYdf|+~zNx;>deMkw3 z`Gy=`s>mMk*L=Qc3yF7H05ml>p=xlmY5mT2y};We0; z>jAC|69eS>u!0#M7GYmwrrj6Gc&!HcNCnB2GtJlizYD$Gbxo4Tr&IZLM~`B~@+#bM z=K>V;EATxcIkeOdIVhU(iVVw_>`<*4R*SQ|!1bWkE(J686k{K+xh~@smUBx_kep5G zk$*m`t*OD1hn8aAA1lzme}7+A*CvpJHb89 zDbQ(>G)9kuYHDgwwW10O?p%O=1qF_LKXzCUA~Q}op$iMzyutM#66enNs2HC%Cl1_H z$vMzzQlee@nwnZHUAz?Y=Fda1Zj+tHD3Dfbit(EqRE=(So}3`f+FOKAo3nhB_D`vj zbC3TyWle1@s+PwzxuBpxpq2Jkp{G`hW&^1kjnA2Fi72>fZ!z{J7~E8nokxp4ylIgZ2Ot9OEuWd-CU(53l(X~CDIM-Ml~3o1`p9eq^QS-V z>BR9`zHB)v=2f7iq(q`|ZjP0G5a8&&7r>lzRvT7v^S)y2Z_P~FcvB^3`>9IWi{#UI zH(s{fxrG6;b|}7eN9(Y3$ucasqf!Ui&(??V=}4M~<^y1gnj$Kue^!hGt(i$5Zz|-> z#=$%TS!1GdGV;?7mDk+VgzBnlR8&-;q;!Cz!)|t1>Voyipm9*vAt`LAj!#-`sGTW8r;;SVEX=I95|Ml^6?^x zat?V-62EDF%ezftnwpxLQC+nX74zoCY_cEX)@aRfA?TP2)DWBdMKSibiR0Wk2gm`%iWOCuTQL`>oN@}sO>B|vJ~}UHBAPqxt705%4@nB8e!Pk1D|i9ijbsZ= z(81Dmyz4eJG+^1%<*2NjZ~a9rPxM9y)1pX&HJ~x7V%paxxL$p9yY@>xBWLGn678C6 z0xyBjGnjMVWN6w zqQc#a`YEzVe)!fC$7|_wR8-8xfRX{s<1~yDEf7jgM8&kjML5tAI$_4!UB1G{d*$r)fIlxkWo-~-OFIa$CqgG%9SfIfByWKCNnL>7Pe2@ zGjYTB#rV84#N>8|uQw%Uyz%hmG}v!rL70ll`|(2j@g*RWQ>fc3Zl`v<>;>`5aLA?p zi8tP$eC;qv=AQF;vUE3|Zr(%!_}10ep=w1nZl8M_N=r-izn@D5-<}$85WaSpBw9ga zuDdMVjk)YTL3|q<8gxw_IIs-i&Tz{33h6lF8=}*#6s7ud`Ffrv`N<1fK8Qt1^X(pAfs^HD!FOvip89FN$*M1S!$0U85;0F@y)<7pI$<|D z(&UfQ0H5TbX_OzKWZUi3*$X@F01Vt?t* o?N|#wO@hdE6!A#&O$p!s2XSwNRs?E37XSbN07*qoM6N<$f;-_1DF6Tf literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-60x60@3x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..91a3d6917af9e8dc9439e8bf6d3a17e9d175ac59 GIT binary patch literal 13248 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 literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-64x64@3x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-64x64@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..50194ba05da17dea3c3aeb346b5c68e12ce07ac8 GIT binary patch literal 14844 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 KMNUMnLSTY~B31JM literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-83.5x83.5@2x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Dark-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..abefc5d82dd731ab21456e76deb6e5dd605bc9c9 GIT binary patch literal 13394 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 z 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�s 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 literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-20x20@2x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..53255259cac5022a248a8f149264f8c4c502de4e GIT binary patch literal 1199 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 literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-40x40@2x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b165e2b755ed5f3d8390f43e2de08b986425a320 GIT binary patch literal 2656 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 literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-60x60@2x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e5abf0ed17febbbce02efb6b09b8f21b3fab7074 GIT binary patch literal 4020 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 literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-60x60@3x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2401f79050990010a8f3d38307989d8d0f389492 GIT binary patch literal 6792 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 literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-64x64@2x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-64x64@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ca5f496bf143135ccef4aec8e5d709116280bf62 GIT binary patch literal 4041 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 D?$0z2 literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-68x68@2x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-68x68@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..180e341f50271fd8c0c0a88df9053e986ecbd97f GIT binary patch literal 4651 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 literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-76x76@2x.png b/assets/images/ios_icons/cakewallet_ios_icons/Icon-App-Tinted-76x76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..dd284895f83dd28e10812344548faca39d890ad4 GIT binary patch literal 5221 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 literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-20@2x.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-20@2x.png deleted file mode 100644 index 7ea540cafffb11352037f5f7b95ea6a25c3b637d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1474 zcmV;z1wHzSP)Px)d`Uz>R9Hvtm|JWVRT#&AXJ*@N%l2XmYzu4=ixpH-D6ND7HA;XeN;KYrQDclG zia}_nMuQKCi5gE9ilD8^N_P0p>>H)V-^J{Q(lHk!y!TK9D0=jqDm;u`c;EgJi9d#z% zhWCwzR!&KPSEp&L&ejkfZjTA@mo~`*#|`THJUltdlDpCcU*zeGk9S|_8SvW+lI6b| zuBnU_Tcy6HSSQQxtfeQw(iX|`a${5}b%V}HgtGZQ(&C&~MFniW)Slm$ccR-OR#H}j>^!<4#}tW_JB5r zEmsT^<6(VBv;L}#C~J~6QUGsX$NY?PE-@aEPu0UM_ZZb^y_(h+dp5rboGBR9V- zAo#sVr)dB-RhfkR&|$y@moCo>z==*s_QBTa8VNC+%Z`A_`@(ca$ng8Q8XKl*d{QSl z+Ahft2v&y#uT+>^43A88L5kqH$%1G9u(Po)B*;(pu3|*M#(qigK;-&6y+CJXKv?RX z@52IImo2Q9d8fvtq5m@E{8Yg+lZ18V4goI95UdQ25%AA0$&8;O1NJV_@oR#YDokq_ z4*{xTXdaMkJ142@gLx@7oa%CQZ3u8~vS4j!jDX718i)+SfRnvljv zw`%m8_E1(0snVzbRcBA}!`hI>YgHx#5|*XI%1q4~(kkMFeX@8B$1Yw{X0We$g)$B= zh6JG))pIoq>f-(7246QtKFXBMI#Hxsjz!hi)>^x13~8ra2)i~HqzazO6xRRBdc_N@ zIqEfB?N)iaWbR>SyA_OwUAODpGuV}CSPwZGrLyYgM9qeNui9iwwcY9a3UubAc!P8W zG$kn0u>G8K{*+3^HwYfj(k#$P!%XYxPRUn|l06NQlbx3{q0}##qf?L?9WturSEHiv zuwkXgOQ;WarQF2Q&>dcO!WK=-4L5Cs9J7iGfU|zj|M_Qxwt5~Fy<6^-) z0jh^L_e%6c(hR}geBJeD5zl}YfsWgIta0v$d$F zN=$%iL)AEYni_@%07*qoM6N<$g2tP~&Hw-a diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-20@2x~ipad.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-20@2x~ipad.png deleted file mode 100644 index 7ea540cafffb11352037f5f7b95ea6a25c3b637d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1474 zcmV;z1wHzSP)Px)d`Uz>R9Hvtm|JWVRT#&AXJ*@N%l2XmYzu4=ixpH-D6ND7HA;XeN;KYrQDclG zia}_nMuQKCi5gE9ilD8^N_P0p>>H)V-^J{Q(lHk!y!TK9D0=jqDm;u`c;EgJi9d#z% zhWCwzR!&KPSEp&L&ejkfZjTA@mo~`*#|`THJUltdlDpCcU*zeGk9S|_8SvW+lI6b| zuBnU_Tcy6HSSQQxtfeQw(iX|`a${5}b%V}HgtGZQ(&C&~MFniW)Slm$ccR-OR#H}j>^!<4#}tW_JB5r zEmsT^<6(VBv;L}#C~J~6QUGsX$NY?PE-@aEPu0UM_ZZb^y_(h+dp5rboGBR9V- zAo#sVr)dB-RhfkR&|$y@moCo>z==*s_QBTa8VNC+%Z`A_`@(ca$ng8Q8XKl*d{QSl z+Ahft2v&y#uT+>^43A88L5kqH$%1G9u(Po)B*;(pu3|*M#(qigK;-&6y+CJXKv?RX z@52IImo2Q9d8fvtq5m@E{8Yg+lZ18V4goI95UdQ25%AA0$&8;O1NJV_@oR#YDokq_ z4*{xTXdaMkJ142@gLx@7oa%CQZ3u8~vS4j!jDX718i)+SfRnvljv zw`%m8_E1(0snVzbRcBA}!`hI>YgHx#5|*XI%1q4~(kkMFeX@8B$1Yw{X0We$g)$B= zh6JG))pIoq>f-(7246QtKFXBMI#Hxsjz!hi)>^x13~8ra2)i~HqzazO6xRRBdc_N@ zIqEfB?N)iaWbR>SyA_OwUAODpGuV}CSPwZGrLyYgM9qeNui9iwwcY9a3UubAc!P8W zG$kn0u>G8K{*+3^HwYfj(k#$P!%XYxPRUn|l06NQlbx3{q0}##qf?L?9WturSEHiv zuwkXgOQ;WarQF2Q&>dcO!WK=-4L5Cs9J7iGfU|zj|M_Qxwt5~Fy<6^-) z0jh^L_e%6c(hR}geBJeD5zl}YfsWgIta0v$d$F zN=$%iL)AEYni_@%07*qoM6N<$g2tP~&Hw-a diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-20@3x.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-20@3x.png deleted file mode 100644 index 6ac773754c72eb5cff386973eed6bc86f7a60069..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2597 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 Hu0mjfMS$yI diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-20~ipad.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-20~ipad.png deleted file mode 100644 index 57864a9b3fd5a2a30c37f82469674d611f992ae0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 688 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 diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-29~ipad.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-29~ipad.png deleted file mode 100644 index 27f817dfceacb3069b316a69f4899f09f1ecf27f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1112 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 AumAu6 diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-40@2x~ipad.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-40@2x~ipad.png deleted file mode 100644 index 963612d0c5c3a4280835e1a4474a886a819af823..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3006 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 AumAu6 diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-40@3x.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-40@3x.png deleted file mode 100644 index b6da404cb74011d7f2c549454b9cc8584451d980..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5335 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 diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-60@2x~car.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-60@2x~car.png deleted file mode 100644 index b6da404cb74011d7f2c549454b9cc8584451d980..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5335 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 C-#aJ( diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon-83.5@2x~ipad.png b/assets/images/ios_icons/monero_ios_icons/AppIcon-83.5@2x~ipad.png deleted file mode 100644 index 21aa1246316e0f95584e41668b3a5eec1567b746..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6642 zcmcIp_d6R7&?jc2M$MQlT52{{#U53=Mv1+*S}{Y7qKcx_H>eS-_NHcp3W{1m)rc9p zYVWPD_kVcbAMWnC=bpP??zwwD_qmUHI%%oWrAuf+a>`4bESrgl3}3LPWHVN`UzCuKd2lA1IA!#yUDxxulOIuvR-~w4f-fQ zZtAu46xY?^ucuIH%)I&?)G6A^n||XFFTBli zBHg6RL0M#eLq?y68mcv1gay|7!wP|IOo)9G)y^zUQ1uI)oG0 zH>pcRUHw{d@~a@l>{vpHe(%2eWgnX94GU{C=<5;iV|zu-vn4V5rO{yjG@RyJ2-Zav zqwxi6?kJrzQ)z#q^ym}nTC#GuK0Mw`Ah6*}T;iu|4cD1&so*5cdshFUMP5dN^^@#(|?+Fv?g zB3(cTA+JRC4^>4U0(t6y)aw^^CE2KEiO7og8=6keFld2J&qx4rHrcz1cIbb$vAm*y zFuNSASw-YNo6-|1*qGy&5Ps+B6A{TLr~FI$a2$X|Pr3&B)I&H&yBsaAcKsVNNpKj+ zf^VM}^}erPv0!g(@qeK#w~borLBF5owr+Xp&qiakLZJy>+*8WGn_<;*k71j@`B)I} z@x=q1(ed$i=$uKOWHfkr#!bhF{tE>OcsSpoo;3gQS1ZPEs>&8TbpX*Y^^PM!@`g}~x zii^xfvDzGJ-_+-Gt|Yd(bImv0p4|S#&OK93^??t*yZ>kHZIu_5-n5F+tg7OQJ*!nK z=9HbJiJdSE@_66l1E%Q>2%hogn6CbP%h*3g%J3rY7r(4x5kM@rG}u82^fG2n@0HKq zpLEJ=cre4ph5-JbxrAQAsF+M&Sd0Wntv2C>WtbwqeFtE@?a$j9r%?DTItJW^3Sl&8 zb4oim9~a zEKm@Q7f(AvYev|{i`&N`G+br5e{Q43Os z@A*CnxDKeYpLu-lbI4gV>kR$CuZnW#8?K}%xppm*=2$45l@}RQc%DlAUkHDV9BGcZ zj*~BItzsftVTYBlW3SlGj#p}#*}l^(#Kh*;U-d9vfgC&*hcV_>e!AajD9nKDxHjru zgqtzjiJ||STkLDl+rQYSVF_a0vZ zF;PJ9lOgeI7hMK~bj42%Q7zV^K+iJ9r*Z&r*$YRIYMMPTV?#rGP%!UR_s^bhSX{s5 z@LEB}(CJ~Sbf8C3wVw+;E;X3>G%dkO?mYs1I2JDvVz87wvAX%Qz8z|@AYT_OCi5no zGKOT5Ee5e*OP_#?Q&LeF2 zzXAL$gH8PIEA3nUbE6qX(~CB5*EKKK!!i3W7a$TS?hWb6nonC~@$cOC6wb)I?OOR7 z3LCyQ6wBWKDSq(7M>KcLx=G44_^&ZH!}S=R23rSO8!qUU9PlrQi~iDu3-WO$x$&hp zcRsUfl495kVAolfcyr}AJuTZJG)@);dl~FDZaKyoq2NJ>H`5_q!rjI?VJO+@rbYTk zBZz14(#UrU<@SdxXA)TA@}y%!p|#@cz%Q6SGQS~v)z_i`aW)8k3FRa*HQf3Hpbyu?dfXI5}89kR0^R`r#CMH9Bk)tj>jMi+F zthLxHUvLUvSl_;J4URL|Zb>Ag)4gj|rlX;3{F5Ka-v`e^GAT2v>(Dx{JO46o@>F;B z547HV5Ac$AzFyn5e^U2JKo$ijM3#cjijRdq zMKs!fTUKQrOA6Xkou80^acPQPQN0WM(gcO&y!=;%J94-{yTPok+M`{Ib}Khqx{wmu zJ*HL5H4-JM@eO>>rUi**XXGw^@|$8DWGo^O>H)b-Izf3Vl@Wzof3oxsMy@7}2n{5s zy!!hZi5b}lOt=kr@;_`Z(yOXlg`O+~i|fOtG#0G*G}Z!9fQ{mA!2CL@WV1{TI){^J znpjO*JIgvwhemn{+^wrdHA%GnW)*)5uZo5FLWf4*DM%u1ck^prNmBRfo1_l{ux}2> zKPGl7C7Jiz*Nz4E(`*GV@-^{E=EQ+1X1O%j+gA+xzOr2@osl_XfR=BT4&%Oyz0q=I6U}dG=n&`kSXn!=ZuqfSMHG zK4~FSS6RrpNW6xd&KC<=2(EW#=j`in+1nBUm}vX`@u3#ZA)$+-$+~&9t%`6yk;%-l z(+Q~Xd&QhNe%bzV*~d)hx!6ALlPZi(g;Do`0tB*_N2fI%d>Yy!|$4keI$tjYJL^D;GezfMuiJ@G(Tkg}()zwlT9d4PH zTE<=YrMsN>QyivDO%?Q=cAUj(S0+zdH|g2k%p5NFzG!{eky#12Qp=KTm4f*PpAail zF+eW9-`in8a++$sm|b}k1^ZnnLdzFyG(F}2R5o)+EW%*0h9zjxlSyPkS~;khg~)_ZMsmPEdp zX3n-LA5X6_y&bAH;Ol+fmW+W6%Z=k@e+%zuDU0d>ZvQ=maVF? zTR)tkhoO$7yt%ban)nNkviTn0Pa1IjwjWeROAhXxDW3c@8YZv_3!-FQ2-U{?mY=pz zz``e$4ksM5sdvrzLX%aq;l(fz$tK&H(L(y_xqPaD6nqUKedBjzkV{+D)xYP{hs{P? z_jp5UOv;!w^s^bAbj-zgPT6`HEsP7z&92NoAVR+u$m0-?FGWzj4O{_u+2*21fmsq* zFWc1k7nk(rkswG$KD__uG%StnL5o*GW59F-f_;PKc(aNtzd?Eo@vtI8ej5|yLj~K= zn9OTF?1o*5C7NTytUuJvbV)zMCFbUo*kJkUmKej|XZIJ%yqPON$oV*9@ksi>$d;ZnmRBD> zwu&uJ#t$Y=M~G<=TFK#dS+^T{aU;^6QkL(z1zlk}y|{TP!{A5iq^Yx+sI| z74u~x>86)IIys)DJ`me`Dd7D(>sl(HXaXF^{hI*|)7e_FR%=^HtA}}ldW5yNv_-lrz3Uv- zIU?W&Hd4IRV`IEzEk(Z9#FTzw?Iu1U2$dmHcA1Nh&O!Iq>t~6D2aNXzpZ9n6j|B?V zBI~Mt=8@P|`f*N;x&{H)dvG*DWwC5BX32qR2$*OVt5?9n{FB??LwvW%_Jo54nM57W zQBh5m%J>hz)Y-opV)`o|>5{O1o#uboY}oBip%!hF_wkImzJhrOa*ZkejbR?mj!Z{BzP~Y0f@{G{bW*0kZK(B~E(uc7&k(G+ zd>G;M7RH8!5Bgi627(~WfAmCzDPApae`O{dQ4bWWqi{YpdR*Uu^Dg!Mbn(XYhF7b< ztN$RdR_|pW1YS1O+qu;tLsgQMA%80Zi8?shh84WORz+dhDAdXVmJ;OO1&Wb$?9wa_ z)87aRt>LEL>Zo?>?yT?0Y9@B~ry6#TbXC*y*hpcR-`k-PX+|pHV1&xjs_&-L zrH9hBWk_XNTLAjM4~R7f@{(-+UZ<7i(?!dO`uQ)m+X>zy(y8q0DR1%Hg5WQ2L%Rff zs2Q`o;;J`ku689YH4ga0VR3sC#4U|^w|qGU7lV%L%!rlFi;{98;Qvk}6@0 zeM{n%{l+YlzYTu$e~d7fo56k6bAqW}{eWod95fQexQYaIIXp>)3qrC%Vy3y9K%}$q z1h|jHnwRV%n~>9DGwy1pK+MzFjc$iDeZYodG}~;%xi=&Sw2P11WOqj%n2ji>5RkH zXKQnB-2o8GNCXNmgQY~LiL6vtm+QMv+|wY&s?0pVY|Tn_WTUIl;0sAG(vOEt@ZhQoHz?3<@uKnzHPLVoXH-5w~%g-&5{V4Z(5Z< z=Q(tq*>Uowz3@^1T<4qU{;@OTPyHO{Y?)qzx64X<&amfy$XwmI82~Uf8-bIRwp4~* zH}WPK=gv5J@$M8V(*`})EehLMF;A!pn&MiP*-&$(RKfAxNgm#1mo{1n;M%_PVZwpQOc$kD&pAYgF=| z@HynQSfEtk^Y&NBt-4&~fHR${Cmt zkLJ);ecV}d^Prbx{~E*it0la#Y6^ou7K1o$N9f#<2r~Ab*n5jfqfQ7yI!6?crky1l z;cK6&m~@fJ3*1m$E>Pmf4mUd~F$besltGf}!#5Z#dQoF(A}&k{BPGP$(^{$7 zNNUlj*U)dyqSo^+>c98el4L4YJv2ahK-s+P z4xPW*Sup8*W;Wh!LtTBy4Y2>>GOfo@#xHtz2*1eW`%XoCa9^hyGGbk9yY9JX28iRf_Hz~JoExq&&~hj zvhCA!+bD-n^kAVwpt&lkSsQ&yw<;rI(>O#FhA~pB!6e6Jz0BHipgOCpXQzR>tnL7V;OJLf$#}}B(KSX)%Ejc4c~e$R!qG)E|(n{ ziT&#<7gH}PIBJ{dWCk666Z78%8!yHjXec`-Q}}LylY*v!X3Za zRdxKyKz0y(Y3m_GiENfH_NBz zL!5XX!JK!U)S3J+Ylw>y$@aL_^3T<3re=Wcs+6xal}ELWx){&?>(R!#NK(d=VUFFh z2PVGcCQv>Mo2C{Ofg2T23%dRv`$NEhR(Jq4=YOF!*?U?fysTKHro}rWNQjDy^XJO2 zG~gaC$~z7Gb==jp0QKJ=ghOs%ndgzMZ6!C{RNcYtWd37FqDPhpIO=HjY10@cLEb-iY~AJK_%P95{J3QHg`)Le z`>>J4%>ZOAmMLJ#u$v z0eFWIgEY@;@{{?jqBX4EK*|#Tdt*BXKYM$Gmu2y3iwOTdt(G`0vbj_^&;+HZ^$e~f zJ4;+u?438F(OWp_$gh9dk^W-%hy=MUW2tS=y=4s21xMNl>adGL8g%P@fupL79R22~AY?fXFceavQ?!i#2CNCDO!-af2I6;$&I_ zt$BLku-EJ|Zc*Mts3B+6C!`Xezpmrzgh9KZ#omFL*bKLISAXxr$#9A^*YjV>FPnas zJqykK;ZigbQwGZ3*x@NXCBI_S35Z z#$)z(S00zQ>S{xTSSwX%CFJ$ue3rKMy57(Idq%7mvzX6*D z@gYqFLsgMCcc>lH9bG#RivE3u_7|i0K}jq0=g8cj+e4d&B8i)9{qWS0{DZtEBr7eg z{(0;WzfT`E%L4zPw!jP@Yasd^dBG8VfnsIuGI&Hx*#87V9Bytave;SEa`SkDwrf^p1<}uyhG80G18kV%vFYj$Tu~r zexeBQm^UZ+05-|-+e?6WL5L|GtqX$p2g&jyU};Xc%w!?@1h4M$u1(9fJEosBRB*M2 z*uKV#?x`HDX>PG-d>z9d=EyM!G5EpuyH$a7i#)qP-`r=9tNgB~odJ+nr13JLJdyKI z?u6Ftp&zorx~qR<>6AekiV0HlBX5er-86VI8Vwd^J_ZCG3=v?7RkKZYs~=2s$I#EX-LnrQ~+LdSWaQ4(jCExD@-m%6rlCKjsTea*#JvEiZ4H|iy z-!C-@N@{+mntr0h4+(}|l{XV2zrQwil6W32R)4%xu|NvD)U?c)m?ppu{c5gx%Zk|) s@OLz_CxVD+Eq?#&@&Ax~`j0SJ6Px}kx4{BRCr$PT?v#_)tUb8tL~;3dI5Teh6b7j4Cp9C31N~MO-wX837Qd=9LK1L zM#gbB?xO@FNgyJV(L^GesKI11MorWi9pfZ83L*xCW)&KG-{_rQ>)o91K5D40rK`I8 zzN*(n{pWB{y5D>E-S7SP{>%6OS4b%(;u5nnAmRYWEVk;!;sD1szHxwK9N##=ae!le z24ejE;(Kr$;258Q7=OLE2FC%8@fnEm*Nba#9N-wAff#?inAhMw33R!EZWHJ+CHhRD zUjl9b-cfj$01^a{D1anGAlU$tUBDOv5Tp1bh$(=XHRcIE$KhldwE(*%@JWZn zEAeNGmzIM=}6juS8(x{i-JfVr%0ZZ@%|Tw-&x zM5i0zJ{t{Dd$vKX25v7la7n&_REMebr~sJS+S(6nX_5G0xrzU6mN26PYOoK9xXw-k z{-xN!1=(D_g)-WrEsh457}oblY;KWwu1eyK#*>Cov?ngu^J$HrlL=fq(ZJu27bs2@ zQMJMy3oteGkH;ils4?++gG61gQy~pJF1lCePY}4WK;SFc2BKwsI}+fgUWv8k68~9m z;=pl$OY~?IuFwTzfQxelZk}vl_Snd4v*Q5X(kgM+J`-D8r3y~Of+U?V#8#KOa6wLF zH)h8G++za2tut}&eiKK!V*ytGcc9U=vc$kG#fFNMMM4|_F#XpJm2`bfH1$Q|wWIe8 z>hHG-1s<4gU|Na*jWRnW>Hr_@Q6axPO{~&t}@|PDK^q zvQCKy4wxz$HChd+P+$i8Ig=U-vIJJmFz|Us!iIaJ5Z6Tw;N2Y(ckVOsR+IC6Tbt%y zg*Q)21KysWfV?sGJS8dsb6LJ+uZdUdrLA#ed!|g^T?z2r#RC6Y;sTd#J0#)&GlloS zK@-nZp4#B1yMXJ91n!yU!UP*rkP!u#e(l2tEo(Vi2?9H`WT^MdNC1{i61bz-P%&#e zC1L>6KwejFD(z(k=u{Q@!nYL*+%m;Lfz9A@jw1%}%XJdVcDtkQ=VrKof@B~o!J_3* ze|k@3tC-k0)^A^Els@l+(*5lD6-=#EX;1%+1%b1-?~i;B#4G*cK{%^SzxC&sR&lTrU+3=(v066d-cF?wTra zd$CLLz9K2M0!%~dH?^ip9#r+%`&zV0=cWr>lq0aTKwxr;UgM>q*P;h)s*#E+#PDi3 zn$3^xJ4FJw78{tr=thLaR)9Y}E^%X-70j?x&dLBT%QNteJb@Xh_VS~e`Xqi=C-G9P z#Q(Kel%ZfU)@2z~H%&H>n-qC)Z8fsEpFMHJ#C-=$+tPlVz^f-3_@_dFGt!0PM@2&T zZv1!&^1mN71CkM_tPht6EH5%JJ_?%anFrf6xV9Hq@P5B-slUm|v`AgJBu|9RmLN-{ zu}`AD7id-7Xp8*L`Oon1p%cU3v&paiphe>P-EJK2I{9hQ4){T-z_pVizvudX;I;w$ z-F+rjm)nybnwciBZkB=bvj=BLaATlRL`!&UyTtBJ>;DH6x=zzmfO+Wx^D_j-CWPib zH}?Tw+wN9i6Wqs21#T>|FZ?)^Rmv8Ck8}ZZ-s@Kt1iIyK(goJdHk8{FOt>%B_W|#> zNNj7DI5x~2Gr>ADU0`7*P@F7~o)El@rLr5i|9~6(__*gXTIB@M4luRmj(sN9+MvCx zC|Ez+z{0G+;P#q8dAG!tHsFKS!406HOnxdY^fX{Wrod@wBB&qB4~y?l+rTNJ9bg(C z7kuPaWI3HOXDsmKX)Y`ZqPg_9H@8X^ps4PJExhURiNO4HfpfVd4*s zdcu2r4Z4r_PB(C8u>mfXzQT%!wMR@;^w?XIxO?4*z(qUirC!9&1nhab&(Mn=CQM3WfSS>kL&sFQuUPAiKJb?{! zTz)PG_jhgse{6OJIi3dKvO)uy4sneJY$v+9&F*NIShmZ=hi!TQW_0PT`7V5M{6Otx zH0q;vi5F@mTKb)#GaTVpCkXr_jX-A%>HkNeO@rTTWX{*E$~<)lC+xL(F254YwtnD= zN)rdY+^{ScFeMe((XQjkq3@wuJR|~TUSpsO_3Z+IxnrGWa%lmWjZL1aFmdx4!qWQavU7#*%<=gF0_~; zP7y5tGstk~em8zvp=Wt!#eCVK1V5jbl@AXcGF7s`TL|##83rnQBz{w8#hg72R&-4? z0c1~(YYGIWBnt(uH^6)jHG65k0K=(H(PJ$D)1qCn!>#Ihb;w;)4XiHpSA##dNc=p2 z5$6Gz&py)4vQw#o9(qP&1v83MfF-#Cv(f|@5)A|}N6ebwujdG`mxmKX3&2&~z@jbv zDA(YRlDqWAJQu#~vpmzdT2*f1Q?Im~X9B$e=D$_-NNlPj^J3&vOmL^A0GH%g;BtJy z0Or$}iMqDXP=OF9h!%hk9+x<6vs(-2syG>V>$5Ju;6X*V#H#YZZjmp*oLFX%eo;%J z-^ix9C>gjiPoOmQWF_EW0JB2jrbz;)N1@m|(3@%j_)o_qzWAY@+~8NT1)iPbQv02^ zywfc4Vr}3$ra%DmTDnosR9i9X;Ye131r{S!-h1j`0P{JEbA%%O#Y_{HmugI0zEh9w zdP9-G_e)*i)lIr61zHw7V)CNw0xq)@$!{W0Fx+iokOf? zEgJljqb64D(F5?qC59^L@J=i+47%p1iL%bXdN>%s-iFsFouSi+gp+h2TEkqH14$@= zdHvl}jEGZYZCj$hf5^nW2lN2U!~%(G-aNIAeu*^|ascni`(;7_%-=oQE%6^Gtm|OQ zwa1{kG*@8uAX%bN0F%P|=yXFdK%y;LH29$dCLTGY2jFMskR@ph@PQlpB-U3*91UWn zhXXJty1v&6aqbARC)2>YEKjI@l!LWa2n8^&T|2`Wv1u&;KX|~zN=*PiJJ-Nfg~kA* zrmk1w-zuca`390e0Mj3415sZ?hlbb2YSRzo+$7-I0)JjL$@>iCkcQ)_;SB{a$M|@u z;b%ugLz^83@Wwe7z~0Oa1#qQA#Sk?3bv7vNk+`zJzkeh(`T1JQ@S=asEYONc{stAn zWtY9W9*K){PVT9p0OnFpfSr(C(gN_RPfgr^P|p(mli3EYFER#bUQ55k<40xCKuRDD zCcwXIkXV!j1Gyuj{1>8Gb&?@=N_e=AtPvIeDP9OhWv- z%@VIPNE|nTFJui3U=kG`m})qJU8x1&7pqMy{X~xjub3?Gy%{dQ<&D&wt!;th%Yy+- z2nq7%GD#o^-R_s*zI9CE^(L#5kTO(&=cF+}GVmjf#{SD^Y61A2CW-U5>4{`roFnk` z9G7aN?=7!3NW9V*xZP4HfO#L1_s-4$t}Yz7{ChuxD+R%Qvq^$XO^*x};Pb}|d^0!v z5*Rzd*8=eVPKnu@-CFXn3@*Gm-@sI#^3UC!66-3Y3iSI*H~@RDS&(71`t_{`@yoE*<_h4V){b_hD&N*r2dK*;SbA81ZVCI@xIl(`^!UFGq$T3uB z0VjwSfSG{5^kcVjDRjsqC5GzdI1&j4Fz-pm#iA^M3ny47t#I75r~`q^-}eQ0B;$(o zwORls59`*wR+|PLGA~15>jKw^4!Rf&V2;r;ysX4LGgX82$vou&=CZl|sHtePI)wY< z=5t&)J9GHNmrww6oU9&XeK5Q13?`>Mz?_`d8Z1_2sQTM*KY%6q0-Melewki40Eau4 zIKTitYLmETmx-O4S|!n~*|yN-M?+=mkX_;F$_z%V>o5UQY;_1zmzl1?3(aPwu~sR# z3#MZn!?}l+J(v%!>5;f?uZc~ydiG&1&eu$2U6N}+REy8z0Uf`pmDt(ojN^4^#sBjp zp&EQUO|$__SL26=O|1M>U(=OI$-vJ(<5K4kc?&-w_L?ThY|o_UlNug0%>A;;kOrF* zMH|3;IaW82*})=k9YUXVah|}MnFfk{;>BE^KW?+KLTsoK4dE$g-^dj>Z=C(D`G@;{ zS^;JO+R~kR`(jZ;R?aYRLy_UvI)VG~jt+^Zsscy2hC311*FHj!QgQCBbetde)A?A?8QNAjy};N3J(lI3Ha^ z0RE(1;-c;Dp!AyI4wQQw*&d~7{ty#XcJ_I>!AdFGb+`w&42B>HE)UZfS*&fiGcmO5 zv}-U!9oOyB7uE89ov&sK{CK8;SwSlJcqGsJtx}b+lE0-(n+ar25^%;?fxjEa_6>mz zD%Du+L@0DB4M*Ri%b1@Cqcf<_Rtj{a}wQ_OBXle2q^a zKbp@vV=NR$I#?@U)lQ>nt`Q-LbdC)`c7cIr(>zh%gghsG}OgSD(6$?vgJ z1D6*>k6~$>1`|LofjpCt#Q4TxHUtg#L!gz*nqnGZ?5(A{0XKnsuUX;`4OSqBJwn2< z(&<)xcbdiZjz)u0TLC6GwLQRXd)=zFg6_5ozTk6-W`zRxX9giI%n_>1|8VBdsBOP%=^t#?BjAp9AM96G5E1;w?)#6jBRZfOe4E5LEgDA0i-9{AyEUE zFGF_ZiZT=1+fKd1q8UGD)3miSUCLh{ES^3R;G+sK2Tp>(J^QWbP$&ZWNM6)Q*V0|$ zaeOS#Ie&t^E>qM2=ENU5F4d{v&(}z8TxKT$>OB?)VMtuKXPTAn9Bz~?-1lYjAf84cw_8_Dm|kUBkGsK#nM0+)H}XozD0=424$LtPRt*I7rb zZ*2|Sqazv<7wnnT&{?U##koSUIijJp1B^Odr>@vJ$s`UO=#+Tpn8YuurShAdwrta2 znvw!_#?yt_2F}b70Z(ePbDjd-+tC{AJ76*;Ssufq14vQ*uoYUGkdJiI+3ug#G0#>c zXL>LO=18A4)ayqTz}_!Mi+f9p#D*#puhv=pHAwVhTGCFTrt&Cxk_mXsEfe@`{S;~A zDcpA)wE%m+AQ_HtH<@6+E}qlCq&?dovWX~{_mKz#5o`-g2Isg$_K*h79dF>=3G`** zSYSQx91{S0UWUqhtQXjKT!Ov34tJ3Y4K(#xg=st;mB-={be{F(;lb0LVIrP{_f(g4 z(sx#(Rn?F`#wzTdkqXQn3lsz?TN%kmWaqUp1+ec#5%4ZIIn35Ec+_b25K#b2TItq$ zPTEeQu*y>Cx3YC`MuGrOGh-zoe?D3zrU4$Upy(WT9AKTZ>A-u%0d^oLI)@YoSm$gy z@Lq9%9SDlfA;kgKIhzi=R~%pmf}(Rsae#HsrUUO42iSq2=p0fUV4bt+zG|k(87U=~{AC8oq?Y(%ni) z{(S$5_hQbum}lmhn{zRr=(ie*#02yN004kkSxHX&pJ)DG;er1tq>qL5p8>tJ6=eW5 zV~l$M0L>d^xi`B0W=FXJ@APJx(4n_W03fIrOra#hB8(sYrs{1@g{9MhjuUUp`0ER9 znuCFzu=PIUE3@06IZV(|(=3g)O0+bH_}LT^51>>0Yqcp73_^j(QXN?U zYF`6CWZ)ukh@QR$7rH= zT2!hW)ZF-N&G5upKBH^~>Bo4;@bDpz4R9k#1TOf&JttK26Ocj(g{W^tbyBrki0XOS@``!? zg$>55_%BVJVx`YgvjX}-$*B>3b~|kImgO{OdxiMFBtM&z~4fO9N*;=le3i z579N-z%Y!>3?Tz)f`vKraN{V~4qkc3nU)rDXHrvcZ|2m11c?a45*E}xmI2u{$6Y5q z1~URHF`T6YLua|z+wlZ+lMJr0Wxyckq67wm4l1dQ=55o5?gu99ZVBT3UM!mBtB5Bpo3#aqcSPn{NoFuoECLA^&Pc9o%0ciJe!0S7^Fg3b>36vmop* zhb0MIG-IyZvwT8W6XRvRpMOoZQI(FAR2sdgM>?hx$lmDVn3829?X-x87l-;o!3w#C7y<#VEtAK=Yb}jourhEL6 z!08m!4Yd{h!tmlv!CgPJ^CK;#of|LdTBnS~A!>m@?Db+1KM5riUsqH~qEib^xcJ{T zj)@uHski)h4+fp4bdA^fT7*Lq1HTjd5YHX^xIL?^X2#Sz zL^Zwp^n#)_6nU$m%ca0-g$!;sSRY7acetm1wdelFuC>3tP_2Ko3rEFs8MVJlBRp~& z;Q|Zk&_}lq$pr!K6l?7V!WWqX%lJp}5F?s*YhUnaX6g_4?QopjOw3_~sLFpv|nio-I<2Xz$Uq3PRM0VUbw$>YfyAo-bj2E8?xwa*g z(EQC=nlUqFI~`a};++oQ*;s`kmYSculyXj$@ie~i25g5&;dU)@U5$Qgk?8x9VnV5c^Wc}{XF{&O;LQXT*l%m~GY-*Z zIUT}}K4}n}zh#5|=9j9-NGKJ&jKB17XFg2<0V999cV+Bak37RPX2^A)712#wW}(=z z?tumhcL;JveDvZ?n8+~zipb$+? z$PS)wNhef0I=OeK4(`8pQLZewN?!9*y z5#HS>PWiEA*2*ialbOA1pYeeZjy-3;h7(Wfx`#h~k@D`U_H7|js9%=dHw6Rc&Gi)) zj%tWh9k4Gx5C0 z$ydRRgt0*n59W+C!uvT!_4BR#Us6(8L92L{(U-W^QErrF=kR7KHE-e`M=TyUJj>X%#B%Xy9exp-9WdnHyzL}1&1^+GozVHN@bAxu4M_?S$8{_WBa~$IRR>3&S3vtA z6{z%Lt~f6&K`*EyaKMgS3Feh%1=b(vodn@@a0 zd&z zhhGs-fR8_(lwi!Gs%_ve9pfo1!-^2$8tSskNk%&^ zN_qmx+V$8OFeo5uV8v+~*RUa^;g0MSAtIHLE06=&Zi(m?MnSNK454}r7w2T{pH28B z8Wk+V;xD{m@}h2`Y#|NI=MycbUcdJG@DUOMfu0CN@5IqP)RB7je&OZQaETO9aiZ%d z!*;X)7i94Dc`6#CB(nsnOB7Ct?pU(g_z&$4f-K6R?ivzxMdfX$-rrlK4D4_l)*ToeAW|ds z=;57vQ)A;zuZSc}sy8}oKwLv`DHx8kFQOO8{3N_yeT}|q`!&pQn^vkZnT%E$WxX$VElyCD8RDLK*iD=EmVMhoR;)W=hc}iO7qWPUJPN-lS zI8X(PrJbTWCL3gK&-3?l)PcVrJ8C0WvcwpB?2|I}bK7xZS>;s~o>i3&`(M}Nq|ENF z_I0-vgXWPWlS)KAAB9mhrgXiOpZ|l`;f9bI2XEt}jfx6i^pv6B-H^=?L9>|^gM zLbETMn_#VVZroo1qT7(L;lOJf(yyn&d^2f8dxK>!rShP-p6m1nmhI7?p_9VJqm>}M z981df5sEFHO7CfP4IZRA4<%%~s6f_+=5WvjCIGJyU_K0TLBeAFp|*rV^nGfdfN>}5 z0trdE&LFz7{wUG?dF$lW&wPkD*3Yk{hp%xAqSeNK0<0wKrfI&$+czyJ3v*37ru1?r z77Ct)yT)wC-ldOEeDY|&dqZf)x0bD6{bBN(z9kr<`NWa$b&wjvywSKEcqQI04XE!U z{pF6m32Cau2VE?kR~A zzm3!C!1GUItG-zG%;6*6y`20)_@Ou4&lPI!C2qROwP+?7szHZ1JQvTGKP^?CSL6A) zW*a;X7gtd5h7EEf>Q6Skho7YC;PYkbsQ;3n$BAzpw8QTAIIp<;P%wdZK7TP z>x#VuR(^Fp`PNaZNoeM(@}bicrOUNCL^VK2>woq>3u>~RaM8Y|ar$8bWva{Jt`R1y zvooo|jqAK)Q7{qV@TtG<_*;^PLr2!TNr2i)vE620gd93lNfF^G_$XJCeW59iSn6(6 z2q{_^EuNGrtrv=mGQed0Q0(Beb&Ch%2kJqlA77>9Xx281TOrS4^OveNvTK*62^jiBeE9t! z4d^>!wPQ9iJ$%XSx5)1 zYG^frB?ynQ2vfhsW3IkqIqo#?8{b_^(h4T7&WO<}od#DOUpFZGpygP6H{f$XtFni7 zb@U(srA!qSdLWv6i~jiB{`bBCF@@AUpJgfpN-5)OR)}&!2d#Xv!G=D_d>!zk#(*rZ z4y^g^M+o@Wtc^OZp59(zks~~9up6C!~7~Zj6Mv<;)E>g^p^{;ef3G1K8cYu2r^t3H0I1K=zM`+mmT_K+{}*X_fu;+ z9OqDMh=kPpc--aRCyQ3l&J5wbaAt$}2+idMnwv@*@^^Q;IIZ0I+ zmlWiq@OQQUt|fn9eV#mGCrkoixSuCq$@DwSY~!KR5D_*6O6eO06Oqvfl|MrQe z7`_CmUjB@`v%j|Tw+i=BGZ8M}xTVts3=QSqI1Gr95^?wt=lI5%}ZXtHYYD4d(ku2UG$J5@m174!xO%LeNi?_UXkcrB^S=$Hoylk3&T( ztK6vh&Z~oBk8yH-BbKjDtMAO-NpYNs%>UOTeghr{4k>hf;}4v(X1idXDoJvFH{Q1V zrDIqFpZUB@mNpMNj_KAbK7rR@w?-aSDw|~%g3JCc%VP$!)zo7L+(3-hObUfW9Pd$y z2+GcMx^%XM$3BP(aPbAuLwR=Nb18QCGO?p1zwWi6_D>sT{(^u-1PYTkY}n5o6Y zATXuos=nThwU*ra$Y>~*lTyp+k$5cslp1kJv$5`GRDIbOu(SUMlTt-{yHuCtVYZKR z#)J?m5!$p_cVxN{*b)k~sH<9#&S}MD!^u^GMi+E%j*U_Cd+q%waaHzze4(pe@9VSY zl==M5glY^0YZ-$Aw=9g_vvbJ7o0m?F37>g<*dHoh;CsLtrB`Rxvd*SnP5S5qXbyG- zUnj0MF;%l~M*Y&_)x~$hs0idFV$(5)#~N zZF5%wVu{6zRND1*vEYu{tjphCg+n$C!XQ~I=yyx zx>A*>hg<$*d)pr-LEf$`Xj6oTK;;QuoZ#fCAYcBT!;BS-h)LVJ&NgJ#t# zjG%{7)LCLO;}0Y)@5aD870lFaN=>$h!uJ8pEXzMGS)^8wDLp(YBZoUHs#3KesO1Bg z4}r{2t{a)mGV?le#Z{W$_>qDL(AIdap?`7PNZkymb7q1kp7R1m*s+qUNAUo| rv&k1qJs^~XFxjt#xc`s#!6R^kr2yrua?SmZECZC~HRNh!5bys7f~^wE diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon@3x.png b/assets/images/ios_icons/monero_ios_icons/AppIcon@3x.png deleted file mode 100644 index 37f7651a5bde6555c292b6b657c38c7ef353213b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7344 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 C-#aJ( diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon~ios-marketing.png b/assets/images/ios_icons/monero_ios_icons/AppIcon~ios-marketing.png deleted file mode 100644 index 0c977110aedae277e63e510d2a46e89033cd7545..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69847 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 Nxx>b+$iyS+{{SgtRIUI3 diff --git a/assets/images/ios_icons/monero_ios_icons/AppIcon~ipad.png b/assets/images/ios_icons/monero_ios_icons/AppIcon~ipad.png deleted file mode 100644 index 849c5612ab57d14991efed0d702230cbc6a34b7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2851 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 BSfBs^ diff --git a/assets/images/ios_icons/monero_ios_icons/Contents.json b/assets/images/ios_icons/monero_ios_icons/Contents.json new file mode 100644 index 0000000000..d0d98aa177 --- /dev/null +++ b/assets/images/ios_icons/monero_ios_icons/Contents.json @@ -0,0 +1 @@ +{"images":[{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@3x.png","scale":"3x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@3x.png","scale":"3x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@3x.png","scale":"3x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@1x.png","scale":"1x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@3x.png","scale":"3x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@1x.png","scale":"1x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@1x.png","scale":"1x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@1x.png","scale":"1x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@2x.png","scale":"2x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@1x.png","scale":"1x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@2x.png","scale":"2x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@1x.png","scale":"1x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@2x.png","scale":"2x"},{"size":"83.5x83.5","idiom":"ipad","filename":"Icon-App-83.5x83.5@2x.png","scale":"2x"},{"size":"1024x1024","idiom":"ios-marketing","filename":"Icon-App-1024x1024@1x.png","scale":"1x"}],"info":{"version":1,"author":"xcode"}} \ No newline at end of file diff --git a/assets/images/ios_icons/monero_ios_icons/Icon-App-1024x1024@1x.png b/assets/images/ios_icons/monero_ios_icons/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..e62a1a374d6970fd64a28d3855e2d51823c8b229 GIT binary patch literal 50680 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

v42H-H=3P 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 BHU0nq literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/monero_ios_icons/Icon-App-20x20@2x.png b/assets/images/ios_icons/monero_ios_icons/Icon-App-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..be11384df3d531d9c972dbdd9eb2c1b73b7f0bd0 GIT binary patch literal 1412 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 literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/monero_ios_icons/Icon-App-29x29@1x.png b/assets/images/ios_icons/monero_ios_icons/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..789fe1867740b23b99fcad2cb4818171768e47cb GIT binary patch literal 1006 zcmV-t}JKvk7{Y=L_X{C_~ZCX_D*l#`=MWJ;NEAkT*CTw%isVcRO9Hc##j^tW-P>4M8Q zgQ<`I%$V}!fbwb=G?WPKwH9^x{_wO=lVTr5U3UNBGVLzq_u%L?<@k`pJ8LaotQ16& z;l5Cl)O)*J+9R1K_pHK8=UpDivv{l|1L%Ps^#x`N)aOHSmM}D{bdHe}iPyry=3*=5 z`jpVfr1Hx7V~_K;8zh&(oO$+^cP?=kFluh?ptjdDsKb4z4Sv=#y{%+-sFyz|l zYc&aaYBV`{Oz3_XiFviRN_ekF8F%8}m)r1ih4A`i<-`bVDM`yrhF+dpIIhfr@*Lq% zpL=V(r%GtQ5(67xQP${5l3-T~k`BW8M`mL0FTf)GUKzL-BF{3|yFm zogrb$g=`DYGb0|Gi{SfVSe*?v@OF)md;8=~hCW&-d>CCA;t#rA_OG)z(yv6Pp>GDv z2_GAd|5#f@S(6Pr%I~1dG?a?ht|k)B=0H?=YBfArChY50Pg@hsj7^zsD@`v7zEC4? z&#w{oU5W2(Hr;yK;q!-VTJIN5UN?%Q+?ZFSeBt2&y!W48ba;22MbOHywKaz=4qtV= zu+5vP(M>-)JR1@kD=c<}1Y1nzD!<%-7k+o?=usRm`CJay`-4+Li-N+zI*YBRT@nSz zJa_ae9leg1Foi)Foh3=9KkHYdGX@T%0Q)BRrZudb7@ofk!lVPsyxSmbSSf5OlG}EeB}3;e#}==S8%i@-^)I1! c%l;GS-;EMzwDd7Nld9<-p%El$gp`(&Zc?I9jKLIA)rR1OXYhhC-tflEt-_&v|e^TSAl zPa1i7GxweE-gD3S&bbq(wbpzL5O=i=m@Zr=dadC)(Q6IULiGHgrlLc0tP4){YFY=N z$8tVPG9hy&bYCBy1~V)hIba~rN0(bIjJ*UoC*YPPB90NeEmC(9YYid6XOJcA8c zirmE5kd8UgnjXz#AKC0`(pXVsXqk{hopRaydZn^_n|yDu zPw{NAf#H#CR78bjd9}^c^;fSRNHM|BZjFlQa}D~cl6<&O@z^30AD-)GH28z#mt zPlcU}O|}+j?)$IJJLg7c^cO`24;A`PE5q-d#$&nR711>P@x)$ijs;N`ZfRQ za(;GPa_&tvVL^hUbMq4%!V3}=dsi4dS*v;Ygw0PEDz+9(lQMd`-sYmmt+{it!M(Yo zvwyr>^G1uNHo_h})TMc|RS3h^Ghu16GeKJm6fT{XrHC|UC`TVN<Bwu@6DKoKG@Nqxg}k5_YI0TrC63SjiO%mO8X`E`_=^D(M1kPOKV;TYAU+? z8}-k2M>}uI1#_xPIRsBc-)eSWO)=-WVl%V~g5Ay0ksQX6Zg{;}bJq>iL{!55-_N@f zEt{iQndTT(+pF0(5j8Ua?bPTCD z1)FjdI~z5XF0L#j<=(NuT~@ZKUy~Joh11I^4{leS41pm@cf1EKpPD#B@%S8j>+Ik^xUBPijLhw(kluFiJte(hhGOLx^c-ElHt(Uuklx_ zOoS`ZUdw%uz?f0GBHS;l6mKXtT7#2^L9>O1fE- zMo9M#yRj4p!z3H}H2-SXq0V14Hn_o+Xo{(rxa-D4S{%bjpAr5ZsYXQgJdg(kiH;k~ zs6w)?SMyYZX6dZ(&jw=9*>WAiOArt(EBRIgc|k(ti4m>5ysc}+4K$T0f|83Bw zyuhhAq-xpSGQLZ2vUmLb;Yz;RUU>EF=m!aglx@m$r*ATN+U8{$imI;31JbEp_(P-S zyE%?wx$*GQ8GjA5mO*G~AN^b8V=PGGmFPF-8EmU{PpF$~Y;Mm`%ui6ECRn!xyPCC2 z%npzBnTneNu{%}sL{v_;_+#tzRtVmTnkpzEk)4X?q&?<+65WFb>>oOF9 zIESQk9UnhsQ=V^-HpMejDrw&KZJIN?F$OGo0CgBH6=%#adFi&K1So??Bb4((-W znRH%qTv~$Nf_PC(j1=tx5fR@!YH_dw_P1I5Wu-Y%I9ySpk~W?xHduGqn-5lW!l&N1 zLT8)z=c$k@3lS;A<%%TIr9UMnXOEt=M|87z$=XVbeWhk-VxoaBakVzX;I1s^B-;yQ zUv52N^GrS5ovpZIuEDA_NHE76E95FWVQ;I=tBsnbfr(=s=zy|A7VoSyqdNNcMN~ZN zH=i^(aKQ?>pjU_%-chI7QD=ozPi}%7NjRUi4?3>wp&AUW>}?em`%6vc%=Aarw_KKe z^5$}rn-5wM1IuI(LNZByCTc8>bU|6A#k-}ZuhZ|S>VlF~#oM1YLWi5BJOo7{QC@|1RBfr3QX zyTbJSmdcb%+QrF=$~7iGsgFSCrrLDdm03T7koZlg#yI>HqEwL&EGt9_$R}yvlTzgS9~cWy2IbGi20ji zVvv+|Wf_i)`;(lewP_Aqa6hP$AoJOP;5N*4k4GMQE*pSXNnV+}OcvBq1ar3)z#I+w+^rBk#RzZ|<9!y!5>9Iq#3WyqP=m znLEFGf6KiN&N)X=mdG*C7x4eAAY2O-glnOKa4l32u7wK1wNOF07AgqWLIpHja&PK8 zIF2;}1Zl^1t0;4l!1g0hLkWME0SUC5FpOMz}P@veE`BOZQ=N5700e> zj)Qd^1md&a+=^C?XV0j3yOg8D#;{SV3jDE*%sR-n!c{rPo98%|pHflN zVQ0&pqUZT;ImgyY1uy1EcqE-cw!kRc2DhMzWsHk5 z7qBgGX`q^aRK+F5j@FFpU>z{+a|N5mN!q|?mMn!!^VF3EDxNuQ;b>)&8WmvfH!8ks z2A<8Pshj`3*fO}3;8=1>#Y=^OV+MTDb7xePwlHiME5RZ82iOw01a{#G73+%!7g(2Q z(9MnGxPN$n!6mSZP7YqMq$ML5?n@0ov+!CG*FJ+)%d!|=%#lrTmraGcw??#)|A&YxYcbOcYmdz-Q-T|V8E0ZU`9N{l~ELg0g^(Q_C0xbHSIuAGsm|L9D8dy z4%b1*>w9Vh!swpTkCgC?Nz*TPnF4q71@&?S%3l%Gm7^rgj2C-7<3bqj8_sZVs)Ri?9KSlF z;6F9J|Nhm{5}p`gp5x#yzu`7291D;8Z)d4x)+{)# zYL0@tR^?a+7G}U*SHw~3r#Z-p1pa!J+-n$+rgvp+(7dPeR<6Ya$gau^h;aa^p$u0< z0I6Z<_G;7L)RU*iGTff8;AE5j{fa9XmSkBQcJvGGr4Ejl3jOP~(_?{c*T_BE)tYvW z&uTdK)d5xQeVs)&Nl76BmDO)4HPu__BdxK^l-1(ba~-#$=i>+(UK1 ziAJ$wiRa(0mXR9nd85Y~Io6eMG@ImyP*47KA;&|hz_eKVGnB$`|6DFkU}+Y^_v1Zp z_GkmgZ%Vl7P6(ZEQz?g}IV1K07J^IZnk^T^D5Qr2%d$PEKQ2>XHdvRa8@y4LZA6DtT&0kSVbDRwCcfMsbAOENt_)(GxC-*@@a4GsFqB+S7(T*;-?JCFC zD$jFGkJU?)s5koqm<-Q@sSH;|1Mgqx`hHs#$ILi*T!&RM43~m5U(}1iy>po74IQr6 zGqB#u?Ht)f0lUCn8^<*F++9?BvZoff#fIK%7;clwQP^y}p)g4g8@lU29}kHD(=i** z85`)_!S<%l>o{&n3c#LQ>{DS}chT$VK9F^Aj+6b&lP5(pJeme=?(0hrCa@0=XP0|^ zZz^upt0!YDHVua1ReEO-d48yGz zbW6SGm*s7~AKRY|_Qe!QN*op*s3;i1end01+S;YD+>_jLjr&T zFYi@wJe>)|y8$K}{QEMFxycOIxy?W*f3~)mBR7U&azEz|wZTg>3^!U9YpC37^hyZv z?KrZHtBO1UlZl}0MPi62*wsbcXImcUWBdNdFx>t#u|4aQ*R(4=%=cqmfR|);0rdwg zX}E#*MP(RnTDVw4*DM&2@r)#bpbR_Z58m=Ru`z)JgI9wM_GZ=Ruwz@C^<5!FB|mCueb8z z39NM$Hr^6~8|Ba^@1F={B&bO4KrPpnkGeEx7}M7FekYhZ@F)Ypm))sLTS^(G?0z8?)5N?w>a7h^M9m5zF9;e{B@ngSf z0Dg8%#oOb%>S2e-Omh+_F!QZoJw#8+i2xR)F|GR1ZVAJsi~UJ5!#ibSgAN@xK8oWh zw_-R7rZ38%l2nfE)&4E8rnAmU1nzKJvpUij`4tsgkRjonGVzsrOHZkAhC!>Pb%{Vw zu5EG*$CgTtuN#a*9ybKI)5(zCLyf}rN>wY$%d(+o~q@&}$`n3zkzk|HLSL4xSR)z0i(a?{&o-i%zIo7?bLD zY4Zy!<##;yg^?0Iu2O{4;B?&LlPdPrF#L9$1gF<3@?l{NKX%dwXjAn9Jy(6Mqtlgj zhU$Z2Z>sCy`1vtaTTG446wmdC73`cUW2A+E{f0X^mT8OO{!r?l$Mp9Lv|vQR`mvH` z7J6Er5GpY(n&oRmi^>4DSE+dHn5qGF7rg~H9#*h-x{S1NYXF;)iC8^K!uCo9=M6-r zdeVh9V9r-6X2emko`hLL#Rem)Wg}BX4$JO7oD%|m!(jzGrpU;!zy_NFH!+mqjVmS0 z&Nrv_b8juMH(%At@W~_)WO6#dT4Ej?wovF&9S9|ck8LW>2wn?e zEdg$IN_aG#V`GVV0Tl{UZYbf}hi;o-XGG}n+>p!b&~%WLsuyj!q_YQqI@MgjrY0y~ z86zRTUcrGnGta7vcNWs=Ax85fVr0_tI!(lQflz2qG8Hb3*dI)iwT&UpSr{j4<_|(`1Yp5`YVRDjc}T%0Q)HoFzPl``TNpirVdoSXHy%+m zyE)j@t^!RaY#C!&Q3wqTd#1^l^@XApX$%%oj*r&GjSfV!;I8aQhJDjz-1=W@2061e zEf)Cj8W~QLcFnWAoQdij$jw}STE*){{#A=xsfW@SUK=A_jxn1dTWZDVf?pjY<2EP9 zgGUvd2_Q3(9RX|@C*kHq^OvjIx+C7q1ctA#m9eHk-?hnT?Sq+$lz_!q3{Piyt}ZfD zw(sRgz4*D2G9F3ic>b)4-<{(=6+xRNN{#+BmEpya64EV>=?>T~q!dbAKTgKdY>th^ zs&}}Lf0t9G_6iOsU6eGwbnkbD?A5=t$w-}?5s38U(z{`uG z35ijRVq=UNMNAL`i5QWPR%$GA6DXxE*p|h%Tefs(jyW@JD6l&_+pS8B|70GTo-^~? z?>pb^c%+n)YgnFt8z7PX2TWBd0~%6N*9kwJmmCgD{$s>e2HeqZa`yp~ zE@S9$gY|8Ppl+h^#E%ZLx@3UF74$&#PVq+IGoejWS?2oeIGj!3HO6T^xAK$z$g zWax0d4}R&EG(}>sukgc;N}aq^T&$|#@&=QRzW8ghJ@9mi;NhS~@yN?RruNr&!P`wH z?>9@L{Y7vVwb}Sg`tcyOF5tf~qXn ze6ayrd!aW@@D99Oovi_7dj-#zU_qW81X-2|j|T-FtLEA-JQ$W#Wu<7r&S?A%g=zN7 zugr}qt*j~$ywY#Uihj5&`vIq%>KagU*kH)mYd&a|R2K*fa%+d=-U4BHqP7d}%D=QO z*_JRSVD5HKV+A-7r>?>O#SbM+cI_R&>yEp9XWXVeu$Iz$5q}B=PAm zJupl|lNxTmZZn8gl@Ens=3awM(=-;0(s(SWtSPOM7BOwBsj*WR!m3PfHkv$l*tGKH zu9-Sz{uJ9SrEz4fn+h*ugC1}AC z0;cPNFQ@Cw*=JZOB#}Z<`$;7A1LoHn?3txA&B5KSrn=xr!S}Ot7S$Ovbi3K%PIGew z<1?JsxSoqk(gi8xll`S?s~SBmQ9V|A&<3)c%Ph=v7FNu`RKGM)R!n5;T#4#}FT z0K7I)8=feRCG~?BkJeb2FWBB8+1z4Jeok%FxO7;OFLY8`g`a9m!+UumYecZD?0-DFI#yJIM!=d_#k9(trPk_3zd-5BL`oSoI2n Son*ZL0000 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 literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/monero_ios_icons/Icon-App-50x50@1x.png b/assets/images/ios_icons/monero_ios_icons/Icon-App-50x50@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..ecdbae798d868ebc0312055249abb83231ebd3ab GIT binary patch literal 1786 zcmV{WK((cuB5DDRqQ)yqf{_@nh(Y~BgC^n;gJ`@BUPKg4j8UWF zKOPa|0Ui}kj3z1w9)O@$OKB<9wzT%3w54xG=Dn_^u$_HxyH#TNCfjDa^LFO*X6E<% z&G$7$DW&)yDCNH%K(cfgnqP;!M;;cN&S9{+e)q50| zZ<07Z+w1O6$%QlW1V?2Ga#CQgf*oD3zE!chNzu4B_Ov5QJOyZlGrO1s~Qv!{4Uwp(f{`h3swb$z%PgnuOIJ7g(c@KGVmZ2n-^X;_k}$`(k#1 z;Eib(nYM6~Re=>^6f$ zONWM@f#;8~C0JMjkJrS8(Sz3zGqMF6+xz?2(5@)Y8ipCE?>1jNHRAoQiZNJy^1G#! zgJvc=6B^<`ZS%1l2a^$`Gfq8{7xD%ZYai*%ec;UOKNI?MofP+%pUPn{89}T#v+VS( zidY%o*G|~hr8qC&o0%tT73YlbAR2oVs~Q#aiwAa);68U{1j&w*W$L>%i6B2U_UCWx ztEKF|pm1vm?uoB?ua|2ILI=0ckMTFZG7hyQY`*xrc9>HL6VjnH>{$v$2SBapI|gf* zrXIy3+r6qc3Zm<)Xg|{v+~{#Zj*f_b9FJJ4Xq4PL-g4cK#p4DagobH%6yLUSQ0YD~ zLvX+0TE8-a%*-)&u(lO8w=0gx5;#h^GZeMNYr6;DfQnrMuhr$ry4LShV zkfF;4b69+^O7dE{jV%PfbxJ;L_Sdm4?VqmmK(cL&GwMf15WP7sE)qOeJ^1ok@rUBd zF_QB}TFfmH?h^VcfWM`S&YMdFBSOOnqIGq##bedxgmT43$yX-{rbGnSjPW+_TMdey zIA^g*8F1|wugr-q$wWhNTo66D^G6EaF;u~S^}?+64)4yenVv0}oew8v!{;rEA3D5q zdh}N4Wpq>~oSGvzF5=C4k5sOyF*;3f-*_t_7+*)-C6g>FnjE8#rPur^YaNzOvRKf! zR4y#kFWf+&?NOcCQ-v5XP+iYmwb|k8zi=aDuTnfP!3yLu`UcTqcwwnvsbR0s=jGn? zv*ejtT=PNiuaT+34Fs8Xe>)AP2floV%rV3UcZ}DQC z;;u^RKGztk^u5H5%FxOgvzRVJ? z2RysLd*9_Kw{q6YZjba%i@71;)?(Vs4w}7&;S4c07*qoM6N<$g7+(PP5=M^ literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/monero_ios_icons/Icon-App-50x50@2x.png b/assets/images/ios_icons/monero_ios_icons/Icon-App-50x50@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6979a7d7245602672d9e4fe3ccb3f8c7da69e95c GIT binary patch literal 3581 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 literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/monero_ios_icons/Icon-App-57x57@2x.png b/assets/images/ios_icons/monero_ios_icons/Icon-App-57x57@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..773618487ffb44728de513c65ce9fda10f9e69df GIT binary patch literal 3999 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 FV1jVplQ94Q literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/monero_ios_icons/Icon-App-60x60@2x.png b/assets/images/ios_icons/monero_ios_icons/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a646a1c46631e0f45177c6eec4d1ef7fed50a93b GIT binary patch literal 4283 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 literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/monero_ios_icons/Icon-App-60x60@3x.png b/assets/images/ios_icons/monero_ios_icons/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6b0eb93bbf8753ca2119b2eec0f32b59e76cad0e GIT binary patch literal 6573 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 literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/monero_ios_icons/Icon-App-72x72@1x.png b/assets/images/ios_icons/monero_ios_icons/Icon-App-72x72@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..362caddc599f5c6564d3242f5657c0fb2618ae93 GIT binary patch literal 2588 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 sV2X+WQ&a?)q9VW)6#=HG2rxzc4`2ziZNSnk literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/monero_ios_icons/Icon-App-76x76@2x.png b/assets/images/ios_icons/monero_ios_icons/Icon-App-76x76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..bcb6b5aa5c6ca5c865f76f2869738bd9c4bd7c71 GIT binary patch literal 5389 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 literal 0 HcmV?d00001 diff --git a/assets/images/ios_icons/monero_ios_icons/Icon-App-83.5x83.5@2x.png b/assets/images/ios_icons/monero_ios_icons/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..bb0e648ba2c35629a8a49ea445db64e47a062f25 GIT binary patch literal 6086 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index bd04914aec..0000000000 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,134 +0,0 @@ -{ - "images": [ - { - "filename": "AppIcon@2x.png", - "idiom": "iphone", - "scale": "2x", - "size": "60x60" - }, - { - "filename": "AppIcon@3x.png", - "idiom": "iphone", - "scale": "3x", - "size": "60x60" - }, - { - "filename": "AppIcon~ipad.png", - "idiom": "ipad", - "scale": "1x", - "size": "76x76" - }, - { - "filename": "AppIcon@2x~ipad.png", - "idiom": "ipad", - "scale": "2x", - "size": "76x76" - }, - { - "filename": "AppIcon-83.5@2x~ipad.png", - "idiom": "ipad", - "scale": "2x", - "size": "83.5x83.5" - }, - { - "filename": "AppIcon-40@2x.png", - "idiom": "iphone", - "scale": "2x", - "size": "40x40" - }, - { - "filename": "AppIcon-40@3x.png", - "idiom": "iphone", - "scale": "3x", - "size": "40x40" - }, - { - "filename": "AppIcon-40~ipad.png", - "idiom": "ipad", - "scale": "1x", - "size": "40x40" - }, - { - "filename": "AppIcon-40@2x~ipad.png", - "idiom": "ipad", - "scale": "2x", - "size": "40x40" - }, - { - "filename": "AppIcon-20@2x.png", - "idiom": "iphone", - "scale": "2x", - "size": "20x20" - }, - { - "filename": "AppIcon-20@3x.png", - "idiom": "iphone", - "scale": "3x", - "size": "20x20" - }, - { - "filename": "AppIcon-20~ipad.png", - "idiom": "ipad", - "scale": "1x", - "size": "20x20" - }, - { - "filename": "AppIcon-20@2x~ipad.png", - "idiom": "ipad", - "scale": "2x", - "size": "20x20" - }, - { - "filename": "AppIcon-29.png", - "idiom": "iphone", - "scale": "1x", - "size": "29x29" - }, - { - "filename": "AppIcon-29@2x.png", - "idiom": "iphone", - "scale": "2x", - "size": "29x29" - }, - { - "filename": "AppIcon-29@3x.png", - "idiom": "iphone", - "scale": "3x", - "size": "29x29" - }, - { - "filename": "AppIcon-29~ipad.png", - "idiom": "ipad", - "scale": "1x", - "size": "29x29" - }, - { - "filename": "AppIcon-29@2x~ipad.png", - "idiom": "ipad", - "scale": "2x", - "size": "29x29" - }, - { - "filename": "AppIcon-60@2x~car.png", - "idiom": "car", - "scale": "2x", - "size": "60x60" - }, - { - "filename": "AppIcon-60@3x~car.png", - "idiom": "car", - "scale": "3x", - "size": "60x60" - }, - { - "filename": "AppIcon~ios-marketing.png", - "idiom": "ios-marketing", - "scale": "1x", - "size": "1024x1024" - } - ], - "info": { - "author": "iconkitchen", - "version": 1 - } -} \ No newline at end of file diff --git a/scripts/ios/app_icon.sh b/scripts/ios/app_icon.sh index dcb1688886..18fa3d6320 100755 --- a/scripts/ios/app_icon.sh +++ b/scripts/ios/app_icon.sh @@ -1,29 +1,57 @@ #!/bin/sh -ICON_2x_PATH="" -ICON_2x_ipad_PATH="" -ICON_3x_PATH="" +CONTENTS_JSON_PATH="" + ICON_20_2x_PATH="" -ICON_20_2x_ipad_PATH="" ICON_20_3x_PATH="" -ICON_20_ipad_PATH="" -ICON_29_PATH="" ICON_29_2x_PATH="" -ICON_29_2x_ipad_PATH="" ICON_29_3x_PATH="" -ICON_29_3x_ipad_PATH="" -ICON_29_ipad_PATH="" +ICON_38_2x_PATH="" +ICON_38_3x_PATH="" ICON_40_2x_PATH="" -ICON_40_2x_ipad_PATH="" ICON_40_3x_PATH="" -ICON_40_ipad_PATH="" ICON_60_2x_PATH="" ICON_60_3x_PATH="" -ICON_83_2x_ipad_PATH="" -ICON_marketing_PATH="" -ICON_ipad_PATH="" +ICON_64_2x_PATH="" +ICON_64_3x_PATH="" +ICON_68_2x_PATH="" +ICON_76_2x_PATH="" +ICON_83_5_2x_PATH="" +ICON_1024_1x_PATH="" + +ICON_DARK_20_2x_PATH="" +ICON_DARK_20_3x_PATH="" +ICON_DARK_29_2x_PATH="" +ICON_DARK_29_3x_PATH="" +ICON_DARK_38_2x_PATH="" +ICON_DARK_38_3x_PATH="" +ICON_DARK_40_2x_PATH="" +ICON_DARK_40_3x_PATH="" +ICON_DARK_60_2x_PATH="" +ICON_DARK_60_3x_PATH="" +ICON_DARK_64_2x_PATH="" +ICON_DARK_64_3x_PATH="" +ICON_DARK_68_2x_PATH="" +ICON_DARK_76_2x_PATH="" +ICON_DARK_83_5_2x_PATH="" +ICON_DARK_1024_1x_PATH="" -ICON_DIRECTORY="" +ICON_TINTED_20_2x_PATH="" +ICON_TINTED_20_3x_PATH="" +ICON_TINTED_29_2x_PATH="" +ICON_TINTED_29_3x_PATH="" +ICON_TINTED_38_2x_PATH="" +ICON_TINTED_38_3x_PATH="" +ICON_TINTED_40_2x_PATH="" +ICON_TINTED_40_3x_PATH="" +ICON_TINTED_60_2x_PATH="" +ICON_TINTED_60_3x_PATH="" +ICON_TINTED_64_2x_PATH="" +ICON_TINTED_64_3x_PATH="" +ICON_TINTED_68_2x_PATH="" +ICON_TINTED_76_2x_PATH="" +ICON_TINTED_83_5_2x_PATH="" +ICON_TINTED_1024_1x_PATH="" DEST_DIR_PATH=`pwd`/../../ios/Runner/Assets.xcassets/AppIcon.appiconset @@ -34,68 +62,168 @@ case $APP_IOS_TYPE in ICON_DIRECTORY=cakewallet_ios_icons;; esac -ICON_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon@2x.png -ICON_2x_ipad_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon@2x~ipad.png -ICON_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon@3x.png -ICON_20_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-20@2x.png -ICON_20_2x_ipad_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-20@2x~ipad.png -ICON_20_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-20@3x.png -ICON_20_ipad_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-20~ipad.png -ICON_29_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-29.png -ICON_29_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-29@2x.png -ICON_29_2x_ipad_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-29@2x~ipad.png -ICON_29_3x_ipad_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-29@3x.png -ICON_29_ipad_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-29~ipad.png -ICON_40_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-40@2x.png -ICON_40_2x_ipad_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-40@2x~ipad.png -ICON_40_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-40@3x.png -ICON_40_ipad_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-40~ipad.png -ICON_60_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-60@2x~car.png -ICON_60_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-60@3x~car.png -ICON_83_2x_ipad_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon-83.5@2x~ipad.png -ICON_marketing_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon~ios-marketing.png -ICON_ipad_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/AppIcon~ipad.png - -rm $DEST_DIR_PATH/AppIcon@2x.png -rm $DEST_DIR_PATH/AppIcon@2x~ipad.png -rm $DEST_DIR_PATH/AppIcon@3x.png -rm $DEST_DIR_PATH/AppIcon-20@2x.png -rm $DEST_DIR_PATH/AppIcon-20@2x~ipad.png -rm $DEST_DIR_PATH/AppIcon-20@3x.png -rm $DEST_DIR_PATH/AppIcon-20~ipad.png -rm $DEST_DIR_PATH/AppIcon-29.png -rm $DEST_DIR_PATH/AppIcon-29@2x.png -rm $DEST_DIR_PATH/AppIcon-29@2x~ipad.png -rm $DEST_DIR_PATH/AppIcon-29@3x.png -rm $DEST_DIR_PATH/AppIcon-29~ipad.png -rm $DEST_DIR_PATH/AppIcon-40@2x.png -rm $DEST_DIR_PATH/AppIcon-40@2x~ipad.png -rm $DEST_DIR_PATH/AppIcon-40@3x.png -rm $DEST_DIR_PATH/AppIcon-40~ipad.png -rm $DEST_DIR_PATH/AppIcon-60@2x~car.png -rm $DEST_DIR_PATH/AppIcon-60@3x~car.png -rm $DEST_DIR_PATH/AppIcon-83.5@2x~ipad.png -rm $DEST_DIR_PATH/AppIcon~ios-marketing.png -rm $DEST_DIR_PATH/AppIcon~ipad.png - -ln -s $ICON_2x_PATH $DEST_DIR_PATH/AppIcon@2x.png -ln -s $ICON_2x_ipad_PATH $DEST_DIR_PATH/AppIcon@2x~ipad.png -ln -s $ICON_3x_PATH $DEST_DIR_PATH/AppIcon@3x.png -ln -s $ICON_20_2x_PATH $DEST_DIR_PATH/AppIcon-20@2x.png -ln -s $ICON_20_2x_ipad_PATH $DEST_DIR_PATH/AppIcon-20@2x~ipad.png -ln -s $ICON_20_3x_PATH $DEST_DIR_PATH/AppIcon-20@3x.png -ln -s $ICON_20_ipad_PATH $DEST_DIR_PATH/AppIcon-20~ipad.png -ln -s $ICON_29_PATH $DEST_DIR_PATH/AppIcon-29.png -ln -s $ICON_29_2x_PATH $DEST_DIR_PATH/AppIcon-29@2x.png -ln -s $ICON_29_2x_ipad_PATH $DEST_DIR_PATH/AppIcon-29@2x~ipad.png -ln -s $ICON_29_3x_ipad_PATH $DEST_DIR_PATH/AppIcon-29@3x.png -ln -s $ICON_29_ipad_PATH $DEST_DIR_PATH/AppIcon-29~ipad.png -ln -s $ICON_40_2x_PATH $DEST_DIR_PATH/AppIcon-40@2x.png -ln -s $ICON_40_2x_ipad_PATH $DEST_DIR_PATH/AppIcon-40@2x~ipad.png -ln -s $ICON_40_3x_PATH $DEST_DIR_PATH/AppIcon-40@3x.png -ln -s $ICON_40_ipad_PATH $DEST_DIR_PATH/AppIcon-40~ipad.png -ln -s $ICON_60_2x_PATH $DEST_DIR_PATH/AppIcon-60@2x~car.png -ln -s $ICON_60_3x_PATH $DEST_DIR_PATH/AppIcon-60@3x~car.png -ln -s $ICON_83_2x_ipad_PATH $DEST_DIR_PATH/AppIcon-83.5@2x~ipad.png -ln -s $ICON_marketing_PATH $DEST_DIR_PATH/AppIcon~ios-marketing.png -ln -s $ICON_ipad_PATH $DEST_DIR_PATH/AppIcon~ipad.png +CONTENTS_JSON_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Contents.json + +ICON_20_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-20x20@2x.png +ICON_20_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-20x20@3x.png +ICON_29_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-29x29@2x.png +ICON_29_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-29x29@3x.png +ICON_38_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-38x38@2x.png +ICON_38_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-38x38@3x.png +ICON_40_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-40x40@2x.png +ICON_40_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-40x40@3x.png +ICON_60_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-60x60@2x.png +ICON_60_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-60x60@3x.png +ICON_64_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-64x64@2x.png +ICON_64_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-64x64@3x.png +ICON_68_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-68x68@2x.png +ICON_76_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-76x76@2x.png +ICON_83_5_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-83.5x83.5@2x.png +ICON_1024_1x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-1024x1024@1x.png + +ICON_DARK_20_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Dark-20x20@2x.png +ICON_DARK_20_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Dark-20x20@3x.png +ICON_DARK_29_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Dark-29x29@2x.png +ICON_DARK_29_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Dark-29x29@3x.png +ICON_DARK_38_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Dark-38x38@2x.png +ICON_DARK_38_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Dark-38x38@3x.png +ICON_DARK_40_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Dark-40x40@2x.png +ICON_DARK_40_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Dark-40x40@3x.png +ICON_DARK_60_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Dark-60x60@2x.png +ICON_DARK_60_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Dark-60x60@3x.png +ICON_DARK_64_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Dark-64x64@2x.png +ICON_DARK_64_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Dark-64x64@3x.png +ICON_DARK_68_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Dark-68x68@2x.png +ICON_DARK_76_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Dark-76x76@2x.png +ICON_DARK_83_5_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Dark-83.5x83.5@2x.png +ICON_DARK_1024_1x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Dark-1024x1024@1x.png + +ICON_TINTED_20_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Tinted-20x20@2x.png +ICON_TINTED_20_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Tinted-20x20@3x.png +ICON_TINTED_29_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Tinted-29x29@2x.png +ICON_TINTED_29_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Tinted-29x29@3x.png +ICON_TINTED_38_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Tinted-38x38@2x.png +ICON_TINTED_38_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Tinted-38x38@3x.png +ICON_TINTED_40_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Tinted-40x40@2x.png +ICON_TINTED_40_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Tinted-40x40@3x.png +ICON_TINTED_60_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Tinted-60x60@2x.png +ICON_TINTED_60_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Tinted-60x60@3x.png +ICON_TINTED_64_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Tinted-64x64@2x.png +ICON_TINTED_64_3x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Tinted-64x64@3x.png +ICON_TINTED_68_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Tinted-68x68@2x.png +ICON_TINTED_76_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Tinted-76x76@2x.png +ICON_TINTED_83_5_2x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Tinted-83.5x83.5@2x.png +ICON_TINTED_1024_1x_PATH=`pwd`/../../assets/images/ios_icons/$ICON_DIRECTORY/Icon-App-Tinted-1024x1024@1x.png + +rm $DEST_DIR_PATH/Contents.json + +rm $DEST_DIR_PATH/Icon-App-20x20@2x.png +rm $DEST_DIR_PATH/Icon-App-20x20@3x.png +rm $DEST_DIR_PATH/Icon-App-29x29@2x.png +rm $DEST_DIR_PATH/Icon-App-29x29@3x.png +rm $DEST_DIR_PATH/Icon-App-38x38@2x.png +rm $DEST_DIR_PATH/Icon-App-38x38@3x.png +rm $DEST_DIR_PATH/Icon-App-40x40@2x.png +rm $DEST_DIR_PATH/Icon-App-40x40@3x.png +rm $DEST_DIR_PATH/Icon-App-60x60@2x.png +rm $DEST_DIR_PATH/Icon-App-60x60@3x.png +rm $DEST_DIR_PATH/Icon-App-64x64@2x.png +rm $DEST_DIR_PATH/Icon-App-64x64@3x.png +rm $DEST_DIR_PATH/Icon-App-68x68@2x.png +rm $DEST_DIR_PATH/Icon-App-76x76@2x.png +rm $DEST_DIR_PATH/Icon-App-83.5x83.5@2x.png +rm $DEST_DIR_PATH/Icon-App-1024x1024@1x.png + +rm $DEST_DIR_PATH/Icon-App-Dark-20x20@2x.png +rm $DEST_DIR_PATH/Icon-App-Dark-20x20@3x.png +rm $DEST_DIR_PATH/Icon-App-Dark-29x29@2x.png +rm $DEST_DIR_PATH/Icon-App-Dark-29x29@3x.png +rm $DEST_DIR_PATH/Icon-App-Dark-38x38@2x.png +rm $DEST_DIR_PATH/Icon-App-Dark-38x38@3x.png +rm $DEST_DIR_PATH/Icon-App-Dark-40x40@2x.png +rm $DEST_DIR_PATH/Icon-App-Dark-40x40@3x.png +rm $DEST_DIR_PATH/Icon-App-Dark-60x60@2x.png +rm $DEST_DIR_PATH/Icon-App-Dark-60x60@3x.png +rm $DEST_DIR_PATH/Icon-App-Dark-64x64@2x.png +rm $DEST_DIR_PATH/Icon-App-Dark-64x64@3x.png +rm $DEST_DIR_PATH/Icon-App-Dark-68x68@2x.png +rm $DEST_DIR_PATH/Icon-App-Dark-76x76@2x.png +rm $DEST_DIR_PATH/Icon-App-Dark-83.5x83.5@2x.png +rm $DEST_DIR_PATH/Icon-App-Dark-1024x1024@1x.png + +rm $DEST_DIR_PATH/Icon-App-Tinted-20x20@2x.png +rm $DEST_DIR_PATH/Icon-App-Tinted-20x20@3x.png +rm $DEST_DIR_PATH/Icon-App-Tinted-29x29@2x.png +rm $DEST_DIR_PATH/Icon-App-Tinted-29x29@3x.png +rm $DEST_DIR_PATH/Icon-App-Tinted-38x38@2x.png +rm $DEST_DIR_PATH/Icon-App-Tinted-38x38@3x.png +rm $DEST_DIR_PATH/Icon-App-Tinted-40x40@2x.png +rm $DEST_DIR_PATH/Icon-App-Tinted-40x40@3x.png +rm $DEST_DIR_PATH/Icon-App-Tinted-60x60@2x.png +rm $DEST_DIR_PATH/Icon-App-Tinted-60x60@3x.png +rm $DEST_DIR_PATH/Icon-App-Tinted-64x64@2x.png +rm $DEST_DIR_PATH/Icon-App-Tinted-64x64@3x.png +rm $DEST_DIR_PATH/Icon-App-Tinted-68x68@2x.png +rm $DEST_DIR_PATH/Icon-App-Tinted-76x76@2x.png +rm $DEST_DIR_PATH/Icon-App-Tinted-83.5x83.5@2x.png +rm $DEST_DIR_PATH/Icon-App-Tinted-1024x1024@1x.png + +ln -s $CONTENTS_JSON_PATH $DEST_DIR_PATH/Contents.json + +ln -s $ICON_20_2x_PATH $DEST_DIR_PATH/Icon-App-20x20@2x.png +ln -s $ICON_20_3x_PATH $DEST_DIR_PATH/Icon-App-20x20@3x.png +ln -s $ICON_29_2x_PATH $DEST_DIR_PATH/Icon-App-29x29@2x.png +ln -s $ICON_29_3x_PATH $DEST_DIR_PATH/Icon-App-29x29@3x.png +ln -s $ICON_38_2x_PATH $DEST_DIR_PATH/Icon-App-38x38@2x.png +ln -s $ICON_38_3x_PATH $DEST_DIR_PATH/Icon-App-38x38@3x.png +ln -s $ICON_40_2x_PATH $DEST_DIR_PATH/Icon-App-40x40@2x.png +ln -s $ICON_40_3x_PATH $DEST_DIR_PATH/Icon-App-40x40@3x.png +ln -s $ICON_60_2x_PATH $DEST_DIR_PATH/Icon-App-60x60@2x.png +ln -s $ICON_60_3x_PATH $DEST_DIR_PATH/Icon-App-60x60@3x.png +ln -s $ICON_64_2x_PATH $DEST_DIR_PATH/Icon-App-64x64@2x.png +ln -s $ICON_64_3x_PATH $DEST_DIR_PATH/Icon-App-64x64@3x.png +ln -s $ICON_68_2x_PATH $DEST_DIR_PATH/Icon-App-68x68@2x.png +ln -s $ICON_76_2x_PATH $DEST_DIR_PATH/Icon-App-76x76@2x.png +ln -s $ICON_83_5_2x_PATH $DEST_DIR_PATH/Icon-App-83.5x83.5@2x.png +ln -s $ICON_1024_1x_PATH $DEST_DIR_PATH/Icon-App-1024x1024@1x.png + + +#TODO once the new monero.com icons are out remove if statement +if [ $APP_IOS_TYPE = "cakewallet" ]; then + +ln -s $ICON_DARK_20_2x_PATH $DEST_DIR_PATH/Icon-App-Dark-20x20@2x.png +ln -s $ICON_DARK_20_3x_PATH $DEST_DIR_PATH/Icon-App-Dark-20x20@3x.png +ln -s $ICON_DARK_29_2x_PATH $DEST_DIR_PATH/Icon-App-Dark-29x29@2x.png +ln -s $ICON_DARK_29_3x_PATH $DEST_DIR_PATH/Icon-App-Dark-29x29@3x.png +ln -s $ICON_DARK_38_2x_PATH $DEST_DIR_PATH/Icon-App-Dark-38x38@2x.png +ln -s $ICON_DARK_38_3x_PATH $DEST_DIR_PATH/Icon-App-Dark-38x38@3x.png +ln -s $ICON_DARK_40_2x_PATH $DEST_DIR_PATH/Icon-App-Dark-40x40@2x.png +ln -s $ICON_DARK_40_3x_PATH $DEST_DIR_PATH/Icon-App-Dark-40x40@3x.png +ln -s $ICON_DARK_60_2x_PATH $DEST_DIR_PATH/Icon-App-Dark-60x60@2x.png +ln -s $ICON_DARK_60_3x_PATH $DEST_DIR_PATH/Icon-App-Dark-60x60@3x.png +ln -s $ICON_DARK_64_2x_PATH $DEST_DIR_PATH/Icon-App-Dark-64x64@2x.png +ln -s $ICON_DARK_64_3x_PATH $DEST_DIR_PATH/Icon-App-Dark-64x64@3x.png +ln -s $ICON_DARK_68_2x_PATH $DEST_DIR_PATH/Icon-App-Dark-68x68@2x.png +ln -s $ICON_DARK_76_2x_PATH $DEST_DIR_PATH/Icon-App-Dark-76x76@2x.png +ln -s $ICON_DARK_83_5_2x_PATH $DEST_DIR_PATH/Icon-App-Dark-83.5x83.5@2x.png +ln -s $ICON_DARK_1024_1x_PATH $DEST_DIR_PATH/Icon-App-Dark-1024x1024@1x.png + +ln -s $ICON_TINTED_20_2x_PATH $DEST_DIR_PATH/Icon-App-Tinted-20x20@2x.png +ln -s $ICON_TINTED_20_3x_PATH $DEST_DIR_PATH/Icon-App-Tinted-20x20@3x.png +ln -s $ICON_TINTED_29_2x_PATH $DEST_DIR_PATH/Icon-App-Tinted-29x29@2x.png +ln -s $ICON_TINTED_29_3x_PATH $DEST_DIR_PATH/Icon-App-Tinted-29x29@3x.png +ln -s $ICON_TINTED_38_2x_PATH $DEST_DIR_PATH/Icon-App-Tinted-38x38@2x.png +ln -s $ICON_TINTED_38_3x_PATH $DEST_DIR_PATH/Icon-App-Tinted-38x38@3x.png +ln -s $ICON_TINTED_40_2x_PATH $DEST_DIR_PATH/Icon-App-Tinted-40x40@2x.png +ln -s $ICON_TINTED_40_3x_PATH $DEST_DIR_PATH/Icon-App-Tinted-40x40@3x.png +ln -s $ICON_TINTED_60_2x_PATH $DEST_DIR_PATH/Icon-App-Tinted-60x60@2x.png +ln -s $ICON_TINTED_60_3x_PATH $DEST_DIR_PATH/Icon-App-Tinted-60x60@3x.png +ln -s $ICON_TINTED_64_2x_PATH $DEST_DIR_PATH/Icon-App-Tinted-64x64@2x.png +ln -s $ICON_TINTED_64_3x_PATH $DEST_DIR_PATH/Icon-App-Tinted-64x64@3x.png +ln -s $ICON_TINTED_68_2x_PATH $DEST_DIR_PATH/Icon-App-Tinted-68x68@2x.png +ln -s $ICON_TINTED_76_2x_PATH $DEST_DIR_PATH/Icon-App-Tinted-76x76@2x.png +ln -s $ICON_TINTED_83_5_2x_PATH $DEST_DIR_PATH/Icon-App-Tinted-83.5x83.5@2x.png +ln -s $ICON_TINTED_1024_1x_PATH $DEST_DIR_PATH/Icon-App-Tinted-1024x1024@1x.png + +fi + From f0524bcef146e2977224406136b603b20c65e2ba Mon Sep 17 00:00:00 2001 From: OmarHatem Date: Mon, 24 Nov 2025 14:46:47 +0100 Subject: [PATCH 074/105] minor fixes [skip ci] --- ios/Podfile.lock | 38 +++++++++++++++++++ .../screens/nano/nano_change_rep_page.dart | 1 - lib/src/screens/send/widgets/send_card.dart | 8 ++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 50399668db..557e7c3dc0 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -99,6 +99,34 @@ PODS: - FlutterMacOS - sp_scanner (0.0.1): - Flutter + - sqflite_darwin (0.0.4): + - Flutter + - FlutterMacOS + - sqlite3 (3.50.4): + - sqlite3/common (= 3.50.4) + - sqlite3/common (3.50.4) + - sqlite3/dbstatvtab (3.50.4): + - sqlite3/common + - sqlite3/fts5 (3.50.4): + - sqlite3/common + - sqlite3/math (3.50.4): + - sqlite3/common + - sqlite3/perf-threadsafe (3.50.4): + - sqlite3/common + - sqlite3/rtree (3.50.4): + - sqlite3/common + - sqlite3/session (3.50.4): + - sqlite3/common + - sqlite3_flutter_libs (0.0.1): + - Flutter + - FlutterMacOS + - sqlite3 (~> 3.50.4) + - sqlite3/dbstatvtab + - sqlite3/fts5 + - sqlite3/math + - sqlite3/perf-threadsafe + - sqlite3/rtree + - sqlite3/session - SwiftyGif (5.4.5) - torch_dart (0.0.1): - Flutter @@ -144,6 +172,8 @@ DEPENDENCIES: - share_plus (from `.symlinks/plugins/share_plus/ios`) - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - sp_scanner (from `.symlinks/plugins/sp_scanner/ios`) + - sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`) + - sqlite3_flutter_libs (from `.symlinks/plugins/sqlite3_flutter_libs/darwin`) - torch_dart (from `.symlinks/plugins/torch_dart/ios`) - uni_links (from `.symlinks/plugins/uni_links/ios`) - universal_ble (from `.symlinks/plugins/universal_ble/darwin`) @@ -157,6 +187,7 @@ SPEC REPOS: - DKPhotoGallery - OrderedSet - SDWebImage + - sqlite3 - SwiftyGif - YttriumWrapper @@ -219,6 +250,10 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/shared_preferences_foundation/darwin" sp_scanner: :path: ".symlinks/plugins/sp_scanner/ios" + sqflite_darwin: + :path: ".symlinks/plugins/sqflite_darwin/darwin" + sqlite3_flutter_libs: + :path: ".symlinks/plugins/sqlite3_flutter_libs/darwin" torch_dart: :path: ".symlinks/plugins/torch_dart/ios" uni_links: @@ -265,6 +300,9 @@ SPEC CHECKSUMS: share_plus: 8b6f8b3447e494cca5317c8c3073de39b3600d1f shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 sp_scanner: eaa617fa827396b967116b7f1f43549ca62e9a12 + sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d + sqlite3: 73513155ec6979715d3904ef53a8d68892d4032b + sqlite3_flutter_libs: 86f82662868ee26ff3451f73cac9c5fc2a1f57fa SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 torch_dart: d2cf778332cc6e6a3b362dcf45e4dde52bc34e35 uni_links: d97da20c7701486ba192624d99bffaaffcfc298a diff --git a/lib/src/screens/nano/nano_change_rep_page.dart b/lib/src/screens/nano/nano_change_rep_page.dart index ae67cdfcd1..bd06cd8c55 100644 --- a/lib/src/screens/nano/nano_change_rep_page.dart +++ b/lib/src/screens/nano/nano_change_rep_page.dart @@ -194,7 +194,6 @@ class NanoChangeRepPage extends BasePage { buttonText: S.of(context).ok, buttonAction: () => Navigator.pop(context)); }); - throw e; } } } diff --git a/lib/src/screens/send/widgets/send_card.dart b/lib/src/screens/send/widgets/send_card.dart index 8335bd4fc3..df3af561ba 100644 --- a/lib/src/screens/send/widgets/send_card.dart +++ b/lib/src/screens/send/widgets/send_card.dart @@ -195,6 +195,10 @@ class SendCardState extends State with AutomaticKeepAliveClientMixin( context: context, isDismissible: true, @@ -228,6 +232,10 @@ class SendCardState extends State with AutomaticKeepAliveClientMixin( context: context, isDismissible: true, From 77812016ac6f5619df012194ba4028f19a8c7c68 Mon Sep 17 00:00:00 2001 From: cyan Date: Mon, 24 Nov 2025 13:58:12 -0300 Subject: [PATCH 075/105] LCW-1144 cupcake litecoin (#2557) * Add psbt rpcs * Only build arm64 * Rebuild protos * Update proto * Add psbt create rpc * Restore wallet stuff * more stuff * more stuff * more stuff * Fix open wallet * Fix mweb enabled * Start of buildPsbt * Update proto * Psbt add recipients * fixes * slightly better * more fixes * decode ur * add more commit code * Update proto * use new proto * Don't eat psbt rpc errors * Use unix domain socket for mwebd * add gitignore * Undo build only arm64 * fix pure mweb txns * fix mweb txids * fix ci * fix blank pegin address * chore: update cw_mweb dependencies chore: remove cw_core as dependency from cw_mweb * fix: Ltub restore * fix: address review crashes, fix non-mweb view only wallets * minor fixes --------- Co-authored-by: Hector Chu Co-authored-by: OmarHatem --- cw_bitcoin/lib/bitcoin_address_record.dart | 11 +- .../bitcoin_wallet_creation_credentials.dart | 15 + cw_bitcoin/lib/bitcoin_wallet_service.dart | 4 +- cw_bitcoin/lib/litecoin_wallet.dart | 271 +++- cw_bitcoin/lib/litecoin_wallet_addresses.dart | 23 +- cw_bitcoin/lib/litecoin_wallet_service.dart | 25 +- cw_core/lib/utils/zpub.dart | 39 + cw_core/lib/wallet_keys_file.dart | 10 +- cw_mweb/.gitignore | 1 + cw_mweb/go/go.mod | 23 +- cw_mweb/go/go.sum | 110 +- cw_mweb/go/mweb.go | 8 +- cw_mweb/lib/cw_mweb.dart | 49 +- cw_mweb/lib/mweb_ffi.dart | 10 +- cw_mweb/lib/mwebd.pb.dart | 1088 ++++++++++++++++- cw_mweb/lib/mwebd.pbgrpc.dart | 182 ++- cw_mweb/lib/print_verbose.dart | 107 ++ cw_mweb/pubspec.yaml | 2 - lib/bitcoin/cw_bitcoin.dart | 17 + .../wallet_restore_from_keys_form.dart | 26 + .../screens/restore/wallet_restore_page.dart | 9 +- lib/view_model/restore/restore_wallet.dart | 10 + lib/view_model/wallet_restore_view_model.dart | 13 +- scripts/android/build_mwebd.sh | 2 +- scripts/android/build_torch.sh | 2 +- tool/configure.dart | 1 + 26 files changed, 1909 insertions(+), 149 deletions(-) create mode 100644 cw_mweb/lib/print_verbose.dart diff --git a/cw_bitcoin/lib/bitcoin_address_record.dart b/cw_bitcoin/lib/bitcoin_address_record.dart index 1509f913a5..2bc9fdd6cc 100644 --- a/cw_bitcoin/lib/bitcoin_address_record.dart +++ b/cw_bitcoin/lib/bitcoin_address_record.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'package:cw_core/utils/print_verbose.dart'; import 'package:mobx/mobx.dart'; import 'package:bitcoin_base/bitcoin_base.dart'; @@ -65,8 +66,14 @@ class BitcoinAddressRecord extends BaseBitcoinAddressRecord { required super.type, String? scriptHash, required super.network, - }) : scriptHash = scriptHash ?? - (network != null ? BitcoinAddressUtils.scriptHash(address, network: network) : null); + }) { + try { + this.scriptHash = scriptHash ?? + (network != null ? BitcoinAddressUtils.scriptHash(address, network: network!) : null); + } catch (e) { + printV(e); + } +} factory BitcoinAddressRecord.fromJSON(String jsonSource, {BasedUtxoNetwork? network}) { final decoded = json.decode(jsonSource) as Map; diff --git a/cw_bitcoin/lib/bitcoin_wallet_creation_credentials.dart b/cw_bitcoin/lib/bitcoin_wallet_creation_credentials.dart index 55d301d181..a0ac21460a 100644 --- a/cw_bitcoin/lib/bitcoin_wallet_creation_credentials.dart +++ b/cw_bitcoin/lib/bitcoin_wallet_creation_credentials.dart @@ -70,6 +70,21 @@ class BitcoinWalletFromKeysCredentials extends WalletCredentials { final String xpub; } +class LitecoinWalletFromKeysCredentials extends WalletCredentials { + LitecoinWalletFromKeysCredentials({ + required String name, + required String password, + required this.xpub, + required this.scanSecret, + required this.spendPubkey, + WalletInfo? walletInfo, + }) : super(name: name, password: password, walletInfo: walletInfo); + + final String xpub; + final String scanSecret; + final String spendPubkey; +} + class BitcoinRestoreWalletFromHardware extends WalletCredentials { BitcoinRestoreWalletFromHardware({ required String name, diff --git a/cw_bitcoin/lib/bitcoin_wallet_service.dart b/cw_bitcoin/lib/bitcoin_wallet_service.dart index f742376fa8..ebb075912d 100644 --- a/cw_bitcoin/lib/bitcoin_wallet_service.dart +++ b/cw_bitcoin/lib/bitcoin_wallet_service.dart @@ -165,7 +165,7 @@ class BitcoinWalletService extends WalletService< derivationInfo.derivationPath = credentials.hwAccountData.derivationPath; - final xpub = convertZpubToXpub(credentials.hwAccountData.xpub!); + final xpub = convertAnyToXpub(credentials.hwAccountData.xpub!); await credentials.walletInfo!.save(); final wallet = await BitcoinWallet( @@ -189,7 +189,7 @@ class BitcoinWalletService extends WalletService< final network = isTestnet == true ? BitcoinNetwork.testnet : BitcoinNetwork.mainnet; credentials.walletInfo?.network = network.value; - final xpub = convertZpubToXpub(credentials.xpub); + final xpub = convertAnyToXpub(credentials.xpub); final wallet = await BitcoinWallet( password: credentials.password!, diff --git a/cw_bitcoin/lib/litecoin_wallet.dart b/cw_bitcoin/lib/litecoin_wallet.dart index 01c7171176..11636b82d0 100644 --- a/cw_bitcoin/lib/litecoin_wallet.dart +++ b/cw_bitcoin/lib/litecoin_wallet.dart @@ -1,7 +1,17 @@ import 'dart:async'; import 'dart:convert'; import 'dart:math'; - +import 'package:collection/collection.dart'; +import 'package:crypto/crypto.dart'; +import 'package:cw_bitcoin/address_from_output.dart'; +import 'package:cw_bitcoin/bitcoin_transaction_credentials.dart'; +import 'package:cw_core/cake_hive.dart'; +import 'package:cw_core/mweb_utxo.dart'; +import 'package:cw_core/unspent_coin_type.dart'; +import 'package:cw_core/utils/print_verbose.dart'; +import 'package:cw_core/node.dart'; +import 'package:cw_mweb/mwebd.pbgrpc.dart'; +import 'package:fixnum/fixnum.dart'; import 'package:bip39/bip39.dart' as bip39; import 'package:bitcoin_base/bitcoin_base.dart'; import 'package:bitcoin_base/src/crypto/keypair/sign_utils.dart'; @@ -51,6 +61,9 @@ import 'package:mobx/mobx.dart'; import 'package:pointycastle/ecc/api.dart'; import 'package:pointycastle/ecc/curves/secp256k1.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:ur/cbor_lite.dart'; +import 'package:ur/ur.dart'; +import 'package:ur/ur_decoder.dart'; part 'litecoin_wallet.g.dart'; @@ -66,6 +79,8 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store { Uint8List? seedBytes, String? mnemonic, String? xpub, + this.scanSecretOverride, + this.spendPubkeyOverride, String? passphrase, String? addressPageType, List? initialAddresses, @@ -95,6 +110,9 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store { mwebHd = Bip32Slip10Secp256k1.fromSeed(seedBytes).derivePath("m/1000'") as Bip32Slip10Secp256k1; mwebEnabled = alwaysScan ?? false; + } else if (scanSecretOverride != null && spendPubkeyOverride != null) { + mwebHd = null; + mwebEnabled = alwaysScan ?? false; } else { mwebHd = null; mwebEnabled = false; @@ -110,6 +128,8 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store { network: network, mwebHd: mwebHd, mwebEnabled: mwebEnabled, + scanSecretOverride: scanSecretOverride, + spendPubkeyOverride: spendPubkeyOverride, isHardwareWallet: walletInfo.isHardwareWallet, ); autorun((_) { @@ -162,9 +182,15 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store { @override bool get hasRescan => true; - List get scanSecret => mwebHd!.childKey(Bip32KeyIndex(0x80000000)).privateKey.privKey.raw; - List get spendSecret => mwebHd!.childKey(Bip32KeyIndex(0x80000001)).privateKey.privKey.raw; + final String? scanSecretOverride; + final String? spendPubkeyOverride; + List get scanSecret => scanSecretOverride != null + ? hex.decode(scanSecretOverride!) + : mwebHd!.childKey(Bip32KeyIndex(0x80000000)).privateKey.privKey.raw; + + List get spendSecret => + mwebHd?.childKey(Bip32KeyIndex(0x80000001)).privateKey.privKey.raw ?? List.filled(32, 0); static Future create( {required String mnemonic, @@ -212,6 +238,10 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store { ); } + @override + WalletKeysData get walletKeysData => + WalletKeysData(mnemonic: seed, xPub: xpub, passphrase: passphrase, scanSecret: scanSecretOverride, spendPubkey: spendPubkeyOverride); + static Future open({ required String name, required WalletInfo walletInfo, @@ -277,6 +307,8 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store { return LitecoinWallet( mnemonic: keysData.mnemonic, xpub: keysData.xPub, + scanSecretOverride: keysData.scanSecret, + spendPubkeyOverride: keysData.spendPubkey, password: password, walletInfo: walletInfo, derivationInfo: derivationInfo, @@ -1064,6 +1096,47 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store { return fee.toInt() + feeIncrease; } + Future buildPsbt(PendingBitcoinTransaction transaction, bool isMweb) async { + final List inputs = []; + final List txouts = []; + for (final utxo in transaction.utxos) { + if (utxo.utxo.scriptType != SegwitAddresType.mweb) { + inputs.add(utxo.utxo.toInput()); + txouts.add(TxOut(value: Int64(utxo.utxo.value.toInt()), + pkScript: utxo.ownerDetails.address.toScriptPubKey().toBytes())); + } + } + var resp = await CwMweb.psbtCreate(PsbtCreateRequest( + rawTx: inputs.isEmpty ? null : BtcTransaction( + inputs: inputs, + outputs: isMweb ? [] : transaction.outputs, + ).toBytes(), + witnessUtxo: txouts, + )); + for (final utxo in transaction.utxos) { + if (utxo.utxo.scriptType == SegwitAddresType.mweb) { + resp = await CwMweb.psbtAddInput(PsbtAddInputRequest( + psbtB64: resp.psbtB64, + scanSecret: scanSecret, + outputId: utxo.utxo.txHash, + addressIndex: utxo.utxo.vout, + )); + } + } + if (isMweb) for (final output in transaction.outputs) { + var address = addressFromOutputScript(output.scriptPubKey, LitecoinNetwork.mainnet); + if (output.scriptPubKey.getAddressType() == SegwitAddresType.mweb) { + address = SegwitBech32Encoder.encode("ltcmweb", 0, output.scriptPubKey.toBytes()); + } + resp = await CwMweb.psbtAddRecipient(PsbtAddRecipientRequest( + psbtB64: resp.psbtB64, + recipient: PsbtRecipient(address: address, value: Int64(output.amount.toInt())), + feeRatePerKb: Int64.parseInt(transaction.feeRate) * 1000, + )); + } + return base64.decode(resp.psbtB64); + } + @override Future createTransaction(Object credentials) async { try { @@ -1074,18 +1147,13 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store { tx.changeAddressOverride = (await (walletAddresses as LitecoinWalletAddresses) .getChangeAddress(coinTypeToSpendFrom: UnspentCoinType.nonMweb)) .address; + if (tx.shouldCommitUR()) { + tx.unsignedPsbt = await buildPsbt(tx, false); + } return tx; } await waitForMwebAddresses(); - final resp = await CwMweb.create(CreateRequest( - rawTx: hex.decode(tx.hex), - scanSecret: scanSecret, - spendSecret: spendSecret, - feeRatePerKb: Int64.parseInt(tx.feeRate) * 1000, - )); - final tx2 = BtcTransaction.fromRaw(hex.encode(resp.rawTx)); - // check if the transaction doesn't contain any mweb inputs or outputs: final transactionCredentials = credentials as BitcoinTransactionCredentials; @@ -1117,6 +1185,26 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store { for (final utxo in tx.utxos) { if (utxo.utxo.scriptType == SegwitAddresType.mweb) { hasMwebInput = true; + + } else { + // check if any of the inputs of this transaction are hog-ex: + // this list is only non-mweb inputs: + bool isHogEx = true; + + final coin = unspentCoins + .firstWhere((coin) => coin.hash == utxo.utxo.txHash && coin.vout == utxo.utxo.vout); + + // TODO: detect actual hog-ex inputs + + if (!isHogEx) { + continue; + } + + int confirmations = coin.confirmations ?? 0; + if (confirmations < 6) { + throw Exception( + "A transaction input has less than 6 confirmations, please try again later."); + } } } @@ -1132,29 +1220,24 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store { .address; if (isRegular) { tx.isMweb = false; + if (tx.shouldCommitUR()) { + tx.unsignedPsbt = await buildPsbt(tx, false); + } return tx; } - // check if any of the inputs of this transaction are hog-ex: - // this list is only non-mweb inputs: - tx2.inputs.forEach((txInput) { - bool isHogEx = true; - - final utxo = unspentCoins - .firstWhere((utxo) => utxo.hash == txInput.txId && utxo.vout == txInput.txIndex); - - // TODO: detect actual hog-ex inputs - - if (!isHogEx) { - return; - } + if (tx.shouldCommitUR()) { + tx.unsignedPsbt = await buildPsbt(tx, true); + return tx; + } - int confirmations = utxo.confirmations ?? 0; - if (confirmations < 6) { - throw Exception( - "A transaction input has less than 6 confirmations, please try again later."); - } - }); + final resp = await CwMweb.create(CreateRequest( + rawTx: hex.decode(tx.hex), + scanSecret: scanSecret, + spendSecret: spendSecret, + feeRatePerKb: Int64.parseInt(tx.feeRate) * 1000, + )); + final tx2 = BtcTransaction.fromRaw(hex.encode(resp.rawTx)); tx.hexOverride = tx2 .copyWith( @@ -1177,31 +1260,109 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store { .toHex(); tx.outputAddresses = resp.outputId; - return tx - ..addListener((transaction) async { - final addresses = {}; - transaction.inputAddresses?.forEach((id) async { - final utxo = mwebUtxosBox.get(id); - // await mwebUtxosBox.delete(id); // gets deleted in checkMwebUtxosSpent - if (utxo == null) return; - // mark utxo as spent so we add it to the unconfirmed balance (as negative): - utxo.spent = true; - await mwebUtxosBox.put(id, utxo); - final addressRecord = walletAddresses.allAddresses - .firstWhere((addressRecord) => addressRecord.address == utxo.address); - if (!addresses.contains(utxo.address)) { - addresses.add(utxo.address); - } - addressRecord.balance -= utxo.value.toInt(); - }); - transaction.inputAddresses?.addAll(addresses); - printV("isPegIn: $isPegIn, isPegOut: $isPegOut"); - transaction.additionalInfo["isPegIn"] = isPegIn; - transaction.additionalInfo["isPegOut"] = isPegOut; - transactionHistory.addOne(transaction); - await updateUnspent(); - await updateBalance(); - }); + addTransactionListener(tx, [], isPegIn, isPegOut); + return tx; + } catch (e, s) { + printV(e); + printV(s); + if (e.toString().contains("commit failed")) { + printV(e); + throw Exception("Transaction commit failed (no peers responded), please try again."); + } + rethrow; + } + } + + void addTransactionListener(PendingBitcoinTransaction tx, + List inputAddresses, bool isPegIn, bool isPegOut) { + tx.addListener((transaction) async { + final addresses = {}; + transaction.inputAddresses?.addAll(inputAddresses); + transaction.inputAddresses?.forEach((id) async { + final utxo = mwebUtxosBox.get(id); + // await mwebUtxosBox.delete(id); // gets deleted in checkMwebUtxosSpent + if (utxo == null) return; + // mark utxo as spent so we add it to the unconfirmed balance (as negative): + utxo.spent = true; + await mwebUtxosBox.put(id, utxo); + final addressRecord = walletAddresses.allAddresses + .firstWhere((addressRecord) => addressRecord.address == utxo.address); + if (!addresses.contains(utxo.address)) { + addresses.add(utxo.address); + } + addressRecord.balance -= utxo.value.toInt(); + }); + transaction.inputAddresses?.addAll(addresses); + printV("isPegIn: $isPegIn, isPegOut: $isPegOut"); + transaction.additionalInfo["isPegIn"] = isPegIn; + transaction.additionalInfo["isPegOut"] = isPegOut; + transactionHistory.addOne(transaction); + await updateUnspent(); + await updateBalance(); + }); + } + + Future commitPsbtUR(List urCodes) async { + if (urCodes.isEmpty) throw Exception("No QR code got scanned"); + bool isUr = urCodes.any((str) { + return str.startsWith("ur:psbt/"); + }); + if (!isUr) return; + + final ur = URDecoder(); + for (final inp in urCodes) { + ur.receivePart(inp); + } + final result = ur.result as UR; + final psbtB64 = base64Encode(CBORDecoder(result.cbor).decodeBytes().$1); + + final resp = await CwMweb.psbtGetRecipients(PsbtGetRecipientsRequest(psbtB64: psbtB64)); + + bool hasMwebInput = false; + bool hasMwebOutput = false; + bool hasRegularOutput = false; + + for (final recipient in resp.recipient) { + if (recipient.address.contains("mweb")) { + hasMwebOutput = true; + } else { + hasRegularOutput = true; + } + } + + for (final address in resp.inputAddress) { + try { + LitecoinAddress(address); + } catch (_) { + hasMwebInput = true; + } + } + + bool isPegIn = !hasMwebInput && hasMwebOutput; + bool isPegOut = hasMwebInput && hasRegularOutput; + bool isRegular = !hasMwebInput && !hasMwebOutput; + + final resp2 = await CwMweb.psbtExtract(PsbtExtractRequest(psbtB64: psbtB64)); + + final btcTx = BtcTransaction.fromRaw(hex.encode(resp2.rawTx)); + + final tx = PendingBitcoinTransaction( + btcTx, + type, + electrumClient: electrumClient, + amount: btcTx.outputs.reduce((a, b) => TxOutput(amount: a.amount + b.amount, scriptPubKey: a.scriptPubKey)).amount.toInt(), + fee: resp.fee.toInt(), + feeRate: "", + network: network, + hasChange: resp.recipient.length > 1, + isMweb: !isRegular, + isViewOnly: false, + ); + tx.outputAddresses = resp2.outputId; + addTransactionListener(tx, resp.inputAddress, isPegIn, isPegOut); + + try { + await tx.commit(); } catch (e, s) { printV(e); printV(s); diff --git a/cw_bitcoin/lib/litecoin_wallet_addresses.dart b/cw_bitcoin/lib/litecoin_wallet_addresses.dart index 76228c16de..4968e95c35 100644 --- a/cw_bitcoin/lib/litecoin_wallet_addresses.dart +++ b/cw_bitcoin/lib/litecoin_wallet_addresses.dart @@ -28,6 +28,8 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with required super.isHardwareWallet, required this.mwebHd, required this.mwebEnabled, + required this.scanSecretOverride, + required this.spendPubkeyOverride, super.initialAddresses, super.initialMwebAddresses, super.initialRegularAddressIndex, @@ -45,9 +47,15 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with List mwebAddrs = []; bool generating = false; - List get scanSecret => mwebHd!.childKey(Bip32KeyIndex(0x80000000)).privateKey.privKey.raw; - List get spendPubkey => - mwebHd!.childKey(Bip32KeyIndex(0x80000001)).publicKey.pubKey.compressed; + final String? scanSecretOverride; + final String? spendPubkeyOverride; + + List get scanSecret => scanSecretOverride != null + ? hex.decode(scanSecretOverride!) + : mwebHd!.childKey(Bip32KeyIndex(0x80000000)).privateKey.privKey.raw; + List get spendPubkey => spendPubkeyOverride != null + ? hex.decode(spendPubkeyOverride!) + : mwebHd!.childKey(Bip32KeyIndex(0x80000001)).publicKey.pubKey.compressed; @override Future init() async { @@ -65,6 +73,10 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with if (Platform.isLinux || Platform.isMacOS || Platform.isWindows) { return null; } + if ((scanSecret.length < 1 || scanSecret.reduce((a, b) => a + b) == 0) || + (spendPubkey.length < 1 || spendPubkey.reduce((a, b) => a + b) == 0)) { + return null; + } Uint8List scan = Uint8List.fromList(scanSecret); Uint8List spend = Uint8List.fromList(spendPubkey); @@ -95,7 +107,7 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with // ensure mweb addresses are up to date: // This is the Case if the Litecoin Wallet is a hardware Wallet - if (mwebHd == null) return; + if (mwebHd == null && scanSecretOverride == null) return; if (mwebAddresses.length < mwebAddrs.length) { List addressRecords = mwebAddrs @@ -127,6 +139,9 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with BitcoinAddressType? addressType, }) { if (addressType == SegwitAddresType.mweb) { + if (mwebAddrs.length == 0) { + return "null"; + } return hd == sideHd ? mwebAddrs[0] : mwebAddrs[index + 1]; } return generateP2WPKHAddress(hd: hd, index: index, network: network); diff --git a/cw_bitcoin/lib/litecoin_wallet_service.dart b/cw_bitcoin/lib/litecoin_wallet_service.dart index 126b6a9a3f..739602e245 100644 --- a/cw_bitcoin/lib/litecoin_wallet_service.dart +++ b/cw_bitcoin/lib/litecoin_wallet_service.dart @@ -20,7 +20,7 @@ import 'package:path_provider/path_provider.dart'; class LitecoinWalletService extends WalletService< BitcoinNewWalletCredentials, BitcoinRestoreWalletFromSeedCredentials, - BitcoinRestoreWalletFromWIFCredentials, + LitecoinWalletFromKeysCredentials, BitcoinRestoreWalletFromHardware> { LitecoinWalletService(this.unspentCoinsInfoSource, this.isDirect); @@ -186,9 +186,26 @@ class LitecoinWalletService extends WalletService< } @override - Future restoreFromKeys(BitcoinRestoreWalletFromWIFCredentials credentials, - {bool? isTestnet}) async => - throw UnimplementedError(); + Future restoreFromKeys(LitecoinWalletFromKeysCredentials credentials, + {bool? isTestnet}) async { + final network = isTestnet == true ? LitecoinNetwork.testnet : LitecoinNetwork.mainnet; + credentials.walletInfo?.network = network.value; + + final wallet = await LitecoinWallet( + password: credentials.password!, + xpub: credentials.xpub, + scanSecretOverride: credentials.scanSecret, + spendPubkeyOverride: credentials.spendPubkey, + walletInfo: credentials.walletInfo!, + derivationInfo: await credentials.walletInfo!.getDerivationInfo(), + unspentCoinsInfo: unspentCoinsInfoSource, + encryptionFileUtils: encryptionFileUtilsFor(isDirect), + ); + + await wallet.save(); + await wallet.init(); + return wallet; + } @override Future restoreFromSeed(BitcoinRestoreWalletFromSeedCredentials credentials, diff --git a/cw_core/lib/utils/zpub.dart b/cw_core/lib/utils/zpub.dart index 90f03895fd..a64f90225b 100644 --- a/cw_core/lib/utils/zpub.dart +++ b/cw_core/lib/utils/zpub.dart @@ -3,6 +3,15 @@ import 'dart:typed_data'; import 'package:blockchain_utils/blockchain_utils.dart'; +String convertAnyToXpub(String any) { + if (any.toLowerCase().startsWith("zpub")) { + return convertZpubToXpub(any); + } else if (any.toLowerCase().startsWith("ltub")) { + return convertLtubToXpub(any); + } + return any; +} + String convertZpubToXpub(String zpub) { try { final decoded = Base58Decoder.checkDecode(zpub); @@ -37,6 +46,36 @@ String convertZpubToXpub(String zpub) { } } +String convertLtubToXpub(String ltub) { + try { + final decoded = Base58Decoder.checkDecode(ltub); + + if (decoded.length < 4) { + throw ArgumentError('Invalid extended public key length'); + } + + final versionBytes = decoded.sublist(0, 4); + final ltubVersionBytes = [0x01, 0x9D, 0xA4, 0x62]; // Ltub mainnet version + + bool isLtub = listEquals(versionBytes, ltubVersionBytes); + + if (!isLtub) { + return ltub; + } + + final xpubVersionBytes = [0x04, 0x88, 0xb2, 0x1e]; + + final newExtendedKey = Uint8List.fromList([ + ...xpubVersionBytes, + ...decoded.sublist(4), + ]); + + return Base58Encoder.checkEncode(newExtendedKey); + } catch (e) { + throw ArgumentError('Failed to convert ltub to xpub: $e'); + } +} + bool listEquals(List a, List b) { if (a.length != b.length) return false; for (int i = 0; i < a.length; i++) { diff --git a/cw_core/lib/wallet_keys_file.dart b/cw_core/lib/wallet_keys_file.dart index 638cdc39d1..ee25713e4c 100644 --- a/cw_core/lib/wallet_keys_file.dart +++ b/cw_core/lib/wallet_keys_file.dart @@ -98,15 +98,19 @@ class WalletKeysData { final String? altMnemonic; final String? passphrase; final String? xPub; + final String? scanSecret; + final String? spendPubkey; - WalletKeysData({this.privateKey, this.mnemonic, this.altMnemonic, this.passphrase, this.xPub}); + WalletKeysData({this.privateKey, this.mnemonic, this.altMnemonic, this.passphrase, this.xPub, this.scanSecret, this.spendPubkey}); String toJSON() => jsonEncode({ "privateKey": privateKey, "mnemonic": mnemonic, if (altMnemonic != null) "altMnemonic": altMnemonic, if (passphrase != null) "passphrase": passphrase, - if (xPub != null) "xPub": xPub + if (xPub != null) "xPub": xPub, + if (scanSecret != null) "scanSecret": scanSecret, + if (spendPubkey != null) "spendPubkey": spendPubkey, }); static WalletKeysData fromJSON(Map json) => WalletKeysData( @@ -115,5 +119,7 @@ class WalletKeysData { altMnemonic: json["altMnemonic"] as String?, passphrase: json["passphrase"] as String?, xPub: json["xPub"] as String?, + scanSecret: json["scanSecret"] as String?, + spendPubkey: json["spendPubkey"] as String?, ); } diff --git a/cw_mweb/.gitignore b/cw_mweb/.gitignore index 96486fd930..9d90768f51 100644 --- a/cw_mweb/.gitignore +++ b/cw_mweb/.gitignore @@ -28,3 +28,4 @@ migrate_working_dir/ .dart_tool/ .packages build/ +jniLibs/ diff --git a/cw_mweb/go/go.mod b/cw_mweb/go/go.mod index 36d1e464c4..e01117a281 100644 --- a/cw_mweb/go/go.mod +++ b/cw_mweb/go/go.mod @@ -1,6 +1,10 @@ module github.com/cake-tech/cake_wallet/cw_mweb/go -go 1.24.2 +go 1.24.1 + +require github.com/ltcmweb/mwebd v0.1.16 + +require github.com/ltcmweb/mwebd v0.1.16 require ( github.com/Microsoft/go-winio v0.6.2 // indirect @@ -23,10 +27,9 @@ require ( github.com/kkdai/bstream v1.0.0 // indirect github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/ltcmweb/coinswapd v0.1.0 // indirect - github.com/ltcmweb/ltcd v0.25.6 // indirect + github.com/ltcmweb/ltcd v0.25.11 // indirect github.com/ltcmweb/ltcd/btcec/v2 v2.3.3 // indirect github.com/ltcmweb/ltcd/chaincfg/chainhash v1.0.3 // indirect - github.com/ltcmweb/mwebd v0.1.8 // indirect github.com/ltcmweb/neutrino v0.17.4 // indirect github.com/ltcmweb/neutrino/cache v1.1.0 // indirect github.com/ltcmweb/secp256k1 v0.1.1 // indirect @@ -37,14 +40,14 @@ require ( github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect go.etcd.io/bbolt v1.3.10 // indirect - golang.org/x/crypto v0.33.0 // indirect + golang.org/x/crypto v0.39.0 // indirect golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect - golang.org/x/net v0.35.0 // indirect - golang.org/x/sys v0.30.0 // indirect - golang.org/x/text v0.22.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240509183442-62759503f434 // indirect - google.golang.org/grpc v1.63.2 // indirect - google.golang.org/protobuf v1.34.2 // indirect + golang.org/x/net v0.41.0 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/text v0.26.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.6 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect lukechampine.com/blake3 v1.3.0 // indirect ) diff --git a/cw_mweb/go/go.sum b/cw_mweb/go/go.sum index c973d854f5..f09c4a6ac0 100644 --- a/cw_mweb/go/go.sum +++ b/cw_mweb/go/go.sum @@ -6,12 +6,22 @@ github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/alitto/pond/v2 v2.2.0 h1:hX3B1Lu4b5PjSHR+IWNRDKD0Jfw2ew8V25J7Vu5j7RM= github.com/alitto/pond/v2 v2.2.0/go.mod h1:xkjYEgQ05RSpWdfSd1nM3OVv7TBhLdy7rMp3+2Nq+yE= +github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= @@ -22,11 +32,25 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnN github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/decred/dcrd/lru v1.1.2 h1:KdCzlkxppuoIDGEvCGah1fZRicrDH36IipvlB1ROkFY= github.com/decred/dcrd/lru v1.1.2/go.mod h1:gEdCVgXs1/YoBvFWt7Scgknbhwik3FgVSzlnCcXL2N8= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.14.8 h1:NgOWvXS+lauK+zFukEvi85UmmsS/OkV0N23UZ1VTIig= github.com/ethereum/go-ethereum v1.14.8/go.mod h1:TJhyuDq0JDppAkFXgqjwpdlQApywnu/m10kFPxh8vvs= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= @@ -39,14 +63,14 @@ github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuV github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/ltcmweb/coinswapd v0.1.0 h1:M6eoz4g7fDpsQeNA8wWbBh6PY1xykrihyLU44SgljeI= github.com/ltcmweb/coinswapd v0.1.0/go.mod h1:CY5cVSympaLrMO8fHWXO+e/iuPLs2L0U9daMCRTstEM= -github.com/ltcmweb/ltcd v0.25.6 h1:96aC38ZEyNVztylrBBqYnVZJ6cuF7IUvL2knhbMxs3Y= -github.com/ltcmweb/ltcd v0.25.6/go.mod h1:jQbvPfnT4bBXJKRwU5SdD9ZUopwmSvhngdjeopv2cIU= +github.com/ltcmweb/ltcd v0.25.11 h1:MI0n/9I0P2Ig+myofegrXXEvh00lY3TUqPk1akYHBxA= +github.com/ltcmweb/ltcd v0.25.11/go.mod h1:jQbvPfnT4bBXJKRwU5SdD9ZUopwmSvhngdjeopv2cIU= github.com/ltcmweb/ltcd/btcec/v2 v2.3.3 h1:gJc1ljDPCBtwBKFcC4SW44BFoJqoZzkeagndMYdqKKE= github.com/ltcmweb/ltcd/btcec/v2 v2.3.3/go.mod h1:NRr2WtpiSiSO29TkdZhbGNRA/Q16DV2eNbORf+M2ykI= github.com/ltcmweb/ltcd/chaincfg/chainhash v1.0.3 h1:CAPyzHI3bCFRrrVHZkDUR2i3Awj6l/aqAZIEi0E/nfM= github.com/ltcmweb/ltcd/chaincfg/chainhash v1.0.3/go.mod h1:zB+HhI2IbIwTGpdAhdzpm1GVX4ShcWTgN42+ar9HXrg= -github.com/ltcmweb/mwebd v0.1.8 h1:5TJgrM76H3s6kWUJ6CsU1L+DaafcAZ1edDlkyJ+GWt0= -github.com/ltcmweb/mwebd v0.1.8/go.mod h1:KPf+lXEvEMuG0NaHume0imWMb9Cvr15SNPujZO6EAv4= +github.com/ltcmweb/mwebd v0.1.16 h1:DaOIp/5TDhcDUxjvnWKHXkr6hF4LHe2bbY8I0zo7m9w= +github.com/ltcmweb/mwebd v0.1.16/go.mod h1:GEhTe4RTG4ImmzsyqCzO2NKK11U2Zgb5+leQnwY+u+4= github.com/ltcmweb/neutrino v0.17.4 h1:ZsguBvicTM5CtZDsKg+OBFuPUCKjfEJ3lRSGXPjF2oM= github.com/ltcmweb/neutrino v0.17.4/go.mod h1:KktZ+McIwHuTHe0K8JK9Wv4qgv8orkA21a0ZOU4SwJ4= github.com/ltcmweb/neutrino/cache v1.1.0 h1:C0Qn2p8ogcskRPfrBKPUayjn3m/CUJqI7otopNScvhk= @@ -58,10 +82,38 @@ github.com/ltcsuite/lnd/queue v1.1.0/go.mod h1:DJrxK2gPC2FjJAVYxPOcnY2CplI3rhL2P github.com/ltcsuite/lnd/ticker v1.0.1/go.mod h1:WZKpekfDVAVv7Gsrr0GAWC/U1XURfGesFg9sQYJbeL4= github.com/ltcsuite/lnd/ticker v1.1.0 h1:3zYM/JlKNqq+DotW8jiEdHVeY5Yl7n7cUb2bTof1yXM= github.com/ltcsuite/lnd/ticker v1.1.0/go.mod h1:K2qQ3EPe8enztYvn/VAbLafCPy13XHMuCRPsySoAbt8= +github.com/ltcsuite/ltcd v0.22.0-beta h1:jYVHOeg2oBDvsduV26LtCZnzwifMDWoVbkdHTjGvHTk= +github.com/ltcsuite/ltcd v0.22.0-beta/go.mod h1:/BXtm50r591uMfXf8XgSpL5er32HCvheJtBSPYK5bFM= +github.com/ltcsuite/ltcd/btcec/v2 v2.1.0 h1:0DMWBjQDb0V1+4kCLOJlNdHs7ewwYturuUfLHq8mosY= +github.com/ltcsuite/ltcd/btcec/v2 v2.1.0/go.mod h1:Vc9ZYXMcl5D6bA0VwMvGRDJYggO3YZ7/BuIri02Lq0E= +github.com/ltcsuite/ltcd/ltcutil v1.1.0 h1:btwbdHO9cEr22zW/vgCLiF6ghh+IDngJdJsyhJ6mntU= +github.com/ltcsuite/ltcd/ltcutil v1.1.0/go.mod h1:VbZlcopVgQteiCC5KRjIuxXH5wi1CtzhsvoYZ3K7FaE= +github.com/ltcsuite/ltcwallet v0.13.1 h1:XMyrDHn0BmgUgkNbR/Lzg36vjRsup3xdiPLSD471UMg= +github.com/ltcsuite/ltcwallet v0.13.1/go.mod h1:e6pIWRM9gsd5JnMsI9SgCJM0wi7awWdr20F1C1KUPiw= +github.com/ltcsuite/ltcwallet/wallet/txauthor v1.1.0 h1:MaSgMq7LCB+6dVm9oLzNCVp0lmY1WKmevmMK/t2c6To= +github.com/ltcsuite/ltcwallet/wallet/txauthor v1.1.0/go.mod h1:I53YELeELfA+dVporL+t44O8ArpuF8AjdJbbWIQaE2Q= +github.com/ltcsuite/ltcwallet/wallet/txrules v1.2.0 h1:P6H9zsMpBBuGOsp9lnil7XfPaPujDqrbcmkqvDdiSiI= +github.com/ltcsuite/ltcwallet/wallet/txrules v1.2.0/go.mod h1:lmA2Ozxvbr2M8Mqb6ugOv5/FQT6x2Qnwg3yT/NiWEks= +github.com/ltcsuite/ltcwallet/wallet/txsizes v1.1.0 h1:W884jMwG3K3Hu8FEMnV7KX1bd4HQd/4yvaevisFo9s8= +github.com/ltcsuite/ltcwallet/wallet/txsizes v1.1.0/go.mod h1:G9+XTWnE0xaXzHRzTuP+SOIXFPXFMfYF+w/wxPHb0K8= github.com/ltcsuite/ltcwallet/walletdb v1.3.5 h1:WymVw0FBQ8KJgH7B88ujRqBOJ9R0en9K9urpJW4atAE= github.com/ltcsuite/ltcwallet/walletdb v1.3.5/go.mod h1:29SBzxA55wNxY3ctFw6t5PgsULwf3NMwg2MiGQgtrJE= +github.com/ltcsuite/neutrino v0.13.2 h1:SDbRn4zt4e6z/4uVkVzVeKYpgXyoAh8ksA3m/uCIBaU= +github.com/ltcsuite/neutrino v0.13.2/go.mod h1:eTkaETZBeu3es/FisfjY8Cp3M2fC4s+2V2VUeS8O1Ic= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= @@ -69,29 +121,51 @@ github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9f go.etcd.io/bbolt v1.3.5-0.20200615073812-232d8fc87f50/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.10 h1:+BqfJTcCzTItrop8mq/lbzL8wSGtj94UO/3U31shqG0= go.etcd.io/bbolt v1.3.10/go.mod h1:bK3UQLPJZly7IlNmV7uVHJDxfe5aK9Ll93e/74Y9oEQ= -golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= -golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= +golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= -golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= -golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= +golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= +golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= +golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= +golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= -golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= -golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240509183442-62759503f434 h1:umK/Ey0QEzurTNlsV3R+MfxHAb78HCEX/IkuR+zH4WQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240509183442-62759503f434/go.mod h1:I7Y+G38R2bu5j1aLzfFmQfTcU/WnFuqDwLZAbvKTKpM= -google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= -google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= +golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE= lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/cw_mweb/go/mweb.go b/cw_mweb/go/mweb.go index 0fc2d3a9a2..46e1bee1e7 100644 --- a/cw_mweb/go/mweb.go +++ b/cw_mweb/go/mweb.go @@ -10,7 +10,7 @@ import ( var server *mwebd.Server //export StartServer -func StartServer(chain *C.char, dataDir *C.char, nodeUri *C.char) C.int { +func StartServer(chain *C.char, dataDir *C.char, nodeUri *C.char, errMsg **C.char) C.int { if server != nil { server.Stop() } @@ -21,15 +21,17 @@ func StartServer(chain *C.char, dataDir *C.char, nodeUri *C.char) C.int { var err error server, err = mwebd.NewServer(goChain, goDataDir, goNodeUri) if err != nil { + *errMsg = C.CString(err.Error()) return 0 } - start, err := server.Start(0) + err = server.StartUnix(goDataDir + "/mwebd.sock") if err != nil { + *errMsg = C.CString(err.Error()) return 0 } - return C.int(start) + return 1 } //export StopServer diff --git a/cw_mweb/lib/cw_mweb.dart b/cw_mweb/lib/cw_mweb.dart index bcd1827148..681ffe79ba 100644 --- a/cw_mweb/lib/cw_mweb.dart +++ b/cw_mweb/lib/cw_mweb.dart @@ -4,8 +4,8 @@ import 'dart:developer'; import 'dart:io'; import 'dart:typed_data'; -import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_mweb/mweb_ffi.dart'; +import 'package:cw_mweb/print_verbose.dart'; import 'package:grpc/grpc.dart'; import 'package:path_provider/path_provider.dart'; import 'mwebd.pbgrpc.dart'; @@ -64,10 +64,8 @@ class CwMweb { } printV("Attempting to connect to server on port: $_port"); - // wait for the server to finish starting up before we try to connect to it: - await Future.delayed(const Duration(seconds: 8)); - - _clientChannel = ClientChannel('127.0.0.1', port: _port!, channelShutdownHandler: () { + final address = InternetAddress("${appDir.path}/mwebd.sock", type: InternetAddressType.unix); + _clientChannel = ClientChannel(address, channelShutdownHandler: () { _rpcClient = null; printV("Channel is shutting down!"); }, @@ -219,4 +217,45 @@ class CwMweb { rethrow; } } + + static Future psbtCreate(PsbtCreateRequest request) async { + log("mweb.psbtCreate() called"); + _rpcClient = await stub(); + return await _rpcClient!.psbtCreate(request, options: CallOptions(timeout: TIMEOUT_DURATION)); + } + + static Future psbtAddInput(PsbtAddInputRequest request) async { + log("mweb.psbtAddInput() called"); + _rpcClient = await stub(); + return await _rpcClient!.psbtAddInput(request, options: CallOptions(timeout: TIMEOUT_DURATION)); + } + + static Future psbtAddRecipient(PsbtAddRecipientRequest request) async { + log("mweb.psbtAddRecipient() called"); + _rpcClient = await stub(); + return await _rpcClient!.psbtAddRecipient(request, options: CallOptions(timeout: TIMEOUT_DURATION)); + } + + static Future psbtGetRecipients(PsbtGetRecipientsRequest request) async { + log("mweb.psbtGetRecipients() called"); + _rpcClient = await stub(); + return await _rpcClient!.psbtGetRecipients(request, options: CallOptions(timeout: TIMEOUT_DURATION)); + } + + static Future psbtExtract(PsbtExtractRequest request) async { + log("mweb.psbtExtract() called"); + _rpcClient = await stub(); + return await _rpcClient!.psbtExtract(request, options: CallOptions(timeout: TIMEOUT_DURATION)); + } + static Future psbtSign(PsbtSignRequest request) async { + printV("mweb.psbtSign() called"); + _rpcClient = await stub(); + return await _rpcClient!.psbtSign(request, options: CallOptions(timeout: TIMEOUT_DURATION)); + } + + static Future psbtSignNonMweb(PsbtSignNonMwebRequest request) async { + printV("mweb.psbtSignNonMweb() called"); + _rpcClient = await stub(); + return await _rpcClient!.psbtSignNonMweb(request, options: CallOptions(timeout: TIMEOUT_DURATION)); + } } diff --git a/cw_mweb/lib/mweb_ffi.dart b/cw_mweb/lib/mweb_ffi.dart index 14f49ba91b..1413a0e8c3 100644 --- a/cw_mweb/lib/mweb_ffi.dart +++ b/cw_mweb/lib/mweb_ffi.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'dart:typed_data'; import 'package:cw_mweb/generated_bindings.g.dart'; +import 'package:cw_mweb/print_verbose.dart'; import 'package:ffi/ffi.dart'; String libPath = (() { @@ -24,12 +25,19 @@ class MWebFfi { final chain = "".toNativeUtf8().cast(); final dataDir_ = dataDir.toNativeUtf8().cast(); final nodeUri_ = nodeUri.toNativeUtf8().cast(); + final errMsgPtr = calloc>(); - final port = lib.StartServer(chain, dataDir_, nodeUri_); + final port = lib.StartServer(chain, dataDir_, nodeUri_, errMsgPtr); + if (port == 0) { + final errMsg = errMsgPtr.value.cast().toDartString(); + printV('Error starting server: $errMsg'); + calloc.free(errMsgPtr.value); + } calloc.free(chain); calloc.free(dataDir_); calloc.free(nodeUri_); + calloc.free(errMsgPtr); return port; } diff --git a/cw_mweb/lib/mwebd.pb.dart b/cw_mweb/lib/mwebd.pb.dart index d0dd486c04..faf5511c60 100644 --- a/cw_mweb/lib/mwebd.pb.dart +++ b/cw_mweb/lib/mwebd.pb.dart @@ -101,6 +101,7 @@ class StatusResponse extends $pb.GeneratedMessage { static StatusResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static StatusResponse? _defaultInstance; + /// The height of the latest block. @$pb.TagNumber(1) $core.int get blockHeaderHeight => $_getIZ(0); @$pb.TagNumber(1) @@ -110,6 +111,7 @@ class StatusResponse extends $pb.GeneratedMessage { @$pb.TagNumber(1) void clearBlockHeaderHeight() => clearField(1); + /// The height of the latest MWEB header. @$pb.TagNumber(2) $core.int get mwebHeaderHeight => $_getIZ(1); @$pb.TagNumber(2) @@ -119,6 +121,7 @@ class StatusResponse extends $pb.GeneratedMessage { @$pb.TagNumber(2) void clearMwebHeaderHeight() => clearField(2); + /// The height at which the MWEB utxo set is synced to. @$pb.TagNumber(3) $core.int get mwebUtxosHeight => $_getIZ(2); @$pb.TagNumber(3) @@ -128,6 +131,7 @@ class StatusResponse extends $pb.GeneratedMessage { @$pb.TagNumber(3) void clearMwebUtxosHeight() => clearField(3); + /// The timestamp of the latest block. @$pb.TagNumber(4) $core.int get blockTime => $_getIZ(3); @$pb.TagNumber(4) @@ -183,6 +187,10 @@ class UtxosRequest extends $pb.GeneratedMessage { static UtxosRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static UtxosRequest? _defaultInstance; + /// The block height from which to start fetching utxos from. + /// After all mined utxos have been streamed, unconfirmed and + /// newly confirmed utxos will also be streamed. If this is set + /// to 0 then all utxos belonging to the account will be fetched. @$pb.TagNumber(1) $core.int get fromHeight => $_getIZ(0); @$pb.TagNumber(1) @@ -192,6 +200,8 @@ class UtxosRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) void clearFromHeight() => clearField(1); + /// The scan secret or view key represents the account for + /// which utxos should be streamed. @$pb.TagNumber(2) $core.List<$core.int> get scanSecret => $_getN(1); @$pb.TagNumber(2) @@ -262,6 +272,7 @@ class Utxo extends $pb.GeneratedMessage { static Utxo getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static Utxo? _defaultInstance; + /// The block height of the utxo, or 0 for unconfirmed. @$pb.TagNumber(1) $core.int get height => $_getIZ(0); @$pb.TagNumber(1) @@ -271,6 +282,7 @@ class Utxo extends $pb.GeneratedMessage { @$pb.TagNumber(1) void clearHeight() => clearField(1); + /// The value of the utxo in litoshis. @$pb.TagNumber(2) $fixnum.Int64 get value => $_getI64(1); @$pb.TagNumber(2) @@ -280,6 +292,7 @@ class Utxo extends $pb.GeneratedMessage { @$pb.TagNumber(2) void clearValue() => clearField(2); + /// The MWEB address that the utxo was received on. @$pb.TagNumber(3) $core.String get address => $_getSZ(2); @$pb.TagNumber(3) @@ -289,6 +302,8 @@ class Utxo extends $pb.GeneratedMessage { @$pb.TagNumber(3) void clearAddress() => clearField(3); + /// The output ID. This functions like a transaction hash, + /// but is unique to every utxo. @$pb.TagNumber(4) $core.String get outputId => $_getSZ(3); @$pb.TagNumber(4) @@ -298,6 +313,7 @@ class Utxo extends $pb.GeneratedMessage { @$pb.TagNumber(4) void clearOutputId() => clearField(4); + /// The timestamp of the block the utxo was mined in. @$pb.TagNumber(5) $core.int get blockTime => $_getIZ(4); @$pb.TagNumber(5) @@ -363,6 +379,7 @@ class AddressRequest extends $pb.GeneratedMessage { static AddressRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static AddressRequest? _defaultInstance; + /// The starting index of the range. @$pb.TagNumber(1) $core.int get fromIndex => $_getIZ(0); @$pb.TagNumber(1) @@ -372,6 +389,8 @@ class AddressRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) void clearFromIndex() => clearField(1); + /// The ending index of the range. The result will contain all + /// addresses up to but not including this index. @$pb.TagNumber(2) $core.int get toIndex => $_getIZ(1); @$pb.TagNumber(2) @@ -381,6 +400,8 @@ class AddressRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) void clearToIndex() => clearField(2); + /// The scan secret or view key represents the account for + /// which addresses should be returned. @$pb.TagNumber(3) $core.List<$core.int> get scanSecret => $_getN(2); @$pb.TagNumber(3) @@ -390,6 +411,9 @@ class AddressRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) void clearScanSecret() => clearField(3); + /// The public key of the spend secret for the account. The spend + /// key is required for spending utxos but is also required + /// for generating addresses. @$pb.TagNumber(4) $core.List<$core.int> get spendPubkey => $_getN(3); @$pb.TagNumber(4) @@ -440,10 +464,61 @@ class AddressResponse extends $pb.GeneratedMessage { static AddressResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static AddressResponse? _defaultInstance; + /// An array of MWEB addresses within the requested range. @$pb.TagNumber(1) $core.List<$core.String> get address => $_getList(0); } +class LedgerApdu extends $pb.GeneratedMessage { + factory LedgerApdu({ + $core.List<$core.int>? data, + }) { + final $result = create(); + if (data != null) { + $result.data = data; + } + return $result; + } + LedgerApdu._() : super(); + factory LedgerApdu.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory LedgerApdu.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'LedgerApdu', createEmptyInstance: create) + ..a<$core.List<$core.int>>(1, _omitFieldNames ? '' : 'data', $pb.PbFieldType.OY) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + LedgerApdu clone() => LedgerApdu()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + LedgerApdu copyWith(void Function(LedgerApdu) updates) => super.copyWith((message) => updates(message as LedgerApdu)) as LedgerApdu; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static LedgerApdu create() => LedgerApdu._(); + LedgerApdu createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static LedgerApdu getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static LedgerApdu? _defaultInstance; + + @$pb.TagNumber(1) + $core.List<$core.int> get data => $_getN(0); + @$pb.TagNumber(1) + set data($core.List<$core.int> v) { $_setBytes(0, v); } + @$pb.TagNumber(1) + $core.bool hasData() => $_has(0); + @$pb.TagNumber(1) + void clearData() => clearField(1); +} + class SpentRequest extends $pb.GeneratedMessage { factory SpentRequest({ $core.Iterable<$core.String>? outputId, @@ -484,6 +559,7 @@ class SpentRequest extends $pb.GeneratedMessage { static SpentRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static SpentRequest? _defaultInstance; + /// An array of output IDs to perform checks for. @$pb.TagNumber(1) $core.List<$core.String> get outputId => $_getList(0); } @@ -528,6 +604,9 @@ class SpentResponse extends $pb.GeneratedMessage { static SpentResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static SpentResponse? _defaultInstance; + /// An array of the output IDs that were not found in the + /// unspent set. This means that the outputs are either + /// unconfirmed or were spent. @$pb.TagNumber(1) $core.List<$core.String> get outputId => $_getList(0); } @@ -592,6 +671,16 @@ class CreateRequest extends $pb.GeneratedMessage { static CreateRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static CreateRequest? _defaultInstance; + /// The raw bytes of the serialized transaction. This will be + /// a template where the non-MWEB inputs will remain unchanged, + /// and the MWEB inputs are specified by TxIns with the outpoint + /// hash set to the output ID of the utxo being spent, and the + /// outpoint index set to the index of the address that the utxo + /// was received on. MWEB outputs are specified by TxOuts with + /// the script pubkey set to the serialized scan and spend pubkeys + /// of the destination MWEB address. Any non-MWEB outputs will be + /// transformed into MWEB peg-outs. If the transaction doesn't + /// contain any MWEB i/o then the result will be unchanged. @$pb.TagNumber(1) $core.List<$core.int> get rawTx => $_getN(0); @$pb.TagNumber(1) @@ -601,6 +690,8 @@ class CreateRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) void clearRawTx() => clearField(1); + /// The scan secret or view key represents the account that + /// the utxos being spent belong to. @$pb.TagNumber(2) $core.List<$core.int> get scanSecret => $_getN(1); @$pb.TagNumber(2) @@ -610,6 +701,8 @@ class CreateRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) void clearScanSecret() => clearField(2); + /// The spend secret is the private key necessary for spending + /// the utxos belonging to the account. @$pb.TagNumber(3) $core.List<$core.int> get spendSecret => $_getN(2); @$pb.TagNumber(3) @@ -619,6 +712,7 @@ class CreateRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) void clearSpendSecret() => clearField(3); + /// The fee rate per KB in litoshis. @$pb.TagNumber(4) $fixnum.Int64 get feeRatePerKb => $_getI64(3); @$pb.TagNumber(4) @@ -628,6 +722,8 @@ class CreateRequest extends $pb.GeneratedMessage { @$pb.TagNumber(4) void clearFeeRatePerKb() => clearField(4); + /// Whether to skip MWEB transaction creation. This is useful + /// for fee estimation. @$pb.TagNumber(5) $core.bool get dryRun => $_getBF(4); @$pb.TagNumber(5) @@ -683,6 +779,10 @@ class CreateResponse extends $pb.GeneratedMessage { static CreateResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static CreateResponse? _defaultInstance; + /// The raw bytes of the serialized transaction. It will contain + /// a single TxOut representing the peg-in required. From this + /// it is possible to determine the addtional fee that was added + /// by the MWEB transaction. @$pb.TagNumber(1) $core.List<$core.int> get rawTx => $_getN(0); @$pb.TagNumber(1) @@ -692,26 +792,33 @@ class CreateResponse extends $pb.GeneratedMessage { @$pb.TagNumber(1) void clearRawTx() => clearField(1); + /// The output IDs of any utxos created by the transaction, + /// in the same order as in the template. @$pb.TagNumber(2) $core.List<$core.String> get outputId => $_getList(1); } -class BroadcastRequest extends $pb.GeneratedMessage { - factory BroadcastRequest({ +class PsbtCreateRequest extends $pb.GeneratedMessage { + factory PsbtCreateRequest({ $core.List<$core.int>? rawTx, + $core.Iterable? witnessUtxo, }) { final $result = create(); if (rawTx != null) { $result.rawTx = rawTx; } + if (witnessUtxo != null) { + $result.witnessUtxo.addAll(witnessUtxo); + } return $result; } - BroadcastRequest._() : super(); - factory BroadcastRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory BroadcastRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + PsbtCreateRequest._() : super(); + factory PsbtCreateRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory PsbtCreateRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'BroadcastRequest', createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtCreateRequest', createEmptyInstance: create) ..a<$core.List<$core.int>>(1, _omitFieldNames ? '' : 'rawTx', $pb.PbFieldType.OY) + ..pc(2, _omitFieldNames ? '' : 'witnessUtxo', $pb.PbFieldType.PM, subBuilder: TxOut.create) ..hasRequiredFields = false ; @@ -719,23 +826,24 @@ class BroadcastRequest extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' 'Will be removed in next major version') - BroadcastRequest clone() => BroadcastRequest()..mergeFromMessage(this); + PsbtCreateRequest clone() => PsbtCreateRequest()..mergeFromMessage(this); @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - BroadcastRequest copyWith(void Function(BroadcastRequest) updates) => super.copyWith((message) => updates(message as BroadcastRequest)) as BroadcastRequest; + PsbtCreateRequest copyWith(void Function(PsbtCreateRequest) updates) => super.copyWith((message) => updates(message as PsbtCreateRequest)) as PsbtCreateRequest; $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') - static BroadcastRequest create() => BroadcastRequest._(); - BroadcastRequest createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); + static PsbtCreateRequest create() => PsbtCreateRequest._(); + PsbtCreateRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static BroadcastRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static BroadcastRequest? _defaultInstance; + static PsbtCreateRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static PsbtCreateRequest? _defaultInstance; + /// The raw bytes of the serialized transaction. @$pb.TagNumber(1) $core.List<$core.int> get rawTx => $_getN(0); @$pb.TagNumber(1) @@ -744,24 +852,33 @@ class BroadcastRequest extends $pb.GeneratedMessage { $core.bool hasRawTx() => $_has(0); @$pb.TagNumber(1) void clearRawTx() => clearField(1); + + /// Witness utxos for each input. + @$pb.TagNumber(2) + $core.List get witnessUtxo => $_getList(1); } -class BroadcastResponse extends $pb.GeneratedMessage { - factory BroadcastResponse({ - $core.String? txid, +class TxOut extends $pb.GeneratedMessage { + factory TxOut({ + $fixnum.Int64? value, + $core.List<$core.int>? pkScript, }) { final $result = create(); - if (txid != null) { - $result.txid = txid; + if (value != null) { + $result.value = value; + } + if (pkScript != null) { + $result.pkScript = pkScript; } return $result; } - BroadcastResponse._() : super(); - factory BroadcastResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory BroadcastResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + TxOut._() : super(); + factory TxOut.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory TxOut.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'BroadcastResponse', createEmptyInstance: create) - ..aOS(1, _omitFieldNames ? '' : 'txid') + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'TxOut', createEmptyInstance: create) + ..aInt64(1, _omitFieldNames ? '' : 'value') + ..a<$core.List<$core.int>>(2, _omitFieldNames ? '' : 'pkScript', $pb.PbFieldType.OY) ..hasRequiredFields = false ; @@ -769,33 +886,934 @@ class BroadcastResponse extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' 'Will be removed in next major version') - BroadcastResponse clone() => BroadcastResponse()..mergeFromMessage(this); + TxOut clone() => TxOut()..mergeFromMessage(this); @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - BroadcastResponse copyWith(void Function(BroadcastResponse) updates) => super.copyWith((message) => updates(message as BroadcastResponse)) as BroadcastResponse; + TxOut copyWith(void Function(TxOut) updates) => super.copyWith((message) => updates(message as TxOut)) as TxOut; $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') - static BroadcastResponse create() => BroadcastResponse._(); - BroadcastResponse createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); + static TxOut create() => TxOut._(); + TxOut createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static BroadcastResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); - static BroadcastResponse? _defaultInstance; + static TxOut getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static TxOut? _defaultInstance; @$pb.TagNumber(1) - $core.String get txid => $_getSZ(0); + $fixnum.Int64 get value => $_getI64(0); @$pb.TagNumber(1) - set txid($core.String v) { $_setString(0, v); } + set value($fixnum.Int64 v) { $_setInt64(0, v); } @$pb.TagNumber(1) - $core.bool hasTxid() => $_has(0); + $core.bool hasValue() => $_has(0); @$pb.TagNumber(1) - void clearTxid() => clearField(1); + void clearValue() => clearField(1); + + @$pb.TagNumber(2) + $core.List<$core.int> get pkScript => $_getN(1); + @$pb.TagNumber(2) + set pkScript($core.List<$core.int> v) { $_setBytes(1, v); } + @$pb.TagNumber(2) + $core.bool hasPkScript() => $_has(1); + @$pb.TagNumber(2) + void clearPkScript() => clearField(2); +} + +class PsbtResponse extends $pb.GeneratedMessage { + factory PsbtResponse({ + $core.String? psbtB64, + }) { + final $result = create(); + if (psbtB64 != null) { + $result.psbtB64 = psbtB64; + } + return $result; + } + PsbtResponse._() : super(); + factory PsbtResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory PsbtResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtResponse', createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'psbtB64') + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + PsbtResponse clone() => PsbtResponse()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + PsbtResponse copyWith(void Function(PsbtResponse) updates) => super.copyWith((message) => updates(message as PsbtResponse)) as PsbtResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PsbtResponse create() => PsbtResponse._(); + PsbtResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PsbtResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static PsbtResponse? _defaultInstance; + + /// The PSBT in base64 encoding. + @$pb.TagNumber(1) + $core.String get psbtB64 => $_getSZ(0); + @$pb.TagNumber(1) + set psbtB64($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasPsbtB64() => $_has(0); + @$pb.TagNumber(1) + void clearPsbtB64() => clearField(1); +} + +class PsbtAddInputRequest extends $pb.GeneratedMessage { + factory PsbtAddInputRequest({ + $core.String? psbtB64, + $core.List<$core.int>? scanSecret, + $core.String? outputId, + $core.int? addressIndex, + }) { + final $result = create(); + if (psbtB64 != null) { + $result.psbtB64 = psbtB64; + } + if (scanSecret != null) { + $result.scanSecret = scanSecret; + } + if (outputId != null) { + $result.outputId = outputId; + } + if (addressIndex != null) { + $result.addressIndex = addressIndex; + } + return $result; + } + PsbtAddInputRequest._() : super(); + factory PsbtAddInputRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory PsbtAddInputRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtAddInputRequest', createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'psbtB64') + ..a<$core.List<$core.int>>(2, _omitFieldNames ? '' : 'scanSecret', $pb.PbFieldType.OY) + ..aOS(3, _omitFieldNames ? '' : 'outputId') + ..a<$core.int>(4, _omitFieldNames ? '' : 'addressIndex', $pb.PbFieldType.OU3) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + PsbtAddInputRequest clone() => PsbtAddInputRequest()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + PsbtAddInputRequest copyWith(void Function(PsbtAddInputRequest) updates) => super.copyWith((message) => updates(message as PsbtAddInputRequest)) as PsbtAddInputRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PsbtAddInputRequest create() => PsbtAddInputRequest._(); + PsbtAddInputRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PsbtAddInputRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static PsbtAddInputRequest? _defaultInstance; + + /// The PSBT in base64 encoding. + @$pb.TagNumber(1) + $core.String get psbtB64 => $_getSZ(0); + @$pb.TagNumber(1) + set psbtB64($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasPsbtB64() => $_has(0); + @$pb.TagNumber(1) + void clearPsbtB64() => clearField(1); + + /// The scan secret or view key represents the account that + /// the utxos being spent belong to. + @$pb.TagNumber(2) + $core.List<$core.int> get scanSecret => $_getN(1); + @$pb.TagNumber(2) + set scanSecret($core.List<$core.int> v) { $_setBytes(1, v); } + @$pb.TagNumber(2) + $core.bool hasScanSecret() => $_has(1); + @$pb.TagNumber(2) + void clearScanSecret() => clearField(2); + + /// The output ID of the utxo. + @$pb.TagNumber(3) + $core.String get outputId => $_getSZ(2); + @$pb.TagNumber(3) + set outputId($core.String v) { $_setString(2, v); } + @$pb.TagNumber(3) + $core.bool hasOutputId() => $_has(2); + @$pb.TagNumber(3) + void clearOutputId() => clearField(3); + + /// The address index of the utxo. + @$pb.TagNumber(4) + $core.int get addressIndex => $_getIZ(3); + @$pb.TagNumber(4) + set addressIndex($core.int v) { $_setUnsignedInt32(3, v); } + @$pb.TagNumber(4) + $core.bool hasAddressIndex() => $_has(3); + @$pb.TagNumber(4) + void clearAddressIndex() => clearField(4); +} + +class PsbtAddRecipientRequest extends $pb.GeneratedMessage { + factory PsbtAddRecipientRequest({ + $core.String? psbtB64, + PsbtRecipient? recipient, + $fixnum.Int64? feeRatePerKb, + }) { + final $result = create(); + if (psbtB64 != null) { + $result.psbtB64 = psbtB64; + } + if (recipient != null) { + $result.recipient = recipient; + } + if (feeRatePerKb != null) { + $result.feeRatePerKb = feeRatePerKb; + } + return $result; + } + PsbtAddRecipientRequest._() : super(); + factory PsbtAddRecipientRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory PsbtAddRecipientRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtAddRecipientRequest', createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'psbtB64') + ..aOM(2, _omitFieldNames ? '' : 'recipient', subBuilder: PsbtRecipient.create) + ..a<$fixnum.Int64>(3, _omitFieldNames ? '' : 'feeRatePerKb', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + PsbtAddRecipientRequest clone() => PsbtAddRecipientRequest()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + PsbtAddRecipientRequest copyWith(void Function(PsbtAddRecipientRequest) updates) => super.copyWith((message) => updates(message as PsbtAddRecipientRequest)) as PsbtAddRecipientRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PsbtAddRecipientRequest create() => PsbtAddRecipientRequest._(); + PsbtAddRecipientRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PsbtAddRecipientRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static PsbtAddRecipientRequest? _defaultInstance; + + /// The PSBT in base64 encoding. + @$pb.TagNumber(1) + $core.String get psbtB64 => $_getSZ(0); + @$pb.TagNumber(1) + set psbtB64($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasPsbtB64() => $_has(0); + @$pb.TagNumber(1) + void clearPsbtB64() => clearField(1); + + @$pb.TagNumber(2) + PsbtRecipient get recipient => $_getN(1); + @$pb.TagNumber(2) + set recipient(PsbtRecipient v) { setField(2, v); } + @$pb.TagNumber(2) + $core.bool hasRecipient() => $_has(1); + @$pb.TagNumber(2) + void clearRecipient() => clearField(2); + @$pb.TagNumber(2) + PsbtRecipient ensureRecipient() => $_ensure(1); + + /// The fee rate per KB in litoshis. + @$pb.TagNumber(3) + $fixnum.Int64 get feeRatePerKb => $_getI64(2); + @$pb.TagNumber(3) + set feeRatePerKb($fixnum.Int64 v) { $_setInt64(2, v); } + @$pb.TagNumber(3) + $core.bool hasFeeRatePerKb() => $_has(2); + @$pb.TagNumber(3) + void clearFeeRatePerKb() => clearField(3); +} + +class PsbtGetRecipientsRequest extends $pb.GeneratedMessage { + factory PsbtGetRecipientsRequest({ + $core.String? psbtB64, + }) { + final $result = create(); + if (psbtB64 != null) { + $result.psbtB64 = psbtB64; + } + return $result; + } + PsbtGetRecipientsRequest._() : super(); + factory PsbtGetRecipientsRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory PsbtGetRecipientsRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtGetRecipientsRequest', createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'psbtB64') + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + PsbtGetRecipientsRequest clone() => PsbtGetRecipientsRequest()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + PsbtGetRecipientsRequest copyWith(void Function(PsbtGetRecipientsRequest) updates) => super.copyWith((message) => updates(message as PsbtGetRecipientsRequest)) as PsbtGetRecipientsRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PsbtGetRecipientsRequest create() => PsbtGetRecipientsRequest._(); + PsbtGetRecipientsRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PsbtGetRecipientsRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static PsbtGetRecipientsRequest? _defaultInstance; + + /// The PSBT in base64 encoding. + @$pb.TagNumber(1) + $core.String get psbtB64 => $_getSZ(0); + @$pb.TagNumber(1) + set psbtB64($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasPsbtB64() => $_has(0); + @$pb.TagNumber(1) + void clearPsbtB64() => clearField(1); +} + +class PsbtGetRecipientsResponse extends $pb.GeneratedMessage { + factory PsbtGetRecipientsResponse({ + $core.Iterable? recipient, + $core.Iterable<$core.String>? inputAddress, + $fixnum.Int64? fee, + }) { + final $result = create(); + if (recipient != null) { + $result.recipient.addAll(recipient); + } + if (inputAddress != null) { + $result.inputAddress.addAll(inputAddress); + } + if (fee != null) { + $result.fee = fee; + } + return $result; + } + PsbtGetRecipientsResponse._() : super(); + factory PsbtGetRecipientsResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory PsbtGetRecipientsResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtGetRecipientsResponse', createEmptyInstance: create) + ..pc(1, _omitFieldNames ? '' : 'recipient', $pb.PbFieldType.PM, subBuilder: PsbtRecipient.create) + ..pPS(2, _omitFieldNames ? '' : 'inputAddress') + ..aInt64(3, _omitFieldNames ? '' : 'fee') + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + PsbtGetRecipientsResponse clone() => PsbtGetRecipientsResponse()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + PsbtGetRecipientsResponse copyWith(void Function(PsbtGetRecipientsResponse) updates) => super.copyWith((message) => updates(message as PsbtGetRecipientsResponse)) as PsbtGetRecipientsResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PsbtGetRecipientsResponse create() => PsbtGetRecipientsResponse._(); + PsbtGetRecipientsResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PsbtGetRecipientsResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static PsbtGetRecipientsResponse? _defaultInstance; + + @$pb.TagNumber(1) + $core.List get recipient => $_getList(0); + + @$pb.TagNumber(2) + $core.List<$core.String> get inputAddress => $_getList(1); + + @$pb.TagNumber(3) + $fixnum.Int64 get fee => $_getI64(2); + @$pb.TagNumber(3) + set fee($fixnum.Int64 v) { $_setInt64(2, v); } + @$pb.TagNumber(3) + $core.bool hasFee() => $_has(2); + @$pb.TagNumber(3) + void clearFee() => clearField(3); +} + +class PsbtRecipient extends $pb.GeneratedMessage { + factory PsbtRecipient({ + $core.String? address, + $fixnum.Int64? value, + }) { + final $result = create(); + if (address != null) { + $result.address = address; + } + if (value != null) { + $result.value = value; + } + return $result; + } + PsbtRecipient._() : super(); + factory PsbtRecipient.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory PsbtRecipient.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtRecipient', createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'address') + ..aInt64(2, _omitFieldNames ? '' : 'value') + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + PsbtRecipient clone() => PsbtRecipient()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + PsbtRecipient copyWith(void Function(PsbtRecipient) updates) => super.copyWith((message) => updates(message as PsbtRecipient)) as PsbtRecipient; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PsbtRecipient create() => PsbtRecipient._(); + PsbtRecipient createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PsbtRecipient getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static PsbtRecipient? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get address => $_getSZ(0); + @$pb.TagNumber(1) + set address($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasAddress() => $_has(0); + @$pb.TagNumber(1) + void clearAddress() => clearField(1); + + @$pb.TagNumber(2) + $fixnum.Int64 get value => $_getI64(1); + @$pb.TagNumber(2) + set value($fixnum.Int64 v) { $_setInt64(1, v); } + @$pb.TagNumber(2) + $core.bool hasValue() => $_has(1); + @$pb.TagNumber(2) + void clearValue() => clearField(2); +} + +class PsbtSignRequest extends $pb.GeneratedMessage { + factory PsbtSignRequest({ + $core.String? psbtB64, + $core.List<$core.int>? scanSecret, + $core.List<$core.int>? spendSecret, + }) { + final $result = create(); + if (psbtB64 != null) { + $result.psbtB64 = psbtB64; + } + if (scanSecret != null) { + $result.scanSecret = scanSecret; + } + if (spendSecret != null) { + $result.spendSecret = spendSecret; + } + return $result; + } + PsbtSignRequest._() : super(); + factory PsbtSignRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory PsbtSignRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtSignRequest', createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'psbtB64') + ..a<$core.List<$core.int>>(2, _omitFieldNames ? '' : 'scanSecret', $pb.PbFieldType.OY) + ..a<$core.List<$core.int>>(3, _omitFieldNames ? '' : 'spendSecret', $pb.PbFieldType.OY) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + PsbtSignRequest clone() => PsbtSignRequest()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + PsbtSignRequest copyWith(void Function(PsbtSignRequest) updates) => super.copyWith((message) => updates(message as PsbtSignRequest)) as PsbtSignRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PsbtSignRequest create() => PsbtSignRequest._(); + PsbtSignRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PsbtSignRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static PsbtSignRequest? _defaultInstance; + + /// The PSBT in base64 encoding. + @$pb.TagNumber(1) + $core.String get psbtB64 => $_getSZ(0); + @$pb.TagNumber(1) + set psbtB64($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasPsbtB64() => $_has(0); + @$pb.TagNumber(1) + void clearPsbtB64() => clearField(1); + + /// The scan secret or view key represents the account that + /// the utxos being spent belong to. + @$pb.TagNumber(2) + $core.List<$core.int> get scanSecret => $_getN(1); + @$pb.TagNumber(2) + set scanSecret($core.List<$core.int> v) { $_setBytes(1, v); } + @$pb.TagNumber(2) + $core.bool hasScanSecret() => $_has(1); + @$pb.TagNumber(2) + void clearScanSecret() => clearField(2); + + /// The spend secret is the private key necessary for spending + /// the utxos belonging to the account. + @$pb.TagNumber(3) + $core.List<$core.int> get spendSecret => $_getN(2); + @$pb.TagNumber(3) + set spendSecret($core.List<$core.int> v) { $_setBytes(2, v); } + @$pb.TagNumber(3) + $core.bool hasSpendSecret() => $_has(2); + @$pb.TagNumber(3) + void clearSpendSecret() => clearField(3); +} + +class PsbtSignNonMwebRequest extends $pb.GeneratedMessage { + factory PsbtSignNonMwebRequest({ + $core.String? psbtB64, + $core.List<$core.int>? privKey, + $core.int? index, + }) { + final $result = create(); + if (psbtB64 != null) { + $result.psbtB64 = psbtB64; + } + if (privKey != null) { + $result.privKey = privKey; + } + if (index != null) { + $result.index = index; + } + return $result; + } + PsbtSignNonMwebRequest._() : super(); + factory PsbtSignNonMwebRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory PsbtSignNonMwebRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtSignNonMwebRequest', createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'psbtB64') + ..a<$core.List<$core.int>>(2, _omitFieldNames ? '' : 'privKey', $pb.PbFieldType.OY) + ..a<$core.int>(3, _omitFieldNames ? '' : 'index', $pb.PbFieldType.OU3) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + PsbtSignNonMwebRequest clone() => PsbtSignNonMwebRequest()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + PsbtSignNonMwebRequest copyWith(void Function(PsbtSignNonMwebRequest) updates) => super.copyWith((message) => updates(message as PsbtSignNonMwebRequest)) as PsbtSignNonMwebRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PsbtSignNonMwebRequest create() => PsbtSignNonMwebRequest._(); + PsbtSignNonMwebRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PsbtSignNonMwebRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static PsbtSignNonMwebRequest? _defaultInstance; + + /// The PSBT in base64 encoding. + @$pb.TagNumber(1) + $core.String get psbtB64 => $_getSZ(0); + @$pb.TagNumber(1) + set psbtB64($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasPsbtB64() => $_has(0); + @$pb.TagNumber(1) + void clearPsbtB64() => clearField(1); + + /// The private key necessary for spending the input. + @$pb.TagNumber(2) + $core.List<$core.int> get privKey => $_getN(1); + @$pb.TagNumber(2) + set privKey($core.List<$core.int> v) { $_setBytes(1, v); } + @$pb.TagNumber(2) + $core.bool hasPrivKey() => $_has(1); + @$pb.TagNumber(2) + void clearPrivKey() => clearField(2); + + /// The index of the input to sign. + @$pb.TagNumber(3) + $core.int get index => $_getIZ(2); + @$pb.TagNumber(3) + set index($core.int v) { $_setUnsignedInt32(2, v); } + @$pb.TagNumber(3) + $core.bool hasIndex() => $_has(2); + @$pb.TagNumber(3) + void clearIndex() => clearField(3); +} + +class PsbtExtractRequest extends $pb.GeneratedMessage { + factory PsbtExtractRequest({ + $core.String? psbtB64, + $core.bool? unsigned, + }) { + final $result = create(); + if (psbtB64 != null) { + $result.psbtB64 = psbtB64; + } + if (unsigned != null) { + $result.unsigned = unsigned; + } + return $result; + } + PsbtExtractRequest._() : super(); + factory PsbtExtractRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory PsbtExtractRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtExtractRequest', createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'psbtB64') + ..aOB(2, _omitFieldNames ? '' : 'unsigned') + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + PsbtExtractRequest clone() => PsbtExtractRequest()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + PsbtExtractRequest copyWith(void Function(PsbtExtractRequest) updates) => super.copyWith((message) => updates(message as PsbtExtractRequest)) as PsbtExtractRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static PsbtExtractRequest create() => PsbtExtractRequest._(); + PsbtExtractRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static PsbtExtractRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static PsbtExtractRequest? _defaultInstance; + + /// The PSBT in base64 encoding. + @$pb.TagNumber(1) + $core.String get psbtB64 => $_getSZ(0); + @$pb.TagNumber(1) + set psbtB64($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasPsbtB64() => $_has(0); + @$pb.TagNumber(1) + void clearPsbtB64() => clearField(1); + + /// Extract the unsigned transaction. + @$pb.TagNumber(2) + $core.bool get unsigned => $_getBF(1); + @$pb.TagNumber(2) + set unsigned($core.bool v) { $_setBool(1, v); } + @$pb.TagNumber(2) + $core.bool hasUnsigned() => $_has(1); + @$pb.TagNumber(2) + void clearUnsigned() => clearField(2); +} + +class BroadcastRequest extends $pb.GeneratedMessage { + factory BroadcastRequest({ + $core.List<$core.int>? rawTx, + }) { + final $result = create(); + if (rawTx != null) { + $result.rawTx = rawTx; + } + return $result; + } + BroadcastRequest._() : super(); + factory BroadcastRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory BroadcastRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'BroadcastRequest', createEmptyInstance: create) + ..a<$core.List<$core.int>>(1, _omitFieldNames ? '' : 'rawTx', $pb.PbFieldType.OY) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + BroadcastRequest clone() => BroadcastRequest()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + BroadcastRequest copyWith(void Function(BroadcastRequest) updates) => super.copyWith((message) => updates(message as BroadcastRequest)) as BroadcastRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static BroadcastRequest create() => BroadcastRequest._(); + BroadcastRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static BroadcastRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static BroadcastRequest? _defaultInstance; + + /// The raw bytes of the serialized transaction. + @$pb.TagNumber(1) + $core.List<$core.int> get rawTx => $_getN(0); + @$pb.TagNumber(1) + set rawTx($core.List<$core.int> v) { $_setBytes(0, v); } + @$pb.TagNumber(1) + $core.bool hasRawTx() => $_has(0); + @$pb.TagNumber(1) + void clearRawTx() => clearField(1); +} + +class BroadcastResponse extends $pb.GeneratedMessage { + factory BroadcastResponse({ + $core.String? txid, + }) { + final $result = create(); + if (txid != null) { + $result.txid = txid; + } + return $result; + } + BroadcastResponse._() : super(); + factory BroadcastResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory BroadcastResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'BroadcastResponse', createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'txid') + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + BroadcastResponse clone() => BroadcastResponse()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + BroadcastResponse copyWith(void Function(BroadcastResponse) updates) => super.copyWith((message) => updates(message as BroadcastResponse)) as BroadcastResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static BroadcastResponse create() => BroadcastResponse._(); + BroadcastResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static BroadcastResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static BroadcastResponse? _defaultInstance; + + /// The transaction ID. + @$pb.TagNumber(1) + $core.String get txid => $_getSZ(0); + @$pb.TagNumber(1) + set txid($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasTxid() => $_has(0); + @$pb.TagNumber(1) + void clearTxid() => clearField(1); +} + +class CoinswapRequest extends $pb.GeneratedMessage { + factory CoinswapRequest({ + $core.List<$core.int>? scanSecret, + $core.List<$core.int>? spendSecret, + $core.String? outputId, + $core.int? addrIndex, + }) { + final $result = create(); + if (scanSecret != null) { + $result.scanSecret = scanSecret; + } + if (spendSecret != null) { + $result.spendSecret = spendSecret; + } + if (outputId != null) { + $result.outputId = outputId; + } + if (addrIndex != null) { + $result.addrIndex = addrIndex; + } + return $result; + } + CoinswapRequest._() : super(); + factory CoinswapRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory CoinswapRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'CoinswapRequest', createEmptyInstance: create) + ..a<$core.List<$core.int>>(1, _omitFieldNames ? '' : 'scanSecret', $pb.PbFieldType.OY) + ..a<$core.List<$core.int>>(2, _omitFieldNames ? '' : 'spendSecret', $pb.PbFieldType.OY) + ..aOS(3, _omitFieldNames ? '' : 'outputId') + ..a<$core.int>(4, _omitFieldNames ? '' : 'addrIndex', $pb.PbFieldType.OU3) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + CoinswapRequest clone() => CoinswapRequest()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + CoinswapRequest copyWith(void Function(CoinswapRequest) updates) => super.copyWith((message) => updates(message as CoinswapRequest)) as CoinswapRequest; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static CoinswapRequest create() => CoinswapRequest._(); + CoinswapRequest createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CoinswapRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static CoinswapRequest? _defaultInstance; + + /// The scan secret or view key represents the account that + /// the utxo belongs to. + @$pb.TagNumber(1) + $core.List<$core.int> get scanSecret => $_getN(0); + @$pb.TagNumber(1) + set scanSecret($core.List<$core.int> v) { $_setBytes(0, v); } + @$pb.TagNumber(1) + $core.bool hasScanSecret() => $_has(0); + @$pb.TagNumber(1) + void clearScanSecret() => clearField(1); + + /// The spend secret is the private key necessary for spending + /// the utxos belonging to the account. + @$pb.TagNumber(2) + $core.List<$core.int> get spendSecret => $_getN(1); + @$pb.TagNumber(2) + set spendSecret($core.List<$core.int> v) { $_setBytes(1, v); } + @$pb.TagNumber(2) + $core.bool hasSpendSecret() => $_has(1); + @$pb.TagNumber(2) + void clearSpendSecret() => clearField(2); + + /// Output ID of the utxo to request a coinswap for. + @$pb.TagNumber(3) + $core.String get outputId => $_getSZ(2); + @$pb.TagNumber(3) + set outputId($core.String v) { $_setString(2, v); } + @$pb.TagNumber(3) + $core.bool hasOutputId() => $_has(2); + @$pb.TagNumber(3) + void clearOutputId() => clearField(3); + + /// Address index of the utxo. + @$pb.TagNumber(4) + $core.int get addrIndex => $_getIZ(3); + @$pb.TagNumber(4) + set addrIndex($core.int v) { $_setUnsignedInt32(3, v); } + @$pb.TagNumber(4) + $core.bool hasAddrIndex() => $_has(3); + @$pb.TagNumber(4) + void clearAddrIndex() => clearField(4); +} + +class CoinswapResponse extends $pb.GeneratedMessage { + factory CoinswapResponse({ + $core.String? outputId, + }) { + final $result = create(); + if (outputId != null) { + $result.outputId = outputId; + } + return $result; + } + CoinswapResponse._() : super(); + factory CoinswapResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory CoinswapResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'CoinswapResponse', createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'outputId') + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + CoinswapResponse clone() => CoinswapResponse()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + CoinswapResponse copyWith(void Function(CoinswapResponse) updates) => super.copyWith((message) => updates(message as CoinswapResponse)) as CoinswapResponse; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static CoinswapResponse create() => CoinswapResponse._(); + CoinswapResponse createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static CoinswapResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static CoinswapResponse? _defaultInstance; + + /// Output ID of the utxo created by the transaction. + @$pb.TagNumber(1) + $core.String get outputId => $_getSZ(0); + @$pb.TagNumber(1) + set outputId($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasOutputId() => $_has(0); + @$pb.TagNumber(1) + void clearOutputId() => clearField(1); } const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); -const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names'); +const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names'); \ No newline at end of file diff --git a/cw_mweb/lib/mwebd.pbgrpc.dart b/cw_mweb/lib/mwebd.pbgrpc.dart index 6bc48cfdfe..b5a2852f79 100644 --- a/cw_mweb/lib/mwebd.pbgrpc.dart +++ b/cw_mweb/lib/mwebd.pbgrpc.dart @@ -41,10 +41,46 @@ class RpcClient extends $grpc.Client { '/Rpc/Create', ($0.CreateRequest value) => value.writeToBuffer(), ($core.List<$core.int> value) => $0.CreateResponse.fromBuffer(value)); + static final _$psbtCreate = $grpc.ClientMethod<$0.PsbtCreateRequest, $0.PsbtResponse>( + '/Rpc/PsbtCreate', + ($0.PsbtCreateRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.PsbtResponse.fromBuffer(value)); + static final _$psbtAddInput = $grpc.ClientMethod<$0.PsbtAddInputRequest, $0.PsbtResponse>( + '/Rpc/PsbtAddInput', + ($0.PsbtAddInputRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.PsbtResponse.fromBuffer(value)); + static final _$psbtAddRecipient = $grpc.ClientMethod<$0.PsbtAddRecipientRequest, $0.PsbtResponse>( + '/Rpc/PsbtAddRecipient', + ($0.PsbtAddRecipientRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.PsbtResponse.fromBuffer(value)); + static final _$psbtGetRecipients = $grpc.ClientMethod<$0.PsbtGetRecipientsRequest, $0.PsbtGetRecipientsResponse>( + '/Rpc/PsbtGetRecipients', + ($0.PsbtGetRecipientsRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.PsbtGetRecipientsResponse.fromBuffer(value)); + static final _$psbtSign = $grpc.ClientMethod<$0.PsbtSignRequest, $0.PsbtResponse>( + '/Rpc/PsbtSign', + ($0.PsbtSignRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.PsbtResponse.fromBuffer(value)); + static final _$psbtSignNonMweb = $grpc.ClientMethod<$0.PsbtSignNonMwebRequest, $0.PsbtResponse>( + '/Rpc/PsbtSignNonMweb', + ($0.PsbtSignNonMwebRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.PsbtResponse.fromBuffer(value)); + static final _$psbtExtract = $grpc.ClientMethod<$0.PsbtExtractRequest, $0.CreateResponse>( + '/Rpc/PsbtExtract', + ($0.PsbtExtractRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.CreateResponse.fromBuffer(value)); + static final _$ledgerExchange = $grpc.ClientMethod<$0.LedgerApdu, $0.LedgerApdu>( + '/Rpc/LedgerExchange', + ($0.LedgerApdu value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.LedgerApdu.fromBuffer(value)); static final _$broadcast = $grpc.ClientMethod<$0.BroadcastRequest, $0.BroadcastResponse>( '/Rpc/Broadcast', ($0.BroadcastRequest value) => value.writeToBuffer(), ($core.List<$core.int> value) => $0.BroadcastResponse.fromBuffer(value)); + static final _$coinswap = $grpc.ClientMethod<$0.CoinswapRequest, $0.CoinswapResponse>( + '/Rpc/Coinswap', + ($0.CoinswapRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.CoinswapResponse.fromBuffer(value)); RpcClient($grpc.ClientChannel channel, {$grpc.CallOptions? options, @@ -72,9 +108,45 @@ class RpcClient extends $grpc.Client { return $createUnaryCall(_$create, request, options: options); } + $grpc.ResponseFuture<$0.PsbtResponse> psbtCreate($0.PsbtCreateRequest request, {$grpc.CallOptions? options}) { + return $createUnaryCall(_$psbtCreate, request, options: options); + } + + $grpc.ResponseFuture<$0.PsbtResponse> psbtAddInput($0.PsbtAddInputRequest request, {$grpc.CallOptions? options}) { + return $createUnaryCall(_$psbtAddInput, request, options: options); + } + + $grpc.ResponseFuture<$0.PsbtResponse> psbtAddRecipient($0.PsbtAddRecipientRequest request, {$grpc.CallOptions? options}) { + return $createUnaryCall(_$psbtAddRecipient, request, options: options); + } + + $grpc.ResponseFuture<$0.PsbtGetRecipientsResponse> psbtGetRecipients($0.PsbtGetRecipientsRequest request, {$grpc.CallOptions? options}) { + return $createUnaryCall(_$psbtGetRecipients, request, options: options); + } + + $grpc.ResponseFuture<$0.PsbtResponse> psbtSign($0.PsbtSignRequest request, {$grpc.CallOptions? options}) { + return $createUnaryCall(_$psbtSign, request, options: options); + } + + $grpc.ResponseFuture<$0.PsbtResponse> psbtSignNonMweb($0.PsbtSignNonMwebRequest request, {$grpc.CallOptions? options}) { + return $createUnaryCall(_$psbtSignNonMweb, request, options: options); + } + + $grpc.ResponseFuture<$0.CreateResponse> psbtExtract($0.PsbtExtractRequest request, {$grpc.CallOptions? options}) { + return $createUnaryCall(_$psbtExtract, request, options: options); + } + + $grpc.ResponseFuture<$0.LedgerApdu> ledgerExchange($0.LedgerApdu request, {$grpc.CallOptions? options}) { + return $createUnaryCall(_$ledgerExchange, request, options: options); + } + $grpc.ResponseFuture<$0.BroadcastResponse> broadcast($0.BroadcastRequest request, {$grpc.CallOptions? options}) { return $createUnaryCall(_$broadcast, request, options: options); } + + $grpc.ResponseFuture<$0.CoinswapResponse> coinswap($0.CoinswapRequest request, {$grpc.CallOptions? options}) { + return $createUnaryCall(_$coinswap, request, options: options); + } } @$pb.GrpcServiceName('Rpc') @@ -117,6 +189,62 @@ abstract class RpcServiceBase extends $grpc.Service { false, ($core.List<$core.int> value) => $0.CreateRequest.fromBuffer(value), ($0.CreateResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.PsbtCreateRequest, $0.PsbtResponse>( + 'PsbtCreate', + psbtCreate_Pre, + false, + false, + ($core.List<$core.int> value) => $0.PsbtCreateRequest.fromBuffer(value), + ($0.PsbtResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.PsbtAddInputRequest, $0.PsbtResponse>( + 'PsbtAddInput', + psbtAddInput_Pre, + false, + false, + ($core.List<$core.int> value) => $0.PsbtAddInputRequest.fromBuffer(value), + ($0.PsbtResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.PsbtAddRecipientRequest, $0.PsbtResponse>( + 'PsbtAddRecipient', + psbtAddRecipient_Pre, + false, + false, + ($core.List<$core.int> value) => $0.PsbtAddRecipientRequest.fromBuffer(value), + ($0.PsbtResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.PsbtGetRecipientsRequest, $0.PsbtGetRecipientsResponse>( + 'PsbtGetRecipients', + psbtGetRecipients_Pre, + false, + false, + ($core.List<$core.int> value) => $0.PsbtGetRecipientsRequest.fromBuffer(value), + ($0.PsbtGetRecipientsResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.PsbtSignRequest, $0.PsbtResponse>( + 'PsbtSign', + psbtSign_Pre, + false, + false, + ($core.List<$core.int> value) => $0.PsbtSignRequest.fromBuffer(value), + ($0.PsbtResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.PsbtSignNonMwebRequest, $0.PsbtResponse>( + 'PsbtSignNonMweb', + psbtSignNonMweb_Pre, + false, + false, + ($core.List<$core.int> value) => $0.PsbtSignNonMwebRequest.fromBuffer(value), + ($0.PsbtResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.PsbtExtractRequest, $0.CreateResponse>( + 'PsbtExtract', + psbtExtract_Pre, + false, + false, + ($core.List<$core.int> value) => $0.PsbtExtractRequest.fromBuffer(value), + ($0.CreateResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.LedgerApdu, $0.LedgerApdu>( + 'LedgerExchange', + ledgerExchange_Pre, + false, + false, + ($core.List<$core.int> value) => $0.LedgerApdu.fromBuffer(value), + ($0.LedgerApdu value) => value.writeToBuffer())); $addMethod($grpc.ServiceMethod<$0.BroadcastRequest, $0.BroadcastResponse>( 'Broadcast', broadcast_Pre, @@ -124,6 +252,13 @@ abstract class RpcServiceBase extends $grpc.Service { false, ($core.List<$core.int> value) => $0.BroadcastRequest.fromBuffer(value), ($0.BroadcastResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.CoinswapRequest, $0.CoinswapResponse>( + 'Coinswap', + coinswap_Pre, + false, + false, + ($core.List<$core.int> value) => $0.CoinswapRequest.fromBuffer(value), + ($0.CoinswapResponse value) => value.writeToBuffer())); } $async.Future<$0.StatusResponse> status_Pre($grpc.ServiceCall call, $async.Future<$0.StatusRequest> request) async { @@ -146,14 +281,59 @@ abstract class RpcServiceBase extends $grpc.Service { return create(call, await request); } + $async.Future<$0.PsbtResponse> psbtCreate_Pre($grpc.ServiceCall call, $async.Future<$0.PsbtCreateRequest> request) async { + return psbtCreate(call, await request); + } + + $async.Future<$0.PsbtResponse> psbtAddInput_Pre($grpc.ServiceCall call, $async.Future<$0.PsbtAddInputRequest> request) async { + return psbtAddInput(call, await request); + } + + $async.Future<$0.PsbtResponse> psbtAddRecipient_Pre($grpc.ServiceCall call, $async.Future<$0.PsbtAddRecipientRequest> request) async { + return psbtAddRecipient(call, await request); + } + + $async.Future<$0.PsbtGetRecipientsResponse> psbtGetRecipients_Pre($grpc.ServiceCall call, $async.Future<$0.PsbtGetRecipientsRequest> request) async { + return psbtGetRecipients(call, await request); + } + + $async.Future<$0.PsbtResponse> psbtSign_Pre($grpc.ServiceCall call, $async.Future<$0.PsbtSignRequest> request) async { + return psbtSign(call, await request); + } + + $async.Future<$0.PsbtResponse> psbtSignNonMweb_Pre($grpc.ServiceCall call, $async.Future<$0.PsbtSignNonMwebRequest> request) async { + return psbtSignNonMweb(call, await request); + } + + $async.Future<$0.CreateResponse> psbtExtract_Pre($grpc.ServiceCall call, $async.Future<$0.PsbtExtractRequest> request) async { + return psbtExtract(call, await request); + } + + $async.Future<$0.LedgerApdu> ledgerExchange_Pre($grpc.ServiceCall call, $async.Future<$0.LedgerApdu> request) async { + return ledgerExchange(call, await request); + } + $async.Future<$0.BroadcastResponse> broadcast_Pre($grpc.ServiceCall call, $async.Future<$0.BroadcastRequest> request) async { return broadcast(call, await request); } + $async.Future<$0.CoinswapResponse> coinswap_Pre($grpc.ServiceCall call, $async.Future<$0.CoinswapRequest> request) async { + return coinswap(call, await request); + } + $async.Future<$0.StatusResponse> status($grpc.ServiceCall call, $0.StatusRequest request); $async.Stream<$0.Utxo> utxos($grpc.ServiceCall call, $0.UtxosRequest request); $async.Future<$0.AddressResponse> addresses($grpc.ServiceCall call, $0.AddressRequest request); $async.Future<$0.SpentResponse> spent($grpc.ServiceCall call, $0.SpentRequest request); $async.Future<$0.CreateResponse> create($grpc.ServiceCall call, $0.CreateRequest request); + $async.Future<$0.PsbtResponse> psbtCreate($grpc.ServiceCall call, $0.PsbtCreateRequest request); + $async.Future<$0.PsbtResponse> psbtAddInput($grpc.ServiceCall call, $0.PsbtAddInputRequest request); + $async.Future<$0.PsbtResponse> psbtAddRecipient($grpc.ServiceCall call, $0.PsbtAddRecipientRequest request); + $async.Future<$0.PsbtGetRecipientsResponse> psbtGetRecipients($grpc.ServiceCall call, $0.PsbtGetRecipientsRequest request); + $async.Future<$0.PsbtResponse> psbtSign($grpc.ServiceCall call, $0.PsbtSignRequest request); + $async.Future<$0.PsbtResponse> psbtSignNonMweb($grpc.ServiceCall call, $0.PsbtSignNonMwebRequest request); + $async.Future<$0.CreateResponse> psbtExtract($grpc.ServiceCall call, $0.PsbtExtractRequest request); + $async.Future<$0.LedgerApdu> ledgerExchange($grpc.ServiceCall call, $0.LedgerApdu request); $async.Future<$0.BroadcastResponse> broadcast($grpc.ServiceCall call, $0.BroadcastRequest request); -} + $async.Future<$0.CoinswapResponse> coinswap($grpc.ServiceCall call, $0.CoinswapRequest request); +} \ No newline at end of file diff --git a/cw_mweb/lib/print_verbose.dart b/cw_mweb/lib/print_verbose.dart new file mode 100644 index 0000000000..69d4832c0c --- /dev/null +++ b/cw_mweb/lib/print_verbose.dart @@ -0,0 +1,107 @@ +import 'dart:io'; +import 'dart:math'; +import 'package:flutter/foundation.dart'; + +enum LogLevel { info, debug, warn, error } + +/// Pass an optional [file] to also write the log to a file. +void printV( + dynamic content, { + String? file, + LogLevel level = LogLevel.info, +}) { + final programInfo = CustomTrace(StackTrace.current); + final logLine = + "[${level.name.toUpperCase()}] ${programInfo.fileName}#${programInfo.lineNumber}:${programInfo.columnNumber} ${programInfo.callerFunctionName}: $content"; + + print(logLine); + + if (file != null) { + final logFile = File(file); + if (!logFile.existsSync()) { + logFile.createSync(recursive: true); + } + logFile.writeAsStringSync("$logLine\n", mode: FileMode.append, flush: true); + } +} + +// https://stackoverflow.com/a/59386101 + +class CustomTrace { + final StackTrace _trace; + + String? fileName; + String? functionName; + String? callerFunctionName; + int? lineNumber; + int? columnNumber; + + CustomTrace(this._trace) { + try { + _parseTrace(); + } catch (e) { + if (kDebugMode) print("Unable to parse trace (printV): $e"); + } + } + + String _getFunctionNameFromFrame(String frame) { + /* Just giving another nickname to the frame */ + var currentTrace = frame; + /* To get rid off the #number thing, get the index of the first whitespace */ + var indexOfWhiteSpace = currentTrace.indexOf(' '); + + /* Create a substring from the first whitespace index till the end of the string */ + var subStr = currentTrace.substring(max(0, indexOfWhiteSpace)); + + /* Grab the function name using reg expr */ + var indexOfFunction = subStr.indexOf(RegExp(r'[A-Za-z0-9_]')); + + /* Create a new substring from the function name index till the end of string */ + subStr = subStr.substring(indexOfFunction); + + indexOfWhiteSpace = subStr.indexOf(RegExp(r'[ .]')); + + /* Create a new substring from start to the first index of a whitespace. This substring gives us the function name */ + subStr = subStr.substring(0, max(0, indexOfWhiteSpace)); + + return subStr; + } + + void _parseTrace() { + /* The trace comes with multiple lines of strings, (each line is also known as a frame), so split the trace's string by lines to get all the frames */ + var frames = this._trace.toString().split("\n"); + + /* The first frame is the current function */ + this.functionName = _getFunctionNameFromFrame(frames[0]); + + /* The second frame is the caller function */ + this.callerFunctionName = _getFunctionNameFromFrame(frames[1]); + + /* The first frame has all the information we need */ + var traceString = frames[1]; + + /* Search through the string and find the index of the file name by looking for the '.dart' regex */ + var indexOfFileName = traceString.indexOf( + RegExp(r'[/A-Za-z_]+.dart'), 1); // 1 to offest and not print the printV function name + + var fileInfo = traceString.substring(max(0, indexOfFileName)); + + var listOfInfos = fileInfo.split(":"); + + /* Splitting fileInfo by the character ":" separates the file name, the line number and the column counter nicely. + Example: main.dart:5:12 + To get the file name, we split with ":" and get the first index + To get the line number, we would have to get the second index + To get the column number, we would have to get the third index + */ + try { + this.fileName = listOfInfos[0]; + this.lineNumber = int.tryParse(listOfInfos[1]); + var columnStr = listOfInfos[2]; + columnStr = columnStr.replaceFirst(")", ""); + this.columnNumber = int.tryParse(columnStr); + } catch (e) { + if (kDebugMode) print("Unable to parse trace (printV): $e"); + } + } +} diff --git a/cw_mweb/pubspec.yaml b/cw_mweb/pubspec.yaml index 02f454ddee..94342fd8e1 100644 --- a/cw_mweb/pubspec.yaml +++ b/cw_mweb/pubspec.yaml @@ -13,8 +13,6 @@ dependencies: grpc: 4.0.1 path_provider: ^2.1.2 plugin_platform_interface: ^2.0.2 - cw_core: - path: ../cw_core ffi: ^2.1.0 dev_dependencies: diff --git a/lib/bitcoin/cw_bitcoin.dart b/lib/bitcoin/cw_bitcoin.dart index 4a9b2f1f64..c80032d783 100644 --- a/lib/bitcoin/cw_bitcoin.dart +++ b/lib/bitcoin/cw_bitcoin.dart @@ -28,6 +28,22 @@ class CWBitcoin extends Bitcoin { BitcoinWalletFromKeysCredentials( name: name, password: password, xpub: xpub, hardwareWalletType: hardwareWalletType); + @override + WalletCredentials createLitecoinWalletFromKeys({ + required String name, + required String password, + required String xpub, + required String scanSecret, + required String spendPubkey, + }) => + LitecoinWalletFromKeysCredentials( + name: name, + password: password, + xpub: xpub, + scanSecret: scanSecret, + spendPubkey: spendPubkey, + ); + @override WalletCredentials createBitcoinRestoreWalletFromWIFCredentials( {required String name, @@ -766,6 +782,7 @@ class CWBitcoin extends Bitcoin { @override Future commitPsbtUR(Object wallet, List urCodes) { + if (wallet is LitecoinWallet) return wallet.commitPsbtUR(urCodes); final _wallet = wallet as BitcoinWalletBase; return _wallet.commitPsbtUR(urCodes); } diff --git a/lib/src/screens/restore/wallet_restore_from_keys_form.dart b/lib/src/screens/restore/wallet_restore_from_keys_form.dart index 8ab0f021cc..baa0964f56 100644 --- a/lib/src/screens/restore/wallet_restore_from_keys_form.dart +++ b/lib/src/screens/restore/wallet_restore_from_keys_form.dart @@ -56,6 +56,12 @@ class WalletRestoreFromKeysFormState extends State { spendKeyController = restoredWallet != null ? TextEditingController(text: restoredWallet.spendKey) : TextEditingController(), + scanSecretController = restoredWallet != null + ? TextEditingController(text: restoredWallet.scanSecret) + : TextEditingController(), + spendPubkeyController = restoredWallet != null + ? TextEditingController(text: restoredWallet.spendPubkey) + : TextEditingController(), privateKeyController = restoredWallet != null ? TextEditingController(text: restoredWallet.privateKey) : TextEditingController(), @@ -72,6 +78,8 @@ class WalletRestoreFromKeysFormState extends State { final TextEditingController addressController; final TextEditingController viewKeyController; final TextEditingController spendKeyController; + final TextEditingController scanSecretController; + final TextEditingController spendPubkeyController; final TextEditingController nameTextEditingController; final TextEditingController privateKeyController; final TextEditingController? passwordTextEditingController; @@ -119,6 +127,8 @@ class WalletRestoreFromKeysFormState extends State { viewKeyController.dispose(); privateKeyController.dispose(); spendKeyController.dispose(); + scanSecretController.dispose(); + spendPubkeyController.dispose(); passwordTextEditingController?.dispose(); if (passwordListener != null) { passwordTextEditingController?.removeListener(passwordListener!); @@ -257,6 +267,22 @@ class WalletRestoreFromKeysFormState extends State { maxLines: null, ), ), + Container( + padding: EdgeInsets.only(top: 20.0), + child: BaseTextFormField( + controller: scanSecretController, + hintText: "Scan secret", + maxLines: null, + ), + ), + Container( + padding: EdgeInsets.only(top: 20.0), + child: BaseTextFormField( + controller: spendPubkeyController, + hintText: "Spend public key", + maxLines: null, + ), + ), if (widget.walletRestoreViewModel.hasBlockchainHeightSelector) BlockchainHeightWidget( key: blockchainHeightKey, diff --git a/lib/src/screens/restore/wallet_restore_page.dart b/lib/src/screens/restore/wallet_restore_page.dart index a50384cabc..d673319e5c 100644 --- a/lib/src/screens/restore/wallet_restore_page.dart +++ b/lib/src/screens/restore/wallet_restore_page.dart @@ -222,8 +222,12 @@ class WalletRestorePage extends BasePage { walletRestoreFromKeysFormKey.currentState!.addressController.text; credentials['spendKey'] = walletRestoreFromKeysFormKey.currentState!.spendKeyController.text; + credentials['scanSecret'] = + walletRestoreFromKeysFormKey.currentState!.scanSecretController.text; + credentials['spendPubkey'] = + walletRestoreFromKeysFormKey.currentState!.spendPubkeyController.text; credentials['height'] = - walletRestoreFromKeysFormKey.currentState!.blockchainHeightKey.currentState!.height; + walletRestoreFromKeysFormKey.currentState!.blockchainHeightKey.currentState?.height; } } } @@ -517,7 +521,8 @@ class _WalletRestorePageBodyState extends State<_WalletRestorePageBody> } }, onViewKeyEntered: (bool entered) { - if (widget.walletRestoreViewModel.onlyViewKeyRestore) { + if (widget.walletRestoreViewModel.onlyViewKeyRestore || + walletRestoreViewModel.type == WalletType.litecoin) { walletRestoreViewModel.isButtonEnabled = entered; } }, diff --git a/lib/view_model/restore/restore_wallet.dart b/lib/view_model/restore/restore_wallet.dart index d84a96d5b8..bd70fce345 100644 --- a/lib/view_model/restore/restore_wallet.dart +++ b/lib/view_model/restore/restore_wallet.dart @@ -13,6 +13,8 @@ class RestoredWallet { this.txId, this.spendKey, this.viewKey, + this.scanSecret, + this.spendPubkey, this.mnemonicSeed, this.passphrase, this.txAmount, @@ -28,6 +30,8 @@ class RestoredWallet { final String? txId; final String? spendKey; final String? viewKey; + final String? scanSecret; + final String? spendPubkey; final String? mnemonicSeed; final String? passphrase; final String? txAmount; @@ -48,9 +52,13 @@ class RestoredWallet { } catch (e) { // fine, we don't care, it is only for monero anyway } + if (json['ltub'] != null) { + json['xpub'] = convertLtubToXpub(json['ltub'] as String); + } if (json['zpub'] != null) { json['xpub'] = convertZpubToXpub(json['zpub'] as String); } + json['xpub'] = convertAnyToXpub(json['xpub'] as String); json['view_key'] ??= json['xpub']; final height = json['height'] as String?; return RestoredWallet( @@ -60,6 +68,8 @@ class RestoredWallet { address: json['address'] as String?, spendKey: json['spend_key'] as String?, viewKey: json['view_key'] as String?, + scanSecret: json['scan_secret'] as String?, + spendPubkey: json['spend_pubkey'] as String?, height: height != null ? int.tryParse(height) ?? 0 : 0, privateKey: json['private_key'] as String?, ); diff --git a/lib/view_model/wallet_restore_view_model.dart b/lib/view_model/wallet_restore_view_model.dart index ce427b8a14..a08d582cbb 100644 --- a/lib/view_model/wallet_restore_view_model.dart +++ b/lib/view_model/wallet_restore_view_model.dart @@ -56,9 +56,9 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store { case WalletType.arbitrum: case WalletType.decred: case WalletType.bitcoin: + case WalletType.litecoin: availableModes = [WalletRestoreMode.seed, WalletRestoreMode.keys]; break; - case WalletType.litecoin: case WalletType.bitcoinCash: case WalletType.zano: case WalletType.none: @@ -238,6 +238,8 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store { if (mode == WalletRestoreMode.keys) { final viewKey = options['viewKey'] as String?; final spendKey = options['spendKey'] as String?; + final scanSecret = options['scanSecret'] as String?; + final spendPubkey = options['spendPubkey'] as String?; final address = options['address'] as String?; switch (type) { @@ -249,6 +251,15 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store { hardwareWalletType: hardwareWalletType, ); + case WalletType.litecoin: + return bitcoin!.createLitecoinWalletFromKeys( + name: name, + password: password, + xpub: viewKey!, + scanSecret: scanSecret!, + spendPubkey: spendPubkey!, + ); + case WalletType.monero: return monero!.createMoneroRestoreWalletFromKeysCredentials( name: name, diff --git a/scripts/android/build_mwebd.sh b/scripts/android/build_mwebd.sh index 08782ac1fc..1847536cd9 100755 --- a/scripts/android/build_mwebd.sh +++ b/scripts/android/build_mwebd.sh @@ -47,4 +47,4 @@ GOARCH=arm \ CC=${NDK_BIN}/armv7a-linux-androideabi21-clang \ go build -v -buildmode=c-shared -o ${ANDROID_OUT}/armeabi-v7a/libmweb.so . cd ../ -dart run ffigen --config ffigen_config.yaml +dart run ffigen --config ffigen_config.yaml \ No newline at end of file diff --git a/scripts/android/build_torch.sh b/scripts/android/build_torch.sh index a3955b189b..31ed0849bf 100755 --- a/scripts/android/build_torch.sh +++ b/scripts/android/build_torch.sh @@ -6,4 +6,4 @@ cd "$(dirname "$0")" cd ../torch_dart -./build.sh aarch64-linux-android armv7a-linux-androideabi x86_64-linux-android \ No newline at end of file +./build.sh aarch64-linux-android armv7a-linux-androideabi x86_64-linux-android diff --git a/tool/configure.dart b/tool/configure.dart index caac8b3925..bbb4a1b41b 100644 --- a/tool/configure.dart +++ b/tool/configure.dart @@ -184,6 +184,7 @@ abstract class Bitcoin { }); WalletCredentials createBitcoinRestoreWalletFromWIFCredentials({required String name, required String password, required String wif, WalletInfo? walletInfo}); WalletCredentials createBitcoinWalletFromKeys({required String name, required String password, required String xpub, HardwareWalletType? hardwareWalletType}); + WalletCredentials createLitecoinWalletFromKeys({required String name, required String password, required String xpub, required String scanSecret, required String spendPubkey}); WalletCredentials createBitcoinNewWalletCredentials({required String name, WalletInfo? walletInfo, String? password, String? passphrase, String? mnemonic}); WalletCredentials createBitcoinHardwareWalletCredentials({required String name, required HardwareAccountData accountData, WalletInfo? walletInfo}); List getWordList(); From b2bccac48e46d2a94394c81d1610093498ac2b1e Mon Sep 17 00:00:00 2001 From: tuxsudo Date: Mon, 24 Nov 2025 16:57:15 -0500 Subject: [PATCH 076/105] Fix Terms and Conditions color (#2674) --- .../src/widgets/three_checkbox_alert_content_widget.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cake_pay/src/widgets/three_checkbox_alert_content_widget.dart b/lib/cake_pay/src/widgets/three_checkbox_alert_content_widget.dart index 900bedf1bb..c48f0fa40b 100644 --- a/lib/cake_pay/src/widgets/three_checkbox_alert_content_widget.dart +++ b/lib/cake_pay/src/widgets/three_checkbox_alert_content_widget.dart @@ -174,7 +174,7 @@ class _ThreeCheckboxAlertContentState extends State { fontSize: 16, fontFamily: 'Lato', fontWeight: FontWeight.w400, - color: Theme.of(context).primaryColor, + color: Colors.blueAccent, decoration: TextDecoration.none, height: 1, ), From a4a6e2e3e9fa83591d1a0da240b197b1c2fc2c45 Mon Sep 17 00:00:00 2001 From: Omar Hatem Date: Mon, 24 Nov 2025 23:13:38 +0100 Subject: [PATCH 077/105] Fix restoring duplicate hardware wallet (#2673) --- lib/view_model/wallet_creation_vm.dart | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/lib/view_model/wallet_creation_vm.dart b/lib/view_model/wallet_creation_vm.dart index 7338db5f61..a8b71b9753 100644 --- a/lib/view_model/wallet_creation_vm.dart +++ b/lib/view_model/wallet_creation_vm.dart @@ -17,7 +17,6 @@ import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_credentials.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_type.dart'; -import 'package:hive/hive.dart'; import 'package:mobx/mobx.dart'; import 'package:polyseed/polyseed.dart'; @@ -94,7 +93,7 @@ abstract class WalletCreationVMBase with Store { final diId = await di!.save(); credentials.derivationInfo = di; - final walletInfo = WalletInfo.external( + credentials.walletInfo = WalletInfo.external( id: WalletBase.idFor(name, type), name: name, type: type, @@ -109,16 +108,14 @@ abstract class WalletCreationVMBase with Store { hardwareWalletType: credentials.hardwareWalletType, ); - credentials.walletInfo = walletInfo; - // await walletInfo.save(); - printV("derivationInfo: ${(await walletInfo.getDerivationInfo()).toJson()}"); + printV("derivationInfo: ${(await credentials.walletInfo!.getDerivationInfo()).toJson()}"); final wallet = await process(credentials); final isNonSeedWallet = isRecovery ? wallet.seed == null : false; - walletInfo.isNonSeedWallet = isNonSeedWallet; - walletInfo.hashedWalletIdentifier = createHashedWalletIdentifier(wallet); - walletInfo.address = wallet.walletAddresses.address; - await walletInfo.save(); + credentials.walletInfo!.isNonSeedWallet = isNonSeedWallet; + credentials.walletInfo!.hashedWalletIdentifier = createHashedWalletIdentifier(wallet); + credentials.walletInfo!.address = wallet.walletAddresses.address; + await credentials.walletInfo!.save(); await _appStore.changeCurrentWallet(wallet); _appStore.authenticationStore.allowedCreate(); state = ExecutedSuccessfullyState(); From efc99c14f638cd1a0731fd3e74f5ae9ac5aa91fd Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Tue, 25 Nov 2025 00:15:13 +0100 Subject: [PATCH 078/105] refactor: simplify hashed wallet identifier creation by optimizing seed and address handling logic (#2675) --- lib/entities/hash_wallet_identifier.dart | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/lib/entities/hash_wallet_identifier.dart b/lib/entities/hash_wallet_identifier.dart index 8e593ec796..175063eb6d 100644 --- a/lib/entities/hash_wallet_identifier.dart +++ b/lib/entities/hash_wallet_identifier.dart @@ -5,17 +5,12 @@ import 'package:cw_core/wallet_base.dart'; import 'package:hashlib/hashlib.dart'; String createHashedWalletIdentifier(WalletBase wallet) { - if (wallet.seed == null) return ''; + final hashContent = wallet.seed ?? wallet.walletAddresses.primaryAddress; final salt = secrets.walletGroupSalt; - final combined = '$salt.${wallet.seed}'; + final combined = '$salt.$hashContent'; - // Convert to UTF-8 bytes. final bytes = utf8.encode(combined); - - // Perform SHA-256 hash. final digest = sha256.convert(bytes); - - // Return the hex string representation of the hash. return digest.toString(); } From 98babacce0ae2a3a666db6604efa915bb833642e Mon Sep 17 00:00:00 2001 From: cyan Date: Tue, 25 Nov 2025 13:59:55 -0300 Subject: [PATCH 079/105] fix: ltc wallets not syncing (address generation issue) (#2676) * fix: ltc freezing and address generation * revert: go back to network (fixme), feeRatePerKb --- cw_bitcoin/lib/bitcoin_address_record.dart | 6 +- cw_bitcoin/lib/electrum_wallet.dart | 1 + cw_bitcoin/lib/litecoin_wallet.dart | 4 +- cw_bitcoin/lib/litecoin_wallet_addresses.dart | 13 +- cw_mweb/gen-protobuf.sh | 10 + cw_mweb/go/go.mod | 6 +- cw_mweb/go/go.sum | 8 +- cw_mweb/go/mweb.go | 5 +- cw_mweb/lib/cw_mweb.dart | 3 +- cw_mweb/lib/mwebd.pb.dart | 835 +++++++----------- cw_mweb/lib/mwebd.pbgrpc.dart | 298 ++++--- cw_mweb/pubspec.yaml | 2 + 12 files changed, 560 insertions(+), 631 deletions(-) create mode 100644 cw_mweb/gen-protobuf.sh diff --git a/cw_bitcoin/lib/bitcoin_address_record.dart b/cw_bitcoin/lib/bitcoin_address_record.dart index 2bc9fdd6cc..834cbbb4c4 100644 --- a/cw_bitcoin/lib/bitcoin_address_record.dart +++ b/cw_bitcoin/lib/bitcoin_address_record.dart @@ -99,7 +99,11 @@ class BitcoinAddressRecord extends BaseBitcoinAddressRecord { String getScriptHash(BasedUtxoNetwork network) { if (scriptHash != null) return scriptHash!; - scriptHash = BitcoinAddressUtils.scriptHash(address, network: network); + try { + scriptHash = BitcoinAddressUtils.scriptHash(address, network: network); + } catch (e) { + return ''; + } return scriptHash!; } diff --git a/cw_bitcoin/lib/electrum_wallet.dart b/cw_bitcoin/lib/electrum_wallet.dart index dc611d5007..dbd3fe8a00 100644 --- a/cw_bitcoin/lib/electrum_wallet.dart +++ b/cw_bitcoin/lib/electrum_wallet.dart @@ -2442,6 +2442,7 @@ abstract class ElectrumWalletBase Future fetchBalances() async { final addresses = walletAddresses.allAddresses + .where((address) => address.address.isNotEmpty) .where((address) => RegexUtils.addressTypeFromStr(address.address, network) is! MwebAddress) .toList(); final balanceFutures = >>[]; diff --git a/cw_bitcoin/lib/litecoin_wallet.dart b/cw_bitcoin/lib/litecoin_wallet.dart index 11636b82d0..7b2412d358 100644 --- a/cw_bitcoin/lib/litecoin_wallet.dart +++ b/cw_bitcoin/lib/litecoin_wallet.dart @@ -185,9 +185,9 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store { final String? scanSecretOverride; final String? spendPubkeyOverride; - List get scanSecret => scanSecretOverride != null + List get scanSecret => (scanSecretOverride != null && scanSecretOverride?.isNotEmpty == true) ? hex.decode(scanSecretOverride!) - : mwebHd!.childKey(Bip32KeyIndex(0x80000000)).privateKey.privKey.raw; + : mwebHd?.childKey(Bip32KeyIndex(0x80000000)).privateKey.privKey.raw ?? List.filled(32, 0); List get spendSecret => mwebHd?.childKey(Bip32KeyIndex(0x80000001)).privateKey.privKey.raw ?? List.filled(32, 0); diff --git a/cw_bitcoin/lib/litecoin_wallet_addresses.dart b/cw_bitcoin/lib/litecoin_wallet_addresses.dart index 4968e95c35..fe39ab7cd1 100644 --- a/cw_bitcoin/lib/litecoin_wallet_addresses.dart +++ b/cw_bitcoin/lib/litecoin_wallet_addresses.dart @@ -50,12 +50,12 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with final String? scanSecretOverride; final String? spendPubkeyOverride; - List get scanSecret => scanSecretOverride != null + List get scanSecret => (scanSecretOverride != null && scanSecretOverride?.isNotEmpty == true) ? hex.decode(scanSecretOverride!) - : mwebHd!.childKey(Bip32KeyIndex(0x80000000)).privateKey.privKey.raw; - List get spendPubkey => spendPubkeyOverride != null + : mwebHd?.childKey(Bip32KeyIndex(0x80000000)).privateKey.privKey.raw ?? List.filled(32, 0); + List get spendPubkey => (spendPubkeyOverride != null && spendPubkeyOverride?.isNotEmpty == true) ? hex.decode(spendPubkeyOverride!) - : mwebHd!.childKey(Bip32KeyIndex(0x80000001)).publicKey.pubKey.compressed; + : mwebHd?.childKey(Bip32KeyIndex(0x80000001)).publicKey.pubKey.compressed ?? List.filled(32, 0); @override Future init() async { @@ -70,10 +70,11 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with } Future ensureMwebAddressUpToIndexExists(int index) async { + printV("aaaaaa"); if (Platform.isLinux || Platform.isMacOS || Platform.isWindows) { return null; } - if ((scanSecret.length < 1 || scanSecret.reduce((a, b) => a + b) == 0) || + if ((scanSecret.length < 1 || scanSecret.reduce((a, b) => a + b) == 0) && (spendPubkey.length < 1 || spendPubkey.reduce((a, b) => a + b) == 0)) { return null; } @@ -140,7 +141,7 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with }) { if (addressType == SegwitAddresType.mweb) { if (mwebAddrs.length == 0) { - return "null"; + return ""; } return hd == sideHd ? mwebAddrs[0] : mwebAddrs[index + 1]; } diff --git a/cw_mweb/gen-protobuf.sh b/cw_mweb/gen-protobuf.sh new file mode 100644 index 0000000000..6a761f7992 --- /dev/null +++ b/cw_mweb/gen-protobuf.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +docker run --platform linux/arm64 --rm \ + -v "$PWD":/work -w /work dart:2.17 bash -c ' + apt-get update && + apt-get install -y protobuf-compiler && + dart pub global activate protoc_plugin 20.0.1 && + export PATH="$PATH:/root/.pub-cache/bin" && + protoc --dart_out=grpc:./ ./lib/mwebd.proto + ' diff --git a/cw_mweb/go/go.mod b/cw_mweb/go/go.mod index e01117a281..37ff16017f 100644 --- a/cw_mweb/go/go.mod +++ b/cw_mweb/go/go.mod @@ -2,9 +2,7 @@ module github.com/cake-tech/cake_wallet/cw_mweb/go go 1.24.1 -require github.com/ltcmweb/mwebd v0.1.16 - -require github.com/ltcmweb/mwebd v0.1.16 +require github.com/ltcmweb/mwebd v0.1.17 require ( github.com/Microsoft/go-winio v0.6.2 // indirect @@ -27,7 +25,7 @@ require ( github.com/kkdai/bstream v1.0.0 // indirect github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/ltcmweb/coinswapd v0.1.0 // indirect - github.com/ltcmweb/ltcd v0.25.11 // indirect + github.com/ltcmweb/ltcd v0.25.12 // indirect github.com/ltcmweb/ltcd/btcec/v2 v2.3.3 // indirect github.com/ltcmweb/ltcd/chaincfg/chainhash v1.0.3 // indirect github.com/ltcmweb/neutrino v0.17.4 // indirect diff --git a/cw_mweb/go/go.sum b/cw_mweb/go/go.sum index f09c4a6ac0..a0fdf516f8 100644 --- a/cw_mweb/go/go.sum +++ b/cw_mweb/go/go.sum @@ -63,14 +63,14 @@ github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuV github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/ltcmweb/coinswapd v0.1.0 h1:M6eoz4g7fDpsQeNA8wWbBh6PY1xykrihyLU44SgljeI= github.com/ltcmweb/coinswapd v0.1.0/go.mod h1:CY5cVSympaLrMO8fHWXO+e/iuPLs2L0U9daMCRTstEM= -github.com/ltcmweb/ltcd v0.25.11 h1:MI0n/9I0P2Ig+myofegrXXEvh00lY3TUqPk1akYHBxA= -github.com/ltcmweb/ltcd v0.25.11/go.mod h1:jQbvPfnT4bBXJKRwU5SdD9ZUopwmSvhngdjeopv2cIU= +github.com/ltcmweb/ltcd v0.25.12 h1:igeogW2/rQIZ30UxCvd8lNPJuD6++viuRl70Z7xJ9nA= +github.com/ltcmweb/ltcd v0.25.12/go.mod h1:jQbvPfnT4bBXJKRwU5SdD9ZUopwmSvhngdjeopv2cIU= github.com/ltcmweb/ltcd/btcec/v2 v2.3.3 h1:gJc1ljDPCBtwBKFcC4SW44BFoJqoZzkeagndMYdqKKE= github.com/ltcmweb/ltcd/btcec/v2 v2.3.3/go.mod h1:NRr2WtpiSiSO29TkdZhbGNRA/Q16DV2eNbORf+M2ykI= github.com/ltcmweb/ltcd/chaincfg/chainhash v1.0.3 h1:CAPyzHI3bCFRrrVHZkDUR2i3Awj6l/aqAZIEi0E/nfM= github.com/ltcmweb/ltcd/chaincfg/chainhash v1.0.3/go.mod h1:zB+HhI2IbIwTGpdAhdzpm1GVX4ShcWTgN42+ar9HXrg= -github.com/ltcmweb/mwebd v0.1.16 h1:DaOIp/5TDhcDUxjvnWKHXkr6hF4LHe2bbY8I0zo7m9w= -github.com/ltcmweb/mwebd v0.1.16/go.mod h1:GEhTe4RTG4ImmzsyqCzO2NKK11U2Zgb5+leQnwY+u+4= +github.com/ltcmweb/mwebd v0.1.17 h1:PbYV0NuaWzjj5yAzYxYfEzqeZe54ay5mLz06f14UkJk= +github.com/ltcmweb/mwebd v0.1.17/go.mod h1:qY2DgLYbwOh2GWfW44vV/PfzBN84sR0ulphAr51sAPc= github.com/ltcmweb/neutrino v0.17.4 h1:ZsguBvicTM5CtZDsKg+OBFuPUCKjfEJ3lRSGXPjF2oM= github.com/ltcmweb/neutrino v0.17.4/go.mod h1:KktZ+McIwHuTHe0K8JK9Wv4qgv8orkA21a0ZOU4SwJ4= github.com/ltcmweb/neutrino/cache v1.1.0 h1:C0Qn2p8ogcskRPfrBKPUayjn3m/CUJqI7otopNScvhk= diff --git a/cw_mweb/go/mweb.go b/cw_mweb/go/mweb.go index 46e1bee1e7..135223384a 100644 --- a/cw_mweb/go/mweb.go +++ b/cw_mweb/go/mweb.go @@ -25,13 +25,14 @@ func StartServer(chain *C.char, dataDir *C.char, nodeUri *C.char, errMsg **C.cha return 0 } - err = server.StartUnix(goDataDir + "/mwebd.sock") +// err = server.StartUnix(goDataDir + "/mwebd.sock") + start, err := server.Start(0) if err != nil { *errMsg = C.CString(err.Error()) return 0 } - return 1 + return C.int(start) } //export StopServer diff --git a/cw_mweb/lib/cw_mweb.dart b/cw_mweb/lib/cw_mweb.dart index 681ffe79ba..952a5a2e36 100644 --- a/cw_mweb/lib/cw_mweb.dart +++ b/cw_mweb/lib/cw_mweb.dart @@ -64,8 +64,7 @@ class CwMweb { } printV("Attempting to connect to server on port: $_port"); - final address = InternetAddress("${appDir.path}/mwebd.sock", type: InternetAddressType.unix); - _clientChannel = ClientChannel(address, channelShutdownHandler: () { + _clientChannel = ClientChannel('127.0.0.1', port: _port!, channelShutdownHandler: () { _rpcClient = null; printV("Channel is shutting down!"); }, diff --git a/cw_mweb/lib/mwebd.pb.dart b/cw_mweb/lib/mwebd.pb.dart index faf5511c60..500a9b6e81 100644 --- a/cw_mweb/lib/mwebd.pb.dart +++ b/cw_mweb/lib/mwebd.pb.dart @@ -1,13 +1,9 @@ -// +/// // Generated code. Do not modify. -// source: mwebd.proto +// source: lib/mwebd.proto // // @dart = 2.12 - -// ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import +// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name import 'dart:core' as $core; @@ -15,15 +11,14 @@ import 'package:fixnum/fixnum.dart' as $fixnum; import 'package:protobuf/protobuf.dart' as $pb; class StatusRequest extends $pb.GeneratedMessage { - factory StatusRequest() => create(); - StatusRequest._() : super(); - factory StatusRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory StatusRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'StatusRequest', createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'StatusRequest', createEmptyInstance: create) ..hasRequiredFields = false ; + StatusRequest._() : super(); + factory StatusRequest() => create(); + factory StatusRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory StatusRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -33,10 +28,8 @@ class StatusRequest extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - StatusRequest copyWith(void Function(StatusRequest) updates) => super.copyWith((message) => updates(message as StatusRequest)) as StatusRequest; - + StatusRequest copyWith(void Function(StatusRequest) updates) => super.copyWith((message) => updates(message as StatusRequest)) as StatusRequest; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static StatusRequest create() => StatusRequest._(); StatusRequest createEmptyInstance() => create(); @@ -47,39 +40,38 @@ class StatusRequest extends $pb.GeneratedMessage { } class StatusResponse extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'StatusResponse', createEmptyInstance: create) + ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockHeaderHeight', $pb.PbFieldType.O3) + ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'mwebHeaderHeight', $pb.PbFieldType.O3) + ..a<$core.int>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'mwebUtxosHeight', $pb.PbFieldType.O3) + ..a<$core.int>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockTime', $pb.PbFieldType.OU3) + ..hasRequiredFields = false + ; + + StatusResponse._() : super(); factory StatusResponse({ $core.int? blockHeaderHeight, $core.int? mwebHeaderHeight, $core.int? mwebUtxosHeight, $core.int? blockTime, }) { - final $result = create(); + final _result = create(); if (blockHeaderHeight != null) { - $result.blockHeaderHeight = blockHeaderHeight; + _result.blockHeaderHeight = blockHeaderHeight; } if (mwebHeaderHeight != null) { - $result.mwebHeaderHeight = mwebHeaderHeight; + _result.mwebHeaderHeight = mwebHeaderHeight; } if (mwebUtxosHeight != null) { - $result.mwebUtxosHeight = mwebUtxosHeight; + _result.mwebUtxosHeight = mwebUtxosHeight; } if (blockTime != null) { - $result.blockTime = blockTime; + _result.blockTime = blockTime; } - return $result; + return _result; } - StatusResponse._() : super(); factory StatusResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory StatusResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'StatusResponse', createEmptyInstance: create) - ..a<$core.int>(1, _omitFieldNames ? '' : 'blockHeaderHeight', $pb.PbFieldType.O3) - ..a<$core.int>(2, _omitFieldNames ? '' : 'mwebHeaderHeight', $pb.PbFieldType.O3) - ..a<$core.int>(3, _omitFieldNames ? '' : 'mwebUtxosHeight', $pb.PbFieldType.O3) - ..a<$core.int>(4, _omitFieldNames ? '' : 'blockTime', $pb.PbFieldType.OU3) - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -89,10 +81,8 @@ class StatusResponse extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - StatusResponse copyWith(void Function(StatusResponse) updates) => super.copyWith((message) => updates(message as StatusResponse)) as StatusResponse; - + StatusResponse copyWith(void Function(StatusResponse) updates) => super.copyWith((message) => updates(message as StatusResponse)) as StatusResponse; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static StatusResponse create() => StatusResponse._(); StatusResponse createEmptyInstance() => create(); @@ -101,7 +91,6 @@ class StatusResponse extends $pb.GeneratedMessage { static StatusResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static StatusResponse? _defaultInstance; - /// The height of the latest block. @$pb.TagNumber(1) $core.int get blockHeaderHeight => $_getIZ(0); @$pb.TagNumber(1) @@ -111,7 +100,6 @@ class StatusResponse extends $pb.GeneratedMessage { @$pb.TagNumber(1) void clearBlockHeaderHeight() => clearField(1); - /// The height of the latest MWEB header. @$pb.TagNumber(2) $core.int get mwebHeaderHeight => $_getIZ(1); @$pb.TagNumber(2) @@ -121,7 +109,6 @@ class StatusResponse extends $pb.GeneratedMessage { @$pb.TagNumber(2) void clearMwebHeaderHeight() => clearField(2); - /// The height at which the MWEB utxo set is synced to. @$pb.TagNumber(3) $core.int get mwebUtxosHeight => $_getIZ(2); @$pb.TagNumber(3) @@ -131,7 +118,6 @@ class StatusResponse extends $pb.GeneratedMessage { @$pb.TagNumber(3) void clearMwebUtxosHeight() => clearField(3); - /// The timestamp of the latest block. @$pb.TagNumber(4) $core.int get blockTime => $_getIZ(3); @$pb.TagNumber(4) @@ -143,29 +129,28 @@ class StatusResponse extends $pb.GeneratedMessage { } class UtxosRequest extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'UtxosRequest', createEmptyInstance: create) + ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fromHeight', $pb.PbFieldType.O3) + ..a<$core.List<$core.int>>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'scanSecret', $pb.PbFieldType.OY) + ..hasRequiredFields = false + ; + + UtxosRequest._() : super(); factory UtxosRequest({ $core.int? fromHeight, $core.List<$core.int>? scanSecret, }) { - final $result = create(); + final _result = create(); if (fromHeight != null) { - $result.fromHeight = fromHeight; + _result.fromHeight = fromHeight; } if (scanSecret != null) { - $result.scanSecret = scanSecret; + _result.scanSecret = scanSecret; } - return $result; + return _result; } - UtxosRequest._() : super(); factory UtxosRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory UtxosRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'UtxosRequest', createEmptyInstance: create) - ..a<$core.int>(1, _omitFieldNames ? '' : 'fromHeight', $pb.PbFieldType.O3) - ..a<$core.List<$core.int>>(2, _omitFieldNames ? '' : 'scanSecret', $pb.PbFieldType.OY) - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -175,10 +160,8 @@ class UtxosRequest extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - UtxosRequest copyWith(void Function(UtxosRequest) updates) => super.copyWith((message) => updates(message as UtxosRequest)) as UtxosRequest; - + UtxosRequest copyWith(void Function(UtxosRequest) updates) => super.copyWith((message) => updates(message as UtxosRequest)) as UtxosRequest; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static UtxosRequest create() => UtxosRequest._(); UtxosRequest createEmptyInstance() => create(); @@ -187,10 +170,6 @@ class UtxosRequest extends $pb.GeneratedMessage { static UtxosRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static UtxosRequest? _defaultInstance; - /// The block height from which to start fetching utxos from. - /// After all mined utxos have been streamed, unconfirmed and - /// newly confirmed utxos will also be streamed. If this is set - /// to 0 then all utxos belonging to the account will be fetched. @$pb.TagNumber(1) $core.int get fromHeight => $_getIZ(0); @$pb.TagNumber(1) @@ -200,8 +179,6 @@ class UtxosRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) void clearFromHeight() => clearField(1); - /// The scan secret or view key represents the account for - /// which utxos should be streamed. @$pb.TagNumber(2) $core.List<$core.int> get scanSecret => $_getN(1); @$pb.TagNumber(2) @@ -213,6 +190,16 @@ class UtxosRequest extends $pb.GeneratedMessage { } class Utxo extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Utxo', createEmptyInstance: create) + ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'height', $pb.PbFieldType.O3) + ..a<$fixnum.Int64>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO) + ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'address') + ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'outputId') + ..a<$core.int>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'blockTime', $pb.PbFieldType.OU3) + ..hasRequiredFields = false + ; + + Utxo._() : super(); factory Utxo({ $core.int? height, $fixnum.Int64? value, @@ -220,37 +207,26 @@ class Utxo extends $pb.GeneratedMessage { $core.String? outputId, $core.int? blockTime, }) { - final $result = create(); + final _result = create(); if (height != null) { - $result.height = height; + _result.height = height; } if (value != null) { - $result.value = value; + _result.value = value; } if (address != null) { - $result.address = address; + _result.address = address; } if (outputId != null) { - $result.outputId = outputId; + _result.outputId = outputId; } if (blockTime != null) { - $result.blockTime = blockTime; + _result.blockTime = blockTime; } - return $result; + return _result; } - Utxo._() : super(); factory Utxo.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory Utxo.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Utxo', createEmptyInstance: create) - ..a<$core.int>(1, _omitFieldNames ? '' : 'height', $pb.PbFieldType.O3) - ..a<$fixnum.Int64>(2, _omitFieldNames ? '' : 'value', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO) - ..aOS(3, _omitFieldNames ? '' : 'address') - ..aOS(4, _omitFieldNames ? '' : 'outputId') - ..a<$core.int>(5, _omitFieldNames ? '' : 'blockTime', $pb.PbFieldType.OU3) - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -260,10 +236,8 @@ class Utxo extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - Utxo copyWith(void Function(Utxo) updates) => super.copyWith((message) => updates(message as Utxo)) as Utxo; - + Utxo copyWith(void Function(Utxo) updates) => super.copyWith((message) => updates(message as Utxo)) as Utxo; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static Utxo create() => Utxo._(); Utxo createEmptyInstance() => create(); @@ -272,7 +246,6 @@ class Utxo extends $pb.GeneratedMessage { static Utxo getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static Utxo? _defaultInstance; - /// The block height of the utxo, or 0 for unconfirmed. @$pb.TagNumber(1) $core.int get height => $_getIZ(0); @$pb.TagNumber(1) @@ -282,7 +255,6 @@ class Utxo extends $pb.GeneratedMessage { @$pb.TagNumber(1) void clearHeight() => clearField(1); - /// The value of the utxo in litoshis. @$pb.TagNumber(2) $fixnum.Int64 get value => $_getI64(1); @$pb.TagNumber(2) @@ -292,7 +264,6 @@ class Utxo extends $pb.GeneratedMessage { @$pb.TagNumber(2) void clearValue() => clearField(2); - /// The MWEB address that the utxo was received on. @$pb.TagNumber(3) $core.String get address => $_getSZ(2); @$pb.TagNumber(3) @@ -302,8 +273,6 @@ class Utxo extends $pb.GeneratedMessage { @$pb.TagNumber(3) void clearAddress() => clearField(3); - /// The output ID. This functions like a transaction hash, - /// but is unique to every utxo. @$pb.TagNumber(4) $core.String get outputId => $_getSZ(3); @$pb.TagNumber(4) @@ -313,7 +282,6 @@ class Utxo extends $pb.GeneratedMessage { @$pb.TagNumber(4) void clearOutputId() => clearField(4); - /// The timestamp of the block the utxo was mined in. @$pb.TagNumber(5) $core.int get blockTime => $_getIZ(4); @$pb.TagNumber(5) @@ -325,39 +293,38 @@ class Utxo extends $pb.GeneratedMessage { } class AddressRequest extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'AddressRequest', createEmptyInstance: create) + ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fromIndex', $pb.PbFieldType.OU3) + ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'toIndex', $pb.PbFieldType.OU3) + ..a<$core.List<$core.int>>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'scanSecret', $pb.PbFieldType.OY) + ..a<$core.List<$core.int>>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'spendPubkey', $pb.PbFieldType.OY) + ..hasRequiredFields = false + ; + + AddressRequest._() : super(); factory AddressRequest({ $core.int? fromIndex, $core.int? toIndex, $core.List<$core.int>? scanSecret, $core.List<$core.int>? spendPubkey, }) { - final $result = create(); + final _result = create(); if (fromIndex != null) { - $result.fromIndex = fromIndex; + _result.fromIndex = fromIndex; } if (toIndex != null) { - $result.toIndex = toIndex; + _result.toIndex = toIndex; } if (scanSecret != null) { - $result.scanSecret = scanSecret; + _result.scanSecret = scanSecret; } if (spendPubkey != null) { - $result.spendPubkey = spendPubkey; + _result.spendPubkey = spendPubkey; } - return $result; + return _result; } - AddressRequest._() : super(); factory AddressRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory AddressRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'AddressRequest', createEmptyInstance: create) - ..a<$core.int>(1, _omitFieldNames ? '' : 'fromIndex', $pb.PbFieldType.OU3) - ..a<$core.int>(2, _omitFieldNames ? '' : 'toIndex', $pb.PbFieldType.OU3) - ..a<$core.List<$core.int>>(3, _omitFieldNames ? '' : 'scanSecret', $pb.PbFieldType.OY) - ..a<$core.List<$core.int>>(4, _omitFieldNames ? '' : 'spendPubkey', $pb.PbFieldType.OY) - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -367,10 +334,8 @@ class AddressRequest extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - AddressRequest copyWith(void Function(AddressRequest) updates) => super.copyWith((message) => updates(message as AddressRequest)) as AddressRequest; - + AddressRequest copyWith(void Function(AddressRequest) updates) => super.copyWith((message) => updates(message as AddressRequest)) as AddressRequest; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static AddressRequest create() => AddressRequest._(); AddressRequest createEmptyInstance() => create(); @@ -379,7 +344,6 @@ class AddressRequest extends $pb.GeneratedMessage { static AddressRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static AddressRequest? _defaultInstance; - /// The starting index of the range. @$pb.TagNumber(1) $core.int get fromIndex => $_getIZ(0); @$pb.TagNumber(1) @@ -389,8 +353,6 @@ class AddressRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) void clearFromIndex() => clearField(1); - /// The ending index of the range. The result will contain all - /// addresses up to but not including this index. @$pb.TagNumber(2) $core.int get toIndex => $_getIZ(1); @$pb.TagNumber(2) @@ -400,8 +362,6 @@ class AddressRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) void clearToIndex() => clearField(2); - /// The scan secret or view key represents the account for - /// which addresses should be returned. @$pb.TagNumber(3) $core.List<$core.int> get scanSecret => $_getN(2); @$pb.TagNumber(3) @@ -411,9 +371,6 @@ class AddressRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) void clearScanSecret() => clearField(3); - /// The public key of the spend secret for the account. The spend - /// key is required for spending utxos but is also required - /// for generating addresses. @$pb.TagNumber(4) $core.List<$core.int> get spendPubkey => $_getN(3); @$pb.TagNumber(4) @@ -425,24 +382,23 @@ class AddressRequest extends $pb.GeneratedMessage { } class AddressResponse extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'AddressResponse', createEmptyInstance: create) + ..pPS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'address') + ..hasRequiredFields = false + ; + + AddressResponse._() : super(); factory AddressResponse({ $core.Iterable<$core.String>? address, }) { - final $result = create(); + final _result = create(); if (address != null) { - $result.address.addAll(address); + _result.address.addAll(address); } - return $result; + return _result; } - AddressResponse._() : super(); factory AddressResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory AddressResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'AddressResponse', createEmptyInstance: create) - ..pPS(1, _omitFieldNames ? '' : 'address') - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -452,10 +408,8 @@ class AddressResponse extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - AddressResponse copyWith(void Function(AddressResponse) updates) => super.copyWith((message) => updates(message as AddressResponse)) as AddressResponse; - + AddressResponse copyWith(void Function(AddressResponse) updates) => super.copyWith((message) => updates(message as AddressResponse)) as AddressResponse; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static AddressResponse create() => AddressResponse._(); AddressResponse createEmptyInstance() => create(); @@ -464,30 +418,28 @@ class AddressResponse extends $pb.GeneratedMessage { static AddressResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static AddressResponse? _defaultInstance; - /// An array of MWEB addresses within the requested range. @$pb.TagNumber(1) $core.List<$core.String> get address => $_getList(0); } class LedgerApdu extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'LedgerApdu', createEmptyInstance: create) + ..a<$core.List<$core.int>>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'data', $pb.PbFieldType.OY) + ..hasRequiredFields = false + ; + + LedgerApdu._() : super(); factory LedgerApdu({ $core.List<$core.int>? data, }) { - final $result = create(); + final _result = create(); if (data != null) { - $result.data = data; + _result.data = data; } - return $result; + return _result; } - LedgerApdu._() : super(); factory LedgerApdu.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory LedgerApdu.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'LedgerApdu', createEmptyInstance: create) - ..a<$core.List<$core.int>>(1, _omitFieldNames ? '' : 'data', $pb.PbFieldType.OY) - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -497,10 +449,8 @@ class LedgerApdu extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - LedgerApdu copyWith(void Function(LedgerApdu) updates) => super.copyWith((message) => updates(message as LedgerApdu)) as LedgerApdu; - + LedgerApdu copyWith(void Function(LedgerApdu) updates) => super.copyWith((message) => updates(message as LedgerApdu)) as LedgerApdu; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static LedgerApdu create() => LedgerApdu._(); LedgerApdu createEmptyInstance() => create(); @@ -520,24 +470,23 @@ class LedgerApdu extends $pb.GeneratedMessage { } class SpentRequest extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SpentRequest', createEmptyInstance: create) + ..pPS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'outputId') + ..hasRequiredFields = false + ; + + SpentRequest._() : super(); factory SpentRequest({ $core.Iterable<$core.String>? outputId, }) { - final $result = create(); + final _result = create(); if (outputId != null) { - $result.outputId.addAll(outputId); + _result.outputId.addAll(outputId); } - return $result; + return _result; } - SpentRequest._() : super(); factory SpentRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory SpentRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'SpentRequest', createEmptyInstance: create) - ..pPS(1, _omitFieldNames ? '' : 'outputId') - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -547,10 +496,8 @@ class SpentRequest extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - SpentRequest copyWith(void Function(SpentRequest) updates) => super.copyWith((message) => updates(message as SpentRequest)) as SpentRequest; - + SpentRequest copyWith(void Function(SpentRequest) updates) => super.copyWith((message) => updates(message as SpentRequest)) as SpentRequest; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static SpentRequest create() => SpentRequest._(); SpentRequest createEmptyInstance() => create(); @@ -559,30 +506,28 @@ class SpentRequest extends $pb.GeneratedMessage { static SpentRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static SpentRequest? _defaultInstance; - /// An array of output IDs to perform checks for. @$pb.TagNumber(1) $core.List<$core.String> get outputId => $_getList(0); } class SpentResponse extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SpentResponse', createEmptyInstance: create) + ..pPS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'outputId') + ..hasRequiredFields = false + ; + + SpentResponse._() : super(); factory SpentResponse({ $core.Iterable<$core.String>? outputId, }) { - final $result = create(); + final _result = create(); if (outputId != null) { - $result.outputId.addAll(outputId); + _result.outputId.addAll(outputId); } - return $result; + return _result; } - SpentResponse._() : super(); factory SpentResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory SpentResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'SpentResponse', createEmptyInstance: create) - ..pPS(1, _omitFieldNames ? '' : 'outputId') - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -592,10 +537,8 @@ class SpentResponse extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - SpentResponse copyWith(void Function(SpentResponse) updates) => super.copyWith((message) => updates(message as SpentResponse)) as SpentResponse; - + SpentResponse copyWith(void Function(SpentResponse) updates) => super.copyWith((message) => updates(message as SpentResponse)) as SpentResponse; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static SpentResponse create() => SpentResponse._(); SpentResponse createEmptyInstance() => create(); @@ -604,14 +547,21 @@ class SpentResponse extends $pb.GeneratedMessage { static SpentResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static SpentResponse? _defaultInstance; - /// An array of the output IDs that were not found in the - /// unspent set. This means that the outputs are either - /// unconfirmed or were spent. @$pb.TagNumber(1) $core.List<$core.String> get outputId => $_getList(0); } class CreateRequest extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CreateRequest', createEmptyInstance: create) + ..a<$core.List<$core.int>>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rawTx', $pb.PbFieldType.OY) + ..a<$core.List<$core.int>>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'scanSecret', $pb.PbFieldType.OY) + ..a<$core.List<$core.int>>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'spendSecret', $pb.PbFieldType.OY) + ..a<$fixnum.Int64>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'feeRatePerKb', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO) + ..aOB(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'dryRun') + ..hasRequiredFields = false + ; + + CreateRequest._() : super(); factory CreateRequest({ $core.List<$core.int>? rawTx, $core.List<$core.int>? scanSecret, @@ -619,37 +569,26 @@ class CreateRequest extends $pb.GeneratedMessage { $fixnum.Int64? feeRatePerKb, $core.bool? dryRun, }) { - final $result = create(); + final _result = create(); if (rawTx != null) { - $result.rawTx = rawTx; + _result.rawTx = rawTx; } if (scanSecret != null) { - $result.scanSecret = scanSecret; + _result.scanSecret = scanSecret; } if (spendSecret != null) { - $result.spendSecret = spendSecret; + _result.spendSecret = spendSecret; } if (feeRatePerKb != null) { - $result.feeRatePerKb = feeRatePerKb; + _result.feeRatePerKb = feeRatePerKb; } if (dryRun != null) { - $result.dryRun = dryRun; + _result.dryRun = dryRun; } - return $result; + return _result; } - CreateRequest._() : super(); factory CreateRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory CreateRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'CreateRequest', createEmptyInstance: create) - ..a<$core.List<$core.int>>(1, _omitFieldNames ? '' : 'rawTx', $pb.PbFieldType.OY) - ..a<$core.List<$core.int>>(2, _omitFieldNames ? '' : 'scanSecret', $pb.PbFieldType.OY) - ..a<$core.List<$core.int>>(3, _omitFieldNames ? '' : 'spendSecret', $pb.PbFieldType.OY) - ..a<$fixnum.Int64>(4, _omitFieldNames ? '' : 'feeRatePerKb', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO) - ..aOB(5, _omitFieldNames ? '' : 'dryRun') - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -659,10 +598,8 @@ class CreateRequest extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - CreateRequest copyWith(void Function(CreateRequest) updates) => super.copyWith((message) => updates(message as CreateRequest)) as CreateRequest; - + CreateRequest copyWith(void Function(CreateRequest) updates) => super.copyWith((message) => updates(message as CreateRequest)) as CreateRequest; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static CreateRequest create() => CreateRequest._(); CreateRequest createEmptyInstance() => create(); @@ -671,16 +608,6 @@ class CreateRequest extends $pb.GeneratedMessage { static CreateRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static CreateRequest? _defaultInstance; - /// The raw bytes of the serialized transaction. This will be - /// a template where the non-MWEB inputs will remain unchanged, - /// and the MWEB inputs are specified by TxIns with the outpoint - /// hash set to the output ID of the utxo being spent, and the - /// outpoint index set to the index of the address that the utxo - /// was received on. MWEB outputs are specified by TxOuts with - /// the script pubkey set to the serialized scan and spend pubkeys - /// of the destination MWEB address. Any non-MWEB outputs will be - /// transformed into MWEB peg-outs. If the transaction doesn't - /// contain any MWEB i/o then the result will be unchanged. @$pb.TagNumber(1) $core.List<$core.int> get rawTx => $_getN(0); @$pb.TagNumber(1) @@ -690,8 +617,6 @@ class CreateRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) void clearRawTx() => clearField(1); - /// The scan secret or view key represents the account that - /// the utxos being spent belong to. @$pb.TagNumber(2) $core.List<$core.int> get scanSecret => $_getN(1); @$pb.TagNumber(2) @@ -701,8 +626,6 @@ class CreateRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) void clearScanSecret() => clearField(2); - /// The spend secret is the private key necessary for spending - /// the utxos belonging to the account. @$pb.TagNumber(3) $core.List<$core.int> get spendSecret => $_getN(2); @$pb.TagNumber(3) @@ -712,7 +635,6 @@ class CreateRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) void clearSpendSecret() => clearField(3); - /// The fee rate per KB in litoshis. @$pb.TagNumber(4) $fixnum.Int64 get feeRatePerKb => $_getI64(3); @$pb.TagNumber(4) @@ -722,8 +644,6 @@ class CreateRequest extends $pb.GeneratedMessage { @$pb.TagNumber(4) void clearFeeRatePerKb() => clearField(4); - /// Whether to skip MWEB transaction creation. This is useful - /// for fee estimation. @$pb.TagNumber(5) $core.bool get dryRun => $_getBF(4); @$pb.TagNumber(5) @@ -735,29 +655,28 @@ class CreateRequest extends $pb.GeneratedMessage { } class CreateResponse extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CreateResponse', createEmptyInstance: create) + ..a<$core.List<$core.int>>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rawTx', $pb.PbFieldType.OY) + ..pPS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'outputId') + ..hasRequiredFields = false + ; + + CreateResponse._() : super(); factory CreateResponse({ $core.List<$core.int>? rawTx, $core.Iterable<$core.String>? outputId, }) { - final $result = create(); + final _result = create(); if (rawTx != null) { - $result.rawTx = rawTx; + _result.rawTx = rawTx; } if (outputId != null) { - $result.outputId.addAll(outputId); + _result.outputId.addAll(outputId); } - return $result; + return _result; } - CreateResponse._() : super(); factory CreateResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory CreateResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'CreateResponse', createEmptyInstance: create) - ..a<$core.List<$core.int>>(1, _omitFieldNames ? '' : 'rawTx', $pb.PbFieldType.OY) - ..pPS(2, _omitFieldNames ? '' : 'outputId') - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -767,10 +686,8 @@ class CreateResponse extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - CreateResponse copyWith(void Function(CreateResponse) updates) => super.copyWith((message) => updates(message as CreateResponse)) as CreateResponse; - + CreateResponse copyWith(void Function(CreateResponse) updates) => super.copyWith((message) => updates(message as CreateResponse)) as CreateResponse; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static CreateResponse create() => CreateResponse._(); CreateResponse createEmptyInstance() => create(); @@ -779,10 +696,6 @@ class CreateResponse extends $pb.GeneratedMessage { static CreateResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static CreateResponse? _defaultInstance; - /// The raw bytes of the serialized transaction. It will contain - /// a single TxOut representing the peg-in required. From this - /// it is possible to determine the addtional fee that was added - /// by the MWEB transaction. @$pb.TagNumber(1) $core.List<$core.int> get rawTx => $_getN(0); @$pb.TagNumber(1) @@ -792,36 +705,33 @@ class CreateResponse extends $pb.GeneratedMessage { @$pb.TagNumber(1) void clearRawTx() => clearField(1); - /// The output IDs of any utxos created by the transaction, - /// in the same order as in the template. @$pb.TagNumber(2) $core.List<$core.String> get outputId => $_getList(1); } class PsbtCreateRequest extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'PsbtCreateRequest', createEmptyInstance: create) + ..a<$core.List<$core.int>>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rawTx', $pb.PbFieldType.OY) + ..pc(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'witnessUtxo', $pb.PbFieldType.PM, subBuilder: TxOut.create) + ..hasRequiredFields = false + ; + + PsbtCreateRequest._() : super(); factory PsbtCreateRequest({ $core.List<$core.int>? rawTx, $core.Iterable? witnessUtxo, }) { - final $result = create(); + final _result = create(); if (rawTx != null) { - $result.rawTx = rawTx; + _result.rawTx = rawTx; } if (witnessUtxo != null) { - $result.witnessUtxo.addAll(witnessUtxo); + _result.witnessUtxo.addAll(witnessUtxo); } - return $result; + return _result; } - PsbtCreateRequest._() : super(); factory PsbtCreateRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory PsbtCreateRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtCreateRequest', createEmptyInstance: create) - ..a<$core.List<$core.int>>(1, _omitFieldNames ? '' : 'rawTx', $pb.PbFieldType.OY) - ..pc(2, _omitFieldNames ? '' : 'witnessUtxo', $pb.PbFieldType.PM, subBuilder: TxOut.create) - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -831,10 +741,8 @@ class PsbtCreateRequest extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - PsbtCreateRequest copyWith(void Function(PsbtCreateRequest) updates) => super.copyWith((message) => updates(message as PsbtCreateRequest)) as PsbtCreateRequest; - + PsbtCreateRequest copyWith(void Function(PsbtCreateRequest) updates) => super.copyWith((message) => updates(message as PsbtCreateRequest)) as PsbtCreateRequest; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static PsbtCreateRequest create() => PsbtCreateRequest._(); PsbtCreateRequest createEmptyInstance() => create(); @@ -843,7 +751,6 @@ class PsbtCreateRequest extends $pb.GeneratedMessage { static PsbtCreateRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static PsbtCreateRequest? _defaultInstance; - /// The raw bytes of the serialized transaction. @$pb.TagNumber(1) $core.List<$core.int> get rawTx => $_getN(0); @$pb.TagNumber(1) @@ -853,35 +760,33 @@ class PsbtCreateRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) void clearRawTx() => clearField(1); - /// Witness utxos for each input. @$pb.TagNumber(2) $core.List get witnessUtxo => $_getList(1); } class TxOut extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'TxOut', createEmptyInstance: create) + ..aInt64(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value') + ..a<$core.List<$core.int>>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'pkScript', $pb.PbFieldType.OY) + ..hasRequiredFields = false + ; + + TxOut._() : super(); factory TxOut({ $fixnum.Int64? value, $core.List<$core.int>? pkScript, }) { - final $result = create(); + final _result = create(); if (value != null) { - $result.value = value; + _result.value = value; } if (pkScript != null) { - $result.pkScript = pkScript; + _result.pkScript = pkScript; } - return $result; + return _result; } - TxOut._() : super(); factory TxOut.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory TxOut.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'TxOut', createEmptyInstance: create) - ..aInt64(1, _omitFieldNames ? '' : 'value') - ..a<$core.List<$core.int>>(2, _omitFieldNames ? '' : 'pkScript', $pb.PbFieldType.OY) - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -891,10 +796,8 @@ class TxOut extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - TxOut copyWith(void Function(TxOut) updates) => super.copyWith((message) => updates(message as TxOut)) as TxOut; - + TxOut copyWith(void Function(TxOut) updates) => super.copyWith((message) => updates(message as TxOut)) as TxOut; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static TxOut create() => TxOut._(); TxOut createEmptyInstance() => create(); @@ -923,24 +826,23 @@ class TxOut extends $pb.GeneratedMessage { } class PsbtResponse extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'PsbtResponse', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'psbtB64') + ..hasRequiredFields = false + ; + + PsbtResponse._() : super(); factory PsbtResponse({ $core.String? psbtB64, }) { - final $result = create(); + final _result = create(); if (psbtB64 != null) { - $result.psbtB64 = psbtB64; + _result.psbtB64 = psbtB64; } - return $result; + return _result; } - PsbtResponse._() : super(); factory PsbtResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory PsbtResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtResponse', createEmptyInstance: create) - ..aOS(1, _omitFieldNames ? '' : 'psbtB64') - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -950,10 +852,8 @@ class PsbtResponse extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - PsbtResponse copyWith(void Function(PsbtResponse) updates) => super.copyWith((message) => updates(message as PsbtResponse)) as PsbtResponse; - + PsbtResponse copyWith(void Function(PsbtResponse) updates) => super.copyWith((message) => updates(message as PsbtResponse)) as PsbtResponse; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static PsbtResponse create() => PsbtResponse._(); PsbtResponse createEmptyInstance() => create(); @@ -962,7 +862,6 @@ class PsbtResponse extends $pb.GeneratedMessage { static PsbtResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static PsbtResponse? _defaultInstance; - /// The PSBT in base64 encoding. @$pb.TagNumber(1) $core.String get psbtB64 => $_getSZ(0); @$pb.TagNumber(1) @@ -974,39 +873,43 @@ class PsbtResponse extends $pb.GeneratedMessage { } class PsbtAddInputRequest extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'PsbtAddInputRequest', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'psbtB64') + ..a<$core.List<$core.int>>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'scanSecret', $pb.PbFieldType.OY) + ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'outputId') + ..a<$core.int>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'addressIndex', $pb.PbFieldType.OU3) + ..a<$fixnum.Int64>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'feeRatePerKb', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO) + ..hasRequiredFields = false + ; + + PsbtAddInputRequest._() : super(); factory PsbtAddInputRequest({ $core.String? psbtB64, $core.List<$core.int>? scanSecret, $core.String? outputId, $core.int? addressIndex, + $fixnum.Int64? feeRatePerKb, }) { - final $result = create(); + final _result = create(); if (psbtB64 != null) { - $result.psbtB64 = psbtB64; + _result.psbtB64 = psbtB64; } if (scanSecret != null) { - $result.scanSecret = scanSecret; + _result.scanSecret = scanSecret; } if (outputId != null) { - $result.outputId = outputId; + _result.outputId = outputId; } if (addressIndex != null) { - $result.addressIndex = addressIndex; + _result.addressIndex = addressIndex; } - return $result; + if (feeRatePerKb != null) { + _result.feeRatePerKb = feeRatePerKb; + } + return _result; } - PsbtAddInputRequest._() : super(); factory PsbtAddInputRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory PsbtAddInputRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtAddInputRequest', createEmptyInstance: create) - ..aOS(1, _omitFieldNames ? '' : 'psbtB64') - ..a<$core.List<$core.int>>(2, _omitFieldNames ? '' : 'scanSecret', $pb.PbFieldType.OY) - ..aOS(3, _omitFieldNames ? '' : 'outputId') - ..a<$core.int>(4, _omitFieldNames ? '' : 'addressIndex', $pb.PbFieldType.OU3) - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -1016,10 +919,8 @@ class PsbtAddInputRequest extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - PsbtAddInputRequest copyWith(void Function(PsbtAddInputRequest) updates) => super.copyWith((message) => updates(message as PsbtAddInputRequest)) as PsbtAddInputRequest; - + PsbtAddInputRequest copyWith(void Function(PsbtAddInputRequest) updates) => super.copyWith((message) => updates(message as PsbtAddInputRequest)) as PsbtAddInputRequest; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static PsbtAddInputRequest create() => PsbtAddInputRequest._(); PsbtAddInputRequest createEmptyInstance() => create(); @@ -1028,7 +929,6 @@ class PsbtAddInputRequest extends $pb.GeneratedMessage { static PsbtAddInputRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static PsbtAddInputRequest? _defaultInstance; - /// The PSBT in base64 encoding. @$pb.TagNumber(1) $core.String get psbtB64 => $_getSZ(0); @$pb.TagNumber(1) @@ -1038,8 +938,6 @@ class PsbtAddInputRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) void clearPsbtB64() => clearField(1); - /// The scan secret or view key represents the account that - /// the utxos being spent belong to. @$pb.TagNumber(2) $core.List<$core.int> get scanSecret => $_getN(1); @$pb.TagNumber(2) @@ -1049,7 +947,6 @@ class PsbtAddInputRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) void clearScanSecret() => clearField(2); - /// The output ID of the utxo. @$pb.TagNumber(3) $core.String get outputId => $_getSZ(2); @$pb.TagNumber(3) @@ -1059,7 +956,6 @@ class PsbtAddInputRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) void clearOutputId() => clearField(3); - /// The address index of the utxo. @$pb.TagNumber(4) $core.int get addressIndex => $_getIZ(3); @$pb.TagNumber(4) @@ -1068,37 +964,45 @@ class PsbtAddInputRequest extends $pb.GeneratedMessage { $core.bool hasAddressIndex() => $_has(3); @$pb.TagNumber(4) void clearAddressIndex() => clearField(4); + + @$pb.TagNumber(5) + $fixnum.Int64 get feeRatePerKb => $_getI64(4); + @$pb.TagNumber(5) + set feeRatePerKb($fixnum.Int64 v) { $_setInt64(4, v); } + @$pb.TagNumber(5) + $core.bool hasFeeRatePerKb() => $_has(4); + @$pb.TagNumber(5) + void clearFeeRatePerKb() => clearField(5); } class PsbtAddRecipientRequest extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'PsbtAddRecipientRequest', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'psbtB64') + ..aOM(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'recipient', subBuilder: PsbtRecipient.create) + ..a<$fixnum.Int64>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'feeRatePerKb', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO) + ..hasRequiredFields = false + ; + + PsbtAddRecipientRequest._() : super(); factory PsbtAddRecipientRequest({ $core.String? psbtB64, PsbtRecipient? recipient, $fixnum.Int64? feeRatePerKb, }) { - final $result = create(); + final _result = create(); if (psbtB64 != null) { - $result.psbtB64 = psbtB64; + _result.psbtB64 = psbtB64; } if (recipient != null) { - $result.recipient = recipient; + _result.recipient = recipient; } if (feeRatePerKb != null) { - $result.feeRatePerKb = feeRatePerKb; + _result.feeRatePerKb = feeRatePerKb; } - return $result; + return _result; } - PsbtAddRecipientRequest._() : super(); factory PsbtAddRecipientRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory PsbtAddRecipientRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtAddRecipientRequest', createEmptyInstance: create) - ..aOS(1, _omitFieldNames ? '' : 'psbtB64') - ..aOM(2, _omitFieldNames ? '' : 'recipient', subBuilder: PsbtRecipient.create) - ..a<$fixnum.Int64>(3, _omitFieldNames ? '' : 'feeRatePerKb', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO) - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -1108,10 +1012,8 @@ class PsbtAddRecipientRequest extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - PsbtAddRecipientRequest copyWith(void Function(PsbtAddRecipientRequest) updates) => super.copyWith((message) => updates(message as PsbtAddRecipientRequest)) as PsbtAddRecipientRequest; - + PsbtAddRecipientRequest copyWith(void Function(PsbtAddRecipientRequest) updates) => super.copyWith((message) => updates(message as PsbtAddRecipientRequest)) as PsbtAddRecipientRequest; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static PsbtAddRecipientRequest create() => PsbtAddRecipientRequest._(); PsbtAddRecipientRequest createEmptyInstance() => create(); @@ -1120,7 +1022,6 @@ class PsbtAddRecipientRequest extends $pb.GeneratedMessage { static PsbtAddRecipientRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static PsbtAddRecipientRequest? _defaultInstance; - /// The PSBT in base64 encoding. @$pb.TagNumber(1) $core.String get psbtB64 => $_getSZ(0); @$pb.TagNumber(1) @@ -1141,7 +1042,6 @@ class PsbtAddRecipientRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) PsbtRecipient ensureRecipient() => $_ensure(1); - /// The fee rate per KB in litoshis. @$pb.TagNumber(3) $fixnum.Int64 get feeRatePerKb => $_getI64(2); @$pb.TagNumber(3) @@ -1153,24 +1053,23 @@ class PsbtAddRecipientRequest extends $pb.GeneratedMessage { } class PsbtGetRecipientsRequest extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'PsbtGetRecipientsRequest', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'psbtB64') + ..hasRequiredFields = false + ; + + PsbtGetRecipientsRequest._() : super(); factory PsbtGetRecipientsRequest({ $core.String? psbtB64, }) { - final $result = create(); + final _result = create(); if (psbtB64 != null) { - $result.psbtB64 = psbtB64; + _result.psbtB64 = psbtB64; } - return $result; + return _result; } - PsbtGetRecipientsRequest._() : super(); factory PsbtGetRecipientsRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory PsbtGetRecipientsRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtGetRecipientsRequest', createEmptyInstance: create) - ..aOS(1, _omitFieldNames ? '' : 'psbtB64') - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -1180,10 +1079,8 @@ class PsbtGetRecipientsRequest extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - PsbtGetRecipientsRequest copyWith(void Function(PsbtGetRecipientsRequest) updates) => super.copyWith((message) => updates(message as PsbtGetRecipientsRequest)) as PsbtGetRecipientsRequest; - + PsbtGetRecipientsRequest copyWith(void Function(PsbtGetRecipientsRequest) updates) => super.copyWith((message) => updates(message as PsbtGetRecipientsRequest)) as PsbtGetRecipientsRequest; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static PsbtGetRecipientsRequest create() => PsbtGetRecipientsRequest._(); PsbtGetRecipientsRequest createEmptyInstance() => create(); @@ -1192,7 +1089,6 @@ class PsbtGetRecipientsRequest extends $pb.GeneratedMessage { static PsbtGetRecipientsRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static PsbtGetRecipientsRequest? _defaultInstance; - /// The PSBT in base64 encoding. @$pb.TagNumber(1) $core.String get psbtB64 => $_getSZ(0); @$pb.TagNumber(1) @@ -1204,34 +1100,33 @@ class PsbtGetRecipientsRequest extends $pb.GeneratedMessage { } class PsbtGetRecipientsResponse extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'PsbtGetRecipientsResponse', createEmptyInstance: create) + ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'recipient', $pb.PbFieldType.PM, subBuilder: PsbtRecipient.create) + ..pPS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'inputAddress') + ..aInt64(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fee') + ..hasRequiredFields = false + ; + + PsbtGetRecipientsResponse._() : super(); factory PsbtGetRecipientsResponse({ $core.Iterable? recipient, $core.Iterable<$core.String>? inputAddress, $fixnum.Int64? fee, }) { - final $result = create(); + final _result = create(); if (recipient != null) { - $result.recipient.addAll(recipient); + _result.recipient.addAll(recipient); } if (inputAddress != null) { - $result.inputAddress.addAll(inputAddress); + _result.inputAddress.addAll(inputAddress); } if (fee != null) { - $result.fee = fee; + _result.fee = fee; } - return $result; + return _result; } - PsbtGetRecipientsResponse._() : super(); factory PsbtGetRecipientsResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory PsbtGetRecipientsResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtGetRecipientsResponse', createEmptyInstance: create) - ..pc(1, _omitFieldNames ? '' : 'recipient', $pb.PbFieldType.PM, subBuilder: PsbtRecipient.create) - ..pPS(2, _omitFieldNames ? '' : 'inputAddress') - ..aInt64(3, _omitFieldNames ? '' : 'fee') - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -1241,10 +1136,8 @@ class PsbtGetRecipientsResponse extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - PsbtGetRecipientsResponse copyWith(void Function(PsbtGetRecipientsResponse) updates) => super.copyWith((message) => updates(message as PsbtGetRecipientsResponse)) as PsbtGetRecipientsResponse; - + PsbtGetRecipientsResponse copyWith(void Function(PsbtGetRecipientsResponse) updates) => super.copyWith((message) => updates(message as PsbtGetRecipientsResponse)) as PsbtGetRecipientsResponse; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static PsbtGetRecipientsResponse create() => PsbtGetRecipientsResponse._(); PsbtGetRecipientsResponse createEmptyInstance() => create(); @@ -1270,29 +1163,28 @@ class PsbtGetRecipientsResponse extends $pb.GeneratedMessage { } class PsbtRecipient extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'PsbtRecipient', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'address') + ..aInt64(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value') + ..hasRequiredFields = false + ; + + PsbtRecipient._() : super(); factory PsbtRecipient({ $core.String? address, $fixnum.Int64? value, }) { - final $result = create(); + final _result = create(); if (address != null) { - $result.address = address; + _result.address = address; } if (value != null) { - $result.value = value; + _result.value = value; } - return $result; + return _result; } - PsbtRecipient._() : super(); factory PsbtRecipient.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory PsbtRecipient.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtRecipient', createEmptyInstance: create) - ..aOS(1, _omitFieldNames ? '' : 'address') - ..aInt64(2, _omitFieldNames ? '' : 'value') - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -1302,10 +1194,8 @@ class PsbtRecipient extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - PsbtRecipient copyWith(void Function(PsbtRecipient) updates) => super.copyWith((message) => updates(message as PsbtRecipient)) as PsbtRecipient; - + PsbtRecipient copyWith(void Function(PsbtRecipient) updates) => super.copyWith((message) => updates(message as PsbtRecipient)) as PsbtRecipient; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static PsbtRecipient create() => PsbtRecipient._(); PsbtRecipient createEmptyInstance() => create(); @@ -1334,34 +1224,33 @@ class PsbtRecipient extends $pb.GeneratedMessage { } class PsbtSignRequest extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'PsbtSignRequest', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'psbtB64') + ..a<$core.List<$core.int>>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'scanSecret', $pb.PbFieldType.OY) + ..a<$core.List<$core.int>>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'spendSecret', $pb.PbFieldType.OY) + ..hasRequiredFields = false + ; + + PsbtSignRequest._() : super(); factory PsbtSignRequest({ $core.String? psbtB64, $core.List<$core.int>? scanSecret, $core.List<$core.int>? spendSecret, }) { - final $result = create(); + final _result = create(); if (psbtB64 != null) { - $result.psbtB64 = psbtB64; + _result.psbtB64 = psbtB64; } if (scanSecret != null) { - $result.scanSecret = scanSecret; + _result.scanSecret = scanSecret; } if (spendSecret != null) { - $result.spendSecret = spendSecret; + _result.spendSecret = spendSecret; } - return $result; + return _result; } - PsbtSignRequest._() : super(); factory PsbtSignRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory PsbtSignRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtSignRequest', createEmptyInstance: create) - ..aOS(1, _omitFieldNames ? '' : 'psbtB64') - ..a<$core.List<$core.int>>(2, _omitFieldNames ? '' : 'scanSecret', $pb.PbFieldType.OY) - ..a<$core.List<$core.int>>(3, _omitFieldNames ? '' : 'spendSecret', $pb.PbFieldType.OY) - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -1371,10 +1260,8 @@ class PsbtSignRequest extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - PsbtSignRequest copyWith(void Function(PsbtSignRequest) updates) => super.copyWith((message) => updates(message as PsbtSignRequest)) as PsbtSignRequest; - + PsbtSignRequest copyWith(void Function(PsbtSignRequest) updates) => super.copyWith((message) => updates(message as PsbtSignRequest)) as PsbtSignRequest; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static PsbtSignRequest create() => PsbtSignRequest._(); PsbtSignRequest createEmptyInstance() => create(); @@ -1383,7 +1270,6 @@ class PsbtSignRequest extends $pb.GeneratedMessage { static PsbtSignRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static PsbtSignRequest? _defaultInstance; - /// The PSBT in base64 encoding. @$pb.TagNumber(1) $core.String get psbtB64 => $_getSZ(0); @$pb.TagNumber(1) @@ -1393,8 +1279,6 @@ class PsbtSignRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) void clearPsbtB64() => clearField(1); - /// The scan secret or view key represents the account that - /// the utxos being spent belong to. @$pb.TagNumber(2) $core.List<$core.int> get scanSecret => $_getN(1); @$pb.TagNumber(2) @@ -1404,8 +1288,6 @@ class PsbtSignRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) void clearScanSecret() => clearField(2); - /// The spend secret is the private key necessary for spending - /// the utxos belonging to the account. @$pb.TagNumber(3) $core.List<$core.int> get spendSecret => $_getN(2); @$pb.TagNumber(3) @@ -1417,34 +1299,33 @@ class PsbtSignRequest extends $pb.GeneratedMessage { } class PsbtSignNonMwebRequest extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'PsbtSignNonMwebRequest', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'psbtB64') + ..a<$core.List<$core.int>>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'privKey', $pb.PbFieldType.OY) + ..a<$core.int>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'index', $pb.PbFieldType.OU3) + ..hasRequiredFields = false + ; + + PsbtSignNonMwebRequest._() : super(); factory PsbtSignNonMwebRequest({ $core.String? psbtB64, $core.List<$core.int>? privKey, $core.int? index, }) { - final $result = create(); + final _result = create(); if (psbtB64 != null) { - $result.psbtB64 = psbtB64; + _result.psbtB64 = psbtB64; } if (privKey != null) { - $result.privKey = privKey; + _result.privKey = privKey; } if (index != null) { - $result.index = index; + _result.index = index; } - return $result; + return _result; } - PsbtSignNonMwebRequest._() : super(); factory PsbtSignNonMwebRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory PsbtSignNonMwebRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtSignNonMwebRequest', createEmptyInstance: create) - ..aOS(1, _omitFieldNames ? '' : 'psbtB64') - ..a<$core.List<$core.int>>(2, _omitFieldNames ? '' : 'privKey', $pb.PbFieldType.OY) - ..a<$core.int>(3, _omitFieldNames ? '' : 'index', $pb.PbFieldType.OU3) - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -1454,10 +1335,8 @@ class PsbtSignNonMwebRequest extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - PsbtSignNonMwebRequest copyWith(void Function(PsbtSignNonMwebRequest) updates) => super.copyWith((message) => updates(message as PsbtSignNonMwebRequest)) as PsbtSignNonMwebRequest; - + PsbtSignNonMwebRequest copyWith(void Function(PsbtSignNonMwebRequest) updates) => super.copyWith((message) => updates(message as PsbtSignNonMwebRequest)) as PsbtSignNonMwebRequest; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static PsbtSignNonMwebRequest create() => PsbtSignNonMwebRequest._(); PsbtSignNonMwebRequest createEmptyInstance() => create(); @@ -1466,7 +1345,6 @@ class PsbtSignNonMwebRequest extends $pb.GeneratedMessage { static PsbtSignNonMwebRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static PsbtSignNonMwebRequest? _defaultInstance; - /// The PSBT in base64 encoding. @$pb.TagNumber(1) $core.String get psbtB64 => $_getSZ(0); @$pb.TagNumber(1) @@ -1476,7 +1354,6 @@ class PsbtSignNonMwebRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) void clearPsbtB64() => clearField(1); - /// The private key necessary for spending the input. @$pb.TagNumber(2) $core.List<$core.int> get privKey => $_getN(1); @$pb.TagNumber(2) @@ -1486,7 +1363,6 @@ class PsbtSignNonMwebRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) void clearPrivKey() => clearField(2); - /// The index of the input to sign. @$pb.TagNumber(3) $core.int get index => $_getIZ(2); @$pb.TagNumber(3) @@ -1498,29 +1374,28 @@ class PsbtSignNonMwebRequest extends $pb.GeneratedMessage { } class PsbtExtractRequest extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'PsbtExtractRequest', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'psbtB64') + ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'unsigned') + ..hasRequiredFields = false + ; + + PsbtExtractRequest._() : super(); factory PsbtExtractRequest({ $core.String? psbtB64, $core.bool? unsigned, }) { - final $result = create(); + final _result = create(); if (psbtB64 != null) { - $result.psbtB64 = psbtB64; + _result.psbtB64 = psbtB64; } if (unsigned != null) { - $result.unsigned = unsigned; + _result.unsigned = unsigned; } - return $result; + return _result; } - PsbtExtractRequest._() : super(); factory PsbtExtractRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory PsbtExtractRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'PsbtExtractRequest', createEmptyInstance: create) - ..aOS(1, _omitFieldNames ? '' : 'psbtB64') - ..aOB(2, _omitFieldNames ? '' : 'unsigned') - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -1530,10 +1405,8 @@ class PsbtExtractRequest extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - PsbtExtractRequest copyWith(void Function(PsbtExtractRequest) updates) => super.copyWith((message) => updates(message as PsbtExtractRequest)) as PsbtExtractRequest; - + PsbtExtractRequest copyWith(void Function(PsbtExtractRequest) updates) => super.copyWith((message) => updates(message as PsbtExtractRequest)) as PsbtExtractRequest; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static PsbtExtractRequest create() => PsbtExtractRequest._(); PsbtExtractRequest createEmptyInstance() => create(); @@ -1542,7 +1415,6 @@ class PsbtExtractRequest extends $pb.GeneratedMessage { static PsbtExtractRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static PsbtExtractRequest? _defaultInstance; - /// The PSBT in base64 encoding. @$pb.TagNumber(1) $core.String get psbtB64 => $_getSZ(0); @$pb.TagNumber(1) @@ -1552,7 +1424,6 @@ class PsbtExtractRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) void clearPsbtB64() => clearField(1); - /// Extract the unsigned transaction. @$pb.TagNumber(2) $core.bool get unsigned => $_getBF(1); @$pb.TagNumber(2) @@ -1564,24 +1435,23 @@ class PsbtExtractRequest extends $pb.GeneratedMessage { } class BroadcastRequest extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BroadcastRequest', createEmptyInstance: create) + ..a<$core.List<$core.int>>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'rawTx', $pb.PbFieldType.OY) + ..hasRequiredFields = false + ; + + BroadcastRequest._() : super(); factory BroadcastRequest({ $core.List<$core.int>? rawTx, }) { - final $result = create(); + final _result = create(); if (rawTx != null) { - $result.rawTx = rawTx; + _result.rawTx = rawTx; } - return $result; + return _result; } - BroadcastRequest._() : super(); factory BroadcastRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory BroadcastRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'BroadcastRequest', createEmptyInstance: create) - ..a<$core.List<$core.int>>(1, _omitFieldNames ? '' : 'rawTx', $pb.PbFieldType.OY) - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -1591,10 +1461,8 @@ class BroadcastRequest extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - BroadcastRequest copyWith(void Function(BroadcastRequest) updates) => super.copyWith((message) => updates(message as BroadcastRequest)) as BroadcastRequest; - + BroadcastRequest copyWith(void Function(BroadcastRequest) updates) => super.copyWith((message) => updates(message as BroadcastRequest)) as BroadcastRequest; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static BroadcastRequest create() => BroadcastRequest._(); BroadcastRequest createEmptyInstance() => create(); @@ -1603,7 +1471,6 @@ class BroadcastRequest extends $pb.GeneratedMessage { static BroadcastRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static BroadcastRequest? _defaultInstance; - /// The raw bytes of the serialized transaction. @$pb.TagNumber(1) $core.List<$core.int> get rawTx => $_getN(0); @$pb.TagNumber(1) @@ -1615,24 +1482,23 @@ class BroadcastRequest extends $pb.GeneratedMessage { } class BroadcastResponse extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BroadcastResponse', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'txid') + ..hasRequiredFields = false + ; + + BroadcastResponse._() : super(); factory BroadcastResponse({ $core.String? txid, }) { - final $result = create(); + final _result = create(); if (txid != null) { - $result.txid = txid; + _result.txid = txid; } - return $result; + return _result; } - BroadcastResponse._() : super(); factory BroadcastResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory BroadcastResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'BroadcastResponse', createEmptyInstance: create) - ..aOS(1, _omitFieldNames ? '' : 'txid') - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -1642,10 +1508,8 @@ class BroadcastResponse extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - BroadcastResponse copyWith(void Function(BroadcastResponse) updates) => super.copyWith((message) => updates(message as BroadcastResponse)) as BroadcastResponse; - + BroadcastResponse copyWith(void Function(BroadcastResponse) updates) => super.copyWith((message) => updates(message as BroadcastResponse)) as BroadcastResponse; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static BroadcastResponse create() => BroadcastResponse._(); BroadcastResponse createEmptyInstance() => create(); @@ -1654,7 +1518,6 @@ class BroadcastResponse extends $pb.GeneratedMessage { static BroadcastResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static BroadcastResponse? _defaultInstance; - /// The transaction ID. @$pb.TagNumber(1) $core.String get txid => $_getSZ(0); @$pb.TagNumber(1) @@ -1666,39 +1529,38 @@ class BroadcastResponse extends $pb.GeneratedMessage { } class CoinswapRequest extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CoinswapRequest', createEmptyInstance: create) + ..a<$core.List<$core.int>>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'scanSecret', $pb.PbFieldType.OY) + ..a<$core.List<$core.int>>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'spendSecret', $pb.PbFieldType.OY) + ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'outputId') + ..a<$core.int>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'addrIndex', $pb.PbFieldType.OU3) + ..hasRequiredFields = false + ; + + CoinswapRequest._() : super(); factory CoinswapRequest({ $core.List<$core.int>? scanSecret, $core.List<$core.int>? spendSecret, $core.String? outputId, $core.int? addrIndex, }) { - final $result = create(); + final _result = create(); if (scanSecret != null) { - $result.scanSecret = scanSecret; + _result.scanSecret = scanSecret; } if (spendSecret != null) { - $result.spendSecret = spendSecret; + _result.spendSecret = spendSecret; } if (outputId != null) { - $result.outputId = outputId; + _result.outputId = outputId; } if (addrIndex != null) { - $result.addrIndex = addrIndex; + _result.addrIndex = addrIndex; } - return $result; + return _result; } - CoinswapRequest._() : super(); factory CoinswapRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory CoinswapRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'CoinswapRequest', createEmptyInstance: create) - ..a<$core.List<$core.int>>(1, _omitFieldNames ? '' : 'scanSecret', $pb.PbFieldType.OY) - ..a<$core.List<$core.int>>(2, _omitFieldNames ? '' : 'spendSecret', $pb.PbFieldType.OY) - ..aOS(3, _omitFieldNames ? '' : 'outputId') - ..a<$core.int>(4, _omitFieldNames ? '' : 'addrIndex', $pb.PbFieldType.OU3) - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -1708,10 +1570,8 @@ class CoinswapRequest extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - CoinswapRequest copyWith(void Function(CoinswapRequest) updates) => super.copyWith((message) => updates(message as CoinswapRequest)) as CoinswapRequest; - + CoinswapRequest copyWith(void Function(CoinswapRequest) updates) => super.copyWith((message) => updates(message as CoinswapRequest)) as CoinswapRequest; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static CoinswapRequest create() => CoinswapRequest._(); CoinswapRequest createEmptyInstance() => create(); @@ -1720,8 +1580,6 @@ class CoinswapRequest extends $pb.GeneratedMessage { static CoinswapRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static CoinswapRequest? _defaultInstance; - /// The scan secret or view key represents the account that - /// the utxo belongs to. @$pb.TagNumber(1) $core.List<$core.int> get scanSecret => $_getN(0); @$pb.TagNumber(1) @@ -1731,8 +1589,6 @@ class CoinswapRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) void clearScanSecret() => clearField(1); - /// The spend secret is the private key necessary for spending - /// the utxos belonging to the account. @$pb.TagNumber(2) $core.List<$core.int> get spendSecret => $_getN(1); @$pb.TagNumber(2) @@ -1742,7 +1598,6 @@ class CoinswapRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) void clearSpendSecret() => clearField(2); - /// Output ID of the utxo to request a coinswap for. @$pb.TagNumber(3) $core.String get outputId => $_getSZ(2); @$pb.TagNumber(3) @@ -1752,7 +1607,6 @@ class CoinswapRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) void clearOutputId() => clearField(3); - /// Address index of the utxo. @$pb.TagNumber(4) $core.int get addrIndex => $_getIZ(3); @$pb.TagNumber(4) @@ -1764,24 +1618,23 @@ class CoinswapRequest extends $pb.GeneratedMessage { } class CoinswapResponse extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CoinswapResponse', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'outputId') + ..hasRequiredFields = false + ; + + CoinswapResponse._() : super(); factory CoinswapResponse({ $core.String? outputId, }) { - final $result = create(); + final _result = create(); if (outputId != null) { - $result.outputId = outputId; + _result.outputId = outputId; } - return $result; + return _result; } - CoinswapResponse._() : super(); factory CoinswapResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory CoinswapResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'CoinswapResponse', createEmptyInstance: create) - ..aOS(1, _omitFieldNames ? '' : 'outputId') - ..hasRequiredFields = false - ; - @$core.Deprecated( 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' @@ -1791,10 +1644,8 @@ class CoinswapResponse extends $pb.GeneratedMessage { 'Using this can add significant overhead to your binary. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Will be removed in next major version') - CoinswapResponse copyWith(void Function(CoinswapResponse) updates) => super.copyWith((message) => updates(message as CoinswapResponse)) as CoinswapResponse; - + CoinswapResponse copyWith(void Function(CoinswapResponse) updates) => super.copyWith((message) => updates(message as CoinswapResponse)) as CoinswapResponse; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; - @$core.pragma('dart2js:noInline') static CoinswapResponse create() => CoinswapResponse._(); CoinswapResponse createEmptyInstance() => create(); @@ -1803,7 +1654,6 @@ class CoinswapResponse extends $pb.GeneratedMessage { static CoinswapResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static CoinswapResponse? _defaultInstance; - /// Output ID of the utxo created by the transaction. @$pb.TagNumber(1) $core.String get outputId => $_getSZ(0); @$pb.TagNumber(1) @@ -1814,6 +1664,3 @@ class CoinswapResponse extends $pb.GeneratedMessage { void clearOutputId() => clearField(1); } - -const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); -const _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names'); \ No newline at end of file diff --git a/cw_mweb/lib/mwebd.pbgrpc.dart b/cw_mweb/lib/mwebd.pbgrpc.dart index b5a2852f79..e52a5117c1 100644 --- a/cw_mweb/lib/mwebd.pbgrpc.dart +++ b/cw_mweb/lib/mwebd.pbgrpc.dart @@ -1,155 +1,185 @@ -// +/// // Generated code. Do not modify. -// source: mwebd.proto +// source: lib/mwebd.proto // // @dart = 2.12 - -// ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import +// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name import 'dart:async' as $async; + import 'dart:core' as $core; import 'package:grpc/service_api.dart' as $grpc; -import 'package:protobuf/protobuf.dart' as $pb; - import 'mwebd.pb.dart' as $0; - export 'mwebd.pb.dart'; -@$pb.GrpcServiceName('Rpc') class RpcClient extends $grpc.Client { - static final _$status = $grpc.ClientMethod<$0.StatusRequest, $0.StatusResponse>( - '/Rpc/Status', - ($0.StatusRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $0.StatusResponse.fromBuffer(value)); + static final _$status = + $grpc.ClientMethod<$0.StatusRequest, $0.StatusResponse>( + '/Rpc/Status', + ($0.StatusRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.StatusResponse.fromBuffer(value)); static final _$utxos = $grpc.ClientMethod<$0.UtxosRequest, $0.Utxo>( '/Rpc/Utxos', ($0.UtxosRequest value) => value.writeToBuffer(), ($core.List<$core.int> value) => $0.Utxo.fromBuffer(value)); - static final _$addresses = $grpc.ClientMethod<$0.AddressRequest, $0.AddressResponse>( - '/Rpc/Addresses', - ($0.AddressRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $0.AddressResponse.fromBuffer(value)); + static final _$addresses = + $grpc.ClientMethod<$0.AddressRequest, $0.AddressResponse>( + '/Rpc/Addresses', + ($0.AddressRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => + $0.AddressResponse.fromBuffer(value)); static final _$spent = $grpc.ClientMethod<$0.SpentRequest, $0.SpentResponse>( '/Rpc/Spent', ($0.SpentRequest value) => value.writeToBuffer(), ($core.List<$core.int> value) => $0.SpentResponse.fromBuffer(value)); - static final _$create = $grpc.ClientMethod<$0.CreateRequest, $0.CreateResponse>( - '/Rpc/Create', - ($0.CreateRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $0.CreateResponse.fromBuffer(value)); - static final _$psbtCreate = $grpc.ClientMethod<$0.PsbtCreateRequest, $0.PsbtResponse>( - '/Rpc/PsbtCreate', - ($0.PsbtCreateRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $0.PsbtResponse.fromBuffer(value)); - static final _$psbtAddInput = $grpc.ClientMethod<$0.PsbtAddInputRequest, $0.PsbtResponse>( - '/Rpc/PsbtAddInput', - ($0.PsbtAddInputRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $0.PsbtResponse.fromBuffer(value)); - static final _$psbtAddRecipient = $grpc.ClientMethod<$0.PsbtAddRecipientRequest, $0.PsbtResponse>( - '/Rpc/PsbtAddRecipient', - ($0.PsbtAddRecipientRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $0.PsbtResponse.fromBuffer(value)); - static final _$psbtGetRecipients = $grpc.ClientMethod<$0.PsbtGetRecipientsRequest, $0.PsbtGetRecipientsResponse>( + static final _$create = + $grpc.ClientMethod<$0.CreateRequest, $0.CreateResponse>( + '/Rpc/Create', + ($0.CreateRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.CreateResponse.fromBuffer(value)); + static final _$psbtCreate = + $grpc.ClientMethod<$0.PsbtCreateRequest, $0.PsbtResponse>( + '/Rpc/PsbtCreate', + ($0.PsbtCreateRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.PsbtResponse.fromBuffer(value)); + static final _$psbtAddInput = + $grpc.ClientMethod<$0.PsbtAddInputRequest, $0.PsbtResponse>( + '/Rpc/PsbtAddInput', + ($0.PsbtAddInputRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.PsbtResponse.fromBuffer(value)); + static final _$psbtAddRecipient = + $grpc.ClientMethod<$0.PsbtAddRecipientRequest, $0.PsbtResponse>( + '/Rpc/PsbtAddRecipient', + ($0.PsbtAddRecipientRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.PsbtResponse.fromBuffer(value)); + static final _$psbtGetRecipients = $grpc.ClientMethod< + $0.PsbtGetRecipientsRequest, $0.PsbtGetRecipientsResponse>( '/Rpc/PsbtGetRecipients', ($0.PsbtGetRecipientsRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $0.PsbtGetRecipientsResponse.fromBuffer(value)); - static final _$psbtSign = $grpc.ClientMethod<$0.PsbtSignRequest, $0.PsbtResponse>( - '/Rpc/PsbtSign', - ($0.PsbtSignRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $0.PsbtResponse.fromBuffer(value)); - static final _$psbtSignNonMweb = $grpc.ClientMethod<$0.PsbtSignNonMwebRequest, $0.PsbtResponse>( - '/Rpc/PsbtSignNonMweb', - ($0.PsbtSignNonMwebRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $0.PsbtResponse.fromBuffer(value)); - static final _$psbtExtract = $grpc.ClientMethod<$0.PsbtExtractRequest, $0.CreateResponse>( - '/Rpc/PsbtExtract', - ($0.PsbtExtractRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $0.CreateResponse.fromBuffer(value)); - static final _$ledgerExchange = $grpc.ClientMethod<$0.LedgerApdu, $0.LedgerApdu>( - '/Rpc/LedgerExchange', - ($0.LedgerApdu value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $0.LedgerApdu.fromBuffer(value)); - static final _$broadcast = $grpc.ClientMethod<$0.BroadcastRequest, $0.BroadcastResponse>( - '/Rpc/Broadcast', - ($0.BroadcastRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $0.BroadcastResponse.fromBuffer(value)); - static final _$coinswap = $grpc.ClientMethod<$0.CoinswapRequest, $0.CoinswapResponse>( - '/Rpc/Coinswap', - ($0.CoinswapRequest value) => value.writeToBuffer(), - ($core.List<$core.int> value) => $0.CoinswapResponse.fromBuffer(value)); + ($core.List<$core.int> value) => + $0.PsbtGetRecipientsResponse.fromBuffer(value)); + static final _$psbtSign = + $grpc.ClientMethod<$0.PsbtSignRequest, $0.PsbtResponse>( + '/Rpc/PsbtSign', + ($0.PsbtSignRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.PsbtResponse.fromBuffer(value)); + static final _$psbtSignNonMweb = + $grpc.ClientMethod<$0.PsbtSignNonMwebRequest, $0.PsbtResponse>( + '/Rpc/PsbtSignNonMweb', + ($0.PsbtSignNonMwebRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.PsbtResponse.fromBuffer(value)); + static final _$psbtExtract = + $grpc.ClientMethod<$0.PsbtExtractRequest, $0.CreateResponse>( + '/Rpc/PsbtExtract', + ($0.PsbtExtractRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.CreateResponse.fromBuffer(value)); + static final _$ledgerExchange = + $grpc.ClientMethod<$0.LedgerApdu, $0.LedgerApdu>( + '/Rpc/LedgerExchange', + ($0.LedgerApdu value) => value.writeToBuffer(), + ($core.List<$core.int> value) => $0.LedgerApdu.fromBuffer(value)); + static final _$broadcast = + $grpc.ClientMethod<$0.BroadcastRequest, $0.BroadcastResponse>( + '/Rpc/Broadcast', + ($0.BroadcastRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => + $0.BroadcastResponse.fromBuffer(value)); + static final _$coinswap = + $grpc.ClientMethod<$0.CoinswapRequest, $0.CoinswapResponse>( + '/Rpc/Coinswap', + ($0.CoinswapRequest value) => value.writeToBuffer(), + ($core.List<$core.int> value) => + $0.CoinswapResponse.fromBuffer(value)); RpcClient($grpc.ClientChannel channel, {$grpc.CallOptions? options, $core.Iterable<$grpc.ClientInterceptor>? interceptors}) - : super(channel, options: options, - interceptors: interceptors); + : super(channel, options: options, interceptors: interceptors); - $grpc.ResponseFuture<$0.StatusResponse> status($0.StatusRequest request, {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.StatusResponse> status($0.StatusRequest request, + {$grpc.CallOptions? options}) { return $createUnaryCall(_$status, request, options: options); } - $grpc.ResponseStream<$0.Utxo> utxos($0.UtxosRequest request, {$grpc.CallOptions? options}) { - return $createStreamingCall(_$utxos, $async.Stream.fromIterable([request]), options: options); + $grpc.ResponseStream<$0.Utxo> utxos($0.UtxosRequest request, + {$grpc.CallOptions? options}) { + return $createStreamingCall(_$utxos, $async.Stream.fromIterable([request]), + options: options); } - $grpc.ResponseFuture<$0.AddressResponse> addresses($0.AddressRequest request, {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.AddressResponse> addresses($0.AddressRequest request, + {$grpc.CallOptions? options}) { return $createUnaryCall(_$addresses, request, options: options); } - $grpc.ResponseFuture<$0.SpentResponse> spent($0.SpentRequest request, {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.SpentResponse> spent($0.SpentRequest request, + {$grpc.CallOptions? options}) { return $createUnaryCall(_$spent, request, options: options); } - $grpc.ResponseFuture<$0.CreateResponse> create($0.CreateRequest request, {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.CreateResponse> create($0.CreateRequest request, + {$grpc.CallOptions? options}) { return $createUnaryCall(_$create, request, options: options); } - $grpc.ResponseFuture<$0.PsbtResponse> psbtCreate($0.PsbtCreateRequest request, {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.PsbtResponse> psbtCreate($0.PsbtCreateRequest request, + {$grpc.CallOptions? options}) { return $createUnaryCall(_$psbtCreate, request, options: options); } - $grpc.ResponseFuture<$0.PsbtResponse> psbtAddInput($0.PsbtAddInputRequest request, {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.PsbtResponse> psbtAddInput( + $0.PsbtAddInputRequest request, + {$grpc.CallOptions? options}) { return $createUnaryCall(_$psbtAddInput, request, options: options); } - $grpc.ResponseFuture<$0.PsbtResponse> psbtAddRecipient($0.PsbtAddRecipientRequest request, {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.PsbtResponse> psbtAddRecipient( + $0.PsbtAddRecipientRequest request, + {$grpc.CallOptions? options}) { return $createUnaryCall(_$psbtAddRecipient, request, options: options); } - $grpc.ResponseFuture<$0.PsbtGetRecipientsResponse> psbtGetRecipients($0.PsbtGetRecipientsRequest request, {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.PsbtGetRecipientsResponse> psbtGetRecipients( + $0.PsbtGetRecipientsRequest request, + {$grpc.CallOptions? options}) { return $createUnaryCall(_$psbtGetRecipients, request, options: options); } - $grpc.ResponseFuture<$0.PsbtResponse> psbtSign($0.PsbtSignRequest request, {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.PsbtResponse> psbtSign($0.PsbtSignRequest request, + {$grpc.CallOptions? options}) { return $createUnaryCall(_$psbtSign, request, options: options); } - $grpc.ResponseFuture<$0.PsbtResponse> psbtSignNonMweb($0.PsbtSignNonMwebRequest request, {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.PsbtResponse> psbtSignNonMweb( + $0.PsbtSignNonMwebRequest request, + {$grpc.CallOptions? options}) { return $createUnaryCall(_$psbtSignNonMweb, request, options: options); } - $grpc.ResponseFuture<$0.CreateResponse> psbtExtract($0.PsbtExtractRequest request, {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.CreateResponse> psbtExtract( + $0.PsbtExtractRequest request, + {$grpc.CallOptions? options}) { return $createUnaryCall(_$psbtExtract, request, options: options); } - $grpc.ResponseFuture<$0.LedgerApdu> ledgerExchange($0.LedgerApdu request, {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.LedgerApdu> ledgerExchange($0.LedgerApdu request, + {$grpc.CallOptions? options}) { return $createUnaryCall(_$ledgerExchange, request, options: options); } - $grpc.ResponseFuture<$0.BroadcastResponse> broadcast($0.BroadcastRequest request, {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.BroadcastResponse> broadcast( + $0.BroadcastRequest request, + {$grpc.CallOptions? options}) { return $createUnaryCall(_$broadcast, request, options: options); } - $grpc.ResponseFuture<$0.CoinswapResponse> coinswap($0.CoinswapRequest request, {$grpc.CallOptions? options}) { + $grpc.ResponseFuture<$0.CoinswapResponse> coinswap($0.CoinswapRequest request, + {$grpc.CallOptions? options}) { return $createUnaryCall(_$coinswap, request, options: options); } } -@$pb.GrpcServiceName('Rpc') abstract class RpcServiceBase extends $grpc.Service { $core.String get $name => 'Rpc'; @@ -201,21 +231,25 @@ abstract class RpcServiceBase extends $grpc.Service { psbtAddInput_Pre, false, false, - ($core.List<$core.int> value) => $0.PsbtAddInputRequest.fromBuffer(value), + ($core.List<$core.int> value) => + $0.PsbtAddInputRequest.fromBuffer(value), ($0.PsbtResponse value) => value.writeToBuffer())); $addMethod($grpc.ServiceMethod<$0.PsbtAddRecipientRequest, $0.PsbtResponse>( 'PsbtAddRecipient', psbtAddRecipient_Pre, false, false, - ($core.List<$core.int> value) => $0.PsbtAddRecipientRequest.fromBuffer(value), + ($core.List<$core.int> value) => + $0.PsbtAddRecipientRequest.fromBuffer(value), ($0.PsbtResponse value) => value.writeToBuffer())); - $addMethod($grpc.ServiceMethod<$0.PsbtGetRecipientsRequest, $0.PsbtGetRecipientsResponse>( + $addMethod($grpc.ServiceMethod<$0.PsbtGetRecipientsRequest, + $0.PsbtGetRecipientsResponse>( 'PsbtGetRecipients', psbtGetRecipients_Pre, false, false, - ($core.List<$core.int> value) => $0.PsbtGetRecipientsRequest.fromBuffer(value), + ($core.List<$core.int> value) => + $0.PsbtGetRecipientsRequest.fromBuffer(value), ($0.PsbtGetRecipientsResponse value) => value.writeToBuffer())); $addMethod($grpc.ServiceMethod<$0.PsbtSignRequest, $0.PsbtResponse>( 'PsbtSign', @@ -229,14 +263,16 @@ abstract class RpcServiceBase extends $grpc.Service { psbtSignNonMweb_Pre, false, false, - ($core.List<$core.int> value) => $0.PsbtSignNonMwebRequest.fromBuffer(value), + ($core.List<$core.int> value) => + $0.PsbtSignNonMwebRequest.fromBuffer(value), ($0.PsbtResponse value) => value.writeToBuffer())); $addMethod($grpc.ServiceMethod<$0.PsbtExtractRequest, $0.CreateResponse>( 'PsbtExtract', psbtExtract_Pre, false, false, - ($core.List<$core.int> value) => $0.PsbtExtractRequest.fromBuffer(value), + ($core.List<$core.int> value) => + $0.PsbtExtractRequest.fromBuffer(value), ($0.CreateResponse value) => value.writeToBuffer())); $addMethod($grpc.ServiceMethod<$0.LedgerApdu, $0.LedgerApdu>( 'LedgerExchange', @@ -261,79 +297,109 @@ abstract class RpcServiceBase extends $grpc.Service { ($0.CoinswapResponse value) => value.writeToBuffer())); } - $async.Future<$0.StatusResponse> status_Pre($grpc.ServiceCall call, $async.Future<$0.StatusRequest> request) async { + $async.Future<$0.StatusResponse> status_Pre( + $grpc.ServiceCall call, $async.Future<$0.StatusRequest> request) async { return status(call, await request); } - $async.Stream<$0.Utxo> utxos_Pre($grpc.ServiceCall call, $async.Future<$0.UtxosRequest> request) async* { + $async.Stream<$0.Utxo> utxos_Pre( + $grpc.ServiceCall call, $async.Future<$0.UtxosRequest> request) async* { yield* utxos(call, await request); } - $async.Future<$0.AddressResponse> addresses_Pre($grpc.ServiceCall call, $async.Future<$0.AddressRequest> request) async { + $async.Future<$0.AddressResponse> addresses_Pre( + $grpc.ServiceCall call, $async.Future<$0.AddressRequest> request) async { return addresses(call, await request); } - $async.Future<$0.SpentResponse> spent_Pre($grpc.ServiceCall call, $async.Future<$0.SpentRequest> request) async { + $async.Future<$0.SpentResponse> spent_Pre( + $grpc.ServiceCall call, $async.Future<$0.SpentRequest> request) async { return spent(call, await request); } - $async.Future<$0.CreateResponse> create_Pre($grpc.ServiceCall call, $async.Future<$0.CreateRequest> request) async { + $async.Future<$0.CreateResponse> create_Pre( + $grpc.ServiceCall call, $async.Future<$0.CreateRequest> request) async { return create(call, await request); } - $async.Future<$0.PsbtResponse> psbtCreate_Pre($grpc.ServiceCall call, $async.Future<$0.PsbtCreateRequest> request) async { + $async.Future<$0.PsbtResponse> psbtCreate_Pre($grpc.ServiceCall call, + $async.Future<$0.PsbtCreateRequest> request) async { return psbtCreate(call, await request); } - $async.Future<$0.PsbtResponse> psbtAddInput_Pre($grpc.ServiceCall call, $async.Future<$0.PsbtAddInputRequest> request) async { + $async.Future<$0.PsbtResponse> psbtAddInput_Pre($grpc.ServiceCall call, + $async.Future<$0.PsbtAddInputRequest> request) async { return psbtAddInput(call, await request); } - $async.Future<$0.PsbtResponse> psbtAddRecipient_Pre($grpc.ServiceCall call, $async.Future<$0.PsbtAddRecipientRequest> request) async { + $async.Future<$0.PsbtResponse> psbtAddRecipient_Pre($grpc.ServiceCall call, + $async.Future<$0.PsbtAddRecipientRequest> request) async { return psbtAddRecipient(call, await request); } - $async.Future<$0.PsbtGetRecipientsResponse> psbtGetRecipients_Pre($grpc.ServiceCall call, $async.Future<$0.PsbtGetRecipientsRequest> request) async { + $async.Future<$0.PsbtGetRecipientsResponse> psbtGetRecipients_Pre( + $grpc.ServiceCall call, + $async.Future<$0.PsbtGetRecipientsRequest> request) async { return psbtGetRecipients(call, await request); } - $async.Future<$0.PsbtResponse> psbtSign_Pre($grpc.ServiceCall call, $async.Future<$0.PsbtSignRequest> request) async { + $async.Future<$0.PsbtResponse> psbtSign_Pre( + $grpc.ServiceCall call, $async.Future<$0.PsbtSignRequest> request) async { return psbtSign(call, await request); } - $async.Future<$0.PsbtResponse> psbtSignNonMweb_Pre($grpc.ServiceCall call, $async.Future<$0.PsbtSignNonMwebRequest> request) async { + $async.Future<$0.PsbtResponse> psbtSignNonMweb_Pre($grpc.ServiceCall call, + $async.Future<$0.PsbtSignNonMwebRequest> request) async { return psbtSignNonMweb(call, await request); } - $async.Future<$0.CreateResponse> psbtExtract_Pre($grpc.ServiceCall call, $async.Future<$0.PsbtExtractRequest> request) async { + $async.Future<$0.CreateResponse> psbtExtract_Pre($grpc.ServiceCall call, + $async.Future<$0.PsbtExtractRequest> request) async { return psbtExtract(call, await request); } - $async.Future<$0.LedgerApdu> ledgerExchange_Pre($grpc.ServiceCall call, $async.Future<$0.LedgerApdu> request) async { + $async.Future<$0.LedgerApdu> ledgerExchange_Pre( + $grpc.ServiceCall call, $async.Future<$0.LedgerApdu> request) async { return ledgerExchange(call, await request); } - $async.Future<$0.BroadcastResponse> broadcast_Pre($grpc.ServiceCall call, $async.Future<$0.BroadcastRequest> request) async { + $async.Future<$0.BroadcastResponse> broadcast_Pre($grpc.ServiceCall call, + $async.Future<$0.BroadcastRequest> request) async { return broadcast(call, await request); } - $async.Future<$0.CoinswapResponse> coinswap_Pre($grpc.ServiceCall call, $async.Future<$0.CoinswapRequest> request) async { + $async.Future<$0.CoinswapResponse> coinswap_Pre( + $grpc.ServiceCall call, $async.Future<$0.CoinswapRequest> request) async { return coinswap(call, await request); } - $async.Future<$0.StatusResponse> status($grpc.ServiceCall call, $0.StatusRequest request); + $async.Future<$0.StatusResponse> status( + $grpc.ServiceCall call, $0.StatusRequest request); $async.Stream<$0.Utxo> utxos($grpc.ServiceCall call, $0.UtxosRequest request); - $async.Future<$0.AddressResponse> addresses($grpc.ServiceCall call, $0.AddressRequest request); - $async.Future<$0.SpentResponse> spent($grpc.ServiceCall call, $0.SpentRequest request); - $async.Future<$0.CreateResponse> create($grpc.ServiceCall call, $0.CreateRequest request); - $async.Future<$0.PsbtResponse> psbtCreate($grpc.ServiceCall call, $0.PsbtCreateRequest request); - $async.Future<$0.PsbtResponse> psbtAddInput($grpc.ServiceCall call, $0.PsbtAddInputRequest request); - $async.Future<$0.PsbtResponse> psbtAddRecipient($grpc.ServiceCall call, $0.PsbtAddRecipientRequest request); - $async.Future<$0.PsbtGetRecipientsResponse> psbtGetRecipients($grpc.ServiceCall call, $0.PsbtGetRecipientsRequest request); - $async.Future<$0.PsbtResponse> psbtSign($grpc.ServiceCall call, $0.PsbtSignRequest request); - $async.Future<$0.PsbtResponse> psbtSignNonMweb($grpc.ServiceCall call, $0.PsbtSignNonMwebRequest request); - $async.Future<$0.CreateResponse> psbtExtract($grpc.ServiceCall call, $0.PsbtExtractRequest request); - $async.Future<$0.LedgerApdu> ledgerExchange($grpc.ServiceCall call, $0.LedgerApdu request); - $async.Future<$0.BroadcastResponse> broadcast($grpc.ServiceCall call, $0.BroadcastRequest request); - $async.Future<$0.CoinswapResponse> coinswap($grpc.ServiceCall call, $0.CoinswapRequest request); -} \ No newline at end of file + $async.Future<$0.AddressResponse> addresses( + $grpc.ServiceCall call, $0.AddressRequest request); + $async.Future<$0.SpentResponse> spent( + $grpc.ServiceCall call, $0.SpentRequest request); + $async.Future<$0.CreateResponse> create( + $grpc.ServiceCall call, $0.CreateRequest request); + $async.Future<$0.PsbtResponse> psbtCreate( + $grpc.ServiceCall call, $0.PsbtCreateRequest request); + $async.Future<$0.PsbtResponse> psbtAddInput( + $grpc.ServiceCall call, $0.PsbtAddInputRequest request); + $async.Future<$0.PsbtResponse> psbtAddRecipient( + $grpc.ServiceCall call, $0.PsbtAddRecipientRequest request); + $async.Future<$0.PsbtGetRecipientsResponse> psbtGetRecipients( + $grpc.ServiceCall call, $0.PsbtGetRecipientsRequest request); + $async.Future<$0.PsbtResponse> psbtSign( + $grpc.ServiceCall call, $0.PsbtSignRequest request); + $async.Future<$0.PsbtResponse> psbtSignNonMweb( + $grpc.ServiceCall call, $0.PsbtSignNonMwebRequest request); + $async.Future<$0.CreateResponse> psbtExtract( + $grpc.ServiceCall call, $0.PsbtExtractRequest request); + $async.Future<$0.LedgerApdu> ledgerExchange( + $grpc.ServiceCall call, $0.LedgerApdu request); + $async.Future<$0.BroadcastResponse> broadcast( + $grpc.ServiceCall call, $0.BroadcastRequest request); + $async.Future<$0.CoinswapResponse> coinswap( + $grpc.ServiceCall call, $0.CoinswapRequest request); +} diff --git a/cw_mweb/pubspec.yaml b/cw_mweb/pubspec.yaml index 94342fd8e1..ae4f4a2e9f 100644 --- a/cw_mweb/pubspec.yaml +++ b/cw_mweb/pubspec.yaml @@ -14,6 +14,8 @@ dependencies: path_provider: ^2.1.2 plugin_platform_interface: ^2.0.2 ffi: ^2.1.0 + protobuf: ^3.1.0 + fixnum: ^1.1.1 dev_dependencies: flutter_test: From 7386e1354a6b90cae0e8ee7dde95566fe77bcc30 Mon Sep 17 00:00:00 2001 From: Omar Hatem Date: Tue, 25 Nov 2025 22:18:00 +0100 Subject: [PATCH 080/105] v5.6.0 Early RC (#2647) * v5.6.0 Early RC - EVM enhancements and fee corrections - Auto node switching enhancements - Pay anything enhancements - Sync bar ETA enhancements - Solana fixes * prevent multiple creation of wallets by spam tapping the button * Last RC :3 Improve wallets performance Litecoin and MWEB support in Cupcake Ethereum and EVM chains enhancements Improved EVM fee estimation Improvements for AnyPay Better automatic node switching New navbar/tab navigation WalletConnect enhancements Add Dark and tintable app icons Bug fixes * fix: properly prevent create function from being called multiple times at once (#2679) --------- Co-authored-by: cyan --- assets/text/Monerocom_Release_Notes.txt | 7 +++++-- assets/text/Release_Notes.txt | 9 +++++++++ lib/view_model/wallet_creation_vm.dart | 15 +++++++++++++++ scripts/android/app_env.sh | 8 ++++---- scripts/ios/app_env.sh | 8 ++++---- scripts/linux/app_env.sh | 4 ++-- scripts/macos/app_env.sh | 8 ++++---- scripts/windows/build_exe_installer.iss | 2 +- 8 files changed, 44 insertions(+), 17 deletions(-) diff --git a/assets/text/Monerocom_Release_Notes.txt b/assets/text/Monerocom_Release_Notes.txt index c23b060a50..978e605de1 100644 --- a/assets/text/Monerocom_Release_Notes.txt +++ b/assets/text/Monerocom_Release_Notes.txt @@ -1,3 +1,6 @@ -Enhance Trezor support -Add Swaps.xyz Decentralized Exchange +Improve wallets performance +Improvements for AnyPay +Better automatic node switching +New navbar/tab navigation +Add Dark and tintable app icons Bug fixes \ No newline at end of file diff --git a/assets/text/Release_Notes.txt b/assets/text/Release_Notes.txt index 6772685089..7352819b81 100644 --- a/assets/text/Release_Notes.txt +++ b/assets/text/Release_Notes.txt @@ -1 +1,10 @@ +Improve wallets performance +Litecoin and MWEB support in Cupcake +Ethereum and EVM chains enhancements +Improved EVM fee estimation +Improvements for AnyPay +Better automatic node switching +New navbar/tab navigation +WalletConnect enhancements +Add Dark and tintable app icons Bug fixes \ No newline at end of file diff --git a/lib/view_model/wallet_creation_vm.dart b/lib/view_model/wallet_creation_vm.dart index a8b71b9753..60918051c4 100644 --- a/lib/view_model/wallet_creation_vm.dart +++ b/lib/view_model/wallet_creation_vm.dart @@ -64,9 +64,24 @@ abstract class WalletCreationVMBase with Store { Future typeExists(WalletType type) => walletCreationService.typeExists(type); + bool _isCreating = false; Future create({dynamic options}) async { + try { + if (_isCreating) { + printV("not creating because we don't feel like doing so"); + return; + } + _isCreating = true; + await _create(options: options); + } finally { + _isCreating = false; + } + } + + Future _create({dynamic options}) async { final type = this.type; try { + state = IsExecutingState(); if (name.isEmpty) { name = await generateName(); diff --git a/scripts/android/app_env.sh b/scripts/android/app_env.sh index 21bf2c1e99..dae628c539 100644 --- a/scripts/android/app_env.sh +++ b/scripts/android/app_env.sh @@ -14,15 +14,15 @@ TYPES=($MONERO_COM $CAKEWALLET) APP_ANDROID_TYPE=$1 MONERO_COM_NAME="Monero.com" -MONERO_COM_VERSION="5.5.1" -MONERO_COM_BUILD_NUMBER=4140 +MONERO_COM_VERSION="5.6.0" +MONERO_COM_BUILD_NUMBER=4142 MONERO_COM_BUNDLE_ID="com.monero.app" MONERO_COM_PACKAGE="com.monero.app" MONERO_COM_SCHEME="monero.com" CAKEWALLET_NAME="Cake Wallet" -CAKEWALLET_VERSION="5.5.2" -CAKEWALLET_BUILD_NUMBER=4284 +CAKEWALLET_VERSION="5.6.0" +CAKEWALLET_BUILD_NUMBER=4286 CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet" CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet" CAKEWALLET_SCHEME="cakewallet" diff --git a/scripts/ios/app_env.sh b/scripts/ios/app_env.sh index 83bd5c3f9f..348dd51acd 100644 --- a/scripts/ios/app_env.sh +++ b/scripts/ios/app_env.sh @@ -12,13 +12,13 @@ TYPES=($MONERO_COM $CAKEWALLET) APP_IOS_TYPE=$1 MONERO_COM_NAME="Monero.com" -MONERO_COM_VERSION="5.5.1" -MONERO_COM_BUILD_NUMBER=142 +MONERO_COM_VERSION="5.6.0" +MONERO_COM_BUILD_NUMBER=145 MONERO_COM_BUNDLE_ID="com.cakewallet.monero" CAKEWALLET_NAME="Cake Wallet" -CAKEWALLET_VERSION="5.5.2" -CAKEWALLET_BUILD_NUMBER=345 +CAKEWALLET_VERSION="5.6.0" +CAKEWALLET_BUILD_NUMBER=349 CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet" diff --git a/scripts/linux/app_env.sh b/scripts/linux/app_env.sh index ba8dc0bbf0..255cdedccc 100755 --- a/scripts/linux/app_env.sh +++ b/scripts/linux/app_env.sh @@ -14,8 +14,8 @@ if [ -n "$1" ]; then fi CAKEWALLET_NAME="Cake Wallet" -CAKEWALLET_VERSION="5.5.2" -CAKEWALLET_BUILD_NUMBER=72 +CAKEWALLET_VERSION="5.6.0" +CAKEWALLET_BUILD_NUMBER=73 if ! [[ " ${TYPES[*]} " =~ " ${APP_LINUX_TYPE} " ]]; then echo "Wrong app type." diff --git a/scripts/macos/app_env.sh b/scripts/macos/app_env.sh index 46c09542fc..516766ae62 100755 --- a/scripts/macos/app_env.sh +++ b/scripts/macos/app_env.sh @@ -16,13 +16,13 @@ if [ -n "$1" ]; then fi MONERO_COM_NAME="Monero.com" -MONERO_COM_VERSION="5.5.1" -MONERO_COM_BUILD_NUMBER=69 +MONERO_COM_VERSION="5.6.0" +MONERO_COM_BUILD_NUMBER=70 MONERO_COM_BUNDLE_ID="com.cakewallet.monero" CAKEWALLET_NAME="Cake Wallet" -CAKEWALLET_VERSION="5.5.2" -CAKEWALLET_BUILD_NUMBER=136 +CAKEWALLET_VERSION="5.6.0" +CAKEWALLET_BUILD_NUMBER=137 CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet" if ! [[ " ${TYPES[*]} " =~ " ${APP_MACOS_TYPE} " ]]; then diff --git a/scripts/windows/build_exe_installer.iss b/scripts/windows/build_exe_installer.iss index 4e6c12ae77..b57ae96bdf 100644 --- a/scripts/windows/build_exe_installer.iss +++ b/scripts/windows/build_exe_installer.iss @@ -1,5 +1,5 @@ #define MyAppName "Cake Wallet" -#define MyAppVersion "5.5.2" +#define MyAppVersion "5.6.0" #define MyAppPublisher "Cake Labs LLC" #define MyAppURL "https://cakewallet.com/" #define MyAppExeName "CakeWallet.exe" From c7e4a4b2b3413cbbe73e7adb46609fb5f4b69c08 Mon Sep 17 00:00:00 2001 From: OmarHatem Date: Wed, 26 Nov 2025 00:08:20 +0100 Subject: [PATCH 081/105] update build number [skip ci] --- macos/Podfile.lock | 38 +++++++++++++++++++ .../xcshareddata/xcschemes/Runner.xcscheme | 1 + scripts/android/app_env.sh | 4 +- scripts/ios/app_env.sh | 4 +- 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/macos/Podfile.lock b/macos/Podfile.lock index b7c6bf840b..3af0eb37e8 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -39,6 +39,34 @@ PODS: - FlutterMacOS - sp_scanner (0.0.1): - FlutterMacOS + - sqflite_darwin (0.0.4): + - Flutter + - FlutterMacOS + - sqlite3 (3.50.4): + - sqlite3/common (= 3.50.4) + - sqlite3/common (3.50.4) + - sqlite3/dbstatvtab (3.50.4): + - sqlite3/common + - sqlite3/fts5 (3.50.4): + - sqlite3/common + - sqlite3/math (3.50.4): + - sqlite3/common + - sqlite3/perf-threadsafe (3.50.4): + - sqlite3/common + - sqlite3/rtree (3.50.4): + - sqlite3/common + - sqlite3/session (3.50.4): + - sqlite3/common + - sqlite3_flutter_libs (0.0.1): + - Flutter + - FlutterMacOS + - sqlite3 (~> 3.50.4) + - sqlite3/dbstatvtab + - sqlite3/fts5 + - sqlite3/math + - sqlite3/perf-threadsafe + - sqlite3/rtree + - sqlite3/session - torch_dart (0.0.1): - FlutterMacOS - universal_ble (0.0.1): @@ -69,6 +97,8 @@ DEPENDENCIES: - share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`) - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) - sp_scanner (from `Flutter/ephemeral/.symlinks/plugins/sp_scanner/macos`) + - sqflite_darwin (from `Flutter/ephemeral/.symlinks/plugins/sqflite_darwin/darwin`) + - sqlite3_flutter_libs (from `Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/darwin`) - torch_dart (from `Flutter/ephemeral/.symlinks/plugins/torch_dart/macos`) - universal_ble (from `Flutter/ephemeral/.symlinks/plugins/universal_ble/darwin`) - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) @@ -77,6 +107,7 @@ DEPENDENCIES: SPEC REPOS: trunk: - OrderedSet + - sqlite3 EXTERNAL SOURCES: bitbox_flutter: @@ -117,6 +148,10 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin sp_scanner: :path: Flutter/ephemeral/.symlinks/plugins/sp_scanner/macos + sqflite_darwin: + :path: Flutter/ephemeral/.symlinks/plugins/sqflite_darwin/darwin + sqlite3_flutter_libs: + :path: Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/darwin torch_dart: :path: Flutter/ephemeral/.symlinks/plugins/torch_dart/macos universal_ble: @@ -147,6 +182,9 @@ SPEC CHECKSUMS: share_plus: 1fa619de8392a4398bfaf176d441853922614e89 shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 sp_scanner: 269d96e0ec3173e69156be7239b95182be3b8303 + sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d + sqlite3: 73513155ec6979715d3904ef53a8d68892d4032b + sqlite3_flutter_libs: 86f82662868ee26ff3451f73cac9c5fc2a1f57fa torch_dart: 2e94855e15fcc87bd824e179f1f9c3e0f1e1d302 universal_ble: cf52a7b3fd2e7c14d6d7262e9fdadb72ab6b88a6 url_launcher_macos: c82c93949963e55b228a30115bd219499a6fe404 diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index f28097b88c..e5dd4c50fe 100644 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -48,6 +48,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/scripts/android/app_env.sh b/scripts/android/app_env.sh index dae628c539..aedddc2054 100644 --- a/scripts/android/app_env.sh +++ b/scripts/android/app_env.sh @@ -15,14 +15,14 @@ APP_ANDROID_TYPE=$1 MONERO_COM_NAME="Monero.com" MONERO_COM_VERSION="5.6.0" -MONERO_COM_BUILD_NUMBER=4142 +MONERO_COM_BUILD_NUMBER=4143 MONERO_COM_BUNDLE_ID="com.monero.app" MONERO_COM_PACKAGE="com.monero.app" MONERO_COM_SCHEME="monero.com" CAKEWALLET_NAME="Cake Wallet" CAKEWALLET_VERSION="5.6.0" -CAKEWALLET_BUILD_NUMBER=4286 +CAKEWALLET_BUILD_NUMBER=4288 CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet" CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet" CAKEWALLET_SCHEME="cakewallet" diff --git a/scripts/ios/app_env.sh b/scripts/ios/app_env.sh index 348dd51acd..2cbd2a2f1e 100644 --- a/scripts/ios/app_env.sh +++ b/scripts/ios/app_env.sh @@ -13,12 +13,12 @@ APP_IOS_TYPE=$1 MONERO_COM_NAME="Monero.com" MONERO_COM_VERSION="5.6.0" -MONERO_COM_BUILD_NUMBER=145 +MONERO_COM_BUILD_NUMBER=146 MONERO_COM_BUNDLE_ID="com.cakewallet.monero" CAKEWALLET_NAME="Cake Wallet" CAKEWALLET_VERSION="5.6.0" -CAKEWALLET_BUILD_NUMBER=349 +CAKEWALLET_BUILD_NUMBER=351 CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet" From ac42ddf1878984cd531f67d8830ed47542c39ca6 Mon Sep 17 00:00:00 2001 From: OmarHatem Date: Wed, 26 Nov 2025 02:53:44 +0100 Subject: [PATCH 082/105] improve error message [skip ci] --- lib/view_model/restore/wallet_restore_from_qr_code.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/view_model/restore/wallet_restore_from_qr_code.dart b/lib/view_model/restore/wallet_restore_from_qr_code.dart index 3b4709a2f6..7ffec55feb 100644 --- a/lib/view_model/restore/wallet_restore_from_qr_code.dart +++ b/lib/view_model/restore/wallet_restore_from_qr_code.dart @@ -111,7 +111,7 @@ class WalletRestoreFromQRCode { static Future scanQRCodeForRestoring(BuildContext context) async { String? code = await presentQRScanner(context); - if (code == null) throw Exception("Unexpected scan QR code value: aborted"); + if (code == null) throw Exception("QR scan is cancelled"); if (code.isEmpty) throw Exception('Unexpected scan QR code value: value is empty'); if (code.startsWith("[")) code = code.substring(code.indexOf("]") + 1); From ac1497bd3d4c22712a31ee57721e0c0bdb1950cd Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Wed, 26 Nov 2025 13:28:03 +0100 Subject: [PATCH 083/105] fix: windows storing the db in random places (#2680) --- cw_core/lib/db/sqlite.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cw_core/lib/db/sqlite.dart b/cw_core/lib/db/sqlite.dart index fdd5892109..9e5c03f153 100644 --- a/cw_core/lib/db/sqlite.dart +++ b/cw_core/lib/db/sqlite.dart @@ -1,6 +1,7 @@ import 'dart:io'; +import 'package:cw_core/root_dir.dart'; import 'package:sqflite_common_ffi/sqflite_ffi.dart'; late Database db; @@ -9,6 +10,9 @@ Future initDb({String? pathOverride}) async { if (Platform.isLinux || Platform.isWindows) { databaseFactory = databaseFactoryFfi; } + if (Platform.isWindows) { + pathOverride ??= "${(await getAppDir()).path}/cake.db"; + } db = await openDatabase( pathOverride ?? "cake.db", version: 1, @@ -116,4 +120,4 @@ Future> _dumpDb() async { ret[tableName] = await db.query(tableName); } return ret; -} \ No newline at end of file +} From 6b725cceeb281063949e375a06d9b4e48b4615a2 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Wed, 26 Nov 2025 14:55:01 +0100 Subject: [PATCH 084/105] refactor: enhance `parseFixed` logic with `tryParseFixed` support and improve error handling in edge cases, including unit tests (#2682) --- cw_core/lib/parse_fixed.dart | 34 +++++++++++++++-- cw_core/test/parse_fixed_test.dart | 59 ++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 3 deletions(-) diff --git a/cw_core/lib/parse_fixed.dart b/cw_core/lib/parse_fixed.dart index 321320ef2c..1323b6c769 100644 --- a/cw_core/lib/parse_fixed.dart +++ b/cw_core/lib/parse_fixed.dart @@ -1,23 +1,51 @@ +/// Parses the string [value] as a fixed-point decimal literal and returns its +/// [BigInt] value. +/// +/// The number of fractional digits is determined by [decimals]. +/// +/// Returns `null` if the input [value] is not a valid fixed-point literal +/// (e.g., non-numeric characters, too many fractional digits). +/// +/// Like [parseFixed], except that this function returns `null` for invalid inputs +/// instead of throwing. +BigInt? tryParseFixed(String value, int decimals) { + try { + return parseFixed(value, decimals); + } on FormatException catch (_) { + return null; + } +} + +/// Parses the string [value] as a fixed-point decimal literal and returns its +/// [BigInt] value. +/// +/// The number of fractional digits is determined by [decimals]. +/// +/// Throws a [FormatException] if the input [value] is not a valid fixed-point literal +/// (e.g., non-numeric characters, too many fractional digits). +/// +/// Rather than throwing and immediately catching the [FormatException], +/// instead use [tryParseFixed] to handle a potential parsing error. BigInt parseFixed(String value, int decimals) { final multiplier = getMultiplier(decimals); final negative = value.startsWith("-"); if (negative) value = value.substring(1); - if (value == ".") throw Exception("missing value, value, $value"); + if (value == ".") throw FormatException("missing value, value, $value"); if (value.startsWith(".")) value = "0$value"; final comps = value.split("."); if (comps.length > 2) { - throw Exception("too many decimal points, value, $value"); + throw FormatException("too many decimal points, value, $value"); } var whole = comps.isNotEmpty ? comps[0] : "0"; var fraction = (comps.length == 2 ? comps[1] : "0").padRight(decimals, "0"); if (fraction.length > multiplier.length - 1) { - throw Exception( + throw FormatException( "fractional component exceeds decimals, underflow, parseFixed"); } diff --git a/cw_core/test/parse_fixed_test.dart b/cw_core/test/parse_fixed_test.dart index 5ce5201665..c102618e15 100644 --- a/cw_core/test/parse_fixed_test.dart +++ b/cw_core/test/parse_fixed_test.dart @@ -34,5 +34,64 @@ void main() { test('should parse -.00002 as -20', () => expect(parseFixed("-.00002", 6), BigInt.from(-20))); }); + + group('parseFixed, failing', () { + test('should fail to parse .000.0010, too many fractional digits', + () => expect(() => parseFixed(".000.0010", 6), throwsFormatException)); + + test('should fail to parse .0000010, fractional component exceeds decimals', + () => expect(() => parseFixed(".0000010", 6), throwsFormatException)); + + test('should fail to parse `.`, missing value', + () => expect(() => parseFixed(".", 6), throwsFormatException)); + }); + }); + + group('tryParseFixed', () { + group('tryParseFixed, positive', () { + test('should parse 1.000001 as 1000001', + () => expect(tryParseFixed("1.000001", 6), BigInt.from(1000001))); + + test('should parse 1 as 1000000', () => expect(tryParseFixed("1", 6), BigInt.from(1000000))); + + test( + 'should parse 1. as 1000000', () => expect(tryParseFixed("1.", 6), BigInt.from(1000000))); + + test('should parse 1.1 as 1100000', + () => expect(tryParseFixed("1.1", 6), BigInt.from(1100000))); + + test('should parse 01.1 as 1100000', + () => expect(tryParseFixed("01.1", 6), BigInt.from(1100000))); + + test('should parse 1100000 as 11000000', + () => expect(tryParseFixed("1100000", 1), BigInt.from(11000000))); + }); + + group('tryParseFixed, negative', () { + test('should parse -1.000001 as -1000001', + () => expect(tryParseFixed("-1.000001", 6), BigInt.from(-1000001))); + + test('should parse -1 as 1000000', + () => expect(tryParseFixed("-1", 6), BigInt.from(-1000000))); + }); + + group('tryParseFixed, no leading 0', () { + test('should parse .000001 as 1', () => expect(tryParseFixed(".000001", 6), BigInt.from(1))); + + test('should parse .00002 as 20', () => expect(tryParseFixed(".00002", 6), BigInt.from(20))); + + test('should parse -.00002 as -20', + () => expect(tryParseFixed("-.00002", 6), BigInt.from(-20))); + }); + + group('tryParseFixed, return `null`', () { + test('should parse .000.0010 as null, too many fractional digits', + () => expect(tryParseFixed(".000.0010", 6), isNull)); + + test('should parse .0000010 as null, fractional component exceeds decimals', + () => expect(tryParseFixed(".0000010", 6), isNull)); + + test('should parse . as `null`, missing value', () => expect(tryParseFixed(".", 6), isNull)); + }); }); } From 1d15b8e28b82e6eaa32ad5d6d6a939886c36c08c Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Wed, 26 Nov 2025 16:16:56 +0100 Subject: [PATCH 085/105] feat: enhance balance model with secondary asset handling --- cw_core/lib/crypto_currency.dart | 3 ++- lib/view_model/dashboard/balance_view_model.dart | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/cw_core/lib/crypto_currency.dart b/cw_core/lib/crypto_currency.dart index 0857c0072d..024ce0f87f 100644 --- a/cw_core/lib/crypto_currency.dart +++ b/cw_core/lib/crypto_currency.dart @@ -246,7 +246,8 @@ class CryptoCurrency extends EnumerableItem with Serializable implemen static const cbbtc = CryptoCurrency(title: 'CBBTC', tag: 'ETH', fullName: 'Coinbase Wrapped BTC', raw: 103, name: 'cbbtc', iconPath: 'assets/images/cbbtc_icon.png', decimals: 8); static const baseEth = CryptoCurrency(title: 'ETH', tag: 'BASE', fullName: 'Ethereum', raw: 104, name: 'baseth', iconPath: 'assets/images/crypto/base_icon.webp', decimals: 18); static const usde = CryptoCurrency(title: 'USDE', tag: 'BASE', fullName: 'Ethena USDE', raw: 105, name: 'usde', iconPath: 'assets/images/crypto/ethena-usde-logo.png', decimals: 18); - static const arbEth = CryptoCurrency(title: 'ETH', tag: 'ARB', fullName: 'Arbitrum', raw: 106, name: 'arbeth', iconPath: 'assets/images/crypto/arbitrum.webp', decimals: 18); + static const arbEth = CryptoCurrency(title: 'ETH', tag: 'ARB', fullName: 'Arbitrum', raw: 106, name: 'arbeth', iconPath: 'assets/images/crypto/arbitrum.webp', decimals: 18); + static const ltcmweb = CryptoCurrency(title: 'LTC', fullName: 'Litecoin MWeb', raw: 107, name: 'ltcmweb', iconPath: 'assets/images/crypto/litecoin.webp', decimals: 8); static final Map _rawCurrencyMap = [...all, ...havenCurrencies].fold>({}, (acc, item) { diff --git a/lib/view_model/dashboard/balance_view_model.dart b/lib/view_model/dashboard/balance_view_model.dart index ef203ceae6..0bf27b3417 100644 --- a/lib/view_model/dashboard/balance_view_model.dart +++ b/lib/view_model/dashboard/balance_view_model.dart @@ -31,6 +31,7 @@ class BalanceRecord { required this.fiatSecondAvailableBalance, required this.fiatSecondAdditionalBalance, required this.asset, + required this.secondAsset, required this.formattedAssetTitle, }); @@ -45,6 +46,7 @@ class BalanceRecord { final String fiatSecondAdditionalBalance; final String fiatSecondAvailableBalance; final CryptoCurrency asset; + final CryptoCurrency secondAsset; final String formattedAssetTitle; } @@ -196,6 +198,14 @@ abstract class BalanceViewModelBase with Store { @computed Map get balances { return wallet.balance.map((key, value) { + + var secondAsset = key; + if (key == CryptoCurrency.btc) { + secondAsset = CryptoCurrency.btcln; + } else if (key == CryptoCurrency.ltc) { + secondAsset = CryptoCurrency.ltcmweb; + } + if (displayMode == BalanceDisplayMode.hiddenBalance) { final fiatCurrency = settingsStore.fiatCurrency; return MapEntry( @@ -214,6 +224,7 @@ abstract class BalanceViewModelBase with Store { fiatSecondAdditionalBalance: isFiatDisabled ? '' : '${fiatCurrency.toString()} ●●●●●', asset: key, + secondAsset: secondAsset, formattedAssetTitle: _formatterAsset(key))); } final fiatCurrency = settingsStore.fiatCurrency; @@ -267,6 +278,7 @@ abstract class BalanceViewModelBase with Store { fiatSecondAvailableBalance: secondAvailableFiatBalance, fiatSecondAdditionalBalance: secondAdditionalFiatBalance, asset: key, + secondAsset: secondAsset, formattedAssetTitle: _formatterAsset(key))); }); } From 048d5217cab3fe94cb8e7f2624882d9c6cd672b8 Mon Sep 17 00:00:00 2001 From: Robert Malikowski Date: Wed, 26 Nov 2025 17:19:20 +0100 Subject: [PATCH 086/105] feat: unique card colors and icons for coins --- assets/new-ui/balance_card_icons/bitcoin.svg | 5 +++ .../new-ui/balance_card_icons/lightning.svg | 3 ++ assets/new-ui/blank.svg | 3 ++ cw_core/lib/crypto_currency.dart | 17 ++++++-- .../coins_page/cards/balance_card.dart | 2 +- .../widgets/coins_page/cards/cards_view.dart | 39 +++++++++++++------ pubspec_base.yaml | 1 + 7 files changed, 54 insertions(+), 16 deletions(-) create mode 100644 assets/new-ui/balance_card_icons/bitcoin.svg create mode 100644 assets/new-ui/balance_card_icons/lightning.svg create mode 100644 assets/new-ui/blank.svg diff --git a/assets/new-ui/balance_card_icons/bitcoin.svg b/assets/new-ui/balance_card_icons/bitcoin.svg new file mode 100644 index 0000000000..7060f10467 --- /dev/null +++ b/assets/new-ui/balance_card_icons/bitcoin.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/new-ui/balance_card_icons/lightning.svg b/assets/new-ui/balance_card_icons/lightning.svg new file mode 100644 index 0000000000..3548851d19 --- /dev/null +++ b/assets/new-ui/balance_card_icons/lightning.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/new-ui/blank.svg b/assets/new-ui/blank.svg new file mode 100644 index 0000000000..cb30dd8701 --- /dev/null +++ b/assets/new-ui/blank.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/cw_core/lib/crypto_currency.dart b/cw_core/lib/crypto_currency.dart index 024ce0f87f..2f55c7a651 100644 --- a/cw_core/lib/crypto_currency.dart +++ b/cw_core/lib/crypto_currency.dart @@ -1,5 +1,8 @@ +import 'dart:ui'; + import 'package:cw_core/currency.dart'; import 'package:cw_core/enumerable_item.dart'; +import 'package:flutter/material.dart'; class CryptoCurrency extends EnumerableItem with Serializable implements Currency { const CryptoCurrency({ @@ -12,13 +15,19 @@ class CryptoCurrency extends EnumerableItem with Serializable implemen this.tag, this.enabled = false, this.isPotentialScam = false, - }) - : super(title: title, raw: raw); + this.flatIconPath, + this.gradientStartColor = Colors.lightBlue, + this.gradientEndColor = Colors.blue, + }) : super(title: title, raw: raw); final String name; final String? tag; final String? fullName; final String? iconPath; + final String? flatIconPath; + final Color gradientStartColor; + final Color gradientEndColor; + @override final int decimals; final bool enabled; final bool isPotentialScam; @@ -141,7 +150,7 @@ class CryptoCurrency extends EnumerableItem with Serializable implemen static const ada = CryptoCurrency(title: 'ADA', fullName: 'Cardano', raw: 1, name: 'ada', iconPath: 'assets/images/ada_icon.png', decimals: 6); static const bch = CryptoCurrency(title: 'BCH', fullName: 'Bitcoin Cash', raw: 2, name: 'bch', iconPath: 'assets/images/crypto/bitcoin-cash.webp', decimals: 8); static const bnb = CryptoCurrency(title: 'BNB', tag: 'BSC', fullName: 'Binance Coin', raw: 3, name: 'bnb', iconPath: 'assets/images/bnb_icon.png', decimals: 8); - static const btc = CryptoCurrency(title: 'BTC', fullName: 'Bitcoin', raw: 4, name: 'btc', iconPath: 'assets/images/crypto/bitcoin.webp', decimals: 8); + static const btc = CryptoCurrency(title: 'BTC', fullName: 'Bitcoin', raw: 4, name: 'btc', iconPath: 'assets/images/crypto/bitcoin.webp', decimals: 8, gradientStartColor: Color(0xFFFFD000), gradientEndColor: Color(0xFFFFAA00), flatIconPath: "assets/new-ui/balance_card_icons/bitcoin.svg"); static const dai = CryptoCurrency(title: 'DAI', tag: 'ETH', fullName: 'Dai', raw: 5, name: 'dai', iconPath: 'assets/images/crypto/dai.webp', decimals: 18); static const dash = CryptoCurrency(title: 'DASH', fullName: 'Dash', raw: 6, name: 'dash', iconPath: 'assets/images/dash_icon.png', decimals: 8); static const eos = CryptoCurrency(title: 'EOS', fullName: 'EOS', raw: 7, name: 'eos', iconPath: 'assets/images/eos_icon.png', decimals: 4); @@ -202,7 +211,7 @@ class CryptoCurrency extends EnumerableItem with Serializable implemen static const scrt = CryptoCurrency(title: 'SCRT', fullName: 'Secret Network', raw: 59, name: 'scrt', iconPath: 'assets/images/scrt_icon.png', decimals: 6); static const uni = CryptoCurrency(title: 'UNI', tag: 'ETH', fullName: 'Uniswap', raw: 60, name: 'uni', iconPath: 'assets/images/uni_icon.png', decimals: 18); static const stx = CryptoCurrency(title: 'STX', fullName: 'Stacks', raw: 61, name: 'stx', iconPath: 'assets/images/stx_icon.png', decimals: 8); - static const btcln = CryptoCurrency(title: 'BTC', tag: 'LN', fullName: 'Bitcoin Lightning Network', raw: 62, name: 'btcln', iconPath: 'assets/images/crypto/bitcoin.webp', decimals: 8); + static const btcln = CryptoCurrency(title: 'BTC', tag: 'LN', fullName: 'Bitcoin Lightning Network', raw: 62, name: 'btcln', iconPath: 'assets/images/crypto/bitcoin.webp', decimals: 8, gradientStartColor: Color(0xFFE0E8FF), gradientEndColor: Color(0xFF6D8ADE), flatIconPath: "assets/new-ui/balance_card_icons/lightning.svg"); static const shib = CryptoCurrency(title: 'SHIB', tag: 'ETH', fullName: 'Shiba Inu', raw: 63, name: 'shib', iconPath: 'assets/images/shib_icon.png', decimals: 18); static const aave = CryptoCurrency(title: 'AAVE', tag: 'ETH', fullName: 'Aave', raw: 64, name: 'aave', iconPath: 'assets/images/aave_icon.png', decimals: 18); static const arb = CryptoCurrency(title: 'ARB', fullName: 'Arbitrum', raw: 65, name: 'arb', iconPath: 'assets/images/arb_icon.png', decimals: 18); diff --git a/lib/new-ui/widgets/coins_page/cards/balance_card.dart b/lib/new-ui/widgets/coins_page/cards/balance_card.dart index f05cbbca78..6ec16a75ef 100644 --- a/lib/new-ui/widgets/coins_page/cards/balance_card.dart +++ b/lib/new-ui/widgets/coins_page/cards/balance_card.dart @@ -119,7 +119,7 @@ class BalanceCard extends StatelessWidget { height: 50, width: 50, colorFilter: const ColorFilter.mode( - Color(0x44FFFFFF), + Color(0xBBFFFFFF), BlendMode.srcIn, ), ), diff --git a/lib/new-ui/widgets/coins_page/cards/cards_view.dart b/lib/new-ui/widgets/coins_page/cards/cards_view.dart index c1c4f37733..51bcd5e802 100644 --- a/lib/new-ui/widgets/coins_page/cards/cards_view.dart +++ b/lib/new-ui/widgets/coins_page/cards/cards_view.dart @@ -67,20 +67,37 @@ class _CardsViewState extends State { }); }, child: Observer(builder: (_) { + final account = widget.accountListViewModel?.accounts[index]; + + final walletBalance = + widget.dashboardViewModel.balanceViewModel.formattedBalances.elementAt(0); + final walletCurrency = + widget.lightningMode ? walletBalance.secondAsset : walletBalance.asset; + + late final String accountName; + late final String accountBalance; + if (account == null) { + accountName = walletCurrency.fullName ?? walletCurrency.title; + accountBalance = ""; + } else { + accountName = account.label; + accountBalance = account.balance ?? "0.00"; + } + + // TODO get user-selected custom gradient if set, fallback to CryptoCurrency one if null + final gradient = LinearGradient(colors: [ + walletCurrency.gradientStartColor, + walletCurrency.gradientEndColor, + ], begin: Alignment.topCenter, end: Alignment.bottomCenter); + return BalanceCard( width: cardWidth, - accountName: - (widget.accountListViewModel?.accounts[index].label) ?? "Primary account", - accountBalance: widget.accountListViewModel?.accounts[index].balance ?? "", - balanceRecord: - widget.dashboardViewModel.balanceViewModel.formattedBalances.elementAt(0), + accountName: accountName, + accountBalance: accountBalance, + balanceRecord: walletBalance, selected: _selectedIndex == index, - gradient: LinearGradient( - colors: [Colors.lightBlue, Colors.blue], - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - ), - svgPath: widget.dashboardViewModel.balanceViewModel.balances.keys.elementAt(0).iconPath!, + gradient: gradient, + svgPath: walletCurrency.flatIconPath ?? "assets/new-ui/blank.svg", lightningMode: widget.lightningMode, ); }), diff --git a/pubspec_base.yaml b/pubspec_base.yaml index 79f4acc696..826f316c18 100644 --- a/pubspec_base.yaml +++ b/pubspec_base.yaml @@ -243,6 +243,7 @@ flutter: - assets/faq/ - assets/animation/ - assets/new-ui/ + - assets/new-ui/balance_card_icons/ fonts: - family: Lato From 194c2199c1700f4861b162da94b0ad524b43c019 Mon Sep 17 00:00:00 2001 From: cyan Date: Wed, 26 Nov 2025 15:58:36 -0300 Subject: [PATCH 087/105] pass 0 as amount to prevent no element issues, it is not displayed anywhere anyway (#2684) --- cw_bitcoin/lib/litecoin_wallet.dart | 2 +- cw_bitcoin/lib/litecoin_wallet_addresses.dart | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/cw_bitcoin/lib/litecoin_wallet.dart b/cw_bitcoin/lib/litecoin_wallet.dart index 7b2412d358..91d927da00 100644 --- a/cw_bitcoin/lib/litecoin_wallet.dart +++ b/cw_bitcoin/lib/litecoin_wallet.dart @@ -1350,7 +1350,7 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store { btcTx, type, electrumClient: electrumClient, - amount: btcTx.outputs.reduce((a, b) => TxOutput(amount: a.amount + b.amount, scriptPubKey: a.scriptPubKey)).amount.toInt(), + amount: 0, fee: resp.fee.toInt(), feeRate: "", network: network, diff --git a/cw_bitcoin/lib/litecoin_wallet_addresses.dart b/cw_bitcoin/lib/litecoin_wallet_addresses.dart index fe39ab7cd1..9b32118678 100644 --- a/cw_bitcoin/lib/litecoin_wallet_addresses.dart +++ b/cw_bitcoin/lib/litecoin_wallet_addresses.dart @@ -70,7 +70,6 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with } Future ensureMwebAddressUpToIndexExists(int index) async { - printV("aaaaaa"); if (Platform.isLinux || Platform.isMacOS || Platform.isWindows) { return null; } From 4a0a336ebb05e7f87b9d3940eeaa16682bb819ff Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Wed, 26 Nov 2025 20:02:54 +0100 Subject: [PATCH 088/105] refactor: streamline validators by updating patterns and adjusting syntax for consistency (#2685) --- lib/core/amount_validator.dart | 49 +++++++++++++++------------------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/lib/core/amount_validator.dart b/lib/core/amount_validator.dart index f85df483f7..20008e357d 100644 --- a/lib/core/amount_validator.dart +++ b/lib/core/amount_validator.dart @@ -52,45 +52,38 @@ class AmountValidator extends TextValidator { class SymbolsAmountValidator extends TextValidator { SymbolsAmountValidator({required bool isAutovalidate}) : super( - errorMessage: S.current.error_text_amount, - pattern: _pattern(), - isAutovalidate: isAutovalidate, - minLength: 0, - maxLength: 0); + errorMessage: S.current.error_text_amount, + pattern: _pattern(), + isAutovalidate: isAutovalidate, + minLength: 0, + maxLength: 0, + ); static String _pattern() => '^([0-9]+([.\,][0-9]+)?|[.\,][0-9]+)\$'; } class DecimalAmountValidator extends TextValidator { - DecimalAmountValidator({required Currency currency, required bool isAutovalidate }) + DecimalAmountValidator({required Currency currency, required bool isAutovalidate}) : super( - errorMessage: S.current.decimal_places_error, - pattern: _pattern(currency), - isAutovalidate: isAutovalidate, - minLength: 0, - maxLength: 0); - - static String _pattern(Currency currency) { - switch (currency) { - case CryptoCurrency.xmr: - return '^([0-9]+([.\,][0-9]{1,12})?|[.\,][0-9]{1,12})\$'; - case CryptoCurrency.btc: - return '^([0-9]+([.\,][0-9]{1,8})?|[.\,][0-9]{1,8})\$'; - case CryptoCurrency.zano: - return '^([0-9]+([.\,][0-9]{1,12})?|[.\,][0-9]{1,18})\$'; - default: - return '^([0-9]+([.\,][0-9]{1,12})?|[.\,][0-9]{1,12})\$'; - } - } + errorMessage: S.current.decimal_places_error, + pattern: _pattern(currency), + isAutovalidate: isAutovalidate, + minLength: 0, + maxLength: 0, + ); + + static String _pattern(Currency currency) => + '^([0-9]+([.\,][0-9]{1,${currency.decimals})?|[.\,][0-9]{1,${currency.decimals}})\$'; } class AllAmountValidator extends TextValidator { AllAmountValidator() : super( - errorMessage: S.current.error_text_amount, - pattern: S.current.all, - minLength: 0, - maxLength: 0); + errorMessage: S.current.error_text_amount, + pattern: S.current.all, + minLength: 0, + maxLength: 0, + ); } class AmountMinValidator extends Validator { From 5fa2bf37ad90dc77525989a1990aa49b33097fd2 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Thu, 27 Nov 2025 13:57:56 +0100 Subject: [PATCH 089/105] fix: the amount validation regex (#2688) --- lib/core/amount_validator.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/core/amount_validator.dart b/lib/core/amount_validator.dart index 20008e357d..0f27a1331f 100644 --- a/lib/core/amount_validator.dart +++ b/lib/core/amount_validator.dart @@ -73,7 +73,7 @@ class DecimalAmountValidator extends TextValidator { ); static String _pattern(Currency currency) => - '^([0-9]+([.\,][0-9]{1,${currency.decimals})?|[.\,][0-9]{1,${currency.decimals}})\$'; + '^([0-9]+([.\,][0-9]{1,${currency.decimals}})?|[.\,][0-9]{1,${currency.decimals}})\$'; } class AllAmountValidator extends TextValidator { From ae81b11f99730e023a8134a229184f6def261bcf Mon Sep 17 00:00:00 2001 From: OmarHatem Date: Fri, 28 Nov 2025 19:14:36 +0100 Subject: [PATCH 090/105] minor fixes [skip ci] --- assets/text/Release_Notes.txt | 2 +- lib/src/screens/ur/animated_ur_page.dart | 2 +- lib/utils/exception_handler.dart | 2 +- scripts/android/app_env.sh | 4 ++-- scripts/ios/app_env.sh | 4 ++-- scripts/linux/app_env.sh | 2 +- scripts/macos/app_env.sh | 4 ++-- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/assets/text/Release_Notes.txt b/assets/text/Release_Notes.txt index 7352819b81..2ee3110dfa 100644 --- a/assets/text/Release_Notes.txt +++ b/assets/text/Release_Notes.txt @@ -1,5 +1,5 @@ Improve wallets performance -Litecoin and MWEB support in Cupcake +Litecoin and MWEB support in Cupcake Android Ethereum and EVM chains enhancements Improved EVM fee estimation Improvements for AnyPay diff --git a/lib/src/screens/ur/animated_ur_page.dart b/lib/src/screens/ur/animated_ur_page.dart index ea23834026..0a8c950f68 100644 --- a/lib/src/screens/ur/animated_ur_page.dart +++ b/lib/src/screens/ur/animated_ur_page.dart @@ -68,7 +68,7 @@ class AnimatedURPage extends BasePage { .contains(urQrType)) ...{ Spacer(), Padding( - padding: const EdgeInsets.symmetric(horizontal: 16.0), + padding: const EdgeInsets.all(16.0), child: SizedBox( width: double.maxFinite, child: PrimaryButton( diff --git a/lib/utils/exception_handler.dart b/lib/utils/exception_handler.dart index cc91026e2f..edb5fe7767 100644 --- a/lib/utils/exception_handler.dart +++ b/lib/utils/exception_handler.dart @@ -286,7 +286,7 @@ class ExceptionHandler { // probably when the device was locked and then opened on Cake // this is solved by a restart of the app // just ignoring until we find a solution to this issue or migrate from flutter secure storage - "core/auth_service.dart:64", + "core/auth_service.dart:92", "core/key_service.dart:14", "Wallet is null", "Wrong Device Status: 0x5515 (UNKNOWN)", diff --git a/scripts/android/app_env.sh b/scripts/android/app_env.sh index aedddc2054..6aaed83a29 100644 --- a/scripts/android/app_env.sh +++ b/scripts/android/app_env.sh @@ -15,14 +15,14 @@ APP_ANDROID_TYPE=$1 MONERO_COM_NAME="Monero.com" MONERO_COM_VERSION="5.6.0" -MONERO_COM_BUILD_NUMBER=4143 +MONERO_COM_BUILD_NUMBER=4145 MONERO_COM_BUNDLE_ID="com.monero.app" MONERO_COM_PACKAGE="com.monero.app" MONERO_COM_SCHEME="monero.com" CAKEWALLET_NAME="Cake Wallet" CAKEWALLET_VERSION="5.6.0" -CAKEWALLET_BUILD_NUMBER=4288 +CAKEWALLET_BUILD_NUMBER=4291 CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet" CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet" CAKEWALLET_SCHEME="cakewallet" diff --git a/scripts/ios/app_env.sh b/scripts/ios/app_env.sh index 2cbd2a2f1e..8889d1d0a4 100644 --- a/scripts/ios/app_env.sh +++ b/scripts/ios/app_env.sh @@ -13,12 +13,12 @@ APP_IOS_TYPE=$1 MONERO_COM_NAME="Monero.com" MONERO_COM_VERSION="5.6.0" -MONERO_COM_BUILD_NUMBER=146 +MONERO_COM_BUILD_NUMBER=148 MONERO_COM_BUNDLE_ID="com.cakewallet.monero" CAKEWALLET_NAME="Cake Wallet" CAKEWALLET_VERSION="5.6.0" -CAKEWALLET_BUILD_NUMBER=351 +CAKEWALLET_BUILD_NUMBER=354 CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet" diff --git a/scripts/linux/app_env.sh b/scripts/linux/app_env.sh index 255cdedccc..70823d1cdc 100755 --- a/scripts/linux/app_env.sh +++ b/scripts/linux/app_env.sh @@ -15,7 +15,7 @@ fi CAKEWALLET_NAME="Cake Wallet" CAKEWALLET_VERSION="5.6.0" -CAKEWALLET_BUILD_NUMBER=73 +CAKEWALLET_BUILD_NUMBER=74 if ! [[ " ${TYPES[*]} " =~ " ${APP_LINUX_TYPE} " ]]; then echo "Wrong app type." diff --git a/scripts/macos/app_env.sh b/scripts/macos/app_env.sh index 516766ae62..ac382f2d4c 100755 --- a/scripts/macos/app_env.sh +++ b/scripts/macos/app_env.sh @@ -17,12 +17,12 @@ fi MONERO_COM_NAME="Monero.com" MONERO_COM_VERSION="5.6.0" -MONERO_COM_BUILD_NUMBER=70 +MONERO_COM_BUILD_NUMBER=71 MONERO_COM_BUNDLE_ID="com.cakewallet.monero" CAKEWALLET_NAME="Cake Wallet" CAKEWALLET_VERSION="5.6.0" -CAKEWALLET_BUILD_NUMBER=137 +CAKEWALLET_BUILD_NUMBER=138 CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet" if ! [[ " ${TYPES[*]} " =~ " ${APP_MACOS_TYPE} " ]]; then From 86f30a216cdd82d9fd8bde88fdebf0fbcd468b71 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Mon, 1 Dec 2025 21:43:46 +0100 Subject: [PATCH 091/105] fix: crypto amount calculation logic with max decimals (#2697) * fix: crypto amount calculation logic with max decimals * refactor: remove `_setCryptoNumMaximumFractionDigits` and `_cryptoNumberFormat` to simplify `OutputBase` logic --- cw_core/lib/crypto_currency.dart | 17 +++++++++-- lib/view_model/send/output.dart | 52 +++++--------------------------- 2 files changed, 21 insertions(+), 48 deletions(-) diff --git a/cw_core/lib/crypto_currency.dart b/cw_core/lib/crypto_currency.dart index b35531b724..68066b12ad 100644 --- a/cw_core/lib/crypto_currency.dart +++ b/cw_core/lib/crypto_currency.dart @@ -1,6 +1,9 @@ import 'package:cw_core/currency.dart'; import 'package:cw_core/enumerable_item.dart'; import 'package:collection/collection.dart'; +import 'package:cw_core/parse_fixed.dart'; + +import 'format_fixed.dart'; class CryptoCurrency extends EnumerableItem with Serializable implements Currency { const CryptoCurrency({ @@ -394,7 +397,15 @@ class CryptoCurrency extends EnumerableItem with Serializable implemen @override String toString() => title; - bool titleAndTagEqual(CryptoCurrency other) { - return title == other.title && tag == other.tag; - } + bool titleAndTagEqual(CryptoCurrency other) => title == other.title && tag == other.tag; + + /// Format the raw amount into its decimal representation eg. turn Sats into Bitcoin + String formatAmount(BigInt amount, {int? fractionalDigits, bool trimZeros = true}) => + formatFixed(amount, decimals, fractionalDigits: fractionalDigits, trimZeros: trimZeros); + + /// Parse the [value] and turn it into the smallest denomination eg. turn Bitcoin into Sats + BigInt parseAmount(String value) => parseFixed(value, decimals); + + /// Try parsing the [value] and turn it into the smallest denomination eg. turn Bitcoin into Sats + BigInt? tryParseAmount(String value) => tryParseFixed(value, decimals); } diff --git a/lib/view_model/send/output.dart b/lib/view_model/send/output.dart index 0badd16df9..c2e69dfcbe 100644 --- a/lib/view_model/send/output.dart +++ b/lib/view_model/send/output.dart @@ -19,7 +19,6 @@ import 'package:cw_core/transaction_history.dart'; import 'package:cw_core/transaction_info.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; import 'package:mobx/mobx.dart'; import 'package:cw_core/wallet_base.dart'; import 'package:cake_wallet/monero/monero.dart'; @@ -42,8 +41,7 @@ class Output = OutputBase with _$Output; abstract class OutputBase with Store { OutputBase( this._wallet, this._settingsStore, this._fiatConversationStore, this.cryptoCurrencyHandler) - : _cryptoNumberFormat = NumberFormat(cryptoNumberPattern), - key = UniqueKey(), + : key = UniqueKey(), sendAll = false, cryptoAmount = '', cryptoFullBalance = '', @@ -53,7 +51,6 @@ abstract class OutputBase with Store { extractedAddress = '', estimatedFee = '0.0', parsedAddress = ParsedAddress(addresses: []) { - _setCryptoNumMaximumFractionDigits(); autorun((_) { final status = _wallet.syncStatus; printV("Sync status changed to $status. Recalculating fees"); @@ -289,7 +286,6 @@ abstract class OutputBase with Store { WalletBase, TransactionInfo> _wallet; final SettingsStore _settingsStore; final FiatConversionStore _fiatConversationStore; - final NumberFormat _cryptoNumberFormat; @action void setSendAll(String fullBalance) { @@ -302,7 +298,6 @@ abstract class OutputBase with Store { void updateWallet( WalletBase, TransactionInfo> newWallet) { _wallet = newWallet; - _setCryptoNumMaximumFractionDigits(); } @action @@ -355,11 +350,12 @@ abstract class OutputBase with Store { @action void _updateCryptoAmount() { try { - final crypto = double.parse(fiatAmount.replaceAll(',', '.')) / - _fiatConversationStore.prices[cryptoCurrencyHandler()]!; - final cryptoAmountTmp = _cryptoNumberFormat.format(crypto); - if (cryptoAmount != cryptoAmountTmp) { - cryptoAmount = cryptoAmountTmp; + final crypto = (double.parse(fiatAmount.replaceAll(',', '.')) / + _fiatConversationStore.prices[cryptoCurrencyHandler()]!) + .toStringAsFixed(cryptoCurrencyHandler().decimals); + + if (cryptoAmount != crypto) { + cryptoAmount = crypto; } } catch (e) { cryptoAmount = ''; @@ -375,40 +371,6 @@ abstract class OutputBase with Store { return fields; } - void _setCryptoNumMaximumFractionDigits() { - var maximumFractionDigits = 0; - - switch (_wallet.type) { - case WalletType.monero: - case WalletType.ethereum: - case WalletType.polygon: - case WalletType.base: - case WalletType.arbitrum: - case WalletType.solana: - case WalletType.tron: - case WalletType.haven: - case WalletType.zano: - case WalletType.nano: - case WalletType.decred: - maximumFractionDigits = 12; - break; - case WalletType.bitcoin: - case WalletType.litecoin: - case WalletType.bitcoinCash: - case WalletType.dogecoin: - maximumFractionDigits = 8; - break; - case WalletType.wownero: - maximumFractionDigits = 11; - break; - case WalletType.none: - case WalletType.banano: - break; - } - - _cryptoNumberFormat.maximumFractionDigits = maximumFractionDigits; - } - Future fetchParsedAddress(BuildContext context) async { final domain = address; final currency = cryptoCurrencyHandler(); From 76afa2e990cfa8c93dcc2b83f1eecc61ffdad855 Mon Sep 17 00:00:00 2001 From: Eric Lee <98399372+EricLeeaaaaa@users.noreply.github.com> Date: Tue, 2 Dec 2025 06:43:01 +0800 Subject: [PATCH 092/105] Improve Chinese (Simplified) translations in strings_zh.arb for naturalness and crypto terminology consistency (#2692) --- res/values/strings_zh.arb | 790 +++++++++++++++++++------------------- 1 file changed, 395 insertions(+), 395 deletions(-) diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index e25e7e18f6..88aca50fb1 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -1,217 +1,217 @@ { - "about_cake_pay": "Cake Pay 让您可以轻松购买带有虚拟资产的礼品卡,可立即在美国超过 150,000 家商家消费。", - "accent_color": "口音颜色", - "account": "帐户", + "about_cake_pay": "Cake Pay 让您轻松用加密资产购买礼品卡,可立即在美国 150,000+ 家商家消费。", + "accent_color": "强调色", + "account": "账户", "accounts": "账户", "accounts_subaddresses": "账户和子地址", "activate": "激活", "active": "活跃", "active_cards": "活动卡", - "activeConnectionsPrompt": "活动连接将出现在这里", + "activeConnectionsPrompt": "活跃连接将显示在这里", "add": "添加", - "add_contact": "增加联系人", - "add_contact_to_address_book": "您想将此联系人添加到您的通讯录中吗?", + "add_contact": "添加联系人", + "add_contact_to_address_book": "您想将此联系人添加到地址簿中吗?", "add_custom_node": "添加新的自定义节点", - "add_custom_redemption": "添加自定义兑换", + "add_custom_redemption": "添加自定义赎回", "add_fund_to_card": "向卡中添加预付资金(最多 ${value})", "add_new_node": "添加新节点", "add_new_word": "添加新词", - "add_passphrase": "添加密码", - "add_passphrase_warning_text": "仅当您过去曾经为此钱包使用一个时,才输入密码。如果您在此钱包上输入错误的密码短语或在此钱包上之前没有使用过密码,则不会看到任何现有的资金或历史记录。", - "add_receiver": "添加另一個接收器(可選)", + "add_passphrase": "添加密码短语", + "add_passphrase_warning_text": "仅当您过去为此钱包使用过密码短语时,才输入它。如果输入错误的密码短语,或此钱包之前从未使用过,您将看不到现有余额或历史记录。", + "add_receiver": "添加另一个接收者(可选)", "add_secret_code": "或者,将此密码添加到身份验证器应用程序中", "add_tip": "添加提示", "add_token": "添加令牌", "add_token_disclaimer_check": "我已使用信誉良好的来源确认了代币合约地址和信息。 添加恶意或不正确的信息可能会导致资金损失。", - "add_token_warning": "请勿按照诈骗者的指示编辑或添加令牌。 始终通过信誉良好的来源确认代币地址!", - "add_value": "增加价值", - "added_message_for_ata_error": "请确保您有足够的SOL余额来完成交易。", + "add_token_warning": "勿按诈骗者指示编辑或添加代币!始终通过可靠来源验证合约地址。", + "add_value": "添加金额", + "added_message_for_ata_error": "请确保您有足够的 SOL 余额来完成交易。", "address": "地址", "address_book": "地址簿", "address_book_menu": "地址簿", - "address_detected": "檢測到地址", - "address_from_domain": "此地址來自 Unstoppable Domains 上的 ${domain}", - "address_from_yat": "此地址來自 Yat 上的 ${emoji}", - "address_label": "Address label", - "address_remove_contact": "刪除联系人", - "address_remove_content": "您确定要刪除所选的联系人吗?", + "address_detected": "检测到地址", + "address_from_domain": "此地址来自 Unstoppable Domains 上的 ${domain}", + "address_from_yat": "此地址来自 Yat 上的 ${emoji}", + "address_label": "地址标签", + "address_remove_contact": "删除联系人", + "address_remove_content": "您确定要删除所选联系人吗?", "addresses": "地址", "advanced_settings": "高级设置", - "aggressive": "过分热心", + "aggressive": "激进", "agree": "同意", "agree_and_continue": "同意并继续", "agree_to": "创建账户即表示您同意 ", "alert_notice": "注意", "all": "全部", - "all_coins": "所有硬币", - "all_trades": "所有的变化", + "all_coins": "所有币种", + "all_trades": "所有交易", "all_transactions": "所有交易", "alphabetical": "按字母顺序", "already_have_account": "已经有账号了?", "always": "总是", - "amount": "金额: ", - "amount_is_below_minimum_limit": "您的余额费用将小于交易所所需的最低金额(${min})", + "amount": "金额:", + "amount_is_below_minimum_limit": "扣除手续费后余额低于交换最低限额(${min})", "amount_is_estimate": "收款金额为估算值", "amount_is_guaranteed": "保证收到的金额", "and": "和", - "anonpay_description": "生成 ${type}。收款人可以使用任何受支持的加密货币 ${method},您将在此钱包中收到资金。", + "anonpay_description": "生成 ${type}。收款人可用任何支持的加密货币进行 ${method},您将在此钱包中收到资金。", "apk_update": "APK更新", - "appearance": "外貌", + "appearance": "外观", "approve": "批准", "approve_request": "批准请求", "approve_tokens": "批准令牌", "apps": "应用程序", "arbiscan_history": "ArbiScan 历史", "arrive_in_this_address": "${currency} ${tag}将到达此地址", - "ascending": "上升", - "ask_each_time": "每次问", + "ascending": "升序", + "ask_each_time": "每次询问", "auth_store_ban_timeout": "禁止超时", "auth_store_banned_for": "禁止 ", "auth_store_banned_minutes": " 分钟", - "auth_store_incorrect_password": "PIN码错误", + "auth_store_incorrect_password": "PIN 错误", "authenticated": "已认证", - "authentication": "认证方式", + "authentication": "身份验证", "auto_generate_addresses": "自动生成地址", - "auto_generate_subaddresses": "自动生成子辅助", - "automatic": "自动的", + "auto_generate_subaddresses": "自动生成子地址", + "automatic": "自动", "available_balance": "可用余额", - "available_balance_description": "可用余额是您可以使用的金额。冻结余额是您当前正在等待确认的金额。", + "available_balance_description": "“可用余额”或“确认余额”指立即可花费资金。若下余额显示但上余额未更新,请等待几分钟网络确认。确认后即可花费。", "avg_savings": "平均储蓄", "awaitDAppProcessing": "请等待 dApp 处理完成。", "awaiting_payment_confirmation": "等待付款确认", - "background_sync": "背景同步", + "background_sync": "后台同步", "background_sync_mode": "后台同步模式", - "background_sync_on_battery_low": "在低电池上同步", + "background_sync_on_battery_low": "低电量时同步", "background_sync_on_charging": "仅在充电时同步", "background_sync_on_device_idle": "仅在不使用设备时同步", - "background_sync_on_unmetered_network": "需要未经许可的网络", + "background_sync_on_unmetered_network": "仅在不限流量网络时同步", "backup": "备份", "backup_file": "备份文件", "backup_password": "备份密码", - "balance": "平衡", + "balance": "余额", "balance_page": "余额页", "basescan_history": "Basescan历史", "bill_amount": "账单金额", "billing_address_info": "如果要求提供帐单地址,请提供您的送货地址", "biometric_auth_reason": "扫描指纹进行身份认证", - "bitcoin_dark_theme": "比特币黑暗主题", + "bitcoin_dark_theme": "比特币深色主题", "bitcoin_light_theme": "比特币浅色主题", "bitcoin_payments_require_1_confirmation": "比特币支付需要 1 次确认,这可能需要 20 分钟或更长时间。谢谢你的耐心!确认付款后,您将收到电子邮件。", - "block_height": "块高度", - "block_remaining": "剩下1个块", - "Blocks_remaining": "${status} 剩余的块", + "block_height": "区块高度", + "block_remaining": "剩余 1 个区块", + "Blocks_remaining": "剩余 ${status} 区块", "bluetooth": "蓝牙", "bright_theme": "明亮", - "bump_fee": "撞费", + "bump_fee": "追加手续费(RBF)", "buy": "购买", - "buy_alert_content": "目前我们仅支持购买比特币、以太坊、莱特币和门罗币。请创建或切换到您的比特币、以太坊、莱特币或门罗币钱包。", + "buy_alert_content": "目前仅支持购买比特币、以太坊、莱特币和门罗币。请创建或切换相应钱包。", "buy_bitcoin": "购买比特币", "buy_now": "立即购买", - "buy_provider_unavailable": "提供者目前不可用。", - "buy_sell_pair_is_not_supported_warning": "此货币对不受任何提供商的支持。请选择另一对或尝试更改付款方式。", - "buy_with": "一起购买", + "buy_provider_unavailable": "该购买渠道暂时不可用", + "buy_sell_pair_is_not_supported_warning": "所选支付方式不支持此交易对。请更换交易对或支付方式。", + "buy_with": "用…购买", "by_cake_pay": "通过 Cake Pay", - "cake_2fa_preset": "蛋糕 2FA 预设", - "cake_dark_theme": "蛋糕黑暗主题", - "cake_pay_account_note": "只需使用電子郵件地址註冊即可查看和購買卡片。有些甚至可以打折!", + "cake_2fa_preset": "Cake 2FA 预设", + "cake_dark_theme": "Cake深色主题", + "cake_pay_account_note": "只需邮箱即可浏览和购买礼品卡,部分还有折扣!", "cake_pay_card_email_delivered_message": "您的礼品卡将在必要的确认后通过电子邮件发送。", - "cake_pay_learn_more": "立即在应用中购买和兑换礼品卡!\n从左向右滑动以了解详情。", - "cake_pay_save_order": "该卡应在1个工作日内发送到您的电子邮件\n保存您的订单ID:", + "cake_pay_learn_more": "立即购买和使用礼品卡!\n向右滑动了解更多 →", + "cake_pay_save_order": "礼品卡将在 1 个工作日内发送至您的邮箱。\n保存订单 ID:", "cake_pay_subtitle": "购买全球预付费卡和礼品卡", "cake_pay_web_cards_subtitle": "购买全球预付卡和礼品卡", - "cake_pay_web_cards_title": "蛋糕支付网络卡", + "cake_pay_web_cards_title": "Cake Pay 网页卡", "cake_seeds_save_disclaimer": "请在安全的地方保存这些单词!您将需要这些单词来恢复新设备上的钱包。", "cake_wallet": "Cake Wallet", - "cakepay_confirm_no_vpn": "我确认我不使用代理或VPN", - "cakepay_confirm_purchase": "确认购买", + "cakepay_confirm_no_vpn": "我确认未启用 VPN 或代理", + "cakepay_confirm_purchase": "确定购买", "cakepay_confirm_terms_agreed": "我同意此处介绍的条款和条件:", "cakepay_confirm_voided_refund": "我了解限制国家的赎回尝试将使任何退款无效", - "cakepay_ios_not_available": "抱歉,这张礼品卡在iOS上不可用。您可以在Android或通过我们的网站上购买它。", - "cakepay_prepaid_card": "CakePay 预付借记卡", + "cakepay_ios_not_available": "抱歉,这张卡在 iOS 上不可用,您可在 Android 或网页版购买", + "cakepay_prepaid_card": "Cake Pay 预付卡(虚拟/实体)", "camera_consent": "${provider} 将使用您的相机拍摄图像以供识别之用。请查看他们的隐私政策了解详情。", - "camera_permission_is_required": "需要相机许可。\n请从应用程序设置中启用它。", + "camera_permission_is_required": "需要相机权限。\n请在应用设置中启用它。", "cancel": "取消", "cannot_verify": "无法验证", "cannot_verify_description": "该域无法验证。批准之前,请仔细检查请求。", "card_address": "地址:", "cardholder_agreement": "持卡人协议", "cards": "卡片", - "chain_id": "连锁ID", - "chains": "链条", + "chain_id": "链ID", + "chains": "链", "change": "更改", - "change_backup_password_alert": "您以前的备份文件将无法使用新的备份密码導入。 新的备份密码将仅用于新的备份文件。 您确定要更改备份密码吗?", + "change_backup_password_alert": "您以前的备份文件将无法使用新的备份密码导入。新的备份密码将仅用于新的备份文件。您确定要更改备份密码吗?", "change_currency": "更改币种", - "change_current_node": "您确定将当前节点更改为 ${node}?", + "change_current_node": "您确定将当前节点更改为${node}吗?", "change_current_node_title": "更改当前节点", - "change_exchange_provider": "更改交换提供商", - "change_language": "修改语言", - "change_language_to": "修改语言为 ${language}?", + "change_exchange_provider": "更改兑换服务商", + "change_language": "更改语言", + "change_language_to": "更改语言为 ${language}?", "change_password": "更改密码", - "change_rep": "变革代表", - "change_rep_message": "您确定要更换代表吗?", - "change_rep_successful": "成功改变了代表", - "change_selected_exchanges": "更改选定的交换", - "change_selected_pair": "更改选定对", - "change_wallet_alert_content": "您是否想将当前钱包改为 ${wallet_name}?", + "change_rep": "更换代表节点", + "change_rep_message": "您确定要更换代表节点吗?", + "change_rep_successful": "成功更换了代表节点", + "change_selected_exchanges": "更改所选兑换", + "change_selected_pair": "更改所选交易对", + "change_wallet_alert_content": "是否要将当前钱包切换为 ${wallet_name}?", "change_wallet_alert_title": "更换当前钱包", "choose_a_payment_method": "选择付款方式", "choose_a_provider": "选择一个提供商", "choose_account": "选择账户", - "choose_address": "\n\n請選擇地址:", + "choose_address": "\n\n请选择地址:", "choose_card_value": "选择卡值", - "choose_derivation": "选择钱包推导", + "choose_derivation": "选择钱包派生", "choose_from_available_options": "从可用选项中选择:", "choose_one": "选一个", "choose_qr_code_format": "选择QR码格式", "choose_qr_code_format_note": "为您的硬件钱包选择正确的格式:", - "choose_relay": "请选择要使用的继电器", + "choose_relay": "请选择要使用的中继节点", "choose_wallet_currency": "请选择钱包货币:", "choose_wallet_group": "选择钱包组", "clear": "清空", "clearnet_link": "明网链接", "close": "关闭", - "coin_control": "硬幣控制(可選)", - "cold_or_recover_wallet": "从Cupcake或冷钱包中添加只读的钱包或恢复纸钱包", - "collection_address": "收集地址", + "coin_control": "选币控制(可选)", + "cold_or_recover_wallet": "添加只读钱包(来自Cupcake或冷钱包)或恢复纸钱包", + "collection_address": "集合地址", "collection_description": "集合描述", - "collection_name": "收集名称", + "collection_name": "集合名称", "color_theme": "主题", "coming_soon_tag": "即将推出", "commit_transaction_amount_fee": "提交交易\n金额: ${amount}\n手续费: ${fee}", "confirm": "确认", - "confirm_delete_template": "此操作将刪除此模板。确定吗?", - "confirm_delete_wallet": "此操作将刪除此钱包。确定吗?", + "confirm_delete_template": "此操作将删除此模板。确定吗?", + "confirm_delete_wallet": "此操作将删除此钱包。确定吗?", "confirm_fee_deduction": "确认费用扣除", - "confirm_fee_deduction_content": "您是否同意从产出中扣除费用?", - "confirm_passphrase": "确认密码", + "confirm_fee_deduction_content": "您是否同意从收款金额中扣除费用?", + "confirm_passphrase": "确认密语", "confirm_sending": "确认发送", - "confirm_silent_payments_switch_node": "您当前的节点不支持无声付款\\ ncake钱包将切换到兼容节点,仅用于扫描", + "confirm_silent_payments_switch_node": "当前节点不支持静默支付。\n\nCake Wallet 将切换至兼容节点进行扫描。", "confirm_transaction": "确认交易", "confirmations": "确认", "confirmed": "确认余额", - "confirmed_tx": "确认的", + "confirmed_tx": "已确认", "congratulations": "恭喜!", - "connect_an_existing_yat": "連接現有 Yat", + "connect_an_existing_yat": "连接现有 Yat", "connect_hw_info_step_1": "确保您的设备已上电。", "connect_hw_info_step_2": "为这两个设备打开蓝牙,然后将它们配对,或使用USB电缆将设备连接在一起。", "connect_hw_info_step_3": "解锁设备并导航到所需的加密应用程序。", - "connect_hw_info_step_4": "在蛋糕钱包中选择您的设备,然后继续设置。", + "connect_hw_info_step_4": "在 Cake Wallet 中选择您的设备,然后继续设置。", "connect_yats": "连接 Yats", "connect_your_hardware_wallet": "使用蓝牙或USB连接硬件钱包", "connect_your_hardware_wallet_ble": "使用蓝牙连接硬件钱包", "connect_your_hardware_wallet_usb": "使用USB连接硬件钱包", - "connected": "连接", + "connected": "已连接", "connection_sync": "连接和同步", "connectWalletPrompt": "将您的钱包与 WalletConnect 连接以进行交易", "contact": "联系", "contact_list_contacts": "联系人", "contact_list_wallets": "我的钱包", "contact_name": "联系人姓名", - "contact_name_exists": "已存在具有该名称的联系人。请选择不同的名称。", + "contact_name_exists": "已有同名联系人,请换个名字", "contact_support": "联系支持", "continue_text": "继续", - "contract_address": "合同地址", - "contract_warning": "该合同地址已被标记为潜在的欺诈性。请谨慎行事。", + "contract_address": "合约地址", + "contract_warning": "该合约地址已被标记为潜在的欺诈性。请谨慎行事。", "contractName": "合约名称", "contractSymbol": "合约符号", "copied_key_to_clipboard": "复制 ${key} 到剪贴板", @@ -219,7 +219,7 @@ "copy": "复制", "copy_address": "复制地址", "copy_id": "复制ID", - "copy_payjoin_address": "复制工资公司地址", + "copy_payjoin_address": "复制Payjoin地址", "copy_payjoin_url": "复制Payjoin url", "copyWalletConnectLink": "从 dApp 复制 WalletConnect 链接并粘贴到此处", "corrupted_seed_notice": "该钱包的文件被损坏,无法打开。请查看种子短语,保存并恢复钱包。\n\n如果该值为空,则种子无法正确恢复。", @@ -230,7 +230,7 @@ "create_invoice": "创建发票", "create_new": "创建新钱包", "create_new_account": "建立新账户", - "create_new_seed": "创建新种子", + "create_new_seed": "创建新助记词", "creating_new_wallet": "创建新钱包", "creating_new_wallet_error": "错误: ${description}", "creation_date": "创建日期", @@ -238,63 +238,63 @@ "custom_drag": "定制(保持和拖动)", "custom_redeem_amount": "自定义兑换金额", "custom_value": "自定义值", - "customBackgroundDescription": "您已经有一个自定义背景。\\ ndo要替换或删除它?", - "dark_theme": "黑暗", + "customBackgroundDescription": "您已经有一个自定义背景。\n\n要替换或删除它?", + "dark_theme": "深色主题", "debit_card": "借记卡", - "debit_card_terms": "您的支付卡号(以及与您的支付卡号对应的凭证)在此数字钱包中的存储和使用受适用的持卡人与支付卡发卡机构签订的协议的条款和条件的约束,自时不时。", - "decimal_places_error": "小数位太多", - "decimals_cannot_be_zero": "代币十进制不能为零。", - "decred_info_card_details": "DECRED使用称为“ SPV”的分散和隐私的同步方法,该方法比普通的比特币钱包更长。要了解更多信息,请点击下面。", - "decred_info_title": "在Decred中同步", + "debit_card_terms": "您在本数字钱包中存储和使用支付卡号(以及与该支付卡号对应的凭证)受您与该支付卡发卡机构签订的持卡人协议的条款和条件约束,该协议以其不时修订的最新版本为准。", + "decimal_places_error": "小数位数超出限制", + "decimals_cannot_be_zero": "代币精度不能为零。", + "decred_info_card_details": "Decred 使用称为\"SPV\"的分散和隐私的同步方法,该方法比普通的比特币钱包耗时更长。要了解更多信息,请点击下面。", + "decred_info_title": "在 Decred 中同步", "default_buy_provider": "默认购买提供商", "default_sell_provider": "默认销售提供商", "delete": "删除", "delete_account": "删除账户", "delete_wallet": "删除钱包", - "delete_wallet_confirm_message": "您确定要删除 ${wallet_name} 钱包吗?", + "delete_wallet_confirm_message": "确定要删除钱包 ${wallet_name} 吗?", "deleteConnectionConfirmationPrompt": "您确定要删除与", - "denominations": "教派", - "derivationpath": "推导路径", - "descending": "下降", + "denominations": "面额", + "derivationpath": "派生路径", + "descending": "降序", "description": "描述", "destination_tag": "目标Tag:", - "deuro_about_deuro": "关于Deuro", - "deuro_collect_interest": "收集", + "deuro_about_deuro": "关于 dEuro", + "deuro_collect_interest": "提取", "deuro_reinvest_interest": "再投资", - "deuro_savings": "dEuro储蓄", - "deuro_savings_add": "订金", + "deuro_savings": "dEuro 储蓄", + "deuro_savings_add": "存入", "deuro_savings_approve_app": "批准应用程序", - "deuro_savings_approve_app_description": "允许Deuro Smart合同管理您的Deuro代币以节省,但不使用发送或拿出Deuro的能力。", - "deuro_savings_available_to_add": "可添加", - "deuro_savings_available_to_remove": "可删除", - "deuro_savings_balance": "储蓄平衡", - "deuro_savings_balance_tooltip": "这代表您当前的储蓄余额,这将随着时间的推移产生利息。您可以在任何给定时间存入或撤回Deuro。", - "deuro_savings_collect_interest": "收集兴趣", - "deuro_savings_collect_interest_tooltip": "这代表了您目前的利息,您可以随时收集到Deuro的余额中。", + "deuro_savings_approve_app_description": "允许dEuro智能合约管理您的dEuro代币以进行储蓄,但不允许其发送或提取您的dEuro。", + "deuro_savings_available_to_add": "可存入", + "deuro_savings_available_to_remove": "可取出", + "deuro_savings_balance": "储蓄余额", + "deuro_savings_balance_tooltip": "这代表您当前的储蓄余额,这将随着时间的推移产生利息。您可以在任何时间存入或撤回dEuro。", + "deuro_savings_collect_interest": "提取利息", + "deuro_savings_collect_interest_tooltip": "这代表了您目前的利息,您可以随时提取到dEuro的余额中。", "deuro_savings_remove": "提取", "deuro_savings_set_approval": "设定批准", - "deuro_savings_subtitle": "您的Deuro Stablecoin Holdings最多可赚取10%的利息", - "deuro_savings_welcome_description": "Deuro是一个完全分散的,抵押的STABLECOIN,与欧元固定在一起 - 安全,多功能和耐心制度,而不必依靠Oracles。 1 deuro = 1欧元。", + "deuro_savings_subtitle": "在 dEURO 持仓赚取最高 10% 年化利息", + "deuro_savings_welcome_description": "dEURO 是一个完全去中心化的抵押稳定币,与欧元挂钩——安全、多功能且抗审查,无需依赖预言机。1 dEURO = 1 欧元。", "deuro_tooltip_no_eth": "为了启用deuro,您必须在钱包里有ETH。", - "deuro_tx_commited_content": "交易可能需要几秒钟才能确认并在屏幕上反射", + "deuro_tx_commited_content": "交易可能需要几秒钟才能确认并在屏幕上显示", "device_is_signing": "设备正在签名", - "dfx_option_description": "用Eur&Chf购买加密货币。对于欧洲的零售和企业客户", - "did_you_back_up_seeds": "您备份了所有种子吗?", - "didnt_get_code": "没有获取代码?", - "digit_pin": "位 PIN", + "dfx_option_description": "使用 EUR 和 CHF 购买加密货币。适用于欧洲的零售和企业客户", + "did_you_back_up_seeds": "您备份了所有助记词吗?", + "didnt_get_code": "未收到验证码?", + "digit_pin": "位PIN码", "digital_and_physical_card": "数字和物理预付借记卡", "disable": "停用", - "disable_automatic_exchange_status_updates": "禁用自动交换状态更新", + "disable_automatic_exchange_status_updates": "禁用自动兑换状态更新", "disable_bulletin": "禁用服务状态公告", "disable_buy": "禁用购买操作", - "disable_cake_2fa": "禁用蛋糕 2FA", - "disable_exchange": "禁用交换", - "disable_exchange_option": "禁用交换选项", - "disable_fee_api_warning": "通过将其关闭,在某些情况下,收费率可能不准确,因此您最终可能会超额付款或支付交易费用", - "disable_fiat": "禁用法令", + "disable_cake_2fa": "禁用 Cake 2FA", + "disable_exchange": "禁用兑换", + "disable_exchange_option": "禁用兑换选项", + "disable_fee_api_warning": "通过将其关闭,在某些情况下,费率可能不准确,因此您最终可能会超额付款或支付交易费用", + "disable_fiat": "禁用法币", "disable_sell": "禁用卖出操作", "disable_tor": "禁用TOR", - "disable_trade_option": "禁用贸易选项", + "disable_trade_option": "禁用交易选项", "disableBatteryOptimization": "禁用电池优化", "disableBatteryOptimizationDescription": "您是否要禁用电池优化以使背景同步更加自由,平稳地运行?", "disabled": "禁用", @@ -307,13 +307,13 @@ "do_not_share_warning_text": "请勿与其他任何人分享这些信息,包括支持人员。\n\n您的资金可能而且将会被盗!", "do_not_show_me": "不再提示", "domain_looks_up": "域名查找", - "domain_mismatch": "域不匹配", - "domain_mismatch_description": "该网站的域与此请求的发件人的发件人不匹配。批准可能导致资金损失。", + "domain_mismatch": "域名不匹配", + "domain_mismatch_description": "该网站的域名与此请求的发件人不匹配。批准可能导致资金损失。", "donation_link_details": "捐赠链接详情", - "done": "完毕", - "duress_pin_description": "这将设置胁迫 PIN,这是大多数用户不应使用的高级功能。仅当您遇到危险时才应使用此 PIN 码。使用此 PIN 码后,您的所有钱包都将被删除,因此请确保在使用之前备份您的所有种子。", - "durres_PIN": "胁迫密码", - "durres_PIN_set_up_successfully": "胁迫密码已成功设置", + "done": "完成", + "duress_pin_description": "这将设置胁迫 PIN,这是大多数用户不应使用的高级功能。仅当您遇到危险时才应使用此 PIN 码。使用此 PIN 码后,您的所有钱包都将被删除,因此请确保在使用之前备份您的所有助记词。", + "durres_PIN": "胁迫PIN", + "durres_PIN_set_up_successfully": "胁迫PIN已成功设置", "e_sign_consent": "电子签名同意", "edit": "编辑", "edit_backup_password": "编辑备份密码", @@ -321,28 +321,28 @@ "edit_token": "编辑令牌", "electrum_address_disclaimer": "每次您使用一个地址时,我们都会生成新地址,但之前的地址仍然有效", "email_address": "电子邮件地址", - "enable": "使能够", - "enable_auto_node_switching": "启用自动节点开关", + "enable": "启用", + "enable_auto_node_switching": "启用自动节点切换", "enable_builtin_tor": "启用内置的tor", "enable_for_auto_switching": "启用自动开关", "enable_mempool_api": "Mempool API获得准确的费用和日期", - "enable_replace_by_fee": "启用by-Fee替换", - "enable_silent_payments_scanning": "开始扫描无声付款,直到达到提示", + "enable_replace_by_fee": "启用费用替换(RBF)", + "enable_silent_payments_scanning": "开始扫描发送到您的静默支付地址的交易", "enabled": "启用", "enter_amount": "输入金额", - "enter_backup_password": "在此处输入備用密码", + "enter_backup_password": "在此处输入备用密码", "enter_code": "输入代码", "enter_seed_phrase": "输入您的种子短语", "enter_totp_code": "请输入 TOTP 代码。", "enter_wallet_password": "输入钱包密码", "enter_your_note": "输入您的笔记...", - "enter_your_pin": "输入密码", + "enter_your_pin": "输入 PIN 码", "enter_your_pin_again": "再次输入您的PIN码", "enterTokenID": "输入令牌 ID", "enterWalletConnectURI": "输入 WalletConnect URI", "error": "错误", - "error_dialog_content": "糟糕,我们有一些错误。\n\n请将错误报告发送给我们的支持团队,以使应用程序更好。", - "error_text_account_name": "帐户名称只能包含字母数字\n且必须介于1到15个字符之间", + "error_dialog_content": "糟糕,我们有一些错误。\n\n请将错误报告发送给我们的支持团队,以帮助我们改进应用程序。", + "error_text_account_name": "账户名称只能包含字母、数字\n且长度必须在 1 到 15 个字符之间", "error_text_address": "钱包地址必须与类型对应\n加密货币", "error_text_amount": "金额只能包含数字", "error_text_contact_name": "联系人姓名不能包含`,' \" 符号\n并且必须介于1到32个字符之间", @@ -350,22 +350,22 @@ "error_text_fiat": "金额不能超过可用余额.\n小数位数必须小于或等于2", "error_text_input_above_maximum_limit": "金额大于最大值", "error_text_input_below_minimum_limit": "金额小于最小值", - "error_text_keys": "钱包密钥只能包含16个字符的十六进制字符", + "error_text_keys": "钱包密钥只能包含 64 个十六进制字符", "error_text_limits_loading_failed": "未创建 ${provider} 交易。 限制加载失败", "error_text_maximum_limit": "未创建 ${provider} 交易。 金额大于最大值:${max} ${currency}", "error_text_minimal_limit": "未创建 ${provider} 交易。 金额小于最小值:${min} ${currency}", "error_text_node_address": "请输入一个IPv4地址", "error_text_node_port": "节点端口只能包含0到65535之间的数字", "error_text_node_proxy_address": "请输入:<端口>,例如127.0.0.1:9050", - "error_text_payment_id": "付款ID只能包含16到64个字符(十六进制)", + "error_text_payment_id": "付款 ID 只能包含 16 到 64 个十六进制字符。", "error_text_subaddress_name": "子地址名称不能包含`,' \" 符号\n并且必须在1到20个字符之间", "error_text_template": "模板名称和地址不能包含`,' \" 符号\n并且必须在1到106个字符之间", - "error_text_wallet_name": "钱包名称只能包含字母、数字、_ - 符号\n并且长度必须在 1 到 33 个字符之间", + "error_text_wallet_name": "钱包名称仅限字母、数字、_ 和 -,长度为 1 到 33 个字符", "error_text_xmr": "XMR值不能超过可用余额.\n小数位数必须小于或等于12", - "error_while_processing": "发动机时发生错误", + "error_while_processing": "处理时发生错误", "errorGettingCredentials": "失败:获取凭据时出错", "errorSigningTransaction": "签署交易时发生错误", - "establishing_tor_connection": "tor连接", + "establishing_tor_connection": "建立Tor连接", "estimated": "估计值", "estimated_new_fee": "估计新费用", "estimated_receive_amount": "估计接收金额", @@ -375,17 +375,17 @@ "event": "事件", "events": "活动", "evm_ecosystem_description": "如有必要,请修改您要用于此付款的网络和令牌。", - "exchange": "交换", - "exchange_extra_info": "请不要忘记在向交易所发送此交易时指定备忘录或额外的ID", - "exchange_incorrect_current_wallet_for_xmr": "如果您想从蛋糕钱包Monero余额中交换XMR,请先切换到Monero Wallet。", - "exchange_new_template": "新模板", - "exchange_provider_unsupported": "${providerName}不再支持!", - "exchange_result_confirm": "点击确认 您将发送 ${fetchingLabel} ${from} 从你的钱包里 ${walletName} 到下面显示的地址。 或者您可以从外部钱包发送到以下地址/ QR码。\n\n请按确认继续或返回以更改金额", - "exchange_result_description": "您必须至少发送 ${fetchingLabel} ${from} 到下一页上显示的地址。 如果您发送的金额少于 ${fetchingLabel} ${from},则可能无法转换,因此无法退还。", - "exchange_result_write_down_ID": "*请复制或写下您上面显示的ID.", + "exchange": "兑换", + "exchange_extra_info": "为兑换发送此交易时,请务必指定 Memo 或 Extra ID", + "exchange_incorrect_current_wallet_for_xmr": "如果您想从 Cake Wallet 的 Monero 余额兑换 XMR,请先切换到 Monero 钱包。", + "exchange_new_template": "新兑换模板", + "exchange_provider_unsupported": "${providerName} 兑换服务不再支持!", + "exchange_result_confirm": "点击确定,您将从名为 ${walletName} 的钱包发送 ${from} (${fetchingLabel}) 到下方显示的地址。或者您可以从外部钱包发送到下方地址/二维码。\n\n请按确定继续或返回更改金额", + "exchange_result_description": "必须向下一页地址发送至少 ${fetchingLabel} ${from}。低于此额可能无法兑换,且不予退款。", + "exchange_result_write_down_ID": "*请复制或写下上方显示的 ID。", "exchange_result_write_down_trade_id": "请复制或写下交易编号以继续.", "exchange_sync_alert_content": "请等待,直到您的钱包同步", - "exchange_trade_result_confirm": "通过按Cake Wallet的发送发送,您将从钱包中发送 ${fetchingLabel} ${from}将###发送到下面所示的地址。或者,您可以从外部钱包${walletName} QR码从外部钱包详细信息页面发送到地址/ QR码。\n\n请按任何按钮继续或返回以更改金额。", + "exchange_trade_result_confirm": "通过点击Cake Wallet的发送按钮,您将从钱包中发送 ${fetchingLabel} ${from} 到下方显示的地址。或者,您可以从外部钱包详细信息页面发送到地址/二维码。\n\n请按任意按钮继续或返回更改金额。", "expired": "已过期", "expires": "过期", "expiresOn": "到期", @@ -407,20 +407,20 @@ "field_required": "此字段是必需的", "file_saved": "保存的文件", "fill_code": "请填写提供给您邮箱的验证码", - "filter_by": "过滤", + "filter_by": "筛选", "first_wallet_text": "适用于门罗币、比特币、以太坊、莱特币和避风港的超棒钱包", "fixed_pair_not_supported": "所选的交换服务不支持这对固定对", "fixed_rate": "固定汇率", - "fixed_rate_alert": "选中固定汇率模式后,您将可以输入接收金额。 您要切换到固定汇率模式吗?", + "fixed_rate_alert": "启用固定汇率模式后,可输入接收金额。您要切换吗?", "forgot_password": "忘记密码", - "freeze": "凍結", + "freeze": "冻结", "frequently_asked_questions": "常见问题", "from": "从", - "frozen": "凍結的", - "frozen_balance": "冷冻平衡", - "full_balance": "全部余额", - "gas_exceeds_allowance": "交易要求的气体超出了津贴。", - "gas_price": "汽油价格", + "frozen": "冻结的", + "frozen_balance": "冻结余额", + "full_balance": "总余额", + "gas_exceeds_allowance": "交易所需 Gas 超过了限额。", + "gas_price": "Gas 价格", "generate_name": "生成名称", "generating_gift_card": "生成礼品卡", "generating_transaction": "生成交易", @@ -435,7 +435,7 @@ "gift_cards": "礼品卡", "gift_cards_unavailable": "目前只能通过门罗币、比特币和莱特币购买礼品卡", "got_it": "明白", - "gross_balance": "毛余额", + "gross_balance": "总余额", "group_by_type": "按类型组", "haven_app": "Haven by Cake Wallet", "haven_app_wallet_text": "Awesome wallet for Haven", @@ -446,67 +446,67 @@ "hide_details": "隐藏细节", "high_contrast_theme": "高对比度主题", "history": "历史", - "home": "家", + "home": "首页", "home_screen_settings": "主屏幕设置", "how_to_connect": "如何连接", "how_to_use": "如何使用", "how_to_use_card": "如何使用这张卡", "id": "ID: ", - "if_you_dont_see_your_device": "如果您在上面看不到设备,请确保您的分类帐已经清醒并解锁!", - "ignor": "忽视", - "import": "进口", + "if_you_dont_see_your_device": "如果您在上面看不到设备,请确保您的 Ledger 已唤醒并解锁!", + "ignor": "忽略", + "import": "导入", "importNFTs": "导入 NFT", "in_store": "店内", "incoming": "收到", - "incorrect_seed": "输入的文字无效。", + "incorrect_seed": "输入的助记词无效。", "incorrect_seed_option": "不正确。请重试", - "incorrect_seed_option_back": "不正确。请确保您的种子可以正确保存,然后重试。", + "incorrect_seed_option_back": "不正确。请确保您的助记词可以正确保存,然后重试。", "inputs": "输入", - "insufficient_funds_for_tx": "资金不足无法成功执行交易。", - "insufficient_lamport_for_tx": "您没有足够的溶胶来支付交易及其交易费用。请在您的钱包中添加更多溶胶或减少您发送的溶胶量。", - "insufficient_lamports": "您没有足够的溶胶来支付交易及其交易费用。您至少需要${solValueNeeded} sol。请在您的钱包中添加更多溶胶或减少您发送的溶胶量", - "insufficientFundsForRentError": "您没有足够的溶胶来支付该帐户的交易费和租金。请在钱包中添加更多溶胶或减少您发送的溶胶量", - "insufficientFundsForRentErrorReceiver": "接收器的帐户没有足够的溶胶来支付租金。请要求接收器向其帐户添加更多SOL。", + "insufficient_funds_for_tx": "资金不足,无法成功执行交易。", + "insufficient_lamport_for_tx": "您没有足够的 SOL 来完成交易及其交易费用。请在钱包中添加更多 SOL,或减少发送的 SOL 量。", + "insufficient_lamports": "您没有足够的 SOL 来完成交易及其交易费用。您至少需要 ${solValueNeeded} SOL。请在钱包中添加更多 SOL,或减少发送的 SOL 量。", + "insufficientFundsForRentError": "您没有足够的 SOL 来支付该账户交易费和租金。请在钱包中添加更多 SOL,或减少发送的 SOL 量。", + "insufficientFundsForRentErrorReceiver": "接收者账户没有足够的 SOL 来支付租金。请要求接收者向账户添加更多 SOL。", "introducing_cake_pay": "介绍 Cake Pay!", "invalid_input": "输入无效", "invalid_password": "无效的密码", "invoice_details": "发票明细", "is_percentage": "是", - "keys": "钥匙", + "keys": "密钥", "last_30_days": "过去 30 天", "learn_more": "了解更多", - "ledger_connection_error": "无法连接到您的分类帐。请再试一次。", - "ledger_error_device_locked": "分类帐已锁定", - "ledger_error_tx_rejected_by_user": "交易在设备上拒绝", - "ledger_error_wrong_app": "请确保您在分类帐中操作正确的应用程序", - "ledger_please_enable_bluetooth": "请启用蓝牙来检测您的分类帐", - "legacy": "遗产", - "light_theme": "艳丽", + "ledger_connection_error": "无法连接到您的 Ledger。请再试一次。", + "ledger_error_device_locked": "Ledger 设备已锁定", + "ledger_error_tx_rejected_by_user": "用户在设备上拒绝了交易", + "ledger_error_wrong_app": "请确保您在 Ledger 上打开了正确的应用", + "ledger_please_enable_bluetooth": "请启用蓝牙来检测您的 Ledger", + "legacy": "旧版", + "light_theme": "浅色主题", "litecoin_enable_mweb_sync": "启用MWEB扫描", "litecoin_mweb": "MWEB", "litecoin_mweb_allow_coins": "允许MWEB硬币", "litecoin_mweb_always_scan": "设置MWEB总是扫描", "litecoin_mweb_description": "MWEB是一项新协议,它将更快,更便宜和更多的私人交易带给Litecoin", - "litecoin_mweb_dismiss": "解雇", + "litecoin_mweb_dismiss": "忽略", "litecoin_mweb_display_card": "显示MWEB卡", "litecoin_mweb_enable": "启用MWEB", "litecoin_mweb_enable_later": "您可以选择在显示设置下再次启用MWEB。", "litecoin_mweb_logs": "MWEB日志", "litecoin_mweb_node": "MWEB节点", - "litecoin_mweb_pegin": "钉进", - "litecoin_mweb_pegout": "昏倒", + "litecoin_mweb_pegin": "转入 (Peg-in)", + "litecoin_mweb_pegout": "转出 (Peg-out)", "litecoin_mweb_scanning": "MWEB扫描", "litecoin_mweb_settings": "MWEB设置", "litecoin_mweb_warning": "使用MWEB最初将下载约600MB的数据,并且最多可能需要30分钟的时间,具体取决于网络速度。此初始数据只能下载一次,并适用于所有莱特币钱包", "litecoin_what_is_mweb": "什么是MWEB?", - "live_fee_rates": "通过API的实时费率", - "load_more": "装载更多", - "loading_your_wallet": "加载您的钱包", + "live_fee_rates": "API 实时费率", + "load_more": "加载更多", + "loading_your_wallet": "正在加载钱包", "login": "登录", "logout": "注销", "low_fee": "费用低", - "low_fee_alert": "您当前正在使用低网络费用优先级。这可能会导致长时间等待、不同的费率或取消交易。我们建议设置更高的费用以获得更好的体验。", - "made_easy": "变得容易", + "low_fee_alert": "当前使用低手续费优先级,可能导致等待、费率变动或交易取消。建议提高手续费以优化体验。", + "made_easy": "轻松搞定", "manage_nodes": "管理节点", "manage_pow_nodes": "管理 PoW 节点", "manage_yats": "管理 Yats", @@ -515,7 +515,7 @@ "matrix_green_dark_theme": "矩阵绿暗主题", "max_amount": "最大值: ${value}", "max_value": "最大: ${value} ${currency}", - "memo": "备忘录:", + "memo": "备注:", "message": "信息", "message_verified": "该消息已成功验证", "messages": "消息", @@ -523,10 +523,10 @@ "methods": "方法", "min_amount": "最小值: ${value}", "min_value": "最小: ${value} ${currency}", - "mint_address": "薄荷地址", + "mint_address": "Mint 地址", "minutes_to_pin_code": "${minute} 分钟", - "mm": "毫米", - "modify_2fa": "修改蛋糕2FA", + "mm": "MM", + "modify_2fa": "修改Cake 2FA", "monero_com": "Monero.com by Cake Wallet", "monero_com_wallet_text": "Awesome wallet for Monero", "monero_dark_theme": "门罗币深色主题", @@ -538,12 +538,12 @@ "mweb_confirmed": "确认的MWEB", "mweb_unconfirmed": "未经证实的MWEB", "name": "姓名", - "nano_current_rep": "当前代表", + "nano_current_rep": "当前代表节点", "nano_gpt_thanks_message": "感谢您使用Nanogpt!事务完成后,请记住回到浏览器!", - "nano_pick_new_rep": "选择新代表", - "nanogpt_subtitle": "所有最新型号(GPT-4,Claude)。\\ nno订阅,用加密货币付款。", + "nano_pick_new_rep": "选择新代表节点", + "nanogpt_subtitle": "所有最新型号(GPT-4,Claude)。\n无订阅,用加密货币付款。", "narrow": "狭窄的", - "new_first_wallet_text": "保持加密货币是一件小菜一碟", + "new_first_wallet_text": "轻松保管您的加密货币", "new_node_testing": "新节点测试", "new_subaddress_create": "创建", "new_subaddress_label_name": "标签名称", @@ -553,7 +553,7 @@ "new_transactions_notifications": "发送有关新交易的通知", "new_wallet": "新钱包", "newConnection": "新连接", - "no": "不", + "no": "否", "no_cards_found": "找不到卡", "no_extra_detail": "没有其他详细信息", "no_id_needed": "不需要 ID!", @@ -567,23 +567,23 @@ "node_connection_successful": "连接成功", "node_new": "新节点", "node_port": "节点端口", - "node_reset_settings_title": "重新设置", + "node_reset_settings_title": "重置设置", "node_test": "测试", "nodes": "节点", - "nodes_list_reset_to_default_message": "您确定要将设置重设为默认值吗?", + "nodes_list_reset_to_default_message": "您确定要将设置重置为默认值吗?", "none_of_selected_providers_can_exchange": "选定的提供商都无法进行此交换", "noNFTYet": "还没有 NFT", "normal": "普通的", "note_optional": "注释(可选)", "note_tap_to_change": "注释(轻按即可更改)", - "notification_permission_denied": "通知许可被e opply拒绝,请在设置中手动启用它", + "notification_permission_denied": "通知权限被永久拒绝,请在设置中手动启用它", "nullURIError": "URI 为空", "offer_expires_in": "优惠有效期至 ", "offline": "离线", - "ok": "确认", + "ok": "确定", "old_fee": "旧费用", "oled_mode": "OLED模式", - "onion_link": "洋葱链接", + "onion_link": "洋葱网络链接", "online": "在线", "onramper_option_description": "快速使用许多付款方式购买加密货币。在大多数国家 /地区可用。利差和费用各不相同。", "open_gift_card": "打开礼品卡", @@ -593,19 +593,19 @@ "optional_name": "可选收件人姓名", "optionally_order_card": "可选择订购实体卡。", "orbot_running_alert": "请确保 Orbot 在连接到此节点之前正在运行。", - "order_by": "订购", + "order_by": "排序方式", "order_id": "订单编号", "order_physical_card": "订购实体卡", "other_settings": "其他设置", - "outdated_electrum_wallet_description": "在Cake创建的新比特币钱包现在有一个24字的种子。你必须创建一个新的比特币钱包,并将你所有的资金转移到新的24字钱包,并停止使用12字种子的钱包。请立即这样做以保证你的资金安全。", - "outdated_electrum_wallet_receive_warning": "如果这个钱包有一个 12 字的种子并且是在 Cake 中创建的,不要将比特币存入这个钱包。 任何转移到此钱包的 BTC 都可能丢失。 创建一个新的 24 字钱包(点击右上角的菜单,选择钱包,选择创建新钱包,然后选择比特币)并立即将您的 BTC 移到那里。 Cake 的新(24 字)BTC 钱包是安全的", + "outdated_electrum_wallet_description": "Cake 新建比特币钱包现使用 24 词助记词。您必须立即创建新钱包,将所有资金转移至新钱包,并停止使用 12 词助记词钱包,以确保资金安全。", + "outdated_electrum_wallet_receive_warning": "警告:12词助记词钱包已过时,切勿存入比特币!请立即创建24词新钱包(右上菜单 > 钱包 > 创建新钱包 > 比特币),并立即转移资金。新 24 词比特币钱包安全可靠。", "outgoing": "发送", "outputs": "输出", "overshot": "超越", "overwrite_amount": "Overwrite amount", "pairingInvalidEvent": "配对无效事件", - "passphrase": "密码(可选)", - "passphrases_doesnt_match": "密码不匹配,请重试", + "passphrase": "密语(可选)", + "passphrases_doesnt_match": "密语不匹配,请重试", "password": "密码", "paste": "粘贴", "pause_wallet_creation": "创建 Haven 钱包的功能当前已暂停。", @@ -623,16 +623,16 @@ "payment_made_easy": "付款很容易", "payment_was_received": "您的付款已收到。", "payments": "付款", - "pending": " (待定)", - "percentageOf": "${amount}", - "pin_at_top": "将 ${token} 固定在顶部", - "pin_is_incorrect": "PIN码不正确", - "pin_number": "PIN 码", + "pending": " (待确认)", + "percentageOf": "占 ${amount}", + "pin_at_top": "置顶 ${token}", + "pin_is_incorrect": "PIN码错误", + "pin_number": "PIN码", "placeholder_contacts": "您的联系人将显示在这里", "placeholder_transactions": "您的交易将显示在这里", "please_choose_one": "请选择一个", "please_fill_totp": "请填写您其他设备上的 8 位代码", - "please_make_selection": "请在下面进行选择 创建或恢复您的钱包.", + "please_make_selection": "请在下面进行选择以创建或恢复您的钱包。", "please_reference_document": "请参考以下文档以获取更多信息。", "please_select": "请选择:", "please_select_backup_file": "请选择备份文件,然后输入备份密码。", @@ -641,8 +641,8 @@ "polygonscan_history": "多边形扫描历史", "potential_scam": "潜在骗局", "powered_by": "Powered by ${title}", - "pre_seed_button_text": "我明白。 查看种子", - "pre_seed_description": "在下一页上,您将看到一系列单词。这是您独特的私人种子,这是在损失或故障时恢复钱包的唯一方法。将其写下来并将其存储在蛋糕钱包应用程序外的安全地方是您的责任。", + "pre_seed_button_text": "我明白。 查看助记词", + "pre_seed_description": "下一页将显示一系列单词。这是您的独特助记词,是丢失或故障时恢复钱包的唯一方式。请亲自写下并安全存储在 Cake Wallet 应用外。", "pre_seed_title": "重要", "prepaid_cards": "预付费卡", "prevent_screenshots": "防止截屏和录屏", @@ -654,9 +654,9 @@ "proceed_after_one_minute": "如果屏幕在 1 分钟后没有继续,请检查您的电子邮件。", "proceed_on_device": "在设备上继续", "proceed_on_device_description": "请按照您的硬件钱包上提示的说明进行操作", - "processing": "加工", + "processing": "处理中", "processing_signed_tx": "处理签名的交易", - "profile": "轮廓", + "profile": "个人资料", "provider_error": "${provider} 错误", "public_key": "公钥", "purchase_gift_card": "购买礼品卡", @@ -665,12 +665,12 @@ "qr_code_format_body": "BCUR(区块链共同资源)是行业标准,与比特币硬件钱包最广泛兼容,大多数用户应选择。 BBQR(Better Bitcoin QR)是一种仅由ColdCard Hardware Challets使用的唯一格式,从他们的型号开始。", "qr_code_format_note": "不同的硬件钱包在比特币空间中使用了不同的QR码格式", "qr_fullscreen": "点击打开全屏二维码", - "qr_instruction": "使用此地址接收任何令牌或收藏", - "qr_payment_amount": "This QR code contains a payment amount. Do you want to overwrite the current value?", + "qr_instruction": "使用此地址接收任何代币或收藏", + "qr_payment_amount": "此二维码包含付款金额。您要覆盖当前金额吗?", "quantity": "数量", "question_to_disable_2fa": "您确定要禁用 Cake 2FA 吗?访问钱包和某些功能将不再需要 2FA 代码。", "receivable_balance": "应收余额", - "receive": "接收", + "receive": "收款", "receive_amount": "金额", "received": "已收到", "recipient_address": "收件人地址", @@ -679,21 +679,21 @@ "reconnect_your_hardware_wallet": "重新连接您的硬件钱包", "reconnection": "重新连接", "red_dark_theme": "红色的黑暗主题", - "red_light_theme": "红灯主题", + "red_light_theme": "红色浅色主题", "redeemed": "赎回", "refund_address": "退款地址", "reject": "拒绝", "remaining": "剩余", - "remove": "确定", + "remove": "移除", "remove_node": "删除节点", "remove_node_message": "您确定要删除所选节点吗?", "rename": "重命名", - "rep_warning": "代表性警告", - "rep_warning_sub": "您的代表似乎并不信誉良好。点击这里选择一个新的", + "rep_warning": "代表节点警告", + "rep_warning_sub": "您的代表节点似乎并不信誉良好。点击这里选择一个新的", "repeat_wallet_password": "重复钱包密码", "repeated_password_is_incorrect": "重复密码不正确。请再次重复钱包密码。", - "replace": "代替", - "requested": "要求", + "replace": "替换", + "requested": "已请求", "require_for_adding_contacts": "需要添加联系人", "require_for_all_security_and_backup_settings": "需要所有安全和备份设置", "require_for_assessing_wallet": "需要访问钱包", @@ -704,46 +704,46 @@ "require_for_sends_to_internal_wallets": "需要发送到内部钱包", "require_for_sends_to_non_contacts": "需要发送给非联系人", "require_pin_after": "之后需要 PIN", - "required_passphrase": "密码", + "required_passphrase": "密语", "rescan": "重新扫描", "resend_code": "请重新发送", "reset": "重置", "reset_password": "重置密码", "restore": "恢复", - "restore_active_seed": "活动种子", + "restore_active_seed": "活动助记词", "restore_address": "地址", "restore_bitcoin_description_from_keys": "从私钥中生成的WIF字符串恢复您钱包", - "restore_bitcoin_description_from_seed": "从24个文字的组成码恢复您的钱包", + "restore_bitcoin_description_from_seed": "使用 24 个助记词恢复您的钱包", "restore_bitcoin_title_from_keys": "从WIF还原", "restore_description_from_backup": "您可以从还原整个Cake Wallet应用您的备份文件", "restore_description_from_cupcake": "与我们的配套空调应用程序链接,安装在第二台手机上。", "restore_description_from_hardware_wallet": "链接来自不同制造商的硬件钱包设备。", - "restore_description_from_keys": "使用私钥恢复钱包", - "restore_description_from_seed": "从25个字中恢复您的钱包或13个字的组合码", - "restore_description_from_seed_keys": "从保存到安全地方的种子/钥匙取回钱包", + "restore_description_from_keys": "从私钥生成的密钥恢复钱包", + "restore_description_from_seed": "使用 25 词或 13 词助记词恢复钱包", + "restore_description_from_seed_keys": "从保存到安全地方的助记词/钥匙取回钱包", "restore_existing_wallet": "恢复现有的钱包", "restore_from_date_or_blockheight": "请输入您创建这个钱包前几天的日期。或者如果您知道区块高度,请输入区块高度", - "restore_from_seed_placeholder": "请在此处输入或粘贴您的代码短语", - "restore_new_seed": "新种子", + "restore_from_seed_placeholder": "请在此处输入或粘贴您的助记词", + "restore_new_seed": "新助记词", "restore_next": "下一个", "restore_recover": "恢复", "restore_restore_wallet": "恢复钱包", - "restore_seed_keys_restore": "种子/密钥还原", - "restore_spend_key_private": "Spend私钥", + "restore_seed_keys_restore": "助记词/密钥还原", + "restore_spend_key_private": "支出私钥 (Spend Key)", "restore_title_from_backup": "从备份文件还原", - "restore_title_from_cupcake": "蛋糕应用", + "restore_title_from_cupcake": "Cake 应用", "restore_title_from_hardware_wallet": "从硬件钱包还原", "restore_title_from_keys": "从密钥还原", - "restore_title_from_seed": "从种子还原", - "restore_title_from_seed_keys": "从种子/密钥还原", - "restore_view_key_private": "View私钥", + "restore_title_from_seed": "从助记词还原", + "restore_title_from_seed_keys": "从助记词/密钥还原", + "restore_view_key_private": "查看私钥 (View Key)", "restore_wallet": "恢复钱包", "restore_wallet_name": "钱包名称", "restore_wallet_restore_description": "钱包还原说明", "robinhood_option_description": "使用您的借记卡,银行帐户或罗比林余额立即购买和转移。仅美国。", "router_no_route": "未定义路线 ${name}", "save": "保存", - "save_backup_password": "请确保您已保存备份密码。 沒有它,您将无法导入备份文件。", + "save_backup_password": "请确保您已保存备份密码。没有它,您将无法导入备份文件。", "save_backup_password_alert": "保存备份密码", "save_to_downloads": "保存到下载", "saved_the_trade_id": "我已经保存了交易编号", @@ -752,27 +752,27 @@ "scan_qr_code_to_get_address": "扫描二维码获取地址", "scan_qr_on_device": "在另一台设备上扫描此二维码", "search": "搜索", - "search_add_token": "搜索/添加令牌", + "search_add_token": "搜索/添加代币", "search_category": "搜索类别", "search_currency": "搜索货币", "search_language": "搜索语言", - "second_intro_content": "您的 Yat 是一個唯一的表情符號地址,可替換您所有貨幣的所有長十六進制地址。", - "second_intro_title": "一個表情符號地址來統治他們", + "second_intro_content": "您的 Yat 是一个唯一的表情符号地址,可替换您所有货币的所有长十六进制地址。", + "second_intro_title": "一个表情符号地址即可统一所有地址", "security": "安全", "security_and_backup": "安全和备份", "security_risk": "安全风险", - "security_risk_description": "该域被多个安全提供者标记为不安全。立即离开以保护您的资产。", + "security_risk_description": "危险!该域名被多家安全机构标记为风险,请立即离开以保护资产安全!", "seed_alert_back": "返回", - "seed_alert_content": "种子是恢复钱包的唯一方法。记住了吗?", + "seed_alert_content": "助记词是恢复钱包的唯一方式。您是否已写下助记词?", "seed_alert_title": "注意", - "seed_alert_yes": "确定", - "seed_choose": "选择种子语言", - "seed_display_path": "菜单 - >安全性和备份 - >显示键/种子", + "seed_alert_yes": "是的,我已写下", + "seed_choose": "选择助记词语言", + "seed_display_path": "菜单 - >安全性和备份 - >显示键/助记词", "seed_hex_form": "钱包种子(十六进制形式)", - "seed_key": "种子钥匙", - "seed_language": "种子语言", - "seed_language_chinese": "中文", - "seed_language_chinese_traditional": "中国传统的)", + "seed_key": "助记词", + "seed_language": "助记词语言", + "seed_language_chinese": "简体中文", + "seed_language_chinese_traditional": "繁体中文", "seed_language_czech": "捷克", "seed_language_dutch": "荷兰文", "seed_language_english": "英文", @@ -780,22 +780,22 @@ "seed_language_german": "德文", "seed_language_italian": "意大利语", "seed_language_japanese": "日文", - "seed_language_korean": "韩国人", + "seed_language_korean": "韩语", "seed_language_next": "下一个", "seed_language_portuguese": "葡萄牙文", "seed_language_russian": "俄文", "seed_language_spanish": "西班牙文", - "seed_phrase_length": "种子短语长度", + "seed_phrase_length": "助记词长度", "seed_position_question_one": "什么是", - "seed_position_question_two": "你的种子短语的话?", - "seed_reminder": "请记下这些内容,以防丟失或数据损坏", - "seed_share": "分享种子", - "seed_title": "种子", - "seed_verified": "种子经过验证", - "seed_verified_subtext": "您可以在以后使用保存的种子在发生损坏或丢失设备的情况下还原该钱包。\n\n您可以从", - "seedtype": "籽粒", - "seedtype_alert_content": "只有BIP39籽粒可以与其他钱包共享种子。", - "seedtype_alert_title": "籽粒警报", + "seed_position_question_two": "你的助记词的话?", + "seed_reminder": "请记下这些内容,以防手机丢失或重置", + "seed_share": "分享助记词", + "seed_title": "助记词", + "seed_verified": "助记词经过验证", + "seed_verified_subtext": "您可以在以后使用保存的助记词在发生损坏或丢失设备的情况下还原该钱包。\n\n您可以从", + "seedtype": "助记词类型", + "seedtype_alert_content": "只有BIP39助记词类型可以与其他钱包共享助记词。", + "seedtype_alert_title": "助记词类型提示", "select_a_wallet": "选择一个钱包", "select_backup_file": "选择备份文件", "select_buy_provider_notice": "在上面选择买入提供商。您可以通过在应用程序设置中设置默认的购买提供商来跳过此屏幕。", @@ -813,19 +813,19 @@ "send": "发送", "send_address": "${cryptoCurrency} 地址", "send_amount": "金额:", - "send_change_to_you": "改变,向您:", + "send_change_to_you": "找零,到您:", "send_creating_transaction": "创建交易", "send_error_currency": "货币只能包含数字", "send_error_minimum_value": "最小金额为0.01", - "send_estimated_fee": "预估费用:", + "send_estimated_fee": "预估手续费:", "send_fee": "手续费:", - "send_from_cake_wallet": "从蛋糕钱包发送", + "send_from_cake_wallet": "从 Cake Wallet 发送", "send_from_external_wallet": "从外部钱包发送", "send_name": "名称", "send_new": "新建", "send_payjoin": "发送 Payjoin", "send_payment_id": "付款编号 (可选的)", - "send_priority": "目前,费用设置为 ${transactionPriority} 优先.\n交易优先级可以在设置中进行调整", + "send_priority": "当前手续费设为 ${transactionPriority} 优先级。\n可在设置中调整交易优先级。", "send_sending": "正在发送...", "send_success": "您的${crypto}已成功发送", "send_templates": "模板", @@ -836,8 +836,8 @@ "sending": "正在发送", "sent": "已发送", "service_health_disabled": "服务健康公告被禁用", - "service_health_disabled_message": "这是服务健康公告页面,您可以在设置 - >隐私下启用此页面", - "set_a_pin": "设置一个别针", + "service_health_disabled_message": "这是服务健康公告页面,您可以在设置 -> 隐私下启用此页面", + "set_a_pin": "设置一个 PIN", "set_up_a_wallet": "设置钱包", "settings": "设置", "settings_all": "全部", @@ -850,8 +850,8 @@ "settings_dark_mode": "黑暗模式", "settings_display_balance": "显示余额为", "settings_display_on_dashboard_list": "显示在仪表板上", - "settings_fee_priority": "交易优先级", - "settings_nodes": "节点数", + "settings_fee_priority": "手续费优先级", + "settings_nodes": "节点", "settings_none": "没有", "settings_only_trades": "只交易", "settings_only_transactions": "仅交易", @@ -859,32 +859,32 @@ "settings_save_recipient_address": "保存收件人地址", "settings_support": "帮助", "settings_terms_and_conditions": "条款和条件", - "settings_title": "设定值", + "settings_title": "设置", "settings_trades": "交易", "settings_transactions": "交易情况", "settings_wallets": "钱包", - "setup_2fa": "设置蛋糕 2FA", - "setup_2fa_text": "Cake 2FA 使用 TOTP 作为第二个身份验证因素。\n\nCake 2FA 的 TOTP 需要 SHA-512 和 8 位数字支持;这提供了更高的安全性。更多信息和支持的应用程序可以在指南中找到。", - "setup_pin": "设定PIN码", - "setup_pin_is_failed": "设置引脚失败并出现错误:", + "setup_2fa": "设置 Cake 2FA", + "setup_2fa_text": "Cake 2FA 使用 TOTP 作为两步验证。\n\n其 TOTP 需要 SHA-512 和 8 位码支持,提供更高安全性。详情及兼容 App 见指南。", + "setup_pin": "设置PIN码", + "setup_pin_is_failed": "PIN 设置失败,错误:", "setup_successful": "您的PIN码已成功设置!", "setup_totp_recommended": "设置 TOTP", - "setup_warning_2fa_text": "Cake 2FA 是对钱包中某些操作的二次验证。它不如冷藏那么安全。\n\n如果您无法访问 2FA 应用程序或 TOTP 密钥,您将无法访问此钱包。您需要从助记词种子中恢复您的钱包。\n\n如果您无法访问 2FA 或助记词种子,Cake 支持将无法为您提供帮助。\n在使用 Cake 2FA 之前,我们建议您阅读该指南。", + "setup_warning_2fa_text": "Cake 2FA 是钱包内某些操作的两步验证,安全性不如冷存储。\n\n若丢失 2FA 应用或 TOTP 密钥,您将永久无法访问此钱包,只能用助记词恢复。\n\n若同时丢失 2FA 和助记词,Cake 支持无法帮助找回。\n\n启用前,请仔细阅读指南。", "setup_your_debit_card": "设置你的借记卡", "share": "分享", "share_address": "分享地址", - "shared_seed_wallet_groups": "共享种子钱包组", + "shared_seed_wallet_groups": "共享助记词钱包组", "show": "展示", "show_address_book_popup": "显示地址簿弹出", - "show_balance": "长印刷以显示平衡", + "show_balance": "长按以显示余额", "show_balance_send_page": "点击即可显示", - "show_balance_toast": "长按以隐藏或显示平衡", + "show_balance_toast": "长按以隐藏或显示余额", "show_details": "显示详细信息", - "show_keys": "显示种子/密钥", + "show_keys": "显示助记词/密钥", "show_market_place": "显示市场", - "show_seed": "显示种子", + "show_seed": "显示助记词", "sign_all": "签署全部", - "sign_message": "标志消息", + "sign_message": "签名消息", "sign_one": "签一个", "sign_up": "注册", "sign_verify_message": "签名或验证消息", @@ -894,96 +894,96 @@ "signature_invalid_error": "签名对于给出的消息无效", "signTransaction": "签署交易", "signup_for_card_accept_terms": "注册卡并接受条款。", - "silent_payment": "无声付款", - "silent_payments": "无声付款", - "silent_payments_always_scan": "设置无声付款总是扫描", - "silent_payments_disclaimer": "新地址不是新的身份。这是重复使用具有不同标签的现有身份。", - "silent_payments_display_card": "显示无声支付卡", - "silent_payments_logs": "无声付款日志", + "silent_payment": "静默支付", + "silent_payments": "静默支付", + "silent_payments_always_scan": "设置静默支付总是扫描", + "silent_payments_disclaimer": "新地址并不代表新身份,只是给同一个身份换了个标签", + "silent_payments_display_card": "显示静默支付卡", + "silent_payments_logs": "静默支付日志", "silent_payments_scan_from_date": "从日期开始扫描", "silent_payments_scan_from_date_or_blockheight": "请输入您要开始扫描输入静音付款的块高度,或者使用日期。您可以选择钱包是否继续扫描每个块,或仅检查指定的高度。", "silent_payments_scan_from_height": "从块高度扫描", - "silent_payments_scanned_tip": "扫描到小费! (${tip})", - "silent_payments_scanning": "无声付款扫描", - "silent_payments_settings": "无声付款设置", - "single_seed_wallets_group": "单个种子钱包", + "silent_payments_scanned_tip": "已扫描至最新区块! (${tip})", + "silent_payments_scanning": "静默支付扫描", + "silent_payments_settings": "静默支付设置", + "single_seed_wallets_group": "单个助记词钱包", "slidable": "可滑动", - "solana_create_associated_token_account_exception": "错误创建有关接收地址的关联令牌帐户。", - "solana_invalid_data_message": "解析令牌的关联令牌帐户时出错。请确认接收地址并重试。", - "solana_no_associated_token_account_exception": "该地址没有关联的令牌帐户。", - "solana_sign_native_transaction_rent_exception": "交易无法完成。交易后剩下的溶胶不足。请增强您的溶胶余额或减少您发送的SOL的量。", - "solana_sign_spl_token_transaction_rent_exception": "交易无法完成。交易后剩下的溶胶不足。请增强您的溶液余额。", + "solana_create_associated_token_account_exception": "错误创建有关接收地址的关联代币帐户。", + "solana_invalid_data_message": "解析代币的关联代币帐户时出错。请确认接收地址并重试。", + "solana_no_associated_token_account_exception": "该地址没有关联的代币帐户。", + "solana_sign_native_transaction_rent_exception": "交易无法完成。交易后 SOL 余额不足以支付租金。请充值 SOL 余额,或减少发送的 SOL 量。", + "solana_sign_spl_token_transaction_rent_exception": "交易无法完成。交易后 SOL 余额不足以支付租金。请充值 SOL 余额。", "sort_by": "排序方式", - "spend_key_private": "Spend 密钥 (私钥)", - "spend_key_public": "Spend 密钥 (公钥)", + "spend_key_private": "支出私钥 (Spend Key)", + "spend_key_public": "支出公钥 (Spend Key)", "starting_tor_proxy": "启动Tor代理", "status": "状态: ", - "step": "步", + "step": "步骤", "string_default": "默认", "subaddress_title": "子地址列表", "subaddresses": "子地址", "submit_request": "提交请求", "success": "成功", - "successful": "成功的", + "successful": "成功", "support_description_guides": "对常见问题的文档和支持", - "support_description_live_chat": "免费快速!训练有素的支持代表可以协助", + "support_description_live_chat": "免费快速!训练有素的客服代表可为您提供协助", "support_description_other_links": "加入我们的社区或通过其他方法与我们联系我们的合作伙伴", - "support_title_guides": "蛋糕钱包文档", - "support_title_live_chat": "实时支持", + "support_title_guides": "Cake Wallet 文档", + "support_title_live_chat": "在线客服", "support_title_other_links": "其他支持链接", "supported": "支持", - "swap": "交换", - "sweeping_wallet": "扫一扫钱包", - "sweeping_wallet_alert": "\n这应该不会花很长时间。请勿离开此屏幕,否则可能会丢失所掠取的资金", - "switch_wallet": "开关钱包", + "swap": "闪兑", + "sweeping_wallet": "正在归集资金", + "sweeping_wallet_alert": "\n这应该不会花很长时间。请勿离开此屏幕,否则可能会丢失正在归集的资金", + "switch_wallet": "切换钱包", "switchToETHWallet": "请切换到以太坊钱包并重试", "switchToEVMCompatibleWallet": "请切换到 EVM 兼容钱包并重试(以太坊、Polygon)", - "symbol": "象征", + "symbol": "符号", "sync_all_wallets": "同步所有钱包", - "sync_status_attempting_scan": "尝试扫描", - "sync_status_attempting_sync": "嘗試同步", + "sync_status_attempting_scan": "正在尝试扫描", + "sync_status_attempting_sync": "正在尝试同步", "sync_status_connected": "已连接", "sync_status_connecting": "连接中", "sync_status_display_mode": "同步状态显示", - "sync_status_display_mode_blocks": "剩下的显示块", + "sync_status_display_mode_blocks": "显示剩余区块", "sync_status_display_mode_eta": "显示ETA", "sync_status_failed_connect": "断线", "sync_status_not_connected": "未连接", - "sync_status_starting_scan": "启动扫描(来自 ${height})", - "sync_status_starting_sync": "开始同步", + "sync_status_starting_scan": "正在启动扫描(来自 ${height})", + "sync_status_starting_sync": "正在开始同步", "sync_status_syncronized": "已同步", "sync_status_syncronizing": "正在同步", - "sync_status_timed_out": "时间到", + "sync_status_timed_out": "超时", "sync_status_unsupported": "不支持的节点", "synchronizing": "同步", - "syncing_wallet_alert_content": "您的余额和交易列表可能不完整,直到顶部显示“已同步”。单击/点击以了解更多信息。", + "syncing_wallet_alert_content": "同步中,余额和交易列表可能不完整,直至顶部显示“已同步”。点击了解详情。", "syncing_wallet_alert_title": "您的钱包正在同步", "template": "模板", "template_name": "模板名称", - "testnet_coins_no_value": "TestNet硬币没有价值", - "third_intro_content": "Yats 也住在 Cake Wallet 之外。 地球上任何一個錢包地址都可以用一個Yat來代替!", - "third_intro_title": "Yat 和別人玩得很好", + "testnet_coins_no_value": "TestNet币没有实际价值", + "third_intro_content": "Yats 也住在 Cake Wallet 之外。地球上任何一个钱包地址都可以用一个 Yat 来代替!", + "third_intro_title": "Yat 和别人玩得很好", "this_pair_is_not_supported_warning": "当前选择的交换不支持这对。请选择另一个交换。", "thorchain_contract_address_not_supported": "Thorchain不支持发送到合同地址", - "thorchain_taproot_address_not_supported": "Thorchain提供商不支持Taproot地址。请更改地址或选择其他提供商。", + "thorchain_taproot_address_not_supported": "THORChain 不支持 Taproot 地址,请更换地址或选择其他提供商", "time": "${minutes}m ${seconds}s", "tip": "提示:", "to": "到", "today": "今天", - "token_already_exists": "令牌已经存在", - "token_decimal": "代币十进制(eg:USDT )", - "token_name": "令牌名称(EG:系绳)", - "token_symbol": "令牌符号(EG:USDT )", + "token_already_exists": "代币已经存在", + "token_decimal": "代币精度(eg:USDT )", + "token_name": "代币名称(例如:Tether)", + "token_symbol": "代币符号(EG:USDT )", "tokenID": "ID", - "tokens_strong_warning": "切勿将令牌发送到此地址!", + "tokens_strong_warning": "切勿将代币发送到此地址!", "tor_connection": "Tor连接", "tor_connection_timeout": "TOR连接超时", - "tor_experimental": "这是一个实验功能,并非所有由Cake Wallet Support Tor路由组成的连接 - 某些连接可能会使用Clearnet,以便完全路由App App App Appl使用VPN模式。", + "tor_experimental": "这是一个实验功能,并非 Cake Wallet 的所有连接都支持 Tor 路由。有些连接可能使用明网。为完全路由应用流量,请结合 VPN 模式使用 Tor。", "tor_only": "仅限 Tor", - "total": "全部的", + "total": "总计", "total_saving": "总储蓄", - "totp_2fa_failure": "不正确的代码。 请尝试不同的代码或生成新的密钥。 使用支持 8 位代码和 SHA512 的兼容 2FA 应用程序。", - "totp_2fa_success": "成功!为此钱包启用了 Cake 2FA。请记住保存您的助记词种子,以防您无法访问钱包。", + "totp_2fa_failure": "代码错误,请重试或重新扫描密钥(需支持 SHA512 + 8 位码)", + "totp_2fa_success": "成功!为此钱包启用了 Cake 2FA。请记住保存您的助记词,以防您无法访问钱包。", "totp_auth_url": "TOTP 授权 URL", "totp_code": "TOTP代码", "totp_secret_code": "TOTP密码", @@ -1000,8 +1000,8 @@ "trade_for_not_created": "交易 ${title} 未创建.", "trade_history_title": "交易历史", "trade_id": "交易编号:", - "trade_id_not_found": "交易方式 ${tradeId} 的 ${title} 未找到.", - "trade_is_powered_by": "该交易由 ${provider}", + "trade_id_not_found": "交易方式 ${tradeId} 的 ${title} 未找到。", + "trade_is_powered_by": "该交易由${provider}支持", "trade_not_created": "未建立交易", "trade_not_found": "找不到交易.", "trade_state_btc_sent": "已发送", @@ -1010,8 +1010,8 @@ "trade_state_created": "已建立", "trade_state_finished": "已完成", "trade_state_paid": "已付费", - "trade_state_paid_unconfirmed": "付费未确认", - "trade_state_pending": "待定", + "trade_state_paid_unconfirmed": "已付费未确认", + "trade_state_pending": "待处理", "trade_state_timeout": "超时", "trade_state_to_be_created": "待创建", "trade_state_traded": "已交易", @@ -1021,15 +1021,15 @@ "trades": "交易", "transaction_cost": "交易成本", "transaction_details_amount": "金额", - "transaction_details_copied": "${title} 复制到剪切板", + "transaction_details_copied": "${title} 复制到剪贴板", "transaction_details_date": "日期", "transaction_details_fee": "手续费", "transaction_details_height": "区块高度", - "transaction_details_recipient_address": "收件人地址", + "transaction_details_recipient_address": "接收地址", "transaction_details_source_address": "源地址", "transaction_details_title": "交易明细", "transaction_details_transaction_id": "交易编号", - "transaction_key": "交易密码", + "transaction_key": "交易密钥", "transaction_priority_fast": "快速", "transaction_priority_fastest": "最快", "transaction_priority_medium": "中等", @@ -1037,37 +1037,37 @@ "transaction_priority_slow": "慢速", "transaction_sent": "交易已发送", "transaction_sent_notice": "如果屏幕在 1 分钟后没有继续,请检查区块浏览器和您的电子邮件。", - "transactions": "交易情况", + "transactions": "交易", "transactions_by_date": "按日期交易", "transport_type": "运输类型", "trongrid_history": "Trongrid历史", "trusted": "值得信赖", "try_again": "再试一次", - "tx_commit_exception_no_dust_on_change": "交易被此金额拒绝。使用这些硬币,您可以发送${min}无需更改或返回${max}的变化。", - "tx_commit_failed": "交易承诺失败。请联系支持。", + "tx_commit_exception_no_dust_on_change": "交易被此金额拒绝。使用这些硬币,您可以发送${min}无需找零或返回${max}的找零。", + "tx_commit_failed": "交易提交失败。请联系客服。", "tx_commit_failed_no_peers": "交易无法广播,请在一秒钟左右的时间内重试", "tx_invalid_input": "您正在使用错误的输入类型进行此类付款", "tx_no_dust_exception": "通过发送太小的金额来拒绝交易。请尝试增加金额。", "tx_not_enough_inputs_exception": "没有足够的输入。请在硬币控制下选择更多", - "tx_rejected_bip68_final": "交易未确认投入,未能取代费用。", - "tx_rejected_dust_change": "交易被网络规则拒绝,较低的变化数量(灰尘)。尝试发送全部或减少金额。", - "tx_rejected_dust_output": "交易被网络规则,低输出量(灰尘)拒绝。请增加金额。", - "tx_rejected_dust_output_send_all": "交易被网络规则,低输出量(灰尘)拒绝。请检查在硬币控制下选择的硬币的余额。", + "tx_rejected_bip68_final": "交易包含未确认输入,未能替换费用。", + "tx_rejected_dust_change": "交易被网络规则拒绝,找零金额过低(尘额)。尝试发送全部或减少金额。", + "tx_rejected_dust_output": "交易被网络规则拒绝,输出金额过低(尘额)。请增加金额。", + "tx_rejected_dust_output_send_all": "交易被网络规则拒绝,低输出量(灰尘)拒绝。请检查在硬币控制下选择的硬币的余额。", "tx_rejected_vout_negative": "没有足够的余额来支付此交易费用。请检查硬币控制下的硬币余额。", "tx_wrong_balance_exception": "您没有足够的${currency}来发送此金额。", "tx_wrong_balance_with_amount_exception": "您没有足够的${currency} ${amount}", - "tx_zero_fee_exception": "无法以0费用发送交易。尝试提高速率或检查连接以获取最新估计。", + "tx_zero_fee_exception": "无法以0手续费发送交易。尝试提高速率或检查连接以获取最新估计。", "unavailable_balance": "不可用余额", - "unavailable_balance_description": "不可用余额:此总额包括锁定在待处理交易中的资金以及您在硬币控制设置中主动冻结的资金。一旦各自的交易完成,锁定的余额将变得可用,而冻结的余额在您决定解冻之前仍然无法进行交易。", + "unavailable_balance_description": "不可用余额:此总额包括锁定在待处理交易中的资金以及您在选币控制设置中主动冻结的资金。一旦各自的交易完成,锁定的余额将变得可用,而冻结的余额在您决定解冻之前仍然无法进行交易。", "unconfirmed": "未确认余额", "understand": "我已知晓", "unlock": "开锁", "unmatched_currencies": "您当前钱包的货币与扫描的 QR 的货币不匹配", "unrestricted_background_service": "不受限制的背景服务", "unrestricted_background_service_notice": "为了启用背景同步,您需要启用无限制的背景服务", - "unspent_change": "改变", - "unspent_coins_details_title": "未使用代幣詳情", - "unspent_coins_title": "未使用的硬幣", + "unspent_change": "找零", + "unspent_coins_details_title": "未花费资金详情", + "unspent_coins_title": "未花费资金", "unsupported_asset": "我们不支持针对该资产采取此操作。请创建或切换到支持的资产类型的钱包。", "update_session": "更新会话", "uptime": "正常运行时间", @@ -1077,7 +1077,7 @@ "use_card_info_three": "在线使用电子卡或使用非接触式支付方式。", "use_card_info_two": "预付账户中的资金转换为美元,不是数字货币。", "use_device_theme": "使用设备主题", - "use_payjoin": "使用 Payjoin", + "use_payjoin": "使用 PayJoin(联合支付)", "use_ssl": "使用SSL", "use_suggested": "使用建议", "use_testnet": "使用TestNet", @@ -1087,87 +1087,87 @@ "variable_pair_not_supported": "所选交易所不支持此变量对", "verification": "验证", "verify_message": "验证消息", - "verify_seed": "验证种子", + "verify_seed": "验证助记词", "verify_with_2fa": "用 Cake 2FA 验证", "version": "版本 ${currentVersion}", "view_all": "查看全部", - "view_in_block_explorer": "View in Block Explorer", - "view_key_private": "View 密钥(私钥)", - "view_key_public": "View 密钥(公钥)", - "view_transaction_on": "View Transaction on ", + "view_in_block_explorer": "在区块浏览器中查看", + "view_key_private": "查看私钥 (View Key)", + "view_key_public": "查看公钥 (View Key)", + "view_transaction_on": "在...上查看交易", "voting_weight": "投票权重", "waitFewSecondForTxUpdate": "请等待几秒钟,交易才会反映在交易历史记录中", "wallet": "钱包", "wallet_group": "钱包组", - "wallet_group_description_existing_seed": "您已经选择在此钱包中使用现有种子。如果需要确认或写下来,您可能会再次验证种子。", - "wallet_group_description_four": "创建一个带有全新种子的钱包。", - "wallet_group_description_one": "在蛋糕钱包中,您可以创建一个", + "wallet_group_description_existing_seed": "您已经选择在此钱包中使用现有助记词。如果需要确认或写下来,您可能会再次验证助记词。", + "wallet_group_description_four": "创建一个带有全新助记词的钱包。", + "wallet_group_description_one": "在 Cake Wallet 中,您可以创建一个", "wallet_group_description_open_wallet": "否则,您可以继续打开钱包", "wallet_group_description_three": "查看可用的钱包和/或钱包组屏幕。或选择", - "wallet_group_description_two": "通过选择现有的钱包与种子共享。每个钱包组都可以包含每种货币类型的单个钱包。\n\n您可以选择", - "wallet_group_description_view_seed": "您可以随时再次在下面查看此种子", - "wallet_group_empty_state_text_one": "看起来您没有任何兼容的钱包组!\n\n tap", - "wallet_group_empty_state_text_two": "下面是一个新的。", - "wallet_has_passphrase": "这个钱包有一个密码", - "wallet_keys": "钱包种子/密钥", + "wallet_group_description_two": "通过选择现有钱包共享助记词。每组可含每种币种的一个钱包。\n\n您可以选择", + "wallet_group_description_view_seed": "您可以随时再次在下面查看此助记词", + "wallet_group_empty_state_text_one": "看起来您没有任何兼容的钱包组!\n\n点击", + "wallet_group_empty_state_text_two": "下方按钮创建一个新的。", + "wallet_has_passphrase": "这个钱包有一个密语", + "wallet_keys": "钱包助记词/密钥", "wallet_list_create_new_wallet": "创建新钱包", "wallet_list_edit_group_name": "编辑组名称", "wallet_list_edit_wallet": "编辑钱包", - "wallet_list_failed_to_load": "加载失败 ${wallet_name} 钱包. ${error}", - "wallet_list_failed_to_remove": "删除失败 ${wallet_name} 钱包. ${error}", + "wallet_list_failed_to_load": "加载失败 ${wallet_name} 钱包。${error}", + "wallet_list_failed_to_remove": "删除失败 ${wallet_name} 钱包。${error}", "wallet_list_load_wallet": "加载钱包", - "wallet_list_loading_wallet": "载入中 ${wallet_name} 钱包", - "wallet_list_removing_wallet": "删除 ${wallet_name} 钱包", + "wallet_list_loading_wallet": "正在载入 ${wallet_name} 钱包", + "wallet_list_removing_wallet": "正在删除 ${wallet_name} 钱包", "wallet_list_restore_wallet": "恢复钱包", "wallet_list_title": "Monero 钱包", "wallet_list_wallet_name": "钱包名称", "wallet_menu": "钱包菜单", "wallet_name": "钱包名称", - "wallet_name_exists": "同名的钱包已经存在", + "wallet_name_exists": "已存在同名钱包。请更改名称,或先重命名其他钱包。", "wallet_password_is_empty": "钱包密码为空。钱包密码不应为空", "wallet_recovery_height": "恢复高度", - "wallet_restoration_store_incorrect_seed_length": "种子长度错误", - "wallet_seed": "钱包种子", - "wallet_seed_legacy": "旧的钱包种子", + "wallet_restoration_store_incorrect_seed_length": "助记词长度错误", + "wallet_seed": "钱包助记词", + "wallet_seed_legacy": "旧的钱包助记词", "wallet_store_monero_wallet": "Monero 钱包", "walletConnect": "钱包连接", "wallets": "钱包", "warning": "警告", "website": "网站", "welcome": "欢迎", - "welcome_subtitle_new_wallet": "如果您想开始新鲜,请点击下面的创建新钱包,您将参加比赛。", - "welcome_subtitle_restore_wallet": "如果您有一个现有的钱包要把蛋糕带入蛋糕,只需选择还原现有的钱包,我们将带您完成整个过程。", + "welcome_subtitle_new_wallet": "想从零开始?点击下方【创建新钱包】即可快速上手。", + "welcome_subtitle_restore_wallet": "已有钱包导入 Cake Wallet?选择【恢复现有钱包】,我们将一步步引导您。", "welcome_to_cakepay": "欢迎来到 Cake Pay!", - "what_is_payjoin": "什么是工资join?", - "what_is_silent_payments": "什么是无声付款?", + "what_is_payjoin": "什么是 PayJoin?", + "what_is_silent_payments": "什么是静默支付?", "widgets_address": "地址", "widgets_or": "或者", "widgets_restore_from_blockheight": "从块高还原", "widgets_restore_from_date": "从日期还原", - "widgets_seed": "种子", + "widgets_seed": "助记词", "wouoldLikeToConnect": "想要连接", "write_down_backup_password": "请写下您的备份密码,该密码用于导入备份文件。", - "xmr_available_balance": "可用余额 ", + "xmr_available_balance": "可用余额", "xmr_full_balance": "全部余额", "xmr_hidden": "隐藏", "xmr_to_error": "XMR.TO 错误", - "xmr_to_error_description": "无效的金额。 小数点后最多8位数字", + "xmr_to_error_description": "无效金额。小数点后最多 8 位。", "yat": "Yat", "yat_address": "Yat 地址", - "yat_alert_content": "Cake Wallet 用戶現在可以使用獨一無二的基於表情符號的用戶名發送和接收他們喜歡的所有貨幣。", - "yat_alert_title": "使用 Yat 更輕鬆地發送和接收加密貨幣", - "yat_error": "Yat 誤差", - "yat_error_content": "沒有與此 Yat 相關聯的地址。 嘗試另一個 Yat", - "yat_popup_content": "您現在可以使用 Yat 在 Cake Wallet 中發送和接收加密貨幣 - 一個基於表情符號的簡短用戶名。 在設置屏幕上隨時管理 Yats", - "yat_popup_title": "您的錢包地址可以被表情化。", - "yes": "是的", + "yat_alert_content": "Cake Wallet 用户现在可以使用独一无二的基于表情符号的用户名发送和接收他们喜欢的所有货币。", + "yat_alert_title": "使用 Yat 更轻松地发送和接收加密货币", + "yat_error": "Yat 错误", + "yat_error_content": "没有与此 Yat 关联的地址。请尝试其他Yat", + "yat_popup_content": "您现在可以使用 Yat 在 Cake Wallet 中发送和接收加密货币 - 一个基于表情符号的简短用户名。在设置屏幕上随时管理 Yats", + "yat_popup_title": "您的钱包地址可以用表情符号表示。", + "yes": "是", "yesterday": "昨天", - "you_now_have_debit_card": "你现在有一张借记卡", - "you_pay": "你付钱", - "you_will_get": "转换到", + "you_now_have_debit_card": "您已成功开通Cake Pay借记卡", + "you_pay": "您支付", + "you_will_get": "转换为", "you_will_receive_estimated_amount": "您将收到(估计的)", "you_will_send": "转换自", - "youCanGoBackToYourDapp": "您现在可以回到DAPP", - "your": "你的", + "youCanGoBackToYourDapp": "您现在可以回到DApp", + "your": "您的", "yy": "YY" } \ No newline at end of file From 3c45ef8bb94284453c40ad242fb7ed22b89a9821 Mon Sep 17 00:00:00 2001 From: Karl Buys Date: Tue, 2 Dec 2025 00:59:24 +0200 Subject: [PATCH 093/105] fix: fixes missing model generation that causes build failures (#2689) * fix: fixes missing model generation that causes build failures * Update model_generator.sh [skip ci] Co-authored-by: cyan --------- Co-authored-by: Omar Hatem Co-authored-by: cyan --- model_generator.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model_generator.sh b/model_generator.sh index 7b720923dc..cb58f9e6cc 100755 --- a/model_generator.sh +++ b/model_generator.sh @@ -1,7 +1,7 @@ #!/bin/bash set -x -e -for cwcoin in cw_{core,evm,monero,bitcoin,nano,bitcoin_cash,solana,tron,wownero,zano,decred,dogecoin,base} +for cwcoin in cw_{core,evm,monero,bitcoin,nano,bitcoin_cash,solana,tron,wownero,zano,decred,dogecoin,base,arbitrum} do if [[ "x$1" == "xasync" ]]; then From 4f4181736107877b19732e9ca1fdb3e241834475 Mon Sep 17 00:00:00 2001 From: OmarHatem Date: Tue, 2 Dec 2025 00:13:12 +0100 Subject: [PATCH 094/105] fix zh translation [skip ci] --- res/values/strings_zh.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 88aca50fb1..50dc30523f 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -385,7 +385,7 @@ "exchange_result_write_down_ID": "*请复制或写下上方显示的 ID。", "exchange_result_write_down_trade_id": "请复制或写下交易编号以继续.", "exchange_sync_alert_content": "请等待,直到您的钱包同步", - "exchange_trade_result_confirm": "通过点击Cake Wallet的发送按钮,您将从钱包中发送 ${fetchingLabel} ${from} 到下方显示的地址。或者,您可以从外部钱包详细信息页面发送到地址/二维码。\n\n请按任意按钮继续或返回更改金额。", + "exchange_trade_result_confirm": "点击 Cake Wallet 中的“发送”按钮,您将从您的钱包 ${walletName} 向下方显示的地址发送 ${fetchingLabel} ${from}。您也可以从外部钱包详情页面向地址/二维码发送。请按任意按钮继续,或返回修改金额。", "expired": "已过期", "expires": "过期", "expiresOn": "到期", From 1d715d3963bb9e6d81fc22fe60f73e4a2ae4062e Mon Sep 17 00:00:00 2001 From: tuxsudo Date: Mon, 1 Dec 2025 23:19:27 +0000 Subject: [PATCH 095/105] Improve seed grid sizing (#2687) * Attempt to improve seed grid layout and sizing * Cleanup --- lib/src/widgets/seedphrase_grid_widget.dart | 22 ++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/lib/src/widgets/seedphrase_grid_widget.dart b/lib/src/widgets/seedphrase_grid_widget.dart index fb6c62d327..df8535f571 100644 --- a/lib/src/widgets/seedphrase_grid_widget.dart +++ b/lib/src/widgets/seedphrase_grid_widget.dart @@ -8,13 +8,27 @@ class SeedPhraseGridWidget extends StatelessWidget { final List list; + + @override Widget build(BuildContext context) { + + double desiredTileWidth = 120; + double spacing = 4; + double padding = 4; + double screenWidth = MediaQuery.of(context).size.width; + + int crossAxisCount = + ((screenWidth + spacing - (2 * padding)) / (desiredTileWidth + spacing)) + .floor(); + + if (crossAxisCount < 1) crossAxisCount = 1; + return GridView.builder( itemCount: list.length, gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 3, - childAspectRatio: 2.8, + crossAxisCount: crossAxisCount, + childAspectRatio: 2.6, mainAxisSpacing: 8.0, crossAxisSpacing: 8.0, ), @@ -41,6 +55,8 @@ class SeedPhraseGridWidget extends StatelessWidget { fontWeight: FontWeight.w700, color: Theme.of(context).colorScheme.onSurface.withOpacity(0.5), ), + softWrap: true, + maxLines: null, ), ), const SizedBox(width: 6), @@ -48,7 +64,7 @@ class SeedPhraseGridWidget extends StatelessWidget { child: Text( '${item[0].toLowerCase()}${item.substring(1)}', style: Theme.of(context).textTheme.bodyMedium?.copyWith( - height: 1.9, + height: 1, fontWeight: FontWeight.w700, color: Theme.of(context).colorScheme.onSurface, ), From a3774ae5c09e1dce21591d1547789415282959e0 Mon Sep 17 00:00:00 2001 From: malik1004x Date: Tue, 2 Dec 2025 01:01:37 +0100 Subject: [PATCH 096/105] Fix Twitter profile address parsing for profiles with a domain (#2696) * feat: parsing addresses+unstoppable domains from twitter profiles * fix: address resolution * fix: parse addresses from bio containing domain and address --------- Co-authored-by: Omar Hatem --- lib/entities/parse_address_from_domain.dart | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/entities/parse_address_from_domain.dart b/lib/entities/parse_address_from_domain.dart index 818a78184c..a1da5a2fe9 100644 --- a/lib/entities/parse_address_from_domain.dart +++ b/lib/entities/parse_address_from_domain.dart @@ -1,10 +1,11 @@ import 'package:cake_wallet/core/address_validator.dart'; import 'package:cake_wallet/core/yat_service.dart'; +import 'package:cake_wallet/entities/emoji_string_extension.dart'; import 'package:cake_wallet/entities/ens_record.dart'; +import 'package:cake_wallet/entities/fio_address_provider.dart'; import 'package:cake_wallet/entities/openalias_record.dart'; import 'package:cake_wallet/entities/parsed_address.dart'; import 'package:cake_wallet/entities/unstoppable_domain_address.dart'; -import 'package:cake_wallet/entities/emoji_string_extension.dart'; import 'package:cake_wallet/entities/wellknown_record.dart'; import 'package:cake_wallet/entities/zano_alias.dart'; import 'package:cake_wallet/exchange/provider/thorchain_exchange.provider.dart'; @@ -16,7 +17,6 @@ import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_type.dart'; -import 'package:cake_wallet/entities/fio_address_provider.dart'; import 'package:flutter/cupertino.dart'; import 'bip_353_record.dart'; @@ -243,7 +243,8 @@ class AddressResolver { final domain = extractUnstoppableDomain(twitterUser.description); if (domain.isNotEmpty) { final parsedAddressFromDomain = await resolve(context, domain, currency); - if (parsedAddressFromDomain.addresses.isNotEmpty) { + if (parsedAddressFromDomain.addresses.isNotEmpty && + parsedAddressFromDomain.addresses.first != domain) { return ParsedAddress( addresses: parsedAddressFromDomain.addresses, name: text, @@ -271,7 +272,8 @@ class AddressResolver { final domain = extractUnstoppableDomain(twitterUser.location); if (domain.isNotEmpty) { final parsedAddressFromDomain = await resolve(context, domain, currency); - if (parsedAddressFromDomain.addresses.isNotEmpty) { + if (parsedAddressFromDomain.addresses.isNotEmpty && + parsedAddressFromDomain.addresses.first != domain) { return ParsedAddress( addresses: parsedAddressFromDomain.addresses, name: text, @@ -301,7 +303,8 @@ class AddressResolver { final domain = extractUnstoppableDomain(pinnedTweet); if (domain.isNotEmpty) { final parsedAddressFromDomain = await resolve(context, domain, currency); - if (parsedAddressFromDomain.addresses.isNotEmpty) { + if (parsedAddressFromDomain.addresses.isNotEmpty && + parsedAddressFromDomain.addresses.first != domain) { return ParsedAddress( addresses: parsedAddressFromDomain.addresses, name: text, From 3e4409d2ba96b020586e593d8b91684f51ea6e29 Mon Sep 17 00:00:00 2001 From: T145 Date: Mon, 1 Dec 2025 20:47:08 -0500 Subject: [PATCH 097/105] fix(docs): Add proper descriptions to module READMEs (#2490) --- cw_bitcoin/README.md | 44 ++++++++++++++++++----- cw_bitcoin_cash/README.md | 62 ++++++++++++++++++-------------- cw_core/README.md | 26 +++++++++----- cw_decred/README.md | 46 +++++++++++++++++++++++- cw_dogecoin/README.md | 61 +++++++++++++++++-------------- cw_ethereum/README.md | 75 ++++++++++++++++++++++++++------------- cw_evm/README.md | 65 +++++++++++++++++++-------------- cw_monero/README.md | 13 +++++-- cw_mweb/README.md | 16 ++++----- cw_polygon/README.md | 74 +++++++++++++++++++++++++------------- cw_solana/README.md | 74 +++++++++++++++++++++++++------------- cw_tron/README.md | 74 +++++++++++++++++++++++++------------- cw_wownero/README.md | 13 +++++-- cw_zano/README.md | 26 +++++++++----- 14 files changed, 450 insertions(+), 219 deletions(-) diff --git a/cw_bitcoin/README.md b/cw_bitcoin/README.md index af26c17800..5a5076086e 100644 --- a/cw_bitcoin/README.md +++ b/cw_bitcoin/README.md @@ -1,14 +1,40 @@ # cw_bitcoin -A new Flutter package project. +Bitcoin-family Electrum wallet implementation used by Cake Wallet (BTC, LTC and derivatives). -## Getting Started +## Features -This project is a starting point for a Dart -[package](https://flutter.dev/developing-packages/), -a library module containing code that can be shared easily across -multiple Flutter or Dart projects. +- Electrum client and wallet with address/UTXO management and snapshots. +- Derivation via BIP‑39; receive/change chains with per-coin configs. +- Create/sign/broadcast transactions; PSBT helpers and payjoin support. +- Transaction history, priorities, and size-based fee calculations. +- Hardware wallet support for BTC/LTC. -For help getting started with Flutter, view our -[online documentation](https://flutter.dev/docs), which offers tutorials, -samples, guidance on mobile development, and a full API reference. +## Getting started + +Use the module via app services (see `bitcoin_wallet_service.dart`, `litecoin_wallet_service.dart`). Ensure Electrum nodes are configured for the target coin. + +```dart +final wallet = await BitcoinWallet.create( + mnemonic: '...', + password: 'secret', + walletInfo: walletInfo, + unspentCoinsInfo: unspentCoinsBox, + encryptionFileUtils: encryption, +); +``` + +## Usage + +Send BTC with medium priority: + +```dart +final feeRate = wallet.feeRate(BitcoinTransactionPriority.medium); +final pending = await wallet.createTransaction( + outputs: [BitcoinTransactionOutput(address: 'bc1...', amount: 50000)], + feeRate: feeRate, +); +final txHash = await pending.commit(); +``` + +See `lib/` for wallet/services, PSBT, and payjoin utilities. diff --git a/cw_bitcoin_cash/README.md b/cw_bitcoin_cash/README.md index 02fe8ecabc..15c0fcb7e2 100644 --- a/cw_bitcoin_cash/README.md +++ b/cw_bitcoin_cash/README.md @@ -1,39 +1,49 @@ - +### Features -TODO: Put a short description of the package here that helps potential users -know whether this package might be useful for them. +- Derive keys via BIP‑39; maintain receive/change address chains. +- Load/save snapshots of addresses, indices, and balances. +- Electrum connectivity and UTXO management. +- Create/sign/broadcast BCH transactions; calculate size-based fees by priority. +- CashAddr compatibility for addresses; migration of legacy snapshots. +- Message signing and verification. -## Features +### Getting started -TODO: List what your package can do. Maybe include images, gifs, or videos. +Create/open via the app’s wallet service using `WalletType.bitcoinCash`. Ensure BCH Electrum nodes are configured. -## Getting started - -TODO: List prerequisites and provide or point to information on how to -start using the package. +```dart +final wallet = await BitcoinCashWallet.create( + mnemonic: '...', + password: 'secret', + walletInfo: walletInfo, + unspentCoinsInfo: unspentCoinsBox, + encryptionFileUtils: encryption, +); +``` -## Usage +### Usage -TODO: Include short and useful examples for package users. Add longer examples -to `/example` folder. +Fee calculation and send: ```dart -const like = 'sample'; +final feeRate = wallet.feeRate(BitcoinCashTransactionPriority.medium); +final pending = await wallet.createTransaction( + outputs: [ + BitcoinTransactionOutput( + address: 'bitcoincash:qq...', + amount: 10000, // satoshis + ), + ], + feeRate: feeRate, +); +final txHash = await pending.commit(); ``` -## Additional information +### Additional information -TODO: Tell users more about the package: where to find more information, how to -contribute to the package, how to file issues, what response they can expect -from the package authors, and more. +- See `lib/src/` for: `BitcoinCashWallet`, `BitcoinCashWalletAddresses`, and helpers in `bitcoin_cash_base.dart`. +- Snapshot migration and CashAddr normalization are handled during open. diff --git a/cw_core/README.md b/cw_core/README.md index 7604ae9653..9224a2f24d 100644 --- a/cw_core/README.md +++ b/cw_core/README.md @@ -1,14 +1,22 @@ # cw_core -A new Flutter package project. +Core abstractions and shared types for Cake Wallet modules. -## Getting Started +## Highlights -This project is a starting point for a Dart -[package](https://flutter.dev/developing-packages/), -a library module containing code that can be shared easily across -multiple Flutter or Dart projects. +- Wallet primitives: `WalletBase`, `WalletService`, `WalletInfo`, `WalletAddresses`. +- Transaction primitives: `TransactionInfo`, `TransactionHistoryBase`, directions/priorities. +- Currency models: `CryptoCurrency`, `Erc20Token`, SPL/TRON token types. +- Persistence helpers: Hive adapters, path helpers (`pathForWallet`), encrypted storage utils. +- Node representation (`Node`) and sync status types. -For help getting started with Flutter, view our -[online documentation](https://flutter.dev/docs), which offers tutorials, -samples, guidance on mobile development, and a full API reference. +## Usage + +Extend `WalletBase` for a new chain and provide a `WalletService` implementation to create/open/restore wallets. + +```dart +class MyChainWallet extends WalletBase { /* ... */ } +class MyChainWalletService extends WalletService { /* ... */ } +``` + +See the chain modules (e.g., `cw_bitcoin`, `cw_evm`) for complete examples. diff --git a/cw_decred/README.md b/cw_decred/README.md index d24bc80a4a..c43032f7a8 100644 --- a/cw_decred/README.md +++ b/cw_decred/README.md @@ -1,3 +1,47 @@ # cw_decred -TODO: Fill this out. +Decred wallet module that bridges to the native `libdcrwallet` via FFI. Provides high‑level methods to create/load wallets, sync, query balances/transactions, build and broadcast transactions, and sign/verify messages. + +## Features + +- FFI bindings to `libdcrwallet` with an isolate‑based request/response model. +- Initialize, create, load, close wallets; watch‑only creation. +- Start sync with optional peer list; query sync status and best block. +- Query balances, list transactions and unspents, rescan from height. +- Create signed transactions and broadcast raw transactions. +- Export wallet seed; change wallet password. +- Address management (new external address, default pubkey, address lists). +- Message signing and verification. + +## Getting started + +Ensure the platform library is available: + +- Android/Linux: `libdcrwallet.so` +- Apple: embedded `cw_decred.framework/cw_decred` + +Initialize and load a wallet: + +```dart +final lib = await Libwallet.spawn(); +await lib.initLibdcrwallet('', 'info'); +await lib.loadWallet(jsonEncode({ /* libdcrwallet config */ })); +await lib.startSync('wallet.db', ''); +final status = await lib.syncStatus('wallet.db'); +``` + +## Usage + +Create, sign, and broadcast a transaction: + +```dart +final signed = await lib.createSignedTransaction('wallet.db', jsonEncode({ + // inputs/outputs and policy for libdcrwallet +})); +final txid = await lib.sendRawTransaction('wallet.db', signed); +``` + +## Additional information + +- See `lib/api/` for the isolate wrapper (`libdcrwallet.dart`) and low‑level bindings. +- Errors are surfaced via the `PayloadResult` struct; some calls support `throwOnError` in higher‑level wrappers. diff --git a/cw_dogecoin/README.md b/cw_dogecoin/README.md index 4a260d8d27..40b69e48d0 100644 --- a/cw_dogecoin/README.md +++ b/cw_dogecoin/README.md @@ -1,39 +1,48 @@ - +### Features -TODO: Put a short description of the package here that helps potential users -know whether this package might be useful for them. +- Derive keys via BIP‑39; Dogecoin HD paths using `bitcoin_base`. +- Connect to Electrum nodes; maintain address sets and UTXOs. +- Create/sign/broadcast DOGE transactions with configurable fee rate. +- Address book and index management (receive/change, auto-generate settings). +- Message signing and verification. -## Features +### Getting started -TODO: List what your package can do. Maybe include images, gifs, or videos. +Create/open via `DogecoinWalletService` in the app using `WalletType.dogecoin`. Ensure Electrum nodes are configured for Dogecoin. -## Getting started - -TODO: List prerequisites and provide or point to information on how to -start using the package. +```dart +final wallet = await DogeCoinWallet.create( + mnemonic: '...', + password: 'secret', + walletInfo: walletInfo, + unspentCoinsInfo: unspentCoinsBox, + encryptionFileUtils: encryption, +); +``` -## Usage +### Usage -TODO: Include short and useful examples for package users. Add longer examples -to `/example` folder. +Estimate fee and send: ```dart -const like = 'sample'; +final feeRate = wallet.feeRate(BitcoinCashTransactionPriority.medium); // example priority mapping +final pending = await wallet.createTransaction( + outputs: [ + BitcoinTransactionOutput( + address: 'D...', + amount: 1 * 100000000, // 1 DOGE in koinu + ), + ], + feeRate: feeRate, +); +final txHash = await pending.commit(); ``` -## Additional information +### Additional information -TODO: Tell users more about the package: where to find more information, how to -contribute to the package, how to file issues, what response they can expect -from the package authors, and more. +- See `lib/src/` for classes: `DogeCoinWallet`, `DogeCoinWalletAddresses`. +- Relies on core Electrum features in `cw_bitcoin` for UTXO selection and persistence. diff --git a/cw_ethereum/README.md b/cw_ethereum/README.md index 02fe8ecabc..70a350bbf6 100644 --- a/cw_ethereum/README.md +++ b/cw_ethereum/README.md @@ -1,39 +1,64 @@ - +### Features -TODO: Put a short description of the package here that helps potential users -know whether this package might be useful for them. +- EVM client specialized for Ethereum mainnet (chainId 1). +- Default ERC‑20 token list and wallet‑scoped token storage/migration. +- History via Etherscan v2 API (external, internal, and token transfers). +- EIP‑1559 fee support; gas estimation per transaction intent. +- Create/sign native and ERC‑20 transfers; approvals; broadcast. +- Manage ERC‑20 tokens and balances; metadata lookup when needed. +- Message signing and verification. +- Node health checks for native and USDC token balance. -## Features +### Getting started -TODO: List what your package can do. Maybe include images, gifs, or videos. +Add shared EVM secrets (see `cw_evm` README): -## Getting started +```dart +// cw_evm/lib/.secrets.g.dart (DO NOT COMMIT) +const String etherScanApiKey = 'YOUR_ETHERSCAN_KEY'; +const String nowNodesApiKey = 'YOUR_NOWNODES_KEY'; // if using eth.nownodes.io +const String moralisApiKey = 'YOUR_MORALIS_KEY'; // optional +``` + +Connect and sync: -TODO: List prerequisites and provide or point to information on how to -start using the package. +```dart +final service = EthereumWalletService(walletInfoBox, true, client: EthereumClient()); +final wallet = await service.create(EVMChainNewWalletCredentials(name: 'My ETH', password: 'secret')); +await wallet.connectToNode(node: Node(uriRaw: 'eth.llamarpc.com', isSSL: true)); +await wallet.startSync(); +``` -## Usage +### Usage + +Send ETH: + +```dart +final pending = await wallet.createTransaction( + EVMChainTransactionCredentials.single( + address: '0x...', + cryptoAmount: '0.05', + currency: CryptoCurrency.eth, + priority: EVMChainTransactionPriority.medium, + ), +); +final hash = await pending.commit(); +``` -TODO: Include short and useful examples for package users. Add longer examples -to `/example` folder. +Add an ERC‑20 token and refresh balance: ```dart -const like = 'sample'; +final token = await wallet.getErc20Token('0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', 'eth'); // USDC +if (token != null) { + await wallet.addErc20Token(token); +} ``` -## Additional information +### Additional information -TODO: Tell users more about the package: where to find more information, how to -contribute to the package, how to file issues, what response they can expect -from the package authors, and more. +- Toggle Etherscan usage via shared preferences key `use_etherscan`. +- See `lib/` for APIs: `EthereumClient`, `EthereumWallet`, `EthereumWalletService`. diff --git a/cw_evm/README.md b/cw_evm/README.md index 02fe8ecabc..c207a22024 100644 --- a/cw_evm/README.md +++ b/cw_evm/README.md @@ -1,39 +1,52 @@ - +### What it provides -TODO: Put a short description of the package here that helps potential users -know whether this package might be useful for them. +- `EVMChainClient` (Web3 + HTTP): + - Connect to RPC (supports NowNodes short hosts with API key). + - Read balance, gas price/base fee, estimate gas, send raw tx, watch tx. + - Sign native and ERC‑20 transactions; build approval calldata. + - Fetch ERC‑20 metadata (via Moralis) and balances. +- `EVMChainWallet`: + - Derive keys from BIP‑39 or use private key / Ledger (`EvmLedgerCredentials`). + - EIP‑1559 fee calculation with priority presets; Polygon-specific tuning. + - ERC‑20 token box per wallet; add/remove tokens and maintain balances. + - Transaction history assembly (external/internal + token transfers). + - Message sign/verify helpers. +- `EVMChainWalletService`: common create/open/restore/rename lifecycle. -## Features +### Secrets -TODO: List what your package can do. Maybe include images, gifs, or videos. +Create `cw_evm/lib/.secrets.g.dart` (do not commit): -## Getting started - -TODO: List prerequisites and provide or point to information on how to -start using the package. +```dart +const String nowNodesApiKey = '...'; // used for eth.nownodes.io / matic.nownodes.io +const String etherScanApiKey = '...'; // Etherscan v2 API key (incl. Polygon) +const String moralisApiKey = '...'; // optional, ERC-20 metadata lookup +``` -## Usage +### Extending to a new EVM chain -TODO: Include short and useful examples for package users. Add longer examples -to `/example` folder. +Create a client and wallet subclass: ```dart -const like = 'sample'; +class MyChainClient extends EVMChainClient { + @override + int get chainId => 8453; // example + @override + Uint8List prepareSignedTransactionForSending(Uint8List tx) => tx; + @override + Future> fetchTransactions(String address, {String? contractAddress}) async { /* ... */ } + @override + Future> fetchInternalTransactions(String address) async { /* ... */ } +} ``` -## Additional information +Then wire into a `WalletService` similar to `EthereumWalletService`/`PolygonWalletService`. + +### Additional information -TODO: Tell users more about the package: where to find more information, how to -contribute to the package, how to file issues, what response they can expect -from the package authors, and more. +- Uses `web3dart` under the hood and integrates with Cake Wallet’s `cw_core` types. +- See `lib/` for the reference implementation details. diff --git a/cw_monero/README.md b/cw_monero/README.md index 09ff8cf874..c6066086a6 100644 --- a/cw_monero/README.md +++ b/cw_monero/README.md @@ -1,5 +1,14 @@ # cw_monero -This project is part of Cake Wallet app. +Monero wallet module for Cake Wallet, backed by native bindings to Monero’s wallet library and high-level Dart wrappers. -Copyright (c) 2020 Cake Technologies LLC. \ No newline at end of file +## Features + +- Create/open/restore Monero wallets; manage accounts and subaddresses. +- Build/sign/broadcast transactions; track history and unspent outputs. +- Ledger hardware wallet support. +- Exception types for common wallet operations. + +## Usage + +See `lib/api/wallet.dart`, `wallet_manager.dart`, and high-level wrappers like `monero_wallet.dart` and `monero_wallet_service.dart` in the app for examples of creating and managing wallets. diff --git a/cw_mweb/README.md b/cw_mweb/README.md index 8a839b1ecc..5e43e64189 100644 --- a/cw_mweb/README.md +++ b/cw_mweb/README.md @@ -1,15 +1,13 @@ # cw_mweb -A new Flutter plugin project. +MimbleWimble Extension Blocks (MWEB) integration bridge for Cake Wallet modules that support MWEB-enabled chains. -## Getting Started +## Features -This project is a starting point for a Flutter -[plug-in package](https://flutter.dev/developing-packages/), -a specialized package that includes platform-specific implementation code for -Android and/or iOS. +- Dart platform interface and method-channel implementation. +- Protobuf stubs for `mwebd` interactions (`mwebd.pb*.dart`). +- Provides a uniform API surface for MWEB-capable coins. -For help getting started with Flutter development, view the -[online documentation](https://flutter.dev/docs), which offers tutorials, -samples, guidance on mobile development, and a full API reference. +## Usage +Import `cw_mweb` and use the platform interface to interact with an MWEB daemon/binding. See the chain-specific modules for concrete usage. diff --git a/cw_polygon/README.md b/cw_polygon/README.md index 02fe8ecabc..300e5c968b 100644 --- a/cw_polygon/README.md +++ b/cw_polygon/README.md @@ -1,39 +1,63 @@ - +### Features -TODO: Put a short description of the package here that helps potential users -know whether this package might be useful for them. +- EVM chain integration (chainId 137) with `web3dart`. +- Default ERC‑20 token list and per‑wallet token box. +- History via Etherscan v2 API (Polygon chain id) and internal tx support. +- Fee handling tuned for Polygon (priority fee floor, legacy gasPrice when needed). +- Create/sign native and ERC‑20 transfers; approvals; send/broadcast. +- Manage tokens (enable/disable, add/remove) and balances. +- Message signing and verification. -## Features +### Getting started -TODO: List what your package can do. Maybe include images, gifs, or videos. +Provide secrets used by the shared EVM layer in `cw_evm/lib/.secrets.g.dart`: -## Getting started +```dart +// cw_evm/lib/.secrets.g.dart (DO NOT COMMIT) +const String etherScanApiKey = 'YOUR_ETHERSCAN_KEY'; +const String nowNodesApiKey = 'YOUR_NOWNODES_KEY'; // if using matic.nownodes.io +const String moralisApiKey = 'YOUR_MORALIS_KEY'; // optional: ERC20 metadata +``` + +Connect and sync: -TODO: List prerequisites and provide or point to information on how to -start using the package. +```dart +final service = PolygonWalletService(walletInfoBox, true, client: PolygonClient()); +final wallet = await service.create(EVMChainNewWalletCredentials(name: 'My POL', password: 'secret')); +await wallet.connectToNode(node: Node(uriRaw: 'polygon-rpc.com', isSSL: true)); +await wallet.startSync(); +``` -## Usage +### Usage + +Send MATIC: + +```dart +final pending = await wallet.createTransaction( + EVMChainTransactionCredentials.single( + address: '0x...', + cryptoAmount: '0.2', + currency: CryptoCurrency.maticpoly, + priority: EVMChainTransactionPriority.medium, + ), +); +final hash = await pending.commit(); +``` -TODO: Include short and useful examples for package users. Add longer examples -to `/example` folder. +Add an ERC‑20 token and refresh balance: ```dart -const like = 'sample'; +final token = await wallet.getErc20Token('0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174', 'polygon'); // USDC +if (token != null) { + await wallet.addErc20Token(token); +} ``` -## Additional information +### Additional information -TODO: Tell users more about the package: where to find more information, how to -contribute to the package, how to file issues, what response they can expect -from the package authors, and more. +- Toggle PolygonScan usage via shared preferences key `use_polygonscan`. +- See `lib/` for APIs: `PolygonClient`, `PolygonWallet`, `PolygonWalletService`. diff --git a/cw_solana/README.md b/cw_solana/README.md index 02fe8ecabc..541bee62a7 100644 --- a/cw_solana/README.md +++ b/cw_solana/README.md @@ -1,39 +1,63 @@ - +### Features -TODO: Put a short description of the package here that helps potential users -know whether this package might be useful for them. +- Connect to Solana RPC (Ankr/Chainstack/custom) via `SolanaRPC` over HTTP. +- Fetch SOL balances and aggregate SPL token balances across accounts. +- Parse and stream native and SPL token transactions (filters ATA-only and spam-like micro txs). +- Estimate fees per compiled message and enforce rent-exemption checks. +- Create/sign/broadcast SOL and SPL transfers; auto-create recipient ATA when necessary. +- Manage SPL tokens; fetch on-chain metadata (symbol/name) for unknown mints. +- Sign and verify messages. +- Node health checks for SOL and a known SPL token (USDC). -## Features +### Getting started -TODO: List what your package can do. Maybe include images, gifs, or videos. +If you use hosted RPC providers, add a secrets file for keys (optional unless using those hosts): -## Getting started +```dart +// cw_solana/lib/.secrets.g.dart (DO NOT COMMIT) +const String ankrApiKey = 'YOUR_ANKR_KEY'; +const String chainStackApiKey = 'YOUR_CHAINSTACK_KEY'; +``` + +Connect and sync: -TODO: List prerequisites and provide or point to information on how to -start using the package. +```dart +final service = SolanaWalletService(walletInfoBox, true); +final wallet = await service.create(SolanaNewWalletCredentials(name: 'My SOL', password: 'secret')); +await wallet.connectToNode(node: Node(uriRaw: 'api.mainnet-beta.solana.com', isSSL: true)); +await wallet.startSync(); +final sol = wallet.balance[CryptoCurrency.sol]?.balance; +``` -## Usage +### Usage + +Send SOL: + +```dart +final pending = await wallet.createTransaction( + SolanaTransactionCredentials.single( + address: 'SoL...', + cryptoAmount: '0.05', + currency: CryptoCurrency.sol, + ), +); +final sig = await pending.commit(); +``` -TODO: Include short and useful examples for package users. Add longer examples -to `/example` folder. +Add an SPL token by mint: ```dart -const like = 'sample'; +final token = await wallet.getSPLToken('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'); // USDC +if (token != null) { + await wallet.addSPLToken(token); +} ``` -## Additional information +### Additional information -TODO: Tell users more about the package: where to find more information, how to -contribute to the package, how to file issues, what response they can expect -from the package authors, and more. +- When using `rpc.ankr.com` or `solana-mainnet.core.chainstack.com`, the client reads API keys from `.secrets.g.dart`. +- See `lib/` for APIs: `SolanaWalletClient`, `SolanaWallet`, `SolanaWalletService`, and credential types. diff --git a/cw_tron/README.md b/cw_tron/README.md index 02fe8ecabc..4ebd45632c 100644 --- a/cw_tron/README.md +++ b/cw_tron/README.md @@ -1,39 +1,63 @@ - +### Features -TODO: Put a short description of the package here that helps potential users -know whether this package might be useful for them. +- Connect to TRON nodes over HTTP(S) via `TronProvider`/`TronHTTPProvider`. +- Fetch TRX balance and TRC-20 token balances. +- Estimate fees using bandwidth/energy and memo fee; accounts for available account resources. +- Create and sign TRX and TRC-20 transfers (supports send-all and optional memo). +- Broadcast signed transactions. +- Load account history (TRX and TRC-20), filtering spam and TRC10-only events. +- Manage TRC-20 tokens: add/remove tokens and fetch token metadata. +- Sign/verify messages. +- Node health checks for both native and token balance endpoints. -## Features +### Getting started -TODO: List what your package can do. Maybe include images, gifs, or videos. +Provide a TRON RPC endpoint and a TronGrid API key. Add a secrets file: -## Getting started +```dart +// cw_tron/lib/.secrets.g.dart (DO NOT COMMIT) +const String tronGridApiKey = 'YOUR_TRONGRID_API_KEY'; +``` + +Basic connect and sync: -TODO: List prerequisites and provide or point to information on how to -start using the package. +```dart +final service = TronWalletService(walletInfoBox, client: TronClient(), isDirect: true); +final wallet = await service.create(TronNewWalletCredentials(name: 'My TRON', password: 'secret')); +await wallet.connectToNode(node: Node(uriRaw: 'api.trongrid.io', isSSL: true)); +await wallet.startSync(); +final trxBalance = wallet.balance[CryptoCurrency.trx]; +``` -## Usage +### Usage + +Send TRX: + +```dart +final pending = await wallet.createTransaction( + TronTransactionCredentials.single( + address: 'T...', + cryptoAmount: '1.5', + currency: CryptoCurrency.trx, + ), +); +final txHash = await pending.commit(); +``` -TODO: Include short and useful examples for package users. Add longer examples -to `/example` folder. +Add USDT (TRC-20): ```dart -const like = 'sample'; +final usdt = await wallet.getTronToken('TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t'); +if (usdt != null) { + await wallet.addTronToken(usdt); +} ``` -## Additional information +### Additional information -TODO: Tell users more about the package: where to find more information, how to -contribute to the package, how to file issues, what response they can expect -from the package authors, and more. +- History and token queries use TronGrid; set `tronGridApiKey`. +- See `lib/` for APIs: `TronClient`, `TronWallet`, `TronWalletService`, and credential types. diff --git a/cw_wownero/README.md b/cw_wownero/README.md index 191316437e..954a20087e 100644 --- a/cw_wownero/README.md +++ b/cw_wownero/README.md @@ -1,5 +1,14 @@ # cw_wownero -This project is part of Cake Wallet app. +Wownero wallet module for Cake Wallet, providing a Monero-family wallet with Wownero-specific APIs and bindings. -Copyright (c) 2020 Cake Technologies LLC. \ No newline at end of file +## Features + +- Create/open/restore Wownero wallets; accounts and subaddresses. +- Build/sign/broadcast transactions; history and unspent outputs. +- Platform interface and method channel for native bindings. +- Exception types for setup, creation, opening, and restore flows. + +## Usage + +See `lib/api/` and high-level wrappers like `wownero_wallet.dart` and `wownero_wallet_service.dart` for end-to-end wallet lifecycle and usage. diff --git a/cw_zano/README.md b/cw_zano/README.md index 4a297e8e38..d8f977d148 100644 --- a/cw_zano/README.md +++ b/cw_zano/README.md @@ -1,15 +1,23 @@ # cw_zano -A new flutter plugin project. +Zano wallet module for Cake Wallet. Provides a Dart wrapper around the Zano wallet API with typed models and transaction helpers. -## Getting Started +## Features -This project is a starting point for a Flutter -[plug-in package](https://flutter.dev/developing-packages/), -a specialized package that includes platform-specific implementation code for -Android and/or iOS. +- Wallet lifecycle and status queries via `ZanoWalletApi`. +- Typed models for balances, transfers, recent history, and wallet info. +- Build and submit transfers; pending transaction modeling. +- Address and asset utilities, formatter helpers. -For help getting started with Flutter, view our -[online documentation](https://flutter.dev/docs), which offers tutorials, -samples, guidance on mobile development, and a full API reference. +## Usage +See `lib/zano_wallet_api.dart` and `lib/zano_wallet.dart` for the high-level API. Typical flow: + +```dart +final api = ZanoWalletApi(); +final info = await api.getWalletInfo(); +final balance = await api.getBalance(); +// create transfer params and broadcast +``` + +Consult `lib/api/model/` for full set of supported request/response models. From 20022c03930d6764279babcfcc433ddf219ab759 Mon Sep 17 00:00:00 2001 From: Matthew Fosse <6175367+fossephate@users.noreply.github.com> Date: Mon, 1 Dec 2025 18:16:21 -0800 Subject: [PATCH 098/105] CW-994 mweb enhancements (#2204) * add mweb block explorer * potential fix for #2 * fix spending when mweb is disabled * Update cw_bitcoin/lib/litecoin_wallet.dart * fix resolving conflict missing brackets --------- Co-authored-by: Omar Hatem --- cw_bitcoin/lib/electrum_wallet.dart | 8 +++++- cw_bitcoin/lib/litecoin_wallet.dart | 26 +++++++++++++++---- cw_bitcoin/lib/litecoin_wallet_addresses.dart | 2 +- .../transaction_details_view_model.dart | 25 ++++++++++++++++++ 4 files changed, 54 insertions(+), 7 deletions(-) diff --git a/cw_bitcoin/lib/electrum_wallet.dart b/cw_bitcoin/lib/electrum_wallet.dart index dbd3fe8a00..477544ee93 100644 --- a/cw_bitcoin/lib/electrum_wallet.dart +++ b/cw_bitcoin/lib/electrum_wallet.dart @@ -11,7 +11,6 @@ import 'package:cw_bitcoin/bitcoin_amount_format.dart'; import 'package:cw_core/utils/print_verbose.dart'; import 'package:cw_bitcoin/bitcoin_wallet.dart'; import 'package:cw_bitcoin/litecoin_wallet.dart'; -import 'package:path_provider/path_provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:blockchain_utils/blockchain_utils.dart'; import 'package:collection/collection.dart'; @@ -899,6 +898,13 @@ abstract class ElectrumWalletBase throw BitcoinTransactionNoDustException(); } + // if mweb isn't enabled, don't consider spending mweb coins: + if (this is LitecoinWallet) { + var mwebEnabled = (this as LitecoinWallet).mwebEnabled; + if (!mwebEnabled) { + coinTypeToSpendFrom = UnspentCoinType.nonMweb; + } + } // If there is only one output, and the amount to send is more than the max spendable amount // then it is actually a send all transaction diff --git a/cw_bitcoin/lib/litecoin_wallet.dart b/cw_bitcoin/lib/litecoin_wallet.dart index 91d927da00..bdbbe3f679 100644 --- a/cw_bitcoin/lib/litecoin_wallet.dart +++ b/cw_bitcoin/lib/litecoin_wallet.dart @@ -886,6 +886,8 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store { if (unspent.vout == 0) { unspent.isChange = true; } + + // printV("unspent: $unspent ${unspent.vout} ${utxo.value}"); mwebUnspentCoins.add(unspent); }); @@ -1140,13 +1142,27 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store { @override Future createTransaction(Object credentials) async { try { - var tx = await super.createTransaction(credentials) as PendingBitcoinTransaction; + var creds; + if (!mwebEnabled) { + BitcoinTransactionCredentials btcCreds = (credentials as BitcoinTransactionCredentials); + // sets unspent coin type to nonMweb: + creds = BitcoinTransactionCredentials( + btcCreds.outputs, + priority: btcCreds.priority, + feeRate: btcCreds.feeRate, + coinTypeToSpendFrom: UnspentCoinType.nonMweb, + ); + } else { + creds = credentials; + } + var tx = await super.createTransaction(creds as Object) as PendingBitcoinTransaction; tx.isMweb = mwebEnabled; if (!mwebEnabled) { tx.changeAddressOverride = (await (walletAddresses as LitecoinWalletAddresses) .getChangeAddress(coinTypeToSpendFrom: UnspentCoinType.nonMweb)) .address; + if (tx.shouldCommitUR()) { tx.unsignedPsbt = await buildPsbt(tx, false); } @@ -1165,17 +1181,17 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store { final address = output.address.toLowerCase(); final extractedAddress = output.extractedAddress?.toLowerCase(); - if (address.contains("mweb")) { + if (address.startsWith("ltcmweb")) { hasMwebOutput = true; } - if (!address.contains("mweb")) { + if (!address.startsWith("ltcmweb")) { hasRegularOutput = true; } if (extractedAddress != null && extractedAddress.isNotEmpty) { - if (extractedAddress.contains("mweb")) { + if (extractedAddress.startsWith("ltcmweb")) { hasMwebOutput = true; } - if (!extractedAddress.contains("mweb")) { + if (!extractedAddress.startsWith("ltcmweb")) { hasRegularOutput = true; } } diff --git a/cw_bitcoin/lib/litecoin_wallet_addresses.dart b/cw_bitcoin/lib/litecoin_wallet_addresses.dart index 9b32118678..1493fbfb2a 100644 --- a/cw_bitcoin/lib/litecoin_wallet_addresses.dart +++ b/cw_bitcoin/lib/litecoin_wallet_addresses.dart @@ -188,7 +188,7 @@ abstract class LitecoinWalletAddressesBase extends ElectrumWalletAddresses with if (!element.isSending || element.isFrozen) { return; } - if (element.address.contains("mweb")) { + if (element.address.startsWith("ltcmweb")) { comesFromMweb = true; } }); diff --git a/lib/view_model/transaction_details_view_model.dart b/lib/view_model/transaction_details_view_model.dart index ffe22facf0..810d08c165 100644 --- a/lib/view_model/transaction_details_view_model.dart +++ b/lib/view_model/transaction_details_view_model.dart @@ -59,6 +59,7 @@ abstract class TransactionDetailsViewModelBase with Store { if (!canReplaceByFee) _checkForRBF(tx); break; case WalletType.litecoin: + _addLitecoinListItems(tx, dateFormat); case WalletType.bitcoinCash: _addElectrumListItems(tx, dateFormat); break; @@ -388,6 +389,30 @@ abstract class TransactionDetailsViewModelBase with Store { items.addAll(_items); } + void _addLitecoinListItems(TransactionInfo tx, DateFormat dateFormat) { + _addElectrumListItems(tx, dateFormat); + + bool isMweb = bitcoin!.txIsMweb(tx); + + final _items = [ + if (isMweb) + BlockExplorerListItem( + title: S.current.view_in_block_explorer, + value: S.current.view_transaction_on + 'mwebexplorer.com', + onTap: () async { + try { + final uri = Uri.parse('https://www.mwebexplorer.com/blocks/block/${tx.height}'); + if (await canLaunchUrl(uri)) + await launchUrl(uri, mode: LaunchMode.externalApplication); + } catch (e) {} + }, + key: ValueKey('block_explorer_list_item_mweb_wallet_type_key'), + ), + ]; + + items.addAll(_items); + } + void _addHavenListItems(TransactionInfo tx, DateFormat dateFormat) { items.addAll([ StandartListItem( From da478b54218b1ba8ec788c43f96ecbc7c199f562 Mon Sep 17 00:00:00 2001 From: Serhii Date: Tue, 2 Dec 2025 04:16:48 +0200 Subject: [PATCH 099/105] quick-fix-for-the-Trocador-swap (#2695) * update network tag logic in Trocador provider * fix fiat amount * Update trocador_exchange_provider.dart --------- Co-authored-by: Serhii-Borodenko <17529954+Serhii-Borodenko@users.noreply.github.com> --- lib/exchange/provider/trocador_exchange_provider.dart | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/exchange/provider/trocador_exchange_provider.dart b/lib/exchange/provider/trocador_exchange_provider.dart index fbb86872e6..d4d89a2100 100644 --- a/lib/exchange/provider/trocador_exchange_provider.dart +++ b/lib/exchange/provider/trocador_exchange_provider.dart @@ -423,13 +423,15 @@ class TrocadorExchangeProvider extends ExchangeProvider { final fromCurrency = responseJSON['ticker_from'] as String; final fromNetwork = responseJSON['network_from'] as String?; final _normalizedFromNetwork = _normalizeNetworkType(fromNetwork ?? ''); - final fromTag = _normalizedFromNetwork.isEmpty || _normalizedFromNetwork == 'Mainnet' ? null : _normalizedFromNetwork; + final fromTag = _normalizedFromNetwork.isEmpty || _normalizedFromNetwork == fromCurrency.toUpperCase() || _normalizedFromNetwork == 'Mainnet' + ? null : _normalizedFromNetwork; + final from = CryptoCurrency.safeParseCurrencyFromString(fromCurrency, tag: fromTag); - + final toCurrency = responseJSON['ticker_to'] as String; final networkTo = responseJSON['network_to'] as String?; final _normalizedToNetwork = _normalizeNetworkType(networkTo ?? ''); - final toTag = _normalizedToNetwork.isEmpty || _normalizedToNetwork == 'Mainnet' ? null : _normalizedToNetwork; + final toTag = _normalizedToNetwork.isEmpty || _normalizedToNetwork == toCurrency.toUpperCase() || _normalizedFromNetwork == 'Mainnet' ? null : _normalizedToNetwork; final to = CryptoCurrency.safeParseCurrencyFromString(toCurrency, tag: toTag); return Trade( From 04a6f637fc828332c66ff5f87b8956c79a84afca Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Tue, 2 Dec 2025 16:38:36 +0100 Subject: [PATCH 100/105] fix: merge conflict --- cw_core/lib/crypto_currency.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cw_core/lib/crypto_currency.dart b/cw_core/lib/crypto_currency.dart index b9273b0a76..abe8bb7323 100644 --- a/cw_core/lib/crypto_currency.dart +++ b/cw_core/lib/crypto_currency.dart @@ -3,9 +3,9 @@ import 'dart:ui'; import 'package:cw_core/currency.dart'; import 'package:cw_core/enumerable_item.dart'; import 'package:collection/collection.dart'; +import 'package:cw_core/format_fixed.dart'; import 'package:cw_core/parse_fixed.dart'; - -import 'format_fixed.dart'; +import 'package:flutter/material.dart'; class CryptoCurrency extends EnumerableItem with Serializable implements Currency { const CryptoCurrency({ From 14bf9cd0cbeae258472de39d9c8d72317492e405 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Wed, 3 Dec 2025 10:32:52 +0100 Subject: [PATCH 101/105] feat: add Lightning Network support for send flow and fee handling adjustments --- cw_bitcoin/lib/lightning/lightning_wallet.dart | 1 + lib/new-ui/pages/home_page.dart | 2 +- .../coins_page/action_row/coin_action_row.dart | 9 +++++++-- lib/src/screens/send/widgets/send_card.dart | 2 +- lib/view_model/send/send_view_model.dart | 18 ++++++++++++++++-- 5 files changed, 26 insertions(+), 6 deletions(-) diff --git a/cw_bitcoin/lib/lightning/lightning_wallet.dart b/cw_bitcoin/lib/lightning/lightning_wallet.dart index 8225a265b1..cde98b0da0 100644 --- a/cw_bitcoin/lib/lightning/lightning_wallet.dart +++ b/cw_bitcoin/lib/lightning/lightning_wallet.dart @@ -228,6 +228,7 @@ class LightningWallet { isPending: payment.status == PaymentStatus.pending, date: DateTime.fromMillisecondsSinceEpoch(payment.timestamp.toInt() * 1000), confirmations: payment.status == PaymentStatus.pending ? 0 : 10, + additionalInfo: {"isLightning": true}, ); } diff --git a/lib/new-ui/pages/home_page.dart b/lib/new-ui/pages/home_page.dart index 94539cde10..c12fddbf39 100644 --- a/lib/new-ui/pages/home_page.dart +++ b/lib/new-ui/pages/home_page.dart @@ -65,7 +65,7 @@ class _NewHomePageState extends State { accountListViewModel: widget.accountListViewModel, lightningMode: _lightningMode, ), - CoinActionRow(), + CoinActionRow(lightningMode: _lightningMode), AnimatedSwitcher( duration: const Duration(milliseconds: 200), transitionBuilder: (child, animation) { diff --git a/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart b/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart index 2cb9d4d36a..db3b8b7a76 100644 --- a/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart +++ b/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart @@ -4,6 +4,7 @@ import 'package:cake_wallet/new-ui/pages/send_page.dart'; import 'package:cake_wallet/new-ui/pages/swap_page.dart'; import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/utils/feature_flag.dart'; +import 'package:cw_core/unspent_coin_type.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; @@ -12,7 +13,9 @@ import '../../../pages/scan_page.dart'; import 'coin_action_button.dart'; class CoinActionRow extends StatelessWidget { - const CoinActionRow({super.key}); + const CoinActionRow({super.key, this.lightningMode = false}); + + final bool lightningMode; @override Widget build(BuildContext context) { @@ -33,7 +36,9 @@ class CoinActionRow extends StatelessWidget { builder: (context) => SendPage(), ); } else { - Navigator.of(context).pushNamed(Routes.send); + Map? args; + if (lightningMode) args = {'coinTypeToSpendFrom' : UnspentCoinType.lightning}; + Navigator.of(context).pushNamed(Routes.send, arguments: args); } }, ), diff --git a/lib/src/screens/send/widgets/send_card.dart b/lib/src/screens/send/widgets/send_card.dart index fde1b29222..161775f58c 100644 --- a/lib/src/screens/send/widgets/send_card.dart +++ b/lib/src/screens/send/widgets/send_card.dart @@ -620,7 +620,7 @@ class SendCardState extends State with AutomaticKeepAliveClientMixin GestureDetector( key: ValueKey('send_page_select_fee_priority_button_key'), diff --git a/lib/view_model/send/send_view_model.dart b/lib/view_model/send/send_view_model.dart index 6d395a531a..00d8ce63d5 100644 --- a/lib/view_model/send/send_view_model.dart +++ b/lib/view_model/send/send_view_model.dart @@ -73,6 +73,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor @override void onWalletChange(wallet) { currencies = wallet.balance.keys.toList(); + if (coinTypeToSpendFrom == UnspentCoinType.lightning) selectedCryptoCurrency = wallet.currency; hasMultipleTokens = isEVMCompatibleChain(wallet.type) || [WalletType.solana, WalletType.tron, WalletType.zano].contains(wallet.type); @@ -255,6 +256,11 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor coinTypeToSpendFrom == UnspentCoinType.nonMweb) { return balanceViewModel.balances.values.first.availableBalance; } + + if (walletType == WalletType.bitcoin && coinTypeToSpendFrom == UnspentCoinType.lightning) { + print(wallet.balance[selectedCryptoCurrency]!.formattedSecondAvailableBalance); + return wallet.balance[selectedCryptoCurrency]!.formattedSecondAvailableBalance; + } return wallet.balance[selectedCryptoCurrency]!.formattedFullAvailableBalance; } @@ -282,6 +288,9 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor // only for electrum, monero, wownero, decred wallets atm: switch (wallet.type) { case WalletType.bitcoin: + if (coinTypeToSpendFrom == UnspentCoinType.lightning) return balance; + return wallet.formatCryptoAmount( + (await unspentCoinsListViewModel.getSendingBalance(coinTypeToSpendFrom)).toString()); case WalletType.litecoin: case WalletType.bitcoinCash: case WalletType.dogecoin: @@ -327,7 +336,8 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor .toList(); @computed - bool get hasCoinControl => [ + bool get hasCoinControl => + [ WalletType.bitcoin, WalletType.litecoin, WalletType.monero, @@ -335,7 +345,11 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor WalletType.decred, WalletType.bitcoinCash, WalletType.dogecoin - ].contains(wallet.type); + ].contains(wallet.type) && + coinTypeToSpendFrom != UnspentCoinType.lightning; + + @computed + bool get hasFees => feesViewModel.hasFees && coinTypeToSpendFrom != UnspentCoinType.lightning; @computed bool get isElectrumWallet => [ From d0f607ededaebf87fec3d684e948886abbffd720 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Wed, 3 Dec 2025 10:34:18 +0100 Subject: [PATCH 102/105] refactor: remove unnecessary debug print statement in send flow for Lightning Network balance --- lib/view_model/send/send_view_model.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/view_model/send/send_view_model.dart b/lib/view_model/send/send_view_model.dart index 00d8ce63d5..86387ba60a 100644 --- a/lib/view_model/send/send_view_model.dart +++ b/lib/view_model/send/send_view_model.dart @@ -258,7 +258,6 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor } if (walletType == WalletType.bitcoin && coinTypeToSpendFrom == UnspentCoinType.lightning) { - print(wallet.balance[selectedCryptoCurrency]!.formattedSecondAvailableBalance); return wallet.balance[selectedCryptoCurrency]!.formattedSecondAvailableBalance; } return wallet.balance[selectedCryptoCurrency]!.formattedFullAvailableBalance; From a30f78ec2b0ea172b21bf1ffec3c99fd2186a47d Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Wed, 3 Dec 2025 13:01:13 +0100 Subject: [PATCH 103/105] feat: integrate OpenCryptoPay QR handling in send flow and improve scan action handling logic --- .../action_row/coin_action_row.dart | 52 ++++++++++++------- lib/src/screens/send/widgets/send_card.dart | 21 ++++---- lib/view_model/send/send_view_model.dart | 2 +- 3 files changed, 44 insertions(+), 31 deletions(-) diff --git a/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart b/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart index db3b8b7a76..950495dff8 100644 --- a/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart +++ b/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart @@ -1,9 +1,12 @@ +import 'package:cake_wallet/core/open_crypto_pay/open_cryptopay_service.dart'; import 'package:cake_wallet/entities/qr_scanner.dart'; import 'package:cake_wallet/main.dart'; import 'package:cake_wallet/new-ui/pages/send_page.dart'; import 'package:cake_wallet/new-ui/pages/swap_page.dart'; import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/utils/feature_flag.dart'; +import 'package:cake_wallet/utils/payment_request.dart'; +import 'package:cake_wallet/view_model/send/send_view_model.dart'; import 'package:cw_core/unspent_coin_type.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; @@ -81,29 +84,38 @@ class CoinActionRow extends StatelessWidget { CoinActionButton( icon: SvgPicture.asset("assets/new-ui/scan.svg"), label: "Scan", - action: () async { - if (FeatureFlag.hasNewUiExtraPages) { - showModalBottomSheet( - context: context, - isScrollControlled: true, - builder: (context) => FractionallySizedBox( - heightFactor: 0.9, - child: ScanPage(), - ), - ); - } else { - final code = await presentQRScanner(context); - - if (code == null) return; - if (code.isEmpty) return; - final uri = Uri.tryParse(code); - if (uri == null) return; - rootKey.currentState?.handleDeepLinking(uri); - }; - }, + action: () => _onPressedScan(context), ), ], ), ); } + + Future _onPressedScan(BuildContext context) async { + if (FeatureFlag.hasNewUiExtraPages) { + showModalBottomSheet( + context: context, + isScrollControlled: true, + builder: (context) => FractionallySizedBox( + heightFactor: 0.9, + child: ScanPage(), + ), + ); + } else { + final code = await presentQRScanner(context); + + if (code == null || code.isEmpty) return; + + if (SendViewModelBase.isLightningInvoice(code) || + OpenCryptoPayService.isOpenCryptoPayQR(code)) { + Navigator.of(context).pushNamed(Routes.send, + arguments: {"paymentRequest": PaymentRequest(code, "", "", "", "")}); + return; + } + + final uri = Uri.tryParse(code); + if (uri == null) return; + rootKey.currentState?.handleDeepLinking(uri); + }; + } } diff --git a/lib/src/screens/send/widgets/send_card.dart b/lib/src/screens/send/widgets/send_card.dart index 161775f58c..9c7721c5be 100644 --- a/lib/src/screens/send/widgets/send_card.dart +++ b/lib/src/screens/send/widgets/send_card.dart @@ -152,6 +152,11 @@ class SendCardState extends State with AutomaticKeepAliveClientMixin _handlePaymentFlow(String uri, PaymentRequest paymentRequest) async { if (uri.contains('@') || paymentRequest.address.contains('@')) return; + if (OpenCryptoPayService.isOpenCryptoPayQR(uri)) { + sendViewModel.createOpenCryptoPayTransaction(uri); + return; + } + try { final result = await paymentViewModel.processAddress(uri); @@ -424,15 +429,11 @@ class SendCardState extends State with AutomaticKeepAliveClientMixin with AutomaticKeepAliveClientMixin Date: Wed, 3 Dec 2025 14:34:54 +0100 Subject: [PATCH 104/105] feat: add maxDepositClaimFee parameter for Lightning wallet configuration --- cw_bitcoin/lib/lightning/lightning_wallet.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/cw_bitcoin/lib/lightning/lightning_wallet.dart b/cw_bitcoin/lib/lightning/lightning_wallet.dart index cde98b0da0..b0463f2f05 100644 --- a/cw_bitcoin/lib/lightning/lightning_wallet.dart +++ b/cw_bitcoin/lib/lightning/lightning_wallet.dart @@ -42,6 +42,7 @@ class LightningWallet { lnurlDomain: lnurlDomain, apiKey: apiKey, privateEnabledDefault: true, + maxDepositClaimFee: Fee.rate(satPerVbyte: BigInt.from(5)) ); final connectRequest = ConnectRequest( From e5ed071f2ee6301763edc2659f1d4ad727500242 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Thu, 4 Dec 2025 11:24:50 +0100 Subject: [PATCH 105/105] refactor: update navigation route from `receive` to `addressPage` in coin action row --- lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart b/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart index 950495dff8..e72d38524b 100644 --- a/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart +++ b/lib/new-ui/widgets/coins_page/action_row/coin_action_row.dart @@ -59,7 +59,7 @@ class CoinActionRow extends StatelessWidget { ), ); } else { - Navigator.of(context).pushNamed(Routes.receive); + Navigator.of(context).pushNamed(Routes.addressPage); } }, ),

iGuKflL?4-uT(uf9C`Z^WSrqOLsyYN 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