@talken/talkenkit 2.4.15 → 2.4.17

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.
Files changed (234) hide show
  1. package/dist/abcWallet-54KUGWUZ.js +192 -0
  2. package/dist/abcWallet-KZHOADBJ.js +192 -0
  3. package/dist/abcWallet-NZAVB4PI.js +190 -0
  4. package/dist/chunk-5X3ROW3U.js +8777 -0
  5. package/dist/chunk-DKA3NVFM.js +8497 -0
  6. package/dist/chunk-QNZ5HSPM.js +8339 -0
  7. package/dist/chunk-VE53ZNZV.js +331 -0
  8. package/dist/components/ConfirmationModal/ApproveSection.css.d.ts +16 -0
  9. package/dist/components/ConfirmationModal/ApproveSection.d.ts +8 -0
  10. package/dist/components/ConfirmationModal/NFTPlaceholder.css.d.ts +7 -0
  11. package/dist/components/ConfirmationModal/NFTPlaceholder.d.ts +8 -0
  12. package/dist/components/ConfirmationModal/NftApprovalSection.css.d.ts +10 -0
  13. package/dist/components/ConfirmationModal/NftApprovalSection.d.ts +7 -0
  14. package/dist/components/ConfirmationModal/SignConfirmationModal.css.d.ts +35 -0
  15. package/dist/components/ConfirmationModal/SignConfirmationModal.d.ts +17 -0
  16. package/dist/components/ConfirmationModal/SwapSection.css.d.ts +17 -0
  17. package/dist/components/ConfirmationModal/SwapSection.d.ts +7 -0
  18. package/dist/components/ConfirmationModal/TransactionConfirmationModal.css.d.ts +49 -0
  19. package/dist/components/ConfirmationModal/TransactionConfirmationModal.d.ts +12 -0
  20. package/dist/components/ConfirmationModal/TransferSection.css.d.ts +17 -0
  21. package/dist/components/ConfirmationModal/TransferSection.d.ts +7 -0
  22. package/dist/components/ConfirmationModal/commonStyles.css.d.ts +37 -0
  23. package/dist/components/ConfirmationModal/constants.d.ts +16 -0
  24. package/dist/components/ConfirmationModal/index.d.ts +9 -0
  25. package/dist/components/ConfirmationModal/modalTheme.css.d.ts +20 -0
  26. package/dist/components/ConfirmationModal/transactionUIRegistry.d.ts +134 -0
  27. package/dist/components/ConfirmationModal/utils.d.ts +37 -0
  28. package/dist/components/ConnectOptions/AbcWaasAuth/AbcWaasAuthSections.css.d.ts +1 -0
  29. package/dist/components/ConnectOptions/AbcWaasAuth/AbcWaasAuthSections.d.ts +1 -1
  30. package/dist/components/ConnectOptions/AbcWaasAuth/hooks/useAbcWaasAuth.d.ts +2 -25
  31. package/dist/components/ConnectOptions/AbcWaasAuth/hooks/useAbcWaasSocial.d.ts +1 -47
  32. package/dist/components/ConnectOptions/PinAuth/hooks/useWalletGeneration.d.ts +4 -21
  33. package/dist/components/GasFeeModal/GasFeeEditModal.css.d.ts +32 -0
  34. package/dist/components/GasFeeModal/GasFeeEditModal.d.ts +21 -0
  35. package/dist/components/GasFeeModal/index.d.ts +3 -0
  36. package/dist/components/GasFeeModal/modalTheme.css.d.ts +19 -0
  37. package/dist/components/Icons/Close2.d.ts +7 -0
  38. package/dist/components/Icons/Copy2.d.ts +4 -0
  39. package/dist/components/Icons/Dropdown2.d.ts +4 -0
  40. package/dist/components/Icons/Edit.d.ts +4 -0
  41. package/dist/components/Icons/InfoCircle.d.ts +4 -0
  42. package/dist/components/Icons/Kakao.d.ts +2 -0
  43. package/dist/components/Icons/Minus.d.ts +4 -0
  44. package/dist/components/Icons/Plus.d.ts +4 -0
  45. package/dist/components/Icons/SettingsGear.d.ts +4 -0
  46. package/dist/components/Icons/SpeedHigh.d.ts +4 -0
  47. package/dist/components/Icons/SpeedLow.d.ts +4 -0
  48. package/dist/components/Icons/SpeedMedium.d.ts +4 -0
  49. package/dist/components/RainbowKitProvider/InternalPinProvider.d.ts +7 -9
  50. package/dist/components/RainbowKitProvider/RainbowKitConfigProvider.d.ts +1 -6
  51. package/dist/components/RainbowKitProvider/RainbowKitProvider.d.ts +7 -7
  52. package/dist/components/Toast/Toast.css.d.ts +2 -0
  53. package/dist/components/Toast/Toast.d.ts +6 -0
  54. package/dist/components/Toast/index.d.ts +4 -0
  55. package/dist/components/Toast/useToast.d.ts +10 -0
  56. package/dist/config/networks.d.ts +10 -0
  57. package/dist/css/sprinkles.css.d.ts +1 -1
  58. package/dist/hooks/useSolanaWallet.d.ts +5 -23
  59. package/dist/hooks/useTronWallet.d.ts +63 -0
  60. package/dist/index.css +1903 -236
  61. package/dist/index.d.ts +8 -3
  62. package/dist/index.js +7557 -3592
  63. package/dist/klipWallet-RD5Y4UEK.js +8 -0
  64. package/dist/providers/SignConfirmationProvider/SignConfirmationProvider.d.ts +22 -0
  65. package/dist/providers/SignConfirmationProvider/index.d.ts +6 -0
  66. package/dist/providers/SignConfirmationProvider/requestParsers.d.ts +24 -0
  67. package/dist/providers/SignConfirmationProvider/types.d.ts +91 -0
  68. package/dist/providers/SignConfirmationProvider/useApiClient.d.ts +15 -0
  69. package/dist/providers/SignConfirmationProvider/useTransactionResolver.d.ts +18 -0
  70. package/dist/secure-AEBFSVWE.js +8 -0
  71. package/dist/services/AbcAgenticWalletService.d.ts +111 -0
  72. package/dist/services/AbcAuthService.d.ts +26 -20
  73. package/dist/types/index.d.ts +3 -0
  74. package/dist/types/token.d.ts +82 -0
  75. package/dist/utils/abi/abiDecoder.d.ts +144 -0
  76. package/dist/utils/apiClientFactory.d.ts +21 -0
  77. package/dist/utils/blockies.d.ts +12 -0
  78. package/dist/utils/tokenMapper.d.ts +10 -0
  79. package/dist/wallets/walletConnectors/abcWallet/abcApi.d.ts +4 -1
  80. package/dist/wallets/walletConnectors/abcWallet/abcApi.js +7 -7
  81. package/dist/wallets/walletConnectors/abcWallet/abcBitcoinConnector.js +5 -5
  82. package/dist/wallets/walletConnectors/abcWallet/abcBitcoinProvider.d.ts +6 -8
  83. package/dist/wallets/walletConnectors/abcWallet/abcBitcoinProvider.js +1 -1
  84. package/dist/wallets/walletConnectors/abcWallet/abcConnector.js +9 -9
  85. package/dist/wallets/walletConnectors/abcWallet/abcProvider.d.ts +17 -6
  86. package/dist/wallets/walletConnectors/abcWallet/abcProvider.js +5 -4
  87. package/dist/wallets/walletConnectors/abcWallet/abcSolanaProvider.d.ts +11 -34
  88. package/dist/wallets/walletConnectors/abcWallet/abcSolanaProvider.js +1 -1
  89. package/dist/wallets/walletConnectors/abcWallet/abcSolanaWalletAdapter.d.ts +3 -11
  90. package/dist/wallets/walletConnectors/abcWallet/abcSolanaWalletAdapter.js +17 -80
  91. package/dist/wallets/walletConnectors/abcWallet/abcTronProvider.d.ts +112 -0
  92. package/dist/wallets/walletConnectors/abcWallet/abcTronProvider.js +11 -0
  93. package/dist/wallets/walletConnectors/abcWallet/abcWallet.d.ts +2 -0
  94. package/dist/wallets/walletConnectors/abcWallet/abcWallet.js +11 -10
  95. package/dist/wallets/walletConnectors/abcWallet/api/AuthApi.d.ts +9 -11
  96. package/dist/wallets/walletConnectors/abcWallet/api/AuthApi.js +6 -6
  97. package/dist/wallets/walletConnectors/abcWallet/api/BaseApiClient.d.ts +1 -1
  98. package/dist/wallets/walletConnectors/abcWallet/api/BaseApiClient.js +5 -5
  99. package/dist/wallets/walletConnectors/abcWallet/api/BitcoinApi.js +6 -6
  100. package/dist/wallets/walletConnectors/abcWallet/api/GasApi.d.ts +45 -0
  101. package/dist/wallets/walletConnectors/abcWallet/api/GasApi.js +12 -0
  102. package/dist/wallets/walletConnectors/abcWallet/api/SigningApi.js +7 -7
  103. package/dist/wallets/walletConnectors/abcWallet/api/SolanaApi.d.ts +9 -1
  104. package/dist/wallets/walletConnectors/abcWallet/api/SolanaApi.js +7 -7
  105. package/dist/wallets/walletConnectors/abcWallet/api/TalkenApiClient.d.ts +333 -0
  106. package/dist/wallets/walletConnectors/abcWallet/api/TalkenApiClient.js +11 -0
  107. package/dist/wallets/walletConnectors/abcWallet/api/TalkenApiSingleton.d.ts +18 -0
  108. package/dist/wallets/walletConnectors/abcWallet/api/TalkenApiSingleton.js +14 -0
  109. package/dist/wallets/walletConnectors/abcWallet/api/TransactionApi.d.ts +2 -2
  110. package/dist/wallets/walletConnectors/abcWallet/api/TransactionApi.js +7 -7
  111. package/dist/wallets/walletConnectors/abcWallet/api/TronApi.d.ts +102 -0
  112. package/dist/wallets/walletConnectors/abcWallet/api/TronApi.js +12 -0
  113. package/dist/wallets/walletConnectors/abcWallet/api/WalletApi.d.ts +4 -2
  114. package/dist/wallets/walletConnectors/abcWallet/api/WalletApi.js +7 -7
  115. package/dist/wallets/walletConnectors/abcWallet/api/WalletscanApi.d.ts +60 -0
  116. package/dist/wallets/walletConnectors/abcWallet/api/WalletscanApi.js +12 -0
  117. package/dist/wallets/walletConnectors/abcWallet/api/index.d.ts +24 -0
  118. package/dist/wallets/walletConnectors/abcWallet/api/index.js +35 -17
  119. package/dist/wallets/walletConnectors/abcWallet/constants.d.ts +39 -1
  120. package/dist/wallets/walletConnectors/abcWallet/constants.js +5 -1
  121. package/dist/wallets/walletConnectors/abcWallet/googleAuth.d.ts +6 -0
  122. package/dist/wallets/walletConnectors/abcWallet/googleAuth.js +37 -1
  123. package/dist/wallets/walletConnectors/abcWallet/index.d.ts +5 -3
  124. package/dist/wallets/walletConnectors/abcWallet/index.js +44 -31
  125. package/dist/wallets/walletConnectors/abcWallet/kakaoAuth.d.ts +27 -0
  126. package/dist/wallets/walletConnectors/abcWallet/kakaoAuth.js +290 -0
  127. package/dist/wallets/walletConnectors/abcWallet/networkConfig.d.ts +39 -3
  128. package/dist/wallets/walletConnectors/abcWallet/networkConfig.js +11 -3
  129. package/dist/wallets/walletConnectors/abcWallet/secure.js +2 -2
  130. package/dist/wallets/walletConnectors/abcWallet/sessionUtils.js +1 -1
  131. package/dist/wallets/walletConnectors/abcWallet/types.d.ts +369 -7
  132. package/dist/wallets/walletConnectors/abcWallet/types.js +5 -3
  133. package/dist/wallets/walletConnectors/abcWallet/utils.js +3 -3
  134. package/dist/wallets/walletConnectors/abcWallet/walletGeneration.d.ts +10 -19
  135. package/dist/wallets/walletConnectors/abcWallet/walletGeneration.js +2 -2
  136. package/dist/wallets/walletConnectors/berasigWallet/berasigWallet.js +2 -2
  137. package/dist/wallets/walletConnectors/bifrostWallet/bifrostWallet.js +2 -2
  138. package/dist/wallets/walletConnectors/binanceWallet/binanceWallet.js +2 -2
  139. package/dist/wallets/walletConnectors/bitgetWallet/bitgetWallet.js +2 -2
  140. package/dist/wallets/walletConnectors/bybitWallet/bybitWallet.js +2 -2
  141. package/dist/wallets/walletConnectors/chunk-25V3FW3O.js +282 -0
  142. package/dist/wallets/walletConnectors/chunk-27346T3J.js +134 -0
  143. package/dist/wallets/walletConnectors/chunk-5CNLMOB2.js +75 -0
  144. package/dist/wallets/walletConnectors/chunk-5K45TCAM.js +333 -0
  145. package/dist/wallets/walletConnectors/chunk-5VDSMZC4.js +286 -0
  146. package/dist/wallets/walletConnectors/chunk-5W7RBMPH.js +351 -0
  147. package/dist/wallets/walletConnectors/chunk-5XORKEWE.js +326 -0
  148. package/dist/wallets/walletConnectors/chunk-63WBO52A.js +77 -0
  149. package/dist/wallets/walletConnectors/chunk-7IRF225N.js +75 -0
  150. package/dist/wallets/walletConnectors/chunk-7QHCSJDN.js +726 -0
  151. package/dist/wallets/walletConnectors/chunk-A27H6PEU.js +739 -0
  152. package/dist/wallets/walletConnectors/chunk-A4WR3CFN.js +130 -0
  153. package/dist/wallets/walletConnectors/chunk-A6FUNQWF.js +572 -0
  154. package/dist/wallets/walletConnectors/chunk-AF4OCS7N.js +46 -0
  155. package/dist/wallets/walletConnectors/chunk-AFWBXEEC.js +66 -0
  156. package/dist/wallets/walletConnectors/chunk-AUGP2LJR.js +182 -0
  157. package/dist/wallets/walletConnectors/chunk-AWLDVQXC.js +317 -0
  158. package/dist/wallets/walletConnectors/chunk-BLEKTKBN.js +479 -0
  159. package/dist/wallets/walletConnectors/chunk-BVL6G5HI.js +1757 -0
  160. package/dist/wallets/walletConnectors/chunk-CMTGEHDI.js +485 -0
  161. package/dist/wallets/walletConnectors/chunk-D5EFTEOM.js +56 -0
  162. package/dist/wallets/walletConnectors/chunk-DM5NLSWD.js +346 -0
  163. package/dist/wallets/walletConnectors/chunk-EBGI4D2T.js +69 -0
  164. package/dist/wallets/walletConnectors/chunk-EEH2HMFG.js +47 -0
  165. package/dist/wallets/walletConnectors/chunk-F5JWDBKK.js +47 -0
  166. package/dist/wallets/walletConnectors/chunk-FN67MIIH.js +75 -0
  167. package/dist/wallets/walletConnectors/chunk-FWYVBX5F.js +75 -0
  168. package/dist/wallets/walletConnectors/chunk-GH6ZDY4K.js +58 -0
  169. package/dist/wallets/walletConnectors/chunk-GIJZMIBD.js +63 -0
  170. package/dist/wallets/walletConnectors/chunk-GO6OLTNF.js +479 -0
  171. package/dist/wallets/walletConnectors/chunk-HKXBK3NY.js +75 -0
  172. package/dist/wallets/walletConnectors/chunk-HMD2WWFQ.js +75 -0
  173. package/dist/wallets/walletConnectors/chunk-HO5Z2CTL.js +280 -0
  174. package/dist/wallets/walletConnectors/chunk-I3GFVK5O.js +151 -0
  175. package/dist/wallets/walletConnectors/chunk-IUHZ5ZCE.js +121 -0
  176. package/dist/wallets/walletConnectors/chunk-JODNZWWG.js +330 -0
  177. package/dist/wallets/walletConnectors/chunk-JTST3KMW.js +75 -0
  178. package/dist/wallets/walletConnectors/chunk-KH2L3ONV.js +1599 -0
  179. package/dist/wallets/walletConnectors/chunk-LHV22375.js +182 -0
  180. package/dist/wallets/walletConnectors/chunk-LZZE462U.js +315 -0
  181. package/dist/wallets/walletConnectors/chunk-MGCRUAHX.js +276 -0
  182. package/dist/wallets/walletConnectors/chunk-MURSKRMJ.js +63 -0
  183. package/dist/wallets/walletConnectors/chunk-NG7PSAPX.js +115 -0
  184. package/dist/wallets/walletConnectors/chunk-NHP6D6AH.js +204 -0
  185. package/dist/wallets/walletConnectors/chunk-O4AU63LK.js +181 -0
  186. package/dist/wallets/walletConnectors/chunk-OBS74J5N.js +221 -0
  187. package/dist/wallets/walletConnectors/chunk-ON4U54WO.js +115 -0
  188. package/dist/wallets/walletConnectors/chunk-PPYBE5TV.js +276 -0
  189. package/dist/wallets/walletConnectors/chunk-PWWSAM4G.js +309 -0
  190. package/dist/wallets/walletConnectors/chunk-QB5GDLRU.js +330 -0
  191. package/dist/wallets/walletConnectors/chunk-QMLG7MAP.js +107 -0
  192. package/dist/wallets/walletConnectors/chunk-RGIB7FFH.js +47 -0
  193. package/dist/wallets/walletConnectors/chunk-SHJBMDP4.js +278 -0
  194. package/dist/wallets/walletConnectors/chunk-SOBJYYIX.js +484 -0
  195. package/dist/wallets/walletConnectors/chunk-T66U3ADD.js +58 -0
  196. package/dist/wallets/walletConnectors/chunk-THCKLFSJ.js +75 -0
  197. package/dist/wallets/walletConnectors/chunk-TS466TDR.js +286 -0
  198. package/dist/wallets/walletConnectors/chunk-UJGFYQEV.js +459 -0
  199. package/dist/wallets/walletConnectors/chunk-UXNEBBUV.js +224 -0
  200. package/dist/wallets/walletConnectors/chunk-VRCNFVPM.js +276 -0
  201. package/dist/wallets/walletConnectors/chunk-WODNUC65.js +333 -0
  202. package/dist/wallets/walletConnectors/chunk-X6A2FSHK.js +484 -0
  203. package/dist/wallets/walletConnectors/chunk-XVRNEES5.js +1541 -0
  204. package/dist/wallets/walletConnectors/chunk-XWVM2Y5A.js +306 -0
  205. package/dist/wallets/walletConnectors/chunk-XXG7ABSJ.js +328 -0
  206. package/dist/wallets/walletConnectors/chunk-YJH4BHSB.js +254 -0
  207. package/dist/wallets/walletConnectors/chunk-YRDNIP2H.js +90 -0
  208. package/dist/wallets/walletConnectors/chunk-YTPAWPCA.js +156 -0
  209. package/dist/wallets/walletConnectors/chunk-ZCSHD7UG.js +562 -0
  210. package/dist/wallets/walletConnectors/chunk-ZZCZ3RJU.js +272 -0
  211. package/dist/wallets/walletConnectors/clvWallet/clvWallet.js +2 -2
  212. package/dist/wallets/walletConnectors/coin98Wallet/coin98Wallet.js +2 -2
  213. package/dist/wallets/walletConnectors/coreWallet/coreWallet.js +2 -2
  214. package/dist/wallets/walletConnectors/foxWallet/foxWallet.js +2 -2
  215. package/dist/wallets/walletConnectors/frontierWallet/frontierWallet.js +2 -2
  216. package/dist/wallets/walletConnectors/gateWallet/gateWallet.js +2 -2
  217. package/dist/wallets/walletConnectors/index.js +62 -61
  218. package/dist/wallets/walletConnectors/iopayWallet/iopayWallet.js +2 -2
  219. package/dist/wallets/walletConnectors/kaiaWallet/kaiaWallet.js +2 -2
  220. package/dist/wallets/walletConnectors/kaikasWallet/kaikasWallet.js +2 -2
  221. package/dist/wallets/walletConnectors/klipWallet/klipWallet.d.ts +3 -0
  222. package/dist/wallets/walletConnectors/klipWallet/klipWallet.js +8 -0
  223. package/dist/wallets/walletConnectors/klipWallet-PPTYYB5G.js +7 -0
  224. package/dist/wallets/walletConnectors/metaMaskWallet/metaMaskWallet.js +2 -2
  225. package/dist/wallets/walletConnectors/okxWallet/okxWallet.js +2 -2
  226. package/dist/wallets/walletConnectors/rainbowWallet/rainbowWallet.js +2 -2
  227. package/dist/wallets/walletConnectors/roninWallet/roninWallet.js +2 -2
  228. package/dist/wallets/walletConnectors/safepalWallet/safepalWallet.js +2 -2
  229. package/dist/wallets/walletConnectors/subWallet/subWallet.js +2 -2
  230. package/dist/wallets/walletConnectors/tokenPocketWallet/tokenPocketWallet.js +2 -2
  231. package/dist/wallets/walletConnectors/trustWallet/trustWallet.js +2 -2
  232. package/dist/wallets/walletConnectors/zealWallet/zealWallet.js +2 -2
  233. package/dist/wallets/walletConnectors/zerionWallet/zerionWallet.js +2 -2
  234. package/package.json +2 -1
@@ -0,0 +1,1541 @@
1
+ "use client";
2
+ import {
3
+ secure_default
4
+ } from "./chunk-NG7PSAPX.js";
5
+ import {
6
+ getSolanaNetwork
7
+ } from "./chunk-O4AU63LK.js";
8
+ import {
9
+ getNetworkName
10
+ } from "./chunk-7QHCSJDN.js";
11
+ import {
12
+ calculateExpiryTimestamp,
13
+ createAbcError,
14
+ isTokenExpired,
15
+ loadFromStorage,
16
+ parseApiError,
17
+ removeFromStorage,
18
+ saveToStorage
19
+ } from "./chunk-GO6OLTNF.js";
20
+ import {
21
+ ABC_AUDIENCE,
22
+ ABC_ENDPOINTS,
23
+ DEFAULT_HEADERS,
24
+ REQUEST_TIMEOUT
25
+ } from "./chunk-YJH4BHSB.js";
26
+
27
+ // src/wallets/walletConnectors/abcWallet/abcApi.ts
28
+ import { getTalkenApiClient } from "@talken/talkenkit";
29
+ import { parseGwei } from "viem";
30
+ import { getAddress } from "viem";
31
+ var AbcWaasClient = class {
32
+ constructor(config) {
33
+ this.accessToken = null;
34
+ this.refreshToken = null;
35
+ this.expiresAt = null;
36
+ this.isRefreshing = false;
37
+ this.refreshPromise = null;
38
+ this.talkenAuthPath = "/api/v1/wallet/auth";
39
+ this.config = config;
40
+ this.baseURL = config.waasUrl;
41
+ this.secure = new secure_default(this.baseURL);
42
+ this.loadTokens();
43
+ }
44
+ getTalkenApiUrl() {
45
+ return process.env.NEXT_PUBLIC_API_SERVER || "https://dev.walletapi.talken.io";
46
+ }
47
+ async requestWalletAuth(body) {
48
+ const response = await fetch(
49
+ `${this.getTalkenApiUrl()}${this.talkenAuthPath}`,
50
+ {
51
+ method: "POST",
52
+ headers: {
53
+ "Content-Type": "application/json",
54
+ Accept: "application/json"
55
+ },
56
+ credentials: "include",
57
+ body: JSON.stringify(body)
58
+ }
59
+ );
60
+ const text = await response.text();
61
+ const data = text ? JSON.parse(text) : {};
62
+ if (!response.ok) {
63
+ throw parseApiError({
64
+ response: {
65
+ status: response.status,
66
+ data
67
+ }
68
+ });
69
+ }
70
+ return data;
71
+ }
72
+ /**
73
+ * Load tokens from storage
74
+ */
75
+ loadTokens() {
76
+ this.accessToken = loadFromStorage("access_token" /* ACCESS_TOKEN */);
77
+ this.refreshToken = loadFromStorage("refresh_token" /* REFRESH_TOKEN */);
78
+ this.expiresAt = loadFromStorage("expires_at" /* EXPIRES_AT */);
79
+ }
80
+ /**
81
+ * Save tokens to storage
82
+ */
83
+ saveTokens(accessToken, refreshToken, expiresIn) {
84
+ this.accessToken = accessToken;
85
+ this.refreshToken = refreshToken;
86
+ this.expiresAt = calculateExpiryTimestamp(expiresIn);
87
+ saveToStorage("access_token" /* ACCESS_TOKEN */, accessToken);
88
+ saveToStorage("refresh_token" /* REFRESH_TOKEN */, refreshToken);
89
+ saveToStorage("expires_at" /* EXPIRES_AT */, this.expiresAt);
90
+ }
91
+ /**
92
+ * Clear tokens
93
+ */
94
+ clearTokens() {
95
+ this.accessToken = null;
96
+ this.refreshToken = null;
97
+ this.expiresAt = null;
98
+ removeFromStorage("access_token" /* ACCESS_TOKEN */);
99
+ removeFromStorage("refresh_token" /* REFRESH_TOKEN */);
100
+ removeFromStorage("expires_at" /* EXPIRES_AT */);
101
+ }
102
+ /**
103
+ * Check if access token is expired
104
+ */
105
+ isTokenExpired() {
106
+ return isTokenExpired(this.expiresAt);
107
+ }
108
+ /**
109
+ * Get current access token
110
+ */
111
+ getAccessToken() {
112
+ return this.accessToken;
113
+ }
114
+ /**
115
+ * Refresh access token
116
+ */
117
+ async refreshAccessToken() {
118
+ if (this.isRefreshing) {
119
+ if (this.refreshPromise) {
120
+ await this.refreshPromise;
121
+ }
122
+ return;
123
+ }
124
+ if (!this.refreshToken) {
125
+ throw createAbcError(
126
+ "TOKEN_EXPIRED" /* TOKEN_EXPIRED */,
127
+ "No refresh token available"
128
+ );
129
+ }
130
+ this.isRefreshing = true;
131
+ this.refreshPromise = (async () => {
132
+ try {
133
+ const isIframe = typeof window !== "undefined" && window.self !== window.top;
134
+ const response = await this.requestWalletAuth({
135
+ action: "token.refresh",
136
+ refreshToken: this.refreshToken || "",
137
+ isIframe
138
+ });
139
+ const data = response?.data || {};
140
+ if (response?.success && data.access_token) {
141
+ const expiresIn = data.expires_in || data.expire_in || 3600;
142
+ this.saveTokens(
143
+ data.access_token,
144
+ data.refresh_token || this.refreshToken,
145
+ // Keep old if not provided
146
+ expiresIn
147
+ );
148
+ } else {
149
+ throw createAbcError(
150
+ "TOKEN_EXPIRED" /* TOKEN_EXPIRED */,
151
+ "Failed to refresh token"
152
+ );
153
+ }
154
+ } finally {
155
+ this.isRefreshing = false;
156
+ this.refreshPromise = null;
157
+ }
158
+ })();
159
+ await this.refreshPromise;
160
+ }
161
+ /**
162
+ * Make HTTP request
163
+ */
164
+ async request(endpoint, options = {}) {
165
+ const {
166
+ method = "GET",
167
+ body,
168
+ headers = {},
169
+ skipAuth = false,
170
+ isRetry = false
171
+ } = options;
172
+ if (!skipAuth && this.isTokenExpired() && this.refreshToken) {
173
+ await this.refreshAccessToken();
174
+ }
175
+ const url = `${this.baseURL}${endpoint}`;
176
+ const requestHeaders = {
177
+ ...DEFAULT_HEADERS,
178
+ ...headers
179
+ };
180
+ if (!skipAuth && this.accessToken) {
181
+ requestHeaders.Authorization = `Bearer ${this.accessToken}`;
182
+ }
183
+ if (this.config.apiKey) {
184
+ requestHeaders["X-API-Key"] = this.config.apiKey;
185
+ }
186
+ try {
187
+ const controller = new AbortController();
188
+ const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT);
189
+ const requestBody = body ? new URLSearchParams(body).toString() : void 0;
190
+ const response = await fetch(url, {
191
+ method,
192
+ headers: requestHeaders,
193
+ body: requestBody,
194
+ signal: controller.signal
195
+ });
196
+ clearTimeout(timeoutId);
197
+ const text = await response.text();
198
+ let data;
199
+ if (text) {
200
+ try {
201
+ data = JSON.parse(text);
202
+ } catch (parseError) {
203
+ console.error("[AbcWaasClient] \u274C JSON parse error:", {
204
+ url,
205
+ method,
206
+ status: response.status,
207
+ responseText: text.substring(0, 200)
208
+ // Log first 200 chars
209
+ });
210
+ throw createAbcError(
211
+ "UNKNOWN_ERROR" /* UNKNOWN_ERROR */,
212
+ "Invalid JSON response from server",
213
+ { text, parseError }
214
+ );
215
+ }
216
+ } else {
217
+ console.log("[AbcWaasClient] \u2139\uFE0F Empty response received:", {
218
+ url,
219
+ method,
220
+ status: response.status
221
+ });
222
+ data = { status: "success" };
223
+ }
224
+ if (response.status === 401 && !skipAuth && this.refreshToken && !isRetry) {
225
+ try {
226
+ await this.refreshAccessToken();
227
+ return await this.request(endpoint, {
228
+ ...options,
229
+ isRetry: true
230
+ // Prevent infinite retry loop
231
+ });
232
+ } catch (refreshError) {
233
+ console.error("Token refresh failed:", refreshError);
234
+ throw parseApiError({
235
+ response: {
236
+ status: response.status,
237
+ data
238
+ }
239
+ });
240
+ }
241
+ }
242
+ if (!response.ok) {
243
+ console.error("[AbcWaasClient] \u274C API Error:", {
244
+ url,
245
+ method,
246
+ status: response.status,
247
+ statusText: response.statusText,
248
+ data
249
+ });
250
+ throw parseApiError({
251
+ response: {
252
+ status: response.status,
253
+ data
254
+ }
255
+ });
256
+ }
257
+ return data;
258
+ } catch (error) {
259
+ console.error("[AbcWaasClient] \u274C Request failed:", {
260
+ url,
261
+ method,
262
+ error: error.message,
263
+ errorName: error.name,
264
+ errorType: error.constructor.name,
265
+ stack: error.stack
266
+ });
267
+ if (error.name === "AbortError") {
268
+ throw createAbcError(
269
+ "NETWORK_ERROR" /* NETWORK_ERROR */,
270
+ "Request timeout",
271
+ error
272
+ );
273
+ }
274
+ if (error.code && error.message) {
275
+ throw error;
276
+ }
277
+ throw parseApiError(error);
278
+ }
279
+ }
280
+ /**
281
+ * Login with email and password
282
+ * NOTE: Tokens are stored in memory only. Call persistTokens() after PIN verification to save to localStorage.
283
+ */
284
+ async loginWithEmail(email, password) {
285
+ const response = await this.request(
286
+ ABC_ENDPOINTS.SNS_LOGIN,
287
+ {
288
+ method: "POST",
289
+ body: {
290
+ email,
291
+ token: password,
292
+ // Use password as token
293
+ service: "email",
294
+ audience: ABC_AUDIENCE
295
+ },
296
+ skipAuth: true
297
+ }
298
+ );
299
+ if (response.status === "success" && response.data) {
300
+ this.accessToken = response.data.accessToken;
301
+ this.refreshToken = response.data.refreshToken;
302
+ this.expiresAt = calculateExpiryTimestamp(response.data.expiresIn);
303
+ console.log(
304
+ "[AbcWaasClient] \u2705 Login successful, tokens stored in memory (not persisted yet)"
305
+ );
306
+ return response.data;
307
+ }
308
+ throw createAbcError(
309
+ "INVALID_CREDENTIALS" /* INVALID_CREDENTIALS */,
310
+ "Email login failed",
311
+ response
312
+ );
313
+ }
314
+ /**
315
+ * Login with email and OTP (for PIN recovery)
316
+ * NOTE: Tokens are stored in memory only. Call persistTokens() after PIN verification to save to localStorage.
317
+ */
318
+ async loginWithOtp(email, otpCode) {
319
+ const response = await this.request(
320
+ ABC_ENDPOINTS.SNS_LOGIN,
321
+ {
322
+ method: "POST",
323
+ body: {
324
+ email,
325
+ token: otpCode,
326
+ service: "email",
327
+ audience: ABC_AUDIENCE
328
+ },
329
+ skipAuth: true
330
+ }
331
+ );
332
+ if (response.status === "success" && response.data) {
333
+ this.accessToken = response.data.accessToken;
334
+ this.refreshToken = response.data.refreshToken;
335
+ this.expiresAt = calculateExpiryTimestamp(response.data.expiresIn);
336
+ console.log(
337
+ "[AbcWaasClient] \u2705 OTP login successful, tokens stored in memory (not persisted yet)"
338
+ );
339
+ return response.data;
340
+ }
341
+ throw createAbcError(
342
+ "INVALID_CREDENTIALS" /* INVALID_CREDENTIALS */,
343
+ "OTP login failed",
344
+ response
345
+ );
346
+ }
347
+ /**
348
+ * Login with social provider
349
+ * NOTE: Tokens are stored in memory only. Call persistTokens() after PIN verification to save to localStorage.
350
+ */
351
+ async loginWithSocial(provider, token, email) {
352
+ const response = await this.request(
353
+ ABC_ENDPOINTS.SNS_LOGIN,
354
+ {
355
+ method: "POST",
356
+ body: {
357
+ token,
358
+ service: provider,
359
+ audience: ABC_AUDIENCE,
360
+ email
361
+ },
362
+ skipAuth: true
363
+ }
364
+ );
365
+ if (response.status === "success" && response.data) {
366
+ this.accessToken = response.data.accessToken;
367
+ this.refreshToken = response.data.refreshToken;
368
+ this.expiresAt = calculateExpiryTimestamp(response.data.expiresIn);
369
+ console.log(
370
+ "[AbcWaasClient] \u2705 Social login successful, tokens stored in memory (not persisted yet)"
371
+ );
372
+ return response.data;
373
+ }
374
+ throw createAbcError(
375
+ "INVALID_CREDENTIALS" /* INVALID_CREDENTIALS */,
376
+ "Social login failed",
377
+ response
378
+ );
379
+ }
380
+ /**
381
+ * Refresh access token using refresh token (public wrapper)
382
+ */
383
+ async refreshTokens(refreshTokenValue) {
384
+ const oldRefreshToken = this.refreshToken;
385
+ this.refreshToken = refreshTokenValue;
386
+ try {
387
+ await this.refreshAccessToken();
388
+ return {
389
+ accessToken: this.accessToken,
390
+ refreshToken: this.refreshToken,
391
+ expiresIn: Math.floor((this.expiresAt - Date.now()) / 1e3)
392
+ };
393
+ } catch (error) {
394
+ this.refreshToken = oldRefreshToken;
395
+ throw error;
396
+ }
397
+ }
398
+ /**
399
+ * Request OTP code for email
400
+ */
401
+ async requestOtpCode(email) {
402
+ const response = await this.request(
403
+ ABC_ENDPOINTS.SEND_OTP,
404
+ {
405
+ method: "POST",
406
+ body: { email },
407
+ skipAuth: true
408
+ }
409
+ );
410
+ if (response.status === "success" && response.data) {
411
+ return response.data;
412
+ }
413
+ throw createAbcError(
414
+ "UNKNOWN_ERROR" /* UNKNOWN_ERROR */,
415
+ "Failed to request OTP",
416
+ response
417
+ );
418
+ }
419
+ /**
420
+ * Verify OTP code
421
+ */
422
+ async verifyOtpCode(email, code) {
423
+ const response = await this.request(ABC_ENDPOINTS.VERIFY_OTP, {
424
+ method: "POST",
425
+ body: { email, code },
426
+ skipAuth: true
427
+ });
428
+ return response.status === "success";
429
+ }
430
+ /**
431
+ * Check if email already exists
432
+ * Reference: tg-wallet-frontend src/features/user/api/index.ts:63-69
433
+ */
434
+ async emailCheck(email) {
435
+ const result = await this.requestWalletAuth({
436
+ action: "email.check",
437
+ email
438
+ });
439
+ return result?.data || result;
440
+ }
441
+ /**
442
+ * Send OTP code to email for signup
443
+ * Reference: tg-wallet-frontend src/features/user/api/index.ts:105-110
444
+ * Note: Uses ABC WaaS endpoint, not Talken API
445
+ */
446
+ async sendOtpCode(email) {
447
+ const result = await this.requestWalletAuth({
448
+ action: "otp.send",
449
+ email
450
+ });
451
+ return result?.data || result;
452
+ }
453
+ /**
454
+ * Verify OTP code for signup
455
+ * Reference: tg-wallet-frontend src/features/user/api/index.ts:112-123
456
+ * Note: Uses ABC WaaS endpoint, not Talken API
457
+ */
458
+ async verifyOtpCodeSignup(email, code) {
459
+ const result = await this.requestWalletAuth({
460
+ action: "otp.verify",
461
+ email,
462
+ otpCode: code
463
+ });
464
+ return result?.data || result;
465
+ }
466
+ /**
467
+ * SNS (Social) Login via Google/Apple/Kakao
468
+ * Reference: tg-wallet-frontend src/features/user/api/index.ts:43-51
469
+ * Note: Uses Talken API server, not ABC WaaS
470
+ */
471
+ async snsLogin(params) {
472
+ try {
473
+ const result = await this.requestWalletAuth({
474
+ action: "login",
475
+ method: "sns",
476
+ token: params.token,
477
+ service: params.service,
478
+ audience: params.audience
479
+ });
480
+ const data = result?.data || {};
481
+ if (!data.access_token) {
482
+ throw createAbcError(
483
+ "INVALID_CREDENTIALS" /* INVALID_CREDENTIALS */,
484
+ "SNS login failed: Invalid response from server",
485
+ { service: params.service, response: data }
486
+ );
487
+ }
488
+ console.log("[AbcWaasClient] \u2705 SNS login successful");
489
+ return {
490
+ uid: "",
491
+ // Will be fetched later via info() API
492
+ email: params.email,
493
+ access_token: data.access_token,
494
+ refresh_token: data.refresh_token,
495
+ user_type: "existing"
496
+ // Default to existing, will be determined later
497
+ };
498
+ } catch (error) {
499
+ if (error.name === "AbortError") {
500
+ throw createAbcError(
501
+ "NETWORK_ERROR" /* NETWORK_ERROR */,
502
+ "SNS login request timeout",
503
+ error
504
+ );
505
+ }
506
+ throw error;
507
+ }
508
+ }
509
+ /**
510
+ * Register new user
511
+ * Reference: tg-wallet-frontend src/features/user/api/index.ts:71-78
512
+ * Note: Uses Talken API server, not ABC WaaS
513
+ */
514
+ async registerUser(params) {
515
+ const result = await this.requestWalletAuth({
516
+ action: "register",
517
+ email: params.username,
518
+ otpCode: params.emailCode,
519
+ password: params.password,
520
+ name: params.name
521
+ });
522
+ return result?.data || result;
523
+ }
524
+ /**
525
+ * Register new SNS user (email-based registration with OTP)
526
+ * Reference: tg-wallet-frontend src/features/user/api/index.ts:80-87
527
+ * Note: Uses Talken API server, not ABC WaaS
528
+ */
529
+ async registerSnsUser(params) {
530
+ const talkenApiUrl = this.getTalkenApiUrl();
531
+ const response = await fetch(`${talkenApiUrl}/abc/snsAdduser`, {
532
+ method: "POST",
533
+ headers: {
534
+ ...DEFAULT_HEADERS
535
+ },
536
+ credentials: "include",
537
+ body: new URLSearchParams(params).toString()
538
+ });
539
+ const text = await response.text();
540
+ const data = text ? JSON.parse(text) : { status: "success" };
541
+ if (!response.ok) {
542
+ throw parseApiError({
543
+ response: {
544
+ status: response.status,
545
+ data
546
+ }
547
+ });
548
+ }
549
+ return data;
550
+ }
551
+ /**
552
+ * Reset/Set password for existing user
553
+ * Reference: tg-wallet-frontend src/features/user/api/index.ts:89-95
554
+ * Note: Uses Talken API server, not ABC WaaS
555
+ */
556
+ async resetPassword(params) {
557
+ const result = await this.requestWalletAuth({
558
+ action: "password.reset",
559
+ email: params.username,
560
+ newPassword: params.password,
561
+ emailCode: params.emailCode
562
+ });
563
+ return result?.data || result;
564
+ }
565
+ /**
566
+ * Generate or recover wallet
567
+ */
568
+ async generateOrRecoverWallet(params) {
569
+ const response = await this.request(
570
+ // Use 'any' to get raw API response
571
+ ABC_ENDPOINTS.MPC_WALLETS,
572
+ // Use correct EVM endpoint, not WALLETS_V3 (Solana only)
573
+ {
574
+ method: "POST",
575
+ body: {
576
+ uid: params.uid,
577
+ pin: params.pin,
578
+ chainId: params.chainId,
579
+ network: params.network || "mainnet"
580
+ }
581
+ }
582
+ );
583
+ if (response.status === "success" && response.data) {
584
+ const raw = response.data;
585
+ console.log("[AbcWaasClient] Raw wallet API response:", {
586
+ hasUid: !!raw.uid,
587
+ hasSid: !!raw.sid,
588
+ hasKeyId: !!raw.key_id,
589
+ hasWid: !!raw.wid,
590
+ hasPvencstr: !!raw.pvencstr,
591
+ hasEncryptDevicePassword: !!raw.encryptDevicePassword,
592
+ hasEncryptedShare: !!raw.encrypted_share,
593
+ hasPubkey: !!raw.pubkey,
594
+ allKeys: Object.keys(raw)
595
+ });
596
+ return {
597
+ address: raw.sid || "",
598
+ // FIX: sid is the EVM address
599
+ keyId: raw.key_id || raw.keyId || raw.sid,
600
+ encryptedShare: raw.encrypted_share || raw.key_id || "",
601
+ // Use key_id as fallback
602
+ uid: raw.uid,
603
+ sid: raw.sid,
604
+ wid: raw.wid,
605
+ // Preserve for Bitcoin signing
606
+ pvencstr: raw.pvencstr,
607
+ // Preserve for Bitcoin signing
608
+ encryptDevicePassword: raw.encryptDevicePassword,
609
+ // Preserve for Bitcoin signing
610
+ pubkey: raw.pubkey || null
611
+ };
612
+ }
613
+ throw createAbcError(
614
+ "WALLET_NOT_FOUND" /* WALLET_NOT_FOUND */,
615
+ "Failed to generate wallet",
616
+ response
617
+ );
618
+ }
619
+ /**
620
+ * Sign EVM transaction (EIP-1559)
621
+ * Based on ABC WaaS official documentation
622
+ */
623
+ async signTransaction(params) {
624
+ this.loadTokens();
625
+ const wallet = loadFromStorage("wallet" /* WALLET */);
626
+ if (!wallet) {
627
+ throw createAbcError(
628
+ "WALLET_NOT_FOUND" /* WALLET_NOT_FOUND */,
629
+ "Wallet information not found in storage"
630
+ );
631
+ }
632
+ const encryptedDevicePassword = await this.secure.getEncryptPlain(
633
+ wallet.encryptDevicePassword
634
+ );
635
+ const encryptedPvencstr = await this.secure.getEncryptPlain(
636
+ wallet.pvencstr
637
+ );
638
+ const encryptedWid = await this.secure.getEncryptPlain(wallet.wid);
639
+ const secureChannelId = await this.secure.getSecureChannelId();
640
+ const network = getNetworkName(params.chainId);
641
+ const tx = params.transaction;
642
+ if (!tx.maxFeePerGas || !tx.maxPriorityFeePerGas || !tx.gasLimit || !tx.gas) {
643
+ try {
644
+ const api = getTalkenApiClient();
645
+ if (api && (!tx.maxFeePerGas || !tx.maxPriorityFeePerGas)) {
646
+ try {
647
+ const gasData = await api.evm.getGasSuggested(network);
648
+ if (gasData.medium) {
649
+ if (!tx.maxFeePerGas) {
650
+ tx.maxFeePerGas = parseGwei(
651
+ gasData.medium.suggestedMaxFeePerGas
652
+ ).toString();
653
+ }
654
+ if (!tx.maxPriorityFeePerGas) {
655
+ tx.maxPriorityFeePerGas = parseGwei(
656
+ gasData.medium.suggestedMaxPriorityFeePerGas
657
+ ).toString();
658
+ }
659
+ }
660
+ } catch (gasError) {
661
+ console.warn("[AbcWaasClient] Failed to fetch gas fees:", gasError);
662
+ }
663
+ }
664
+ if (api && !tx.gasLimit && !tx.gas) {
665
+ try {
666
+ const estimateResult = await api.evm.estimateGas({
667
+ network,
668
+ from: tx.from || "",
669
+ to: tx.to || "0x",
670
+ value: tx.value,
671
+ data: tx.data && tx.data !== "0x" ? tx.data : void 0
672
+ });
673
+ if (estimateResult.result) {
674
+ tx.gasLimit = estimateResult.result;
675
+ } else {
676
+ tx.gasLimit = "0x2dc6c0";
677
+ }
678
+ } catch (estimateError) {
679
+ console.warn(
680
+ "[AbcWaasClient] Failed to estimate gas:",
681
+ estimateError
682
+ );
683
+ tx.gasLimit = "0x2dc6c0";
684
+ }
685
+ }
686
+ } catch (error) {
687
+ console.warn("[AbcWaasClient] Failed to fetch gas parameters:", error);
688
+ }
689
+ }
690
+ const bodyData = {
691
+ network,
692
+ encryptDevicePassword: encryptedDevicePassword,
693
+ pvencstr: encryptedPvencstr,
694
+ uid: wallet.uid,
695
+ wid: encryptedWid,
696
+ sid: getAddress(wallet.address),
697
+ // EIP-55 checksum format
698
+ // For contract deployment, 'to' is '0x' (ABC WaaS convention)
699
+ // Reference: talken-nft-drops/src/libs/abc-waas-provider/index.ts:800 - to: to ?? '0x'
700
+ to: tx.to === "0x" ? "0x" : getAddress(tx.to),
701
+ // Required by ABC WaaS API
702
+ // Always use EIP1559 type (ABC WaaS handles network-specific conversion)
703
+ type: "EIP1559",
704
+ // ourpubkey and ucpubkey are required by ABC WaaS (empty strings for now)
705
+ // Based on successful tg-wallet payload analysis
706
+ ourpubkey: "",
707
+ ucpubkey: ""
708
+ };
709
+ bodyData.from = getAddress(tx.from || wallet.address);
710
+ if (tx.value) {
711
+ let hexValue = tx.value.startsWith("0x") ? tx.value.slice(2) : tx.value;
712
+ if (hexValue.length % 2 !== 0) {
713
+ hexValue = `0${hexValue}`;
714
+ }
715
+ bodyData.value = `0x${hexValue}`;
716
+ } else {
717
+ bodyData.value = "0x0";
718
+ }
719
+ if (tx.gasLimit || tx.gas) {
720
+ const gasLimitValue = tx.gasLimit || tx.gas;
721
+ if (gasLimitValue.toString().startsWith("0x")) {
722
+ bodyData.gasLimit = gasLimitValue.toString();
723
+ } else {
724
+ bodyData.gasLimit = `0x${BigInt(gasLimitValue).toString(16)}`;
725
+ }
726
+ }
727
+ if (tx.maxFeePerGas) {
728
+ if (tx.maxFeePerGas.toString().startsWith("0x")) {
729
+ bodyData.maxFeePerGas = tx.maxFeePerGas.toString();
730
+ } else {
731
+ bodyData.maxFeePerGas = `0x${BigInt(tx.maxFeePerGas).toString(16)}`;
732
+ }
733
+ }
734
+ if (tx.maxPriorityFeePerGas) {
735
+ if (tx.maxPriorityFeePerGas.toString().startsWith("0x")) {
736
+ bodyData.maxPriorityFeePerGas = tx.maxPriorityFeePerGas.toString();
737
+ } else {
738
+ bodyData.maxPriorityFeePerGas = `0x${BigInt(tx.maxPriorityFeePerGas).toString(16)}`;
739
+ }
740
+ }
741
+ if (tx.gasPrice) {
742
+ if (tx.gasPrice.toString().startsWith("0x")) {
743
+ bodyData.gasPrice = tx.gasPrice.toString();
744
+ } else {
745
+ bodyData.gasPrice = `0x${BigInt(tx.gasPrice).toString(16)}`;
746
+ }
747
+ }
748
+ if (tx.data !== void 0 && tx.data !== null) {
749
+ bodyData.data = tx.data || "0x";
750
+ } else {
751
+ bodyData.data = "0x";
752
+ }
753
+ const bodyString = new URLSearchParams(bodyData).toString();
754
+ const url = `${this.baseURL}${ABC_ENDPOINTS.SIGN_TRANSACTION}`;
755
+ const response = await fetch(url, {
756
+ method: "POST",
757
+ headers: {
758
+ "Content-Type": "application/x-www-form-urlencoded",
759
+ "Secure-Channel": secureChannelId,
760
+ ...this.accessToken ? { Authorization: `Bearer ${this.accessToken}` } : {}
761
+ },
762
+ body: bodyString
763
+ });
764
+ const res = await response.json();
765
+ console.log("\u{1F4E1} ABC WaaS /sign response:", {
766
+ status: response.status,
767
+ ok: response.ok,
768
+ response: res
769
+ });
770
+ if (!response.ok) {
771
+ console.error("\u274C ABC WaaS API error details:", {
772
+ status: response.status,
773
+ statusText: response.statusText,
774
+ errorCode: res.code,
775
+ errorMessage: res.msg || res.message || res.detail,
776
+ fullResponse: res
777
+ });
778
+ }
779
+ if (response.status === 401 && this.refreshToken) {
780
+ try {
781
+ await this.refreshAccessToken();
782
+ const retryResponse = await fetch(url, {
783
+ method: "POST",
784
+ headers: {
785
+ "Content-Type": "application/x-www-form-urlencoded",
786
+ "Secure-Channel": secureChannelId,
787
+ ...this.accessToken ? { Authorization: `Bearer ${this.accessToken}` } : {}
788
+ },
789
+ body: bodyString
790
+ });
791
+ const retryRes = await retryResponse.json();
792
+ if (retryRes.serializedTx && retryRes.rawTx) {
793
+ return {
794
+ signature: retryRes.serializedTx,
795
+ txHash: retryRes.rawTx
796
+ };
797
+ }
798
+ throw createAbcError(
799
+ "SIGNATURE_FAILED" /* SIGNATURE_FAILED */,
800
+ "Failed to sign transaction after token refresh",
801
+ retryRes
802
+ );
803
+ } catch (refreshError) {
804
+ console.error("Token refresh failed in signTransaction:", refreshError);
805
+ throw refreshError;
806
+ }
807
+ }
808
+ if (res.serializedTx && res.rawTx) {
809
+ return {
810
+ signature: res.serializedTx,
811
+ txHash: res.rawTx
812
+ };
813
+ }
814
+ throw createAbcError(
815
+ "SIGNATURE_FAILED" /* SIGNATURE_FAILED */,
816
+ "Failed to sign transaction",
817
+ res
818
+ );
819
+ }
820
+ /**
821
+ * Sign message (Personal Sign - EIP-191)
822
+ * Based on tg-wallet-frontend reference implementation
823
+ */
824
+ async signMessage(params) {
825
+ this.loadTokens();
826
+ const wallet = loadFromStorage("wallet" /* WALLET */);
827
+ if (!wallet) {
828
+ throw createAbcError(
829
+ "WALLET_NOT_FOUND" /* WALLET_NOT_FOUND */,
830
+ "Wallet information not found in storage"
831
+ );
832
+ }
833
+ const ethers = await import("ethers");
834
+ const messageHash = ethers.utils.hashMessage(params.message);
835
+ const hash = messageHash.startsWith("0x") ? messageHash.slice(2) : messageHash;
836
+ const encryptedDevicePassword = await this.secure.getEncryptPlain(
837
+ wallet.encryptDevicePassword
838
+ );
839
+ const encryptedPvencstr = await this.secure.getEncryptPlain(
840
+ wallet.pvencstr
841
+ );
842
+ const encryptedWid = await this.secure.getEncryptPlain(wallet.wid);
843
+ const secureChannelId = await this.secure.getSecureChannelId();
844
+ const bodyData = {
845
+ hash,
846
+ encryptDevicePassword: encryptedDevicePassword,
847
+ pvencstr: encryptedPvencstr,
848
+ wid: encryptedWid,
849
+ uid: wallet.uid,
850
+ sid: wallet.sid
851
+ };
852
+ const bodyString = new URLSearchParams(bodyData).toString();
853
+ const url = `${this.baseURL}${ABC_ENDPOINTS.SIGN_HASH}`;
854
+ const response = await fetch(url, {
855
+ method: "POST",
856
+ headers: {
857
+ "Content-Type": "application/x-www-form-urlencoded",
858
+ "Secure-Channel": secureChannelId,
859
+ ...this.accessToken ? { Authorization: `Bearer ${this.accessToken}` } : {}
860
+ },
861
+ body: bodyString
862
+ });
863
+ const text = await response.text();
864
+ if (!text) {
865
+ throw createAbcError(
866
+ "SIGNATURE_FAILED" /* SIGNATURE_FAILED */,
867
+ `Empty response from sign API (status: ${response.status})`,
868
+ { status: response.status }
869
+ );
870
+ }
871
+ const res = JSON.parse(text);
872
+ if (response.status === 401) {
873
+ if (!this.refreshToken) {
874
+ this.loadTokens();
875
+ }
876
+ if (this.refreshToken) {
877
+ try {
878
+ await this.refreshAccessToken();
879
+ const retryResponse = await fetch(url, {
880
+ method: "POST",
881
+ headers: {
882
+ "Content-Type": "application/x-www-form-urlencoded",
883
+ "Secure-Channel": secureChannelId,
884
+ ...this.accessToken ? { Authorization: `Bearer ${this.accessToken}` } : {}
885
+ },
886
+ body: bodyString
887
+ });
888
+ const retryText = await retryResponse.text();
889
+ if (!retryText) {
890
+ throw createAbcError(
891
+ "SIGNATURE_FAILED" /* SIGNATURE_FAILED */,
892
+ `Empty response from retry (status: ${retryResponse.status})`,
893
+ { status: retryResponse.status }
894
+ );
895
+ }
896
+ const retryRes = JSON.parse(retryText);
897
+ if (retryRes.status === "success" && retryRes.result?.signstr) {
898
+ return { signature: retryRes.result.signstr };
899
+ }
900
+ throw createAbcError(
901
+ "SIGNATURE_FAILED" /* SIGNATURE_FAILED */,
902
+ "Failed to sign message after token refresh",
903
+ retryRes
904
+ );
905
+ } catch (refreshError) {
906
+ console.error("Token refresh failed in signMessage:", refreshError);
907
+ throw refreshError;
908
+ }
909
+ }
910
+ }
911
+ if (res.signstr) {
912
+ const signData = JSON.parse(res.signstr);
913
+ const sigList = signData.sig_list?.[0];
914
+ if (!sigList || !sigList.r || !sigList.s) {
915
+ throw createAbcError(
916
+ "SIGNATURE_FAILED" /* SIGNATURE_FAILED */,
917
+ "Invalid signature format",
918
+ res
919
+ );
920
+ }
921
+ const v = (sigList.vsource || 0) + 27;
922
+ const signature = sigList.r + sigList.s.slice(2) + v.toString(16).padStart(2, "0");
923
+ return { signature };
924
+ }
925
+ throw createAbcError(
926
+ "SIGNATURE_FAILED" /* SIGNATURE_FAILED */,
927
+ "Failed to sign message",
928
+ res
929
+ );
930
+ }
931
+ /**
932
+ * Sign typed data (EIP-712)
933
+ * Reference: tg-wallet-frontend src/features/wallet/api/index.ts sign_typed_data()
934
+ */
935
+ async signTypedData(params) {
936
+ this.loadTokens();
937
+ const wallet = loadFromStorage("wallet" /* WALLET */);
938
+ if (!wallet) {
939
+ throw createAbcError(
940
+ "WALLET_NOT_FOUND" /* WALLET_NOT_FOUND */,
941
+ "Wallet information not found in storage"
942
+ );
943
+ }
944
+ const encryptedDevicePassword = await this.secure.getEncryptPlain(
945
+ wallet.encryptDevicePassword
946
+ );
947
+ const encryptedPvencstr = await this.secure.getEncryptPlain(
948
+ wallet.pvencstr
949
+ );
950
+ const encryptedWid = await this.secure.getEncryptPlain(wallet.wid);
951
+ const secureChannelId = await this.secure.getSecureChannelId();
952
+ const network = getNetworkName(wallet.chainId);
953
+ const bodyData = {
954
+ messageJson: params.typedData,
955
+ // Server expects "messageJson" field
956
+ version: "v4",
957
+ // EIP-712 version
958
+ network,
959
+ // Network name (required for JSON-RPC)
960
+ encryptDevicePassword: encryptedDevicePassword,
961
+ pvencstr: encryptedPvencstr,
962
+ wid: encryptedWid,
963
+ uid: wallet.uid,
964
+ sid: wallet.sid
965
+ };
966
+ const bodyString = new URLSearchParams(bodyData).toString();
967
+ const url = `${this.baseURL}${ABC_ENDPOINTS.SIGN_TYPED}`;
968
+ const response = await fetch(url, {
969
+ method: "POST",
970
+ headers: {
971
+ "Content-Type": "application/x-www-form-urlencoded",
972
+ "Secure-Channel": secureChannelId,
973
+ ...this.accessToken ? { Authorization: `Bearer ${this.accessToken}` } : {}
974
+ },
975
+ body: bodyString
976
+ });
977
+ const text = await response.text();
978
+ if (!text) {
979
+ throw createAbcError(
980
+ "SIGNATURE_FAILED" /* SIGNATURE_FAILED */,
981
+ `Empty response from signTypedData API (status: ${response.status})`,
982
+ { status: response.status }
983
+ );
984
+ }
985
+ const res = JSON.parse(text);
986
+ if (response.status === 401 && this.refreshToken) {
987
+ try {
988
+ await this.refreshAccessToken();
989
+ const retryResponse = await fetch(url, {
990
+ method: "POST",
991
+ headers: {
992
+ "Content-Type": "application/x-www-form-urlencoded",
993
+ "Secure-Channel": secureChannelId,
994
+ ...this.accessToken ? { Authorization: `Bearer ${this.accessToken}` } : {}
995
+ },
996
+ body: bodyString
997
+ });
998
+ const retryText = await retryResponse.text();
999
+ if (!retryText) {
1000
+ throw createAbcError(
1001
+ "SIGNATURE_FAILED" /* SIGNATURE_FAILED */,
1002
+ `Empty response after retry (status: ${retryResponse.status})`,
1003
+ { status: retryResponse.status }
1004
+ );
1005
+ }
1006
+ const retryRes = JSON.parse(retryText);
1007
+ if (retryRes.serializedTx) {
1008
+ return { signature: retryRes.serializedTx };
1009
+ }
1010
+ throw createAbcError(
1011
+ "SIGNATURE_FAILED" /* SIGNATURE_FAILED */,
1012
+ "Failed to sign typed data after token refresh",
1013
+ retryRes
1014
+ );
1015
+ } catch (refreshError) {
1016
+ console.error("Token refresh failed in signTypedData:", refreshError);
1017
+ throw refreshError;
1018
+ }
1019
+ }
1020
+ if (res.serializedTx) {
1021
+ return { signature: res.serializedTx };
1022
+ }
1023
+ throw createAbcError(
1024
+ "SIGNATURE_FAILED" /* SIGNATURE_FAILED */,
1025
+ "Failed to sign typed data",
1026
+ res
1027
+ );
1028
+ }
1029
+ /**
1030
+ * Send raw transaction
1031
+ * Reference: tg-wallet-frontend src/features/wallet/api/index.ts sendRawTx()
1032
+ */
1033
+ async sendRawTransaction(chainId, signedTransaction) {
1034
+ const wallet = loadFromStorage("wallet" /* WALLET */);
1035
+ if (!wallet) {
1036
+ throw createAbcError(
1037
+ "WALLET_NOT_FOUND" /* WALLET_NOT_FOUND */,
1038
+ "Wallet information not found in storage"
1039
+ );
1040
+ }
1041
+ const network = getNetworkName(chainId);
1042
+ const secureChannelId = await this.secure.getSecureChannelId();
1043
+ const bodyData = {
1044
+ signedSerializeTx: signedTransaction,
1045
+ network
1046
+ // rpc parameter
1047
+ };
1048
+ const bodyString = new URLSearchParams(bodyData).toString();
1049
+ const url = `${this.baseURL}${ABC_ENDPOINTS.SEND_RAW_TX}`;
1050
+ const response = await fetch(url, {
1051
+ method: "POST",
1052
+ headers: {
1053
+ "Content-Type": "application/x-www-form-urlencoded",
1054
+ "Secure-Channel": secureChannelId,
1055
+ ...this.accessToken ? { Authorization: `Bearer ${this.accessToken}` } : {}
1056
+ },
1057
+ body: bodyString
1058
+ });
1059
+ const text = await response.text();
1060
+ if (!text) {
1061
+ throw createAbcError(
1062
+ "NETWORK_ERROR" /* NETWORK_ERROR */,
1063
+ `Empty response from sendRawTx API (status: ${response.status})`,
1064
+ { status: response.status }
1065
+ );
1066
+ }
1067
+ const res = JSON.parse(text);
1068
+ console.log("\u{1F4E1} sendRawTransaction response:", {
1069
+ status: response.status,
1070
+ ok: response.ok,
1071
+ response: res
1072
+ });
1073
+ if (!response.ok) {
1074
+ console.error("\u274C sendRawTransaction error:", {
1075
+ status: response.status,
1076
+ errorMessage: res.errorMessage || res.msg || res.message,
1077
+ fullResponse: res
1078
+ });
1079
+ }
1080
+ if (response.status === 401 && this.refreshToken) {
1081
+ try {
1082
+ await this.refreshAccessToken();
1083
+ const retryResponse = await fetch(url, {
1084
+ method: "POST",
1085
+ headers: {
1086
+ "Content-Type": "application/x-www-form-urlencoded",
1087
+ "Secure-Channel": secureChannelId,
1088
+ ...this.accessToken ? { Authorization: `Bearer ${this.accessToken}` } : {}
1089
+ },
1090
+ body: bodyString
1091
+ });
1092
+ const retryText = await retryResponse.text();
1093
+ if (!retryText) {
1094
+ throw createAbcError(
1095
+ "NETWORK_ERROR" /* NETWORK_ERROR */,
1096
+ `Empty response after retry (status: ${retryResponse.status})`,
1097
+ { status: retryResponse.status }
1098
+ );
1099
+ }
1100
+ const retryRes = JSON.parse(retryText);
1101
+ if (retryRes.item || retryRes.txHash || retryRes.result?.txHash) {
1102
+ const txHash = retryRes.item || retryRes.txHash || retryRes.result.txHash;
1103
+ return { txHash };
1104
+ }
1105
+ throw createAbcError(
1106
+ "NETWORK_ERROR" /* NETWORK_ERROR */,
1107
+ "Failed to send transaction after token refresh",
1108
+ retryRes
1109
+ );
1110
+ } catch (refreshError) {
1111
+ console.error(
1112
+ "Token refresh failed in sendRawTransaction:",
1113
+ refreshError
1114
+ );
1115
+ throw refreshError;
1116
+ }
1117
+ }
1118
+ if (res.result) {
1119
+ if (typeof res.result === "string") {
1120
+ console.log("\u2705 Transaction hash from result:", res.result);
1121
+ return { txHash: res.result };
1122
+ }
1123
+ if (res.result.txHash) {
1124
+ return { txHash: res.result.txHash };
1125
+ }
1126
+ }
1127
+ if (res.item) {
1128
+ return { txHash: res.item };
1129
+ }
1130
+ if (res.txHash) {
1131
+ return { txHash: res.txHash };
1132
+ }
1133
+ throw createAbcError(
1134
+ "NETWORK_ERROR" /* NETWORK_ERROR */,
1135
+ "Failed to send transaction",
1136
+ res
1137
+ );
1138
+ }
1139
+ /**
1140
+ * Estimate gas for EIP-1559 transaction
1141
+ * Routes through TalkenApiClient (talken-api proxy)
1142
+ */
1143
+ async estimateGas(params) {
1144
+ const network = getNetworkName(params.chainId);
1145
+ const api = getTalkenApiClient();
1146
+ if (!api) {
1147
+ throw createAbcError(
1148
+ "NETWORK_ERROR" /* NETWORK_ERROR */,
1149
+ "TalkenApiClient not initialized"
1150
+ );
1151
+ }
1152
+ try {
1153
+ const result = await api.evm.estimateGas({
1154
+ network,
1155
+ from: params.from || "",
1156
+ to: params.to,
1157
+ value: params.value,
1158
+ data: params.data
1159
+ });
1160
+ if (result.result) {
1161
+ return result.result;
1162
+ }
1163
+ throw createAbcError(
1164
+ "NETWORK_ERROR" /* NETWORK_ERROR */,
1165
+ "No result in gas estimate response"
1166
+ );
1167
+ } catch (error) {
1168
+ if (error?.code === "NETWORK_ERROR" /* NETWORK_ERROR */) {
1169
+ throw error;
1170
+ }
1171
+ throw createAbcError(
1172
+ "NETWORK_ERROR" /* NETWORK_ERROR */,
1173
+ error.message || "Failed to estimate gas"
1174
+ );
1175
+ }
1176
+ }
1177
+ /**
1178
+ * Get transaction count (nonce)
1179
+ * Reference: ABC WaaS API - /wapi/v2/transactions/count
1180
+ */
1181
+ async getTransactionCount(params) {
1182
+ const network = getNetworkName(params.chainId);
1183
+ const secureChannelId = await this.secure.getSecureChannelId();
1184
+ const bodyData = {
1185
+ network,
1186
+ address: params.address
1187
+ };
1188
+ const bodyString = new URLSearchParams(bodyData).toString();
1189
+ const url = `${this.baseURL}${ABC_ENDPOINTS.TRANSACTION_COUNT}`;
1190
+ const response = await fetch(url, {
1191
+ method: "POST",
1192
+ headers: {
1193
+ "Content-Type": "application/x-www-form-urlencoded",
1194
+ "Secure-Channel": secureChannelId,
1195
+ ...this.accessToken ? { Authorization: `Bearer ${this.accessToken}` } : {}
1196
+ },
1197
+ body: bodyString
1198
+ });
1199
+ const text = await response.text();
1200
+ if (!text) {
1201
+ throw createAbcError(
1202
+ "NETWORK_ERROR" /* NETWORK_ERROR */,
1203
+ `Empty response from transaction count API (status: ${response.status})`,
1204
+ { status: response.status }
1205
+ );
1206
+ }
1207
+ const res = JSON.parse(text);
1208
+ if (response.status === 401 && this.refreshToken) {
1209
+ try {
1210
+ await this.refreshAccessToken();
1211
+ const retryResponse = await fetch(url, {
1212
+ method: "POST",
1213
+ headers: {
1214
+ "Content-Type": "application/x-www-form-urlencoded",
1215
+ "Secure-Channel": secureChannelId,
1216
+ ...this.accessToken ? { Authorization: `Bearer ${this.accessToken}` } : {}
1217
+ },
1218
+ body: bodyString
1219
+ });
1220
+ const retryText = await retryResponse.text();
1221
+ if (!retryText) {
1222
+ throw createAbcError(
1223
+ "NETWORK_ERROR" /* NETWORK_ERROR */,
1224
+ `Empty response after retry (status: ${retryResponse.status})`,
1225
+ { status: retryResponse.status }
1226
+ );
1227
+ }
1228
+ const retryRes = JSON.parse(retryText);
1229
+ if (retryRes.result !== void 0) {
1230
+ return typeof retryRes.result === "number" ? `0x${retryRes.result.toString(16)}` : retryRes.result;
1231
+ }
1232
+ throw createAbcError(
1233
+ "NETWORK_ERROR" /* NETWORK_ERROR */,
1234
+ "Failed to get transaction count after token refresh",
1235
+ retryRes
1236
+ );
1237
+ } catch (refreshError) {
1238
+ console.error(
1239
+ "Token refresh failed in getTransactionCount:",
1240
+ refreshError
1241
+ );
1242
+ throw refreshError;
1243
+ }
1244
+ }
1245
+ if (res.result !== void 0) {
1246
+ return typeof res.result === "number" ? `0x${res.result.toString(16)}` : res.result;
1247
+ }
1248
+ throw createAbcError(
1249
+ "NETWORK_ERROR" /* NETWORK_ERROR */,
1250
+ res.errorMessage || res.msg || "Failed to get transaction count",
1251
+ res
1252
+ );
1253
+ }
1254
+ /**
1255
+ * Get wallet info
1256
+ */
1257
+ async getWalletInfo(uid) {
1258
+ const response = await this.request(ABC_ENDPOINTS.INFO, {
1259
+ method: "POST",
1260
+ body: { uid }
1261
+ });
1262
+ if (response.status === "success") {
1263
+ return response.data;
1264
+ }
1265
+ throw createAbcError(
1266
+ "WALLET_NOT_FOUND" /* WALLET_NOT_FOUND */,
1267
+ "Failed to get wallet info",
1268
+ response
1269
+ );
1270
+ }
1271
+ /**
1272
+ * Logout (clear tokens)
1273
+ */
1274
+ async logout() {
1275
+ this.clearTokens();
1276
+ }
1277
+ /**
1278
+ * Check if user is authenticated
1279
+ */
1280
+ isAuthenticated() {
1281
+ return !!this.accessToken && !this.isTokenExpired();
1282
+ }
1283
+ /**
1284
+ * Set tokens in client instance (useful when restoring from storage or state)
1285
+ * Call this before persistTokens() if you need to set tokens from external source
1286
+ */
1287
+ setTokens(accessToken, refreshToken, expiresAt) {
1288
+ this.accessToken = accessToken;
1289
+ this.refreshToken = refreshToken;
1290
+ this.expiresAt = expiresAt;
1291
+ }
1292
+ /**
1293
+ * Persist tokens to localStorage
1294
+ * Call this after PIN verification is complete
1295
+ *
1296
+ * SECURITY NOTE: This should only be called after full authentication (password + PIN)
1297
+ * to ensure tokens are only persisted after the user has proven ownership of both credentials.
1298
+ */
1299
+ persistTokens() {
1300
+ if (!this.accessToken || !this.refreshToken || !this.expiresAt) {
1301
+ console.warn(
1302
+ "[AbcWaasClient] \u26A0\uFE0F No tokens to persist - ensure login was successful first"
1303
+ );
1304
+ return;
1305
+ }
1306
+ console.log(
1307
+ "[AbcWaasClient] \u{1F4BE} Persisting tokens to localStorage after PIN verification"
1308
+ );
1309
+ saveToStorage("access_token" /* ACCESS_TOKEN */, this.accessToken);
1310
+ saveToStorage("refresh_token" /* REFRESH_TOKEN */, this.refreshToken);
1311
+ saveToStorage("expires_at" /* EXPIRES_AT */, this.expiresAt);
1312
+ }
1313
+ // ==========================================================================
1314
+ // Solana Methods
1315
+ // ==========================================================================
1316
+ /**
1317
+ * Generate or recover Solana wallet (Ed25519)
1318
+ * Reference: SigningService.ts:56-72, wallet/api/index.ts:56-72
1319
+ */
1320
+ async generateSolanaWallet(pin, isRecover = false) {
1321
+ const url = `${this.baseURL}/v3/wallet/${isRecover ? "recover" : "generate"}`;
1322
+ const response = await fetch(url, {
1323
+ method: "POST",
1324
+ headers: {
1325
+ "Content-Type": "application/json",
1326
+ // V3 API requires JSON, not form-urlencoded
1327
+ Accept: "application/json",
1328
+ ...this.accessToken ? { Authorization: `Bearer ${this.accessToken}` } : {}
1329
+ },
1330
+ body: JSON.stringify({
1331
+ curve: "ed25519",
1332
+ password: pin
1333
+ // PIN will be encrypted by Secure Channel
1334
+ // Note: network parameter not needed for v3 API
1335
+ })
1336
+ });
1337
+ let data;
1338
+ try {
1339
+ data = await response.json();
1340
+ } catch (e) {
1341
+ console.error(`[AbcWaasClient] Failed to parse response from ${url}:`, e);
1342
+ throw createAbcError(
1343
+ "WALLET_NOT_FOUND" /* WALLET_NOT_FOUND */,
1344
+ `Failed to ${isRecover ? "recover" : "generate"} Solana wallet - invalid response`,
1345
+ { status: response.status }
1346
+ );
1347
+ }
1348
+ if (!response.ok) {
1349
+ if (!isRecover && response.status === 409) {
1350
+ const error = createAbcError(
1351
+ "WALLET_NOT_FOUND" /* WALLET_NOT_FOUND */,
1352
+ "Wallet already exists",
1353
+ data
1354
+ );
1355
+ error.response = { status: 409 };
1356
+ throw error;
1357
+ }
1358
+ console.error(
1359
+ `[AbcWaasClient] ${isRecover ? "Recover" : "Generate"} failed:`,
1360
+ data
1361
+ );
1362
+ throw createAbcError(
1363
+ "WALLET_NOT_FOUND" /* WALLET_NOT_FOUND */,
1364
+ `Failed to ${isRecover ? "recover" : "generate"} Solana wallet`,
1365
+ data
1366
+ );
1367
+ }
1368
+ const result = data.result || data;
1369
+ if (!result.key_id || !result.public_key || !result.encrypted_share) {
1370
+ console.error(
1371
+ "[AbcWaasClient] Invalid wallet response, missing required fields:",
1372
+ result
1373
+ );
1374
+ throw createAbcError(
1375
+ "WALLET_NOT_FOUND" /* WALLET_NOT_FOUND */,
1376
+ `Invalid wallet response from ${isRecover ? "recover" : "generate"}`,
1377
+ data
1378
+ );
1379
+ }
1380
+ const solanaNetwork = getSolanaNetwork();
1381
+ const addressResult = await this.getSolanaAddress(
1382
+ result.public_key,
1383
+ solanaNetwork
1384
+ );
1385
+ return {
1386
+ uid: result.uid || "",
1387
+ sessionId: result.share_id || result.key_id,
1388
+ shareId: result.share_id || result.key_id,
1389
+ publicKey: result.public_key,
1390
+ address: addressResult,
1391
+ keyId: result.key_id,
1392
+ encryptedShare: result.encrypted_share || "",
1393
+ secretStore: result.secret_store || "",
1394
+ network: solanaNetwork
1395
+ };
1396
+ }
1397
+ /**
1398
+ * Get Solana address from Ed25519 public key
1399
+ * Reference: wallet/api/index.ts:74-82
1400
+ */
1401
+ async getSolanaAddress(publicKey, network) {
1402
+ const url = `${this.baseURL}/wapi/v2/solana/wallet/getAddress`;
1403
+ const body = new URLSearchParams({
1404
+ network,
1405
+ publicKey
1406
+ }).toString();
1407
+ const response = await fetch(url, {
1408
+ method: "POST",
1409
+ headers: {
1410
+ ...DEFAULT_HEADERS,
1411
+ // Contains 'Content-Type': 'application/x-www-form-urlencoded'
1412
+ ...this.accessToken ? { Authorization: `Bearer ${this.accessToken}` } : {}
1413
+ },
1414
+ body
1415
+ });
1416
+ const data = await response.json();
1417
+ if (!response.ok || data.status !== "success") {
1418
+ throw createAbcError(
1419
+ "NETWORK_ERROR" /* NETWORK_ERROR */,
1420
+ "Failed to get Solana address",
1421
+ data
1422
+ );
1423
+ }
1424
+ return data.result?.data?.address;
1425
+ }
1426
+ /**
1427
+ * Sign Solana transaction with Ed25519
1428
+ * Reference: SigningService.ts:587-626, wallet/api/index.ts:114-122
1429
+ */
1430
+ async signSolanaTransaction(params) {
1431
+ const url = `${this.baseURL}/v3/wallet/sign`;
1432
+ const response = await fetch(url, {
1433
+ method: "POST",
1434
+ headers: {
1435
+ "Content-Type": "application/json",
1436
+ Accept: "application/json",
1437
+ ...this.accessToken ? { Authorization: `Bearer ${this.accessToken}` } : {}
1438
+ },
1439
+ body: JSON.stringify({
1440
+ uid: params.uid,
1441
+ share_id: params.shareId,
1442
+ key_id: params.keyId,
1443
+ encrypted_share: params.encryptedShare,
1444
+ public_key: params.publicKey,
1445
+ message: params.message,
1446
+ // Hex-encoded transaction
1447
+ password: params.pin,
1448
+ // PIN will be encrypted
1449
+ network: params.network
1450
+ // Required: 'solana' or 'solana_devnet'
1451
+ })
1452
+ });
1453
+ const data = await response.json();
1454
+ if (!response.ok || data.status !== "success") {
1455
+ throw createAbcError(
1456
+ "SIGNATURE_FAILED" /* SIGNATURE_FAILED */,
1457
+ "Failed to sign Solana transaction",
1458
+ data
1459
+ );
1460
+ }
1461
+ return {
1462
+ signature: data.result?.signature
1463
+ };
1464
+ }
1465
+ /**
1466
+ * Sign Solana message with Ed25519
1467
+ * Reference: SigningService.ts:546-579
1468
+ */
1469
+ async signSolanaMessage(params) {
1470
+ const url = `${this.baseURL}/v3/wallet/sign`;
1471
+ const response = await fetch(url, {
1472
+ method: "POST",
1473
+ headers: {
1474
+ "Content-Type": "application/json",
1475
+ Accept: "application/json",
1476
+ ...this.accessToken ? { Authorization: `Bearer ${this.accessToken}` } : {}
1477
+ },
1478
+ body: JSON.stringify({
1479
+ uid: params.uid,
1480
+ share_id: params.shareId,
1481
+ key_id: params.keyId,
1482
+ encrypted_share: params.encryptedShare,
1483
+ public_key: params.publicKey,
1484
+ message: params.message,
1485
+ // Hex-encoded message
1486
+ password: params.pin,
1487
+ network: params.network
1488
+ // Required: 'solana' or 'solana_devnet'
1489
+ })
1490
+ });
1491
+ const data = await response.json();
1492
+ if (!response.ok || data.status !== "success") {
1493
+ throw createAbcError(
1494
+ "SIGNATURE_FAILED" /* SIGNATURE_FAILED */,
1495
+ "Failed to sign Solana message",
1496
+ data
1497
+ );
1498
+ }
1499
+ return {
1500
+ signature: data.result?.signature
1501
+ };
1502
+ }
1503
+ /**
1504
+ * Send Solana transaction
1505
+ * Reference: SigningService.ts:418, wallet/api/index.ts:124-132
1506
+ */
1507
+ async sendSolanaTransaction(params) {
1508
+ const url = `${this.baseURL}/wapi/v2/solana/tx/sendTransaction`;
1509
+ const response = await fetch(url, {
1510
+ method: "POST",
1511
+ headers: {
1512
+ ...DEFAULT_HEADERS,
1513
+ ...this.accessToken ? { Authorization: `Bearer ${this.accessToken}` } : {}
1514
+ },
1515
+ body: JSON.stringify({
1516
+ network: params.network,
1517
+ serializedTX: params.serializedTX,
1518
+ signatures: params.signatures
1519
+ })
1520
+ });
1521
+ const data = await response.json();
1522
+ if (!response.ok || data.status !== "success") {
1523
+ throw createAbcError(
1524
+ "NETWORK_ERROR" /* NETWORK_ERROR */,
1525
+ "Failed to send Solana transaction",
1526
+ data
1527
+ );
1528
+ }
1529
+ return {
1530
+ txHash: data.result?.data
1531
+ };
1532
+ }
1533
+ };
1534
+ function createAbcWaasClient(config) {
1535
+ return new AbcWaasClient(config);
1536
+ }
1537
+
1538
+ export {
1539
+ AbcWaasClient,
1540
+ createAbcWaasClient
1541
+ };