@seams/wallet 0.6.0 → 0.6.2

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 (150) hide show
  1. package/dist/.build-inputs.sha256 +1 -1
  2. package/dist/esm/SeamsWeb/SeamsWeb.js +1 -0
  3. package/dist/esm/SeamsWeb/operations/registration/registration.js +162 -33
  4. package/dist/esm/SeamsWeb/operations/registration/registrationTiming.js +33 -2
  5. package/dist/esm/SeamsWeb/signingSurface/BrowserSigningSurface.js +3 -0
  6. package/dist/esm/SeamsWeb/walletIframe/client/overlay/overlay-controller.js +63 -10
  7. package/dist/esm/core/rpcClients/relayer/walletRegistration.js +45 -3
  8. package/dist/esm/core/signingEngine/flows/signNear/shared/ed25519YaoNormalSigning.js +19 -0
  9. package/dist/esm/core/signingEngine/flows/signNear/signTransactions.js +25 -6
  10. package/dist/esm/core/signingEngine/nonce/nearNonceLane.js +0 -29
  11. package/dist/esm/core/signingEngine/session/operationState/trace.js +10 -1
  12. package/dist/esm/core/signingEngine/session/passkey/prfCache.js +24 -4
  13. package/dist/esm/core/signingEngine/uiConfirm/PasskeyMpcSessionDurableState.js +5 -3
  14. package/dist/esm/core/signingEngine/uiConfirm/PasskeyMpcSessionManager.js +40 -3
  15. package/dist/esm/core/signingEngine/uiConfirm/ui/preact/TransactionReceipt.js +31 -35
  16. package/dist/esm/core/signingEngine/uiConfirm/ui/preact/mountConfirmationSurface.js +64 -10
  17. package/dist/esm/core/signingEngine/walletCustody/ceremonyDriver.js +1 -1
  18. package/dist/esm/react/SeamsWeb/SeamsWeb.js +1 -0
  19. package/dist/esm/react/SeamsWeb/operations/registration/registration.js +162 -33
  20. package/dist/esm/react/SeamsWeb/operations/registration/registrationTiming.js +33 -2
  21. package/dist/esm/react/SeamsWeb/signingSurface/BrowserSigningSurface.js +3 -0
  22. package/dist/esm/react/SeamsWeb/walletIframe/client/overlay/overlay-controller.js +63 -10
  23. package/dist/esm/react/core/rpcClients/relayer/walletRegistration.js +45 -3
  24. package/dist/esm/react/core/signingEngine/flows/signNear/shared/ed25519YaoNormalSigning.js +19 -0
  25. package/dist/esm/react/core/signingEngine/flows/signNear/signTransactions.js +25 -6
  26. package/dist/esm/react/core/signingEngine/nonce/nearNonceLane.js +0 -29
  27. package/dist/esm/react/core/signingEngine/session/operationState/trace.js +10 -1
  28. package/dist/esm/react/core/signingEngine/session/passkey/prfCache.js +24 -4
  29. package/dist/esm/react/core/signingEngine/uiConfirm/PasskeyMpcSessionDurableState.js +5 -3
  30. package/dist/esm/react/core/signingEngine/uiConfirm/PasskeyMpcSessionManager.js +40 -3
  31. package/dist/esm/react/core/signingEngine/uiConfirm/ui/preact/TransactionReceipt.js +31 -35
  32. package/dist/esm/react/core/signingEngine/uiConfirm/ui/preact/mountConfirmationSurface.js +64 -10
  33. package/dist/esm/react/core/signingEngine/walletCustody/ceremonyDriver.js +1 -1
  34. package/dist/esm/react/shared-ts/src/utils/routerAbEd25519Yao.js +13 -1
  35. package/dist/esm/sdk/{NonceCoordinator-C7QltTDC.js → NonceCoordinator-C7mqpJiU.js} +0 -29
  36. package/dist/esm/sdk/{adapters-Dgy69gf0.js → adapters-m94YFj70.js} +96 -46
  37. package/dist/{public/sdk/defaultConfigs-DJCLCrg9.js → esm/sdk/defaultConfigs-CyNOW4Sy.js} +1 -1
  38. package/dist/{public/sdk/display-Cw90-qmF.js → esm/sdk/display-DHdC2yXU.js} +1 -1
  39. package/dist/{public/sdk/ecdsaCapabilityManifest-DA_fklIs.js → esm/sdk/ecdsaCapabilityManifest-C8itxV9S.js} +1 -1
  40. package/dist/esm/sdk/{ecdsaPresignLifecycle-D_KCktCj.js → ecdsaPresignLifecycle-CnSnzoRJ.js} +13 -1
  41. package/dist/{public/sdk/ed25519SeedMaterial-0VmS6K9P.js → esm/sdk/ed25519SeedMaterial-Cghz8-XB.js} +2 -2
  42. package/dist/esm/sdk/{exactSessionState-C2aAv_ED.js → exactSessionState-Bt0HforB.js} +64 -11
  43. package/dist/esm/sdk/{export-viewer-host-NhjFdpm-.js → export-viewer-host-CbqG8ZQV.js} +1 -1
  44. package/dist/esm/sdk/{host-DACTruOj.js → host-BPC1zSVg.js} +2 -2
  45. package/dist/esm/sdk/{localOnly-DTNq69fJ.js → localOnly-CbLYTVbo.js} +2 -2
  46. package/dist/{public/sdk/nearEd25519YaoMaterialActivation-4AuGG2DG.js → esm/sdk/nearEd25519YaoMaterialActivation-Cz5UJQ_7.js} +46 -4
  47. package/dist/esm/sdk/{nearEd25519YaoSigningPreparation-jiGcQylO.js → nearEd25519YaoSigningPreparation-DX6xG-IW.js} +1 -1
  48. package/dist/esm/sdk/{prfCache-Dwwauj4v.js → prfCache-CgAr-VEU.js} +24 -4
  49. package/dist/{public/sdk/recovery-entrypoint-CFTX6PFZ.js → esm/sdk/recovery-entrypoint-D39R1avB.js} +3 -3
  50. package/dist/{public/sdk/registration-CuP1WmQu.js → esm/sdk/registration-DtDICj-o.js} +1 -1
  51. package/dist/esm/sdk/{registration-D8nYJKec.js → registration-PIBMSsQR.js} +247 -40
  52. package/dist/esm/sdk/{registrationPreparationPreload-DDe0sbZi.js → registrationPreparationPreload-BZfAC_ba.js} +2 -2
  53. package/dist/{public/sdk/router-DeX_cJ2f.js → esm/sdk/router-CeFS9SgT.js} +3 -3
  54. package/dist/{public/sdk/routerAbNormalSigning-BGpRKRAj.js → esm/sdk/routerAbNormalSigning-DktZKnf1.js} +1 -1
  55. package/dist/{public/sdk/runtime-auth-Ch00YcH5.js → esm/sdk/runtime-auth-D_lUQQlc.js} +8 -8
  56. package/dist/esm/sdk/{runtime-device-link-CEhVZYAw.js → runtime-device-link-CEph1iM0.js} +4 -4
  57. package/dist/{public/sdk/runtime-ecdsa-tempo-B-qMRrmx.js → esm/sdk/runtime-ecdsa-tempo-tUWnafRo.js} +5 -5
  58. package/dist/esm/sdk/{runtime-email-otp-giyMPib8.js → runtime-email-otp-1wIPTDim.js} +4 -4
  59. package/dist/esm/sdk/{runtime-export-CV-6G1Oy.js → runtime-export-Du2d4_Vu.js} +4 -4
  60. package/dist/{public/sdk/runtime-near-DoDcS88O.js → esm/sdk/runtime-near-CGoWxu7u.js} +4 -4
  61. package/dist/{public/sdk/runtime-preferences-Canyenle.js → esm/sdk/runtime-preferences-JwJK_xP3.js} +4 -4
  62. package/dist/esm/sdk/{runtime-recovery-lWyILD1g.js → runtime-recovery-BEqBdpyo.js} +4 -4
  63. package/dist/esm/sdk/{runtimeContext-BdTaYxJD.js → runtimeContext-CTt9ON27.js} +83 -40
  64. package/dist/{public/sdk/runtimeLoader-Dxn8UA8B.js → esm/sdk/runtimeLoader-ZXsvx9zX.js} +9 -9
  65. package/dist/{public/sdk/secp256k1-CQFsI3qQ.js → esm/sdk/secp256k1-CWDid9WH.js} +4 -4
  66. package/dist/{public/sdk/signEvmFamily-CZLET02E.js → esm/sdk/signEvmFamily-pbMepepQ.js} +10 -10
  67. package/dist/esm/sdk/{signEvmFamilyWithUiConfirmForTempo-DHTBHHgE.js → signEvmFamilyWithUiConfirmForTempo-CxvfCI_o.js} +2 -2
  68. package/dist/{public/sdk/signEvmWithUiConfirm-CSxTBQUW.js → esm/sdk/signEvmWithUiConfirm-nk-r3Rff.js} +1 -1
  69. package/dist/esm/sdk/{signNear-BeUWiWm_.js → signNear-DVD9-IO5.js} +50 -13
  70. package/dist/{public/sdk/signatureUses-C1o1pDql.js → esm/sdk/signatureUses-BY1IY7uz.js} +1 -1
  71. package/dist/{public/sdk/signerLoader-C_w8vuhm.js → esm/sdk/signerLoader-D_w-SfR9.js} +3 -3
  72. package/dist/{public/sdk/trace-DWnDLSuV.js → esm/sdk/trace-08ayoiNp.js} +10 -1
  73. package/dist/{public/sdk/transactionState-Dd13hMoY.js → esm/sdk/transactionState-Bpm4GamO.js} +2 -2
  74. package/dist/esm/sdk/tx-confirm-ui.js +134 -93
  75. package/dist/esm/sdk/wallet-iframe-host-ecdsa.js +1 -1
  76. package/dist/esm/sdk/wallet-iframe-host-full.js +1 -1
  77. package/dist/esm/sdk/wallet-iframe-host-near.js +1 -1
  78. package/dist/esm/sdk/wallet-iframe-host-runtime.js +1 -1
  79. package/dist/esm/sdk/wallet-ui.css +92 -32
  80. package/dist/esm/sdk/{walletRecoveryCommit-DNvzgeIX.js → walletRecoveryCommit-G6w6N5RV.js} +3 -3
  81. package/dist/esm/sdk/{warmSessionHydration-CCKeEIIy.js → warmSessionHydration-DDNYdTCz.js} +1 -1
  82. package/dist/esm/shared-ts/src/utils/routerAbEd25519Yao.js +13 -1
  83. package/dist/public/headers.manifest.json +1 -1
  84. package/dist/public/sdk/{NonceCoordinator-C7QltTDC.js → NonceCoordinator-C7mqpJiU.js} +0 -29
  85. package/dist/public/sdk/{adapters-Dgy69gf0.js → adapters-m94YFj70.js} +96 -46
  86. package/dist/{esm/sdk/defaultConfigs-DJCLCrg9.js → public/sdk/defaultConfigs-CyNOW4Sy.js} +1 -1
  87. package/dist/{esm/sdk/display-Cw90-qmF.js → public/sdk/display-DHdC2yXU.js} +1 -1
  88. package/dist/{esm/sdk/ecdsaCapabilityManifest-DA_fklIs.js → public/sdk/ecdsaCapabilityManifest-C8itxV9S.js} +1 -1
  89. package/dist/public/sdk/{ecdsaPresignLifecycle-D_KCktCj.js → ecdsaPresignLifecycle-CnSnzoRJ.js} +13 -1
  90. package/dist/{esm/sdk/ed25519SeedMaterial-0VmS6K9P.js → public/sdk/ed25519SeedMaterial-Cghz8-XB.js} +2 -2
  91. package/dist/public/sdk/{exactSessionState-C2aAv_ED.js → exactSessionState-Bt0HforB.js} +64 -11
  92. package/dist/public/sdk/{export-viewer-host-NhjFdpm-.js → export-viewer-host-CbqG8ZQV.js} +1 -1
  93. package/dist/public/sdk/{host-DACTruOj.js → host-BPC1zSVg.js} +2 -2
  94. package/dist/public/sdk/{localOnly-DTNq69fJ.js → localOnly-CbLYTVbo.js} +2 -2
  95. package/dist/{esm/sdk/nearEd25519YaoMaterialActivation-4AuGG2DG.js → public/sdk/nearEd25519YaoMaterialActivation-Cz5UJQ_7.js} +46 -4
  96. package/dist/public/sdk/{nearEd25519YaoSigningPreparation-jiGcQylO.js → nearEd25519YaoSigningPreparation-DX6xG-IW.js} +1 -1
  97. package/dist/public/sdk/{prfCache-Dwwauj4v.js → prfCache-CgAr-VEU.js} +24 -4
  98. package/dist/{esm/sdk/recovery-entrypoint-CFTX6PFZ.js → public/sdk/recovery-entrypoint-D39R1avB.js} +3 -3
  99. package/dist/{esm/sdk/registration-CuP1WmQu.js → public/sdk/registration-DtDICj-o.js} +1 -1
  100. package/dist/public/sdk/{registration-D8nYJKec.js → registration-PIBMSsQR.js} +247 -40
  101. package/dist/public/sdk/{registrationPreparationPreload-DDe0sbZi.js → registrationPreparationPreload-BZfAC_ba.js} +2 -2
  102. package/dist/{esm/sdk/router-DeX_cJ2f.js → public/sdk/router-CeFS9SgT.js} +3 -3
  103. package/dist/{esm/sdk/routerAbNormalSigning-BGpRKRAj.js → public/sdk/routerAbNormalSigning-DktZKnf1.js} +1 -1
  104. package/dist/{esm/sdk/runtime-auth-Ch00YcH5.js → public/sdk/runtime-auth-D_lUQQlc.js} +8 -8
  105. package/dist/public/sdk/{runtime-device-link-CEhVZYAw.js → runtime-device-link-CEph1iM0.js} +4 -4
  106. package/dist/{esm/sdk/runtime-ecdsa-tempo-B-qMRrmx.js → public/sdk/runtime-ecdsa-tempo-tUWnafRo.js} +5 -5
  107. package/dist/public/sdk/{runtime-email-otp-giyMPib8.js → runtime-email-otp-1wIPTDim.js} +4 -4
  108. package/dist/public/sdk/{runtime-export-CV-6G1Oy.js → runtime-export-Du2d4_Vu.js} +4 -4
  109. package/dist/{esm/sdk/runtime-near-DoDcS88O.js → public/sdk/runtime-near-CGoWxu7u.js} +4 -4
  110. package/dist/{esm/sdk/runtime-preferences-Canyenle.js → public/sdk/runtime-preferences-JwJK_xP3.js} +4 -4
  111. package/dist/public/sdk/{runtime-recovery-lWyILD1g.js → runtime-recovery-BEqBdpyo.js} +4 -4
  112. package/dist/public/sdk/{runtimeContext-BdTaYxJD.js → runtimeContext-CTt9ON27.js} +83 -40
  113. package/dist/{esm/sdk/runtimeLoader-Dxn8UA8B.js → public/sdk/runtimeLoader-ZXsvx9zX.js} +9 -9
  114. package/dist/{esm/sdk/secp256k1-CQFsI3qQ.js → public/sdk/secp256k1-CWDid9WH.js} +4 -4
  115. package/dist/{esm/sdk/signEvmFamily-CZLET02E.js → public/sdk/signEvmFamily-pbMepepQ.js} +10 -10
  116. package/dist/public/sdk/{signEvmFamilyWithUiConfirmForTempo-DHTBHHgE.js → signEvmFamilyWithUiConfirmForTempo-CxvfCI_o.js} +2 -2
  117. package/dist/{esm/sdk/signEvmWithUiConfirm-CSxTBQUW.js → public/sdk/signEvmWithUiConfirm-nk-r3Rff.js} +1 -1
  118. package/dist/public/sdk/{signNear-BeUWiWm_.js → signNear-DVD9-IO5.js} +50 -13
  119. package/dist/{esm/sdk/signatureUses-C1o1pDql.js → public/sdk/signatureUses-BY1IY7uz.js} +1 -1
  120. package/dist/{esm/sdk/signerLoader-C_w8vuhm.js → public/sdk/signerLoader-D_w-SfR9.js} +3 -3
  121. package/dist/{esm/sdk/trace-DWnDLSuV.js → public/sdk/trace-08ayoiNp.js} +10 -1
  122. package/dist/{esm/sdk/transactionState-Dd13hMoY.js → public/sdk/transactionState-Bpm4GamO.js} +2 -2
  123. package/dist/public/sdk/tx-confirm-ui.js +134 -93
  124. package/dist/public/sdk/wallet-iframe-host-ecdsa.js +1 -1
  125. package/dist/public/sdk/wallet-iframe-host-full.js +1 -1
  126. package/dist/public/sdk/wallet-iframe-host-near.js +1 -1
  127. package/dist/public/sdk/wallet-iframe-host-runtime.js +1 -1
  128. package/dist/public/sdk/wallet-ui.css +92 -32
  129. package/dist/public/sdk/{walletRecoveryCommit-DNvzgeIX.js → walletRecoveryCommit-G6w6N5RV.js} +3 -3
  130. package/dist/public/sdk/{warmSessionHydration-CCKeEIIy.js → warmSessionHydration-DDNYdTCz.js} +1 -1
  131. package/dist/public/sdk/workers/passkey-mpc-session.worker.js +92 -8
  132. package/dist/public/wallet-assets.manifest.json +86 -86
  133. package/dist/public/wallet-service/index.html +4 -4
  134. package/dist/types/wallet/src/SeamsWeb/operations/registration/registration.d.ts +15 -1
  135. package/dist/types/wallet/src/SeamsWeb/operations/registration/registrationTiming.d.ts +11 -1
  136. package/dist/types/wallet/src/SeamsWeb/signingSurface/BrowserSigningSurface.d.ts +6 -0
  137. package/dist/types/wallet/src/SeamsWeb/signingSurface/ports.d.ts +8 -2
  138. package/dist/types/wallet/src/core/rpcClients/relayer/walletRegistration.d.ts +49 -10
  139. package/dist/types/wallet/src/core/signingEngine/nonce/nearNonceLane.d.ts +2 -1
  140. package/dist/types/wallet/src/core/signingEngine/session/operationState/trace.d.ts +2 -0
  141. package/dist/types/wallet/src/core/signingEngine/session/passkey/prfCache.d.ts +7 -9
  142. package/dist/types/wallet/src/core/signingEngine/session/passkey/warmSessionHydration.d.ts +7 -8
  143. package/dist/types/wallet/src/core/signingEngine/session/passkey/warmSessionMaterialWriter.d.ts +9 -9
  144. package/dist/types/wallet/src/core/signingEngine/session/warmCapabilities/public.d.ts +7 -8
  145. package/dist/types/wallet/src/core/signingEngine/uiConfirm/PasskeyMpcSessionDurableState.d.ts +3 -0
  146. package/dist/types/wallet/src/core/signingEngine/uiConfirm/uiConfirm.types.d.ts +6 -0
  147. package/dist/types/wallet/src/core/signingEngine/workerManager/workers/shamir3pass/clientSealPreparation.d.ts +2 -0
  148. package/dist/types/wallet/src/core/types/secure-confirm-worker.d.ts +15 -1
  149. package/dist/workers/passkey-mpc-session.worker.js +92 -8
  150. package/package.json +1 -1
@@ -1 +1 @@
1
- 0336dd8ca4ccfb1d8170242ca859f4bbb4da136e023a6e80ab04d4f3f7a48258
1
+ 0d1577c2c1b97c7654920198df26f4d567031af57e0d5e0fb0262a294a65493a
@@ -763,6 +763,7 @@ var SeamsWeb = class {
763
763
  account: nearAccountBinding
764
764
  } : { kind: "none" };
765
765
  tasks.push(this.signingEngine.warmCriticalResources(accountContext));
766
+ tasks.push(this.signingEngine.prewarmEcdsaRegistrationCrypto());
766
767
  }
767
768
  if (tasks.length === 0) return;
768
769
  let status = "succeeded";
@@ -5,7 +5,7 @@ import { alphabetizeStringify, sha256BytesUtf8, sha256HexUtf8 } from "../../../s
5
5
  import { base58Encode } from "../../../shared-ts/src/utils/base58.js";
6
6
  import { deriveImplicitNearAccountIdFromEd25519PublicKey } from "../../../shared-ts/src/utils/near.js";
7
7
  import { findRegistrationSignerPlanEvmFamilyEcdsaBranch, findRegistrationSignerPlanNearEd25519Branch, parseNearEd25519SigningKeyId, registrationSignerPlanFromSelection, walletIdFromString } from "../../../shared-ts/src/utils/registrationIntent.js";
8
- import { ROUTER_AB_ED25519_YAO_EMAIL_OTP_RECOVERY_BOOTSTRAP_KIND_V1 } from "../../../shared-ts/src/utils/routerAbEd25519Yao.js";
8
+ import { ROUTER_AB_ED25519_YAO_EMAIL_OTP_RECOVERY_BOOTSTRAP_KIND_V1, sameRouterAbEd25519YaoRegistrationAdmissionRequestV1 } from "../../../shared-ts/src/utils/routerAbEd25519Yao.js";
9
9
  import { requireEvmFamilySigningKeySlotId } from "../../../shared-ts/src/signing-lanes/evmFamilySigningKeySlotId.js";
10
10
  import { parseSdkEcdsaDerivationSigningRootId, parseSdkEcdsaDerivationSigningRootVersion } from "../../../shared-ts/src/threshold/ecdsaDerivationRoleLocalBootstrap.js";
11
11
  import { isObject } from "../../../shared-ts/src/utils/validation.js";
@@ -48,7 +48,7 @@ import { establishUnlockedWalletEd25519ExportRootCapabilityV1, walletCustodyCere
48
48
  import { rememberPasskeyCustodySessionEnvelope } from "../../../core/signingEngine/session/passkey/passkeyCustodySessionCache.js";
49
49
  import { listConfiguredThresholdEcdsaPublicationTargets } from "../session/thresholdEcdsaProvisioning.js";
50
50
  import { openWalletCustodyEd25519ActiveClientV1, walletCustodyCacheEnvelopeFromRecordV1 } from "../../../core/signingEngine/walletCustody/openCustodyCache.js";
51
- import { RegistrationTimingRecorder, assertNever, createFailedRegistrationTimingSummary, createSucceededRegistrationTimingSummary, emitNearRegistrationTiming, emitRegistrationTimingSpan, emitRegistrationTimingSummary, recordNearRegistrationSessionTiming, recordStrictEcdsaServerTimingBuckets, registrationTimingSignerSetFromPlan, roundDurationMs, zeroEmailOtpYaoPrewarmDiagnostics } from "./registrationTiming.js";
51
+ import { RegistrationTimingRecorder, assertNever, createFailedRegistrationTimingSummary, createSucceededRegistrationTimingSummary, emitNearRegistrationTiming, emitRegistrationTimingSpan, emitRegistrationTimingSummary, recordNearRegistrationSessionTiming, recordRegistrationServerTimingBuckets, recordStrictEcdsaServerTimingBuckets, registrationTimingSignerSetFromPlan, roundDurationMs, zeroEmailOtpYaoPrewarmDiagnostics } from "./registrationTiming.js";
52
52
  import { joinCustodyWireFromEnvelopeRecord } from "../../../core/signingEngine/walletCustody/joinCustodyWire.js";
53
53
  import { buildStrictRegistrationClientBootstrap, closeStrictEcdsaRegistrationCeremony, finalizeStrictEcdsaFamilyLocalActivation, measureStrictEcdsaCeremonyStep, registrationRouteHeaders, requireIssuedRegistrationEstablishedSession, runStrictEcdsaFamilyCeremony } from "./registrationStrictEcdsa.js";
54
54
  import { admitDeferredNearRegistration, buildRegistrationEmailOtpEd25519SessionState, passkeyWalletAuthAuthorityFromCredential, registrationEd25519MaterialFacts, registrationEstablishedEd25519Session, requireEd25519YaoRegistrationPublicResultMatches, requireEmailOtpEd25519YaoRegistrationPublicResultMatches, requireEmailOtpRegistrationEnrollmentMaterial, requirePasskeyRegistrationIntent } from "./registrationEd25519Yao.js";
@@ -472,6 +472,42 @@ function registrationThreeRouteAuthorityPayload(authority) {
472
472
  default: return assertNever(authority);
473
473
  }
474
474
  }
475
+ async function startNearRegistrationAdmission(args) {
476
+ const startedAt = performance.now();
477
+ try {
478
+ const admissionReceipt = await admitDeferredNearRegistration(args.deferredNear, {
479
+ routerOrigin: new URL(args.relayerUrl).origin,
480
+ authorization: {
481
+ kind: "bearer",
482
+ value: `Bearer ${args.signedSetup}`
483
+ },
484
+ fetch: globalThis.fetch,
485
+ ...args.traceContext ? { traceContext: args.traceContext } : {}
486
+ });
487
+ emitNearRegistrationTiming({
488
+ ceremonyId: args.registrationCeremonyId,
489
+ stage: "early_admission",
490
+ startedAt,
491
+ outcome: "success"
492
+ });
493
+ return {
494
+ deferredNear: args.deferredNear,
495
+ admissionReceipt
496
+ };
497
+ } catch (error) {
498
+ emitNearRegistrationTiming({
499
+ ceremonyId: args.registrationCeremonyId,
500
+ stage: "early_admission",
501
+ startedAt,
502
+ outcome: "failure"
503
+ });
504
+ throw error;
505
+ }
506
+ }
507
+ function requireNearRegistrationAdmission(admission) {
508
+ if (!admission) throw new Error("Mixed registration did not start NEAR admission");
509
+ return admission;
510
+ }
475
511
  function registrationEd25519LaneAuthorization(auth, passkeyCredentialIdB64u, session) {
476
512
  switch (auth.kind) {
477
513
  case "passkey": return { auth: {
@@ -602,6 +638,32 @@ async function setupRegistrationForPasskeyExecution(args) {
602
638
  }) !== state.binding || String(intent.walletId) !== String(args.passkeyExecution.prepared.walletId) || challengeB64u !== args.passkeyExecution.prepared.challengeB64u) throw new Error("Hosted passkey registration preparation binding changed");
603
639
  return setup;
604
640
  }
641
+ function ecdsaRegistrationClientCeremonyForExecution(args) {
642
+ if (args.passkeyExecution.kind === "collect_during_registration") return { kind: "create_after_authority" };
643
+ const state = hostedPasskeyRegistrationState(args.passkeyExecution.prepared);
644
+ if (state.ecdsaClientCeremony.kind !== "started" || state.ecdsaClientCeremony.ceremonyId !== args.ceremonyId) throw new Error("Hosted passkey registration has no matching ECDSA client ceremony");
645
+ return {
646
+ kind: "use_hosted_preparation",
647
+ ceremonyId: state.ecdsaClientCeremony.ceremonyId,
648
+ operation: state.ecdsaClientCeremony.operation
649
+ };
650
+ }
651
+ async function awaitHostedPreparedEcdsaClientCeremony(operation) {
652
+ return await operation;
653
+ }
654
+ function ecdsaRegistrationClientCeremonyOperation(args) {
655
+ switch (args.clientCeremony.kind) {
656
+ case "create_after_authority": return args.context.signingEngine.createRouterAbEcdsaRegistrationCeremony.bind(args.context.signingEngine, {
657
+ kind: "create_router_ab_ecdsa_registration_ceremony_v1",
658
+ ceremonyId: args.ceremonyId,
659
+ registration: args.registration
660
+ });
661
+ case "use_hosted_preparation":
662
+ if (args.clientCeremony.ceremonyId !== args.ceremonyId) throw new Error("Prepared ECDSA client ceremony identity changed");
663
+ return awaitHostedPreparedEcdsaClientCeremony.bind(void 0, args.clientCeremony.operation);
664
+ default: return assertNever(args.clientCeremony);
665
+ }
666
+ }
605
667
  async function runEcdsaEnabledThreeRouteRegistrationCeremony(args) {
606
668
  const [firstChainTarget, ...remainingChainTargets] = args.ecdsaPrepare.chainTargets;
607
669
  if (!firstChainTarget) throw new Error("Strict ECDSA ceremony requires at least one EVM-family target");
@@ -612,10 +674,11 @@ async function runEcdsaEnabledThreeRouteRegistrationCeremony(args) {
612
674
  const created = await measureStrictEcdsaCeremonyStep({
613
675
  registrationTiming: args.registrationTiming,
614
676
  bucket: "ecdsaRegistrationClientCreateMs",
615
- operation: args.context.signingEngine.createRouterAbEcdsaRegistrationCeremony.bind(args.context.signingEngine, {
616
- kind: "create_router_ab_ecdsa_registration_ceremony_v1",
677
+ operation: ecdsaRegistrationClientCeremonyOperation({
678
+ context: args.context,
617
679
  ceremonyId,
618
- registration: args.ecdsaPrepare.strictRegistration
680
+ registration: args.ecdsaPrepare.strictRegistration,
681
+ clientCeremony: args.clientCeremony
619
682
  })
620
683
  });
621
684
  const responded = await measureStrictEcdsaCeremonyStep({
@@ -638,6 +701,14 @@ async function runEcdsaEnabledThreeRouteRegistrationCeremony(args) {
638
701
  });
639
702
  if (responded.kind === "near_ed25519") throw new Error("ECDSA registration ceremony received an Ed25519-only respond result");
640
703
  const deferredNear = responded.kind === "near_ed25519_and_evm_family_ecdsa" ? responded.ed25519 : null;
704
+ const nearAdmission = deferredNear ? startNearRegistrationAdmission({
705
+ relayerUrl: args.relayerUrl,
706
+ registrationCeremonyId: ceremonyId,
707
+ signedSetup: args.signedSetup,
708
+ deferredNear,
709
+ traceContext: args.traceContext
710
+ }) : null;
711
+ nearAdmission?.catch(ignoreNearCustodyFailure);
641
712
  const verified = await measureStrictEcdsaCeremonyStep({
642
713
  registrationTiming: args.registrationTiming,
643
714
  bucket: "ecdsaRegistrationClientProofVerifyMs",
@@ -698,7 +769,7 @@ async function runEcdsaEnabledThreeRouteRegistrationCeremony(args) {
698
769
  deferredNear
699
770
  });
700
771
  deferredNearCustodyWork = args.startDeferredNearCustody({
701
- deferredNear,
772
+ admission: requireNearRegistrationAdmission(nearAdmission),
702
773
  establishedEvmCustodyCommit: bootstrap.preActivationCommitPayload
703
774
  });
704
775
  deferredNearCustodyWork.catch(ignoreNearCustodyFailure);
@@ -996,13 +1067,23 @@ async function startDeferredNearWalletCustody(base, input) {
996
1067
  operation: "near_provisioning"
997
1068
  });
998
1069
  if (!pending || pending.operation !== "near_provisioning" || pending.phase !== "planned") throw new Error("NEAR registration has no planned continuation");
1070
+ let preAdmittedReceipt;
1071
+ try {
1072
+ const admitted = await input.admission;
1073
+ if (!sameRouterAbEd25519YaoRegistrationAdmissionRequestV1(admitted.deferredNear.admissionRequest, pending.admissionRequest)) throw new Error("NEAR admission changed the authorized request");
1074
+ preAdmittedReceipt = admitted.admissionReceipt;
1075
+ } catch (error) {
1076
+ if (error instanceof Error && error.message === "NEAR admission changed the authorized request") throw error;
1077
+ preAdmittedReceipt = void 0;
1078
+ }
999
1079
  const { joined, admissionReceipt } = await continueNearRegistrationCustody({
1000
1080
  pending,
1001
1081
  signingEngine: base.context.signingEngine,
1002
1082
  relayerUrl: base.relayerUrl,
1003
1083
  credential: base.signedSetup,
1004
1084
  traceContext: base.traceContext,
1005
- factorSecret
1085
+ factorSecret,
1086
+ ...preAdmittedReceipt ? { admitted: preAdmittedReceipt } : {}
1006
1087
  });
1007
1088
  outcome = "success";
1008
1089
  return {
@@ -1028,16 +1109,12 @@ async function startDeferredNearWalletCustody(base, input) {
1028
1109
  });
1029
1110
  }
1030
1111
  }
1031
- async function continueNearRegistrationCustody(args) {
1032
- const journal = args.pending;
1033
- if (journal.phase === "joined" && journal.completion.kind !== "encrypted_checkpoint") throw new Error("Joined material has no encrypted execution checkpoint");
1034
- const pending = journal.phase === "joined" && journal.completion.kind === "encrypted_checkpoint" ? journal.completion.prepared : journal;
1035
- if (pending.phase === "joined") throw new Error("Invalid NEAR continuation phase");
1036
- const admission = pending.admissionRequest;
1037
- const admissionStartedAt = performance.now();
1038
- const admissionReceipt = pending.phase === "execution_prepared" ? pending.admissionReceipt : await admitDeferredNearRegistration({
1112
+ async function resolveNearRegistrationAdmissionReceipt(args) {
1113
+ if (args.pending.phase === "execution_prepared") return args.pending.admissionReceipt;
1114
+ if (args.admitted) return args.admitted;
1115
+ return await admitDeferredNearRegistration({
1039
1116
  status: "deferred",
1040
- admissionRequest: pending.admissionRequest
1117
+ admissionRequest: args.pending.admissionRequest
1041
1118
  }, {
1042
1119
  routerOrigin: new URL(args.relayerUrl).origin,
1043
1120
  authorization: {
@@ -1047,6 +1124,21 @@ async function continueNearRegistrationCustody(args) {
1047
1124
  fetch: globalThis.fetch,
1048
1125
  traceContext: args.traceContext
1049
1126
  });
1127
+ }
1128
+ async function continueNearRegistrationCustody(args) {
1129
+ const journal = args.pending;
1130
+ if (journal.phase === "joined" && journal.completion.kind !== "encrypted_checkpoint") throw new Error("Joined material has no encrypted execution checkpoint");
1131
+ const pending = journal.phase === "joined" && journal.completion.kind === "encrypted_checkpoint" ? journal.completion.prepared : journal;
1132
+ if (pending.phase === "joined") throw new Error("Invalid NEAR continuation phase");
1133
+ const admission = pending.admissionRequest;
1134
+ const admissionStartedAt = performance.now();
1135
+ const admissionReceipt = await resolveNearRegistrationAdmissionReceipt({
1136
+ pending,
1137
+ relayerUrl: args.relayerUrl,
1138
+ credential: args.credential,
1139
+ traceContext: args.traceContext,
1140
+ ...args.admitted ? { admitted: args.admitted } : {}
1141
+ });
1050
1142
  recordWalletCustodyTiming(pending.registrationCeremonyId, "admission", admissionStartedAt);
1051
1143
  const joined = await args.signingEngine.joinWalletCustodyNearEd25519KeySet({
1052
1144
  ...pending.phase === "planned" ? {
@@ -1217,6 +1309,7 @@ async function resumeNearRegistrationAfterUnlock(args) {
1217
1309
  walletId: pending.walletId,
1218
1310
  commit: {
1219
1311
  context: args.context,
1312
+ registrationTiming: null,
1220
1313
  registrationStartedAt: startedAt,
1221
1314
  clientPrewarm: Promise.resolve(),
1222
1315
  relayerUrl,
@@ -1466,8 +1559,30 @@ async function commitDeferredEd25519Registration(args) {
1466
1559
  thresholdSessionId: joined.metadata.scope.threshold_session_id,
1467
1560
  prfFirstB64u: auth.prfFirstB64u
1468
1561
  });
1562
+ let preparedSessionSeal;
1563
+ if (preparation.kind === "preparing") {
1564
+ const preparationWaitStartedAt = performance.now();
1565
+ const prepared = await preparation.result;
1566
+ emitNearRegistrationTiming({
1567
+ ceremonyId: args.registrationCeremonyId,
1568
+ stage: "session_seal_preparation_wait",
1569
+ startedAt: preparationWaitStartedAt,
1570
+ outcome: prepared.kind === "completed" ? "success" : "failure"
1571
+ });
1572
+ if (prepared.kind === "failed") throw prepared.error;
1573
+ await requireCurrentNearRegistrationSession(args.sessionAuthority);
1574
+ const clientSeal = await args.context.signingEngine.readPreparedSigningSessionHydration({
1575
+ thresholdSessionId: preparation.thresholdSessionId,
1576
+ preparationId: preparation.preparationId
1577
+ });
1578
+ preparedSessionSeal = {
1579
+ preparationId: preparation.preparationId,
1580
+ thresholdSessionId: preparation.thresholdSessionId,
1581
+ ciphertext: clientSeal.ciphertext
1582
+ };
1583
+ }
1469
1584
  const finalizationStartedAt = performance.now();
1470
- const completed = await completeWalletRegistrationNearProvisioning({
1585
+ const nearProvisioningRequest = {
1471
1586
  relayerUrl: args.relayerUrl,
1472
1587
  registrationCeremonyId: args.registrationCeremonyId,
1473
1588
  signedSetup: args.signedSetup,
@@ -1477,8 +1592,23 @@ async function commitDeferredEd25519Registration(args) {
1477
1592
  },
1478
1593
  idempotencyKey: nearProvisioningIdempotencyKey,
1479
1594
  ed25519: { activationReference },
1480
- auth: args.authMaterial,
1481
- walletCustodyCommit: joined.commitPayload
1595
+ walletCustodyCommit: joined.commitPayload,
1596
+ onServerTiming: recordRegistrationServerTimingBuckets.bind(void 0, args.registrationTiming)
1597
+ };
1598
+ let completed;
1599
+ if (preparedSessionSeal) {
1600
+ if (args.authMaterial.kind !== "passkey") throw new Error("Prepared session sealing requires a passkey authority");
1601
+ completed = await completeWalletRegistrationNearProvisioning({
1602
+ ...nearProvisioningRequest,
1603
+ auth: { kind: "passkey" },
1604
+ sessionSeal: {
1605
+ thresholdSessionId: preparedSessionSeal.thresholdSessionId,
1606
+ ciphertext: preparedSessionSeal.ciphertext
1607
+ }
1608
+ });
1609
+ } else completed = await completeWalletRegistrationNearProvisioning({
1610
+ ...nearProvisioningRequest,
1611
+ auth: args.authMaterial
1482
1612
  });
1483
1613
  if (!completed.ok) throw new Error("Deferred NEAR provisioning did not complete");
1484
1614
  const finalized = completed;
@@ -1487,6 +1617,7 @@ async function commitDeferredEd25519Registration(args) {
1487
1617
  const status = finalized.walletCustody?.status ?? "not_reported";
1488
1618
  throw new Error(`Deferred NEAR custody join did not commit (${status})`);
1489
1619
  }
1620
+ if (preparedSessionSeal && !finalized.sessionSeal) throw new Error("Deferred NEAR finalization did not return the prepared session seal");
1490
1621
  emitNearRegistrationTiming({
1491
1622
  ceremonyId: args.registrationCeremonyId,
1492
1623
  stage: "server_finalize",
@@ -1567,18 +1698,6 @@ async function commitDeferredEd25519Registration(args) {
1567
1698
  });
1568
1699
  await requireCurrentNearRegistrationSession(args.sessionAuthority);
1569
1700
  if (args.authMaterial.kind === "passkey" && registrationSession.remainingUses > 0) {
1570
- if (preparation.kind === "preparing") {
1571
- const preparationWaitStartedAt = performance.now();
1572
- const prepared = await preparation.result;
1573
- emitNearRegistrationTiming({
1574
- ceremonyId: args.registrationCeremonyId,
1575
- stage: "session_seal_preparation_wait",
1576
- startedAt: preparationWaitStartedAt,
1577
- outcome: prepared.kind === "completed" ? "success" : "failure"
1578
- });
1579
- if (prepared.kind === "failed") throw prepared.error;
1580
- await requireCurrentNearRegistrationSession(args.sessionAuthority);
1581
- }
1582
1701
  const registrationEd25519Session = registrationEstablishedEd25519Session(registrationSession);
1583
1702
  hydration = hydrateDeferredNearRegistrationSession({
1584
1703
  signingEngine: args.context.signingEngine,
@@ -1589,6 +1708,10 @@ async function commitDeferredEd25519Registration(args) {
1589
1708
  prfFirstB64u: args.authMaterial.prfFirstB64u,
1590
1709
  expiresAtMs: registrationSession.expiresAtMs,
1591
1710
  remainingUses: registrationSession.remainingUses,
1711
+ ...preparedSessionSeal && finalized.sessionSeal ? { preparedServerSeal: {
1712
+ preparationId: preparedSessionSeal.preparationId,
1713
+ ...finalized.sessionSeal
1714
+ } } : {},
1592
1715
  transport: {
1593
1716
  curve: "ed25519",
1594
1717
  authMethod: "passkey",
@@ -1887,7 +2010,11 @@ async function registerEcdsaOrMixedWallet(args) {
1887
2010
  warmup: prepared.registrationWarmup
1888
2011
  });
1889
2012
  const { relayerUrl, setup } = prepared;
1890
- const ecdsaSetup = requireEcdsaRegistrationSetup(setup, args.kind);
2013
+ const ecdsaPrepare = materializeWalletRegistrationSetupEcdsaPrepare(requireEcdsaRegistrationSetup(setup, args.kind).ecdsa);
2014
+ const ecdsaClientCeremony = ecdsaRegistrationClientCeremonyForExecution({
2015
+ passkeyExecution: args.passkeyExecution,
2016
+ ceremonyId: setup.registrationCeremonyId
2017
+ });
1891
2018
  const intentResponse = {
1892
2019
  intent: setup.intent,
1893
2020
  registrationIntentDigestB64u: setup.registrationIntentDigestB64u
@@ -2022,7 +2149,8 @@ async function registerEcdsaOrMixedWallet(args) {
2022
2149
  registrationCeremonyId: setup.registrationCeremonyId,
2023
2150
  signerPlanKind: args.kind,
2024
2151
  signedSetup: setup.signedSetup,
2025
- ecdsaPrepare: materializeWalletRegistrationSetupEcdsaPrepare(ecdsaSetup.ecdsa),
2152
+ ecdsaPrepare,
2153
+ clientCeremony: ecdsaClientCeremony,
2026
2154
  authority: startAuthority,
2027
2155
  materialAuthority,
2028
2156
  idempotencyKey: finalizeIdempotencyKey,
@@ -2223,6 +2351,7 @@ async function registerEcdsaOrMixedWallet(args) {
2223
2351
  walletId: deferredWalletId,
2224
2352
  commit: {
2225
2353
  context,
2354
+ registrationTiming,
2226
2355
  registrationStartedAt: startedAt,
2227
2356
  clientPrewarm,
2228
2357
  relayerUrl,
@@ -62,7 +62,14 @@ const YAO_SERVER_TIMING_BUCKET_BY_METRIC = new Map(Object.entries({
62
62
  ecdsa_b_total: "ecdsaDeriverBTotalMs",
63
63
  ecdsa_sw_parse: "ecdsaSigningWorkerParseMs",
64
64
  ecdsa_sw_activate: "ecdsaSigningWorkerActivateMs",
65
- ecdsa_sw_total: "ecdsaSigningWorkerTotalMs"
65
+ ecdsa_sw_total: "ecdsaSigningWorkerTotalMs",
66
+ near_finalize_authority: "nearFinalizeAuthorityMs",
67
+ near_finalize_fingerprint: "nearFinalizeFingerprintMs",
68
+ near_finalize_side_effect: "nearFinalizeSideEffectMs",
69
+ near_finalize_cleanup: "nearFinalizeCleanupMs",
70
+ near_finalize_session_projection: "nearFinalizeSessionProjectionMs",
71
+ near_finalize_session_seal: "nearFinalizeSessionSealMs",
72
+ near_finalize_total: "nearFinalizeTotalMs"
66
73
  }));
67
74
  /**
68
75
  * Parses a `Server-Timing` header into bucket durations. Diagnostics only: a
@@ -84,6 +91,9 @@ function recordStrictEcdsaServerTimingBuckets(recorder, leg, header) {
84
91
  });
85
92
  recordServerTimingBuckets(recorder, header);
86
93
  }
94
+ function recordRegistrationServerTimingBuckets(recorder, header) {
95
+ recordServerTimingBuckets(recorder, header);
96
+ }
87
97
  function parseYaoServerTimingBuckets(header) {
88
98
  if (!header) return [];
89
99
  const parsed = [];
@@ -304,6 +314,13 @@ function createZeroRegistrationTimingBucketValues() {
304
314
  ecdsaSigningWorkerParseMs: 0,
305
315
  ecdsaSigningWorkerActivateMs: 0,
306
316
  ecdsaSigningWorkerTotalMs: 0,
317
+ nearFinalizeAuthorityMs: 0,
318
+ nearFinalizeFingerprintMs: 0,
319
+ nearFinalizeSideEffectMs: 0,
320
+ nearFinalizeCleanupMs: 0,
321
+ nearFinalizeSessionProjectionMs: 0,
322
+ nearFinalizeSessionSealMs: 0,
323
+ nearFinalizeTotalMs: 0,
307
324
  walletRegisterStartMs: 0,
308
325
  ecdsaClientBootstrapMs: 0,
309
326
  ecdsaRegistrationTotalMs: 0,
@@ -428,6 +445,13 @@ function copyRegistrationTimingBucketValues(buckets) {
428
445
  ecdsaSigningWorkerParseMs: buckets.ecdsaSigningWorkerParseMs,
429
446
  ecdsaSigningWorkerActivateMs: buckets.ecdsaSigningWorkerActivateMs,
430
447
  ecdsaSigningWorkerTotalMs: buckets.ecdsaSigningWorkerTotalMs,
448
+ nearFinalizeAuthorityMs: buckets.nearFinalizeAuthorityMs,
449
+ nearFinalizeFingerprintMs: buckets.nearFinalizeFingerprintMs,
450
+ nearFinalizeSideEffectMs: buckets.nearFinalizeSideEffectMs,
451
+ nearFinalizeCleanupMs: buckets.nearFinalizeCleanupMs,
452
+ nearFinalizeSessionProjectionMs: buckets.nearFinalizeSessionProjectionMs,
453
+ nearFinalizeSessionSealMs: buckets.nearFinalizeSessionSealMs,
454
+ nearFinalizeTotalMs: buckets.nearFinalizeTotalMs,
431
455
  walletRegisterStartMs: buckets.walletRegisterStartMs,
432
456
  ecdsaClientBootstrapMs: buckets.ecdsaClientBootstrapMs,
433
457
  ecdsaRegistrationTotalMs: buckets.ecdsaRegistrationTotalMs,
@@ -769,6 +793,13 @@ function buildRegistrationTimingBuckets(input) {
769
793
  ecdsaSigningWorkerParseMs: buckets.ecdsaSigningWorkerParseMs,
770
794
  ecdsaSigningWorkerActivateMs: buckets.ecdsaSigningWorkerActivateMs,
771
795
  ecdsaSigningWorkerTotalMs: buckets.ecdsaSigningWorkerTotalMs,
796
+ nearFinalizeAuthorityMs: buckets.nearFinalizeAuthorityMs,
797
+ nearFinalizeFingerprintMs: buckets.nearFinalizeFingerprintMs,
798
+ nearFinalizeSideEffectMs: buckets.nearFinalizeSideEffectMs,
799
+ nearFinalizeCleanupMs: buckets.nearFinalizeCleanupMs,
800
+ nearFinalizeSessionProjectionMs: buckets.nearFinalizeSessionProjectionMs,
801
+ nearFinalizeSessionSealMs: buckets.nearFinalizeSessionSealMs,
802
+ nearFinalizeTotalMs: buckets.nearFinalizeTotalMs,
772
803
  walletRegisterStartMs: buckets.walletRegisterStartMs,
773
804
  ecdsaClientBootstrapMs: buckets.ecdsaClientBootstrapMs,
774
805
  ecdsaRegistrationTotalMs: buckets.ecdsaRegistrationTotalMs,
@@ -991,6 +1022,6 @@ function emitRegistrationTimingSpan(input) {
991
1022
  } catch {}
992
1023
  }
993
1024
  //#endregion
994
- export { REGISTRATION_TIMING_LABEL, RegistrationTimingRecorder, WALLET_IFRAME_TRANSPORT_TIMING_LABEL, assertNever, createFailedRegistrationTimingSummary, createSucceededRegistrationTimingSummary, emitNearRegistrationTiming, emitRegistrationTimingSpan, emitRegistrationTimingSummary, parseYaoServerTimingBuckets, recordNearRegistrationSessionTiming, recordStrictEcdsaServerTimingBuckets, registrationTimingSignerSetFromPlan, roundDurationMs, zeroEmailOtpYaoPrewarmDiagnostics };
1025
+ export { REGISTRATION_TIMING_LABEL, RegistrationTimingRecorder, WALLET_IFRAME_TRANSPORT_TIMING_LABEL, assertNever, createFailedRegistrationTimingSummary, createSucceededRegistrationTimingSummary, emitNearRegistrationTiming, emitRegistrationTimingSpan, emitRegistrationTimingSummary, parseYaoServerTimingBuckets, recordNearRegistrationSessionTiming, recordRegistrationServerTimingBuckets, recordStrictEcdsaServerTimingBuckets, registrationTimingSignerSetFromPlan, roundDurationMs, zeroEmailOtpYaoPrewarmDiagnostics };
995
1026
 
996
1027
  //# sourceMappingURL=registrationTiming.js.map
@@ -3376,6 +3376,9 @@ var BrowserSigningSurface = class {
3376
3376
  prepareSigningSessionHydration(input) {
3377
3377
  return this.passkeyMpcSession.prepareSigningSessionHydration(input);
3378
3378
  }
3379
+ readPreparedSigningSessionHydration(input) {
3380
+ return this.passkeyMpcSession.readPreparedSigningSessionHydration(input);
3381
+ }
3379
3382
  discardSigningSessionHydration(input) {
3380
3383
  return this.passkeyMpcSession.discardSigningSessionHydration(input);
3381
3384
  }
@@ -2,6 +2,7 @@ import { walletIframeSurfaceGeometryEqual } from "../surface/geometry.js";
2
2
  import { OverlayStyleClasses, clearDialogGeometry, clearTransactionReviewAppearance, ensureOverlayDialog, pinDialogIframe, releaseDialogIframe, setDialogAuthMenu, setDialogGeometry, setDialogPresentation, setHidden, setTransactionReviewAppearance, setVisible } from "./overlay-styles.js";
3
3
  //#region src/SeamsWeb/walletIframe/client/overlay/overlay-controller.ts
4
4
  const SURFACE_RESIZE_DURATION_MS = 180;
5
+ const REVIEW_HANDOFF_DURATION_MS = 320;
5
6
  function finiteSurfaceRect(rect) {
6
7
  if (!Number.isFinite(rect.top) || !Number.isFinite(rect.left) || !Number.isFinite(rect.width) || !Number.isFinite(rect.height) || rect.width <= 0 || rect.height <= 0) return null;
7
8
  return {
@@ -208,6 +209,11 @@ var OverlayController = class {
208
209
  }
209
210
  applyVisible(mode) {
210
211
  const { dialog, iframe } = this.ensureDialog();
212
+ const iframeSize = {
213
+ widthCssPx: iframe.clientWidth,
214
+ heightCssPx: iframe.clientHeight
215
+ };
216
+ let requestResizeDestination = null;
211
217
  const identityChanged = !sameIdentity(this.mode, mode);
212
218
  const handoffFromReview = !identityChanged && this.mode.kind === "compact_transaction_review" && mode.kind === "compact_request_modal";
213
219
  const returnToReview = !identityChanged && this.mode.kind === "compact_request_modal" && mode.kind === "compact_transaction_review";
@@ -243,8 +249,8 @@ var OverlayController = class {
243
249
  setDialogGeometry(dialog, mode.geometry, authMenu ? this.authMenuVisualScale : 1);
244
250
  this.lastAppliedGeometry = mode.geometry;
245
251
  this.lastAppliedAuthMenuVisualScale = authMenu ? this.authMenuVisualScale : 1;
246
- const requestResizeDestination = requestResizeOrigin ? finiteSurfaceRect(dialog.getBoundingClientRect()) : null;
247
- if (requestResizeOrigin && requestResizeDestination) this.startSurfaceResize(requestResizeOrigin, requestResizeDestination);
252
+ requestResizeDestination = requestResizeOrigin ? finiteSurfaceRect(dialog.getBoundingClientRect()) : null;
253
+ if (requestResizeOrigin && requestResizeDestination) this.startSurfaceResize(requestResizeOrigin, requestResizeDestination, handoffFromReview || returnToReview ? REVIEW_HANDOFF_DURATION_MS : SURFACE_RESIZE_DURATION_MS);
248
254
  if (requestResizeOrigin) releaseDialogIframe(dialog);
249
255
  }
250
256
  const reviewing = mode.kind === "compact_transaction_review";
@@ -253,6 +259,10 @@ var OverlayController = class {
253
259
  if (handoffFromReview) this.startReviewHandoff("wallet");
254
260
  if (returnToReview) this.startReviewHandoff("review");
255
261
  const handingOff = this.reviewHandoff.kind === "animating";
262
+ if (handingOff && requestResizeDestination) pinDialogIframe(dialog, reviewing ? iframeSize : {
263
+ widthCssPx: requestResizeDestination.width,
264
+ heightCssPx: requestResizeDestination.height
265
+ });
256
266
  iframe.inert = reviewing || handingOff;
257
267
  iframe.classList.toggle("seams-review-wallet-inactive", reviewing);
258
268
  iframe.setAttribute("aria-hidden", String(reviewing || handingOff));
@@ -282,22 +292,63 @@ var OverlayController = class {
282
292
  this.cancelReviewHandoff();
283
293
  if (!this.iframe || window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
284
294
  const options = {
285
- duration: SURFACE_RESIZE_DURATION_MS,
286
- easing: "linear",
295
+ duration: REVIEW_HANDOFF_DURATION_MS,
296
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
287
297
  fill: "both"
288
298
  };
289
299
  const review = this.getTransactionReviewSlot().firstElementChild;
290
300
  if (!review) return;
291
301
  const outgoingElement = destination === "wallet" ? review : this.iframe;
292
302
  const incomingElement = destination === "wallet" ? this.iframe : review;
293
- const outgoing = outgoingElement.animate([{ opacity: 1 }, { opacity: 0 }], options);
294
- const incoming = incomingElement.animate([{ opacity: 0 }, { opacity: 1 }], options);
303
+ const direction = destination === "wallet" ? 1 : -1;
304
+ const outgoing = outgoingElement.animate([
305
+ {
306
+ opacity: 1,
307
+ transform: "translateY(0)"
308
+ },
309
+ {
310
+ opacity: 0,
311
+ transform: `translateY(${-8 * direction}px)`,
312
+ offset: .55
313
+ },
314
+ {
315
+ opacity: 0,
316
+ transform: `translateY(${-8 * direction}px)`
317
+ }
318
+ ], options);
319
+ const incoming = incomingElement.animate([{
320
+ opacity: 0,
321
+ transform: `translateY(${12 * direction}px)`
322
+ }, {
323
+ opacity: 1,
324
+ transform: "translateY(0)"
325
+ }], options);
326
+ const sections = [];
327
+ let order = 0;
328
+ for (const section of review.children) {
329
+ const entering = destination === "review";
330
+ const delay = Math.min(order, 3) * 25;
331
+ sections.push(section.animate([{
332
+ opacity: entering ? 0 : 1,
333
+ transform: entering ? "translateY(8px)" : "translateY(0)"
334
+ }, {
335
+ opacity: entering ? 1 : 0,
336
+ transform: entering ? "translateY(0)" : "translateY(-6px)"
337
+ }], {
338
+ duration: entering ? 220 : 140,
339
+ delay,
340
+ easing: "ease-out",
341
+ fill: "both"
342
+ }));
343
+ order += 1;
344
+ }
295
345
  this.reviewHandoff = {
296
346
  kind: "animating",
297
347
  destination,
298
348
  outgoing,
299
349
  incoming,
300
- timer: setTimeout(this.finishReviewHandoff.bind(this), SURFACE_RESIZE_DURATION_MS),
350
+ sections,
351
+ timer: setTimeout(this.finishReviewHandoff.bind(this), REVIEW_HANDOFF_DURATION_MS),
301
352
  onReady: null
302
353
  };
303
354
  incoming.addEventListener("finish", this.handleReviewHandoffFinished, { once: true });
@@ -327,22 +378,24 @@ var OverlayController = class {
327
378
  clearTimeout(this.reviewHandoff.timer);
328
379
  this.reviewHandoff.outgoing.cancel();
329
380
  this.reviewHandoff.incoming.cancel();
381
+ for (const animation of this.reviewHandoff.sections) animation.cancel();
382
+ if (this.dialog) releaseDialogIframe(this.dialog);
330
383
  this.reviewHandoff = { kind: "idle" };
331
384
  }
332
385
  scheduleMeasuredReveal() {
333
386
  this.cancelPendingReveal();
334
387
  this.pendingRevealFrame = window.requestAnimationFrame(this.revealMeasuredSurface);
335
388
  }
336
- startSurfaceResize(origin, destination) {
389
+ startSurfaceResize(origin, destination, duration) {
337
390
  const dialog = this.dialog;
338
391
  if (!dialog || window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
339
392
  this.cancelSurfaceResize();
340
393
  const animation = dialog.animate(surfaceResizeKeyframes(origin, destination), {
341
- duration: SURFACE_RESIZE_DURATION_MS,
394
+ duration,
342
395
  easing: "cubic-bezier(0.2, 0.7, 0.2, 1)"
343
396
  });
344
397
  this.surfaceResizeAnimation = animation;
345
- this.surfaceResizeTimer = setTimeout(this.cancelSurfaceResize.bind(this), SURFACE_RESIZE_DURATION_MS);
398
+ this.surfaceResizeTimer = setTimeout(this.cancelSurfaceResize.bind(this), duration);
346
399
  animation.addEventListener("finish", this.handleSurfaceResizeFinished, { once: true });
347
400
  }
348
401
  cancelPendingReveal() {
@@ -1938,6 +1938,31 @@ async function activateWalletRegistration(args) {
1938
1938
  onServerTiming: args.onServerTiming
1939
1939
  }));
1940
1940
  }
1941
+ function parseWalletRegistrationSessionSealResponse(value) {
1942
+ const responseName = "Wallet registration session seal";
1943
+ const record = requireWalletRegistrationResponseObject({
1944
+ responseName,
1945
+ field: "body",
1946
+ value
1947
+ });
1948
+ assertWalletRegistrationResponseKeys(record, [
1949
+ "ciphertext",
1950
+ "keyVersion",
1951
+ "expiresAtMs",
1952
+ "remainingUses"
1953
+ ], responseName);
1954
+ const ciphertext = readWalletRegistrationResponseField(record, "ciphertext", responseName);
1955
+ const keyVersion = readWalletRegistrationResponseField(record, "keyVersion", responseName);
1956
+ const expiresAtMs = readWalletRegistrationResponseField(record, "expiresAtMs", responseName);
1957
+ const remainingUses = readWalletRegistrationResponseField(record, "remainingUses", responseName);
1958
+ if (typeof ciphertext !== "string" || !ciphertext.trim() || typeof keyVersion !== "string" || !keyVersion.trim() || typeof expiresAtMs !== "number" || !Number.isSafeInteger(expiresAtMs) || expiresAtMs <= 0 || typeof remainingUses !== "number" || !Number.isSafeInteger(remainingUses) || remainingUses < 0) throw new Error(`${responseName} is invalid`);
1959
+ return {
1960
+ ciphertext,
1961
+ keyVersion,
1962
+ expiresAtMs,
1963
+ remainingUses
1964
+ };
1965
+ }
1941
1966
  function parseWalletRegistrationNearProvisioningResponseV2(value) {
1942
1967
  const responseName = "Wallet registration NEAR provisioning";
1943
1968
  const record = requireWalletRegistrationResponseObject({
@@ -1994,7 +2019,8 @@ function parseWalletRegistrationNearProvisioningResponseV2(value) {
1994
2019
  "ed25519",
1995
2020
  "authorityScope",
1996
2021
  "nearProvisioning",
1997
- "registrationEstablishedSession"
2022
+ "registrationEstablishedSession",
2023
+ "sessionSeal"
1998
2024
  ], responseName);
1999
2025
  const provisioning = requireWalletRegistrationResponseObject({
2000
2026
  responseName,
@@ -2008,10 +2034,25 @@ function parseWalletRegistrationNearProvisioningResponseV2(value) {
2008
2034
  expectedKind: "near_ed25519"
2009
2035
  });
2010
2036
  if (!finalized.ok || finalized.kind !== "near_ed25519") throw new Error(`${responseName} did not return a finalized Ed25519 wallet`);
2011
- return {
2037
+ const sessionSeal = readOptionalWalletRegistrationResponseField(record, "sessionSeal", responseName);
2038
+ const registrationEstablishedSession = parseRegistrationEstablishedSessionResult(readWalletRegistrationResponseField(record, "registrationEstablishedSession", responseName), finalized.walletId);
2039
+ if (isEmailOtpWalletRegistrationFinalizeResponse(finalized)) {
2040
+ if (sessionSeal !== void 0) throw new Error(`${responseName} returned a session seal for an Email OTP authority`);
2041
+ return {
2042
+ ...finalized,
2043
+ nearProvisioning: { status: "near_ready" },
2044
+ registrationEstablishedSession
2045
+ };
2046
+ }
2047
+ const success = {
2012
2048
  ...finalized,
2013
2049
  nearProvisioning: { status: "near_ready" },
2014
- registrationEstablishedSession: parseRegistrationEstablishedSessionResult(readWalletRegistrationResponseField(record, "registrationEstablishedSession", responseName), finalized.walletId)
2050
+ registrationEstablishedSession
2051
+ };
2052
+ if (sessionSeal === void 0) return success;
2053
+ return {
2054
+ ...success,
2055
+ sessionSeal: parseWalletRegistrationSessionSealResponse(sessionSeal)
2015
2056
  };
2016
2057
  }
2017
2058
  async function completeWalletRegistrationNearProvisioning(args) {
@@ -2023,6 +2064,7 @@ async function completeWalletRegistrationNearProvisioning(args) {
2023
2064
  };
2024
2065
  if (args.auth.kind === "email_otp") body.emailOtpEnrollment = args.auth.enrollment;
2025
2066
  if (args.walletCustodyCommit) body.walletCustodyCommit = args.walletCustodyCommit;
2067
+ if (args.sessionSeal) body.sessionSeal = args.sessionSeal;
2026
2068
  return parseWalletRegistrationNearProvisioningResponseV2(await postJson({
2027
2069
  relayerUrl: args.relayerUrl,
2028
2070
  path: WALLET_REGISTRATION_NEAR_PROVISIONING_PATH,