@talken/talkenkit 2.4.13 → 2.4.15
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/abcWallet-25AKGPRG.js +184 -0
- package/dist/abcWallet-2SXWQ2M6.js +184 -0
- package/dist/abcWallet-3E6Y5QS4.js +184 -0
- package/dist/abcWallet-3HKYSDOS.js +184 -0
- package/dist/abcWallet-6VIUP4H3.js +184 -0
- package/dist/abcWallet-7CXDTXHX.js +184 -0
- package/dist/abcWallet-A3PX6AEW.js +184 -0
- package/dist/abcWallet-A6CRIFP2.js +184 -0
- package/dist/abcWallet-ACAOT2F3.js +184 -0
- package/dist/abcWallet-AWALYVJ7.js +184 -0
- package/dist/abcWallet-CEW3E2AX.js +184 -0
- package/dist/abcWallet-CEZAQ3ES.js +184 -0
- package/dist/abcWallet-CURD64AW.js +184 -0
- package/dist/abcWallet-E2A433S3.js +184 -0
- package/dist/abcWallet-ER37COEQ.js +184 -0
- package/dist/abcWallet-ETWMKZKD.js +184 -0
- package/dist/abcWallet-F6JAVHHQ.js +184 -0
- package/dist/abcWallet-GEHOIOZN.js +184 -0
- package/dist/abcWallet-H22OANDE.js +184 -0
- package/dist/abcWallet-H5BBPLGS.js +184 -0
- package/dist/abcWallet-I5BENZSH.js +184 -0
- package/dist/abcWallet-LABFRLNR.js +184 -0
- package/dist/abcWallet-MB2IAXV5.js +184 -0
- package/dist/abcWallet-MH6OGFBO.js +184 -0
- package/dist/abcWallet-NJGYOH52.js +184 -0
- package/dist/abcWallet-OG6ZQORS.js +184 -0
- package/dist/abcWallet-OJ7VCWHZ.js +184 -0
- package/dist/abcWallet-PBEQA5UT.js +184 -0
- package/dist/abcWallet-PMJEDGRW.js +184 -0
- package/dist/abcWallet-SX35BIXB.js +184 -0
- package/dist/abcWallet-TQTXUPJZ.js +184 -0
- package/dist/abcWallet-VKVKBQYN.js +184 -0
- package/dist/abcWallet-W6OZE7QD.js +184 -0
- package/dist/abcWallet-WH2J2YAV.js +184 -0
- package/dist/abcWallet-XA5DX7XK.js +184 -0
- package/dist/abcWallet-XANCTLMU.js +184 -0
- package/dist/abcWallet-XDP764EW.js +184 -0
- package/dist/abcWallet-Y3DONK5H.js +184 -0
- package/dist/abcWallet-YLBGJ5K6.js +184 -0
- package/dist/abcWallet-ZSL4HH7M.js +184 -0
- package/dist/chunk-2D6TXDN2.js +7450 -0
- package/dist/chunk-3K7INMEV.js +7470 -0
- package/dist/chunk-5FE4YAGR.js +7423 -0
- package/dist/chunk-5LD4QGWP.js +7423 -0
- package/dist/chunk-64RMUCRE.js +7447 -0
- package/dist/chunk-6KTOC6CY.js +7464 -0
- package/dist/chunk-6QW7GFF5.js +7450 -0
- package/dist/chunk-6RCVLZFG.js +7462 -0
- package/dist/chunk-7Y3M3LG3.js +7446 -0
- package/dist/chunk-A3EBU637.js +7441 -0
- package/dist/chunk-BVBWXZCX.js +7450 -0
- package/dist/chunk-CAXCHVY2.js +7469 -0
- package/dist/chunk-CBJW7X7O.js +7382 -0
- package/dist/chunk-CD36XA5S.js +7417 -0
- package/dist/chunk-EAKUQPJO.js +7463 -0
- package/dist/chunk-ER7H33CO.js +7450 -0
- package/dist/chunk-FCENPWP5.js +7452 -0
- package/dist/chunk-FPMB7NJE.js +7366 -0
- package/dist/chunk-GWIJVQBX.js +7420 -0
- package/dist/chunk-HGOFSTGT.js +7474 -0
- package/dist/chunk-JJ4CTD2J.js +7428 -0
- package/dist/chunk-JMBGLDYV.js +7368 -0
- package/dist/chunk-KBMHNBKL.js +7449 -0
- package/dist/chunk-KZRFIJW2.js +7452 -0
- package/dist/chunk-L6TCA4IF.js +7378 -0
- package/dist/chunk-LTRXFRER.js +7472 -0
- package/dist/chunk-MRLTYAPE.js +7451 -0
- package/dist/chunk-N3QOWEYR.js +7393 -0
- package/dist/chunk-NII34OZB.js +7442 -0
- package/dist/chunk-OAHLI7TU.js +7368 -0
- package/dist/chunk-RFJBWB7F.js +7467 -0
- package/dist/chunk-SBRDMKB6.js +7408 -0
- package/dist/chunk-SDRSLETV.js +7428 -0
- package/dist/chunk-SWO7BZQD.js +7463 -0
- package/dist/chunk-TR4Q6WOC.js +7427 -0
- package/dist/chunk-UBBAWTXE.js +7370 -0
- package/dist/chunk-VEOSJOVN.js +7377 -0
- package/dist/chunk-VGF34W25.js +7370 -0
- package/dist/chunk-VXSGQUAL.js +7458 -0
- package/dist/chunk-Z3FKXPV6.js +7430 -0
- package/dist/hooks/useSolanaWallet.d.ts +33 -1
- package/dist/index.css +24 -24
- package/dist/index.js +2610 -2445
- package/dist/solana/SolanaWalletProvider.d.ts +1 -1
- package/dist/solana/config.d.ts +1 -1
- package/dist/wallets/walletConnectors/abcWallet/abcSolanaProvider.d.ts +52 -4
- package/dist/wallets/walletConnectors/abcWallet/abcSolanaProvider.js +1 -1
- package/dist/wallets/walletConnectors/abcWallet/abcSolanaWalletAdapter.js +1 -1
- package/dist/wallets/walletConnectors/abcWallet/api/SolanaApi.d.ts +52 -1
- package/dist/wallets/walletConnectors/abcWallet/api/SolanaApi.js +1 -1
- package/dist/wallets/walletConnectors/abcWallet/api/index.js +2 -2
- package/dist/wallets/walletConnectors/abcWallet/index.js +3 -3
- package/dist/wallets/walletConnectors/abcWallet/types.d.ts +2 -2
- package/dist/wallets/walletConnectors/chunk-2FUWP3CE.js +330 -0
- package/dist/wallets/walletConnectors/chunk-2HZI5GNW.js +422 -0
- package/dist/wallets/walletConnectors/chunk-2OTYM5YW.js +461 -0
- package/dist/wallets/walletConnectors/chunk-2PVZZB7V.js +179 -0
- package/dist/wallets/walletConnectors/chunk-2SKUK3XZ.js +336 -0
- package/dist/wallets/walletConnectors/chunk-2THGB26Q.js +483 -0
- package/dist/wallets/walletConnectors/chunk-353AHAZG.js +420 -0
- package/dist/wallets/walletConnectors/chunk-3AV4L2Z3.js +63 -0
- package/dist/wallets/walletConnectors/chunk-3DMYAF74.js +495 -0
- package/dist/wallets/walletConnectors/chunk-3EVUNPYA.js +63 -0
- package/dist/wallets/walletConnectors/chunk-45FLFWVV.js +473 -0
- package/dist/wallets/walletConnectors/chunk-4JRATGCT.js +484 -0
- package/dist/wallets/walletConnectors/chunk-5AL2CK6V.js +336 -0
- package/dist/wallets/walletConnectors/chunk-5FSXV7UD.js +63 -0
- package/dist/wallets/walletConnectors/chunk-5JHX6GDO.js +63 -0
- package/dist/wallets/walletConnectors/chunk-5QGNWYOO.js +63 -0
- package/dist/wallets/walletConnectors/chunk-6I7AIIUA.js +330 -0
- package/dist/wallets/walletConnectors/chunk-A2AVZXFM.js +467 -0
- package/dist/wallets/walletConnectors/chunk-AB6IIS4Y.js +359 -0
- package/dist/wallets/walletConnectors/chunk-AB6NV5DJ.js +469 -0
- package/dist/wallets/walletConnectors/chunk-AYAW5CRA.js +459 -0
- package/dist/wallets/walletConnectors/chunk-BCO6YLPB.js +505 -0
- package/dist/wallets/walletConnectors/chunk-BK65Y46D.js +494 -0
- package/dist/wallets/walletConnectors/chunk-BKJVG4GQ.js +463 -0
- package/dist/wallets/walletConnectors/chunk-BWVC6F6J.js +467 -0
- package/dist/wallets/walletConnectors/chunk-D3USECVX.js +333 -0
- package/dist/wallets/walletConnectors/chunk-DCBHTSF2.js +63 -0
- package/dist/wallets/walletConnectors/chunk-DNYWTUT5.js +63 -0
- package/dist/wallets/walletConnectors/chunk-DSTCYPGN.js +314 -0
- package/dist/wallets/walletConnectors/chunk-DWPUUKA4.js +63 -0
- package/dist/wallets/walletConnectors/chunk-E33VQYPO.js +302 -0
- package/dist/wallets/walletConnectors/chunk-EBBETASF.js +424 -0
- package/dist/wallets/walletConnectors/chunk-GMEXP6OH.js +314 -0
- package/dist/wallets/walletConnectors/chunk-HB7QT3ZB.js +332 -0
- package/dist/wallets/walletConnectors/chunk-HDXQ7BO6.js +314 -0
- package/dist/wallets/walletConnectors/chunk-HQQESMZJ.js +299 -0
- package/dist/wallets/walletConnectors/chunk-HWWFK52B.js +63 -0
- package/dist/wallets/walletConnectors/chunk-HYADQWNX.js +47 -0
- package/dist/wallets/walletConnectors/chunk-I56RJQOO.js +63 -0
- package/dist/wallets/walletConnectors/chunk-JY4WWUAC.js +503 -0
- package/dist/wallets/walletConnectors/chunk-KIKTI2QW.js +313 -0
- package/dist/wallets/walletConnectors/chunk-KPXEV65I.js +481 -0
- package/dist/wallets/walletConnectors/chunk-KXRUCXYG.js +63 -0
- package/dist/wallets/walletConnectors/chunk-L3ZUQ2FT.js +494 -0
- package/dist/wallets/walletConnectors/chunk-LKM4HFVX.js +63 -0
- package/dist/wallets/walletConnectors/chunk-LKSMH5O4.js +63 -0
- package/dist/wallets/walletConnectors/chunk-NSAHMWXK.js +468 -0
- package/dist/wallets/walletConnectors/chunk-NY3HZ7C7.js +428 -0
- package/dist/wallets/walletConnectors/chunk-OA6D52JF.js +303 -0
- package/dist/wallets/walletConnectors/chunk-OSJ2GO4U.js +63 -0
- package/dist/wallets/walletConnectors/chunk-OYDALF2T.js +63 -0
- package/dist/wallets/walletConnectors/chunk-P5CZ24LM.js +312 -0
- package/dist/wallets/walletConnectors/chunk-PER2ACFG.js +443 -0
- package/dist/wallets/walletConnectors/chunk-PGPH245S.js +63 -0
- package/dist/wallets/walletConnectors/chunk-PNE3IGZM.js +63 -0
- package/dist/wallets/walletConnectors/chunk-Q2WYW3LQ.js +63 -0
- package/dist/wallets/walletConnectors/chunk-Q3KCTIZB.js +458 -0
- package/dist/wallets/walletConnectors/chunk-Q3W2LKFS.js +498 -0
- package/dist/wallets/walletConnectors/chunk-QAD7DCJI.js +473 -0
- package/dist/wallets/walletConnectors/chunk-QG6HVKA7.js +458 -0
- package/dist/wallets/walletConnectors/chunk-QHCY3K35.js +466 -0
- package/dist/wallets/walletConnectors/chunk-QHRV2IC7.js +63 -0
- package/dist/wallets/walletConnectors/chunk-QWEA3UTQ.js +313 -0
- package/dist/wallets/walletConnectors/chunk-QYUVI6LM.js +500 -0
- package/dist/wallets/walletConnectors/chunk-RFNPDZJ5.js +299 -0
- package/dist/wallets/walletConnectors/chunk-SUBWGTWM.js +459 -0
- package/dist/wallets/walletConnectors/chunk-TASM5LUN.js +276 -0
- package/dist/wallets/walletConnectors/chunk-U4DSASHD.js +63 -0
- package/dist/wallets/walletConnectors/chunk-UCKLTSEQ.js +467 -0
- package/dist/wallets/walletConnectors/chunk-UWC6AXPI.js +63 -0
- package/dist/wallets/walletConnectors/chunk-V5LV4P2L.js +63 -0
- package/dist/wallets/walletConnectors/chunk-VP6SWGCN.js +63 -0
- package/dist/wallets/walletConnectors/chunk-W4MD4LZF.js +464 -0
- package/dist/wallets/walletConnectors/chunk-XHNXMXXX.js +493 -0
- package/dist/wallets/walletConnectors/chunk-XHOWI6QG.js +399 -0
- package/dist/wallets/walletConnectors/chunk-YDCQB2MV.js +309 -0
- package/dist/wallets/walletConnectors/chunk-Z4LE4R6P.js +63 -0
- package/dist/wallets/walletConnectors/chunk-ZE3USY6D.js +156 -0
- package/dist/wallets/walletConnectors/chunk-ZHHPZPSF.js +489 -0
- package/dist/wallets/walletConnectors/chunk-ZOJTTG4G.js +63 -0
- package/dist/wallets/walletConnectors/index.js +49 -49
- package/package.json +2 -1
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
secure_default
|
|
4
|
+
} from "./chunk-NDYGTKP5.js";
|
|
5
|
+
import {
|
|
6
|
+
calculateExpiryTimestamp,
|
|
7
|
+
createAbcError,
|
|
8
|
+
isTokenExpired,
|
|
9
|
+
loadFromStorage,
|
|
10
|
+
parseApiError,
|
|
11
|
+
removeFromStorage,
|
|
12
|
+
saveToStorage
|
|
13
|
+
} from "./chunk-5RSS3SRV.js";
|
|
14
|
+
import {
|
|
15
|
+
ABC_ENDPOINTS,
|
|
16
|
+
DEFAULT_HEADERS,
|
|
17
|
+
REQUEST_TIMEOUT
|
|
18
|
+
} from "./chunk-VETRBBA2.js";
|
|
19
|
+
|
|
20
|
+
// src/wallets/walletConnectors/abcWallet/api/BaseApiClient.ts
|
|
21
|
+
var BaseApiClient = class {
|
|
22
|
+
constructor(config) {
|
|
23
|
+
this.accessToken = null;
|
|
24
|
+
this.refreshToken = null;
|
|
25
|
+
this.expiresAt = null;
|
|
26
|
+
this.isRefreshing = false;
|
|
27
|
+
this.refreshPromise = null;
|
|
28
|
+
this.config = config;
|
|
29
|
+
this.baseURL = config.waasUrl;
|
|
30
|
+
this.secure = new secure_default(this.baseURL);
|
|
31
|
+
this.loadTokens();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Load tokens from storage
|
|
35
|
+
*/
|
|
36
|
+
loadTokens() {
|
|
37
|
+
this.accessToken = loadFromStorage("access_token" /* ACCESS_TOKEN */);
|
|
38
|
+
this.refreshToken = loadFromStorage("refresh_token" /* REFRESH_TOKEN */);
|
|
39
|
+
this.expiresAt = loadFromStorage("expires_at" /* EXPIRES_AT */);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Set tokens in client instance (useful when restoring from storage or state)
|
|
43
|
+
* Call this before making API requests if tokens are managed externally
|
|
44
|
+
*/
|
|
45
|
+
setTokens(accessToken, refreshToken, expiresAt) {
|
|
46
|
+
this.accessToken = accessToken;
|
|
47
|
+
this.refreshToken = refreshToken;
|
|
48
|
+
this.expiresAt = expiresAt;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Save tokens to storage
|
|
52
|
+
*/
|
|
53
|
+
saveTokens(accessToken, refreshToken, expiresIn) {
|
|
54
|
+
this.accessToken = accessToken;
|
|
55
|
+
this.refreshToken = refreshToken;
|
|
56
|
+
this.expiresAt = calculateExpiryTimestamp(expiresIn);
|
|
57
|
+
saveToStorage("access_token" /* ACCESS_TOKEN */, accessToken);
|
|
58
|
+
saveToStorage("refresh_token" /* REFRESH_TOKEN */, refreshToken);
|
|
59
|
+
saveToStorage("expires_at" /* EXPIRES_AT */, this.expiresAt);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Clear tokens
|
|
63
|
+
*/
|
|
64
|
+
clearTokens() {
|
|
65
|
+
this.accessToken = null;
|
|
66
|
+
this.refreshToken = null;
|
|
67
|
+
this.expiresAt = null;
|
|
68
|
+
removeFromStorage("access_token" /* ACCESS_TOKEN */);
|
|
69
|
+
removeFromStorage("refresh_token" /* REFRESH_TOKEN */);
|
|
70
|
+
removeFromStorage("expires_at" /* EXPIRES_AT */);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Check if access token is expired
|
|
74
|
+
*/
|
|
75
|
+
isTokenExpired() {
|
|
76
|
+
return isTokenExpired(this.expiresAt);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get current access token
|
|
80
|
+
*/
|
|
81
|
+
getAccessToken() {
|
|
82
|
+
return this.accessToken;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Set access token manually
|
|
86
|
+
*/
|
|
87
|
+
setAccessToken(token) {
|
|
88
|
+
this.accessToken = token;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Get base URL
|
|
92
|
+
*/
|
|
93
|
+
getBaseURL() {
|
|
94
|
+
return this.baseURL;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get configuration
|
|
98
|
+
*/
|
|
99
|
+
getConfig() {
|
|
100
|
+
return this.config;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Refresh access token
|
|
104
|
+
*/
|
|
105
|
+
async refreshAccessToken() {
|
|
106
|
+
if (this.isRefreshing) {
|
|
107
|
+
if (this.refreshPromise) {
|
|
108
|
+
await this.refreshPromise;
|
|
109
|
+
}
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (!this.refreshToken) {
|
|
113
|
+
throw createAbcError(
|
|
114
|
+
"TOKEN_EXPIRED" /* TOKEN_EXPIRED */,
|
|
115
|
+
"No refresh token available"
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
this.isRefreshing = true;
|
|
119
|
+
this.refreshPromise = (async () => {
|
|
120
|
+
try {
|
|
121
|
+
const isIframe = typeof window !== "undefined" && window.self !== window.top;
|
|
122
|
+
const talkenApiUrl = process.env.NEXT_PUBLIC_API_SERVER || "https://dev.walletapi.talken.io";
|
|
123
|
+
const isProd = this.config.environment === "production";
|
|
124
|
+
const headers = { ...DEFAULT_HEADERS };
|
|
125
|
+
if (isProd) {
|
|
126
|
+
headers["User-Agent"] = "Android";
|
|
127
|
+
}
|
|
128
|
+
const response = await fetch(
|
|
129
|
+
`${talkenApiUrl}${ABC_ENDPOINTS.REFRESH_TOKEN}`,
|
|
130
|
+
{
|
|
131
|
+
method: "POST",
|
|
132
|
+
headers,
|
|
133
|
+
credentials: "include",
|
|
134
|
+
body: new URLSearchParams({
|
|
135
|
+
refresh_token: this.refreshToken || "",
|
|
136
|
+
isIframe: String(isIframe)
|
|
137
|
+
}).toString()
|
|
138
|
+
}
|
|
139
|
+
);
|
|
140
|
+
const text = await response.text();
|
|
141
|
+
const data = text ? JSON.parse(text) : {};
|
|
142
|
+
if (response.ok && data.access_token) {
|
|
143
|
+
const expiresIn = data.expire_in || 3600;
|
|
144
|
+
this.saveTokens(
|
|
145
|
+
data.access_token,
|
|
146
|
+
data.refresh_token || this.refreshToken,
|
|
147
|
+
expiresIn
|
|
148
|
+
);
|
|
149
|
+
} else {
|
|
150
|
+
throw createAbcError(
|
|
151
|
+
"TOKEN_EXPIRED" /* TOKEN_EXPIRED */,
|
|
152
|
+
"Failed to refresh token"
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
} finally {
|
|
156
|
+
this.isRefreshing = false;
|
|
157
|
+
this.refreshPromise = null;
|
|
158
|
+
}
|
|
159
|
+
})();
|
|
160
|
+
await this.refreshPromise;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Make HTTP request with automatic token refresh
|
|
164
|
+
*/
|
|
165
|
+
async request(endpoint, options = {}) {
|
|
166
|
+
const {
|
|
167
|
+
method = "GET",
|
|
168
|
+
body,
|
|
169
|
+
headers = {},
|
|
170
|
+
skipAuth = false,
|
|
171
|
+
isRetry = false,
|
|
172
|
+
contentType = "form"
|
|
173
|
+
// Default to form-encoded for backward compatibility
|
|
174
|
+
} = options;
|
|
175
|
+
if (!skipAuth && this.isTokenExpired() && this.refreshToken) {
|
|
176
|
+
await this.refreshAccessToken();
|
|
177
|
+
}
|
|
178
|
+
const url = `${this.baseURL}${endpoint}`;
|
|
179
|
+
const requestHeaders = {
|
|
180
|
+
...DEFAULT_HEADERS,
|
|
181
|
+
...headers
|
|
182
|
+
};
|
|
183
|
+
if (contentType === "json") {
|
|
184
|
+
requestHeaders["Content-Type"] = "application/json";
|
|
185
|
+
requestHeaders["Accept"] = "application/json";
|
|
186
|
+
}
|
|
187
|
+
if (this.config.environment === "production") {
|
|
188
|
+
requestHeaders["User-Agent"] = "Android";
|
|
189
|
+
}
|
|
190
|
+
if (!skipAuth && this.accessToken) {
|
|
191
|
+
requestHeaders.Authorization = `Bearer ${this.accessToken}`;
|
|
192
|
+
}
|
|
193
|
+
if (this.config.apiKey) {
|
|
194
|
+
requestHeaders["X-API-Key"] = this.config.apiKey;
|
|
195
|
+
}
|
|
196
|
+
try {
|
|
197
|
+
const controller = new AbortController();
|
|
198
|
+
const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT);
|
|
199
|
+
const requestBody = body ? contentType === "json" ? JSON.stringify(body) : new URLSearchParams(body).toString() : void 0;
|
|
200
|
+
const response = await fetch(url, {
|
|
201
|
+
method,
|
|
202
|
+
headers: requestHeaders,
|
|
203
|
+
body: requestBody,
|
|
204
|
+
signal: controller.signal
|
|
205
|
+
});
|
|
206
|
+
clearTimeout(timeoutId);
|
|
207
|
+
const text = await response.text();
|
|
208
|
+
let data;
|
|
209
|
+
if (text) {
|
|
210
|
+
try {
|
|
211
|
+
data = JSON.parse(text);
|
|
212
|
+
} catch (parseError) {
|
|
213
|
+
console.error("[BaseApiClient] \u274C JSON parse error:", {
|
|
214
|
+
url,
|
|
215
|
+
method,
|
|
216
|
+
status: response.status,
|
|
217
|
+
responseText: text.substring(0, 200)
|
|
218
|
+
});
|
|
219
|
+
throw createAbcError(
|
|
220
|
+
"UNKNOWN_ERROR" /* UNKNOWN_ERROR */,
|
|
221
|
+
"Invalid JSON response from server",
|
|
222
|
+
{ text, parseError }
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
} else {
|
|
226
|
+
data = { status: "success" };
|
|
227
|
+
}
|
|
228
|
+
if (response.status === 401 && !skipAuth && this.refreshToken && !isRetry) {
|
|
229
|
+
try {
|
|
230
|
+
await this.refreshAccessToken();
|
|
231
|
+
return await this.request(endpoint, {
|
|
232
|
+
...options,
|
|
233
|
+
isRetry: true
|
|
234
|
+
});
|
|
235
|
+
} catch (refreshError) {
|
|
236
|
+
console.error("Token refresh failed:", refreshError);
|
|
237
|
+
throw parseApiError({
|
|
238
|
+
response: {
|
|
239
|
+
status: response.status,
|
|
240
|
+
data
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
if (!response.ok) {
|
|
246
|
+
if (response.status !== 409) {
|
|
247
|
+
console.error("[BaseApiClient] \u274C API Error:", {
|
|
248
|
+
url,
|
|
249
|
+
method,
|
|
250
|
+
status: response.status,
|
|
251
|
+
statusText: response.statusText,
|
|
252
|
+
data
|
|
253
|
+
});
|
|
254
|
+
if (response.status === 500 && data) {
|
|
255
|
+
console.error("[BaseApiClient] 500 Error Details:", {
|
|
256
|
+
message: data.message,
|
|
257
|
+
detail: data.detail,
|
|
258
|
+
code: data.code,
|
|
259
|
+
fullResponse: JSON.stringify(data, null, 2)
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
throw parseApiError({
|
|
264
|
+
response: {
|
|
265
|
+
status: response.status,
|
|
266
|
+
data
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
return data;
|
|
271
|
+
} catch (error) {
|
|
272
|
+
if (error.response?.status !== 409 && error.code !== "WALLET_ALREADY_EXISTS") {
|
|
273
|
+
console.error("[BaseApiClient] \u274C Request failed:", {
|
|
274
|
+
url,
|
|
275
|
+
method,
|
|
276
|
+
error: error.message
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
if (error.name === "AbortError") {
|
|
280
|
+
throw createAbcError(
|
|
281
|
+
"NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
282
|
+
"Request timeout",
|
|
283
|
+
error
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
if (error.code && error.message) {
|
|
287
|
+
throw error;
|
|
288
|
+
}
|
|
289
|
+
throw parseApiError(error);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Check if user is authenticated
|
|
294
|
+
*/
|
|
295
|
+
isAuthenticated() {
|
|
296
|
+
return !!this.accessToken && !this.isTokenExpired();
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Logout (clear tokens)
|
|
300
|
+
*/
|
|
301
|
+
async logout() {
|
|
302
|
+
this.clearTokens();
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Get secure service instance
|
|
306
|
+
*/
|
|
307
|
+
getSecureService() {
|
|
308
|
+
return this.secure;
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
|
|
312
|
+
export {
|
|
313
|
+
BaseApiClient
|
|
314
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
TransactionApi
|
|
4
|
+
} from "./chunk-DJKN2MCI.js";
|
|
5
|
+
import {
|
|
6
|
+
WalletApi
|
|
7
|
+
} from "./chunk-V33I7JGZ.js";
|
|
8
|
+
import {
|
|
9
|
+
AuthApi
|
|
10
|
+
} from "./chunk-ZNBWRE3K.js";
|
|
11
|
+
import {
|
|
12
|
+
SigningApi
|
|
13
|
+
} from "./chunk-7VZDITAJ.js";
|
|
14
|
+
import {
|
|
15
|
+
BitcoinApi
|
|
16
|
+
} from "./chunk-V4Q3GNBX.js";
|
|
17
|
+
import {
|
|
18
|
+
SolanaApi
|
|
19
|
+
} from "./chunk-5AL2CK6V.js";
|
|
20
|
+
|
|
21
|
+
// src/wallets/walletConnectors/abcWallet/api/index.ts
|
|
22
|
+
var AbcWaasApiClient = class {
|
|
23
|
+
constructor(config) {
|
|
24
|
+
this.auth = new AuthApi(config);
|
|
25
|
+
this.wallet = new WalletApi(config);
|
|
26
|
+
this.transaction = new TransactionApi(config);
|
|
27
|
+
this.signing = new SigningApi(config);
|
|
28
|
+
this.solana = new SolanaApi(config);
|
|
29
|
+
this.bitcoin = new BitcoinApi(config);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Check if user is authenticated
|
|
33
|
+
*/
|
|
34
|
+
isAuthenticated() {
|
|
35
|
+
return this.auth.isAuthenticated();
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check if access token is expired
|
|
39
|
+
*/
|
|
40
|
+
isTokenExpired() {
|
|
41
|
+
return this.auth.isTokenExpired();
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get current access token
|
|
45
|
+
*/
|
|
46
|
+
getAccessToken() {
|
|
47
|
+
return this.auth.getAccessToken();
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Logout (clear tokens)
|
|
51
|
+
*/
|
|
52
|
+
async logout() {
|
|
53
|
+
await this.auth.logout();
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
function createAbcWaasApiClient(config) {
|
|
57
|
+
return new AbcWaasApiClient(config);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export {
|
|
61
|
+
AbcWaasApiClient,
|
|
62
|
+
createAbcWaasApiClient
|
|
63
|
+
};
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
BaseApiClient
|
|
4
|
+
} from "./chunk-MPFE6GP2.js";
|
|
5
|
+
import {
|
|
6
|
+
getSolanaNetwork
|
|
7
|
+
} from "./chunk-A7FIBI6X.js";
|
|
8
|
+
import {
|
|
9
|
+
createAbcError
|
|
10
|
+
} from "./chunk-5RSS3SRV.js";
|
|
11
|
+
|
|
12
|
+
// src/wallets/walletConnectors/abcWallet/api/SolanaApi.ts
|
|
13
|
+
import { PublicKey } from "@solana/web3.js";
|
|
14
|
+
var SolanaApi = class extends BaseApiClient {
|
|
15
|
+
/**
|
|
16
|
+
* Generate Solana wallet (Ed25519)
|
|
17
|
+
* Uses V3 API with Ed25519 curve
|
|
18
|
+
*
|
|
19
|
+
* @param pin - Hashed PIN (SHA-256)
|
|
20
|
+
* @param isRecover - Whether to recover existing wallet (default: false)
|
|
21
|
+
* @returns Solana wallet information
|
|
22
|
+
*/
|
|
23
|
+
async generateSolanaWallet(pin, isRecover = false) {
|
|
24
|
+
const endpoint = `/v3/wallet/${isRecover ? "recover" : "generate"}`;
|
|
25
|
+
const network = getSolanaNetwork();
|
|
26
|
+
const response = await this.request(endpoint, {
|
|
27
|
+
method: "POST",
|
|
28
|
+
contentType: "json",
|
|
29
|
+
body: {
|
|
30
|
+
curve: "ed25519",
|
|
31
|
+
password: pin,
|
|
32
|
+
network
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
let result;
|
|
36
|
+
if (response.status === "success" && response.result) {
|
|
37
|
+
result = response.result;
|
|
38
|
+
} else if (response.encrypted_share && response.key_id) {
|
|
39
|
+
result = response;
|
|
40
|
+
} else {
|
|
41
|
+
throw createAbcError(
|
|
42
|
+
"WALLET_NOT_FOUND" /* WALLET_NOT_FOUND */,
|
|
43
|
+
`Failed to ${isRecover ? "recover" : "generate"} Solana wallet`,
|
|
44
|
+
response
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
let address;
|
|
48
|
+
try {
|
|
49
|
+
address = this.deriveAddressFromPublicKey(result.public_key);
|
|
50
|
+
} catch (_error) {
|
|
51
|
+
address = result.public_key.startsWith("0x") ? result.public_key.slice(2) : result.public_key;
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
uid: result.uid || "",
|
|
55
|
+
sessionId: result.share_id,
|
|
56
|
+
shareId: result.share_id,
|
|
57
|
+
publicKey: result.public_key,
|
|
58
|
+
address,
|
|
59
|
+
keyId: result.key_id || result.share_id,
|
|
60
|
+
// API returns snake_case key_id
|
|
61
|
+
encryptedShare: result.encrypted_share || "",
|
|
62
|
+
// API returns snake_case encrypted_share
|
|
63
|
+
secretStore: result.secret_store || "",
|
|
64
|
+
// API returns snake_case secret_store
|
|
65
|
+
network
|
|
66
|
+
// Use network from request (already has correct value)
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Recover Solana wallet (alias for generateSolanaWallet with isRecover=true)
|
|
71
|
+
*
|
|
72
|
+
* @param pin - Hashed PIN (SHA-256)
|
|
73
|
+
* @returns Recovered Solana wallet information
|
|
74
|
+
*/
|
|
75
|
+
async recoverSolanaWallet(pin) {
|
|
76
|
+
return this.generateSolanaWallet(pin, true);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Derive Solana address from Ed25519 public key
|
|
80
|
+
* @param publicKey - Ed25519 public key (hex)
|
|
81
|
+
* @returns Solana address (base58)
|
|
82
|
+
*/
|
|
83
|
+
deriveAddressFromPublicKey(publicKey) {
|
|
84
|
+
const cleanKey = publicKey.startsWith("0x") ? publicKey.slice(2) : publicKey;
|
|
85
|
+
const bytes = new Uint8Array(
|
|
86
|
+
cleanKey.match(/.{1,2}/g)?.map((byte) => Number.parseInt(byte, 16)) || []
|
|
87
|
+
);
|
|
88
|
+
try {
|
|
89
|
+
const pubkey = new PublicKey(bytes);
|
|
90
|
+
return pubkey.toBase58();
|
|
91
|
+
} catch (error) {
|
|
92
|
+
console.error("[SolanaApi] Failed to encode address:", error);
|
|
93
|
+
return cleanKey;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Sign Solana transaction with Ed25519
|
|
98
|
+
* Reference: /v3/wallet/sign API requires only 5 fields
|
|
99
|
+
*/
|
|
100
|
+
async signSolanaTransaction(params) {
|
|
101
|
+
const network = getSolanaNetwork();
|
|
102
|
+
const response = await this.request("/v3/wallet/sign", {
|
|
103
|
+
method: "POST",
|
|
104
|
+
contentType: "json",
|
|
105
|
+
body: {
|
|
106
|
+
curve: "ed25519",
|
|
107
|
+
network,
|
|
108
|
+
key_id: params.keyId,
|
|
109
|
+
encrypted_share: params.encryptedShare,
|
|
110
|
+
secret_store: params.secretStore || "",
|
|
111
|
+
message: params.message
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
let signature;
|
|
115
|
+
if (response.status === "success" && response.result?.signature) {
|
|
116
|
+
signature = response.result.signature;
|
|
117
|
+
} else if (response.signature) {
|
|
118
|
+
signature = response.signature;
|
|
119
|
+
} else {
|
|
120
|
+
throw createAbcError(
|
|
121
|
+
"SIGNATURE_FAILED" /* SIGNATURE_FAILED */,
|
|
122
|
+
"Failed to sign Solana transaction",
|
|
123
|
+
response
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
signature
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Sign Solana message with Ed25519
|
|
132
|
+
* Reference: /v3/wallet/sign API requires only 5 fields
|
|
133
|
+
*/
|
|
134
|
+
async signSolanaMessage(params) {
|
|
135
|
+
const network = getSolanaNetwork();
|
|
136
|
+
const response = await this.request("/v3/wallet/sign", {
|
|
137
|
+
method: "POST",
|
|
138
|
+
contentType: "json",
|
|
139
|
+
body: {
|
|
140
|
+
curve: "ed25519",
|
|
141
|
+
network,
|
|
142
|
+
key_id: params.keyId,
|
|
143
|
+
encrypted_share: params.encryptedShare,
|
|
144
|
+
secret_store: params.secretStore || "",
|
|
145
|
+
message: params.message
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
let signature;
|
|
149
|
+
if (response.status === "success" && response.result?.signature) {
|
|
150
|
+
signature = response.result.signature;
|
|
151
|
+
} else if (response.signature) {
|
|
152
|
+
signature = response.signature;
|
|
153
|
+
} else {
|
|
154
|
+
throw createAbcError(
|
|
155
|
+
"SIGNATURE_FAILED" /* SIGNATURE_FAILED */,
|
|
156
|
+
"Failed to sign Solana message",
|
|
157
|
+
response
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
signature
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Generate Solana transfer transaction via ABC WaaS API
|
|
166
|
+
* This ensures the transaction uses the same RPC and blockhash as the server
|
|
167
|
+
*/
|
|
168
|
+
async generateTransferTransaction(params) {
|
|
169
|
+
const response = await this.request(
|
|
170
|
+
"/wapi/v2/solana/tx/generateTransferSOLTransaction",
|
|
171
|
+
{
|
|
172
|
+
method: "POST",
|
|
173
|
+
contentType: "json",
|
|
174
|
+
body: {
|
|
175
|
+
network: params.network,
|
|
176
|
+
amount: params.amount,
|
|
177
|
+
fromAddress: params.fromAddress,
|
|
178
|
+
toAddress: params.toAddress,
|
|
179
|
+
feePayerAddress: params.feePayerAddress
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
);
|
|
183
|
+
const responseData = response;
|
|
184
|
+
const serializedTx = responseData.data?.serialized_tx || response.status === "success" && response.result?.data?.serialized_tx;
|
|
185
|
+
if (!serializedTx) {
|
|
186
|
+
throw createAbcError(
|
|
187
|
+
"NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
188
|
+
"Failed to generate Solana transaction",
|
|
189
|
+
response
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
serialized_tx: serializedTx
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Send Solana transaction
|
|
198
|
+
* Sends a fully signed and serialized transaction to the Solana network
|
|
199
|
+
*/
|
|
200
|
+
async sendSolanaTransaction(params) {
|
|
201
|
+
const response = await this.request(
|
|
202
|
+
"/wapi/v2/solana/tx/sendSignedTransaction",
|
|
203
|
+
{
|
|
204
|
+
method: "POST",
|
|
205
|
+
contentType: "json",
|
|
206
|
+
body: {
|
|
207
|
+
network: params.network,
|
|
208
|
+
serializedTX: params.serializedTX
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
);
|
|
212
|
+
const responseData = response;
|
|
213
|
+
const txHash = responseData.data || response.status === "success" && response.result?.data;
|
|
214
|
+
if (!txHash || typeof txHash !== "string") {
|
|
215
|
+
throw createAbcError(
|
|
216
|
+
"NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
217
|
+
"Failed to send Solana transaction",
|
|
218
|
+
response
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
return {
|
|
222
|
+
txHash
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Generate SPL token transfer transaction via ABC WaaS API
|
|
227
|
+
*
|
|
228
|
+
* @param params - SPL transfer parameters
|
|
229
|
+
* @returns Serialized transaction
|
|
230
|
+
*/
|
|
231
|
+
async generateSPLTransferTransaction(params) {
|
|
232
|
+
const response = await this.request(
|
|
233
|
+
"/wapi/v2/solana/tx/generateTransferFTTransaction",
|
|
234
|
+
{
|
|
235
|
+
method: "POST",
|
|
236
|
+
contentType: "json",
|
|
237
|
+
body: {
|
|
238
|
+
network: params.network,
|
|
239
|
+
feePayerAddress: params.feePayerAddress,
|
|
240
|
+
fromTokenAccount: params.fromTokenAccount,
|
|
241
|
+
toTokenAccount: params.toTokenAccount,
|
|
242
|
+
owner: params.owner,
|
|
243
|
+
amount: params.amount,
|
|
244
|
+
...params.latestBlockhash && {
|
|
245
|
+
latestBlockhash: params.latestBlockhash
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
);
|
|
250
|
+
const responseData = response;
|
|
251
|
+
const data = responseData.data || response.status === "success" && response.result;
|
|
252
|
+
if (!data?.serialized_tx) {
|
|
253
|
+
throw createAbcError(
|
|
254
|
+
"NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
255
|
+
"Failed to generate SPL transfer transaction",
|
|
256
|
+
response
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
return {
|
|
260
|
+
serialized_tx: data.serialized_tx,
|
|
261
|
+
estimated_fee: data.estimated_fee || { context: { Slot: 0 }, value: 0 },
|
|
262
|
+
latest_blockhash: data.latest_blockhash || ""
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Get SPL token supply information
|
|
267
|
+
*
|
|
268
|
+
* @param params - Token query parameters
|
|
269
|
+
* @returns Token supply information
|
|
270
|
+
*/
|
|
271
|
+
async getTokenInfo(params) {
|
|
272
|
+
const response = await this.request(
|
|
273
|
+
"/wapi/v2/solana/token/getTokenSupply",
|
|
274
|
+
{
|
|
275
|
+
method: "POST",
|
|
276
|
+
contentType: "json",
|
|
277
|
+
body: {
|
|
278
|
+
network: params.network,
|
|
279
|
+
tokenAddress: params.tokenAddress
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
);
|
|
283
|
+
const responseData = response;
|
|
284
|
+
const value = responseData.data?.value || response.status === "success" && response.result?.data?.value;
|
|
285
|
+
if (!value || typeof value.decimals !== "number") {
|
|
286
|
+
throw createAbcError(
|
|
287
|
+
"NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
288
|
+
"Failed to get token info",
|
|
289
|
+
response
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
return {
|
|
293
|
+
amount: value.amount,
|
|
294
|
+
decimals: value.decimals,
|
|
295
|
+
uiAmountString: value.uiAmountString
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
|
|
300
|
+
export {
|
|
301
|
+
SolanaApi
|
|
302
|
+
};
|