Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions integration_test/payment_request_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import 'package:bb_mobile/core/utils/payment_request.dart';
import 'package:bb_mobile/core/wallet/domain/entities/wallet.dart';
import 'package:bb_mobile/main.dart';
import 'package:flutter_test/flutter_test.dart';

Future<void> main({bool isInitialized = false}) async {
TestWidgetsFlutterBinding.ensureInitialized();
if (!isInitialized) await Bull.init();

const btcAddress = 'bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq';

const lnurlStr =
'lnurl1dp68gurn8ghj7um9wfmxjcm99e3k7mf0v9cxj0m385ekvcenxc6r2c35xvukxefcv5'
'mkvv34x5ekzd3ev56nyd3hxqurzepexejxxepnxscrvwfnv9nxzcn9xq6xyefhvgcxxcmyxy'
'mnserxfq5fns';

const bolt11Invoice =
'lnbc2500u1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypq'
'dq5xysxxatsyp3k7enxv4jsxqzpuaztrnwngzn3kdzw5hydlzf03qdgm2hdq27cqv3agm2aw'
'hz5se903vruatfhq77w3ls4evs3ch9zw97j25emudupq63nyw24cg27h2rspfj9srp';

group('PaymentRequest.parse', () {
test('BIP21 with LNURL lightning param, label, and message', () async {
final input =
'bitcoin:$btcAddress?lightning=$lnurlStr&label=Donation&message=Thanks';
final result = await PaymentRequest.parse(input);
expect(result, isA<Bip21PaymentRequest>());
final bip21 = result as Bip21PaymentRequest;
expect(bip21.address.toLowerCase(), btcAddress);
expect(bip21.lightning, lnurlStr);
expect(bip21.label, 'Donation');
expect(bip21.message, 'Thanks');
expect(bip21.network, Network.bitcoinMainnet);
});

test('BIP21 with Bolt11 lightning param', () async {
final input = 'bitcoin:$btcAddress?lightning=$bolt11Invoice';
final result = await PaymentRequest.parse(input);
expect(result, isA<Bip21PaymentRequest>());
final bip21 = result as Bip21PaymentRequest;
expect(bip21.address.toLowerCase(), btcAddress);
expect(bip21.lightning, bolt11Invoice);
expect(bip21.network, Network.bitcoinMainnet);
});

test('HTTPS URL with percent-encoded LNAddress in lightning param', () async {
const input =
'https://admin.bullbitcoin.com/abc'
'?lightning=ishi%40walletofsatoshi.com&label=pleasefundme';
final result = await PaymentRequest.parse(input);
expect(result, isA<LnAddressPaymentRequest>());
expect(
(result as LnAddressPaymentRequest).address,
'ishi@walletofsatoshi.com',
);
});
});
}
19 changes: 19 additions & 0 deletions lib/core/utils/payment_request.dart
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,25 @@ sealed class PaymentRequest with _$PaymentRequest {
if (result != null) return result;
}

final re = RegExp(r'lnurl[0-9a-z]+', caseSensitive: false);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this may not cover all cases and in some cases may have extra information. added test cases.

this makes 2 assumptions:

  • the string will only be lnurl format - skips bolt11 and lnaddress formats
  • there will be no additional data after the lnurl string - in some cases there maybe more query params like label, message or other network addresses

final m = re.firstMatch(trimmed);

if (m != null) {
final result = await _tryParseLnAddress(m.group(0)!);
if (result != null) return result;
}

final lnAddressRe = RegExp(
r'[a-zA-Z0-9._%+\-]+(?:@|%40)[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}',
);
final lnAddressMatch = lnAddressRe.firstMatch(trimmed);

if (lnAddressMatch != null) {
final decoded = Uri.decodeComponent(lnAddressMatch.group(0)!);
final result = await _tryParseLnAddress(decoded);
if (result != null) return result;
}

if (trimmed.toLowerCase().startsWith('lnbc') ||
trimmed.toLowerCase().startsWith('lntb') ||
trimmed.toLowerCase().startsWith('lightning:')) {
Expand Down
5 changes: 4 additions & 1 deletion lib/features/send/presentation/bloc/send_cubit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,10 @@ class SendCubit extends Cubit<SendState> {
emit(
state.copyWith(
loadingBestWallet: false,
invalidBitcoinStringException: InvalidBitcoinStringException(),
invalidBitcoinStringException:
state.scannedRawPaymentRequest.isNotEmpty
? UnsupportedQrFormatException()
: InvalidBitcoinStringException(),
),
);
return;
Expand Down
5 changes: 4 additions & 1 deletion lib/features/send/presentation/bloc/send_state.dart
Original file line number Diff line number Diff line change
Expand Up @@ -472,7 +472,8 @@ class AmountlessInvoiceException extends SwapCreationException {
}

class HardwareWalletSwapException extends SwapCreationException {
HardwareWalletSwapException() : super('Hardware wallets cannot be used for swaps');
HardwareWalletSwapException()
: super('Hardware wallets cannot be used for swaps');
}

class ExpiredInvoiceException extends SwapCreationException {
Expand All @@ -491,6 +492,8 @@ class InvalidBitcoinStringException extends BullException {
]);
}

class UnsupportedQrFormatException extends InvalidBitcoinStringException {}

/// Exception for swap limit violations.
/// Stored in SendState with min/max limit values for localized error messages.
/// UI displays context-specific messages using sendErrorAmountBelowMinimum,
Expand Down
2 changes: 1 addition & 1 deletion lib/features/send/ui/screens/full_screen_scanner_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ class _FullScreenScannerState extends State<FullScreenScannerPage> {
} catch (e) {
data = (qr, null);
widget.onScannedPaymentRequest(data);
if (mounted) context.pop();
}
setState(() {});
}

@override
Expand Down
4 changes: 3 additions & 1 deletion lib/features/send/ui/screens/send_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,9 @@ class AddressErrorSection extends StatelessWidget {
}
if (invalidAddress != null) {
return BBText(
context.loc.sendErrorInvalidAddressOrInvoice,
invalidAddress is UnsupportedQrFormatException
? context.loc.sendErrorUnsupportedQrCodeFormat
: context.loc.sendErrorInvalidAddressOrInvoice,
style: context.font.bodyMedium,
color: context.appColors.error,
textAlign: .center,
Expand Down
1 change: 1 addition & 0 deletions localization/app_ar.arb
Original file line number Diff line number Diff line change
Expand Up @@ -2345,6 +2345,7 @@
"@sendErrorInvalidAddressOrInvoice": {
"description": "Error when payment request is invalid"
},
"sendErrorUnsupportedQrCodeFormat": "تنسيق رمز QR غير مدعوم",
"transactionLabelAmountReceived": "المبلغ المستلم",
"@transactionLabelAmountReceived": {
"description": "Label for received amount"
Expand Down
1 change: 1 addition & 0 deletions localization/app_as.arb
Original file line number Diff line number Diff line change
Expand Up @@ -4165,6 +4165,7 @@
"@sendErrorInvalidAddressOrInvoice": {
"description": "Error when payment request is invalid"
},
"sendErrorUnsupportedQrCodeFormat": "অসমৰ্থিত QR ক'ড ফৰ্মেট",
"sendErrorBuildFailed": "নিৰ্মাণ বিফল হৈছে",
"@sendErrorBuildFailed": {
"description": "Error title when transaction build fails"
Expand Down
1 change: 1 addition & 0 deletions localization/app_bg.arb
Original file line number Diff line number Diff line change
Expand Up @@ -2125,6 +2125,7 @@
"@sendErrorInvalidAddressOrInvoice": {
"description": "Error when payment request is invalid"
},
"sendErrorUnsupportedQrCodeFormat": "Неподдържан формат на QR код",
"transactionLabelAmountReceived": "Получена сума",
"@transactionLabelAmountReceived": {
"description": "Label for received amount"
Expand Down
1 change: 1 addition & 0 deletions localization/app_bn.arb
Original file line number Diff line number Diff line change
Expand Up @@ -2460,6 +2460,7 @@
"@sendErrorInvalidAddressOrInvoice": {
"description": "Error when payment request is invalid"
},
"sendErrorUnsupportedQrCodeFormat": "অসমর্থিত QR কোড ফরম্যাট",
"transactionLabelAmountReceived": "প্রাপ্ত পরিমাণ",
"@transactionLabelAmountReceived": {
"description": "Label for received amount"
Expand Down
1 change: 1 addition & 0 deletions localization/app_cs.arb
Original file line number Diff line number Diff line change
Expand Up @@ -2691,6 +2691,7 @@
"@sendErrorInvalidAddressOrInvoice": {
"description": "Error when payment request is invalid"
},
"sendErrorUnsupportedQrCodeFormat": "Nepodporovaný formát QR kódu",
"transactionLabelAmountReceived": "Množství přijaté",
"@transactionLabelAmountReceived": {
"description": "Label for received amount"
Expand Down
1 change: 1 addition & 0 deletions localization/app_de.arb
Original file line number Diff line number Diff line change
Expand Up @@ -828,6 +828,7 @@
"torSettingsConnectionStatus": "Verbindungsstatus",
"backupInstruction1": "Wenn Sie Ihre 12 Wörter (Seed-Phrase) verlieren, können Sie den Zugriff auf die Bitcoin-Wallet nicht wiederherstellen.",
"sendErrorInvalidAddressOrInvoice": "Ungültige Bitcoin-Adresse oder Rechnung.",
"sendErrorUnsupportedQrCodeFormat": "Nicht unterstütztes QR-Code-Format",
"transactionLabelAmountReceived": "Erhaltener Betrag",
"recoverbullRecoveryTitle": "Recoverbull-Tresor-Wiederherstellung",
"broadcastSignedTxScanQR": "Scannen Sie den QR-Code von Ihrer Hardware-Wallet.",
Expand Down
1 change: 1 addition & 0 deletions localization/app_el.arb
Original file line number Diff line number Diff line change
Expand Up @@ -2088,6 +2088,7 @@
"@sendErrorInvalidAddressOrInvoice": {
"description": "Error when payment request is invalid"
},
"sendErrorUnsupportedQrCodeFormat": "Μη υποστηριζόμενη μορφή κωδικού QR",
"transactionLabelAmountReceived": "Ποσό που λαμβάνεται",
"@transactionLabelAmountReceived": {
"description": "Label for received amount"
Expand Down
4 changes: 4 additions & 0 deletions localization/app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -7320,6 +7320,10 @@
"@sendErrorInvalidAddressOrInvoice": {
"description": "Error when payment request is invalid"
},
"sendErrorUnsupportedQrCodeFormat": "Unsupported QR code format",
"@sendErrorUnsupportedQrCodeFormat": {
"description": "Error shown when a scanned QR code does not contain a recognisable Bitcoin payment request"
},
"sendErrorBuildFailed": "Build Failed",
"@sendErrorBuildFailed": {
"description": "Error title when transaction build fails"
Expand Down
1 change: 1 addition & 0 deletions localization/app_es.arb
Original file line number Diff line number Diff line change
Expand Up @@ -2169,6 +2169,7 @@
"sendErrorInvoiceMustContainAmount": "La factura debe contener un monto",
"sendErrorInsufficientBalanceForPayment": "Saldo insuficiente para cubrir este pago",
"sendErrorInvalidAddressOrInvoice": "Dirección de pago Bitcoin o factura inválida",
"sendErrorUnsupportedQrCodeFormat": "Formato de código QR no compatible",
"sendErrorBuildFailed": "Error de construcción",
"sendErrorConfirmationFailed": "Error de confirmación",
"sendErrorInsufficientBalanceForSwap": "Saldo insuficiente para pagar este intercambio a través de Liquid y fuera de los límites de intercambio para pagar a través de Bitcoin.",
Expand Down
1 change: 1 addition & 0 deletions localization/app_fa.arb
Original file line number Diff line number Diff line change
Expand Up @@ -3338,6 +3338,7 @@
"@sendErrorInvalidAddressOrInvoice": {
"description": "Error when payment request is invalid"
},
"sendErrorUnsupportedQrCodeFormat": "فرمت کد QR پشتیبانی نمی‌شود",
"transactionLabelAmountReceived": "مبلغ دریافت شده",
"@transactionLabelAmountReceived": {
"description": "Label for received amount"
Expand Down
1 change: 1 addition & 0 deletions localization/app_fi.arb
Original file line number Diff line number Diff line change
Expand Up @@ -2118,6 +2118,7 @@
"sendErrorInvoiceMustContainAmount": "Lasku täytyy sisältää summan",
"sendErrorInsufficientBalanceForPayment": "Saldo ei riitä tämän maksun kattamiseen",
"sendErrorInvalidAddressOrInvoice": "Virheellinen Bitcoin-maksuosoite tai lasku",
"sendErrorUnsupportedQrCodeFormat": "Ei-tuettu QR-koodimuoto",
"sendErrorBuildFailed": "Rakentaminen epäonnistui",
"sendErrorConfirmationFailed": "Vahvistus epäonnistui",
"sendErrorInsufficientBalanceForSwap": "Saldo ei riitä maksamaan tätä vaihtoa Liquidin kautta eikä se ole swap-rajoissa maksamiseen Bitcoinin kautta.",
Expand Down
1 change: 1 addition & 0 deletions localization/app_fr.arb
Original file line number Diff line number Diff line change
Expand Up @@ -2166,6 +2166,7 @@
"sendErrorInvoiceMustContainAmount": "La facture doit contenir un montant",
"sendErrorInsufficientBalanceForPayment": "Solde insuffisant pour couvrir ce paiement",
"sendErrorInvalidAddressOrInvoice": "Adresse de paiement Bitcoin ou facture invalide",
"sendErrorUnsupportedQrCodeFormat": "Format de code QR non pris en charge",
"sendErrorBuildFailed": "Échec de la construction",
"sendErrorConfirmationFailed": "Échec de la confirmation",
"sendErrorInsufficientBalanceForSwap": "Solde insuffisant pour payer cet échange via Liquid et hors des limites d'échange pour payer via Bitcoin.",
Expand Down
1 change: 1 addition & 0 deletions localization/app_hi.arb
Original file line number Diff line number Diff line change
Expand Up @@ -2499,6 +2499,7 @@
"@sendErrorInvalidAddressOrInvoice": {
"description": "Error when payment request is invalid"
},
"sendErrorUnsupportedQrCodeFormat": "असमर्थित QR कोड प्रारूप",
"transactionLabelAmountReceived": "प्राप्त राशि",
"@transactionLabelAmountReceived": {
"description": "Label for received amount"
Expand Down
1 change: 1 addition & 0 deletions localization/app_hi_Latn.arb
Original file line number Diff line number Diff line change
Expand Up @@ -6360,6 +6360,7 @@
"@sendErrorInvalidAddressOrInvoice": {
"description": "Error when payment request is invalid"
},
"sendErrorUnsupportedQrCodeFormat": "Asamarthit QR code format",
"sendErrorBuildFailed": "Build Fail Ho Gayi",
"@sendErrorBuildFailed": {
"description": "Error title when transaction build fails"
Expand Down
1 change: 1 addition & 0 deletions localization/app_hy.arb
Original file line number Diff line number Diff line change
Expand Up @@ -281,5 +281,6 @@
"fundExchangeErrorRcpPo404": "Դուք չունեք այս ֆինանսավորման տարբերակին մուտք գործելու անհրաժեշտ թույլտվություններ։ Կամ ձեր KYC-ն բավարար չէ, կամ այս տարբերակը հասանելի չէ ձեր հաշվի համար",
"fundExchangeErrorRcpPosinpe404": "Այս ֆինանսավորման տարբերակին մուտք գործելու համար ձեր հեռախոսահամարը պետք է գրանցված լինի SINPE ցանցում Costa Rica-ում։",
"fundExchangeErrorFetchingBankCodes": "Բանկային կոդերը ստանալիս սխալ է տեղի ունեցել։ Խնդրում ենք փորձել ավելի ուշ։",
"sendErrorUnsupportedQrCodeFormat": "Չաջակցվող QR կոդ ձևաչափ",
"fundExchangeMethodInstantSepa": "Անմիջական և սովորական SEPA փոխանցում"
}
1 change: 1 addition & 0 deletions localization/app_it.arb
Original file line number Diff line number Diff line change
Expand Up @@ -846,6 +846,7 @@
"torSettingsConnectionStatus": "Stato di connessione",
"backupInstruction1": "Se si perde il backup di 12 parole, non sarà in grado di recuperare l'accesso al portafoglio Bitcoin.",
"sendErrorInvalidAddressOrInvoice": "Invalid Bitcoin Indirizzo di pagamento o fattura",
"sendErrorUnsupportedQrCodeFormat": "Formato codice QR non supportato",
"transactionLabelAmountReceived": "Importo ricevuto",
"recoverbullRecoveryTitle": "Ripristino del caveau",
"broadcastSignedTxScanQR": "Scansiona il codice QR dal tuo portafoglio hardware",
Expand Down
1 change: 1 addition & 0 deletions localization/app_ka.arb
Original file line number Diff line number Diff line change
Expand Up @@ -478,6 +478,7 @@
"onboardingAdvancedOptionsDone": "მზადაა",
"appStartupContactSupportMessage": "დაუკავშირდით მხარდაჭერას მისამართზე app.bullbitcoin.com/support",
"importWalletBitboxAndroidOnly": "BitBox მხარდაჭერილია მხოლოდ Android-ზე",
"sendErrorUnsupportedQrCodeFormat": "QR კოდის ფორმატი მხარდაჭერილი არ არის",
"fundExchangeErrorTitleOrdPo404": "გადახდის ვარიანტი მიუწვდომელია",
"fundExchangeErrorTitleRcpPo404": "გადახდის ვარიანტი ხელმისაწვდომი არ არის",
"fundExchangeErrorTitleRcpPosinpe404": "SINPE ხელმისაწვდომი არ არის",
Expand Down
1 change: 1 addition & 0 deletions localization/app_ko.arb
Original file line number Diff line number Diff line change
Expand Up @@ -2499,6 +2499,7 @@
"@sendErrorInvalidAddressOrInvoice": {
"description": "Error when payment request is invalid"
},
"sendErrorUnsupportedQrCodeFormat": "지원되지 않는 QR 코드 형식",
"transactionLabelAmountReceived": "지불 방법",
"@transactionLabelAmountReceived": {
"description": "Label for received amount"
Expand Down
1 change: 1 addition & 0 deletions localization/app_pt.arb
Original file line number Diff line number Diff line change
Expand Up @@ -843,6 +843,7 @@
"torSettingsConnectionStatus": "Estado de conexão",
"backupInstruction1": "Se você perder seu backup de 12 palavras, você não será capaz de recuperar o acesso à carteira Bitcoin.",
"sendErrorInvalidAddressOrInvoice": "Endereço de pagamento Bitcoin inválido ou fatura",
"sendErrorUnsupportedQrCodeFormat": "Formato de código QR não suportado",
"transactionLabelAmountReceived": "Montante recebido",
"recoverbullRecoveryTitle": "Recuperação do vault do Recoverbull",
"broadcastSignedTxScanQR": "Digitalizar o código QR da sua carteira de hardware",
Expand Down
1 change: 1 addition & 0 deletions localization/app_pt_BR.arb
Original file line number Diff line number Diff line change
Expand Up @@ -2161,6 +2161,7 @@
"@sendErrorInvalidAddressOrInvoice": {
"description": "Error when payment request is invalid"
},
"sendErrorUnsupportedQrCodeFormat": "Formato de código QR não suportado",
"exchangeKycLimited": "Limitação",
"@exchangeKycLimited": {
"description": "Limited KYC level label"
Expand Down
1 change: 1 addition & 0 deletions localization/app_ru.arb
Original file line number Diff line number Diff line change
Expand Up @@ -843,6 +843,7 @@
"torSettingsConnectionStatus": "Состояние подключения",
"backupInstruction1": "Если вы потеряете резервное копирование на 12 слов, вы не сможете восстановить доступ к Bitcoin Wallet.",
"sendErrorInvalidAddressOrInvoice": "Неверный адрес оплаты Bitcoin или счет",
"sendErrorUnsupportedQrCodeFormat": "Неподдерживаемый формат QR-кода",
"transactionLabelAmountReceived": "Полученная сумма",
"recoverbullRecoveryTitle": "Восстановление хранилища",
"broadcastSignedTxScanQR": "Сканировать QR-код из вашего аппаратного кошелька",
Expand Down
1 change: 1 addition & 0 deletions localization/app_sw.arb
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,7 @@
"onboardingAdvancedOptionsDone": "Imekamilika",
"appStartupContactSupportMessage": "Wasiliana na usaidizi kupitia app.bullbitcoin.com/support",
"importWalletBitboxAndroidOnly": "BitBox inasaidiwa kwenye Android pekee",
"sendErrorUnsupportedQrCodeFormat": "Muundo wa msimbo wa QR haujaamuliwa",
"fundExchangeErrorTitleOrdPo404": "Chaguo la Malipo Halipatikani",
"fundExchangeErrorTitleRcpPo404": "Chaguo la Malipo Halipatikani",
"fundExchangeErrorTitleRcpPosinpe404": "SINPE Haipatikani",
Expand Down
1 change: 1 addition & 0 deletions localization/app_th.arb
Original file line number Diff line number Diff line change
Expand Up @@ -2499,6 +2499,7 @@
"@sendErrorInvalidAddressOrInvoice": {
"description": "Error when payment request is invalid"
},
"sendErrorUnsupportedQrCodeFormat": "รูปแบบรหัส QR ที่ไม่รองรับ",
"transactionLabelAmountReceived": "จํานวน",
"@transactionLabelAmountReceived": {
"description": "Label for received amount"
Expand Down
1 change: 1 addition & 0 deletions localization/app_tr.arb
Original file line number Diff line number Diff line change
Expand Up @@ -2491,6 +2491,7 @@
"@sendErrorInvalidAddressOrInvoice": {
"description": "Error when payment request is invalid"
},
"sendErrorUnsupportedQrCodeFormat": "Desteklenmeyen QR kodu formatı",
"transactionLabelAmountReceived": "$ aldı",
"@transactionLabelAmountReceived": {
"description": "Label for received amount"
Expand Down
1 change: 1 addition & 0 deletions localization/app_uk.arb
Original file line number Diff line number Diff line change
Expand Up @@ -1759,6 +1759,7 @@
"hwChooseDevice": "Виберіть апаратний гаманець, який ви хочете підключитися",
"torSettingsConnectionStatus": "Статус на сервери",
"sendErrorInvalidAddressOrInvoice": "Плата за неоплату Bitcoin або Invoice",
"sendErrorUnsupportedQrCodeFormat": "Непідтримуваний формат QR-коду",
"recoverbullRecoveryTitle": "Recoverbull відновлення",
"broadcastSignedTxScanQR": "Сканування QR-коду з вашого апаратного гаманця",
"ledgerSuccessSignDescription": "Ви успішно підписалися на Вашу операцію.",
Expand Down
2 changes: 1 addition & 1 deletion localization/app_vi.arb
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,6 @@
"appStartupErrorMessage": "Không thể khởi động ứng dụng. Hãy thử đóng hoàn toàn ứng dụng và khởi động lại. Nếu lỗi vẫn tiếp diễn, hãy liên hệ hỗ trợ và gửi nhật ký của bạn.",
"importMnemonicDuplicateError": "Cụm từ ghi nhớ này đã tồn tại",
"transactionStatusPayjoinCompleted": "Payjoin đã hoàn tất",
"pinCodeBackupRequiredWarning": "Vui lòng hoàn tất sao lưu ví trước khi đặt PIN",
"coreScreensResolvingInputs": "Resolving transaction inputs...",
"coreScreensFeeRateLabel": "Fee rate",
"coreScreensFeeRateValue": "{rate} sat/vB",
Expand Down Expand Up @@ -267,6 +266,7 @@
"onboardingAdvancedOptionsDone": "Xong",
"appStartupContactSupportMessage": "Liên hệ hỗ trợ tại app.bullbitcoin.com/support",
"importWalletBitboxAndroidOnly": "BitBox chỉ được hỗ trợ trên Android",
"sendErrorUnsupportedQrCodeFormat": "Định dạng mã QR không được hỗ trợ",
"fundExchangeErrorTitleOrdPo404": "Phương thức thanh toán không khả dụng",
"fundExchangeErrorTitleRcpPo404": "Phương thức thanh toán không khả dụng",
"fundExchangeErrorTitleRcpPosinpe404": "SINPE không khả dụng",
Expand Down
1 change: 1 addition & 0 deletions localization/app_zh.arb
Original file line number Diff line number Diff line change
Expand Up @@ -846,6 +846,7 @@
"torSettingsConnectionStatus": "关系",
"backupInstruction1": "如果您丢失了12个单词备份,您将会无法恢复对该比特币钱包的访问权限",
"sendErrorInvalidAddressOrInvoice": "Invalid Pay Address or Invoice",
"sendErrorUnsupportedQrCodeFormat": "不支持的二维码格式",
"transactionLabelAmountReceived": "收到的资金",
"recoverbullRecoveryTitle": "2. 追回被盗资产",
"broadcastSignedTxScanQR": "your",
Expand Down
Loading