From ac8ef0c946be480ca967626afa09f8bb1b33fd48 Mon Sep 17 00:00:00 2001 From: Godwin Asuquo Date: Fri, 14 Jan 2022 14:18:03 +0100 Subject: [PATCH 1/2] 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 --- lib/entities/openalias_record.dart | 36 +++++++++++++------- lib/entities/parse_address_from_domain.dart | 37 ++++++++++----------- 2 files changed, 42 insertions(+), 31 deletions(-) diff --git a/lib/entities/openalias_record.dart b/lib/entities/openalias_record.dart index cb659d533..073f5dbe9 100644 --- a/lib/entities/openalias_record.dart +++ b/lib/entities/openalias_record.dart @@ -1,7 +1,8 @@ import 'package:basic_utils/basic_utils.dart'; +import 'package:cw_core/wallet_type.dart'; +import 'package:flutter/material.dart'; class OpenaliasRecord { - OpenaliasRecord({this.address, this.name}); final String name; @@ -17,30 +18,43 @@ class OpenaliasRecord { return formattedName; } - static Future fetchAddressAndName(String formattedName) async { + static Future fetchAddressAndName({ + @required String formattedName, + @required String ticker, + }) async { String address = formattedName; String name = formattedName; if (formattedName.contains(".")) { try { - final txtRecord = await DnsUtils.lookupRecord(formattedName, RRecordType.TXT, dnssec: true); + final txtRecord = await DnsUtils.lookupRecord( + formattedName, RRecordType.TXT, + dnssec: true); if (txtRecord != null) { - for (RRecord element in txtRecord) { String record = element.data; - if (record.contains("oa1:xmr") && record.contains("recipient_address")) { + if (record.contains("oa1:$ticker") && + record.contains("recipient_address")) { record = record.replaceAll('\"', ""); final dataList = record.split(";"); - address = dataList.where((item) => (item.contains("recipient_address"))) - .toString().replaceAll("oa1:xmr 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=", ""); @@ -57,6 +71,4 @@ class OpenaliasRecord { return OpenaliasRecord(address: address, name: name); } - } - diff --git a/lib/entities/parse_address_from_domain.dart b/lib/entities/parse_address_from_domain.dart index 851251df6..13fa6a0ed 100644 --- a/lib/entities/parse_address_from_domain.dart +++ b/lib/entities/parse_address_from_domain.dart @@ -2,18 +2,20 @@ 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/store/yat/yat_store.dart'; +import 'package:cw_core/wallet_type.dart'; const unstoppableDomains = [ - 'crypto', - 'zil', - 'x', - 'coin', - 'wallet', - 'bitcoin', - '888', - 'nft', - 'dao', - 'blockchain']; + 'crypto', + 'zil', + 'x', + 'coin', + 'wallet', + 'bitcoin', + '888', + 'nft', + 'dao', + 'blockchain' +]; Future parseAddressFromDomain( String domain, String ticker) async { @@ -28,22 +30,18 @@ Future parseAddressFromDomain( if (addresses?.isEmpty ?? true) { return ParsedAddress( - addresses: [domain], - parseFrom: ParseFrom.yatRecord); + addresses: [domain], parseFrom: ParseFrom.yatRecord); } return ParsedAddress( - addresses: addresses, - name: domain, - parseFrom: ParseFrom.yatRecord); + addresses: addresses, name: domain, parseFrom: ParseFrom.yatRecord); } catch (e) { return ParsedAddress(addresses: [domain]); } } if (unstoppableDomains.any((domain) => name.contains(domain))) { - final address = - await fetchUnstoppableDomainAddress(domain, ticker); + final address = await fetchUnstoppableDomainAddress(domain, ticker); if (address?.isEmpty ?? true) { return ParsedAddress(addresses: [domain]); @@ -55,7 +53,8 @@ Future parseAddressFromDomain( parseFrom: ParseFrom.unstoppableDomains); } - final record = await OpenaliasRecord.fetchAddressAndName(formattedName); + final record = await OpenaliasRecord.fetchAddressAndName( + formattedName: formattedName, ticker: ticker); if (record == null || record.address.contains(formattedName)) { return ParsedAddress(addresses: [domain]); @@ -70,4 +69,4 @@ Future parseAddressFromDomain( } return ParsedAddress(addresses: [domain]); -} \ No newline at end of file +} From 46afd43884e9a6be8456cde2436d5fb0d3763e2e Mon Sep 17 00:00:00 2001 From: Godwin Asuquo Date: Tue, 18 Jan 2022 08:46:13 +0100 Subject: [PATCH 2/2] add tx_description to notes field --- lib/entities/openalias_record.dart | 21 ++++++++++++++++++-- lib/entities/parse_address_from_domain.dart | 1 + lib/entities/parsed_address.dart | 9 ++++++--- lib/view_model/send/output.dart | 22 ++++++++++++--------- 4 files changed, 39 insertions(+), 14 deletions(-) diff --git a/lib/entities/openalias_record.dart b/lib/entities/openalias_record.dart index 073f5dbe9..0420950bd 100644 --- a/lib/entities/openalias_record.dart +++ b/lib/entities/openalias_record.dart @@ -3,10 +3,15 @@ import 'package:cw_core/wallet_type.dart'; import 'package:flutter/material.dart'; class OpenaliasRecord { - OpenaliasRecord({this.address, this.name}); + OpenaliasRecord({ + this.address, + this.name, + this.description, + }); final String name; final String address; + final String description; static String formatDomainName(String name) { String formattedName = name; @@ -24,6 +29,7 @@ class OpenaliasRecord { }) async { String address = formattedName; String name = formattedName; + String note = ''; if (formattedName.contains(".")) { try { @@ -60,6 +66,17 @@ class OpenaliasRecord { 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; } } @@ -69,6 +86,6 @@ class OpenaliasRecord { } } - return OpenaliasRecord(address: address, name: name); + 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 13fa6a0ed..056658067 100644 --- a/lib/entities/parse_address_from_domain.dart +++ b/lib/entities/parse_address_from_domain.dart @@ -63,6 +63,7 @@ Future parseAddressFromDomain( return ParsedAddress( addresses: [record.address], name: record.name, + description: record.description, parseFrom: ParseFrom.openAlias); } catch (e) { print(e.toString()); diff --git a/lib/entities/parsed_address.dart b/lib/entities/parsed_address.dart index ae15ce7ea..11b87d9f5 100644 --- a/lib/entities/parsed_address.dart +++ b/lib/entities/parsed_address.dart @@ -1,12 +1,15 @@ -enum ParseFrom {unstoppableDomains, openAlias, yatRecord, notParsed} +enum ParseFrom { unstoppableDomains, openAlias, yatRecord, notParsed } class ParsedAddress { ParsedAddress({ this.addresses, this.name = '', - this.parseFrom = ParseFrom.notParsed}); + this.description = '', + this.parseFrom = ParseFrom.notParsed, + }); final List addresses; final String name; + final String description; final ParseFrom parseFrom; -} \ No newline at end of file +} diff --git a/lib/view_model/send/output.dart b/lib/view_model/send/output.dart index e2f07bdcf..eeca8fd2c 100644 --- a/lib/view_model/send/output.dart +++ b/lib/view_model/send/output.dart @@ -22,7 +22,7 @@ class Output = OutputBase with _$Output; abstract class OutputBase with Store { OutputBase(this._wallet, this._settingsStore, this._fiatConversationStore) - :_cryptoNumberFormat = NumberFormat(cryptoNumberPattern) { + : _cryptoNumberFormat = NumberFormat(cryptoNumberPattern) { reset(); _setCryptoNumMaximumFractionDigits(); key = UniqueKey(); @@ -52,8 +52,9 @@ abstract class OutputBase with Store { String extractedAddress; @computed - bool get isParsedAddress => parsedAddress.parseFrom != ParseFrom.notParsed - && parsedAddress.name.isNotEmpty; + bool get isParsedAddress => + parsedAddress.parseFrom != ParseFrom.notParsed && + parsedAddress.name.isNotEmpty; @computed int get formattedCryptoAmount { @@ -68,10 +69,12 @@ abstract class OutputBase with Store { _amount = monero.formatterMoneroParseAmount(amount: _cryptoAmount); break; case WalletType.bitcoin: - _amount = bitcoin.formatterStringDoubleToBitcoinAmount(_cryptoAmount); + _amount = + bitcoin.formatterStringDoubleToBitcoinAmount(_cryptoAmount); break; case WalletType.litecoin: - _amount = bitcoin.formatterStringDoubleToBitcoinAmount(_cryptoAmount); + _amount = + bitcoin.formatterStringDoubleToBitcoinAmount(_cryptoAmount); break; default: break; @@ -81,7 +84,7 @@ abstract class OutputBase with Store { amount = _amount; } } - } catch(e) { + } catch (e) { amount = 0; } @@ -94,8 +97,8 @@ abstract class OutputBase with Store { final fee = _wallet.calculateEstimatedFee( _settingsStore.priority[_wallet.type], formattedCryptoAmount); - if (_wallet.type == WalletType.bitcoin - || _wallet.type == WalletType.litecoin) { + if (_wallet.type == WalletType.bitcoin || + _wallet.type == WalletType.litecoin) { return bitcoin.formatterBitcoinAmountToDouble(amount: fee); } @@ -215,5 +218,6 @@ abstract class OutputBase with Store { final ticker = _wallet.currency.title.toLowerCase(); parsedAddress = await parseAddressFromDomain(domain, ticker); extractedAddress = await extractAddressFromParsed(context, parsedAddress); + note = parsedAddress.description; } -} \ No newline at end of file +}