@tatchi-xyz/sdk 0.19.0 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/dist/cjs/core/EmailRecovery/index.js +25 -0
  2. package/dist/cjs/core/EmailRecovery/index.js.map +1 -1
  3. package/dist/cjs/core/TatchiPasskey/emailRecovery.js +135 -77
  4. package/dist/cjs/core/TatchiPasskey/emailRecovery.js.map +1 -1
  5. package/dist/cjs/core/TatchiPasskey/index.js +2 -1
  6. package/dist/cjs/core/TatchiPasskey/index.js.map +1 -1
  7. package/dist/cjs/core/TatchiPasskey/linkDevice.js +2 -1
  8. package/dist/cjs/core/TatchiPasskey/linkDevice.js.map +1 -1
  9. package/dist/cjs/core/TatchiPasskey/scanDevice.js +5 -3
  10. package/dist/cjs/core/TatchiPasskey/scanDevice.js.map +1 -1
  11. package/dist/cjs/core/WalletIframe/client/router.js +1 -1
  12. package/dist/cjs/core/WalletIframe/client/router.js.map +1 -1
  13. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js +3 -4
  14. package/dist/cjs/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js.map +1 -1
  15. package/dist/cjs/core/defaultConfigs.js +3 -7
  16. package/dist/cjs/core/defaultConfigs.js.map +1 -1
  17. package/dist/cjs/core/nearCrypto.js +29 -5
  18. package/dist/cjs/core/nearCrypto.js.map +1 -1
  19. package/dist/cjs/core/rpcCalls.js +56 -26
  20. package/dist/cjs/core/rpcCalls.js.map +1 -1
  21. package/dist/cjs/core/types/emailRecovery.js +33 -0
  22. package/dist/cjs/core/types/emailRecovery.js.map +1 -0
  23. package/dist/cjs/index.js +4 -0
  24. package/dist/cjs/index.js.map +1 -1
  25. package/dist/cjs/react/components/AccountMenuButton/{LinkedDevicesModal-CSSowiHP.css → LinkedDevicesModal-BRtht0XI.css} +1 -1
  26. package/dist/{esm/react/components/AccountMenuButton/LinkedDevicesModal-CSSowiHP.css.map → cjs/react/components/AccountMenuButton/LinkedDevicesModal-BRtht0XI.css.map} +1 -1
  27. package/dist/cjs/react/components/AccountMenuButton/{ProfileDropdown-CEPMZ1gY.css → ProfileDropdown-BG_6hcim.css} +1 -1
  28. package/dist/{esm/react/components/AccountMenuButton/ProfileDropdown-CEPMZ1gY.css.map → cjs/react/components/AccountMenuButton/ProfileDropdown-BG_6hcim.css.map} +1 -1
  29. package/dist/cjs/react/components/AccountMenuButton/{Web3AuthProfileButton-DopOg7Xc.css → Web3AuthProfileButton-k8_FAYFq.css} +1 -1
  30. package/dist/cjs/react/components/AccountMenuButton/{Web3AuthProfileButton-DopOg7Xc.css.map → Web3AuthProfileButton-k8_FAYFq.css.map} +1 -1
  31. package/dist/cjs/react/components/AccountMenuButton/icons/{TouchIcon-BQWentvJ.css → TouchIcon-C-RcGfr5.css} +1 -1
  32. package/dist/cjs/react/components/AccountMenuButton/icons/{TouchIcon-BQWentvJ.css.map → TouchIcon-C-RcGfr5.css.map} +1 -1
  33. package/dist/cjs/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-DwrzWMYx.css → PasskeyAuthMenu-DKMiLeT9.css} +59 -4
  34. package/dist/cjs/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-DwrzWMYx.css.map → PasskeyAuthMenu-DKMiLeT9.css.map} +1 -1
  35. package/dist/cjs/react/components/PasskeyAuthMenu/adapters/tatchi.js +1 -0
  36. package/dist/cjs/react/components/PasskeyAuthMenu/adapters/tatchi.js.map +1 -1
  37. package/dist/cjs/react/components/PasskeyAuthMenu/client.js +30 -8
  38. package/dist/cjs/react/components/PasskeyAuthMenu/client.js.map +1 -1
  39. package/dist/cjs/react/components/PasskeyAuthMenu/controller/useSDKEvents.js +22 -0
  40. package/dist/cjs/react/components/PasskeyAuthMenu/controller/useSDKEvents.js.map +1 -0
  41. package/dist/cjs/react/components/PasskeyAuthMenu/ui/ContentSwitcher.js +17 -4
  42. package/dist/cjs/react/components/PasskeyAuthMenu/ui/ContentSwitcher.js.map +1 -1
  43. package/dist/cjs/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js +354 -154
  44. package/dist/cjs/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js.map +1 -1
  45. package/dist/cjs/react/components/{ShowQRCode-CCN4h6Uv.css → ShowQRCode-CB0UCQ_h.css} +1 -1
  46. package/dist/cjs/react/components/{ShowQRCode-CCN4h6Uv.css.map → ShowQRCode-CB0UCQ_h.css.map} +1 -1
  47. package/dist/cjs/react/context/useSDKFlowRuntime.js +183 -0
  48. package/dist/cjs/react/context/useSDKFlowRuntime.js.map +1 -0
  49. package/dist/cjs/react/context/useTatchiContextValue.js +24 -15
  50. package/dist/cjs/react/context/useTatchiContextValue.js.map +1 -1
  51. package/dist/cjs/react/context/useTatchiWithSdkFlow.js +96 -0
  52. package/dist/cjs/react/context/useTatchiWithSdkFlow.js.map +1 -0
  53. package/dist/cjs/react/sdk/src/core/EmailRecovery/index.js +26 -0
  54. package/dist/cjs/react/sdk/src/core/EmailRecovery/index.js.map +1 -1
  55. package/dist/cjs/react/sdk/src/core/TatchiPasskey/emailRecovery.js +135 -77
  56. package/dist/cjs/react/sdk/src/core/TatchiPasskey/emailRecovery.js.map +1 -1
  57. package/dist/cjs/react/sdk/src/core/TatchiPasskey/index.js +2 -1
  58. package/dist/cjs/react/sdk/src/core/TatchiPasskey/index.js.map +1 -1
  59. package/dist/cjs/react/sdk/src/core/TatchiPasskey/linkDevice.js +2 -1
  60. package/dist/cjs/react/sdk/src/core/TatchiPasskey/linkDevice.js.map +1 -1
  61. package/dist/cjs/react/sdk/src/core/TatchiPasskey/scanDevice.js +5 -3
  62. package/dist/cjs/react/sdk/src/core/TatchiPasskey/scanDevice.js.map +1 -1
  63. package/dist/cjs/react/sdk/src/core/WalletIframe/client/router.js +1 -1
  64. package/dist/cjs/react/sdk/src/core/WalletIframe/client/router.js.map +1 -1
  65. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js +3 -4
  66. package/dist/cjs/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js.map +1 -1
  67. package/dist/cjs/react/sdk/src/core/defaultConfigs.js +3 -7
  68. package/dist/cjs/react/sdk/src/core/defaultConfigs.js.map +1 -1
  69. package/dist/cjs/react/sdk/src/core/nearCrypto.js +29 -5
  70. package/dist/cjs/react/sdk/src/core/nearCrypto.js.map +1 -1
  71. package/dist/cjs/react/sdk/src/core/rpcCalls.js +56 -26
  72. package/dist/cjs/react/sdk/src/core/rpcCalls.js.map +1 -1
  73. package/dist/cjs/react/sdk/src/core/types/emailRecovery.js +33 -0
  74. package/dist/cjs/react/sdk/src/core/types/emailRecovery.js.map +1 -0
  75. package/dist/cjs/server/email-recovery/emailParsers.js +2 -1
  76. package/dist/cjs/server/email-recovery/emailParsers.js.map +1 -1
  77. package/dist/cjs/server/email-recovery/index.js +6 -6
  78. package/dist/cjs/server/email-recovery/index.js.map +1 -1
  79. package/dist/cjs/server/email-recovery/rpcCalls.js +22 -3
  80. package/dist/cjs/server/email-recovery/rpcCalls.js.map +1 -1
  81. package/dist/cjs/server/router/cloudflare.js +8 -3
  82. package/dist/cjs/server/router/cloudflare.js.map +1 -1
  83. package/dist/cjs/server/router/express.js.map +1 -1
  84. package/dist/cjs/server/sdk/src/core/defaultConfigs.js +2 -4
  85. package/dist/cjs/server/sdk/src/core/defaultConfigs.js.map +1 -1
  86. package/dist/cjs/server/sdk/src/core/nearCrypto.js +26 -7
  87. package/dist/cjs/server/sdk/src/core/nearCrypto.js.map +1 -1
  88. package/dist/esm/core/EmailRecovery/index.js +25 -1
  89. package/dist/esm/core/EmailRecovery/index.js.map +1 -1
  90. package/dist/esm/core/TatchiPasskey/emailRecovery.js +136 -78
  91. package/dist/esm/core/TatchiPasskey/emailRecovery.js.map +1 -1
  92. package/dist/esm/core/TatchiPasskey/index.js +2 -1
  93. package/dist/esm/core/TatchiPasskey/index.js.map +1 -1
  94. package/dist/esm/core/TatchiPasskey/linkDevice.js +2 -1
  95. package/dist/esm/core/TatchiPasskey/linkDevice.js.map +1 -1
  96. package/dist/esm/core/TatchiPasskey/scanDevice.js +5 -3
  97. package/dist/esm/core/TatchiPasskey/scanDevice.js.map +1 -1
  98. package/dist/esm/core/WalletIframe/client/router.js +1 -1
  99. package/dist/esm/core/WalletIframe/client/router.js.map +1 -1
  100. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js +2 -3
  101. package/dist/esm/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js.map +1 -1
  102. package/dist/esm/core/defaultConfigs.js +3 -7
  103. package/dist/esm/core/defaultConfigs.js.map +1 -1
  104. package/dist/esm/core/nearCrypto.js +24 -6
  105. package/dist/esm/core/nearCrypto.js.map +1 -1
  106. package/dist/esm/core/rpcCalls.js +56 -26
  107. package/dist/esm/core/rpcCalls.js.map +1 -1
  108. package/dist/esm/core/types/emailRecovery.js +26 -0
  109. package/dist/esm/core/types/emailRecovery.js.map +1 -0
  110. package/dist/esm/index.js +3 -1
  111. package/dist/esm/index.js.map +1 -1
  112. package/dist/esm/react/components/AccountMenuButton/{LinkedDevicesModal-CSSowiHP.css → LinkedDevicesModal-BRtht0XI.css} +1 -1
  113. package/dist/{cjs/react/components/AccountMenuButton/LinkedDevicesModal-CSSowiHP.css.map → esm/react/components/AccountMenuButton/LinkedDevicesModal-BRtht0XI.css.map} +1 -1
  114. package/dist/esm/react/components/AccountMenuButton/{ProfileDropdown-CEPMZ1gY.css → ProfileDropdown-BG_6hcim.css} +1 -1
  115. package/dist/{cjs/react/components/AccountMenuButton/ProfileDropdown-CEPMZ1gY.css.map → esm/react/components/AccountMenuButton/ProfileDropdown-BG_6hcim.css.map} +1 -1
  116. package/dist/esm/react/components/AccountMenuButton/{Web3AuthProfileButton-DopOg7Xc.css → Web3AuthProfileButton-k8_FAYFq.css} +1 -1
  117. package/dist/esm/react/components/AccountMenuButton/{Web3AuthProfileButton-DopOg7Xc.css.map → Web3AuthProfileButton-k8_FAYFq.css.map} +1 -1
  118. package/dist/esm/react/components/AccountMenuButton/icons/{TouchIcon-BQWentvJ.css → TouchIcon-C-RcGfr5.css} +1 -1
  119. package/dist/esm/react/components/AccountMenuButton/icons/{TouchIcon-BQWentvJ.css.map → TouchIcon-C-RcGfr5.css.map} +1 -1
  120. package/dist/esm/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-DwrzWMYx.css → PasskeyAuthMenu-DKMiLeT9.css} +59 -4
  121. package/dist/esm/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-DwrzWMYx.css.map → PasskeyAuthMenu-DKMiLeT9.css.map} +1 -1
  122. package/dist/esm/react/components/PasskeyAuthMenu/adapters/tatchi.js +1 -0
  123. package/dist/esm/react/components/PasskeyAuthMenu/adapters/tatchi.js.map +1 -1
  124. package/dist/esm/react/components/PasskeyAuthMenu/client.js +30 -8
  125. package/dist/esm/react/components/PasskeyAuthMenu/client.js.map +1 -1
  126. package/dist/esm/react/components/PasskeyAuthMenu/controller/useSDKEvents.js +20 -0
  127. package/dist/esm/react/components/PasskeyAuthMenu/controller/useSDKEvents.js.map +1 -0
  128. package/dist/esm/react/components/PasskeyAuthMenu/ui/ContentSwitcher.js +17 -4
  129. package/dist/esm/react/components/PasskeyAuthMenu/ui/ContentSwitcher.js.map +1 -1
  130. package/dist/esm/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js +354 -154
  131. package/dist/esm/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js.map +1 -1
  132. package/dist/esm/react/components/{ShowQRCode-CCN4h6Uv.css → ShowQRCode-CB0UCQ_h.css} +1 -1
  133. package/dist/esm/react/components/{ShowQRCode-CCN4h6Uv.css.map → ShowQRCode-CB0UCQ_h.css.map} +1 -1
  134. package/dist/esm/react/context/useSDKFlowRuntime.js +181 -0
  135. package/dist/esm/react/context/useSDKFlowRuntime.js.map +1 -0
  136. package/dist/esm/react/context/useTatchiContextValue.js +25 -16
  137. package/dist/esm/react/context/useTatchiContextValue.js.map +1 -1
  138. package/dist/esm/react/context/useTatchiWithSdkFlow.js +94 -0
  139. package/dist/esm/react/context/useTatchiWithSdkFlow.js.map +1 -0
  140. package/dist/esm/react/sdk/src/core/EmailRecovery/index.js +25 -1
  141. package/dist/esm/react/sdk/src/core/EmailRecovery/index.js.map +1 -1
  142. package/dist/esm/react/sdk/src/core/TatchiPasskey/emailRecovery.js +136 -78
  143. package/dist/esm/react/sdk/src/core/TatchiPasskey/emailRecovery.js.map +1 -1
  144. package/dist/esm/react/sdk/src/core/TatchiPasskey/index.js +2 -1
  145. package/dist/esm/react/sdk/src/core/TatchiPasskey/index.js.map +1 -1
  146. package/dist/esm/react/sdk/src/core/TatchiPasskey/linkDevice.js +2 -1
  147. package/dist/esm/react/sdk/src/core/TatchiPasskey/linkDevice.js.map +1 -1
  148. package/dist/esm/react/sdk/src/core/TatchiPasskey/scanDevice.js +5 -3
  149. package/dist/esm/react/sdk/src/core/TatchiPasskey/scanDevice.js.map +1 -1
  150. package/dist/esm/react/sdk/src/core/WalletIframe/client/router.js +1 -1
  151. package/dist/esm/react/sdk/src/core/WalletIframe/client/router.js.map +1 -1
  152. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js +2 -3
  153. package/dist/esm/react/sdk/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.js.map +1 -1
  154. package/dist/esm/react/sdk/src/core/defaultConfigs.js +3 -7
  155. package/dist/esm/react/sdk/src/core/defaultConfigs.js.map +1 -1
  156. package/dist/esm/react/sdk/src/core/nearCrypto.js +24 -6
  157. package/dist/esm/react/sdk/src/core/nearCrypto.js.map +1 -1
  158. package/dist/esm/react/sdk/src/core/rpcCalls.js +56 -26
  159. package/dist/esm/react/sdk/src/core/rpcCalls.js.map +1 -1
  160. package/dist/esm/react/sdk/src/core/types/emailRecovery.js +26 -0
  161. package/dist/esm/react/sdk/src/core/types/emailRecovery.js.map +1 -0
  162. package/dist/esm/react/styles/styles.css +58 -3
  163. package/dist/esm/sdk/{defaultConfigs-DpslkAQd.js → defaultConfigs-CfQDV-ya.js} +3 -7
  164. package/dist/esm/sdk/{getDeviceNumber-fXizNGQl.js → getDeviceNumber-BpernPnM.js} +4 -8
  165. package/dist/esm/sdk/getDeviceNumber-BpernPnM.js.map +1 -0
  166. package/dist/esm/sdk/offline-export-app.js +23 -6
  167. package/dist/esm/sdk/offline-export-app.js.map +1 -1
  168. package/dist/esm/sdk/{router-DuGYOd3G.js → router-BWtacLJg.js} +1 -1
  169. package/dist/esm/sdk/{rpcCalls-BQrJMTdg.js → rpcCalls-CYGJSCgm.js} +3 -3
  170. package/dist/esm/sdk/{rpcCalls-YVeUVMk2.js → rpcCalls-DZZSa-sk.js} +57 -27
  171. package/dist/esm/sdk/{transactions-bqaAwL4k.js → transactions-Cn9xTWlK.js} +2 -2
  172. package/dist/esm/sdk/{transactions-bqaAwL4k.js.map → transactions-Cn9xTWlK.js.map} +1 -1
  173. package/dist/esm/sdk/{transactions-BalIhtJ9.js → transactions-DfdwDQCn.js} +1 -1
  174. package/dist/esm/sdk/wallet-iframe-host.js +660 -590
  175. package/dist/esm/server/email-recovery/emailParsers.js +3 -1
  176. package/dist/esm/server/email-recovery/emailParsers.js.map +1 -1
  177. package/dist/esm/server/email-recovery/index.js +6 -6
  178. package/dist/esm/server/email-recovery/index.js.map +1 -1
  179. package/dist/esm/server/email-recovery/rpcCalls.js +22 -3
  180. package/dist/esm/server/email-recovery/rpcCalls.js.map +1 -1
  181. package/dist/esm/server/router/cloudflare.js +8 -3
  182. package/dist/esm/server/router/cloudflare.js.map +1 -1
  183. package/dist/esm/server/router/express.js.map +1 -1
  184. package/dist/esm/server/sdk/src/core/defaultConfigs.js +2 -4
  185. package/dist/esm/server/sdk/src/core/defaultConfigs.js.map +1 -1
  186. package/dist/esm/server/sdk/src/core/nearCrypto.js +26 -8
  187. package/dist/esm/server/sdk/src/core/nearCrypto.js.map +1 -1
  188. package/dist/esm/wasm_vrf_worker/pkg/wasm_vrf_worker_bg.wasm +0 -0
  189. package/dist/types/src/core/EmailRecovery/index.d.ts +8 -0
  190. package/dist/types/src/core/EmailRecovery/index.d.ts.map +1 -1
  191. package/dist/types/src/core/TatchiPasskey/emailRecovery.d.ts +8 -5
  192. package/dist/types/src/core/TatchiPasskey/emailRecovery.d.ts.map +1 -1
  193. package/dist/types/src/core/TatchiPasskey/index.d.ts +1 -1
  194. package/dist/types/src/core/TatchiPasskey/index.d.ts.map +1 -1
  195. package/dist/types/src/core/TatchiPasskey/scanDevice.d.ts.map +1 -1
  196. package/dist/types/src/core/WalletIframe/TatchiPasskeyIframe.d.ts +1 -1
  197. package/dist/types/src/core/WalletIframe/TatchiPasskeyIframe.d.ts.map +1 -1
  198. package/dist/types/src/core/WalletIframe/client/router.d.ts +1 -1
  199. package/dist/types/src/core/WalletIframe/client/router.d.ts.map +1 -1
  200. package/dist/types/src/core/WalletIframe/shared/messages.d.ts +1 -1
  201. package/dist/types/src/core/WalletIframe/shared/messages.d.ts.map +1 -1
  202. package/dist/types/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.d.ts +2 -1
  203. package/dist/types/src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.d.ts.map +1 -1
  204. package/dist/types/src/core/defaultConfigs.d.ts.map +1 -1
  205. package/dist/types/src/core/nearCrypto.d.ts +14 -0
  206. package/dist/types/src/core/nearCrypto.d.ts.map +1 -1
  207. package/dist/types/src/core/rpcCalls.d.ts +11 -8
  208. package/dist/types/src/core/rpcCalls.d.ts.map +1 -1
  209. package/dist/types/src/core/types/emailRecovery.d.ts +10 -0
  210. package/dist/types/src/core/types/emailRecovery.d.ts.map +1 -0
  211. package/dist/types/src/core/types/index.d.ts +1 -0
  212. package/dist/types/src/core/types/index.d.ts.map +1 -1
  213. package/dist/types/src/core/types/tatchi.d.ts +0 -4
  214. package/dist/types/src/core/types/tatchi.d.ts.map +1 -1
  215. package/dist/types/src/index.d.ts +1 -0
  216. package/dist/types/src/index.d.ts.map +1 -1
  217. package/dist/types/src/react/components/PasskeyAuthMenu/adapters/tatchi.d.ts +2 -0
  218. package/dist/types/src/react/components/PasskeyAuthMenu/adapters/tatchi.d.ts.map +1 -1
  219. package/dist/types/src/react/components/PasskeyAuthMenu/client.d.ts.map +1 -1
  220. package/dist/types/src/react/components/PasskeyAuthMenu/controller/useSDKEvents.d.ts +10 -0
  221. package/dist/types/src/react/components/PasskeyAuthMenu/controller/useSDKEvents.d.ts.map +1 -0
  222. package/dist/types/src/react/components/PasskeyAuthMenu/types.d.ts +8 -3
  223. package/dist/types/src/react/components/PasskeyAuthMenu/types.d.ts.map +1 -1
  224. package/dist/types/src/react/components/PasskeyAuthMenu/ui/ContentSwitcher.d.ts +2 -0
  225. package/dist/types/src/react/components/PasskeyAuthMenu/ui/ContentSwitcher.d.ts.map +1 -1
  226. package/dist/types/src/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.d.ts +1 -1
  227. package/dist/types/src/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.d.ts.map +1 -1
  228. package/dist/types/src/react/context/useSDKFlowRuntime.d.ts +10 -0
  229. package/dist/types/src/react/context/useSDKFlowRuntime.d.ts.map +1 -0
  230. package/dist/types/src/react/context/useTatchiContextValue.d.ts.map +1 -1
  231. package/dist/types/src/react/context/useTatchiWithSdkFlow.d.ts +9 -0
  232. package/dist/types/src/react/context/useTatchiWithSdkFlow.d.ts.map +1 -0
  233. package/dist/types/src/react/types.d.ts +31 -0
  234. package/dist/types/src/react/types.d.ts.map +1 -1
  235. package/dist/types/src/server/email-recovery/emailParsers.d.ts.map +1 -1
  236. package/dist/types/src/server/email-recovery/index.d.ts +5 -6
  237. package/dist/types/src/server/email-recovery/index.d.ts.map +1 -1
  238. package/dist/types/src/server/email-recovery/rpcCalls.d.ts +1 -0
  239. package/dist/types/src/server/email-recovery/rpcCalls.d.ts.map +1 -1
  240. package/dist/types/src/server/router/cloudflare-adaptor.d.ts.map +1 -1
  241. package/dist/workers/wasm_vrf_worker_bg.wasm +0 -0
  242. package/package.json +1 -1
  243. package/dist/esm/sdk/getDeviceNumber-fXizNGQl.js.map +0 -1
@@ -6,7 +6,7 @@ import "./asset-base-K63RlTrt.js";
6
6
  import "./tx-tree-themes-BND0SU2h.js";
7
7
  import { CONFIRM_UI_ELEMENT_SELECTORS, W3A_TX_BUTTON_HOST_ID, W3A_TX_BUTTON_ID, defineTag } from "./tags-C2Wlhqjd.js";
8
8
  import { WalletIframeDomEvents, computeUiIntentDigestFromTxs, orderActionForDigest } from "./txDigest-CxjhSCgm.js";
9
- import { base64UrlDecode } from "./base64-DBPGuXh4.js";
9
+ import { base64Decode, base64UrlDecode, init_base64 } from "./base64-DBPGuXh4.js";
10
10
  import { ActionType, init_actions, toActionArgsWasm, validateActionArgsWasm } from "./actions-O1FD5Bq8.js";
11
11
  import { ensureKnownW3aElement } from "./ensure-defined-CHInSx7l.js";
12
12
  import { base58Encode, errorMessage, esm_default, getNearShortErrorMessage, getUserFriendlyErrorMessage, init_base58, init_encoders, init_errors, init_esm, isTouchIdCancellationError, toError } from "./errors-D9ar28Dr.js";
@@ -14,8 +14,8 @@ import { init_credentialsHelpers, init_utils, init_validation as init_validation
14
14
  import { MinimalNearClient, SignedTransaction, isOffline, openOfflineExport } from "./overlay-ZGbucXIa.js";
15
15
  import { AccountRecoveryPhase, AccountRecoveryStatus, ActionPhase, ActionStatus, DEFAULT_WAIT_STATUS, DeviceLinkingPhase, DeviceLinkingStatus, EmailRecoveryPhase, EmailRecoveryStatus, LoginPhase, LoginStatus, RegistrationPhase, RegistrationStatus, init_rpc, init_sdkSentEvents } from "./sdkSentEvents-_jrJLIhw.js";
16
16
  import { SecureConfirmMessageType, SecureConfirmationType, TouchIdPrompt, authenticatorsToAllowCredentials, createRandomVRFChallenge, getIntentDigest, init_accountIds, init_touchIdPrompt, init_vrf_worker, parseTransactionSummary, sanitizeForPostMessage, sendConfirmResponse, toAccountId, validateVRFChallenge } from "./requestHelpers-Dh1hEYL9.js";
17
- import { PASSKEY_MANAGER_DEFAULT_CONFIGS, buildConfigsFromEnv, init_defaultConfigs } from "./defaultConfigs-DpslkAQd.js";
18
- import { buildSetRecoveryEmailsActions, checkCanRegisterUserContractCall, executeDeviceLinkingContractCalls, getCredentialIdsContractCall, getDeviceLinkingAccountContractCall, getRecoveryEmailHashesContractCall, init_rpcCalls, syncAuthenticatorsContractCall, verifyAuthenticationResponse } from "./rpcCalls-YVeUVMk2.js";
17
+ import { PASSKEY_MANAGER_DEFAULT_CONFIGS, buildConfigsFromEnv, init_defaultConfigs } from "./defaultConfigs-CfQDV-ya.js";
18
+ import { buildSetRecoveryEmailsActions, checkCanRegisterUserContractCall, executeDeviceLinkingContractCalls, getCredentialIdsContractCall, getDeviceLinkingAccountContractCall, getEmailRecoveryAttempt, getRecoveryEmailHashesContractCall, init_rpcCalls, syncAuthenticatorsContractCall, verifyAuthenticationResponse } from "./rpcCalls-DZZSa-sk.js";
19
19
  import { getLastLoggedInDeviceNumber, init_getDeviceNumber, parseDeviceNumber } from "./getDeviceNumber-zsOHT_Um.js";
20
20
 
21
21
  //#region src/core/sdkPaths/workers.ts
@@ -2226,6 +2226,7 @@ init_utils();
2226
2226
  init_encoders();
2227
2227
  init_base58();
2228
2228
  init_esm();
2229
+ init_base64();
2229
2230
  /**
2230
2231
  * Control messages exchanged between worker shims and the main thread.
2231
2232
  *
@@ -2666,10 +2667,480 @@ async function signTransactionsWithActions$1({ ctx, transactions, rpcCall, onEve
2666
2667
  }
2667
2668
  }
2668
2669
 
2670
+ //#endregion
2671
+ //#region ../node_modules/.pnpm/@noble+ed25519@2.3.0/node_modules/@noble/ed25519/index.js
2672
+ var ed25519_CURVE, P, N, Gx, Gy, _a, _d, h, L, L2, err, isBig, isStr, isBytes, abytes, u8n, u8fr, padh, bytesToHex$1, C, _ch, hexToBytes, toU8, cr, subtle, concatBytes, randomBytes, big, arange, M, modN, invert, callHash, apoint, B256, Point, G, I, numTo32bLE, bytesToNumLE, pow2, pow_2_252_3, RM1, uvRatio, modL_LE, sha512a, sha512s, hash2extK, getExtendedPublicKeyAsync, getExtendedPublicKey, getPublicKeyAsync, etc, utils, W, scalarBits, pwindows, pwindowSize, precompute, Gpows, ctneg, wNAF;
2673
+ var init_ed25519 = __esm({ "../node_modules/.pnpm/@noble+ed25519@2.3.0/node_modules/@noble/ed25519/index.js": (() => {
2674
+ ed25519_CURVE = {
2675
+ p: 57896044618658097711785492504343953926634992332820282019728792003956564819949n,
2676
+ n: 7237005577332262213973186563042994240857116359379907606001950938285454250989n,
2677
+ h: 8n,
2678
+ a: 57896044618658097711785492504343953926634992332820282019728792003956564819948n,
2679
+ d: 37095705934669439343138083508754565189542113879843219016388785533085940283555n,
2680
+ Gx: 15112221349535400772501151409588531511454012693041857206046113283949847762202n,
2681
+ Gy: 46316835694926478169428394003475163141307993866256225615783033603165251855960n
2682
+ };
2683
+ ({p: P, n: N, Gx, Gy, a: _a, d: _d} = ed25519_CURVE);
2684
+ h = 8n;
2685
+ L = 32;
2686
+ L2 = 64;
2687
+ err = (m = "") => {
2688
+ throw new Error(m);
2689
+ };
2690
+ isBig = (n) => typeof n === "bigint";
2691
+ isStr = (s) => typeof s === "string";
2692
+ isBytes = (a) => a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array";
2693
+ abytes = (a, l) => !isBytes(a) || typeof l === "number" && l > 0 && a.length !== l ? err("Uint8Array expected") : a;
2694
+ u8n = (len) => new Uint8Array(len);
2695
+ u8fr = (buf) => Uint8Array.from(buf);
2696
+ padh = (n, pad) => n.toString(16).padStart(pad, "0");
2697
+ bytesToHex$1 = (b) => Array.from(abytes(b)).map((e) => padh(e, 2)).join("");
2698
+ C = {
2699
+ _0: 48,
2700
+ _9: 57,
2701
+ A: 65,
2702
+ F: 70,
2703
+ a: 97,
2704
+ f: 102
2705
+ };
2706
+ _ch = (ch) => {
2707
+ if (ch >= C._0 && ch <= C._9) return ch - C._0;
2708
+ if (ch >= C.A && ch <= C.F) return ch - (C.A - 10);
2709
+ if (ch >= C.a && ch <= C.f) return ch - (C.a - 10);
2710
+ };
2711
+ hexToBytes = (hex) => {
2712
+ const e = "hex invalid";
2713
+ if (!isStr(hex)) return err(e);
2714
+ const hl = hex.length;
2715
+ const al = hl / 2;
2716
+ if (hl % 2) return err(e);
2717
+ const array = u8n(al);
2718
+ for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {
2719
+ const n1 = _ch(hex.charCodeAt(hi));
2720
+ const n2 = _ch(hex.charCodeAt(hi + 1));
2721
+ if (n1 === void 0 || n2 === void 0) return err(e);
2722
+ array[ai] = n1 * 16 + n2;
2723
+ }
2724
+ return array;
2725
+ };
2726
+ toU8 = (a, len) => abytes(isStr(a) ? hexToBytes(a) : u8fr(abytes(a)), len);
2727
+ cr = () => globalThis?.crypto;
2728
+ subtle = () => cr()?.subtle ?? err("crypto.subtle must be defined");
2729
+ concatBytes = (...arrs) => {
2730
+ const r = u8n(arrs.reduce((sum, a) => sum + abytes(a).length, 0));
2731
+ let pad = 0;
2732
+ arrs.forEach((a) => {
2733
+ r.set(a, pad);
2734
+ pad += a.length;
2735
+ });
2736
+ return r;
2737
+ };
2738
+ randomBytes = (len = L) => {
2739
+ const c = cr();
2740
+ return c.getRandomValues(u8n(len));
2741
+ };
2742
+ big = BigInt;
2743
+ arange = (n, min, max, msg = "bad number: out of range") => isBig(n) && min <= n && n < max ? n : err(msg);
2744
+ M = (a, b = P) => {
2745
+ const r = a % b;
2746
+ return r >= 0n ? r : b + r;
2747
+ };
2748
+ modN = (a) => M(a, N);
2749
+ invert = (num, md) => {
2750
+ if (num === 0n || md <= 0n) err("no inverse n=" + num + " mod=" + md);
2751
+ let a = M(num, md), b = md, x = 0n, y = 1n, u = 1n, v = 0n;
2752
+ while (a !== 0n) {
2753
+ const q = b / a, r = b % a;
2754
+ const m = x - u * q, n = y - v * q;
2755
+ b = a, a = r, x = u, y = v, u = m, v = n;
2756
+ }
2757
+ return b === 1n ? M(x, md) : err("no inverse");
2758
+ };
2759
+ callHash = (name) => {
2760
+ const fn = etc[name];
2761
+ if (typeof fn !== "function") err("hashes." + name + " not set");
2762
+ return fn;
2763
+ };
2764
+ apoint = (p) => p instanceof Point ? p : err("Point expected");
2765
+ B256 = 2n ** 256n;
2766
+ Point = class Point {
2767
+ static BASE;
2768
+ static ZERO;
2769
+ ex;
2770
+ ey;
2771
+ ez;
2772
+ et;
2773
+ constructor(ex, ey, ez, et) {
2774
+ const max = B256;
2775
+ this.ex = arange(ex, 0n, max);
2776
+ this.ey = arange(ey, 0n, max);
2777
+ this.ez = arange(ez, 1n, max);
2778
+ this.et = arange(et, 0n, max);
2779
+ Object.freeze(this);
2780
+ }
2781
+ static fromAffine(p) {
2782
+ return new Point(p.x, p.y, 1n, M(p.x * p.y));
2783
+ }
2784
+ /** RFC8032 5.1.3: Uint8Array to Point. */
2785
+ static fromBytes(hex, zip215 = false) {
2786
+ const d = _d;
2787
+ const normed = u8fr(abytes(hex, L));
2788
+ const lastByte = hex[31];
2789
+ normed[31] = lastByte & -129;
2790
+ const y = bytesToNumLE(normed);
2791
+ const max = zip215 ? B256 : P;
2792
+ arange(y, 0n, max);
2793
+ const y2 = M(y * y);
2794
+ const u = M(y2 - 1n);
2795
+ const v = M(d * y2 + 1n);
2796
+ let { isValid, value: x } = uvRatio(u, v);
2797
+ if (!isValid) err("bad point: y not sqrt");
2798
+ const isXOdd = (x & 1n) === 1n;
2799
+ const isLastByteOdd = (lastByte & 128) !== 0;
2800
+ if (!zip215 && x === 0n && isLastByteOdd) err("bad point: x==0, isLastByteOdd");
2801
+ if (isLastByteOdd !== isXOdd) x = M(-x);
2802
+ return new Point(x, y, 1n, M(x * y));
2803
+ }
2804
+ /** Checks if the point is valid and on-curve. */
2805
+ assertValidity() {
2806
+ const a = _a;
2807
+ const d = _d;
2808
+ const p = this;
2809
+ if (p.is0()) throw new Error("bad point: ZERO");
2810
+ const { ex: X, ey: Y, ez: Z, et: T } = p;
2811
+ const X2 = M(X * X);
2812
+ const Y2 = M(Y * Y);
2813
+ const Z2 = M(Z * Z);
2814
+ const Z4 = M(Z2 * Z2);
2815
+ const aX2 = M(X2 * a);
2816
+ const left = M(Z2 * M(aX2 + Y2));
2817
+ const right = M(Z4 + M(d * M(X2 * Y2)));
2818
+ if (left !== right) throw new Error("bad point: equation left != right (1)");
2819
+ const XY = M(X * Y);
2820
+ const ZT = M(Z * T);
2821
+ if (XY !== ZT) throw new Error("bad point: equation left != right (2)");
2822
+ return this;
2823
+ }
2824
+ /** Equality check: compare points P&Q. */
2825
+ equals(other) {
2826
+ const { ex: X1, ey: Y1, ez: Z1 } = this;
2827
+ const { ex: X2, ey: Y2, ez: Z2 } = apoint(other);
2828
+ const X1Z2 = M(X1 * Z2);
2829
+ const X2Z1 = M(X2 * Z1);
2830
+ const Y1Z2 = M(Y1 * Z2);
2831
+ const Y2Z1 = M(Y2 * Z1);
2832
+ return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;
2833
+ }
2834
+ is0() {
2835
+ return this.equals(I);
2836
+ }
2837
+ /** Flip point over y coordinate. */
2838
+ negate() {
2839
+ return new Point(M(-this.ex), this.ey, this.ez, M(-this.et));
2840
+ }
2841
+ /** Point doubling. Complete formula. Cost: `4M + 4S + 1*a + 6add + 1*2`. */
2842
+ double() {
2843
+ const { ex: X1, ey: Y1, ez: Z1 } = this;
2844
+ const a = _a;
2845
+ const A = M(X1 * X1);
2846
+ const B = M(Y1 * Y1);
2847
+ const C$1 = M(2n * M(Z1 * Z1));
2848
+ const D = M(a * A);
2849
+ const x1y1 = X1 + Y1;
2850
+ const E = M(M(x1y1 * x1y1) - A - B);
2851
+ const G$1 = D + B;
2852
+ const F = G$1 - C$1;
2853
+ const H = D - B;
2854
+ const X3 = M(E * F);
2855
+ const Y3 = M(G$1 * H);
2856
+ const T3 = M(E * H);
2857
+ const Z3 = M(F * G$1);
2858
+ return new Point(X3, Y3, Z3, T3);
2859
+ }
2860
+ /** Point addition. Complete formula. Cost: `8M + 1*k + 8add + 1*2`. */
2861
+ add(other) {
2862
+ const { ex: X1, ey: Y1, ez: Z1, et: T1 } = this;
2863
+ const { ex: X2, ey: Y2, ez: Z2, et: T2 } = apoint(other);
2864
+ const a = _a;
2865
+ const d = _d;
2866
+ const A = M(X1 * X2);
2867
+ const B = M(Y1 * Y2);
2868
+ const C$1 = M(T1 * d * T2);
2869
+ const D = M(Z1 * Z2);
2870
+ const E = M((X1 + Y1) * (X2 + Y2) - A - B);
2871
+ const F = M(D - C$1);
2872
+ const G$1 = M(D + C$1);
2873
+ const H = M(B - a * A);
2874
+ const X3 = M(E * F);
2875
+ const Y3 = M(G$1 * H);
2876
+ const T3 = M(E * H);
2877
+ const Z3 = M(F * G$1);
2878
+ return new Point(X3, Y3, Z3, T3);
2879
+ }
2880
+ /**
2881
+ * Point-by-scalar multiplication. Scalar must be in range 1 <= n < CURVE.n.
2882
+ * Uses {@link wNAF} for base point.
2883
+ * Uses fake point to mitigate side-channel leakage.
2884
+ * @param n scalar by which point is multiplied
2885
+ * @param safe safe mode guards against timing attacks; unsafe mode is faster
2886
+ */
2887
+ multiply(n, safe = true) {
2888
+ if (!safe && (n === 0n || this.is0())) return I;
2889
+ arange(n, 1n, N);
2890
+ if (n === 1n) return this;
2891
+ if (this.equals(G)) return wNAF(n).p;
2892
+ let p = I;
2893
+ let f = G;
2894
+ for (let d = this; n > 0n; d = d.double(), n >>= 1n) if (n & 1n) p = p.add(d);
2895
+ else if (safe) f = f.add(d);
2896
+ return p;
2897
+ }
2898
+ /** Convert point to 2d xy affine point. (X, Y, Z) ∋ (x=X/Z, y=Y/Z) */
2899
+ toAffine() {
2900
+ const { ex: x, ey: y, ez: z } = this;
2901
+ if (this.equals(I)) return {
2902
+ x: 0n,
2903
+ y: 1n
2904
+ };
2905
+ const iz = invert(z, P);
2906
+ if (M(z * iz) !== 1n) err("invalid inverse");
2907
+ return {
2908
+ x: M(x * iz),
2909
+ y: M(y * iz)
2910
+ };
2911
+ }
2912
+ toBytes() {
2913
+ const { x, y } = this.assertValidity().toAffine();
2914
+ const b = numTo32bLE(y);
2915
+ b[31] |= x & 1n ? 128 : 0;
2916
+ return b;
2917
+ }
2918
+ toHex() {
2919
+ return bytesToHex$1(this.toBytes());
2920
+ }
2921
+ clearCofactor() {
2922
+ return this.multiply(big(h), false);
2923
+ }
2924
+ isSmallOrder() {
2925
+ return this.clearCofactor().is0();
2926
+ }
2927
+ isTorsionFree() {
2928
+ let p = this.multiply(N / 2n, false).double();
2929
+ if (N % 2n) p = p.add(this);
2930
+ return p.is0();
2931
+ }
2932
+ static fromHex(hex, zip215) {
2933
+ return Point.fromBytes(toU8(hex), zip215);
2934
+ }
2935
+ get x() {
2936
+ return this.toAffine().x;
2937
+ }
2938
+ get y() {
2939
+ return this.toAffine().y;
2940
+ }
2941
+ toRawBytes() {
2942
+ return this.toBytes();
2943
+ }
2944
+ };
2945
+ G = new Point(Gx, Gy, 1n, M(Gx * Gy));
2946
+ I = new Point(0n, 1n, 1n, 0n);
2947
+ Point.BASE = G;
2948
+ Point.ZERO = I;
2949
+ numTo32bLE = (num) => hexToBytes(padh(arange(num, 0n, B256), L2)).reverse();
2950
+ bytesToNumLE = (b) => big("0x" + bytesToHex$1(u8fr(abytes(b)).reverse()));
2951
+ pow2 = (x, power) => {
2952
+ let r = x;
2953
+ while (power-- > 0n) {
2954
+ r *= r;
2955
+ r %= P;
2956
+ }
2957
+ return r;
2958
+ };
2959
+ pow_2_252_3 = (x) => {
2960
+ const x2 = x * x % P;
2961
+ const b2 = x2 * x % P;
2962
+ const b4 = pow2(b2, 2n) * b2 % P;
2963
+ const b5 = pow2(b4, 1n) * x % P;
2964
+ const b10 = pow2(b5, 5n) * b5 % P;
2965
+ const b20 = pow2(b10, 10n) * b10 % P;
2966
+ const b40 = pow2(b20, 20n) * b20 % P;
2967
+ const b80 = pow2(b40, 40n) * b40 % P;
2968
+ const b160 = pow2(b80, 80n) * b80 % P;
2969
+ const b240 = pow2(b160, 80n) * b80 % P;
2970
+ const b250 = pow2(b240, 10n) * b10 % P;
2971
+ const pow_p_5_8 = pow2(b250, 2n) * x % P;
2972
+ return {
2973
+ pow_p_5_8,
2974
+ b2
2975
+ };
2976
+ };
2977
+ RM1 = 19681161376707505956807079304988542015446066515923890162744021073123829784752n;
2978
+ uvRatio = (u, v) => {
2979
+ const v3 = M(v * v * v);
2980
+ const v7 = M(v3 * v3 * v);
2981
+ const pow = pow_2_252_3(u * v7).pow_p_5_8;
2982
+ let x = M(u * v3 * pow);
2983
+ const vx2 = M(v * x * x);
2984
+ const root1 = x;
2985
+ const root2 = M(x * RM1);
2986
+ const useRoot1 = vx2 === u;
2987
+ const useRoot2 = vx2 === M(-u);
2988
+ const noRoot = vx2 === M(-u * RM1);
2989
+ if (useRoot1) x = root1;
2990
+ if (useRoot2 || noRoot) x = root2;
2991
+ if ((M(x) & 1n) === 1n) x = M(-x);
2992
+ return {
2993
+ isValid: useRoot1 || useRoot2,
2994
+ value: x
2995
+ };
2996
+ };
2997
+ modL_LE = (hash) => modN(bytesToNumLE(hash));
2998
+ sha512a = (...m) => etc.sha512Async(...m);
2999
+ sha512s = (...m) => callHash("sha512Sync")(...m);
3000
+ hash2extK = (hashed) => {
3001
+ const head = hashed.slice(0, L);
3002
+ head[0] &= 248;
3003
+ head[31] &= 127;
3004
+ head[31] |= 64;
3005
+ const prefix = hashed.slice(L, L2);
3006
+ const scalar = modL_LE(head);
3007
+ const point = G.multiply(scalar);
3008
+ const pointBytes = point.toBytes();
3009
+ return {
3010
+ head,
3011
+ prefix,
3012
+ scalar,
3013
+ point,
3014
+ pointBytes
3015
+ };
3016
+ };
3017
+ getExtendedPublicKeyAsync = (priv) => sha512a(toU8(priv, L)).then(hash2extK);
3018
+ getExtendedPublicKey = (priv) => hash2extK(sha512s(toU8(priv, L)));
3019
+ getPublicKeyAsync = (priv) => getExtendedPublicKeyAsync(priv).then((p) => p.pointBytes);
3020
+ etc = {
3021
+ sha512Async: async (...messages) => {
3022
+ const s = subtle();
3023
+ const m = concatBytes(...messages);
3024
+ return u8n(await s.digest("SHA-512", m.buffer));
3025
+ },
3026
+ sha512Sync: void 0,
3027
+ bytesToHex: bytesToHex$1,
3028
+ hexToBytes,
3029
+ concatBytes,
3030
+ mod: M,
3031
+ invert,
3032
+ randomBytes
3033
+ };
3034
+ utils = {
3035
+ getExtendedPublicKeyAsync,
3036
+ getExtendedPublicKey,
3037
+ randomPrivateKey: () => randomBytes(L),
3038
+ precompute: (w = 8, p = G) => {
3039
+ p.multiply(3n);
3040
+ return p;
3041
+ }
3042
+ };
3043
+ W = 8;
3044
+ scalarBits = 256;
3045
+ pwindows = Math.ceil(scalarBits / W) + 1;
3046
+ pwindowSize = 2 ** (W - 1);
3047
+ precompute = () => {
3048
+ const points = [];
3049
+ let p = G;
3050
+ let b = p;
3051
+ for (let w = 0; w < pwindows; w++) {
3052
+ b = p;
3053
+ points.push(b);
3054
+ for (let i = 1; i < pwindowSize; i++) {
3055
+ b = b.add(p);
3056
+ points.push(b);
3057
+ }
3058
+ p = b.double();
3059
+ }
3060
+ return points;
3061
+ };
3062
+ Gpows = void 0;
3063
+ ctneg = (cnd, p) => {
3064
+ const n = p.negate();
3065
+ return cnd ? n : p;
3066
+ };
3067
+ wNAF = (n) => {
3068
+ const comp = Gpows || (Gpows = precompute());
3069
+ let p = I;
3070
+ let f = G;
3071
+ const pow_2_w = 2 ** W;
3072
+ const maxNum = pow_2_w;
3073
+ const mask = big(pow_2_w - 1);
3074
+ const shiftBy = big(W);
3075
+ for (let w = 0; w < pwindows; w++) {
3076
+ let wbits = Number(n & mask);
3077
+ n >>= shiftBy;
3078
+ if (wbits > pwindowSize) {
3079
+ wbits -= maxNum;
3080
+ n += 1n;
3081
+ }
3082
+ const off = w * pwindowSize;
3083
+ const offF = off;
3084
+ const offP = off + Math.abs(wbits) - 1;
3085
+ const isEven = w % 2 !== 0;
3086
+ const isNeg = wbits < 0;
3087
+ if (wbits === 0) f = f.add(ctneg(isEven, comp[offF]));
3088
+ else p = p.add(ctneg(isNeg, comp[offP]));
3089
+ }
3090
+ return {
3091
+ p,
3092
+ f
3093
+ };
3094
+ };
3095
+ }) });
3096
+
3097
+ //#endregion
3098
+ //#region src/core/nearCrypto.ts
3099
+ /**
3100
+ * Ensure a key string has the NEAR Ed25519 prefix (`ed25519:`).
3101
+ *
3102
+ * - Accepts either `ed25519:<base58>` or a bare `<base58>` string.
3103
+ * - Canonicalizes `ED25519:` → `ed25519:`.
3104
+ * - If a different prefix is present (e.g. `secp256k1:`), returns the input unchanged.
3105
+ */
3106
+ function ensureEd25519Prefix(value) {
3107
+ const raw = String(value || "").trim();
3108
+ if (!raw) return "";
3109
+ if (/^[a-z0-9_]+:/i.test(raw)) {
3110
+ if (/^ed25519:/i.test(raw)) return `${NEAR_ED25519_KEY_PREFIX}${raw.replace(/^ed25519:/i, "")}`;
3111
+ return raw;
3112
+ }
3113
+ return `${NEAR_ED25519_KEY_PREFIX}${raw}`;
3114
+ }
3115
+ /**
3116
+ * Creates a NEAR-compatible Ed25519 keypair formatted as strings:
3117
+ * - publicKey: 'ed25519:' + base58(pub)
3118
+ * - privateKey: 'ed25519:' + base58(seed(32) | pub(32))
3119
+ */
3120
+ async function createNearKeypair() {
3121
+ const seed = utils.randomPrivateKey();
3122
+ const pub = await getPublicKeyAsync(seed);
3123
+ const secret = new Uint8Array(64);
3124
+ secret.set(seed, 0);
3125
+ secret.set(pub, 32);
3126
+ const publicKey = ensureEd25519Prefix(esm_default.encode(pub));
3127
+ const privateKey = ensureEd25519Prefix(esm_default.encode(secret));
3128
+ return {
3129
+ publicKey,
3130
+ privateKey
3131
+ };
3132
+ }
3133
+ var NEAR_ED25519_KEY_PREFIX;
3134
+ var init_nearCrypto = __esm({ "src/core/nearCrypto.ts": (() => {
3135
+ init_ed25519();
3136
+ NEAR_ED25519_KEY_PREFIX = "ed25519:";
3137
+ }) });
3138
+
2669
3139
  //#endregion
2670
3140
  //#region src/core/WebAuthnManager/SignerWorkerManager/handlers/validation.ts
2671
3141
  init_credentialsHelpers();
2672
3142
  init_validation();
3143
+ init_nearCrypto();
2673
3144
  function validateTransactionContextMaybe(input) {
2674
3145
  if (input == null) return void 0;
2675
3146
  if (!isObject(input)) throw new Error("Invalid transactionContext: expected object");
@@ -2730,9 +3201,6 @@ function parseAndValidateRegistrationCredentialConfirmationPayload(payload) {
2730
3201
  error: normalizedError
2731
3202
  };
2732
3203
  }
2733
- const ensureEd25519Prefix = (value) => {
2734
- return value.startsWith("ed25519:") ? value : `ed25519:${value}`;
2735
- };
2736
3204
  const toPublicKeyString = (pk) => {
2737
3205
  if (typeof pk === "string") return pk;
2738
3206
  return ensureEd25519Prefix(base58Encode(pk.keyData));
@@ -3299,14 +3767,14 @@ const HANDLERS = {
3299
3767
  });
3300
3768
  },
3301
3769
  [SecureConfirmationType.SIGN_TRANSACTION]: async ({ ctx, request, worker, confirmationConfig, transactionSummary }) => {
3302
- const { handleTransactionSigningFlow } = await importFlow("transactions", () => import("./transactions-BalIhtJ9.js"));
3770
+ const { handleTransactionSigningFlow } = await importFlow("transactions", () => import("./transactions-DfdwDQCn.js"));
3303
3771
  await handleTransactionSigningFlow(ctx, request, worker, {
3304
3772
  confirmationConfig,
3305
3773
  transactionSummary
3306
3774
  });
3307
3775
  },
3308
3776
  [SecureConfirmationType.SIGN_NEP413_MESSAGE]: async ({ ctx, request, worker, confirmationConfig, transactionSummary }) => {
3309
- const { handleTransactionSigningFlow } = await importFlow("transactions", () => import("./transactions-BalIhtJ9.js"));
3777
+ const { handleTransactionSigningFlow } = await importFlow("transactions", () => import("./transactions-DfdwDQCn.js"));
3310
3778
  await handleTransactionSigningFlow(ctx, request, worker, {
3311
3779
  confirmationConfig,
3312
3780
  transactionSummary
@@ -8408,504 +8876,6 @@ var ChainsigAddressManager = class {
8408
8876
  };
8409
8877
  const chainsigAddressManager = new ChainsigAddressManager();
8410
8878
 
8411
- //#endregion
8412
- //#region ../node_modules/.pnpm/@noble+ed25519@2.3.0/node_modules/@noble/ed25519/index.js
8413
- /*! noble-ed25519 - MIT License (c) 2019 Paul Miller (paulmillr.com) */
8414
- /**
8415
- * 4KB JS implementation of ed25519 EdDSA signatures.
8416
- * Compliant with RFC8032, FIPS 186-5 & ZIP215.
8417
- * @module
8418
- * @example
8419
- * ```js
8420
- import * as ed from '@noble/ed25519';
8421
- (async () => {
8422
- const privKey = ed.utils.randomPrivateKey();
8423
- const message = Uint8Array.from([0xab, 0xbc, 0xcd, 0xde]);
8424
- const pubKey = await ed.getPublicKeyAsync(privKey); // Sync methods are also present
8425
- const signature = await ed.signAsync(message, privKey);
8426
- const isValid = await ed.verifyAsync(signature, message, pubKey);
8427
- })();
8428
- ```
8429
- */
8430
- /**
8431
- * Curve params. ed25519 is twisted edwards curve. Equation is −x² + y² = -a + dx²y².
8432
- * * P = `2n**255n - 19n` // field over which calculations are done
8433
- * * N = `2n**252n + 27742317777372353535851937790883648493n` // group order, amount of curve points
8434
- * * h = 8 // cofactor
8435
- * * a = `Fp.create(BigInt(-1))` // equation param
8436
- * * d = -121665/121666 a.k.a. `Fp.neg(121665 * Fp.inv(121666))` // equation param
8437
- * * Gx, Gy are coordinates of Generator / base point
8438
- */
8439
- const ed25519_CURVE = {
8440
- p: 57896044618658097711785492504343953926634992332820282019728792003956564819949n,
8441
- n: 7237005577332262213973186563042994240857116359379907606001950938285454250989n,
8442
- h: 8n,
8443
- a: 57896044618658097711785492504343953926634992332820282019728792003956564819948n,
8444
- d: 37095705934669439343138083508754565189542113879843219016388785533085940283555n,
8445
- Gx: 15112221349535400772501151409588531511454012693041857206046113283949847762202n,
8446
- Gy: 46316835694926478169428394003475163141307993866256225615783033603165251855960n
8447
- };
8448
- const { p: P, n: N, Gx, Gy, a: _a, d: _d } = ed25519_CURVE;
8449
- const h = 8n;
8450
- const L = 32;
8451
- const L2 = 64;
8452
- const err = (m = "") => {
8453
- throw new Error(m);
8454
- };
8455
- const isBig = (n) => typeof n === "bigint";
8456
- const isStr = (s) => typeof s === "string";
8457
- const isBytes = (a) => a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array";
8458
- /** assert is Uint8Array (of specific length) */
8459
- const abytes = (a, l) => !isBytes(a) || typeof l === "number" && l > 0 && a.length !== l ? err("Uint8Array expected") : a;
8460
- /** create Uint8Array */
8461
- const u8n = (len) => new Uint8Array(len);
8462
- const u8fr = (buf) => Uint8Array.from(buf);
8463
- const padh = (n, pad) => n.toString(16).padStart(pad, "0");
8464
- const bytesToHex$1 = (b) => Array.from(abytes(b)).map((e) => padh(e, 2)).join("");
8465
- const C = {
8466
- _0: 48,
8467
- _9: 57,
8468
- A: 65,
8469
- F: 70,
8470
- a: 97,
8471
- f: 102
8472
- };
8473
- const _ch = (ch) => {
8474
- if (ch >= C._0 && ch <= C._9) return ch - C._0;
8475
- if (ch >= C.A && ch <= C.F) return ch - (C.A - 10);
8476
- if (ch >= C.a && ch <= C.f) return ch - (C.a - 10);
8477
- };
8478
- const hexToBytes = (hex) => {
8479
- const e = "hex invalid";
8480
- if (!isStr(hex)) return err(e);
8481
- const hl = hex.length;
8482
- const al = hl / 2;
8483
- if (hl % 2) return err(e);
8484
- const array = u8n(al);
8485
- for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {
8486
- const n1 = _ch(hex.charCodeAt(hi));
8487
- const n2 = _ch(hex.charCodeAt(hi + 1));
8488
- if (n1 === void 0 || n2 === void 0) return err(e);
8489
- array[ai] = n1 * 16 + n2;
8490
- }
8491
- return array;
8492
- };
8493
- /** normalize hex or ui8a to ui8a */
8494
- const toU8 = (a, len) => abytes(isStr(a) ? hexToBytes(a) : u8fr(abytes(a)), len);
8495
- const cr = () => globalThis?.crypto;
8496
- const subtle = () => cr()?.subtle ?? err("crypto.subtle must be defined");
8497
- const concatBytes = (...arrs) => {
8498
- const r = u8n(arrs.reduce((sum, a) => sum + abytes(a).length, 0));
8499
- let pad = 0;
8500
- arrs.forEach((a) => {
8501
- r.set(a, pad);
8502
- pad += a.length;
8503
- });
8504
- return r;
8505
- };
8506
- /** WebCrypto OS-level CSPRNG (random number generator). Will throw when not available. */
8507
- const randomBytes = (len = L) => {
8508
- const c = cr();
8509
- return c.getRandomValues(u8n(len));
8510
- };
8511
- const big = BigInt;
8512
- const arange = (n, min, max, msg = "bad number: out of range") => isBig(n) && min <= n && n < max ? n : err(msg);
8513
- /** modular division */
8514
- const M = (a, b = P) => {
8515
- const r = a % b;
8516
- return r >= 0n ? r : b + r;
8517
- };
8518
- const modN = (a) => M(a, N);
8519
- /** Modular inversion using eucledian GCD (non-CT). No negative exponent for now. */
8520
- const invert = (num, md) => {
8521
- if (num === 0n || md <= 0n) err("no inverse n=" + num + " mod=" + md);
8522
- let a = M(num, md), b = md, x = 0n, y = 1n, u = 1n, v = 0n;
8523
- while (a !== 0n) {
8524
- const q = b / a, r = b % a;
8525
- const m = x - u * q, n = y - v * q;
8526
- b = a, a = r, x = u, y = v, u = m, v = n;
8527
- }
8528
- return b === 1n ? M(x, md) : err("no inverse");
8529
- };
8530
- const callHash = (name) => {
8531
- const fn = etc[name];
8532
- if (typeof fn !== "function") err("hashes." + name + " not set");
8533
- return fn;
8534
- };
8535
- const apoint = (p) => p instanceof Point ? p : err("Point expected");
8536
- const B256 = 2n ** 256n;
8537
- /** Point in XYZT extended coordinates. */
8538
- var Point = class Point {
8539
- static BASE;
8540
- static ZERO;
8541
- ex;
8542
- ey;
8543
- ez;
8544
- et;
8545
- constructor(ex, ey, ez, et) {
8546
- const max = B256;
8547
- this.ex = arange(ex, 0n, max);
8548
- this.ey = arange(ey, 0n, max);
8549
- this.ez = arange(ez, 1n, max);
8550
- this.et = arange(et, 0n, max);
8551
- Object.freeze(this);
8552
- }
8553
- static fromAffine(p) {
8554
- return new Point(p.x, p.y, 1n, M(p.x * p.y));
8555
- }
8556
- /** RFC8032 5.1.3: Uint8Array to Point. */
8557
- static fromBytes(hex, zip215 = false) {
8558
- const d = _d;
8559
- const normed = u8fr(abytes(hex, L));
8560
- const lastByte = hex[31];
8561
- normed[31] = lastByte & -129;
8562
- const y = bytesToNumLE(normed);
8563
- const max = zip215 ? B256 : P;
8564
- arange(y, 0n, max);
8565
- const y2 = M(y * y);
8566
- const u = M(y2 - 1n);
8567
- const v = M(d * y2 + 1n);
8568
- let { isValid, value: x } = uvRatio(u, v);
8569
- if (!isValid) err("bad point: y not sqrt");
8570
- const isXOdd = (x & 1n) === 1n;
8571
- const isLastByteOdd = (lastByte & 128) !== 0;
8572
- if (!zip215 && x === 0n && isLastByteOdd) err("bad point: x==0, isLastByteOdd");
8573
- if (isLastByteOdd !== isXOdd) x = M(-x);
8574
- return new Point(x, y, 1n, M(x * y));
8575
- }
8576
- /** Checks if the point is valid and on-curve. */
8577
- assertValidity() {
8578
- const a = _a;
8579
- const d = _d;
8580
- const p = this;
8581
- if (p.is0()) throw new Error("bad point: ZERO");
8582
- const { ex: X, ey: Y, ez: Z, et: T } = p;
8583
- const X2 = M(X * X);
8584
- const Y2 = M(Y * Y);
8585
- const Z2 = M(Z * Z);
8586
- const Z4 = M(Z2 * Z2);
8587
- const aX2 = M(X2 * a);
8588
- const left = M(Z2 * M(aX2 + Y2));
8589
- const right = M(Z4 + M(d * M(X2 * Y2)));
8590
- if (left !== right) throw new Error("bad point: equation left != right (1)");
8591
- const XY = M(X * Y);
8592
- const ZT = M(Z * T);
8593
- if (XY !== ZT) throw new Error("bad point: equation left != right (2)");
8594
- return this;
8595
- }
8596
- /** Equality check: compare points P&Q. */
8597
- equals(other) {
8598
- const { ex: X1, ey: Y1, ez: Z1 } = this;
8599
- const { ex: X2, ey: Y2, ez: Z2 } = apoint(other);
8600
- const X1Z2 = M(X1 * Z2);
8601
- const X2Z1 = M(X2 * Z1);
8602
- const Y1Z2 = M(Y1 * Z2);
8603
- const Y2Z1 = M(Y2 * Z1);
8604
- return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;
8605
- }
8606
- is0() {
8607
- return this.equals(I);
8608
- }
8609
- /** Flip point over y coordinate. */
8610
- negate() {
8611
- return new Point(M(-this.ex), this.ey, this.ez, M(-this.et));
8612
- }
8613
- /** Point doubling. Complete formula. Cost: `4M + 4S + 1*a + 6add + 1*2`. */
8614
- double() {
8615
- const { ex: X1, ey: Y1, ez: Z1 } = this;
8616
- const a = _a;
8617
- const A = M(X1 * X1);
8618
- const B = M(Y1 * Y1);
8619
- const C$1 = M(2n * M(Z1 * Z1));
8620
- const D = M(a * A);
8621
- const x1y1 = X1 + Y1;
8622
- const E = M(M(x1y1 * x1y1) - A - B);
8623
- const G$1 = D + B;
8624
- const F = G$1 - C$1;
8625
- const H = D - B;
8626
- const X3 = M(E * F);
8627
- const Y3 = M(G$1 * H);
8628
- const T3 = M(E * H);
8629
- const Z3 = M(F * G$1);
8630
- return new Point(X3, Y3, Z3, T3);
8631
- }
8632
- /** Point addition. Complete formula. Cost: `8M + 1*k + 8add + 1*2`. */
8633
- add(other) {
8634
- const { ex: X1, ey: Y1, ez: Z1, et: T1 } = this;
8635
- const { ex: X2, ey: Y2, ez: Z2, et: T2 } = apoint(other);
8636
- const a = _a;
8637
- const d = _d;
8638
- const A = M(X1 * X2);
8639
- const B = M(Y1 * Y2);
8640
- const C$1 = M(T1 * d * T2);
8641
- const D = M(Z1 * Z2);
8642
- const E = M((X1 + Y1) * (X2 + Y2) - A - B);
8643
- const F = M(D - C$1);
8644
- const G$1 = M(D + C$1);
8645
- const H = M(B - a * A);
8646
- const X3 = M(E * F);
8647
- const Y3 = M(G$1 * H);
8648
- const T3 = M(E * H);
8649
- const Z3 = M(F * G$1);
8650
- return new Point(X3, Y3, Z3, T3);
8651
- }
8652
- /**
8653
- * Point-by-scalar multiplication. Scalar must be in range 1 <= n < CURVE.n.
8654
- * Uses {@link wNAF} for base point.
8655
- * Uses fake point to mitigate side-channel leakage.
8656
- * @param n scalar by which point is multiplied
8657
- * @param safe safe mode guards against timing attacks; unsafe mode is faster
8658
- */
8659
- multiply(n, safe = true) {
8660
- if (!safe && (n === 0n || this.is0())) return I;
8661
- arange(n, 1n, N);
8662
- if (n === 1n) return this;
8663
- if (this.equals(G)) return wNAF(n).p;
8664
- let p = I;
8665
- let f = G;
8666
- for (let d = this; n > 0n; d = d.double(), n >>= 1n) if (n & 1n) p = p.add(d);
8667
- else if (safe) f = f.add(d);
8668
- return p;
8669
- }
8670
- /** Convert point to 2d xy affine point. (X, Y, Z) ∋ (x=X/Z, y=Y/Z) */
8671
- toAffine() {
8672
- const { ex: x, ey: y, ez: z } = this;
8673
- if (this.equals(I)) return {
8674
- x: 0n,
8675
- y: 1n
8676
- };
8677
- const iz = invert(z, P);
8678
- if (M(z * iz) !== 1n) err("invalid inverse");
8679
- return {
8680
- x: M(x * iz),
8681
- y: M(y * iz)
8682
- };
8683
- }
8684
- toBytes() {
8685
- const { x, y } = this.assertValidity().toAffine();
8686
- const b = numTo32bLE(y);
8687
- b[31] |= x & 1n ? 128 : 0;
8688
- return b;
8689
- }
8690
- toHex() {
8691
- return bytesToHex$1(this.toBytes());
8692
- }
8693
- clearCofactor() {
8694
- return this.multiply(big(h), false);
8695
- }
8696
- isSmallOrder() {
8697
- return this.clearCofactor().is0();
8698
- }
8699
- isTorsionFree() {
8700
- let p = this.multiply(N / 2n, false).double();
8701
- if (N % 2n) p = p.add(this);
8702
- return p.is0();
8703
- }
8704
- static fromHex(hex, zip215) {
8705
- return Point.fromBytes(toU8(hex), zip215);
8706
- }
8707
- get x() {
8708
- return this.toAffine().x;
8709
- }
8710
- get y() {
8711
- return this.toAffine().y;
8712
- }
8713
- toRawBytes() {
8714
- return this.toBytes();
8715
- }
8716
- };
8717
- /** Generator / base point */
8718
- const G = new Point(Gx, Gy, 1n, M(Gx * Gy));
8719
- /** Identity / zero point */
8720
- const I = new Point(0n, 1n, 1n, 0n);
8721
- Point.BASE = G;
8722
- Point.ZERO = I;
8723
- const numTo32bLE = (num) => hexToBytes(padh(arange(num, 0n, B256), L2)).reverse();
8724
- const bytesToNumLE = (b) => big("0x" + bytesToHex$1(u8fr(abytes(b)).reverse()));
8725
- const pow2 = (x, power) => {
8726
- let r = x;
8727
- while (power-- > 0n) {
8728
- r *= r;
8729
- r %= P;
8730
- }
8731
- return r;
8732
- };
8733
- const pow_2_252_3 = (x) => {
8734
- const x2 = x * x % P;
8735
- const b2 = x2 * x % P;
8736
- const b4 = pow2(b2, 2n) * b2 % P;
8737
- const b5 = pow2(b4, 1n) * x % P;
8738
- const b10 = pow2(b5, 5n) * b5 % P;
8739
- const b20 = pow2(b10, 10n) * b10 % P;
8740
- const b40 = pow2(b20, 20n) * b20 % P;
8741
- const b80 = pow2(b40, 40n) * b40 % P;
8742
- const b160 = pow2(b80, 80n) * b80 % P;
8743
- const b240 = pow2(b160, 80n) * b80 % P;
8744
- const b250 = pow2(b240, 10n) * b10 % P;
8745
- const pow_p_5_8 = pow2(b250, 2n) * x % P;
8746
- return {
8747
- pow_p_5_8,
8748
- b2
8749
- };
8750
- };
8751
- const RM1 = 19681161376707505956807079304988542015446066515923890162744021073123829784752n;
8752
- const uvRatio = (u, v) => {
8753
- const v3 = M(v * v * v);
8754
- const v7 = M(v3 * v3 * v);
8755
- const pow = pow_2_252_3(u * v7).pow_p_5_8;
8756
- let x = M(u * v3 * pow);
8757
- const vx2 = M(v * x * x);
8758
- const root1 = x;
8759
- const root2 = M(x * RM1);
8760
- const useRoot1 = vx2 === u;
8761
- const useRoot2 = vx2 === M(-u);
8762
- const noRoot = vx2 === M(-u * RM1);
8763
- if (useRoot1) x = root1;
8764
- if (useRoot2 || noRoot) x = root2;
8765
- if ((M(x) & 1n) === 1n) x = M(-x);
8766
- return {
8767
- isValid: useRoot1 || useRoot2,
8768
- value: x
8769
- };
8770
- };
8771
- const modL_LE = (hash) => modN(bytesToNumLE(hash));
8772
- const sha512a = (...m) => etc.sha512Async(...m);
8773
- const sha512s = (...m) => callHash("sha512Sync")(...m);
8774
- const hash2extK = (hashed) => {
8775
- const head = hashed.slice(0, L);
8776
- head[0] &= 248;
8777
- head[31] &= 127;
8778
- head[31] |= 64;
8779
- const prefix = hashed.slice(L, L2);
8780
- const scalar = modL_LE(head);
8781
- const point = G.multiply(scalar);
8782
- const pointBytes = point.toBytes();
8783
- return {
8784
- head,
8785
- prefix,
8786
- scalar,
8787
- point,
8788
- pointBytes
8789
- };
8790
- };
8791
- const getExtendedPublicKeyAsync = (priv) => sha512a(toU8(priv, L)).then(hash2extK);
8792
- const getExtendedPublicKey = (priv) => hash2extK(sha512s(toU8(priv, L)));
8793
- /** Creates 32-byte ed25519 public key from 32-byte private key. Async. */
8794
- const getPublicKeyAsync = (priv) => getExtendedPublicKeyAsync(priv).then((p) => p.pointBytes);
8795
- /** Math, hex, byte helpers. Not in `utils` because utils share API with noble-curves. */
8796
- const etc = {
8797
- sha512Async: async (...messages) => {
8798
- const s = subtle();
8799
- const m = concatBytes(...messages);
8800
- return u8n(await s.digest("SHA-512", m.buffer));
8801
- },
8802
- sha512Sync: void 0,
8803
- bytesToHex: bytesToHex$1,
8804
- hexToBytes,
8805
- concatBytes,
8806
- mod: M,
8807
- invert,
8808
- randomBytes
8809
- };
8810
- /** ed25519-specific key utilities. */
8811
- const utils = {
8812
- getExtendedPublicKeyAsync,
8813
- getExtendedPublicKey,
8814
- randomPrivateKey: () => randomBytes(L),
8815
- precompute: (w = 8, p = G) => {
8816
- p.multiply(3n);
8817
- return p;
8818
- }
8819
- };
8820
- const W = 8;
8821
- const scalarBits = 256;
8822
- const pwindows = Math.ceil(scalarBits / W) + 1;
8823
- const pwindowSize = 2 ** (W - 1);
8824
- const precompute = () => {
8825
- const points = [];
8826
- let p = G;
8827
- let b = p;
8828
- for (let w = 0; w < pwindows; w++) {
8829
- b = p;
8830
- points.push(b);
8831
- for (let i = 1; i < pwindowSize; i++) {
8832
- b = b.add(p);
8833
- points.push(b);
8834
- }
8835
- p = b.double();
8836
- }
8837
- return points;
8838
- };
8839
- let Gpows = void 0;
8840
- const ctneg = (cnd, p) => {
8841
- const n = p.negate();
8842
- return cnd ? n : p;
8843
- };
8844
- /**
8845
- * Precomputes give 12x faster getPublicKey(), 10x sign(), 2x verify() by
8846
- * caching multiples of G (base point). Cache is stored in 32MB of RAM.
8847
- * Any time `G.multiply` is done, precomputes are used.
8848
- * Not used for getSharedSecret, which instead multiplies random pubkey `P.multiply`.
8849
- *
8850
- * w-ary non-adjacent form (wNAF) precomputation method is 10% slower than windowed method,
8851
- * but takes 2x less RAM. RAM reduction is possible by utilizing `.subtract`.
8852
- *
8853
- * !! Precomputes can be disabled by commenting-out call of the wNAF() inside Point#multiply().
8854
- */
8855
- const wNAF = (n) => {
8856
- const comp = Gpows || (Gpows = precompute());
8857
- let p = I;
8858
- let f = G;
8859
- const pow_2_w = 2 ** W;
8860
- const maxNum = pow_2_w;
8861
- const mask = big(pow_2_w - 1);
8862
- const shiftBy = big(W);
8863
- for (let w = 0; w < pwindows; w++) {
8864
- let wbits = Number(n & mask);
8865
- n >>= shiftBy;
8866
- if (wbits > pwindowSize) {
8867
- wbits -= maxNum;
8868
- n += 1n;
8869
- }
8870
- const off = w * pwindowSize;
8871
- const offF = off;
8872
- const offP = off + Math.abs(wbits) - 1;
8873
- const isEven = w % 2 !== 0;
8874
- const isNeg = wbits < 0;
8875
- if (wbits === 0) f = f.add(ctneg(isEven, comp[offF]));
8876
- else p = p.add(ctneg(isNeg, comp[offP]));
8877
- }
8878
- return {
8879
- p,
8880
- f
8881
- };
8882
- };
8883
-
8884
- //#endregion
8885
- //#region src/core/nearCrypto.ts
8886
- const NEAR_KEY_PREFIX = "ed25519:";
8887
- function ensurePrefix(str) {
8888
- return str.startsWith(NEAR_KEY_PREFIX) ? str : `${NEAR_KEY_PREFIX}${str}`;
8889
- }
8890
- /**
8891
- * Creates a NEAR-compatible Ed25519 keypair formatted as strings:
8892
- * - publicKey: 'ed25519:' + base58(pub)
8893
- * - privateKey: 'ed25519:' + base58(seed(32) | pub(32))
8894
- */
8895
- async function createNearKeypair() {
8896
- const seed = utils.randomPrivateKey();
8897
- const pub = await getPublicKeyAsync(seed);
8898
- const secret = new Uint8Array(64);
8899
- secret.set(seed, 0);
8900
- secret.set(pub, 32);
8901
- const publicKey = ensurePrefix(esm_default.encode(pub));
8902
- const privateKey = ensurePrefix(esm_default.encode(secret));
8903
- return {
8904
- publicKey,
8905
- privateKey
8906
- };
8907
- }
8908
-
8909
8879
  //#endregion
8910
8880
  //#region src/core/types/linkDevice.ts
8911
8881
  var DeviceLinkingError = class extends Error {
@@ -8927,6 +8897,7 @@ let DeviceLinkingErrorCode = /* @__PURE__ */ function(DeviceLinkingErrorCode$1)
8927
8897
 
8928
8898
  //#endregion
8929
8899
  //#region src/core/TatchiPasskey/linkDevice.ts
8900
+ init_nearCrypto();
8930
8901
  init_IndexedDBManager();
8931
8902
  init_actions();
8932
8903
  init_rpcCalls();
@@ -9625,6 +9596,7 @@ init_validation$1();
9625
9596
  init_login();
9626
9597
  init_sdkSentEvents();
9627
9598
  init_rpcCalls();
9599
+ init_nearCrypto();
9628
9600
  /**
9629
9601
  * Device1 (original device): Link device using pre-scanned QR data
9630
9602
  */
@@ -9642,8 +9614,8 @@ async function linkDeviceWithScannedQRData(context, qrData, options) {
9642
9614
  if (!device1LoginState.isLoggedIn || !device1LoginState.nearAccountId) throw new Error("Device1 must be logged in to authorize device linking");
9643
9615
  const device1AccountId = device1LoginState.nearAccountId;
9644
9616
  const fundingAmount = options.fundingAmount;
9645
- const device2PublicKey = qrData.device2PublicKey;
9646
- if (!device2PublicKey.startsWith("ed25519:")) throw new Error("Invalid device public key format");
9617
+ const device2PublicKey = ensureEd25519Prefix(qrData.device2PublicKey);
9618
+ if (!device2PublicKey || !/^ed25519:/i.test(device2PublicKey)) throw new Error("Invalid device public key format");
9647
9619
  onEvent?.({
9648
9620
  step: 3,
9649
9621
  phase: DeviceLinkingPhase.STEP_3_AUTHORIZATION,
@@ -9684,7 +9656,7 @@ async function linkDeviceWithScannedQRData(context, qrData, options) {
9684
9656
  });
9685
9657
  const result = {
9686
9658
  success: true,
9687
- device2PublicKey: qrData.device2PublicKey,
9659
+ device2PublicKey,
9688
9660
  transactionId: addKeyTxResult?.transaction?.hash || storeDeviceLinkingTxResult?.transaction?.hash || "unknown",
9689
9661
  fundingAmount,
9690
9662
  linkedToAccount: device1AccountId,
@@ -10037,6 +10009,28 @@ var init_emailRecoveryPendingStore = __esm({ "src/core/EmailRecovery/emailRecove
10037
10009
 
10038
10010
  //#endregion
10039
10011
  //#region src/core/EmailRecovery/index.ts
10012
+ function getTxSuccessValueBase64(outcome) {
10013
+ const status = outcome.status;
10014
+ if (!status || typeof status !== "object") return null;
10015
+ if (!("SuccessValue" in status)) return null;
10016
+ const value = status.SuccessValue;
10017
+ return typeof value === "string" && value.length > 0 ? value : null;
10018
+ }
10019
+ function parseLinkDeviceRegisterUserResponse(outcome) {
10020
+ try {
10021
+ const successValueB64 = getTxSuccessValueBase64(outcome);
10022
+ if (!successValueB64) return null;
10023
+ const bytes = base64Decode(successValueB64);
10024
+ const text = new TextDecoder().decode(bytes);
10025
+ if (!text.trim()) return null;
10026
+ const parsed = JSON.parse(text);
10027
+ if (!parsed || typeof parsed !== "object") return null;
10028
+ const candidate = parsed;
10029
+ return typeof candidate.verified === "boolean" ? candidate : null;
10030
+ } catch {
10031
+ return null;
10032
+ }
10033
+ }
10040
10034
  async function hashRecoveryEmails(emails, accountId) {
10041
10035
  const encoder = new TextEncoder();
10042
10036
  const salt = (accountId || "").trim().toLowerCase();
@@ -10108,6 +10102,27 @@ var init_EmailRecovery = __esm({ "src/core/EmailRecovery/index.ts": (() => {
10108
10102
  };
10109
10103
  }) });
10110
10104
 
10105
+ //#endregion
10106
+ //#region src/core/types/emailRecovery.ts
10107
+ var EmailRecoveryErrorCode, EmailRecoveryError;
10108
+ var init_emailRecovery$1 = __esm({ "src/core/types/emailRecovery.ts": (() => {
10109
+ EmailRecoveryErrorCode = /* @__PURE__ */ function(EmailRecoveryErrorCode$1) {
10110
+ EmailRecoveryErrorCode$1["REGISTRATION_NOT_VERIFIED"] = "EMAIL_RECOVERY_REGISTRATION_NOT_VERIFIED";
10111
+ EmailRecoveryErrorCode$1["VRF_CHALLENGE_EXPIRED"] = "EMAIL_RECOVERY_VRF_CHALLENGE_EXPIRED";
10112
+ return EmailRecoveryErrorCode$1;
10113
+ }({});
10114
+ EmailRecoveryError = class extends Error {
10115
+ code;
10116
+ context;
10117
+ constructor(message, code, context) {
10118
+ super(message);
10119
+ this.name = "EmailRecoveryError";
10120
+ this.code = code;
10121
+ this.context = context;
10122
+ }
10123
+ };
10124
+ }) });
10125
+
10111
10126
  //#endregion
10112
10127
  //#region src/core/TatchiPasskey/emailRecovery.ts
10113
10128
  var emailRecovery_exports = {};
@@ -10122,16 +10137,12 @@ function getEmailRecoveryConfig(configs) {
10122
10137
  const maxPollingDurationMs = Number(relayerEmailCfg.maxPollingDurationMs);
10123
10138
  const pendingTtlMs = Number(relayerEmailCfg.pendingTtlMs);
10124
10139
  const mailtoAddress = String(relayerEmailCfg.mailtoAddress);
10125
- const dkimVerifierAccountId = String(relayerEmailCfg.dkimVerifierAccountId);
10126
- const verificationViewMethod = String(relayerEmailCfg.verificationViewMethod);
10127
10140
  return {
10128
10141
  minBalanceYocto,
10129
10142
  pollingIntervalMs,
10130
10143
  maxPollingDurationMs,
10131
10144
  pendingTtlMs,
10132
- mailtoAddress,
10133
- dkimVerifierAccountId,
10134
- verificationViewMethod
10145
+ mailtoAddress
10135
10146
  };
10136
10147
  }
10137
10148
  function generateEmailRecoveryRequestId() {
@@ -10147,6 +10158,7 @@ var EmailRecoveryFlow;
10147
10158
  var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (() => {
10148
10159
  init_IndexedDBManager();
10149
10160
  init_validation$1();
10161
+ init_errors();
10150
10162
  init_accountIds();
10151
10163
  init_sdkSentEvents();
10152
10164
  init_vrf_worker();
@@ -10154,6 +10166,9 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
10154
10166
  init_getDeviceNumber();
10155
10167
  init_login();
10156
10168
  init_EmailRecovery();
10169
+ init_emailRecovery$1();
10170
+ init_rpcCalls();
10171
+ init_nearCrypto();
10157
10172
  EmailRecoveryFlow = class {
10158
10173
  context;
10159
10174
  options;
@@ -10181,8 +10196,9 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
10181
10196
  emit(event) {
10182
10197
  this.options?.onEvent?.(event);
10183
10198
  }
10184
- emitError(step, message) {
10185
- const err$1 = new Error(message);
10199
+ emitError(step, messageOrError) {
10200
+ const err$1 = typeof messageOrError === "string" ? new Error(messageOrError) : messageOrError;
10201
+ const message = err$1.message || (typeof messageOrError === "string" ? messageOrError : "Unknown error");
10186
10202
  this.phase = EmailRecoveryPhase.ERROR;
10187
10203
  this.error = err$1;
10188
10204
  this.emit({
@@ -10241,20 +10257,19 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
10241
10257
  const accountView = await this.context.nearClient.viewAccount(nearAccountId);
10242
10258
  const available = this.computeAvailableBalance(accountView);
10243
10259
  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.`);
10244
- } catch (e) {
10245
- await this.fail(1, e?.message || "Failed to fetch account balance for recovery");
10260
+ } catch (err$1) {
10261
+ await this.fail(1, errorMessage(err$1) || "Failed to fetch account balance for recovery");
10246
10262
  }
10247
10263
  }
10248
- async getCanonicalRecoveryEmailOrFail(recoveryEmail) {
10264
+ getCanonicalRecoveryEmail(recoveryEmail) {
10249
10265
  const canonicalEmail = String(recoveryEmail || "").trim().toLowerCase();
10250
- if (!canonicalEmail) await this.fail(1, "Recovery email is required for email-based account recovery");
10251
- return canonicalEmail;
10266
+ return canonicalEmail || void 0;
10252
10267
  }
10253
10268
  async getNextDeviceNumberFromContract(nearAccountId) {
10254
10269
  try {
10255
- const { syncAuthenticatorsContractCall: syncAuthenticatorsContractCall$1 } = await import("./rpcCalls-BQrJMTdg.js");
10270
+ const { syncAuthenticatorsContractCall: syncAuthenticatorsContractCall$1 } = await import("./rpcCalls-CYGJSCgm.js");
10256
10271
  const authenticators = await syncAuthenticatorsContractCall$1(this.context.nearClient, this.context.configs.contractId, nearAccountId);
10257
- const numbers = authenticators.map((a) => a?.authenticator?.deviceNumber).filter((n) => typeof n === "number" && Number.isFinite(n));
10272
+ const numbers = authenticators.map(({ authenticator }) => authenticator.deviceNumber).filter((n) => typeof n === "number" && Number.isFinite(n));
10258
10273
  const max = numbers.length > 0 ? Math.max(...numbers) : 0;
10259
10274
  return max + 1;
10260
10275
  } catch {
@@ -10306,7 +10321,7 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
10306
10321
  message: "New device key created; please send the recovery email from your registered address.",
10307
10322
  data: {
10308
10323
  accountId: rec.accountId,
10309
- recoveryEmail: rec.recoveryEmail,
10324
+ ...rec.recoveryEmail ? { recoveryEmail: rec.recoveryEmail } : {},
10310
10325
  nearPublicKey: rec.nearPublicKey,
10311
10326
  requestId: rec.requestId,
10312
10327
  mailtoUrl
@@ -10322,44 +10337,57 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
10322
10337
  data
10323
10338
  });
10324
10339
  }
10325
- async checkViaDkimViewMethod(rec) {
10326
- const { dkimVerifierAccountId, verificationViewMethod } = this.getConfig();
10327
- if (!dkimVerifierAccountId) return null;
10340
+ async checkViaEmailRecovererAttempt(rec) {
10328
10341
  try {
10329
- const { getEmailRecoveryVerificationResult } = await import("./rpcCalls-BQrJMTdg.js");
10330
- const result = await getEmailRecoveryVerificationResult(this.context.nearClient, dkimVerifierAccountId, verificationViewMethod, rec.requestId);
10331
- if (!result) return {
10342
+ const attempt = await getEmailRecoveryAttempt(this.context.nearClient, rec.accountId, rec.requestId);
10343
+ if (!attempt) return {
10332
10344
  completed: false,
10333
- success: false
10345
+ success: false,
10346
+ missing: true
10334
10347
  };
10335
- if (!result.verified) {
10336
- const errorMessage$1 = result.error_message || result.error_code || "Email verification failed on relayer/contract";
10337
- return {
10348
+ if (attempt.request_id && attempt.request_id !== rec.requestId) return {
10349
+ completed: true,
10350
+ success: false,
10351
+ errorMessage: "Email recovery attempt request_id does not match requested requestId."
10352
+ };
10353
+ if (attempt.new_public_key && attempt.new_public_key !== rec.nearPublicKey) {
10354
+ const expected = ensureEd25519Prefix(rec.nearPublicKey);
10355
+ const actual = ensureEd25519Prefix(attempt.new_public_key);
10356
+ if (actual === expected) {} else return {
10338
10357
  completed: true,
10339
10358
  success: false,
10340
- errorMessage: errorMessage$1,
10341
- transactionHash: result.transaction_hash
10359
+ errorMessage: `Email recovery new_public_key mismatch for request ${rec.requestId}. Expected ${expected}; got ${actual}. This usually means the recovery email you sent was generated for a different device/attempt.`
10342
10360
  };
10343
10361
  }
10344
- if (result.account_id && result.account_id !== rec.accountId) return {
10362
+ const normalized = attempt.status.toLowerCase();
10363
+ if (normalized === "complete" || normalized === "completed") return {
10345
10364
  completed: true,
10346
- success: false,
10347
- errorMessage: "Email verification account_id does not match requested account.",
10348
- transactionHash: result.transaction_hash
10365
+ success: true
10349
10366
  };
10350
- if (result.new_public_key && result.new_public_key !== rec.nearPublicKey) return {
10367
+ if (normalized.includes("failed")) return {
10351
10368
  completed: true,
10352
10369
  success: false,
10353
- errorMessage: "Email verification new_public_key does not match expected recovery key.",
10354
- transactionHash: result.transaction_hash
10370
+ errorMessage: attempt.error || `Email recovery failed (${attempt.status || "unknown status"})`
10355
10371
  };
10356
10372
  return {
10357
- completed: true,
10358
- success: true,
10359
- transactionHash: result.transaction_hash
10373
+ completed: false,
10374
+ success: false
10360
10375
  };
10361
10376
  } catch (err$1) {
10362
- console.warn("[EmailRecoveryFlow] get_verification_result view failed; will retry", err$1);
10377
+ console.warn("[EmailRecoveryFlow] get_recovery_attempt view failed; will retry", err$1);
10378
+ return null;
10379
+ }
10380
+ }
10381
+ async isRecoveryAccessKeyPresent(rec) {
10382
+ try {
10383
+ await this.context.nearClient.viewAccessKey(rec.accountId, rec.nearPublicKey);
10384
+ return true;
10385
+ } catch (err$1) {
10386
+ const kind = typeof err$1?.kind === "string" ? String(err$1.kind) : "";
10387
+ const short = typeof err$1?.short === "string" ? String(err$1.short) : "";
10388
+ const msg = typeof err$1?.message === "string" ? String(err$1.message) : "";
10389
+ if (/AccessKeyDoesNotExist/i.test(kind) || /AccessKeyDoesNotExist/i.test(short) || /access key does not exist/i.test(msg) || /access key .*does not exist/i.test(msg)) return false;
10390
+ console.warn("[EmailRecoveryFlow] view_access_key failed while checking recovery key; will retry", err$1);
10363
10391
  return null;
10364
10392
  }
10365
10393
  }
@@ -10468,7 +10496,7 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
10468
10496
  });
10469
10497
  const nearAccountId = await this.assertValidAccountIdOrFail(1, accountId);
10470
10498
  await this.assertSufficientBalance(nearAccountId);
10471
- const canonicalEmail = await this.getCanonicalRecoveryEmailOrFail(recoveryEmail);
10499
+ const canonicalEmail = this.getCanonicalRecoveryEmail(recoveryEmail);
10472
10500
  const deviceNumber = await this.getNextDeviceNumberFromContract(nearAccountId);
10473
10501
  this.phase = EmailRecoveryPhase.STEP_2_TOUCH_ID_REGISTRATION;
10474
10502
  this.emit({
@@ -10502,7 +10530,7 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
10502
10530
  nearPublicKey: rec.nearPublicKey
10503
10531
  };
10504
10532
  } catch (e) {
10505
- const err$1 = this.emitError(2, e?.message || "Email recovery TouchID/derivation failed");
10533
+ const err$1 = this.emitError(2, errorMessage(e) || "Email recovery TouchID/derivation failed");
10506
10534
  await this.options?.afterCall?.(false);
10507
10535
  throw err$1;
10508
10536
  }
@@ -10599,29 +10627,39 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
10599
10627
  await this.options?.afterCall?.(true, void 0);
10600
10628
  }
10601
10629
  async pollUntilAddKey(rec) {
10602
- const { pollingIntervalMs, maxPollingDurationMs, dkimVerifierAccountId } = this.getConfig();
10603
- if (!dkimVerifierAccountId) {
10604
- const err$2 = this.emitError(4, "Email recovery verification contract (dkimVerifierAccountId) is not configured");
10605
- await this.options?.afterCall?.(false);
10606
- throw err$2;
10607
- }
10630
+ const { pollingIntervalMs, maxPollingDurationMs } = this.getConfig();
10608
10631
  this.phase = EmailRecoveryPhase.STEP_4_POLLING_VERIFICATION_RESULT;
10609
10632
  this.pollingStartedAt = Date.now();
10633
+ let sawAttempt = false;
10610
10634
  const pollResult = await this.pollUntil({
10611
10635
  intervalMs: pollingIntervalMs,
10612
10636
  timeoutMs: maxPollingDurationMs,
10613
10637
  isCancelled: () => this.cancelled,
10614
10638
  tick: async ({ elapsedMs, pollCount }) => {
10615
- const verification = await this.checkViaDkimViewMethod(rec);
10616
- const completed = verification?.completed === true;
10617
- const success = verification?.success === true;
10639
+ const verification = await this.checkViaEmailRecovererAttempt(rec);
10640
+ if (verification && !verification.missing) sawAttempt = true;
10641
+ let completed = verification?.completed === true;
10642
+ let success = verification?.success === true;
10643
+ let errorMessage$1 = verification?.errorMessage;
10644
+ let transactionHash;
10645
+ if (verification?.missing) {
10646
+ const hasKey = await this.isRecoveryAccessKeyPresent(rec);
10647
+ if (hasKey === true) {
10648
+ completed = true;
10649
+ success = true;
10650
+ } else if (hasKey === false && sawAttempt) {
10651
+ completed = true;
10652
+ success = false;
10653
+ errorMessage$1 = "Email recovery attempt was cleared on-chain before completion. Please resend the recovery email or restart the flow.";
10654
+ } else if (hasKey === null) return { done: false };
10655
+ }
10618
10656
  this.emit({
10619
10657
  step: 4,
10620
10658
  phase: EmailRecoveryPhase.STEP_4_POLLING_VERIFICATION_RESULT,
10621
10659
  status: EmailRecoveryStatus.PROGRESS,
10622
- message: completed && success ? `Email verified for request ${rec.requestId}; finalizing registration` : `Waiting for email verification for request ${rec.requestId}`,
10660
+ message: completed && success ? `Email recovery completed for request ${rec.requestId}; finalizing registration` : `Waiting for email recovery for request ${rec.requestId}`,
10623
10661
  data: this.buildPollingEventData(rec, {
10624
- transactionHash: verification?.transactionHash,
10662
+ transactionHash,
10625
10663
  elapsedMs,
10626
10664
  pollCount
10627
10665
  })
@@ -10631,7 +10669,7 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
10631
10669
  done: true,
10632
10670
  value: {
10633
10671
  outcome: "failed",
10634
- errorMessage: verification?.errorMessage || "Email verification failed"
10672
+ errorMessage: errorMessage$1 || "Email recovery failed"
10635
10673
  }
10636
10674
  };
10637
10675
  return {
@@ -10672,7 +10710,7 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
10672
10710
  accountId
10673
10711
  };
10674
10712
  }
10675
- async signRegistrationTx(rec, accountId) {
10713
+ async signNewDevice2RegistrationTx(rec, accountId) {
10676
10714
  const vrfChallenge = rec.vrfChallenge;
10677
10715
  if (!vrfChallenge) return this.fail(5, "Missing VRF challenge for email recovery registration");
10678
10716
  const registrationResult = await this.context.webAuthnManager.signDevice2RegistrationWithStoredKey({
@@ -10686,28 +10724,56 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
10686
10724
  return registrationResult.signedTransaction;
10687
10725
  }
10688
10726
  async broadcastRegistrationTxAndWaitFinal(rec, signedTx) {
10727
+ let txResult;
10689
10728
  try {
10690
- const txResult = await this.context.nearClient.sendTransaction(signedTx, DEFAULT_WAIT_STATUS.linkDeviceRegistration);
10691
- try {
10692
- const txHash = txResult?.transaction?.hash || txResult?.transaction_hash;
10693
- if (txHash) this.emit({
10694
- step: 5,
10695
- phase: EmailRecoveryPhase.STEP_5_FINALIZING_REGISTRATION,
10696
- status: EmailRecoveryStatus.PROGRESS,
10697
- message: "Registration transaction confirmed",
10698
- data: {
10699
- accountId: rec.accountId,
10700
- nearPublicKey: rec.nearPublicKey,
10701
- transactionHash: txHash
10702
- }
10703
- });
10704
- return txHash;
10705
- } catch {}
10706
- } catch (e) {
10707
- const msg = String(e?.message || "");
10708
- await this.fail(5, msg || "Failed to broadcast email recovery registration transaction (insufficient funds or RPC error)");
10729
+ txResult = await this.context.nearClient.sendTransaction(signedTx, DEFAULT_WAIT_STATUS.linkDeviceRegistration);
10730
+ } catch (err$1) {
10731
+ const msg = errorMessage(err$1) || "Failed to broadcast email recovery registration transaction (insufficient funds or RPC error)";
10732
+ throw new Error(msg);
10733
+ }
10734
+ const txHash = this.getTxHash(txResult);
10735
+ const linkDeviceResult = parseLinkDeviceRegisterUserResponse(txResult);
10736
+ if (linkDeviceResult?.verified === false) {
10737
+ const logs = this.extractNearExecutionLogs(txResult);
10738
+ const isStaleChallenge = logs.some((log) => /StaleChallenge|freshness validation failed/i.test(log));
10739
+ const txHint = txHash ? ` (tx: ${txHash})` : "";
10740
+ const code = isStaleChallenge ? EmailRecoveryErrorCode.VRF_CHALLENGE_EXPIRED : EmailRecoveryErrorCode.REGISTRATION_NOT_VERIFIED;
10741
+ const message = isStaleChallenge ? `Timed out finalizing registration (VRF challenge expired). Please restart email recovery and try again${txHint}.` : `Registration did not verify on-chain. Please try again${txHint}.`;
10742
+ throw new EmailRecoveryError(message, code, {
10743
+ accountId: rec.accountId,
10744
+ nearPublicKey: rec.nearPublicKey,
10745
+ transactionHash: txHash,
10746
+ logs,
10747
+ result: linkDeviceResult
10748
+ });
10749
+ }
10750
+ if (txHash) this.emit({
10751
+ step: 5,
10752
+ phase: EmailRecoveryPhase.STEP_5_FINALIZING_REGISTRATION,
10753
+ status: EmailRecoveryStatus.PROGRESS,
10754
+ message: "Registration transaction confirmed",
10755
+ data: {
10756
+ accountId: rec.accountId,
10757
+ nearPublicKey: rec.nearPublicKey,
10758
+ transactionHash: txHash
10759
+ }
10760
+ });
10761
+ return txHash;
10762
+ }
10763
+ getTxHash(outcome) {
10764
+ const txUnknown = outcome.transaction;
10765
+ if (txUnknown && typeof txUnknown === "object") {
10766
+ const hash = txUnknown.hash;
10767
+ if (typeof hash === "string" && hash.length > 0) return hash;
10709
10768
  }
10710
- return void 0;
10769
+ const fallback = outcome.transaction_hash;
10770
+ return typeof fallback === "string" && fallback.length > 0 ? fallback : void 0;
10771
+ }
10772
+ extractNearExecutionLogs(outcome) {
10773
+ const logs = [];
10774
+ for (const entry of outcome.transaction_outcome.outcome.logs) logs.push(String(entry));
10775
+ for (const receipt of outcome.receipts_outcome) for (const entry of receipt.outcome.logs) logs.push(String(entry));
10776
+ return logs;
10711
10777
  }
10712
10778
  mapAuthenticatorsFromContract(authenticators) {
10713
10779
  return authenticators.map(({ authenticator }) => ({
@@ -10722,7 +10788,7 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
10722
10788
  }
10723
10789
  async syncAuthenticatorsBestEffort(accountId) {
10724
10790
  try {
10725
- const { syncAuthenticatorsContractCall: syncAuthenticatorsContractCall$1 } = await import("./rpcCalls-BQrJMTdg.js");
10791
+ const { syncAuthenticatorsContractCall: syncAuthenticatorsContractCall$1 } = await import("./rpcCalls-CYGJSCgm.js");
10726
10792
  const authenticators = await syncAuthenticatorsContractCall$1(this.context.nearClient, this.context.configs.contractId, accountId);
10727
10793
  const mappedAuthenticators = this.mapAuthenticatorsFromContract(authenticators);
10728
10794
  await IndexedDBManager.clientDB.syncAuthenticatorsFromContract(accountId, mappedAuthenticators);
@@ -10743,7 +10809,7 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
10743
10809
  }
10744
10810
  async updateNonceBestEffort(nonceManager, signedTx) {
10745
10811
  try {
10746
- const txNonce = signedTx.transaction?.nonce;
10812
+ const txNonce = signedTx.transaction.nonce;
10747
10813
  if (txNonce != null) await nonceManager.updateNonceFromBlockchain(this.context.nearClient, String(txNonce));
10748
10814
  } catch {}
10749
10815
  }
@@ -10859,7 +10925,7 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
10859
10925
  } catch (err$1) {
10860
10926
  return {
10861
10927
  success: false,
10862
- reason: err$1?.message || String(err$1)
10928
+ reason: errorMessage(err$1) || String(err$1)
10863
10929
  };
10864
10930
  }
10865
10931
  }
@@ -10887,7 +10953,7 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
10887
10953
  });
10888
10954
  try {
10889
10955
  const { nonceManager, accountId } = this.initializeNonceManager(rec);
10890
- const signedTx = await this.signRegistrationTx(rec, accountId);
10956
+ const signedTx = await this.signNewDevice2RegistrationTx(rec, accountId);
10891
10957
  const txHash = await this.broadcastRegistrationTxAndWaitFinal(rec, signedTx);
10892
10958
  if (!txHash) console.warn("[EmailRecoveryFlow] Registration transaction confirmed without hash; continuing local persistence");
10893
10959
  await this.persistRecoveredUserData(rec, accountId);
@@ -10915,7 +10981,10 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
10915
10981
  }
10916
10982
  });
10917
10983
  } catch (e) {
10918
- const err$1 = this.emitError(5, e?.message || "Email recovery finalization failed");
10984
+ rec.status = "error";
10985
+ await this.savePending(rec).catch(() => {});
10986
+ const original = e instanceof Error ? e : new Error(errorMessage(e) || "Email recovery finalization failed");
10987
+ const err$1 = this.emitError(5, original);
10919
10988
  await this.options?.afterCall?.(false);
10920
10989
  throw err$1;
10921
10990
  }
@@ -10937,7 +11006,7 @@ var init_emailRecovery = __esm({ "src/core/TatchiPasskey/emailRecovery.ts": (()
10937
11006
  };
10938
11007
  return this.handleAutoLoginFailure(touchIdResult.reason || "Auto-login failed");
10939
11008
  } catch (err$1) {
10940
- return this.handleAutoLoginFailure(err$1?.message || String(err$1), err$1);
11009
+ return this.handleAutoLoginFailure(errorMessage(err$1) || String(err$1), err$1);
10941
11010
  }
10942
11011
  }
10943
11012
  };
@@ -11009,7 +11078,7 @@ var TatchiPasskey = class {
11009
11078
  } catch {}
11010
11079
  if (!this.iframeRouter) {
11011
11080
  if (!this.walletIframeInitInFlight) this.walletIframeInitInFlight = (async () => {
11012
- const { WalletIframeRouter } = await import("./router-DuGYOd3G.js");
11081
+ const { WalletIframeRouter } = await import("./router-BWtacLJg.js");
11013
11082
  this.iframeRouter = new WalletIframeRouter({
11014
11083
  walletOrigin,
11015
11084
  servicePath: walletIframeConfig?.walletServicePath || "/wallet-service",
@@ -12047,6 +12116,7 @@ var TatchiPasskey = class {
12047
12116
  const { accountId, recoveryEmail, options } = args;
12048
12117
  if (this.shouldUseWalletIframe()) try {
12049
12118
  const router = await this.requireWalletIframeRouter();
12119
+ const normalizedRecoveryEmail = typeof recoveryEmail === "string" && recoveryEmail.trim().length > 0 ? recoveryEmail.trim() : void 0;
12050
12120
  const confirmerText = options?.confirmerText;
12051
12121
  const confirmationConfig = options?.confirmationConfig;
12052
12122
  const safeOptions = {
@@ -12055,7 +12125,7 @@ var TatchiPasskey = class {
12055
12125
  };
12056
12126
  const res = await router.startEmailRecovery({
12057
12127
  accountId,
12058
- recoveryEmail,
12128
+ recoveryEmail: normalizedRecoveryEmail,
12059
12129
  onEvent: options?.onEvent,
12060
12130
  options: Object.keys(safeOptions).length > 0 ? safeOptions : void 0
12061
12131
  });