@cedros/login-react 0.0.13 → 0.0.14

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 (185) hide show
  1. package/dist/AdminDepositList-CyT4VBH8.js +311 -0
  2. package/dist/AdminDepositList-CyT4VBH8.js.map +1 -0
  3. package/dist/AdminDepositList-b2AXtLg0.cjs +1 -0
  4. package/dist/AdminDepositList-b2AXtLg0.cjs.map +1 -0
  5. package/dist/{AdminWithdrawalHistory-BGjfrIe3.js → AdminWithdrawalHistory-Cud-yuWy.js} +295 -283
  6. package/dist/AdminWithdrawalHistory-Cud-yuWy.js.map +1 -0
  7. package/dist/AdminWithdrawalHistory-DL9zbu2b.cjs +1 -0
  8. package/dist/AdminWithdrawalHistory-DL9zbu2b.cjs.map +1 -0
  9. package/dist/{AuthenticationSettings-5Vi7Ib_A.cjs → AuthenticationSettings-D739nNul.cjs} +1 -1
  10. package/dist/{AuthenticationSettings-5Vi7Ib_A.cjs.map → AuthenticationSettings-D739nNul.cjs.map} +1 -1
  11. package/dist/AuthenticationSettings-DtLoxQ2z.cjs +1 -0
  12. package/dist/{AuthenticationSettings-BPAh1my6.cjs.map → AuthenticationSettings-DtLoxQ2z.cjs.map} +1 -1
  13. package/dist/{AuthenticationSettings-CJg8CJY9.js → AuthenticationSettings-Dx3JCI3m.js} +1 -1
  14. package/dist/{AuthenticationSettings-CJg8CJY9.js.map → AuthenticationSettings-Dx3JCI3m.js.map} +1 -1
  15. package/dist/{AuthenticationSettings-CR_i6TTS.js → AuthenticationSettings-vowmQPXz.js} +170 -140
  16. package/dist/{AuthenticationSettings-CR_i6TTS.js.map → AuthenticationSettings-vowmQPXz.js.map} +1 -1
  17. package/dist/{AutosaveStatus-CYkC2aI_.cjs → AutosaveStatus-CCrZszKA.cjs} +1 -1
  18. package/dist/{AutosaveStatus-CYkC2aI_.cjs.map → AutosaveStatus-CCrZszKA.cjs.map} +1 -1
  19. package/dist/{AutosaveStatus-N4uNS6-2.js → AutosaveStatus-Ciyt350A.js} +1 -1
  20. package/dist/{AutosaveStatus-N4uNS6-2.js.map → AutosaveStatus-Ciyt350A.js.map} +1 -1
  21. package/dist/{CreditSystemSettings-CIf_SfJq.js → CreditSystemSettings-BQ3h4CyM.js} +1 -1
  22. package/dist/{CreditSystemSettings-CIf_SfJq.js.map → CreditSystemSettings-BQ3h4CyM.js.map} +1 -1
  23. package/dist/{CreditSystemSettings-BnAOK_tT.cjs → CreditSystemSettings-C6dUsu72.cjs} +1 -1
  24. package/dist/{CreditSystemSettings-BnAOK_tT.cjs.map → CreditSystemSettings-C6dUsu72.cjs.map} +1 -1
  25. package/dist/{CreditSystemSettings-Ck5WIMp3.cjs → CreditSystemSettings-CBot8EPW.cjs} +1 -1
  26. package/dist/{CreditSystemSettings-Ck5WIMp3.cjs.map → CreditSystemSettings-CBot8EPW.cjs.map} +1 -1
  27. package/dist/{CreditSystemSettings-CePYGgev.js → CreditSystemSettings-bVuNLsqp.js} +1 -1
  28. package/dist/{CreditSystemSettings-CePYGgev.js.map → CreditSystemSettings-bVuNLsqp.js.map} +1 -1
  29. package/dist/DepositsSection-BkKUS4vk.cjs +1 -0
  30. package/dist/DepositsSection-BkKUS4vk.cjs.map +1 -0
  31. package/dist/{DepositsSection-DA89uR9A.js → DepositsSection-DD9MKUFt.js} +20 -14
  32. package/dist/DepositsSection-DD9MKUFt.js.map +1 -0
  33. package/dist/EmailRegisterForm-Pvm3I8GP.cjs +1 -0
  34. package/dist/{EmailRegisterForm-CxktR-4J.cjs.map → EmailRegisterForm-Pvm3I8GP.cjs.map} +1 -1
  35. package/dist/{EmailRegisterForm-BrDL3BZy.js → EmailRegisterForm-nI0BOIxR.js} +2 -2
  36. package/dist/{EmailRegisterForm-BrDL3BZy.js.map → EmailRegisterForm-nI0BOIxR.js.map} +1 -1
  37. package/dist/{EmailSettings-DZywTTRq.cjs → EmailSettings-B9qwPSiM.cjs} +1 -1
  38. package/dist/{EmailSettings-DZywTTRq.cjs.map → EmailSettings-B9qwPSiM.cjs.map} +1 -1
  39. package/dist/{EmailSettings-DbMDfVaM.js → EmailSettings-CCA8dNCi.js} +1 -1
  40. package/dist/{EmailSettings-DbMDfVaM.js.map → EmailSettings-CCA8dNCi.js.map} +1 -1
  41. package/dist/{EmailSettings-B8xwgd6_.cjs → EmailSettings-RbgAq9FB.cjs} +1 -1
  42. package/dist/{EmailSettings-B8xwgd6_.cjs.map → EmailSettings-RbgAq9FB.cjs.map} +1 -1
  43. package/dist/{EmailSettings-Bna7Z53E.js → EmailSettings-mxlKNcPl.js} +1 -1
  44. package/dist/{EmailSettings-Bna7Z53E.js.map → EmailSettings-mxlKNcPl.js.map} +1 -1
  45. package/dist/{EmbeddedWalletSettings-DivEPn39.cjs → EmbeddedWalletSettings-B4h-8rxB.cjs} +1 -1
  46. package/dist/{EmbeddedWalletSettings-DivEPn39.cjs.map → EmbeddedWalletSettings-B4h-8rxB.cjs.map} +1 -1
  47. package/dist/{EmbeddedWalletSettings-BEztqO19.js → EmbeddedWalletSettings-BInZvFZf.js} +1 -1
  48. package/dist/{EmbeddedWalletSettings-BEztqO19.js.map → EmbeddedWalletSettings-BInZvFZf.js.map} +1 -1
  49. package/dist/{EmbeddedWalletSettings-ANbhj3Lt.js → EmbeddedWalletSettings-CXlZFFDw.js} +1 -1
  50. package/dist/{EmbeddedWalletSettings-ANbhj3Lt.js.map → EmbeddedWalletSettings-CXlZFFDw.js.map} +1 -1
  51. package/dist/{EmbeddedWalletSettings-D6M7pwgk.cjs → EmbeddedWalletSettings-D5JXae1L.cjs} +1 -1
  52. package/dist/{EmbeddedWalletSettings-D6M7pwgk.cjs.map → EmbeddedWalletSettings-D5JXae1L.cjs.map} +1 -1
  53. package/dist/{GoogleLoginButton-B3uRMJ_n.js → GoogleLoginButton-CXwp4LsQ.js} +1 -1
  54. package/dist/{GoogleLoginButton-B3uRMJ_n.js.map → GoogleLoginButton-CXwp4LsQ.js.map} +1 -1
  55. package/dist/GoogleLoginButton-zS_69-KV.cjs +1 -0
  56. package/dist/{GoogleLoginButton-BydKswn4.cjs.map → GoogleLoginButton-zS_69-KV.cjs.map} +1 -1
  57. package/dist/PermissionsSection-BPbE-hNx.cjs +1 -0
  58. package/dist/{PermissionsSection-CKXXDfqi.cjs.map → PermissionsSection-BPbE-hNx.cjs.map} +1 -1
  59. package/dist/{PermissionsSection-BGaj_sI7.js → PermissionsSection-CighC1p6.js} +3 -3
  60. package/dist/{PermissionsSection-BGaj_sI7.js.map → PermissionsSection-CighC1p6.js.map} +1 -1
  61. package/dist/{ServerSettings-B2RKhJtZ.js → ServerSettings-BE8fsE5k.js} +1 -1
  62. package/dist/{ServerSettings-B2RKhJtZ.js.map → ServerSettings-BE8fsE5k.js.map} +1 -1
  63. package/dist/{ServerSettings-BZXlm1BX.cjs → ServerSettings-CYTlQ2xy.cjs} +1 -1
  64. package/dist/{ServerSettings-BZXlm1BX.cjs.map → ServerSettings-CYTlQ2xy.cjs.map} +1 -1
  65. package/dist/{ServerSettings-DZUKo6By.cjs → ServerSettings-DFs9jQ3f.cjs} +1 -1
  66. package/dist/{ServerSettings-DZUKo6By.cjs.map → ServerSettings-DFs9jQ3f.cjs.map} +1 -1
  67. package/dist/{ServerSettings-Bqm4-bt2.js → ServerSettings-pSmWDC1d.js} +1 -1
  68. package/dist/{ServerSettings-Bqm4-bt2.js.map → ServerSettings-pSmWDC1d.js.map} +1 -1
  69. package/dist/{SettingsPageLayout-DpgNEkuu.js → SettingsPageLayout--GZ_iHLc.js} +1 -1
  70. package/dist/{SettingsPageLayout-DpgNEkuu.js.map → SettingsPageLayout--GZ_iHLc.js.map} +1 -1
  71. package/dist/{SettingsPageLayout-COSYLMu7.cjs → SettingsPageLayout-j5lMjEID.cjs} +1 -1
  72. package/dist/{SettingsPageLayout-COSYLMu7.cjs.map → SettingsPageLayout-j5lMjEID.cjs.map} +1 -1
  73. package/dist/SolanaLoginButton-BjOxpE1C.cjs +1 -0
  74. package/dist/{SolanaLoginButton-fAW7kRUu.cjs.map → SolanaLoginButton-BjOxpE1C.cjs.map} +1 -1
  75. package/dist/{SolanaLoginButton-C_u9OppS.js → SolanaLoginButton-P22QjBaO.js} +1 -1
  76. package/dist/{SolanaLoginButton-C_u9OppS.js.map → SolanaLoginButton-P22QjBaO.js.map} +1 -1
  77. package/dist/{TeamSection-CvrCoa9D.js → TeamSection-BIECkp7g.js} +2 -2
  78. package/dist/{TeamSection-CvrCoa9D.js.map → TeamSection-BIECkp7g.js.map} +1 -1
  79. package/dist/{TeamSection-DlUD5kp5.cjs → TeamSection-BOH9pv_E.cjs} +1 -1
  80. package/dist/{TeamSection-DlUD5kp5.cjs.map → TeamSection-BOH9pv_E.cjs.map} +1 -1
  81. package/dist/UsersSection-e6q7FHzx.cjs +1 -0
  82. package/dist/UsersSection-e6q7FHzx.cjs.map +1 -0
  83. package/dist/UsersSection-t-zm0jZW.js +33 -0
  84. package/dist/UsersSection-t-zm0jZW.js.map +1 -0
  85. package/dist/{WebhookSettings-bUg2u_p0.js → WebhookSettings-Bb70MbFj.js} +1 -1
  86. package/dist/{WebhookSettings-bUg2u_p0.js.map → WebhookSettings-Bb70MbFj.js.map} +1 -1
  87. package/dist/{WebhookSettings-BWl_wsvg.cjs → WebhookSettings-C-gvNAW1.cjs} +1 -1
  88. package/dist/{WebhookSettings-BWl_wsvg.cjs.map → WebhookSettings-C-gvNAW1.cjs.map} +1 -1
  89. package/dist/{WebhookSettings-DXNH5bal.cjs → WebhookSettings-CGyDKjrm.cjs} +1 -1
  90. package/dist/{WebhookSettings-DXNH5bal.cjs.map → WebhookSettings-CGyDKjrm.cjs.map} +1 -1
  91. package/dist/{WebhookSettings-BT5q6AZ8.js → WebhookSettings-kIstSjZi.js} +1 -1
  92. package/dist/{WebhookSettings-BT5q6AZ8.js.map → WebhookSettings-kIstSjZi.js.map} +1 -1
  93. package/dist/WithdrawalsSection-sljIyeaz.cjs +1 -0
  94. package/dist/WithdrawalsSection-sljIyeaz.cjs.map +1 -0
  95. package/dist/WithdrawalsSection-yRDTVFsb.js +27 -0
  96. package/dist/WithdrawalsSection-yRDTVFsb.js.map +1 -0
  97. package/dist/admin-only.cjs +1 -1
  98. package/dist/admin-only.js +1 -1
  99. package/dist/email-only.cjs +1 -1
  100. package/dist/email-only.d.ts +13 -2
  101. package/dist/email-only.js +3 -3
  102. package/dist/google-only.cjs +1 -1
  103. package/dist/google-only.d.ts +13 -2
  104. package/dist/google-only.js +3 -3
  105. package/dist/index.cjs +12 -12
  106. package/dist/index.cjs.map +1 -1
  107. package/dist/index.d.ts +31 -8
  108. package/dist/index.js +1066 -1092
  109. package/dist/index.js.map +1 -1
  110. package/dist/{plugin-BtYBW6JY.cjs → plugin-8_dpq7tC.cjs} +1 -1
  111. package/dist/{plugin-BtYBW6JY.cjs.map → plugin-8_dpq7tC.cjs.map} +1 -1
  112. package/dist/{plugin-5qRh-YhX.js → plugin-D1NdppqC.js} +1 -1
  113. package/dist/{plugin-5qRh-YhX.js.map → plugin-D1NdppqC.js.map} +1 -1
  114. package/dist/{shamir-AeLLfw0p.cjs → shamir-4DyQMJCk.cjs} +1 -1
  115. package/dist/{shamir-AeLLfw0p.cjs.map → shamir-4DyQMJCk.cjs.map} +1 -1
  116. package/dist/{shamir-B0wConeK.js → shamir-L-s-Tp1Z.js} +1 -1
  117. package/dist/{shamir-B0wConeK.js.map → shamir-L-s-Tp1Z.js.map} +1 -1
  118. package/dist/silentWalletEnroll-BgTb4H5I.cjs +1 -0
  119. package/dist/{silentWalletEnroll-B8pgdKZO.cjs.map → silentWalletEnroll-BgTb4H5I.cjs.map} +1 -1
  120. package/dist/{silentWalletEnroll-DR2kPw7W.js → silentWalletEnroll-DWt6Pr3B.js} +3 -3
  121. package/dist/{silentWalletEnroll-DR2kPw7W.js.map → silentWalletEnroll-DWt6Pr3B.js.map} +1 -1
  122. package/dist/solana-only.cjs +1 -1
  123. package/dist/solana-only.d.ts +13 -2
  124. package/dist/solana-only.js +3 -3
  125. package/dist/{useAdminDeposits-BDY5KJ0-.js → useAdminDeposits-BTSyeAfg.js} +1 -1
  126. package/dist/{useAdminDeposits-BDY5KJ0-.js.map → useAdminDeposits-BTSyeAfg.js.map} +1 -1
  127. package/dist/useAdminDeposits-BkkCwHWp.cjs +1 -0
  128. package/dist/{useAdminDeposits-Dvx3_UUE.cjs.map → useAdminDeposits-BkkCwHWp.cjs.map} +1 -1
  129. package/dist/{useAuth-Bge6KaWN.js → useAuth-C3dpk0po.js} +597 -561
  130. package/dist/useAuth-C3dpk0po.js.map +1 -0
  131. package/dist/useAuth-D3Pk_H3z.cjs +1 -0
  132. package/dist/useAuth-D3Pk_H3z.cjs.map +1 -0
  133. package/dist/useCedrosLogin-C9MrcZvh.cjs +1 -0
  134. package/dist/useCedrosLogin-C9MrcZvh.cjs.map +1 -0
  135. package/dist/{apiClient-B2JxVPlH.js → useCedrosLogin-_94MmGGq.js} +29 -29
  136. package/dist/useCedrosLogin-_94MmGGq.js.map +1 -0
  137. package/dist/{useOrgs-Be3KH4ib.js → useOrgs-C3pzMA9h.js} +1 -1
  138. package/dist/{useOrgs-Be3KH4ib.js.map → useOrgs-C3pzMA9h.js.map} +1 -1
  139. package/dist/useOrgs-DDVRCaVi.cjs +1 -0
  140. package/dist/{useOrgs-CVbacmaQ.cjs.map → useOrgs-DDVRCaVi.cjs.map} +1 -1
  141. package/dist/{useSystemSettings-DN5YqfNq.js → useSystemSettings-DBlAMjFi.js} +1 -1
  142. package/dist/{useSystemSettings-DN5YqfNq.js.map → useSystemSettings-DBlAMjFi.js.map} +1 -1
  143. package/dist/useSystemSettings-DRrreszl.cjs +1 -0
  144. package/dist/{useSystemSettings-D9Cr7ZTl.cjs.map → useSystemSettings-DRrreszl.cjs.map} +1 -1
  145. package/dist/useUsersStatsSummary-8qY7iP4G.cjs +1 -0
  146. package/dist/useUsersStatsSummary-8qY7iP4G.cjs.map +1 -0
  147. package/dist/{AdminUserDetail-DHFDzY8B.js → useUsersStatsSummary-NjEFvWuz.js} +431 -380
  148. package/dist/useUsersStatsSummary-NjEFvWuz.js.map +1 -0
  149. package/package.json +1 -1
  150. package/dist/AdminDepositList-Cx0xRwES.js +0 -305
  151. package/dist/AdminDepositList-Cx0xRwES.js.map +0 -1
  152. package/dist/AdminDepositList-UEcyRZkA.cjs +0 -1
  153. package/dist/AdminDepositList-UEcyRZkA.cjs.map +0 -1
  154. package/dist/AdminUserDetail-BzEIdNJh.cjs +0 -1
  155. package/dist/AdminUserDetail-BzEIdNJh.cjs.map +0 -1
  156. package/dist/AdminUserDetail-DHFDzY8B.js.map +0 -1
  157. package/dist/AdminWithdrawalHistory-0yxtMh6q.cjs +0 -1
  158. package/dist/AdminWithdrawalHistory-0yxtMh6q.cjs.map +0 -1
  159. package/dist/AdminWithdrawalHistory-BGjfrIe3.js.map +0 -1
  160. package/dist/AuthenticationSettings-BPAh1my6.cjs +0 -1
  161. package/dist/DepositsSection-DA89uR9A.js.map +0 -1
  162. package/dist/DepositsSection-i6XdhLNs.cjs +0 -1
  163. package/dist/DepositsSection-i6XdhLNs.cjs.map +0 -1
  164. package/dist/EmailRegisterForm-CxktR-4J.cjs +0 -1
  165. package/dist/GoogleLoginButton-BydKswn4.cjs +0 -1
  166. package/dist/PermissionsSection-CKXXDfqi.cjs +0 -1
  167. package/dist/SolanaLoginButton-fAW7kRUu.cjs +0 -1
  168. package/dist/UsersSection-C2U8Tb7V.cjs +0 -1
  169. package/dist/UsersSection-C2U8Tb7V.cjs.map +0 -1
  170. package/dist/UsersSection-Dbh9PTSA.js +0 -83
  171. package/dist/UsersSection-Dbh9PTSA.js.map +0 -1
  172. package/dist/WithdrawalsSection-BL_LOUq8.cjs +0 -1
  173. package/dist/WithdrawalsSection-BL_LOUq8.cjs.map +0 -1
  174. package/dist/WithdrawalsSection-CN-lLnqX.js +0 -20
  175. package/dist/WithdrawalsSection-CN-lLnqX.js.map +0 -1
  176. package/dist/apiClient-B2JxVPlH.js.map +0 -1
  177. package/dist/apiClient-CTTKhsYb.cjs +0 -1
  178. package/dist/apiClient-CTTKhsYb.cjs.map +0 -1
  179. package/dist/silentWalletEnroll-B8pgdKZO.cjs +0 -1
  180. package/dist/useAdminDeposits-Dvx3_UUE.cjs +0 -1
  181. package/dist/useAuth-Bge6KaWN.js.map +0 -1
  182. package/dist/useAuth-DhIDTLRd.cjs +0 -1
  183. package/dist/useAuth-DhIDTLRd.cjs.map +0 -1
  184. package/dist/useOrgs-CVbacmaQ.cjs +0 -1
  185. package/dist/useSystemSettings-D9Cr7ZTl.cjs +0 -1
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const S=require("./useCedrosLogin-C9MrcZvh.cjs"),e=require("./useAuth-D3Pk_H3z.cjs"),t=require("./shamir-4DyQMJCk.cjs");async function T(A){const{password:p,serverUrl:h,accessToken:n,timeoutMs:y=3e4}=A,r=[];try{const s=e.generateSeed();r.push(s);const{shareA:a,shareB:o}=t.splitSecret(s);r.push(a,o);const c=e.generateArgon2Salt(),l=await t.argon2DeriveInWorker(p,c,e.DEFAULT_KDF_PARAMS);r.push(l);const i=await e.aesGcmEncryptToBase64(a,e.toEncryptionKey(l)),d=t.getPublicKeyFromSeed(s),u=t.publicKeyToBase58(d),g={solanaPubkey:u,shareAAuthMethod:"password",shareACiphertext:i.ciphertext,shareANonce:i.nonce,shareB:e.uint8ArrayToBase64(o),shareAKdfSalt:e.uint8ArrayToBase64(c),shareAKdfParams:e.DEFAULT_KDF_PARAMS};return await new S.ApiClient({baseUrl:h,timeoutMs:y,getAccessToken:n?()=>n:void 0}).post("/wallet/enroll",g),{success:!0,solanaPubkey:u}}catch(s){return{success:!1,error:s instanceof Error?s.message:"Wallet enrollment failed"}}finally{e.wipeAll(...r)}}exports.silentWalletEnroll=T;
@@ -1 +1 @@
1
- {"version":3,"file":"silentWalletEnroll-B8pgdKZO.cjs","sources":["../src/utils/silentWalletEnroll.ts"],"sourcesContent":["/**\n * Silent wallet enrollment utility\n *\n * Performs wallet enrollment in the background without UI interaction.\n * Used for auto-enrolling wallets during registration.\n *\n * Security: Uses the same Shamir Secret Sharing scheme as manual enrollment.\n * The recovery phrase is not shown - user can retrieve it later if needed.\n */\n\nimport {\n generateSeed,\n generateArgon2Salt,\n splitSecret,\n argon2DeriveInWorker,\n aesGcmEncryptToBase64,\n uint8ArrayToBase64,\n getPublicKeyFromSeed,\n publicKeyToBase58,\n wipeAll,\n toEncryptionKey,\n DEFAULT_KDF_PARAMS,\n} from '../crypto';\nimport { ApiClient } from './apiClient';\nimport type { WalletEnrollRequest } from '../types/wallet';\n\nexport interface SilentEnrollOptions {\n /** User's password for Share A encryption */\n password: string;\n /** Server base URL */\n serverUrl: string;\n /** Access token for authentication (optional if using cookies) */\n accessToken?: string;\n /** Request timeout in ms */\n timeoutMs?: number;\n}\n\nexport interface SilentEnrollResult {\n success: boolean;\n solanaPubkey?: string;\n error?: string;\n}\n\n/**\n * Silently enroll a wallet for a user\n *\n * This function performs the complete wallet enrollment process:\n * 1. Generate 32-byte seed\n * 2. Split into 3 Shamir shares (threshold 2)\n * 3. Encrypt Share A with password-derived key (Argon2id)\n * 4. Derive Solana public key from seed\n * 5. Upload encrypted Share A + plaintext Share B to server\n *\n * The recovery phrase (Share C) is not returned - user can recover it\n * later through the wallet recovery flow if needed.\n *\n * @param options - Enrollment options\n * @returns Result with success status and Solana public key\n */\nexport async function silentWalletEnroll(\n options: SilentEnrollOptions\n): Promise<SilentEnrollResult> {\n const { password, serverUrl, accessToken, timeoutMs = 30000 } = options;\n\n // Track sensitive data for cleanup\n const sensitiveData: Uint8Array[] = [];\n\n try {\n // Step 1: Generate seed\n const seed = generateSeed();\n sensitiveData.push(seed);\n\n // Step 2: Split into shares\n const { shareA, shareB } = splitSecret(seed);\n sensitiveData.push(shareA, shareB);\n\n // Step 3: Derive encryption key from password\n const salt = generateArgon2Salt();\n const key = await argon2DeriveInWorker(password, salt, DEFAULT_KDF_PARAMS);\n sensitiveData.push(key);\n\n // Step 4: Encrypt Share A\n const encryptedA = await aesGcmEncryptToBase64(shareA, toEncryptionKey(key));\n\n // Step 5: Derive Solana public key\n const publicKey = getPublicKeyFromSeed(seed);\n const solanaPubkey = publicKeyToBase58(publicKey);\n\n // Step 6: Build enrollment request\n // Only send encrypted shares — never send the raw seed to the server\n const request: WalletEnrollRequest = {\n solanaPubkey,\n shareAAuthMethod: 'password',\n shareACiphertext: encryptedA.ciphertext,\n shareANonce: encryptedA.nonce,\n shareB: uint8ArrayToBase64(shareB),\n shareAKdfSalt: uint8ArrayToBase64(salt),\n shareAKdfParams: DEFAULT_KDF_PARAMS,\n };\n\n // Step 7: Upload to server\n // If accessToken provided, use it; otherwise rely on cookies\n const apiClient = new ApiClient({\n baseUrl: serverUrl,\n timeoutMs,\n getAccessToken: accessToken ? () => accessToken : undefined,\n });\n\n await apiClient.post('/wallet/enroll', request);\n\n return {\n success: true,\n solanaPubkey,\n };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Wallet enrollment failed';\n // Silent failure - don't break registration flow\n return {\n success: false,\n error: errorMessage,\n };\n } finally {\n // Always wipe sensitive data\n wipeAll(...sensitiveData);\n }\n}\n"],"names":["silentWalletEnroll","options","password","serverUrl","accessToken","timeoutMs","sensitiveData","seed","generateSeed","shareA","shareB","splitSecret","salt","generateArgon2Salt","key","argon2DeriveInWorker","DEFAULT_KDF_PARAMS","encryptedA","aesGcmEncryptToBase64","toEncryptionKey","publicKey","getPublicKeyFromSeed","solanaPubkey","publicKeyToBase58","request","uint8ArrayToBase64","ApiClient","err","wipeAll"],"mappings":"mMA2DA,eAAsBA,EACpBC,EAC6B,CAC7B,KAAM,CAAE,SAAAC,EAAU,UAAAC,EAAW,YAAAC,EAAa,UAAAC,EAAY,KAAUJ,EAG1DK,EAA8B,CAAA,EAEpC,GAAI,CAEF,MAAMC,EAAOC,EAAAA,aAAA,EACbF,EAAc,KAAKC,CAAI,EAGvB,KAAM,CAAE,OAAAE,EAAQ,OAAAC,GAAWC,EAAAA,YAAYJ,CAAI,EAC3CD,EAAc,KAAKG,EAAQC,CAAM,EAGjC,MAAME,EAAOC,EAAAA,mBAAA,EACPC,EAAM,MAAMC,EAAAA,qBAAqBb,EAAUU,EAAMI,EAAAA,kBAAkB,EACzEV,EAAc,KAAKQ,CAAG,EAGtB,MAAMG,EAAa,MAAMC,EAAAA,sBAAsBT,EAAQU,EAAAA,gBAAgBL,CAAG,CAAC,EAGrEM,EAAYC,EAAAA,qBAAqBd,CAAI,EACrCe,EAAeC,EAAAA,kBAAkBH,CAAS,EAI1CI,EAA+B,CACnC,aAAAF,EACA,iBAAkB,WAClB,iBAAkBL,EAAW,WAC7B,YAAaA,EAAW,MACxB,OAAQQ,EAAAA,mBAAmBf,CAAM,EACjC,cAAee,EAAAA,mBAAmBb,CAAI,EACtC,gBAAiBI,EAAAA,kBAAA,EAWnB,aANkB,IAAIU,YAAU,CAC9B,QAASvB,EACT,UAAAE,EACA,eAAgBD,EAAc,IAAMA,EAAc,MAAA,CACnD,EAEe,KAAK,iBAAkBoB,CAAO,EAEvC,CACL,QAAS,GACT,aAAAF,CAAA,CAEJ,OAASK,EAAK,CAGZ,MAAO,CACL,QAAS,GACT,MAJmBA,aAAe,MAAQA,EAAI,QAAU,0BAIjD,CAEX,QAAA,CAEEC,EAAAA,QAAQ,GAAGtB,CAAa,CAC1B,CACF"}
1
+ {"version":3,"file":"silentWalletEnroll-BgTb4H5I.cjs","sources":["../src/utils/silentWalletEnroll.ts"],"sourcesContent":["/**\n * Silent wallet enrollment utility\n *\n * Performs wallet enrollment in the background without UI interaction.\n * Used for auto-enrolling wallets during registration.\n *\n * Security: Uses the same Shamir Secret Sharing scheme as manual enrollment.\n * The recovery phrase is not shown - user can retrieve it later if needed.\n */\n\nimport {\n generateSeed,\n generateArgon2Salt,\n splitSecret,\n argon2DeriveInWorker,\n aesGcmEncryptToBase64,\n uint8ArrayToBase64,\n getPublicKeyFromSeed,\n publicKeyToBase58,\n wipeAll,\n toEncryptionKey,\n DEFAULT_KDF_PARAMS,\n} from '../crypto';\nimport { ApiClient } from './apiClient';\nimport type { WalletEnrollRequest } from '../types/wallet';\n\nexport interface SilentEnrollOptions {\n /** User's password for Share A encryption */\n password: string;\n /** Server base URL */\n serverUrl: string;\n /** Access token for authentication (optional if using cookies) */\n accessToken?: string;\n /** Request timeout in ms */\n timeoutMs?: number;\n}\n\nexport interface SilentEnrollResult {\n success: boolean;\n solanaPubkey?: string;\n error?: string;\n}\n\n/**\n * Silently enroll a wallet for a user\n *\n * This function performs the complete wallet enrollment process:\n * 1. Generate 32-byte seed\n * 2. Split into 3 Shamir shares (threshold 2)\n * 3. Encrypt Share A with password-derived key (Argon2id)\n * 4. Derive Solana public key from seed\n * 5. Upload encrypted Share A + plaintext Share B to server\n *\n * The recovery phrase (Share C) is not returned - user can recover it\n * later through the wallet recovery flow if needed.\n *\n * @param options - Enrollment options\n * @returns Result with success status and Solana public key\n */\nexport async function silentWalletEnroll(\n options: SilentEnrollOptions\n): Promise<SilentEnrollResult> {\n const { password, serverUrl, accessToken, timeoutMs = 30000 } = options;\n\n // Track sensitive data for cleanup\n const sensitiveData: Uint8Array[] = [];\n\n try {\n // Step 1: Generate seed\n const seed = generateSeed();\n sensitiveData.push(seed);\n\n // Step 2: Split into shares\n const { shareA, shareB } = splitSecret(seed);\n sensitiveData.push(shareA, shareB);\n\n // Step 3: Derive encryption key from password\n const salt = generateArgon2Salt();\n const key = await argon2DeriveInWorker(password, salt, DEFAULT_KDF_PARAMS);\n sensitiveData.push(key);\n\n // Step 4: Encrypt Share A\n const encryptedA = await aesGcmEncryptToBase64(shareA, toEncryptionKey(key));\n\n // Step 5: Derive Solana public key\n const publicKey = getPublicKeyFromSeed(seed);\n const solanaPubkey = publicKeyToBase58(publicKey);\n\n // Step 6: Build enrollment request\n // Only send encrypted shares — never send the raw seed to the server\n const request: WalletEnrollRequest = {\n solanaPubkey,\n shareAAuthMethod: 'password',\n shareACiphertext: encryptedA.ciphertext,\n shareANonce: encryptedA.nonce,\n shareB: uint8ArrayToBase64(shareB),\n shareAKdfSalt: uint8ArrayToBase64(salt),\n shareAKdfParams: DEFAULT_KDF_PARAMS,\n };\n\n // Step 7: Upload to server\n // If accessToken provided, use it; otherwise rely on cookies\n const apiClient = new ApiClient({\n baseUrl: serverUrl,\n timeoutMs,\n getAccessToken: accessToken ? () => accessToken : undefined,\n });\n\n await apiClient.post('/wallet/enroll', request);\n\n return {\n success: true,\n solanaPubkey,\n };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Wallet enrollment failed';\n // Silent failure - don't break registration flow\n return {\n success: false,\n error: errorMessage,\n };\n } finally {\n // Always wipe sensitive data\n wipeAll(...sensitiveData);\n }\n}\n"],"names":["silentWalletEnroll","options","password","serverUrl","accessToken","timeoutMs","sensitiveData","seed","generateSeed","shareA","shareB","splitSecret","salt","generateArgon2Salt","key","argon2DeriveInWorker","DEFAULT_KDF_PARAMS","encryptedA","aesGcmEncryptToBase64","toEncryptionKey","publicKey","getPublicKeyFromSeed","solanaPubkey","publicKeyToBase58","request","uint8ArrayToBase64","ApiClient","err","wipeAll"],"mappings":"wMA2DA,eAAsBA,EACpBC,EAC6B,CAC7B,KAAM,CAAE,SAAAC,EAAU,UAAAC,EAAW,YAAAC,EAAa,UAAAC,EAAY,KAAUJ,EAG1DK,EAA8B,CAAA,EAEpC,GAAI,CAEF,MAAMC,EAAOC,EAAAA,aAAA,EACbF,EAAc,KAAKC,CAAI,EAGvB,KAAM,CAAE,OAAAE,EAAQ,OAAAC,GAAWC,EAAAA,YAAYJ,CAAI,EAC3CD,EAAc,KAAKG,EAAQC,CAAM,EAGjC,MAAME,EAAOC,EAAAA,mBAAA,EACPC,EAAM,MAAMC,EAAAA,qBAAqBb,EAAUU,EAAMI,EAAAA,kBAAkB,EACzEV,EAAc,KAAKQ,CAAG,EAGtB,MAAMG,EAAa,MAAMC,EAAAA,sBAAsBT,EAAQU,EAAAA,gBAAgBL,CAAG,CAAC,EAGrEM,EAAYC,EAAAA,qBAAqBd,CAAI,EACrCe,EAAeC,EAAAA,kBAAkBH,CAAS,EAI1CI,EAA+B,CACnC,aAAAF,EACA,iBAAkB,WAClB,iBAAkBL,EAAW,WAC7B,YAAaA,EAAW,MACxB,OAAQQ,EAAAA,mBAAmBf,CAAM,EACjC,cAAee,EAAAA,mBAAmBb,CAAI,EACtC,gBAAiBI,EAAAA,kBAAA,EAWnB,aANkB,IAAIU,YAAU,CAC9B,QAASvB,EACT,UAAAE,EACA,eAAgBD,EAAc,IAAMA,EAAc,MAAA,CACnD,EAEe,KAAK,iBAAkBoB,CAAO,EAEvC,CACL,QAAS,GACT,aAAAF,CAAA,CAEJ,OAASK,EAAK,CAGZ,MAAO,CACL,QAAS,GACT,MAJmBA,aAAe,MAAQA,EAAI,QAAU,0BAIjD,CAEX,QAAA,CAEEC,EAAAA,QAAQ,GAAGtB,CAAa,CAC1B,CACF"}
@@ -1,6 +1,6 @@
1
- import { A as g } from "./apiClient-B2JxVPlH.js";
2
- import { g as f, a as w, D as i, b as K, t as b, c as p, w as S } from "./useAuth-Bge6KaWN.js";
3
- import { s as T, a as k, g as B, p as D } from "./shamir-B0wConeK.js";
1
+ import { A as g } from "./useCedrosLogin-_94MmGGq.js";
2
+ import { g as f, a as w, D as i, b as K, t as b, c as p, w as S } from "./useAuth-C3dpk0po.js";
3
+ import { s as T, a as k, g as B, p as D } from "./shamir-L-s-Tp1Z.js";
4
4
  async function P(u) {
5
5
  const { password: A, serverUrl: h, accessToken: r, timeoutMs: y = 3e4 } = u, s = [];
6
6
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"silentWalletEnroll-DR2kPw7W.js","sources":["../src/utils/silentWalletEnroll.ts"],"sourcesContent":["/**\n * Silent wallet enrollment utility\n *\n * Performs wallet enrollment in the background without UI interaction.\n * Used for auto-enrolling wallets during registration.\n *\n * Security: Uses the same Shamir Secret Sharing scheme as manual enrollment.\n * The recovery phrase is not shown - user can retrieve it later if needed.\n */\n\nimport {\n generateSeed,\n generateArgon2Salt,\n splitSecret,\n argon2DeriveInWorker,\n aesGcmEncryptToBase64,\n uint8ArrayToBase64,\n getPublicKeyFromSeed,\n publicKeyToBase58,\n wipeAll,\n toEncryptionKey,\n DEFAULT_KDF_PARAMS,\n} from '../crypto';\nimport { ApiClient } from './apiClient';\nimport type { WalletEnrollRequest } from '../types/wallet';\n\nexport interface SilentEnrollOptions {\n /** User's password for Share A encryption */\n password: string;\n /** Server base URL */\n serverUrl: string;\n /** Access token for authentication (optional if using cookies) */\n accessToken?: string;\n /** Request timeout in ms */\n timeoutMs?: number;\n}\n\nexport interface SilentEnrollResult {\n success: boolean;\n solanaPubkey?: string;\n error?: string;\n}\n\n/**\n * Silently enroll a wallet for a user\n *\n * This function performs the complete wallet enrollment process:\n * 1. Generate 32-byte seed\n * 2. Split into 3 Shamir shares (threshold 2)\n * 3. Encrypt Share A with password-derived key (Argon2id)\n * 4. Derive Solana public key from seed\n * 5. Upload encrypted Share A + plaintext Share B to server\n *\n * The recovery phrase (Share C) is not returned - user can recover it\n * later through the wallet recovery flow if needed.\n *\n * @param options - Enrollment options\n * @returns Result with success status and Solana public key\n */\nexport async function silentWalletEnroll(\n options: SilentEnrollOptions\n): Promise<SilentEnrollResult> {\n const { password, serverUrl, accessToken, timeoutMs = 30000 } = options;\n\n // Track sensitive data for cleanup\n const sensitiveData: Uint8Array[] = [];\n\n try {\n // Step 1: Generate seed\n const seed = generateSeed();\n sensitiveData.push(seed);\n\n // Step 2: Split into shares\n const { shareA, shareB } = splitSecret(seed);\n sensitiveData.push(shareA, shareB);\n\n // Step 3: Derive encryption key from password\n const salt = generateArgon2Salt();\n const key = await argon2DeriveInWorker(password, salt, DEFAULT_KDF_PARAMS);\n sensitiveData.push(key);\n\n // Step 4: Encrypt Share A\n const encryptedA = await aesGcmEncryptToBase64(shareA, toEncryptionKey(key));\n\n // Step 5: Derive Solana public key\n const publicKey = getPublicKeyFromSeed(seed);\n const solanaPubkey = publicKeyToBase58(publicKey);\n\n // Step 6: Build enrollment request\n // Only send encrypted shares — never send the raw seed to the server\n const request: WalletEnrollRequest = {\n solanaPubkey,\n shareAAuthMethod: 'password',\n shareACiphertext: encryptedA.ciphertext,\n shareANonce: encryptedA.nonce,\n shareB: uint8ArrayToBase64(shareB),\n shareAKdfSalt: uint8ArrayToBase64(salt),\n shareAKdfParams: DEFAULT_KDF_PARAMS,\n };\n\n // Step 7: Upload to server\n // If accessToken provided, use it; otherwise rely on cookies\n const apiClient = new ApiClient({\n baseUrl: serverUrl,\n timeoutMs,\n getAccessToken: accessToken ? () => accessToken : undefined,\n });\n\n await apiClient.post('/wallet/enroll', request);\n\n return {\n success: true,\n solanaPubkey,\n };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Wallet enrollment failed';\n // Silent failure - don't break registration flow\n return {\n success: false,\n error: errorMessage,\n };\n } finally {\n // Always wipe sensitive data\n wipeAll(...sensitiveData);\n }\n}\n"],"names":["silentWalletEnroll","options","password","serverUrl","accessToken","timeoutMs","sensitiveData","seed","generateSeed","shareA","shareB","splitSecret","salt","generateArgon2Salt","key","argon2DeriveInWorker","DEFAULT_KDF_PARAMS","encryptedA","aesGcmEncryptToBase64","toEncryptionKey","publicKey","getPublicKeyFromSeed","solanaPubkey","publicKeyToBase58","request","uint8ArrayToBase64","ApiClient","err","wipeAll"],"mappings":";;;AA2DA,eAAsBA,EACpBC,GAC6B;AAC7B,QAAM,EAAE,UAAAC,GAAU,WAAAC,GAAW,aAAAC,GAAa,WAAAC,IAAY,QAAUJ,GAG1DK,IAA8B,CAAA;AAEpC,MAAI;AAEF,UAAMC,IAAOC,EAAA;AACb,IAAAF,EAAc,KAAKC,CAAI;AAGvB,UAAM,EAAE,QAAAE,GAAQ,QAAAC,MAAWC,EAAYJ,CAAI;AAC3C,IAAAD,EAAc,KAAKG,GAAQC,CAAM;AAGjC,UAAME,IAAOC,EAAA,GACPC,IAAM,MAAMC,EAAqBb,GAAUU,GAAMI,CAAkB;AACzE,IAAAV,EAAc,KAAKQ,CAAG;AAGtB,UAAMG,IAAa,MAAMC,EAAsBT,GAAQU,EAAgBL,CAAG,CAAC,GAGrEM,IAAYC,EAAqBd,CAAI,GACrCe,IAAeC,EAAkBH,CAAS,GAI1CI,IAA+B;AAAA,MACnC,cAAAF;AAAA,MACA,kBAAkB;AAAA,MAClB,kBAAkBL,EAAW;AAAA,MAC7B,aAAaA,EAAW;AAAA,MACxB,QAAQQ,EAAmBf,CAAM;AAAA,MACjC,eAAee,EAAmBb,CAAI;AAAA,MACtC,iBAAiBI;AAAA,IAAA;AAWnB,iBANkB,IAAIU,EAAU;AAAA,MAC9B,SAASvB;AAAA,MACT,WAAAE;AAAA,MACA,gBAAgBD,IAAc,MAAMA,IAAc;AAAA,IAAA,CACnD,EAEe,KAAK,kBAAkBoB,CAAO,GAEvC;AAAA,MACL,SAAS;AAAA,MACT,cAAAF;AAAA,IAAA;AAAA,EAEJ,SAASK,GAAK;AAGZ,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAJmBA,aAAe,QAAQA,EAAI,UAAU;AAAA,IAIjD;AAAA,EAEX,UAAA;AAEE,IAAAC,EAAQ,GAAGtB,CAAa;AAAA,EAC1B;AACF;"}
1
+ {"version":3,"file":"silentWalletEnroll-DWt6Pr3B.js","sources":["../src/utils/silentWalletEnroll.ts"],"sourcesContent":["/**\n * Silent wallet enrollment utility\n *\n * Performs wallet enrollment in the background without UI interaction.\n * Used for auto-enrolling wallets during registration.\n *\n * Security: Uses the same Shamir Secret Sharing scheme as manual enrollment.\n * The recovery phrase is not shown - user can retrieve it later if needed.\n */\n\nimport {\n generateSeed,\n generateArgon2Salt,\n splitSecret,\n argon2DeriveInWorker,\n aesGcmEncryptToBase64,\n uint8ArrayToBase64,\n getPublicKeyFromSeed,\n publicKeyToBase58,\n wipeAll,\n toEncryptionKey,\n DEFAULT_KDF_PARAMS,\n} from '../crypto';\nimport { ApiClient } from './apiClient';\nimport type { WalletEnrollRequest } from '../types/wallet';\n\nexport interface SilentEnrollOptions {\n /** User's password for Share A encryption */\n password: string;\n /** Server base URL */\n serverUrl: string;\n /** Access token for authentication (optional if using cookies) */\n accessToken?: string;\n /** Request timeout in ms */\n timeoutMs?: number;\n}\n\nexport interface SilentEnrollResult {\n success: boolean;\n solanaPubkey?: string;\n error?: string;\n}\n\n/**\n * Silently enroll a wallet for a user\n *\n * This function performs the complete wallet enrollment process:\n * 1. Generate 32-byte seed\n * 2. Split into 3 Shamir shares (threshold 2)\n * 3. Encrypt Share A with password-derived key (Argon2id)\n * 4. Derive Solana public key from seed\n * 5. Upload encrypted Share A + plaintext Share B to server\n *\n * The recovery phrase (Share C) is not returned - user can recover it\n * later through the wallet recovery flow if needed.\n *\n * @param options - Enrollment options\n * @returns Result with success status and Solana public key\n */\nexport async function silentWalletEnroll(\n options: SilentEnrollOptions\n): Promise<SilentEnrollResult> {\n const { password, serverUrl, accessToken, timeoutMs = 30000 } = options;\n\n // Track sensitive data for cleanup\n const sensitiveData: Uint8Array[] = [];\n\n try {\n // Step 1: Generate seed\n const seed = generateSeed();\n sensitiveData.push(seed);\n\n // Step 2: Split into shares\n const { shareA, shareB } = splitSecret(seed);\n sensitiveData.push(shareA, shareB);\n\n // Step 3: Derive encryption key from password\n const salt = generateArgon2Salt();\n const key = await argon2DeriveInWorker(password, salt, DEFAULT_KDF_PARAMS);\n sensitiveData.push(key);\n\n // Step 4: Encrypt Share A\n const encryptedA = await aesGcmEncryptToBase64(shareA, toEncryptionKey(key));\n\n // Step 5: Derive Solana public key\n const publicKey = getPublicKeyFromSeed(seed);\n const solanaPubkey = publicKeyToBase58(publicKey);\n\n // Step 6: Build enrollment request\n // Only send encrypted shares — never send the raw seed to the server\n const request: WalletEnrollRequest = {\n solanaPubkey,\n shareAAuthMethod: 'password',\n shareACiphertext: encryptedA.ciphertext,\n shareANonce: encryptedA.nonce,\n shareB: uint8ArrayToBase64(shareB),\n shareAKdfSalt: uint8ArrayToBase64(salt),\n shareAKdfParams: DEFAULT_KDF_PARAMS,\n };\n\n // Step 7: Upload to server\n // If accessToken provided, use it; otherwise rely on cookies\n const apiClient = new ApiClient({\n baseUrl: serverUrl,\n timeoutMs,\n getAccessToken: accessToken ? () => accessToken : undefined,\n });\n\n await apiClient.post('/wallet/enroll', request);\n\n return {\n success: true,\n solanaPubkey,\n };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Wallet enrollment failed';\n // Silent failure - don't break registration flow\n return {\n success: false,\n error: errorMessage,\n };\n } finally {\n // Always wipe sensitive data\n wipeAll(...sensitiveData);\n }\n}\n"],"names":["silentWalletEnroll","options","password","serverUrl","accessToken","timeoutMs","sensitiveData","seed","generateSeed","shareA","shareB","splitSecret","salt","generateArgon2Salt","key","argon2DeriveInWorker","DEFAULT_KDF_PARAMS","encryptedA","aesGcmEncryptToBase64","toEncryptionKey","publicKey","getPublicKeyFromSeed","solanaPubkey","publicKeyToBase58","request","uint8ArrayToBase64","ApiClient","err","wipeAll"],"mappings":";;;AA2DA,eAAsBA,EACpBC,GAC6B;AAC7B,QAAM,EAAE,UAAAC,GAAU,WAAAC,GAAW,aAAAC,GAAa,WAAAC,IAAY,QAAUJ,GAG1DK,IAA8B,CAAA;AAEpC,MAAI;AAEF,UAAMC,IAAOC,EAAA;AACb,IAAAF,EAAc,KAAKC,CAAI;AAGvB,UAAM,EAAE,QAAAE,GAAQ,QAAAC,MAAWC,EAAYJ,CAAI;AAC3C,IAAAD,EAAc,KAAKG,GAAQC,CAAM;AAGjC,UAAME,IAAOC,EAAA,GACPC,IAAM,MAAMC,EAAqBb,GAAUU,GAAMI,CAAkB;AACzE,IAAAV,EAAc,KAAKQ,CAAG;AAGtB,UAAMG,IAAa,MAAMC,EAAsBT,GAAQU,EAAgBL,CAAG,CAAC,GAGrEM,IAAYC,EAAqBd,CAAI,GACrCe,IAAeC,EAAkBH,CAAS,GAI1CI,IAA+B;AAAA,MACnC,cAAAF;AAAA,MACA,kBAAkB;AAAA,MAClB,kBAAkBL,EAAW;AAAA,MAC7B,aAAaA,EAAW;AAAA,MACxB,QAAQQ,EAAmBf,CAAM;AAAA,MACjC,eAAee,EAAmBb,CAAI;AAAA,MACtC,iBAAiBI;AAAA,IAAA;AAWnB,iBANkB,IAAIU,EAAU;AAAA,MAC9B,SAASvB;AAAA,MACT,WAAAE;AAAA,MACA,gBAAgBD,IAAc,MAAMA,IAAc;AAAA,IAAA,CACnD,EAEe,KAAK,kBAAkBoB,CAAO,GAEvC;AAAA,MACL,SAAS;AAAA,MACT,cAAAF;AAAA,IAAA;AAAA,EAEJ,SAASK,GAAK;AAGZ,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAJmBA,aAAe,QAAQA,EAAI,UAAU;AAAA,IAIjD;AAAA,EAEX,UAAA;AAEE,IAAAC,EAAQ,GAAGtB,CAAa;AAAA,EAC1B;AACF;"}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./useAuth-DhIDTLRd.cjs"),r=require("./apiClient-CTTKhsYb.cjs"),o=require("./SolanaLoginButton-fAW7kRUu.cjs"),n=require("./LoadingSpinner-d6sSxgQN.cjs"),i=require("./ErrorMessage-CHbYbVi2.cjs");exports.CedrosLoginProvider=e.CedrosLoginProvider;exports.useAuth=e.useAuth;exports.useCedrosLogin=r.useCedrosLogin;exports.SolanaLoginButton=o.SolanaLoginButton;exports.useSolanaAuth=o.useSolanaAuth;exports.LoadingSpinner=n.LoadingSpinner;exports.ErrorMessage=i.ErrorMessage;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./useAuth-D3Pk_H3z.cjs"),r=require("./useCedrosLogin-C9MrcZvh.cjs"),o=require("./SolanaLoginButton-BjOxpE1C.cjs"),n=require("./LoadingSpinner-d6sSxgQN.cjs"),s=require("./ErrorMessage-CHbYbVi2.cjs");exports.CedrosLoginProvider=e.CedrosLoginProvider;exports.useAuth=e.useAuth;exports.useCedrosLogin=r.useCedrosLogin;exports.SolanaLoginButton=o.SolanaLoginButton;exports.useSolanaAuth=o.useSolanaAuth;exports.LoadingSpinner=n.LoadingSpinner;exports.ErrorMessage=s.ErrorMessage;
@@ -157,10 +157,19 @@ declare interface CedrosLoginInternalAPI {
157
157
  * </CedrosLoginProvider>
158
158
  * ```
159
159
  */
160
- export declare function CedrosLoginProvider({ config, children }: CedrosLoginProviderProps): JSX.Element;
160
+ export declare function CedrosLoginProvider({ config, children }: CedrosLoginProviderProps): JSX.Element | null;
161
+
162
+ /**
163
+ * Config accepted by CedrosLoginProvider.
164
+ * Same as CedrosLoginConfig but `features` also accepts `'auto'`
165
+ * to fetch enabled methods from the server at startup.
166
+ */
167
+ declare type CedrosLoginProviderConfig = Omit<CedrosLoginConfig, 'features'> & {
168
+ features?: FeatureFlags | 'auto';
169
+ };
161
170
 
162
171
  declare interface CedrosLoginProviderProps {
163
- config: CedrosLoginConfig;
172
+ config: CedrosLoginProviderConfig;
164
173
  children: ReactNode;
165
174
  }
166
175
 
@@ -235,6 +244,8 @@ export declare interface FeatureFlags {
235
244
  solana?: boolean;
236
245
  /** Enable WebAuthn passkeys (server-managed). Default: true */
237
246
  webauthn?: boolean;
247
+ /** Enable instant-link passwordless sign-in. Default: false */
248
+ instantLink?: boolean;
238
249
  /** Enable embedded wallet auto-enrollment on registration. Default: true */
239
250
  walletEnrollment?: boolean;
240
251
  }
@@ -1,6 +1,6 @@
1
- import { C as e, u as s } from "./useAuth-Bge6KaWN.js";
2
- import { u as n } from "./apiClient-B2JxVPlH.js";
3
- import { S as u, u as i } from "./SolanaLoginButton-C_u9OppS.js";
1
+ import { C as e, u as s } from "./useAuth-C3dpk0po.js";
2
+ import { u as n } from "./useCedrosLogin-_94MmGGq.js";
3
+ import { S as u, u as i } from "./SolanaLoginButton-P22QjBaO.js";
4
4
  import { L as f } from "./LoadingSpinner-6vml-zwr.js";
5
5
  import { E as m } from "./ErrorMessage-CcEK0pYO.js";
6
6
  export {
@@ -1,5 +1,5 @@
1
1
  import { useState as u, useMemo as P, useCallback as o } from "react";
2
- import { a as L, A as C, h as d } from "./apiClient-B2JxVPlH.js";
2
+ import { a as L, A as C, h as d } from "./useCedrosLogin-_94MmGGq.js";
3
3
  function F() {
4
4
  const l = L(), [w, a] = u(!1), [m, i] = u(null), s = P(() => l ? new C({
5
5
  baseUrl: l.config.serverUrl,
@@ -1 +1 @@
1
- {"version":3,"file":"useAdminDeposits-BDY5KJ0-.js","sources":["../src/hooks/useAdminDeposits.ts"],"sourcesContent":["/**\n * Hook for admin Privacy Cash deposit operations\n *\n * Provides admin-only access to view all deposits, statistics, and pending withdrawals.\n * Requires system admin privileges.\n *\n * Safe to call outside CedrosLoginProvider (returns no-op functions).\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport { useCedrosLoginOptional } from '../context/useCedrosLogin';\nimport { ApiClient, handleApiError } from '../utils/apiClient';\nimport type {\n UseAdminDepositsReturn,\n AdminDepositListResponse,\n AdminDepositStatsResponse,\n ProcessWithdrawalRequest,\n ProcessWithdrawalResponse,\n ProcessAllWithdrawalsResponse,\n PrivacyStatusResponse,\n AdminCreditStatsResponse,\n} from '../types/deposit';\n\nexport type { UseAdminDepositsReturn } from '../types/deposit';\n\n/**\n * Hook for admin Privacy Cash deposit operations\n *\n * Requires system admin privileges. All methods will fail with 403 if not admin.\n *\n * Safe to call outside CedrosLoginProvider - returns no-op functions that throw.\n */\nexport function useAdminDeposits(): UseAdminDepositsReturn {\n const context = useCedrosLoginOptional();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const apiClient = useMemo(() => {\n if (!context) return null;\n return new ApiClient({\n baseUrl: context.config.serverUrl,\n timeoutMs: context.config.requestTimeout,\n retryAttempts: context.config.retryAttempts,\n getAccessToken: context._internal?.getAccessToken,\n });\n }, [context]);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n const listDeposits = useCallback(\n async (options?: {\n status?: string;\n limit?: number;\n offset?: number;\n }): Promise<AdminDepositListResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const params = new URLSearchParams();\n if (options?.status) params.set('status', options.status);\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.offset !== undefined) params.set('offset', String(options.offset));\n const query = params.toString();\n const url = query ? `/admin/deposits?${query}` : '/admin/deposits';\n const data = await apiClient.get<AdminDepositListResponse>(url);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to list deposits');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getStats = useCallback(async (): Promise<AdminDepositStatsResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<AdminDepositStatsResponse>('/admin/deposits/stats');\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get deposit stats');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const listInPrivacyPeriod = useCallback(\n async (options?: { limit?: number; offset?: number }): Promise<AdminDepositListResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const params = new URLSearchParams();\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.offset !== undefined) params.set('offset', String(options.offset));\n const query = params.toString();\n const url = query\n ? `/admin/deposits/in-privacy-period?${query}`\n : '/admin/deposits/in-privacy-period';\n const data = await apiClient.get<AdminDepositListResponse>(url);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to list deposits in privacy period');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const listPendingWithdrawals = useCallback(\n async (options?: { limit?: number; offset?: number }): Promise<AdminDepositListResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const params = new URLSearchParams();\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.offset !== undefined) params.set('offset', String(options.offset));\n const query = params.toString();\n const url = query ? `/admin/withdrawals/pending?${query}` : '/admin/withdrawals/pending';\n const data = await apiClient.get<AdminDepositListResponse>(url);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to list pending withdrawals');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const processWithdrawal = useCallback(\n async (\n sessionId: string,\n options?: ProcessWithdrawalRequest\n ): Promise<ProcessWithdrawalResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.post<ProcessWithdrawalResponse>(\n `/admin/withdrawals/${sessionId}/process`,\n options ?? {}\n );\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to process withdrawal');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const processAllWithdrawals = useCallback(async (): Promise<ProcessAllWithdrawalsResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.post<ProcessAllWithdrawalsResponse>(\n '/admin/withdrawals/process-all',\n {}\n );\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to process withdrawals');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const getPrivacyStatus = useCallback(async (): Promise<PrivacyStatusResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<PrivacyStatusResponse>('/admin/privacy/status');\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get privacy status');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const getCreditStats = useCallback(async (): Promise<AdminCreditStatsResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<AdminCreditStatsResponse>('/admin/credits/stats');\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get credit stats');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n return {\n listDeposits,\n getStats,\n listInPrivacyPeriod,\n listPendingWithdrawals,\n processWithdrawal,\n processAllWithdrawals,\n getPrivacyStatus,\n getCreditStats,\n isLoading,\n error,\n clearError,\n };\n}\n"],"names":["useAdminDeposits","context","useCedrosLoginOptional","isLoading","setIsLoading","useState","error","setError","apiClient","useMemo","ApiClient","clearError","useCallback","listDeposits","options","params","query","url","err","apiError","handleApiError","getStats","listInPrivacyPeriod","listPendingWithdrawals","processWithdrawal","sessionId","processAllWithdrawals","getPrivacyStatus","getCreditStats"],"mappings":"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"}
1
+ {"version":3,"file":"useAdminDeposits-BTSyeAfg.js","sources":["../src/hooks/useAdminDeposits.ts"],"sourcesContent":["/**\n * Hook for admin Privacy Cash deposit operations\n *\n * Provides admin-only access to view all deposits, statistics, and pending withdrawals.\n * Requires system admin privileges.\n *\n * Safe to call outside CedrosLoginProvider (returns no-op functions).\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport { useCedrosLoginOptional } from '../context/useCedrosLogin';\nimport { ApiClient, handleApiError } from '../utils/apiClient';\nimport type {\n UseAdminDepositsReturn,\n AdminDepositListResponse,\n AdminDepositStatsResponse,\n ProcessWithdrawalRequest,\n ProcessWithdrawalResponse,\n ProcessAllWithdrawalsResponse,\n PrivacyStatusResponse,\n AdminCreditStatsResponse,\n} from '../types/deposit';\n\nexport type { UseAdminDepositsReturn } from '../types/deposit';\n\n/**\n * Hook for admin Privacy Cash deposit operations\n *\n * Requires system admin privileges. All methods will fail with 403 if not admin.\n *\n * Safe to call outside CedrosLoginProvider - returns no-op functions that throw.\n */\nexport function useAdminDeposits(): UseAdminDepositsReturn {\n const context = useCedrosLoginOptional();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const apiClient = useMemo(() => {\n if (!context) return null;\n return new ApiClient({\n baseUrl: context.config.serverUrl,\n timeoutMs: context.config.requestTimeout,\n retryAttempts: context.config.retryAttempts,\n getAccessToken: context._internal?.getAccessToken,\n });\n }, [context]);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n const listDeposits = useCallback(\n async (options?: {\n status?: string;\n limit?: number;\n offset?: number;\n }): Promise<AdminDepositListResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const params = new URLSearchParams();\n if (options?.status) params.set('status', options.status);\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.offset !== undefined) params.set('offset', String(options.offset));\n const query = params.toString();\n const url = query ? `/admin/deposits?${query}` : '/admin/deposits';\n const data = await apiClient.get<AdminDepositListResponse>(url);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to list deposits');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getStats = useCallback(async (): Promise<AdminDepositStatsResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<AdminDepositStatsResponse>('/admin/deposits/stats');\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get deposit stats');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const listInPrivacyPeriod = useCallback(\n async (options?: { limit?: number; offset?: number }): Promise<AdminDepositListResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const params = new URLSearchParams();\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.offset !== undefined) params.set('offset', String(options.offset));\n const query = params.toString();\n const url = query\n ? `/admin/deposits/in-privacy-period?${query}`\n : '/admin/deposits/in-privacy-period';\n const data = await apiClient.get<AdminDepositListResponse>(url);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to list deposits in privacy period');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const listPendingWithdrawals = useCallback(\n async (options?: { limit?: number; offset?: number }): Promise<AdminDepositListResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const params = new URLSearchParams();\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.offset !== undefined) params.set('offset', String(options.offset));\n const query = params.toString();\n const url = query ? `/admin/withdrawals/pending?${query}` : '/admin/withdrawals/pending';\n const data = await apiClient.get<AdminDepositListResponse>(url);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to list pending withdrawals');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const processWithdrawal = useCallback(\n async (\n sessionId: string,\n options?: ProcessWithdrawalRequest\n ): Promise<ProcessWithdrawalResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.post<ProcessWithdrawalResponse>(\n `/admin/withdrawals/${sessionId}/process`,\n options ?? {}\n );\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to process withdrawal');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const processAllWithdrawals = useCallback(async (): Promise<ProcessAllWithdrawalsResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.post<ProcessAllWithdrawalsResponse>(\n '/admin/withdrawals/process-all',\n {}\n );\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to process withdrawals');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const getPrivacyStatus = useCallback(async (): Promise<PrivacyStatusResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<PrivacyStatusResponse>('/admin/privacy/status');\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get privacy status');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const getCreditStats = useCallback(async (): Promise<AdminCreditStatsResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<AdminCreditStatsResponse>('/admin/credits/stats');\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get credit stats');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n return {\n listDeposits,\n getStats,\n listInPrivacyPeriod,\n listPendingWithdrawals,\n processWithdrawal,\n processAllWithdrawals,\n getPrivacyStatus,\n getCreditStats,\n isLoading,\n error,\n clearError,\n };\n}\n"],"names":["useAdminDeposits","context","useCedrosLoginOptional","isLoading","setIsLoading","useState","error","setError","apiClient","useMemo","ApiClient","clearError","useCallback","listDeposits","options","params","query","url","err","apiError","handleApiError","getStats","listInPrivacyPeriod","listPendingWithdrawals","processWithdrawal","sessionId","processAllWithdrawals","getPrivacyStatus","getCreditStats"],"mappings":";;AAgCO,SAASA,IAA2C;AACzD,QAAMC,IAAUC,EAAA,GACV,CAACC,GAAWC,CAAY,IAAIC,EAAS,EAAK,GAC1C,CAACC,GAAOC,CAAQ,IAAIF,EAAwB,IAAI,GAEhDG,IAAYC,EAAQ,MACnBR,IACE,IAAIS,EAAU;AAAA,IACnB,SAAST,EAAQ,OAAO;AAAA,IACxB,WAAWA,EAAQ,OAAO;AAAA,IAC1B,eAAeA,EAAQ,OAAO;AAAA,IAC9B,gBAAgBA,EAAQ,WAAW;AAAA,EAAA,CACpC,IANoB,MAOpB,CAACA,CAAO,CAAC,GAENU,IAAaC,EAAY,MAAM;AACnC,IAAAL,EAAS,IAAI;AAAA,EACf,GAAG,CAAA,CAAE,GAECM,IAAeD;AAAA,IACnB,OAAOE,MAIkC;AACvC,UAAI,CAACN;AACH,cAAM,IAAI,MAAM,4DAA4D;AAE9E,MAAAJ,EAAa,EAAI,GACjBG,EAAS,IAAI;AAEb,UAAI;AACF,cAAMQ,IAAS,IAAI,gBAAA;AACnB,QAAID,GAAS,UAAQC,EAAO,IAAI,UAAUD,EAAQ,MAAM,GACpDA,GAAS,UAAU,UAAWC,EAAO,IAAI,SAAS,OAAOD,EAAQ,KAAK,CAAC,GACvEA,GAAS,WAAW,UAAWC,EAAO,IAAI,UAAU,OAAOD,EAAQ,MAAM,CAAC;AAC9E,cAAME,IAAQD,EAAO,SAAA,GACfE,IAAMD,IAAQ,mBAAmBA,CAAK,KAAK;AAEjD,eADa,MAAMR,EAAU,IAA8BS,CAAG;AAAA,MAEhE,SAASC,GAAK;AACZ,cAAMC,IAAWC,EAAeF,GAAK,yBAAyB;AAC9D,cAAAX,EAASY,EAAS,OAAO,GACnBA;AAAA,MACR,UAAA;AACE,QAAAf,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAACI,CAAS;AAAA,EAAA,GAGNa,IAAWT,EAAY,YAAgD;AAC3E,QAAI,CAACJ;AACH,YAAM,IAAI,MAAM,4DAA4D;AAE9E,IAAAJ,EAAa,EAAI,GACjBG,EAAS,IAAI;AAEb,QAAI;AAEF,aADa,MAAMC,EAAU,IAA+B,uBAAuB;AAAA,IAErF,SAASU,GAAK;AACZ,YAAMC,IAAWC,EAAeF,GAAK,6BAA6B;AAClE,YAAAX,EAASY,EAAS,OAAO,GACnBA;AAAA,IACR,UAAA;AACE,MAAAf,EAAa,EAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAACI,CAAS,CAAC,GAERc,IAAsBV;AAAA,IAC1B,OAAOE,MAAqF;AAC1F,UAAI,CAACN;AACH,cAAM,IAAI,MAAM,4DAA4D;AAE9E,MAAAJ,EAAa,EAAI,GACjBG,EAAS,IAAI;AAEb,UAAI;AACF,cAAMQ,IAAS,IAAI,gBAAA;AACnB,QAAID,GAAS,UAAU,UAAWC,EAAO,IAAI,SAAS,OAAOD,EAAQ,KAAK,CAAC,GACvEA,GAAS,WAAW,UAAWC,EAAO,IAAI,UAAU,OAAOD,EAAQ,MAAM,CAAC;AAC9E,cAAME,IAAQD,EAAO,SAAA,GACfE,IAAMD,IACR,qCAAqCA,CAAK,KAC1C;AAEJ,eADa,MAAMR,EAAU,IAA8BS,CAAG;AAAA,MAEhE,SAASC,GAAK;AACZ,cAAMC,IAAWC,EAAeF,GAAK,2CAA2C;AAChF,cAAAX,EAASY,EAAS,OAAO,GACnBA;AAAA,MACR,UAAA;AACE,QAAAf,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAACI,CAAS;AAAA,EAAA,GAGNe,IAAyBX;AAAA,IAC7B,OAAOE,MAAqF;AAC1F,UAAI,CAACN;AACH,cAAM,IAAI,MAAM,4DAA4D;AAE9E,MAAAJ,EAAa,EAAI,GACjBG,EAAS,IAAI;AAEb,UAAI;AACF,cAAMQ,IAAS,IAAI,gBAAA;AACnB,QAAID,GAAS,UAAU,UAAWC,EAAO,IAAI,SAAS,OAAOD,EAAQ,KAAK,CAAC,GACvEA,GAAS,WAAW,UAAWC,EAAO,IAAI,UAAU,OAAOD,EAAQ,MAAM,CAAC;AAC9E,cAAME,IAAQD,EAAO,SAAA,GACfE,IAAMD,IAAQ,8BAA8BA,CAAK,KAAK;AAE5D,eADa,MAAMR,EAAU,IAA8BS,CAAG;AAAA,MAEhE,SAASC,GAAK;AACZ,cAAMC,IAAWC,EAAeF,GAAK,oCAAoC;AACzE,cAAAX,EAASY,EAAS,OAAO,GACnBA;AAAA,MACR,UAAA;AACE,QAAAf,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAACI,CAAS;AAAA,EAAA,GAGNgB,IAAoBZ;AAAA,IACxB,OACEa,GACAX,MACuC;AACvC,UAAI,CAACN;AACH,cAAM,IAAI,MAAM,4DAA4D;AAE9E,MAAAJ,EAAa,EAAI,GACjBG,EAAS,IAAI;AAEb,UAAI;AAKF,eAJa,MAAMC,EAAU;AAAA,UAC3B,sBAAsBiB,CAAS;AAAA,UAC/BX,KAAW,CAAA;AAAA,QAAC;AAAA,MAGhB,SAASI,GAAK;AACZ,cAAMC,IAAWC,EAAeF,GAAK,8BAA8B;AACnE,cAAAX,EAASY,EAAS,OAAO,GACnBA;AAAA,MACR,UAAA;AACE,QAAAf,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAACI,CAAS;AAAA,EAAA,GAGNkB,IAAwBd,EAAY,YAAoD;AAC5F,QAAI,CAACJ;AACH,YAAM,IAAI,MAAM,4DAA4D;AAE9E,IAAAJ,EAAa,EAAI,GACjBG,EAAS,IAAI;AAEb,QAAI;AAKF,aAJa,MAAMC,EAAU;AAAA,QAC3B;AAAA,QACA,CAAA;AAAA,MAAC;AAAA,IAGL,SAASU,GAAK;AACZ,YAAMC,IAAWC,EAAeF,GAAK,+BAA+B;AACpE,YAAAX,EAASY,EAAS,OAAO,GACnBA;AAAA,IACR,UAAA;AACE,MAAAf,EAAa,EAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAACI,CAAS,CAAC,GAERmB,IAAmBf,EAAY,YAA4C;AAC/E,QAAI,CAACJ;AACH,YAAM,IAAI,MAAM,4DAA4D;AAE9E,IAAAJ,EAAa,EAAI,GACjBG,EAAS,IAAI;AAEb,QAAI;AAEF,aADa,MAAMC,EAAU,IAA2B,uBAAuB;AAAA,IAEjF,SAASU,GAAK;AACZ,YAAMC,IAAWC,EAAeF,GAAK,8BAA8B;AACnE,YAAAX,EAASY,EAAS,OAAO,GACnBA;AAAA,IACR,UAAA;AACE,MAAAf,EAAa,EAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAACI,CAAS,CAAC,GAERoB,IAAiBhB,EAAY,YAA+C;AAChF,QAAI,CAACJ;AACH,YAAM,IAAI,MAAM,4DAA4D;AAE9E,IAAAJ,EAAa,EAAI,GACjBG,EAAS,IAAI;AAEb,QAAI;AAEF,aADa,MAAMC,EAAU,IAA8B,sBAAsB;AAAA,IAEnF,SAASU,GAAK;AACZ,YAAMC,IAAWC,EAAeF,GAAK,4BAA4B;AACjE,YAAAX,EAASY,EAAS,OAAO,GACnBA;AAAA,IACR,UAAA;AACE,MAAAf,EAAa,EAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAACI,CAAS,CAAC;AAEd,SAAO;AAAA,IACL,cAAAK;AAAA,IACA,UAAAQ;AAAA,IACA,qBAAAC;AAAA,IACA,wBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,uBAAAE;AAAA,IACA,kBAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,WAAAzB;AAAA,IACA,OAAAG;AAAA,IACA,YAAAK;AAAA,EAAA;AAEJ;"}
@@ -0,0 +1 @@
1
+ "use strict";const n=require("react"),o=require("./useCedrosLogin-C9MrcZvh.cjs");function C(){const d=o.useCedrosLoginOptional(),[u,i]=n.useState(!1),[w,a]=n.useState(null),e=n.useMemo(()=>d?new o.ApiClient({baseUrl:d.config.serverUrl,timeoutMs:d.config.requestTimeout,retryAttempts:d.config.retryAttempts,getAccessToken:d._internal?.getAccessToken}):null,[d]),m=n.useCallback(()=>{a(null)},[]),f=n.useCallback(async r=>{if(!e)throw new Error("useAdminDeposits must be used within a CedrosLoginProvider");i(!0),a(null);try{const t=new URLSearchParams;r?.status&&t.set("status",r.status),r?.limit!==void 0&&t.set("limit",String(r.limit)),r?.offset!==void 0&&t.set("offset",String(r.offset));const s=t.toString(),l=s?`/admin/deposits?${s}`:"/admin/deposits";return await e.get(l)}catch(t){const s=o.handleApiError(t,"Failed to list deposits");throw a(s.message),s}finally{i(!1)}},[e]),h=n.useCallback(async()=>{if(!e)throw new Error("useAdminDeposits must be used within a CedrosLoginProvider");i(!0),a(null);try{return await e.get("/admin/deposits/stats")}catch(r){const t=o.handleApiError(r,"Failed to get deposit stats");throw a(t.message),t}finally{i(!1)}},[e]),p=n.useCallback(async r=>{if(!e)throw new Error("useAdminDeposits must be used within a CedrosLoginProvider");i(!0),a(null);try{const t=new URLSearchParams;r?.limit!==void 0&&t.set("limit",String(r.limit)),r?.offset!==void 0&&t.set("offset",String(r.offset));const s=t.toString(),l=s?`/admin/deposits/in-privacy-period?${s}`:"/admin/deposits/in-privacy-period";return await e.get(l)}catch(t){const s=o.handleApiError(t,"Failed to list deposits in privacy period");throw a(s.message),s}finally{i(!1)}},[e]),g=n.useCallback(async r=>{if(!e)throw new Error("useAdminDeposits must be used within a CedrosLoginProvider");i(!0),a(null);try{const t=new URLSearchParams;r?.limit!==void 0&&t.set("limit",String(r.limit)),r?.offset!==void 0&&t.set("offset",String(r.offset));const s=t.toString(),l=s?`/admin/withdrawals/pending?${s}`:"/admin/withdrawals/pending";return await e.get(l)}catch(t){const s=o.handleApiError(t,"Failed to list pending withdrawals");throw a(s.message),s}finally{i(!1)}},[e]),y=n.useCallback(async(r,t)=>{if(!e)throw new Error("useAdminDeposits must be used within a CedrosLoginProvider");i(!0),a(null);try{return await e.post(`/admin/withdrawals/${r}/process`,t??{})}catch(s){const l=o.handleApiError(s,"Failed to process withdrawal");throw a(l.message),l}finally{i(!1)}},[e]),E=n.useCallback(async()=>{if(!e)throw new Error("useAdminDeposits must be used within a CedrosLoginProvider");i(!0),a(null);try{return await e.post("/admin/withdrawals/process-all",{})}catch(r){const t=o.handleApiError(r,"Failed to process withdrawals");throw a(t.message),t}finally{i(!1)}},[e]),A=n.useCallback(async()=>{if(!e)throw new Error("useAdminDeposits must be used within a CedrosLoginProvider");i(!0),a(null);try{return await e.get("/admin/privacy/status")}catch(r){const t=o.handleApiError(r,"Failed to get privacy status");throw a(t.message),t}finally{i(!1)}},[e]),v=n.useCallback(async()=>{if(!e)throw new Error("useAdminDeposits must be used within a CedrosLoginProvider");i(!0),a(null);try{return await e.get("/admin/credits/stats")}catch(r){const t=o.handleApiError(r,"Failed to get credit stats");throw a(t.message),t}finally{i(!1)}},[e]);return{listDeposits:f,getStats:h,listInPrivacyPeriod:p,listPendingWithdrawals:g,processWithdrawal:y,processAllWithdrawals:E,getPrivacyStatus:A,getCreditStats:v,isLoading:u,error:w,clearError:m}}exports.useAdminDeposits=C;
@@ -1 +1 @@
1
- {"version":3,"file":"useAdminDeposits-Dvx3_UUE.cjs","sources":["../src/hooks/useAdminDeposits.ts"],"sourcesContent":["/**\n * Hook for admin Privacy Cash deposit operations\n *\n * Provides admin-only access to view all deposits, statistics, and pending withdrawals.\n * Requires system admin privileges.\n *\n * Safe to call outside CedrosLoginProvider (returns no-op functions).\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport { useCedrosLoginOptional } from '../context/useCedrosLogin';\nimport { ApiClient, handleApiError } from '../utils/apiClient';\nimport type {\n UseAdminDepositsReturn,\n AdminDepositListResponse,\n AdminDepositStatsResponse,\n ProcessWithdrawalRequest,\n ProcessWithdrawalResponse,\n ProcessAllWithdrawalsResponse,\n PrivacyStatusResponse,\n AdminCreditStatsResponse,\n} from '../types/deposit';\n\nexport type { UseAdminDepositsReturn } from '../types/deposit';\n\n/**\n * Hook for admin Privacy Cash deposit operations\n *\n * Requires system admin privileges. All methods will fail with 403 if not admin.\n *\n * Safe to call outside CedrosLoginProvider - returns no-op functions that throw.\n */\nexport function useAdminDeposits(): UseAdminDepositsReturn {\n const context = useCedrosLoginOptional();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const apiClient = useMemo(() => {\n if (!context) return null;\n return new ApiClient({\n baseUrl: context.config.serverUrl,\n timeoutMs: context.config.requestTimeout,\n retryAttempts: context.config.retryAttempts,\n getAccessToken: context._internal?.getAccessToken,\n });\n }, [context]);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n const listDeposits = useCallback(\n async (options?: {\n status?: string;\n limit?: number;\n offset?: number;\n }): Promise<AdminDepositListResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const params = new URLSearchParams();\n if (options?.status) params.set('status', options.status);\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.offset !== undefined) params.set('offset', String(options.offset));\n const query = params.toString();\n const url = query ? `/admin/deposits?${query}` : '/admin/deposits';\n const data = await apiClient.get<AdminDepositListResponse>(url);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to list deposits');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getStats = useCallback(async (): Promise<AdminDepositStatsResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<AdminDepositStatsResponse>('/admin/deposits/stats');\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get deposit stats');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const listInPrivacyPeriod = useCallback(\n async (options?: { limit?: number; offset?: number }): Promise<AdminDepositListResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const params = new URLSearchParams();\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.offset !== undefined) params.set('offset', String(options.offset));\n const query = params.toString();\n const url = query\n ? `/admin/deposits/in-privacy-period?${query}`\n : '/admin/deposits/in-privacy-period';\n const data = await apiClient.get<AdminDepositListResponse>(url);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to list deposits in privacy period');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const listPendingWithdrawals = useCallback(\n async (options?: { limit?: number; offset?: number }): Promise<AdminDepositListResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const params = new URLSearchParams();\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.offset !== undefined) params.set('offset', String(options.offset));\n const query = params.toString();\n const url = query ? `/admin/withdrawals/pending?${query}` : '/admin/withdrawals/pending';\n const data = await apiClient.get<AdminDepositListResponse>(url);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to list pending withdrawals');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const processWithdrawal = useCallback(\n async (\n sessionId: string,\n options?: ProcessWithdrawalRequest\n ): Promise<ProcessWithdrawalResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.post<ProcessWithdrawalResponse>(\n `/admin/withdrawals/${sessionId}/process`,\n options ?? {}\n );\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to process withdrawal');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const processAllWithdrawals = useCallback(async (): Promise<ProcessAllWithdrawalsResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.post<ProcessAllWithdrawalsResponse>(\n '/admin/withdrawals/process-all',\n {}\n );\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to process withdrawals');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const getPrivacyStatus = useCallback(async (): Promise<PrivacyStatusResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<PrivacyStatusResponse>('/admin/privacy/status');\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get privacy status');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const getCreditStats = useCallback(async (): Promise<AdminCreditStatsResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<AdminCreditStatsResponse>('/admin/credits/stats');\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get credit stats');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n return {\n listDeposits,\n getStats,\n listInPrivacyPeriod,\n listPendingWithdrawals,\n processWithdrawal,\n processAllWithdrawals,\n getPrivacyStatus,\n getCreditStats,\n isLoading,\n error,\n clearError,\n };\n}\n"],"names":["useAdminDeposits","context","useCedrosLoginOptional","isLoading","setIsLoading","useState","error","setError","apiClient","useMemo","ApiClient","clearError","useCallback","listDeposits","options","params","query","url","err","apiError","handleApiError","getStats","listInPrivacyPeriod","listPendingWithdrawals","processWithdrawal","sessionId","processAllWithdrawals","getPrivacyStatus","getCreditStats"],"mappings":"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"}
1
+ {"version":3,"file":"useAdminDeposits-BkkCwHWp.cjs","sources":["../src/hooks/useAdminDeposits.ts"],"sourcesContent":["/**\n * Hook for admin Privacy Cash deposit operations\n *\n * Provides admin-only access to view all deposits, statistics, and pending withdrawals.\n * Requires system admin privileges.\n *\n * Safe to call outside CedrosLoginProvider (returns no-op functions).\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport { useCedrosLoginOptional } from '../context/useCedrosLogin';\nimport { ApiClient, handleApiError } from '../utils/apiClient';\nimport type {\n UseAdminDepositsReturn,\n AdminDepositListResponse,\n AdminDepositStatsResponse,\n ProcessWithdrawalRequest,\n ProcessWithdrawalResponse,\n ProcessAllWithdrawalsResponse,\n PrivacyStatusResponse,\n AdminCreditStatsResponse,\n} from '../types/deposit';\n\nexport type { UseAdminDepositsReturn } from '../types/deposit';\n\n/**\n * Hook for admin Privacy Cash deposit operations\n *\n * Requires system admin privileges. All methods will fail with 403 if not admin.\n *\n * Safe to call outside CedrosLoginProvider - returns no-op functions that throw.\n */\nexport function useAdminDeposits(): UseAdminDepositsReturn {\n const context = useCedrosLoginOptional();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const apiClient = useMemo(() => {\n if (!context) return null;\n return new ApiClient({\n baseUrl: context.config.serverUrl,\n timeoutMs: context.config.requestTimeout,\n retryAttempts: context.config.retryAttempts,\n getAccessToken: context._internal?.getAccessToken,\n });\n }, [context]);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n const listDeposits = useCallback(\n async (options?: {\n status?: string;\n limit?: number;\n offset?: number;\n }): Promise<AdminDepositListResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const params = new URLSearchParams();\n if (options?.status) params.set('status', options.status);\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.offset !== undefined) params.set('offset', String(options.offset));\n const query = params.toString();\n const url = query ? `/admin/deposits?${query}` : '/admin/deposits';\n const data = await apiClient.get<AdminDepositListResponse>(url);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to list deposits');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const getStats = useCallback(async (): Promise<AdminDepositStatsResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<AdminDepositStatsResponse>('/admin/deposits/stats');\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get deposit stats');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const listInPrivacyPeriod = useCallback(\n async (options?: { limit?: number; offset?: number }): Promise<AdminDepositListResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const params = new URLSearchParams();\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.offset !== undefined) params.set('offset', String(options.offset));\n const query = params.toString();\n const url = query\n ? `/admin/deposits/in-privacy-period?${query}`\n : '/admin/deposits/in-privacy-period';\n const data = await apiClient.get<AdminDepositListResponse>(url);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to list deposits in privacy period');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const listPendingWithdrawals = useCallback(\n async (options?: { limit?: number; offset?: number }): Promise<AdminDepositListResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const params = new URLSearchParams();\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.offset !== undefined) params.set('offset', String(options.offset));\n const query = params.toString();\n const url = query ? `/admin/withdrawals/pending?${query}` : '/admin/withdrawals/pending';\n const data = await apiClient.get<AdminDepositListResponse>(url);\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to list pending withdrawals');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const processWithdrawal = useCallback(\n async (\n sessionId: string,\n options?: ProcessWithdrawalRequest\n ): Promise<ProcessWithdrawalResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.post<ProcessWithdrawalResponse>(\n `/admin/withdrawals/${sessionId}/process`,\n options ?? {}\n );\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to process withdrawal');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const processAllWithdrawals = useCallback(async (): Promise<ProcessAllWithdrawalsResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.post<ProcessAllWithdrawalsResponse>(\n '/admin/withdrawals/process-all',\n {}\n );\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to process withdrawals');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const getPrivacyStatus = useCallback(async (): Promise<PrivacyStatusResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<PrivacyStatusResponse>('/admin/privacy/status');\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get privacy status');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const getCreditStats = useCallback(async (): Promise<AdminCreditStatsResponse> => {\n if (!apiClient) {\n throw new Error('useAdminDeposits must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<AdminCreditStatsResponse>('/admin/credits/stats');\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get credit stats');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n return {\n listDeposits,\n getStats,\n listInPrivacyPeriod,\n listPendingWithdrawals,\n processWithdrawal,\n processAllWithdrawals,\n getPrivacyStatus,\n getCreditStats,\n isLoading,\n error,\n clearError,\n };\n}\n"],"names":["useAdminDeposits","context","useCedrosLoginOptional","isLoading","setIsLoading","useState","error","setError","apiClient","useMemo","ApiClient","clearError","useCallback","listDeposits","options","params","query","url","err","apiError","handleApiError","getStats","listInPrivacyPeriod","listPendingWithdrawals","processWithdrawal","sessionId","processAllWithdrawals","getPrivacyStatus","getCreditStats"],"mappings":"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"}