From 83c1907e31460d7fc5f4679249e52f6dfe1ed1e4 Mon Sep 17 00:00:00 2001 From: Serhii Date: Tue, 24 Jan 2023 20:24:46 +0200 Subject: [PATCH 1/7] add twitter api --- lib/core/address_validator.dart | 18 +++++++++ lib/entities/parse_address_from_domain.dart | 30 ++++++++++++--- lib/entities/parsed_address.dart | 11 +++++- .../widgets/extract_address_from_parsed.dart | 5 +++ lib/twitter/twitter_api.dart | 37 +++++++++++++++++++ lib/twitter/twitter_user.dart | 16 ++++++++ 6 files changed, 110 insertions(+), 7 deletions(-) create mode 100644 lib/twitter/twitter_api.dart create mode 100644 lib/twitter/twitter_user.dart diff --git a/lib/core/address_validator.dart b/lib/core/address_validator.dart index 519cd92a3..20cb66a4d 100644 --- a/lib/core/address_validator.dart +++ b/lib/core/address_validator.dart @@ -198,4 +198,22 @@ class AddressValidator extends TextValidator { 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; + } + } } diff --git a/lib/entities/parse_address_from_domain.dart b/lib/entities/parse_address_from_domain.dart index 775f6e229..0affa1d7e 100644 --- a/lib/entities/parse_address_from_domain.dart +++ b/lib/entities/parse_address_from_domain.dart @@ -1,18 +1,19 @@ +import 'package:cake_wallet/core/address_validator.dart'; import 'package:cake_wallet/core/yat_service.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/twitter/twitter_api.dart'; +import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:cake_wallet/entities/fio_address_provider.dart'; class AddressResolver { - AddressResolver({required this.yatService, required this.walletType}); - final YatService yatService; final WalletType walletType; - + static const unstoppableDomains = [ 'crypto', 'zil', @@ -26,9 +27,28 @@ class AddressResolver { '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 resolve(String text, String ticker) async { 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); if (isFioRegistered) { final address = await FioAddressProvider.getPubAddress(text, ticker); @@ -58,7 +78,7 @@ class AddressResolver { final record = await OpenaliasRecord.fetchAddressAndName( formattedName: formattedName, ticker: ticker); return ParsedAddress.fetchOpenAliasAddress(record: record, name: text); - + } catch (e) { print(e.toString()); } diff --git a/lib/entities/parsed_address.dart b/lib/entities/parsed_address.dart index 09cecbf04..afadb7b98 100644 --- a/lib/entities/parsed_address.dart +++ b/lib/entities/parsed_address.dart @@ -1,8 +1,7 @@ import 'package:cake_wallet/entities/openalias_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 { ParsedAddress({ @@ -62,6 +61,14 @@ class ParsedAddress { ); } + factory ParsedAddress.fetchTwitterAddress({required String address, required String name}){ + return ParsedAddress( + addresses: [address], + name: name, + parseFrom: ParseFrom.twitter, + ); + } + 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 4ddd6ada0..1cd7bf0b9 100644 --- a/lib/src/screens/send/widgets/extract_address_from_parsed.dart +++ b/lib/src/screens/send/widgets/extract_address_from_parsed.dart @@ -28,6 +28,11 @@ Future extractAddressFromParsed( content = S.of(context).openalias_alert_content(parsedAddress.name); address = parsedAddress.addresses.first; break; + case ParseFrom.twitter: + title = S.of(context).address_detected; + content = S.of(context).openalias_alert_content(parsedAddress.name); + address = parsedAddress.addresses.first; + break; case ParseFrom.yatRecord: if (parsedAddress.name.isEmpty) { title = S.of(context).yat_error; diff --git a/lib/twitter/twitter_api.dart b/lib/twitter/twitter_api.dart new file mode 100644 index 000000000..bd03e6e00 --- /dev/null +++ b/lib/twitter/twitter_api.dart @@ -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 lookupUserByName({required String userName}) async { + final queryParams = {'user.fields': 'description'}; + + final headers = {'authorization': 'Bearer ${secrets.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; + + if (responseJSON['errors'] != null) { + throw Exception(responseJSON['errors'][0]['detail']); + } + + return TwitterUser.fromJson(responseJSON['data'] as Map); + } +} diff --git a/lib/twitter/twitter_user.dart b/lib/twitter/twitter_user.dart new file mode 100644 index 000000000..c4bda7859 --- /dev/null +++ b/lib/twitter/twitter_user.dart @@ -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 json) { + return TwitterUser( + id: json['id'] as String, + username: json['username'] as String, + name: json['name'] as String, + description: json['description'] as String?); + } +} From 5ef568ec507b47057fb91c7151737cccda3cde60 Mon Sep 17 00:00:00 2001 From: Serhii Date: Tue, 24 Jan 2023 21:33:09 +0200 Subject: [PATCH 2/7] add keys --- tool/utils/secret_key.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tool/utils/secret_key.dart b/tool/utils/secret_key.dart index e5202a829..ca41542ed 100644 --- a/tool/utils/secret_key.dart +++ b/tool/utils/secret_key.dart @@ -29,6 +29,9 @@ class SecretKey { SecretKey('anypayToken', () => ''), SecretKey('onramperApiKey', () => ''), SecretKey('ioniaClientId', () => ''), + SecretKey('twitterAPIKey', () => ''), + SecretKey('twitterAPIKeySecret', () => ''), + SecretKey('twitterBearerToken', () => ''), ]; final String name; From 6825b6e625e9900b1c445711e91195811a55324d Mon Sep 17 00:00:00 2001 From: Serhii Date: Thu, 26 Jan 2023 20:05:09 +0200 Subject: [PATCH 3/7] minor fixes --- .github/workflows/pr_test_build.yml | 1 + lib/twitter/twitter_api.dart | 2 +- tool/utils/secret_key.dart | 2 -- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pr_test_build.yml b/.github/workflows/pr_test_build.yml index 84ac69197..0f61d11ac 100644 --- a/.github/workflows/pr_test_build.yml +++ b/.github/workflows/pr_test_build.yml @@ -110,6 +110,7 @@ jobs: echo "const onramperApiKey = '${{ secrets.ONRAMPER_API_KEY }}';" >> 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.TWITTER_BEARER_TOKEN }}';" >> lib/.secrets.g.dart - name: Rename app run: sed -i -e "s/\${APP_NAME}/$GITHUB_HEAD_REF/g" /opt/android/cake_wallet/android/app/src/main/AndroidManifest.xml diff --git a/lib/twitter/twitter_api.dart b/lib/twitter/twitter_api.dart index bd03e6e00..27fb7d1a2 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'}; - final headers = {'authorization': 'Bearer ${secrets.twitterBearerToken}'}; + final headers = {'authorization': 'Bearer $twitterBearerToken'}; final uri = Uri( scheme: httpsScheme, diff --git a/tool/utils/secret_key.dart b/tool/utils/secret_key.dart index ca41542ed..d0fa39bfc 100644 --- a/tool/utils/secret_key.dart +++ b/tool/utils/secret_key.dart @@ -29,8 +29,6 @@ class SecretKey { SecretKey('anypayToken', () => ''), SecretKey('onramperApiKey', () => ''), SecretKey('ioniaClientId', () => ''), - SecretKey('twitterAPIKey', () => ''), - SecretKey('twitterAPIKeySecret', () => ''), SecretKey('twitterBearerToken', () => ''), ]; From 34db9e5d505d335a4b5478d0ed496934c0f85d1f Mon Sep 17 00:00:00 2001 From: Serhii Date: Thu, 26 Jan 2023 20:20:01 +0200 Subject: [PATCH 4/7] fix key name --- .github/workflows/pr_test_build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr_test_build.yml b/.github/workflows/pr_test_build.yml index 0f61d11ac..c3c61865f 100644 --- a/.github/workflows/pr_test_build.yml +++ b/.github/workflows/pr_test_build.yml @@ -110,7 +110,7 @@ jobs: echo "const onramperApiKey = '${{ secrets.ONRAMPER_API_KEY }}';" >> 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.TWITTER_BEARER_TOKEN }}';" >> lib/.secrets.g.dart + echo "const twitterBearerToken = '${{ secrets.TWITTER_BEARER_TOKEN }}';" >> lib/.secrets.g.dart - name: Rename app run: sed -i -e "s/\${APP_NAME}/$GITHUB_HEAD_REF/g" /opt/android/cake_wallet/android/app/src/main/AndroidManifest.xml From 9869cd60cc38fef4d9a3f919e1b27ceebad1ad97 Mon Sep 17 00:00:00 2001 From: Serhii Date: Mon, 30 Jan 2023 21:15:10 +0200 Subject: [PATCH 5/7] udate alert text --- lib/entities/parse_address_from_domain.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/entities/parse_address_from_domain.dart b/lib/entities/parse_address_from_domain.dart index 0affa1d7e..6e46e5a66 100644 --- a/lib/entities/parse_address_from_domain.dart +++ b/lib/entities/parse_address_from_domain.dart @@ -45,7 +45,7 @@ class AddressResolver { 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); + return ParsedAddress.fetchTwitterAddress(address: address, name: '$text on Twitter'); } } if (!text.startsWith('@') && text.contains('@') && !text.contains('.')) { From 81f59cacd984533700376db5ffc7218d48b52ded Mon Sep 17 00:00:00 2001 From: Justin Ehrenhofer Date: Mon, 30 Jan 2023 15:18:19 -0600 Subject: [PATCH 6/7] Change to parentheses This way we don't need to translate and create different strings for the "on", which will appear odd in languages other than English. I also added it for FIO and OpenAlias. Further, I removed the 1 instance of openalias_alert_title. It can be removed from the localization file if/when it's convenient. I did NOT change anything for Unstoppable, because that appeared to touch a dependency. That has its own custom (but similar) text response --- lib/entities/parse_address_from_domain.dart | 6 +++--- .../screens/send/widgets/extract_address_from_parsed.dart | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/entities/parse_address_from_domain.dart b/lib/entities/parse_address_from_domain.dart index 6e46e5a66..a52613d46 100644 --- a/lib/entities/parse_address_from_domain.dart +++ b/lib/entities/parse_address_from_domain.dart @@ -45,14 +45,14 @@ class AddressResolver { 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 on Twitter'); + return ParsedAddress.fetchTwitterAddress(address: address, name: '$text (Twitter)'); } } if (!text.startsWith('@') && text.contains('@') && !text.contains('.')) { final bool isFioRegistered = await FioAddressProvider.checkAvail(text); if (isFioRegistered) { final address = await FioAddressProvider.getPubAddress(text, ticker); - return ParsedAddress.fetchFioAddress(address: address, name: text); + return ParsedAddress.fetchFioAddress(address: address, name: '$text (FIO)'); } } @@ -77,7 +77,7 @@ class AddressResolver { final record = await OpenaliasRecord.fetchAddressAndName( formattedName: formattedName, ticker: ticker); - return ParsedAddress.fetchOpenAliasAddress(record: record, name: text); + return ParsedAddress.fetchOpenAliasAddress(record: record, name: '$text (OpenAlias)'); } catch (e) { print(e.toString()); 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 1cd7bf0b9..dcb0edc89 100644 --- a/lib/src/screens/send/widgets/extract_address_from_parsed.dart +++ b/lib/src/screens/send/widgets/extract_address_from_parsed.dart @@ -19,7 +19,7 @@ Future extractAddressFromParsed( address = parsedAddress.addresses.first; break; 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); address = parsedAddress.addresses.first; break; From ef01554fdbfbf47bc042aaf42403a8aa84526bde Mon Sep 17 00:00:00 2001 From: Serhii Date: Tue, 31 Jan 2023 21:39:08 +0200 Subject: [PATCH 7/7] fix openAlias address resolv --- lib/entities/openalias_record.dart | 102 +++++++++--------- lib/entities/parse_address_from_domain.dart | 45 ++++---- lib/entities/parsed_address.dart | 6 +- .../widgets/extract_address_from_parsed.dart | 6 +- res/values/strings_ar.arb | 1 - res/values/strings_de.arb | 1 - res/values/strings_en.arb | 1 - res/values/strings_es.arb | 1 - res/values/strings_fr.arb | 1 - res/values/strings_hi.arb | 1 - res/values/strings_hr.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 | 1 - res/values/strings_pt.arb | 1 - res/values/strings_ru.arb | 1 - res/values/strings_th.arb | 1 - res/values/strings_tr.arb | 1 - res/values/strings_uk.arb | 1 - res/values/strings_zh.arb | 1 - 23 files changed, 79 insertions(+), 99 deletions(-) diff --git a/lib/entities/openalias_record.dart b/lib/entities/openalias_record.dart index 9e2b3f680..842a711fe 100644 --- a/lib/entities/openalias_record.dart +++ b/lib/entities/openalias_record.dart @@ -1,5 +1,4 @@ import 'package:basic_utils/basic_utils.dart'; -import 'package:cw_core/wallet_type.dart'; class OpenaliasRecord { OpenaliasRecord({ @@ -22,69 +21,68 @@ class OpenaliasRecord { return formattedName; } - static Future fetchAddressAndName({ + static Future?> 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 ticker, - }) async { + required List txtRecord, + }) { String address = formattedName; String name = formattedName; String note = ''; - if (formattedName.contains(".")) { - try { - final txtRecord = await DnsUtils.lookupRecord( - formattedName, RRecordType.TXT, - dnssec: true); + for (RRecord element in txtRecord) { + String record = element.data; - if (txtRecord != null) { - for (RRecord element in txtRecord) { - String record = element.data; + if (record.contains("oa1:$ticker") && record.contains("recipient_address")) { + record = record.replaceAll('\"', ""); - if (record.contains("oa1:$ticker") && - record.contains("recipient_address")) { - record = record.replaceAll('\"', ""); + final dataList = record.split(";"); - final dataList = record.split(";"); + address = dataList + .where((item) => (item.contains("recipient_address"))) + .toString() + .replaceAll("oa1:$ticker recipient_address=", "") + .replaceAll("(", "") + .replaceAll(")", "") + .trim(); - address = dataList - .where((item) => (item.contains("recipient_address"))) - .toString() - .replaceAll("oa1:$ticker recipient_address=", "") - .replaceAll("(", "") - .replaceAll(")", "") - .trim(); + final recipientName = dataList + .where((item) => (item.contains("recipient_name"))) + .toString() + .replaceAll("(", "") + .replaceAll(")", "") + .trim(); - final recipientName = dataList - .where((item) => (item.contains("recipient_name"))) - .toString() - .replaceAll("(", "") - .replaceAll(")", "") - .trim(); - - if (recipientName.isNotEmpty) { - name = recipientName.replaceAll("recipient_name=", ""); - } - - final description = dataList - .where((item) => (item.contains("tx_description"))) - .toString() - .replaceAll("(", "") - .replaceAll(")", "") - .trim(); - - if (description.isNotEmpty) { - note = description.replaceAll("tx_description=", ""); - } - - break; - } - } + if (recipientName.isNotEmpty) { + name = recipientName.replaceAll("recipient_name=", ""); } - } catch (e) { - print("${e.toString()}"); - } - } - return OpenaliasRecord(address: address, name: name, description: note); + final description = dataList + .where((item) => (item.contains("tx_description"))) + .toString() + .replaceAll("(", "") + .replaceAll(")", "") + .trim(); + + if (description.isNotEmpty) { + note = description.replaceAll("tx_description=", ""); + } + + break; + } + } + return OpenaliasRecord(address: address, name: name, description: note); +} } diff --git a/lib/entities/parse_address_from_domain.dart b/lib/entities/parse_address_from_domain.dart index a52613d46..6574d26fd 100644 --- a/lib/entities/parse_address_from_domain.dart +++ b/lib/entities/parse_address_from_domain.dart @@ -11,21 +11,22 @@ import 'package:cake_wallet/entities/fio_address_provider.dart'; class AddressResolver { AddressResolver({required this.yatService, required this.walletType}); + final YatService yatService; final WalletType walletType; static const unstoppableDomains = [ - 'crypto', - 'zil', - 'x', - 'coin', - 'wallet', - 'bitcoin', - '888', - 'nft', - 'dao', - 'blockchain' -]; + 'crypto', + 'zil', + 'x', + 'coin', + 'wallet', + 'bitcoin', + '888', + 'nft', + 'dao', + 'blockchain' + ]; static String? extractAddressByType({required String raw, required CryptoCurrency type}) { final addressPattern = AddressValidator.getAddressFromStringPattern(type); @@ -43,18 +44,18 @@ class AddressResolver { 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)); + final address = extractAddressByType( + raw: twitterUser.description ?? '', type: CryptoCurrency.fromString(ticker)); if (address != null) { - return ParsedAddress.fetchTwitterAddress(address: address, name: '$text (Twitter)'); + return ParsedAddress.fetchTwitterAddress(address: address, name: text); } } if (!text.startsWith('@') && text.contains('@') && !text.contains('.')) { final bool isFioRegistered = await FioAddressProvider.checkAvail(text); if (isFioRegistered) { final address = await FioAddressProvider.getPubAddress(text, ticker); - return ParsedAddress.fetchFioAddress(address: address, name: '$text (FIO)'); - } - + return ParsedAddress.fetchFioAddress(address: address, name: text); + } } if (text.hasOnlyEmojis) { if (walletType != WalletType.haven) { @@ -75,10 +76,14 @@ class AddressResolver { return ParsedAddress.fetchUnstoppableDomainAddress(address: address, name: text); } - final record = await OpenaliasRecord.fetchAddressAndName( - formattedName: formattedName, ticker: ticker); - return ParsedAddress.fetchOpenAliasAddress(record: record, name: '$text (OpenAlias)'); - + if (formattedName.contains(".")) { + final txtRecord = await OpenaliasRecord.lookupOpenAliasRecord(formattedName); + if (txtRecord != null) { + final record = await OpenaliasRecord.fetchAddressAndName( + formattedName: formattedName, ticker: ticker, txtRecord: txtRecord); + return ParsedAddress.fetchOpenAliasAddress(record: record, name: text); + } + } } catch (e) { print(e.toString()); } diff --git a/lib/entities/parsed_address.dart b/lib/entities/parsed_address.dart index afadb7b98..a73b44e33 100644 --- a/lib/entities/parsed_address.dart +++ b/lib/entities/parsed_address.dart @@ -40,11 +40,7 @@ class ParsedAddress { ); } - factory ParsedAddress.fetchOpenAliasAddress({OpenaliasRecord? record, required String name}){ - final formattedName = OpenaliasRecord.formatDomainName(name); - if (record == null || record.address.contains(formattedName)) { - return ParsedAddress(addresses: [name]); - } + factory ParsedAddress.fetchOpenAliasAddress({required OpenaliasRecord record, required String name}){ return ParsedAddress( addresses: [record.address], name: record.name, 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 dcb0edc89..ab5778739 100644 --- a/lib/src/screens/send/widgets/extract_address_from_parsed.dart +++ b/lib/src/screens/send/widgets/extract_address_from_parsed.dart @@ -20,17 +20,17 @@ Future extractAddressFromParsed( break; case ParseFrom.openAlias: 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; break; case ParseFrom.fio: 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); + content = S.of(context).openalias_alert_content('${parsedAddress.name} (Twitter)'); address = parsedAddress.addresses.first; break; case ParseFrom.yatRecord: diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index 250f29a70..e7f4386b0 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -398,7 +398,6 @@ "biometric_auth_reason":"امسح بصمة إصبعك للمصادقة", "version":"الإصدار ${currentVersion}", - "openalias_alert_title":"تم ايجاد العنوان", "openalias_alert_content":"سوف ترسل الأموال إلى\n${recipient_name}", "card_address":"العنوان:", diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index a3fd4f585..b57a4374e 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -398,7 +398,6 @@ "biometric_auth_reason" : "Scannen Sie Ihren Fingerabdruck zur Authentifizierung", "version" : "Version ${currentVersion}", - "openalias_alert_title" : "Adresse Erkannt", "openalias_alert_content" : "Sie senden Geld an\n${recipient_name}", "card_address" : "Adresse:", diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index 87629cbd8..8bfeb0193 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -398,7 +398,6 @@ "biometric_auth_reason" : "Scan your fingerprint to authenticate", "version" : "Version ${currentVersion}", - "openalias_alert_title" : "Address Detected", "openalias_alert_content" : "You will be sending funds to\n${recipient_name}", "card_address" : "Address:", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index b6d4cd358..90f0f5293 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -398,7 +398,6 @@ "biometric_auth_reason" : "Escanee su huella digital para autenticar", "version" : "Versión ${currentVersion}", - "openalias_alert_title" : "Destinatario detectado", "openalias_alert_content" : "Enviará fondos a\n${recipient_name}", "card_address" : "Dirección:", diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index 7b9e8da07..2b65a919e 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -396,7 +396,6 @@ "biometric_auth_reason" : "Scannez votre empreinte digitale pour vous authentifier", "version" : "Version ${currentVersion}", - "openalias_alert_title" : "Adresse Détectée", "openalias_alert_content" : "Vous allez envoyer des fonds à\n${recipient_name}", "card_address" : "Adresse :", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index c8e454aae..044e72b52 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -398,7 +398,6 @@ "biometric_auth_reason" : "प्रमाणित करने के लिए अपने फ़िंगरप्रिंट को स्कैन करें", "version" : "संस्करण ${currentVersion}", - "openalias_alert_title" : "पता मिला", "openalias_alert_content" : "आपको धनराशि भेजी जाएगी\n${recipient_name}", "card_address" : "पता:", diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index 239a175c2..74177bd50 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -398,7 +398,6 @@ "biometric_auth_reason" : "Skenirajte svoj otisak prsta za autentifikaciju", "version" : "Verzija ${currentVersion}", - "openalias_alert_title" : "Otkrivena je adresa", "openalias_alert_content" : "Poslat ćete sredstva primatelju\n${recipient_name}", "card_address" : "Adresa:", diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index f3ddf8af2..ebbf11bf9 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -398,7 +398,6 @@ "biometric_auth_reason" : "Scansiona la tua impronta per autenticarti", "version" : "Versione ${currentVersion}", - "openalias_alert_title" : "Indirizzo Rilevato", "openalias_alert_content" : "Invierai i tuoi fondi a\n${recipient_name}", "card_address" : "Indirizzo:", diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index b3746aaa1..6bb31cc95 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -398,7 +398,6 @@ "biometric_auth_reason" : "प指紋をスキャンして認証する", "version" : "バージョン ${currentVersion}", - "openalias_alert_title" : "アドレスが検出されました", "openalias_alert_content" : "に送金します\n${recipient_name}", "card_address" : "住所:", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index db6778fd6..d538b99a7 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -398,7 +398,6 @@ "biometric_auth_reason" : "지문을 스캔하여 인증", "version" : "버전 ${currentVersion}", - "openalias_alert_title" : "주소 감지됨", "openalias_alert_content" : "당신은에 자금을 보낼 것입니다\n${recipient_name}", "card_address" : "주소:", diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index 352b8d191..a10c1d18d 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -398,7 +398,6 @@ "biometric_auth_reason" : "စစ်မှန်ကြောင်းအထောက်အထားပြရန် သင့်လက်ဗွေကို စကန်ဖတ်ပါ။", "version" : "ဗားရှင်း ${currentVersion}", - "openalias_alert_title" : "လိပ်စာကို ရှာတွေ့သည်။", "openalias_alert_content" : "သင်သည် \n${recipient_name} သို့ ရန်ပုံငွေများ ပေးပို့ပါမည်", "card_address" : "လိပ်စာ-", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index faac8f702..6a28e108b 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -398,7 +398,6 @@ "biometric_auth_reason" : "Scan uw vingerafdruk om te verifiëren", "version" : "Versie ${currentVersion}", - "openalias_alert_title" : "Adres Gedetecteerd", "openalias_alert_content" : "U stuurt geld naar\n${recipient_name}", "card_address" : "Adres:", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index 0f0e14959..5320c6981 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -398,7 +398,6 @@ "biometric_auth_reason" : "Zeskanuj swój odcisk palca, aby uwierzytelnić", "version" : "Wersja ${currentVersion}", - "openalias_alert_title" : "Wykryto Adres", "openalias_alert_content" : "Wysyłasz środki na\n${recipient_name}", "card_address" : "Adres:", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 90d477369..c3d4eb986 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -398,7 +398,6 @@ "biometric_auth_reason" : "Digitalize sua impressão digital para autenticar", "version" : "Versão ${currentVersion}", - "openalias_alert_title" : "Endereço Detectado", "openalias_alert_content" : "Você enviará fundos para\n${recipient_name}", "card_address" : "Endereço:", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 8789dd4a0..47a1f0309 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -398,7 +398,6 @@ "biometric_auth_reason" : "Отсканируйте свой отпечаток пальца для аутентификации", "version" : "Версия ${currentVersion}", - "openalias_alert_title" : "Адрес Обнаружен", "openalias_alert_content" : "Вы будете отправлять средства\n${recipient_name}", "card_address" : "Адрес:", diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index 5e1428fac..54002b73d 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -396,7 +396,6 @@ "biometric_auth_reason" : "สแกนลายนิ้วมือของคุณเพื่อยืนยันตัวตน", "version" : "เวอร์ชัน ${currentVersion}", - "openalias_alert_title" : "พบที่อยู่", "openalias_alert_content" : "คุณกำลังจะส่งเงินไปยัง\n${recipient_name}", "card_address" : "ที่อยู่:", diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index 678b3609f..3975451b0 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -398,7 +398,6 @@ "biometric_auth_reason" : "Kimlik doğrulaması için parmak izini okutun", "version" : "Sürüm ${currentVersion}", - "openalias_alert_title" : "Adres tespit edildi", "openalias_alert_content" : "Parayı buraya gönderceksin:\n${recipient_name}", "card_address" : "Adres:", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index b6ac3a511..ebd2ada04 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -397,7 +397,6 @@ "biometric_auth_reason" : "Відскануйте свій відбиток пальця для аутентифікації", "version" : "Версія ${currentVersion}", - "openalias_alert_title" : "Виявлено адресу", "openalias_alert_content" : "Ви будете відправляти кошти\n${recipient_name}", "card_address" : "Адреса:", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index ba2f3f839..71acbed61 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -398,7 +398,6 @@ "biometric_auth_reason" : "扫描指纹进行身份认证", "version" : "版本 ${currentVersion}", - "openalias_alert_title" : "检测到地址", "openalias_alert_content" : "您将汇款至\n${recipient_name}", "card_address" : "地址:",