@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.
- package/dist/.build-inputs.sha256 +1 -1
- package/dist/esm/SeamsWeb/SeamsWeb.js +1 -0
- package/dist/esm/SeamsWeb/operations/registration/registration.js +162 -33
- package/dist/esm/SeamsWeb/operations/registration/registrationTiming.js +33 -2
- package/dist/esm/SeamsWeb/signingSurface/BrowserSigningSurface.js +3 -0
- package/dist/esm/SeamsWeb/walletIframe/client/overlay/overlay-controller.js +63 -10
- package/dist/esm/core/rpcClients/relayer/walletRegistration.js +45 -3
- package/dist/esm/core/signingEngine/flows/signNear/shared/ed25519YaoNormalSigning.js +19 -0
- package/dist/esm/core/signingEngine/flows/signNear/signTransactions.js +25 -6
- package/dist/esm/core/signingEngine/nonce/nearNonceLane.js +0 -29
- package/dist/esm/core/signingEngine/session/operationState/trace.js +10 -1
- package/dist/esm/core/signingEngine/session/passkey/prfCache.js +24 -4
- package/dist/esm/core/signingEngine/uiConfirm/PasskeyMpcSessionDurableState.js +5 -3
- package/dist/esm/core/signingEngine/uiConfirm/PasskeyMpcSessionManager.js +40 -3
- package/dist/esm/core/signingEngine/uiConfirm/ui/preact/TransactionReceipt.js +31 -35
- package/dist/esm/core/signingEngine/uiConfirm/ui/preact/mountConfirmationSurface.js +64 -10
- package/dist/esm/core/signingEngine/walletCustody/ceremonyDriver.js +1 -1
- package/dist/esm/react/SeamsWeb/SeamsWeb.js +1 -0
- package/dist/esm/react/SeamsWeb/operations/registration/registration.js +162 -33
- package/dist/esm/react/SeamsWeb/operations/registration/registrationTiming.js +33 -2
- package/dist/esm/react/SeamsWeb/signingSurface/BrowserSigningSurface.js +3 -0
- package/dist/esm/react/SeamsWeb/walletIframe/client/overlay/overlay-controller.js +63 -10
- package/dist/esm/react/core/rpcClients/relayer/walletRegistration.js +45 -3
- package/dist/esm/react/core/signingEngine/flows/signNear/shared/ed25519YaoNormalSigning.js +19 -0
- package/dist/esm/react/core/signingEngine/flows/signNear/signTransactions.js +25 -6
- package/dist/esm/react/core/signingEngine/nonce/nearNonceLane.js +0 -29
- package/dist/esm/react/core/signingEngine/session/operationState/trace.js +10 -1
- package/dist/esm/react/core/signingEngine/session/passkey/prfCache.js +24 -4
- package/dist/esm/react/core/signingEngine/uiConfirm/PasskeyMpcSessionDurableState.js +5 -3
- package/dist/esm/react/core/signingEngine/uiConfirm/PasskeyMpcSessionManager.js +40 -3
- package/dist/esm/react/core/signingEngine/uiConfirm/ui/preact/TransactionReceipt.js +31 -35
- package/dist/esm/react/core/signingEngine/uiConfirm/ui/preact/mountConfirmationSurface.js +64 -10
- package/dist/esm/react/core/signingEngine/walletCustody/ceremonyDriver.js +1 -1
- package/dist/esm/react/shared-ts/src/utils/routerAbEd25519Yao.js +13 -1
- package/dist/esm/sdk/{NonceCoordinator-C7QltTDC.js → NonceCoordinator-C7mqpJiU.js} +0 -29
- package/dist/esm/sdk/{adapters-Dgy69gf0.js → adapters-m94YFj70.js} +96 -46
- package/dist/{public/sdk/defaultConfigs-DJCLCrg9.js → esm/sdk/defaultConfigs-CyNOW4Sy.js} +1 -1
- package/dist/{public/sdk/display-Cw90-qmF.js → esm/sdk/display-DHdC2yXU.js} +1 -1
- package/dist/{public/sdk/ecdsaCapabilityManifest-DA_fklIs.js → esm/sdk/ecdsaCapabilityManifest-C8itxV9S.js} +1 -1
- package/dist/esm/sdk/{ecdsaPresignLifecycle-D_KCktCj.js → ecdsaPresignLifecycle-CnSnzoRJ.js} +13 -1
- package/dist/{public/sdk/ed25519SeedMaterial-0VmS6K9P.js → esm/sdk/ed25519SeedMaterial-Cghz8-XB.js} +2 -2
- package/dist/esm/sdk/{exactSessionState-C2aAv_ED.js → exactSessionState-Bt0HforB.js} +64 -11
- package/dist/esm/sdk/{export-viewer-host-NhjFdpm-.js → export-viewer-host-CbqG8ZQV.js} +1 -1
- package/dist/esm/sdk/{host-DACTruOj.js → host-BPC1zSVg.js} +2 -2
- package/dist/esm/sdk/{localOnly-DTNq69fJ.js → localOnly-CbLYTVbo.js} +2 -2
- package/dist/{public/sdk/nearEd25519YaoMaterialActivation-4AuGG2DG.js → esm/sdk/nearEd25519YaoMaterialActivation-Cz5UJQ_7.js} +46 -4
- package/dist/esm/sdk/{nearEd25519YaoSigningPreparation-jiGcQylO.js → nearEd25519YaoSigningPreparation-DX6xG-IW.js} +1 -1
- package/dist/esm/sdk/{prfCache-Dwwauj4v.js → prfCache-CgAr-VEU.js} +24 -4
- package/dist/{public/sdk/recovery-entrypoint-CFTX6PFZ.js → esm/sdk/recovery-entrypoint-D39R1avB.js} +3 -3
- package/dist/{public/sdk/registration-CuP1WmQu.js → esm/sdk/registration-DtDICj-o.js} +1 -1
- package/dist/esm/sdk/{registration-D8nYJKec.js → registration-PIBMSsQR.js} +247 -40
- package/dist/esm/sdk/{registrationPreparationPreload-DDe0sbZi.js → registrationPreparationPreload-BZfAC_ba.js} +2 -2
- package/dist/{public/sdk/router-DeX_cJ2f.js → esm/sdk/router-CeFS9SgT.js} +3 -3
- package/dist/{public/sdk/routerAbNormalSigning-BGpRKRAj.js → esm/sdk/routerAbNormalSigning-DktZKnf1.js} +1 -1
- package/dist/{public/sdk/runtime-auth-Ch00YcH5.js → esm/sdk/runtime-auth-D_lUQQlc.js} +8 -8
- package/dist/esm/sdk/{runtime-device-link-CEhVZYAw.js → runtime-device-link-CEph1iM0.js} +4 -4
- package/dist/{public/sdk/runtime-ecdsa-tempo-B-qMRrmx.js → esm/sdk/runtime-ecdsa-tempo-tUWnafRo.js} +5 -5
- package/dist/esm/sdk/{runtime-email-otp-giyMPib8.js → runtime-email-otp-1wIPTDim.js} +4 -4
- package/dist/esm/sdk/{runtime-export-CV-6G1Oy.js → runtime-export-Du2d4_Vu.js} +4 -4
- package/dist/{public/sdk/runtime-near-DoDcS88O.js → esm/sdk/runtime-near-CGoWxu7u.js} +4 -4
- package/dist/{public/sdk/runtime-preferences-Canyenle.js → esm/sdk/runtime-preferences-JwJK_xP3.js} +4 -4
- package/dist/esm/sdk/{runtime-recovery-lWyILD1g.js → runtime-recovery-BEqBdpyo.js} +4 -4
- package/dist/esm/sdk/{runtimeContext-BdTaYxJD.js → runtimeContext-CTt9ON27.js} +83 -40
- package/dist/{public/sdk/runtimeLoader-Dxn8UA8B.js → esm/sdk/runtimeLoader-ZXsvx9zX.js} +9 -9
- package/dist/{public/sdk/secp256k1-CQFsI3qQ.js → esm/sdk/secp256k1-CWDid9WH.js} +4 -4
- package/dist/{public/sdk/signEvmFamily-CZLET02E.js → esm/sdk/signEvmFamily-pbMepepQ.js} +10 -10
- package/dist/esm/sdk/{signEvmFamilyWithUiConfirmForTempo-DHTBHHgE.js → signEvmFamilyWithUiConfirmForTempo-CxvfCI_o.js} +2 -2
- package/dist/{public/sdk/signEvmWithUiConfirm-CSxTBQUW.js → esm/sdk/signEvmWithUiConfirm-nk-r3Rff.js} +1 -1
- package/dist/esm/sdk/{signNear-BeUWiWm_.js → signNear-DVD9-IO5.js} +50 -13
- package/dist/{public/sdk/signatureUses-C1o1pDql.js → esm/sdk/signatureUses-BY1IY7uz.js} +1 -1
- package/dist/{public/sdk/signerLoader-C_w8vuhm.js → esm/sdk/signerLoader-D_w-SfR9.js} +3 -3
- package/dist/{public/sdk/trace-DWnDLSuV.js → esm/sdk/trace-08ayoiNp.js} +10 -1
- package/dist/{public/sdk/transactionState-Dd13hMoY.js → esm/sdk/transactionState-Bpm4GamO.js} +2 -2
- package/dist/esm/sdk/tx-confirm-ui.js +134 -93
- package/dist/esm/sdk/wallet-iframe-host-ecdsa.js +1 -1
- package/dist/esm/sdk/wallet-iframe-host-full.js +1 -1
- package/dist/esm/sdk/wallet-iframe-host-near.js +1 -1
- package/dist/esm/sdk/wallet-iframe-host-runtime.js +1 -1
- package/dist/esm/sdk/wallet-ui.css +92 -32
- package/dist/esm/sdk/{walletRecoveryCommit-DNvzgeIX.js → walletRecoveryCommit-G6w6N5RV.js} +3 -3
- package/dist/esm/sdk/{warmSessionHydration-CCKeEIIy.js → warmSessionHydration-DDNYdTCz.js} +1 -1
- package/dist/esm/shared-ts/src/utils/routerAbEd25519Yao.js +13 -1
- package/dist/public/headers.manifest.json +1 -1
- package/dist/public/sdk/{NonceCoordinator-C7QltTDC.js → NonceCoordinator-C7mqpJiU.js} +0 -29
- package/dist/public/sdk/{adapters-Dgy69gf0.js → adapters-m94YFj70.js} +96 -46
- package/dist/{esm/sdk/defaultConfigs-DJCLCrg9.js → public/sdk/defaultConfigs-CyNOW4Sy.js} +1 -1
- package/dist/{esm/sdk/display-Cw90-qmF.js → public/sdk/display-DHdC2yXU.js} +1 -1
- package/dist/{esm/sdk/ecdsaCapabilityManifest-DA_fklIs.js → public/sdk/ecdsaCapabilityManifest-C8itxV9S.js} +1 -1
- package/dist/public/sdk/{ecdsaPresignLifecycle-D_KCktCj.js → ecdsaPresignLifecycle-CnSnzoRJ.js} +13 -1
- package/dist/{esm/sdk/ed25519SeedMaterial-0VmS6K9P.js → public/sdk/ed25519SeedMaterial-Cghz8-XB.js} +2 -2
- package/dist/public/sdk/{exactSessionState-C2aAv_ED.js → exactSessionState-Bt0HforB.js} +64 -11
- package/dist/public/sdk/{export-viewer-host-NhjFdpm-.js → export-viewer-host-CbqG8ZQV.js} +1 -1
- package/dist/public/sdk/{host-DACTruOj.js → host-BPC1zSVg.js} +2 -2
- package/dist/public/sdk/{localOnly-DTNq69fJ.js → localOnly-CbLYTVbo.js} +2 -2
- package/dist/{esm/sdk/nearEd25519YaoMaterialActivation-4AuGG2DG.js → public/sdk/nearEd25519YaoMaterialActivation-Cz5UJQ_7.js} +46 -4
- package/dist/public/sdk/{nearEd25519YaoSigningPreparation-jiGcQylO.js → nearEd25519YaoSigningPreparation-DX6xG-IW.js} +1 -1
- package/dist/public/sdk/{prfCache-Dwwauj4v.js → prfCache-CgAr-VEU.js} +24 -4
- package/dist/{esm/sdk/recovery-entrypoint-CFTX6PFZ.js → public/sdk/recovery-entrypoint-D39R1avB.js} +3 -3
- package/dist/{esm/sdk/registration-CuP1WmQu.js → public/sdk/registration-DtDICj-o.js} +1 -1
- package/dist/public/sdk/{registration-D8nYJKec.js → registration-PIBMSsQR.js} +247 -40
- package/dist/public/sdk/{registrationPreparationPreload-DDe0sbZi.js → registrationPreparationPreload-BZfAC_ba.js} +2 -2
- package/dist/{esm/sdk/router-DeX_cJ2f.js → public/sdk/router-CeFS9SgT.js} +3 -3
- package/dist/{esm/sdk/routerAbNormalSigning-BGpRKRAj.js → public/sdk/routerAbNormalSigning-DktZKnf1.js} +1 -1
- package/dist/{esm/sdk/runtime-auth-Ch00YcH5.js → public/sdk/runtime-auth-D_lUQQlc.js} +8 -8
- package/dist/public/sdk/{runtime-device-link-CEhVZYAw.js → runtime-device-link-CEph1iM0.js} +4 -4
- package/dist/{esm/sdk/runtime-ecdsa-tempo-B-qMRrmx.js → public/sdk/runtime-ecdsa-tempo-tUWnafRo.js} +5 -5
- package/dist/public/sdk/{runtime-email-otp-giyMPib8.js → runtime-email-otp-1wIPTDim.js} +4 -4
- package/dist/public/sdk/{runtime-export-CV-6G1Oy.js → runtime-export-Du2d4_Vu.js} +4 -4
- package/dist/{esm/sdk/runtime-near-DoDcS88O.js → public/sdk/runtime-near-CGoWxu7u.js} +4 -4
- package/dist/{esm/sdk/runtime-preferences-Canyenle.js → public/sdk/runtime-preferences-JwJK_xP3.js} +4 -4
- package/dist/public/sdk/{runtime-recovery-lWyILD1g.js → runtime-recovery-BEqBdpyo.js} +4 -4
- package/dist/public/sdk/{runtimeContext-BdTaYxJD.js → runtimeContext-CTt9ON27.js} +83 -40
- package/dist/{esm/sdk/runtimeLoader-Dxn8UA8B.js → public/sdk/runtimeLoader-ZXsvx9zX.js} +9 -9
- package/dist/{esm/sdk/secp256k1-CQFsI3qQ.js → public/sdk/secp256k1-CWDid9WH.js} +4 -4
- package/dist/{esm/sdk/signEvmFamily-CZLET02E.js → public/sdk/signEvmFamily-pbMepepQ.js} +10 -10
- package/dist/public/sdk/{signEvmFamilyWithUiConfirmForTempo-DHTBHHgE.js → signEvmFamilyWithUiConfirmForTempo-CxvfCI_o.js} +2 -2
- package/dist/{esm/sdk/signEvmWithUiConfirm-CSxTBQUW.js → public/sdk/signEvmWithUiConfirm-nk-r3Rff.js} +1 -1
- package/dist/public/sdk/{signNear-BeUWiWm_.js → signNear-DVD9-IO5.js} +50 -13
- package/dist/{esm/sdk/signatureUses-C1o1pDql.js → public/sdk/signatureUses-BY1IY7uz.js} +1 -1
- package/dist/{esm/sdk/signerLoader-C_w8vuhm.js → public/sdk/signerLoader-D_w-SfR9.js} +3 -3
- package/dist/{esm/sdk/trace-DWnDLSuV.js → public/sdk/trace-08ayoiNp.js} +10 -1
- package/dist/{esm/sdk/transactionState-Dd13hMoY.js → public/sdk/transactionState-Bpm4GamO.js} +2 -2
- package/dist/public/sdk/tx-confirm-ui.js +134 -93
- package/dist/public/sdk/wallet-iframe-host-ecdsa.js +1 -1
- package/dist/public/sdk/wallet-iframe-host-full.js +1 -1
- package/dist/public/sdk/wallet-iframe-host-near.js +1 -1
- package/dist/public/sdk/wallet-iframe-host-runtime.js +1 -1
- package/dist/public/sdk/wallet-ui.css +92 -32
- package/dist/public/sdk/{walletRecoveryCommit-DNvzgeIX.js → walletRecoveryCommit-G6w6N5RV.js} +3 -3
- package/dist/public/sdk/{warmSessionHydration-CCKeEIIy.js → warmSessionHydration-DDNYdTCz.js} +1 -1
- package/dist/public/sdk/workers/passkey-mpc-session.worker.js +92 -8
- package/dist/public/wallet-assets.manifest.json +86 -86
- package/dist/public/wallet-service/index.html +4 -4
- package/dist/types/wallet/src/SeamsWeb/operations/registration/registration.d.ts +15 -1
- package/dist/types/wallet/src/SeamsWeb/operations/registration/registrationTiming.d.ts +11 -1
- package/dist/types/wallet/src/SeamsWeb/signingSurface/BrowserSigningSurface.d.ts +6 -0
- package/dist/types/wallet/src/SeamsWeb/signingSurface/ports.d.ts +8 -2
- package/dist/types/wallet/src/core/rpcClients/relayer/walletRegistration.d.ts +49 -10
- package/dist/types/wallet/src/core/signingEngine/nonce/nearNonceLane.d.ts +2 -1
- package/dist/types/wallet/src/core/signingEngine/session/operationState/trace.d.ts +2 -0
- package/dist/types/wallet/src/core/signingEngine/session/passkey/prfCache.d.ts +7 -9
- package/dist/types/wallet/src/core/signingEngine/session/passkey/warmSessionHydration.d.ts +7 -8
- package/dist/types/wallet/src/core/signingEngine/session/passkey/warmSessionMaterialWriter.d.ts +9 -9
- package/dist/types/wallet/src/core/signingEngine/session/warmCapabilities/public.d.ts +7 -8
- package/dist/types/wallet/src/core/signingEngine/uiConfirm/PasskeyMpcSessionDurableState.d.ts +3 -0
- package/dist/types/wallet/src/core/signingEngine/uiConfirm/uiConfirm.types.d.ts +6 -0
- package/dist/types/wallet/src/core/signingEngine/workerManager/workers/shamir3pass/clientSealPreparation.d.ts +2 -0
- package/dist/types/wallet/src/core/types/secure-confirm-worker.d.ts +15 -1
- package/dist/workers/passkey-mpc-session.worker.js +92 -8
- package/package.json +1 -1
|
@@ -12,7 +12,7 @@ import { parseSdkEcdsaDerivationSigningRootId, parseSdkEcdsaDerivationSigningRoo
|
|
|
12
12
|
import { parseCorrelationId, parseDigestB64u, parseIsoTimestamp } from "../../../shared-ts/src/utils/canonicalPrimitives.js";
|
|
13
13
|
import { parseCanonicalEcdsaServerActivationRequest } from "../../../shared-ts/src/utils/ecdsaCapabilityActivation.js";
|
|
14
14
|
import { findRegistrationSignerPlanEvmFamilyEcdsaBranch, findRegistrationSignerPlanNearEd25519Branch, parseNearEd25519SigningKeyId, registrationSignerPlanFromSelection, walletIdFromString } from "../../../shared-ts/src/utils/registrationIntent.js";
|
|
15
|
-
import { ROUTER_AB_ED25519_YAO_EMAIL_OTP_RECOVERY_BOOTSTRAP_KIND_V1 } from "../../../shared-ts/src/utils/routerAbEd25519Yao.js";
|
|
15
|
+
import { ROUTER_AB_ED25519_YAO_EMAIL_OTP_RECOVERY_BOOTSTRAP_KIND_V1, sameRouterAbEd25519YaoRegistrationAdmissionRequestV1 } from "../../../shared-ts/src/utils/routerAbEd25519Yao.js";
|
|
16
16
|
import { buildEmailOtpWalletAuthAuthority, parseEmailOtpWalletAuthAuthority, walletAuthAuthorityRef } from "../../../shared-ts/src/utils/walletAuthAuthority.js";
|
|
17
17
|
import { parseRouterAbEcdsaVerifiedClientActivationFactsV1 } from "../../../shared-ts/src/utils/routerAbEcdsaDerivation.js";
|
|
18
18
|
import { thresholdEcdsaChainTargetFromChainFamily, toWalletId } from "../../../core/signingEngine/interfaces/ecdsaChainTarget.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:
|
|
616
|
-
|
|
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
|
-
|
|
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
|
|
1032
|
-
|
|
1033
|
-
if (
|
|
1034
|
-
|
|
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
|
|
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
|
-
|
|
1481
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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:
|
|
286
|
-
easing: "
|
|
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
|
|
294
|
-
const
|
|
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
|
-
|
|
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
|
|
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),
|
|
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
|
-
|
|
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
|
|
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,
|