@talken/talkenkit 2.4.21 → 2.4.22
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/LICENSE +9 -0
- package/dist/abcWallet-4RS3B4ZG.js +188 -0
- package/dist/abcWallet-EBOW2RJB.js +188 -0
- package/dist/abcWallet-RS4EOJ4I.js +188 -0
- package/dist/abcWallet-SNEZVK7V.js +188 -0
- package/dist/abcWallet-TC7M2JYX.js +188 -0
- package/dist/abcWallet-VZMW2DR3.js +188 -0
- package/dist/abcWallet-XJ3WSUVI.js +188 -0
- package/dist/abcWallet-XNCBZAIQ.js +188 -0
- package/dist/chunk-6FLQAAC4.js +7213 -0
- package/dist/chunk-7GIIMIPN.js +7213 -0
- package/dist/chunk-IBFA37SC.js +7228 -0
- package/dist/chunk-O5ZOC4NJ.js +7215 -0
- package/dist/chunk-OPOAKGEX.js +7216 -0
- package/dist/chunk-OTIHVCVR.js +7213 -0
- package/dist/chunk-P77BVZZF.js +7369 -0
- package/dist/chunk-RFLXXSQH.js +7139 -0
- package/dist/components/ConfirmationModal/NonEvmConfirmationModal.css.d.ts +11 -0
- package/dist/components/ConfirmationModal/NonEvmSignConfirmationModal.d.ts +9 -0
- package/dist/components/ConfirmationModal/NonEvmTransferConfirmationModal.d.ts +9 -0
- package/dist/components/ConfirmationModal/SignConfirmationModal.css.d.ts +1 -19
- package/dist/components/ConfirmationModal/TransactionConfirmationModal.css.d.ts +1 -20
- package/dist/components/ConfirmationModal/commonStyles.css.d.ts +19 -0
- package/dist/components/ConfirmationModal/index.d.ts +2 -0
- package/dist/components/ConfirmationModal/utils.d.ts +2 -1
- package/dist/hooks/useWalletCapabilities.d.ts +2 -0
- package/dist/index.css +227 -307
- package/dist/index.d.ts +4 -2
- package/dist/index.js +2004 -1064
- package/dist/providers/SignConfirmationProvider/NonEvmConfirmationContext.d.ts +6 -0
- package/dist/providers/SignConfirmationProvider/index.d.ts +2 -1
- package/dist/providers/SignConfirmationProvider/requestParsers.d.ts +6 -1
- package/dist/providers/SignConfirmationProvider/types.d.ts +35 -1
- package/dist/wallets/capabilities/detectCapabilities.d.ts +7 -0
- package/dist/wallets/capabilities/requestWalletAction.d.ts +8 -0
- package/dist/wallets/capabilities/types.d.ts +50 -0
- package/dist/wallets/walletConnectors/abcWallet/abcApi.js +3 -3
- package/dist/wallets/walletConnectors/abcWallet/abcBitcoinConnector.js +3 -3
- package/dist/wallets/walletConnectors/abcWallet/abcBitcoinProvider.d.ts +10 -0
- package/dist/wallets/walletConnectors/abcWallet/abcBitcoinProvider.js +1 -1
- package/dist/wallets/walletConnectors/abcWallet/abcConnector.js +5 -5
- package/dist/wallets/walletConnectors/abcWallet/abcProvider.d.ts +9 -0
- package/dist/wallets/walletConnectors/abcWallet/abcProvider.js +3 -3
- package/dist/wallets/walletConnectors/abcWallet/abcSolanaProvider.d.ts +10 -0
- package/dist/wallets/walletConnectors/abcWallet/abcSolanaProvider.js +1 -1
- package/dist/wallets/walletConnectors/abcWallet/abcSolanaWalletAdapter.d.ts +16 -0
- package/dist/wallets/walletConnectors/abcWallet/abcSolanaWalletAdapter.js +115 -33
- package/dist/wallets/walletConnectors/abcWallet/abcTronProvider.d.ts +16 -0
- package/dist/wallets/walletConnectors/abcWallet/abcTronProvider.js +1 -1
- package/dist/wallets/walletConnectors/abcWallet/abcWallet.js +7 -7
- package/dist/wallets/walletConnectors/abcWallet/api/AuthApi.js +4 -4
- package/dist/wallets/walletConnectors/abcWallet/api/BaseApiClient.js +3 -3
- package/dist/wallets/walletConnectors/abcWallet/api/BitcoinApi.js +4 -4
- package/dist/wallets/walletConnectors/abcWallet/api/GasApi.js +4 -4
- package/dist/wallets/walletConnectors/abcWallet/api/SolanaApi.js +4 -4
- package/dist/wallets/walletConnectors/abcWallet/api/TalkenApiClient.d.ts +9 -4
- package/dist/wallets/walletConnectors/abcWallet/api/TalkenApiClient.js +2 -2
- package/dist/wallets/walletConnectors/abcWallet/api/TransactionApi.js +4 -4
- package/dist/wallets/walletConnectors/abcWallet/api/TronApi.js +4 -4
- package/dist/wallets/walletConnectors/abcWallet/api/WalletApi.js +4 -4
- package/dist/wallets/walletConnectors/abcWallet/api/WalletscanApi.js +4 -4
- package/dist/wallets/walletConnectors/abcWallet/api/index.js +13 -13
- package/dist/wallets/walletConnectors/abcWallet/constants.d.ts +5 -4
- package/dist/wallets/walletConnectors/abcWallet/constants.js +1 -1
- package/dist/wallets/walletConnectors/abcWallet/index.js +21 -21
- package/dist/wallets/walletConnectors/abcWallet/types.d.ts +31 -1
- package/dist/wallets/walletConnectors/abcWallet/utils.js +2 -2
- package/dist/wallets/walletConnectors/berasigWallet/berasigWallet.js +2 -2
- package/dist/wallets/walletConnectors/bifrostWallet/bifrostWallet.js +2 -2
- package/dist/wallets/walletConnectors/binanceWallet/binanceWallet.js +2 -2
- package/dist/wallets/walletConnectors/bitgetWallet/bitgetWallet.js +2 -2
- package/dist/wallets/walletConnectors/bybitWallet/bybitWallet.js +2 -2
- package/dist/wallets/walletConnectors/chunk-2IZBLAHI.js +52 -0
- package/dist/wallets/walletConnectors/chunk-32IJ3ILH.js +71 -0
- package/dist/wallets/walletConnectors/chunk-3AX66UHT.js +479 -0
- package/dist/wallets/walletConnectors/chunk-3BVPV64G.js +36 -0
- package/dist/wallets/walletConnectors/chunk-3DGFHWI3.js +302 -0
- package/dist/wallets/walletConnectors/chunk-4FKUVQCM.js +655 -0
- package/dist/wallets/walletConnectors/chunk-56SF4VRC.js +640 -0
- package/dist/wallets/walletConnectors/chunk-5KOE7NJW.js +52 -0
- package/dist/wallets/walletConnectors/chunk-6CVXZ3ZW.js +771 -0
- package/dist/wallets/walletConnectors/chunk-6GCWEPU7.js +643 -0
- package/dist/wallets/walletConnectors/chunk-6YFP3Q2I.js +118 -0
- package/dist/wallets/walletConnectors/chunk-7EEPPULA.js +118 -0
- package/dist/wallets/walletConnectors/chunk-7QL42XTB.js +302 -0
- package/dist/wallets/walletConnectors/chunk-A7ZSPSFX.js +577 -0
- package/dist/wallets/walletConnectors/chunk-AI3CT254.js +302 -0
- package/dist/wallets/walletConnectors/chunk-AMNVH7CZ.js +151 -0
- package/dist/wallets/walletConnectors/chunk-AOREXGRM.js +350 -0
- package/dist/wallets/walletConnectors/chunk-BLO7E54F.js +302 -0
- package/dist/wallets/walletConnectors/chunk-BNRH5PYS.js +52 -0
- package/dist/wallets/walletConnectors/chunk-BOV5FXU6.js +151 -0
- package/dist/wallets/walletConnectors/chunk-BR25RFNF.js +260 -0
- package/dist/wallets/walletConnectors/chunk-BXQ2UWJ3.js +91 -0
- package/dist/wallets/walletConnectors/chunk-CAMPW7O2.js +874 -0
- package/dist/wallets/walletConnectors/chunk-CLMFCNP7.js +52 -0
- package/dist/wallets/walletConnectors/chunk-DSZOE65L.js +107 -0
- package/dist/wallets/walletConnectors/chunk-DU6RCLWT.js +272 -0
- package/dist/wallets/walletConnectors/chunk-ENN6UGGA.js +421 -0
- package/dist/wallets/walletConnectors/chunk-EXWDLN5V.js +204 -0
- package/dist/wallets/walletConnectors/chunk-FFU26Y5Y.js +272 -0
- package/dist/wallets/walletConnectors/chunk-FGS2WHVA.js +118 -0
- package/dist/wallets/walletConnectors/chunk-FJJ3QI4R.js +91 -0
- package/dist/wallets/walletConnectors/chunk-FS2OOQYF.js +204 -0
- package/dist/wallets/walletConnectors/chunk-G5X3COSW.js +205 -0
- package/dist/wallets/walletConnectors/chunk-H53R4SFZ.js +204 -0
- package/dist/wallets/walletConnectors/chunk-J4QGDATF.js +71 -0
- package/dist/wallets/walletConnectors/chunk-JIJNCMJR.js +874 -0
- package/dist/wallets/walletConnectors/chunk-JSGZYU4A.js +52 -0
- package/dist/wallets/walletConnectors/chunk-JVT7R2GZ.js +771 -0
- package/dist/wallets/walletConnectors/chunk-K3JNN5UK.js +71 -0
- package/dist/wallets/walletConnectors/chunk-KBHPY3NA.js +302 -0
- package/dist/wallets/walletConnectors/chunk-KEX6WS23.js +640 -0
- package/dist/wallets/walletConnectors/chunk-KHYKVVR7.js +52 -0
- package/dist/wallets/walletConnectors/chunk-LOL7ZZ3S.js +302 -0
- package/dist/wallets/walletConnectors/chunk-LOSXI36Y.js +479 -0
- package/dist/wallets/walletConnectors/chunk-M2U5QGM7.js +260 -0
- package/dist/wallets/walletConnectors/chunk-M73AWLIV.js +107 -0
- package/dist/wallets/walletConnectors/chunk-MAUC46AE.js +302 -0
- package/dist/wallets/walletConnectors/chunk-MBRXYEQC.js +272 -0
- package/dist/wallets/walletConnectors/chunk-MDDD4LG2.js +874 -0
- package/dist/wallets/walletConnectors/chunk-MMR2QAEU.js +642 -0
- package/dist/wallets/walletConnectors/chunk-MNZZRFUC.js +302 -0
- package/dist/wallets/walletConnectors/chunk-OIRY24PH.js +302 -0
- package/dist/wallets/walletConnectors/chunk-ORBX4JE2.js +52 -0
- package/dist/wallets/walletConnectors/chunk-OXJFFDW7.js +761 -0
- package/dist/wallets/walletConnectors/chunk-QD3PPWTN.js +272 -0
- package/dist/wallets/walletConnectors/chunk-RCIABMG5.js +259 -0
- package/dist/wallets/walletConnectors/chunk-RHC4SVLB.js +71 -0
- package/dist/wallets/walletConnectors/chunk-S2CB4KFC.js +71 -0
- package/dist/wallets/walletConnectors/chunk-S6HZD4XZ.js +302 -0
- package/dist/wallets/walletConnectors/chunk-S72LCNVX.js +272 -0
- package/dist/wallets/walletConnectors/chunk-SCWE5EEX.js +91 -0
- package/dist/wallets/walletConnectors/chunk-TKEL4D4E.js +151 -0
- package/dist/wallets/walletConnectors/chunk-TKJEMEBZ.js +71 -0
- package/dist/wallets/walletConnectors/chunk-TZ44ZREA.js +302 -0
- package/dist/wallets/walletConnectors/chunk-UGQSI3US.js +547 -0
- package/dist/wallets/walletConnectors/chunk-UU4JYY3C.js +205 -0
- package/dist/wallets/walletConnectors/chunk-V5P5BL6Z.js +302 -0
- package/dist/wallets/walletConnectors/chunk-VH6DIRPF.js +71 -0
- package/dist/wallets/walletConnectors/chunk-VPNZAMW5.js +205 -0
- package/dist/wallets/walletConnectors/chunk-W6QN6QXO.js +52 -0
- package/dist/wallets/walletConnectors/chunk-WDULICVN.js +302 -0
- package/dist/wallets/walletConnectors/chunk-WGGHGODM.js +272 -0
- package/dist/wallets/walletConnectors/chunk-XUCMTLM3.js +52 -0
- package/dist/wallets/walletConnectors/chunk-Y5WAX6WO.js +52 -0
- package/dist/wallets/walletConnectors/chunk-Y62PFBWE.js +640 -0
- package/dist/wallets/walletConnectors/chunk-Z6ABK6G6.js +107 -0
- package/dist/wallets/walletConnectors/chunk-ZCA5QSIM.js +71 -0
- package/dist/wallets/walletConnectors/chunk-ZJDZJW55.js +479 -0
- package/dist/wallets/walletConnectors/chunk-ZOF7ZDGU.js +52 -0
- package/dist/wallets/walletConnectors/chunk-ZUU57RHO.js +36 -0
- package/dist/wallets/walletConnectors/chunk-ZWFGRREM.js +36 -0
- package/dist/wallets/walletConnectors/chunk-ZY5BCHP2.js +302 -0
- package/dist/wallets/walletConnectors/clvWallet/clvWallet.js +2 -2
- package/dist/wallets/walletConnectors/coin98Wallet/coin98Wallet.js +2 -2
- package/dist/wallets/walletConnectors/coreWallet/coreWallet.js +2 -2
- package/dist/wallets/walletConnectors/foxWallet/foxWallet.js +2 -2
- package/dist/wallets/walletConnectors/frontierWallet/frontierWallet.js +2 -2
- package/dist/wallets/walletConnectors/gateWallet/gateWallet.js +2 -2
- package/dist/wallets/walletConnectors/index.js +91 -91
- package/dist/wallets/walletConnectors/iopayWallet/iopayWallet.js +2 -2
- package/dist/wallets/walletConnectors/kaiaWallet/kaiaWallet.js +2 -2
- package/dist/wallets/walletConnectors/kaikasWallet/kaikasWallet.js +2 -2
- package/dist/wallets/walletConnectors/metaMaskWallet/metaMaskWallet.js +2 -2
- package/dist/wallets/walletConnectors/okxWallet/okxWallet.js +2 -2
- package/dist/wallets/walletConnectors/rainbowWallet/rainbowWallet.js +2 -2
- package/dist/wallets/walletConnectors/roninWallet/roninWallet.js +2 -2
- package/dist/wallets/walletConnectors/safepalWallet/safepalWallet.js +2 -2
- package/dist/wallets/walletConnectors/subWallet/subWallet.js +2 -2
- package/dist/wallets/walletConnectors/tokenPocketWallet/tokenPocketWallet.js +2 -2
- package/dist/wallets/walletConnectors/trustWallet/trustWallet.js +2 -2
- package/dist/wallets/walletConnectors/zealWallet/zealWallet.js +2 -2
- package/dist/wallets/walletConnectors/zerionWallet/zerionWallet.js +2 -2
- package/package.json +11 -12
|
@@ -0,0 +1,874 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
getNetworkName
|
|
4
|
+
} from "./chunk-7QHCSJDN.js";
|
|
5
|
+
import {
|
|
6
|
+
calculateExpiryTimestamp,
|
|
7
|
+
createAbcError,
|
|
8
|
+
isTokenExpired,
|
|
9
|
+
loadFromStorage,
|
|
10
|
+
parseApiError,
|
|
11
|
+
removeFromStorage,
|
|
12
|
+
saveToStorage
|
|
13
|
+
} from "./chunk-ZJDZJW55.js";
|
|
14
|
+
import {
|
|
15
|
+
ABC_AUDIENCE,
|
|
16
|
+
ABC_ENDPOINTS,
|
|
17
|
+
DEFAULT_HEADERS,
|
|
18
|
+
REQUEST_TIMEOUT
|
|
19
|
+
} from "./chunk-M2U5QGM7.js";
|
|
20
|
+
|
|
21
|
+
// src/wallets/walletConnectors/abcWallet/abcApi.ts
|
|
22
|
+
import { getTalkenApiClient } from "@talken/talkenkit";
|
|
23
|
+
var AbcWaasClient = class {
|
|
24
|
+
constructor(config) {
|
|
25
|
+
this.accessToken = null;
|
|
26
|
+
this.refreshToken = null;
|
|
27
|
+
this.expiresAt = null;
|
|
28
|
+
this.isRefreshing = false;
|
|
29
|
+
this.refreshPromise = null;
|
|
30
|
+
this.talkenAuthPath = "/wallet/auth";
|
|
31
|
+
this.config = config;
|
|
32
|
+
this.baseURL = config.waasUrl;
|
|
33
|
+
this.loadTokens();
|
|
34
|
+
}
|
|
35
|
+
getTalkenApiUrl() {
|
|
36
|
+
return process.env.NEXT_PUBLIC_API_URL || "http://localhost:3001/api/v1";
|
|
37
|
+
}
|
|
38
|
+
async requestWalletAuth(body) {
|
|
39
|
+
const response = await fetch(
|
|
40
|
+
`${this.getTalkenApiUrl()}${this.talkenAuthPath}`,
|
|
41
|
+
{
|
|
42
|
+
method: "POST",
|
|
43
|
+
headers: {
|
|
44
|
+
"Content-Type": "application/json",
|
|
45
|
+
Accept: "application/json"
|
|
46
|
+
},
|
|
47
|
+
credentials: "include",
|
|
48
|
+
body: JSON.stringify(body)
|
|
49
|
+
}
|
|
50
|
+
);
|
|
51
|
+
const text = await response.text();
|
|
52
|
+
const data = text ? JSON.parse(text) : {};
|
|
53
|
+
if (!response.ok) {
|
|
54
|
+
throw parseApiError({
|
|
55
|
+
response: {
|
|
56
|
+
status: response.status,
|
|
57
|
+
data
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return data;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Load tokens from storage
|
|
65
|
+
*/
|
|
66
|
+
loadTokens() {
|
|
67
|
+
this.accessToken = loadFromStorage("access_token" /* ACCESS_TOKEN */);
|
|
68
|
+
this.refreshToken = loadFromStorage("refresh_token" /* REFRESH_TOKEN */);
|
|
69
|
+
this.expiresAt = loadFromStorage("expires_at" /* EXPIRES_AT */);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Save tokens to storage
|
|
73
|
+
*/
|
|
74
|
+
saveTokens(accessToken, refreshToken, expiresIn) {
|
|
75
|
+
this.accessToken = accessToken;
|
|
76
|
+
this.refreshToken = refreshToken;
|
|
77
|
+
this.expiresAt = calculateExpiryTimestamp(expiresIn);
|
|
78
|
+
saveToStorage("access_token" /* ACCESS_TOKEN */, accessToken);
|
|
79
|
+
saveToStorage("refresh_token" /* REFRESH_TOKEN */, refreshToken);
|
|
80
|
+
saveToStorage("expires_at" /* EXPIRES_AT */, this.expiresAt);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Clear tokens
|
|
84
|
+
*/
|
|
85
|
+
clearTokens() {
|
|
86
|
+
this.accessToken = null;
|
|
87
|
+
this.refreshToken = null;
|
|
88
|
+
this.expiresAt = null;
|
|
89
|
+
removeFromStorage("access_token" /* ACCESS_TOKEN */);
|
|
90
|
+
removeFromStorage("refresh_token" /* REFRESH_TOKEN */);
|
|
91
|
+
removeFromStorage("expires_at" /* EXPIRES_AT */);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Check if access token is expired
|
|
95
|
+
*/
|
|
96
|
+
isTokenExpired() {
|
|
97
|
+
return isTokenExpired(this.expiresAt);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get current access token
|
|
101
|
+
*/
|
|
102
|
+
getAccessToken() {
|
|
103
|
+
return this.accessToken;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Refresh access token
|
|
107
|
+
*/
|
|
108
|
+
async refreshAccessToken() {
|
|
109
|
+
if (this.isRefreshing) {
|
|
110
|
+
if (this.refreshPromise) {
|
|
111
|
+
await this.refreshPromise;
|
|
112
|
+
}
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if (!this.refreshToken) {
|
|
116
|
+
throw createAbcError(
|
|
117
|
+
"TOKEN_EXPIRED" /* TOKEN_EXPIRED */,
|
|
118
|
+
"No refresh token available"
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
this.isRefreshing = true;
|
|
122
|
+
this.refreshPromise = (async () => {
|
|
123
|
+
try {
|
|
124
|
+
const isIframe = typeof window !== "undefined" && window.self !== window.top;
|
|
125
|
+
const response = await this.requestWalletAuth({
|
|
126
|
+
action: "token.refresh",
|
|
127
|
+
refreshToken: this.refreshToken || "",
|
|
128
|
+
isIframe
|
|
129
|
+
});
|
|
130
|
+
const data = response?.data || {};
|
|
131
|
+
if (response?.success && data.access_token) {
|
|
132
|
+
const expiresIn = data.expires_in || data.expire_in || 3600;
|
|
133
|
+
this.saveTokens(
|
|
134
|
+
data.access_token,
|
|
135
|
+
data.refresh_token || this.refreshToken,
|
|
136
|
+
// Keep old if not provided
|
|
137
|
+
expiresIn
|
|
138
|
+
);
|
|
139
|
+
} else {
|
|
140
|
+
throw createAbcError(
|
|
141
|
+
"TOKEN_EXPIRED" /* TOKEN_EXPIRED */,
|
|
142
|
+
"Failed to refresh token"
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
} finally {
|
|
146
|
+
this.isRefreshing = false;
|
|
147
|
+
this.refreshPromise = null;
|
|
148
|
+
}
|
|
149
|
+
})();
|
|
150
|
+
await this.refreshPromise;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Make HTTP request
|
|
154
|
+
*/
|
|
155
|
+
async request(endpoint, options = {}) {
|
|
156
|
+
const {
|
|
157
|
+
method = "GET",
|
|
158
|
+
body,
|
|
159
|
+
headers = {},
|
|
160
|
+
skipAuth = false,
|
|
161
|
+
isRetry = false
|
|
162
|
+
} = options;
|
|
163
|
+
if (!skipAuth && this.isTokenExpired() && this.refreshToken) {
|
|
164
|
+
await this.refreshAccessToken();
|
|
165
|
+
}
|
|
166
|
+
const url = `${this.baseURL}${endpoint}`;
|
|
167
|
+
const requestHeaders = {
|
|
168
|
+
...DEFAULT_HEADERS,
|
|
169
|
+
...headers
|
|
170
|
+
};
|
|
171
|
+
if (!skipAuth && this.accessToken) {
|
|
172
|
+
requestHeaders.Authorization = `Bearer ${this.accessToken}`;
|
|
173
|
+
}
|
|
174
|
+
if (this.config.apiKey) {
|
|
175
|
+
requestHeaders["X-API-Key"] = this.config.apiKey;
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
const controller = new AbortController();
|
|
179
|
+
const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT);
|
|
180
|
+
const requestBody = body ? new URLSearchParams(body).toString() : void 0;
|
|
181
|
+
const response = await fetch(url, {
|
|
182
|
+
method,
|
|
183
|
+
headers: requestHeaders,
|
|
184
|
+
body: requestBody,
|
|
185
|
+
signal: controller.signal
|
|
186
|
+
});
|
|
187
|
+
clearTimeout(timeoutId);
|
|
188
|
+
const text = await response.text();
|
|
189
|
+
let data;
|
|
190
|
+
if (text) {
|
|
191
|
+
try {
|
|
192
|
+
data = JSON.parse(text);
|
|
193
|
+
} catch (parseError) {
|
|
194
|
+
console.error("[AbcWaasClient] \u274C JSON parse error:", {
|
|
195
|
+
url,
|
|
196
|
+
method,
|
|
197
|
+
status: response.status,
|
|
198
|
+
responseText: text.substring(0, 200)
|
|
199
|
+
// Log first 200 chars
|
|
200
|
+
});
|
|
201
|
+
throw createAbcError(
|
|
202
|
+
"UNKNOWN_ERROR" /* UNKNOWN_ERROR */,
|
|
203
|
+
"Invalid JSON response from server",
|
|
204
|
+
{ text, parseError }
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
} else {
|
|
208
|
+
console.log("[AbcWaasClient] \u2139\uFE0F Empty response received:", {
|
|
209
|
+
url,
|
|
210
|
+
method,
|
|
211
|
+
status: response.status
|
|
212
|
+
});
|
|
213
|
+
data = { status: "success" };
|
|
214
|
+
}
|
|
215
|
+
if (response.status === 401 && !skipAuth && this.refreshToken && !isRetry) {
|
|
216
|
+
try {
|
|
217
|
+
await this.refreshAccessToken();
|
|
218
|
+
return await this.request(endpoint, {
|
|
219
|
+
...options,
|
|
220
|
+
isRetry: true
|
|
221
|
+
// Prevent infinite retry loop
|
|
222
|
+
});
|
|
223
|
+
} catch (refreshError) {
|
|
224
|
+
console.error("Token refresh failed:", refreshError);
|
|
225
|
+
throw parseApiError({
|
|
226
|
+
response: {
|
|
227
|
+
status: response.status,
|
|
228
|
+
data
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (!response.ok) {
|
|
234
|
+
console.error("[AbcWaasClient] \u274C API Error:", {
|
|
235
|
+
url,
|
|
236
|
+
method,
|
|
237
|
+
status: response.status,
|
|
238
|
+
statusText: response.statusText,
|
|
239
|
+
data
|
|
240
|
+
});
|
|
241
|
+
throw parseApiError({
|
|
242
|
+
response: {
|
|
243
|
+
status: response.status,
|
|
244
|
+
data
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
return data;
|
|
249
|
+
} catch (error) {
|
|
250
|
+
console.error("[AbcWaasClient] \u274C Request failed:", {
|
|
251
|
+
url,
|
|
252
|
+
method,
|
|
253
|
+
error: error.message,
|
|
254
|
+
errorName: error.name,
|
|
255
|
+
errorType: error.constructor.name,
|
|
256
|
+
stack: error.stack
|
|
257
|
+
});
|
|
258
|
+
if (error.name === "AbortError") {
|
|
259
|
+
throw createAbcError(
|
|
260
|
+
"NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
261
|
+
"Request timeout",
|
|
262
|
+
error
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
if (error.code && error.message) {
|
|
266
|
+
throw error;
|
|
267
|
+
}
|
|
268
|
+
throw parseApiError(error);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Login with email and password
|
|
273
|
+
* NOTE: Tokens are stored in memory only. Call persistTokens() after PIN verification to save to localStorage.
|
|
274
|
+
*/
|
|
275
|
+
async loginWithEmail(email, password) {
|
|
276
|
+
const response = await this.request(
|
|
277
|
+
ABC_ENDPOINTS.SNS_LOGIN,
|
|
278
|
+
{
|
|
279
|
+
method: "POST",
|
|
280
|
+
body: {
|
|
281
|
+
email,
|
|
282
|
+
token: password,
|
|
283
|
+
// Use password as token
|
|
284
|
+
service: "email",
|
|
285
|
+
audience: ABC_AUDIENCE
|
|
286
|
+
},
|
|
287
|
+
skipAuth: true
|
|
288
|
+
}
|
|
289
|
+
);
|
|
290
|
+
if (response.status === "success" && response.data) {
|
|
291
|
+
this.accessToken = response.data.accessToken;
|
|
292
|
+
this.refreshToken = response.data.refreshToken;
|
|
293
|
+
this.expiresAt = calculateExpiryTimestamp(response.data.expiresIn);
|
|
294
|
+
console.log(
|
|
295
|
+
"[AbcWaasClient] \u2705 Login successful, tokens stored in memory (not persisted yet)"
|
|
296
|
+
);
|
|
297
|
+
return response.data;
|
|
298
|
+
}
|
|
299
|
+
throw createAbcError(
|
|
300
|
+
"INVALID_CREDENTIALS" /* INVALID_CREDENTIALS */,
|
|
301
|
+
"Email login failed",
|
|
302
|
+
response
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Login with email and OTP (for PIN recovery)
|
|
307
|
+
* NOTE: Tokens are stored in memory only. Call persistTokens() after PIN verification to save to localStorage.
|
|
308
|
+
*/
|
|
309
|
+
async loginWithOtp(email, otpCode) {
|
|
310
|
+
const response = await this.request(
|
|
311
|
+
ABC_ENDPOINTS.SNS_LOGIN,
|
|
312
|
+
{
|
|
313
|
+
method: "POST",
|
|
314
|
+
body: {
|
|
315
|
+
email,
|
|
316
|
+
token: otpCode,
|
|
317
|
+
service: "email",
|
|
318
|
+
audience: ABC_AUDIENCE
|
|
319
|
+
},
|
|
320
|
+
skipAuth: true
|
|
321
|
+
}
|
|
322
|
+
);
|
|
323
|
+
if (response.status === "success" && response.data) {
|
|
324
|
+
this.accessToken = response.data.accessToken;
|
|
325
|
+
this.refreshToken = response.data.refreshToken;
|
|
326
|
+
this.expiresAt = calculateExpiryTimestamp(response.data.expiresIn);
|
|
327
|
+
console.log(
|
|
328
|
+
"[AbcWaasClient] \u2705 OTP login successful, tokens stored in memory (not persisted yet)"
|
|
329
|
+
);
|
|
330
|
+
return response.data;
|
|
331
|
+
}
|
|
332
|
+
throw createAbcError(
|
|
333
|
+
"INVALID_CREDENTIALS" /* INVALID_CREDENTIALS */,
|
|
334
|
+
"OTP login failed",
|
|
335
|
+
response
|
|
336
|
+
);
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Login with social provider
|
|
340
|
+
* NOTE: Tokens are stored in memory only. Call persistTokens() after PIN verification to save to localStorage.
|
|
341
|
+
*/
|
|
342
|
+
async loginWithSocial(provider, token, email) {
|
|
343
|
+
const response = await this.request(
|
|
344
|
+
ABC_ENDPOINTS.SNS_LOGIN,
|
|
345
|
+
{
|
|
346
|
+
method: "POST",
|
|
347
|
+
body: {
|
|
348
|
+
token,
|
|
349
|
+
service: provider,
|
|
350
|
+
audience: ABC_AUDIENCE,
|
|
351
|
+
email
|
|
352
|
+
},
|
|
353
|
+
skipAuth: true
|
|
354
|
+
}
|
|
355
|
+
);
|
|
356
|
+
if (response.status === "success" && response.data) {
|
|
357
|
+
this.accessToken = response.data.accessToken;
|
|
358
|
+
this.refreshToken = response.data.refreshToken;
|
|
359
|
+
this.expiresAt = calculateExpiryTimestamp(response.data.expiresIn);
|
|
360
|
+
console.log(
|
|
361
|
+
"[AbcWaasClient] \u2705 Social login successful, tokens stored in memory (not persisted yet)"
|
|
362
|
+
);
|
|
363
|
+
return response.data;
|
|
364
|
+
}
|
|
365
|
+
throw createAbcError(
|
|
366
|
+
"INVALID_CREDENTIALS" /* INVALID_CREDENTIALS */,
|
|
367
|
+
"Social login failed",
|
|
368
|
+
response
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Refresh access token using refresh token (public wrapper)
|
|
373
|
+
*/
|
|
374
|
+
async refreshTokens(refreshTokenValue) {
|
|
375
|
+
const oldRefreshToken = this.refreshToken;
|
|
376
|
+
this.refreshToken = refreshTokenValue;
|
|
377
|
+
try {
|
|
378
|
+
await this.refreshAccessToken();
|
|
379
|
+
return {
|
|
380
|
+
accessToken: this.accessToken,
|
|
381
|
+
refreshToken: this.refreshToken,
|
|
382
|
+
expiresIn: Math.floor((this.expiresAt - Date.now()) / 1e3)
|
|
383
|
+
};
|
|
384
|
+
} catch (error) {
|
|
385
|
+
this.refreshToken = oldRefreshToken;
|
|
386
|
+
throw error;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Request OTP code for email
|
|
391
|
+
*/
|
|
392
|
+
async requestOtpCode(email) {
|
|
393
|
+
const response = await this.request(
|
|
394
|
+
ABC_ENDPOINTS.SEND_OTP,
|
|
395
|
+
{
|
|
396
|
+
method: "POST",
|
|
397
|
+
body: { email },
|
|
398
|
+
skipAuth: true
|
|
399
|
+
}
|
|
400
|
+
);
|
|
401
|
+
if (response.status === "success" && response.data) {
|
|
402
|
+
return response.data;
|
|
403
|
+
}
|
|
404
|
+
throw createAbcError(
|
|
405
|
+
"UNKNOWN_ERROR" /* UNKNOWN_ERROR */,
|
|
406
|
+
"Failed to request OTP",
|
|
407
|
+
response
|
|
408
|
+
);
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Verify OTP code
|
|
412
|
+
*/
|
|
413
|
+
async verifyOtpCode(email, code) {
|
|
414
|
+
const response = await this.request(ABC_ENDPOINTS.VERIFY_OTP, {
|
|
415
|
+
method: "POST",
|
|
416
|
+
body: { email, code },
|
|
417
|
+
skipAuth: true
|
|
418
|
+
});
|
|
419
|
+
return response.status === "success";
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Check if email already exists
|
|
423
|
+
* Reference: tg-wallet-frontend src/features/user/api/index.ts:63-69
|
|
424
|
+
*/
|
|
425
|
+
async emailCheck(email) {
|
|
426
|
+
const result = await this.requestWalletAuth({
|
|
427
|
+
action: "email.check",
|
|
428
|
+
email
|
|
429
|
+
});
|
|
430
|
+
return result?.data || result;
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Send OTP code to email for signup
|
|
434
|
+
* Reference: tg-wallet-frontend src/features/user/api/index.ts:105-110
|
|
435
|
+
* Note: Uses ABC WaaS endpoint, not Talken API
|
|
436
|
+
*/
|
|
437
|
+
async sendOtpCode(email) {
|
|
438
|
+
const result = await this.requestWalletAuth({
|
|
439
|
+
action: "otp.send",
|
|
440
|
+
email
|
|
441
|
+
});
|
|
442
|
+
return result?.data || result;
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Verify OTP code for signup
|
|
446
|
+
* Reference: tg-wallet-frontend src/features/user/api/index.ts:112-123
|
|
447
|
+
* Note: Uses ABC WaaS endpoint, not Talken API
|
|
448
|
+
*/
|
|
449
|
+
async verifyOtpCodeSignup(email, code) {
|
|
450
|
+
const result = await this.requestWalletAuth({
|
|
451
|
+
action: "otp.verify",
|
|
452
|
+
email,
|
|
453
|
+
otpCode: code
|
|
454
|
+
});
|
|
455
|
+
return result?.data || result;
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* SNS (Social) Login via Google/Apple/Kakao
|
|
459
|
+
* Reference: tg-wallet-frontend src/features/user/api/index.ts:43-51
|
|
460
|
+
* Note: Uses Talken API server, not ABC WaaS
|
|
461
|
+
*/
|
|
462
|
+
async snsLogin(params) {
|
|
463
|
+
try {
|
|
464
|
+
const result = await this.requestWalletAuth({
|
|
465
|
+
action: "login",
|
|
466
|
+
method: "sns",
|
|
467
|
+
token: params.token,
|
|
468
|
+
service: params.service,
|
|
469
|
+
audience: params.audience
|
|
470
|
+
});
|
|
471
|
+
const data = result?.data || {};
|
|
472
|
+
if (!data.access_token) {
|
|
473
|
+
throw createAbcError(
|
|
474
|
+
"INVALID_CREDENTIALS" /* INVALID_CREDENTIALS */,
|
|
475
|
+
"SNS login failed: Invalid response from server",
|
|
476
|
+
{ service: params.service, response: data }
|
|
477
|
+
);
|
|
478
|
+
}
|
|
479
|
+
console.log("[AbcWaasClient] \u2705 SNS login successful");
|
|
480
|
+
return {
|
|
481
|
+
uid: "",
|
|
482
|
+
// Will be fetched later via info() API
|
|
483
|
+
email: params.email,
|
|
484
|
+
access_token: data.access_token,
|
|
485
|
+
refresh_token: data.refresh_token,
|
|
486
|
+
user_type: "existing"
|
|
487
|
+
// Default to existing, will be determined later
|
|
488
|
+
};
|
|
489
|
+
} catch (error) {
|
|
490
|
+
if (error.name === "AbortError") {
|
|
491
|
+
throw createAbcError(
|
|
492
|
+
"NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
493
|
+
"SNS login request timeout",
|
|
494
|
+
error
|
|
495
|
+
);
|
|
496
|
+
}
|
|
497
|
+
throw error;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Register new user
|
|
502
|
+
* Reference: tg-wallet-frontend src/features/user/api/index.ts:71-78
|
|
503
|
+
* Note: Uses Talken API server, not ABC WaaS
|
|
504
|
+
*/
|
|
505
|
+
async registerUser(params) {
|
|
506
|
+
const result = await this.requestWalletAuth({
|
|
507
|
+
action: "register",
|
|
508
|
+
email: params.username,
|
|
509
|
+
otpCode: params.emailCode,
|
|
510
|
+
password: params.password,
|
|
511
|
+
name: params.name
|
|
512
|
+
});
|
|
513
|
+
return result?.data || result;
|
|
514
|
+
}
|
|
515
|
+
/**
|
|
516
|
+
* Register new SNS user (email-based registration with OTP)
|
|
517
|
+
* Reference: tg-wallet-frontend src/features/user/api/index.ts:80-87
|
|
518
|
+
* Note: Uses Talken API server, not ABC WaaS
|
|
519
|
+
*/
|
|
520
|
+
async registerSnsUser(params) {
|
|
521
|
+
const talkenApiUrl = this.getTalkenApiUrl();
|
|
522
|
+
const response = await fetch(`${talkenApiUrl}/auth/signup`, {
|
|
523
|
+
method: "POST",
|
|
524
|
+
headers: {
|
|
525
|
+
...DEFAULT_HEADERS
|
|
526
|
+
},
|
|
527
|
+
credentials: "include",
|
|
528
|
+
body: new URLSearchParams(params).toString()
|
|
529
|
+
});
|
|
530
|
+
const text = await response.text();
|
|
531
|
+
const data = text ? JSON.parse(text) : { status: "success" };
|
|
532
|
+
if (!response.ok) {
|
|
533
|
+
throw parseApiError({
|
|
534
|
+
response: {
|
|
535
|
+
status: response.status,
|
|
536
|
+
data
|
|
537
|
+
}
|
|
538
|
+
});
|
|
539
|
+
}
|
|
540
|
+
return data;
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* Reset/Set password for existing user
|
|
544
|
+
* Reference: tg-wallet-frontend src/features/user/api/index.ts:89-95
|
|
545
|
+
* Note: Uses Talken API server, not ABC WaaS
|
|
546
|
+
*/
|
|
547
|
+
async resetPassword(params) {
|
|
548
|
+
const result = await this.requestWalletAuth({
|
|
549
|
+
action: "password.reset",
|
|
550
|
+
email: params.username,
|
|
551
|
+
newPassword: params.password,
|
|
552
|
+
emailCode: params.emailCode
|
|
553
|
+
});
|
|
554
|
+
return result?.data || result;
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* Generate or recover wallet
|
|
558
|
+
*/
|
|
559
|
+
async generateOrRecoverWallet(params) {
|
|
560
|
+
const response = await this.request(
|
|
561
|
+
// Use 'any' to get raw API response
|
|
562
|
+
ABC_ENDPOINTS.MPC_WALLETS,
|
|
563
|
+
// Use correct EVM endpoint, not WALLETS_V3 (Solana only)
|
|
564
|
+
{
|
|
565
|
+
method: "POST",
|
|
566
|
+
body: {
|
|
567
|
+
uid: params.uid,
|
|
568
|
+
pin: params.pin,
|
|
569
|
+
chainId: params.chainId,
|
|
570
|
+
network: params.network || "mainnet"
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
);
|
|
574
|
+
if (response.status === "success" && response.data) {
|
|
575
|
+
const raw = response.data;
|
|
576
|
+
return {
|
|
577
|
+
address: raw.sid || "",
|
|
578
|
+
// sid is the EVM address
|
|
579
|
+
keyId: raw.key_id || raw.keyId || raw.sid,
|
|
580
|
+
encryptedShare: raw.encrypted_share || raw.key_id || "",
|
|
581
|
+
uid: raw.uid,
|
|
582
|
+
sid: raw.sid,
|
|
583
|
+
pubkey: raw.pubkey || null
|
|
584
|
+
};
|
|
585
|
+
}
|
|
586
|
+
throw createAbcError(
|
|
587
|
+
"WALLET_NOT_FOUND" /* WALLET_NOT_FOUND */,
|
|
588
|
+
"Failed to generate wallet",
|
|
589
|
+
response
|
|
590
|
+
);
|
|
591
|
+
}
|
|
592
|
+
// v2 signing methods removed (signTransaction, signMessage, signTypedData, sendRawTransaction)
|
|
593
|
+
// All signing now routes through TalkenApiClient → talken-api backend.
|
|
594
|
+
/**
|
|
595
|
+
* @deprecated v2 signing removed. Use TalkenApiClient.evm.sendTransaction() instead.
|
|
596
|
+
*/
|
|
597
|
+
async signTransaction(_params) {
|
|
598
|
+
throw createAbcError(
|
|
599
|
+
"SIGNATURE_FAILED" /* SIGNATURE_FAILED */,
|
|
600
|
+
"v2 signing removed. Use TalkenApiClient.evm.sendTransaction() instead."
|
|
601
|
+
);
|
|
602
|
+
}
|
|
603
|
+
/**
|
|
604
|
+
* @deprecated v2 signing removed. Use TalkenApiClient.evm.personalSign() instead.
|
|
605
|
+
*/
|
|
606
|
+
async signMessage(_params) {
|
|
607
|
+
throw createAbcError(
|
|
608
|
+
"SIGNATURE_FAILED" /* SIGNATURE_FAILED */,
|
|
609
|
+
"v2 signing removed. Use TalkenApiClient.evm.personalSign() instead."
|
|
610
|
+
);
|
|
611
|
+
}
|
|
612
|
+
/**
|
|
613
|
+
* @deprecated v2 signing removed. Use TalkenApiClient.evm.signTypedData() instead.
|
|
614
|
+
*/
|
|
615
|
+
async signTypedData(_params) {
|
|
616
|
+
throw createAbcError(
|
|
617
|
+
"SIGNATURE_FAILED" /* SIGNATURE_FAILED */,
|
|
618
|
+
"v2 signing removed. Use TalkenApiClient.evm.signTypedData() instead."
|
|
619
|
+
);
|
|
620
|
+
}
|
|
621
|
+
/**
|
|
622
|
+
* @deprecated v2 sendRawTransaction removed. Use TalkenApiClient.evm.sendRawTransaction() instead.
|
|
623
|
+
*/
|
|
624
|
+
async sendRawTransaction(_chainId, _signedTransaction) {
|
|
625
|
+
throw createAbcError(
|
|
626
|
+
"NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
627
|
+
"v2 sendRawTransaction removed. Use TalkenApiClient.evm.sendRawTransaction() instead."
|
|
628
|
+
);
|
|
629
|
+
}
|
|
630
|
+
/**
|
|
631
|
+
* Estimate gas for EIP-1559 transaction
|
|
632
|
+
* Routes through TalkenApiClient (talken-api proxy)
|
|
633
|
+
*/
|
|
634
|
+
async estimateGas(params) {
|
|
635
|
+
const network = getNetworkName(params.chainId);
|
|
636
|
+
const api = getTalkenApiClient();
|
|
637
|
+
if (!api) {
|
|
638
|
+
throw createAbcError(
|
|
639
|
+
"NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
640
|
+
"TalkenApiClient not initialized"
|
|
641
|
+
);
|
|
642
|
+
}
|
|
643
|
+
try {
|
|
644
|
+
const result = await api.evm.estimateGas({
|
|
645
|
+
network,
|
|
646
|
+
from: params.from || "",
|
|
647
|
+
to: params.to,
|
|
648
|
+
value: params.value,
|
|
649
|
+
data: params.data
|
|
650
|
+
});
|
|
651
|
+
if (result.result) {
|
|
652
|
+
return result.result;
|
|
653
|
+
}
|
|
654
|
+
throw createAbcError(
|
|
655
|
+
"NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
656
|
+
"No result in gas estimate response"
|
|
657
|
+
);
|
|
658
|
+
} catch (error) {
|
|
659
|
+
if (error?.code === "NETWORK_ERROR" /* NETWORK_ERROR */) {
|
|
660
|
+
throw error;
|
|
661
|
+
}
|
|
662
|
+
throw createAbcError(
|
|
663
|
+
"NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
664
|
+
error.message || "Failed to estimate gas"
|
|
665
|
+
);
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
/**
|
|
669
|
+
* Get transaction count (nonce) via TalkenApiClient
|
|
670
|
+
*/
|
|
671
|
+
async getTransactionCount(params) {
|
|
672
|
+
const network = getNetworkName(params.chainId);
|
|
673
|
+
const api = getTalkenApiClient();
|
|
674
|
+
if (!api) {
|
|
675
|
+
throw createAbcError(
|
|
676
|
+
"NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
677
|
+
"TalkenApiClient not initialized"
|
|
678
|
+
);
|
|
679
|
+
}
|
|
680
|
+
try {
|
|
681
|
+
const res = await api.evm.getNonce(network, params.address);
|
|
682
|
+
if (res.result !== void 0) {
|
|
683
|
+
return typeof res.result === "number" ? `0x${res.result.toString(16)}` : res.result;
|
|
684
|
+
}
|
|
685
|
+
throw createAbcError(
|
|
686
|
+
"NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
687
|
+
"No result in nonce response"
|
|
688
|
+
);
|
|
689
|
+
} catch (error) {
|
|
690
|
+
if (error?.code === "NETWORK_ERROR" /* NETWORK_ERROR */) {
|
|
691
|
+
throw error;
|
|
692
|
+
}
|
|
693
|
+
throw createAbcError(
|
|
694
|
+
"NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
695
|
+
error.message || "Failed to get transaction count"
|
|
696
|
+
);
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
/**
|
|
700
|
+
* Get wallet info
|
|
701
|
+
*/
|
|
702
|
+
async getWalletInfo(uid) {
|
|
703
|
+
const response = await this.request(ABC_ENDPOINTS.INFO, {
|
|
704
|
+
method: "POST",
|
|
705
|
+
body: { uid }
|
|
706
|
+
});
|
|
707
|
+
if (response.status === "success") {
|
|
708
|
+
return response.data;
|
|
709
|
+
}
|
|
710
|
+
throw createAbcError(
|
|
711
|
+
"WALLET_NOT_FOUND" /* WALLET_NOT_FOUND */,
|
|
712
|
+
"Failed to get wallet info",
|
|
713
|
+
response
|
|
714
|
+
);
|
|
715
|
+
}
|
|
716
|
+
/**
|
|
717
|
+
* Logout (clear tokens)
|
|
718
|
+
*/
|
|
719
|
+
async logout() {
|
|
720
|
+
this.clearTokens();
|
|
721
|
+
}
|
|
722
|
+
/**
|
|
723
|
+
* Check if user is authenticated
|
|
724
|
+
*/
|
|
725
|
+
isAuthenticated() {
|
|
726
|
+
return !!this.accessToken && !this.isTokenExpired();
|
|
727
|
+
}
|
|
728
|
+
/**
|
|
729
|
+
* Set tokens in client instance (useful when restoring from storage or state)
|
|
730
|
+
* Call this before persistTokens() if you need to set tokens from external source
|
|
731
|
+
*/
|
|
732
|
+
setTokens(accessToken, refreshToken, expiresAt) {
|
|
733
|
+
this.accessToken = accessToken;
|
|
734
|
+
this.refreshToken = refreshToken;
|
|
735
|
+
this.expiresAt = expiresAt;
|
|
736
|
+
}
|
|
737
|
+
/**
|
|
738
|
+
* Persist tokens to localStorage
|
|
739
|
+
* Call this after PIN verification is complete
|
|
740
|
+
*
|
|
741
|
+
* SECURITY NOTE: This should only be called after full authentication (password + PIN)
|
|
742
|
+
* to ensure tokens are only persisted after the user has proven ownership of both credentials.
|
|
743
|
+
*/
|
|
744
|
+
persistTokens() {
|
|
745
|
+
if (!this.accessToken || !this.refreshToken || !this.expiresAt) {
|
|
746
|
+
console.warn(
|
|
747
|
+
"[AbcWaasClient] \u26A0\uFE0F No tokens to persist - ensure login was successful first"
|
|
748
|
+
);
|
|
749
|
+
return;
|
|
750
|
+
}
|
|
751
|
+
console.log(
|
|
752
|
+
"[AbcWaasClient] \u{1F4BE} Persisting tokens to localStorage after PIN verification"
|
|
753
|
+
);
|
|
754
|
+
saveToStorage("access_token" /* ACCESS_TOKEN */, this.accessToken);
|
|
755
|
+
saveToStorage("refresh_token" /* REFRESH_TOKEN */, this.refreshToken);
|
|
756
|
+
saveToStorage("expires_at" /* EXPIRES_AT */, this.expiresAt);
|
|
757
|
+
}
|
|
758
|
+
// ==========================================================================
|
|
759
|
+
// Solana Methods
|
|
760
|
+
// ==========================================================================
|
|
761
|
+
/**
|
|
762
|
+
* Generate or recover Solana wallet (Ed25519)
|
|
763
|
+
* Reference: SigningService.ts:56-72, wallet/api/index.ts:56-72
|
|
764
|
+
*/
|
|
765
|
+
async generateSolanaWallet(pin, isRecover = false) {
|
|
766
|
+
const api = getTalkenApiClient();
|
|
767
|
+
if (!api) {
|
|
768
|
+
throw createAbcError(
|
|
769
|
+
"NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
770
|
+
"TalkenApiClient not initialized"
|
|
771
|
+
);
|
|
772
|
+
}
|
|
773
|
+
const response = isRecover ? await api.wallet.recover(pin) : await api.wallet.generate(pin);
|
|
774
|
+
if (!response.solana) {
|
|
775
|
+
throw createAbcError(
|
|
776
|
+
"WALLET_NOT_FOUND" /* WALLET_NOT_FOUND */,
|
|
777
|
+
`Solana wallet not returned from ${isRecover ? "recovery" : "generation"}`
|
|
778
|
+
);
|
|
779
|
+
}
|
|
780
|
+
return response.solana;
|
|
781
|
+
}
|
|
782
|
+
/**
|
|
783
|
+
* Get Solana address from Ed25519 public key
|
|
784
|
+
* Reference: wallet/api/index.ts:74-82
|
|
785
|
+
*/
|
|
786
|
+
async getSolanaAddress(_publicKey, _network) {
|
|
787
|
+
const api = getTalkenApiClient();
|
|
788
|
+
if (!api) {
|
|
789
|
+
throw createAbcError(
|
|
790
|
+
"NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
791
|
+
"TalkenApiClient not initialized"
|
|
792
|
+
);
|
|
793
|
+
}
|
|
794
|
+
const addresses = await api.wallet.getAddresses();
|
|
795
|
+
if (!addresses.solana) {
|
|
796
|
+
throw createAbcError(
|
|
797
|
+
"NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
798
|
+
"Solana address not available"
|
|
799
|
+
);
|
|
800
|
+
}
|
|
801
|
+
return addresses.solana;
|
|
802
|
+
}
|
|
803
|
+
/**
|
|
804
|
+
* Sign Solana transaction with Ed25519 (via talken-api proxy)
|
|
805
|
+
*/
|
|
806
|
+
async signSolanaTransaction(params) {
|
|
807
|
+
const api = getTalkenApiClient();
|
|
808
|
+
if (!api) {
|
|
809
|
+
throw createAbcError(
|
|
810
|
+
"NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
811
|
+
"TalkenApiClient not initialized"
|
|
812
|
+
);
|
|
813
|
+
}
|
|
814
|
+
const result = await api.solana.sign({
|
|
815
|
+
message: params.message,
|
|
816
|
+
pin: params.pin,
|
|
817
|
+
keyId: params.keyId,
|
|
818
|
+
encryptedShare: params.encryptedShare,
|
|
819
|
+
secretStore: params.secretStore,
|
|
820
|
+
network: params.network
|
|
821
|
+
});
|
|
822
|
+
if (!result.signature) {
|
|
823
|
+
throw createAbcError(
|
|
824
|
+
"SIGNATURE_FAILED" /* SIGNATURE_FAILED */,
|
|
825
|
+
"Failed to sign Solana transaction"
|
|
826
|
+
);
|
|
827
|
+
}
|
|
828
|
+
return { signature: result.signature };
|
|
829
|
+
}
|
|
830
|
+
/**
|
|
831
|
+
* Sign Solana message with Ed25519 (via talken-api proxy)
|
|
832
|
+
*/
|
|
833
|
+
async signSolanaMessage(params) {
|
|
834
|
+
const api = getTalkenApiClient();
|
|
835
|
+
if (!api) {
|
|
836
|
+
throw createAbcError(
|
|
837
|
+
"NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
838
|
+
"TalkenApiClient not initialized"
|
|
839
|
+
);
|
|
840
|
+
}
|
|
841
|
+
const result = await api.solana.sign({
|
|
842
|
+
message: params.message,
|
|
843
|
+
keyId: params.keyId,
|
|
844
|
+
encryptedShare: params.encryptedShare,
|
|
845
|
+
secretStore: params.secretStore,
|
|
846
|
+
network: params.network
|
|
847
|
+
});
|
|
848
|
+
if (!result.signature) {
|
|
849
|
+
throw createAbcError(
|
|
850
|
+
"SIGNATURE_FAILED" /* SIGNATURE_FAILED */,
|
|
851
|
+
"Failed to sign Solana message"
|
|
852
|
+
);
|
|
853
|
+
}
|
|
854
|
+
return { signature: result.signature };
|
|
855
|
+
}
|
|
856
|
+
/**
|
|
857
|
+
* Send Solana transaction (via talken-api proxy)
|
|
858
|
+
* @deprecated Use TalkenApiClient.solana.transfer() for integrated flow
|
|
859
|
+
*/
|
|
860
|
+
async sendSolanaTransaction(_params) {
|
|
861
|
+
throw createAbcError(
|
|
862
|
+
"NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
863
|
+
"sendSolanaTransaction is deprecated. Use TalkenApiClient.solana.transfer() instead."
|
|
864
|
+
);
|
|
865
|
+
}
|
|
866
|
+
};
|
|
867
|
+
function createAbcWaasClient(config) {
|
|
868
|
+
return new AbcWaasClient(config);
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
export {
|
|
872
|
+
AbcWaasClient,
|
|
873
|
+
createAbcWaasClient
|
|
874
|
+
};
|