mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2024-11-17 09:47:35 +00:00
Merge branch 'cake-tech:main' into main
This commit is contained in:
commit
c0115b1b77
28 changed files with 187 additions and 102 deletions
1
.github/workflows/pr_test_build.yml
vendored
1
.github/workflows/pr_test_build.yml
vendored
|
@ -110,6 +110,7 @@ jobs:
|
||||||
echo "const onramperApiKey = '${{ secrets.ONRAMPER_API_KEY }}';" >> lib/.secrets.g.dart
|
echo "const onramperApiKey = '${{ secrets.ONRAMPER_API_KEY }}';" >> lib/.secrets.g.dart
|
||||||
echo "const anypayToken = '${{ secrets.ANY_PAY_TOKEN }}';" >> lib/.secrets.g.dart
|
echo "const anypayToken = '${{ secrets.ANY_PAY_TOKEN }}';" >> lib/.secrets.g.dart
|
||||||
echo "const ioniaClientId = '${{ secrets.IONIA_CLIENT_ID }}';" >> lib/.secrets.g.dart
|
echo "const ioniaClientId = '${{ secrets.IONIA_CLIENT_ID }}';" >> lib/.secrets.g.dart
|
||||||
|
echo "const twitterBearerToken = '${{ secrets.TWITTER_BEARER_TOKEN }}';" >> lib/.secrets.g.dart
|
||||||
|
|
||||||
- name: Rename app
|
- name: Rename app
|
||||||
run: sed -i -e "s/\${APP_NAME}/$GITHUB_HEAD_REF/g" /opt/android/cake_wallet/android/app/src/main/AndroidManifest.xml
|
run: sed -i -e "s/\${APP_NAME}/$GITHUB_HEAD_REF/g" /opt/android/cake_wallet/android/app/src/main/AndroidManifest.xml
|
||||||
|
|
|
@ -198,4 +198,22 @@ class AddressValidator extends TextValidator {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static String? getAddressFromStringPattern(CryptoCurrency type) {
|
||||||
|
switch (type) {
|
||||||
|
case CryptoCurrency.xmr:
|
||||||
|
return '([^0-9a-zA-Z]|^)4[0-9a-zA-Z]{94}([^0-9a-zA-Z]|\$)'
|
||||||
|
'|([^0-9a-zA-Z]|^)8[0-9a-zA-Z]{94}([^0-9a-zA-Z]|\$)'
|
||||||
|
'|([^0-9a-zA-Z]|^)[0-9a-zA-Z]{106}([^0-9a-zA-Z]|\$)';
|
||||||
|
case CryptoCurrency.btc:
|
||||||
|
return '([^0-9a-zA-Z]|^)1[0-9a-zA-Z]{32}([^0-9a-zA-Z]|\$)'
|
||||||
|
'|([^0-9a-zA-Z]|^)1[0-9a-zA-Z]{33}([^0-9a-zA-Z]|\$)'
|
||||||
|
'|([^0-9a-zA-Z]|^)3[0-9a-zA-Z]{32}([^0-9a-zA-Z]|\$)'
|
||||||
|
'|([^0-9a-zA-Z]|^)3[0-9a-zA-Z]{33}([^0-9a-zA-Z]|\$)'
|
||||||
|
'|([^0-9a-zA-Z]|^)bc1[0-9a-zA-Z]{39}([^0-9a-zA-Z]|\$)'
|
||||||
|
'|([^0-9a-zA-Z]|^)bc1[0-9a-zA-Z]{59}([^0-9a-zA-Z]|\$)';
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import 'package:basic_utils/basic_utils.dart';
|
import 'package:basic_utils/basic_utils.dart';
|
||||||
import 'package:cw_core/wallet_type.dart';
|
|
||||||
|
|
||||||
class OpenaliasRecord {
|
class OpenaliasRecord {
|
||||||
OpenaliasRecord({
|
OpenaliasRecord({
|
||||||
|
@ -22,26 +21,30 @@ class OpenaliasRecord {
|
||||||
return formattedName;
|
return formattedName;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Future<OpenaliasRecord> fetchAddressAndName({
|
static Future<List<RRecord>?> lookupOpenAliasRecord(String name) async {
|
||||||
|
try {
|
||||||
|
final txtRecord = await DnsUtils.lookupRecord(name, RRecordType.TXT, dnssec: true);
|
||||||
|
|
||||||
|
return txtRecord;
|
||||||
|
} catch (e) {
|
||||||
|
print("${e.toString()}");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static OpenaliasRecord fetchAddressAndName({
|
||||||
required String formattedName,
|
required String formattedName,
|
||||||
required String ticker,
|
required String ticker,
|
||||||
}) async {
|
required List<RRecord> txtRecord,
|
||||||
|
}) {
|
||||||
String address = formattedName;
|
String address = formattedName;
|
||||||
String name = formattedName;
|
String name = formattedName;
|
||||||
String note = '';
|
String note = '';
|
||||||
|
|
||||||
if (formattedName.contains(".")) {
|
|
||||||
try {
|
|
||||||
final txtRecord = await DnsUtils.lookupRecord(
|
|
||||||
formattedName, RRecordType.TXT,
|
|
||||||
dnssec: true);
|
|
||||||
|
|
||||||
if (txtRecord != null) {
|
|
||||||
for (RRecord element in txtRecord) {
|
for (RRecord element in txtRecord) {
|
||||||
String record = element.data;
|
String record = element.data;
|
||||||
|
|
||||||
if (record.contains("oa1:$ticker") &&
|
if (record.contains("oa1:$ticker") && record.contains("recipient_address")) {
|
||||||
record.contains("recipient_address")) {
|
|
||||||
record = record.replaceAll('\"', "");
|
record = record.replaceAll('\"', "");
|
||||||
|
|
||||||
final dataList = record.split(";");
|
final dataList = record.split(";");
|
||||||
|
@ -78,13 +81,8 @@ class OpenaliasRecord {
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
print("${e.toString()}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return OpenaliasRecord(address: address, name: name, description: note);
|
|
||||||
}
|
}
|
||||||
|
return OpenaliasRecord(address: address, name: name, description: note);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,15 @@
|
||||||
|
import 'package:cake_wallet/core/address_validator.dart';
|
||||||
import 'package:cake_wallet/core/yat_service.dart';
|
import 'package:cake_wallet/core/yat_service.dart';
|
||||||
import 'package:cake_wallet/entities/openalias_record.dart';
|
import 'package:cake_wallet/entities/openalias_record.dart';
|
||||||
import 'package:cake_wallet/entities/parsed_address.dart';
|
import 'package:cake_wallet/entities/parsed_address.dart';
|
||||||
import 'package:cake_wallet/entities/unstoppable_domain_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/emoji_string_extension.dart';
|
||||||
|
import 'package:cake_wallet/twitter/twitter_api.dart';
|
||||||
|
import 'package:cw_core/crypto_currency.dart';
|
||||||
import 'package:cw_core/wallet_type.dart';
|
import 'package:cw_core/wallet_type.dart';
|
||||||
import 'package:cake_wallet/entities/fio_address_provider.dart';
|
import 'package:cake_wallet/entities/fio_address_provider.dart';
|
||||||
|
|
||||||
class AddressResolver {
|
class AddressResolver {
|
||||||
|
|
||||||
AddressResolver({required this.yatService, required this.walletType});
|
AddressResolver({required this.yatService, required this.walletType});
|
||||||
|
|
||||||
final YatService yatService;
|
final YatService yatService;
|
||||||
|
@ -24,17 +26,36 @@ class AddressResolver {
|
||||||
'nft',
|
'nft',
|
||||||
'dao',
|
'dao',
|
||||||
'blockchain'
|
'blockchain'
|
||||||
];
|
];
|
||||||
|
|
||||||
|
static String? extractAddressByType({required String raw, required CryptoCurrency type}) {
|
||||||
|
final addressPattern = AddressValidator.getAddressFromStringPattern(type);
|
||||||
|
|
||||||
|
if (addressPattern == null) {
|
||||||
|
throw 'Unexpected token: $type for getAddressFromStringPattern';
|
||||||
|
}
|
||||||
|
|
||||||
|
final match = RegExp(addressPattern).firstMatch(raw);
|
||||||
|
return match?.group(0)?.replaceAll(RegExp('[^0-9a-zA-Z]'), '');
|
||||||
|
}
|
||||||
|
|
||||||
Future<ParsedAddress> resolve(String text, String ticker) async {
|
Future<ParsedAddress> resolve(String text, String ticker) async {
|
||||||
try {
|
try {
|
||||||
if (text.contains('@') && !text.contains('.')) {
|
if (text.startsWith('@') && !text.substring(1).contains('@')) {
|
||||||
|
final formattedName = text.substring(1);
|
||||||
|
final twitterUser = await TwitterApi.lookupUserByName(userName: formattedName);
|
||||||
|
final address = extractAddressByType(
|
||||||
|
raw: twitterUser.description ?? '', type: CryptoCurrency.fromString(ticker));
|
||||||
|
if (address != null) {
|
||||||
|
return ParsedAddress.fetchTwitterAddress(address: address, name: text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!text.startsWith('@') && text.contains('@') && !text.contains('.')) {
|
||||||
final bool isFioRegistered = await FioAddressProvider.checkAvail(text);
|
final bool isFioRegistered = await FioAddressProvider.checkAvail(text);
|
||||||
if (isFioRegistered) {
|
if (isFioRegistered) {
|
||||||
final address = await FioAddressProvider.getPubAddress(text, ticker);
|
final address = await FioAddressProvider.getPubAddress(text, ticker);
|
||||||
return ParsedAddress.fetchFioAddress(address: address, name: text);
|
return ParsedAddress.fetchFioAddress(address: address, name: text);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
if (text.hasOnlyEmojis) {
|
if (text.hasOnlyEmojis) {
|
||||||
if (walletType != WalletType.haven) {
|
if (walletType != WalletType.haven) {
|
||||||
|
@ -55,10 +76,14 @@ class AddressResolver {
|
||||||
return ParsedAddress.fetchUnstoppableDomainAddress(address: address, name: text);
|
return ParsedAddress.fetchUnstoppableDomainAddress(address: address, name: text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (formattedName.contains(".")) {
|
||||||
|
final txtRecord = await OpenaliasRecord.lookupOpenAliasRecord(formattedName);
|
||||||
|
if (txtRecord != null) {
|
||||||
final record = await OpenaliasRecord.fetchAddressAndName(
|
final record = await OpenaliasRecord.fetchAddressAndName(
|
||||||
formattedName: formattedName, ticker: ticker);
|
formattedName: formattedName, ticker: ticker, txtRecord: txtRecord);
|
||||||
return ParsedAddress.fetchOpenAliasAddress(record: record, name: text);
|
return ParsedAddress.fetchOpenAliasAddress(record: record, name: text);
|
||||||
|
}
|
||||||
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
print(e.toString());
|
print(e.toString());
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
import 'package:cake_wallet/entities/openalias_record.dart';
|
import 'package:cake_wallet/entities/openalias_record.dart';
|
||||||
import 'package:cake_wallet/entities/yat_record.dart';
|
import 'package:cake_wallet/entities/yat_record.dart';
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
enum ParseFrom { unstoppableDomains, openAlias, yatRecord, fio, notParsed }
|
enum ParseFrom { unstoppableDomains, openAlias, yatRecord, fio, notParsed, twitter }
|
||||||
|
|
||||||
class ParsedAddress {
|
class ParsedAddress {
|
||||||
ParsedAddress({
|
ParsedAddress({
|
||||||
|
@ -41,11 +40,7 @@ class ParsedAddress {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
factory ParsedAddress.fetchOpenAliasAddress({OpenaliasRecord? record, required String name}){
|
factory ParsedAddress.fetchOpenAliasAddress({required OpenaliasRecord record, required String name}){
|
||||||
final formattedName = OpenaliasRecord.formatDomainName(name);
|
|
||||||
if (record == null || record.address.contains(formattedName)) {
|
|
||||||
return ParsedAddress(addresses: [name]);
|
|
||||||
}
|
|
||||||
return ParsedAddress(
|
return ParsedAddress(
|
||||||
addresses: [record.address],
|
addresses: [record.address],
|
||||||
name: record.name,
|
name: record.name,
|
||||||
|
@ -62,6 +57,14 @@ class ParsedAddress {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
factory ParsedAddress.fetchTwitterAddress({required String address, required String name}){
|
||||||
|
return ParsedAddress(
|
||||||
|
addresses: [address],
|
||||||
|
name: name,
|
||||||
|
parseFrom: ParseFrom.twitter,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
final List<String> addresses;
|
final List<String> addresses;
|
||||||
final String name;
|
final String name;
|
||||||
final String description;
|
final String description;
|
||||||
|
|
|
@ -19,13 +19,18 @@ Future<String> extractAddressFromParsed(
|
||||||
address = parsedAddress.addresses.first;
|
address = parsedAddress.addresses.first;
|
||||||
break;
|
break;
|
||||||
case ParseFrom.openAlias:
|
case ParseFrom.openAlias:
|
||||||
title = S.of(context).openalias_alert_title;
|
title = S.of(context).address_detected;
|
||||||
content = S.of(context).openalias_alert_content(parsedAddress.name);
|
content = S.of(context).openalias_alert_content('${parsedAddress.name} (OpenAlias)');
|
||||||
address = parsedAddress.addresses.first;
|
address = parsedAddress.addresses.first;
|
||||||
break;
|
break;
|
||||||
case ParseFrom.fio:
|
case ParseFrom.fio:
|
||||||
title = S.of(context).address_detected;
|
title = S.of(context).address_detected;
|
||||||
content = S.of(context).openalias_alert_content(parsedAddress.name);
|
content = S.of(context).openalias_alert_content('${parsedAddress.name} (FIO)');
|
||||||
|
address = parsedAddress.addresses.first;
|
||||||
|
break;
|
||||||
|
case ParseFrom.twitter:
|
||||||
|
title = S.of(context).address_detected;
|
||||||
|
content = S.of(context).openalias_alert_content('${parsedAddress.name} (Twitter)');
|
||||||
address = parsedAddress.addresses.first;
|
address = parsedAddress.addresses.first;
|
||||||
break;
|
break;
|
||||||
case ParseFrom.yatRecord:
|
case ParseFrom.yatRecord:
|
||||||
|
|
37
lib/twitter/twitter_api.dart
Normal file
37
lib/twitter/twitter_api.dart
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
import 'dart:convert';
|
||||||
|
import 'package:cake_wallet/twitter/twitter_user.dart';
|
||||||
|
import 'package:http/http.dart' as http;
|
||||||
|
import 'package:cake_wallet/.secrets.g.dart' as secrets;
|
||||||
|
|
||||||
|
class TwitterApi {
|
||||||
|
static const twitterBearerToken = secrets.twitterBearerToken;
|
||||||
|
static const httpsScheme = 'https';
|
||||||
|
static const apiHost = 'api.twitter.com';
|
||||||
|
static const userPath = '/2/users/by/username/';
|
||||||
|
|
||||||
|
static Future<TwitterUser> lookupUserByName({required String userName}) async {
|
||||||
|
final queryParams = {'user.fields': 'description'};
|
||||||
|
|
||||||
|
final headers = {'authorization': 'Bearer $twitterBearerToken'};
|
||||||
|
|
||||||
|
final uri = Uri(
|
||||||
|
scheme: httpsScheme,
|
||||||
|
host: apiHost,
|
||||||
|
path: userPath + userName,
|
||||||
|
queryParameters: queryParams,
|
||||||
|
);
|
||||||
|
|
||||||
|
var response = await http.get(uri, headers: headers);
|
||||||
|
|
||||||
|
if (response.statusCode != 200) {
|
||||||
|
throw Exception('Unexpected http status: ${response.statusCode}');
|
||||||
|
}
|
||||||
|
final responseJSON = json.decode(response.body) as Map<String, dynamic>;
|
||||||
|
|
||||||
|
if (responseJSON['errors'] != null) {
|
||||||
|
throw Exception(responseJSON['errors'][0]['detail']);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TwitterUser.fromJson(responseJSON['data'] as Map<String, dynamic>);
|
||||||
|
}
|
||||||
|
}
|
16
lib/twitter/twitter_user.dart
Normal file
16
lib/twitter/twitter_user.dart
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
class TwitterUser {
|
||||||
|
TwitterUser({required this.id, required this.username, required this.name, this.description});
|
||||||
|
|
||||||
|
final String id;
|
||||||
|
final String username;
|
||||||
|
final String name;
|
||||||
|
final String? description;
|
||||||
|
|
||||||
|
factory TwitterUser.fromJson(Map<String, dynamic> json) {
|
||||||
|
return TwitterUser(
|
||||||
|
id: json['id'] as String,
|
||||||
|
username: json['username'] as String,
|
||||||
|
name: json['name'] as String,
|
||||||
|
description: json['description'] as String?);
|
||||||
|
}
|
||||||
|
}
|
|
@ -398,7 +398,6 @@
|
||||||
"biometric_auth_reason":"امسح بصمة إصبعك للمصادقة",
|
"biometric_auth_reason":"امسح بصمة إصبعك للمصادقة",
|
||||||
"version":"الإصدار ${currentVersion}",
|
"version":"الإصدار ${currentVersion}",
|
||||||
|
|
||||||
"openalias_alert_title":"تم ايجاد العنوان",
|
|
||||||
"openalias_alert_content":"سوف ترسل الأموال إلى\n${recipient_name}",
|
"openalias_alert_content":"سوف ترسل الأموال إلى\n${recipient_name}",
|
||||||
|
|
||||||
"card_address":"العنوان:",
|
"card_address":"العنوان:",
|
||||||
|
|
|
@ -398,7 +398,6 @@
|
||||||
"biometric_auth_reason" : "Scannen Sie Ihren Fingerabdruck zur Authentifizierung",
|
"biometric_auth_reason" : "Scannen Sie Ihren Fingerabdruck zur Authentifizierung",
|
||||||
"version" : "Version ${currentVersion}",
|
"version" : "Version ${currentVersion}",
|
||||||
|
|
||||||
"openalias_alert_title" : "Adresse Erkannt",
|
|
||||||
"openalias_alert_content" : "Sie senden Geld an\n${recipient_name}",
|
"openalias_alert_content" : "Sie senden Geld an\n${recipient_name}",
|
||||||
|
|
||||||
"card_address" : "Adresse:",
|
"card_address" : "Adresse:",
|
||||||
|
|
|
@ -398,7 +398,6 @@
|
||||||
"biometric_auth_reason" : "Scan your fingerprint to authenticate",
|
"biometric_auth_reason" : "Scan your fingerprint to authenticate",
|
||||||
"version" : "Version ${currentVersion}",
|
"version" : "Version ${currentVersion}",
|
||||||
|
|
||||||
"openalias_alert_title" : "Address Detected",
|
|
||||||
"openalias_alert_content" : "You will be sending funds to\n${recipient_name}",
|
"openalias_alert_content" : "You will be sending funds to\n${recipient_name}",
|
||||||
|
|
||||||
"card_address" : "Address:",
|
"card_address" : "Address:",
|
||||||
|
|
|
@ -398,7 +398,6 @@
|
||||||
"biometric_auth_reason" : "Escanee su huella digital para autenticar",
|
"biometric_auth_reason" : "Escanee su huella digital para autenticar",
|
||||||
"version" : "Versión ${currentVersion}",
|
"version" : "Versión ${currentVersion}",
|
||||||
|
|
||||||
"openalias_alert_title" : "Destinatario detectado",
|
|
||||||
"openalias_alert_content" : "Enviará fondos a\n${recipient_name}",
|
"openalias_alert_content" : "Enviará fondos a\n${recipient_name}",
|
||||||
|
|
||||||
"card_address" : "Dirección:",
|
"card_address" : "Dirección:",
|
||||||
|
|
|
@ -396,7 +396,6 @@
|
||||||
"biometric_auth_reason" : "Scannez votre empreinte digitale pour vous authentifier",
|
"biometric_auth_reason" : "Scannez votre empreinte digitale pour vous authentifier",
|
||||||
"version" : "Version ${currentVersion}",
|
"version" : "Version ${currentVersion}",
|
||||||
|
|
||||||
"openalias_alert_title" : "Adresse Détectée",
|
|
||||||
"openalias_alert_content" : "Vous allez envoyer des fonds à\n${recipient_name}",
|
"openalias_alert_content" : "Vous allez envoyer des fonds à\n${recipient_name}",
|
||||||
|
|
||||||
"card_address" : "Adresse :",
|
"card_address" : "Adresse :",
|
||||||
|
|
|
@ -398,7 +398,6 @@
|
||||||
"biometric_auth_reason" : "प्रमाणित करने के लिए अपने फ़िंगरप्रिंट को स्कैन करें",
|
"biometric_auth_reason" : "प्रमाणित करने के लिए अपने फ़िंगरप्रिंट को स्कैन करें",
|
||||||
"version" : "संस्करण ${currentVersion}",
|
"version" : "संस्करण ${currentVersion}",
|
||||||
|
|
||||||
"openalias_alert_title" : "पता मिला",
|
|
||||||
"openalias_alert_content" : "आपको धनराशि भेजी जाएगी\n${recipient_name}",
|
"openalias_alert_content" : "आपको धनराशि भेजी जाएगी\n${recipient_name}",
|
||||||
|
|
||||||
"card_address" : "पता:",
|
"card_address" : "पता:",
|
||||||
|
|
|
@ -398,7 +398,6 @@
|
||||||
"biometric_auth_reason" : "Skenirajte svoj otisak prsta za autentifikaciju",
|
"biometric_auth_reason" : "Skenirajte svoj otisak prsta za autentifikaciju",
|
||||||
"version" : "Verzija ${currentVersion}",
|
"version" : "Verzija ${currentVersion}",
|
||||||
|
|
||||||
"openalias_alert_title" : "Otkrivena je adresa",
|
|
||||||
"openalias_alert_content" : "Poslat ćete sredstva primatelju\n${recipient_name}",
|
"openalias_alert_content" : "Poslat ćete sredstva primatelju\n${recipient_name}",
|
||||||
|
|
||||||
"card_address" : "Adresa:",
|
"card_address" : "Adresa:",
|
||||||
|
|
|
@ -398,7 +398,6 @@
|
||||||
"biometric_auth_reason" : "Scansiona la tua impronta per autenticarti",
|
"biometric_auth_reason" : "Scansiona la tua impronta per autenticarti",
|
||||||
"version" : "Versione ${currentVersion}",
|
"version" : "Versione ${currentVersion}",
|
||||||
|
|
||||||
"openalias_alert_title" : "Indirizzo Rilevato",
|
|
||||||
"openalias_alert_content" : "Invierai i tuoi fondi a\n${recipient_name}",
|
"openalias_alert_content" : "Invierai i tuoi fondi a\n${recipient_name}",
|
||||||
|
|
||||||
"card_address" : "Indirizzo:",
|
"card_address" : "Indirizzo:",
|
||||||
|
|
|
@ -398,7 +398,6 @@
|
||||||
"biometric_auth_reason" : "प指紋をスキャンして認証する",
|
"biometric_auth_reason" : "प指紋をスキャンして認証する",
|
||||||
"version" : "バージョン ${currentVersion}",
|
"version" : "バージョン ${currentVersion}",
|
||||||
|
|
||||||
"openalias_alert_title" : "アドレスが検出されました",
|
|
||||||
"openalias_alert_content" : "に送金します\n${recipient_name}",
|
"openalias_alert_content" : "に送金します\n${recipient_name}",
|
||||||
|
|
||||||
"card_address" : "住所:",
|
"card_address" : "住所:",
|
||||||
|
|
|
@ -398,7 +398,6 @@
|
||||||
"biometric_auth_reason" : "지문을 스캔하여 인증",
|
"biometric_auth_reason" : "지문을 스캔하여 인증",
|
||||||
"version" : "버전 ${currentVersion}",
|
"version" : "버전 ${currentVersion}",
|
||||||
|
|
||||||
"openalias_alert_title" : "주소 감지됨",
|
|
||||||
"openalias_alert_content" : "당신은에 자금을 보낼 것입니다\n${recipient_name}",
|
"openalias_alert_content" : "당신은에 자금을 보낼 것입니다\n${recipient_name}",
|
||||||
|
|
||||||
"card_address" : "주소:",
|
"card_address" : "주소:",
|
||||||
|
|
|
@ -398,7 +398,6 @@
|
||||||
"biometric_auth_reason" : "စစ်မှန်ကြောင်းအထောက်အထားပြရန် သင့်လက်ဗွေကို စကန်ဖတ်ပါ။",
|
"biometric_auth_reason" : "စစ်မှန်ကြောင်းအထောက်အထားပြရန် သင့်လက်ဗွေကို စကန်ဖတ်ပါ။",
|
||||||
"version" : "ဗားရှင်း ${currentVersion}",
|
"version" : "ဗားရှင်း ${currentVersion}",
|
||||||
|
|
||||||
"openalias_alert_title" : "လိပ်စာကို ရှာတွေ့သည်။",
|
|
||||||
"openalias_alert_content" : "သင်သည် \n${recipient_name} သို့ ရန်ပုံငွေများ ပေးပို့ပါမည်",
|
"openalias_alert_content" : "သင်သည် \n${recipient_name} သို့ ရန်ပုံငွေများ ပေးပို့ပါမည်",
|
||||||
|
|
||||||
"card_address" : "လိပ်စာ-",
|
"card_address" : "လိပ်စာ-",
|
||||||
|
|
|
@ -398,7 +398,6 @@
|
||||||
"biometric_auth_reason" : "Scan uw vingerafdruk om te verifiëren",
|
"biometric_auth_reason" : "Scan uw vingerafdruk om te verifiëren",
|
||||||
"version" : "Versie ${currentVersion}",
|
"version" : "Versie ${currentVersion}",
|
||||||
|
|
||||||
"openalias_alert_title" : "Adres Gedetecteerd",
|
|
||||||
"openalias_alert_content" : "U stuurt geld naar\n${recipient_name}",
|
"openalias_alert_content" : "U stuurt geld naar\n${recipient_name}",
|
||||||
|
|
||||||
"card_address" : "Adres:",
|
"card_address" : "Adres:",
|
||||||
|
|
|
@ -398,7 +398,6 @@
|
||||||
"biometric_auth_reason" : "Zeskanuj swój odcisk palca, aby uwierzytelnić",
|
"biometric_auth_reason" : "Zeskanuj swój odcisk palca, aby uwierzytelnić",
|
||||||
"version" : "Wersja ${currentVersion}",
|
"version" : "Wersja ${currentVersion}",
|
||||||
|
|
||||||
"openalias_alert_title" : "Wykryto Adres",
|
|
||||||
"openalias_alert_content" : "Wysyłasz środki na\n${recipient_name}",
|
"openalias_alert_content" : "Wysyłasz środki na\n${recipient_name}",
|
||||||
|
|
||||||
"card_address" : "Adres:",
|
"card_address" : "Adres:",
|
||||||
|
|
|
@ -398,7 +398,6 @@
|
||||||
"biometric_auth_reason" : "Digitalize sua impressão digital para autenticar",
|
"biometric_auth_reason" : "Digitalize sua impressão digital para autenticar",
|
||||||
"version" : "Versão ${currentVersion}",
|
"version" : "Versão ${currentVersion}",
|
||||||
|
|
||||||
"openalias_alert_title" : "Endereço Detectado",
|
|
||||||
"openalias_alert_content" : "Você enviará fundos para\n${recipient_name}",
|
"openalias_alert_content" : "Você enviará fundos para\n${recipient_name}",
|
||||||
|
|
||||||
"card_address" : "Endereço:",
|
"card_address" : "Endereço:",
|
||||||
|
|
|
@ -398,7 +398,6 @@
|
||||||
"biometric_auth_reason" : "Отсканируйте свой отпечаток пальца для аутентификации",
|
"biometric_auth_reason" : "Отсканируйте свой отпечаток пальца для аутентификации",
|
||||||
"version" : "Версия ${currentVersion}",
|
"version" : "Версия ${currentVersion}",
|
||||||
|
|
||||||
"openalias_alert_title" : "Адрес Обнаружен",
|
|
||||||
"openalias_alert_content" : "Вы будете отправлять средства\n${recipient_name}",
|
"openalias_alert_content" : "Вы будете отправлять средства\n${recipient_name}",
|
||||||
|
|
||||||
"card_address" : "Адрес:",
|
"card_address" : "Адрес:",
|
||||||
|
|
|
@ -396,7 +396,6 @@
|
||||||
"biometric_auth_reason" : "สแกนลายนิ้วมือของคุณเพื่อยืนยันตัวตน",
|
"biometric_auth_reason" : "สแกนลายนิ้วมือของคุณเพื่อยืนยันตัวตน",
|
||||||
"version" : "เวอร์ชัน ${currentVersion}",
|
"version" : "เวอร์ชัน ${currentVersion}",
|
||||||
|
|
||||||
"openalias_alert_title" : "พบที่อยู่",
|
|
||||||
"openalias_alert_content" : "คุณกำลังจะส่งเงินไปยัง\n${recipient_name}",
|
"openalias_alert_content" : "คุณกำลังจะส่งเงินไปยัง\n${recipient_name}",
|
||||||
|
|
||||||
"card_address" : "ที่อยู่:",
|
"card_address" : "ที่อยู่:",
|
||||||
|
|
|
@ -398,7 +398,6 @@
|
||||||
"biometric_auth_reason" : "Kimlik doğrulaması için parmak izini okutun",
|
"biometric_auth_reason" : "Kimlik doğrulaması için parmak izini okutun",
|
||||||
"version" : "Sürüm ${currentVersion}",
|
"version" : "Sürüm ${currentVersion}",
|
||||||
|
|
||||||
"openalias_alert_title" : "Adres tespit edildi",
|
|
||||||
"openalias_alert_content" : "Parayı buraya gönderceksin:\n${recipient_name}",
|
"openalias_alert_content" : "Parayı buraya gönderceksin:\n${recipient_name}",
|
||||||
|
|
||||||
"card_address" : "Adres:",
|
"card_address" : "Adres:",
|
||||||
|
|
|
@ -397,7 +397,6 @@
|
||||||
"biometric_auth_reason" : "Відскануйте свій відбиток пальця для аутентифікації",
|
"biometric_auth_reason" : "Відскануйте свій відбиток пальця для аутентифікації",
|
||||||
"version" : "Версія ${currentVersion}",
|
"version" : "Версія ${currentVersion}",
|
||||||
|
|
||||||
"openalias_alert_title" : "Виявлено адресу",
|
|
||||||
"openalias_alert_content" : "Ви будете відправляти кошти\n${recipient_name}",
|
"openalias_alert_content" : "Ви будете відправляти кошти\n${recipient_name}",
|
||||||
|
|
||||||
"card_address" : "Адреса:",
|
"card_address" : "Адреса:",
|
||||||
|
|
|
@ -398,7 +398,6 @@
|
||||||
"biometric_auth_reason" : "扫描指纹进行身份认证",
|
"biometric_auth_reason" : "扫描指纹进行身份认证",
|
||||||
"version" : "版本 ${currentVersion}",
|
"version" : "版本 ${currentVersion}",
|
||||||
|
|
||||||
"openalias_alert_title" : "检测到地址",
|
|
||||||
"openalias_alert_content" : "您将汇款至\n${recipient_name}",
|
"openalias_alert_content" : "您将汇款至\n${recipient_name}",
|
||||||
|
|
||||||
"card_address" : "地址:",
|
"card_address" : "地址:",
|
||||||
|
|
|
@ -29,6 +29,7 @@ class SecretKey {
|
||||||
SecretKey('anypayToken', () => ''),
|
SecretKey('anypayToken', () => ''),
|
||||||
SecretKey('onramperApiKey', () => ''),
|
SecretKey('onramperApiKey', () => ''),
|
||||||
SecretKey('ioniaClientId', () => ''),
|
SecretKey('ioniaClientId', () => ''),
|
||||||
|
SecretKey('twitterBearerToken', () => ''),
|
||||||
];
|
];
|
||||||
|
|
||||||
final String name;
|
final String name;
|
||||||
|
|
Loading…
Reference in a new issue