@tatchi-xyz/sdk 0.20.0 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/dist/cjs/core/TatchiPasskey/emailRecovery.js +67 -45
  2. package/dist/cjs/core/TatchiPasskey/emailRecovery.js.map +1 -1
  3. package/dist/cjs/core/TatchiPasskey/index.js +2 -1
  4. package/dist/cjs/core/TatchiPasskey/index.js.map +1 -1
  5. package/dist/cjs/core/TatchiPasskey/linkDevice.js +2 -1
  6. package/dist/cjs/core/TatchiPasskey/linkDevice.js.map +1 -1
  7. package/dist/cjs/core/TatchiPasskey/scanDevice.js +5 -3
  8. package/dist/cjs/core/TatchiPasskey/scanDevice.js.map +1 -1
  9. package/dist/cjs/core/WalletIframe/client/router.js +1 -1
  10. package/dist/cjs/core/WalletIframe/client/router.js.map +1 -1
  11. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js +3 -4
  12. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js.map +1 -1
  13. package/dist/cjs/core/defaultConfigs.js +3 -7
  14. package/dist/cjs/core/defaultConfigs.js.map +1 -1
  15. package/dist/cjs/core/nearCrypto.js +29 -5
  16. package/dist/cjs/core/nearCrypto.js.map +1 -1
  17. package/dist/cjs/core/rpcCalls.js +56 -26
  18. package/dist/cjs/core/rpcCalls.js.map +1 -1
  19. package/dist/cjs/react/components/AccountMenuButton/{LinkedDevicesModal-BCrFe5p3.css → LinkedDevicesModal-BRtht0XI.css} +1 -1
  20. package/dist/{esm/react/components/AccountMenuButton/LinkedDevicesModal-BCrFe5p3.css.map → cjs/react/components/AccountMenuButton/LinkedDevicesModal-BRtht0XI.css.map} +1 -1
  21. package/dist/cjs/react/components/AccountMenuButton/{ProfileDropdown-CRJrtxDb.css → ProfileDropdown-BG_6hcim.css} +1 -1
  22. package/dist/{esm/react/components/AccountMenuButton/ProfileDropdown-CRJrtxDb.css.map → cjs/react/components/AccountMenuButton/ProfileDropdown-BG_6hcim.css.map} +1 -1
  23. package/dist/cjs/react/components/AccountMenuButton/{Web3AuthProfileButton-DXFRw8ND.css → Web3AuthProfileButton-k8_FAYFq.css} +1 -1
  24. package/dist/cjs/react/components/AccountMenuButton/{Web3AuthProfileButton-DXFRw8ND.css.map → Web3AuthProfileButton-k8_FAYFq.css.map} +1 -1
  25. package/dist/cjs/react/components/AccountMenuButton/icons/{TouchIcon-DNgbAK_i.css → TouchIcon-C-RcGfr5.css} +1 -1
  26. package/dist/cjs/react/components/AccountMenuButton/icons/{TouchIcon-DNgbAK_i.css.map → TouchIcon-C-RcGfr5.css.map} +1 -1
  27. package/dist/cjs/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-DRwSoF8q.css → PasskeyAuthMenu-DKMiLeT9.css} +59 -4
  28. package/dist/cjs/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-DRwSoF8q.css.map → PasskeyAuthMenu-DKMiLeT9.css.map} +1 -1
  29. package/dist/cjs/react/components/PasskeyAuthMenu/adapters/tatchi.js +1 -0
  30. package/dist/cjs/react/components/PasskeyAuthMenu/adapters/tatchi.js.map +1 -1
  31. package/dist/cjs/react/components/PasskeyAuthMenu/client.js +30 -8
  32. package/dist/cjs/react/components/PasskeyAuthMenu/client.js.map +1 -1
  33. package/dist/cjs/react/components/PasskeyAuthMenu/controller/useSDKEvents.js +22 -0
  34. package/dist/cjs/react/components/PasskeyAuthMenu/controller/useSDKEvents.js.map +1 -0
  35. package/dist/cjs/react/components/PasskeyAuthMenu/ui/ContentSwitcher.js +17 -4
  36. package/dist/cjs/react/components/PasskeyAuthMenu/ui/ContentSwitcher.js.map +1 -1
  37. package/dist/cjs/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js +254 -140
  38. package/dist/cjs/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js.map +1 -1
  39. package/dist/cjs/react/components/{ShowQRCode-CL4gsszN.css → ShowQRCode-CB0UCQ_h.css} +1 -1
  40. package/dist/cjs/react/components/{ShowQRCode-CL4gsszN.css.map → ShowQRCode-CB0UCQ_h.css.map} +1 -1
  41. package/dist/cjs/react/context/useSDKFlowRuntime.js +183 -0
  42. package/dist/cjs/react/context/useSDKFlowRuntime.js.map +1 -0
  43. package/dist/cjs/react/context/useTatchiContextValue.js +24 -15
  44. package/dist/cjs/react/context/useTatchiContextValue.js.map +1 -1
  45. package/dist/cjs/react/context/useTatchiWithSdkFlow.js +96 -0
  46. package/dist/cjs/react/context/useTatchiWithSdkFlow.js.map +1 -0
  47. package/dist/cjs/react/sdk/src/core/EmailRecovery/index.js +1 -0
  48. package/dist/cjs/react/sdk/src/core/TatchiPasskey/emailRecovery.js +67 -45
  49. package/dist/cjs/react/sdk/src/core/TatchiPasskey/emailRecovery.js.map +1 -1
  50. package/dist/cjs/react/sdk/src/core/TatchiPasskey/index.js +2 -1
  51. package/dist/cjs/react/sdk/src/core/TatchiPasskey/index.js.map +1 -1
  52. package/dist/cjs/react/sdk/src/core/TatchiPasskey/linkDevice.js +2 -1
  53. package/dist/cjs/react/sdk/src/core/TatchiPasskey/linkDevice.js.map +1 -1
  54. package/dist/cjs/react/sdk/src/core/TatchiPasskey/scanDevice.js +5 -3
  55. package/dist/cjs/react/sdk/src/core/TatchiPasskey/scanDevice.js.map +1 -1
  56. package/dist/cjs/react/sdk/src/core/WalletIframe/client/router.js +1 -1
  57. package/dist/cjs/react/sdk/src/core/WalletIframe/client/router.js.map +1 -1
  58. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js +3 -4
  59. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js.map +1 -1
  60. package/dist/cjs/react/sdk/src/core/defaultConfigs.js +3 -7
  61. package/dist/cjs/react/sdk/src/core/defaultConfigs.js.map +1 -1
  62. package/dist/cjs/react/sdk/src/core/nearCrypto.js +29 -5
  63. package/dist/cjs/react/sdk/src/core/nearCrypto.js.map +1 -1
  64. package/dist/cjs/react/sdk/src/core/rpcCalls.js +56 -26
  65. package/dist/cjs/react/sdk/src/core/rpcCalls.js.map +1 -1
  66. package/dist/cjs/server/email-recovery/emailParsers.js +2 -1
  67. package/dist/cjs/server/email-recovery/emailParsers.js.map +1 -1
  68. package/dist/cjs/server/email-recovery/index.js +6 -6
  69. package/dist/cjs/server/email-recovery/index.js.map +1 -1
  70. package/dist/cjs/server/email-recovery/rpcCalls.js +22 -3
  71. package/dist/cjs/server/email-recovery/rpcCalls.js.map +1 -1
  72. package/dist/cjs/server/router/cloudflare.js +8 -3
  73. package/dist/cjs/server/router/cloudflare.js.map +1 -1
  74. package/dist/cjs/server/router/express.js.map +1 -1
  75. package/dist/cjs/server/sdk/src/core/defaultConfigs.js +2 -4
  76. package/dist/cjs/server/sdk/src/core/defaultConfigs.js.map +1 -1
  77. package/dist/cjs/server/sdk/src/core/nearCrypto.js +26 -7
  78. package/dist/cjs/server/sdk/src/core/nearCrypto.js.map +1 -1
  79. package/dist/esm/core/TatchiPasskey/emailRecovery.js +67 -45
  80. package/dist/esm/core/TatchiPasskey/emailRecovery.js.map +1 -1
  81. package/dist/esm/core/TatchiPasskey/index.js +2 -1
  82. package/dist/esm/core/TatchiPasskey/index.js.map +1 -1
  83. package/dist/esm/core/TatchiPasskey/linkDevice.js +2 -1
  84. package/dist/esm/core/TatchiPasskey/linkDevice.js.map +1 -1
  85. package/dist/esm/core/TatchiPasskey/scanDevice.js +5 -3
  86. package/dist/esm/core/TatchiPasskey/scanDevice.js.map +1 -1
  87. package/dist/esm/core/WalletIframe/client/router.js +1 -1
  88. package/dist/esm/core/WalletIframe/client/router.js.map +1 -1
  89. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js +2 -3
  90. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js.map +1 -1
  91. package/dist/esm/core/defaultConfigs.js +3 -7
  92. package/dist/esm/core/defaultConfigs.js.map +1 -1
  93. package/dist/esm/core/nearCrypto.js +24 -6
  94. package/dist/esm/core/nearCrypto.js.map +1 -1
  95. package/dist/esm/core/rpcCalls.js +56 -26
  96. package/dist/esm/core/rpcCalls.js.map +1 -1
  97. package/dist/esm/react/components/AccountMenuButton/{LinkedDevicesModal-BCrFe5p3.css → LinkedDevicesModal-BRtht0XI.css} +1 -1
  98. package/dist/{cjs/react/components/AccountMenuButton/LinkedDevicesModal-BCrFe5p3.css.map → esm/react/components/AccountMenuButton/LinkedDevicesModal-BRtht0XI.css.map} +1 -1
  99. package/dist/esm/react/components/AccountMenuButton/{ProfileDropdown-CRJrtxDb.css → ProfileDropdown-BG_6hcim.css} +1 -1
  100. package/dist/{cjs/react/components/AccountMenuButton/ProfileDropdown-CRJrtxDb.css.map → esm/react/components/AccountMenuButton/ProfileDropdown-BG_6hcim.css.map} +1 -1
  101. package/dist/esm/react/components/AccountMenuButton/{Web3AuthProfileButton-DXFRw8ND.css → Web3AuthProfileButton-k8_FAYFq.css} +1 -1
  102. package/dist/esm/react/components/AccountMenuButton/{Web3AuthProfileButton-DXFRw8ND.css.map → Web3AuthProfileButton-k8_FAYFq.css.map} +1 -1
  103. package/dist/esm/react/components/AccountMenuButton/icons/{TouchIcon-DNgbAK_i.css → TouchIcon-C-RcGfr5.css} +1 -1
  104. package/dist/esm/react/components/AccountMenuButton/icons/{TouchIcon-DNgbAK_i.css.map → TouchIcon-C-RcGfr5.css.map} +1 -1
  105. package/dist/esm/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-DRwSoF8q.css → PasskeyAuthMenu-DKMiLeT9.css} +59 -4
  106. package/dist/esm/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-DRwSoF8q.css.map → PasskeyAuthMenu-DKMiLeT9.css.map} +1 -1
  107. package/dist/esm/react/components/PasskeyAuthMenu/adapters/tatchi.js +1 -0
  108. package/dist/esm/react/components/PasskeyAuthMenu/adapters/tatchi.js.map +1 -1
  109. package/dist/esm/react/components/PasskeyAuthMenu/client.js +30 -8
  110. package/dist/esm/react/components/PasskeyAuthMenu/client.js.map +1 -1
  111. package/dist/esm/react/components/PasskeyAuthMenu/controller/useSDKEvents.js +20 -0
  112. package/dist/esm/react/components/PasskeyAuthMenu/controller/useSDKEvents.js.map +1 -0
  113. package/dist/esm/react/components/PasskeyAuthMenu/ui/ContentSwitcher.js +17 -4
  114. package/dist/esm/react/components/PasskeyAuthMenu/ui/ContentSwitcher.js.map +1 -1
  115. package/dist/esm/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js +254 -140
  116. package/dist/esm/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js.map +1 -1
  117. package/dist/esm/react/components/{ShowQRCode-CL4gsszN.css → ShowQRCode-CB0UCQ_h.css} +1 -1
  118. package/dist/esm/react/components/{ShowQRCode-CL4gsszN.css.map → ShowQRCode-CB0UCQ_h.css.map} +1 -1
  119. package/dist/esm/react/context/useSDKFlowRuntime.js +181 -0
  120. package/dist/esm/react/context/useSDKFlowRuntime.js.map +1 -0
  121. package/dist/esm/react/context/useTatchiContextValue.js +25 -16
  122. package/dist/esm/react/context/useTatchiContextValue.js.map +1 -1
  123. package/dist/esm/react/context/useTatchiWithSdkFlow.js +94 -0
  124. package/dist/esm/react/context/useTatchiWithSdkFlow.js.map +1 -0
  125. package/dist/esm/react/sdk/src/core/EmailRecovery/index.js +1 -1
  126. package/dist/esm/react/sdk/src/core/TatchiPasskey/emailRecovery.js +67 -45
  127. package/dist/esm/react/sdk/src/core/TatchiPasskey/emailRecovery.js.map +1 -1
  128. package/dist/esm/react/sdk/src/core/TatchiPasskey/index.js +2 -1
  129. package/dist/esm/react/sdk/src/core/TatchiPasskey/index.js.map +1 -1
  130. package/dist/esm/react/sdk/src/core/TatchiPasskey/linkDevice.js +2 -1
  131. package/dist/esm/react/sdk/src/core/TatchiPasskey/linkDevice.js.map +1 -1
  132. package/dist/esm/react/sdk/src/core/TatchiPasskey/scanDevice.js +5 -3
  133. package/dist/esm/react/sdk/src/core/TatchiPasskey/scanDevice.js.map +1 -1
  134. package/dist/esm/react/sdk/src/core/WalletIframe/client/router.js +1 -1
  135. package/dist/esm/react/sdk/src/core/WalletIframe/client/router.js.map +1 -1
  136. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js +2 -3
  137. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js.map +1 -1
  138. package/dist/esm/react/sdk/src/core/defaultConfigs.js +3 -7
  139. package/dist/esm/react/sdk/src/core/defaultConfigs.js.map +1 -1
  140. package/dist/esm/react/sdk/src/core/nearCrypto.js +24 -6
  141. package/dist/esm/react/sdk/src/core/nearCrypto.js.map +1 -1
  142. package/dist/esm/react/sdk/src/core/rpcCalls.js +56 -26
  143. package/dist/esm/react/sdk/src/core/rpcCalls.js.map +1 -1
  144. package/dist/esm/react/styles/styles.css +58 -3
  145. package/dist/esm/sdk/{defaultConfigs-DpslkAQd.js → defaultConfigs-CfQDV-ya.js} +3 -7
  146. package/dist/esm/sdk/{getDeviceNumber-fXizNGQl.js → getDeviceNumber-BpernPnM.js} +4 -8
  147. package/dist/esm/sdk/getDeviceNumber-BpernPnM.js.map +1 -0
  148. package/dist/esm/sdk/offline-export-app.js +23 -6
  149. package/dist/esm/sdk/offline-export-app.js.map +1 -1
  150. package/dist/esm/sdk/{router-DuGYOd3G.js → router-BWtacLJg.js} +1 -1
  151. package/dist/esm/sdk/{rpcCalls-BQrJMTdg.js → rpcCalls-CYGJSCgm.js} +3 -3
  152. package/dist/esm/sdk/{rpcCalls-YVeUVMk2.js → rpcCalls-DZZSa-sk.js} +57 -27
  153. package/dist/esm/sdk/{transactions-bqaAwL4k.js → transactions-Cn9xTWlK.js} +2 -2
  154. package/dist/esm/sdk/{transactions-bqaAwL4k.js.map → transactions-Cn9xTWlK.js.map} +1 -1
  155. package/dist/esm/sdk/{transactions-BalIhtJ9.js → transactions-DfdwDQCn.js} +1 -1
  156. package/dist/esm/sdk/wallet-iframe-host.js +549 -557
  157. package/dist/esm/server/email-recovery/emailParsers.js +3 -1
  158. package/dist/esm/server/email-recovery/emailParsers.js.map +1 -1
  159. package/dist/esm/server/email-recovery/index.js +6 -6
  160. package/dist/esm/server/email-recovery/index.js.map +1 -1
  161. package/dist/esm/server/email-recovery/rpcCalls.js +22 -3
  162. package/dist/esm/server/email-recovery/rpcCalls.js.map +1 -1
  163. package/dist/esm/server/router/cloudflare.js +8 -3
  164. package/dist/esm/server/router/cloudflare.js.map +1 -1
  165. package/dist/esm/server/router/express.js.map +1 -1
  166. package/dist/esm/server/sdk/src/core/defaultConfigs.js +2 -4
  167. package/dist/esm/server/sdk/src/core/defaultConfigs.js.map +1 -1
  168. package/dist/esm/server/sdk/src/core/nearCrypto.js +26 -8
  169. package/dist/esm/server/sdk/src/core/nearCrypto.js.map +1 -1
  170. package/dist/esm/wasm_vrf_worker/pkg/wasm_vrf_worker_bg.wasm +0 -0
  171. package/dist/types/src/core/TatchiPasskey/emailRecovery.d.ts +5 -4
  172. package/dist/types/src/core/TatchiPasskey/emailRecovery.d.ts.map +1 -1
  173. package/dist/types/src/core/TatchiPasskey/index.d.ts +1 -1
  174. package/dist/types/src/core/TatchiPasskey/index.d.ts.map +1 -1
  175. package/dist/types/src/core/TatchiPasskey/scanDevice.d.ts.map +1 -1
  176. package/dist/types/src/core/WalletIframe/TatchiPasskeyIframe.d.ts +1 -1
  177. package/dist/types/src/core/WalletIframe/TatchiPasskeyIframe.d.ts.map +1 -1
  178. package/dist/types/src/core/WalletIframe/client/router.d.ts +1 -1
  179. package/dist/types/src/core/WalletIframe/client/router.d.ts.map +1 -1
  180. package/dist/types/src/core/WalletIframe/shared/messages.d.ts +1 -1
  181. package/dist/types/src/core/WalletIframe/shared/messages.d.ts.map +1 -1
  182. package/dist/types/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.d.ts +2 -1
  183. package/dist/types/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.d.ts.map +1 -1
  184. package/dist/types/src/core/defaultConfigs.d.ts.map +1 -1
  185. package/dist/types/src/core/nearCrypto.d.ts +14 -0
  186. package/dist/types/src/core/nearCrypto.d.ts.map +1 -1
  187. package/dist/types/src/core/rpcCalls.d.ts +11 -8
  188. package/dist/types/src/core/rpcCalls.d.ts.map +1 -1
  189. package/dist/types/src/core/types/tatchi.d.ts +0 -4
  190. package/dist/types/src/core/types/tatchi.d.ts.map +1 -1
  191. package/dist/types/src/react/components/PasskeyAuthMenu/adapters/tatchi.d.ts +2 -0
  192. package/dist/types/src/react/components/PasskeyAuthMenu/adapters/tatchi.d.ts.map +1 -1
  193. package/dist/types/src/react/components/PasskeyAuthMenu/client.d.ts.map +1 -1
  194. package/dist/types/src/react/components/PasskeyAuthMenu/controller/useSDKEvents.d.ts +10 -0
  195. package/dist/types/src/react/components/PasskeyAuthMenu/controller/useSDKEvents.d.ts.map +1 -0
  196. package/dist/types/src/react/components/PasskeyAuthMenu/types.d.ts +8 -3
  197. package/dist/types/src/react/components/PasskeyAuthMenu/types.d.ts.map +1 -1
  198. package/dist/types/src/react/components/PasskeyAuthMenu/ui/ContentSwitcher.d.ts +2 -0
  199. package/dist/types/src/react/components/PasskeyAuthMenu/ui/ContentSwitcher.d.ts.map +1 -1
  200. package/dist/types/src/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.d.ts +1 -1
  201. package/dist/types/src/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.d.ts.map +1 -1
  202. package/dist/types/src/react/context/useSDKFlowRuntime.d.ts +10 -0
  203. package/dist/types/src/react/context/useSDKFlowRuntime.d.ts.map +1 -0
  204. package/dist/types/src/react/context/useTatchiContextValue.d.ts.map +1 -1
  205. package/dist/types/src/react/context/useTatchiWithSdkFlow.d.ts +9 -0
  206. package/dist/types/src/react/context/useTatchiWithSdkFlow.d.ts.map +1 -0
  207. package/dist/types/src/react/types.d.ts +31 -0
  208. package/dist/types/src/react/types.d.ts.map +1 -1
  209. package/dist/types/src/server/email-recovery/emailParsers.d.ts.map +1 -1
  210. package/dist/types/src/server/email-recovery/index.d.ts +5 -6
  211. package/dist/types/src/server/email-recovery/index.d.ts.map +1 -1
  212. package/dist/types/src/server/email-recovery/rpcCalls.d.ts +1 -0
  213. package/dist/types/src/server/email-recovery/rpcCalls.d.ts.map +1 -1
  214. package/dist/types/src/server/router/cloudflare-adaptor.d.ts.map +1 -1
  215. package/dist/workers/wasm_vrf_worker_bg.wasm +0 -0
  216. package/package.json +1 -1
  217. package/dist/esm/sdk/getDeviceNumber-fXizNGQl.js.map +0 -1
@@ -0,0 +1,96 @@
1
+ const require_rolldown_runtime = require('../_virtual/rolldown_runtime.js');
2
+ const require_sdkSentEvents = require('../sdk/src/core/types/sdkSentEvents.js');
3
+ let react = require("react");
4
+ react = require_rolldown_runtime.__toESM(react);
5
+
6
+ //#region src/react/context/useTatchiWithSdkFlow.ts
7
+ require_sdkSentEvents.init_sdkSentEvents();
8
+ function useTatchiWithSdkFlow(args) {
9
+ const { tatchi, beginSdkFlow, appendSdkEventMessage, endSdkFlow } = args;
10
+ return (0, react.useMemo)(() => {
11
+ const loginAndCreateSessionWithSdkFlow = async (nearAccountId, options) => {
12
+ const seq = beginSdkFlow("login", nearAccountId);
13
+ const wrappedOptions = {
14
+ ...options,
15
+ onEvent: (event) => {
16
+ appendSdkEventMessage(seq, event.message);
17
+ if (event.phase === require_sdkSentEvents.LoginPhase.STEP_4_LOGIN_COMPLETE && event.status === require_sdkSentEvents.LoginStatus.SUCCESS) endSdkFlow("login", seq, "success");
18
+ else if (event.phase === require_sdkSentEvents.LoginPhase.LOGIN_ERROR || event.status === require_sdkSentEvents.LoginStatus.ERROR) {
19
+ const error = "error" in event ? event.error : event.message;
20
+ endSdkFlow("login", seq, "error", error || event.message);
21
+ }
22
+ options?.onEvent?.(event);
23
+ },
24
+ onError: (error) => {
25
+ appendSdkEventMessage(seq, error.message);
26
+ endSdkFlow("login", seq, "error", error.message);
27
+ options?.onError?.(error);
28
+ }
29
+ };
30
+ return await tatchi.loginAndCreateSession(nearAccountId, wrappedOptions);
31
+ };
32
+ const registerPasskeyWithSdkFlow = async (nearAccountId, options) => {
33
+ const seq = beginSdkFlow("register", nearAccountId);
34
+ const wrappedOptions = {
35
+ ...options,
36
+ onEvent: (event) => {
37
+ appendSdkEventMessage(seq, event.message);
38
+ if (event.phase === require_sdkSentEvents.RegistrationPhase.STEP_8_REGISTRATION_COMPLETE && event.status === require_sdkSentEvents.RegistrationStatus.SUCCESS) endSdkFlow("register", seq, "success");
39
+ else if (event.phase === require_sdkSentEvents.RegistrationPhase.REGISTRATION_ERROR || event.status === require_sdkSentEvents.RegistrationStatus.ERROR) {
40
+ const error = "error" in event ? event.error : event.message;
41
+ endSdkFlow("register", seq, "error", error || event.message);
42
+ }
43
+ options?.onEvent?.(event);
44
+ },
45
+ onError: (error) => {
46
+ appendSdkEventMessage(seq, error.message);
47
+ endSdkFlow("register", seq, "error", error.message);
48
+ options?.onError?.(error);
49
+ }
50
+ };
51
+ return await tatchi.registerPasskey(nearAccountId, wrappedOptions);
52
+ };
53
+ const recoverAccountFlowWithSdkFlow = async (args$1) => {
54
+ const seq = beginSdkFlow("recover", args$1?.accountId);
55
+ const options = args$1?.options;
56
+ const wrappedOptions = {
57
+ ...options,
58
+ onEvent: (event) => {
59
+ appendSdkEventMessage(seq, event.message);
60
+ if (event.phase === require_sdkSentEvents.AccountRecoveryPhase.STEP_5_ACCOUNT_RECOVERY_COMPLETE && event.status === require_sdkSentEvents.AccountRecoveryStatus.SUCCESS) endSdkFlow("recover", seq, "success");
61
+ else if (event.phase === require_sdkSentEvents.AccountRecoveryPhase.ERROR || event.status === require_sdkSentEvents.AccountRecoveryStatus.ERROR) {
62
+ const error = "error" in event ? event.error : event.message;
63
+ endSdkFlow("recover", seq, "error", error || event.message);
64
+ }
65
+ options?.onEvent?.(event);
66
+ },
67
+ onError: (error) => {
68
+ appendSdkEventMessage(seq, error.message);
69
+ endSdkFlow("recover", seq, "error", error.message);
70
+ options?.onError?.(error);
71
+ }
72
+ };
73
+ return await tatchi.recoverAccountFlow({
74
+ ...args$1,
75
+ options: wrappedOptions
76
+ });
77
+ };
78
+ return new Proxy(tatchi, { get(target, prop, receiver) {
79
+ if (prop === "loginAndCreateSession") return loginAndCreateSessionWithSdkFlow;
80
+ if (prop === "registerPasskey") return registerPasskeyWithSdkFlow;
81
+ if (prop === "recoverAccountFlow") return recoverAccountFlowWithSdkFlow;
82
+ const value = Reflect.get(target, prop, receiver);
83
+ if (typeof value === "function") return value.bind(target);
84
+ return value;
85
+ } });
86
+ }, [
87
+ appendSdkEventMessage,
88
+ beginSdkFlow,
89
+ endSdkFlow,
90
+ tatchi
91
+ ]);
92
+ }
93
+
94
+ //#endregion
95
+ exports.useTatchiWithSdkFlow = useTatchiWithSdkFlow;
96
+ //# sourceMappingURL=useTatchiWithSdkFlow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTatchiWithSdkFlow.js","names":["loginAndCreateSessionWithSdkFlow: LoginAndCreateSessionFn","wrappedOptions: LoginHooksOptions","LoginPhase","LoginStatus","registerPasskeyWithSdkFlow: RegisterPasskeyFn","wrappedOptions: RegistrationHooksOptions","RegistrationPhase","RegistrationStatus","recoverAccountFlowWithSdkFlow: RecoverAccountFlowFn","args","options: AccountRecoveryHooksOptions | undefined","wrappedOptions: AccountRecoveryHooksOptions","AccountRecoveryPhase","AccountRecoveryStatus","value: unknown"],"sources":["../../../../src/react/context/useTatchiWithSdkFlow.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport type { TatchiPasskey } from '@/core/TatchiPasskey';\nimport {\n AccountRecoveryPhase,\n AccountRecoveryStatus,\n type AccountRecoveryHooksOptions,\n type AccountRecoverySSEEvent,\n LoginPhase,\n LoginStatus,\n type LoginHooksOptions,\n type LoginSSEvent,\n RegistrationPhase,\n RegistrationStatus,\n type RegistrationHooksOptions,\n type RegistrationSSEEvent,\n} from '@/core/types/sdkSentEvents';\n\nexport function useTatchiWithSdkFlow(args: {\n tatchi: TatchiPasskey;\n beginSdkFlow: (kind: 'login' | 'register' | 'recover', accountId?: string) => number;\n appendSdkEventMessage: (seq: number, message: string) => void;\n endSdkFlow: (kind: 'login' | 'register' | 'recover', seq: number, status: 'success' | 'error', error?: string) => void;\n}): TatchiPasskey {\n const { tatchi, beginSdkFlow, appendSdkEventMessage, endSdkFlow } = args;\n\n return useMemo(() => {\n /**\n * We use a `Proxy` to instrument a few core flow entrypoints (login/register/recover)\n * while preserving the full `TatchiPasskey` API surface.\n *\n * This lets *all* callers (not just PasskeyAuthMenu) use `ctx.tatchi.*` directly and\n * still have `sdkFlow` update as events stream in.\n */\n type LoginAndCreateSessionFn = TatchiPasskey['loginAndCreateSession'];\n type RegisterPasskeyFn = TatchiPasskey['registerPasskey'];\n type RecoverAccountFlowFn = TatchiPasskey['recoverAccountFlow'];\n\n const loginAndCreateSessionWithSdkFlow: LoginAndCreateSessionFn = async (\n nearAccountId,\n options,\n ) => {\n const seq = beginSdkFlow('login', nearAccountId);\n const wrappedOptions: LoginHooksOptions = {\n ...options,\n onEvent: (event: LoginSSEvent) => {\n appendSdkEventMessage(seq, event.message);\n if (event.phase === LoginPhase.STEP_4_LOGIN_COMPLETE && event.status === LoginStatus.SUCCESS) {\n endSdkFlow('login', seq, 'success');\n } else if (event.phase === LoginPhase.LOGIN_ERROR || event.status === LoginStatus.ERROR) {\n const error = 'error' in event ? event.error : event.message;\n endSdkFlow('login', seq, 'error', error || event.message);\n }\n options?.onEvent?.(event);\n },\n onError: (error: Error) => {\n appendSdkEventMessage(seq, error.message);\n endSdkFlow('login', seq, 'error', error.message);\n options?.onError?.(error);\n },\n };\n\n return await tatchi.loginAndCreateSession(nearAccountId, wrappedOptions);\n };\n\n const registerPasskeyWithSdkFlow: RegisterPasskeyFn = async (\n nearAccountId,\n options,\n ) => {\n const seq = beginSdkFlow('register', nearAccountId);\n const wrappedOptions: RegistrationHooksOptions = {\n ...options,\n onEvent: (event: RegistrationSSEEvent) => {\n appendSdkEventMessage(seq, event.message);\n if (\n event.phase === RegistrationPhase.STEP_8_REGISTRATION_COMPLETE &&\n event.status === RegistrationStatus.SUCCESS\n ) {\n endSdkFlow('register', seq, 'success');\n } else if (event.phase === RegistrationPhase.REGISTRATION_ERROR || event.status === RegistrationStatus.ERROR) {\n const error = 'error' in event ? event.error : event.message;\n endSdkFlow('register', seq, 'error', error || event.message);\n }\n options?.onEvent?.(event);\n },\n onError: (error: Error) => {\n appendSdkEventMessage(seq, error.message);\n endSdkFlow('register', seq, 'error', error.message);\n options?.onError?.(error);\n },\n };\n\n return await tatchi.registerPasskey(nearAccountId, wrappedOptions);\n };\n\n const recoverAccountFlowWithSdkFlow: RecoverAccountFlowFn = async (args) => {\n const seq = beginSdkFlow('recover', args?.accountId);\n const options: AccountRecoveryHooksOptions | undefined = args?.options;\n\n const wrappedOptions: AccountRecoveryHooksOptions = {\n ...options,\n onEvent: (event: AccountRecoverySSEEvent) => {\n appendSdkEventMessage(seq, event.message);\n if (\n event.phase === AccountRecoveryPhase.STEP_5_ACCOUNT_RECOVERY_COMPLETE &&\n event.status === AccountRecoveryStatus.SUCCESS\n ) {\n endSdkFlow('recover', seq, 'success');\n } else if (event.phase === AccountRecoveryPhase.ERROR || event.status === AccountRecoveryStatus.ERROR) {\n const error = 'error' in event ? event.error : event.message;\n endSdkFlow('recover', seq, 'error', error || event.message);\n }\n options?.onEvent?.(event);\n },\n onError: (error: Error) => {\n appendSdkEventMessage(seq, error.message);\n endSdkFlow('recover', seq, 'error', error.message);\n options?.onError?.(error);\n },\n };\n\n return await tatchi.recoverAccountFlow({\n ...args,\n options: wrappedOptions,\n });\n };\n\n return new Proxy(tatchi, {\n get(target, prop, receiver) {\n if (prop === 'loginAndCreateSession') {\n return loginAndCreateSessionWithSdkFlow;\n }\n\n if (prop === 'registerPasskey') {\n return registerPasskeyWithSdkFlow;\n }\n\n if (prop === 'recoverAccountFlow') {\n return recoverAccountFlowWithSdkFlow;\n }\n\n const value: unknown = Reflect.get(target as object, prop, receiver);\n // For non-wrapped methods, bind to preserve `this` on the class instance.\n if (typeof value === 'function') return (value as (...args: unknown[]) => unknown).bind(target);\n return value;\n },\n });\n }, [appendSdkEventMessage, beginSdkFlow, endSdkFlow, tatchi]);\n}\n\nexport default useTatchiWithSdkFlow;\n"],"mappings":";;;;;;;AAiBA,SAAgB,qBAAqB,MAKnB;CAChB,MAAM,EAAE,QAAQ,cAAc,uBAAuB,eAAe;AAEpE,iCAAqB;EAYnB,MAAMA,mCAA4D,OAChE,eACA,YACG;GACH,MAAM,MAAM,aAAa,SAAS;GAClC,MAAMC,iBAAoC;IACxC,GAAG;IACH,UAAU,UAAwB;AAChC,2BAAsB,KAAK,MAAM;AACjC,SAAI,MAAM,UAAUC,iCAAW,yBAAyB,MAAM,WAAWC,kCAAY,QACnF,YAAW,SAAS,KAAK;cAChB,MAAM,UAAUD,iCAAW,eAAe,MAAM,WAAWC,kCAAY,OAAO;MACvF,MAAM,QAAQ,WAAW,QAAQ,MAAM,QAAQ,MAAM;AACrD,iBAAW,SAAS,KAAK,SAAS,SAAS,MAAM;;AAEnD,cAAS,UAAU;;IAErB,UAAU,UAAiB;AACzB,2BAAsB,KAAK,MAAM;AACjC,gBAAW,SAAS,KAAK,SAAS,MAAM;AACxC,cAAS,UAAU;;;AAIvB,UAAO,MAAM,OAAO,sBAAsB,eAAe;;EAG3D,MAAMC,6BAAgD,OACpD,eACA,YACG;GACH,MAAM,MAAM,aAAa,YAAY;GACrC,MAAMC,iBAA2C;IAC/C,GAAG;IACH,UAAU,UAAgC;AACxC,2BAAsB,KAAK,MAAM;AACjC,SACE,MAAM,UAAUC,wCAAkB,gCAClC,MAAM,WAAWC,yCAAmB,QAEpC,YAAW,YAAY,KAAK;cACnB,MAAM,UAAUD,wCAAkB,sBAAsB,MAAM,WAAWC,yCAAmB,OAAO;MAC5G,MAAM,QAAQ,WAAW,QAAQ,MAAM,QAAQ,MAAM;AACrD,iBAAW,YAAY,KAAK,SAAS,SAAS,MAAM;;AAEtD,cAAS,UAAU;;IAErB,UAAU,UAAiB;AACzB,2BAAsB,KAAK,MAAM;AACjC,gBAAW,YAAY,KAAK,SAAS,MAAM;AAC3C,cAAS,UAAU;;;AAIvB,UAAO,MAAM,OAAO,gBAAgB,eAAe;;EAGrD,MAAMC,gCAAsD,OAAO,WAAS;GAC1E,MAAM,MAAM,aAAa,WAAWC,QAAM;GAC1C,MAAMC,UAAmDD,QAAM;GAE/D,MAAME,iBAA8C;IAClD,GAAG;IACH,UAAU,UAAmC;AAC3C,2BAAsB,KAAK,MAAM;AACjC,SACE,MAAM,UAAUC,2CAAqB,oCACrC,MAAM,WAAWC,4CAAsB,QAEvC,YAAW,WAAW,KAAK;cAClB,MAAM,UAAUD,2CAAqB,SAAS,MAAM,WAAWC,4CAAsB,OAAO;MACrG,MAAM,QAAQ,WAAW,QAAQ,MAAM,QAAQ,MAAM;AACrD,iBAAW,WAAW,KAAK,SAAS,SAAS,MAAM;;AAErD,cAAS,UAAU;;IAErB,UAAU,UAAiB;AACzB,2BAAsB,KAAK,MAAM;AACjC,gBAAW,WAAW,KAAK,SAAS,MAAM;AAC1C,cAAS,UAAU;;;AAIvB,UAAO,MAAM,OAAO,mBAAmB;IACrC,GAAGJ;IACH,SAAS;;;AAIb,SAAO,IAAI,MAAM,QAAQ,EACvB,IAAI,QAAQ,MAAM,UAAU;AAC1B,OAAI,SAAS,wBACX,QAAO;AAGT,OAAI,SAAS,kBACX,QAAO;AAGT,OAAI,SAAS,qBACX,QAAO;GAGT,MAAMK,QAAiB,QAAQ,IAAI,QAAkB,MAAM;AAE3D,OAAI,OAAO,UAAU,WAAY,QAAQ,MAA0C,KAAK;AACxF,UAAO;;IAGV;EAAC;EAAuB;EAAc;EAAY"}
@@ -102,6 +102,7 @@ var init_EmailRecovery = require_rolldown_runtime.__esm({ "src/core/EmailRecover
102
102
  //#endregion
103
103
  init_EmailRecovery();
104
104
  exports.bytesToHex = bytesToHex;
105
+ exports.canonicalizeEmail = canonicalizeEmail;
105
106
  exports.getLocalRecoveryEmails = getLocalRecoveryEmails;
106
107
  Object.defineProperty(exports, 'init_EmailRecovery', {
107
108
  enumerable: true,
@@ -6,7 +6,9 @@ const require_vrf_worker = require('../types/vrf-worker.js');
6
6
  const require_errors = require('../../utils/errors.js');
7
7
  const require_sdkSentEvents = require('../types/sdkSentEvents.js');
8
8
  const require_rpc = require('../types/rpc.js');
9
+ const require_rpcCalls = require('../rpcCalls.js');
9
10
  const require_getDeviceNumber = require('../WebAuthnManager/SignerWorkerManager/getDeviceNumber.js');
11
+ const require_nearCrypto = require('../nearCrypto.js');
10
12
  const require_login = require('./login.js');
11
13
  const require_emailRecoveryPendingStore = require('../EmailRecovery/emailRecoveryPendingStore.js');
12
14
  const require_index$1 = require('../EmailRecovery/index.js');
@@ -25,16 +27,12 @@ function getEmailRecoveryConfig(configs) {
25
27
  const maxPollingDurationMs = Number(relayerEmailCfg.maxPollingDurationMs);
26
28
  const pendingTtlMs = Number(relayerEmailCfg.pendingTtlMs);
27
29
  const mailtoAddress = String(relayerEmailCfg.mailtoAddress);
28
- const dkimVerifierAccountId = String(relayerEmailCfg.dkimVerifierAccountId);
29
- const verificationViewMethod = String(relayerEmailCfg.verificationViewMethod);
30
30
  return {
31
31
  minBalanceYocto,
32
32
  pollingIntervalMs,
33
33
  maxPollingDurationMs,
34
34
  pendingTtlMs,
35
- mailtoAddress,
36
- dkimVerifierAccountId,
37
- verificationViewMethod
35
+ mailtoAddress
38
36
  };
39
37
  }
40
38
  function generateEmailRecoveryRequestId() {
@@ -59,6 +57,8 @@ var init_emailRecovery = require_rolldown_runtime.__esm({ "src/core/TatchiPasske
59
57
  require_login.init_login();
60
58
  require_index$1.init_EmailRecovery();
61
59
  require_emailRecovery.init_emailRecovery();
60
+ require_rpcCalls.init_rpcCalls();
61
+ require_nearCrypto.init_nearCrypto();
62
62
  EmailRecoveryFlow = class {
63
63
  context;
64
64
  options;
@@ -151,10 +151,9 @@ var init_emailRecovery = require_rolldown_runtime.__esm({ "src/core/TatchiPasske
151
151
  await this.fail(1, require_errors.errorMessage(err) || "Failed to fetch account balance for recovery");
152
152
  }
153
153
  }
154
- async getCanonicalRecoveryEmailOrFail(recoveryEmail) {
154
+ getCanonicalRecoveryEmail(recoveryEmail) {
155
155
  const canonicalEmail = String(recoveryEmail || "").trim().toLowerCase();
156
- if (!canonicalEmail) await this.fail(1, "Recovery email is required for email-based account recovery");
157
- return canonicalEmail;
156
+ return canonicalEmail || void 0;
158
157
  }
159
158
  async getNextDeviceNumberFromContract(nearAccountId) {
160
159
  try {
@@ -212,7 +211,7 @@ var init_emailRecovery = require_rolldown_runtime.__esm({ "src/core/TatchiPasske
212
211
  message: "New device key created; please send the recovery email from your registered address.",
213
212
  data: {
214
213
  accountId: rec.accountId,
215
- recoveryEmail: rec.recoveryEmail,
214
+ ...rec.recoveryEmail ? { recoveryEmail: rec.recoveryEmail } : {},
216
215
  nearPublicKey: rec.nearPublicKey,
217
216
  requestId: rec.requestId,
218
217
  mailtoUrl
@@ -228,44 +227,57 @@ var init_emailRecovery = require_rolldown_runtime.__esm({ "src/core/TatchiPasske
228
227
  data
229
228
  });
230
229
  }
231
- async checkViaDkimViewMethod(rec) {
232
- const { dkimVerifierAccountId, verificationViewMethod } = this.getConfig();
233
- if (!dkimVerifierAccountId) return null;
230
+ async checkViaEmailRecovererAttempt(rec) {
234
231
  try {
235
- const { getEmailRecoveryVerificationResult } = await Promise.resolve().then(() => require("../rpcCalls.js"));
236
- const result = await getEmailRecoveryVerificationResult(this.context.nearClient, dkimVerifierAccountId, verificationViewMethod, rec.requestId);
237
- if (!result) return {
232
+ const attempt = await require_rpcCalls.getEmailRecoveryAttempt(this.context.nearClient, rec.accountId, rec.requestId);
233
+ if (!attempt) return {
238
234
  completed: false,
239
- success: false
235
+ success: false,
236
+ missing: true
240
237
  };
241
- if (!result.verified) {
242
- const errorMessage$1 = result.error_message || result.error_code || "Email verification failed on relayer/contract";
243
- return {
238
+ if (attempt.request_id && attempt.request_id !== rec.requestId) return {
239
+ completed: true,
240
+ success: false,
241
+ errorMessage: "Email recovery attempt request_id does not match requested requestId."
242
+ };
243
+ if (attempt.new_public_key && attempt.new_public_key !== rec.nearPublicKey) {
244
+ const expected = require_nearCrypto.ensureEd25519Prefix(rec.nearPublicKey);
245
+ const actual = require_nearCrypto.ensureEd25519Prefix(attempt.new_public_key);
246
+ if (actual === expected) {} else return {
244
247
  completed: true,
245
248
  success: false,
246
- errorMessage: errorMessage$1,
247
- transactionHash: result.transaction_hash
249
+ errorMessage: `Email recovery new_public_key mismatch for request ${rec.requestId}. Expected ${expected}; got ${actual}. This usually means the recovery email you sent was generated for a different device/attempt.`
248
250
  };
249
251
  }
250
- if (result.account_id && result.account_id !== rec.accountId) return {
252
+ const normalized = attempt.status.toLowerCase();
253
+ if (normalized === "complete" || normalized === "completed") return {
251
254
  completed: true,
252
- success: false,
253
- errorMessage: "Email verification account_id does not match requested account.",
254
- transactionHash: result.transaction_hash
255
+ success: true
255
256
  };
256
- if (result.new_public_key && result.new_public_key !== rec.nearPublicKey) return {
257
+ if (normalized.includes("failed")) return {
257
258
  completed: true,
258
259
  success: false,
259
- errorMessage: "Email verification new_public_key does not match expected recovery key.",
260
- transactionHash: result.transaction_hash
260
+ errorMessage: attempt.error || `Email recovery failed (${attempt.status || "unknown status"})`
261
261
  };
262
262
  return {
263
- completed: true,
264
- success: true,
265
- transactionHash: result.transaction_hash
263
+ completed: false,
264
+ success: false
266
265
  };
267
266
  } catch (err) {
268
- console.warn("[EmailRecoveryFlow] get_verification_result view failed; will retry", err);
267
+ console.warn("[EmailRecoveryFlow] get_recovery_attempt view failed; will retry", err);
268
+ return null;
269
+ }
270
+ }
271
+ async isRecoveryAccessKeyPresent(rec) {
272
+ try {
273
+ await this.context.nearClient.viewAccessKey(rec.accountId, rec.nearPublicKey);
274
+ return true;
275
+ } catch (err) {
276
+ const kind = typeof err?.kind === "string" ? String(err.kind) : "";
277
+ const short = typeof err?.short === "string" ? String(err.short) : "";
278
+ const msg = typeof err?.message === "string" ? String(err.message) : "";
279
+ if (/AccessKeyDoesNotExist/i.test(kind) || /AccessKeyDoesNotExist/i.test(short) || /access key does not exist/i.test(msg) || /access key .*does not exist/i.test(msg)) return false;
280
+ console.warn("[EmailRecoveryFlow] view_access_key failed while checking recovery key; will retry", err);
269
281
  return null;
270
282
  }
271
283
  }
@@ -374,7 +386,7 @@ var init_emailRecovery = require_rolldown_runtime.__esm({ "src/core/TatchiPasske
374
386
  });
375
387
  const nearAccountId = await this.assertValidAccountIdOrFail(1, accountId);
376
388
  await this.assertSufficientBalance(nearAccountId);
377
- const canonicalEmail = await this.getCanonicalRecoveryEmailOrFail(recoveryEmail);
389
+ const canonicalEmail = this.getCanonicalRecoveryEmail(recoveryEmail);
378
390
  const deviceNumber = await this.getNextDeviceNumberFromContract(nearAccountId);
379
391
  this.phase = require_sdkSentEvents.EmailRecoveryPhase.STEP_2_TOUCH_ID_REGISTRATION;
380
392
  this.emit({
@@ -505,29 +517,39 @@ var init_emailRecovery = require_rolldown_runtime.__esm({ "src/core/TatchiPasske
505
517
  await this.options?.afterCall?.(true, void 0);
506
518
  }
507
519
  async pollUntilAddKey(rec) {
508
- const { pollingIntervalMs, maxPollingDurationMs, dkimVerifierAccountId } = this.getConfig();
509
- if (!dkimVerifierAccountId) {
510
- const err$1 = this.emitError(4, "Email recovery verification contract (dkimVerifierAccountId) is not configured");
511
- await this.options?.afterCall?.(false);
512
- throw err$1;
513
- }
520
+ const { pollingIntervalMs, maxPollingDurationMs } = this.getConfig();
514
521
  this.phase = require_sdkSentEvents.EmailRecoveryPhase.STEP_4_POLLING_VERIFICATION_RESULT;
515
522
  this.pollingStartedAt = Date.now();
523
+ let sawAttempt = false;
516
524
  const pollResult = await this.pollUntil({
517
525
  intervalMs: pollingIntervalMs,
518
526
  timeoutMs: maxPollingDurationMs,
519
527
  isCancelled: () => this.cancelled,
520
528
  tick: async ({ elapsedMs, pollCount }) => {
521
- const verification = await this.checkViaDkimViewMethod(rec);
522
- const completed = verification?.completed === true;
523
- const success = verification?.success === true;
529
+ const verification = await this.checkViaEmailRecovererAttempt(rec);
530
+ if (verification && !verification.missing) sawAttempt = true;
531
+ let completed = verification?.completed === true;
532
+ let success = verification?.success === true;
533
+ let errorMessage$1 = verification?.errorMessage;
534
+ let transactionHash;
535
+ if (verification?.missing) {
536
+ const hasKey = await this.isRecoveryAccessKeyPresent(rec);
537
+ if (hasKey === true) {
538
+ completed = true;
539
+ success = true;
540
+ } else if (hasKey === false && sawAttempt) {
541
+ completed = true;
542
+ success = false;
543
+ errorMessage$1 = "Email recovery attempt was cleared on-chain before completion. Please resend the recovery email or restart the flow.";
544
+ } else if (hasKey === null) return { done: false };
545
+ }
524
546
  this.emit({
525
547
  step: 4,
526
548
  phase: require_sdkSentEvents.EmailRecoveryPhase.STEP_4_POLLING_VERIFICATION_RESULT,
527
549
  status: require_sdkSentEvents.EmailRecoveryStatus.PROGRESS,
528
- message: completed && success ? `Email verified for request ${rec.requestId}; finalizing registration` : `Waiting for email verification for request ${rec.requestId}`,
550
+ message: completed && success ? `Email recovery completed for request ${rec.requestId}; finalizing registration` : `Waiting for email recovery for request ${rec.requestId}`,
529
551
  data: this.buildPollingEventData(rec, {
530
- transactionHash: verification?.transactionHash,
552
+ transactionHash,
531
553
  elapsedMs,
532
554
  pollCount
533
555
  })
@@ -537,7 +559,7 @@ var init_emailRecovery = require_rolldown_runtime.__esm({ "src/core/TatchiPasske
537
559
  done: true,
538
560
  value: {
539
561
  outcome: "failed",
540
- errorMessage: verification?.errorMessage || "Email verification failed"
562
+ errorMessage: errorMessage$1 || "Email recovery failed"
541
563
  }
542
564
  };
543
565
  return {