update logic for Crypto address resolving
update resolving of crypto wallet addresses by using of OpenAlias in way to pick right wallet address based on current wallet type
Godwin Asuquo committed
Jan 14, 2022 at 14:18 UTC
ac8ef0c946be480ca967626afa09f8bb1b33fd48
2 files changed
+43
-32
lib/entities/openalias_record.dart
+25
-13
@@ -1,7 +1,8 @@
1
import 'package:basic_utils/basic_utils.dart';
2
+import 'package:cw_core/wallet_type.dart';
3
+import 'package:flutter/material.dart';
4
5
class OpenaliasRecord {
4
-
6
OpenaliasRecord({this.address, this.name});
7
8
final String name;
@@ -17,30 +18,43 @@ class OpenaliasRecord {
18
return formattedName;
19
}
20
20
- static Future<OpenaliasRecord> fetchAddressAndName(String formattedName) async {
21
+ static Future<OpenaliasRecord> fetchAddressAndName({
22
+ @required String formattedName,
23
+ @required String ticker,
24
+ }) async {
25
String address = formattedName;
26
String name = formattedName;
27
28
if (formattedName.contains(".")) {
29
try {
26
- final txtRecord = await DnsUtils.lookupRecord(formattedName, RRecordType.TXT, dnssec: true);
30
+ final txtRecord = await DnsUtils.lookupRecord(
31
+ formattedName, RRecordType.TXT,
32
+ dnssec: true);
33
34
if (txtRecord != null) {
29
-
35
for (RRecord element in txtRecord) {
36
String record = element.data;
37
33
- if (record.contains("oa1:xmr") && record.contains("recipient_address")) {
38
+ if (record.contains("oa1:$ticker") &&
39
+ record.contains("recipient_address")) {
40
record = record.replaceAll('\"', "");
41
42
final dataList = record.split(";");
43
38
- address = dataList.where((item) => (item.contains("recipient_address")))
39
- .toString().replaceAll("oa1:xmr recipient_address=", "")
40
- .replaceAll("(", "").replaceAll(")", "").trim();
41
-
42
- final recipientName = dataList.where((item) => (item.contains("recipient_name"))).toString()
43
- .replaceAll("(", "").replaceAll(")", "").trim();
44
+ address = dataList
45
+ .where((item) => (item.contains("recipient_address")))
46
+ .toString()
47
+ .replaceAll("oa1:$ticker recipient_address=", "")
48
+ .replaceAll("(", "")
49
+ .replaceAll(")", "")
50
+ .trim();
51
+
52
+ final recipientName = dataList
53
+ .where((item) => (item.contains("recipient_name")))
54
+ .toString()
55
+ .replaceAll("(", "")
56
+ .replaceAll(")", "")
57
+ .trim();
58
59
if (recipientName.isNotEmpty) {
60
name = recipientName.replaceAll("recipient_name=", "");
@@ -57,6 +71,4 @@ class OpenaliasRecord {
71
72
return OpenaliasRecord(address: address, name: name);
73
}
60
-
74
}
62
-
lib/entities/parse_address_from_domain.dart
+18
-19
@@ -2,18 +2,20 @@ import 'package:cake_wallet/entities/openalias_record.dart';
2
import 'package:cake_wallet/entities/parsed_address.dart';
3
import 'package:cake_wallet/entities/unstoppable_domain_address.dart';
4
import 'package:cake_wallet/store/yat/yat_store.dart';
5
+import 'package:cw_core/wallet_type.dart';
6
7
const unstoppableDomains = [
7
- 'crypto',
8
- 'zil',
9
- 'x',
10
- 'coin',
11
- 'wallet',
12
- 'bitcoin',
13
- '888',
14
- 'nft',
15
- 'dao',
16
- 'blockchain'];
8
+ 'crypto',
9
+ 'zil',
10
+ 'x',
11
+ 'coin',
12
+ 'wallet',
13
+ 'bitcoin',
14
+ '888',
15
+ 'nft',
16
+ 'dao',
17
+ 'blockchain'
18
+];
19
20
Future<ParsedAddress> parseAddressFromDomain(
21
String domain, String ticker) async {
@@ -28,22 +30,18 @@ Future<ParsedAddress> parseAddressFromDomain(
30
31
if (addresses?.isEmpty ?? true) {
32
return ParsedAddress(
31
- addresses: [domain],
32
- parseFrom: ParseFrom.yatRecord);
33
+ addresses: [domain], parseFrom: ParseFrom.yatRecord);
34
}
35
36
return ParsedAddress(
36
- addresses: addresses,
37
- name: domain,
38
- parseFrom: ParseFrom.yatRecord);
37
+ addresses: addresses, name: domain, parseFrom: ParseFrom.yatRecord);
38
} catch (e) {
39
return ParsedAddress(addresses: [domain]);
40
}
41
}
42
43
if (unstoppableDomains.any((domain) => name.contains(domain))) {
45
- final address =
46
- await fetchUnstoppableDomainAddress(domain, ticker);
44
+ final address = await fetchUnstoppableDomainAddress(domain, ticker);
45
46
if (address?.isEmpty ?? true) {
47
return ParsedAddress(addresses: [domain]);
@@ -55,7 +53,8 @@ Future<ParsedAddress> parseAddressFromDomain(
53
parseFrom: ParseFrom.unstoppableDomains);
54
}
55
58
- final record = await OpenaliasRecord.fetchAddressAndName(formattedName);
56
+ final record = await OpenaliasRecord.fetchAddressAndName(
57
+ formattedName: formattedName, ticker: ticker);
58
59
if (record == null || record.address.contains(formattedName)) {
60
return ParsedAddress(addresses: [domain]);
@@ -70,4 +69,4 @@ Future<ParsedAddress> parseAddressFromDomain(
69
}
70
71
return ParsedAddress(addresses: [domain]);
73
-}
\ No newline at end of file
72
+}