@oobit/react-native-sdk 3.0.1 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +11 -0
- package/dist/index.d.ts +11 -4
- package/dist/index.js +243 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +238 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +20 -10
- package/src/{WidgetSDK.tsx → components/WidgetSDK.tsx} +10 -9
- package/src/index.ts +5 -5
- package/src/utils/walletUtils.ts +94 -0
- package/dist/WidgetSDK.d.ts +0 -12
- package/dist/WidgetSDK.d.ts.map +0 -1
- package/dist/WidgetSDK.js +0 -143
- package/dist/WidgetSDK.js.map +0 -1
- package/dist/config.d.ts +0 -24
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -53
- package/dist/config.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/types.d.ts +0 -73
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -17
- package/dist/types.js.map +0 -1
- package/dist/walletUtils.d.ts +0 -14
- package/dist/walletUtils.d.ts.map +0 -1
- package/dist/walletUtils.js +0 -144
- package/dist/walletUtils.js.map +0 -1
- package/src/config.ts +0 -51
- package/src/types.ts +0 -76
- package/src/walletUtils.ts +0 -155
package/dist/walletUtils.js
DELETED
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Wallet Integration Utilities
|
|
4
|
-
* Handles opening Apple Wallet (iOS) and Google Wallet (Android)
|
|
5
|
-
*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.isWalletAvailable = exports.openNativeWallet = void 0;
|
|
8
|
-
const react_native_1 = require("react-native");
|
|
9
|
-
const types_1 = require("./types");
|
|
10
|
-
/**
|
|
11
|
-
* Opens the native wallet app based on platform
|
|
12
|
-
* @returns Promise that resolves when wallet opens successfully
|
|
13
|
-
*/
|
|
14
|
-
const openNativeWallet = async () => {
|
|
15
|
-
try {
|
|
16
|
-
if (react_native_1.Platform.OS === "ios") {
|
|
17
|
-
return await openAppleWallet();
|
|
18
|
-
}
|
|
19
|
-
else if (react_native_1.Platform.OS === "android") {
|
|
20
|
-
return await openGoogleWallet();
|
|
21
|
-
}
|
|
22
|
-
else {
|
|
23
|
-
console.warn("Wallet opening not supported on this platform");
|
|
24
|
-
return false;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
catch (error) {
|
|
28
|
-
console.error("Failed to open wallet:", error);
|
|
29
|
-
react_native_1.Alert.alert("Error", "Could not open wallet. Please check if the app is installed.");
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
};
|
|
33
|
-
exports.openNativeWallet = openNativeWallet;
|
|
34
|
-
/**
|
|
35
|
-
* Opens Apple Wallet on iOS
|
|
36
|
-
* Uses multiple URL schemes in order of reliability
|
|
37
|
-
*/
|
|
38
|
-
const openAppleWallet = async () => {
|
|
39
|
-
const { passkit, fallback } = types_1.WALLET_URLS.ios;
|
|
40
|
-
try {
|
|
41
|
-
console.log("Attempting to open Apple Wallet...");
|
|
42
|
-
// Method 1: Try wallet:// scheme (documented as working in recent iOS)
|
|
43
|
-
try {
|
|
44
|
-
const canOpenWallet = await react_native_1.Linking.canOpenURL("wallet://");
|
|
45
|
-
if (canOpenWallet) {
|
|
46
|
-
await react_native_1.Linking.openURL("wallet://");
|
|
47
|
-
console.log("Successfully opened Apple Wallet via wallet:// scheme");
|
|
48
|
-
return true;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
catch (walletError) {
|
|
52
|
-
console.log("wallet:// scheme failed, trying shoebox://:", walletError);
|
|
53
|
-
}
|
|
54
|
-
// Method 2: Try shoebox:// scheme (undocumented but widely used)
|
|
55
|
-
// Note: This is unofficial and could potentially cause App Store rejection
|
|
56
|
-
try {
|
|
57
|
-
const canOpenShoebox = await react_native_1.Linking.canOpenURL(passkit);
|
|
58
|
-
if (canOpenShoebox) {
|
|
59
|
-
await react_native_1.Linking.openURL(passkit);
|
|
60
|
-
console.log("Successfully opened Apple Wallet via shoebox:// scheme");
|
|
61
|
-
return true;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
catch (shoeboxError) {
|
|
65
|
-
console.log("shoebox:// scheme failed:", shoeboxError);
|
|
66
|
-
}
|
|
67
|
-
// Method 3: Fallback to wallet.apple.com (opens in browser)
|
|
68
|
-
console.log("Direct schemes failed, falling back to web URL");
|
|
69
|
-
const canOpenFallback = await react_native_1.Linking.canOpenURL(fallback);
|
|
70
|
-
if (canOpenFallback) {
|
|
71
|
-
await react_native_1.Linking.openURL(fallback);
|
|
72
|
-
console.log("Opened wallet.apple.com in browser");
|
|
73
|
-
return true;
|
|
74
|
-
}
|
|
75
|
-
throw new Error("Apple Wallet not available");
|
|
76
|
-
}
|
|
77
|
-
catch (error) {
|
|
78
|
-
console.error("Failed to open Apple Wallet:", error);
|
|
79
|
-
throw error;
|
|
80
|
-
}
|
|
81
|
-
};
|
|
82
|
-
/**
|
|
83
|
-
* Opens Google Wallet on Android
|
|
84
|
-
* Uses Linking API to launch the app or fall back to Play Store
|
|
85
|
-
*/
|
|
86
|
-
const openGoogleWallet = async () => {
|
|
87
|
-
const GOOGLE_WALLET_PACKAGE = "com.google.android.apps.walletnfcrel";
|
|
88
|
-
try {
|
|
89
|
-
console.log("Attempting to open Google Wallet...");
|
|
90
|
-
// Try using the market:// scheme to launch the app if it's installed
|
|
91
|
-
try {
|
|
92
|
-
const canOpen = await react_native_1.Linking.canOpenURL(`market://launch?id=${GOOGLE_WALLET_PACKAGE}`);
|
|
93
|
-
console.log("Can open market launch URL:", canOpen);
|
|
94
|
-
if (canOpen) {
|
|
95
|
-
await react_native_1.Linking.openURL(`market://launch?id=${GOOGLE_WALLET_PACKAGE}`);
|
|
96
|
-
console.log("Successfully opened Google Wallet via market:// scheme");
|
|
97
|
-
return true;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
catch (marketLaunchError) {
|
|
101
|
-
console.log("Market launch failed:", marketLaunchError);
|
|
102
|
-
}
|
|
103
|
-
// App is not installed or market:// not available, open Play Store
|
|
104
|
-
console.log("Opening Play Store to install Google Wallet");
|
|
105
|
-
try {
|
|
106
|
-
// Try native Play Store app first
|
|
107
|
-
const playStoreUrl = `market://details?id=${GOOGLE_WALLET_PACKAGE}`;
|
|
108
|
-
await react_native_1.Linking.openURL(playStoreUrl);
|
|
109
|
-
react_native_1.Alert.alert("Google Wallet", "Google Wallet is not installed. Opening Play Store to install the app.");
|
|
110
|
-
return false;
|
|
111
|
-
}
|
|
112
|
-
catch (marketError) {
|
|
113
|
-
console.log("Market URL failed, trying web Play Store:", marketError);
|
|
114
|
-
// Fallback to web Play Store
|
|
115
|
-
await react_native_1.Linking.openURL(`https://play.google.com/store/apps/details?id=${GOOGLE_WALLET_PACKAGE}`);
|
|
116
|
-
react_native_1.Alert.alert("Google Wallet", "Google Wallet is not installed. Opening Play Store to install the app.");
|
|
117
|
-
return false;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
catch (error) {
|
|
121
|
-
console.error("Failed to open Google Wallet:", error);
|
|
122
|
-
throw error;
|
|
123
|
-
}
|
|
124
|
-
};
|
|
125
|
-
/**
|
|
126
|
-
* Check if wallet is available on the current platform
|
|
127
|
-
*/
|
|
128
|
-
const isWalletAvailable = async () => {
|
|
129
|
-
try {
|
|
130
|
-
if (react_native_1.Platform.OS === "ios") {
|
|
131
|
-
return await react_native_1.Linking.canOpenURL(types_1.WALLET_URLS.ios.passkit);
|
|
132
|
-
}
|
|
133
|
-
else if (react_native_1.Platform.OS === "android") {
|
|
134
|
-
return await react_native_1.Linking.canOpenURL(types_1.WALLET_URLS.android.googlePay);
|
|
135
|
-
}
|
|
136
|
-
return false;
|
|
137
|
-
}
|
|
138
|
-
catch (error) {
|
|
139
|
-
console.error("Error checking wallet availability:", error);
|
|
140
|
-
return false;
|
|
141
|
-
}
|
|
142
|
-
};
|
|
143
|
-
exports.isWalletAvailable = isWalletAvailable;
|
|
144
|
-
//# sourceMappingURL=walletUtils.js.map
|
package/dist/walletUtils.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"walletUtils.js","sourceRoot":"","sources":["../src/walletUtils.ts"],"names":[],"mappings":"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"}
|
package/src/config.ts
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Widget SDK Configuration
|
|
3
|
-
* Environment detection based on access token prefix
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Token prefixes that determine the environment
|
|
8
|
-
*/
|
|
9
|
-
const TOKEN_PREFIX = {
|
|
10
|
-
SANDBOX: "sbx_",
|
|
11
|
-
PRODUCTION: "prod_",
|
|
12
|
-
} as const;
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Widget URLs by environment
|
|
16
|
-
*/
|
|
17
|
-
export const WIDGET_URLS = {
|
|
18
|
-
sandbox: "https://oobit-widget-dev.web.app",
|
|
19
|
-
production: "https://oobit-widget.web.app",
|
|
20
|
-
} as const;
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Get the widget URL based on the access token prefix
|
|
24
|
-
* @param accessToken - The access token (prefixed with sbx_ or prod_)
|
|
25
|
-
* @returns The widget URL for the corresponding environment
|
|
26
|
-
*/
|
|
27
|
-
export function getWidgetUrl(accessToken: string): string {
|
|
28
|
-
if (accessToken.startsWith(TOKEN_PREFIX.SANDBOX)) {
|
|
29
|
-
return WIDGET_URLS.sandbox;
|
|
30
|
-
}
|
|
31
|
-
if (accessToken.startsWith(TOKEN_PREFIX.PRODUCTION)) {
|
|
32
|
-
return WIDGET_URLS.production;
|
|
33
|
-
}
|
|
34
|
-
// Default to production for backwards compatibility
|
|
35
|
-
return WIDGET_URLS.production;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Strip the environment prefix from an access token
|
|
40
|
-
* @param accessToken - The access token (prefixed with sbx_ or prod_)
|
|
41
|
-
* @returns The token without the environment prefix
|
|
42
|
-
*/
|
|
43
|
-
export function stripTokenPrefix(accessToken: string): string {
|
|
44
|
-
if (accessToken.startsWith(TOKEN_PREFIX.SANDBOX)) {
|
|
45
|
-
return accessToken.slice(TOKEN_PREFIX.SANDBOX.length);
|
|
46
|
-
}
|
|
47
|
-
if (accessToken.startsWith(TOKEN_PREFIX.PRODUCTION)) {
|
|
48
|
-
return accessToken.slice(TOKEN_PREFIX.PRODUCTION.length);
|
|
49
|
-
}
|
|
50
|
-
return accessToken;
|
|
51
|
-
}
|
package/src/types.ts
DELETED
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Token metadata included with transaction requests
|
|
3
|
-
*/
|
|
4
|
-
export interface TransactionTokenMetadata {
|
|
5
|
-
symbol: string;
|
|
6
|
-
amount: string;
|
|
7
|
-
decimals: number;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* EVM transaction data
|
|
12
|
-
*/
|
|
13
|
-
export interface EvmTransactionData {
|
|
14
|
-
to: string;
|
|
15
|
-
data: string;
|
|
16
|
-
value: string;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* EVM transaction request payload
|
|
21
|
-
*/
|
|
22
|
-
export interface EvmTransactionRequest {
|
|
23
|
-
type: "evm";
|
|
24
|
-
chainId: number;
|
|
25
|
-
transaction: EvmTransactionData;
|
|
26
|
-
tokenMetadata: TransactionTokenMetadata;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Solana transaction request payload
|
|
31
|
-
*/
|
|
32
|
-
export interface SolanaTransactionRequest {
|
|
33
|
-
type: "solana";
|
|
34
|
-
transaction: string;
|
|
35
|
-
tokenMetadata: TransactionTokenMetadata;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Transaction request payload
|
|
40
|
-
*/
|
|
41
|
-
export type TransactionRequest =
|
|
42
|
-
| EvmTransactionRequest
|
|
43
|
-
| SolanaTransactionRequest;
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* SDK Configuration
|
|
47
|
-
*/
|
|
48
|
-
export interface WidgetSDKConfig {
|
|
49
|
-
accessToken: string;
|
|
50
|
-
userWalletAddress: string;
|
|
51
|
-
onClose?: () => void;
|
|
52
|
-
onTransactionRequested: (transaction: TransactionRequest) => void;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Internal: Messages from widget
|
|
57
|
-
*/
|
|
58
|
-
export type WidgetMessage =
|
|
59
|
-
| { type: "widget:ready" }
|
|
60
|
-
| { type: "widget:open-wallet" }
|
|
61
|
-
| { type: "widget:close" }
|
|
62
|
-
| { type: "widget:transaction-requested"; payload: TransactionRequest };
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Internal: Wallet URLs
|
|
66
|
-
*/
|
|
67
|
-
export const WALLET_URLS = {
|
|
68
|
-
ios: {
|
|
69
|
-
passkit: "shoebox://",
|
|
70
|
-
fallback: "https://wallet.apple.com",
|
|
71
|
-
},
|
|
72
|
-
android: {
|
|
73
|
-
googlePay: "https://pay.google.com/gp/w/home/wallet",
|
|
74
|
-
fallback: "https://wallet.google.com",
|
|
75
|
-
},
|
|
76
|
-
} as const;
|
package/src/walletUtils.ts
DELETED
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Wallet Integration Utilities
|
|
3
|
-
* Handles opening Apple Wallet (iOS) and Google Wallet (Android)
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { Alert, Linking, Platform } from "react-native";
|
|
7
|
-
import { WALLET_URLS } from "./types";
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Opens the native wallet app based on platform
|
|
11
|
-
* @returns Promise that resolves when wallet opens successfully
|
|
12
|
-
*/
|
|
13
|
-
export const openNativeWallet = async (): Promise<boolean> => {
|
|
14
|
-
try {
|
|
15
|
-
if (Platform.OS === "ios") {
|
|
16
|
-
return await openAppleWallet();
|
|
17
|
-
} else if (Platform.OS === "android") {
|
|
18
|
-
return await openGoogleWallet();
|
|
19
|
-
} else {
|
|
20
|
-
console.warn("Wallet opening not supported on this platform");
|
|
21
|
-
return false;
|
|
22
|
-
}
|
|
23
|
-
} catch (error) {
|
|
24
|
-
console.error("Failed to open wallet:", error);
|
|
25
|
-
Alert.alert(
|
|
26
|
-
"Error",
|
|
27
|
-
"Could not open wallet. Please check if the app is installed."
|
|
28
|
-
);
|
|
29
|
-
return false;
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Opens Apple Wallet on iOS
|
|
35
|
-
* Uses multiple URL schemes in order of reliability
|
|
36
|
-
*/
|
|
37
|
-
const openAppleWallet = async (): Promise<boolean> => {
|
|
38
|
-
const { passkit, fallback } = WALLET_URLS.ios;
|
|
39
|
-
|
|
40
|
-
try {
|
|
41
|
-
console.log("Attempting to open Apple Wallet...");
|
|
42
|
-
|
|
43
|
-
// Method 1: Try wallet:// scheme (documented as working in recent iOS)
|
|
44
|
-
try {
|
|
45
|
-
const canOpenWallet = await Linking.canOpenURL("wallet://");
|
|
46
|
-
if (canOpenWallet) {
|
|
47
|
-
await Linking.openURL("wallet://");
|
|
48
|
-
console.log("Successfully opened Apple Wallet via wallet:// scheme");
|
|
49
|
-
return true;
|
|
50
|
-
}
|
|
51
|
-
} catch (walletError) {
|
|
52
|
-
console.log("wallet:// scheme failed, trying shoebox://:", walletError);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// Method 2: Try shoebox:// scheme (undocumented but widely used)
|
|
56
|
-
// Note: This is unofficial and could potentially cause App Store rejection
|
|
57
|
-
try {
|
|
58
|
-
const canOpenShoebox = await Linking.canOpenURL(passkit);
|
|
59
|
-
if (canOpenShoebox) {
|
|
60
|
-
await Linking.openURL(passkit);
|
|
61
|
-
console.log("Successfully opened Apple Wallet via shoebox:// scheme");
|
|
62
|
-
return true;
|
|
63
|
-
}
|
|
64
|
-
} catch (shoeboxError) {
|
|
65
|
-
console.log("shoebox:// scheme failed:", shoeboxError);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Method 3: Fallback to wallet.apple.com (opens in browser)
|
|
69
|
-
console.log("Direct schemes failed, falling back to web URL");
|
|
70
|
-
const canOpenFallback = await Linking.canOpenURL(fallback);
|
|
71
|
-
if (canOpenFallback) {
|
|
72
|
-
await Linking.openURL(fallback);
|
|
73
|
-
console.log("Opened wallet.apple.com in browser");
|
|
74
|
-
return true;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
throw new Error("Apple Wallet not available");
|
|
78
|
-
} catch (error) {
|
|
79
|
-
console.error("Failed to open Apple Wallet:", error);
|
|
80
|
-
throw error;
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Opens Google Wallet on Android
|
|
86
|
-
* Uses Linking API to launch the app or fall back to Play Store
|
|
87
|
-
*/
|
|
88
|
-
const openGoogleWallet = async (): Promise<boolean> => {
|
|
89
|
-
const GOOGLE_WALLET_PACKAGE = "com.google.android.apps.walletnfcrel";
|
|
90
|
-
|
|
91
|
-
try {
|
|
92
|
-
console.log("Attempting to open Google Wallet...");
|
|
93
|
-
|
|
94
|
-
// Try using the market:// scheme to launch the app if it's installed
|
|
95
|
-
try {
|
|
96
|
-
const canOpen = await Linking.canOpenURL(`market://launch?id=${GOOGLE_WALLET_PACKAGE}`);
|
|
97
|
-
console.log("Can open market launch URL:", canOpen);
|
|
98
|
-
|
|
99
|
-
if (canOpen) {
|
|
100
|
-
await Linking.openURL(`market://launch?id=${GOOGLE_WALLET_PACKAGE}`);
|
|
101
|
-
console.log("Successfully opened Google Wallet via market:// scheme");
|
|
102
|
-
return true;
|
|
103
|
-
}
|
|
104
|
-
} catch (marketLaunchError) {
|
|
105
|
-
console.log("Market launch failed:", marketLaunchError);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// App is not installed or market:// not available, open Play Store
|
|
109
|
-
console.log("Opening Play Store to install Google Wallet");
|
|
110
|
-
try {
|
|
111
|
-
// Try native Play Store app first
|
|
112
|
-
const playStoreUrl = `market://details?id=${GOOGLE_WALLET_PACKAGE}`;
|
|
113
|
-
await Linking.openURL(playStoreUrl);
|
|
114
|
-
|
|
115
|
-
Alert.alert(
|
|
116
|
-
"Google Wallet",
|
|
117
|
-
"Google Wallet is not installed. Opening Play Store to install the app."
|
|
118
|
-
);
|
|
119
|
-
return false;
|
|
120
|
-
} catch (marketError) {
|
|
121
|
-
console.log("Market URL failed, trying web Play Store:", marketError);
|
|
122
|
-
|
|
123
|
-
// Fallback to web Play Store
|
|
124
|
-
await Linking.openURL(
|
|
125
|
-
`https://play.google.com/store/apps/details?id=${GOOGLE_WALLET_PACKAGE}`
|
|
126
|
-
);
|
|
127
|
-
|
|
128
|
-
Alert.alert(
|
|
129
|
-
"Google Wallet",
|
|
130
|
-
"Google Wallet is not installed. Opening Play Store to install the app."
|
|
131
|
-
);
|
|
132
|
-
return false;
|
|
133
|
-
}
|
|
134
|
-
} catch (error) {
|
|
135
|
-
console.error("Failed to open Google Wallet:", error);
|
|
136
|
-
throw error;
|
|
137
|
-
}
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* Check if wallet is available on the current platform
|
|
142
|
-
*/
|
|
143
|
-
export const isWalletAvailable = async (): Promise<boolean> => {
|
|
144
|
-
try {
|
|
145
|
-
if (Platform.OS === "ios") {
|
|
146
|
-
return await Linking.canOpenURL(WALLET_URLS.ios.passkit);
|
|
147
|
-
} else if (Platform.OS === "android") {
|
|
148
|
-
return await Linking.canOpenURL(WALLET_URLS.android.googlePay);
|
|
149
|
-
}
|
|
150
|
-
return false;
|
|
151
|
-
} catch (error) {
|
|
152
|
-
console.error("Error checking wallet availability:", error);
|
|
153
|
-
return false;
|
|
154
|
-
}
|
|
155
|
-
};
|