unstoppable domains fix (#1600)

cyan committed Aug 13, 2024 at 14:15 UTC 29492998216ec65a5b986a8ca168c97a2b68f727
7 files changed +16 -123
android/app/build.gradle
-1
@@ -91,5 +91,4 @@ dependencies {
91 testImplementation 'junit:junit:4.12'
92 androidTestImplementation 'androidx.test:runner:1.3.0'
93 androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
94 - implementation 'com.unstoppabledomains:resolution:5.0.0'
94 }
android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java
-29
@@ -20,14 +20,10 @@ import android.net.Uri;
20 import android.os.PowerManager;
21 import android.provider.Settings;
22
23 -import com.unstoppabledomains.resolution.DomainResolution;
24 -import com.unstoppabledomains.resolution.Resolution;
25 -
23 import java.security.SecureRandom;
24
25 public class MainActivity extends FlutterFragmentActivity {
26 final String UTILS_CHANNEL = "com.cake_wallet/native_utils";
30 - final int UNSTOPPABLE_DOMAIN_MIN_VERSION_SDK = 24;
27 boolean isAppSecure = false;
28
29 @Override
@@ -53,14 +49,6 @@ public class MainActivity extends FlutterFragmentActivity {
49 random.nextBytes(bytes);
50 handler.post(() -> result.success(bytes));
51 break;
56 - case "getUnstoppableDomainAddress":
57 - int version = Build.VERSION.SDK_INT;
58 - if (version >= UNSTOPPABLE_DOMAIN_MIN_VERSION_SDK) {
59 - getUnstoppableDomainAddress(call, result);
60 - } else {
61 - handler.post(() -> result.success(""));
62 - }
63 - break;
52 case "setIsAppSecure":
53 isAppSecure = call.argument("isAppSecure");
54 if (isAppSecure) {
@@ -85,23 +73,6 @@ public class MainActivity extends FlutterFragmentActivity {
73 }
74 }
75
88 - private void getUnstoppableDomainAddress(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
89 - DomainResolution resolution = new Resolution();
90 - Handler handler = new Handler(Looper.getMainLooper());
91 - String domain = call.argument("domain");
92 - String ticker = call.argument("ticker");
93 -
94 - AsyncTask.execute(() -> {
95 - try {
96 - String address = resolution.getAddress(domain, ticker);
97 - handler.post(() -> result.success(address));
98 - } catch (Exception e) {
99 - System.out.println("Expected Address, but got " + e.getMessage());
100 - handler.post(() -> result.success(""));
101 - }
102 - });
103 - }
104 -
76 private void disableBatteryOptimization() {
77 String packageName = getPackageName();
78 PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
android/app/src/main/java/com/cakewallet/haven/MainActivity.java
-29
@@ -19,14 +19,10 @@ import android.net.Uri;
19 import android.os.PowerManager;
20 import android.provider.Settings;
21
22 -import com.unstoppabledomains.resolution.DomainResolution;
23 -import com.unstoppabledomains.resolution.Resolution;
24 -
22 import java.security.SecureRandom;
23
24 public class MainActivity extends FlutterFragmentActivity {
25 final String UTILS_CHANNEL = "com.cake_wallet/native_utils";
29 - final int UNSTOPPABLE_DOMAIN_MIN_VERSION_SDK = 24;
26
27 @Override
28 public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
@@ -51,14 +47,6 @@ public class MainActivity extends FlutterFragmentActivity {
47 random.nextBytes(bytes);
48 handler.post(() -> result.success(bytes));
49 break;
54 - case "getUnstoppableDomainAddress":
55 - int version = Build.VERSION.SDK_INT;
56 - if (version >= UNSTOPPABLE_DOMAIN_MIN_VERSION_SDK) {
57 - getUnstoppableDomainAddress(call, result);
58 - } else {
59 - handler.post(() -> result.success(""));
60 - }
61 - break;
50 case "disableBatteryOptimization":
51 disableBatteryOptimization();
52 handler.post(() -> result.success(null));
@@ -75,23 +63,6 @@ public class MainActivity extends FlutterFragmentActivity {
63 }
64 }
65
78 - private void getUnstoppableDomainAddress(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
79 - DomainResolution resolution = new Resolution();
80 - Handler handler = new Handler(Looper.getMainLooper());
81 - String domain = call.argument("domain");
82 - String ticker = call.argument("ticker");
83 -
84 - AsyncTask.execute(() -> {
85 - try {
86 - String address = resolution.getAddress(domain, ticker);
87 - handler.post(() -> result.success(address));
88 - } catch (Exception e) {
89 - System.out.println("Expected Address, but got " + e.getMessage());
90 - handler.post(() -> result.success(""));
91 - }
92 - });
93 - }
94 -
66 private void disableBatteryOptimization() {
67 String packageName = getPackageName();
68 PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
android/app/src/main/java/com/monero/app/MainActivity.java
-29
@@ -19,14 +19,10 @@ import android.net.Uri;
19 import android.os.PowerManager;
20 import android.provider.Settings;
21
22 -import com.unstoppabledomains.resolution.DomainResolution;
23 -import com.unstoppabledomains.resolution.Resolution;
24 -
22 import java.security.SecureRandom;
23
24 public class MainActivity extends FlutterFragmentActivity {
25 final String UTILS_CHANNEL = "com.cake_wallet/native_utils";
29 - final int UNSTOPPABLE_DOMAIN_MIN_VERSION_SDK = 24;
26 boolean isAppSecure = false;
27
28 @Override
@@ -52,14 +48,6 @@ public class MainActivity extends FlutterFragmentActivity {
48 random.nextBytes(bytes);
49 handler.post(() -> result.success(bytes));
50 break;
55 - case "getUnstoppableDomainAddress":
56 - int version = Build.VERSION.SDK_INT;
57 - if (version >= UNSTOPPABLE_DOMAIN_MIN_VERSION_SDK) {
58 - getUnstoppableDomainAddress(call, result);
59 - } else {
60 - handler.post(() -> result.success(""));
61 - }
62 - break;
51 case "setIsAppSecure":
52 isAppSecure = call.argument("isAppSecure");
53 if (isAppSecure) {
@@ -84,23 +72,6 @@ public class MainActivity extends FlutterFragmentActivity {
72 }
73 }
74
87 - private void getUnstoppableDomainAddress(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
88 - DomainResolution resolution = new Resolution();
89 - Handler handler = new Handler(Looper.getMainLooper());
90 - String domain = call.argument("domain");
91 - String ticker = call.argument("ticker");
92 -
93 - AsyncTask.execute(() -> {
94 - try {
95 - String address = resolution.getAddress(domain, ticker);
96 - handler.post(() -> result.success(address));
97 - } catch (Exception e) {
98 - System.out.println("Expected Address, but got " + e.getMessage());
99 - handler.post(() -> result.success(""));
100 - }
101 - });
102 - }
103 -
75 private void disableBatteryOptimization() {
76 String packageName = getPackageName();
77 PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
ios/Podfile
-1
@@ -36,7 +36,6 @@ target 'Runner' do
36
37 # Cake Wallet (Legacy)
38 pod 'CryptoSwift'
39 - pod 'UnstoppableDomainsResolution', '~> 4.0.0'
39 end
40
41 post_install do |installer|
ios/Runner/AppDelegate.swift
+1 -22
@@ -1,6 +1,5 @@
1 import UIKit
2 import Flutter
3 -import UnstoppableDomainsResolution
3 import workmanager
4
5 @UIApplicationMain
@@ -87,27 +86,7 @@ import workmanager
86 }
87
88 result(secRandom(count: count))
90 - case "getUnstoppableDomainAddress":
91 - guard let args = call.arguments as? Dictionary<String, String>,
92 - let domain = args["domain"],
93 - let ticker = args["ticker"],
94 - let resolution = self?.resolution else {
95 - result(nil)
96 - return
97 - }
98 -
99 - resolution.addr(domain: domain, ticker: ticker) { addrResult in
100 - var address : String = ""
101 -
102 - switch addrResult {
103 - case .success(let returnValue):
104 - address = returnValue
105 - case .failure(let error):
106 - print("Expected Address, but got \(error)")
107 - }
108 -
109 - result(address)
110 - }
89 +
90 case "setIsAppSecure":
91 guard let args = call.arguments as? Dictionary<String, Bool>,
92 let isAppSecure = args["isAppSecure"] else {
lib/entities/unstoppable_domain_address.dart
+15 -12
@@ -1,5 +1,7 @@
1 -import 'package:cake_wallet/utils/device_info.dart';
1 +import 'dart:convert';
2 +
3 import 'package:flutter/services.dart';
4 +import 'package:http/http.dart' as http;
5
6 const channel = MethodChannel('com.cake_wallet/native_utils');
7
@@ -7,18 +9,19 @@ Future<String> fetchUnstoppableDomainAddress(String domain, String ticker) async
9 var address = '';
10
11 try {
10 - if (DeviceInfo.instance.isMobile) {
11 - address = await channel.invokeMethod<String>(
12 - 'getUnstoppableDomainAddress',
13 - <String, String> {
14 - 'domain' : domain,
15 - 'ticker' : ticker
16 - }
17 - ) ?? '';
18 - } else {
19 - // TODO: Integrate with Unstoppable domains resolution API
20 - return address;
12 + final uri = Uri.parse("https://api.unstoppabledomains.com/profile/public/${Uri.encodeQueryComponent(domain)}?fields=records");
13 + final jsonString = await http.read(uri);
14 + final jsonParsed = json.decode(jsonString) as Map<String, dynamic>;
15 + if (jsonParsed["records"] == null) {
16 + throw Exception(".records response from $uri is empty");
17 + };
18 + final records = jsonParsed["records"] as Map<String, dynamic>;
19 + final key = "crypto.${ticker.toUpperCase()}.address";
20 + if (records[key] == null) {
21 + throw Exception(".records.${key} response from $uri is empty");
22 }
23 +
24 + return records[key] as String? ?? '';
25 } catch (e) {
26 print('Unstoppable domain error: ${e.toString()}');
27 address = '';