@tatchi-xyz/sdk 0.16.0 → 0.18.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 (501) hide show
  1. package/dist/cjs/core/EmailRecovery/emailRecoveryPendingStore.js +69 -0
  2. package/dist/cjs/core/EmailRecovery/emailRecoveryPendingStore.js.map +1 -0
  3. package/dist/cjs/core/EmailRecovery/index.js +32 -13
  4. package/dist/cjs/core/EmailRecovery/index.js.map +1 -1
  5. package/dist/cjs/core/IndexedDBManager/passkeyClientDB.js +35 -36
  6. package/dist/cjs/core/IndexedDBManager/passkeyClientDB.js.map +1 -1
  7. package/dist/cjs/core/NearClient.js +2 -1
  8. package/dist/cjs/core/NearClient.js.map +1 -1
  9. package/dist/cjs/core/TatchiPasskey/emailRecovery.js +557 -377
  10. package/dist/cjs/core/TatchiPasskey/emailRecovery.js.map +1 -1
  11. package/dist/cjs/core/TatchiPasskey/faucets/createAccountRelayServer.js +1 -0
  12. package/dist/cjs/core/TatchiPasskey/faucets/createAccountRelayServer.js.map +1 -1
  13. package/dist/cjs/core/TatchiPasskey/index.js +26 -0
  14. package/dist/cjs/core/TatchiPasskey/index.js.map +1 -1
  15. package/dist/cjs/core/TatchiPasskey/linkDevice.js +2 -0
  16. package/dist/cjs/core/TatchiPasskey/linkDevice.js.map +1 -1
  17. package/dist/cjs/core/TatchiPasskey/login.js +15 -4
  18. package/dist/cjs/core/TatchiPasskey/login.js.map +1 -1
  19. package/dist/cjs/core/TatchiPasskey/recoverAccount.js +1 -0
  20. package/dist/cjs/core/TatchiPasskey/recoverAccount.js.map +1 -1
  21. package/dist/cjs/core/TatchiPasskey/relay.js +23 -1
  22. package/dist/cjs/core/TatchiPasskey/relay.js.map +1 -1
  23. package/dist/cjs/core/TatchiPasskey/scanDevice.js +1 -0
  24. package/dist/cjs/core/TatchiPasskey/scanDevice.js.map +1 -1
  25. package/dist/cjs/core/WalletIframe/client/IframeTransport.js +3 -0
  26. package/dist/cjs/core/WalletIframe/client/IframeTransport.js.map +1 -1
  27. package/dist/cjs/core/WalletIframe/client/router.js +15 -2
  28. package/dist/cjs/core/WalletIframe/client/router.js.map +1 -1
  29. package/dist/cjs/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js +1 -1
  30. package/dist/cjs/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js.map +1 -1
  31. package/dist/cjs/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.js +52 -52
  32. package/dist/cjs/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.js.map +1 -1
  33. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/getDeviceNumber.js +10 -1
  34. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/getDeviceNumber.js.map +1 -1
  35. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.js +1 -0
  36. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.js.map +1 -1
  37. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.js +1 -0
  38. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.js.map +1 -1
  39. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.js +1 -0
  40. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.js.map +1 -1
  41. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.js +1 -0
  42. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.js.map +1 -1
  43. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.js +2 -1
  44. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.js.map +1 -1
  45. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.js +1 -0
  46. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.js.map +1 -1
  47. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.js +1 -0
  48. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.js.map +1 -1
  49. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/signTransactionsWithActions.js +1 -0
  50. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/signTransactionsWithActions.js.map +1 -1
  51. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js +2 -0
  52. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js.map +1 -1
  53. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/index.js +1 -0
  54. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/index.js.map +1 -1
  55. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.js +1 -0
  56. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.js.map +1 -1
  57. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js +6 -0
  58. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js.map +1 -1
  59. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/determineConfirmationConfig.js +2 -1
  60. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/determineConfirmationConfig.js.map +1 -1
  61. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js +1 -0
  62. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js.map +1 -1
  63. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js +1 -0
  64. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js.map +1 -1
  65. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js +4 -15
  66. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js.map +1 -1
  67. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/handlers/deriveVrfKeypairFromPrf.js +1 -0
  68. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/handlers/deriveVrfKeypairFromPrf.js.map +1 -1
  69. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfChallenge.js +1 -0
  70. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfChallenge.js.map +1 -1
  71. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfKeypairBootstrap.js +1 -0
  72. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfKeypairBootstrap.js.map +1 -1
  73. package/dist/cjs/core/WebAuthnManager/WebAuthnFallbacks/index.js +17 -0
  74. package/dist/cjs/core/WebAuthnManager/WebAuthnFallbacks/index.js.map +1 -0
  75. package/dist/cjs/core/WebAuthnManager/WebAuthnFallbacks/safari-fallbacks.js +64 -54
  76. package/dist/cjs/core/WebAuthnManager/WebAuthnFallbacks/safari-fallbacks.js.map +1 -1
  77. package/dist/cjs/core/WebAuthnManager/credentialsHelpers.js +12 -2
  78. package/dist/cjs/core/WebAuthnManager/credentialsHelpers.js.map +1 -1
  79. package/dist/cjs/core/WebAuthnManager/index.js +6 -1
  80. package/dist/cjs/core/WebAuthnManager/index.js.map +1 -1
  81. package/dist/cjs/core/WebAuthnManager/touchIdPrompt.js +209 -201
  82. package/dist/cjs/core/WebAuthnManager/touchIdPrompt.js.map +1 -1
  83. package/dist/cjs/core/WebAuthnManager/userHandle.js +2 -1
  84. package/dist/cjs/core/WebAuthnManager/userHandle.js.map +1 -1
  85. package/dist/cjs/core/defaultConfigs.js +1 -1
  86. package/dist/cjs/core/defaultConfigs.js.map +1 -1
  87. package/dist/cjs/core/rpcCalls.js +8 -0
  88. package/dist/cjs/core/rpcCalls.js.map +1 -1
  89. package/dist/cjs/core/types/vrf-worker.js +10 -1
  90. package/dist/cjs/core/types/vrf-worker.js.map +1 -1
  91. package/dist/cjs/index.js +6 -2
  92. package/dist/cjs/index.js.map +1 -1
  93. package/dist/cjs/react/components/AccountMenuButton/{LinkedDevicesModal-STvIsylA.css → LinkedDevicesModal-CSSowiHP.css} +1 -1
  94. package/dist/{esm/react/components/AccountMenuButton/LinkedDevicesModal-STvIsylA.css.map → cjs/react/components/AccountMenuButton/LinkedDevicesModal-CSSowiHP.css.map} +1 -1
  95. package/dist/cjs/react/components/AccountMenuButton/{ProfileDropdown-iARgUwK1.css → ProfileDropdown-CEPMZ1gY.css} +1 -1
  96. package/dist/{esm/react/components/AccountMenuButton/ProfileDropdown-iARgUwK1.css.map → cjs/react/components/AccountMenuButton/ProfileDropdown-CEPMZ1gY.css.map} +1 -1
  97. package/dist/cjs/react/components/AccountMenuButton/{Web3AuthProfileButton-Db3NeoAC.css → Web3AuthProfileButton-DopOg7Xc.css} +1 -1
  98. package/dist/cjs/react/components/AccountMenuButton/{Web3AuthProfileButton-Db3NeoAC.css.map → Web3AuthProfileButton-DopOg7Xc.css.map} +1 -1
  99. package/dist/cjs/react/components/AccountMenuButton/icons/{TouchIcon-BXM5NR4A.css → TouchIcon-BQWentvJ.css} +1 -1
  100. package/dist/cjs/react/components/AccountMenuButton/icons/{TouchIcon-BXM5NR4A.css.map → TouchIcon-BQWentvJ.css.map} +1 -1
  101. package/dist/cjs/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-De1qTSmU.css → PasskeyAuthMenu-DwrzWMYx.css} +14 -1
  102. package/dist/cjs/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-De1qTSmU.css.map → PasskeyAuthMenu-DwrzWMYx.css.map} +1 -1
  103. package/dist/cjs/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js +122 -53
  104. package/dist/cjs/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js.map +1 -1
  105. package/dist/cjs/react/components/{ShowQRCode-DCnR__fx.css → ShowQRCode-CCN4h6Uv.css} +1 -1
  106. package/dist/cjs/react/components/{ShowQRCode-DCnR__fx.css.map → ShowQRCode-CCN4h6Uv.css.map} +1 -1
  107. package/dist/cjs/react/deviceDetection.js +75 -92
  108. package/dist/cjs/react/deviceDetection.js.map +1 -1
  109. package/dist/cjs/react/hooks/useQRCamera.js +1 -0
  110. package/dist/cjs/react/hooks/useQRCamera.js.map +1 -1
  111. package/dist/cjs/react/sdk/src/core/EmailRecovery/emailRecoveryPendingStore.js +69 -0
  112. package/dist/cjs/react/sdk/src/core/EmailRecovery/emailRecoveryPendingStore.js.map +1 -0
  113. package/dist/cjs/react/sdk/src/core/EmailRecovery/index.js +32 -13
  114. package/dist/cjs/react/sdk/src/core/EmailRecovery/index.js.map +1 -1
  115. package/dist/cjs/react/sdk/src/core/IndexedDBManager/passkeyClientDB.js +35 -36
  116. package/dist/cjs/react/sdk/src/core/IndexedDBManager/passkeyClientDB.js.map +1 -1
  117. package/dist/cjs/react/sdk/src/core/NearClient.js +2 -1
  118. package/dist/cjs/react/sdk/src/core/NearClient.js.map +1 -1
  119. package/dist/cjs/react/sdk/src/core/TatchiPasskey/emailRecovery.js +557 -377
  120. package/dist/cjs/react/sdk/src/core/TatchiPasskey/emailRecovery.js.map +1 -1
  121. package/dist/cjs/react/sdk/src/core/TatchiPasskey/faucets/createAccountRelayServer.js +1 -0
  122. package/dist/cjs/react/sdk/src/core/TatchiPasskey/faucets/createAccountRelayServer.js.map +1 -1
  123. package/dist/cjs/react/sdk/src/core/TatchiPasskey/index.js +26 -0
  124. package/dist/cjs/react/sdk/src/core/TatchiPasskey/index.js.map +1 -1
  125. package/dist/cjs/react/sdk/src/core/TatchiPasskey/linkDevice.js +2 -0
  126. package/dist/cjs/react/sdk/src/core/TatchiPasskey/linkDevice.js.map +1 -1
  127. package/dist/cjs/react/sdk/src/core/TatchiPasskey/login.js +15 -4
  128. package/dist/cjs/react/sdk/src/core/TatchiPasskey/login.js.map +1 -1
  129. package/dist/cjs/react/sdk/src/core/TatchiPasskey/recoverAccount.js +1 -0
  130. package/dist/cjs/react/sdk/src/core/TatchiPasskey/recoverAccount.js.map +1 -1
  131. package/dist/cjs/react/sdk/src/core/TatchiPasskey/relay.js +23 -1
  132. package/dist/cjs/react/sdk/src/core/TatchiPasskey/relay.js.map +1 -1
  133. package/dist/cjs/react/sdk/src/core/TatchiPasskey/scanDevice.js +1 -0
  134. package/dist/cjs/react/sdk/src/core/TatchiPasskey/scanDevice.js.map +1 -1
  135. package/dist/cjs/react/sdk/src/core/WalletIframe/client/IframeTransport.js +3 -0
  136. package/dist/cjs/react/sdk/src/core/WalletIframe/client/IframeTransport.js.map +1 -1
  137. package/dist/cjs/react/sdk/src/core/WalletIframe/client/router.js +15 -2
  138. package/dist/cjs/react/sdk/src/core/WalletIframe/client/router.js.map +1 -1
  139. package/dist/cjs/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js +1 -1
  140. package/dist/cjs/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js.map +1 -1
  141. package/dist/cjs/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.js +52 -52
  142. package/dist/cjs/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.js.map +1 -1
  143. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/getDeviceNumber.js +10 -1
  144. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/getDeviceNumber.js.map +1 -1
  145. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.js +1 -0
  146. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.js.map +1 -1
  147. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.js +1 -0
  148. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.js.map +1 -1
  149. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.js +1 -0
  150. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.js.map +1 -1
  151. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.js +1 -0
  152. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.js.map +1 -1
  153. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.js +2 -1
  154. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.js.map +1 -1
  155. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.js +1 -0
  156. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.js.map +1 -1
  157. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.js +1 -0
  158. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.js.map +1 -1
  159. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signTransactionsWithActions.js +1 -0
  160. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signTransactionsWithActions.js.map +1 -1
  161. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js +2 -0
  162. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js.map +1 -1
  163. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/index.js +1 -0
  164. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/index.js.map +1 -1
  165. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.js +1 -0
  166. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.js.map +1 -1
  167. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js +6 -0
  168. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js.map +1 -1
  169. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/determineConfirmationConfig.js +2 -1
  170. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/determineConfirmationConfig.js.map +1 -1
  171. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js +1 -0
  172. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js.map +1 -1
  173. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js +1 -0
  174. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js.map +1 -1
  175. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js +4 -15
  176. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js.map +1 -1
  177. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/deriveVrfKeypairFromPrf.js +1 -0
  178. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/deriveVrfKeypairFromPrf.js.map +1 -1
  179. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfChallenge.js +1 -0
  180. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfChallenge.js.map +1 -1
  181. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfKeypairBootstrap.js +1 -0
  182. package/dist/cjs/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfKeypairBootstrap.js.map +1 -1
  183. package/dist/cjs/react/sdk/src/core/WebAuthnManager/WebAuthnFallbacks/index.js +17 -0
  184. package/dist/cjs/react/sdk/src/core/WebAuthnManager/WebAuthnFallbacks/index.js.map +1 -0
  185. package/dist/cjs/react/sdk/src/core/WebAuthnManager/WebAuthnFallbacks/safari-fallbacks.js +64 -54
  186. package/dist/cjs/react/sdk/src/core/WebAuthnManager/WebAuthnFallbacks/safari-fallbacks.js.map +1 -1
  187. package/dist/cjs/react/sdk/src/core/WebAuthnManager/credentialsHelpers.js +12 -2
  188. package/dist/cjs/react/sdk/src/core/WebAuthnManager/credentialsHelpers.js.map +1 -1
  189. package/dist/cjs/react/sdk/src/core/WebAuthnManager/index.js +6 -1
  190. package/dist/cjs/react/sdk/src/core/WebAuthnManager/index.js.map +1 -1
  191. package/dist/cjs/react/sdk/src/core/WebAuthnManager/touchIdPrompt.js +209 -201
  192. package/dist/cjs/react/sdk/src/core/WebAuthnManager/touchIdPrompt.js.map +1 -1
  193. package/dist/cjs/react/sdk/src/core/WebAuthnManager/userHandle.js +2 -1
  194. package/dist/cjs/react/sdk/src/core/WebAuthnManager/userHandle.js.map +1 -1
  195. package/dist/cjs/react/sdk/src/core/defaultConfigs.js +1 -1
  196. package/dist/cjs/react/sdk/src/core/defaultConfigs.js.map +1 -1
  197. package/dist/cjs/react/sdk/src/core/rpcCalls.js +8 -0
  198. package/dist/cjs/react/sdk/src/core/rpcCalls.js.map +1 -1
  199. package/dist/cjs/react/sdk/src/core/types/vrf-worker.js +10 -1
  200. package/dist/cjs/react/sdk/src/core/types/vrf-worker.js.map +1 -1
  201. package/dist/cjs/react/sdk/src/utils/index.js +13 -3
  202. package/dist/cjs/server/email-recovery/emailEncryptor.js +11 -0
  203. package/dist/cjs/server/email-recovery/emailEncryptor.js.map +1 -1
  204. package/dist/cjs/server/email-recovery/emailParsers.js +57 -0
  205. package/dist/cjs/server/email-recovery/emailParsers.js.map +1 -1
  206. package/dist/cjs/server/email-recovery/index.js +1 -1
  207. package/dist/cjs/server/email-recovery/index.js.map +1 -1
  208. package/dist/cjs/server/email-recovery/rpcCalls.js +14 -1
  209. package/dist/cjs/server/email-recovery/rpcCalls.js.map +1 -1
  210. package/dist/cjs/server/index.js +1 -0
  211. package/dist/cjs/server/router/cloudflare.js.map +1 -1
  212. package/dist/cjs/server/router/express.js.map +1 -1
  213. package/dist/cjs/server/sdk/src/core/defaultConfigs.js +1 -1
  214. package/dist/cjs/server/sdk/src/core/defaultConfigs.js.map +1 -1
  215. package/dist/cjs/utils/index.js +13 -3
  216. package/dist/esm/core/EmailRecovery/emailRecoveryPendingStore.js +63 -0
  217. package/dist/esm/core/EmailRecovery/emailRecoveryPendingStore.js.map +1 -0
  218. package/dist/esm/core/EmailRecovery/index.js +28 -14
  219. package/dist/esm/core/EmailRecovery/index.js.map +1 -1
  220. package/dist/esm/core/IndexedDBManager/passkeyClientDB.js +35 -36
  221. package/dist/esm/core/IndexedDBManager/passkeyClientDB.js.map +1 -1
  222. package/dist/esm/core/NearClient.js +2 -1
  223. package/dist/esm/core/NearClient.js.map +1 -1
  224. package/dist/esm/core/TatchiPasskey/emailRecovery.js +557 -377
  225. package/dist/esm/core/TatchiPasskey/emailRecovery.js.map +1 -1
  226. package/dist/esm/core/TatchiPasskey/faucets/createAccountRelayServer.js +2 -1
  227. package/dist/esm/core/TatchiPasskey/faucets/createAccountRelayServer.js.map +1 -1
  228. package/dist/esm/core/TatchiPasskey/index.js +28 -2
  229. package/dist/esm/core/TatchiPasskey/index.js.map +1 -1
  230. package/dist/esm/core/TatchiPasskey/linkDevice.js +4 -2
  231. package/dist/esm/core/TatchiPasskey/linkDevice.js.map +1 -1
  232. package/dist/esm/core/TatchiPasskey/login.js +13 -7
  233. package/dist/esm/core/TatchiPasskey/login.js.map +1 -1
  234. package/dist/esm/core/TatchiPasskey/recoverAccount.js +2 -1
  235. package/dist/esm/core/TatchiPasskey/recoverAccount.js.map +1 -1
  236. package/dist/esm/core/TatchiPasskey/relay.js +23 -1
  237. package/dist/esm/core/TatchiPasskey/relay.js.map +1 -1
  238. package/dist/esm/core/TatchiPasskey/scanDevice.js +2 -1
  239. package/dist/esm/core/TatchiPasskey/scanDevice.js.map +1 -1
  240. package/dist/esm/core/WalletIframe/client/IframeTransport.js +4 -1
  241. package/dist/esm/core/WalletIframe/client/IframeTransport.js.map +1 -1
  242. package/dist/esm/core/WalletIframe/client/router.js +16 -3
  243. package/dist/esm/core/WalletIframe/client/router.js.map +1 -1
  244. package/dist/esm/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js +1 -1
  245. package/dist/esm/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js.map +1 -1
  246. package/dist/esm/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.js +52 -52
  247. package/dist/esm/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.js.map +1 -1
  248. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/getDeviceNumber.js +6 -2
  249. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.js +2 -1
  250. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.js.map +1 -1
  251. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.js +2 -1
  252. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.js.map +1 -1
  253. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.js +2 -1
  254. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.js.map +1 -1
  255. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.js +2 -1
  256. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.js.map +1 -1
  257. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.js +2 -1
  258. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.js.map +1 -1
  259. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.js +2 -1
  260. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.js.map +1 -1
  261. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.js +2 -1
  262. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.js.map +1 -1
  263. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/signTransactionsWithActions.js +2 -1
  264. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/signTransactionsWithActions.js.map +1 -1
  265. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js +4 -2
  266. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js.map +1 -1
  267. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/index.js +2 -1
  268. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/index.js.map +1 -1
  269. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.js +1 -0
  270. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.js.map +1 -1
  271. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js +8 -2
  272. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js.map +1 -1
  273. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/determineConfirmationConfig.js +2 -1
  274. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/determineConfirmationConfig.js.map +1 -1
  275. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js +2 -1
  276. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js.map +1 -1
  277. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js +2 -1
  278. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js.map +1 -1
  279. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js +5 -16
  280. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js.map +1 -1
  281. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/handlers/deriveVrfKeypairFromPrf.js +2 -1
  282. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/handlers/deriveVrfKeypairFromPrf.js.map +1 -1
  283. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfChallenge.js +2 -1
  284. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfChallenge.js.map +1 -1
  285. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfKeypairBootstrap.js +2 -1
  286. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfKeypairBootstrap.js.map +1 -1
  287. package/dist/esm/core/WebAuthnManager/WebAuthnFallbacks/index.js +12 -0
  288. package/dist/esm/core/WebAuthnManager/WebAuthnFallbacks/index.js.map +1 -0
  289. package/dist/esm/core/WebAuthnManager/WebAuthnFallbacks/safari-fallbacks.js +61 -55
  290. package/dist/esm/core/WebAuthnManager/WebAuthnFallbacks/safari-fallbacks.js.map +1 -1
  291. package/dist/esm/core/WebAuthnManager/credentialsHelpers.js +8 -3
  292. package/dist/esm/core/WebAuthnManager/index.js +8 -3
  293. package/dist/esm/core/WebAuthnManager/index.js.map +1 -1
  294. package/dist/esm/core/WebAuthnManager/touchIdPrompt.js +207 -204
  295. package/dist/esm/core/WebAuthnManager/touchIdPrompt.js.map +1 -1
  296. package/dist/esm/core/WebAuthnManager/userHandle.js +2 -1
  297. package/dist/esm/core/WebAuthnManager/userHandle.js.map +1 -1
  298. package/dist/esm/core/defaultConfigs.js +1 -1
  299. package/dist/esm/core/defaultConfigs.js.map +1 -1
  300. package/dist/esm/core/rpcCalls.js +8 -1
  301. package/dist/esm/core/rpcCalls.js.map +1 -1
  302. package/dist/esm/core/types/vrf-worker.js +6 -2
  303. package/dist/esm/index.js +4 -1
  304. package/dist/esm/index.js.map +1 -1
  305. package/dist/esm/react/components/AccountMenuButton/{LinkedDevicesModal-STvIsylA.css → LinkedDevicesModal-CSSowiHP.css} +1 -1
  306. package/dist/{cjs/react/components/AccountMenuButton/LinkedDevicesModal-STvIsylA.css.map → esm/react/components/AccountMenuButton/LinkedDevicesModal-CSSowiHP.css.map} +1 -1
  307. package/dist/esm/react/components/AccountMenuButton/{ProfileDropdown-iARgUwK1.css → ProfileDropdown-CEPMZ1gY.css} +1 -1
  308. package/dist/{cjs/react/components/AccountMenuButton/ProfileDropdown-iARgUwK1.css.map → esm/react/components/AccountMenuButton/ProfileDropdown-CEPMZ1gY.css.map} +1 -1
  309. package/dist/esm/react/components/AccountMenuButton/{Web3AuthProfileButton-Db3NeoAC.css → Web3AuthProfileButton-DopOg7Xc.css} +1 -1
  310. package/dist/esm/react/components/AccountMenuButton/{Web3AuthProfileButton-Db3NeoAC.css.map → Web3AuthProfileButton-DopOg7Xc.css.map} +1 -1
  311. package/dist/esm/react/components/AccountMenuButton/icons/{TouchIcon-BXM5NR4A.css → TouchIcon-BQWentvJ.css} +1 -1
  312. package/dist/esm/react/components/AccountMenuButton/icons/{TouchIcon-BXM5NR4A.css.map → TouchIcon-BQWentvJ.css.map} +1 -1
  313. package/dist/esm/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-De1qTSmU.css → PasskeyAuthMenu-DwrzWMYx.css} +14 -1
  314. package/dist/esm/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-De1qTSmU.css.map → PasskeyAuthMenu-DwrzWMYx.css.map} +1 -1
  315. package/dist/esm/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js +123 -54
  316. package/dist/esm/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js.map +1 -1
  317. package/dist/esm/react/components/{ShowQRCode-DCnR__fx.css → ShowQRCode-CCN4h6Uv.css} +1 -1
  318. package/dist/esm/react/components/{ShowQRCode-DCnR__fx.css.map → ShowQRCode-CCN4h6Uv.css.map} +1 -1
  319. package/dist/esm/react/deviceDetection.js +72 -93
  320. package/dist/esm/react/deviceDetection.js.map +1 -1
  321. package/dist/esm/react/hooks/useQRCamera.js +2 -1
  322. package/dist/esm/react/hooks/useQRCamera.js.map +1 -1
  323. package/dist/esm/react/sdk/src/core/EmailRecovery/emailRecoveryPendingStore.js +63 -0
  324. package/dist/esm/react/sdk/src/core/EmailRecovery/emailRecoveryPendingStore.js.map +1 -0
  325. package/dist/esm/react/sdk/src/core/EmailRecovery/index.js +28 -14
  326. package/dist/esm/react/sdk/src/core/EmailRecovery/index.js.map +1 -1
  327. package/dist/esm/react/sdk/src/core/IndexedDBManager/passkeyClientDB.js +35 -36
  328. package/dist/esm/react/sdk/src/core/IndexedDBManager/passkeyClientDB.js.map +1 -1
  329. package/dist/esm/react/sdk/src/core/NearClient.js +2 -1
  330. package/dist/esm/react/sdk/src/core/NearClient.js.map +1 -1
  331. package/dist/esm/react/sdk/src/core/TatchiPasskey/emailRecovery.js +557 -377
  332. package/dist/esm/react/sdk/src/core/TatchiPasskey/emailRecovery.js.map +1 -1
  333. package/dist/esm/react/sdk/src/core/TatchiPasskey/faucets/createAccountRelayServer.js +2 -1
  334. package/dist/esm/react/sdk/src/core/TatchiPasskey/faucets/createAccountRelayServer.js.map +1 -1
  335. package/dist/esm/react/sdk/src/core/TatchiPasskey/index.js +28 -2
  336. package/dist/esm/react/sdk/src/core/TatchiPasskey/index.js.map +1 -1
  337. package/dist/esm/react/sdk/src/core/TatchiPasskey/linkDevice.js +4 -2
  338. package/dist/esm/react/sdk/src/core/TatchiPasskey/linkDevice.js.map +1 -1
  339. package/dist/esm/react/sdk/src/core/TatchiPasskey/login.js +13 -7
  340. package/dist/esm/react/sdk/src/core/TatchiPasskey/login.js.map +1 -1
  341. package/dist/esm/react/sdk/src/core/TatchiPasskey/recoverAccount.js +2 -1
  342. package/dist/esm/react/sdk/src/core/TatchiPasskey/recoverAccount.js.map +1 -1
  343. package/dist/esm/react/sdk/src/core/TatchiPasskey/relay.js +23 -1
  344. package/dist/esm/react/sdk/src/core/TatchiPasskey/relay.js.map +1 -1
  345. package/dist/esm/react/sdk/src/core/TatchiPasskey/scanDevice.js +2 -1
  346. package/dist/esm/react/sdk/src/core/TatchiPasskey/scanDevice.js.map +1 -1
  347. package/dist/esm/react/sdk/src/core/WalletIframe/client/IframeTransport.js +4 -1
  348. package/dist/esm/react/sdk/src/core/WalletIframe/client/IframeTransport.js.map +1 -1
  349. package/dist/esm/react/sdk/src/core/WalletIframe/client/router.js +16 -3
  350. package/dist/esm/react/sdk/src/core/WalletIframe/client/router.js.map +1 -1
  351. package/dist/esm/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js +1 -1
  352. package/dist/esm/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.js.map +1 -1
  353. package/dist/esm/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.js +52 -52
  354. package/dist/esm/react/sdk/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.js.map +1 -1
  355. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/getDeviceNumber.js +6 -2
  356. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.js +2 -1
  357. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.js.map +1 -1
  358. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.js +2 -1
  359. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.js.map +1 -1
  360. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.js +2 -1
  361. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.js.map +1 -1
  362. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.js +2 -1
  363. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.js.map +1 -1
  364. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.js +2 -1
  365. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.js.map +1 -1
  366. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.js +2 -1
  367. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.js.map +1 -1
  368. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.js +2 -1
  369. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.js.map +1 -1
  370. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signTransactionsWithActions.js +2 -1
  371. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/signTransactionsWithActions.js.map +1 -1
  372. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js +4 -2
  373. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js.map +1 -1
  374. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/index.js +2 -1
  375. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/index.js.map +1 -1
  376. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.js +1 -0
  377. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.js.map +1 -1
  378. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js +8 -2
  379. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.js.map +1 -1
  380. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/determineConfirmationConfig.js +2 -1
  381. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/determineConfirmationConfig.js.map +1 -1
  382. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js +2 -1
  383. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/localOnly.js.map +1 -1
  384. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js +2 -1
  385. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js.map +1 -1
  386. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js +5 -16
  387. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js.map +1 -1
  388. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/deriveVrfKeypairFromPrf.js +2 -1
  389. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/deriveVrfKeypairFromPrf.js.map +1 -1
  390. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfChallenge.js +2 -1
  391. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfChallenge.js.map +1 -1
  392. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfKeypairBootstrap.js +2 -1
  393. package/dist/esm/react/sdk/src/core/WebAuthnManager/VrfWorkerManager/handlers/generateVrfKeypairBootstrap.js.map +1 -1
  394. package/dist/esm/react/sdk/src/core/WebAuthnManager/WebAuthnFallbacks/index.js +12 -0
  395. package/dist/esm/react/sdk/src/core/WebAuthnManager/WebAuthnFallbacks/index.js.map +1 -0
  396. package/dist/esm/react/sdk/src/core/WebAuthnManager/WebAuthnFallbacks/safari-fallbacks.js +61 -55
  397. package/dist/esm/react/sdk/src/core/WebAuthnManager/WebAuthnFallbacks/safari-fallbacks.js.map +1 -1
  398. package/dist/esm/react/sdk/src/core/WebAuthnManager/credentialsHelpers.js +8 -3
  399. package/dist/esm/react/sdk/src/core/WebAuthnManager/index.js +8 -3
  400. package/dist/esm/react/sdk/src/core/WebAuthnManager/index.js.map +1 -1
  401. package/dist/esm/react/sdk/src/core/WebAuthnManager/touchIdPrompt.js +207 -204
  402. package/dist/esm/react/sdk/src/core/WebAuthnManager/touchIdPrompt.js.map +1 -1
  403. package/dist/esm/react/sdk/src/core/WebAuthnManager/userHandle.js +2 -1
  404. package/dist/esm/react/sdk/src/core/WebAuthnManager/userHandle.js.map +1 -1
  405. package/dist/esm/react/sdk/src/core/defaultConfigs.js +1 -1
  406. package/dist/esm/react/sdk/src/core/defaultConfigs.js.map +1 -1
  407. package/dist/esm/react/sdk/src/core/rpcCalls.js +8 -1
  408. package/dist/esm/react/sdk/src/core/rpcCalls.js.map +1 -1
  409. package/dist/esm/react/sdk/src/core/types/vrf-worker.js +6 -2
  410. package/dist/esm/react/sdk/src/utils/index.js +10 -4
  411. package/dist/esm/react/styles/styles.css +13 -0
  412. package/dist/esm/sdk/{safari-fallbacks-oQKu9xUs.js → WebAuthnFallbacks-Bl4BTsNt.js} +131 -135
  413. package/dist/esm/sdk/{createAdapters-pNiL2KNq.js → createAdapters-BumKM2ft.js} +59 -54
  414. package/dist/esm/sdk/createAdapters-BumKM2ft.js.map +1 -0
  415. package/dist/esm/sdk/{createAdapters-BWLe9Ddo.js → createAdapters-qVGD6i0g.js} +10 -3
  416. package/dist/esm/sdk/{defaultConfigs-VzvDejmy.js → defaultConfigs-DpslkAQd.js} +1 -1
  417. package/dist/esm/sdk/{getDeviceNumber-CkWRT17I.js → getDeviceNumber-fXizNGQl.js} +2 -2
  418. package/dist/esm/sdk/getDeviceNumber-fXizNGQl.js.map +1 -0
  419. package/dist/esm/sdk/{getDeviceNumber-CfmlgfMX.js → getDeviceNumber-zsOHT_Um.js} +6 -3
  420. package/dist/esm/sdk/{localOnly-DnpSyDaF.js → localOnly-Byi3AK7A.js} +2 -2
  421. package/dist/esm/sdk/{localOnly-DnpSyDaF.js.map → localOnly-Byi3AK7A.js.map} +1 -1
  422. package/dist/esm/sdk/{localOnly-BdumO2st.js → localOnly-pXMTqh1m.js} +5 -4
  423. package/dist/esm/sdk/offline-export-app.js +46 -44
  424. package/dist/esm/sdk/offline-export-app.js.map +1 -1
  425. package/dist/esm/sdk/{overlay-BTqPGG-o.js → overlay-ZGbucXIa.js} +2 -0
  426. package/dist/esm/sdk/{registration-C633u6x8.js → registration-CBiS4Ua_.js} +2 -2
  427. package/dist/esm/sdk/{registration-C633u6x8.js.map → registration-CBiS4Ua_.js.map} +1 -1
  428. package/dist/esm/sdk/{registration-xyYUFRqk.js → registration-DLPLsGCz.js} +5 -4
  429. package/dist/esm/sdk/{requestHelpers-DLBGBHMw.js → requestHelpers-Dh1hEYL9.js} +206 -204
  430. package/dist/esm/sdk/{router-BG6KC_p7.js → router-DuGYOd3G.js} +19 -4
  431. package/dist/esm/sdk/{rpcCalls-fLObBbbz.js → rpcCalls-BQrJMTdg.js} +3 -3
  432. package/dist/esm/sdk/{rpcCalls-CAU5XYEF.js → rpcCalls-YVeUVMk2.js} +9 -2
  433. package/dist/esm/sdk/{transactions-jH38BZ-Q.js → transactions-BIqKZeR0.js} +6 -18
  434. package/dist/esm/sdk/transactions-BIqKZeR0.js.map +1 -0
  435. package/dist/esm/sdk/{transactions-CzZAt1Yn.js → transactions-Bk-VavcV.js} +10 -21
  436. package/dist/esm/sdk/tx-confirm-ui.js +53 -53
  437. package/dist/esm/sdk/{tx-confirmer-wrapper-CqfVBUaA.js → tx-confirmer-wrapper-lHNgz9i4.js} +53 -53
  438. package/dist/esm/sdk/tx-confirmer.css +6 -4
  439. package/dist/esm/sdk/w3a-tx-confirmer.js +1 -1
  440. package/dist/esm/sdk/wallet-iframe-host.js +782 -447
  441. package/dist/esm/server/email-recovery/emailEncryptor.js +11 -1
  442. package/dist/esm/server/email-recovery/emailEncryptor.js.map +1 -1
  443. package/dist/esm/server/email-recovery/emailParsers.js +55 -1
  444. package/dist/esm/server/email-recovery/emailParsers.js.map +1 -1
  445. package/dist/esm/server/email-recovery/index.js +2 -2
  446. package/dist/esm/server/email-recovery/index.js.map +1 -1
  447. package/dist/esm/server/email-recovery/rpcCalls.js +14 -1
  448. package/dist/esm/server/email-recovery/rpcCalls.js.map +1 -1
  449. package/dist/esm/server/index.js +2 -2
  450. package/dist/esm/server/router/cloudflare.js.map +1 -1
  451. package/dist/esm/server/router/express.js.map +1 -1
  452. package/dist/esm/server/sdk/src/core/defaultConfigs.js +1 -1
  453. package/dist/esm/server/sdk/src/core/defaultConfigs.js.map +1 -1
  454. package/dist/esm/utils/index.js +10 -4
  455. package/dist/esm/wasm_vrf_worker/pkg/wasm_vrf_worker.js +3 -0
  456. package/dist/esm/wasm_vrf_worker/pkg/wasm_vrf_worker_bg.wasm +0 -0
  457. package/dist/types/src/core/EmailRecovery/emailRecoveryPendingStore.d.ts +25 -0
  458. package/dist/types/src/core/EmailRecovery/emailRecoveryPendingStore.d.ts.map +1 -0
  459. package/dist/types/src/core/EmailRecovery/index.d.ts +1 -0
  460. package/dist/types/src/core/EmailRecovery/index.d.ts.map +1 -1
  461. package/dist/types/src/core/IndexedDBManager/passkeyClientDB.d.ts +11 -21
  462. package/dist/types/src/core/IndexedDBManager/passkeyClientDB.d.ts.map +1 -1
  463. package/dist/types/src/core/TatchiPasskey/emailRecovery.d.ts +45 -5
  464. package/dist/types/src/core/TatchiPasskey/emailRecovery.d.ts.map +1 -1
  465. package/dist/types/src/core/TatchiPasskey/index.d.ts +10 -2
  466. package/dist/types/src/core/TatchiPasskey/index.d.ts.map +1 -1
  467. package/dist/types/src/core/TatchiPasskey/relay.d.ts +2 -1
  468. package/dist/types/src/core/TatchiPasskey/relay.d.ts.map +1 -1
  469. package/dist/types/src/core/WalletIframe/TatchiPasskeyIframe.d.ts +4 -0
  470. package/dist/types/src/core/WalletIframe/TatchiPasskeyIframe.d.ts.map +1 -1
  471. package/dist/types/src/core/WalletIframe/client/router.d.ts +7 -3
  472. package/dist/types/src/core/WalletIframe/client/router.d.ts.map +1 -1
  473. package/dist/types/src/core/WalletIframe/host/wallet-iframe-handlers.d.ts.map +1 -1
  474. package/dist/types/src/core/WalletIframe/shared/messages.d.ts +6 -2
  475. package/dist/types/src/core/WalletIframe/shared/messages.d.ts.map +1 -1
  476. package/dist/types/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-drawer.d.ts.map +1 -1
  477. package/dist/types/src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.d.ts.map +1 -1
  478. package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/vrf.d.ts.map +1 -1
  479. package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/webauthn.d.ts.map +1 -1
  480. package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.d.ts.map +1 -1
  481. package/dist/types/src/core/WebAuthnManager/index.d.ts.map +1 -1
  482. package/dist/types/src/core/defaultConfigs.d.ts.map +1 -1
  483. package/dist/types/src/core/rpcCalls.d.ts +9 -0
  484. package/dist/types/src/core/rpcCalls.d.ts.map +1 -1
  485. package/dist/types/src/index.d.ts +1 -0
  486. package/dist/types/src/index.d.ts.map +1 -1
  487. package/dist/types/src/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.d.ts.map +1 -1
  488. package/dist/types/src/server/email-recovery/emailEncryptor.d.ts +4 -0
  489. package/dist/types/src/server/email-recovery/emailEncryptor.d.ts.map +1 -1
  490. package/dist/types/src/server/email-recovery/emailParsers.d.ts +7 -0
  491. package/dist/types/src/server/email-recovery/emailParsers.d.ts.map +1 -1
  492. package/dist/types/src/server/email-recovery/index.d.ts +1 -1
  493. package/dist/types/src/server/email-recovery/rpcCalls.d.ts +1 -1
  494. package/dist/types/src/server/email-recovery/rpcCalls.d.ts.map +1 -1
  495. package/dist/types/src/wasm_vrf_worker/pkg/wasm_vrf_worker.d.ts.map +1 -1
  496. package/dist/workers/wasm_vrf_worker_bg.wasm +0 -0
  497. package/dist/workers/web3authn-vrf.worker.js +3 -0
  498. package/package.json +1 -1
  499. package/dist/esm/sdk/createAdapters-pNiL2KNq.js.map +0 -1
  500. package/dist/esm/sdk/getDeviceNumber-CkWRT17I.js.map +0 -1
  501. package/dist/esm/sdk/transactions-jH38BZ-Q.js.map +0 -1
@@ -2,7 +2,13 @@ const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.js');
2
2
  const require_validation = require('../../utils/validation.js');
3
3
  const require_accountIds = require('../types/accountIds.js');
4
4
  const require_index = require('../IndexedDBManager/index.js');
5
+ const require_vrf_worker = require('../types/vrf-worker.js');
5
6
  const require_sdkSentEvents = require('../types/sdkSentEvents.js');
7
+ const require_rpc = require('../types/rpc.js');
8
+ const require_getDeviceNumber = require('../WebAuthnManager/SignerWorkerManager/getDeviceNumber.js');
9
+ const require_login = require('./login.js');
10
+ const require_emailRecoveryPendingStore = require('../EmailRecovery/emailRecoveryPendingStore.js');
11
+ const require_index$1 = require('../EmailRecovery/index.js');
6
12
 
7
13
  //#region src/core/TatchiPasskey/emailRecovery.ts
8
14
  var emailRecovery_exports = {};
@@ -44,9 +50,15 @@ var init_emailRecovery = require_rolldown_runtime.__esm({ "src/core/TatchiPasske
44
50
  require_validation.init_validation();
45
51
  require_accountIds.init_accountIds();
46
52
  require_sdkSentEvents.init_sdkSentEvents();
53
+ require_vrf_worker.init_vrf_worker();
54
+ require_rpc.init_rpc();
55
+ require_getDeviceNumber.init_getDeviceNumber();
56
+ require_login.init_login();
57
+ require_index$1.init_EmailRecovery();
47
58
  EmailRecoveryFlow = class {
48
59
  context;
49
60
  options;
61
+ pendingStore;
50
62
  pending = null;
51
63
  phase = require_sdkSentEvents.EmailRecoveryPhase.STEP_1_PREPARATION;
52
64
  pollingTimer;
@@ -57,6 +69,7 @@ var init_emailRecovery = require_rolldown_runtime.__esm({ "src/core/TatchiPasske
57
69
  constructor(context, options) {
58
70
  this.context = context;
59
71
  this.options = options;
72
+ this.pendingStore = options?.pendingStore ?? new require_emailRecoveryPendingStore.EmailRecoveryPendingStore({ getPendingTtlMs: () => this.getConfig().pendingTtlMs });
60
73
  }
61
74
  setOptions(options) {
62
75
  if (!options) return;
@@ -64,6 +77,7 @@ var init_emailRecovery = require_rolldown_runtime.__esm({ "src/core/TatchiPasske
64
77
  ...this.options || {},
65
78
  ...options
66
79
  };
80
+ if (options.pendingStore) this.pendingStore = options.pendingStore;
67
81
  }
68
82
  emit(event) {
69
83
  this.options?.onEvent?.(event);
@@ -82,18 +96,139 @@ var init_emailRecovery = require_rolldown_runtime.__esm({ "src/core/TatchiPasske
82
96
  this.options?.onError?.(err);
83
97
  return err;
84
98
  }
99
+ async fail(step, message) {
100
+ const err = this.emitError(step, message);
101
+ await this.options?.afterCall?.(false);
102
+ throw err;
103
+ }
104
+ async assertValidAccountIdOrFail(step, accountId) {
105
+ const validation = require_validation.validateNearAccountId(accountId);
106
+ if (!validation.valid) await this.fail(step, `Invalid NEAR account ID: ${validation.error}`);
107
+ return require_accountIds.toAccountId(accountId);
108
+ }
109
+ async resolvePendingOrFail(step, args, options) {
110
+ const { allowErrorStatus = true, missingMessage = "No pending email recovery record found for this account", errorStatusMessage = "Pending email recovery is in an error state; please restart the flow" } = options ?? {};
111
+ let rec = this.pending;
112
+ if (!rec || rec.accountId !== args.accountId || args.nearPublicKey && rec.nearPublicKey !== args.nearPublicKey) {
113
+ rec = await this.loadPending(args.accountId, args.nearPublicKey);
114
+ this.pending = rec;
115
+ }
116
+ if (!rec) await this.fail(step, missingMessage);
117
+ const resolved = rec;
118
+ if (!allowErrorStatus && resolved.status === "error") await this.fail(step, errorStatusMessage);
119
+ return resolved;
120
+ }
85
121
  getConfig() {
86
122
  return getEmailRecoveryConfig(this.context.configs);
87
123
  }
88
- async checkVerificationStatus(rec) {
124
+ toBigInt(value) {
125
+ if (typeof value === "bigint") return value;
126
+ if (typeof value === "number") return BigInt(value);
127
+ if (typeof value === "string" && value.length > 0) return BigInt(value);
128
+ return BigInt(0);
129
+ }
130
+ computeAvailableBalance(accountView) {
131
+ const STORAGE_PRICE_PER_BYTE = BigInt("10000000000000000000");
132
+ const amount = this.toBigInt(accountView.amount);
133
+ const locked = this.toBigInt(accountView.locked);
134
+ const storageUsage = this.toBigInt(accountView.storage_usage);
135
+ const storageCost = storageUsage * STORAGE_PRICE_PER_BYTE;
136
+ const rawAvailable = amount - locked - storageCost;
137
+ return rawAvailable > 0 ? rawAvailable : BigInt(0);
138
+ }
139
+ async assertSufficientBalance(nearAccountId) {
140
+ const { minBalanceYocto } = this.getConfig();
141
+ try {
142
+ const accountView = await this.context.nearClient.viewAccount(nearAccountId);
143
+ const available = this.computeAvailableBalance(accountView);
144
+ if (available < BigInt(minBalanceYocto)) await this.fail(1, `This account does not have enough NEAR to finalize recovery. Available: ${available.toString()} yocto; required: ${String(minBalanceYocto)}. Please top up and try again.`);
145
+ } catch (e) {
146
+ await this.fail(1, e?.message || "Failed to fetch account balance for recovery");
147
+ }
148
+ }
149
+ async getCanonicalRecoveryEmailOrFail(recoveryEmail) {
150
+ const canonicalEmail = String(recoveryEmail || "").trim().toLowerCase();
151
+ if (!canonicalEmail) await this.fail(1, "Recovery email is required for email-based account recovery");
152
+ return canonicalEmail;
153
+ }
154
+ async getNextDeviceNumberFromContract(nearAccountId) {
155
+ try {
156
+ const { syncAuthenticatorsContractCall } = await Promise.resolve().then(() => require("../rpcCalls.js"));
157
+ const authenticators = await syncAuthenticatorsContractCall(this.context.nearClient, this.context.configs.contractId, nearAccountId);
158
+ const numbers = authenticators.map((a) => a?.authenticator?.deviceNumber).filter((n) => typeof n === "number" && Number.isFinite(n));
159
+ const max = numbers.length > 0 ? Math.max(...numbers) : 0;
160
+ return max + 1;
161
+ } catch {
162
+ return 1;
163
+ }
164
+ }
165
+ async collectRecoveryCredentialOrFail(nearAccountId, deviceNumber) {
166
+ const confirmerText = {
167
+ title: this.options?.confirmerText?.title ?? "Register New Recovery Account",
168
+ body: this.options?.confirmerText?.body ?? "Create a recovery account and send an encrypted email to recover your account."
169
+ };
170
+ const confirm = await this.context.webAuthnManager.requestRegistrationCredentialConfirmation({
171
+ nearAccountId,
172
+ deviceNumber,
173
+ confirmerText,
174
+ confirmationConfigOverride: this.options?.confirmationConfig
175
+ });
176
+ if (!confirm.confirmed || !confirm.credential) await this.fail(2, "User cancelled email recovery TouchID confirmation");
177
+ return {
178
+ credential: confirm.credential,
179
+ vrfChallenge: confirm.vrfChallenge || void 0
180
+ };
181
+ }
182
+ async deriveRecoveryKeysOrFail(nearAccountId, deviceNumber, credential) {
183
+ const vrfDerivationResult = await this.context.webAuthnManager.deriveVrfKeypair({
184
+ credential,
185
+ nearAccountId
186
+ });
187
+ if (!vrfDerivationResult.success || !vrfDerivationResult.encryptedVrfKeypair) await this.fail(2, "Failed to derive VRF keypair from PRF for email recovery");
188
+ const nearKeyResult = await this.context.webAuthnManager.deriveNearKeypairAndEncryptFromSerialized({
189
+ nearAccountId,
190
+ credential,
191
+ options: { deviceNumber }
192
+ });
193
+ if (!nearKeyResult.success || !nearKeyResult.publicKey) await this.fail(2, "Failed to derive NEAR keypair for email recovery");
194
+ return {
195
+ encryptedVrfKeypair: vrfDerivationResult.encryptedVrfKeypair,
196
+ serverEncryptedVrfKeypair: vrfDerivationResult.serverEncryptedVrfKeypair || null,
197
+ vrfPublicKey: vrfDerivationResult.vrfPublicKey,
198
+ nearPublicKey: nearKeyResult.publicKey
199
+ };
200
+ }
201
+ emitAwaitEmail(rec, mailtoUrl) {
202
+ this.phase = require_sdkSentEvents.EmailRecoveryPhase.STEP_3_AWAIT_EMAIL;
203
+ this.emit({
204
+ step: 3,
205
+ phase: require_sdkSentEvents.EmailRecoveryPhase.STEP_3_AWAIT_EMAIL,
206
+ status: require_sdkSentEvents.EmailRecoveryStatus.PROGRESS,
207
+ message: "New device key created; please send the recovery email from your registered address.",
208
+ data: {
209
+ accountId: rec.accountId,
210
+ recoveryEmail: rec.recoveryEmail,
211
+ nearPublicKey: rec.nearPublicKey,
212
+ requestId: rec.requestId,
213
+ mailtoUrl
214
+ }
215
+ });
216
+ }
217
+ emitAutoLoginEvent(status, message, data) {
218
+ this.emit({
219
+ step: 5,
220
+ phase: require_sdkSentEvents.EmailRecoveryPhase.STEP_5_FINALIZING_REGISTRATION,
221
+ status,
222
+ message,
223
+ data
224
+ });
225
+ }
226
+ async checkViaDkimViewMethod(rec) {
89
227
  const { dkimVerifierAccountId, verificationViewMethod } = this.getConfig();
90
228
  if (!dkimVerifierAccountId) return null;
91
229
  try {
92
- const result = await this.context.nearClient.view({
93
- account: dkimVerifierAccountId,
94
- method: verificationViewMethod,
95
- args: { request_id: rec.requestId }
96
- });
230
+ const { getEmailRecoveryVerificationResult } = await Promise.resolve().then(() => require("../rpcCalls.js"));
231
+ const result = await getEmailRecoveryVerificationResult(this.context.nearClient, dkimVerifierAccountId, verificationViewMethod, rec.requestId);
97
232
  if (!result) return {
98
233
  completed: false,
99
234
  success: false
@@ -103,49 +238,100 @@ var init_emailRecovery = require_rolldown_runtime.__esm({ "src/core/TatchiPasske
103
238
  return {
104
239
  completed: true,
105
240
  success: false,
106
- errorMessage
241
+ errorMessage,
242
+ transactionHash: result.transaction_hash
107
243
  };
108
244
  }
109
245
  if (result.account_id && result.account_id !== rec.accountId) return {
110
246
  completed: true,
111
247
  success: false,
112
- errorMessage: "Email verification account_id does not match requested account."
248
+ errorMessage: "Email verification account_id does not match requested account.",
249
+ transactionHash: result.transaction_hash
113
250
  };
114
251
  if (result.new_public_key && result.new_public_key !== rec.nearPublicKey) return {
115
252
  completed: true,
116
253
  success: false,
117
- errorMessage: "Email verification new_public_key does not match expected recovery key."
254
+ errorMessage: "Email verification new_public_key does not match expected recovery key.",
255
+ transactionHash: result.transaction_hash
118
256
  };
119
257
  return {
120
258
  completed: true,
121
- success: true
259
+ success: true,
260
+ transactionHash: result.transaction_hash
122
261
  };
123
262
  } catch (err) {
124
- console.warn("[EmailRecoveryFlow] get_verification_result view failed; falling back to access key polling", err);
263
+ console.warn("[EmailRecoveryFlow] get_verification_result view failed; will retry", err);
125
264
  return null;
126
265
  }
127
266
  }
128
- async loadPending(accountId, nearPublicKey) {
129
- const { pendingTtlMs } = this.getConfig();
130
- const keyPrefix = `pendingEmailRecovery:${accountId}`;
131
- const key = nearPublicKey ? `${keyPrefix}:${nearPublicKey}` : keyPrefix;
132
- const record = await require_index.IndexedDBManager.clientDB.getAppState(key);
133
- if (!record) return null;
134
- if (Date.now() - record.createdAt > pendingTtlMs) {
135
- await require_index.IndexedDBManager.clientDB.setAppState(key, void 0);
136
- return null;
267
+ buildPollingEventData(rec, details) {
268
+ return {
269
+ accountId: rec.accountId,
270
+ requestId: rec.requestId,
271
+ nearPublicKey: rec.nearPublicKey,
272
+ transactionHash: details.transactionHash,
273
+ elapsedMs: details.elapsedMs,
274
+ pollCount: details.pollCount
275
+ };
276
+ }
277
+ async sleepForPollInterval(ms) {
278
+ await new Promise((resolve) => {
279
+ this.pollIntervalResolver = resolve;
280
+ this.pollingTimer = setTimeout(() => {
281
+ this.pollIntervalResolver = void 0;
282
+ this.pollingTimer = void 0;
283
+ resolve();
284
+ }, ms);
285
+ }).finally(() => {
286
+ this.pollIntervalResolver = void 0;
287
+ });
288
+ }
289
+ async pollUntil(args) {
290
+ const now = args.now ?? Date.now;
291
+ const sleep = args.sleep ?? this.sleepForPollInterval.bind(this);
292
+ const startedAt = now();
293
+ let pollCount = 0;
294
+ while (!args.isCancelled()) {
295
+ pollCount += 1;
296
+ const elapsedMs$1 = now() - startedAt;
297
+ if (elapsedMs$1 > args.timeoutMs) return {
298
+ status: "timedOut",
299
+ elapsedMs: elapsedMs$1,
300
+ pollCount
301
+ };
302
+ const result = await args.tick({
303
+ elapsedMs: elapsedMs$1,
304
+ pollCount
305
+ });
306
+ if (result.done) return {
307
+ status: "completed",
308
+ value: result.value,
309
+ elapsedMs: elapsedMs$1,
310
+ pollCount
311
+ };
312
+ if (args.isCancelled()) return {
313
+ status: "cancelled",
314
+ elapsedMs: elapsedMs$1,
315
+ pollCount
316
+ };
317
+ await sleep(args.intervalMs);
137
318
  }
138
- return record;
319
+ const elapsedMs = now() - startedAt;
320
+ return {
321
+ status: "cancelled",
322
+ elapsedMs,
323
+ pollCount
324
+ };
325
+ }
326
+ async loadPending(accountId, nearPublicKey) {
327
+ return this.pendingStore.get(accountId, nearPublicKey);
139
328
  }
140
329
  async savePending(rec) {
141
- const key = `pendingEmailRecovery:${rec.accountId}:${rec.nearPublicKey}`;
142
- await require_index.IndexedDBManager.clientDB.setAppState(key, rec);
330
+ await this.pendingStore.set(rec);
143
331
  this.pending = rec;
144
332
  }
145
333
  async clearPending(accountId, nearPublicKey) {
146
- const keyPrefix = `pendingEmailRecovery:${accountId}`;
147
- const key = nearPublicKey ? `${keyPrefix}:${nearPublicKey}` : keyPrefix;
148
- await require_index.IndexedDBManager.clientDB.setAppState(key, void 0);
334
+ await this.pendingStore.clear(accountId, nearPublicKey);
149
335
  if (this.pending && this.pending.accountId === accountId && (!nearPublicKey || this.pending.nearPublicKey === nearPublicKey)) this.pending = null;
150
336
  }
151
337
  getState() {
@@ -159,48 +345,14 @@ var init_emailRecovery = require_rolldown_runtime.__esm({ "src/core/TatchiPasske
159
345
  const { accountId, nearPublicKey } = args;
160
346
  this.cancelled = false;
161
347
  this.error = void 0;
162
- const validation = require_validation.validateNearAccountId(accountId);
163
- if (!validation.valid) {
164
- const err = this.emitError(3, `Invalid NEAR account ID: ${validation.error}`);
165
- await this.options?.afterCall?.(false);
166
- throw err;
167
- }
168
- const nearAccountId = require_accountIds.toAccountId(accountId);
169
- let rec = this.pending;
170
- if (!rec || rec.accountId !== nearAccountId || nearPublicKey && rec.nearPublicKey !== nearPublicKey) {
171
- rec = await this.loadPending(nearAccountId, nearPublicKey);
172
- this.pending = rec;
173
- }
174
- if (!rec) {
175
- const err = this.emitError(3, "No pending email recovery record found for this account");
176
- await this.options?.afterCall?.(false);
177
- throw err;
178
- }
179
- if (rec.status === "error") {
180
- const err = this.emitError(3, "Pending email recovery is in an error state; please restart the flow");
181
- await this.options?.afterCall?.(false);
182
- throw err;
183
- }
184
- if (rec.status === "finalizing" || rec.status === "complete") {
185
- const err = this.emitError(3, "Recovery email has already been processed on-chain for this request");
186
- await this.options?.afterCall?.(false);
187
- throw err;
188
- }
348
+ const nearAccountId = await this.assertValidAccountIdOrFail(3, accountId);
349
+ const rec = await this.resolvePendingOrFail(3, {
350
+ accountId: nearAccountId,
351
+ nearPublicKey
352
+ }, { allowErrorStatus: false });
353
+ if (rec.status === "finalizing" || rec.status === "complete") await this.fail(3, "Recovery email has already been processed on-chain for this request");
189
354
  const mailtoUrl = rec.status === "awaiting-email" ? await this.buildMailtoUrlAndUpdateStatus(rec) : this.buildMailtoUrlInternal(rec);
190
- this.phase = require_sdkSentEvents.EmailRecoveryPhase.STEP_3_AWAIT_EMAIL;
191
- this.emit({
192
- step: 3,
193
- phase: require_sdkSentEvents.EmailRecoveryPhase.STEP_3_AWAIT_EMAIL,
194
- status: require_sdkSentEvents.EmailRecoveryStatus.PROGRESS,
195
- message: "New device key created; please send the recovery email from your registered address.",
196
- data: {
197
- accountId: rec.accountId,
198
- recoveryEmail: rec.recoveryEmail,
199
- nearPublicKey: rec.nearPublicKey,
200
- requestId: rec.requestId,
201
- mailtoUrl
202
- }
203
- });
355
+ this.emitAwaitEmail(rec, mailtoUrl);
204
356
  await this.options?.afterCall?.(true, void 0);
205
357
  return mailtoUrl;
206
358
  }
@@ -215,49 +367,10 @@ var init_emailRecovery = require_rolldown_runtime.__esm({ "src/core/TatchiPasske
215
367
  status: require_sdkSentEvents.EmailRecoveryStatus.PROGRESS,
216
368
  message: "Preparing email recovery..."
217
369
  });
218
- const validation = require_validation.validateNearAccountId(accountId);
219
- if (!validation.valid) {
220
- const err = this.emitError(1, `Invalid NEAR account ID: ${validation.error}`);
221
- await this.options?.afterCall?.(false);
222
- throw err;
223
- }
224
- const nearAccountId = require_accountIds.toAccountId(accountId);
225
- const { minBalanceYocto } = this.getConfig();
226
- const STORAGE_PRICE_PER_BYTE = BigInt("10000000000000000000");
227
- try {
228
- const accountView = await this.context.nearClient.viewAccount(nearAccountId);
229
- const amount = BigInt(accountView.amount || "0");
230
- const locked = BigInt(accountView.locked || "0");
231
- const storageUsage = BigInt(accountView.storage_usage || 0);
232
- const storageCost = storageUsage * STORAGE_PRICE_PER_BYTE;
233
- const rawAvailable = amount - locked - storageCost;
234
- const available = rawAvailable > 0 ? rawAvailable : BigInt(0);
235
- if (available < BigInt(minBalanceYocto)) {
236
- const err = this.emitError(1, `This account does not have enough NEAR to finalize recovery. Available: ${available.toString()} yocto; required: ${String(minBalanceYocto)}. Please top up and try again.`);
237
- await this.options?.afterCall?.(false);
238
- throw err;
239
- }
240
- } catch (e) {
241
- const err = this.emitError(1, e?.message || "Failed to fetch account balance for recovery");
242
- await this.options?.afterCall?.(false);
243
- throw err;
244
- }
245
- const canonicalEmail = String(recoveryEmail || "").trim().toLowerCase();
246
- if (!canonicalEmail) {
247
- const err = this.emitError(1, "Recovery email is required for email-based account recovery");
248
- await this.options?.afterCall?.(false);
249
- throw err;
250
- }
251
- let deviceNumber = 1;
252
- try {
253
- const { syncAuthenticatorsContractCall } = await Promise.resolve().then(() => require("../rpcCalls.js"));
254
- const authenticators = await syncAuthenticatorsContractCall(this.context.nearClient, this.context.configs.contractId, nearAccountId);
255
- const numbers = authenticators.map((a) => a?.authenticator?.deviceNumber).filter((n) => typeof n === "number" && Number.isFinite(n));
256
- const max = numbers.length > 0 ? Math.max(...numbers) : 0;
257
- deviceNumber = max + 1;
258
- } catch {
259
- deviceNumber = 1;
260
- }
370
+ const nearAccountId = await this.assertValidAccountIdOrFail(1, accountId);
371
+ await this.assertSufficientBalance(nearAccountId);
372
+ const canonicalEmail = await this.getCanonicalRecoveryEmailOrFail(recoveryEmail);
373
+ const deviceNumber = await this.getNextDeviceNumberFromContract(nearAccountId);
261
374
  this.phase = require_sdkSentEvents.EmailRecoveryPhase.STEP_2_TOUCH_ID_REGISTRATION;
262
375
  this.emit({
263
376
  step: 2,
@@ -266,66 +379,24 @@ var init_emailRecovery = require_rolldown_runtime.__esm({ "src/core/TatchiPasske
266
379
  message: "Collecting passkey for email recovery..."
267
380
  });
268
381
  try {
269
- const confirmerText = this.options?.confirmerText;
270
- const confirm = await this.context.webAuthnManager.requestRegistrationCredentialConfirmation({
271
- nearAccountId,
272
- deviceNumber,
273
- confirmerText,
274
- confirmationConfigOverride: this.options?.confirmationConfig
275
- });
276
- if (!confirm.confirmed || !confirm.credential) {
277
- const err = this.emitError(2, "User cancelled email recovery TouchID confirmation");
278
- await this.options?.afterCall?.(false);
279
- throw err;
280
- }
281
- const vrfDerivationResult = await this.context.webAuthnManager.deriveVrfKeypair({
282
- credential: confirm.credential,
283
- nearAccountId
284
- });
285
- if (!vrfDerivationResult.success || !vrfDerivationResult.encryptedVrfKeypair) {
286
- const err = this.emitError(2, "Failed to derive VRF keypair from PRF for email recovery");
287
- await this.options?.afterCall?.(false);
288
- throw err;
289
- }
290
- const nearKeyResult = await this.context.webAuthnManager.deriveNearKeypairAndEncryptFromSerialized({
291
- nearAccountId,
292
- credential: confirm.credential,
293
- options: { deviceNumber }
294
- });
295
- if (!nearKeyResult.success || !nearKeyResult.publicKey) {
296
- const err = this.emitError(2, "Failed to derive NEAR keypair for email recovery");
297
- await this.options?.afterCall?.(false);
298
- throw err;
299
- }
382
+ const confirm = await this.collectRecoveryCredentialOrFail(nearAccountId, deviceNumber);
383
+ const derivedKeys = await this.deriveRecoveryKeysOrFail(nearAccountId, deviceNumber, confirm.credential);
300
384
  const rec = {
301
385
  accountId: nearAccountId,
302
386
  recoveryEmail: canonicalEmail,
303
387
  deviceNumber,
304
- nearPublicKey: nearKeyResult.publicKey,
388
+ nearPublicKey: derivedKeys.nearPublicKey,
305
389
  requestId: generateEmailRecoveryRequestId(),
306
- encryptedVrfKeypair: vrfDerivationResult.encryptedVrfKeypair,
307
- serverEncryptedVrfKeypair: vrfDerivationResult.serverEncryptedVrfKeypair || null,
308
- vrfPublicKey: vrfDerivationResult.vrfPublicKey,
390
+ encryptedVrfKeypair: derivedKeys.encryptedVrfKeypair,
391
+ serverEncryptedVrfKeypair: derivedKeys.serverEncryptedVrfKeypair,
392
+ vrfPublicKey: derivedKeys.vrfPublicKey,
309
393
  credential: confirm.credential,
310
394
  vrfChallenge: confirm.vrfChallenge || void 0,
311
395
  createdAt: Date.now(),
312
396
  status: "awaiting-email"
313
397
  };
314
398
  const mailtoUrl = await this.buildMailtoUrlAndUpdateStatus(rec);
315
- this.phase = require_sdkSentEvents.EmailRecoveryPhase.STEP_3_AWAIT_EMAIL;
316
- this.emit({
317
- step: 3,
318
- phase: require_sdkSentEvents.EmailRecoveryPhase.STEP_3_AWAIT_EMAIL,
319
- status: require_sdkSentEvents.EmailRecoveryStatus.PROGRESS,
320
- message: "New device key created; please send the recovery email from your registered address.",
321
- data: {
322
- accountId: rec.accountId,
323
- recoveryEmail: rec.recoveryEmail,
324
- nearPublicKey: rec.nearPublicKey,
325
- requestId: rec.requestId,
326
- mailtoUrl
327
- }
328
- });
399
+ this.emitAwaitEmail(rec, mailtoUrl);
329
400
  await this.options?.afterCall?.(true, void 0);
330
401
  return {
331
402
  mailtoUrl,
@@ -353,28 +424,11 @@ var init_emailRecovery = require_rolldown_runtime.__esm({ "src/core/TatchiPasske
353
424
  const { accountId, nearPublicKey } = args;
354
425
  this.cancelled = false;
355
426
  this.error = void 0;
356
- const validation = require_validation.validateNearAccountId(accountId);
357
- if (!validation.valid) {
358
- const err = this.emitError(4, `Invalid NEAR account ID: ${validation.error}`);
359
- await this.options?.afterCall?.(false);
360
- throw err;
361
- }
362
- const nearAccountId = require_accountIds.toAccountId(accountId);
363
- let rec = this.pending;
364
- if (!rec || rec.accountId !== nearAccountId || nearPublicKey && rec.nearPublicKey !== nearPublicKey) {
365
- rec = await this.loadPending(nearAccountId, nearPublicKey);
366
- this.pending = rec;
367
- }
368
- if (!rec) {
369
- const err = this.emitError(4, "No pending email recovery record found for this account");
370
- await this.options?.afterCall?.(false);
371
- throw err;
372
- }
373
- if (rec.status === "error") {
374
- const err = this.emitError(4, "Pending email recovery is in an error state; please restart the flow");
375
- await this.options?.afterCall?.(false);
376
- throw err;
377
- }
427
+ const nearAccountId = await this.assertValidAccountIdOrFail(4, accountId);
428
+ const rec = await this.resolvePendingOrFail(4, {
429
+ accountId: nearAccountId,
430
+ nearPublicKey
431
+ }, { allowErrorStatus: false });
378
432
  if (rec.status === "complete" || rec.status === "finalizing") {
379
433
  await this.options?.afterCall?.(true, void 0);
380
434
  return;
@@ -394,27 +448,31 @@ var init_emailRecovery = require_rolldown_runtime.__esm({ "src/core/TatchiPasske
394
448
  this.pollIntervalResolver = void 0;
395
449
  }
396
450
  }
451
+ /**
452
+ * Best-effort cancellation and local state reset so callers can retry.
453
+ * This does not remove any passkey created in the browser/OS (WebAuthn has no delete API),
454
+ * but it will stop polling and clear the pending IndexedDB record for the given key.
455
+ */
456
+ async cancelAndReset(args) {
457
+ this.stopPolling();
458
+ const normalizedAccountId = (args?.accountId || this.pending?.accountId || "").toString().trim();
459
+ const nearPublicKey = (args?.nearPublicKey || this.pending?.nearPublicKey || "").toString().trim();
460
+ if (normalizedAccountId) try {
461
+ await this.clearPending(require_accountIds.toAccountId(normalizedAccountId), nearPublicKey);
462
+ } catch {}
463
+ this.pending = null;
464
+ this.error = void 0;
465
+ this.phase = require_sdkSentEvents.EmailRecoveryPhase.STEP_1_PREPARATION;
466
+ }
397
467
  async finalize(args) {
398
468
  const { accountId, nearPublicKey } = args;
399
469
  this.cancelled = false;
400
470
  this.error = void 0;
401
- const validation = require_validation.validateNearAccountId(accountId);
402
- if (!validation.valid) {
403
- const err = this.emitError(4, `Invalid NEAR account ID: ${validation.error}`);
404
- await this.options?.afterCall?.(false);
405
- throw err;
406
- }
407
- const nearAccountId = require_accountIds.toAccountId(accountId);
408
- let rec = this.pending;
409
- if (!rec || rec.accountId !== nearAccountId || nearPublicKey && rec.nearPublicKey !== nearPublicKey) {
410
- rec = await this.loadPending(nearAccountId, nearPublicKey);
411
- this.pending = rec;
412
- }
413
- if (!rec) {
414
- const err = this.emitError(4, "No pending email recovery record found for this account");
415
- await this.options?.afterCall?.(false);
416
- throw err;
417
- }
471
+ const nearAccountId = await this.assertValidAccountIdOrFail(4, accountId);
472
+ const rec = await this.resolvePendingOrFail(4, {
473
+ accountId: nearAccountId,
474
+ nearPublicKey
475
+ }, { allowErrorStatus: true });
418
476
  this.emit({
419
477
  step: 0,
420
478
  phase: require_sdkSentEvents.EmailRecoveryPhase.RESUMED_FROM_PENDING,
@@ -450,141 +508,318 @@ var init_emailRecovery = require_rolldown_runtime.__esm({ "src/core/TatchiPasske
450
508
  }
451
509
  this.phase = require_sdkSentEvents.EmailRecoveryPhase.STEP_4_POLLING_VERIFICATION_RESULT;
452
510
  this.pollingStartedAt = Date.now();
453
- let pollCount = 0;
454
- while (!this.cancelled) {
455
- pollCount += 1;
456
- const elapsed = Date.now() - (this.pollingStartedAt || 0);
457
- if (elapsed > maxPollingDurationMs) {
458
- const err$1 = this.emitError(4, "Timed out waiting for recovery email to be processed on-chain");
511
+ const pollResult = await this.pollUntil({
512
+ intervalMs: pollingIntervalMs,
513
+ timeoutMs: maxPollingDurationMs,
514
+ isCancelled: () => this.cancelled,
515
+ tick: async ({ elapsedMs, pollCount }) => {
516
+ const verification = await this.checkViaDkimViewMethod(rec);
517
+ const completed = verification?.completed === true;
518
+ const success = verification?.success === true;
519
+ this.emit({
520
+ step: 4,
521
+ phase: require_sdkSentEvents.EmailRecoveryPhase.STEP_4_POLLING_VERIFICATION_RESULT,
522
+ status: require_sdkSentEvents.EmailRecoveryStatus.PROGRESS,
523
+ message: completed && success ? `Email verified for request ${rec.requestId}; finalizing registration` : `Waiting for email verification for request ${rec.requestId}`,
524
+ data: this.buildPollingEventData(rec, {
525
+ transactionHash: verification?.transactionHash,
526
+ elapsedMs,
527
+ pollCount
528
+ })
529
+ });
530
+ if (!completed) return { done: false };
531
+ if (!success) return {
532
+ done: true,
533
+ value: {
534
+ outcome: "failed",
535
+ errorMessage: verification?.errorMessage || "Email verification failed"
536
+ }
537
+ };
538
+ return {
539
+ done: true,
540
+ value: { outcome: "verified" }
541
+ };
542
+ }
543
+ });
544
+ if (pollResult.status === "completed") {
545
+ if (pollResult.value.outcome === "failed") {
546
+ const err$1 = this.emitError(4, pollResult.value.errorMessage);
459
547
  rec.status = "error";
460
548
  await this.savePending(rec);
461
549
  await this.options?.afterCall?.(false);
462
550
  throw err$1;
463
551
  }
464
- const verification = await this.checkVerificationStatus(rec);
465
- const completed = verification?.completed === true;
466
- const success = verification?.success === true;
467
- this.emit({
468
- step: 4,
469
- phase: require_sdkSentEvents.EmailRecoveryPhase.STEP_4_POLLING_VERIFICATION_RESULT,
470
- status: require_sdkSentEvents.EmailRecoveryStatus.PROGRESS,
471
- message: completed && success ? `Recovery email verified for request ${rec.requestId}; finalizing registration...` : `Waiting for recovery email verification for request ${rec.requestId}...`,
472
- data: {
473
- accountId: rec.accountId,
474
- requestId: rec.requestId,
475
- nearPublicKey: rec.nearPublicKey,
476
- elapsedMs: elapsed,
477
- pollCount
478
- }
479
- });
480
- if (completed) {
481
- if (!success) {
482
- const err$1 = this.emitError(4, verification?.errorMessage || "Email verification failed");
483
- rec.status = "error";
484
- await this.savePending(rec);
485
- await this.options?.afterCall?.(false);
486
- throw err$1;
487
- }
488
- rec.status = "finalizing";
489
- await this.savePending(rec);
490
- return;
491
- }
492
- await new Promise((resolve) => {
493
- this.pollIntervalResolver = resolve;
494
- this.pollingTimer = setTimeout(() => {
495
- this.pollIntervalResolver = void 0;
496
- this.pollingTimer = void 0;
497
- resolve();
498
- }, pollingIntervalMs);
499
- }).finally(() => {
500
- this.pollIntervalResolver = void 0;
501
- });
552
+ rec.status = "finalizing";
553
+ await this.savePending(rec);
554
+ return;
555
+ }
556
+ if (pollResult.status === "timedOut") {
557
+ const err$1 = this.emitError(4, "Timed out waiting for recovery email to be processed on-chain");
558
+ rec.status = "error";
559
+ await this.savePending(rec);
560
+ await this.options?.afterCall?.(false);
561
+ throw err$1;
502
562
  }
503
563
  const err = this.emitError(4, "Email recovery polling was cancelled");
504
564
  await this.options?.afterCall?.(false);
505
565
  throw err;
506
566
  }
507
- async finalizeRegistration(rec) {
508
- this.phase = require_sdkSentEvents.EmailRecoveryPhase.STEP_5_FINALIZING_REGISTRATION;
509
- this.emit({
510
- step: 5,
511
- phase: require_sdkSentEvents.EmailRecoveryPhase.STEP_5_FINALIZING_REGISTRATION,
512
- status: require_sdkSentEvents.EmailRecoveryStatus.PROGRESS,
513
- message: "Finalizing email recovery registration...",
514
- data: {
515
- accountId: rec.accountId,
516
- nearPublicKey: rec.nearPublicKey
517
- }
518
- });
567
+ initializeNonceManager(rec) {
519
568
  const nonceManager = this.context.webAuthnManager.getNonceManager();
520
569
  const accountId = require_accountIds.toAccountId(rec.accountId);
521
570
  nonceManager.initializeUser(accountId, rec.nearPublicKey);
571
+ return {
572
+ nonceManager,
573
+ accountId
574
+ };
575
+ }
576
+ async signRegistrationTx(rec, accountId) {
577
+ const vrfChallenge = rec.vrfChallenge;
578
+ if (!vrfChallenge) return this.fail(5, "Missing VRF challenge for email recovery registration");
579
+ const registrationResult = await this.context.webAuthnManager.signDevice2RegistrationWithStoredKey({
580
+ nearAccountId: accountId,
581
+ credential: rec.credential,
582
+ vrfChallenge,
583
+ deterministicVrfPublicKey: rec.vrfPublicKey,
584
+ deviceNumber: rec.deviceNumber
585
+ });
586
+ if (!registrationResult.success || !registrationResult.signedTransaction) await this.fail(5, registrationResult.error || "Failed to sign email recovery registration transaction");
587
+ return registrationResult.signedTransaction;
588
+ }
589
+ async broadcastRegistrationTxAndWaitFinal(rec, signedTx) {
522
590
  try {
523
- if (!rec.vrfChallenge) {
524
- const err = this.emitError(5, "Missing VRF challenge for email recovery registration");
525
- await this.options?.afterCall?.(false);
526
- throw err;
527
- }
528
- const registrationResult = await this.context.webAuthnManager.signDevice2RegistrationWithStoredKey({
529
- nearAccountId: accountId,
530
- credential: rec.credential,
531
- vrfChallenge: rec.vrfChallenge,
532
- deterministicVrfPublicKey: rec.vrfPublicKey,
533
- deviceNumber: rec.deviceNumber
534
- });
535
- if (!registrationResult.success || !registrationResult.signedTransaction) {
536
- const err = this.emitError(5, registrationResult.error || "Failed to sign email recovery registration transaction");
537
- await this.options?.afterCall?.(false);
538
- throw err;
539
- }
540
- const signedTx = registrationResult.signedTransaction;
591
+ const txResult = await this.context.nearClient.sendTransaction(signedTx, require_rpc.DEFAULT_WAIT_STATUS.linkDeviceRegistration);
541
592
  try {
542
- await this.context.nearClient.sendTransaction(signedTx);
543
- } catch (e) {
544
- const msg = String(e?.message || "");
545
- const err = this.emitError(5, msg || "Failed to broadcast email recovery registration transaction (insufficient funds or RPC error)");
546
- await this.options?.afterCall?.(false);
547
- throw err;
548
- }
549
- try {
550
- const txNonce = signedTx.transaction?.nonce;
551
- if (txNonce != null) await nonceManager.updateNonceFromBlockchain(this.context.nearClient, String(txNonce));
593
+ const txHash = txResult?.transaction?.hash || txResult?.transaction_hash;
594
+ if (txHash) this.emit({
595
+ step: 5,
596
+ phase: require_sdkSentEvents.EmailRecoveryPhase.STEP_5_FINALIZING_REGISTRATION,
597
+ status: require_sdkSentEvents.EmailRecoveryStatus.PROGRESS,
598
+ message: "Registration transaction confirmed",
599
+ data: {
600
+ accountId: rec.accountId,
601
+ nearPublicKey: rec.nearPublicKey,
602
+ transactionHash: txHash
603
+ }
604
+ });
605
+ return txHash;
552
606
  } catch {}
553
- const { webAuthnManager } = this.context;
554
- await webAuthnManager.storeUserData({
607
+ } catch (e) {
608
+ const msg = String(e?.message || "");
609
+ await this.fail(5, msg || "Failed to broadcast email recovery registration transaction (insufficient funds or RPC error)");
610
+ }
611
+ return void 0;
612
+ }
613
+ async persistRecoveredUserRecordBestEffort(rec, accountId) {
614
+ try {
615
+ await require_index.IndexedDBManager.clientDB.storeWebAuthnUserData({
555
616
  nearAccountId: accountId,
556
617
  deviceNumber: rec.deviceNumber,
557
618
  clientNearPublicKey: rec.nearPublicKey,
558
- lastUpdated: Date.now(),
559
619
  passkeyCredential: {
560
620
  id: rec.credential.id,
561
621
  rawId: rec.credential.rawId
562
622
  },
563
- encryptedVrfKeypair: {
564
- encryptedVrfDataB64u: rec.encryptedVrfKeypair.encryptedVrfDataB64u,
565
- chacha20NonceB64u: rec.encryptedVrfKeypair.chacha20NonceB64u
566
- },
623
+ encryptedVrfKeypair: rec.encryptedVrfKeypair,
567
624
  serverEncryptedVrfKeypair: rec.serverEncryptedVrfKeypair || void 0
568
625
  });
569
- try {
570
- const attestationB64u = rec.credential.response.attestationObject;
571
- const credentialPublicKey = await webAuthnManager.extractCosePublicKey(attestationB64u);
572
- await webAuthnManager.storeAuthenticator({
573
- nearAccountId: accountId,
574
- deviceNumber: rec.deviceNumber,
575
- credentialId: rec.credential.rawId,
576
- credentialPublicKey,
577
- transports: ["internal"],
578
- name: `Device ${rec.deviceNumber} Passkey for ${rec.accountId.split(".")[0]}`,
579
- registered: (/* @__PURE__ */ new Date()).toISOString(),
580
- syncedAt: (/* @__PURE__ */ new Date()).toISOString(),
581
- vrfPublicKey: rec.vrfPublicKey
582
- });
583
- } catch {}
584
- await this.attemptAutoLogin(rec);
585
- rec.status = "complete";
586
- await this.savePending(rec);
587
- await this.clearPending(rec.accountId, rec.nearPublicKey);
626
+ return true;
627
+ } catch (err) {
628
+ console.warn("[EmailRecoveryFlow] Failed to store recovery user record:", err);
629
+ return false;
630
+ }
631
+ }
632
+ mapAuthenticatorsFromContract(authenticators) {
633
+ return authenticators.map(({ authenticator }) => ({
634
+ credentialId: authenticator.credentialId,
635
+ credentialPublicKey: authenticator.credentialPublicKey,
636
+ transports: authenticator.transports,
637
+ name: authenticator.name,
638
+ registered: authenticator.registered.toISOString(),
639
+ vrfPublicKey: authenticator.vrfPublicKeys?.[0] || "",
640
+ deviceNumber: authenticator.deviceNumber
641
+ }));
642
+ }
643
+ async syncAuthenticatorsBestEffort(accountId) {
644
+ try {
645
+ const { syncAuthenticatorsContractCall } = await Promise.resolve().then(() => require("../rpcCalls.js"));
646
+ const authenticators = await syncAuthenticatorsContractCall(this.context.nearClient, this.context.configs.contractId, accountId);
647
+ const mappedAuthenticators = this.mapAuthenticatorsFromContract(authenticators);
648
+ await require_index.IndexedDBManager.clientDB.syncAuthenticatorsFromContract(accountId, mappedAuthenticators);
649
+ return true;
650
+ } catch (err) {
651
+ console.warn("[EmailRecoveryFlow] Failed to sync authenticators after recovery:", err);
652
+ return false;
653
+ }
654
+ }
655
+ async setLastUserBestEffort(accountId, deviceNumber) {
656
+ try {
657
+ await require_index.IndexedDBManager.clientDB.setLastUser(accountId, deviceNumber);
658
+ return true;
659
+ } catch (err) {
660
+ console.warn("[EmailRecoveryFlow] Failed to set last user after recovery:", err);
661
+ return false;
662
+ }
663
+ }
664
+ async updateNonceBestEffort(nonceManager, signedTx) {
665
+ try {
666
+ const txNonce = signedTx.transaction?.nonce;
667
+ if (txNonce != null) await nonceManager.updateNonceFromBlockchain(this.context.nearClient, String(txNonce));
668
+ } catch {}
669
+ }
670
+ async persistRecoveredUserData(rec, accountId) {
671
+ const { webAuthnManager } = this.context;
672
+ const payload = {
673
+ nearAccountId: accountId,
674
+ deviceNumber: rec.deviceNumber,
675
+ clientNearPublicKey: rec.nearPublicKey,
676
+ lastUpdated: Date.now(),
677
+ passkeyCredential: {
678
+ id: rec.credential.id,
679
+ rawId: rec.credential.rawId
680
+ },
681
+ encryptedVrfKeypair: {
682
+ encryptedVrfDataB64u: rec.encryptedVrfKeypair.encryptedVrfDataB64u,
683
+ chacha20NonceB64u: rec.encryptedVrfKeypair.chacha20NonceB64u
684
+ },
685
+ serverEncryptedVrfKeypair: rec.serverEncryptedVrfKeypair || void 0
686
+ };
687
+ await webAuthnManager.storeUserData(payload);
688
+ }
689
+ async persistAuthenticatorBestEffort(rec, accountId) {
690
+ try {
691
+ const { webAuthnManager } = this.context;
692
+ const attestationB64u = rec.credential.response.attestationObject;
693
+ const credentialPublicKey = await webAuthnManager.extractCosePublicKey(attestationB64u);
694
+ await webAuthnManager.storeAuthenticator({
695
+ nearAccountId: accountId,
696
+ deviceNumber: rec.deviceNumber,
697
+ credentialId: rec.credential.rawId,
698
+ credentialPublicKey,
699
+ transports: ["internal"],
700
+ name: `Device ${rec.deviceNumber} Passkey for ${rec.accountId.split(".")[0]}`,
701
+ registered: (/* @__PURE__ */ new Date()).toISOString(),
702
+ syncedAt: (/* @__PURE__ */ new Date()).toISOString(),
703
+ vrfPublicKey: rec.vrfPublicKey
704
+ });
705
+ } catch {}
706
+ }
707
+ async markCompleteAndClearPending(rec) {
708
+ rec.status = "complete";
709
+ await this.savePending(rec);
710
+ await this.clearPending(rec.accountId, rec.nearPublicKey);
711
+ }
712
+ async assertVrfActiveForAccount(accountId, message) {
713
+ const vrfStatus = await this.context.webAuthnManager.checkVrfStatus();
714
+ const vrfActiveForAccount = vrfStatus.active && vrfStatus.nearAccountId && String(vrfStatus.nearAccountId) === String(accountId);
715
+ if (!vrfActiveForAccount) throw new Error(message);
716
+ }
717
+ async finalizeLocalLoginState(accountId, deviceNumber) {
718
+ const { webAuthnManager } = this.context;
719
+ await webAuthnManager.setLastUser(accountId, deviceNumber);
720
+ await webAuthnManager.initializeCurrentUser(accountId, this.context.nearClient);
721
+ try {
722
+ await require_login.getLoginSession(this.context, accountId);
723
+ } catch {}
724
+ }
725
+ async tryShamirUnlock(rec, accountId, deviceNumber) {
726
+ if (!rec.serverEncryptedVrfKeypair || !rec.serverEncryptedVrfKeypair.serverKeyId || !this.context.configs.vrfWorkerConfigs?.shamir3pass?.relayServerUrl) return false;
727
+ try {
728
+ const { webAuthnManager } = this.context;
729
+ const unlockResult = await webAuthnManager.shamir3PassDecryptVrfKeypair({
730
+ nearAccountId: accountId,
731
+ kek_s_b64u: rec.serverEncryptedVrfKeypair.kek_s_b64u,
732
+ ciphertextVrfB64u: rec.serverEncryptedVrfKeypair.ciphertextVrfB64u,
733
+ serverKeyId: rec.serverEncryptedVrfKeypair.serverKeyId
734
+ });
735
+ if (!unlockResult.success) return false;
736
+ await this.assertVrfActiveForAccount(accountId, "VRF session inactive after Shamir3Pass unlock");
737
+ await this.finalizeLocalLoginState(accountId, deviceNumber);
738
+ return true;
739
+ } catch (err) {
740
+ console.warn("[EmailRecoveryFlow] Shamir 3-pass unlock failed, falling back to TouchID", err);
741
+ return false;
742
+ }
743
+ }
744
+ async tryTouchIdUnlock(rec, accountId, deviceNumber) {
745
+ try {
746
+ const { webAuthnManager } = this.context;
747
+ const authChallenge = require_vrf_worker.createRandomVRFChallenge();
748
+ const storedCredentialId = String(rec.credential?.rawId || rec.credential?.id || "").trim();
749
+ const credentialIds = storedCredentialId ? [storedCredentialId] : [];
750
+ const authenticators = credentialIds.length > 0 ? [] : await webAuthnManager.getAuthenticatorsByUser(accountId);
751
+ const authCredential = await webAuthnManager.getAuthenticationCredentialsSerializedDualPrf({
752
+ nearAccountId: accountId,
753
+ challenge: authChallenge,
754
+ credentialIds: credentialIds.length > 0 ? credentialIds : authenticators.map((a) => a.credentialId)
755
+ });
756
+ if (storedCredentialId && authCredential.rawId !== storedCredentialId) return {
757
+ success: false,
758
+ reason: "Wrong passkey selected during recovery auto-login; please use the newly recovered passkey."
759
+ };
760
+ const vrfUnlockResult = await webAuthnManager.unlockVRFKeypair({
761
+ nearAccountId: accountId,
762
+ encryptedVrfKeypair: rec.encryptedVrfKeypair,
763
+ credential: authCredential
764
+ });
765
+ if (!vrfUnlockResult.success) return {
766
+ success: false,
767
+ reason: vrfUnlockResult.error || "VRF unlock failed during auto-login"
768
+ };
769
+ await this.assertVrfActiveForAccount(accountId, "VRF session inactive after TouchID unlock");
770
+ await this.finalizeLocalLoginState(accountId, deviceNumber);
771
+ return { success: true };
772
+ } catch (err) {
773
+ return {
774
+ success: false,
775
+ reason: err?.message || String(err)
776
+ };
777
+ }
778
+ }
779
+ async handleAutoLoginFailure(reason, err) {
780
+ console.warn("[EmailRecoveryFlow] Auto-login failed after recovery", err ?? reason);
781
+ try {
782
+ await this.context.webAuthnManager.clearVrfSession();
783
+ } catch {}
784
+ return {
785
+ success: false,
786
+ reason
787
+ };
788
+ }
789
+ async finalizeRegistration(rec) {
790
+ this.phase = require_sdkSentEvents.EmailRecoveryPhase.STEP_5_FINALIZING_REGISTRATION;
791
+ this.emit({
792
+ step: 5,
793
+ phase: require_sdkSentEvents.EmailRecoveryPhase.STEP_5_FINALIZING_REGISTRATION,
794
+ status: require_sdkSentEvents.EmailRecoveryStatus.PROGRESS,
795
+ message: "Finalizing email recovery registration...",
796
+ data: {
797
+ accountId: rec.accountId,
798
+ nearPublicKey: rec.nearPublicKey
799
+ }
800
+ });
801
+ try {
802
+ const { nonceManager, accountId } = this.initializeNonceManager(rec);
803
+ const signedTx = await this.signRegistrationTx(rec, accountId);
804
+ const txHash = await this.broadcastRegistrationTxAndWaitFinal(rec, signedTx);
805
+ if (txHash) {
806
+ const storedUser = await this.persistRecoveredUserRecordBestEffort(rec, accountId);
807
+ if (storedUser) {
808
+ const syncedAuthenticators = await this.syncAuthenticatorsBestEffort(accountId);
809
+ if (syncedAuthenticators) await this.setLastUserBestEffort(accountId, rec.deviceNumber);
810
+ }
811
+ }
812
+ await this.updateNonceBestEffort(nonceManager, signedTx);
813
+ await this.persistRecoveredUserData(rec, accountId);
814
+ await this.persistAuthenticatorBestEffort(rec, accountId);
815
+ this.emitAutoLoginEvent(require_sdkSentEvents.EmailRecoveryStatus.PROGRESS, "Attempting auto-login with recovered device...", { autoLogin: "progress" });
816
+ const autoLoginResult = await this.attemptAutoLogin(rec);
817
+ if (autoLoginResult.success) this.emitAutoLoginEvent(require_sdkSentEvents.EmailRecoveryStatus.SUCCESS, `Welcome ${accountId}`, { autoLogin: "success" });
818
+ else this.emitAutoLoginEvent(require_sdkSentEvents.EmailRecoveryStatus.ERROR, "Auto-login failed; please log in manually on this device.", {
819
+ error: autoLoginResult.reason,
820
+ autoLogin: "error"
821
+ });
822
+ await this.markCompleteAndClearPending(rec);
588
823
  this.phase = require_sdkSentEvents.EmailRecoveryPhase.STEP_6_COMPLETE;
589
824
  this.emit({
590
825
  step: 6,
@@ -604,77 +839,22 @@ var init_emailRecovery = require_rolldown_runtime.__esm({ "src/core/TatchiPasske
604
839
  }
605
840
  async attemptAutoLogin(rec) {
606
841
  try {
607
- this.emit({
608
- step: 5,
609
- phase: require_sdkSentEvents.EmailRecoveryPhase.STEP_5_FINALIZING_REGISTRATION,
610
- status: require_sdkSentEvents.EmailRecoveryStatus.PROGRESS,
611
- message: "Attempting auto-login with recovered device...",
612
- data: { autoLogin: "progress" }
613
- });
614
- const { webAuthnManager } = this.context;
615
842
  const accountId = require_accountIds.toAccountId(rec.accountId);
616
- if (rec.serverEncryptedVrfKeypair && rec.serverEncryptedVrfKeypair.serverKeyId && this.context.configs.vrfWorkerConfigs?.shamir3pass?.relayServerUrl) try {
617
- const unlockResult = await webAuthnManager.shamir3PassDecryptVrfKeypair({
618
- nearAccountId: accountId,
619
- kek_s_b64u: rec.serverEncryptedVrfKeypair.kek_s_b64u,
620
- ciphertextVrfB64u: rec.serverEncryptedVrfKeypair.ciphertextVrfB64u,
621
- serverKeyId: rec.serverEncryptedVrfKeypair.serverKeyId
622
- });
623
- if (unlockResult.success) {
624
- await webAuthnManager.initializeCurrentUser(accountId, this.context.nearClient);
625
- await webAuthnManager.setLastUser(accountId, rec.deviceNumber);
626
- this.emit({
627
- step: 5,
628
- phase: require_sdkSentEvents.EmailRecoveryPhase.STEP_5_FINALIZING_REGISTRATION,
629
- status: require_sdkSentEvents.EmailRecoveryStatus.SUCCESS,
630
- message: `Welcome ${accountId}`,
631
- data: { autoLogin: "success" }
632
- });
633
- return;
634
- }
635
- } catch (err) {
636
- console.warn("[EmailRecoveryFlow] Shamir 3-pass unlock failed, falling back to TouchID", err);
637
- }
638
- const { txBlockHash, txBlockHeight } = await webAuthnManager.getNonceManager().getNonceBlockHashAndHeight(this.context.nearClient);
639
- const authChallenge = await webAuthnManager.generateVrfChallengeOnce({
640
- userId: accountId,
641
- rpId: webAuthnManager.getRpId(),
642
- blockHash: txBlockHash,
643
- blockHeight: txBlockHeight
644
- });
645
- const authenticators = await webAuthnManager.getAuthenticatorsByUser(accountId);
646
- const authCredential = await webAuthnManager.getAuthenticationCredentialsSerializedDualPrf({
647
- nearAccountId: accountId,
648
- challenge: authChallenge,
649
- credentialIds: authenticators.map((a) => a.credentialId)
650
- });
651
- const vrfUnlockResult = await webAuthnManager.unlockVRFKeypair({
652
- nearAccountId: accountId,
653
- encryptedVrfKeypair: rec.encryptedVrfKeypair,
654
- credential: authCredential
655
- });
656
- if (!vrfUnlockResult.success) throw new Error(vrfUnlockResult.error || "VRF unlock failed during auto-login");
657
- await webAuthnManager.initializeCurrentUser(accountId, this.context.nearClient);
658
- await webAuthnManager.setLastUser(accountId, rec.deviceNumber);
659
- this.emit({
660
- step: 5,
661
- phase: require_sdkSentEvents.EmailRecoveryPhase.STEP_5_FINALIZING_REGISTRATION,
662
- status: require_sdkSentEvents.EmailRecoveryStatus.SUCCESS,
663
- message: `Welcome ${accountId}`,
664
- data: { autoLogin: "success" }
665
- });
843
+ const deviceNumber = require_getDeviceNumber.parseDeviceNumber(rec.deviceNumber, { min: 1 });
844
+ if (deviceNumber === null) return this.handleAutoLoginFailure(`Invalid deviceNumber for auto-login: ${String(rec.deviceNumber)}`);
845
+ const shamirUnlocked = await this.tryShamirUnlock(rec, accountId, deviceNumber);
846
+ if (shamirUnlocked) return {
847
+ success: true,
848
+ method: "shamir"
849
+ };
850
+ const touchIdResult = await this.tryTouchIdUnlock(rec, accountId, deviceNumber);
851
+ if (touchIdResult.success) return {
852
+ success: true,
853
+ method: "touchid"
854
+ };
855
+ return this.handleAutoLoginFailure(touchIdResult.reason || "Auto-login failed");
666
856
  } catch (err) {
667
- console.warn("[EmailRecoveryFlow] Auto-login failed after recovery", err);
668
- this.emit({
669
- step: 5,
670
- phase: require_sdkSentEvents.EmailRecoveryPhase.STEP_5_FINALIZING_REGISTRATION,
671
- status: require_sdkSentEvents.EmailRecoveryStatus.ERROR,
672
- message: "Auto-login failed; please log in manually on this device.",
673
- data: {
674
- error: err?.message || String(err),
675
- autoLogin: "error"
676
- }
677
- });
857
+ return this.handleAutoLoginFailure(err?.message || String(err), err);
678
858
  }
679
859
  }
680
860
  };