From 73acc00ab60b9e337934b564271dc253e8131b7c Mon Sep 17 00:00:00 2001 From: Craig Raw Date: Mon, 29 Sep 2025 11:53:17 +0200 Subject: [PATCH] improve dns hrn support --- .../sparrowwallet/drongo/dns/DnsPayment.java | 22 +++++++++++++++++++ .../drongo/dns/DnsPaymentCache.java | 10 +++++++++ 2 files changed, 32 insertions(+) diff --git a/src/main/java/com/sparrowwallet/drongo/dns/DnsPayment.java b/src/main/java/com/sparrowwallet/drongo/dns/DnsPayment.java index fa85215..fa7eddd 100644 --- a/src/main/java/com/sparrowwallet/drongo/dns/DnsPayment.java +++ b/src/main/java/com/sparrowwallet/drongo/dns/DnsPayment.java @@ -4,6 +4,9 @@ import com.sparrowwallet.drongo.uri.BitcoinURI; import org.xbill.DNS.*; import org.xbill.DNS.Record; +import java.nio.charset.StandardCharsets; +import java.util.Optional; + import static com.sparrowwallet.drongo.dns.RecordUtils.fromWire; public record DnsPayment(String hrn, BitcoinURI bitcoinURI, byte[] proofChain) { @@ -33,4 +36,23 @@ public record DnsPayment(String hrn, BitcoinURI bitcoinURI, byte[] proofChain) { public boolean hasSilentPaymentAddress() { return bitcoinURI.getSilentPaymentAddress() != null; } + + public static Optional getHrn(String value) { + String hrn = value; + if(value.endsWith(".")) { + return Optional.empty(); + } + + if(hrn.startsWith("₿")) { + hrn = hrn.substring(1); + } + + String[] addressParts = hrn.split("@"); + if(addressParts.length == 2 && addressParts[1].indexOf('.') > -1 && addressParts[1].substring(addressParts[1].indexOf('.') + 1).length() > 1 && + StandardCharsets.US_ASCII.newEncoder().canEncode(hrn)) { + return Optional.of(hrn); + } + + return Optional.empty(); + } } diff --git a/src/main/java/com/sparrowwallet/drongo/dns/DnsPaymentCache.java b/src/main/java/com/sparrowwallet/drongo/dns/DnsPaymentCache.java index 07c56d1..ff69894 100644 --- a/src/main/java/com/sparrowwallet/drongo/dns/DnsPaymentCache.java +++ b/src/main/java/com/sparrowwallet/drongo/dns/DnsPaymentCache.java @@ -51,6 +51,16 @@ public class DnsPaymentCache { } } + public static DnsPayment getDnsPayment(String hrn) { + for(DnsPayment dnsPayment : dnsPayments.asMap().values()) { + if(dnsPayment.hrn().equals(hrn)) { + return dnsPayment; + } + } + + return null; + } + public static void putDnsPayment(Address address, DnsPayment dnsPayment) { dnsPayments.put(new DnsAddress(address), dnsPayment); }