@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
@@ -154,68 +154,68 @@ var ModalTxConfirmElement = class extends require_LitElementWithProps.LitElement
154
154
  <div class="modal-container-root">
155
155
 
156
156
  <div class="responsive-card">
157
- <div class="hero">
158
- <w3a-passkey-halo-loading
159
- .theme=${this.theme}
160
- .animated=${!this.errorMessage ? true : false}
161
- .ringGap=${4}
162
- .ringWidth=${4}
163
- .ringBorderRadius=${"1.125rem"}
164
- .ringBackground=${"var(--w3a-modal__passkey-halo-loading__ring-background)"}
165
- .innerPadding=${"0px"}
166
- .innerBackground=${"var(--w3a-modal__passkey-halo-loading__inner-background)"}
167
- .height=${36}
168
- .width=${36}
169
- ></w3a-passkey-halo-loading>
170
- <div class="hero-container">
171
- <!-- Hero heading -->
172
- ${(() => {
157
+ <div class="hero">
158
+ <w3a-passkey-halo-loading
159
+ .theme=${this.theme}
160
+ .animated=${!this.errorMessage ? true : false}
161
+ .ringGap=${4}
162
+ .ringWidth=${4}
163
+ .ringBorderRadius=${"1.125rem"}
164
+ .ringBackground=${"var(--w3a-modal__passkey-halo-loading__ring-background)"}
165
+ .innerPadding=${"0px"}
166
+ .innerBackground=${"var(--w3a-modal__passkey-halo-loading__inner-background)"}
167
+ .height=${36}
168
+ .width=${36}
169
+ ></w3a-passkey-halo-loading>
170
+ <div class="hero-container">
171
+ <!-- Hero heading -->
172
+ ${(() => {
173
173
  const isRegistration = (this.txSigningRequests?.length || 0) === 0;
174
174
  const fallback = isRegistration ? "Register with Passkey" : "Confirm with Passkey";
175
175
  const titleText = (this.title || "").trim();
176
176
  const heading = titleText || fallback;
177
177
  return lit.html`<h2 class="hero-heading">${heading}</h2>`;
178
178
  })()}
179
- ${this.errorMessage ? lit.html`<div class="error-banner">${this.errorMessage}</div>` : ""}
180
- <!-- RpID Section -->
181
- <div class="rpid-wrapper">
182
- <div class="rpid">
183
- <div class="secure-indicator">
184
- <svg xmlns="http://www.w3.org/2000/svg"
185
- class="padlock-icon"
186
- viewBox="0 0 24 24"
187
- fill="none"
188
- stroke="currentColor"
189
- stroke-width="2"
190
- stroke-linecap="round"
191
- stroke-linejoin="round"
192
- >
193
- <rect width="18" height="11" x="3" y="11" rx="2" ry="2"/>
194
- <path d="M7 11V7a5 5 0 0 1 10 0v4"/>
195
- </svg>
196
- ${this.vrfChallenge?.rpId ? lit.html`<span class="domain-text">${this.vrfChallenge.rpId}</span>` : ""}
197
- </div>
198
- <span class="security-details">
199
- <svg xmlns="http://www.w3.org/2000/svg"
200
- class="block-height-icon"
201
- viewBox="0 0 24 24"
202
- fill="none"
203
- stroke="currentColor"
204
- stroke-width="2"
205
- stroke-linecap="round"
206
- stroke-linejoin="round"
207
- >
208
- <path d="M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A 2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z"/>
209
- <path d="m3.3 7 8.7 5 8.7-5"/>
210
- <path d="M12 22V12"/>
211
- </svg>
212
- ${this.vrfChallenge?.blockHeight ? lit.html`block ${this.vrfChallenge.blockHeight}` : ""}
213
- </span>
179
+ ${this.errorMessage ? lit.html`<div class="error-banner">${this.errorMessage}</div>` : ""}
180
+ <!-- RpID Section -->
181
+ <div class="rpid-wrapper">
182
+ <div class="rpid">
183
+ <div class="secure-indicator">
184
+ <svg xmlns="http://www.w3.org/2000/svg"
185
+ class="padlock-icon"
186
+ viewBox="0 0 24 24"
187
+ fill="none"
188
+ stroke="currentColor"
189
+ stroke-width="2"
190
+ stroke-linecap="round"
191
+ stroke-linejoin="round"
192
+ >
193
+ <rect width="18" height="11" x="3" y="11" rx="2" ry="2"/>
194
+ <path d="M7 11V7a5 5 0 0 1 10 0v4"/>
195
+ </svg>
196
+ ${this.vrfChallenge?.rpId ? lit.html`<span class="domain-text">${this.vrfChallenge.rpId}</span>` : ""}
214
197
  </div>
215
- ${this.body && this.body.trim() ? lit.html`<div class="rpid-body">${this.body}</div>` : ""}
198
+ <span class="security-details">
199
+ <svg xmlns="http://www.w3.org/2000/svg"
200
+ class="block-height-icon"
201
+ viewBox="0 0 24 24"
202
+ fill="none"
203
+ stroke="currentColor"
204
+ stroke-width="2"
205
+ stroke-linecap="round"
206
+ stroke-linejoin="round"
207
+ >
208
+ <path d="M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A 2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z"/>
209
+ <path d="m3.3 7 8.7 5 8.7-5"/>
210
+ <path d="M12 22V12"/>
211
+ </svg>
212
+ ${this.vrfChallenge?.blockHeight ? lit.html`block ${this.vrfChallenge.blockHeight}` : ""}
213
+ </span>
216
214
  </div>
217
215
  </div>
218
216
  </div>
217
+ </div>
218
+ ${this.body && this.body.trim() ? lit.html`<div class="confirmation-body">${this.body}</div>` : ""}
219
219
  </div>
220
220
 
221
221
  <div class="responsive-card">
@@ -1 +1 @@
1
- {"version":3,"file":"viewer-modal.js","names":["LitElementWithProps","TxConfirmContentElement","TxTree","HaloBorderElement","PasskeyHaloLoadingElement","ensureExternalStyles","WalletIframeDomEvents","W3A_MODAL_TX_CONFIRMER_ID"],"sources":["../../../../../../src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.ts"],"sourcesContent":["import { html, type PropertyValues } from 'lit';\nimport { LitElementWithProps } from '../LitElementWithProps';\n\nimport { TransactionInputWasm } from '../../../types';\nimport type { VRFChallenge } from '../../../types/vrf-worker';\n\nimport TxTree from '../TxTree';\nimport { ensureExternalStyles } from '../css/css-loader';\nimport TxConfirmContentElement from './tx-confirm-content';\nimport type { ThemeName } from '../confirm-ui-types';\n// Ensure required custom elements are defined in this bundle (avoid tree-shake drops)\nimport HaloBorderElement from '../HaloBorder';\nimport PasskeyHaloLoadingElement from '../PasskeyHaloLoading';\nimport type { ConfirmUIElement } from '../confirm-ui-types';\nimport { WalletIframeDomEvents } from '../../../WalletIframe/events';\n\nexport interface SecureTxSummary {\n to?: string;\n totalAmount?: string;\n method?: string;\n fingerprint?: string; // short digest for display\n}\n\n// TxAction from wasm-worker\nexport interface TxAction {\n action_type: string;\n method_name?: string;\n args?: string;\n gas?: string;\n deposit?: string;\n [key: string]: string | number | boolean | null | undefined | object;\n}\n\n/**\n * Modal transaction confirmation component with multiple display variants.\n * Built with Lit with strict CSP for XSS protection and reactive updates.\n */\nexport class ModalTxConfirmElement extends LitElementWithProps implements ConfirmUIElement {\n static requiredChildTags = ['w3a-tx-confirm-content'];\n static strictChildDefinitions = true;\n // Prevent bundlers from dropping nested custom element definitions used via templates\n static keepDefinitions = [TxConfirmContentElement];\n // Component properties (automatically reactive)\n static properties = {\n nearAccountId: { type: String, attribute: 'near-account-id' },\n to: { type: String },\n totalAmount: { type: String },\n method: { type: String },\n fingerprint: { type: String },\n body: { type: String },\n title: { type: String },\n cancelText: { type: String },\n confirmText: { type: String },\n txSigningRequests: { type: Array },\n vrfChallenge: { type: Object },\n loading: { type: Boolean },\n errorMessage: { type: String },\n theme: { type: String, attribute: 'theme', reflect: true },\n nearExplorerUrl: { type: String, attribute: 'near-explorer-url' },\n };\n\n totalAmount = '';\n method = '';\n fingerprint = '';\n body = '';\n title = '';\n cancelText = 'Cancel';\n confirmText = 'Next';\n txSigningRequests: TransactionInputWasm[] = [];\n vrfChallenge?: Partial<VRFChallenge>;\n loading = false;\n errorMessage: string | undefined = undefined;\n // Theme tokens now come from external CSS (tx-confirmer.css)\n // style injection has been removed to satisfy strict CSP.\n theme: ThemeName = 'dark';\n nearExplorerUrl?: string;\n intentDigest?: string;\n declare nearAccountId: string;\n // When true, this element will NOT remove itself on confirm/cancel.\n // The host is responsible for sending a CLOSE_MODAL instruction.\n deferClose = false;\n // Styles gating to avoid first-paint FOUC\n private _stylesReady = false;\n private _stylePromises: Promise<void>[] = [];\n private _stylesAwaiting: Promise<void> | null = null;\n\n // Keep essential custom elements from being tree-shaken\n private _ensureTreeDefinition = TxTree;\n private _ensureHaloElements = [HaloBorderElement, PasskeyHaloLoadingElement];\n\n // Removed fixed JS breakpoints; rely on CSS/container sizing for zoom resilience\n private _onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' || e.key === 'Esc') {\n // Only close for modal-style render modes\n e.preventDefault();\n this._handleCancel();\n }\n };\n private _onWindowMessage = (ev: MessageEvent) => {\n const data = (ev && ev.data) || {};\n if (!data || typeof (data as any).type !== 'string') return;\n if ((data as any).type === 'MODAL_TIMEOUT') {\n const msg = typeof (data as any).payload === 'string' && (data as any).payload\n ? (data as any).payload\n : 'Operation timed out';\n this.loading = false;\n this.errorMessage = msg;\n // Emit cancel so the host resolves and removes this element via two‑phase close\n this._handleCancel();\n }\n };\n // Guard to prevent immediate backdrop-cancel due to the click that mounted the modal\n private _backdropArmed = false;\n\n // Render in light DOM to simplify CSS variable flow across nested components\n // (Shadow DOM disabled by returning the host element as the render root)\n\n // No inline static styles; see tx-confirmer.css\n constructor() {\n super();\n // Pre-ensure document-level styles so link loads can complete before first render\n const root = (document?.documentElement || null) as unknown as HTMLElement | null;\n if (root) {\n this._stylePromises.push(\n ensureExternalStyles(root, 'w3a-components.css', 'data-w3a-components-css'),\n ensureExternalStyles(root, 'tx-tree.css', 'data-w3a-tx-tree-css'),\n ensureExternalStyles(root, 'tx-confirmer.css', 'data-w3a-tx-confirmer-css'),\n // Preload nested visuals to avoid first-paint jank when halo/loader mount\n ensureExternalStyles(root, 'halo-border.css', 'data-w3a-halo-border-css'),\n ensureExternalStyles(root, 'passkey-halo-loading.css', 'data-w3a-passkey-halo-loading-css'),\n );\n }\n }\n\n private _ownsThemeAttr = false;\n\n updated(changedProperties: PropertyValues) {\n super.updated(changedProperties);\n // Keep the iframe/root document's theme in sync so :root[data-w3a-theme] tokens apply\n if (changedProperties.has('theme')) {\n try {\n const docEl = this.ownerDocument?.documentElement as HTMLElement | undefined;\n if (docEl && this.theme && this._ownsThemeAttr) {\n docEl.setAttribute('data-w3a-theme', this.theme);\n }\n } catch {}\n }\n }\n\n protected getComponentPrefix(): string {\n return 'modal';\n }\n\n protected createRenderRoot(): HTMLElement | DocumentFragment {\n const root = (this as unknown) as HTMLElement;\n // tx-tree.css for nested TxTree visuals inside the modal\n this._stylePromises.push(ensureExternalStyles(root, 'tx-tree.css', 'data-w3a-tx-tree-css'));\n // tx-confirmer.css for modal layout + tokens\n this._stylePromises.push(ensureExternalStyles(root, 'tx-confirmer.css', 'data-w3a-tx-confirmer-css'));\n // Ensure nested loader/halo styles are present before first paint to avoid FOUC\n this._stylePromises.push(ensureExternalStyles(root, 'halo-border.css', 'data-w3a-halo-border-css'));\n this._stylePromises.push(ensureExternalStyles(root, 'passkey-halo-loading.css', 'data-w3a-passkey-halo-loading-css'));\n return root;\n }\n\n // Dynamic style application removed; CSS variables come from tx-confirmer.css\n\n disconnectedCallback() {\n window.removeEventListener('keydown', this._onKeyDown);\n window.removeEventListener('message', this._onWindowMessage as EventListener);\n super.disconnectedCallback();\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n // Ensure root token theme is applied immediately on mount\n try {\n const docEl = this.ownerDocument?.documentElement as HTMLElement | undefined;\n if (docEl && this.theme) {\n const current = docEl.getAttribute('data-w3a-theme');\n // If missing or already using built-in values, take ownership and set\n if (!current || current === 'dark' || current === 'light') {\n docEl.setAttribute('data-w3a-theme', this.theme);\n this._ownsThemeAttr = true;\n }\n }\n } catch {}\n // Arm backdrop after the current event loop to avoid capturing the mounting click\n setTimeout(() => { this._backdropArmed = true; }, 0);\n // Listen globally so Escape works regardless of focus target\n window.addEventListener('keydown', this._onKeyDown);\n // Listen for global timeout notification (posted by SignerWorkerManager on operation timeout)\n window.addEventListener('message', this._onWindowMessage as EventListener);\n // Ensure this iframe/host receives keyboard focus so ESC works immediately\n // Make host focusable and focus it without scrolling\n const hostEl = this as unknown as HTMLElement;\n hostEl.tabIndex = hostEl.tabIndex ?? -1;\n hostEl.focus({ preventScroll: true } as FocusOptions);\n // Also attempt to focus the frame window in case we're inside an iframe\n if (typeof window.focus === 'function') {\n window.focus();\n }\n }\n\n protected shouldUpdate(_changed: PropertyValues): boolean {\n if (this._stylesReady) return true;\n if (!this._stylesAwaiting) {\n const p = Promise.all(this._stylePromises).then(\n () => new Promise<void>((r) => requestAnimationFrame(() => requestAnimationFrame(() => r())))\n );\n this._stylesAwaiting = p.then(() => { this._stylesReady = true; this.requestUpdate(); });\n }\n return false;\n }\n\n render() {\n return html`\n <!-- Separate backdrop layer for independent animation -->\n <div class=\"modal-backdrop-blur\" @click=${this._handleBackdropClick}></div>\n <!-- Modal content layer -->\n <div class=\"modal-backdrop\" @click=${this._handleContentClick}>\n <div class=\"modal-container-root\">\n\n <div class=\"responsive-card\">\n <div class=\"hero\">\n <w3a-passkey-halo-loading\n .theme=${this.theme}\n .animated=${!this.errorMessage ? true : false}\n .ringGap=${4}\n .ringWidth=${4}\n .ringBorderRadius=${'1.125rem'}\n .ringBackground=${'var(--w3a-modal__passkey-halo-loading__ring-background)'}\n .innerPadding=${'0px'}\n .innerBackground=${'var(--w3a-modal__passkey-halo-loading__inner-background)'}\n .height=${36}\n .width=${36}\n ></w3a-passkey-halo-loading>\n <div class=\"hero-container\">\n <!-- Hero heading -->\n ${(() => {\n const isRegistration = (this.txSigningRequests?.length || 0) === 0;\n const fallback = isRegistration ? 'Register with Passkey' : 'Confirm with Passkey';\n const titleText = (this.title || '').trim();\n const heading = titleText || fallback;\n return html`<h2 class=\"hero-heading\">${heading}</h2>`;\n })()}\n ${this.errorMessage\n ? html`<div class=\"error-banner\">${this.errorMessage}</div>`\n : ''}\n <!-- RpID Section -->\n <div class=\"rpid-wrapper\">\n <div class=\"rpid\">\n <div class=\"secure-indicator\">\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n class=\"padlock-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\"/>\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\"/>\n </svg>\n ${this.vrfChallenge?.rpId\n ? html`<span class=\"domain-text\">${this.vrfChallenge.rpId}</span>`\n : ''}\n </div>\n <span class=\"security-details\">\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n class=\"block-height-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A 2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z\"/>\n <path d=\"m3.3 7 8.7 5 8.7-5\"/>\n <path d=\"M12 22V12\"/>\n </svg>\n ${this.vrfChallenge?.blockHeight\n ? html`block ${this.vrfChallenge.blockHeight}`\n : ''}\n </span>\n </div>\n ${this.body && this.body.trim()\n ? html`<div class=\"rpid-body\">${this.body}</div>`\n : ''}\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"responsive-card\">\n <w3a-tx-confirm-content\n .nearAccountId=${this['nearAccountId'] || ''}\n .txSigningRequests=${this.txSigningRequests || []}\n .intentDigest=${this.intentDigest}\n .vrfChallenge=${this.vrfChallenge}\n .theme=${this.theme}\n .nearExplorerUrl=${this.nearExplorerUrl}\n .showShadow=${false}\n .loading=${this.loading}\n .errorMessage=${this.errorMessage || ''}\n .title=${this.title}\n .confirmText=${this.confirmText}\n .cancelText=${this.cancelText}\n @lit-confirm=${this._handleConfirm}\n @lit-cancel=${this._handleCancel}\n ></w3a-tx-confirm-content>\n </div>\n </div>\n </div>\n `;\n }\n\n private _handleCancel() {\n if (this.loading) return;\n // Canonical event (include a consistent detail payload)\n this.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CANCEL, {\n bubbles: true,\n composed: true,\n detail: { confirmed: false }\n }));\n if (!this.deferClose) {\n this._resolveAndCleanup(false);\n }\n }\n\n private _handleConfirm() {\n if (this.loading) return;\n this.loading = true;\n this.requestUpdate();\n // Canonical event (include a consistent detail payload)\n this.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CONFIRM, {\n bubbles: true,\n composed: true,\n detail: { confirmed: true }\n }));\n if (!this.deferClose) {\n this._resolveAndCleanup(true);\n }\n }\n\n private _handleBackdropClick() {\n // Ignore the first click that may have triggered mounting the modal\n if (!this._backdropArmed) return;\n this._handleCancel();\n }\n\n private _handleContentClick(e: Event) {\n e.stopPropagation();\n }\n\n private _resolveAndCleanup(confirmed: boolean) {\n this.remove();\n }\n\n // Public method for two-phase close from host/bootstrap\n close(confirmed: boolean) {\n this._resolveAndCleanup(confirmed);\n }\n\n}\n\n// Register the custom element\nimport { W3A_MODAL_TX_CONFIRMER_ID } from '../tags';\n\n// Define canonical tag\nif (!customElements.get(W3A_MODAL_TX_CONFIRMER_ID)) {\n customElements.define(W3A_MODAL_TX_CONFIRMER_ID, ModalTxConfirmElement);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"viewer-modal.js","names":["LitElementWithProps","TxConfirmContentElement","TxTree","HaloBorderElement","PasskeyHaloLoadingElement","ensureExternalStyles","WalletIframeDomEvents","W3A_MODAL_TX_CONFIRMER_ID"],"sources":["../../../../../../src/core/WebAuthnManager/LitComponents/IframeTxConfirmer/viewer-modal.ts"],"sourcesContent":["import { html, type PropertyValues } from 'lit';\nimport { LitElementWithProps } from '../LitElementWithProps';\n\nimport { TransactionInputWasm } from '../../../types';\nimport type { VRFChallenge } from '../../../types/vrf-worker';\n\nimport TxTree from '../TxTree';\nimport { ensureExternalStyles } from '../css/css-loader';\nimport TxConfirmContentElement from './tx-confirm-content';\nimport type { ThemeName } from '../confirm-ui-types';\n// Ensure required custom elements are defined in this bundle (avoid tree-shake drops)\nimport HaloBorderElement from '../HaloBorder';\nimport PasskeyHaloLoadingElement from '../PasskeyHaloLoading';\nimport type { ConfirmUIElement } from '../confirm-ui-types';\nimport { WalletIframeDomEvents } from '../../../WalletIframe/events';\n\nexport interface SecureTxSummary {\n to?: string;\n totalAmount?: string;\n method?: string;\n fingerprint?: string; // short digest for display\n}\n\n// TxAction from wasm-worker\nexport interface TxAction {\n action_type: string;\n method_name?: string;\n args?: string;\n gas?: string;\n deposit?: string;\n [key: string]: string | number | boolean | null | undefined | object;\n}\n\n/**\n * Modal transaction confirmation component with multiple display variants.\n * Built with Lit with strict CSP for XSS protection and reactive updates.\n */\nexport class ModalTxConfirmElement extends LitElementWithProps implements ConfirmUIElement {\n static requiredChildTags = ['w3a-tx-confirm-content'];\n static strictChildDefinitions = true;\n // Prevent bundlers from dropping nested custom element definitions used via templates\n static keepDefinitions = [TxConfirmContentElement];\n // Component properties (automatically reactive)\n static properties = {\n nearAccountId: { type: String, attribute: 'near-account-id' },\n to: { type: String },\n totalAmount: { type: String },\n method: { type: String },\n fingerprint: { type: String },\n body: { type: String },\n title: { type: String },\n cancelText: { type: String },\n confirmText: { type: String },\n txSigningRequests: { type: Array },\n vrfChallenge: { type: Object },\n loading: { type: Boolean },\n errorMessage: { type: String },\n theme: { type: String, attribute: 'theme', reflect: true },\n nearExplorerUrl: { type: String, attribute: 'near-explorer-url' },\n };\n\n totalAmount = '';\n method = '';\n fingerprint = '';\n body = '';\n title = '';\n cancelText = 'Cancel';\n confirmText = 'Next';\n txSigningRequests: TransactionInputWasm[] = [];\n vrfChallenge?: Partial<VRFChallenge>;\n loading = false;\n errorMessage: string | undefined = undefined;\n // Theme tokens now come from external CSS (tx-confirmer.css)\n // style injection has been removed to satisfy strict CSP.\n theme: ThemeName = 'dark';\n nearExplorerUrl?: string;\n intentDigest?: string;\n declare nearAccountId: string;\n // When true, this element will NOT remove itself on confirm/cancel.\n // The host is responsible for sending a CLOSE_MODAL instruction.\n deferClose = false;\n // Styles gating to avoid first-paint FOUC\n private _stylesReady = false;\n private _stylePromises: Promise<void>[] = [];\n private _stylesAwaiting: Promise<void> | null = null;\n\n // Keep essential custom elements from being tree-shaken\n private _ensureTreeDefinition = TxTree;\n private _ensureHaloElements = [HaloBorderElement, PasskeyHaloLoadingElement];\n\n // Removed fixed JS breakpoints; rely on CSS/container sizing for zoom resilience\n private _onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' || e.key === 'Esc') {\n // Only close for modal-style render modes\n e.preventDefault();\n this._handleCancel();\n }\n };\n private _onWindowMessage = (ev: MessageEvent) => {\n const data = (ev && ev.data) || {};\n if (!data || typeof (data as any).type !== 'string') return;\n if ((data as any).type === 'MODAL_TIMEOUT') {\n const msg = typeof (data as any).payload === 'string' && (data as any).payload\n ? (data as any).payload\n : 'Operation timed out';\n this.loading = false;\n this.errorMessage = msg;\n // Emit cancel so the host resolves and removes this element via two‑phase close\n this._handleCancel();\n }\n };\n // Guard to prevent immediate backdrop-cancel due to the click that mounted the modal\n private _backdropArmed = false;\n\n // Render in light DOM to simplify CSS variable flow across nested components\n // (Shadow DOM disabled by returning the host element as the render root)\n\n // No inline static styles; see tx-confirmer.css\n constructor() {\n super();\n // Pre-ensure document-level styles so link loads can complete before first render\n const root = (document?.documentElement || null) as unknown as HTMLElement | null;\n if (root) {\n this._stylePromises.push(\n ensureExternalStyles(root, 'w3a-components.css', 'data-w3a-components-css'),\n ensureExternalStyles(root, 'tx-tree.css', 'data-w3a-tx-tree-css'),\n ensureExternalStyles(root, 'tx-confirmer.css', 'data-w3a-tx-confirmer-css'),\n // Preload nested visuals to avoid first-paint jank when halo/loader mount\n ensureExternalStyles(root, 'halo-border.css', 'data-w3a-halo-border-css'),\n ensureExternalStyles(root, 'passkey-halo-loading.css', 'data-w3a-passkey-halo-loading-css'),\n );\n }\n }\n\n private _ownsThemeAttr = false;\n\n updated(changedProperties: PropertyValues) {\n super.updated(changedProperties);\n // Keep the iframe/root document's theme in sync so :root[data-w3a-theme] tokens apply\n if (changedProperties.has('theme')) {\n try {\n const docEl = this.ownerDocument?.documentElement as HTMLElement | undefined;\n if (docEl && this.theme && this._ownsThemeAttr) {\n docEl.setAttribute('data-w3a-theme', this.theme);\n }\n } catch {}\n }\n }\n\n protected getComponentPrefix(): string {\n return 'modal';\n }\n\n protected createRenderRoot(): HTMLElement | DocumentFragment {\n const root = (this as unknown) as HTMLElement;\n // tx-tree.css for nested TxTree visuals inside the modal\n this._stylePromises.push(ensureExternalStyles(root, 'tx-tree.css', 'data-w3a-tx-tree-css'));\n // tx-confirmer.css for modal layout + tokens\n this._stylePromises.push(ensureExternalStyles(root, 'tx-confirmer.css', 'data-w3a-tx-confirmer-css'));\n // Ensure nested loader/halo styles are present before first paint to avoid FOUC\n this._stylePromises.push(ensureExternalStyles(root, 'halo-border.css', 'data-w3a-halo-border-css'));\n this._stylePromises.push(ensureExternalStyles(root, 'passkey-halo-loading.css', 'data-w3a-passkey-halo-loading-css'));\n return root;\n }\n\n // Dynamic style application removed; CSS variables come from tx-confirmer.css\n\n disconnectedCallback() {\n window.removeEventListener('keydown', this._onKeyDown);\n window.removeEventListener('message', this._onWindowMessage as EventListener);\n super.disconnectedCallback();\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n // Ensure root token theme is applied immediately on mount\n try {\n const docEl = this.ownerDocument?.documentElement as HTMLElement | undefined;\n if (docEl && this.theme) {\n const current = docEl.getAttribute('data-w3a-theme');\n // If missing or already using built-in values, take ownership and set\n if (!current || current === 'dark' || current === 'light') {\n docEl.setAttribute('data-w3a-theme', this.theme);\n this._ownsThemeAttr = true;\n }\n }\n } catch {}\n // Arm backdrop after the current event loop to avoid capturing the mounting click\n setTimeout(() => { this._backdropArmed = true; }, 0);\n // Listen globally so Escape works regardless of focus target\n window.addEventListener('keydown', this._onKeyDown);\n // Listen for global timeout notification (posted by SignerWorkerManager on operation timeout)\n window.addEventListener('message', this._onWindowMessage as EventListener);\n // Ensure this iframe/host receives keyboard focus so ESC works immediately\n // Make host focusable and focus it without scrolling\n const hostEl = this as unknown as HTMLElement;\n hostEl.tabIndex = hostEl.tabIndex ?? -1;\n hostEl.focus({ preventScroll: true } as FocusOptions);\n // Also attempt to focus the frame window in case we're inside an iframe\n if (typeof window.focus === 'function') {\n window.focus();\n }\n }\n\n protected shouldUpdate(_changed: PropertyValues): boolean {\n if (this._stylesReady) return true;\n if (!this._stylesAwaiting) {\n const p = Promise.all(this._stylePromises).then(\n () => new Promise<void>((r) => requestAnimationFrame(() => requestAnimationFrame(() => r())))\n );\n this._stylesAwaiting = p.then(() => { this._stylesReady = true; this.requestUpdate(); });\n }\n return false;\n }\n\n render() {\n return html`\n <!-- Separate backdrop layer for independent animation -->\n <div class=\"modal-backdrop-blur\" @click=${this._handleBackdropClick}></div>\n <!-- Modal content layer -->\n <div class=\"modal-backdrop\" @click=${this._handleContentClick}>\n <div class=\"modal-container-root\">\n\n <div class=\"responsive-card\">\n <div class=\"hero\">\n <w3a-passkey-halo-loading\n .theme=${this.theme}\n .animated=${!this.errorMessage ? true : false}\n .ringGap=${4}\n .ringWidth=${4}\n .ringBorderRadius=${'1.125rem'}\n .ringBackground=${'var(--w3a-modal__passkey-halo-loading__ring-background)'}\n .innerPadding=${'0px'}\n .innerBackground=${'var(--w3a-modal__passkey-halo-loading__inner-background)'}\n .height=${36}\n .width=${36}\n ></w3a-passkey-halo-loading>\n <div class=\"hero-container\">\n <!-- Hero heading -->\n ${(() => {\n const isRegistration = (this.txSigningRequests?.length || 0) === 0;\n const fallback = isRegistration ? 'Register with Passkey' : 'Confirm with Passkey';\n const titleText = (this.title || '').trim();\n const heading = titleText || fallback;\n return html`<h2 class=\"hero-heading\">${heading}</h2>`;\n })()}\n ${this.errorMessage\n ? html`<div class=\"error-banner\">${this.errorMessage}</div>`\n : ''}\n <!-- RpID Section -->\n <div class=\"rpid-wrapper\">\n <div class=\"rpid\">\n <div class=\"secure-indicator\">\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n class=\"padlock-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\"/>\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\"/>\n </svg>\n ${this.vrfChallenge?.rpId\n ? html`<span class=\"domain-text\">${this.vrfChallenge.rpId}</span>`\n : ''}\n </div>\n <span class=\"security-details\">\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n class=\"block-height-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A 2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z\"/>\n <path d=\"m3.3 7 8.7 5 8.7-5\"/>\n <path d=\"M12 22V12\"/>\n </svg>\n ${this.vrfChallenge?.blockHeight\n ? html`block ${this.vrfChallenge.blockHeight}`\n : ''}\n </span>\n </div>\n </div>\n </div>\n </div>\n ${\n this.body && this.body.trim()\n ? html`<div class=\"confirmation-body\">${this.body}</div>`\n : ''\n }\n </div>\n\n <div class=\"responsive-card\">\n <w3a-tx-confirm-content\n .nearAccountId=${this['nearAccountId'] || ''}\n .txSigningRequests=${this.txSigningRequests || []}\n .intentDigest=${this.intentDigest}\n .vrfChallenge=${this.vrfChallenge}\n .theme=${this.theme}\n .nearExplorerUrl=${this.nearExplorerUrl}\n .showShadow=${false}\n .loading=${this.loading}\n .errorMessage=${this.errorMessage || ''}\n .title=${this.title}\n .confirmText=${this.confirmText}\n .cancelText=${this.cancelText}\n @lit-confirm=${this._handleConfirm}\n @lit-cancel=${this._handleCancel}\n ></w3a-tx-confirm-content>\n </div>\n </div>\n </div>\n `;\n }\n\n private _handleCancel() {\n if (this.loading) return;\n // Canonical event (include a consistent detail payload)\n this.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CANCEL, {\n bubbles: true,\n composed: true,\n detail: { confirmed: false }\n }));\n if (!this.deferClose) {\n this._resolveAndCleanup(false);\n }\n }\n\n private _handleConfirm() {\n if (this.loading) return;\n this.loading = true;\n this.requestUpdate();\n // Canonical event (include a consistent detail payload)\n this.dispatchEvent(new CustomEvent(WalletIframeDomEvents.TX_CONFIRMER_CONFIRM, {\n bubbles: true,\n composed: true,\n detail: { confirmed: true }\n }));\n if (!this.deferClose) {\n this._resolveAndCleanup(true);\n }\n }\n\n private _handleBackdropClick() {\n // Ignore the first click that may have triggered mounting the modal\n if (!this._backdropArmed) return;\n this._handleCancel();\n }\n\n private _handleContentClick(e: Event) {\n e.stopPropagation();\n }\n\n private _resolveAndCleanup(confirmed: boolean) {\n this.remove();\n }\n\n // Public method for two-phase close from host/bootstrap\n close(confirmed: boolean) {\n this._resolveAndCleanup(confirmed);\n }\n\n}\n\n// Register the custom element\nimport { W3A_MODAL_TX_CONFIRMER_ID } from '../tags';\n\n// Define canonical tag\nif (!customElements.get(W3A_MODAL_TX_CONFIRMER_ID)) {\n customElements.define(W3A_MODAL_TX_CONFIRMER_ID, ModalTxConfirmElement);\n}\n"],"mappings":"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"}
@@ -2,7 +2,6 @@ const require_rolldown_runtime = require('../../../_virtual/rolldown_runtime.js'
2
2
  const require_accountIds = require('../../types/accountIds.js');
3
3
 
4
4
  //#region src/core/WebAuthnManager/SignerWorkerManager/getDeviceNumber.ts
5
- require_accountIds.init_accountIds();
6
5
  function parseDeviceNumber(value, options = {}) {
7
6
  const deviceNumber = Number(value);
8
7
  const min = options.min ?? 1;
@@ -23,8 +22,18 @@ async function getLastLoggedInDeviceNumber(nearAccountId, clientDB) {
23
22
  }
24
23
  throw new Error(`No last user session for account ${accountId}`);
25
24
  }
25
+ var init_getDeviceNumber = require_rolldown_runtime.__esm({ "src/core/WebAuthnManager/SignerWorkerManager/getDeviceNumber.ts": (() => {
26
+ require_accountIds.init_accountIds();
27
+ }) });
26
28
 
27
29
  //#endregion
30
+ init_getDeviceNumber();
28
31
  exports.getLastLoggedInDeviceNumber = getLastLoggedInDeviceNumber;
32
+ Object.defineProperty(exports, 'init_getDeviceNumber', {
33
+ enumerable: true,
34
+ get: function () {
35
+ return init_getDeviceNumber;
36
+ }
37
+ });
29
38
  exports.parseDeviceNumber = parseDeviceNumber;
30
39
  //# sourceMappingURL=getDeviceNumber.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getDeviceNumber.js","names":["toAccountId"],"sources":["../../../../../src/core/WebAuthnManager/SignerWorkerManager/getDeviceNumber.ts"],"sourcesContent":["import type { PasskeyClientDBManager } from '@/core/IndexedDBManager';\nimport { toAccountId, type AccountId } from '../../types/accountIds';\n\nexport function parseDeviceNumber(\n value: unknown,\n options: { min?: number } = {}\n): number | null {\n const deviceNumber = Number(value);\n const min = options.min ?? 1;\n if (!Number.isSafeInteger(deviceNumber) || deviceNumber < min) {\n return null;\n }\n return deviceNumber;\n}\n\n/**\n * Return the deviceNumber for the last logged-in user for the given account.\n * This uses the app-state \"last user\" pointer only; if it does not match the\n * requested account, an error is thrown instead of silently falling back.\n */\nexport async function getLastLoggedInDeviceNumber(\n nearAccountId: AccountId | string,\n clientDB: PasskeyClientDBManager\n): Promise<number> {\n const accountId = toAccountId(nearAccountId);\n const last = await clientDB.getLastUser();\n if (last && last.nearAccountId === accountId) {\n const deviceNumber = parseDeviceNumber((last as any).deviceNumber, { min: 1 });\n if (deviceNumber !== null) {\n return deviceNumber;\n }\n }\n throw new Error(`No last user session for account ${accountId}`);\n}\n"],"mappings":";;;;;AAGA,SAAgB,kBACd,OACA,UAA4B,IACb;CACf,MAAM,eAAe,OAAO;CAC5B,MAAM,MAAM,QAAQ,OAAO;AAC3B,KAAI,CAAC,OAAO,cAAc,iBAAiB,eAAe,IACxD,QAAO;AAET,QAAO;;;;;;;AAQT,eAAsB,4BACpB,eACA,UACiB;CACjB,MAAM,YAAYA,+BAAY;CAC9B,MAAM,OAAO,MAAM,SAAS;AAC5B,KAAI,QAAQ,KAAK,kBAAkB,WAAW;EAC5C,MAAM,eAAe,kBAAmB,KAAa,cAAc,EAAE,KAAK;AAC1E,MAAI,iBAAiB,KACnB,QAAO;;AAGX,OAAM,IAAI,MAAM,oCAAoC"}
1
+ {"version":3,"file":"getDeviceNumber.js","names":["toAccountId"],"sources":["../../../../../src/core/WebAuthnManager/SignerWorkerManager/getDeviceNumber.ts"],"sourcesContent":["import type { PasskeyClientDBManager } from '@/core/IndexedDBManager';\nimport { toAccountId, type AccountId } from '../../types/accountIds';\n\nexport function parseDeviceNumber(\n value: unknown,\n options: { min?: number } = {}\n): number | null {\n const deviceNumber = Number(value);\n const min = options.min ?? 1;\n if (!Number.isSafeInteger(deviceNumber) || deviceNumber < min) {\n return null;\n }\n return deviceNumber;\n}\n\n/**\n * Return the deviceNumber for the last logged-in user for the given account.\n * This uses the app-state \"last user\" pointer only; if it does not match the\n * requested account, an error is thrown instead of silently falling back.\n */\nexport async function getLastLoggedInDeviceNumber(\n nearAccountId: AccountId | string,\n clientDB: PasskeyClientDBManager\n): Promise<number> {\n const accountId = toAccountId(nearAccountId);\n const last = await clientDB.getLastUser();\n if (last && last.nearAccountId === accountId) {\n const deviceNumber = parseDeviceNumber((last as any).deviceNumber, { min: 1 });\n if (deviceNumber !== null) {\n return deviceNumber;\n }\n }\n throw new Error(`No last user session for account ${accountId}`);\n}\n"],"mappings":";;;;AAGA,SAAgB,kBACd,OACA,UAA4B,IACb;CACf,MAAM,eAAe,OAAO;CAC5B,MAAM,MAAM,QAAQ,OAAO;AAC3B,KAAI,CAAC,OAAO,cAAc,iBAAiB,eAAe,IACxD,QAAO;AAET,QAAO;;;;;;;AAQT,eAAsB,4BACpB,eACA,UACiB;CACjB,MAAM,YAAYA,+BAAY;CAC9B,MAAM,OAAO,MAAM,SAAS;AAC5B,KAAI,QAAQ,KAAK,kBAAkB,WAAW;EAC5C,MAAM,eAAe,kBAAmB,KAAa,cAAc,EAAE,KAAK;AAC1E,MAAI,iBAAiB,KACnB,QAAO;;AAGX,OAAM,IAAI,MAAM,oCAAoC"}
@@ -8,6 +8,7 @@ const require_rpcCalls = require('../../../rpcCalls.js');
8
8
  //#region src/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.ts
9
9
  require_defaultConfigs.init_defaultConfigs();
10
10
  require_rpcCalls.init_rpcCalls();
11
+ require_credentialsHelpers.init_credentialsHelpers();
11
12
  require_errors.init_errors();
12
13
  require_validation.init_validation();
13
14
  async function checkCanRegisterUser({ ctx, vrfChallenge, credential, contractId, nearRpcUrl, authenticatorOptions, onEvent }) {
@@ -1 +1 @@
1
- {"version":3,"file":"checkCanRegisterUser.js","names":["isObject","isString","serializedCredential: WebAuthnRegistrationCredential","serializeRegistrationCredentialWithPRF","PASSKEY_MANAGER_DEFAULT_CONFIGS","removePrfOutputGuard","result: CheckCanRegisterUserResult","checkCanRegisterUserContractCall","error: unknown","errorMessage"],"sources":["../../../../../../src/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.ts"],"sourcesContent":["\nimport { PASSKEY_MANAGER_DEFAULT_CONFIGS } from \"../../../defaultConfigs\";\nimport type { CheckCanRegisterUserResult } from '../../../rpcCalls';\nimport { checkCanRegisterUserContractCall } from '../../../rpcCalls';\nimport { serializeRegistrationCredentialWithPRF, removePrfOutputGuard } from '../../credentialsHelpers';\nimport { VRFChallenge } from '../../../types/vrf-worker';\nimport type { onProgressEvents } from '../../../types/sdkSentEvents';\nimport type { AuthenticatorOptions } from '../../../types/authenticatorOptions';\nimport { SignerWorkerManagerContext } from '..';\nimport type { WebAuthnRegistrationCredential } from '../../../types/webauthn';\nimport { errorMessage } from '@/utils/errors';\nimport { isObject, isString } from '../../../WalletIframe/validation';\n\n\nexport async function checkCanRegisterUser({\n ctx,\n vrfChallenge,\n credential,\n contractId,\n nearRpcUrl,\n authenticatorOptions,\n onEvent,\n}: {\n ctx: SignerWorkerManagerContext,\n vrfChallenge: VRFChallenge,\n credential: WebAuthnRegistrationCredential,\n contractId: string;\n nearRpcUrl: string;\n authenticatorOptions?: AuthenticatorOptions; // Authenticator options for registration check\n onEvent?: (update: onProgressEvents) => void;\n}): Promise<{\n success: boolean;\n verified?: boolean;\n registrationInfo?: {\n credentialId: Uint8Array;\n credentialPublicKey: Uint8Array;\n userId: string;\n vrfPublicKey: Uint8Array | undefined;\n };\n logs?: string[];\n signedTransactionBorsh?: number[];\n error?: string;\n}> {\n try {\n // Accept either a real PublicKeyCredential or an already-serialized credential\n const isSerialized = (cred: unknown): cred is WebAuthnRegistrationCredential => {\n if (!isObject(cred)) return false;\n const resp = (cred as { response?: unknown }).response;\n if (!isObject(resp)) return false;\n return isString((resp as { clientDataJSON?: unknown }).clientDataJSON)\n && isString((resp as { attestationObject?: unknown }).attestationObject);\n };\n\n const serializedCredential: WebAuthnRegistrationCredential = isSerialized(credential)\n ? credential\n : serializeRegistrationCredentialWithPRF({ credential: credential });\n\n // Ensure required fields are present; avoid undefined which gets dropped by JSON.stringify in the worker\n const resolvedContractId = contractId || PASSKEY_MANAGER_DEFAULT_CONFIGS.contractId;\n\n onEvent?.({\n step: 3,\n phase: 'REGISTRATION_CONTRACT_PRE_CHECK' as any,\n status: 'PROGRESS' as any,\n message: 'Calling check_can_register_user on contract...',\n });\n\n // PRF outputs must never be sent over the network. Strip them before\n // calling the contract while preserving the rest of the credential shape.\n const strippedCredential = removePrfOutputGuard<WebAuthnRegistrationCredential>(serializedCredential);\n\n const result: CheckCanRegisterUserResult = await checkCanRegisterUserContractCall({\n nearClient: ctx.nearClient,\n contractId: resolvedContractId,\n vrfChallenge,\n credential: strippedCredential,\n authenticatorOptions,\n });\n\n if (!result.success) {\n throw new Error(result.error || 'Registration pre-check RPC failed');\n }\n\n const wasmResult = {\n verified: result.verified,\n registrationInfo: undefined,\n logs: result.logs,\n error: result.error,\n };\n\n onEvent?.({\n step: 3,\n phase: 'REGISTRATION_CONTRACT_PRE_CHECK' as any,\n status: result.verified ? 'SUCCESS' as any : 'ERROR' as any,\n message: result.verified ? 'Registration pre-check succeeded' : (result.error || 'Registration pre-check failed'),\n });\n\n return {\n success: true,\n verified: wasmResult.verified,\n registrationInfo: wasmResult.registrationInfo,\n logs: wasmResult.logs,\n error: wasmResult.error,\n };\n\n } catch (error: unknown) {\n // Preserve the detailed error message instead of converting to generic error\n console.error('checkCanRegisterUser failed:', error);\n return {\n success: false,\n verified: false,\n error: errorMessage(error) || 'Unknown error occurred',\n logs: [],\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;AAcA,eAAsB,qBAAqB,EACzC,KACA,cACA,YACA,YACA,YACA,sBACA,WAqBC;AACD,KAAI;EAEF,MAAM,gBAAgB,SAA0D;AAC9E,OAAI,CAACA,4BAAS,MAAO,QAAO;GAC5B,MAAM,OAAQ,KAAgC;AAC9C,OAAI,CAACA,4BAAS,MAAO,QAAO;AAC5B,UAAOC,4BAAU,KAAsC,mBAClDA,4BAAU,KAAyC;;EAG1D,MAAMC,uBAAuD,aAAa,cACtE,aACAC,kEAAuC,EAAc;EAGzD,MAAM,qBAAqB,cAAcC,uDAAgC;AAEzE,YAAU;GACR,MAAM;GACN,OAAO;GACP,QAAQ;GACR,SAAS;;EAKX,MAAM,qBAAqBC,gDAAqD;EAEhF,MAAMC,SAAqC,MAAMC,kDAAiC;GAChF,YAAY,IAAI;GAChB,YAAY;GACZ;GACA,YAAY;GACZ;;AAGF,MAAI,CAAC,OAAO,QACV,OAAM,IAAI,MAAM,OAAO,SAAS;EAGlC,MAAM,aAAa;GACjB,UAAU,OAAO;GACjB,kBAAkB;GAClB,MAAM,OAAO;GACb,OAAO,OAAO;;AAGhB,YAAU;GACR,MAAM;GACN,OAAO;GACP,QAAQ,OAAO,WAAW,YAAmB;GAC7C,SAAS,OAAO,WAAW,qCAAsC,OAAO,SAAS;;AAGnF,SAAO;GACL,SAAS;GACT,UAAU,WAAW;GACrB,kBAAkB,WAAW;GAC7B,MAAM,WAAW;GACjB,OAAO,WAAW;;UAGbC,OAAgB;AAEvB,UAAQ,MAAM,gCAAgC;AAC9C,SAAO;GACL,SAAS;GACT,UAAU;GACV,OAAOC,4BAAa,UAAU;GAC9B,MAAM"}
1
+ {"version":3,"file":"checkCanRegisterUser.js","names":["isObject","isString","serializedCredential: WebAuthnRegistrationCredential","serializeRegistrationCredentialWithPRF","PASSKEY_MANAGER_DEFAULT_CONFIGS","removePrfOutputGuard","result: CheckCanRegisterUserResult","checkCanRegisterUserContractCall","error: unknown","errorMessage"],"sources":["../../../../../../src/core/WebAuthnManager/SignerWorkerManager/handlers/checkCanRegisterUser.ts"],"sourcesContent":["\nimport { PASSKEY_MANAGER_DEFAULT_CONFIGS } from \"../../../defaultConfigs\";\nimport type { CheckCanRegisterUserResult } from '../../../rpcCalls';\nimport { checkCanRegisterUserContractCall } from '../../../rpcCalls';\nimport { serializeRegistrationCredentialWithPRF, removePrfOutputGuard } from '../../credentialsHelpers';\nimport { VRFChallenge } from '../../../types/vrf-worker';\nimport type { onProgressEvents } from '../../../types/sdkSentEvents';\nimport type { AuthenticatorOptions } from '../../../types/authenticatorOptions';\nimport { SignerWorkerManagerContext } from '..';\nimport type { WebAuthnRegistrationCredential } from '../../../types/webauthn';\nimport { errorMessage } from '@/utils/errors';\nimport { isObject, isString } from '../../../WalletIframe/validation';\n\n\nexport async function checkCanRegisterUser({\n ctx,\n vrfChallenge,\n credential,\n contractId,\n nearRpcUrl,\n authenticatorOptions,\n onEvent,\n}: {\n ctx: SignerWorkerManagerContext,\n vrfChallenge: VRFChallenge,\n credential: WebAuthnRegistrationCredential,\n contractId: string;\n nearRpcUrl: string;\n authenticatorOptions?: AuthenticatorOptions; // Authenticator options for registration check\n onEvent?: (update: onProgressEvents) => void;\n}): Promise<{\n success: boolean;\n verified?: boolean;\n registrationInfo?: {\n credentialId: Uint8Array;\n credentialPublicKey: Uint8Array;\n userId: string;\n vrfPublicKey: Uint8Array | undefined;\n };\n logs?: string[];\n signedTransactionBorsh?: number[];\n error?: string;\n}> {\n try {\n // Accept either a real PublicKeyCredential or an already-serialized credential\n const isSerialized = (cred: unknown): cred is WebAuthnRegistrationCredential => {\n if (!isObject(cred)) return false;\n const resp = (cred as { response?: unknown }).response;\n if (!isObject(resp)) return false;\n return isString((resp as { clientDataJSON?: unknown }).clientDataJSON)\n && isString((resp as { attestationObject?: unknown }).attestationObject);\n };\n\n const serializedCredential: WebAuthnRegistrationCredential = isSerialized(credential)\n ? credential\n : serializeRegistrationCredentialWithPRF({ credential: credential });\n\n // Ensure required fields are present; avoid undefined which gets dropped by JSON.stringify in the worker\n const resolvedContractId = contractId || PASSKEY_MANAGER_DEFAULT_CONFIGS.contractId;\n\n onEvent?.({\n step: 3,\n phase: 'REGISTRATION_CONTRACT_PRE_CHECK' as any,\n status: 'PROGRESS' as any,\n message: 'Calling check_can_register_user on contract...',\n });\n\n // PRF outputs must never be sent over the network. Strip them before\n // calling the contract while preserving the rest of the credential shape.\n const strippedCredential = removePrfOutputGuard<WebAuthnRegistrationCredential>(serializedCredential);\n\n const result: CheckCanRegisterUserResult = await checkCanRegisterUserContractCall({\n nearClient: ctx.nearClient,\n contractId: resolvedContractId,\n vrfChallenge,\n credential: strippedCredential,\n authenticatorOptions,\n });\n\n if (!result.success) {\n throw new Error(result.error || 'Registration pre-check RPC failed');\n }\n\n const wasmResult = {\n verified: result.verified,\n registrationInfo: undefined,\n logs: result.logs,\n error: result.error,\n };\n\n onEvent?.({\n step: 3,\n phase: 'REGISTRATION_CONTRACT_PRE_CHECK' as any,\n status: result.verified ? 'SUCCESS' as any : 'ERROR' as any,\n message: result.verified ? 'Registration pre-check succeeded' : (result.error || 'Registration pre-check failed'),\n });\n\n return {\n success: true,\n verified: wasmResult.verified,\n registrationInfo: wasmResult.registrationInfo,\n logs: wasmResult.logs,\n error: wasmResult.error,\n };\n\n } catch (error: unknown) {\n // Preserve the detailed error message instead of converting to generic error\n console.error('checkCanRegisterUser failed:', error);\n return {\n success: false,\n verified: false,\n error: errorMessage(error) || 'Unknown error occurred',\n logs: [],\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAcA,eAAsB,qBAAqB,EACzC,KACA,cACA,YACA,YACA,YACA,sBACA,WAqBC;AACD,KAAI;EAEF,MAAM,gBAAgB,SAA0D;AAC9E,OAAI,CAACA,4BAAS,MAAO,QAAO;GAC5B,MAAM,OAAQ,KAAgC;AAC9C,OAAI,CAACA,4BAAS,MAAO,QAAO;AAC5B,UAAOC,4BAAU,KAAsC,mBAClDA,4BAAU,KAAyC;;EAG1D,MAAMC,uBAAuD,aAAa,cACtE,aACAC,kEAAuC,EAAc;EAGzD,MAAM,qBAAqB,cAAcC,uDAAgC;AAEzE,YAAU;GACR,MAAM;GACN,OAAO;GACP,QAAQ;GACR,SAAS;;EAKX,MAAM,qBAAqBC,gDAAqD;EAEhF,MAAMC,SAAqC,MAAMC,kDAAiC;GAChF,YAAY,IAAI;GAChB,YAAY;GACZ;GACA,YAAY;GACZ;;AAGF,MAAI,CAAC,OAAO,QACV,OAAM,IAAI,MAAM,OAAO,SAAS;EAGlC,MAAM,aAAa;GACjB,UAAU,OAAO;GACjB,kBAAkB;GAClB,MAAM,OAAO;GACb,OAAO,OAAO;;AAGhB,YAAU;GACR,MAAM;GACN,OAAO;GACP,QAAQ,OAAO,WAAW,YAAmB;GAC7C,SAAS,OAAO,WAAW,qCAAsC,OAAO,SAAS;;AAGnF,SAAO;GACL,SAAS;GACT,UAAU,WAAW;GACrB,kBAAkB,WAAW;GAC7B,MAAM,WAAW;GACjB,OAAO,WAAW;;UAGbC,OAAgB;AAEvB,UAAQ,MAAM,gCAAgC;AAC9C,SAAO;GACL,SAAS;GACT,UAAU;GACV,OAAOC,4BAAa,UAAU;GAC9B,MAAM"}
@@ -10,6 +10,7 @@ src_wasm_signer_worker_pkg_wasm_signer_worker_js = require_rolldown_runtime.__to
10
10
  //#region src/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.ts
11
11
  require_signer_worker.init_signer_worker();
12
12
  require_accountIds.init_accountIds();
13
+ require_getDeviceNumber.init_getDeviceNumber();
13
14
  require_validation.init_validation();
14
15
  async function decryptPrivateKeyWithPrf({ ctx, nearAccountId, authenticators, sessionId }) {
15
16
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"decryptPrivateKeyWithPrf.js","names":["getLastLoggedInDeviceNumber","WorkerRequestType","withSessionId","isDecryptPrivateKeyWithPrfSuccess","isObject","toAccountId","error: unknown"],"sources":["../../../../../../src/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.ts"],"sourcesContent":["\nimport { ClientAuthenticatorData } from '../../../IndexedDBManager';\nimport {\n WorkerRequestType,\n isDecryptPrivateKeyWithPrfSuccess,\n} from '../../../types/signer-worker';\nimport { AccountId, toAccountId } from \"../../../types/accountIds\";\n\nimport { SignerWorkerManagerContext } from '..';\nimport { getLastLoggedInDeviceNumber } from '../getDeviceNumber';\nimport { isObject } from '../../../WalletIframe/validation';\nimport { withSessionId } from './session';\n\nexport async function decryptPrivateKeyWithPrf({\n ctx,\n nearAccountId,\n authenticators,\n sessionId,\n}: {\n ctx: SignerWorkerManagerContext,\n nearAccountId: AccountId,\n authenticators: ClientAuthenticatorData[],\n sessionId: string,\n}): Promise<{ decryptedPrivateKey: string; nearAccountId: AccountId }> {\n try {\n console.info('WebAuthnManager: Starting private key decryption with dual PRF (local operation)');\n // Retrieve encrypted key data from IndexedDB in main thread\n const deviceNumber = await getLastLoggedInDeviceNumber(nearAccountId, ctx.indexedDB.clientDB);\n const encryptedKeyData = await ctx.indexedDB.nearKeysDB.getEncryptedKey(nearAccountId, deviceNumber);\n if (!encryptedKeyData) {\n throw new Error(`No encrypted key found for account: ${nearAccountId}`);\n }\n\n const response = await ctx.sendMessage({\n sessionId,\n message: {\n type: WorkerRequestType.DecryptPrivateKeyWithPrf,\n payload: withSessionId(sessionId, {\n nearAccountId: nearAccountId,\n encryptedPrivateKeyData: encryptedKeyData.encryptedData,\n encryptedPrivateKeyChacha20NonceB64u: encryptedKeyData.chacha20NonceB64u,\n })\n },\n });\n\n if (!isDecryptPrivateKeyWithPrfSuccess(response)) {\n console.error('WebAuthnManager: Dual PRF private key decryption failed:', response);\n const payloadError = isObject(response?.payload) && (response as any)?.payload?.error;\n throw new Error(payloadError || 'Private key decryption failed');\n }\n return {\n decryptedPrivateKey: response.payload.privateKey,\n nearAccountId: toAccountId(response.payload.nearAccountId)\n };\n } catch (error: unknown) {\n console.error('WebAuthnManager: Dual PRF private key decryption error:', error);\n throw error;\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAaA,eAAsB,yBAAyB,EAC7C,KACA,eACA,gBACA,aAMqE;AACrE,KAAI;AACF,UAAQ,KAAK;EAEb,MAAM,eAAe,MAAMA,oDAA4B,eAAe,IAAI,UAAU;EACpF,MAAM,mBAAmB,MAAM,IAAI,UAAU,WAAW,gBAAgB,eAAe;AACvF,MAAI,CAAC,iBACH,OAAM,IAAI,MAAM,uCAAuC;EAGzD,MAAM,WAAW,MAAM,IAAI,YAAY;GACrC;GACA,SAAS;IACP,MAAMC,mEAAkB;IACxB,SAASC,8BAAc,WAAW;KACjB;KACf,yBAAyB,iBAAiB;KAC1C,sCAAsC,iBAAiB;;;;AAK7D,MAAI,CAACC,wDAAkC,WAAW;AAChD,WAAQ,MAAM,4DAA4D;GAC1E,MAAM,eAAeC,4BAAS,UAAU,YAAa,UAAkB,SAAS;AAChF,SAAM,IAAI,MAAM,gBAAgB;;AAElC,SAAO;GACL,qBAAqB,SAAS,QAAQ;GACtC,eAAeC,+BAAY,SAAS,QAAQ;;UAEvCC,OAAgB;AACvB,UAAQ,MAAM,2DAA2D;AACzE,QAAM"}
1
+ {"version":3,"file":"decryptPrivateKeyWithPrf.js","names":["getLastLoggedInDeviceNumber","WorkerRequestType","withSessionId","isDecryptPrivateKeyWithPrfSuccess","isObject","toAccountId","error: unknown"],"sources":["../../../../../../src/core/WebAuthnManager/SignerWorkerManager/handlers/decryptPrivateKeyWithPrf.ts"],"sourcesContent":["\nimport { ClientAuthenticatorData } from '../../../IndexedDBManager';\nimport {\n WorkerRequestType,\n isDecryptPrivateKeyWithPrfSuccess,\n} from '../../../types/signer-worker';\nimport { AccountId, toAccountId } from \"../../../types/accountIds\";\n\nimport { SignerWorkerManagerContext } from '..';\nimport { getLastLoggedInDeviceNumber } from '../getDeviceNumber';\nimport { isObject } from '../../../WalletIframe/validation';\nimport { withSessionId } from './session';\n\nexport async function decryptPrivateKeyWithPrf({\n ctx,\n nearAccountId,\n authenticators,\n sessionId,\n}: {\n ctx: SignerWorkerManagerContext,\n nearAccountId: AccountId,\n authenticators: ClientAuthenticatorData[],\n sessionId: string,\n}): Promise<{ decryptedPrivateKey: string; nearAccountId: AccountId }> {\n try {\n console.info('WebAuthnManager: Starting private key decryption with dual PRF (local operation)');\n // Retrieve encrypted key data from IndexedDB in main thread\n const deviceNumber = await getLastLoggedInDeviceNumber(nearAccountId, ctx.indexedDB.clientDB);\n const encryptedKeyData = await ctx.indexedDB.nearKeysDB.getEncryptedKey(nearAccountId, deviceNumber);\n if (!encryptedKeyData) {\n throw new Error(`No encrypted key found for account: ${nearAccountId}`);\n }\n\n const response = await ctx.sendMessage({\n sessionId,\n message: {\n type: WorkerRequestType.DecryptPrivateKeyWithPrf,\n payload: withSessionId(sessionId, {\n nearAccountId: nearAccountId,\n encryptedPrivateKeyData: encryptedKeyData.encryptedData,\n encryptedPrivateKeyChacha20NonceB64u: encryptedKeyData.chacha20NonceB64u,\n })\n },\n });\n\n if (!isDecryptPrivateKeyWithPrfSuccess(response)) {\n console.error('WebAuthnManager: Dual PRF private key decryption failed:', response);\n const payloadError = isObject(response?.payload) && (response as any)?.payload?.error;\n throw new Error(payloadError || 'Private key decryption failed');\n }\n return {\n decryptedPrivateKey: response.payload.privateKey,\n nearAccountId: toAccountId(response.payload.nearAccountId)\n };\n } catch (error: unknown) {\n console.error('WebAuthnManager: Dual PRF private key decryption error:', error);\n throw error;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAaA,eAAsB,yBAAyB,EAC7C,KACA,eACA,gBACA,aAMqE;AACrE,KAAI;AACF,UAAQ,KAAK;EAEb,MAAM,eAAe,MAAMA,oDAA4B,eAAe,IAAI,UAAU;EACpF,MAAM,mBAAmB,MAAM,IAAI,UAAU,WAAW,gBAAgB,eAAe;AACvF,MAAI,CAAC,iBACH,OAAM,IAAI,MAAM,uCAAuC;EAGzD,MAAM,WAAW,MAAM,IAAI,YAAY;GACrC;GACA,SAAS;IACP,MAAMC,mEAAkB;IACxB,SAASC,8BAAc,WAAW;KACjB;KACf,yBAAyB,iBAAiB;KAC1C,sCAAsC,iBAAiB;;;;AAK7D,MAAI,CAACC,wDAAkC,WAAW;AAChD,WAAQ,MAAM,4DAA4D;GAC1E,MAAM,eAAeC,4BAAS,UAAU,YAAa,UAAkB,SAAS;AAChF,SAAM,IAAI,MAAM,gBAAgB;;AAElC,SAAO;GACL,qBAAqB,SAAS,QAAQ;GACtC,eAAeC,+BAAY,SAAS,QAAQ;;UAEvCC,OAAgB;AACvB,UAAQ,MAAM,2DAA2D;AACzE,QAAM"}
@@ -10,6 +10,7 @@ src_wasm_signer_worker_pkg_wasm_signer_worker_js = require_rolldown_runtime.__to
10
10
  //#region src/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.ts
11
11
  require_signer_worker.init_signer_worker();
12
12
  require_accountIds.init_accountIds();
13
+ require_getDeviceNumber.init_getDeviceNumber();
13
14
  /**
14
15
  * Derive NEAR keypair and encrypt it from a serialized WebAuthn registration credential
15
16
  * (shape compatible with SerializedRegistrationCredential from WASM) by extracting PRF outputs from it.
@@ -1 +1 @@
1
- {"version":3,"file":"deriveNearKeypairAndEncryptFromSerialized.js","names":["WorkerRequestType","withSessionId","toEnumUserVerificationPolicy","isDeriveNearKeypairAndEncryptSuccess","getLastLoggedInDeviceNumber","keyData: EncryptedKeyData","toAccountId","error: unknown"],"sources":["../../../../../../src/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.ts"],"sourcesContent":["\nimport type { EncryptedKeyData } from '../../../IndexedDBManager/passkeyNearKeysDB';\nimport type { AuthenticatorOptions } from '../../../types/authenticatorOptions';\nimport {\n WorkerRequestType,\n isDeriveNearKeypairAndEncryptSuccess,\n} from '../../../types/signer-worker';\nimport { AccountId, toAccountId } from \"../../../types/accountIds\";\nimport { getLastLoggedInDeviceNumber } from '../getDeviceNumber';\nimport { SignerWorkerManagerContext } from '..';\nimport type { WebAuthnRegistrationCredential } from '@/core/types/webauthn';\nimport { toEnumUserVerificationPolicy } from '../../../types/authenticatorOptions';\nimport { withSessionId } from './session';\n\n/**\n * Derive NEAR keypair and encrypt it from a serialized WebAuthn registration credential\n * (shape compatible with SerializedRegistrationCredential from WASM) by extracting PRF outputs from it.\n */\nexport async function deriveNearKeypairAndEncryptFromSerialized({\n ctx,\n credential,\n nearAccountId,\n options,\n sessionId,\n}: {\n ctx: SignerWorkerManagerContext,\n credential: WebAuthnRegistrationCredential;\n nearAccountId: AccountId,\n options?: {\n authenticatorOptions?: AuthenticatorOptions;\n deviceNumber?: number;\n };\n sessionId: string;\n}): Promise<{\n success: boolean;\n nearAccountId: AccountId;\n publicKey: string;\n /**\n * Base64url-encoded AEAD nonce (ChaCha20-Poly1305) for the encrypted private key.\n */\n chacha20NonceB64u?: string;\n wrapKeySalt?: string;\n error?: string;\n}> {\n try {\n // PRF outputs are now extracted by VRF worker and delivered to signer worker via MessagePort\n // No need to extract or send them through main thread\n if (!sessionId) throw new Error('Missing sessionId for registration WrapKeySeed delivery');\n\n const response = await ctx.sendMessage<WorkerRequestType.DeriveNearKeypairAndEncrypt>({\n sessionId,\n message: {\n type: WorkerRequestType.DeriveNearKeypairAndEncrypt,\n payload: withSessionId(sessionId, {\n nearAccountId: nearAccountId,\n credential,\n authenticatorOptions: options?.authenticatorOptions ? {\n userVerification: toEnumUserVerificationPolicy(options.authenticatorOptions.userVerification),\n originPolicy: options.authenticatorOptions.originPolicy,\n } : undefined,\n })\n },\n });\n\n if (!isDeriveNearKeypairAndEncryptSuccess(response)) {\n throw new Error('Dual PRF registration (from serialized) failed');\n }\n\n const wasmResult = response.payload;\n const version = (wasmResult as any).version ?? 2;\n const wrapKeySaltPersisted = wasmResult.wrapKeySalt;\n // Prefer explicitly provided deviceNumber, else derive from IndexedDB state\n const deviceNumber = (typeof options?.deviceNumber === 'number')\n ? options!.deviceNumber!\n : await getLastLoggedInDeviceNumber(nearAccountId, ctx.indexedDB.clientDB);\n const chacha20NonceB64u = wasmResult.chacha20NonceB64u;\n if (!chacha20NonceB64u) {\n throw new Error('Missing chacha20NonceB64u in deriveNearKeypairAndEncrypt result');\n }\n const keyData: EncryptedKeyData = {\n nearAccountId: nearAccountId,\n deviceNumber,\n encryptedData: wasmResult.encryptedData,\n chacha20NonceB64u,\n wrapKeySalt: wrapKeySaltPersisted,\n version,\n timestamp: Date.now()\n };\n await ctx.indexedDB.nearKeysDB.storeEncryptedKey(keyData);\n\n return {\n success: true,\n nearAccountId: toAccountId(wasmResult.nearAccountId),\n publicKey: wasmResult.publicKey,\n chacha20NonceB64u,\n wrapKeySalt: wrapKeySaltPersisted,\n };\n } catch (error: unknown) {\n console.error('WebAuthnManager: deriveNearKeypairAndEncryptFromSerialized error:', error);\n const message = String((error as { message?: unknown })?.message || error || '');\n return {\n success: false,\n nearAccountId,\n publicKey: '',\n error: message\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAkBA,eAAsB,0CAA0C,EAC9D,KACA,YACA,eACA,SACA,aAoBC;AACD,KAAI;AAGF,MAAI,CAAC,UAAW,OAAM,IAAI,MAAM;EAEhC,MAAM,WAAW,MAAM,IAAI,YAA2D;GACpF;GACA,SAAS;IACP,MAAMA,mEAAkB;IACxB,SAASC,8BAAc,WAAW;KACjB;KACf;KACA,sBAAsB,SAAS,uBAAuB;MACpD,kBAAkBC,0DAA6B,QAAQ,qBAAqB;MAC5E,cAAc,QAAQ,qBAAqB;SACzC;;;;AAKV,MAAI,CAACC,2DAAqC,UACxC,OAAM,IAAI,MAAM;EAGlB,MAAM,aAAa,SAAS;EAC5B,MAAM,UAAW,WAAmB,WAAW;EAC/C,MAAM,uBAAuB,WAAW;EAExC,MAAM,eAAgB,OAAO,SAAS,iBAAiB,WACnD,QAAS,eACT,MAAMC,oDAA4B,eAAe,IAAI,UAAU;EACnE,MAAM,oBAAoB,WAAW;AACrC,MAAI,CAAC,kBACH,OAAM,IAAI,MAAM;EAElB,MAAMC,UAA4B;GACjB;GACf;GACA,eAAe,WAAW;GAC1B;GACA,aAAa;GACb;GACA,WAAW,KAAK;;AAElB,QAAM,IAAI,UAAU,WAAW,kBAAkB;AAEjD,SAAO;GACL,SAAS;GACT,eAAeC,+BAAY,WAAW;GACtC,WAAW,WAAW;GACtB;GACA,aAAa;;UAERC,OAAgB;AACvB,UAAQ,MAAM,qEAAqE;EACnF,MAAM,UAAU,OAAQ,OAAiC,WAAW,SAAS;AAC7E,SAAO;GACL,SAAS;GACT;GACA,WAAW;GACX,OAAO"}
1
+ {"version":3,"file":"deriveNearKeypairAndEncryptFromSerialized.js","names":["WorkerRequestType","withSessionId","toEnumUserVerificationPolicy","isDeriveNearKeypairAndEncryptSuccess","getLastLoggedInDeviceNumber","keyData: EncryptedKeyData","toAccountId","error: unknown"],"sources":["../../../../../../src/core/WebAuthnManager/SignerWorkerManager/handlers/deriveNearKeypairAndEncryptFromSerialized.ts"],"sourcesContent":["\nimport type { EncryptedKeyData } from '../../../IndexedDBManager/passkeyNearKeysDB';\nimport type { AuthenticatorOptions } from '../../../types/authenticatorOptions';\nimport {\n WorkerRequestType,\n isDeriveNearKeypairAndEncryptSuccess,\n} from '../../../types/signer-worker';\nimport { AccountId, toAccountId } from \"../../../types/accountIds\";\nimport { getLastLoggedInDeviceNumber } from '../getDeviceNumber';\nimport { SignerWorkerManagerContext } from '..';\nimport type { WebAuthnRegistrationCredential } from '@/core/types/webauthn';\nimport { toEnumUserVerificationPolicy } from '../../../types/authenticatorOptions';\nimport { withSessionId } from './session';\n\n/**\n * Derive NEAR keypair and encrypt it from a serialized WebAuthn registration credential\n * (shape compatible with SerializedRegistrationCredential from WASM) by extracting PRF outputs from it.\n */\nexport async function deriveNearKeypairAndEncryptFromSerialized({\n ctx,\n credential,\n nearAccountId,\n options,\n sessionId,\n}: {\n ctx: SignerWorkerManagerContext,\n credential: WebAuthnRegistrationCredential;\n nearAccountId: AccountId,\n options?: {\n authenticatorOptions?: AuthenticatorOptions;\n deviceNumber?: number;\n };\n sessionId: string;\n}): Promise<{\n success: boolean;\n nearAccountId: AccountId;\n publicKey: string;\n /**\n * Base64url-encoded AEAD nonce (ChaCha20-Poly1305) for the encrypted private key.\n */\n chacha20NonceB64u?: string;\n wrapKeySalt?: string;\n error?: string;\n}> {\n try {\n // PRF outputs are now extracted by VRF worker and delivered to signer worker via MessagePort\n // No need to extract or send them through main thread\n if (!sessionId) throw new Error('Missing sessionId for registration WrapKeySeed delivery');\n\n const response = await ctx.sendMessage<WorkerRequestType.DeriveNearKeypairAndEncrypt>({\n sessionId,\n message: {\n type: WorkerRequestType.DeriveNearKeypairAndEncrypt,\n payload: withSessionId(sessionId, {\n nearAccountId: nearAccountId,\n credential,\n authenticatorOptions: options?.authenticatorOptions ? {\n userVerification: toEnumUserVerificationPolicy(options.authenticatorOptions.userVerification),\n originPolicy: options.authenticatorOptions.originPolicy,\n } : undefined,\n })\n },\n });\n\n if (!isDeriveNearKeypairAndEncryptSuccess(response)) {\n throw new Error('Dual PRF registration (from serialized) failed');\n }\n\n const wasmResult = response.payload;\n const version = (wasmResult as any).version ?? 2;\n const wrapKeySaltPersisted = wasmResult.wrapKeySalt;\n // Prefer explicitly provided deviceNumber, else derive from IndexedDB state\n const deviceNumber = (typeof options?.deviceNumber === 'number')\n ? options!.deviceNumber!\n : await getLastLoggedInDeviceNumber(nearAccountId, ctx.indexedDB.clientDB);\n const chacha20NonceB64u = wasmResult.chacha20NonceB64u;\n if (!chacha20NonceB64u) {\n throw new Error('Missing chacha20NonceB64u in deriveNearKeypairAndEncrypt result');\n }\n const keyData: EncryptedKeyData = {\n nearAccountId: nearAccountId,\n deviceNumber,\n encryptedData: wasmResult.encryptedData,\n chacha20NonceB64u,\n wrapKeySalt: wrapKeySaltPersisted,\n version,\n timestamp: Date.now()\n };\n await ctx.indexedDB.nearKeysDB.storeEncryptedKey(keyData);\n\n return {\n success: true,\n nearAccountId: toAccountId(wasmResult.nearAccountId),\n publicKey: wasmResult.publicKey,\n chacha20NonceB64u,\n wrapKeySalt: wrapKeySaltPersisted,\n };\n } catch (error: unknown) {\n console.error('WebAuthnManager: deriveNearKeypairAndEncryptFromSerialized error:', error);\n const message = String((error as { message?: unknown })?.message || error || '');\n return {\n success: false,\n nearAccountId,\n publicKey: '',\n error: message\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,eAAsB,0CAA0C,EAC9D,KACA,YACA,eACA,SACA,aAoBC;AACD,KAAI;AAGF,MAAI,CAAC,UAAW,OAAM,IAAI,MAAM;EAEhC,MAAM,WAAW,MAAM,IAAI,YAA2D;GACpF;GACA,SAAS;IACP,MAAMA,mEAAkB;IACxB,SAASC,8BAAc,WAAW;KACjB;KACf;KACA,sBAAsB,SAAS,uBAAuB;MACpD,kBAAkBC,0DAA6B,QAAQ,qBAAqB;MAC5E,cAAc,QAAQ,qBAAqB;SACzC;;;;AAKV,MAAI,CAACC,2DAAqC,UACxC,OAAM,IAAI,MAAM;EAGlB,MAAM,aAAa,SAAS;EAC5B,MAAM,UAAW,WAAmB,WAAW;EAC/C,MAAM,uBAAuB,WAAW;EAExC,MAAM,eAAgB,OAAO,SAAS,iBAAiB,WACnD,QAAS,eACT,MAAMC,oDAA4B,eAAe,IAAI,UAAU;EACnE,MAAM,oBAAoB,WAAW;AACrC,MAAI,CAAC,kBACH,OAAM,IAAI,MAAM;EAElB,MAAMC,UAA4B;GACjB;GACf;GACA,eAAe,WAAW;GAC1B;GACA,aAAa;GACb;GACA,WAAW,KAAK;;AAElB,QAAM,IAAI,UAAU,WAAW,kBAAkB;AAEjD,SAAO;GACL,SAAS;GACT,eAAeC,+BAAY,WAAW;GACtC,WAAW,WAAW;GACtB;GACA,aAAa;;UAERC,OAAgB;AACvB,UAAQ,MAAM,qEAAqE;EACnF,MAAM,UAAU,OAAQ,OAAiC,WAAW,SAAS;AAC7E,SAAO;GACL,SAAS;GACT;GACA,WAAW;GACX,OAAO"}
@@ -12,6 +12,7 @@ src_wasm_signer_worker_pkg_wasm_signer_worker_js = require_rolldown_runtime.__to
12
12
  require_validation.init_validation();
13
13
  require_accountIds.init_accountIds();
14
14
  require_signer_worker.init_signer_worker();
15
+ require_getDeviceNumber.init_getDeviceNumber();
15
16
  /**
16
17
  * Two-phase export (worker-driven):
17
18
  * - Phase 1: collect PRF (uiMode: 'skip') and derive WrapKeySeed in VRF worker
@@ -1 +1 @@
1
- {"version":3,"file":"exportNearKeypairUi.js","names":["toAccountId","getLastLoggedInDeviceNumber","WorkerRequestType","isDecryptPrivateKeyWithPrfSuccess","isObject","SecureConfirmationType","runSecureConfirm"],"sources":["../../../../../../src/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.ts"],"sourcesContent":["import { isObject } from '../../../WalletIframe/validation';\nimport { AccountId, toAccountId } from '../../../types/accountIds';\nimport {\n WorkerRequestType,\n isDecryptPrivateKeyWithPrfSuccess,\n} from '../../../types/signer-worker';\nimport { runSecureConfirm } from '../../VrfWorkerManager/secureConfirmBridge';\nimport { SecureConfirmationType } from '../../VrfWorkerManager/confirmTxFlow/types';\nimport { SignerWorkerManagerContext } from '..';\nimport { getLastLoggedInDeviceNumber } from '../getDeviceNumber';\n\n/**\n * Two-phase export (worker-driven):\n * - Phase 1: collect PRF (uiMode: 'skip') and derive WrapKeySeed in VRF worker\n * - Decrypt inside signer worker (session-bound)\n * - Phase 2: show export UI with decrypted key (kept open until user closes)\n */\nexport async function exportNearKeypairUi({\n ctx,\n nearAccountId,\n variant,\n theme,\n sessionId,\n}: {\n ctx: SignerWorkerManagerContext;\n nearAccountId: AccountId;\n variant?: 'drawer' | 'modal';\n theme?: 'dark' | 'light';\n sessionId: string;\n}): Promise<void> {\n const accountId = toAccountId(nearAccountId);\n\n // Gather encrypted key + ChaCha20 nonce and public key from IndexedDB\n const deviceNumber = await getLastLoggedInDeviceNumber(accountId, ctx.indexedDB.clientDB);\n const [keyData, user] = await Promise.all([\n ctx.indexedDB.nearKeysDB.getEncryptedKey(accountId, deviceNumber),\n ctx.indexedDB.clientDB.getUserByDevice(accountId, deviceNumber),\n ]);\n const publicKey = user?.clientNearPublicKey || '';\n if (!keyData || !publicKey) {\n throw new Error('Missing local key material for export. Re-register to upgrade vault.');\n }\n\n // Decrypt inside signer worker using the reserved session\n const response = await ctx.sendMessage<WorkerRequestType.DecryptPrivateKeyWithPrf>({\n sessionId,\n message: {\n type: WorkerRequestType.DecryptPrivateKeyWithPrf,\n payload: {\n nearAccountId: accountId,\n encryptedPrivateKeyData: keyData.encryptedData,\n encryptedPrivateKeyChacha20NonceB64u: keyData.chacha20NonceB64u,\n },\n },\n });\n\n if (!isDecryptPrivateKeyWithPrfSuccess(response)) {\n console.error('WebAuthnManager: Export decrypt failed:', response);\n const payloadError = isObject(response?.payload) && response?.payload?.error;\n const msg = String(payloadError || 'Export decrypt failed');\n throw new Error(msg);\n }\n\n const privateKey = response.payload.privateKey;\n\n // Phase 2: show secure UI (VRF-driven viewer)\n const showReq = {\n schemaVersion: 2 as const,\n requestId: sessionId,\n type: SecureConfirmationType.SHOW_SECURE_PRIVATE_KEY_UI,\n summary: {\n operation: 'Export Private Key' as const,\n accountId,\n publicKey,\n warning: 'Anyone with your private key can fully control your account. Never share it.',\n },\n payload: {\n nearAccountId: accountId,\n publicKey,\n privateKey,\n variant,\n theme,\n },\n };\n await runSecureConfirm(ctx, showReq);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAiBA,eAAsB,oBAAoB,EACxC,KACA,eACA,SACA,OACA,aAOgB;CAChB,MAAM,YAAYA,+BAAY;CAG9B,MAAM,eAAe,MAAMC,oDAA4B,WAAW,IAAI,UAAU;CAChF,MAAM,CAAC,SAAS,QAAQ,MAAM,QAAQ,IAAI,CACxC,IAAI,UAAU,WAAW,gBAAgB,WAAW,eACpD,IAAI,UAAU,SAAS,gBAAgB,WAAW;CAEpD,MAAM,YAAY,MAAM,uBAAuB;AAC/C,KAAI,CAAC,WAAW,CAAC,UACf,OAAM,IAAI,MAAM;CAIlB,MAAM,WAAW,MAAM,IAAI,YAAwD;EACjF;EACA,SAAS;GACP,MAAMC,mEAAkB;GACxB,SAAS;IACP,eAAe;IACf,yBAAyB,QAAQ;IACjC,sCAAsC,QAAQ;;;;AAKpD,KAAI,CAACC,wDAAkC,WAAW;AAChD,UAAQ,MAAM,2CAA2C;EACzD,MAAM,eAAeC,4BAAS,UAAU,YAAY,UAAU,SAAS;EACvE,MAAM,MAAM,OAAO,gBAAgB;AACnC,QAAM,IAAI,MAAM;;CAGlB,MAAM,aAAa,SAAS,QAAQ;CAGpC,MAAM,UAAU;EACd,eAAe;EACf,WAAW;EACX,MAAMC,qCAAuB;EAC7B,SAAS;GACP,WAAW;GACX;GACA;GACA,SAAS;;EAEX,SAAS;GACP,eAAe;GACf;GACA;GACA;GACA;;;AAGJ,OAAMC,6CAAiB,KAAK"}
1
+ {"version":3,"file":"exportNearKeypairUi.js","names":["toAccountId","getLastLoggedInDeviceNumber","WorkerRequestType","isDecryptPrivateKeyWithPrfSuccess","isObject","SecureConfirmationType","runSecureConfirm"],"sources":["../../../../../../src/core/WebAuthnManager/SignerWorkerManager/handlers/exportNearKeypairUi.ts"],"sourcesContent":["import { isObject } from '../../../WalletIframe/validation';\nimport { AccountId, toAccountId } from '../../../types/accountIds';\nimport {\n WorkerRequestType,\n isDecryptPrivateKeyWithPrfSuccess,\n} from '../../../types/signer-worker';\nimport { runSecureConfirm } from '../../VrfWorkerManager/secureConfirmBridge';\nimport { SecureConfirmationType } from '../../VrfWorkerManager/confirmTxFlow/types';\nimport { SignerWorkerManagerContext } from '..';\nimport { getLastLoggedInDeviceNumber } from '../getDeviceNumber';\n\n/**\n * Two-phase export (worker-driven):\n * - Phase 1: collect PRF (uiMode: 'skip') and derive WrapKeySeed in VRF worker\n * - Decrypt inside signer worker (session-bound)\n * - Phase 2: show export UI with decrypted key (kept open until user closes)\n */\nexport async function exportNearKeypairUi({\n ctx,\n nearAccountId,\n variant,\n theme,\n sessionId,\n}: {\n ctx: SignerWorkerManagerContext;\n nearAccountId: AccountId;\n variant?: 'drawer' | 'modal';\n theme?: 'dark' | 'light';\n sessionId: string;\n}): Promise<void> {\n const accountId = toAccountId(nearAccountId);\n\n // Gather encrypted key + ChaCha20 nonce and public key from IndexedDB\n const deviceNumber = await getLastLoggedInDeviceNumber(accountId, ctx.indexedDB.clientDB);\n const [keyData, user] = await Promise.all([\n ctx.indexedDB.nearKeysDB.getEncryptedKey(accountId, deviceNumber),\n ctx.indexedDB.clientDB.getUserByDevice(accountId, deviceNumber),\n ]);\n const publicKey = user?.clientNearPublicKey || '';\n if (!keyData || !publicKey) {\n throw new Error('Missing local key material for export. Re-register to upgrade vault.');\n }\n\n // Decrypt inside signer worker using the reserved session\n const response = await ctx.sendMessage<WorkerRequestType.DecryptPrivateKeyWithPrf>({\n sessionId,\n message: {\n type: WorkerRequestType.DecryptPrivateKeyWithPrf,\n payload: {\n nearAccountId: accountId,\n encryptedPrivateKeyData: keyData.encryptedData,\n encryptedPrivateKeyChacha20NonceB64u: keyData.chacha20NonceB64u,\n },\n },\n });\n\n if (!isDecryptPrivateKeyWithPrfSuccess(response)) {\n console.error('WebAuthnManager: Export decrypt failed:', response);\n const payloadError = isObject(response?.payload) && response?.payload?.error;\n const msg = String(payloadError || 'Export decrypt failed');\n throw new Error(msg);\n }\n\n const privateKey = response.payload.privateKey;\n\n // Phase 2: show secure UI (VRF-driven viewer)\n const showReq = {\n schemaVersion: 2 as const,\n requestId: sessionId,\n type: SecureConfirmationType.SHOW_SECURE_PRIVATE_KEY_UI,\n summary: {\n operation: 'Export Private Key' as const,\n accountId,\n publicKey,\n warning: 'Anyone with your private key can fully control your account. Never share it.',\n },\n payload: {\n nearAccountId: accountId,\n publicKey,\n privateKey,\n variant,\n theme,\n },\n };\n await runSecureConfirm(ctx, showReq);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAiBA,eAAsB,oBAAoB,EACxC,KACA,eACA,SACA,OACA,aAOgB;CAChB,MAAM,YAAYA,+BAAY;CAG9B,MAAM,eAAe,MAAMC,oDAA4B,WAAW,IAAI,UAAU;CAChF,MAAM,CAAC,SAAS,QAAQ,MAAM,QAAQ,IAAI,CACxC,IAAI,UAAU,WAAW,gBAAgB,WAAW,eACpD,IAAI,UAAU,SAAS,gBAAgB,WAAW;CAEpD,MAAM,YAAY,MAAM,uBAAuB;AAC/C,KAAI,CAAC,WAAW,CAAC,UACf,OAAM,IAAI,MAAM;CAIlB,MAAM,WAAW,MAAM,IAAI,YAAwD;EACjF;EACA,SAAS;GACP,MAAMC,mEAAkB;GACxB,SAAS;IACP,eAAe;IACf,yBAAyB,QAAQ;IACjC,sCAAsC,QAAQ;;;;AAKpD,KAAI,CAACC,wDAAkC,WAAW;AAChD,UAAQ,MAAM,2CAA2C;EACzD,MAAM,eAAeC,4BAAS,UAAU,YAAY,UAAU,SAAS;EACvE,MAAM,MAAM,OAAO,gBAAgB;AACnC,QAAM,IAAI,MAAM;;CAGlB,MAAM,aAAa,SAAS,QAAQ;CAGpC,MAAM,UAAU;EACd,eAAe;EACf,WAAW;EACX,MAAMC,qCAAuB;EAC7B,SAAS;GACP,WAAW;GACX;GACA;GACA,SAAS;;EAEX,SAAS;GACP,eAAe;GACf;GACA;GACA;GACA;;;AAGJ,OAAMC,6CAAiB,KAAK"}
@@ -1,13 +1,14 @@
1
1
  const require_rolldown_runtime = require('../../../../_virtual/rolldown_runtime.js');
2
2
  const require_signer_worker = require('../../../types/signer-worker.js');
3
3
  const require_base64 = require('../../../../utils/base64.js');
4
- require('../../../../utils/index.js');
4
+ const require_index = require('../../../../utils/index.js');
5
5
  const require_authenticatorOptions = require('../../../types/authenticatorOptions.js');
6
6
  const require_session = require('./session.js');
7
7
  let src_wasm_signer_worker_pkg_wasm_signer_worker_js = require("../../../../wasm_signer_worker/pkg/wasm_signer_worker.js");
8
8
  src_wasm_signer_worker_pkg_wasm_signer_worker_js = require_rolldown_runtime.__toESM(src_wasm_signer_worker_pkg_wasm_signer_worker_js);
9
9
 
10
10
  //#region src/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.ts
11
+ require_index.init_utils();
11
12
  require_signer_worker.init_signer_worker();
12
13
  /**
13
14
  * Combined Device2 registration flow: derive NEAR keypair + sign registration transaction
@@ -1 +1 @@
1
- {"version":3,"file":"registerDevice2WithDerivedKey.js","names":["base64UrlDecode","toEnumUserVerificationPolicy","UserVerificationPolicy","WorkerRequestType","withSessionId","isRegisterDevice2WithDerivedKeySuccess","keyData: EncryptedKeyData","error: unknown"],"sources":["../../../../../../src/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.ts"],"sourcesContent":["import { base64UrlDecode } from '../../../../utils';\nimport type { EncryptedKeyData } from '../../../IndexedDBManager/passkeyNearKeysDB';\nimport {\n WorkerRequestType,\n isRegisterDevice2WithDerivedKeySuccess,\n} from '../../../types/signer-worker';\nimport { AccountId, toAccountId } from \"../../../types/accountIds\";\nimport { SignerWorkerManagerContext } from '..';\nimport type { WebAuthnRegistrationCredential } from '@/core/types/webauthn';\nimport type { VRFChallenge } from '../../../types/vrf-worker';\nimport type { TransactionContext } from '../../../types/rpc';\nimport { withSessionId } from './session';\nimport { UserVerificationPolicy, toEnumUserVerificationPolicy } from '../../../types/authenticatorOptions';\n\n/**\n * Combined Device2 registration flow: derive NEAR keypair + sign registration transaction\n * in a single operation without requiring a separate authentication prompt.\n *\n * This handler orchestrates:\n * 1. Retrieving PRF.second and WrapKeySeed from session storage (delivered via MessagePort)\n * 2. Deriving NEAR ed25519 keypair from PRF.second\n * 3. Encrypting the NEAR private key with KEK (derived from WrapKeySeed + wrapKeySalt)\n * 4. Building the Device2 registration transaction (`link_device_register_user`)\n * 5. Signing the transaction with the derived NEAR keypair\n * 6. Storing encrypted key data in IndexedDB\n *\n * Security: PRF.second and WrapKeySeed never traverse the main thread - they're delivered\n * directly from VRF worker to Signer worker via MessagePort.\n */\nexport async function registerDevice2WithDerivedKey({\n ctx,\n sessionId,\n nearAccountId,\n credential,\n vrfChallenge,\n transactionContext,\n contractId,\n wrapKeySalt,\n deviceNumber,\n deterministicVrfPublicKey,\n}: {\n ctx: SignerWorkerManagerContext;\n sessionId: string;\n nearAccountId: AccountId;\n credential: WebAuthnRegistrationCredential;\n vrfChallenge: VRFChallenge;\n transactionContext: TransactionContext;\n contractId: string;\n wrapKeySalt: string;\n deviceNumber?: number;\n deterministicVrfPublicKey?: string;\n}): Promise<{\n success: boolean;\n publicKey: string;\n signedTransaction: any;\n wrapKeySalt: string;\n encryptedData?: string;\n /**\n * Base64url-encoded AEAD nonce (ChaCha20-Poly1305) for the encrypted private key.\n */\n chacha20NonceB64u?: string;\n error?: string;\n}> {\n try {\n if (!sessionId) {\n throw new Error('Missing sessionId for Device2 registration');\n }\n\n console.debug('[SignerWorkerManager] Starting Device2 combined registration', {\n nearAccountId,\n sessionId,\n deviceNumber,\n });\n\n // Helper to convert base64url string to byte array (number[])\n const b64ToBytes = (s: string | undefined): number[] => {\n if (!s) return [];\n return Array.from(base64UrlDecode(s));\n };\n // Construct contractArgs in TypeScript and use JSON.stringify() here.\n // This is native to JS, extremely fast, and means the Rust worker just receives a \"dumb\" string that it can blindly convert to bytes\n const finalContractArgs = {\n vrf_data: {\n vrf_input_data: b64ToBytes(vrfChallenge.vrfInput),\n vrf_output: b64ToBytes(vrfChallenge.vrfOutput),\n vrf_proof: b64ToBytes(vrfChallenge.vrfProof),\n public_key: b64ToBytes(vrfChallenge.vrfPublicKey),\n user_id: vrfChallenge.userId,\n rp_id: vrfChallenge.rpId,\n block_height: Number(vrfChallenge.blockHeight),\n block_hash: b64ToBytes(vrfChallenge.blockHash),\n },\n webauthn_registration: credential,\n deterministic_vrf_public_key: b64ToBytes(deterministicVrfPublicKey),\n authenticator_options: {\n userVerification: toEnumUserVerificationPolicy(UserVerificationPolicy.Preferred),\n originPolicy: {\n single: undefined,\n all_subdomains: true,\n multiple: undefined,\n },\n },\n };\n\n // Build request payload for combined Device2 registration\n const response = await ctx.sendMessage<WorkerRequestType.RegisterDevice2WithDerivedKey>({\n sessionId,\n message: {\n type: WorkerRequestType.RegisterDevice2WithDerivedKey,\n payload: withSessionId(sessionId, {\n credential,\n nearAccountId,\n transactionContext: {\n txBlockHash: transactionContext.txBlockHash,\n txBlockHeight: transactionContext.txBlockHeight,\n baseNonce: transactionContext.nextNonce,\n },\n contractId,\n contractArgsJson: JSON.stringify(finalContractArgs),\n }),\n },\n });\n\n if (!isRegisterDevice2WithDerivedKeySuccess(response)) {\n throw new Error('Device2 combined registration failed');\n }\n\n const wasmResult = response.payload;\n\n console.debug('[SignerWorkerManager] Device2 registration complete, storing encrypted key');\n\n // Store encrypted NEAR key in IndexedDB\n const chacha20NonceB64u = wasmResult.chacha20NonceB64u;\n if (!chacha20NonceB64u) {\n throw new Error('Missing chacha20NonceB64u in Device2 registration result');\n }\n const keyData: EncryptedKeyData = {\n nearAccountId,\n deviceNumber: deviceNumber ?? 2, // Default to device 2\n encryptedData: wasmResult.encryptedData,\n chacha20NonceB64u,\n wrapKeySalt: wasmResult.wrapKeySalt,\n version: 2,\n timestamp: Date.now(),\n };\n await ctx.indexedDB.nearKeysDB.storeEncryptedKey(keyData);\n\n console.debug('[SignerWorkerManager] Device2 encrypted key stored successfully');\n\n return {\n success: true,\n publicKey: wasmResult.publicKey,\n signedTransaction: wasmResult.signedTransaction,\n wrapKeySalt: wasmResult.wrapKeySalt,\n encryptedData: wasmResult.encryptedData,\n chacha20NonceB64u,\n };\n } catch (error: unknown) {\n console.error('[SignerWorkerManager] registerDevice2WithDerivedKey error:', error);\n const message = String((error as { message?: unknown })?.message || error || '');\n return {\n success: false,\n publicKey: '',\n signedTransaction: null,\n wrapKeySalt: '',\n error: message,\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,eAAsB,8BAA8B,EAClD,KACA,WACA,eACA,YACA,cACA,oBACA,YACA,aACA,cACA,6BAuBC;AACD,KAAI;AACF,MAAI,CAAC,UACH,OAAM,IAAI,MAAM;AAGlB,UAAQ,MAAM,gEAAgE;GAC5E;GACA;GACA;;EAIF,MAAM,cAAc,MAAoC;AACtD,OAAI,CAAC,EAAG,QAAO;AACf,UAAO,MAAM,KAAKA,+BAAgB;;EAIpC,MAAM,oBAAoB;GACxB,UAAU;IACR,gBAAgB,WAAW,aAAa;IACxC,YAAY,WAAW,aAAa;IACpC,WAAW,WAAW,aAAa;IACnC,YAAY,WAAW,aAAa;IACpC,SAAS,aAAa;IACtB,OAAO,aAAa;IACpB,cAAc,OAAO,aAAa;IAClC,YAAY,WAAW,aAAa;;GAEtC,uBAAuB;GACvB,8BAA8B,WAAW;GACzC,uBAAuB;IACrB,kBAAkBC,0DAA6BC,oDAAuB;IACtE,cAAc;KACZ,QAAQ;KACR,gBAAgB;KAChB,UAAU;;;;EAMhB,MAAM,WAAW,MAAM,IAAI,YAA6D;GACtF;GACA,SAAS;IACP,MAAMC,mEAAkB;IACxB,SAASC,8BAAc,WAAW;KAChC;KACA;KACA,oBAAoB;MAClB,aAAa,mBAAmB;MAChC,eAAe,mBAAmB;MAClC,WAAW,mBAAmB;;KAEhC;KACA,kBAAkB,KAAK,UAAU;;;;AAKvC,MAAI,CAACC,6DAAuC,UAC1C,OAAM,IAAI,MAAM;EAGlB,MAAM,aAAa,SAAS;AAE5B,UAAQ,MAAM;EAGd,MAAM,oBAAoB,WAAW;AACrC,MAAI,CAAC,kBACH,OAAM,IAAI,MAAM;EAElB,MAAMC,UAA4B;GAChC;GACA,cAAc,gBAAgB;GAC9B,eAAe,WAAW;GAC1B;GACA,aAAa,WAAW;GACxB,SAAS;GACT,WAAW,KAAK;;AAElB,QAAM,IAAI,UAAU,WAAW,kBAAkB;AAEjD,UAAQ,MAAM;AAEd,SAAO;GACL,SAAS;GACT,WAAW,WAAW;GACtB,mBAAmB,WAAW;GAC9B,aAAa,WAAW;GACxB,eAAe,WAAW;GAC1B;;UAEKC,OAAgB;AACvB,UAAQ,MAAM,8DAA8D;EAC5E,MAAM,UAAU,OAAQ,OAAiC,WAAW,SAAS;AAC7E,SAAO;GACL,SAAS;GACT,WAAW;GACX,mBAAmB;GACnB,aAAa;GACb,OAAO"}
1
+ {"version":3,"file":"registerDevice2WithDerivedKey.js","names":["base64UrlDecode","toEnumUserVerificationPolicy","UserVerificationPolicy","WorkerRequestType","withSessionId","isRegisterDevice2WithDerivedKeySuccess","keyData: EncryptedKeyData","error: unknown"],"sources":["../../../../../../src/core/WebAuthnManager/SignerWorkerManager/handlers/registerDevice2WithDerivedKey.ts"],"sourcesContent":["import { base64UrlDecode } from '../../../../utils';\nimport type { EncryptedKeyData } from '../../../IndexedDBManager/passkeyNearKeysDB';\nimport {\n WorkerRequestType,\n isRegisterDevice2WithDerivedKeySuccess,\n} from '../../../types/signer-worker';\nimport { AccountId, toAccountId } from \"../../../types/accountIds\";\nimport { SignerWorkerManagerContext } from '..';\nimport type { WebAuthnRegistrationCredential } from '@/core/types/webauthn';\nimport type { VRFChallenge } from '../../../types/vrf-worker';\nimport type { TransactionContext } from '../../../types/rpc';\nimport { withSessionId } from './session';\nimport { UserVerificationPolicy, toEnumUserVerificationPolicy } from '../../../types/authenticatorOptions';\n\n/**\n * Combined Device2 registration flow: derive NEAR keypair + sign registration transaction\n * in a single operation without requiring a separate authentication prompt.\n *\n * This handler orchestrates:\n * 1. Retrieving PRF.second and WrapKeySeed from session storage (delivered via MessagePort)\n * 2. Deriving NEAR ed25519 keypair from PRF.second\n * 3. Encrypting the NEAR private key with KEK (derived from WrapKeySeed + wrapKeySalt)\n * 4. Building the Device2 registration transaction (`link_device_register_user`)\n * 5. Signing the transaction with the derived NEAR keypair\n * 6. Storing encrypted key data in IndexedDB\n *\n * Security: PRF.second and WrapKeySeed never traverse the main thread - they're delivered\n * directly from VRF worker to Signer worker via MessagePort.\n */\nexport async function registerDevice2WithDerivedKey({\n ctx,\n sessionId,\n nearAccountId,\n credential,\n vrfChallenge,\n transactionContext,\n contractId,\n wrapKeySalt,\n deviceNumber,\n deterministicVrfPublicKey,\n}: {\n ctx: SignerWorkerManagerContext;\n sessionId: string;\n nearAccountId: AccountId;\n credential: WebAuthnRegistrationCredential;\n vrfChallenge: VRFChallenge;\n transactionContext: TransactionContext;\n contractId: string;\n wrapKeySalt: string;\n deviceNumber?: number;\n deterministicVrfPublicKey?: string;\n}): Promise<{\n success: boolean;\n publicKey: string;\n signedTransaction: any;\n wrapKeySalt: string;\n encryptedData?: string;\n /**\n * Base64url-encoded AEAD nonce (ChaCha20-Poly1305) for the encrypted private key.\n */\n chacha20NonceB64u?: string;\n error?: string;\n}> {\n try {\n if (!sessionId) {\n throw new Error('Missing sessionId for Device2 registration');\n }\n\n console.debug('[SignerWorkerManager] Starting Device2 combined registration', {\n nearAccountId,\n sessionId,\n deviceNumber,\n });\n\n // Helper to convert base64url string to byte array (number[])\n const b64ToBytes = (s: string | undefined): number[] => {\n if (!s) return [];\n return Array.from(base64UrlDecode(s));\n };\n // Construct contractArgs in TypeScript and use JSON.stringify() here.\n // This is native to JS, extremely fast, and means the Rust worker just receives a \"dumb\" string that it can blindly convert to bytes\n const finalContractArgs = {\n vrf_data: {\n vrf_input_data: b64ToBytes(vrfChallenge.vrfInput),\n vrf_output: b64ToBytes(vrfChallenge.vrfOutput),\n vrf_proof: b64ToBytes(vrfChallenge.vrfProof),\n public_key: b64ToBytes(vrfChallenge.vrfPublicKey),\n user_id: vrfChallenge.userId,\n rp_id: vrfChallenge.rpId,\n block_height: Number(vrfChallenge.blockHeight),\n block_hash: b64ToBytes(vrfChallenge.blockHash),\n },\n webauthn_registration: credential,\n deterministic_vrf_public_key: b64ToBytes(deterministicVrfPublicKey),\n authenticator_options: {\n userVerification: toEnumUserVerificationPolicy(UserVerificationPolicy.Preferred),\n originPolicy: {\n single: undefined,\n all_subdomains: true,\n multiple: undefined,\n },\n },\n };\n\n // Build request payload for combined Device2 registration\n const response = await ctx.sendMessage<WorkerRequestType.RegisterDevice2WithDerivedKey>({\n sessionId,\n message: {\n type: WorkerRequestType.RegisterDevice2WithDerivedKey,\n payload: withSessionId(sessionId, {\n credential,\n nearAccountId,\n transactionContext: {\n txBlockHash: transactionContext.txBlockHash,\n txBlockHeight: transactionContext.txBlockHeight,\n baseNonce: transactionContext.nextNonce,\n },\n contractId,\n contractArgsJson: JSON.stringify(finalContractArgs),\n }),\n },\n });\n\n if (!isRegisterDevice2WithDerivedKeySuccess(response)) {\n throw new Error('Device2 combined registration failed');\n }\n\n const wasmResult = response.payload;\n\n console.debug('[SignerWorkerManager] Device2 registration complete, storing encrypted key');\n\n // Store encrypted NEAR key in IndexedDB\n const chacha20NonceB64u = wasmResult.chacha20NonceB64u;\n if (!chacha20NonceB64u) {\n throw new Error('Missing chacha20NonceB64u in Device2 registration result');\n }\n const keyData: EncryptedKeyData = {\n nearAccountId,\n deviceNumber: deviceNumber ?? 2, // Default to device 2\n encryptedData: wasmResult.encryptedData,\n chacha20NonceB64u,\n wrapKeySalt: wasmResult.wrapKeySalt,\n version: 2,\n timestamp: Date.now(),\n };\n await ctx.indexedDB.nearKeysDB.storeEncryptedKey(keyData);\n\n console.debug('[SignerWorkerManager] Device2 encrypted key stored successfully');\n\n return {\n success: true,\n publicKey: wasmResult.publicKey,\n signedTransaction: wasmResult.signedTransaction,\n wrapKeySalt: wasmResult.wrapKeySalt,\n encryptedData: wasmResult.encryptedData,\n chacha20NonceB64u,\n };\n } catch (error: unknown) {\n console.error('[SignerWorkerManager] registerDevice2WithDerivedKey error:', error);\n const message = String((error as { message?: unknown })?.message || error || '');\n return {\n success: false,\n publicKey: '',\n signedTransaction: null,\n wrapKeySalt: '',\n error: message,\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,eAAsB,8BAA8B,EAClD,KACA,WACA,eACA,YACA,cACA,oBACA,YACA,aACA,cACA,6BAuBC;AACD,KAAI;AACF,MAAI,CAAC,UACH,OAAM,IAAI,MAAM;AAGlB,UAAQ,MAAM,gEAAgE;GAC5E;GACA;GACA;;EAIF,MAAM,cAAc,MAAoC;AACtD,OAAI,CAAC,EAAG,QAAO;AACf,UAAO,MAAM,KAAKA,+BAAgB;;EAIpC,MAAM,oBAAoB;GACxB,UAAU;IACR,gBAAgB,WAAW,aAAa;IACxC,YAAY,WAAW,aAAa;IACpC,WAAW,WAAW,aAAa;IACnC,YAAY,WAAW,aAAa;IACpC,SAAS,aAAa;IACtB,OAAO,aAAa;IACpB,cAAc,OAAO,aAAa;IAClC,YAAY,WAAW,aAAa;;GAEtC,uBAAuB;GACvB,8BAA8B,WAAW;GACzC,uBAAuB;IACrB,kBAAkBC,0DAA6BC,oDAAuB;IACtE,cAAc;KACZ,QAAQ;KACR,gBAAgB;KAChB,UAAU;;;;EAMhB,MAAM,WAAW,MAAM,IAAI,YAA6D;GACtF;GACA,SAAS;IACP,MAAMC,mEAAkB;IACxB,SAASC,8BAAc,WAAW;KAChC;KACA;KACA,oBAAoB;MAClB,aAAa,mBAAmB;MAChC,eAAe,mBAAmB;MAClC,WAAW,mBAAmB;;KAEhC;KACA,kBAAkB,KAAK,UAAU;;;;AAKvC,MAAI,CAACC,6DAAuC,UAC1C,OAAM,IAAI,MAAM;EAGlB,MAAM,aAAa,SAAS;AAE5B,UAAQ,MAAM;EAGd,MAAM,oBAAoB,WAAW;AACrC,MAAI,CAAC,kBACH,OAAM,IAAI,MAAM;EAElB,MAAMC,UAA4B;GAChC;GACA,cAAc,gBAAgB;GAC9B,eAAe,WAAW;GAC1B;GACA,aAAa,WAAW;GACxB,SAAS;GACT,WAAW,KAAK;;AAElB,QAAM,IAAI,UAAU,WAAW,kBAAkB;AAEjD,UAAQ,MAAM;AAEd,SAAO;GACL,SAAS;GACT,WAAW,WAAW;GACtB,mBAAmB,WAAW;GAC9B,aAAa,WAAW;GACxB,eAAe,WAAW;GAC1B;;UAEKC,OAAgB;AACvB,UAAQ,MAAM,8DAA8D;EAC5E,MAAM,UAAU,OAAQ,OAAiC,WAAW,SAAS;AAC7E,SAAO;GACL,SAAS;GACT,WAAW;GACX,mBAAmB;GACnB,aAAa;GACb,OAAO"}
@@ -14,6 +14,7 @@ require_defaultConfigs.init_defaultConfigs();
14
14
  require_accountIds.init_accountIds();
15
15
  require_actions.init_actions();
16
16
  require_signer_worker.init_signer_worker();
17
+ require_getDeviceNumber.init_getDeviceNumber();
17
18
  async function signDelegateAction({ ctx, delegate, rpcCall, onEvent, confirmationConfigOverride, title, body, sessionId: providedSessionId }) {
18
19
  const sessionId = providedSessionId ?? require_sessionHandshake.generateSessionId();
19
20
  const nearAccountId = rpcCall.nearAccountId || delegate.senderId;
@@ -1 +1 @@
1
- {"version":3,"file":"signDelegateAction.js","names":["generateSessionId","PASSKEY_MANAGER_DEFAULT_CONFIGS","toActionArgsWasm","getLastLoggedInDeviceNumber","WorkerRequestType","toPublicKeyString","isSignDelegateActionSuccess","toAccountId"],"sources":["../../../../../../src/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.ts"],"sourcesContent":["import { PASSKEY_MANAGER_DEFAULT_CONFIGS } from '../../../defaultConfigs';\nimport { AccountId, toAccountId } from '../../../types/accountIds';\nimport { toActionArgsWasm, validateActionArgsWasm } from '../../../types/actions';\nimport { DelegateActionInput } from '../../../types/delegate';\nimport { type onProgressEvents } from '../../../types/sdkSentEvents';\nimport {\n ConfirmationConfig,\n RpcCallPayload,\n WorkerRequestType,\n isSignDelegateActionSuccess,\n WasmDelegateSignResult,\n WasmSignedDelegate,\n} from '../../../types/signer-worker';\nimport { SignerWorkerManagerContext } from '..';\nimport { getLastLoggedInDeviceNumber } from '../getDeviceNumber';\nimport { generateSessionId } from '../sessionHandshake.js';\nimport { toPublicKeyString } from './validation';\n\n\nexport async function signDelegateAction({\n ctx,\n delegate,\n rpcCall,\n onEvent,\n confirmationConfigOverride,\n title,\n body,\n sessionId: providedSessionId,\n}: {\n ctx: SignerWorkerManagerContext;\n delegate: DelegateActionInput;\n rpcCall: RpcCallPayload;\n onEvent?: (update: onProgressEvents) => void;\n confirmationConfigOverride?: Partial<ConfirmationConfig>;\n title?: string;\n body?: string;\n sessionId?: string;\n}): Promise<{\n signedDelegate: WasmSignedDelegate;\n hash: string;\n nearAccountId: AccountId;\n logs?: string[];\n}> {\n const sessionId = providedSessionId ?? generateSessionId();\n const nearAccountId = rpcCall.nearAccountId || delegate.senderId;\n\n const resolvedRpcCall = {\n contractId: rpcCall.contractId || PASSKEY_MANAGER_DEFAULT_CONFIGS.contractId,\n nearRpcUrl: rpcCall.nearRpcUrl || (PASSKEY_MANAGER_DEFAULT_CONFIGS.nearRpcUrl.split(',')[0] || PASSKEY_MANAGER_DEFAULT_CONFIGS.nearRpcUrl),\n nearAccountId,\n } as RpcCallPayload;\n\n const actionsWasm = delegate.actions.map(toActionArgsWasm);\n actionsWasm.forEach((action, actionIndex) => {\n try {\n validateActionArgsWasm(action);\n } catch (error) {\n throw new Error(\n `Delegate action ${actionIndex} validation failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n });\n\n const deviceNumber = await getLastLoggedInDeviceNumber(nearAccountId, ctx.indexedDB.clientDB);\n const encryptedKeyData = await ctx.indexedDB.nearKeysDB.getEncryptedKey(nearAccountId, deviceNumber);\n if (!encryptedKeyData) {\n throw new Error(`No encrypted key found for account: ${nearAccountId}`);\n }\n if (!ctx.vrfWorkerManager) {\n throw new Error('VrfWorkerManager not available for delegate signing');\n }\n\n const confirmation = await ctx.vrfWorkerManager.confirmAndPrepareSigningSession({\n ctx,\n sessionId,\n kind: 'delegate',\n nearAccountId,\n delegate: {\n senderId: delegate.senderId || nearAccountId,\n receiverId: delegate.receiverId,\n actions: actionsWasm,\n nonce: delegate.nonce,\n maxBlockHeight: delegate.maxBlockHeight,\n },\n rpcCall: resolvedRpcCall,\n confirmationConfigOverride,\n title,\n body,\n });\n\n const intentDigest = confirmation.intentDigest;\n const transactionContext = confirmation.transactionContext;\n const credential = confirmation.credential ? JSON.stringify(confirmation.credential) : undefined;\n\n const response = await ctx.sendMessage({\n sessionId,\n message: {\n type: WorkerRequestType.SignDelegateAction,\n payload: {\n rpcCall: resolvedRpcCall,\n createdAt: Date.now(),\n decryption: {\n encryptedPrivateKeyData: encryptedKeyData.encryptedData,\n encryptedPrivateKeyChacha20NonceB64u: encryptedKeyData.chacha20NonceB64u,\n },\n delegate: {\n senderId: delegate.senderId || nearAccountId,\n receiverId: delegate.receiverId,\n actions: actionsWasm,\n nonce: delegate.nonce.toString(),\n maxBlockHeight: delegate.maxBlockHeight.toString(),\n publicKey: toPublicKeyString(delegate.publicKey),\n },\n intentDigest,\n transactionContext,\n credential,\n },\n },\n onEvent,\n });\n\n // eslint-disable-next-line no-console\n console.debug('[WebAuthnManager][delegate] raw worker response', response);\n\n if (!isSignDelegateActionSuccess(response)) {\n // eslint-disable-next-line no-console\n console.error('[WebAuthnManager][delegate] non-success worker response', response);\n const payloadError = (response as any)?.payload?.error;\n throw new Error(payloadError || 'Delegate action signing failed');\n }\n\n const payload = response.payload as WasmDelegateSignResult;\n if (!payload.success || !payload.signedDelegate || !payload.hash) {\n // eslint-disable-next-line no-console\n console.error('[WebAuthnManager][delegate] invalid delegate payload', payload);\n throw new Error(payload.error || 'Delegate action signing failed');\n }\n\n return {\n signedDelegate: payload.signedDelegate,\n hash: payload.hash,\n nearAccountId: toAccountId(nearAccountId),\n logs: payload.logs,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAmBA,eAAsB,mBAAmB,EACvC,KACA,UACA,SACA,SACA,4BACA,OACA,MACA,WAAW,qBAeV;CACD,MAAM,YAAY,qBAAqBA;CACvC,MAAM,gBAAgB,QAAQ,iBAAiB,SAAS;CAExD,MAAM,kBAAkB;EACtB,YAAY,QAAQ,cAAcC,uDAAgC;EAClE,YAAY,QAAQ,cAAeA,uDAAgC,WAAW,MAAM,KAAK,MAAMA,uDAAgC;EAC/H;;CAGF,MAAM,cAAc,SAAS,QAAQ,IAAIC;AACzC,aAAY,SAAS,QAAQ,gBAAgB;AAC3C,MAAI;AACF,0CAAuB;WAChB,OAAO;AACd,SAAM,IAAI,MACR,mBAAmB,YAAY,sBAAsB,iBAAiB,QAAQ,MAAM,UAAU,OAAO;;;CAK3G,MAAM,eAAe,MAAMC,oDAA4B,eAAe,IAAI,UAAU;CACpF,MAAM,mBAAmB,MAAM,IAAI,UAAU,WAAW,gBAAgB,eAAe;AACvF,KAAI,CAAC,iBACH,OAAM,IAAI,MAAM,uCAAuC;AAEzD,KAAI,CAAC,IAAI,iBACP,OAAM,IAAI,MAAM;CAGlB,MAAM,eAAe,MAAM,IAAI,iBAAiB,gCAAgC;EAC9E;EACA;EACA,MAAM;EACN;EACA,UAAU;GACR,UAAU,SAAS,YAAY;GAC/B,YAAY,SAAS;GACrB,SAAS;GACT,OAAO,SAAS;GAChB,gBAAgB,SAAS;;EAE3B,SAAS;EACT;EACA;EACA;;CAGF,MAAM,eAAe,aAAa;CAClC,MAAM,qBAAqB,aAAa;CACxC,MAAM,aAAa,aAAa,aAAa,KAAK,UAAU,aAAa,cAAc;CAEvF,MAAM,WAAW,MAAM,IAAI,YAAY;EACrC;EACA,SAAS;GACP,MAAMC,mEAAkB;GACxB,SAAS;IACP,SAAS;IACT,WAAW,KAAK;IAChB,YAAY;KACV,yBAAyB,iBAAiB;KAC1C,sCAAsC,iBAAiB;;IAEzD,UAAU;KACR,UAAU,SAAS,YAAY;KAC/B,YAAY,SAAS;KACrB,SAAS;KACT,OAAO,SAAS,MAAM;KACtB,gBAAgB,SAAS,eAAe;KACxC,WAAWC,qCAAkB,SAAS;;IAExC;IACA;IACA;;;EAGJ;;AAIF,SAAQ,MAAM,mDAAmD;AAEjE,KAAI,CAACC,kDAA4B,WAAW;AAE1C,UAAQ,MAAM,2DAA2D;EACzE,MAAM,eAAgB,UAAkB,SAAS;AACjD,QAAM,IAAI,MAAM,gBAAgB;;CAGlC,MAAM,UAAU,SAAS;AACzB,KAAI,CAAC,QAAQ,WAAW,CAAC,QAAQ,kBAAkB,CAAC,QAAQ,MAAM;AAEhE,UAAQ,MAAM,wDAAwD;AACtE,QAAM,IAAI,MAAM,QAAQ,SAAS;;AAGnC,QAAO;EACL,gBAAgB,QAAQ;EACxB,MAAM,QAAQ;EACd,eAAeC,+BAAY;EAC3B,MAAM,QAAQ"}
1
+ {"version":3,"file":"signDelegateAction.js","names":["generateSessionId","PASSKEY_MANAGER_DEFAULT_CONFIGS","toActionArgsWasm","getLastLoggedInDeviceNumber","WorkerRequestType","toPublicKeyString","isSignDelegateActionSuccess","toAccountId"],"sources":["../../../../../../src/core/WebAuthnManager/SignerWorkerManager/handlers/signDelegateAction.ts"],"sourcesContent":["import { PASSKEY_MANAGER_DEFAULT_CONFIGS } from '../../../defaultConfigs';\nimport { AccountId, toAccountId } from '../../../types/accountIds';\nimport { toActionArgsWasm, validateActionArgsWasm } from '../../../types/actions';\nimport { DelegateActionInput } from '../../../types/delegate';\nimport { type onProgressEvents } from '../../../types/sdkSentEvents';\nimport {\n ConfirmationConfig,\n RpcCallPayload,\n WorkerRequestType,\n isSignDelegateActionSuccess,\n WasmDelegateSignResult,\n WasmSignedDelegate,\n} from '../../../types/signer-worker';\nimport { SignerWorkerManagerContext } from '..';\nimport { getLastLoggedInDeviceNumber } from '../getDeviceNumber';\nimport { generateSessionId } from '../sessionHandshake.js';\nimport { toPublicKeyString } from './validation';\n\n\nexport async function signDelegateAction({\n ctx,\n delegate,\n rpcCall,\n onEvent,\n confirmationConfigOverride,\n title,\n body,\n sessionId: providedSessionId,\n}: {\n ctx: SignerWorkerManagerContext;\n delegate: DelegateActionInput;\n rpcCall: RpcCallPayload;\n onEvent?: (update: onProgressEvents) => void;\n confirmationConfigOverride?: Partial<ConfirmationConfig>;\n title?: string;\n body?: string;\n sessionId?: string;\n}): Promise<{\n signedDelegate: WasmSignedDelegate;\n hash: string;\n nearAccountId: AccountId;\n logs?: string[];\n}> {\n const sessionId = providedSessionId ?? generateSessionId();\n const nearAccountId = rpcCall.nearAccountId || delegate.senderId;\n\n const resolvedRpcCall = {\n contractId: rpcCall.contractId || PASSKEY_MANAGER_DEFAULT_CONFIGS.contractId,\n nearRpcUrl: rpcCall.nearRpcUrl || (PASSKEY_MANAGER_DEFAULT_CONFIGS.nearRpcUrl.split(',')[0] || PASSKEY_MANAGER_DEFAULT_CONFIGS.nearRpcUrl),\n nearAccountId,\n } as RpcCallPayload;\n\n const actionsWasm = delegate.actions.map(toActionArgsWasm);\n actionsWasm.forEach((action, actionIndex) => {\n try {\n validateActionArgsWasm(action);\n } catch (error) {\n throw new Error(\n `Delegate action ${actionIndex} validation failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n });\n\n const deviceNumber = await getLastLoggedInDeviceNumber(nearAccountId, ctx.indexedDB.clientDB);\n const encryptedKeyData = await ctx.indexedDB.nearKeysDB.getEncryptedKey(nearAccountId, deviceNumber);\n if (!encryptedKeyData) {\n throw new Error(`No encrypted key found for account: ${nearAccountId}`);\n }\n if (!ctx.vrfWorkerManager) {\n throw new Error('VrfWorkerManager not available for delegate signing');\n }\n\n const confirmation = await ctx.vrfWorkerManager.confirmAndPrepareSigningSession({\n ctx,\n sessionId,\n kind: 'delegate',\n nearAccountId,\n delegate: {\n senderId: delegate.senderId || nearAccountId,\n receiverId: delegate.receiverId,\n actions: actionsWasm,\n nonce: delegate.nonce,\n maxBlockHeight: delegate.maxBlockHeight,\n },\n rpcCall: resolvedRpcCall,\n confirmationConfigOverride,\n title,\n body,\n });\n\n const intentDigest = confirmation.intentDigest;\n const transactionContext = confirmation.transactionContext;\n const credential = confirmation.credential ? JSON.stringify(confirmation.credential) : undefined;\n\n const response = await ctx.sendMessage({\n sessionId,\n message: {\n type: WorkerRequestType.SignDelegateAction,\n payload: {\n rpcCall: resolvedRpcCall,\n createdAt: Date.now(),\n decryption: {\n encryptedPrivateKeyData: encryptedKeyData.encryptedData,\n encryptedPrivateKeyChacha20NonceB64u: encryptedKeyData.chacha20NonceB64u,\n },\n delegate: {\n senderId: delegate.senderId || nearAccountId,\n receiverId: delegate.receiverId,\n actions: actionsWasm,\n nonce: delegate.nonce.toString(),\n maxBlockHeight: delegate.maxBlockHeight.toString(),\n publicKey: toPublicKeyString(delegate.publicKey),\n },\n intentDigest,\n transactionContext,\n credential,\n },\n },\n onEvent,\n });\n\n // eslint-disable-next-line no-console\n console.debug('[WebAuthnManager][delegate] raw worker response', response);\n\n if (!isSignDelegateActionSuccess(response)) {\n // eslint-disable-next-line no-console\n console.error('[WebAuthnManager][delegate] non-success worker response', response);\n const payloadError = (response as any)?.payload?.error;\n throw new Error(payloadError || 'Delegate action signing failed');\n }\n\n const payload = response.payload as WasmDelegateSignResult;\n if (!payload.success || !payload.signedDelegate || !payload.hash) {\n // eslint-disable-next-line no-console\n console.error('[WebAuthnManager][delegate] invalid delegate payload', payload);\n throw new Error(payload.error || 'Delegate action signing failed');\n }\n\n return {\n signedDelegate: payload.signedDelegate,\n hash: payload.hash,\n nearAccountId: toAccountId(nearAccountId),\n logs: payload.logs,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAmBA,eAAsB,mBAAmB,EACvC,KACA,UACA,SACA,SACA,4BACA,OACA,MACA,WAAW,qBAeV;CACD,MAAM,YAAY,qBAAqBA;CACvC,MAAM,gBAAgB,QAAQ,iBAAiB,SAAS;CAExD,MAAM,kBAAkB;EACtB,YAAY,QAAQ,cAAcC,uDAAgC;EAClE,YAAY,QAAQ,cAAeA,uDAAgC,WAAW,MAAM,KAAK,MAAMA,uDAAgC;EAC/H;;CAGF,MAAM,cAAc,SAAS,QAAQ,IAAIC;AACzC,aAAY,SAAS,QAAQ,gBAAgB;AAC3C,MAAI;AACF,0CAAuB;WAChB,OAAO;AACd,SAAM,IAAI,MACR,mBAAmB,YAAY,sBAAsB,iBAAiB,QAAQ,MAAM,UAAU,OAAO;;;CAK3G,MAAM,eAAe,MAAMC,oDAA4B,eAAe,IAAI,UAAU;CACpF,MAAM,mBAAmB,MAAM,IAAI,UAAU,WAAW,gBAAgB,eAAe;AACvF,KAAI,CAAC,iBACH,OAAM,IAAI,MAAM,uCAAuC;AAEzD,KAAI,CAAC,IAAI,iBACP,OAAM,IAAI,MAAM;CAGlB,MAAM,eAAe,MAAM,IAAI,iBAAiB,gCAAgC;EAC9E;EACA;EACA,MAAM;EACN;EACA,UAAU;GACR,UAAU,SAAS,YAAY;GAC/B,YAAY,SAAS;GACrB,SAAS;GACT,OAAO,SAAS;GAChB,gBAAgB,SAAS;;EAE3B,SAAS;EACT;EACA;EACA;;CAGF,MAAM,eAAe,aAAa;CAClC,MAAM,qBAAqB,aAAa;CACxC,MAAM,aAAa,aAAa,aAAa,KAAK,UAAU,aAAa,cAAc;CAEvF,MAAM,WAAW,MAAM,IAAI,YAAY;EACrC;EACA,SAAS;GACP,MAAMC,mEAAkB;GACxB,SAAS;IACP,SAAS;IACT,WAAW,KAAK;IAChB,YAAY;KACV,yBAAyB,iBAAiB;KAC1C,sCAAsC,iBAAiB;;IAEzD,UAAU;KACR,UAAU,SAAS,YAAY;KAC/B,YAAY,SAAS;KACrB,SAAS;KACT,OAAO,SAAS,MAAM;KACtB,gBAAgB,SAAS,eAAe;KACxC,WAAWC,qCAAkB,SAAS;;IAExC;IACA;IACA;;;EAGJ;;AAIF,SAAQ,MAAM,mDAAmD;AAEjE,KAAI,CAACC,kDAA4B,WAAW;AAE1C,UAAQ,MAAM,2DAA2D;EACzE,MAAM,eAAgB,UAAkB,SAAS;AACjD,QAAM,IAAI,MAAM,gBAAgB;;CAGlC,MAAM,UAAU,SAAS;AACzB,KAAI,CAAC,QAAQ,WAAW,CAAC,QAAQ,kBAAkB,CAAC,QAAQ,MAAM;AAEhE,UAAQ,MAAM,wDAAwD;AACtE,QAAM,IAAI,MAAM,QAAQ,SAAS;;AAGnC,QAAO;EACL,gBAAgB,QAAQ;EACxB,MAAM,QAAQ;EACd,eAAeC,+BAAY;EAC3B,MAAM,QAAQ"}
@@ -8,6 +8,7 @@ src_wasm_signer_worker_pkg_wasm_signer_worker_js = require_rolldown_runtime.__to
8
8
 
9
9
  //#region src/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.ts
10
10
  require_signer_worker.init_signer_worker();
11
+ require_getDeviceNumber.init_getDeviceNumber();
11
12
  require_validation.init_validation();
12
13
  /**
13
14
  * Sign a NEP-413 message using the user's passkey-derived private key
@@ -1 +1 @@
1
- {"version":3,"file":"signNep413Message.js","names":["getLastLoggedInDeviceNumber","generateSessionId","WorkerRequestType","isSignNep413MessageSuccess","isObject","error: unknown"],"sources":["../../../../../../src/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.ts"],"sourcesContent":["\nimport { WorkerRequestType, isSignNep413MessageSuccess } from '../../../types/signer-worker';\nimport type { ConfirmationConfig } from '../../../types/signer-worker';\nimport { getLastLoggedInDeviceNumber } from '../getDeviceNumber';\nimport { SignerWorkerManagerContext } from '..';\nimport { isObject } from '../../../WalletIframe/validation';\nimport { generateSessionId } from '../sessionHandshake.js';\n\n/**\n * Sign a NEP-413 message using the user's passkey-derived private key\n *\n * @param payload - NEP-413 signing parameters including message, recipient, nonce, and state\n * @returns Promise resolving to signing result with account ID, public key, and signature\n */\nexport async function signNep413Message({ ctx, payload }: {\n ctx: SignerWorkerManagerContext;\n payload: {\n message: string;\n recipient: string;\n nonce: string;\n state: string | null;\n accountId: string;\n title?: string;\n body?: string;\n confirmationConfigOverride?: Partial<ConfirmationConfig>;\n sessionId?: string;\n contractId?: string;\n nearRpcUrl?: string;\n };\n}): Promise<{\n success: boolean;\n accountId: string;\n publicKey: string;\n signature: string;\n state?: string;\n error?: string;\n}> {\n try {\n const deviceNumber = await getLastLoggedInDeviceNumber(payload.accountId, ctx.indexedDB.clientDB);\n const encryptedKeyData = await ctx.indexedDB.nearKeysDB.getEncryptedKey(payload.accountId, deviceNumber);\n if (!encryptedKeyData) {\n throw new Error(`No encrypted key found for account: ${payload.accountId}`);\n }\n\n // Expect caller (SignerWorkerManager) to reserve a session and wire ports; just use provided sessionId\n const sessionId = payload.sessionId ?? generateSessionId();\n\n if (!ctx.vrfWorkerManager) {\n throw new Error('VrfWorkerManager not available for NEP-413 signing');\n }\n\n await ctx.vrfWorkerManager.confirmAndPrepareSigningSession({\n ctx,\n sessionId,\n kind: 'nep413',\n nearAccountId: payload.accountId,\n message: payload.message,\n recipient: payload.recipient,\n title: payload.title,\n body: payload.body,\n confirmationConfigOverride: payload.confirmationConfigOverride,\n contractId: payload.contractId,\n nearRpcUrl: payload.nearRpcUrl,\n });\n\n const response = await ctx.sendMessage<WorkerRequestType.SignNep413Message>({\n sessionId,\n message: {\n type: WorkerRequestType.SignNep413Message,\n payload: {\n message: payload.message,\n recipient: payload.recipient,\n nonce: payload.nonce,\n state: payload.state || undefined,\n accountId: payload.accountId,\n encryptedPrivateKeyData: encryptedKeyData.encryptedData,\n encryptedPrivateKeyChacha20NonceB64u: encryptedKeyData.chacha20NonceB64u,\n }\n },\n });\n\n if (!isSignNep413MessageSuccess(response)) {\n console.error('SignerWorkerManager: NEP-413 signing failed:', response);\n const payloadError = isObject(response?.payload) && (response as any)?.payload?.error;\n throw new Error(payloadError || 'NEP-413 signing failed');\n }\n\n return {\n success: true,\n accountId: response.payload.accountId,\n publicKey: response.payload.publicKey,\n signature: response.payload.signature,\n state: response.payload.state || undefined\n };\n\n } catch (error: unknown) {\n console.error('SignerWorkerManager: NEP-413 signing error:', error);\n return {\n success: false,\n accountId: '',\n publicKey: '',\n signature: '',\n error: (error && typeof (error as { message?: unknown }).message === 'string')\n ? (error as { message: string }).message\n : 'Unknown error'\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAcA,eAAsB,kBAAkB,EAAE,KAAK,WAsB5C;AACD,KAAI;EACF,MAAM,eAAe,MAAMA,oDAA4B,QAAQ,WAAW,IAAI,UAAU;EACxF,MAAM,mBAAmB,MAAM,IAAI,UAAU,WAAW,gBAAgB,QAAQ,WAAW;AAC3F,MAAI,CAAC,iBACH,OAAM,IAAI,MAAM,uCAAuC,QAAQ;EAIjE,MAAM,YAAY,QAAQ,aAAaC;AAEvC,MAAI,CAAC,IAAI,iBACP,OAAM,IAAI,MAAM;AAGlB,QAAM,IAAI,iBAAiB,gCAAgC;GACzD;GACA;GACA,MAAM;GACN,eAAe,QAAQ;GACvB,SAAS,QAAQ;GACjB,WAAW,QAAQ;GACnB,OAAO,QAAQ;GACf,MAAM,QAAQ;GACd,4BAA4B,QAAQ;GACpC,YAAY,QAAQ;GACpB,YAAY,QAAQ;;EAGtB,MAAM,WAAW,MAAM,IAAI,YAAiD;GAC1E;GACA,SAAS;IACP,MAAMC,mEAAkB;IACxB,SAAS;KACP,SAAS,QAAQ;KACjB,WAAW,QAAQ;KACnB,OAAO,QAAQ;KACf,OAAO,QAAQ,SAAS;KACxB,WAAW,QAAQ;KACnB,yBAAyB,iBAAiB;KAC1C,sCAAsC,iBAAiB;;;;AAK7D,MAAI,CAACC,iDAA2B,WAAW;AACzC,WAAQ,MAAM,gDAAgD;GAC9D,MAAM,eAAeC,4BAAS,UAAU,YAAa,UAAkB,SAAS;AAChF,SAAM,IAAI,MAAM,gBAAgB;;AAGlC,SAAO;GACL,SAAS;GACT,WAAW,SAAS,QAAQ;GAC5B,WAAW,SAAS,QAAQ;GAC5B,WAAW,SAAS,QAAQ;GAC5B,OAAO,SAAS,QAAQ,SAAS;;UAG5BC,OAAgB;AACvB,UAAQ,MAAM,+CAA+C;AAC7D,SAAO;GACL,SAAS;GACT,WAAW;GACX,WAAW;GACX,WAAW;GACX,OAAQ,SAAS,OAAQ,MAAgC,YAAY,WAChE,MAA8B,UAC/B"}
1
+ {"version":3,"file":"signNep413Message.js","names":["getLastLoggedInDeviceNumber","generateSessionId","WorkerRequestType","isSignNep413MessageSuccess","isObject","error: unknown"],"sources":["../../../../../../src/core/WebAuthnManager/SignerWorkerManager/handlers/signNep413Message.ts"],"sourcesContent":["\nimport { WorkerRequestType, isSignNep413MessageSuccess } from '../../../types/signer-worker';\nimport type { ConfirmationConfig } from '../../../types/signer-worker';\nimport { getLastLoggedInDeviceNumber } from '../getDeviceNumber';\nimport { SignerWorkerManagerContext } from '..';\nimport { isObject } from '../../../WalletIframe/validation';\nimport { generateSessionId } from '../sessionHandshake.js';\n\n/**\n * Sign a NEP-413 message using the user's passkey-derived private key\n *\n * @param payload - NEP-413 signing parameters including message, recipient, nonce, and state\n * @returns Promise resolving to signing result with account ID, public key, and signature\n */\nexport async function signNep413Message({ ctx, payload }: {\n ctx: SignerWorkerManagerContext;\n payload: {\n message: string;\n recipient: string;\n nonce: string;\n state: string | null;\n accountId: string;\n title?: string;\n body?: string;\n confirmationConfigOverride?: Partial<ConfirmationConfig>;\n sessionId?: string;\n contractId?: string;\n nearRpcUrl?: string;\n };\n}): Promise<{\n success: boolean;\n accountId: string;\n publicKey: string;\n signature: string;\n state?: string;\n error?: string;\n}> {\n try {\n const deviceNumber = await getLastLoggedInDeviceNumber(payload.accountId, ctx.indexedDB.clientDB);\n const encryptedKeyData = await ctx.indexedDB.nearKeysDB.getEncryptedKey(payload.accountId, deviceNumber);\n if (!encryptedKeyData) {\n throw new Error(`No encrypted key found for account: ${payload.accountId}`);\n }\n\n // Expect caller (SignerWorkerManager) to reserve a session and wire ports; just use provided sessionId\n const sessionId = payload.sessionId ?? generateSessionId();\n\n if (!ctx.vrfWorkerManager) {\n throw new Error('VrfWorkerManager not available for NEP-413 signing');\n }\n\n await ctx.vrfWorkerManager.confirmAndPrepareSigningSession({\n ctx,\n sessionId,\n kind: 'nep413',\n nearAccountId: payload.accountId,\n message: payload.message,\n recipient: payload.recipient,\n title: payload.title,\n body: payload.body,\n confirmationConfigOverride: payload.confirmationConfigOverride,\n contractId: payload.contractId,\n nearRpcUrl: payload.nearRpcUrl,\n });\n\n const response = await ctx.sendMessage<WorkerRequestType.SignNep413Message>({\n sessionId,\n message: {\n type: WorkerRequestType.SignNep413Message,\n payload: {\n message: payload.message,\n recipient: payload.recipient,\n nonce: payload.nonce,\n state: payload.state || undefined,\n accountId: payload.accountId,\n encryptedPrivateKeyData: encryptedKeyData.encryptedData,\n encryptedPrivateKeyChacha20NonceB64u: encryptedKeyData.chacha20NonceB64u,\n }\n },\n });\n\n if (!isSignNep413MessageSuccess(response)) {\n console.error('SignerWorkerManager: NEP-413 signing failed:', response);\n const payloadError = isObject(response?.payload) && (response as any)?.payload?.error;\n throw new Error(payloadError || 'NEP-413 signing failed');\n }\n\n return {\n success: true,\n accountId: response.payload.accountId,\n publicKey: response.payload.publicKey,\n signature: response.payload.signature,\n state: response.payload.state || undefined\n };\n\n } catch (error: unknown) {\n console.error('SignerWorkerManager: NEP-413 signing error:', error);\n return {\n success: false,\n accountId: '',\n publicKey: '',\n signature: '',\n error: (error && typeof (error as { message?: unknown }).message === 'string')\n ? (error as { message: string }).message\n : 'Unknown error'\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAcA,eAAsB,kBAAkB,EAAE,KAAK,WAsB5C;AACD,KAAI;EACF,MAAM,eAAe,MAAMA,oDAA4B,QAAQ,WAAW,IAAI,UAAU;EACxF,MAAM,mBAAmB,MAAM,IAAI,UAAU,WAAW,gBAAgB,QAAQ,WAAW;AAC3F,MAAI,CAAC,iBACH,OAAM,IAAI,MAAM,uCAAuC,QAAQ;EAIjE,MAAM,YAAY,QAAQ,aAAaC;AAEvC,MAAI,CAAC,IAAI,iBACP,OAAM,IAAI,MAAM;AAGlB,QAAM,IAAI,iBAAiB,gCAAgC;GACzD;GACA;GACA,MAAM;GACN,eAAe,QAAQ;GACvB,SAAS,QAAQ;GACjB,WAAW,QAAQ;GACnB,OAAO,QAAQ;GACf,MAAM,QAAQ;GACd,4BAA4B,QAAQ;GACpC,YAAY,QAAQ;GACpB,YAAY,QAAQ;;EAGtB,MAAM,WAAW,MAAM,IAAI,YAAiD;GAC1E;GACA,SAAS;IACP,MAAMC,mEAAkB;IACxB,SAAS;KACP,SAAS,QAAQ;KACjB,WAAW,QAAQ;KACnB,OAAO,QAAQ;KACf,OAAO,QAAQ,SAAS;KACxB,WAAW,QAAQ;KACnB,yBAAyB,iBAAiB;KAC1C,sCAAsC,iBAAiB;;;;AAK7D,MAAI,CAACC,iDAA2B,WAAW;AACzC,WAAQ,MAAM,gDAAgD;GAC9D,MAAM,eAAeC,4BAAS,UAAU,YAAa,UAAkB,SAAS;AAChF,SAAM,IAAI,MAAM,gBAAgB;;AAGlC,SAAO;GACL,SAAS;GACT,WAAW,SAAS,QAAQ;GAC5B,WAAW,SAAS,QAAQ;GAC5B,WAAW,SAAS,QAAQ;GAC5B,OAAO,SAAS,QAAQ,SAAS;;UAG5BC,OAAgB;AACvB,UAAQ,MAAM,+CAA+C;AAC7D,SAAO;GACL,SAAS;GACT,WAAW;GACX,WAAW;GACX,WAAW;GACX,OAAQ,SAAS,OAAQ,MAAgC,YAAY,WAChE,MAA8B,UAC/B"}
@@ -15,6 +15,7 @@ require_actions.init_actions();
15
15
  require_signer_worker.init_signer_worker();
16
16
  require_defaultConfigs.init_defaultConfigs();
17
17
  require_accountIds.init_accountIds();
18
+ require_getDeviceNumber.init_getDeviceNumber();
18
19
  require_validation.init_validation();
19
20
  /**
20
21
  * Sign multiple transactions with shared VRF challenge and credential