@tatchi-xyz/sdk 0.31.0 → 0.31.1

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 (173) hide show
  1. package/dist/cjs/core/IndexedDBManager/passkeyClientDB.js +2 -2
  2. package/dist/cjs/core/IndexedDBManager/passkeyClientDB.js.map +1 -1
  3. package/dist/cjs/core/TatchiPasskey/faucets/createAccountRelayServer.js +9 -8
  4. package/dist/cjs/core/TatchiPasskey/faucets/createAccountRelayServer.js.map +1 -1
  5. package/dist/cjs/core/TatchiPasskey/login.js +1 -1
  6. package/dist/cjs/core/TatchiPasskey/login.js.map +1 -1
  7. package/dist/cjs/core/TatchiPasskey/registration.js +67 -56
  8. package/dist/cjs/core/TatchiPasskey/registration.js.map +1 -1
  9. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.js +1 -10
  10. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.js.map +1 -1
  11. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js +58 -67
  12. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js.map +1 -1
  13. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js +74 -75
  14. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js.map +1 -1
  15. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.js +17 -7
  16. package/dist/cjs/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.js.map +1 -1
  17. package/dist/cjs/core/WebAuthnManager/index.js +3 -3
  18. package/dist/cjs/core/WebAuthnManager/index.js.map +1 -1
  19. package/dist/cjs/core/defaultConfigs.js +3 -1
  20. package/dist/cjs/core/defaultConfigs.js.map +1 -1
  21. package/dist/cjs/react/components/AccountMenuButton/TransactionSettingsSection.js +3 -3
  22. package/dist/cjs/react/components/AccountMenuButton/TransactionSettingsSection.js.map +1 -1
  23. package/dist/cjs/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-CRlobBrN.css → PasskeyAuthMenu-D2eRb2-S.css} +3 -1
  24. package/dist/cjs/react/components/PasskeyAuthMenu/PasskeyAuthMenu-D2eRb2-S.css.map +1 -0
  25. package/dist/cjs/react/components/PasskeyAuthMenu/preload.js +1 -1
  26. package/dist/cjs/react/components/PasskeyAuthMenu/preload.js.map +1 -1
  27. package/dist/cjs/react/components/PasskeyAuthMenu/shell.js +52 -13
  28. package/dist/cjs/react/components/PasskeyAuthMenu/shell.js.map +1 -1
  29. package/dist/cjs/react/components/PasskeyAuthMenu/skeleton.js +4 -2
  30. package/dist/cjs/react/components/PasskeyAuthMenu/skeleton.js.map +1 -1
  31. package/dist/cjs/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js +5 -1
  32. package/dist/cjs/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js.map +1 -1
  33. package/dist/cjs/react/index.js +1 -1
  34. package/dist/cjs/react/src/core/IndexedDBManager/passkeyClientDB.js +2 -2
  35. package/dist/cjs/react/src/core/IndexedDBManager/passkeyClientDB.js.map +1 -1
  36. package/dist/cjs/react/src/core/TatchiPasskey/faucets/createAccountRelayServer.js +9 -8
  37. package/dist/cjs/react/src/core/TatchiPasskey/faucets/createAccountRelayServer.js.map +1 -1
  38. package/dist/cjs/react/src/core/TatchiPasskey/login.js +1 -1
  39. package/dist/cjs/react/src/core/TatchiPasskey/login.js.map +1 -1
  40. package/dist/cjs/react/src/core/TatchiPasskey/registration.js +67 -56
  41. package/dist/cjs/react/src/core/TatchiPasskey/registration.js.map +1 -1
  42. package/dist/cjs/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.js +1 -10
  43. package/dist/cjs/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.js.map +1 -1
  44. package/dist/cjs/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js +58 -67
  45. package/dist/cjs/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js.map +1 -1
  46. package/dist/cjs/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js +74 -75
  47. package/dist/cjs/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js.map +1 -1
  48. package/dist/cjs/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.js +17 -7
  49. package/dist/cjs/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.js.map +1 -1
  50. package/dist/cjs/react/src/core/WebAuthnManager/index.js +3 -3
  51. package/dist/cjs/react/src/core/WebAuthnManager/index.js.map +1 -1
  52. package/dist/cjs/react/src/core/defaultConfigs.js +3 -1
  53. package/dist/cjs/react/src/core/defaultConfigs.js.map +1 -1
  54. package/dist/cjs/server/core/AuthService.js +49 -6
  55. package/dist/cjs/server/core/AuthService.js.map +1 -1
  56. package/dist/cjs/server/sdk/src/core/defaultConfigs.js.map +1 -1
  57. package/dist/esm/core/IndexedDBManager/passkeyClientDB.js +2 -2
  58. package/dist/esm/core/IndexedDBManager/passkeyClientDB.js.map +1 -1
  59. package/dist/esm/core/TatchiPasskey/faucets/createAccountRelayServer.js +9 -8
  60. package/dist/esm/core/TatchiPasskey/faucets/createAccountRelayServer.js.map +1 -1
  61. package/dist/esm/core/TatchiPasskey/login.js +1 -1
  62. package/dist/esm/core/TatchiPasskey/login.js.map +1 -1
  63. package/dist/esm/core/TatchiPasskey/registration.js +67 -56
  64. package/dist/esm/core/TatchiPasskey/registration.js.map +1 -1
  65. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.js +1 -10
  66. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.js.map +1 -1
  67. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js +58 -67
  68. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js.map +1 -1
  69. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js +74 -75
  70. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js.map +1 -1
  71. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.js +17 -7
  72. package/dist/esm/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.js.map +1 -1
  73. package/dist/esm/core/WebAuthnManager/index.js +3 -3
  74. package/dist/esm/core/WebAuthnManager/index.js.map +1 -1
  75. package/dist/esm/core/defaultConfigs.js +3 -1
  76. package/dist/esm/core/defaultConfigs.js.map +1 -1
  77. package/dist/esm/react/components/AccountMenuButton/TransactionSettingsSection.js +3 -3
  78. package/dist/esm/react/components/AccountMenuButton/TransactionSettingsSection.js.map +1 -1
  79. package/dist/esm/react/components/PasskeyAuthMenu/{PasskeyAuthMenu-D2VHZ04W.css → PasskeyAuthMenu-qTHAv58Z.css} +3 -1
  80. package/dist/esm/react/components/PasskeyAuthMenu/PasskeyAuthMenu-qTHAv58Z.css.map +1 -0
  81. package/dist/esm/react/components/PasskeyAuthMenu/preload.js +1 -1
  82. package/dist/esm/react/components/PasskeyAuthMenu/preload.js.map +1 -1
  83. package/dist/esm/react/components/PasskeyAuthMenu/shell.js +52 -13
  84. package/dist/esm/react/components/PasskeyAuthMenu/shell.js.map +1 -1
  85. package/dist/esm/react/components/PasskeyAuthMenu/skeleton.js +4 -2
  86. package/dist/esm/react/components/PasskeyAuthMenu/skeleton.js.map +1 -1
  87. package/dist/esm/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js +5 -1
  88. package/dist/esm/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.js.map +1 -1
  89. package/dist/esm/react/index.js +1 -1
  90. package/dist/esm/react/src/core/IndexedDBManager/passkeyClientDB.js +2 -2
  91. package/dist/esm/react/src/core/IndexedDBManager/passkeyClientDB.js.map +1 -1
  92. package/dist/esm/react/src/core/TatchiPasskey/faucets/createAccountRelayServer.js +9 -8
  93. package/dist/esm/react/src/core/TatchiPasskey/faucets/createAccountRelayServer.js.map +1 -1
  94. package/dist/esm/react/src/core/TatchiPasskey/login.js +1 -1
  95. package/dist/esm/react/src/core/TatchiPasskey/login.js.map +1 -1
  96. package/dist/esm/react/src/core/TatchiPasskey/registration.js +67 -56
  97. package/dist/esm/react/src/core/TatchiPasskey/registration.js.map +1 -1
  98. package/dist/esm/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.js +1 -10
  99. package/dist/esm/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.js.map +1 -1
  100. package/dist/esm/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js +58 -67
  101. package/dist/esm/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.js.map +1 -1
  102. package/dist/esm/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js +74 -75
  103. package/dist/esm/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.js.map +1 -1
  104. package/dist/esm/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.js +17 -7
  105. package/dist/esm/react/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.js.map +1 -1
  106. package/dist/esm/react/src/core/WebAuthnManager/index.js +3 -3
  107. package/dist/esm/react/src/core/WebAuthnManager/index.js.map +1 -1
  108. package/dist/esm/react/src/core/defaultConfigs.js +3 -1
  109. package/dist/esm/react/src/core/defaultConfigs.js.map +1 -1
  110. package/dist/esm/react/styles/styles.css +2 -0
  111. package/dist/esm/sdk/{EmailRecovery-Dl8b4ONg.js → EmailRecovery-Y7rurd4B.js} +3 -3
  112. package/dist/esm/sdk/{EmailRecovery-v9oNO2Tc.js → EmailRecovery-lsjLWApQ.js} +1 -1
  113. package/dist/esm/sdk/{IndexedDBManager-B1cUvdyY.js → IndexedDBManager-CmdN7smS.js} +3 -3
  114. package/dist/esm/sdk/{createAdapters-Dv7ZJPf1.js → createAdapters-4c8mBiD5.js} +2 -11
  115. package/dist/esm/sdk/{createAdapters-Dv7ZJPf1.js.map → createAdapters-4c8mBiD5.js.map} +1 -1
  116. package/dist/esm/sdk/{createAdapters-1Hmc1vVC.js → createAdapters-DF32SIZa.js} +1 -10
  117. package/dist/esm/sdk/{defaultConfigs-BmCU1_qI.js → defaultConfigs-BQqiXif-.js} +3 -1
  118. package/dist/esm/sdk/{emailRecovery-4J-g9tlY.js → emailRecovery-C0LSDleV.js} +5 -5
  119. package/dist/esm/sdk/{getDeviceNumber-f8bfPB9U.js → getDeviceNumber-WiNzKx1x.js} +4 -2
  120. package/dist/esm/sdk/{getDeviceNumber-f8bfPB9U.js.map → getDeviceNumber-WiNzKx1x.js.map} +1 -1
  121. package/dist/esm/sdk/{linkDevice-C98klpcE.js → linkDevice-Ds1GNIDk.js} +4 -4
  122. package/dist/esm/sdk/{localOnly-40zxrBMm.js → localOnly-COpDBMkm.js} +2 -2
  123. package/dist/esm/sdk/{localOnly-40zxrBMm.js.map → localOnly-COpDBMkm.js.map} +1 -1
  124. package/dist/esm/sdk/{localOnly-BZPBj14l.js → localOnly-DQQuqgjJ.js} +1 -1
  125. package/dist/esm/sdk/{login-DnROv3eA.js → login-BKhTuGcy.js} +3 -3
  126. package/dist/esm/sdk/offline-export-app.js +29 -19
  127. package/dist/esm/sdk/offline-export-app.js.map +1 -1
  128. package/dist/esm/sdk/{registration-BP9M3tE1.js → registration-BR2G9tz_.js} +59 -68
  129. package/dist/esm/sdk/{registration-MrAOC8Ub.js → registration-R70lvG_o.js} +60 -69
  130. package/dist/esm/sdk/registration-R70lvG_o.js.map +1 -0
  131. package/dist/esm/sdk/{router-BEGGuWaB.js → router-2aGn-CTp.js} +1 -1
  132. package/dist/esm/sdk/{rpcCalls-CMzj_Va_.js → rpcCalls-BPI0icZG.js} +2 -2
  133. package/dist/esm/sdk/{rpcCalls-B44MZora.js → rpcCalls-BW3M_q3-.js} +1 -1
  134. package/dist/esm/sdk/{scanDevice-Cp-r-Z2T.js → scanDevice-BBSehlMx.js} +4 -4
  135. package/dist/esm/sdk/{syncAccount-CqWCmBVb.js → syncAccount-DEZHBiRa.js} +4 -4
  136. package/dist/esm/sdk/{syncAccount-Dt5jJbEB.js → syncAccount-DHKtl-xh.js} +2 -2
  137. package/dist/esm/sdk/{transactions-DAZrPW-6.js → transactions-Cg1TIUyK.js} +76 -77
  138. package/dist/esm/sdk/{transactions-CrjP8yPD.js → transactions-CxsklyCK.js} +77 -78
  139. package/dist/esm/sdk/transactions-CxsklyCK.js.map +1 -0
  140. package/dist/esm/sdk/wallet-iframe-host.js +116 -94
  141. package/dist/esm/server/core/AuthService.js +49 -6
  142. package/dist/esm/server/core/AuthService.js.map +1 -1
  143. package/dist/esm/server/sdk/src/core/defaultConfigs.js.map +1 -1
  144. package/dist/esm/wasm_vrf_worker/pkg/wasm_vrf_worker_bg.wasm +0 -0
  145. package/dist/types/src/__tests__/setup/bootstrap.d.ts.map +1 -1
  146. package/dist/types/src/core/IndexedDBManager/passkeyClientDB.d.ts +1 -1
  147. package/dist/types/src/core/IndexedDBManager/passkeyClientDB.d.ts.map +1 -1
  148. package/dist/types/src/core/TatchiPasskey/faucets/createAccountRelayServer.d.ts +6 -6
  149. package/dist/types/src/core/TatchiPasskey/faucets/createAccountRelayServer.d.ts.map +1 -1
  150. package/dist/types/src/core/TatchiPasskey/registration.d.ts.map +1 -1
  151. package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.d.ts +0 -5
  152. package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/adapters/session.d.ts.map +1 -1
  153. package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.d.ts.map +1 -1
  154. package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.d.ts.map +1 -1
  155. package/dist/types/src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/handleSecureConfirmRequest.d.ts.map +1 -1
  156. package/dist/types/src/core/WebAuthnManager/index.d.ts +1 -1
  157. package/dist/types/src/core/WebAuthnManager/index.d.ts.map +1 -1
  158. package/dist/types/src/core/defaultConfigs.d.ts.map +1 -1
  159. package/dist/types/src/react/components/PasskeyAuthMenu/preload.d.ts.map +1 -1
  160. package/dist/types/src/react/components/PasskeyAuthMenu/shell.d.ts.map +1 -1
  161. package/dist/types/src/react/components/PasskeyAuthMenu/skeleton.d.ts +1 -1
  162. package/dist/types/src/react/components/PasskeyAuthMenu/skeleton.d.ts.map +1 -1
  163. package/dist/types/src/react/components/PasskeyAuthMenu/ui/EmailRecoverySlide.d.ts.map +1 -1
  164. package/dist/types/src/server/core/AuthService.d.ts.map +1 -1
  165. package/dist/workers/offline-export-sw.js +156 -1
  166. package/dist/workers/wasm_vrf_worker_bg.wasm +0 -0
  167. package/dist/workers/web3authn-signer.worker.js +1360 -2
  168. package/dist/workers/web3authn-vrf.worker.js +2857 -2
  169. package/package.json +1 -1
  170. package/dist/cjs/react/components/PasskeyAuthMenu/PasskeyAuthMenu-CRlobBrN.css.map +0 -1
  171. package/dist/esm/react/components/PasskeyAuthMenu/PasskeyAuthMenu-D2VHZ04W.css.map +0 -1
  172. package/dist/esm/sdk/registration-MrAOC8Ub.js.map +0 -1
  173. package/dist/esm/sdk/transactions-CrjP8yPD.js.map +0 -1
@@ -13,7 +13,7 @@ import { toError } from "./errors-DevlT39D.js";
13
13
  import { isSerializedRegistrationCredential, serializeRegistrationCredentialWithPRF } from "./safari-fallbacks-BcMFntiP.js";
14
14
  import "./touchIdPrompt-JPhrOx8o.js";
15
15
  import { ERROR_MESSAGES, getIntentDigest, getNearAccountId, getRegisterAccountPayload, isUserCancelledSecureConfirm } from "./collectAuthenticationCredentialForVrfChallenge-DqzPzwvU.js";
16
- import { createConfirmSession, createConfirmTxFlowAdapters } from "./createAdapters-1Hmc1vVC.js";
16
+ import { createConfirmSession, createConfirmTxFlowAdapters } from "./createAdapters-DF32SIZa.js";
17
17
 
18
18
  //#region src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.ts
19
19
  async function handleRegistrationFlow(ctx, request, worker, opts) {
@@ -27,78 +27,70 @@ async function handleRegistrationFlow(ctx, request, worker, opts) {
27
27
  transactionSummary
28
28
  });
29
29
  const nearAccountId = getNearAccountId(request);
30
- console.debug("[RegistrationFlow] start", {
31
- nearAccountId,
32
- uiMode: confirmationConfig?.uiMode,
33
- behavior: confirmationConfig?.behavior,
34
- theme: confirmationConfig?.theme,
35
- intentDigest: transactionSummary?.intentDigest
36
- });
37
- const nearRpc = await adapters.near.fetchNearContext({
38
- nearAccountId,
39
- txCount: 1,
40
- reserveNonces: true
41
- });
42
- if (nearRpc.error && !nearRpc.transactionContext) return session.confirmAndCloseModal({
43
- requestId: request.requestId,
44
- intentDigest: getIntentDigest(request),
45
- confirmed: false,
46
- error: `${ERROR_MESSAGES.nearRpcFailed}: ${nearRpc.details}`
47
- });
48
- const transactionContext = nearRpc.transactionContext;
49
- session.setReservedNonces(nearRpc.reservedNonces);
50
- const computeBoundIntentDigestB64u = async () => {
51
- const uiIntentDigest = getIntentDigest(request);
52
- if (!uiIntentDigest) throw new Error("Missing intentDigest for registration flow");
53
- return sha256Base64UrlUtf8(uiIntentDigest);
54
- };
55
- const rpId = adapters.vrf.getRpId();
56
- const boundIntentDigestB64u = await computeBoundIntentDigestB64u();
57
- const bootstrap = await adapters.vrf.generateVrfKeypairBootstrap({
58
- vrfInputData: {
59
- userId: nearAccountId,
60
- rpId,
61
- blockHeight: transactionContext.txBlockHeight,
62
- blockHash: transactionContext.txBlockHash,
63
- intentDigest: boundIntentDigestB64u
64
- },
65
- saveInMemory: true,
66
- sessionId: request.requestId
67
- });
68
- let uiVrfChallenge = bootstrap.vrfChallenge;
69
- console.debug("[RegistrationFlow] VRF bootstrap ok", { blockHeight: uiVrfChallenge.blockHeight });
70
- const { confirmed, error: uiError } = await session.promptUser({ vrfChallenge: uiVrfChallenge });
71
- if (!confirmed) {
72
- console.debug("[RegistrationFlow] user cancelled");
73
- return session.confirmAndCloseModal({
30
+ try {
31
+ const nearRpc = await adapters.near.fetchNearContext({
32
+ nearAccountId,
33
+ txCount: 1,
34
+ reserveNonces: true
35
+ });
36
+ if (nearRpc.error && !nearRpc.transactionContext) return session.confirmAndCloseModal({
74
37
  requestId: request.requestId,
75
38
  intentDigest: getIntentDigest(request),
76
39
  confirmed: false,
77
- error: uiError
40
+ error: `${ERROR_MESSAGES.nearRpcFailed}: ${nearRpc.details}`
78
41
  });
79
- }
80
- try {
81
- const refreshed = await adapters.vrf.maybeRefreshVrfChallenge(request, nearAccountId);
82
- uiVrfChallenge = refreshed.vrfChallenge;
83
- session.updateUI({ vrfChallenge: uiVrfChallenge });
84
- console.debug("[RegistrationFlow] VRF JIT refresh ok", { blockHeight: uiVrfChallenge.blockHeight });
85
- } catch (e) {
86
- console.debug("[RegistrationFlow] VRF JIT refresh skipped", e);
87
- }
88
- let credential;
89
- let deviceNumber = request.payload?.deviceNumber ?? 1;
90
- const tryCreate = async (dn) => {
91
- console.debug("[RegistrationFlow] navigator.credentials.create start", { deviceNumber: dn });
92
- return await adapters.webauthn.createRegistrationCredential({
93
- nearAccountId,
94
- challenge: uiVrfChallenge,
95
- deviceNumber: dn
42
+ const transactionContext = nearRpc.transactionContext;
43
+ session.setReservedNonces(nearRpc.reservedNonces);
44
+ const computeBoundIntentDigestB64u = async () => {
45
+ const uiIntentDigest = getIntentDigest(request);
46
+ if (!uiIntentDigest) throw new Error("Missing intentDigest for registration flow");
47
+ return sha256Base64UrlUtf8(uiIntentDigest);
48
+ };
49
+ const rpId = adapters.vrf.getRpId();
50
+ const boundIntentDigestB64u = await computeBoundIntentDigestB64u();
51
+ const bootstrap = await adapters.vrf.generateVrfKeypairBootstrap({
52
+ vrfInputData: {
53
+ userId: nearAccountId,
54
+ rpId,
55
+ blockHeight: transactionContext.txBlockHeight,
56
+ blockHash: transactionContext.txBlockHash,
57
+ intentDigest: boundIntentDigestB64u
58
+ },
59
+ saveInMemory: true,
60
+ sessionId: request.requestId
96
61
  });
97
- };
98
- try {
62
+ let uiVrfChallenge = bootstrap.vrfChallenge;
63
+ console.debug("[RegistrationFlow] VRF bootstrap ok", { blockHeight: uiVrfChallenge.blockHeight });
64
+ const { confirmed, error: uiError } = await session.promptUser({ vrfChallenge: uiVrfChallenge });
65
+ if (!confirmed) {
66
+ console.debug("[RegistrationFlow] user cancelled");
67
+ return session.confirmAndCloseModal({
68
+ requestId: request.requestId,
69
+ intentDigest: getIntentDigest(request),
70
+ confirmed: false,
71
+ error: uiError
72
+ });
73
+ }
74
+ try {
75
+ const refreshed = await adapters.vrf.maybeRefreshVrfChallenge(request, nearAccountId);
76
+ uiVrfChallenge = refreshed.vrfChallenge;
77
+ session.updateUI({ vrfChallenge: uiVrfChallenge });
78
+ console.debug("[RegistrationFlow] VRF JIT refresh ok", { blockHeight: uiVrfChallenge.blockHeight });
79
+ } catch (e) {
80
+ console.debug("[RegistrationFlow] VRF JIT refresh skipped", e);
81
+ }
82
+ let credential;
83
+ let deviceNumber = request.payload?.deviceNumber ?? 1;
84
+ const tryCreate = async (dn) => {
85
+ console.debug("[RegistrationFlow] navigator.credentials.create start", { deviceNumber: dn });
86
+ return await adapters.webauthn.createRegistrationCredential({
87
+ nearAccountId,
88
+ challenge: uiVrfChallenge,
89
+ deviceNumber: dn
90
+ });
91
+ };
99
92
  try {
100
93
  credential = await tryCreate(deviceNumber);
101
- console.debug("[RegistrationFlow] credentials.create ok");
102
94
  } catch (e) {
103
95
  const err = toError(e);
104
96
  const name = String(err?.name || "");
@@ -149,14 +141,13 @@ async function handleRegistrationFlow(ctx, request, worker, opts) {
149
141
  } catch (err) {
150
142
  const cancelled = isUserCancelledSecureConfirm(err);
151
143
  const msg = String(toError(err)?.message || err || "");
152
- if (/Missing PRF result/i.test(msg) || /Missing PRF results/i.test(msg)) return session.cleanupAndRethrow(err);
153
144
  if (cancelled) window.parent?.postMessage({ type: "WALLET_UI_CLOSED" }, "*");
154
145
  const isPrfBrowserUnsupported = /WebAuthn PRF output is missing from navigator\.credentials\.create\(\)/i.test(msg) || /does not fully support the WebAuthn PRF extension during registration/i.test(msg) || /roaming hardware authenticators .* not supported in this flow/i.test(msg);
155
146
  return session.confirmAndCloseModal({
156
147
  requestId: request.requestId,
157
148
  intentDigest: getIntentDigest(request),
158
149
  confirmed: false,
159
- error: cancelled ? ERROR_MESSAGES.cancelled : isPrfBrowserUnsupported ? msg : ERROR_MESSAGES.collectCredentialsFailed
150
+ error: cancelled ? ERROR_MESSAGES.cancelled : isPrfBrowserUnsupported ? msg : msg || ERROR_MESSAGES.collectCredentialsFailed
160
151
  });
161
152
  }
162
153
  }
@@ -1,6 +1,6 @@
1
1
  import "./validation-hUZgySTx.js";
2
2
  import { ERROR_MESSAGES, getIntentDigest, getNearAccountId, getRegisterAccountPayload, isSerializedRegistrationCredential, isUserCancelledSecureConfirm, serializeRegistrationCredentialWithPRF, sha256Base64UrlUtf8, toError } from "./collectAuthenticationCredentialForVrfChallenge-C9p90e5Z.js";
3
- import { createConfirmSession, createConfirmTxFlowAdapters } from "./createAdapters-Dv7ZJPf1.js";
3
+ import { createConfirmSession, createConfirmTxFlowAdapters } from "./createAdapters-4c8mBiD5.js";
4
4
  import "./css-loader-DWW-_Vli.js";
5
5
 
6
6
  //#region src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.ts
@@ -15,78 +15,70 @@ async function handleRegistrationFlow(ctx, request, worker, opts) {
15
15
  transactionSummary
16
16
  });
17
17
  const nearAccountId = getNearAccountId(request);
18
- console.debug("[RegistrationFlow] start", {
19
- nearAccountId,
20
- uiMode: confirmationConfig?.uiMode,
21
- behavior: confirmationConfig?.behavior,
22
- theme: confirmationConfig?.theme,
23
- intentDigest: transactionSummary?.intentDigest
24
- });
25
- const nearRpc = await adapters.near.fetchNearContext({
26
- nearAccountId,
27
- txCount: 1,
28
- reserveNonces: true
29
- });
30
- if (nearRpc.error && !nearRpc.transactionContext) return session.confirmAndCloseModal({
31
- requestId: request.requestId,
32
- intentDigest: getIntentDigest(request),
33
- confirmed: false,
34
- error: `${ERROR_MESSAGES.nearRpcFailed}: ${nearRpc.details}`
35
- });
36
- const transactionContext = nearRpc.transactionContext;
37
- session.setReservedNonces(nearRpc.reservedNonces);
38
- const computeBoundIntentDigestB64u = async () => {
39
- const uiIntentDigest = getIntentDigest(request);
40
- if (!uiIntentDigest) throw new Error("Missing intentDigest for registration flow");
41
- return sha256Base64UrlUtf8(uiIntentDigest);
42
- };
43
- const rpId = adapters.vrf.getRpId();
44
- const boundIntentDigestB64u = await computeBoundIntentDigestB64u();
45
- const bootstrap = await adapters.vrf.generateVrfKeypairBootstrap({
46
- vrfInputData: {
47
- userId: nearAccountId,
48
- rpId,
49
- blockHeight: transactionContext.txBlockHeight,
50
- blockHash: transactionContext.txBlockHash,
51
- intentDigest: boundIntentDigestB64u
52
- },
53
- saveInMemory: true,
54
- sessionId: request.requestId
55
- });
56
- let uiVrfChallenge = bootstrap.vrfChallenge;
57
- console.debug("[RegistrationFlow] VRF bootstrap ok", { blockHeight: uiVrfChallenge.blockHeight });
58
- const { confirmed, error: uiError } = await session.promptUser({ vrfChallenge: uiVrfChallenge });
59
- if (!confirmed) {
60
- console.debug("[RegistrationFlow] user cancelled");
61
- return session.confirmAndCloseModal({
18
+ try {
19
+ const nearRpc = await adapters.near.fetchNearContext({
20
+ nearAccountId,
21
+ txCount: 1,
22
+ reserveNonces: true
23
+ });
24
+ if (nearRpc.error && !nearRpc.transactionContext) return session.confirmAndCloseModal({
62
25
  requestId: request.requestId,
63
26
  intentDigest: getIntentDigest(request),
64
27
  confirmed: false,
65
- error: uiError
28
+ error: `${ERROR_MESSAGES.nearRpcFailed}: ${nearRpc.details}`
66
29
  });
67
- }
68
- try {
69
- const refreshed = await adapters.vrf.maybeRefreshVrfChallenge(request, nearAccountId);
70
- uiVrfChallenge = refreshed.vrfChallenge;
71
- session.updateUI({ vrfChallenge: uiVrfChallenge });
72
- console.debug("[RegistrationFlow] VRF JIT refresh ok", { blockHeight: uiVrfChallenge.blockHeight });
73
- } catch (e) {
74
- console.debug("[RegistrationFlow] VRF JIT refresh skipped", e);
75
- }
76
- let credential;
77
- let deviceNumber = request.payload?.deviceNumber ?? 1;
78
- const tryCreate = async (dn) => {
79
- console.debug("[RegistrationFlow] navigator.credentials.create start", { deviceNumber: dn });
80
- return await adapters.webauthn.createRegistrationCredential({
81
- nearAccountId,
82
- challenge: uiVrfChallenge,
83
- deviceNumber: dn
30
+ const transactionContext = nearRpc.transactionContext;
31
+ session.setReservedNonces(nearRpc.reservedNonces);
32
+ const computeBoundIntentDigestB64u = async () => {
33
+ const uiIntentDigest = getIntentDigest(request);
34
+ if (!uiIntentDigest) throw new Error("Missing intentDigest for registration flow");
35
+ return sha256Base64UrlUtf8(uiIntentDigest);
36
+ };
37
+ const rpId = adapters.vrf.getRpId();
38
+ const boundIntentDigestB64u = await computeBoundIntentDigestB64u();
39
+ const bootstrap = await adapters.vrf.generateVrfKeypairBootstrap({
40
+ vrfInputData: {
41
+ userId: nearAccountId,
42
+ rpId,
43
+ blockHeight: transactionContext.txBlockHeight,
44
+ blockHash: transactionContext.txBlockHash,
45
+ intentDigest: boundIntentDigestB64u
46
+ },
47
+ saveInMemory: true,
48
+ sessionId: request.requestId
84
49
  });
85
- };
86
- try {
50
+ let uiVrfChallenge = bootstrap.vrfChallenge;
51
+ console.debug("[RegistrationFlow] VRF bootstrap ok", { blockHeight: uiVrfChallenge.blockHeight });
52
+ const { confirmed, error: uiError } = await session.promptUser({ vrfChallenge: uiVrfChallenge });
53
+ if (!confirmed) {
54
+ console.debug("[RegistrationFlow] user cancelled");
55
+ return session.confirmAndCloseModal({
56
+ requestId: request.requestId,
57
+ intentDigest: getIntentDigest(request),
58
+ confirmed: false,
59
+ error: uiError
60
+ });
61
+ }
62
+ try {
63
+ const refreshed = await adapters.vrf.maybeRefreshVrfChallenge(request, nearAccountId);
64
+ uiVrfChallenge = refreshed.vrfChallenge;
65
+ session.updateUI({ vrfChallenge: uiVrfChallenge });
66
+ console.debug("[RegistrationFlow] VRF JIT refresh ok", { blockHeight: uiVrfChallenge.blockHeight });
67
+ } catch (e) {
68
+ console.debug("[RegistrationFlow] VRF JIT refresh skipped", e);
69
+ }
70
+ let credential;
71
+ let deviceNumber = request.payload?.deviceNumber ?? 1;
72
+ const tryCreate = async (dn) => {
73
+ console.debug("[RegistrationFlow] navigator.credentials.create start", { deviceNumber: dn });
74
+ return await adapters.webauthn.createRegistrationCredential({
75
+ nearAccountId,
76
+ challenge: uiVrfChallenge,
77
+ deviceNumber: dn
78
+ });
79
+ };
87
80
  try {
88
81
  credential = await tryCreate(deviceNumber);
89
- console.debug("[RegistrationFlow] credentials.create ok");
90
82
  } catch (e) {
91
83
  const err = toError(e);
92
84
  const name = String(err?.name || "");
@@ -137,18 +129,17 @@ async function handleRegistrationFlow(ctx, request, worker, opts) {
137
129
  } catch (err) {
138
130
  const cancelled = isUserCancelledSecureConfirm(err);
139
131
  const msg = String(toError(err)?.message || err || "");
140
- if (/Missing PRF result/i.test(msg) || /Missing PRF results/i.test(msg)) return session.cleanupAndRethrow(err);
141
132
  if (cancelled) window.parent?.postMessage({ type: "WALLET_UI_CLOSED" }, "*");
142
133
  const isPrfBrowserUnsupported = /WebAuthn PRF output is missing from navigator\.credentials\.create\(\)/i.test(msg) || /does not fully support the WebAuthn PRF extension during registration/i.test(msg) || /roaming hardware authenticators .* not supported in this flow/i.test(msg);
143
134
  return session.confirmAndCloseModal({
144
135
  requestId: request.requestId,
145
136
  intentDigest: getIntentDigest(request),
146
137
  confirmed: false,
147
- error: cancelled ? ERROR_MESSAGES.cancelled : isPrfBrowserUnsupported ? msg : ERROR_MESSAGES.collectCredentialsFailed
138
+ error: cancelled ? ERROR_MESSAGES.cancelled : isPrfBrowserUnsupported ? msg : msg || ERROR_MESSAGES.collectCredentialsFailed
148
139
  });
149
140
  }
150
141
  }
151
142
 
152
143
  //#endregion
153
144
  export { handleRegistrationFlow };
154
- //# sourceMappingURL=registration-MrAOC8Ub.js.map
145
+ //# sourceMappingURL=registration-R70lvG_o.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registration-R70lvG_o.js","names":["uiVrfChallenge: VRFChallenge","credential: PublicKeyCredential | undefined","e: unknown","serialized: WebAuthnRegistrationCredential","err: unknown"],"sources":["../../../src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/registration.ts"],"sourcesContent":["import type { VrfWorkerManagerContext } from '../../';\nimport type { ConfirmationConfig } from '../../../../types/signer-worker';\nimport {\n TransactionSummary,\n RegistrationSecureConfirmRequest,\n} from '../types';\nimport { VRFChallenge, TransactionContext } from '../../../../types';\nimport type { WebAuthnRegistrationCredential } from '../../../../types/webauthn';\nimport { sha256Base64UrlUtf8 } from '../../../../digests/intentDigest';\nimport {\n getNearAccountId,\n getIntentDigest,\n isUserCancelledSecureConfirm,\n ERROR_MESSAGES,\n getRegisterAccountPayload,\n} from './index';\nimport { isSerializedRegistrationCredential, serializeRegistrationCredentialWithPRF } from '../../../credentialsHelpers';\nimport { toError } from '../../../../../utils/errors';\nimport { createConfirmSession } from '../adapters/session';\nimport { createConfirmTxFlowAdapters } from '../adapters/createAdapters';\n\nexport async function handleRegistrationFlow(\n ctx: VrfWorkerManagerContext,\n request: RegistrationSecureConfirmRequest,\n worker: Worker,\n opts: { confirmationConfig: ConfirmationConfig; transactionSummary: TransactionSummary },\n): Promise<void> {\n\n const { confirmationConfig, transactionSummary } = opts;\n const adapters = createConfirmTxFlowAdapters(ctx);\n const session = createConfirmSession({\n adapters,\n worker,\n request,\n confirmationConfig,\n transactionSummary,\n });\n const nearAccountId = getNearAccountId(request);\n\n try {\n // 1) NEAR context\n const nearRpc = await adapters.near.fetchNearContext({ nearAccountId, txCount: 1, reserveNonces: true });\n if (nearRpc.error && !nearRpc.transactionContext) {\n return session.confirmAndCloseModal({\n requestId: request.requestId,\n intentDigest: getIntentDigest(request),\n confirmed: false,\n error: `${ERROR_MESSAGES.nearRpcFailed}: ${nearRpc.details}`,\n });\n }\n const transactionContext = nearRpc.transactionContext as TransactionContext;\n session.setReservedNonces(nearRpc.reservedNonces);\n\n const computeBoundIntentDigestB64u = async (): Promise<string> => {\n const uiIntentDigest = getIntentDigest(request);\n if (!uiIntentDigest) {\n throw new Error('Missing intentDigest for registration flow');\n }\n return sha256Base64UrlUtf8(uiIntentDigest);\n };\n\n // 2) Initial VRF challenge via bootstrap\n const rpId = adapters.vrf.getRpId();\n const boundIntentDigestB64u = await computeBoundIntentDigestB64u();\n const bootstrap = await adapters.vrf.generateVrfKeypairBootstrap({\n vrfInputData: {\n userId: nearAccountId,\n rpId,\n blockHeight: transactionContext.txBlockHeight,\n blockHash: transactionContext.txBlockHash,\n intentDigest: boundIntentDigestB64u,\n },\n saveInMemory: true,\n sessionId: request.requestId,\n });\n let uiVrfChallenge: VRFChallenge = bootstrap.vrfChallenge;\n console.debug('[RegistrationFlow] VRF bootstrap ok', { blockHeight: uiVrfChallenge.blockHeight });\n\n // 3) UI confirm\n const { confirmed, error: uiError } = await session.promptUser({ vrfChallenge: uiVrfChallenge });\n if (!confirmed) {\n console.debug('[RegistrationFlow] user cancelled');\n return session.confirmAndCloseModal({\n requestId: request.requestId,\n intentDigest: getIntentDigest(request),\n confirmed: false,\n error: uiError,\n });\n }\n\n // 4) JIT refresh VRF (best-effort)\n try {\n const refreshed = await adapters.vrf.maybeRefreshVrfChallenge(request, nearAccountId);\n uiVrfChallenge = refreshed.vrfChallenge;\n session.updateUI({ vrfChallenge: uiVrfChallenge });\n console.debug('[RegistrationFlow] VRF JIT refresh ok', { blockHeight: uiVrfChallenge.blockHeight });\n } catch (e) {\n console.debug('[RegistrationFlow] VRF JIT refresh skipped', e);\n }\n\n // 5) Collect registration credentials (with duplicate retry)\n let credential: PublicKeyCredential | undefined;\n let deviceNumber = request.payload?.deviceNumber ?? 1;\n\n const tryCreate = async (dn?: number): Promise<PublicKeyCredential> => {\n console.debug('[RegistrationFlow] navigator.credentials.create start', { deviceNumber: dn });\n return await adapters.webauthn.createRegistrationCredential({\n nearAccountId,\n challenge: uiVrfChallenge,\n deviceNumber: dn,\n });\n };\n\n try {\n credential = await tryCreate(deviceNumber);\n } catch (e: unknown) {\n\n const err = toError(e);\n const name = String(err?.name || '');\n const msg = String(err?.message || '');\n const isDuplicate = name === 'InvalidStateError' || /excluded|already\\s*registered/i.test(msg);\n\n if (isDuplicate) {\n const nextDeviceNumber = (deviceNumber !== undefined && Number.isFinite(deviceNumber)) ? (deviceNumber + 1) : 2;\n console.debug('[RegistrationFlow] duplicate credential, retry with next deviceNumber', { nextDeviceNumber });\n // Keep request payload and intentDigest in sync with the deviceNumber retry.\n deviceNumber = nextDeviceNumber;\n getRegisterAccountPayload(request).deviceNumber = nextDeviceNumber;\n request.intentDigest = request.type === 'registerAccount'\n ? `register:${nearAccountId}:${nextDeviceNumber}`\n : `device2-register:${nearAccountId}:${nextDeviceNumber}`;\n\n // Regenerate a VRF challenge bound to the updated intentDigest so the contract-side\n // VRF input derivation remains consistent end-to-end.\n const retryBoundIntentDigestB64u = await computeBoundIntentDigestB64u();\n const retryBootstrap = await adapters.vrf.generateVrfKeypairBootstrap({\n vrfInputData: {\n userId: nearAccountId,\n rpId,\n blockHeight: transactionContext.txBlockHeight,\n blockHash: transactionContext.txBlockHash,\n intentDigest: retryBoundIntentDigestB64u,\n },\n saveInMemory: true,\n sessionId: request.requestId,\n });\n uiVrfChallenge = retryBootstrap.vrfChallenge;\n session.updateUI({ vrfChallenge: uiVrfChallenge });\n\n credential = await tryCreate(nextDeviceNumber);\n } else {\n console.error('[RegistrationFlow] credentials.create failed (non-duplicate)', { name, msg });\n throw err;\n }\n }\n\n // We require registration credentials to include dual PRF outputs (first + second)\n // so VRF/NEAR key derivation can happen inside the workers without passing PRF outputs\n // as separate main-thread values.\n const serialized: WebAuthnRegistrationCredential = isSerializedRegistrationCredential(credential)\n ? (credential as unknown as WebAuthnRegistrationCredential)\n : serializeRegistrationCredentialWithPRF({\n credential: credential! as PublicKeyCredential,\n firstPrfOutput: true,\n secondPrfOutput: true,\n });\n\n // 6) Respond + close\n session.confirmAndCloseModal({\n requestId: request.requestId,\n intentDigest: getIntentDigest(request),\n confirmed: true,\n credential: serialized,\n // PRF outputs are embedded in serialized credential; VRF worker extracts and sends via MessagePort\n vrfChallenge: uiVrfChallenge,\n transactionContext,\n });\n } catch (err: unknown) {\n\n const cancelled = isUserCancelledSecureConfirm(err);\n const msg = String((toError(err))?.message || err || '');\n if (cancelled) {\n window.parent?.postMessage({ type: 'WALLET_UI_CLOSED' }, '*');\n }\n\n const isPrfBrowserUnsupported =\n /WebAuthn PRF output is missing from navigator\\.credentials\\.create\\(\\)/i.test(msg)\n || /does not fully support the WebAuthn PRF extension during registration/i.test(msg)\n || /roaming hardware authenticators .* not supported in this flow/i.test(msg);\n\n return session.confirmAndCloseModal({\n requestId: request.requestId,\n intentDigest: getIntentDigest(request),\n confirmed: false,\n error: cancelled\n ? ERROR_MESSAGES.cancelled\n : (isPrfBrowserUnsupported ? msg : (msg || ERROR_MESSAGES.collectCredentialsFailed)),\n });\n }\n}\n"],"mappings":"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"}
@@ -5,7 +5,7 @@ import "./base64-dqpWgddX.js";
5
5
  import { ActionPhase, DeviceLinkingPhase, EmailRecoveryPhase, LoginPhase, RegistrationPhase, SyncAccountPhase } from "./sdkSentEvents-CzAZBFjP.js";
6
6
  import { toError } from "./errors-DevlT39D.js";
7
7
  import { SignedTransaction, openOfflineExportWindow } from "./overlay-Ci2FOQKE.js";
8
- import { PASSKEY_MANAGER_DEFAULT_CONFIGS } from "./defaultConfigs-BmCU1_qI.js";
8
+ import { PASSKEY_MANAGER_DEFAULT_CONFIGS } from "./defaultConfigs-BQqiXif-.js";
9
9
  import { WebAuthnBridgeMessage, serializeAuthenticationCredentialWithPRF, serializeRegistrationCredentialWithPRF } from "./safari-fallbacks-BcMFntiP.js";
10
10
 
11
11
  //#region src/core/WalletIframe/client/on-events-progress-bus.ts
@@ -6,7 +6,7 @@ import "./base64-dqpWgddX.js";
6
6
  import "./vrf-worker-BzQsJ5BW.js";
7
7
  import "./sdkSentEvents-CzAZBFjP.js";
8
8
  import "./errors-DevlT39D.js";
9
- import "./defaultConfigs-BmCU1_qI.js";
10
- import { buildSetRecoveryEmailsActions, checkCanRegisterUserContractCall, executeDeviceLinkingContractCalls, getAuthenticatorsByUser, getCredentialIdsContractCall, getDeviceLinkingAccountContractCall, getEmailRecoveryAttempt, getRecoveryEmailHashesContractCall, hasAccessKey, syncAuthenticatorsContractCall, thresholdEd25519Keygen, thresholdEd25519KeygenFromRegistrationTx, verifyAuthenticationResponse, waitForAccessKeyAbsent } from "./rpcCalls-B44MZora.js";
9
+ import "./defaultConfigs-BQqiXif-.js";
10
+ import { buildSetRecoveryEmailsActions, checkCanRegisterUserContractCall, executeDeviceLinkingContractCalls, getAuthenticatorsByUser, getCredentialIdsContractCall, getDeviceLinkingAccountContractCall, getEmailRecoveryAttempt, getRecoveryEmailHashesContractCall, hasAccessKey, syncAuthenticatorsContractCall, thresholdEd25519Keygen, thresholdEd25519KeygenFromRegistrationTx, verifyAuthenticationResponse, waitForAccessKeyAbsent } from "./rpcCalls-BW3M_q3-.js";
11
11
 
12
12
  export { buildSetRecoveryEmailsActions, getRecoveryEmailHashesContractCall };
@@ -5,7 +5,7 @@ import { base64UrlDecode, base64UrlEncode } from "./base64-dqpWgddX.js";
5
5
  import { createRandomVRFChallenge } from "./vrf-worker-BzQsJ5BW.js";
6
6
  import { ActionPhase, DeviceLinkingPhase, DeviceLinkingStatus } from "./sdkSentEvents-CzAZBFjP.js";
7
7
  import { errorMessage } from "./errors-DevlT39D.js";
8
- import { DEFAULT_EMAIL_RECOVERY_CONTRACTS } from "./defaultConfigs-BmCU1_qI.js";
8
+ import { DEFAULT_EMAIL_RECOVERY_CONTRACTS } from "./defaultConfigs-BQqiXif-.js";
9
9
 
10
10
  //#region src/core/rpcCalls.ts
11
11
  function normalizeByteArray(input) {
@@ -3,18 +3,18 @@ import "./actions-fHadejPs.js";
3
3
  import "./rpc-Dq3ioE9T.js";
4
4
  import "./signer-worker-DK847sXj.js";
5
5
  import "./base64-dqpWgddX.js";
6
- import { getLoginSession } from "./login-DnROv3eA.js";
6
+ import { getLoginSession } from "./login-BKhTuGcy.js";
7
7
  import "./vrf-worker-BzQsJ5BW.js";
8
8
  import { DeviceLinkingPhase, DeviceLinkingStatus } from "./sdkSentEvents-CzAZBFjP.js";
9
9
  import { DEVICE_LINKING_CONFIG, DeviceLinkingError, DeviceLinkingErrorCode } from "./config-BbNXtVtu.js";
10
10
  import "./accountIds-DVDhXwVA.js";
11
11
  import "./intentDigest-yivVENNK.js";
12
12
  import "./errors-DevlT39D.js";
13
- import "./IndexedDBManager-B1cUvdyY.js";
14
- import "./defaultConfigs-BmCU1_qI.js";
13
+ import "./IndexedDBManager-CmdN7smS.js";
14
+ import "./defaultConfigs-BQqiXif-.js";
15
15
  import "./safari-fallbacks-BcMFntiP.js";
16
16
  import "./touchIdPrompt-JPhrOx8o.js";
17
- import { executeDeviceLinkingContractCalls } from "./rpcCalls-B44MZora.js";
17
+ import { executeDeviceLinkingContractCalls } from "./rpcCalls-BW3M_q3-.js";
18
18
  import "./getDeviceNumber-y3mMtky6.js";
19
19
 
20
20
  //#region src/core/TatchiPasskey/scanDevice.ts
@@ -7,10 +7,10 @@ import "./vrf-worker-BzQsJ5BW.js";
7
7
  import "./sdkSentEvents-CzAZBFjP.js";
8
8
  import "./accountIds-DVDhXwVA.js";
9
9
  import "./errors-DevlT39D.js";
10
- import "./IndexedDBManager-B1cUvdyY.js";
11
- import "./defaultConfigs-BmCU1_qI.js";
12
- import "./rpcCalls-B44MZora.js";
10
+ import "./IndexedDBManager-CmdN7smS.js";
11
+ import "./defaultConfigs-BQqiXif-.js";
12
+ import "./rpcCalls-BW3M_q3-.js";
13
13
  import "./getDeviceNumber-y3mMtky6.js";
14
- import { SyncAccountFlow, syncAccount } from "./syncAccount-Dt5jJbEB.js";
14
+ import { SyncAccountFlow, syncAccount } from "./syncAccount-DHKtl-xh.js";
15
15
 
16
16
  export { SyncAccountFlow };
@@ -3,8 +3,8 @@ import { base64UrlDecode } from "./base64-dqpWgddX.js";
3
3
  import { createRandomVRFChallenge } from "./vrf-worker-BzQsJ5BW.js";
4
4
  import { SyncAccountPhase, SyncAccountStatus } from "./sdkSentEvents-CzAZBFjP.js";
5
5
  import { toAccountId } from "./accountIds-DVDhXwVA.js";
6
- import { IndexedDBManager, buildThresholdEd25519Participants2pV1 } from "./IndexedDBManager-B1cUvdyY.js";
7
- import { getCredentialIdsContractCall, hasAccessKey, syncAuthenticatorsContractCall } from "./rpcCalls-B44MZora.js";
6
+ import { IndexedDBManager, buildThresholdEd25519Participants2pV1 } from "./IndexedDBManager-CmdN7smS.js";
7
+ import { getCredentialIdsContractCall, hasAccessKey, syncAuthenticatorsContractCall } from "./rpcCalls-BW3M_q3-.js";
8
8
  import { parseDeviceNumber } from "./getDeviceNumber-y3mMtky6.js";
9
9
 
10
10
  //#region src/core/WebAuthnManager/userHandle.ts
@@ -11,12 +11,12 @@ import "./tags-ByzxP7Cc.js";
11
11
  import "./lit-events-Bb4tAEO2.js";
12
12
  import "./tx-confirmer-wrapper-DWKpXTUW.js";
13
13
  import { toError } from "./errors-DevlT39D.js";
14
- import { PASSKEY_MANAGER_DEFAULT_CONFIGS } from "./defaultConfigs-BmCU1_qI.js";
14
+ import { PASSKEY_MANAGER_DEFAULT_CONFIGS } from "./defaultConfigs-BQqiXif-.js";
15
15
  import "./safari-fallbacks-BcMFntiP.js";
16
16
  import "./touchIdPrompt-JPhrOx8o.js";
17
17
  import { getLastLoggedInDeviceNumber } from "./getDeviceNumber-y3mMtky6.js";
18
18
  import { ERROR_MESSAGES, SecureConfirmationType, getIntentDigest, getNearAccountId, getSignTransactionPayload, getTxCount, isUserCancelledSecureConfirm } from "./collectAuthenticationCredentialForVrfChallenge-DqzPzwvU.js";
19
- import { createConfirmSession, createConfirmTxFlowAdapters } from "./createAdapters-1Hmc1vVC.js";
19
+ import { createConfirmSession, createConfirmTxFlowAdapters } from "./createAdapters-DF32SIZa.js";
20
20
 
21
21
  //#region src/core/WebAuthnManager/VrfWorkerManager/confirmTxFlow/flows/transactions.ts
22
22
  function getSigningAuthMode(request) {
@@ -35,91 +35,91 @@ async function handleTransactionSigningFlow(ctx, request, worker, opts) {
35
35
  transactionSummary
36
36
  });
37
37
  const nearAccountId = getNearAccountId(request);
38
- const signingAuthMode = getSigningAuthMode(request);
39
- const usesNeeded = getTxCount(request);
40
- const vrfIntentDigestB64u = request.type === SecureConfirmationType.SIGN_TRANSACTION ? getIntentDigest(request) : request.type === SecureConfirmationType.SIGN_NEP413_MESSAGE ? await computeUiIntentDigestFromNep413({
41
- nearAccountId,
42
- recipient: request.payload.recipient,
43
- message: request.payload.message
44
- }) : void 0;
45
- const sessionPolicyDigest32 = request.payload.sessionPolicyDigest32;
46
- const nearRpc = await adapters.near.fetchNearContext({
47
- nearAccountId,
48
- txCount: usesNeeded,
49
- reserveNonces: true
50
- });
51
- if (!nearRpc.transactionContext) {
52
- console.error("[SigningFlow] fetchNearContext failed", {
53
- error: nearRpc.error,
54
- details: nearRpc.details
55
- });
56
- return session.confirmAndCloseModal({
57
- requestId: request.requestId,
58
- intentDigest: getIntentDigest(request),
59
- confirmed: false,
60
- error: nearRpc.details ? `${ERROR_MESSAGES.nearRpcFailed}: ${nearRpc.details}` : ERROR_MESSAGES.nearRpcFailed
38
+ try {
39
+ const signingAuthMode = getSigningAuthMode(request);
40
+ const usesNeeded = getTxCount(request);
41
+ const vrfIntentDigestB64u = request.type === SecureConfirmationType.SIGN_TRANSACTION ? getIntentDigest(request) : request.type === SecureConfirmationType.SIGN_NEP413_MESSAGE ? await computeUiIntentDigestFromNep413({
42
+ nearAccountId,
43
+ recipient: request.payload.recipient,
44
+ message: request.payload.message
45
+ }) : void 0;
46
+ const sessionPolicyDigest32 = request.payload.sessionPolicyDigest32;
47
+ const nearRpc = await adapters.near.fetchNearContext({
48
+ nearAccountId,
49
+ txCount: usesNeeded,
50
+ reserveNonces: true
61
51
  });
62
- }
63
- session.setReservedNonces(nearRpc.reservedNonces);
64
- let transactionContext = nearRpc.transactionContext;
65
- const rpId = adapters.vrf.getRpId();
66
- let uiVrfChallenge;
67
- let uiVrfChallengeForUi = rpId ? {
68
- userId: nearAccountId,
69
- rpId,
70
- blockHeight: transactionContext.txBlockHeight,
71
- blockHash: transactionContext.txBlockHash
72
- } : void 0;
73
- if (signingAuthMode === "webauthn") {
74
- uiVrfChallenge = await adapters.vrf.generateVrfChallengeForSession({
75
- userId: nearAccountId,
76
- rpId,
77
- blockHeight: transactionContext.txBlockHeight,
78
- blockHash: transactionContext.txBlockHash,
79
- ...vrfIntentDigestB64u ? { intentDigest: vrfIntentDigestB64u } : {},
80
- ...sessionPolicyDigest32 ? { sessionPolicyDigest32 } : {}
81
- }, request.requestId);
82
- uiVrfChallengeForUi = uiVrfChallenge;
83
- }
84
- const { confirmed, error: uiError } = await session.promptUser({ vrfChallenge: uiVrfChallengeForUi });
85
- if (!confirmed) return session.confirmAndCloseModal({
86
- requestId: request.requestId,
87
- intentDigest: getIntentDigest(request),
88
- confirmed: false,
89
- error: uiError
90
- });
91
- if (signingAuthMode === "warmSession") {
92
- try {
93
- await adapters.vrf.dispenseSessionKey({
94
- sessionId: request.requestId,
95
- uses: usesNeeded
52
+ if (!nearRpc.transactionContext) {
53
+ console.error("[SigningFlow] fetchNearContext failed", {
54
+ error: nearRpc.error,
55
+ details: nearRpc.details
96
56
  });
97
- } catch (err) {
98
- const msg = String(toError(err)?.message || err || "");
99
57
  return session.confirmAndCloseModal({
100
58
  requestId: request.requestId,
101
59
  intentDigest: getIntentDigest(request),
102
60
  confirmed: false,
103
- error: msg || "Failed to dispense warm session key"
61
+ error: nearRpc.details ? `${ERROR_MESSAGES.nearRpcFailed}: ${nearRpc.details}` : ERROR_MESSAGES.nearRpcFailed
104
62
  });
105
63
  }
106
- session.confirmAndCloseModal({
64
+ session.setReservedNonces(nearRpc.reservedNonces);
65
+ let transactionContext = nearRpc.transactionContext;
66
+ const rpId = adapters.vrf.getRpId();
67
+ let uiVrfChallenge;
68
+ let uiVrfChallengeForUi = rpId ? {
69
+ userId: nearAccountId,
70
+ rpId,
71
+ blockHeight: transactionContext.txBlockHeight,
72
+ blockHash: transactionContext.txBlockHash
73
+ } : void 0;
74
+ if (signingAuthMode === "webauthn") {
75
+ uiVrfChallenge = await adapters.vrf.generateVrfChallengeForSession({
76
+ userId: nearAccountId,
77
+ rpId,
78
+ blockHeight: transactionContext.txBlockHeight,
79
+ blockHash: transactionContext.txBlockHash,
80
+ ...vrfIntentDigestB64u ? { intentDigest: vrfIntentDigestB64u } : {},
81
+ ...sessionPolicyDigest32 ? { sessionPolicyDigest32 } : {}
82
+ }, request.requestId);
83
+ uiVrfChallengeForUi = uiVrfChallenge;
84
+ }
85
+ const { confirmed, error: uiError } = await session.promptUser({ vrfChallenge: uiVrfChallengeForUi });
86
+ if (!confirmed) return session.confirmAndCloseModal({
107
87
  requestId: request.requestId,
108
88
  intentDigest: getIntentDigest(request),
109
- confirmed: true,
110
- transactionContext
89
+ confirmed: false,
90
+ error: uiError
111
91
  });
112
- return;
113
- }
114
- try {
115
- const refreshed = await adapters.vrf.maybeRefreshVrfChallenge(request, nearAccountId);
116
- uiVrfChallenge = refreshed.vrfChallenge;
117
- transactionContext = refreshed.transactionContext;
118
- session.updateUI({ vrfChallenge: uiVrfChallenge });
119
- } catch (e) {
120
- console.debug("[SigningFlow] VRF JIT refresh skipped", e);
121
- }
122
- try {
92
+ if (signingAuthMode === "warmSession") {
93
+ try {
94
+ await adapters.vrf.dispenseSessionKey({
95
+ sessionId: request.requestId,
96
+ uses: usesNeeded
97
+ });
98
+ } catch (err) {
99
+ const msg = String(toError(err)?.message || err || "");
100
+ return session.confirmAndCloseModal({
101
+ requestId: request.requestId,
102
+ intentDigest: getIntentDigest(request),
103
+ confirmed: false,
104
+ error: msg || "Failed to dispense warm session key"
105
+ });
106
+ }
107
+ session.confirmAndCloseModal({
108
+ requestId: request.requestId,
109
+ intentDigest: getIntentDigest(request),
110
+ confirmed: true,
111
+ transactionContext
112
+ });
113
+ return;
114
+ }
115
+ try {
116
+ const refreshed = await adapters.vrf.maybeRefreshVrfChallenge(request, nearAccountId);
117
+ uiVrfChallenge = refreshed.vrfChallenge;
118
+ transactionContext = refreshed.transactionContext;
119
+ session.updateUI({ vrfChallenge: uiVrfChallenge });
120
+ } catch (e) {
121
+ console.debug("[SigningFlow] VRF JIT refresh skipped", e);
122
+ }
123
123
  if (!uiVrfChallenge) throw new Error("Missing vrfChallenge for WebAuthn signing flow");
124
124
  const serializedCredential = await adapters.webauthn.collectAuthenticationCredentialWithPRF({
125
125
  nearAccountId,
@@ -167,7 +167,6 @@ async function handleTransactionSigningFlow(ctx, request, worker, opts) {
167
167
  } catch (err) {
168
168
  const cancelled = isUserCancelledSecureConfirm(err);
169
169
  const msg = String(toError(err)?.message || err || "");
170
- if (/Missing PRF result/i.test(msg) || /Missing PRF results/i.test(msg)) return session.cleanupAndRethrow(err);
171
170
  if (cancelled) window.parent?.postMessage({ type: "WALLET_UI_CLOSED" }, "*");
172
171
  const isWrongPasskeyError = /multiple passkeys \(devicenumbers\) for account/i.test(msg);
173
172
  return session.confirmAndCloseModal({