@seams/wallet 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +140 -254
- package/THIRD_PARTY_NOTICES.md +7 -1
- package/dist/.build-inputs.sha256 +1 -1
- package/dist/esm/SeamsWeb/SeamsWeb.js +98 -1825
- package/dist/esm/SeamsWeb/assembly/createWalletIframeRouter.js +4 -15
- package/dist/esm/SeamsWeb/index.js +2 -2
- package/dist/esm/SeamsWeb/operations/devices/scanDevice.js +3 -361
- package/dist/esm/SeamsWeb/operations/near/delegateAction.js +18 -106
- package/dist/esm/SeamsWeb/operations/recovery/walletRecovery.js +3 -3
- package/dist/esm/SeamsWeb/operations/recovery/walletRecoveryCommit.js +8 -209
- package/dist/esm/SeamsWeb/operations/recovery/walletRecoveryDurablePayload.js +5 -5
- package/dist/esm/SeamsWeb/operations/recovery/walletRecoveryJournal.js +2 -64
- package/dist/esm/SeamsWeb/operations/tempo/executeEvmFamilyTransaction.js +1 -1
- package/dist/esm/SeamsWeb/operations/tempo/index.js +1 -13
- package/dist/esm/SeamsWeb/publicApi/auth.js +3 -19
- package/dist/esm/SeamsWeb/publicApi/createPublicApi.js +59 -94
- package/dist/esm/SeamsWeb/publicApi/currentWallet.js +1 -1
- package/dist/esm/SeamsWeb/publicApi/devices.js +33 -64
- package/dist/esm/SeamsWeb/publicApi/evm.js +28 -93
- package/dist/esm/SeamsWeb/publicApi/keyExport.js +26 -52
- package/dist/esm/SeamsWeb/publicApi/near.js +140 -435
- package/dist/esm/SeamsWeb/publicApi/placement.js +206 -0
- package/dist/esm/SeamsWeb/publicApi/session.js +13 -0
- package/dist/esm/SeamsWeb/publicApi/tempo.js +64 -221
- package/dist/esm/SeamsWeb/publicApi/waitForNearAccount.js +72 -0
- package/dist/esm/SeamsWeb/walletIframe/client/deviceCommands.js +50 -0
- package/dist/esm/SeamsWeb/walletIframe/client/emailOtpCommands.js +25 -0
- package/dist/esm/SeamsWeb/walletIframe/client/evmFamilyCommands.js +118 -0
- package/dist/esm/SeamsWeb/walletIframe/client/inboundMessages.js +223 -0
- package/dist/esm/SeamsWeb/walletIframe/client/nearCommands.js +153 -0
- package/dist/esm/SeamsWeb/walletIframe/client/overlay/overlay-styles.js +2 -2
- package/dist/esm/SeamsWeb/walletIframe/client/placementCommands.js +65 -0
- package/dist/esm/SeamsWeb/walletIframe/client/preferenceState.js +93 -0
- package/dist/esm/SeamsWeb/walletIframe/client/preferences.js +117 -0
- package/dist/esm/SeamsWeb/walletIframe/client/registrationCommands.js +92 -0
- package/dist/esm/SeamsWeb/walletIframe/client/router.js +241 -583
- package/dist/esm/SeamsWeb/walletIframe/client/sessionCommands.js +61 -0
- package/dist/esm/SeamsWeb/walletIframe/coordinator.js +175 -134
- package/dist/esm/SeamsWeb/walletIframe/host/ui/auth-menu/AuthMenuSurface.js +13 -1
- package/dist/esm/SeamsWeb/walletIframe/host/ui/auth-menu/mountAuthMenuSurface.js +1 -1
- package/dist/esm/SeamsWeb/walletIframe/shared/configuration.js +37 -0
- package/dist/esm/SeamsWeb/walletIframe/shared/exactSessionState.js +31 -11
- package/dist/esm/SeamsWeb/walletIframe/shared/facadeBoundary.js +96 -0
- package/dist/esm/SeamsWeb/walletIframe/shared/messages.js +6 -32
- package/dist/esm/advanced.js +3 -3
- package/dist/esm/build-paths.js +0 -4
- package/dist/esm/core/accountData/near/accountProjection.js +3 -3
- package/dist/esm/core/accountData/near/keyMaterial.js +2 -2
- package/dist/esm/core/config/chains.js +1 -28
- package/dist/esm/core/config/configBuilder.js +3 -14
- package/dist/esm/core/config/defaultConfigs.js +4 -6
- package/dist/esm/core/config/presignatures.js +6 -0
- package/dist/esm/core/diagnostics/registration.js +8 -0
- package/dist/esm/core/indexedDB/accountKeyMaterial.js +1 -1
- package/dist/esm/core/indexedDB/linkedAuthoritySignerMaterial.js +4 -125
- package/dist/esm/core/indexedDB/normalization.js +7 -1
- package/dist/esm/core/indexedDB/pendingWalletRecoveryCommit.js +1 -1
- package/dist/esm/core/indexedDB/pendingWalletRegistrationCommit.js +3 -41
- package/dist/esm/core/indexedDB/seamsWalletDB/accountSignerRows.js +261 -0
- package/dist/esm/core/indexedDB/seamsWalletDB/ecdsaCapabilityManifestLookups.js +2 -201
- package/dist/esm/core/indexedDB/seamsWalletDB/ecdsaCapabilityManifestRecords.js +5 -736
- package/dist/esm/core/indexedDB/seamsWalletDB/ecdsaCapabilityManifestStore.js +6 -1084
- package/dist/esm/core/indexedDB/seamsWalletDB/ecdsaClientPresignatures.js +20 -138
- package/dist/esm/core/indexedDB/seamsWalletDB/manager.js +100 -4
- package/dist/esm/core/indexedDB/seamsWalletDB/nonceLeaseRows.js +156 -0
- package/dist/esm/core/indexedDB/seamsWalletDB/registrationSetup.js +4 -11
- package/dist/esm/core/indexedDB/seamsWalletDB/repositories.js +91 -547
- package/dist/esm/core/indexedDB/seamsWalletDB/signerOutboxRows.js +90 -0
- package/dist/esm/core/indexedDB/seamsWalletDB/walletCustodyEcdsaContinuity.js +7 -92
- package/dist/esm/core/indexedDB/seamsWalletDB/walletOwnershipGeneration.js +43 -0
- package/dist/esm/core/indexedDB/seamsWalletDB/walletSessionAuthorizationStore.js +103 -157
- package/dist/esm/core/indexedDB/unifiedIndexedDBManager.js +2 -1
- package/dist/esm/core/indexedDB/walletCustodyEd25519MaterialRecord.js +1 -1
- package/dist/esm/core/rpcClients/evm/nonceBackend.js +1 -176
- package/dist/esm/core/rpcClients/near/accountExists.js +34 -0
- package/dist/esm/core/rpcClients/relayer/ecdsaPrepareSession.js +42 -0
- package/dist/esm/core/rpcClients/relayer/relayerHttp.js +31 -1
- package/dist/esm/core/rpcClients/relayer/routerAbNormalSigning.js +47 -11
- package/dist/esm/core/rpcClients/relayer/walletRecoveryFinalize.js +2 -48
- package/dist/esm/core/rpcClients/relayer/walletRecoveryPrepare.js +9 -9
- package/dist/esm/core/rpcClients/relayer/walletRecoveryRotate.js +1 -223
- package/dist/esm/core/rpcClients/relayer/walletRegistration.js +36 -2197
- package/dist/esm/core/rpcClients/relayer/walletSessionAuthorizationStatus.js +145 -14
- package/dist/esm/core/signingEngine/chains/evm/bytes.js +1 -15
- package/dist/esm/core/signingEngine/chains/evm/evmAdapter.js +1 -1
- package/dist/esm/core/signingEngine/chains/near/display.js +1 -27
- package/dist/esm/core/signingEngine/chains/near/nearSignerWasm.js +2 -2
- package/dist/esm/core/signingEngine/flows/registration/accountLifecycle.js +6 -39
- package/dist/esm/core/signingEngine/flows/shared/signingConfirmation.js +2 -2
- package/dist/esm/core/signingEngine/flows/shared/signingStateMachine.js +1 -11
- package/dist/esm/core/signingEngine/flows/signEvmFamily/authPlanning.js +2 -2
- package/dist/esm/core/signingEngine/flows/signEvmFamily/ecdsaSelection.js +3 -3
- package/dist/esm/core/signingEngine/flows/signEvmFamily/emailOtpSigningSession.js +3 -136
- package/dist/esm/core/signingEngine/flows/signEvmFamily/freshWalletSessionRetry.js +1 -1
- package/dist/esm/core/signingEngine/flows/signEvmFamily/operationIds.js +1 -1
- package/dist/esm/core/signingEngine/flows/signEvmFamily/preparedSigning.js +2 -3
- package/dist/esm/core/signingEngine/flows/signEvmFamily/readySecp256k1Material.js +40 -5
- package/dist/esm/core/signingEngine/flows/signEvmFamily/signEvmFamily.js +4 -4
- package/dist/esm/core/signingEngine/flows/signEvmFamily/signers/ecdsaDerivationClientSigningMaterialSource.js +1 -1
- package/dist/esm/core/signingEngine/flows/signEvmFamily/signers/secp256k1.js +27 -53
- package/dist/esm/core/signingEngine/flows/signEvmFamily/signingFlow.js +5 -5
- package/dist/esm/core/signingEngine/flows/signEvmFamily/signingFlowRuntime.js +40 -33
- package/dist/esm/core/signingEngine/flows/signEvmFamily/thresholdAdmission.js +8 -2
- package/dist/esm/core/signingEngine/flows/signNear/implicitAccountFunding.js +1 -1
- package/dist/esm/core/signingEngine/flows/signNear/shared/ed25519YaoNormalSigning.js +94 -31
- package/dist/esm/core/signingEngine/flows/signNear/shared/implicitAccountFundingPort.js +1 -8
- package/dist/esm/core/signingEngine/flows/signNear/shared/operationStepUpPreparation.js +1 -38
- package/dist/esm/core/signingEngine/flows/signNear/shared/signatureOnlySigning.js +53 -8
- package/dist/esm/core/signingEngine/flows/signNear/signDelegate.js +5 -5
- package/dist/esm/core/signingEngine/flows/signNear/signNear.js +30 -44
- package/dist/esm/core/signingEngine/flows/signNear/signNep413.js +21 -12
- package/dist/esm/core/signingEngine/flows/signNear/signTransactions.js +10 -9
- package/dist/esm/core/signingEngine/interfaces/ecdsaChainTarget.js +1 -1
- package/dist/esm/core/signingEngine/nonce/nonceLaneKeys.js +1 -35
- package/dist/esm/core/signingEngine/nonce/nonceTypes.js +2 -26
- package/dist/esm/core/signingEngine/routerAb/ecdsaDerivation/httpRequest.js +4 -3
- package/dist/esm/core/signingEngine/routerAb/ecdsaDerivation/poolFillRoutes.js +5 -1
- package/dist/esm/core/signingEngine/routerAb/ecdsaDerivation/presignaturePool.js +112 -162
- package/dist/esm/core/signingEngine/routerAb/ecdsaDerivation/presignaturePoolPolicy.js +31 -0
- package/dist/esm/core/signingEngine/routerAb/ecdsaDerivation/signingMaterialRef.js +1 -1
- package/dist/esm/core/signingEngine/session/availability/availableSigningLanes.js +3 -913
- package/dist/esm/core/signingEngine/session/emailOtp/challengeDelivery.js +1 -45
- package/dist/esm/core/signingEngine/session/emailOtp/ecdsaSigningSessionAuthority.js +1 -81
- package/dist/esm/core/signingEngine/session/identity/clientSessionPersistenceState.js +1 -43
- package/dist/esm/core/signingEngine/session/identity/emailOtpEcdsaDerivationIdentity.js +1 -9
- package/dist/esm/core/signingEngine/session/identity/evmFamilyEcdsaIdentity.js +3 -125
- package/dist/esm/core/signingEngine/session/identity/exactSigningLaneIdentity.js +3 -19
- package/dist/esm/core/signingEngine/session/identity/laneIdentity.js +2 -106
- package/dist/esm/core/signingEngine/session/keyMaterialBrands.js +1 -1
- package/dist/esm/core/signingEngine/session/lifecycle/walletSessionFailure.js +1 -1
- package/dist/esm/core/signingEngine/session/material/activeEcdsaCapabilityRuntime.js +1 -114
- package/dist/esm/core/signingEngine/session/material/activeWalletAuthorityEcdsaRuntime.js +2 -2
- package/dist/esm/core/signingEngine/session/material/ecdsaCapabilityManifest.js +2 -187
- package/dist/esm/core/signingEngine/session/material/ecdsaRoleLocalMaterialResolver.js +2 -18
- package/dist/esm/core/signingEngine/session/material/ecdsaSigningCapability.js +2 -130
- package/dist/esm/core/signingEngine/session/material/linkedEcdsaHolderRuntime.js +1 -25
- package/dist/esm/core/signingEngine/session/material/nearEd25519YaoMaterialActivation.js +1 -73
- package/dist/esm/core/signingEngine/session/material/walletSigningStateFailure.js +1 -69
- package/dist/esm/core/signingEngine/session/operationState/preparedOperation.js +1 -5
- package/dist/esm/core/signingEngine/session/operationState/transactionState.js +0 -1
- package/dist/esm/core/signingEngine/session/passkey/prfCache.js +1 -5
- package/dist/esm/core/signingEngine/session/persistence/durableSealedSessionCommands.js +1 -9
- package/dist/esm/core/signingEngine/session/persistence/ecdsaRoleLocalRecords.js +3 -202
- package/dist/esm/core/signingEngine/session/persistence/sealedSessionRecords.js +4 -83
- package/dist/esm/core/signingEngine/session/persistence/sealedSessionStore.js +2 -2
- package/dist/esm/core/signingEngine/session/planning/planner.js +2 -13
- package/dist/esm/core/signingEngine/session/sealedRecovery/materialActivationKey.js +1 -8
- package/dist/esm/core/signingEngine/session/warmCapabilities/routerAbWalletSessionCredential.js +2 -1
- package/dist/esm/core/signingEngine/session/warmCapabilities/sealedRefreshParity.js +2 -41
- package/dist/esm/core/signingEngine/stepUpConfirmation/intentDigestPreparation.js +1 -14
- package/dist/esm/core/signingEngine/stepUpConfirmation/types.js +1 -7
- package/dist/esm/core/signingEngine/threshold/commitQueueShared.js +1 -127
- package/dist/esm/core/signingEngine/threshold/crypto/ecdsaDerivationClientWasm.js +3 -297
- package/dist/esm/core/signingEngine/threshold/ecdsa/operationStepUp.js +10 -24
- package/dist/esm/core/signingEngine/threshold/ed25519/walletSession.js +7 -209
- package/dist/esm/core/signingEngine/threshold/ed25519/yaoPublicCapabilityReferences.js +5 -208
- package/dist/esm/core/signingEngine/threshold/sessionPolicy.js +3 -9
- package/dist/esm/core/signingEngine/uiConfirm/nearFundingNotice.js +1 -17
- package/dist/esm/core/signingEngine/uiConfirm/ui/confirm-surface-resize.js +2 -173
- package/dist/esm/core/signingEngine/uiConfirm/ui/preact/ConfirmationContent.js +3 -3
- package/dist/esm/core/signingEngine/uiConfirm/ui/preact/ReviewDisclosure.js +2 -2
- package/dist/esm/core/signingEngine/uiConfirm/ui/preact/TransactionReceipt.js +1 -1
- package/dist/esm/core/signingEngine/uiConfirm/ui/preact/TransactionReview.js +5 -4
- package/dist/esm/core/signingEngine/uiConfirm/ui/preact/mountConfirmationSurface.js +2 -2
- package/dist/esm/core/signingEngine/uiConfirm/ui/surface-resize-events.js +1 -6
- package/dist/esm/core/signingEngine/uiConfirm/ui/transaction-display/formatters.js +1 -10
- package/dist/esm/core/signingEngine/webauthnAuth/credentials/credentialExtensions.js +1 -19
- package/dist/esm/core/signingEngine/webauthnAuth/credentials/helpers.js +2 -170
- package/dist/esm/core/signingEngine/workerManager/ecdsaPresignPoolIdentity.js +27 -5
- package/dist/esm/core/signingEngine/workerManager/validation.js +1 -104
- package/dist/esm/core/signingEngine/workerManager/workerTypes.js +1 -33
- package/dist/esm/core/types/rpc.js +1 -4
- package/dist/esm/core/types/sdkSentEvents.js +1 -24
- package/dist/esm/core/walletRuntimePaths/base.js +1 -28
- package/dist/esm/externalEvm/controller.js +7 -7
- package/dist/esm/index.js +8 -7
- package/dist/esm/react/components/AccountMenuButton/AuthenticationMethodsModal.js +9 -9
- package/dist/esm/react/components/AccountMenuButton/LinkedDevicesModal.css +1 -2
- package/dist/esm/react/components/AccountMenuButton/LinkedDevicesModal.js +9 -185
- package/dist/esm/react/components/AccountMenuButton/WalletRegionSection.js +303 -0
- package/dist/esm/react/components/AccountMenuButton/WalletSettingsLayout.js +31 -5
- package/dist/esm/react/components/AccountMenuButton/index.js +21 -13
- package/dist/esm/react/components/AccountMenuButton/types.js +2 -1
- package/dist/esm/react/components/HostedSeamsAuthMenu/shell.js +5 -17
- package/dist/esm/react/components/QRCodeScanner.js +5 -5
- package/dist/esm/react/components/ShowQRCode.js +13 -13
- package/dist/esm/react/context/SeamsWebProvider.js +1 -2
- package/dist/esm/react/context/index.js +8 -10
- package/dist/esm/react/context/seamsManagerSingleton.js +1 -1
- package/dist/esm/react/context/useLoginStateRefresher.js +10 -13
- package/dist/esm/react/context/useNearProvisioningStateRefresh.js +3 -3
- package/dist/esm/react/context/useSeamsContextValue.js +33 -81
- package/dist/esm/react/context/useSeamsWithSdkFlow.js +22 -51
- package/dist/esm/react/context/useWalletIframeLifecycle.js +20 -110
- package/dist/esm/react/hooks/useAccountInput.js +10 -13
- package/dist/esm/react/hooks/useDeviceLinking.js +1 -1
- package/dist/esm/react/hooks/useNearClient.js +1 -1
- package/dist/esm/react/hooks/useQRCamera.js +2 -8
- package/dist/esm/react/hooks/useWallet.js +5 -6
- package/dist/esm/react/hooks/useWalletAuth.js +3 -4
- package/dist/esm/react/hooks/useWalletDevices.js +2 -2
- package/dist/esm/react/index.js +4 -4
- package/dist/esm/react/transactionReview/TransactionReviewHost.js +1 -1
- package/dist/esm/react/transactionReview/boundCalls.js +5 -39
- package/dist/esm/react/transactionReview/controller.js +3 -4
- package/dist/esm/react/transactionReview/snapshot.js +1 -1
- package/dist/esm/react/utils/walletIframe.js +11 -52
- package/dist/esm/sdk/ConfirmationDrawer-DY0_yeUV.js +1 -0
- package/dist/esm/sdk/NonceCoordinator-CFFq8-Q9.js +1 -0
- package/dist/esm/sdk/accountLifecycle-CAMVowDl.js +1 -0
- package/dist/esm/sdk/activeWalletSession-DiZcKjB_.js +1 -0
- package/dist/esm/sdk/adapters-DdDOQzl4.js +2 -0
- package/dist/esm/sdk/appearance-ZGVLwA4N.js +1 -0
- package/dist/esm/sdk/authenticatorOptions-DMLnDWT2.js +1 -0
- package/dist/esm/sdk/authorizationAdmission-Ckx6q6tp.js +1 -0
- package/dist/esm/sdk/bytes-BBYkulRB.js +1 -0
- package/dist/esm/sdk/canonicalPrimitives-CKPGgpxg.js +1 -0
- package/dist/esm/sdk/canonicalSignerErrorCode-DEHsPxNm.js +1 -0
- package/dist/esm/sdk/capabilityKinds-CKQ4Uqnv.js +1 -0
- package/dist/esm/sdk/chains-CiYQT1K4.js +1 -0
- package/dist/esm/sdk/challengeDelivery-DxXAkOfS.js +1 -0
- package/dist/esm/sdk/clientSessionPersistenceState-CImFWDj6.js +1 -0
- package/dist/esm/sdk/commitQueue-iBNUt9Bz.js +1 -0
- package/dist/esm/sdk/configBuilder-ZiZwFKt4.js +1 -0
- package/dist/esm/sdk/configHelpers-D8Ivi6p8.js +1 -0
- package/dist/esm/sdk/digestEncoding-Dzc1rzWV.js +1 -0
- package/dist/esm/sdk/display-ClqZq-Xt.js +1 -0
- package/dist/esm/sdk/ecdsaCapabilityManifest-BlzJAQF8.js +1 -0
- package/dist/esm/sdk/ecdsaChainTarget-C8ZtMZ8l.js +1 -0
- package/dist/esm/sdk/ecdsaDerivationClientWasm-CVeNEou2.js +1 -0
- package/dist/esm/sdk/ecdsaDerivationExport-BZFHSMCv.js +1 -0
- package/dist/esm/sdk/ecdsaWalletRecords-D4WeYc7H.js +1 -0
- package/dist/esm/sdk/emailOtpEcdsaDerivationIdentity-B8HzTh4T.js +1 -0
- package/dist/esm/sdk/enrichDisplayModelWithAbi-69bNckvi.js +1 -0
- package/dist/esm/sdk/evmCryptoWasm-BXsIyRon.js +1 -0
- package/dist/esm/sdk/export-viewer-host-CsFeiIhd.js +1 -0
- package/dist/esm/sdk/exportKeypairOperation-DGQIYML3.js +1 -0
- package/dist/esm/sdk/helpers-Ddy72ULN.js +1 -0
- package/dist/esm/sdk/host-B1CdRGoI.js +1 -0
- package/dist/esm/sdk/intentDigest-CE-tLw87.js +1 -0
- package/dist/esm/sdk/jsxRuntime.module-BcZNe_OA.js +2 -0
- package/dist/esm/sdk/lanes-DnBwWv4l.js +1 -0
- package/dist/esm/sdk/localOnly-ClCo6602.js +1 -0
- package/dist/esm/sdk/messages-vxz27Way.js +1 -0
- package/dist/esm/sdk/mountExportPrivateKeySurface-CBZ0wRYj.js +1 -0
- package/dist/esm/sdk/mountRecoveryCodeBackupSurface-B1qhFF6G.js +2 -0
- package/dist/esm/sdk/nearEd25519YaoMaterialActivation-fWQI3rYj.js +1 -0
- package/dist/esm/sdk/nearEd25519YaoSigningPreparation-B0d1AG3u.js +1 -0
- package/dist/esm/sdk/nonceLaneKeys-Fkvk2UPy.js +1 -0
- package/dist/esm/sdk/normalization-CpLZcL2f.js +1 -0
- package/dist/esm/sdk/normalization-DCvuCvh0.js +1 -0
- package/dist/esm/sdk/normalize-kUDm5zfS.js +1 -0
- package/dist/esm/sdk/operationFingerprint-CTR9G1NT.js +1 -0
- package/dist/esm/sdk/passkey-custody-BQj44jEM.js +1 -0
- package/dist/esm/sdk/pendingWalletRecoveryCodeBackup-yJN8VAHn.js +1 -0
- package/dist/esm/sdk/presignaturePool-DwlTReFO.js +1 -0
- package/dist/esm/sdk/presignatures-DB2IPD-A.js +1 -0
- package/dist/esm/sdk/prfCache-BMpqZZ-v.js +1 -0
- package/dist/esm/sdk/primitives-CAcl7ON7.js +1 -0
- package/dist/esm/sdk/promptText-D2f5Rg0h.js +1 -0
- package/dist/esm/sdk/recovery-entrypoint-Bl5GgbW9.js +1 -0
- package/dist/esm/sdk/registration-C4sALQZO.js +1 -0
- package/dist/esm/sdk/registration-CEqVAgNJ.js +1 -0
- package/dist/esm/sdk/registrationAccounts-D4RVetMz.js +1 -0
- package/dist/esm/sdk/registrationAuthMethodInput-6ccY2Vuh.js +1 -0
- package/dist/esm/sdk/registrationIds-CdPqm-Ya.js +1 -0
- package/dist/esm/sdk/registrationIntent-DOkZcKSP.js +1 -0
- package/dist/esm/sdk/registrationSignerPlan-B9GCvpTV.js +1 -0
- package/dist/esm/sdk/requireStepUpAuth-DCVqmeee.js +1 -0
- package/dist/esm/sdk/routerAbNormalSigning-BG75eyI2.js +1 -0
- package/dist/esm/sdk/router_ab_ed25519_yao_client_bg.wasm +0 -0
- package/dist/esm/sdk/runtime-auth-tgfe70hU.js +1 -0
- package/dist/esm/sdk/runtime-device-link-BUxuQupR.js +1 -0
- package/dist/esm/sdk/runtime-ecdsa-tempo-DOBk_EtI.js +1 -0
- package/dist/esm/sdk/runtime-email-otp-CsAJKvYC.js +1 -0
- package/dist/esm/sdk/runtime-export-7REbcnBl.js +1 -0
- package/dist/esm/sdk/runtime-near-BA0DQf6H.js +1 -0
- package/dist/esm/sdk/runtime-preferences-cRViPE8a.js +1 -0
- package/dist/esm/sdk/runtime-recovery-RRc8Yz1y.js +1 -0
- package/dist/esm/sdk/runtime-recovery-codes-BZMiAR_5.js +1 -0
- package/dist/esm/sdk/sdkSentEvents-D3q1h-Uo.js +1 -0
- package/dist/esm/sdk/secp256k1-DSLttQND.js +1 -0
- package/dist/esm/sdk/secureRandomId-BIekT8bE.js +1 -0
- package/dist/esm/sdk/sessionPolicy-J-RrlPZQ.js +1 -0
- package/dist/esm/sdk/shared-DdfxBUGY.js +6 -0
- package/dist/esm/sdk/signEvmFamily-KUNWKVeh.js +1 -0
- package/dist/esm/sdk/signEvmFamilyWithUiConfirmForTempo-Dc57bJ3V.js +1 -0
- package/dist/esm/sdk/signEvmWithUiConfirm-CqxL7UbT.js +1 -0
- package/dist/esm/sdk/signNear-CO5bx24Z.js +1 -0
- package/dist/esm/sdk/signatureUses-CjJ233KX.js +1 -0
- package/dist/esm/sdk/signerDomain-vQmlnsbF.js +1 -0
- package/dist/esm/sdk/signingFlow-vrXxrhlG.js +2 -0
- package/dist/esm/sdk/signingQueue-BrGJXBqe.js +1 -0
- package/dist/esm/sdk/signingSessionSeal-CDLUmAFY.js +1 -0
- package/dist/esm/sdk/singletons-8UH3gOnZ.js +1 -0
- package/dist/esm/sdk/theme-_AUTWLS_.js +1 -0
- package/dist/esm/sdk/thresholdEcdsa-CO7xo1So.js +1 -0
- package/dist/esm/sdk/trace-BvbCxdXF.js +1 -0
- package/dist/esm/sdk/transaction-activity-D40ih2j-.js +1 -0
- package/dist/esm/sdk/transactionReviewAdmission-C-a3ctCJ.js +1 -0
- package/dist/esm/sdk/transactionState-DVinJk4K.js +1 -0
- package/dist/esm/sdk/tx-confirm-ui.js +7 -11
- package/dist/esm/sdk/types-BNUuaUtl.js +1 -0
- package/dist/esm/sdk/types-D3GM-uHR.js +1 -0
- 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-recovery-C1kesLCF.js +1 -0
- package/dist/esm/sdk/wallet-ui.css +1 -1
- package/dist/esm/sdk/walletAuthMethodRecord-CXedSgpV.js +1 -0
- package/dist/esm/sdk/walletAuthority-B5hXHWpK.js +1 -0
- package/dist/esm/sdk/walletCustodyEcdsaContinuity-abNZ_dvX.js +1 -0
- package/dist/esm/sdk/walletIframeIdentity-DJ0KOBHg.js +1 -0
- package/dist/esm/sdk/walletOwnershipGeneration-DoXVMDWe.js +1 -0
- package/dist/esm/sdk/walletRecoveryCommit-Cc9AqHr0.js +1 -0
- package/dist/esm/sdk/walletRecoveryRotate-DWTAFYiv.js +1 -0
- package/dist/esm/sdk/walletSessionAuthorizationProjection-DWBksIJR.js +1 -0
- package/dist/esm/sdk/walletSessionAuthorizationStatus-o1VgsLhA.js +1 -0
- package/dist/esm/sdk/walletSessionAuthorizationStore-gEYPmu-G.js +1 -0
- package/dist/esm/sdk/walletSessionFailure-Bu4VPKTz.js +1 -0
- package/dist/esm/sdk/warmSessionHydration-DgjuUacN.js +1 -0
- package/dist/esm/sdk/webauthnP256-BEz4DEAs.js +1 -0
- package/dist/esm/sdk/webauthnPromptCoordinator-BEudHQBr.js +1 -0
- package/dist/esm/shared-ts/src/authorization/capabilityKinds.js +1 -7
- package/dist/esm/shared-ts/src/authorization/delegatedAuthority.js +2 -20
- package/dist/esm/shared-ts/src/authorization/index.js +1 -2
- package/dist/esm/shared-ts/src/authorization/operationFingerprint.js +1 -20
- package/dist/esm/shared-ts/src/authorization/walletAuthority.js +4 -51
- package/dist/esm/shared-ts/src/authorization/walletSessionIssuance.js +1 -112
- package/dist/esm/shared-ts/src/device-linking/activeWalletSession.js +13 -3
- package/dist/esm/shared-ts/src/device-linking/authorityActivation.js +6 -116
- package/dist/esm/shared-ts/src/device-linking/committedSignerPackages.js +3 -270
- package/dist/esm/shared-ts/src/device-linking/delegatedActivationPlan.js +2 -2
- package/dist/esm/shared-ts/src/device-linking/deviceManagement.js +1 -12
- package/dist/esm/shared-ts/src/device-linking/digests.js +1 -109
- package/dist/esm/shared-ts/src/device-linking/index.js +0 -2
- package/dist/esm/shared-ts/src/device-linking/parsers.js +7 -921
- package/dist/esm/shared-ts/src/device-linking/requestProof.js +1 -19
- package/dist/esm/shared-ts/src/device-linking/sourceContribution.js +5 -358
- package/dist/esm/shared-ts/src/device-linking/walletSessionCredentialDelivery.js +1 -172
- package/dist/esm/shared-ts/src/device-linking/wireFields.js +4 -5
- package/dist/esm/shared-ts/src/near/actions.js +1 -13
- package/dist/esm/shared-ts/src/near/nearClient.js +1 -1
- package/dist/esm/shared-ts/src/passkey-custody/custodyEnvelope.js +3 -59
- package/dist/esm/shared-ts/src/passkey-custody/custodySecretBinding.js +4 -8
- package/dist/esm/shared-ts/src/passkey-custody/index.js +0 -1
- package/dist/esm/shared-ts/src/signing-lanes/index.js +0 -1
- package/dist/esm/shared-ts/src/signing-lanes/ownerContinuity.js +0 -59
- package/dist/esm/shared-ts/src/threshold/ed25519OperationFingerprint.js +1 -1
- package/dist/esm/shared-ts/src/threshold/keyMaterialBrands.js +1 -4
- package/dist/esm/shared-ts/src/threshold/participants.js +1 -2
- package/dist/esm/shared-ts/src/threshold/signingRootScope.js +1 -4
- package/dist/esm/shared-ts/src/utils/authenticatorOptions.js +1 -12
- package/dist/esm/shared-ts/src/utils/canonicalPrimitives.js +2 -5
- package/dist/esm/shared-ts/src/utils/domainIds.js +1 -7
- package/dist/esm/shared-ts/src/utils/ecdsaCapabilityActivation.js +1 -16
- package/dist/esm/shared-ts/src/utils/ecdsaServerTiming.js +6 -1
- package/dist/esm/shared-ts/src/utils/emailOtpDomain.js +1 -23
- package/dist/esm/shared-ts/src/utils/emailOtpRecoveryKey.js +1 -42
- package/dist/esm/shared-ts/src/utils/errors.js +1 -43
- package/dist/esm/shared-ts/src/utils/index.js +18 -22
- package/dist/esm/shared-ts/src/utils/near.js +2 -74
- package/dist/esm/shared-ts/src/utils/normalize.js +1 -22
- package/dist/esm/shared-ts/src/utils/registrationAuthMethodInput.js +1 -74
- package/dist/esm/shared-ts/src/utils/registrationEstablishedSession.js +6 -275
- package/dist/esm/shared-ts/src/utils/registrationIds.js +1 -203
- package/dist/esm/shared-ts/src/utils/registrationIntent.js +1 -389
- package/dist/esm/shared-ts/src/utils/registrationSignerPlan.js +2 -434
- package/dist/esm/shared-ts/src/utils/routerAbEcdsaDerivation.js +6 -414
- package/dist/esm/shared-ts/src/utils/routerAbEd25519Yao.js +1 -334
- package/dist/esm/shared-ts/src/utils/routerAbEd25519YaoDigests.js +2 -40
- package/dist/esm/shared-ts/src/utils/routerAbNormalSigningIdentity.js +1 -1
- package/dist/esm/shared-ts/src/utils/signingSessionSeal.js +1 -6
- package/dist/esm/shared-ts/src/utils/thresholdEcdsaKeyHandle.js +1 -6
- package/dist/esm/shared-ts/src/utils/validation.js +2 -17
- package/dist/esm/shared-ts/src/utils/walletAuthAuthority.js +1 -28
- package/dist/esm/shared-ts/src/utils/walletAuthMethodRecord.js +1 -11
- package/dist/esm/shared-ts/src/utils/walletCapabilityBindings.js +1 -7
- package/dist/esm/shared-ts/src/wallet-recovery/index.js +3 -5
- package/dist/esm/shared-ts/src/wallet-recovery/recoveryCodeIssuance.js +1 -35
- package/dist/esm/shared-ts/src/wallet-recovery/recoveryCodeLocator.js +0 -32
- package/dist/esm/shared-ts/src/wallet-recovery/recoveryCodeReservation.js +1 -15
- package/dist/esm/shared-ts/src/wallet-recovery/recoveryKeyId.js +0 -11
- package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryCommittedProjection.js +1 -1
- package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryEcdsaPossession.js +2 -42
- package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryEnvelopeSet.js +3 -53
- package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryRotation.js +2 -63
- package/dist/esm/threshold.js +1 -1
- package/dist/esm/utils/intentDigest.js +1 -62
- package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker_bg.wasm +0 -0
- package/dist/esm/wasm/router_ab_ecdsa_client/pkg/router_ab_ecdsa_client_bg.wasm +0 -0
- package/dist/esm/wasm/router_ab_ed25519_yao_client/pkg/router_ab_ed25519_yao_client_bg.wasm +0 -0
- package/dist/public/headers.manifest.json +1 -1
- package/dist/public/sdk/ConfirmationDrawer-DY0_yeUV.js +1 -0
- package/dist/public/sdk/NonceCoordinator-CFFq8-Q9.js +1 -0
- package/dist/public/sdk/accountLifecycle-CAMVowDl.js +1 -0
- package/dist/public/sdk/activeWalletSession-DiZcKjB_.js +1 -0
- package/dist/public/sdk/adapters-DdDOQzl4.js +2 -0
- package/dist/public/sdk/appearance-ZGVLwA4N.js +1 -0
- package/dist/public/sdk/authenticatorOptions-DMLnDWT2.js +1 -0
- package/dist/public/sdk/authorizationAdmission-Ckx6q6tp.js +1 -0
- package/dist/public/sdk/bytes-BBYkulRB.js +1 -0
- package/dist/public/sdk/canonicalPrimitives-CKPGgpxg.js +1 -0
- package/dist/public/sdk/canonicalSignerErrorCode-DEHsPxNm.js +1 -0
- package/dist/public/sdk/capabilityKinds-CKQ4Uqnv.js +1 -0
- package/dist/public/sdk/chains-CiYQT1K4.js +1 -0
- package/dist/public/sdk/challengeDelivery-DxXAkOfS.js +1 -0
- package/dist/public/sdk/clientSessionPersistenceState-CImFWDj6.js +1 -0
- package/dist/public/sdk/commitQueue-iBNUt9Bz.js +1 -0
- package/dist/public/sdk/configBuilder-ZiZwFKt4.js +1 -0
- package/dist/public/sdk/configHelpers-D8Ivi6p8.js +1 -0
- package/dist/public/sdk/digestEncoding-Dzc1rzWV.js +1 -0
- package/dist/public/sdk/display-ClqZq-Xt.js +1 -0
- package/dist/public/sdk/ecdsaCapabilityManifest-BlzJAQF8.js +1 -0
- package/dist/public/sdk/ecdsaChainTarget-C8ZtMZ8l.js +1 -0
- package/dist/public/sdk/ecdsaDerivationClientWasm-CVeNEou2.js +1 -0
- package/dist/public/sdk/ecdsaDerivationExport-BZFHSMCv.js +1 -0
- package/dist/public/sdk/ecdsaWalletRecords-D4WeYc7H.js +1 -0
- package/dist/public/sdk/emailOtpEcdsaDerivationIdentity-B8HzTh4T.js +1 -0
- package/dist/public/sdk/enrichDisplayModelWithAbi-69bNckvi.js +1 -0
- package/dist/public/sdk/evmCryptoWasm-BXsIyRon.js +1 -0
- package/dist/public/sdk/export-viewer-host-CsFeiIhd.js +1 -0
- package/dist/public/sdk/exportKeypairOperation-DGQIYML3.js +1 -0
- package/dist/public/sdk/helpers-Ddy72ULN.js +1 -0
- package/dist/public/sdk/host-B1CdRGoI.js +1 -0
- package/dist/public/sdk/intentDigest-CE-tLw87.js +1 -0
- package/dist/public/sdk/jsxRuntime.module-BcZNe_OA.js +2 -0
- package/dist/public/sdk/lanes-DnBwWv4l.js +1 -0
- package/dist/public/sdk/localOnly-ClCo6602.js +1 -0
- package/dist/public/sdk/messages-vxz27Way.js +1 -0
- package/dist/public/sdk/mountExportPrivateKeySurface-CBZ0wRYj.js +1 -0
- package/dist/public/sdk/mountRecoveryCodeBackupSurface-B1qhFF6G.js +2 -0
- package/dist/public/sdk/nearEd25519YaoMaterialActivation-fWQI3rYj.js +1 -0
- package/dist/public/sdk/nearEd25519YaoSigningPreparation-B0d1AG3u.js +1 -0
- package/dist/public/sdk/nonceLaneKeys-Fkvk2UPy.js +1 -0
- package/dist/public/sdk/normalization-CpLZcL2f.js +1 -0
- package/dist/public/sdk/normalization-DCvuCvh0.js +1 -0
- package/dist/public/sdk/normalize-kUDm5zfS.js +1 -0
- package/dist/public/sdk/operationFingerprint-CTR9G1NT.js +1 -0
- package/dist/public/sdk/passkey-custody-BQj44jEM.js +1 -0
- package/dist/public/sdk/pendingWalletRecoveryCodeBackup-yJN8VAHn.js +1 -0
- package/dist/public/sdk/presignaturePool-DwlTReFO.js +1 -0
- package/dist/public/sdk/presignatures-DB2IPD-A.js +1 -0
- package/dist/public/sdk/prfCache-BMpqZZ-v.js +1 -0
- package/dist/public/sdk/primitives-CAcl7ON7.js +1 -0
- package/dist/public/sdk/promptText-D2f5Rg0h.js +1 -0
- package/dist/public/sdk/recovery-entrypoint-Bl5GgbW9.js +1 -0
- package/dist/public/sdk/registration-C4sALQZO.js +1 -0
- package/dist/public/sdk/registration-CEqVAgNJ.js +1 -0
- package/dist/public/sdk/registrationAccounts-D4RVetMz.js +1 -0
- package/dist/public/sdk/registrationAuthMethodInput-6ccY2Vuh.js +1 -0
- package/dist/public/sdk/registrationIds-CdPqm-Ya.js +1 -0
- package/dist/public/sdk/registrationIntent-DOkZcKSP.js +1 -0
- package/dist/public/sdk/registrationSignerPlan-B9GCvpTV.js +1 -0
- package/dist/public/sdk/requireStepUpAuth-DCVqmeee.js +1 -0
- package/dist/public/sdk/routerAbNormalSigning-BG75eyI2.js +1 -0
- package/dist/public/sdk/router_ab_ed25519_yao_client_bg.wasm +0 -0
- package/dist/public/sdk/runtime-auth-tgfe70hU.js +1 -0
- package/dist/public/sdk/runtime-device-link-BUxuQupR.js +1 -0
- package/dist/public/sdk/runtime-ecdsa-tempo-DOBk_EtI.js +1 -0
- package/dist/public/sdk/runtime-email-otp-CsAJKvYC.js +1 -0
- package/dist/public/sdk/runtime-export-7REbcnBl.js +1 -0
- package/dist/public/sdk/runtime-near-BA0DQf6H.js +1 -0
- package/dist/public/sdk/runtime-preferences-cRViPE8a.js +1 -0
- package/dist/public/sdk/runtime-recovery-RRc8Yz1y.js +1 -0
- package/dist/public/sdk/runtime-recovery-codes-BZMiAR_5.js +1 -0
- package/dist/public/sdk/sdkSentEvents-D3q1h-Uo.js +1 -0
- package/dist/public/sdk/secp256k1-DSLttQND.js +1 -0
- package/dist/public/sdk/secureRandomId-BIekT8bE.js +1 -0
- package/dist/public/sdk/sessionPolicy-J-RrlPZQ.js +1 -0
- package/dist/public/sdk/shared-DdfxBUGY.js +6 -0
- package/dist/public/sdk/signEvmFamily-KUNWKVeh.js +1 -0
- package/dist/public/sdk/signEvmFamilyWithUiConfirmForTempo-Dc57bJ3V.js +1 -0
- package/dist/public/sdk/signEvmWithUiConfirm-CqxL7UbT.js +1 -0
- package/dist/public/sdk/signNear-CO5bx24Z.js +1 -0
- package/dist/public/sdk/signatureUses-CjJ233KX.js +1 -0
- package/dist/public/sdk/signerDomain-vQmlnsbF.js +1 -0
- package/dist/public/sdk/signingFlow-vrXxrhlG.js +2 -0
- package/dist/public/sdk/signingQueue-BrGJXBqe.js +1 -0
- package/dist/public/sdk/signingSessionSeal-CDLUmAFY.js +1 -0
- package/dist/public/sdk/singletons-8UH3gOnZ.js +1 -0
- package/dist/public/sdk/theme-_AUTWLS_.js +1 -0
- package/dist/public/sdk/thresholdEcdsa-CO7xo1So.js +1 -0
- package/dist/public/sdk/trace-BvbCxdXF.js +1 -0
- package/dist/public/sdk/transaction-activity-D40ih2j-.js +1 -0
- package/dist/public/sdk/transactionReviewAdmission-C-a3ctCJ.js +1 -0
- package/dist/public/sdk/transactionState-DVinJk4K.js +1 -0
- package/dist/public/sdk/tx-confirm-ui.js +7 -11
- package/dist/public/sdk/types-BNUuaUtl.js +1 -0
- package/dist/public/sdk/types-D3GM-uHR.js +1 -0
- 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-recovery-C1kesLCF.js +1 -0
- package/dist/public/sdk/wallet-ui.css +1 -1
- package/dist/public/sdk/walletAuthMethodRecord-CXedSgpV.js +1 -0
- package/dist/public/sdk/walletAuthority-B5hXHWpK.js +1 -0
- package/dist/public/sdk/walletCustodyEcdsaContinuity-abNZ_dvX.js +1 -0
- package/dist/public/sdk/walletIframeIdentity-DJ0KOBHg.js +1 -0
- package/dist/public/sdk/walletOwnershipGeneration-DoXVMDWe.js +1 -0
- package/dist/public/sdk/walletRecoveryCommit-Cc9AqHr0.js +1 -0
- package/dist/public/sdk/walletRecoveryRotate-DWTAFYiv.js +1 -0
- package/dist/public/sdk/walletSessionAuthorizationProjection-DWBksIJR.js +1 -0
- package/dist/public/sdk/walletSessionAuthorizationStatus-o1VgsLhA.js +1 -0
- package/dist/public/sdk/walletSessionAuthorizationStore-gEYPmu-G.js +1 -0
- package/dist/public/sdk/walletSessionFailure-Bu4VPKTz.js +1 -0
- package/dist/public/sdk/warmSessionHydration-DgjuUacN.js +1 -0
- package/dist/public/sdk/webauthnP256-BEz4DEAs.js +1 -0
- package/dist/public/sdk/webauthnPromptCoordinator-BEudHQBr.js +1 -0
- package/dist/public/sdk/workers/device-linking-key.worker.js +18 -0
- package/dist/public/sdk/workers/ecdsa-derivation-client.worker.js +1490 -1268
- package/dist/public/sdk/workers/ecdsa-online-client.worker.js +96 -0
- package/dist/public/sdk/workers/ecdsa-presign-client.worker.js +101 -1
- package/dist/public/sdk/workers/email-otp.worker.js +267 -237
- package/dist/public/sdk/workers/evm-crypto.worker.js +12 -8
- package/dist/public/sdk/workers/passkey-mpc-export.worker.js +30 -1
- package/dist/public/sdk/workers/router_ab_ecdsa_client_bg.wasm +0 -0
- package/dist/public/sdk/workers/router_ab_ed25519_yao_client_bg.wasm +0 -0
- package/dist/public/sdk/workers/shamir3pass.worker.js +10 -8
- package/dist/public/sdk/workers/tempo-signer.worker.js +12 -8
- package/dist/public/sdk/workers/wallet-custody-ceremony.worker.js +3 -1
- package/dist/public/sdk/workers/wallet_custody_ceremony_bg.wasm +0 -0
- package/dist/public/sdk/workers/wasm_signer_worker_bg.wasm +0 -0
- package/dist/public/wallet-assets.manifest.json +391 -295
- package/dist/public/wallet-service/index.html +4 -4
- package/dist/types/shared-ts/src/device-linking/activeWalletSession.d.ts +2 -1
- package/dist/types/shared-ts/src/device-linking/contracts.d.ts +10 -0
- package/dist/types/shared-ts/src/threshold/ed25519OperationFingerprint.d.ts +2 -1
- package/dist/types/shared-ts/src/utils/emailOtpDomain.d.ts +3 -1
- package/dist/types/shared-ts/src/utils/routerAbPublicKeyset.d.ts +0 -9
- package/dist/types/shared-ts/src/utils/walletManagementProtocol.d.ts +1 -1
- package/dist/types/wallet/build-paths.d.ts +0 -4
- package/dist/types/wallet/src/SeamsWeb/SeamsWeb.d.ts +26 -146
- package/dist/types/wallet/src/SeamsWeb/assembly/browserSigningSurfaceAssembly.d.ts +7 -6
- package/dist/types/wallet/src/SeamsWeb/assembly/browserSigningSurfacePorts.d.ts +2 -4
- package/dist/types/wallet/src/SeamsWeb/assembly/createWalletIframeRouter.d.ts +2 -2
- package/dist/types/wallet/src/SeamsWeb/assembly/initializeBrowserSigningRuntime.d.ts +0 -2
- package/dist/types/wallet/src/SeamsWeb/index.d.ts +1 -1
- package/dist/types/wallet/src/SeamsWeb/operations/auth/login.d.ts +2 -8
- package/dist/types/wallet/src/SeamsWeb/operations/auth/unlockCompletion.d.ts +26 -0
- package/dist/types/wallet/src/SeamsWeb/operations/auth/unlockPendingRegistration.d.ts +14 -0
- package/dist/types/wallet/src/SeamsWeb/operations/auth/unlockSessionPolicy.d.ts +16 -0
- package/dist/types/wallet/src/SeamsWeb/operations/authMethods/emailOtp/challenge.d.ts +2 -2
- package/dist/types/wallet/src/SeamsWeb/operations/authMethods/emailOtp/googleEmailOtpWalletAuthFlow.d.ts +3 -2
- package/dist/types/wallet/src/SeamsWeb/operations/authMethods/revokeAuthMethod.d.ts +17 -1
- package/dist/types/wallet/src/SeamsWeb/operations/devices/linkDevice.d.ts +0 -7
- package/dist/types/wallet/src/SeamsWeb/operations/devices/walletHostComposition.d.ts +2 -0
- package/dist/types/wallet/src/SeamsWeb/operations/near/actions.d.ts +4 -21
- package/dist/types/wallet/src/SeamsWeb/operations/near/delegateAction.d.ts +4 -14
- package/dist/types/wallet/src/SeamsWeb/operations/near/signDelegateAction.d.ts +14 -0
- package/dist/types/wallet/src/SeamsWeb/operations/near/signNEP413.d.ts +2 -2
- package/dist/types/wallet/src/SeamsWeb/operations/registration/pendingEcdsaRegistrationRecovery.d.ts +11 -11
- package/dist/types/wallet/src/SeamsWeb/operations/registration/pendingEcdsaRegistrationRecoveryValidation.d.ts +18 -4
- package/dist/types/wallet/src/SeamsWeb/operations/registration/pendingRegistrationRecovery.d.ts +4 -20
- package/dist/types/wallet/src/SeamsWeb/operations/registration/registration.d.ts +10 -4
- package/dist/types/wallet/src/SeamsWeb/operations/registration/registrationEd25519Yao.d.ts +1 -1
- package/dist/types/wallet/src/SeamsWeb/operations/registration/registrationSignerSet.d.ts +1 -0
- package/dist/types/wallet/src/SeamsWeb/operations/registration/registrationTerminalCommit.d.ts +0 -4
- package/dist/types/wallet/src/SeamsWeb/operations/registration/registrationTiming.d.ts +2 -3
- package/dist/types/wallet/src/SeamsWeb/operations/tempo/index.d.ts +0 -3
- package/dist/types/wallet/src/SeamsWeb/publicApi/auth.d.ts +4 -13
- package/dist/types/wallet/src/SeamsWeb/publicApi/createPublicApi.d.ts +22 -43
- package/dist/types/wallet/src/SeamsWeb/publicApi/devices.d.ts +3 -21
- package/dist/types/wallet/src/SeamsWeb/publicApi/evm.d.ts +10 -16
- package/dist/types/wallet/src/SeamsWeb/publicApi/evmFamilyCommands.d.ts +6 -0
- package/dist/types/wallet/src/SeamsWeb/publicApi/index.d.ts +2 -2
- package/dist/types/wallet/src/SeamsWeb/publicApi/keyExport.d.ts +8 -16
- package/dist/types/wallet/src/SeamsWeb/publicApi/near.d.ts +10 -10
- package/dist/types/wallet/src/SeamsWeb/publicApi/nearCommands.d.ts +17 -0
- package/dist/types/wallet/src/SeamsWeb/publicApi/placement.d.ts +90 -0
- package/dist/types/wallet/src/SeamsWeb/publicApi/placement.typecheck.d.ts +2 -0
- package/dist/types/wallet/src/SeamsWeb/publicApi/session.d.ts +3 -0
- package/dist/types/wallet/src/SeamsWeb/publicApi/tempo.d.ts +11 -11
- package/dist/types/wallet/src/SeamsWeb/publicApi/types.d.ts +106 -243
- package/dist/types/wallet/src/SeamsWeb/publicApi/waitForNearAccount.d.ts +27 -0
- package/dist/types/wallet/src/SeamsWeb/signingSurface/BrowserSigningSurface.d.ts +33 -78
- package/dist/types/wallet/src/SeamsWeb/signingSurface/ports.d.ts +8 -31
- package/dist/types/wallet/src/SeamsWeb/walletIframe/client/deviceCommands.d.ts +4 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/client/emailOtpCommands.d.ts +4 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/client/evmFamilyCommands.d.ts +6 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/client/inboundMessages.d.ts +62 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/client/nearCommands.d.ts +6 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/client/placementCommands.d.ts +31 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/client/preferenceState.d.ts +35 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/client/preferences.d.ts +10 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/client/registrationCommands.d.ts +6 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/client/router.d.ts +36 -121
- package/dist/types/wallet/src/SeamsWeb/walletIframe/client/sessionCommands.d.ts +6 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/coordinator.d.ts +29 -35
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/WalletHostRuntime.d.ts +98 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/auth-menu/controller.d.ts +2 -2
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/context.d.ts +11 -9
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/createDeviceDomain.d.ts +20 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/createEmailOtpCommands.d.ts +11 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/createEvmFamilyCommands.d.ts +8 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/createNearCommands.d.ts +4 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/createPlacementCommands.d.ts +11 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/createRegistrationCommands.d.ts +4 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/createSessionCommands.d.ts +16 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/handlers/placement.d.ts +3 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/handlers/walletIframeHandler.types.d.ts +7 -3
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/hostedWalletSeamsSession.d.ts +2 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/reconcileWalletPlacement.d.ts +10 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/requestRouter.d.ts +4 -4
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/requestWalletMove.d.ts +11 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/runtimeContext.d.ts +5 -3
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/runtimeLoader.d.ts +0 -1
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/sessionObserver.d.ts +39 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/walletMoveLocator.d.ts +5 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/walletMutationGuard.d.ts +3 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/shared/configuration.d.ts +30 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/shared/emailOtpLifecycle.d.ts +43 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/shared/exactSessionState.d.ts +15 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/shared/facadeBoundary.d.ts +14 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/shared/messages.d.ts +35 -100
- package/dist/types/wallet/src/core/config/chains.d.ts +1 -3
- package/dist/types/wallet/src/core/config/configBuilder.d.ts +16 -6
- package/dist/types/wallet/src/core/config/defaultConfigs.d.ts +3 -4
- package/dist/types/wallet/src/core/config/defineConfig.d.ts +3 -6
- package/dist/types/wallet/src/core/config/presignatures.d.ts +3 -0
- package/dist/types/wallet/src/core/diagnostics/registration.d.ts +2 -0
- package/dist/types/wallet/src/core/indexedDB/normalization.d.ts +5 -0
- package/dist/types/wallet/src/core/indexedDB/passkeyClientDB.types.d.ts +2 -2
- package/dist/types/wallet/src/core/indexedDB/pendingWalletRegistrationCommit.d.ts +0 -10
- package/dist/types/wallet/src/core/indexedDB/seamsWalletDB/accountSignerRows.d.ts +44 -0
- package/dist/types/wallet/src/core/indexedDB/seamsWalletDB/ecdsaCapabilityManifestStore.d.ts +0 -2
- package/dist/types/wallet/src/core/indexedDB/seamsWalletDB/ecdsaClientPresignatures.d.ts +0 -5
- package/dist/types/wallet/src/core/indexedDB/seamsWalletDB/manager.d.ts +11 -0
- package/dist/types/wallet/src/core/indexedDB/seamsWalletDB/nonceLeaseRows.d.ts +23 -0
- package/dist/types/wallet/src/core/indexedDB/seamsWalletDB/repositories.d.ts +1 -0
- package/dist/types/wallet/src/core/indexedDB/seamsWalletDB/signerOutboxRows.d.ts +15 -0
- package/dist/types/wallet/src/core/indexedDB/seamsWalletDB/walletOwnershipGeneration.d.ts +6 -0
- package/dist/types/wallet/src/core/indexedDB/unifiedIndexedDBManager.d.ts +1 -1
- package/dist/types/wallet/src/core/rpcClients/near/accountExists.d.ts +3 -0
- package/dist/types/wallet/src/core/rpcClients/near/rpcCalls.d.ts +1 -14
- package/dist/types/wallet/src/core/rpcClients/relayer/ecdsaPrepareSession.d.ts +13 -0
- package/dist/types/wallet/src/core/rpcClients/relayer/ownerWalletExecutionLanePreflight.d.ts +3 -3
- package/dist/types/wallet/src/core/rpcClients/relayer/relayerHttp.d.ts +17 -0
- package/dist/types/wallet/src/core/rpcClients/relayer/routerAbNormalSigning.d.ts +19 -3
- package/dist/types/wallet/src/core/rpcClients/relayer/walletRegistration.d.ts +29 -40
- package/dist/types/wallet/src/core/rpcClients/relayer/walletSessionAuthorizationStatus.d.ts +34 -0
- package/dist/types/wallet/src/core/signingEngine/assembly/ports/shared.d.ts +1 -1
- package/dist/types/wallet/src/core/signingEngine/assembly/ports/warmSigning.d.ts +2 -1
- package/dist/types/wallet/src/core/signingEngine/assembly/warmup.d.ts +2 -14
- package/dist/types/wallet/src/core/signingEngine/chains/near/nearSignerWasm.d.ts +2 -6
- package/dist/types/wallet/src/core/signingEngine/flows/recovery/public.d.ts +1 -1
- package/dist/types/wallet/src/core/signingEngine/flows/signEvmFamily/emailOtpPublic.d.ts +1 -32
- package/dist/types/wallet/src/core/signingEngine/flows/signEvmFamily/emailOtpSigningSession.d.ts +3 -82
- package/dist/types/wallet/src/core/signingEngine/flows/signEvmFamily/readySecp256k1Material.d.ts +62 -1
- package/dist/types/wallet/src/core/signingEngine/flows/signEvmFamily/requireEvmFamilyStepUpAuth.d.ts +1 -1
- package/dist/types/wallet/src/core/signingEngine/flows/signEvmFamily/signers/secp256k1.d.ts +4 -55
- package/dist/types/wallet/src/core/signingEngine/flows/signEvmFamily/signingFlow.d.ts +1 -1
- package/dist/types/wallet/src/core/signingEngine/flows/signEvmFamily/thresholdAdmission.d.ts +3 -2
- package/dist/types/wallet/src/core/signingEngine/flows/signNear/shared/ed25519YaoNormalSigning.d.ts +33 -1
- package/dist/types/wallet/src/core/signingEngine/flows/signNear/shared/signatureOnlySigning.d.ts +16 -2
- package/dist/types/wallet/src/core/signingEngine/flows/signNear/signNear.d.ts +1 -2
- package/dist/types/wallet/src/core/signingEngine/flows/signNear/signNep413.d.ts +1 -1
- package/dist/types/wallet/src/core/signingEngine/interfaces/ecdsaChainTarget.d.ts +1 -1
- package/dist/types/wallet/src/core/signingEngine/interfaces/near.d.ts +3 -0
- package/dist/types/wallet/src/core/signingEngine/routerAb/ecdsaDerivation/presignaturePool.d.ts +9 -5
- package/dist/types/wallet/src/core/signingEngine/routerAb/ecdsaDerivation/presignaturePoolPolicy.d.ts +5 -0
- package/dist/types/wallet/src/core/signingEngine/session/SigningSessionCoordinator.d.ts +1 -7
- package/dist/types/wallet/src/core/signingEngine/session/availability/persistedAvailableSigningLanes.d.ts +1 -1
- package/dist/types/wallet/src/core/signingEngine/session/availability/readiness.d.ts +0 -17
- package/dist/types/wallet/src/core/signingEngine/session/emailOtp/EmailOtpWalletSessionCoordinator.d.ts +2 -2
- package/dist/types/wallet/src/core/signingEngine/session/emailOtp/ecdsaSigningSessionAuthority.d.ts +2 -33
- package/dist/types/wallet/src/core/signingEngine/session/emailOtp/exportRecovery.d.ts +2 -2
- package/dist/types/wallet/src/core/signingEngine/session/emailOtp/exportRecoveryRuntime.d.ts +14 -3
- package/dist/types/wallet/src/core/signingEngine/session/emailOtp/publicTypes.d.ts +1 -2
- package/dist/types/wallet/src/core/signingEngine/session/emailOtp/workerEnrollment.d.ts +0 -12
- package/dist/types/wallet/src/core/signingEngine/session/lanes/walletExecutionLaneHydration.d.ts +11 -25
- package/dist/types/wallet/src/core/signingEngine/session/lifecycle/walletSessionStatus.d.ts +0 -8
- package/dist/types/wallet/src/core/signingEngine/session/material/ecdsaSigningCapability.d.ts +2 -2
- package/dist/types/wallet/src/core/signingEngine/session/operationState/preparedOperation.d.ts +0 -8
- package/dist/types/wallet/src/core/signingEngine/session/operationState/trace.d.ts +1 -1
- package/dist/types/wallet/src/core/signingEngine/session/operationState/transactionState.d.ts +0 -1
- package/dist/types/wallet/src/core/signingEngine/session/passkey/ed25519YaoRecoveryCapability.d.ts +2 -0
- package/dist/types/wallet/src/core/signingEngine/session/public.d.ts +1 -1
- package/dist/types/wallet/src/core/signingEngine/session/routerAbSigningWalletSession.d.ts +2 -0
- package/dist/types/wallet/src/core/signingEngine/session/userPreferences.d.ts +8 -11
- package/dist/types/wallet/src/core/signingEngine/session/warmCapabilities/capabilityReader.d.ts +2 -1
- package/dist/types/wallet/src/core/signingEngine/session/warmCapabilities/capabilityReaderCore.d.ts +2 -1
- package/dist/types/wallet/src/core/signingEngine/stepUpConfirmation/otpPrompt/authLane.d.ts +6 -12
- package/dist/types/wallet/src/core/signingEngine/threshold/ecdsa/operationStepUp.d.ts +6 -5
- package/dist/types/wallet/src/core/signingEngine/threshold/ed25519/yaoClient.d.ts +6 -17
- package/dist/types/wallet/src/core/signingEngine/uiConfirm/ui/preact/ReviewDisclosure.d.ts +1 -0
- package/dist/types/wallet/src/core/signingEngine/walletCustody/ceremonyDriver.d.ts +0 -1
- package/dist/types/wallet/src/core/signingEngine/walletCustody/walletRegistrationEd25519.d.ts +17 -0
- package/dist/types/wallet/src/core/signingEngine/workerManager/SignerWorkerManager.d.ts +0 -1
- package/dist/types/wallet/src/core/signingEngine/workerManager/ecdsaPresignLifecycle.d.ts +0 -2
- package/dist/types/wallet/src/core/signingEngine/workerManager/ecdsaPresignPoolIdentity.d.ts +9 -0
- package/dist/types/wallet/src/core/signingEngine/workerManager/workerTransport.d.ts +0 -5
- package/dist/types/wallet/src/core/signingEngine/workerManager/workerTypes.d.ts +15 -27
- package/dist/types/wallet/src/core/signingEngine/workerManager/workers/email-otp/enrollment.d.ts +1 -17
- package/dist/types/wallet/src/core/types/rpc.d.ts +0 -1
- package/dist/types/wallet/src/core/types/sdkPublicResults.d.ts +1 -0
- package/dist/types/wallet/src/core/types/sdkSentEvents.d.ts +2 -0
- package/dist/types/wallet/src/core/types/seams.d.ts +12 -9
- package/dist/types/wallet/src/core/types/signer-worker.d.ts +2 -1
- package/dist/types/wallet/src/externalEvm/controller.d.ts +5 -1
- package/dist/types/wallet/src/index.d.ts +5 -2
- package/dist/types/wallet/src/react/components/AccountMenuButton/WalletRegionSection.d.ts +54 -0
- package/dist/types/wallet/src/react/components/AccountMenuButton/WalletSettingsLayout.d.ts +7 -2
- package/dist/types/wallet/src/react/components/AccountMenuButton/index.d.ts +1 -1
- package/dist/types/wallet/src/react/components/AccountMenuButton/types.d.ts +1 -0
- package/dist/types/wallet/src/react/components/HostedSeamsAuthMenu/public.d.ts +1 -1
- package/dist/types/wallet/src/react/components/HostedSeamsAuthMenu/types.d.ts +2 -5
- package/dist/types/wallet/src/react/context/SeamsWebProvider.d.ts +0 -5
- package/dist/types/wallet/src/react/context/useLoginStateRefresher.d.ts +1 -1
- package/dist/types/wallet/src/react/context/useNearProvisioningStateRefresh.d.ts +1 -1
- package/dist/types/wallet/src/react/context/useSeamsContextValue.d.ts +2 -2
- package/dist/types/wallet/src/react/context/useWalletIframeLifecycle.d.ts +4 -2
- package/dist/types/wallet/src/react/hooks/useQRCamera.d.ts +1 -7
- package/dist/types/wallet/src/react/hooks/useWallet.d.ts +5 -6
- package/dist/types/wallet/src/react/hooks/useWalletAuth.d.ts +1 -1
- package/dist/types/wallet/src/react/hooks/useWalletDevices.d.ts +1 -1
- package/dist/types/wallet/src/react/index.d.ts +2 -2
- package/dist/types/wallet/src/react/transactionReview/boundCalls.d.ts +0 -26
- package/dist/types/wallet/src/react/types.d.ts +12 -20
- package/dist/types/wallet/src/react/utils/walletIframe.d.ts +2 -6
- package/dist/workers/device-linking-key.worker.js +18 -0
- package/dist/workers/ecdsa-derivation-client.worker.js +1490 -1268
- package/dist/workers/ecdsa-online-client.worker.js +96 -0
- package/dist/workers/ecdsa-presign-client.worker.js +101 -1
- package/dist/workers/email-otp.worker.js +267 -237
- package/dist/workers/evm-crypto.worker.js +12 -8
- package/dist/workers/passkey-mpc-export.worker.js +30 -1
- package/dist/workers/router_ab_ecdsa_client_bg.wasm +0 -0
- package/dist/workers/router_ab_ed25519_yao_client_bg.wasm +0 -0
- package/dist/workers/shamir3pass.worker.js +10 -8
- package/dist/workers/tempo-signer.worker.js +12 -8
- package/dist/workers/wallet-custody-ceremony.worker.js +3 -1
- package/dist/workers/wallet_custody_ceremony_bg.wasm +0 -0
- package/dist/workers/wasm_signer_worker_bg.wasm +0 -0
- package/package.json +1 -1
- package/dist/esm/SeamsWeb/assembly/browserSigningSurfaceAssembly.js +0 -817
- package/dist/esm/SeamsWeb/assembly/browserWorkerWarmupPolicy.js +0 -31
- package/dist/esm/SeamsWeb/assembly/configureBrowserIndexedDB.js +0 -10
- package/dist/esm/SeamsWeb/assembly/createBrowserRecoveryPublicDeps.js +0 -95
- package/dist/esm/SeamsWeb/assembly/createBrowserSigningRuntime.js +0 -34
- package/dist/esm/SeamsWeb/assembly/createBrowserSigningStores.js +0 -39
- package/dist/esm/SeamsWeb/assembly/createBrowserStepUpRuntime.js +0 -34
- package/dist/esm/SeamsWeb/assembly/createBrowserWarmSessionPublicDeps.js +0 -29
- package/dist/esm/SeamsWeb/assembly/initializeBrowserSigningRuntime.js +0 -19
- package/dist/esm/SeamsWeb/assembly/runtimeConfig.js +0 -12
- package/dist/esm/SeamsWeb/operations/auth/login.js +0 -4383
- package/dist/esm/SeamsWeb/operations/auth/scheduleEcdsaSessionPresignaturePrefill.js +0 -41
- package/dist/esm/SeamsWeb/operations/auth/scheduleLinkedDevicePresignaturePrefill.js +0 -64
- package/dist/esm/SeamsWeb/operations/auth/walletAuth.js +0 -142
- package/dist/esm/SeamsWeb/operations/auth/walletUnlockEcdsaSubject.js +0 -33
- package/dist/esm/SeamsWeb/operations/auth/walletUnlockSubject.js +0 -288
- package/dist/esm/SeamsWeb/operations/authMethods/addAuthMethodSourceClaim.js +0 -72
- package/dist/esm/SeamsWeb/operations/authMethods/emailOtp/addEmailOtp.js +0 -191
- package/dist/esm/SeamsWeb/operations/authMethods/emailOtp/challenge.js +0 -247
- package/dist/esm/SeamsWeb/operations/authMethods/emailOtp/googleEmailOtpWalletAuthFlow.js +0 -568
- package/dist/esm/SeamsWeb/operations/authMethods/emailOtp/localEmailOtpProjection.js +0 -69
- package/dist/esm/SeamsWeb/operations/authMethods/emailOtp/registrationAuthority.js +0 -62
- package/dist/esm/SeamsWeb/operations/authMethods/emailOtp/registrationOffer.js +0 -69
- package/dist/esm/SeamsWeb/operations/authMethods/emailOtp/walletActivation.js +0 -95
- package/dist/esm/SeamsWeb/operations/authMethods/passkey/addPasskey.js +0 -260
- package/dist/esm/SeamsWeb/operations/authMethods/passkey/ecdsaBootstrap.js +0 -17
- package/dist/esm/SeamsWeb/operations/authMethods/passkey/exactPasskeyAuthority.js +0 -34
- package/dist/esm/SeamsWeb/operations/authMethods/passkey/localUnlock.js +0 -16
- package/dist/esm/SeamsWeb/operations/authMethods/passkey/loginAssertion.js +0 -25
- package/dist/esm/SeamsWeb/operations/authMethods/passkey/registrationAuthority.js +0 -84
- package/dist/esm/SeamsWeb/operations/authMethods/revokeAuthMethod.js +0 -205
- package/dist/esm/SeamsWeb/operations/authMethods/sourcePasskeyProof.js +0 -12
- package/dist/esm/SeamsWeb/operations/devices/deviceLinkingAuthorityInstallation.js +0 -444
- package/dist/esm/SeamsWeb/operations/devices/deviceLinkingComposition.js +0 -106
- package/dist/esm/SeamsWeb/operations/devices/deviceLinkingEd25519ExportRoot.js +0 -194
- package/dist/esm/SeamsWeb/operations/devices/deviceLinkingHttpTransport.js +0 -524
- package/dist/esm/SeamsWeb/operations/devices/deviceLinkingOwnerTransport.js +0 -135
- package/dist/esm/SeamsWeb/operations/devices/deviceLinkingResume.js +0 -212
- package/dist/esm/SeamsWeb/operations/devices/deviceLinkingTargetCredential.js +0 -63
- package/dist/esm/SeamsWeb/operations/devices/deviceLinkingTargetEd25519ExportRoot.js +0 -61
- package/dist/esm/SeamsWeb/operations/devices/deviceLinkingWorkerChannels.js +0 -337
- package/dist/esm/SeamsWeb/operations/devices/linkDevice.js +0 -75
- package/dist/esm/SeamsWeb/operations/devices/linkDeviceFlow.js +0 -1383
- package/dist/esm/SeamsWeb/operations/devices/linkDeviceFlowSupport.js +0 -143
- package/dist/esm/SeamsWeb/operations/devices/linkDeviceTargetActivation.js +0 -119
- package/dist/esm/SeamsWeb/operations/devices/walletHostComposition.js +0 -130
- package/dist/esm/SeamsWeb/operations/devices/walletHostOwnerAuthority.js +0 -191
- package/dist/esm/SeamsWeb/operations/evm/index.js +0 -35
- package/dist/esm/SeamsWeb/operations/near/actions.js +0 -484
- package/dist/esm/SeamsWeb/operations/near/commandSubject.js +0 -14
- package/dist/esm/SeamsWeb/operations/near/index.js +0 -37
- package/dist/esm/SeamsWeb/operations/near/signNEP413.js +0 -116
- package/dist/esm/SeamsWeb/operations/recovery/accountSync.js +0 -21
- package/dist/esm/SeamsWeb/operations/recovery/recoveryWalletBinding.js +0 -43
- package/dist/esm/SeamsWeb/operations/recovery/syncAccount.js +0 -912
- package/dist/esm/SeamsWeb/operations/recovery/walletRecoveryCodeBackup.js +0 -100
- package/dist/esm/SeamsWeb/operations/recovery/walletRecoveryRotation.js +0 -213
- package/dist/esm/SeamsWeb/operations/registration/pendingEcdsaRegistrationRecovery.js +0 -184
- package/dist/esm/SeamsWeb/operations/registration/pendingEcdsaRegistrationRecoveryUnlock.js +0 -247
- package/dist/esm/SeamsWeb/operations/registration/pendingEcdsaRegistrationRecoveryValidation.js +0 -134
- package/dist/esm/SeamsWeb/operations/registration/pendingRegistrationRecovery.js +0 -354
- package/dist/esm/SeamsWeb/operations/registration/registration.js +0 -3818
- package/dist/esm/SeamsWeb/operations/registration/registrationEd25519Yao.js +0 -166
- package/dist/esm/SeamsWeb/operations/registration/registrationSignerSet.js +0 -60
- package/dist/esm/SeamsWeb/operations/registration/registrationStrictEcdsa.js +0 -343
- package/dist/esm/SeamsWeb/operations/registration/registrationTerminalCommit.js +0 -296
- package/dist/esm/SeamsWeb/operations/registration/registrationTiming.js +0 -682
- package/dist/esm/SeamsWeb/operations/session/thresholdEcdsaProvisioning.js +0 -36
- package/dist/esm/SeamsWeb/operations/session/thresholdWarmSessionBootstrap.js +0 -20
- package/dist/esm/SeamsWeb/publicApi/awaitNearReady.js +0 -72
- package/dist/esm/SeamsWeb/publicApi/preferences.js +0 -61
- package/dist/esm/SeamsWeb/publicApi/recovery.js +0 -19
- package/dist/esm/SeamsWeb/publicApi/types.js +0 -10
- package/dist/esm/SeamsWeb/signingSurface/BrowserSigningSurface.js +0 -3917
- package/dist/esm/SeamsWeb/walletIframe/host/restoredSessionPresignaturePrefill.js +0 -29
- package/dist/esm/core/browser/walletIframe/events.js +0 -6
- package/dist/esm/core/browser/walletIframe/host-mode.js +0 -9
- package/dist/esm/core/config/managedRuntimeScope.js +0 -16
- package/dist/esm/core/indexedDB/seamsWalletDB/pendingWalletRecoveryCodeBackup.js +0 -144
- package/dist/esm/core/platform/browser/createBrowserPlatformRuntime.js +0 -535
- package/dist/esm/core/platform/secretSources.js +0 -111
- package/dist/esm/core/platform/signerCoreCommandAdapters.js +0 -122
- package/dist/esm/core/rpcClients/near/rpcCalls.js +0 -376
- package/dist/esm/core/rpcClients/relayer/ownerWalletExecutionLanePreflight.js +0 -67
- package/dist/esm/core/rpcClients/relayer/passkeyCustodyEnvelope.js +0 -218
- package/dist/esm/core/rpcClients/relayer/sealedRefreshCapabilities.js +0 -148
- package/dist/esm/core/rpcClients/relayer/thresholdEcdsa.js +0 -235
- package/dist/esm/core/rpcClients/relayer/walletRecoveryGoogleEmailOtp.js +0 -161
- package/dist/esm/core/rpcClients/relayer/walletRegistrationTerminalResponse.js +0 -718
- package/dist/esm/core/signingEngine/assembly/createManagers.js +0 -80
- package/dist/esm/core/signingEngine/assembly/createPorts.js +0 -54
- package/dist/esm/core/signingEngine/assembly/ports/emailOtp.js +0 -30
- package/dist/esm/core/signingEngine/assembly/ports/evmFamily.js +0 -73
- package/dist/esm/core/signingEngine/assembly/ports/near.js +0 -21
- package/dist/esm/core/signingEngine/assembly/ports/recovery.js +0 -75
- package/dist/esm/core/signingEngine/assembly/ports/registration.js +0 -22
- package/dist/esm/core/signingEngine/assembly/ports/session.js +0 -25
- package/dist/esm/core/signingEngine/assembly/ports/shared.js +0 -39
- package/dist/esm/core/signingEngine/assembly/ports/stepUpRuntime.js +0 -67
- package/dist/esm/core/signingEngine/assembly/ports/warmSigning.js +0 -92
- package/dist/esm/core/signingEngine/assembly/warmup.js +0 -64
- package/dist/esm/core/signingEngine/flows/recovery/ecdsaDerivationExport.js +0 -427
- package/dist/esm/core/signingEngine/flows/recovery/ecdsaExportFlow.js +0 -660
- package/dist/esm/core/signingEngine/flows/recovery/ecdsaExportMaterial.js +0 -249
- package/dist/esm/core/signingEngine/flows/recovery/ed25519YaoExportFlow.js +0 -353
- package/dist/esm/core/signingEngine/flows/recovery/exportKeypairOperation.js +0 -213
- package/dist/esm/core/signingEngine/flows/recovery/exportLaneSelection.js +0 -283
- package/dist/esm/core/signingEngine/flows/recovery/keyExportConfirmation.js +0 -325
- package/dist/esm/core/signingEngine/flows/recovery/keyExportFlow.js +0 -81
- package/dist/esm/core/signingEngine/flows/recovery/passkeyEd25519YaoRecovery.js +0 -192
- package/dist/esm/core/signingEngine/flows/recovery/public.js +0 -26
- package/dist/esm/core/signingEngine/flows/recovery/stepUpAuthorization.js +0 -139
- package/dist/esm/core/signingEngine/flows/registration/nearProvisioningRegistry.js +0 -79
- package/dist/esm/core/signingEngine/flows/registration/public.js +0 -85
- package/dist/esm/core/signingEngine/flows/registration/services/ecdsaRegistrationSessions.js +0 -77
- package/dist/esm/core/signingEngine/flows/registration/services/passkeyEd25519YaoAddSigner.js +0 -82
- package/dist/esm/core/signingEngine/flows/registration/session.js +0 -24
- package/dist/esm/core/signingEngine/flows/signEvmFamily/emailOtpPublic.js +0 -123
- package/dist/esm/core/signingEngine/nonce/NonceCoordinator.js +0 -1026
- package/dist/esm/core/signingEngine/nonce/evmNonceLane.js +0 -182
- package/dist/esm/core/signingEngine/nonce/nearNonceLane.js +0 -669
- package/dist/esm/core/signingEngine/nonce/nonceDiagnostics.js +0 -232
- package/dist/esm/core/signingEngine/nonce/nonceLeaseState.js +0 -128
- package/dist/esm/core/signingEngine/nonce/nonceUtils.js +0 -33
- package/dist/esm/core/signingEngine/session/SigningSessionCoordinator.js +0 -344
- package/dist/esm/core/signingEngine/session/authority/authorityOperationResolver.js +0 -114
- package/dist/esm/core/signingEngine/session/availability/canonicalLaneInventory.js +0 -127
- package/dist/esm/core/signingEngine/session/availability/clientSessionExpiryInvalidator.js +0 -72
- package/dist/esm/core/signingEngine/session/availability/persistedAvailableSigningLanes.js +0 -214
- package/dist/esm/core/signingEngine/session/availability/readiness.js +0 -464
- package/dist/esm/core/signingEngine/session/emailOtp/EmailOtpWalletSessionCoordinator.js +0 -130
- package/dist/esm/core/signingEngine/session/emailOtp/ecdsaBootstrapCommit.js +0 -106
- package/dist/esm/core/signingEngine/session/emailOtp/ecdsaLifecycleRuntime.js +0 -47
- package/dist/esm/core/signingEngine/session/emailOtp/ecdsaLogin.js +0 -930
- package/dist/esm/core/signingEngine/session/emailOtp/ecdsaPublication.js +0 -414
- package/dist/esm/core/signingEngine/session/emailOtp/ecdsaRecovery.js +0 -264
- package/dist/esm/core/signingEngine/session/emailOtp/ed25519ExportContext.js +0 -373
- package/dist/esm/core/signingEngine/session/emailOtp/exportRecovery.js +0 -284
- package/dist/esm/core/signingEngine/session/emailOtp/exportRecoveryRuntime.js +0 -50
- package/dist/esm/core/signingEngine/session/emailOtp/persistedSnapshot.js +0 -22
- package/dist/esm/core/signingEngine/session/emailOtp/publicTypes.js +0 -38
- package/dist/esm/core/signingEngine/session/emailOtp/routePlan.js +0 -60
- package/dist/esm/core/signingEngine/session/emailOtp/runtimeConfig.js +0 -24
- package/dist/esm/core/signingEngine/session/emailOtp/sealedRefreshPolicy.js +0 -49
- package/dist/esm/core/signingEngine/session/emailOtp/sealedRestoreOrchestrator.js +0 -234
- package/dist/esm/core/signingEngine/session/emailOtp/sealedRuntimePurpose.js +0 -16
- package/dist/esm/core/signingEngine/session/emailOtp/sealedSessionRegistry.js +0 -40
- package/dist/esm/core/signingEngine/session/emailOtp/status.js +0 -72
- package/dist/esm/core/signingEngine/session/emailOtp/walletUnlock.js +0 -168
- package/dist/esm/core/signingEngine/session/emailOtp/warmSessionRuntime.js +0 -70
- package/dist/esm/core/signingEngine/session/emailOtp/workerEnrollment.js +0 -159
- package/dist/esm/core/signingEngine/session/emailOtp/workerRequests.js +0 -84
- package/dist/esm/core/signingEngine/session/emailOtp/zeroize.js +0 -9
- package/dist/esm/core/signingEngine/session/identity/exactWalletSessionCredential.js +0 -104
- package/dist/esm/core/signingEngine/session/identity/exactWalletSessionReader.js +0 -54
- package/dist/esm/core/signingEngine/session/identity/ownerLaneScope.js +0 -185
- package/dist/esm/core/signingEngine/session/lanes/walletExecutionLaneHydration.js +0 -194
- package/dist/esm/core/signingEngine/session/lifecycle/canonicalWalletSessionStatus.js +0 -32
- package/dist/esm/core/signingEngine/session/lifecycle/walletSessionStatus.js +0 -123
- package/dist/esm/core/signingEngine/session/material/ecdsaCapabilityHydration.js +0 -75
- package/dist/esm/core/signingEngine/session/material/ecdsaSealedRuntime.js +0 -197
- package/dist/esm/core/signingEngine/session/material/mpcCapabilityHydration.js +0 -79
- package/dist/esm/core/signingEngine/session/material/nearEd25519YaoSigningPreparation.js +0 -122
- package/dist/esm/core/signingEngine/session/material/restorableMpcMaterialRef.internal.js +0 -21
- package/dist/esm/core/signingEngine/session/passkey/ecdsaBootstrap.js +0 -184
- package/dist/esm/core/signingEngine/session/passkey/ecdsaKeyFactsInventory.js +0 -205
- package/dist/esm/core/signingEngine/session/passkey/ecdsaRecovery.js +0 -84
- package/dist/esm/core/signingEngine/session/passkey/ecdsaSessionProvision.js +0 -224
- package/dist/esm/core/signingEngine/session/passkey/ecdsaWarmCapabilityBootstrap.js +0 -147
- package/dist/esm/core/signingEngine/session/passkey/ed25519Provisioner.js +0 -55
- package/dist/esm/core/signingEngine/session/passkey/ed25519SessionProvision.js +0 -228
- package/dist/esm/core/signingEngine/session/passkey/ed25519YaoLocalMaterial.js +0 -536
- package/dist/esm/core/signingEngine/session/passkey/ed25519YaoRecoveryCapability.js +0 -94
- package/dist/esm/core/signingEngine/session/passkey/ed25519YaoSealedSession.js +0 -57
- package/dist/esm/core/signingEngine/session/passkey/ed25519YaoWarmRecovery.js +0 -281
- package/dist/esm/core/signingEngine/session/passkey/passkeyCustodySessionCache.js +0 -90
- package/dist/esm/core/signingEngine/session/passkey/public.js +0 -15
- package/dist/esm/core/signingEngine/session/passkey/unlockEcdsaWarmupPlanner.js +0 -247
- package/dist/esm/core/signingEngine/session/persistence/clientSessionPersistence.js +0 -135
- package/dist/esm/core/signingEngine/session/persistence/walletSessionAuthorizationProjection.js +0 -51
- package/dist/esm/core/signingEngine/session/planning/operationIdBinding.js +0 -36
- package/dist/esm/core/signingEngine/session/postconditions/runtimePostconditions.js +0 -163
- package/dist/esm/core/signingEngine/session/public.js +0 -44
- package/dist/esm/core/signingEngine/session/routerAbSigningWalletSession.js +0 -119
- package/dist/esm/core/signingEngine/session/sealedRecovery/exactRecordLookup.js +0 -148
- package/dist/esm/core/signingEngine/session/sealedRecovery/recoveryRecord.js +0 -248
- package/dist/esm/core/signingEngine/session/sealedRecovery/restoreCoordinator.js +0 -229
- package/dist/esm/core/signingEngine/session/userPreferences.js +0 -212
- package/dist/esm/core/signingEngine/session/warmCapabilities/capabilityReader.js +0 -62
- package/dist/esm/core/signingEngine/session/warmCapabilities/capabilityReaderCore.js +0 -293
- package/dist/esm/core/signingEngine/session/warmCapabilities/clearVolatileWarmSigningMaterial.js +0 -44
- package/dist/esm/core/signingEngine/session/warmCapabilities/ecdsaBootstrapPersistence.js +0 -107
- package/dist/esm/core/signingEngine/session/warmCapabilities/ecdsaBootstrapQueue.js +0 -22
- package/dist/esm/core/signingEngine/session/warmCapabilities/ecdsaLoginPrefill.js +0 -93
- package/dist/esm/core/signingEngine/session/warmCapabilities/ecdsaLoginPrefillSigningMaterialSource.js +0 -50
- package/dist/esm/core/signingEngine/session/warmCapabilities/ecdsaProvisionPlan.js +0 -9
- package/dist/esm/core/signingEngine/session/warmCapabilities/ed25519SealedSessionRuntime.js +0 -251
- package/dist/esm/core/signingEngine/session/warmCapabilities/nearEd25519CapabilityRehydration.js +0 -98
- package/dist/esm/core/signingEngine/session/warmCapabilities/public.js +0 -31
- package/dist/esm/core/signingEngine/session/warmCapabilities/readModel.js +0 -155
- package/dist/esm/core/signingEngine/session/warmCapabilities/routerAbEd25519WalletSessionState.js +0 -256
- package/dist/esm/core/signingEngine/session/warmCapabilities/statusReader.js +0 -100
- package/dist/esm/core/signingEngine/session/warmCapabilities/transitions.js +0 -47
- package/dist/esm/core/signingEngine/session/warmCapabilities/types.js +0 -122
- package/dist/esm/core/signingEngine/session/warmCapabilities/volatileWarmMaterialCommands.js +0 -45
- package/dist/esm/core/signingEngine/stepUpConfirmation/channel/confirmCommon.js +0 -89
- package/dist/esm/core/signingEngine/stepUpConfirmation/channel/confirmTypes.js +0 -12
- package/dist/esm/core/signingEngine/stepUpConfirmation/otpPrompt/authLane.js +0 -31
- package/dist/esm/core/signingEngine/stepUpConfirmation/otpPrompt/exportAuthorization.js +0 -108
- package/dist/esm/core/signingEngine/stepUpConfirmation/passkeyPrompt/touchIdPrompt.js +0 -271
- package/dist/esm/core/signingEngine/stepUpConfirmation/passkeyPrompt/webauthnPromptCoordinator.js +0 -167
- package/dist/esm/core/signingEngine/stepUpConfirmation/userConfirmationType.js +0 -15
- package/dist/esm/core/signingEngine/threshold/crypto/ed25519YaoLaneWasm.js +0 -67
- package/dist/esm/core/signingEngine/threshold/ecdsa/activation.js +0 -267
- package/dist/esm/core/signingEngine/threshold/ecdsa/bootstrapSession.js +0 -115
- package/dist/esm/core/signingEngine/threshold/ecdsa/postRegistrationSessionActivation.js +0 -132
- package/dist/esm/core/signingEngine/threshold/ecdsa/signingQueue.js +0 -16
- package/dist/esm/core/signingEngine/threshold/ed25519/commitQueue.js +0 -16
- package/dist/esm/core/signingEngine/threshold/ed25519/connectSession.js +0 -137
- package/dist/esm/core/signingEngine/threshold/ed25519/yaoActiveClientRegistry.js +0 -146
- package/dist/esm/core/signingEngine/threshold/ed25519/yaoClient.js +0 -563
- package/dist/esm/core/signingEngine/threshold/ed25519/yaoPageLifecycleOwner.js +0 -23
- package/dist/esm/core/signingEngine/uiConfirm/PasskeyMpcExportManager.js +0 -233
- package/dist/esm/core/signingEngine/uiConfirm/PasskeyMpcSessionDurableState.js +0 -493
- package/dist/esm/core/signingEngine/uiConfirm/PasskeyMpcSessionManager.js +0 -746
- package/dist/esm/core/signingEngine/uiConfirm/UiConfirmManager.js +0 -599
- package/dist/esm/core/signingEngine/uiConfirm/confirmationReadinessRegistry.js +0 -41
- package/dist/esm/core/signingEngine/uiConfirm/exportConfirmRequest.js +0 -149
- package/dist/esm/core/signingEngine/uiConfirm/handlers/determineConfirmationConfig.js +0 -82
- package/dist/esm/core/signingEngine/uiConfirm/handlers/flowOrchestrator.js +0 -363
- package/dist/esm/core/signingEngine/uiConfirm/handlers/flows/adapters/adapters.js +0 -337
- package/dist/esm/core/signingEngine/uiConfirm/handlers/flows/adapters/request.js +0 -120
- package/dist/esm/core/signingEngine/uiConfirm/handlers/flows/localOnly.js +0 -149
- package/dist/esm/core/signingEngine/uiConfirm/handlers/flows/registration.js +0 -235
- package/dist/esm/core/signingEngine/uiConfirm/handlers/flows/requestRegistrationCredentialConfirmation.js +0 -178
- package/dist/esm/core/signingEngine/uiConfirm/handlers/flows/signing.js +0 -684
- package/dist/esm/core/signingEngine/uiConfirm/handlers/handlePromptFromWorker.js +0 -90
- package/dist/esm/core/signingEngine/uiConfirm/ui/appearance.js +0 -27
- package/dist/esm/core/signingEngine/uiConfirm/ui/confirm-ui.js +0 -516
- package/dist/esm/core/signingEngine/uiConfirm/ui/export-private-key-reveal.js +0 -155
- package/dist/esm/core/signingEngine/uiConfirm/ui/export-viewer-host.js +0 -207
- package/dist/esm/core/signingEngine/uiConfirm/ui/preact/ExportPrivateKeySurface.js +0 -318
- package/dist/esm/core/signingEngine/uiConfirm/ui/preact/RecoveryCodeBackupSurface.js +0 -518
- package/dist/esm/core/signingEngine/uiConfirm/ui/preact/confirmation-controller.js +0 -80
- package/dist/esm/core/signingEngine/uiConfirm/ui/preact/mountExportPrivateKeySurface.js +0 -86
- package/dist/esm/core/signingEngine/uiConfirm/ui/preact/mountRecoveryCodeBackupSurface.js +0 -82
- package/dist/esm/core/signingEngine/uiConfirm/ui/surface-measurement-binding.js +0 -12
- package/dist/esm/core/signingEngine/uiConfirm/ui/transaction-activity.js +0 -46
- package/dist/esm/core/signingEngine/uiConfirm/ui/transaction-display/abi/abiDecode.js +0 -315
- package/dist/esm/core/signingEngine/uiConfirm/ui/transaction-display/abi/enrichDisplayModelWithAbi.js +0 -77
- package/dist/esm/core/signingEngine/uiConfirm/ui/transaction-display/confirmation-tree.js +0 -27
- package/dist/esm/core/signingEngine/uiConfirm/ui/transaction-display/renderers/fallback.js +0 -52
- package/dist/esm/core/signingEngine/uiConfirm/ui/transaction-display/renderers/types.js +0 -62
- package/dist/esm/core/signingEngine/uiConfirm/ui/transaction-display/tree.js +0 -249
- package/dist/esm/core/signingEngine/uiConfirm/warmSessionUiConfirm.js +0 -65
- package/dist/esm/core/signingEngine/walletCustody/activateEd25519Capability.js +0 -122
- package/dist/esm/core/signingEngine/walletCustody/ceremonyActiveClientMetadata.js +0 -94
- package/dist/esm/core/signingEngine/walletCustody/ceremonyDriver.js +0 -171
- package/dist/esm/core/signingEngine/walletCustody/ceremonyStepRunner.js +0 -20
- package/dist/esm/core/signingEngine/walletCustody/ed25519ActiveClient.js +0 -100
- package/dist/esm/core/signingEngine/walletCustody/ed25519Projection.js +0 -32
- package/dist/esm/core/signingEngine/walletCustody/ed25519SeedMaterial.js +0 -92
- package/dist/esm/core/signingEngine/walletCustody/emailOtpLink.js +0 -132
- package/dist/esm/core/signingEngine/walletCustody/joinCustodyWire.js +0 -64
- package/dist/esm/core/signingEngine/walletCustody/openCustodyCache.js +0 -126
- package/dist/esm/core/signingEngine/walletCustody/passkeyLink.js +0 -180
- package/dist/esm/core/signingEngine/walletCustody/recoveryReplacementEnvelope.js +0 -60
- package/dist/esm/core/signingEngine/walletCustody/registrationCeremony.js +0 -460
- package/dist/esm/core/signingEngine/walletCustody/unlockedEd25519ExportRootCapability.js +0 -258
- package/dist/esm/core/signingEngine/walletCustody/walletRecoveryCredential.js +0 -23
- package/dist/esm/core/signingEngine/walletCustody/walletRecoveryEcdsa.js +0 -75
- package/dist/esm/core/signingEngine/walletCustody/walletRecoveryEd25519.js +0 -129
- package/dist/esm/core/signingEngine/walletCustody/walletRecoveryManifest.js +0 -178
- package/dist/esm/core/signingEngine/walletCustody/walletRecoveryRotation.js +0 -102
- package/dist/esm/core/signingEngine/webauthnAuth/credentials/collectAuthenticationCredentialForChallengeB64u.js +0 -154
- package/dist/esm/core/signingEngine/webauthnAuth/device/signerSlot.js +0 -25
- package/dist/esm/core/signingEngine/webauthnAuth/walletOriginWebAuthn.js +0 -109
- package/dist/esm/core/signingEngine/workerManager/SignerWorkerManager.js +0 -68
- package/dist/esm/core/signingEngine/workerManager/deviceLinkingPorts.js +0 -342
- package/dist/esm/core/signingEngine/workerManager/deviceLinkingSourceContribution.js +0 -158
- package/dist/esm/core/signingEngine/workerManager/ecdsaClientWorkerChannels.js +0 -13
- package/dist/esm/core/signingEngine/workerManager/ecdsaPresignLifecycle.js +0 -6
- package/dist/esm/core/signingEngine/workerManager/workerTransport.js +0 -734
- package/dist/esm/core/types/confirmationConfig.js +0 -39
- package/dist/esm/core/types/secure-confirm-worker.js +0 -22
- package/dist/esm/core/walletRuntimePaths/emailOtpWorker.js +0 -12
- package/dist/esm/core/walletRuntimePaths/multichainWorkers.js +0 -25
- package/dist/esm/core/walletRuntimePaths/walletCustodyCeremonyWorker.js +0 -18
- package/dist/esm/core/walletRuntimePaths/workers.js +0 -93
- package/dist/esm/react/context/useEagerPrewarm.js +0 -38
- package/dist/esm/sdk/ConfirmationDrawer-DrsREojk.js +0 -1
- package/dist/esm/sdk/EvmClient-DoxytQaJ.js +0 -1
- package/dist/esm/sdk/NearClient-vJ65Wjrq.js +0 -1
- package/dist/esm/sdk/NonceCoordinator-BBeadCSq.js +0 -1
- package/dist/esm/sdk/accountLifecycle-EyfYPnuT.js +0 -1
- package/dist/esm/sdk/actions-DZLxCcrU.js +0 -1
- package/dist/esm/sdk/adapters-DtAyuoiA.js +0 -2
- package/dist/esm/sdk/base-Xtd32asf.js +0 -1
- package/dist/esm/sdk/bytes-t5S5mkat.js +0 -1
- package/dist/esm/sdk/canonicalPrimitives-MPGET2cl.js +0 -1
- package/dist/esm/sdk/canonicalSignerErrorCode-C0hh_SVi.js +0 -1
- package/dist/esm/sdk/capabilityKinds-XaXXiD2B.js +0 -1
- package/dist/esm/sdk/chains-yAls2d9X.js +0 -1
- package/dist/esm/sdk/challengeDelivery-cAsaUC6U.js +0 -1
- package/dist/esm/sdk/configHelpers-CseiVoZD.js +0 -1
- package/dist/esm/sdk/csp-stylesheet-B1fAhrGB.js +0 -2
- package/dist/esm/sdk/defaultConfigs-CWpApkMq.js +0 -1
- package/dist/esm/sdk/display-jK7_hYho.js +0 -1
- package/dist/esm/sdk/domainIds-GDzjOs6i.js +0 -1
- package/dist/esm/sdk/ecdsaCapabilityManifest-CHFu-QrV.js +0 -1
- package/dist/esm/sdk/ecdsaChainTarget-CRcRR78w.js +0 -1
- package/dist/esm/sdk/ecdsaPresignLifecycle-CQnCxSlq.js +0 -1
- package/dist/esm/sdk/ecdsaPresignPoolIdentity-Ci-ovDlv.js +0 -1
- package/dist/esm/sdk/ecdsaWalletRecords-Cm1DdexN.js +0 -1
- package/dist/esm/sdk/enrichDisplayModelWithAbi-CR-4ebuU.js +0 -1
- package/dist/esm/sdk/evmCryptoWasm-CwEXiLrC.js +0 -1
- package/dist/esm/sdk/evmFamilyEcdsaIdentity-Br3iFdQx.js +0 -1
- package/dist/esm/sdk/exactSessionState-CjD8gekO.js +0 -210
- package/dist/esm/sdk/exactSigningLaneIdentity-olheZx_n.js +0 -1
- package/dist/esm/sdk/export-viewer-host-jo7h_0wl.js +0 -1
- package/dist/esm/sdk/helpers-D4QckQhq.js +0 -1
- package/dist/esm/sdk/host-BAqOYnju.js +0 -1
- package/dist/esm/sdk/intentDigest-CB6zy3lN.js +0 -1
- package/dist/esm/sdk/jsxRuntime.module-CoHsKD_3.js +0 -1
- package/dist/esm/sdk/keyMaterialBrands-uVZHfAh3.js +0 -1
- package/dist/esm/sdk/localOnly-DBQRG6Qh.js +0 -1
- package/dist/esm/sdk/messages-Cv2j4SKI.js +0 -1
- package/dist/esm/sdk/mountExportPrivateKeySurface-G7Z_9JMQ.js +0 -1
- package/dist/esm/sdk/mountRecoveryCodeBackupSurface-BBCTaQsu.js +0 -2
- package/dist/esm/sdk/nearEd25519YaoMaterialActivation-DQIw8ho3.js +0 -1
- package/dist/esm/sdk/nearEd25519YaoSigningPreparation-Bp_CvWRz.js +0 -1
- package/dist/esm/sdk/nearRpcResults--cBcfmp4.js +0 -1
- package/dist/esm/sdk/nonceLaneKeys-BBYi4g51.js +0 -1
- package/dist/esm/sdk/normalization-BGPR6osg.js +0 -1
- package/dist/esm/sdk/operationFingerprint-5-wH2Ht8.js +0 -1
- package/dist/esm/sdk/operationFingerprint-DtQb0pdp.js +0 -1
- package/dist/esm/sdk/passkey-custody-LP4UTFbn.js +0 -1
- package/dist/esm/sdk/pendingWalletRecoveryCodeBackup-BNk4ebsY.js +0 -1
- package/dist/esm/sdk/prfCache-Mbo7_USg.js +0 -1
- package/dist/esm/sdk/promptText-s8TQ6ckX.js +0 -1
- package/dist/esm/sdk/recovery-entrypoint-DkT8sFO5.js +0 -1
- package/dist/esm/sdk/registration-Btozh7uh.js +0 -1
- package/dist/esm/sdk/registration-CSAG_h4Y.js +0 -1
- package/dist/esm/sdk/registrationAccounts-DIeEVy6W.js +0 -1
- package/dist/esm/sdk/registrationIds-BIel5S0i.js +0 -1
- package/dist/esm/sdk/registrationIntent-DV1GYZ3K.js +0 -1
- package/dist/esm/sdk/registrationPreparationPreload-vOCqNuG4.js +0 -1
- package/dist/esm/sdk/registrationSignerPlan-FzD3TwxB.js +0 -1
- package/dist/esm/sdk/relayerHttp-DaPeS929.js +0 -1
- package/dist/esm/sdk/routePlan-B_KJaPtm.js +0 -1
- package/dist/esm/sdk/router-Dd3fFHk3.js +0 -1
- package/dist/esm/sdk/routerAbNormalSigning-D_fHjq5l.js +0 -1
- package/dist/esm/sdk/runtime-auth-B2M91rSx.js +0 -1
- package/dist/esm/sdk/runtime-device-link-ojjPSRaG.js +0 -1
- package/dist/esm/sdk/runtime-ecdsa-tempo-CE4JLgmn.js +0 -1
- package/dist/esm/sdk/runtime-email-otp-DDwtKVAe.js +0 -1
- package/dist/esm/sdk/runtime-export-JXYk8sQ-.js +0 -1
- package/dist/esm/sdk/runtime-near-BB8AG6dV.js +0 -1
- package/dist/esm/sdk/runtime-preferences-DKFZYccW.js +0 -1
- package/dist/esm/sdk/runtime-recovery-C_XjsDBg.js +0 -1
- package/dist/esm/sdk/runtime-recovery-codes-CWp839mH.js +0 -1
- package/dist/esm/sdk/runtimeContext-BpObgzbj.js +0 -6
- package/dist/esm/sdk/runtimeLoader-DjgBf_yF.js +0 -1
- package/dist/esm/sdk/sdkSentEvents-_RGAEeld.js +0 -1
- package/dist/esm/sdk/secp256k1-B_6W9QDJ.js +0 -1
- package/dist/esm/sdk/secureRandomId-CTdlJ5Mx.js +0 -1
- package/dist/esm/sdk/sessionPolicy-CNVK7nJ6.js +0 -1
- package/dist/esm/sdk/shared-j_KsFbCT.js +0 -1
- package/dist/esm/sdk/signEvmFamily-CcLVBm0f.js +0 -1
- package/dist/esm/sdk/signEvmFamilyWithUiConfirmForTempo-DgTbh6jX.js +0 -1
- package/dist/esm/sdk/signEvmWithUiConfirm-ChreN7aZ.js +0 -1
- package/dist/esm/sdk/signNear-mWbTE2Dl.js +0 -1
- package/dist/esm/sdk/signatureUses-CQkkUcwT.js +0 -1
- package/dist/esm/sdk/signerDomain-BhUTzDmF.js +0 -1
- package/dist/esm/sdk/signerLoader-By0IY24G.js +0 -1
- package/dist/esm/sdk/signingFlow-LUWrZi2d.js +0 -2
- package/dist/esm/sdk/signingSessionSeal-Mr2Xp44o.js +0 -1
- package/dist/esm/sdk/trace-M34pNGuF.js +0 -1
- package/dist/esm/sdk/transaction-activity-BbDod7ji.js +0 -1
- package/dist/esm/sdk/transactionReview-CBE5oH4c.js +0 -1
- package/dist/esm/sdk/transactionReviewAdmission-0ZgWs6q3.js +0 -1
- package/dist/esm/sdk/transactionState-9d7f3xVj.js +0 -1
- package/dist/esm/sdk/types-M7vxrYtJ.js +0 -1
- package/dist/esm/sdk/validation-dC1-_uyG.js +0 -1
- package/dist/esm/sdk/wallet-recovery-CcDZ1hMH.js +0 -1
- package/dist/esm/sdk/walletAuthority-CoWSeqvQ.js +0 -1
- package/dist/esm/sdk/walletCustodyEcdsaContinuity-B7xi7nwh.js +0 -1
- package/dist/esm/sdk/walletIframeIdentity-C0b0XMQF.js +0 -1
- package/dist/esm/sdk/walletRecoveryCommit-ljxVeo-d.js +0 -1
- package/dist/esm/sdk/walletRecoveryRotate-HztDcDaY.js +0 -1
- package/dist/esm/sdk/warmSessionHydration-BPGM0YRU.js +0 -1
- package/dist/esm/sdk/webauthnP256-qu06GNFm.js +0 -1
- package/dist/esm/sdk/webauthnPromptCoordinator-DO-qfECu.js +0 -1
- package/dist/esm/shared-ts/src/authorization/walletCustodyOperation.js +0 -16
- package/dist/esm/shared-ts/src/device-linking/contracts.js +0 -8
- package/dist/esm/shared-ts/src/device-linking/ed25519ExportRoot.js +0 -167
- package/dist/esm/shared-ts/src/passkey-custody/ceremonyCommitPayload.js +0 -43
- package/dist/esm/shared-ts/src/signing-lanes/participants.js +0 -256
- package/dist/esm/shared-ts/src/signing-lanes/recordParsers.js +0 -479
- package/dist/esm/shared-ts/src/threshold/secp256k1.js +0 -6
- package/dist/esm/shared-ts/src/utils/addAuthMethodRegistration.js +0 -103
- package/dist/esm/shared-ts/src/utils/ecdsaKeyFactsInventory.js +0 -43
- package/dist/esm/shared-ts/src/utils/exactKeys.js +0 -17
- package/dist/esm/shared-ts/src/utils/routerAbTraceContext.js +0 -36
- package/dist/esm/shared-ts/src/utils/walletAddSignerActivation.js +0 -32
- package/dist/public/sdk/ConfirmationDrawer-DrsREojk.js +0 -1
- package/dist/public/sdk/EvmClient-DoxytQaJ.js +0 -1
- package/dist/public/sdk/NearClient-vJ65Wjrq.js +0 -1
- package/dist/public/sdk/NonceCoordinator-BBeadCSq.js +0 -1
- package/dist/public/sdk/accountLifecycle-EyfYPnuT.js +0 -1
- package/dist/public/sdk/actions-DZLxCcrU.js +0 -1
- package/dist/public/sdk/adapters-DtAyuoiA.js +0 -2
- package/dist/public/sdk/base-Xtd32asf.js +0 -1
- package/dist/public/sdk/bytes-t5S5mkat.js +0 -1
- package/dist/public/sdk/canonicalPrimitives-MPGET2cl.js +0 -1
- package/dist/public/sdk/canonicalSignerErrorCode-C0hh_SVi.js +0 -1
- package/dist/public/sdk/capabilityKinds-XaXXiD2B.js +0 -1
- package/dist/public/sdk/chains-yAls2d9X.js +0 -1
- package/dist/public/sdk/challengeDelivery-cAsaUC6U.js +0 -1
- package/dist/public/sdk/configHelpers-CseiVoZD.js +0 -1
- package/dist/public/sdk/csp-stylesheet-B1fAhrGB.js +0 -2
- package/dist/public/sdk/defaultConfigs-CWpApkMq.js +0 -1
- package/dist/public/sdk/display-jK7_hYho.js +0 -1
- package/dist/public/sdk/domainIds-GDzjOs6i.js +0 -1
- package/dist/public/sdk/ecdsaCapabilityManifest-CHFu-QrV.js +0 -1
- package/dist/public/sdk/ecdsaChainTarget-CRcRR78w.js +0 -1
- package/dist/public/sdk/ecdsaPresignLifecycle-CQnCxSlq.js +0 -1
- package/dist/public/sdk/ecdsaPresignPoolIdentity-Ci-ovDlv.js +0 -1
- package/dist/public/sdk/ecdsaWalletRecords-Cm1DdexN.js +0 -1
- package/dist/public/sdk/enrichDisplayModelWithAbi-CR-4ebuU.js +0 -1
- package/dist/public/sdk/evmCryptoWasm-CwEXiLrC.js +0 -1
- package/dist/public/sdk/evmFamilyEcdsaIdentity-Br3iFdQx.js +0 -1
- package/dist/public/sdk/exactSessionState-CjD8gekO.js +0 -210
- package/dist/public/sdk/exactSigningLaneIdentity-olheZx_n.js +0 -1
- package/dist/public/sdk/export-viewer-host-jo7h_0wl.js +0 -1
- package/dist/public/sdk/helpers-D4QckQhq.js +0 -1
- package/dist/public/sdk/host-BAqOYnju.js +0 -1
- package/dist/public/sdk/intentDigest-CB6zy3lN.js +0 -1
- package/dist/public/sdk/jsxRuntime.module-CoHsKD_3.js +0 -1
- package/dist/public/sdk/keyMaterialBrands-uVZHfAh3.js +0 -1
- package/dist/public/sdk/localOnly-DBQRG6Qh.js +0 -1
- package/dist/public/sdk/messages-Cv2j4SKI.js +0 -1
- package/dist/public/sdk/mountExportPrivateKeySurface-G7Z_9JMQ.js +0 -1
- package/dist/public/sdk/mountRecoveryCodeBackupSurface-BBCTaQsu.js +0 -2
- package/dist/public/sdk/nearEd25519YaoMaterialActivation-DQIw8ho3.js +0 -1
- package/dist/public/sdk/nearEd25519YaoSigningPreparation-Bp_CvWRz.js +0 -1
- package/dist/public/sdk/nearRpcResults--cBcfmp4.js +0 -1
- package/dist/public/sdk/nonceLaneKeys-BBYi4g51.js +0 -1
- package/dist/public/sdk/normalization-BGPR6osg.js +0 -1
- package/dist/public/sdk/operationFingerprint-5-wH2Ht8.js +0 -1
- package/dist/public/sdk/operationFingerprint-DtQb0pdp.js +0 -1
- package/dist/public/sdk/passkey-custody-LP4UTFbn.js +0 -1
- package/dist/public/sdk/pendingWalletRecoveryCodeBackup-BNk4ebsY.js +0 -1
- package/dist/public/sdk/prfCache-Mbo7_USg.js +0 -1
- package/dist/public/sdk/promptText-s8TQ6ckX.js +0 -1
- package/dist/public/sdk/recovery-entrypoint-DkT8sFO5.js +0 -1
- package/dist/public/sdk/registration-Btozh7uh.js +0 -1
- package/dist/public/sdk/registration-CSAG_h4Y.js +0 -1
- package/dist/public/sdk/registrationAccounts-DIeEVy6W.js +0 -1
- package/dist/public/sdk/registrationIds-BIel5S0i.js +0 -1
- package/dist/public/sdk/registrationIntent-DV1GYZ3K.js +0 -1
- package/dist/public/sdk/registrationPreparationPreload-vOCqNuG4.js +0 -1
- package/dist/public/sdk/registrationSignerPlan-FzD3TwxB.js +0 -1
- package/dist/public/sdk/relayerHttp-DaPeS929.js +0 -1
- package/dist/public/sdk/routePlan-B_KJaPtm.js +0 -1
- package/dist/public/sdk/router-Dd3fFHk3.js +0 -1
- package/dist/public/sdk/routerAbNormalSigning-D_fHjq5l.js +0 -1
- package/dist/public/sdk/runtime-auth-B2M91rSx.js +0 -1
- package/dist/public/sdk/runtime-device-link-ojjPSRaG.js +0 -1
- package/dist/public/sdk/runtime-ecdsa-tempo-CE4JLgmn.js +0 -1
- package/dist/public/sdk/runtime-email-otp-DDwtKVAe.js +0 -1
- package/dist/public/sdk/runtime-export-JXYk8sQ-.js +0 -1
- package/dist/public/sdk/runtime-near-BB8AG6dV.js +0 -1
- package/dist/public/sdk/runtime-preferences-DKFZYccW.js +0 -1
- package/dist/public/sdk/runtime-recovery-C_XjsDBg.js +0 -1
- package/dist/public/sdk/runtime-recovery-codes-CWp839mH.js +0 -1
- package/dist/public/sdk/runtimeContext-BpObgzbj.js +0 -6
- package/dist/public/sdk/runtimeLoader-DjgBf_yF.js +0 -1
- package/dist/public/sdk/sdkSentEvents-_RGAEeld.js +0 -1
- package/dist/public/sdk/secp256k1-B_6W9QDJ.js +0 -1
- package/dist/public/sdk/secureRandomId-CTdlJ5Mx.js +0 -1
- package/dist/public/sdk/sessionPolicy-CNVK7nJ6.js +0 -1
- package/dist/public/sdk/shared-j_KsFbCT.js +0 -1
- package/dist/public/sdk/signEvmFamily-CcLVBm0f.js +0 -1
- package/dist/public/sdk/signEvmFamilyWithUiConfirmForTempo-DgTbh6jX.js +0 -1
- package/dist/public/sdk/signEvmWithUiConfirm-ChreN7aZ.js +0 -1
- package/dist/public/sdk/signNear-mWbTE2Dl.js +0 -1
- package/dist/public/sdk/signatureUses-CQkkUcwT.js +0 -1
- package/dist/public/sdk/signerDomain-BhUTzDmF.js +0 -1
- package/dist/public/sdk/signerLoader-By0IY24G.js +0 -1
- package/dist/public/sdk/signingFlow-LUWrZi2d.js +0 -2
- package/dist/public/sdk/signingSessionSeal-Mr2Xp44o.js +0 -1
- package/dist/public/sdk/trace-M34pNGuF.js +0 -1
- package/dist/public/sdk/transaction-activity-BbDod7ji.js +0 -1
- package/dist/public/sdk/transactionReview-CBE5oH4c.js +0 -1
- package/dist/public/sdk/transactionReviewAdmission-0ZgWs6q3.js +0 -1
- package/dist/public/sdk/transactionState-9d7f3xVj.js +0 -1
- package/dist/public/sdk/types-M7vxrYtJ.js +0 -1
- package/dist/public/sdk/validation-dC1-_uyG.js +0 -1
- package/dist/public/sdk/wallet-recovery-CcDZ1hMH.js +0 -1
- package/dist/public/sdk/walletAuthority-CoWSeqvQ.js +0 -1
- package/dist/public/sdk/walletCustodyEcdsaContinuity-B7xi7nwh.js +0 -1
- package/dist/public/sdk/walletIframeIdentity-C0b0XMQF.js +0 -1
- package/dist/public/sdk/walletRecoveryCommit-ljxVeo-d.js +0 -1
- package/dist/public/sdk/walletRecoveryRotate-HztDcDaY.js +0 -1
- package/dist/public/sdk/warmSessionHydration-BPGM0YRU.js +0 -1
- package/dist/public/sdk/webauthnP256-qu06GNFm.js +0 -1
- package/dist/public/sdk/webauthnPromptCoordinator-DO-qfECu.js +0 -1
- package/dist/public/sdk/workers/evm_crypto.wasm +0 -0
- package/dist/public/sdk/workers/near_signer.wasm +0 -0
- package/dist/public/sdk/workers/tempo_signer.wasm +0 -0
- package/dist/types/wallet/src/SeamsWeb/assembly/browserWorkerWarmupPolicy.d.ts +0 -4
- package/dist/types/wallet/src/SeamsWeb/assembly/configureBrowserIndexedDB.d.ts +0 -3
- package/dist/types/wallet/src/SeamsWeb/operations/auth/walletAuth.d.ts +0 -56
- package/dist/types/wallet/src/SeamsWeb/operations/evm/index.d.ts +0 -9
- package/dist/types/wallet/src/SeamsWeb/operations/near/index.d.ts +0 -11
- package/dist/types/wallet/src/SeamsWeb/operations/recovery/accountSync.d.ts +0 -19
- package/dist/types/wallet/src/SeamsWeb/publicApi/awaitNearReady.d.ts +0 -27
- package/dist/types/wallet/src/SeamsWeb/publicApi/devices.typecheck.d.ts +0 -2
- package/dist/types/wallet/src/SeamsWeb/publicApi/preferences.d.ts +0 -8
- package/dist/types/wallet/src/SeamsWeb/publicApi/recovery.d.ts +0 -14
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/config-guards.d.ts +0 -15
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/registrationPreparationPreload.d.ts +0 -2
- package/dist/types/wallet/src/core/signingEngine/flows/registration/public.d.ts +0 -68
- package/dist/types/wallet/src/react/context/useEagerPrewarm.d.ts +0 -3
- package/dist/workers/evm_crypto.wasm +0 -0
- package/dist/workers/near_signer.wasm +0 -0
- package/dist/workers/tempo_signer.wasm +0 -0
- /package/dist/esm/sdk/{accountIds-C3Ihsd2c.js → accountIds-BzZs7YoX.js} +0 -0
- /package/dist/esm/sdk/{base64-ojm5DKcF.js → base64-CsEj-_bC.js} +0 -0
- /package/dist/esm/sdk/{browser-CsOGMbMy.js → browser-D4wUl_77.js} +0 -0
- /package/dist/esm/sdk/{errors-DfbnsXjO.js → errors-BZO3LF6G.js} +0 -0
- /package/dist/esm/sdk/{events-BJyVcnsn.js → events-DsQJQ0Cl.js} +0 -0
- /package/dist/esm/sdk/{executeWorkerOperation-CrFf3FkL.js → executeWorkerOperation-BInr8RYN.js} +0 -0
- /package/dist/esm/sdk/{jsonRpc-C85RYR0A.js → jsonRpc-DrCYQIM9.js} +0 -0
- /package/dist/esm/sdk/{keccak-zexutGfG.js → keccak-B02Fekdh.js} +0 -0
- /package/dist/esm/sdk/{profileAccountProjection-DHCaMtOu.js → profileAccountProjection-DmmfMood.js} +0 -0
- /package/dist/esm/sdk/{signerSlot-BQ1g5JNV.js → signerSlot-Dto7dObP.js} +0 -0
- /package/dist/esm/sdk/{surface-measurement-reporter-OICExWKE.js → surface-measurement-reporter-IlPOI3QK.js} +0 -0
- /package/dist/public/sdk/{accountIds-C3Ihsd2c.js → accountIds-BzZs7YoX.js} +0 -0
- /package/dist/public/sdk/{base64-ojm5DKcF.js → base64-CsEj-_bC.js} +0 -0
- /package/dist/public/sdk/{browser-CsOGMbMy.js → browser-D4wUl_77.js} +0 -0
- /package/dist/public/sdk/{errors-DfbnsXjO.js → errors-BZO3LF6G.js} +0 -0
- /package/dist/public/sdk/{events-BJyVcnsn.js → events-DsQJQ0Cl.js} +0 -0
- /package/dist/public/sdk/{executeWorkerOperation-CrFf3FkL.js → executeWorkerOperation-BInr8RYN.js} +0 -0
- /package/dist/public/sdk/{jsonRpc-C85RYR0A.js → jsonRpc-DrCYQIM9.js} +0 -0
- /package/dist/public/sdk/{keccak-zexutGfG.js → keccak-B02Fekdh.js} +0 -0
- /package/dist/public/sdk/{profileAccountProjection-DHCaMtOu.js → profileAccountProjection-DmmfMood.js} +0 -0
- /package/dist/public/sdk/{signerSlot-BQ1g5JNV.js → signerSlot-Dto7dObP.js} +0 -0
- /package/dist/public/sdk/{surface-measurement-reporter-OICExWKE.js → surface-measurement-reporter-IlPOI3QK.js} +0 -0
|
@@ -1,3818 +0,0 @@
|
|
|
1
|
-
import { parseThresholdEd25519SessionId, parseWalletAuthMethodId, parseWebAuthnCredentialIdB64u } from "../../../shared-ts/src/utils/domainIds.js";
|
|
2
|
-
import { isObject } from "../../../shared-ts/src/utils/validation.js";
|
|
3
|
-
import { base64UrlDecode, base64UrlEncode } from "../../../shared-ts/src/utils/base64.js";
|
|
4
|
-
import { alphabetizeStringify, sha256BytesUtf8, sha256HexUtf8 } from "../../../shared-ts/src/utils/digests.js";
|
|
5
|
-
import { parseCorrelationId, parseDigestB64u, parseIsoTimestamp } from "../../../shared-ts/src/utils/canonicalPrimitives.js";
|
|
6
|
-
import { walletSessionPreservesCapabilities } from "../../../shared-ts/src/device-linking/activeWalletSession.js";
|
|
7
|
-
import { WalletSessionStatusReadScope } from "../../../core/rpcClients/relayer/walletSessionAuthorizationStatus.js";
|
|
8
|
-
import { base58Encode } from "../../../shared-ts/src/utils/base58.js";
|
|
9
|
-
import { deriveImplicitNearAccountIdFromEd25519PublicKey } from "../../../shared-ts/src/utils/near.js";
|
|
10
|
-
import { toAccountId } from "../../../core/types/accountIds.js";
|
|
11
|
-
import { RegistrationEventPhase, createRegistrationFlowEvent } from "../../../core/types/sdkSentEvents.js";
|
|
12
|
-
import { publishNearProvisioningState, runSingleFlightNearProvisioning } from "../../../core/signingEngine/flows/registration/nearProvisioningRegistry.js";
|
|
13
|
-
import { parseNearEd25519SigningKeyId, walletIdFromString } from "../../../shared-ts/src/utils/registrationIds.js";
|
|
14
|
-
import { thresholdEcdsaChainTargetFromChainFamily, toWalletId } from "../../../core/signingEngine/interfaces/ecdsaChainTarget.js";
|
|
15
|
-
import { normalizeRuntimePolicyScope } from "../../../shared-ts/src/threshold/signingRootScope.js";
|
|
16
|
-
import { requireEvmFamilySigningKeySlotId } from "../../../shared-ts/src/signing-lanes/evmFamilySigningKeySlotId.js";
|
|
17
|
-
import "../../../shared-ts/src/signing-lanes/index.js";
|
|
18
|
-
import { toParticipantId, toRpId } from "../../../core/signingEngine/session/identity/evmFamilyEcdsaIdentity.js";
|
|
19
|
-
import { nearEd25519SignerBindingFromBoundaryFields } from "../../../core/signingEngine/session/identity/exactSigningLaneIdentity.js";
|
|
20
|
-
import { buildEmailOtpEnvelopeFactor, buildPasskeyEnvelopeFactor } from "../../../shared-ts/src/passkey-custody/custodyEnvelope.js";
|
|
21
|
-
import { walletCustodyCommitPayloadWithRecoveryBackupAcknowledgement } from "../../../shared-ts/src/passkey-custody/ceremonyCommitPayload.js";
|
|
22
|
-
import "../../../shared-ts/src/passkey-custody/index.js";
|
|
23
|
-
import { recordWalletCustodyTiming } from "../../../core/signingEngine/walletCustody/ceremonyDriver.js";
|
|
24
|
-
import { joinCustodyJsonFromEstablishedCommitPayload, walletCustodyCommitPayloadForWire } from "../../../core/signingEngine/walletCustody/registrationCeremony.js";
|
|
25
|
-
import { ROUTER_AB_ED25519_YAO_EMAIL_OTP_RECOVERY_BOOTSTRAP_KIND_V1, sameRouterAbEd25519YaoRegistrationAdmissionRequestV1 } from "../../../shared-ts/src/utils/routerAbEd25519Yao.js";
|
|
26
|
-
import { redactCredentialExtensionOutputs } from "../../../core/signingEngine/webauthnAuth/credentials/credentialExtensions.js";
|
|
27
|
-
import { createRouterAbTraceContextV1 } from "../../../shared-ts/src/utils/routerAbTraceContext.js";
|
|
28
|
-
import { RouterAbEd25519YaoClientV1 } from "../../../core/signingEngine/threshold/ed25519/yaoClient.js";
|
|
29
|
-
import { parseSdkEcdsaDerivationSigningRootId, parseSdkEcdsaDerivationSigningRootVersion } from "../../../shared-ts/src/threshold/ecdsaDerivationRoleLocalBootstrap.js";
|
|
30
|
-
import { parseEcdsaRelayerKeyId } from "../../../shared-ts/src/threshold/keyMaterialBrands.js";
|
|
31
|
-
import { parseEcdsaClientVerifyingPublicKey33B64u, parseEcdsaRoleLocalBindingDigest, parseEcdsaThresholdKeyId } from "../../../core/signingEngine/session/keyMaterialBrands.js";
|
|
32
|
-
import { buildEmailOtpWalletAuthAuthority, parseEmailOtpWalletAuthAuthority, walletAuthAuthorityRef } from "../../../shared-ts/src/utils/walletAuthAuthority.js";
|
|
33
|
-
import { parseCanonicalEcdsaServerActivationRequest } from "../../../shared-ts/src/utils/ecdsaCapabilityActivation.js";
|
|
34
|
-
import { parseRouterAbEcdsaVerifiedClientActivationFactsV1 } from "../../../shared-ts/src/utils/routerAbEcdsaDerivation.js";
|
|
35
|
-
import { buildRecoveredCustodyEnvelopeRecord } from "../../../core/signingEngine/walletCustody/recoveryReplacementEnvelope.js";
|
|
36
|
-
import { WALLET_CUSTODY_ED25519_MATERIAL_KEY_KIND } from "../../../core/indexedDB/walletCustodyEd25519MaterialRecord.js";
|
|
37
|
-
import { getUserFriendlyErrorMessage } from "../../../shared-ts/src/utils/errors.js";
|
|
38
|
-
import { findRegistrationSignerPlanEvmFamilyEcdsaBranch, findRegistrationSignerPlanNearEd25519Branch, registrationSignerPlanFromSelection } from "../../../shared-ts/src/utils/registrationSignerPlan.js";
|
|
39
|
-
import { planPendingNearRegistration, preparePendingNearRegistration } from "../../../core/indexedDB/pendingWalletRegistrationCommit.js";
|
|
40
|
-
import { walletSessionAuthorizations } from "../../../core/indexedDB/seamsWalletDB/walletSessionAuthorizationStore.js";
|
|
41
|
-
import { nearEd25519YaoMaterialActivationFromMetadata } from "../../../core/signingEngine/session/material/nearEd25519YaoMaterialActivation.js";
|
|
42
|
-
import { activateWalletRegistration, completeWalletRegistrationNearProvisioning, createWalletAddSignerIntent, finalizeWalletAddSigner, isEmailOtpWalletRegistrationFinalizeResponse, parseWalletRegistrationEcdsaDerivationRespond, respondWalletRegistration, setupWalletRegistration, startWalletAddSigner } from "../../../core/rpcClients/relayer/walletRegistration.js";
|
|
43
|
-
import { buildEmailOtpAuthContext, emailOtpAuthContextEmailHashHex, emailOtpAuthContextProvider, emailOtpAuthContextProviderUserId } from "../../../core/signingEngine/session/identity/laneIdentity.js";
|
|
44
|
-
import { persistPasskeyEd25519YaoSignerMaterialV1 } from "../../../core/signingEngine/session/passkey/ed25519YaoLocalMaterial.js";
|
|
45
|
-
import { IndexedDBManager } from "../../../core/indexedDB/index.js";
|
|
46
|
-
import { prepareWalletEcdsaRegistrationPublication, prepareWalletEd25519RegistrationPublication, prepareWalletEmailOtpEd25519RegistrationPublication } from "../../../core/signingEngine/flows/registration/accountLifecycle.js";
|
|
47
|
-
import { computeAddSignerIntentDigest } from "../../../utils/intentDigest.js";
|
|
48
|
-
import { establishUnlockedWalletEd25519ExportRootCapabilityV1, walletCustodyCeremonyTransportFromWorkerContextV1 } from "../../../core/signingEngine/walletCustody/unlockedEd25519ExportRootCapability.js";
|
|
49
|
-
import { rememberPasskeyCustodySessionEnvelope } from "../../../core/signingEngine/session/passkey/passkeyCustodySessionCache.js";
|
|
50
|
-
import { listConfiguredThresholdEcdsaPublicationTargets } from "../session/thresholdEcdsaProvisioning.js";
|
|
51
|
-
import { openWalletCustodyEd25519ActiveClientV1, walletCustodyCacheEnvelopeFromRecordV1 } from "../../../core/signingEngine/walletCustody/openCustodyCache.js";
|
|
52
|
-
import { RegistrationTimingRecorder, assertNever, createFailedRegistrationTimingSummary, createSucceededRegistrationTimingSummary, emitNearRegistrationTiming, emitRegistrationTimingSpan, emitRegistrationTimingSummary, recordRegistrationServerTimingBuckets, recordStrictEcdsaServerTimingBuckets, registrationTimingSignerSetFromPlan, roundDurationMs, zeroEmailOtpYaoPrewarmDiagnostics } from "./registrationTiming.js";
|
|
53
|
-
import { joinCustodyWireFromEnvelopeRecord } from "../../../core/signingEngine/walletCustody/joinCustodyWire.js";
|
|
54
|
-
import { buildStrictRegistrationClientBootstrap, closeStrictEcdsaRegistrationCeremony, finalizeStrictEcdsaFamilyLocalActivation, measureStrictEcdsaCeremonyStep, registrationRouteHeaders, requireIssuedRegistrationEstablishedSession, runStrictEcdsaFamilyCeremony } from "./registrationStrictEcdsa.js";
|
|
55
|
-
import { admitDeferredNearRegistration, buildRegistrationEmailOtpEd25519SessionState, buildRegistrationPasskeyEd25519SessionHydration, passkeyWalletAuthAuthorityFromCredential, registrationEd25519MaterialFacts, requireEd25519YaoRegistrationPublicResultMatches, requireEmailOtpEd25519YaoRegistrationPublicResultMatches, requireEmailOtpRegistrationEnrollmentMaterial, requirePasskeyRegistrationIntent } from "./registrationEd25519Yao.js";
|
|
56
|
-
import { requirePasskeyPrfFirstB64u } from "../authMethods/passkey/ecdsaBootstrap.js";
|
|
57
|
-
import { registrationProjectionFromPending, restorePendingNearRegistrationMaterial } from "./pendingRegistrationRecovery.js";
|
|
58
|
-
import { scheduleEcdsaSessionPresignaturePrefill } from "../auth/scheduleEcdsaSessionPresignaturePrefill.js";
|
|
59
|
-
import { resolveManagedRuntimeScopeBootstrap } from "../../../core/config/managedRuntimeScope.js";
|
|
60
|
-
import { exactPasskeyWalletAuthAuthorityRefForCredential } from "../authMethods/passkey/exactPasskeyAuthority.js";
|
|
61
|
-
import { collectPasskeyRegistrationAuthority } from "../authMethods/passkey/registrationAuthority.js";
|
|
62
|
-
import { showWalletRecoveryCodeBackupUi } from "../recovery/walletRecoveryCodeBackup.js";
|
|
63
|
-
import { pendingWalletRecoveryCodeBackupRepository } from "../../../core/indexedDB/seamsWalletDB/pendingWalletRecoveryCodeBackup.js";
|
|
64
|
-
import { registrationFinalizeIdempotencyKeyFromString } from "../../publicApi/types.js";
|
|
65
|
-
import { collectEmailOtpRegistrationAuthority } from "../authMethods/emailOtp/registrationAuthority.js";
|
|
66
|
-
import { admitVerifiedPasskeyEd25519YaoAddSignerV1 } from "../../../core/signingEngine/flows/registration/services/passkeyEd25519YaoAddSigner.js";
|
|
67
|
-
import { buildPendingRegistrationCommit, buildRegistrationPersistenceAuth, buildRegistrationPersistenceEcdsa, buildRegistrationPersistencePlan, commitRegistrationPersistencePlan, finalizeRegistrationEcdsaSessions, finalizeResponseViewFromActivatedEcdsa, requireFinalizedPasskeyCredentialPublicKeyB64u, requireWebAuthnRpId } from "./registrationTerminalCommit.js";
|
|
68
|
-
//#region src/SeamsWeb/operations/registration/registration.ts
|
|
69
|
-
async function confirmWalletRecoveryCodesBackedUp(context, walletId, backup, recoveryCodes) {
|
|
70
|
-
if (recoveryCodes.length !== 10 || new Set(recoveryCodes).size !== 10) throw new Error("Wallet custody must issue exactly ten distinct recovery codes");
|
|
71
|
-
switch ((await resolveRegistrationRecoveryCodeBackup({
|
|
72
|
-
backup,
|
|
73
|
-
context,
|
|
74
|
-
request: {
|
|
75
|
-
kind: "wallet_recovery_code_backup_request_v1",
|
|
76
|
-
walletId,
|
|
77
|
-
recoveryCodes,
|
|
78
|
-
continuation: "registration_may_defer"
|
|
79
|
-
}
|
|
80
|
-
}))?.kind) {
|
|
81
|
-
case "wallet_recovery_codes_backed_up_v1": return;
|
|
82
|
-
case "wallet_recovery_code_backup_deferred_v1":
|
|
83
|
-
await pendingWalletRecoveryCodeBackupRepository.write({
|
|
84
|
-
walletId,
|
|
85
|
-
recoveryCodes
|
|
86
|
-
});
|
|
87
|
-
return;
|
|
88
|
-
default: throw new Error("Wallet recovery-code backup result is invalid");
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
async function resolveRegistrationRecoveryCodeBackup(input) {
|
|
92
|
-
if (!input.backup) return { kind: "wallet_recovery_code_backup_deferred_v1" };
|
|
93
|
-
switch (input.backup.kind) {
|
|
94
|
-
case "defer_to_account_menu": return { kind: "wallet_recovery_code_backup_deferred_v1" };
|
|
95
|
-
case "show_builtin_dialog": return await showWalletRecoveryCodeBackupUi(input.request, input.context.signingEngine.getWalletIframeSurfaceMeasurementBinding());
|
|
96
|
-
case "custom_handler": return await input.backup.handler(input.request);
|
|
97
|
-
default: return assertNever(input.backup);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
function zeroizeArrayBuffer(buffer) {
|
|
101
|
-
if (buffer.byteLength > 0) new Uint8Array(buffer).fill(0);
|
|
102
|
-
}
|
|
103
|
-
function walletCustodyRegistrationMaterial(args) {
|
|
104
|
-
const metadata = args.established.metadata;
|
|
105
|
-
return {
|
|
106
|
-
binding: {
|
|
107
|
-
kind: WALLET_CUSTODY_ED25519_MATERIAL_KEY_KIND,
|
|
108
|
-
applicationBindingDigestB64u: args.established.localMaterial.applicationBindingDigestB64u,
|
|
109
|
-
registeredPublicKeyB64u: base64UrlEncode(metadata.registeredPublicKey),
|
|
110
|
-
participantIds: metadata.participantIds,
|
|
111
|
-
stateEpoch: String(metadata.stateEpoch),
|
|
112
|
-
walletId: args.walletId,
|
|
113
|
-
nearAccountId: args.nearAccountId,
|
|
114
|
-
nearEd25519SigningKeyId: args.nearEd25519SigningKeyId,
|
|
115
|
-
signerSlot: args.signerSlot,
|
|
116
|
-
signingWorkerId: metadata.scope.signing_worker_id,
|
|
117
|
-
signingWorkerVerifyingShareB64u: base64UrlEncode(metadata.signingWorkerVerifyingShare)
|
|
118
|
-
},
|
|
119
|
-
sealed: {
|
|
120
|
-
ciphertextB64u: args.established.localMaterial.b64u,
|
|
121
|
-
nonceB64u: args.established.localMaterial.nonceB64u
|
|
122
|
-
}
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
function pendingRegistrationEd25519MetadataFromJoined(joined) {
|
|
126
|
-
const metadata = joined.metadata;
|
|
127
|
-
return {
|
|
128
|
-
materialActivation: nearEd25519YaoMaterialActivationFromMetadata(metadata),
|
|
129
|
-
registeredPublicKeyB64u: base64UrlEncode(metadata.registeredPublicKey),
|
|
130
|
-
signingWorkerVerifyingShareB64u: base64UrlEncode(metadata.signingWorkerVerifyingShare),
|
|
131
|
-
stateEpoch: String(metadata.stateEpoch),
|
|
132
|
-
signingWorkerId: metadata.scope.signing_worker_id,
|
|
133
|
-
participantIds: metadata.participantIds,
|
|
134
|
-
nearEd25519SigningKeyId: metadata.applicationBinding.near_ed25519_signing_key_id,
|
|
135
|
-
signerSlot: metadata.applicationBinding.key_creation_signer_slot
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
function walletCustodyCacheEnvelopeFromRegistrationCommit(commit) {
|
|
139
|
-
const established = commit.establishedCustody;
|
|
140
|
-
if (!established) throw new Error("Mixed registration custody commit is missing its established envelope");
|
|
141
|
-
return {
|
|
142
|
-
bindingJson: established.envelopeBindingJson,
|
|
143
|
-
nonceB64u: established.envelopeNonceB64u,
|
|
144
|
-
ciphertextB64u: established.sealedCustodySecretB64u,
|
|
145
|
-
aadHashB64u: established.envelopeAadHashB64u,
|
|
146
|
-
ciphertextDigestB64u: established.envelopeCiphertextDigestB64u
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
function custodyEnvelopeFromRegistrationCommit(args) {
|
|
150
|
-
const established = args.commit.establishedCustody;
|
|
151
|
-
if (!established) throw new Error("Passkey registration custody commit is missing its established envelope");
|
|
152
|
-
return buildRecoveredCustodyEnvelopeRecord({
|
|
153
|
-
expectedWalletId: args.walletId,
|
|
154
|
-
replacement: established,
|
|
155
|
-
activatedAtMs: args.activatedAtMs
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
async function establishPasskeyRegistrationEd25519ExportRootCapability(args) {
|
|
159
|
-
await args.signingEngine.establishUnlockedWalletEd25519ExportRootCapabilityV1({
|
|
160
|
-
existingEnvelope: custodyEnvelopeFromRegistrationCommit({
|
|
161
|
-
commit: args.commit,
|
|
162
|
-
walletId: args.walletId,
|
|
163
|
-
activatedAtMs: Date.now()
|
|
164
|
-
}),
|
|
165
|
-
passkeyPrfFirstB64u: args.passkeyPrfFirstB64u,
|
|
166
|
-
walletId: args.walletId,
|
|
167
|
-
walletAuthMethodId: args.walletAuthMethodId,
|
|
168
|
-
walletSessionId: args.walletSessionId,
|
|
169
|
-
expiresAtMs: args.expiresAtMs
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
async function establishEmailOtpRegistrationEd25519ExportRootCapability(args) {
|
|
173
|
-
try {
|
|
174
|
-
await establishUnlockedWalletEd25519ExportRootCapabilityV1(walletCustodyCeremonyTransportFromWorkerContextV1(args.context.signingEngine.getSignerWorkerContext()), {
|
|
175
|
-
existingEnvelope: custodyEnvelopeFromRegistrationCommit({
|
|
176
|
-
commit: args.commit,
|
|
177
|
-
walletId: args.walletId,
|
|
178
|
-
activatedAtMs: Date.now()
|
|
179
|
-
}),
|
|
180
|
-
existingFactorSecret: args.factorSecret32,
|
|
181
|
-
walletId: args.walletId,
|
|
182
|
-
walletAuthMethodId: String(args.emailOtpAuthContext.authority.bindingId),
|
|
183
|
-
walletSessionId: args.walletSessionId,
|
|
184
|
-
expiresAtMs: args.expiresAtMs
|
|
185
|
-
});
|
|
186
|
-
} catch (error) {
|
|
187
|
-
console.warn("[registration][email-otp] unlocked Ed25519 export-root capability was not established:", error instanceof Error ? error.message : String(error || "unknown error"));
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
async function rememberPasskeyRegistrationCustodyEnvelope(args) {
|
|
191
|
-
const envelope = custodyEnvelopeFromRegistrationCommit(args);
|
|
192
|
-
if (envelope.factor.kind !== "passkey") throw new Error("Passkey registration custody commit has a non-passkey factor");
|
|
193
|
-
await rememberPasskeyCustodySessionEnvelope({
|
|
194
|
-
walletId: args.walletId,
|
|
195
|
-
credentialIdB64u: envelope.factor.credentialIdB64u,
|
|
196
|
-
envelope
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
function buildRegistrationEmailOtpEd25519RecoveryBootstrap(args) {
|
|
200
|
-
const metadata = args.joined.metadata;
|
|
201
|
-
const thresholdSessionId = parseThresholdEd25519SessionId(metadata.scope.threshold_session_id);
|
|
202
|
-
if (!thresholdSessionId.ok) throw new Error("Registration Ed25519 capability has an invalid threshold session");
|
|
203
|
-
return {
|
|
204
|
-
kind: ROUTER_AB_ED25519_YAO_EMAIL_OTP_RECOVERY_BOOTSTRAP_KIND_V1,
|
|
205
|
-
session: {
|
|
206
|
-
walletId: args.walletId,
|
|
207
|
-
nearAccountId: args.nearAccountId,
|
|
208
|
-
nearEd25519SigningKeyId: args.nearEd25519SigningKeyId,
|
|
209
|
-
authorityScope: {
|
|
210
|
-
kind: "email_otp",
|
|
211
|
-
provider: emailOtpAuthContextProvider(args.authContext),
|
|
212
|
-
providerUserId: emailOtpAuthContextProviderUserId(args.authContext)
|
|
213
|
-
},
|
|
214
|
-
thresholdSessionId: thresholdSessionId.value,
|
|
215
|
-
authorizationId: args.sessionState.signingWalletSession.authorizationId,
|
|
216
|
-
walletSessionId: args.sessionState.walletSessionId,
|
|
217
|
-
quotaId: args.sessionState.quotaId,
|
|
218
|
-
expiresAtMs: args.sessionState.signingWalletSession.expiresAtMs,
|
|
219
|
-
participantIds: metadata.participantIds,
|
|
220
|
-
remainingUses: args.sessionState.signingWalletSession.remainingUses,
|
|
221
|
-
signingRootId: args.sessionState.signingRootId,
|
|
222
|
-
signingRootVersion: args.sessionState.signingRootVersion,
|
|
223
|
-
runtimePolicyScope: args.sessionState.runtimePolicyScope,
|
|
224
|
-
routerAbNormalSigning: args.sessionState.routerAbNormalSigning
|
|
225
|
-
},
|
|
226
|
-
capability: {
|
|
227
|
-
kind: "router_ab_ed25519_yao_active_capability_v1",
|
|
228
|
-
materialActivation: metadata.materialActivation,
|
|
229
|
-
activeCapabilityBinding: metadata.activeCapabilityBinding,
|
|
230
|
-
registeredPublicKey: [...metadata.registeredPublicKey],
|
|
231
|
-
nearAccountId: args.nearAccountId,
|
|
232
|
-
applicationBinding: metadata.applicationBinding,
|
|
233
|
-
runtimePolicyScope: args.sessionState.runtimePolicyScope,
|
|
234
|
-
participantIds: metadata.participantIds,
|
|
235
|
-
lifecycle: {
|
|
236
|
-
lifecycleId: metadata.scope.lifecycle_id,
|
|
237
|
-
rootShareEpoch: metadata.scope.root_share_epoch,
|
|
238
|
-
accountId: metadata.scope.account_id,
|
|
239
|
-
thresholdSessionId: thresholdSessionId.value,
|
|
240
|
-
signerSetId: metadata.scope.signer_set_id,
|
|
241
|
-
signingWorkerId: metadata.scope.signing_worker_id
|
|
242
|
-
},
|
|
243
|
-
stateEpoch: Number(metadata.stateEpoch),
|
|
244
|
-
registrationContinuity: {
|
|
245
|
-
kind: "registration",
|
|
246
|
-
admissionRequest: args.deferredNear.admissionRequest,
|
|
247
|
-
admissionReceipt: args.admissionReceipt,
|
|
248
|
-
activationTranscript: [...metadata.transcript]
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
};
|
|
252
|
-
}
|
|
253
|
-
const hostedPasskeyRegistrationPreparedBrand = Symbol("hostedPasskeyRegistrationPrepared");
|
|
254
|
-
const hostedPasskeyRegistrationStates = /* @__PURE__ */ new WeakMap();
|
|
255
|
-
function registrationSignerPlanFromSignerSet(selection) {
|
|
256
|
-
const plan = registrationSignerPlanFromSelection(selection);
|
|
257
|
-
if (!plan.ok) throw new Error(plan.message);
|
|
258
|
-
return plan.value;
|
|
259
|
-
}
|
|
260
|
-
function registrationWarmupWork(context) {
|
|
261
|
-
return context.signingEngine.warmCriticalResources.bind(context.signingEngine, { kind: "none" });
|
|
262
|
-
}
|
|
263
|
-
function registrationPlanBranchIncludesNearEd25519(branch) {
|
|
264
|
-
return branch.kind === "near_ed25519";
|
|
265
|
-
}
|
|
266
|
-
function registrationSelectionRequiresEmailOtpYaoWarmup(signerSelection) {
|
|
267
|
-
return registrationSignerPlanFromSignerSet(signerSelection).branches.some(registrationPlanBranchIncludesNearEd25519);
|
|
268
|
-
}
|
|
269
|
-
function noEmailOtpYaoPrewarm() {
|
|
270
|
-
return Promise.resolve(zeroEmailOtpYaoPrewarmDiagnostics());
|
|
271
|
-
}
|
|
272
|
-
function registrationSelectionIncludesEcdsa(signerSelection) {
|
|
273
|
-
return signerSelection.signers.some((signer) => signer.kind === "evm_family_ecdsa");
|
|
274
|
-
}
|
|
275
|
-
function registrationEmailOtpYaoPrewarmWork(input) {
|
|
276
|
-
if (input.authMethod.kind !== "email_otp" || !registrationSelectionRequiresEmailOtpYaoWarmup(input.signerSelection)) return noEmailOtpYaoPrewarm;
|
|
277
|
-
return executeRegistrationEmailOtpYaoPrewarm.bind(void 0, { prewarm: input.context.signingEngine.prewarmEmailOtpYao.bind(input.context.signingEngine) });
|
|
278
|
-
}
|
|
279
|
-
function recoverEmailOtpYaoPrewarmFailure(_error, startedAt) {
|
|
280
|
-
const elapsedMs = roundDurationMs(startedAt);
|
|
281
|
-
return {
|
|
282
|
-
kind: "failed",
|
|
283
|
-
elapsedMs,
|
|
284
|
-
workerPrewarmMs: elapsedMs,
|
|
285
|
-
yaoWasmInitMs: 0,
|
|
286
|
-
failureStage: "worker_ready"
|
|
287
|
-
};
|
|
288
|
-
}
|
|
289
|
-
function executeRegistrationEmailOtpYaoPrewarm(input) {
|
|
290
|
-
const startedAt = performance.now();
|
|
291
|
-
return input.prewarm().catch((error) => recoverEmailOtpYaoPrewarmFailure(error, startedAt));
|
|
292
|
-
}
|
|
293
|
-
function completedRegistrationWarmup(results) {
|
|
294
|
-
const [diagnostics, emailOtpYao] = results;
|
|
295
|
-
return {
|
|
296
|
-
kind: "completed",
|
|
297
|
-
diagnostics: {
|
|
298
|
-
...diagnostics,
|
|
299
|
-
emailOtpWorkerPrewarmMs: emailOtpYao.workerPrewarmMs,
|
|
300
|
-
emailOtpYaoWasmInitMs: emailOtpYao.yaoWasmInitMs,
|
|
301
|
-
emailOtpYaoPrewarm: emailOtpYao
|
|
302
|
-
}
|
|
303
|
-
};
|
|
304
|
-
}
|
|
305
|
-
function failedRegistrationWarmup(error) {
|
|
306
|
-
return {
|
|
307
|
-
kind: "failed",
|
|
308
|
-
error
|
|
309
|
-
};
|
|
310
|
-
}
|
|
311
|
-
function startRegistrationWarmup(input) {
|
|
312
|
-
const genericWarmup = input.recorder.measure("registrationWarmupMs", registrationWarmupWork(input.context));
|
|
313
|
-
const emailOtpYaoWarmup = input.recorder.measure("registrationWarmupEmailOtpYaoWasmInitMs", registrationEmailOtpYaoPrewarmWork({
|
|
314
|
-
context: input.context,
|
|
315
|
-
authMethod: input.authMethod,
|
|
316
|
-
signerSelection: input.signerSelection
|
|
317
|
-
}));
|
|
318
|
-
if (registrationSelectionIncludesEcdsa(input.signerSelection)) input.context.signingEngine.prewarmEcdsaRegistrationCrypto?.().catch(() => {});
|
|
319
|
-
return Promise.all([genericWarmup, emailOtpYaoWarmup]).then(completedRegistrationWarmup, failedRegistrationWarmup);
|
|
320
|
-
}
|
|
321
|
-
function observeRegistrationWarmup(input) {
|
|
322
|
-
input.warmup.then((outcome) => {
|
|
323
|
-
if (outcome.kind === "completed") input.recorder.captureWarmupDiagnostics(outcome.diagnostics);
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
function registrationPreparationSignerSlot(signerSelection) {
|
|
327
|
-
return findRegistrationSignerPlanNearEd25519Branch(registrationSignerPlanFromSignerSet(signerSelection))?.signerSlot ?? 1;
|
|
328
|
-
}
|
|
329
|
-
async function resolvePasskeyRegistrationAuthority(args) {
|
|
330
|
-
if (args.passkeyExecution?.kind === "use_hosted_preparation") return await args.passkeyExecution.authority;
|
|
331
|
-
return await collectPasskeyRegistrationAuthority({
|
|
332
|
-
context: args.context,
|
|
333
|
-
walletId: args.walletId,
|
|
334
|
-
signerSlot: args.signerSlot,
|
|
335
|
-
registrationIntentDigestB64u: args.registrationIntentDigestB64u,
|
|
336
|
-
options: args.options,
|
|
337
|
-
confirmationConfigOverride: args.confirmationConfigOverride
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
function hostedPasskeyRegistrationState(prepared) {
|
|
341
|
-
if (prepared[hostedPasskeyRegistrationPreparedBrand] !== true) throw new Error("Invalid hosted passkey registration preparation");
|
|
342
|
-
const state = hostedPasskeyRegistrationStates.get(prepared);
|
|
343
|
-
if (!state) throw new Error("Hosted passkey registration preparation is unknown");
|
|
344
|
-
return state;
|
|
345
|
-
}
|
|
346
|
-
function hostedPasskeyRegistrationBinding(args) {
|
|
347
|
-
return alphabetizeStringify({
|
|
348
|
-
wallet: args.wallet,
|
|
349
|
-
signerSelection: args.signerSelection,
|
|
350
|
-
authMethod: args.authMethod,
|
|
351
|
-
walletId: args.walletId,
|
|
352
|
-
signerSlot: args.signerSlot,
|
|
353
|
-
rpId: args.rpId,
|
|
354
|
-
challengeB64u: args.challengeB64u
|
|
355
|
-
});
|
|
356
|
-
}
|
|
357
|
-
/**
|
|
358
|
-
* Near-provisioning retries must present the SAME operation identity.
|
|
359
|
-
*
|
|
360
|
-
* The server's Yao consume writes a first-writer consumer binding derived from
|
|
361
|
-
* the request fingerprint, which includes this key. A fresh key per attempt
|
|
362
|
-
* would permanently poison the activation on any ambiguous first attempt —
|
|
363
|
-
* the retry would arrive as a different consumer and hit `activation_consumed`
|
|
364
|
-
* forever. Deriving the key from the ceremony and activation reference makes
|
|
365
|
-
* every retry the same consumer, so takeover resume works instead.
|
|
366
|
-
*/
|
|
367
|
-
async function deriveNearProvisioningIdempotencyKey(input) {
|
|
368
|
-
return registrationFinalizeIdempotencyKeyFromString(`wallet-registration-near-provisioning:${await sha256HexUtf8([
|
|
369
|
-
"wallet-registration-near-provisioning",
|
|
370
|
-
input.registrationCeremonyId,
|
|
371
|
-
input.activationReference.lifecycle_id,
|
|
372
|
-
input.activationReference.session_id.map((byte) => byte.toString(16).padStart(2, "0")).join("")
|
|
373
|
-
].join(":"))}`);
|
|
374
|
-
}
|
|
375
|
-
function createRegistrationOperationIdempotencyKey(label) {
|
|
376
|
-
const cryptoApi = globalThis.crypto;
|
|
377
|
-
if (cryptoApi && typeof cryptoApi.randomUUID === "function") return registrationFinalizeIdempotencyKeyFromString(`${label}:${cryptoApi.randomUUID()}`);
|
|
378
|
-
const bytes = new Uint8Array(16);
|
|
379
|
-
if (!cryptoApi || typeof cryptoApi.getRandomValues !== "function") throw new Error("Secure randomness is required for registration finalization");
|
|
380
|
-
cryptoApi.getRandomValues(bytes);
|
|
381
|
-
return registrationFinalizeIdempotencyKeyFromString(`${label}:${[...bytes].map((byte) => byte.toString(16).padStart(2, "0")).join("")}`);
|
|
382
|
-
}
|
|
383
|
-
function startEmailOtpRegistrationEnrollmentMaterial(input) {
|
|
384
|
-
return input.recorder.measure("emailOtpEnrollmentMaterialMs", () => resolveEmailOtpRegistrationEnrollmentMaterial({
|
|
385
|
-
context: input.context,
|
|
386
|
-
authMethod: input.authMethod,
|
|
387
|
-
relayerUrl: input.relayerUrl,
|
|
388
|
-
walletId: input.walletId,
|
|
389
|
-
providerSubject: input.providerSubject,
|
|
390
|
-
clientSecret32: input.clientSecret32
|
|
391
|
-
}));
|
|
392
|
-
}
|
|
393
|
-
function assertEmailOtpRegistrationHasNoLegacyEcdsaRoot(material) {
|
|
394
|
-
if (material.emailOtpSessionHandle.kind !== "not_requested") throw new Error("Strict ECDSA registration received obsolete Email OTP root-share material");
|
|
395
|
-
}
|
|
396
|
-
async function resolveEmailOtpRegistrationEnrollmentMaterial(input) {
|
|
397
|
-
if (input.authMethod.kind !== "email_otp") throw new Error("Email OTP enrollment material requires Email OTP auth");
|
|
398
|
-
try {
|
|
399
|
-
const material = await input.context.signingEngine.prepareEmailOtpRegistrationEnrollmentMaterialInternal({
|
|
400
|
-
relayUrl: input.relayerUrl,
|
|
401
|
-
walletId: toWalletId(input.walletId),
|
|
402
|
-
userId: input.providerSubject,
|
|
403
|
-
clientSecret32: input.clientSecret32
|
|
404
|
-
});
|
|
405
|
-
assertEmailOtpRegistrationHasNoLegacyEcdsaRoot(material);
|
|
406
|
-
return material;
|
|
407
|
-
} finally {
|
|
408
|
-
input.clientSecret32.fill(0);
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
function createRegistrationLifecycleEvent(input) {
|
|
412
|
-
const authMethod = input.event.authMethod;
|
|
413
|
-
const accountId = registrationEventAccountId(input.accountId);
|
|
414
|
-
return createRegistrationFlowEvent({
|
|
415
|
-
...input.event,
|
|
416
|
-
flowId: `registration:${authMethod}:${accountId}`,
|
|
417
|
-
accountId,
|
|
418
|
-
authMethod
|
|
419
|
-
});
|
|
420
|
-
}
|
|
421
|
-
function registrationEventAccountId(value) {
|
|
422
|
-
const accountId = String(value || "").trim();
|
|
423
|
-
if (!accountId) throw new Error("Registration event account id is required");
|
|
424
|
-
return accountId;
|
|
425
|
-
}
|
|
426
|
-
function registrationErrorCodeFromUnknown(error) {
|
|
427
|
-
return isObject(error) && "code" in error ? String(error.code || "").trim() : "";
|
|
428
|
-
}
|
|
429
|
-
function registrationErrorWithCode(message, errorCode) {
|
|
430
|
-
return Object.assign(new Error(message), errorCode ? { code: errorCode } : {});
|
|
431
|
-
}
|
|
432
|
-
function webAuthnTransportsFromRaw(value) {
|
|
433
|
-
if (!Array.isArray(value)) return [];
|
|
434
|
-
return value.filter((transport) => {
|
|
435
|
-
switch (transport) {
|
|
436
|
-
case "ble":
|
|
437
|
-
case "hybrid":
|
|
438
|
-
case "internal":
|
|
439
|
-
case "nfc":
|
|
440
|
-
case "smart-card":
|
|
441
|
-
case "usb": return true;
|
|
442
|
-
default: return false;
|
|
443
|
-
}
|
|
444
|
-
});
|
|
445
|
-
}
|
|
446
|
-
function emitRegistrationEvent(onEvent, accountId, event) {
|
|
447
|
-
onEvent?.(createRegistrationLifecycleEvent({
|
|
448
|
-
accountId,
|
|
449
|
-
event
|
|
450
|
-
}));
|
|
451
|
-
}
|
|
452
|
-
async function emailOtpEmailHashHex(email) {
|
|
453
|
-
const normalizedEmail = String(email || "").trim().toLowerCase();
|
|
454
|
-
if (!normalizedEmail) throw new Error("Email OTP registration auth context requires email");
|
|
455
|
-
return sha256HexUtf8(normalizedEmail);
|
|
456
|
-
}
|
|
457
|
-
function emailOtpProviderFromRegistrationProof(proof) {
|
|
458
|
-
switch (proof.proofKind) {
|
|
459
|
-
case "otp_challenge": return "email";
|
|
460
|
-
case "google_sso_registration": return "google";
|
|
461
|
-
default: return assertNever(proof);
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
function registrationThreeRouteAuthorityPayload(authority) {
|
|
465
|
-
switch (authority.kind) {
|
|
466
|
-
case "passkey": return {
|
|
467
|
-
kind: "passkey",
|
|
468
|
-
webauthnRegistration: authority.webauthnRegistration
|
|
469
|
-
};
|
|
470
|
-
case "email_otp": return {
|
|
471
|
-
kind: "email_otp",
|
|
472
|
-
emailOtpRegistrationProof: authority.emailOtpRegistrationProof
|
|
473
|
-
};
|
|
474
|
-
default: return assertNever(authority);
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
async function startNearRegistrationAdmission(args) {
|
|
478
|
-
const startedAt = performance.now();
|
|
479
|
-
try {
|
|
480
|
-
const admissionReceipt = await admitDeferredNearRegistration(args.deferredNear, {
|
|
481
|
-
routerOrigin: new URL(args.relayerUrl).origin,
|
|
482
|
-
authorization: {
|
|
483
|
-
kind: "bearer",
|
|
484
|
-
value: `Bearer ${args.signedSetup}`
|
|
485
|
-
},
|
|
486
|
-
fetch: globalThis.fetch,
|
|
487
|
-
...args.traceContext ? { traceContext: args.traceContext } : {}
|
|
488
|
-
});
|
|
489
|
-
emitNearRegistrationTiming({
|
|
490
|
-
ceremonyId: args.registrationCeremonyId,
|
|
491
|
-
stage: "early_admission",
|
|
492
|
-
startedAt,
|
|
493
|
-
outcome: "success"
|
|
494
|
-
});
|
|
495
|
-
return {
|
|
496
|
-
deferredNear: args.deferredNear,
|
|
497
|
-
admissionReceipt
|
|
498
|
-
};
|
|
499
|
-
} catch (error) {
|
|
500
|
-
emitNearRegistrationTiming({
|
|
501
|
-
ceremonyId: args.registrationCeremonyId,
|
|
502
|
-
stage: "early_admission",
|
|
503
|
-
startedAt,
|
|
504
|
-
outcome: "failure"
|
|
505
|
-
});
|
|
506
|
-
throw error;
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
function requireNearRegistrationAdmission(admission) {
|
|
510
|
-
if (!admission) throw new Error("Mixed registration did not start NEAR admission");
|
|
511
|
-
return admission;
|
|
512
|
-
}
|
|
513
|
-
function registrationEd25519LaneAuthorization(auth, passkeyCredentialIdB64u, session) {
|
|
514
|
-
switch (auth.kind) {
|
|
515
|
-
case "passkey": return { auth: {
|
|
516
|
-
kind: "passkey",
|
|
517
|
-
rpId: toRpId(auth.rpId),
|
|
518
|
-
credentialIdB64u: passkeyCredentialIdB64u
|
|
519
|
-
} };
|
|
520
|
-
case "email_otp": return {
|
|
521
|
-
auth: {
|
|
522
|
-
kind: "email_otp",
|
|
523
|
-
providerSubjectId: emailOtpAuthContextProviderUserId(auth.emailOtpAuthContext)
|
|
524
|
-
},
|
|
525
|
-
remainingUses: session.remainingUses,
|
|
526
|
-
expiresAtMs: session.expiresAtMs
|
|
527
|
-
};
|
|
528
|
-
default: return assertNever(auth);
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
async function buildThreeRouteCanonicalActivationCommand(args) {
|
|
532
|
-
const canonicalRequest = parseCanonicalEcdsaServerActivationRequest(alphabetizeStringify({
|
|
533
|
-
operation: "wallet_registration_activate_v2",
|
|
534
|
-
registrationCeremonyId: args.registrationCeremonyId,
|
|
535
|
-
activationCorrelationId: args.activationCorrelationId,
|
|
536
|
-
idempotencyKey: args.idempotencyKey,
|
|
537
|
-
publicFacts: args.publicFacts
|
|
538
|
-
}));
|
|
539
|
-
return {
|
|
540
|
-
canonicalRequest,
|
|
541
|
-
requestDigest: parseDigestB64u(base64UrlEncode(await sha256BytesUtf8(String(canonicalRequest))))
|
|
542
|
-
};
|
|
543
|
-
}
|
|
544
|
-
async function persistThreeRouteCanonicalActivation(args) {
|
|
545
|
-
const planInput = {
|
|
546
|
-
authority: args.materialAuthority,
|
|
547
|
-
targetMemberships: args.chainTargets,
|
|
548
|
-
evmFamilySigningKeySlotId: requireEvmFamilySigningKeySlotId(args.ecdsaPrepare.prepare.evmFamilySigningKeySlotId, "registration ECDSA signing key slot"),
|
|
549
|
-
ecdsaThresholdKeyId: parseEcdsaThresholdKeyId(args.ecdsaPrepare.prepare.ecdsaThresholdKeyId),
|
|
550
|
-
signingRootId: parseSdkEcdsaDerivationSigningRootId(args.ecdsaPrepare.prepare.signingRootId),
|
|
551
|
-
signingRootVersion: parseSdkEcdsaDerivationSigningRootVersion(args.ecdsaPrepare.prepare.signingRootVersion),
|
|
552
|
-
runtimePolicyScope: args.ecdsaPrepare.prepare.runtimePolicyScope,
|
|
553
|
-
clientVerifyingPublicKey33B64u: parseEcdsaClientVerifyingPublicKey33B64u(args.clientActivation.derivationClientSharePublicKey33B64u),
|
|
554
|
-
participantIds: [toParticipantId(args.ecdsaPrepare.prepare.participantIds[0]), toParticipantId(args.ecdsaPrepare.prepare.participantIds[1])],
|
|
555
|
-
relayerKeyId: parseEcdsaRelayerKeyId(args.ecdsaPrepare.prepare.relayerKeyId),
|
|
556
|
-
bindingDigest: parseEcdsaRoleLocalBindingDigest(args.clientActivation.contextBinding32B64u),
|
|
557
|
-
journalId: args.activationCorrelationId,
|
|
558
|
-
requestDigest: args.activationCommand.requestDigest,
|
|
559
|
-
canonicalRequest: args.activationCommand.canonicalRequest,
|
|
560
|
-
createdAt: parseIsoTimestamp((/* @__PURE__ */ new Date()).toISOString())
|
|
561
|
-
};
|
|
562
|
-
const persisted = await args.context.signingEngine.persistInitialCanonicalEcdsaActivation({
|
|
563
|
-
kind: "persist_initial_canonical_ecdsa_activation_v1",
|
|
564
|
-
bootstrapOwner: "wallet_custody",
|
|
565
|
-
clientActivation: args.clientActivation,
|
|
566
|
-
ceremonyId: args.ceremonyId,
|
|
567
|
-
planInput
|
|
568
|
-
});
|
|
569
|
-
if (!persisted.ok) throw new Error(`Canonical ECDSA activation persistence failed (${persisted.code}): ${persisted.message}`);
|
|
570
|
-
return persisted;
|
|
571
|
-
}
|
|
572
|
-
function ethereumAddressFromAddress20B64u(value) {
|
|
573
|
-
const bytes = base64UrlDecode(value);
|
|
574
|
-
if (bytes.length !== 20) throw new Error("ECDSA activation address must contain 20 bytes");
|
|
575
|
-
return `0x${Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("")}`;
|
|
576
|
-
}
|
|
577
|
-
/**
|
|
578
|
-
* Calls `/wallets/register/setup`, which replaces the bootstrap grant, the
|
|
579
|
-
* registration intent, and registration start.
|
|
580
|
-
*
|
|
581
|
-
* Runs before the authenticator prompt, because its response carries the
|
|
582
|
-
* challenge that prompt must sign — so the Router's ECDSA preparation overlaps
|
|
583
|
-
* the user's interaction instead of being serialized after it.
|
|
584
|
-
*/
|
|
585
|
-
async function setupThreeRouteRegistration(args) {
|
|
586
|
-
const relayerUrl = String(args.context.configs.network.relayer.url || "").trim();
|
|
587
|
-
if (!relayerUrl) throw new Error("registerWallet requires relayer.url");
|
|
588
|
-
const registration = args.context.configs.registration;
|
|
589
|
-
const publishableKey = String(registration?.publishableKey || "").trim();
|
|
590
|
-
const environmentId = String(registration?.projectEnvironmentId || "").trim();
|
|
591
|
-
if (!publishableKey || !environmentId) throw new Error("registerWallet requires registration.publishableKey and registration.projectEnvironmentId");
|
|
592
|
-
const registrationWarmup = startRegistrationWarmup({
|
|
593
|
-
recorder: args.recorder,
|
|
594
|
-
context: args.context,
|
|
595
|
-
authMethod: args.authMethod,
|
|
596
|
-
signerSelection: args.signerSelection
|
|
597
|
-
});
|
|
598
|
-
const setup = await args.recorder.measure("registrationIntentMs", () => setupWalletRegistration({
|
|
599
|
-
relayerUrl,
|
|
600
|
-
request: {
|
|
601
|
-
...args.wallet.kind === "provided" ? { wallet: args.wallet } : {},
|
|
602
|
-
signerSelection: args.signerSelection,
|
|
603
|
-
authMethod: args.authMethod
|
|
604
|
-
},
|
|
605
|
-
auth: {
|
|
606
|
-
publishableKey,
|
|
607
|
-
environmentId
|
|
608
|
-
}
|
|
609
|
-
}));
|
|
610
|
-
if (!setup.ok) throw registrationErrorWithCode(setup.message, setup.code);
|
|
611
|
-
return {
|
|
612
|
-
relayerUrl,
|
|
613
|
-
setup,
|
|
614
|
-
registrationWarmup
|
|
615
|
-
};
|
|
616
|
-
}
|
|
617
|
-
async function setupRegistrationForPasskeyExecution(args) {
|
|
618
|
-
if (args.passkeyExecution.kind === "collect_during_registration") return await setupThreeRouteRegistration({
|
|
619
|
-
context: args.context,
|
|
620
|
-
authMethod: args.authMethod,
|
|
621
|
-
wallet: args.wallet,
|
|
622
|
-
signerSelection: args.signerSelection,
|
|
623
|
-
recorder: args.recorder
|
|
624
|
-
});
|
|
625
|
-
if (args.authMethod.kind !== "passkey") throw new Error("Hosted passkey preparation requires passkey registration");
|
|
626
|
-
const state = hostedPasskeyRegistrationState(args.passkeyExecution.prepared);
|
|
627
|
-
if (state.context !== args.context || state.lifecycle === "cancelled") throw new Error("Hosted passkey registration preparation belongs to a different operation");
|
|
628
|
-
const setup = state.setup;
|
|
629
|
-
const intent = requirePasskeyRegistrationIntent(setup.setup.intent);
|
|
630
|
-
const challengeB64u = String(setup.setup.registrationIntentDigestB64u || "").trim();
|
|
631
|
-
const signerSlot = registrationPreparationSignerSlot(args.signerSelection);
|
|
632
|
-
if (hostedPasskeyRegistrationBinding({
|
|
633
|
-
wallet: args.wallet,
|
|
634
|
-
signerSelection: args.signerSelection,
|
|
635
|
-
authMethod: args.authMethod,
|
|
636
|
-
walletId: walletIdFromString(String(intent.walletId)),
|
|
637
|
-
signerSlot,
|
|
638
|
-
rpId: requireWebAuthnRpId(String(args.authMethod.rpId)),
|
|
639
|
-
challengeB64u
|
|
640
|
-
}) !== state.binding || String(intent.walletId) !== String(args.passkeyExecution.prepared.walletId) || challengeB64u !== args.passkeyExecution.prepared.challengeB64u) throw new Error("Hosted passkey registration preparation binding changed");
|
|
641
|
-
return setup;
|
|
642
|
-
}
|
|
643
|
-
function ecdsaRegistrationClientCeremonyForExecution(args) {
|
|
644
|
-
if (args.passkeyExecution.kind === "collect_during_registration") return { kind: "create_after_authority" };
|
|
645
|
-
const state = hostedPasskeyRegistrationState(args.passkeyExecution.prepared);
|
|
646
|
-
if (state.ecdsaClientCeremony.kind !== "started" || state.ecdsaClientCeremony.ceremonyId !== args.ceremonyId) throw new Error("Hosted passkey registration has no matching ECDSA client ceremony");
|
|
647
|
-
return {
|
|
648
|
-
kind: "use_hosted_preparation",
|
|
649
|
-
ceremonyId: state.ecdsaClientCeremony.ceremonyId,
|
|
650
|
-
operation: state.ecdsaClientCeremony.operation
|
|
651
|
-
};
|
|
652
|
-
}
|
|
653
|
-
async function awaitHostedPreparedEcdsaClientCeremony(operation) {
|
|
654
|
-
return await operation;
|
|
655
|
-
}
|
|
656
|
-
function ecdsaRegistrationClientCeremonyOperation(args) {
|
|
657
|
-
switch (args.clientCeremony.kind) {
|
|
658
|
-
case "create_after_authority": return args.context.signingEngine.createRouterAbEcdsaRegistrationCeremony.bind(args.context.signingEngine, {
|
|
659
|
-
kind: "create_router_ab_ecdsa_registration_ceremony_v1",
|
|
660
|
-
ceremonyId: args.ceremonyId,
|
|
661
|
-
registration: args.registration
|
|
662
|
-
});
|
|
663
|
-
case "use_hosted_preparation":
|
|
664
|
-
if (args.clientCeremony.ceremonyId !== args.ceremonyId) throw new Error("Prepared ECDSA client ceremony identity changed");
|
|
665
|
-
return awaitHostedPreparedEcdsaClientCeremony.bind(void 0, args.clientCeremony.operation);
|
|
666
|
-
default: return assertNever(args.clientCeremony);
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
async function runEcdsaEnabledThreeRouteRegistrationCeremony(args) {
|
|
670
|
-
const [firstChainTarget, ...remainingChainTargets] = args.ecdsaPrepare.chainTargets;
|
|
671
|
-
if (!firstChainTarget) throw new Error("Strict ECDSA ceremony requires at least one EVM-family target");
|
|
672
|
-
const ceremonyId = args.registrationCeremonyId;
|
|
673
|
-
const activationCorrelationId = parseCorrelationId(ceremonyId);
|
|
674
|
-
let deferredNearCustodyWork = null;
|
|
675
|
-
try {
|
|
676
|
-
const created = await measureStrictEcdsaCeremonyStep({
|
|
677
|
-
registrationTiming: args.registrationTiming,
|
|
678
|
-
bucket: "ecdsaRegistrationClientCreateMs",
|
|
679
|
-
operation: ecdsaRegistrationClientCeremonyOperation({
|
|
680
|
-
context: args.context,
|
|
681
|
-
ceremonyId,
|
|
682
|
-
registration: args.ecdsaPrepare.strictRegistration,
|
|
683
|
-
clientCeremony: args.clientCeremony
|
|
684
|
-
})
|
|
685
|
-
});
|
|
686
|
-
const responded = await measureStrictEcdsaCeremonyStep({
|
|
687
|
-
registrationTiming: args.registrationTiming,
|
|
688
|
-
bucket: "ecdsaRegistrationGatewayRespondMs",
|
|
689
|
-
operation: respondWalletRegistration.bind(void 0, {
|
|
690
|
-
relayerUrl: args.relayerUrl,
|
|
691
|
-
headers: registrationRouteHeaders(args.traceContext),
|
|
692
|
-
registrationCeremonyId: ceremonyId,
|
|
693
|
-
signerPlanKind: args.signerPlanKind,
|
|
694
|
-
signedSetup: args.signedSetup,
|
|
695
|
-
ecdsa: {
|
|
696
|
-
kind: "router_ab_ecdsa_registration_v1",
|
|
697
|
-
strictRegistration: created.registrationRequest,
|
|
698
|
-
requestDigestB64u: created.registrationRequestDigestB64u
|
|
699
|
-
},
|
|
700
|
-
...registrationThreeRouteAuthorityPayload(args.authority),
|
|
701
|
-
onServerTiming: (header) => recordStrictEcdsaServerTimingBuckets(args.registrationTiming, "respond", header)
|
|
702
|
-
})
|
|
703
|
-
});
|
|
704
|
-
if (responded.kind === "near_ed25519") throw new Error("ECDSA registration ceremony received an Ed25519-only respond result");
|
|
705
|
-
const deferredNear = responded.kind === "near_ed25519_and_evm_family_ecdsa" ? responded.ed25519 : null;
|
|
706
|
-
const nearAdmission = deferredNear ? startNearRegistrationAdmission({
|
|
707
|
-
relayerUrl: args.relayerUrl,
|
|
708
|
-
registrationCeremonyId: ceremonyId,
|
|
709
|
-
signedSetup: args.signedSetup,
|
|
710
|
-
deferredNear,
|
|
711
|
-
traceContext: args.traceContext
|
|
712
|
-
}) : null;
|
|
713
|
-
nearAdmission?.catch(ignoreNearCustodyFailure);
|
|
714
|
-
const verified = await measureStrictEcdsaCeremonyStep({
|
|
715
|
-
registrationTiming: args.registrationTiming,
|
|
716
|
-
bucket: "ecdsaRegistrationClientProofVerifyMs",
|
|
717
|
-
operation: args.context.signingEngine.verifyRouterAbEcdsaRegistrationClientProofs.bind(args.context.signingEngine, {
|
|
718
|
-
kind: "verify_router_ab_ecdsa_registration_client_proofs_v1",
|
|
719
|
-
bootstrapOwner: "wallet_custody",
|
|
720
|
-
ceremonyId,
|
|
721
|
-
clientProofFinalization: {
|
|
722
|
-
kind: "finalize_encrypted_client_proof_bundles_v2",
|
|
723
|
-
bundles: responded.ecdsa.strictResult.response.bundles
|
|
724
|
-
}
|
|
725
|
-
})
|
|
726
|
-
});
|
|
727
|
-
const activateEmailOtp = await args.resolveActivateEmailOtp();
|
|
728
|
-
const chainTargets = [firstChainTarget, ...remainingChainTargets];
|
|
729
|
-
const walletCustodyFactorJson = args.authority.kind === "passkey" ? args.authority.walletCustodyFactorJson : activateEmailOtp.walletCustodyFactorJson;
|
|
730
|
-
if (!walletCustodyFactorJson) throw new Error("ECDSA registration has no wallet custody factor binding");
|
|
731
|
-
const walletCustodyFactorSecret = args.authority.walletCustodyFactorSecret;
|
|
732
|
-
const activationHolder = {};
|
|
733
|
-
const established = await args.context.signingEngine.establishWalletCustodyEvmFamilyKeySet({
|
|
734
|
-
walletId: args.ecdsaPrepare.prepare.walletId,
|
|
735
|
-
factorJson: walletCustodyFactorJson,
|
|
736
|
-
factorSecret: walletCustodyFactorSecret,
|
|
737
|
-
evmFamilySigningKeySlotId: args.ecdsaPrepare.prepare.evmFamilySigningKeySlotId,
|
|
738
|
-
applicationBindingDigestB64u: verified.applicationBindingDigestB64u,
|
|
739
|
-
confirmRecoveryCodesBackedUp: args.confirmRecoveryCodesBackedUp,
|
|
740
|
-
runRelayerRound: async (bootstrap) => {
|
|
741
|
-
const clientActivation = parseRouterAbEcdsaVerifiedClientActivationFactsV1({
|
|
742
|
-
registrationRequestDigestB64u: verified.registrationRequestDigestB64u,
|
|
743
|
-
proofTranscriptDigestB64u: verified.proofTranscriptDigestB64u,
|
|
744
|
-
contextBinding32B64u: bootstrap.contextBinding32B64u,
|
|
745
|
-
derivationClientSharePublicKey33B64u: bootstrap.clientSharePublicKey33B64u,
|
|
746
|
-
clientShareRetryCounter: bootstrap.clientShareRetryCounter,
|
|
747
|
-
participantId: 1
|
|
748
|
-
});
|
|
749
|
-
const activationCommand = await buildThreeRouteCanonicalActivationCommand({
|
|
750
|
-
registrationCeremonyId: ceremonyId,
|
|
751
|
-
activationCorrelationId,
|
|
752
|
-
idempotencyKey: args.idempotencyKey,
|
|
753
|
-
publicFacts: clientActivation
|
|
754
|
-
});
|
|
755
|
-
const ecdsaCustodyCommit = walletCustodyCommitPayloadForWire(bootstrap.preActivationCommitPayload);
|
|
756
|
-
const ecdsaReplay = {
|
|
757
|
-
activationJournalId: activationCorrelationId,
|
|
758
|
-
clientActivation,
|
|
759
|
-
activationRequestDigestB64u: activationCommand.requestDigest
|
|
760
|
-
};
|
|
761
|
-
if (args.signerPlanKind === "near_ed25519_and_evm_family_ecdsa") {
|
|
762
|
-
if (!deferredNear) throw new Error("Mixed registration has no NEAR continuation");
|
|
763
|
-
await args.persistPendingCommit({
|
|
764
|
-
signerPlanKind: args.signerPlanKind,
|
|
765
|
-
localMaterial: {
|
|
766
|
-
keyFamilies: ["ecdsa_secp256k1"],
|
|
767
|
-
custodyCommit: ecdsaCustodyCommit,
|
|
768
|
-
ecdsa: ecdsaReplay
|
|
769
|
-
},
|
|
770
|
-
emailOtpEnrollment: activateEmailOtp.enrollment,
|
|
771
|
-
deferredNear
|
|
772
|
-
});
|
|
773
|
-
deferredNearCustodyWork = args.startDeferredNearCustody({
|
|
774
|
-
admission: requireNearRegistrationAdmission(nearAdmission),
|
|
775
|
-
establishedEvmCustodyCommit: bootstrap.preActivationCommitPayload
|
|
776
|
-
});
|
|
777
|
-
deferredNearCustodyWork.catch(ignoreNearCustodyFailure);
|
|
778
|
-
} else await args.persistPendingCommit({
|
|
779
|
-
signerPlanKind: args.signerPlanKind,
|
|
780
|
-
localMaterial: {
|
|
781
|
-
keyFamilies: ["ecdsa_secp256k1"],
|
|
782
|
-
custodyCommit: ecdsaCustodyCommit,
|
|
783
|
-
ecdsa: ecdsaReplay
|
|
784
|
-
},
|
|
785
|
-
emailOtpEnrollment: activateEmailOtp.enrollment
|
|
786
|
-
});
|
|
787
|
-
const persisted = await persistThreeRouteCanonicalActivation({
|
|
788
|
-
context: args.context,
|
|
789
|
-
ceremonyId,
|
|
790
|
-
materialAuthority: args.materialAuthority,
|
|
791
|
-
ecdsaPrepare: args.ecdsaPrepare,
|
|
792
|
-
chainTargets,
|
|
793
|
-
activationCorrelationId,
|
|
794
|
-
activationCommand,
|
|
795
|
-
clientActivation
|
|
796
|
-
});
|
|
797
|
-
if (String(persisted.journalId) !== String(activationCorrelationId)) throw new Error("ECDSA activation journal identity changed before activate");
|
|
798
|
-
const response = await measureStrictEcdsaCeremonyStep({
|
|
799
|
-
registrationTiming: args.registrationTiming,
|
|
800
|
-
bucket: "ecdsaRegistrationGatewayActivateMs",
|
|
801
|
-
operation: activateWalletRegistration.bind(void 0, {
|
|
802
|
-
relayerUrl: args.relayerUrl,
|
|
803
|
-
headers: registrationRouteHeaders(args.traceContext),
|
|
804
|
-
registrationCeremonyId: ceremonyId,
|
|
805
|
-
signerPlanKind: args.signerPlanKind,
|
|
806
|
-
signedSetup: args.signedSetup,
|
|
807
|
-
idempotencyKey: args.idempotencyKey,
|
|
808
|
-
ecdsa: {
|
|
809
|
-
clientActivation,
|
|
810
|
-
activationCorrelationId,
|
|
811
|
-
activationRequestDigestB64u: activationCommand.requestDigest
|
|
812
|
-
},
|
|
813
|
-
walletCustodyCommit: bootstrap.preActivationCommitPayload,
|
|
814
|
-
...activateEmailOtp.enrollment ? { emailOtpEnrollment: activateEmailOtp.enrollment } : {},
|
|
815
|
-
onServerTiming: (header) => recordStrictEcdsaServerTimingBuckets(args.registrationTiming, "activate", header)
|
|
816
|
-
})
|
|
817
|
-
});
|
|
818
|
-
if (response.kind !== "evm_family_ecdsa" || !response.ecdsa) throw new Error("ECDSA registration ceremony received a non-ECDSA activate result");
|
|
819
|
-
activationHolder.value = response;
|
|
820
|
-
activationHolder.journalId = persisted.journalId;
|
|
821
|
-
const identity = response.ecdsa.activation.ecdsa_activation.public_identity;
|
|
822
|
-
return JSON.stringify({
|
|
823
|
-
relayerKeyId: args.ecdsaPrepare.prepare.relayerKeyId,
|
|
824
|
-
relayerPublicKey33B64u: identity.server_public_key33_b64u,
|
|
825
|
-
groupPublicKey33B64u: identity.threshold_public_key33_b64u,
|
|
826
|
-
ethereumAddress: ethereumAddressFromAddress20B64u(identity.ethereum_address20_b64u),
|
|
827
|
-
relayerShareRetryCounter: identity.server_share_retry_counter
|
|
828
|
-
});
|
|
829
|
-
}
|
|
830
|
-
});
|
|
831
|
-
if (!activationHolder.value || !activationHolder.journalId) throw new Error("Wallet custody ECDSA activation did not return its committed receipt");
|
|
832
|
-
const activated = activationHolder.value;
|
|
833
|
-
if (activated.walletCustody?.status !== "committed") {
|
|
834
|
-
const status = activated.walletCustody?.status ?? "not_reported";
|
|
835
|
-
throw new Error(`Wallet custody did not commit during ECDSA activation (${status})`);
|
|
836
|
-
}
|
|
837
|
-
const clientBootstrap = buildStrictRegistrationClientBootstrap({
|
|
838
|
-
prepare: args.ecdsaPrepare.prepare,
|
|
839
|
-
verified: established.clientBootstrap
|
|
840
|
-
});
|
|
841
|
-
const registrationBootstrap = parseWalletRegistrationEcdsaDerivationRespond({
|
|
842
|
-
clientBootstrap,
|
|
843
|
-
serverBootstrap: activated.ecdsa.bootstrap,
|
|
844
|
-
activationEpoch: activated.ecdsa.activation.ecdsa_activation.activation_epoch
|
|
845
|
-
});
|
|
846
|
-
const finalized = await args.context.signingEngine.finalizeRouterAbEcdsaRegistrationActivation({
|
|
847
|
-
kind: "finalize_router_ab_ecdsa_registration_activation_v1",
|
|
848
|
-
bootstrapOwner: "wallet_custody",
|
|
849
|
-
journalId: activationHolder.journalId,
|
|
850
|
-
activationReceipt: activated.ecdsa.activation,
|
|
851
|
-
routerAbEcdsaDerivationNormalSigning: registrationBootstrap.routerAbEcdsaDerivationNormalSigning,
|
|
852
|
-
readyStateBlobB64u: established.localMaterial.readyStateBlobB64u,
|
|
853
|
-
walletCustodyPublicFacts: established.localMaterial.publicFacts
|
|
854
|
-
});
|
|
855
|
-
return {
|
|
856
|
-
session: {
|
|
857
|
-
chainTargets: [firstChainTarget, ...remainingChainTargets],
|
|
858
|
-
clientBootstrap,
|
|
859
|
-
bootstrap: registrationBootstrap,
|
|
860
|
-
activatedThresholdSessionId: activated.ecdsa.bootstrap.thresholdSessionId,
|
|
861
|
-
roleLocalMaterial: finalized.roleLocalMaterial,
|
|
862
|
-
authority: await walletAuthAuthorityRef({ authority: activated.authority }),
|
|
863
|
-
materialActivation: finalized.materialActivation,
|
|
864
|
-
clientPublicFacts: finalized.publicFacts,
|
|
865
|
-
publicCapability: finalized.publicCapability,
|
|
866
|
-
registrationEstablishedSession: requireIssuedRegistrationEstablishedSession(activated.registrationEstablishedSession)
|
|
867
|
-
},
|
|
868
|
-
activated,
|
|
869
|
-
deferredNear,
|
|
870
|
-
activateEmailOtp: { enrollment: activateEmailOtp.enrollment },
|
|
871
|
-
walletCustody: established,
|
|
872
|
-
deferredNearCustodyWork
|
|
873
|
-
};
|
|
874
|
-
} catch (error) {
|
|
875
|
-
discardDeferredNearCustodyWork(deferredNearCustodyWork);
|
|
876
|
-
await closeStrictEcdsaRegistrationCeremony({
|
|
877
|
-
context: args.context,
|
|
878
|
-
ceremonyId
|
|
879
|
-
});
|
|
880
|
-
throw error;
|
|
881
|
-
}
|
|
882
|
-
}
|
|
883
|
-
function materializeWalletRegistrationSetupChainTarget(target) {
|
|
884
|
-
switch (target.kind) {
|
|
885
|
-
case "evm": return thresholdEcdsaChainTargetFromChainFamily({
|
|
886
|
-
chain: "evm",
|
|
887
|
-
chainId: target.chainId,
|
|
888
|
-
networkSlug: target.networkSlug
|
|
889
|
-
});
|
|
890
|
-
case "tempo": return thresholdEcdsaChainTargetFromChainFamily({
|
|
891
|
-
chain: "tempo",
|
|
892
|
-
chainId: target.chainId,
|
|
893
|
-
networkSlug: target.networkSlug
|
|
894
|
-
});
|
|
895
|
-
default: return assertNever(target);
|
|
896
|
-
}
|
|
897
|
-
}
|
|
898
|
-
function materializeWalletRegistrationSetupEcdsaPrepare(setup) {
|
|
899
|
-
const [firstTarget, ...remainingTargets] = setup.chainTargets;
|
|
900
|
-
if (!firstTarget) throw new Error("Registration setup ECDSA chain targets are required");
|
|
901
|
-
return {
|
|
902
|
-
kind: setup.kind,
|
|
903
|
-
chainTargets: [materializeWalletRegistrationSetupChainTarget(firstTarget), ...remainingTargets.map(materializeWalletRegistrationSetupChainTarget)],
|
|
904
|
-
prepare: setup.prepare,
|
|
905
|
-
strictRegistration: setup.strictRegistration
|
|
906
|
-
};
|
|
907
|
-
}
|
|
908
|
-
function requireEcdsaRegistrationSetup(setup, expectedKind) {
|
|
909
|
-
switch (setup.kind) {
|
|
910
|
-
case "near_ed25519": throw new Error("Registration setup returned an Ed25519-only signer branch");
|
|
911
|
-
case "evm_family_ecdsa":
|
|
912
|
-
case "near_ed25519_and_evm_family_ecdsa":
|
|
913
|
-
if (setup.kind !== expectedKind) throw new Error("Registration setup returned a different signer branch");
|
|
914
|
-
return setup;
|
|
915
|
-
default: return assertNever(setup);
|
|
916
|
-
}
|
|
917
|
-
}
|
|
918
|
-
function registrationPasskeySignerSlot(args) {
|
|
919
|
-
switch (args.kind) {
|
|
920
|
-
case "evm_family_ecdsa": return 1;
|
|
921
|
-
case "near_ed25519_and_evm_family_ecdsa": return args.ed25519Selection.signerSlot;
|
|
922
|
-
default: return assertNever(args);
|
|
923
|
-
}
|
|
924
|
-
}
|
|
925
|
-
function pendingRegistrationAuthFromRegistrationInputs(args) {
|
|
926
|
-
if (args.authMethod.kind === "passkey") {
|
|
927
|
-
if (!args.passkeyAuthority) throw new Error("Passkey registration authority was not collected");
|
|
928
|
-
return {
|
|
929
|
-
kind: "passkey",
|
|
930
|
-
rpId: args.authMethod.rpId,
|
|
931
|
-
credentialIdB64u: String(args.passkeyAuthority.credential.rawId || args.passkeyAuthority.credential.id || "").trim(),
|
|
932
|
-
transports: [...args.passkeyAuthority.webauthnRegistration.response.transports]
|
|
933
|
-
};
|
|
934
|
-
}
|
|
935
|
-
return {
|
|
936
|
-
kind: "email_otp",
|
|
937
|
-
email: args.email,
|
|
938
|
-
registrationAuthorityId: args.registrationAuthorityId,
|
|
939
|
-
providerSubject: args.providerSubject,
|
|
940
|
-
enrollment: requirePendingEmailOtpEnrollment(args.emailOtpEnrollment)
|
|
941
|
-
};
|
|
942
|
-
}
|
|
943
|
-
function requirePendingEmailOtpEnrollment(enrollment) {
|
|
944
|
-
if (!enrollment) throw new Error("Email OTP registration has no enrollment material for pending recovery");
|
|
945
|
-
return enrollment;
|
|
946
|
-
}
|
|
947
|
-
async function persistPendingRegistrationCommit(input) {
|
|
948
|
-
const nowMs = Date.now();
|
|
949
|
-
const pending = buildPendingRegistrationCommit({
|
|
950
|
-
...input,
|
|
951
|
-
createdAtMs: nowMs,
|
|
952
|
-
updatedAtMs: nowMs
|
|
953
|
-
});
|
|
954
|
-
await IndexedDBManager.putPendingWalletRegistrationCommit(pending);
|
|
955
|
-
return pending;
|
|
956
|
-
}
|
|
957
|
-
function requireMixedRegistrationActivatePendingCommit(pending) {
|
|
958
|
-
if (!pending || pending.operation !== "registration_activate" || pending.signerPlanKind !== "near_ed25519_and_evm_family_ecdsa") throw new Error("Mixed registration activation commit was not persisted");
|
|
959
|
-
return pending;
|
|
960
|
-
}
|
|
961
|
-
async function prepareRegistrationEcdsaPublication(args) {
|
|
962
|
-
const walletKeys = args.walletKeys;
|
|
963
|
-
if (args.auth.kind === "passkey") {
|
|
964
|
-
const credentialIdB64u = String(args.auth.credential.rawId || args.auth.credential.id || "").trim();
|
|
965
|
-
if (!credentialIdB64u) throw new Error("Passkey registration publication has no credential id");
|
|
966
|
-
return await prepareWalletEcdsaRegistrationPublication({
|
|
967
|
-
kind: "passkey",
|
|
968
|
-
walletId: args.walletId,
|
|
969
|
-
rpId: requireWebAuthnRpId(args.auth.rpId),
|
|
970
|
-
credentialIdB64u,
|
|
971
|
-
credentialPublicKeyB64u: args.auth.credentialPublicKeyB64u,
|
|
972
|
-
transports: args.auth.credential.response?.transports ?? [],
|
|
973
|
-
walletKeys
|
|
974
|
-
});
|
|
975
|
-
}
|
|
976
|
-
return await prepareWalletEcdsaRegistrationPublication({
|
|
977
|
-
kind: "email_otp",
|
|
978
|
-
walletId: args.walletId,
|
|
979
|
-
email: args.auth.email,
|
|
980
|
-
registrationAuthorityId: args.auth.registrationAuthorityId,
|
|
981
|
-
authority: args.auth.authority,
|
|
982
|
-
walletKeys
|
|
983
|
-
});
|
|
984
|
-
}
|
|
985
|
-
async function publishMixedEcdsaRegistrationCommit(args) {
|
|
986
|
-
const walletKeys = await finalizeRegistrationEcdsaSessions({
|
|
987
|
-
context: args.context,
|
|
988
|
-
relayerUrl: args.relayerUrl,
|
|
989
|
-
registrationTiming: args.registrationTiming,
|
|
990
|
-
plan: args.plan
|
|
991
|
-
});
|
|
992
|
-
const registration = await prepareRegistrationEcdsaPublication({
|
|
993
|
-
auth: args.plan.auth,
|
|
994
|
-
walletId: args.plan.walletId,
|
|
995
|
-
walletKeys
|
|
996
|
-
});
|
|
997
|
-
const registrationSession = args.plan.ecdsa.session.registrationEstablishedSession;
|
|
998
|
-
await IndexedDBManager.publishPendingWalletRegistrationCommit({
|
|
999
|
-
pending: args.pending,
|
|
1000
|
-
authority: args.activated.authority,
|
|
1001
|
-
foundingAuthority: {
|
|
1002
|
-
authority: args.activated.foundingAuthority,
|
|
1003
|
-
authMethod: args.activated.foundingAuthMethod
|
|
1004
|
-
},
|
|
1005
|
-
request: {
|
|
1006
|
-
operation: args.pending.operation,
|
|
1007
|
-
registrationCeremonyId: args.pending.registrationCeremonyId,
|
|
1008
|
-
idempotencyKey: args.pending.idempotencyKey,
|
|
1009
|
-
walletId: args.pending.walletId,
|
|
1010
|
-
walletAuthMethodId: args.pending.walletAuthMethodId
|
|
1011
|
-
},
|
|
1012
|
-
walletSessionPublication: {
|
|
1013
|
-
kind: "issued",
|
|
1014
|
-
walletSession: registrationSession.walletSession,
|
|
1015
|
-
operationCredential: registrationSession.operationCredential
|
|
1016
|
-
},
|
|
1017
|
-
ecdsaContinuity: [],
|
|
1018
|
-
registration
|
|
1019
|
-
});
|
|
1020
|
-
}
|
|
1021
|
-
async function discardDeferredNearCustodyWork(work) {
|
|
1022
|
-
if (!work) return;
|
|
1023
|
-
try {
|
|
1024
|
-
zeroizeArrayBuffer((await work).factorSecret32);
|
|
1025
|
-
} catch {}
|
|
1026
|
-
}
|
|
1027
|
-
function buildDeferredRegistrationFinalizeAuthMaterial(args) {
|
|
1028
|
-
switch (args.auth.kind) {
|
|
1029
|
-
case "passkey": {
|
|
1030
|
-
if (!args.passkeyAuthority) throw new Error("Deferred passkey registration requires authority material");
|
|
1031
|
-
const credentialIdB64u = String(args.passkeyAuthority.credential.rawId || args.passkeyAuthority.credential.id || "").trim();
|
|
1032
|
-
const prfFirstB64u = String(args.passkeyAuthority.prfFirstB64u || "").trim();
|
|
1033
|
-
if (!credentialIdB64u || !prfFirstB64u) throw new Error("Deferred passkey registration requires credential PRF material");
|
|
1034
|
-
return {
|
|
1035
|
-
kind: "passkey",
|
|
1036
|
-
rpId: args.auth.rpId,
|
|
1037
|
-
credentialIdB64u,
|
|
1038
|
-
prfFirstB64u
|
|
1039
|
-
};
|
|
1040
|
-
}
|
|
1041
|
-
case "email_otp":
|
|
1042
|
-
if (!args.emailOtpEnrollment) throw new Error("Deferred Email OTP registration requires enrollment material");
|
|
1043
|
-
return {
|
|
1044
|
-
kind: "email_otp",
|
|
1045
|
-
enrollment: args.emailOtpEnrollment,
|
|
1046
|
-
emailOtpAuthContext: args.auth.emailOtpAuthContext
|
|
1047
|
-
};
|
|
1048
|
-
default: return assertNever(args.auth);
|
|
1049
|
-
}
|
|
1050
|
-
}
|
|
1051
|
-
async function persistPreparedNearRegistration(pending, receipt, checkpointJson) {
|
|
1052
|
-
const startedAt = performance.now();
|
|
1053
|
-
await IndexedDBManager.advancePendingNearRegistration({
|
|
1054
|
-
expected: pending,
|
|
1055
|
-
next: preparePendingNearRegistration(pending, receipt, checkpointJson)
|
|
1056
|
-
});
|
|
1057
|
-
recordWalletCustodyTiming(pending.registrationCeremonyId, "journal_prepared", startedAt);
|
|
1058
|
-
}
|
|
1059
|
-
function ignoreNearCustodyFailure() {}
|
|
1060
|
-
async function startDeferredNearWalletCustody(base, input) {
|
|
1061
|
-
const factorSecret = base.factorSecretOwner.value;
|
|
1062
|
-
if (!factorSecret) throw new Error("Mixed registration has no NEAR custody factor secret");
|
|
1063
|
-
base.factorSecretOwner.value = null;
|
|
1064
|
-
const startedAt = performance.now();
|
|
1065
|
-
let outcome = "failure";
|
|
1066
|
-
try {
|
|
1067
|
-
const pending = await IndexedDBManager.getPendingWalletRegistrationCommit({
|
|
1068
|
-
registrationCeremonyId: base.registrationCeremonyId,
|
|
1069
|
-
operation: "near_provisioning"
|
|
1070
|
-
});
|
|
1071
|
-
if (!pending || pending.operation !== "near_provisioning" || pending.phase !== "planned") throw new Error("NEAR registration has no planned continuation");
|
|
1072
|
-
let preAdmittedReceipt;
|
|
1073
|
-
try {
|
|
1074
|
-
const admitted = await input.admission;
|
|
1075
|
-
if (!sameRouterAbEd25519YaoRegistrationAdmissionRequestV1(admitted.deferredNear.admissionRequest, pending.admissionRequest)) throw new Error("NEAR admission changed the authorized request");
|
|
1076
|
-
preAdmittedReceipt = admitted.admissionReceipt;
|
|
1077
|
-
} catch (error) {
|
|
1078
|
-
if (error instanceof Error && error.message === "NEAR admission changed the authorized request") throw error;
|
|
1079
|
-
preAdmittedReceipt = void 0;
|
|
1080
|
-
}
|
|
1081
|
-
const { joined, admissionReceipt } = await continueNearRegistrationCustody({
|
|
1082
|
-
pending,
|
|
1083
|
-
signingEngine: base.context.signingEngine,
|
|
1084
|
-
relayerUrl: base.relayerUrl,
|
|
1085
|
-
credential: base.signedSetup,
|
|
1086
|
-
traceContext: base.traceContext,
|
|
1087
|
-
factorSecret,
|
|
1088
|
-
...preAdmittedReceipt ? { admitted: preAdmittedReceipt } : {}
|
|
1089
|
-
});
|
|
1090
|
-
outcome = "success";
|
|
1091
|
-
return {
|
|
1092
|
-
admissionReceipt,
|
|
1093
|
-
joined,
|
|
1094
|
-
admissionRequest: pending.admissionRequest,
|
|
1095
|
-
envelope: custodyEnvelopeFromRegistrationCommit({
|
|
1096
|
-
commit: input.establishedEvmCustodyCommit,
|
|
1097
|
-
walletId: pending.walletId,
|
|
1098
|
-
activatedAtMs: Date.now()
|
|
1099
|
-
}),
|
|
1100
|
-
factorSecret32: factorSecret
|
|
1101
|
-
};
|
|
1102
|
-
} catch (error) {
|
|
1103
|
-
zeroizeArrayBuffer(factorSecret);
|
|
1104
|
-
throw error;
|
|
1105
|
-
} finally {
|
|
1106
|
-
emitNearRegistrationTiming({
|
|
1107
|
-
ceremonyId: base.registrationCeremonyId,
|
|
1108
|
-
stage: "custody_join",
|
|
1109
|
-
startedAt,
|
|
1110
|
-
outcome
|
|
1111
|
-
});
|
|
1112
|
-
}
|
|
1113
|
-
}
|
|
1114
|
-
async function resolveNearRegistrationAdmissionReceipt(args) {
|
|
1115
|
-
if (args.pending.phase === "execution_prepared") return args.pending.admissionReceipt;
|
|
1116
|
-
if (args.admitted) return args.admitted;
|
|
1117
|
-
return await admitDeferredNearRegistration({
|
|
1118
|
-
status: "deferred",
|
|
1119
|
-
admissionRequest: args.pending.admissionRequest
|
|
1120
|
-
}, {
|
|
1121
|
-
routerOrigin: new URL(args.relayerUrl).origin,
|
|
1122
|
-
authorization: {
|
|
1123
|
-
kind: "bearer",
|
|
1124
|
-
value: `Bearer ${args.credential}`
|
|
1125
|
-
},
|
|
1126
|
-
fetch: globalThis.fetch,
|
|
1127
|
-
traceContext: args.traceContext
|
|
1128
|
-
});
|
|
1129
|
-
}
|
|
1130
|
-
async function continueNearRegistrationCustody(args) {
|
|
1131
|
-
const journal = args.pending;
|
|
1132
|
-
if (journal.phase === "joined" && journal.completion.kind !== "encrypted_checkpoint") throw new Error("Joined material has no encrypted execution checkpoint");
|
|
1133
|
-
const pending = journal.phase === "joined" && journal.completion.kind === "encrypted_checkpoint" ? journal.completion.prepared : journal;
|
|
1134
|
-
if (pending.phase === "joined") throw new Error("Invalid NEAR continuation phase");
|
|
1135
|
-
const admission = pending.admissionRequest;
|
|
1136
|
-
const admissionStartedAt = performance.now();
|
|
1137
|
-
const admissionReceipt = await resolveNearRegistrationAdmissionReceipt({
|
|
1138
|
-
pending,
|
|
1139
|
-
relayerUrl: args.relayerUrl,
|
|
1140
|
-
credential: args.credential,
|
|
1141
|
-
traceContext: args.traceContext,
|
|
1142
|
-
...args.admitted ? { admitted: args.admitted } : {}
|
|
1143
|
-
});
|
|
1144
|
-
recordWalletCustodyTiming(pending.registrationCeremonyId, "admission", admissionStartedAt);
|
|
1145
|
-
const joined = await args.signingEngine.joinWalletCustodyNearEd25519KeySet({
|
|
1146
|
-
...pending.phase === "planned" ? {
|
|
1147
|
-
preparation: { kind: "fresh" },
|
|
1148
|
-
beforeRouterRound: persistPreparedNearRegistration.bind(void 0, pending, admissionReceipt)
|
|
1149
|
-
} : { preparation: {
|
|
1150
|
-
kind: "checkpoint",
|
|
1151
|
-
checkpointJson: pending.checkpointJson
|
|
1152
|
-
} },
|
|
1153
|
-
custodyJson: joinCustodyJsonFromEstablishedCommitPayload(pending.baseCustodyCommit),
|
|
1154
|
-
factorSecret: args.factorSecret,
|
|
1155
|
-
nearEd25519SigningKeyId: admission.application_binding.near_ed25519_signing_key_id,
|
|
1156
|
-
registrationCeremonyId: pending.registrationCeremonyId,
|
|
1157
|
-
admissionRequest: admission,
|
|
1158
|
-
admissionReceipt,
|
|
1159
|
-
participantIds: admission.participant_ids,
|
|
1160
|
-
routerOrigin: new URL(args.relayerUrl).origin,
|
|
1161
|
-
authorization: `Bearer ${args.credential}`,
|
|
1162
|
-
traceContext: args.traceContext
|
|
1163
|
-
});
|
|
1164
|
-
if (journal.phase === "joined") {
|
|
1165
|
-
if (base64UrlEncode(joined.metadata.registeredPublicKey) !== journal.localMaterial.ed25519.metadata.registeredPublicKeyB64u || JSON.stringify(joined.activationReference) !== JSON.stringify(journal.localMaterial.ed25519.activationReference)) throw new Error("Restored NEAR checkpoint changed the joined key");
|
|
1166
|
-
return {
|
|
1167
|
-
joined,
|
|
1168
|
-
admissionReceipt
|
|
1169
|
-
};
|
|
1170
|
-
}
|
|
1171
|
-
const journalStartedAt = performance.now();
|
|
1172
|
-
const prepared = await IndexedDBManager.getPendingWalletRegistrationCommit({
|
|
1173
|
-
registrationCeremonyId: pending.registrationCeremonyId,
|
|
1174
|
-
operation: "near_provisioning"
|
|
1175
|
-
});
|
|
1176
|
-
if (!prepared || prepared.operation !== "near_provisioning" || prepared.phase !== "execution_prepared") throw new Error("NEAR execution checkpoint was not persisted");
|
|
1177
|
-
const joinedPending = buildPendingRegistrationCommit({
|
|
1178
|
-
operation: "near_provisioning",
|
|
1179
|
-
signerPlanKind: "near_ed25519_and_evm_family_ecdsa",
|
|
1180
|
-
completion: {
|
|
1181
|
-
kind: "encrypted_checkpoint",
|
|
1182
|
-
prepared
|
|
1183
|
-
},
|
|
1184
|
-
registrationCeremonyId: prepared.registrationCeremonyId,
|
|
1185
|
-
idempotencyKey: await deriveNearProvisioningIdempotencyKey({
|
|
1186
|
-
registrationCeremonyId: prepared.registrationCeremonyId,
|
|
1187
|
-
activationReference: joined.activationReference
|
|
1188
|
-
}),
|
|
1189
|
-
walletId: prepared.walletId,
|
|
1190
|
-
walletAuthMethodId: prepared.walletAuthMethodId,
|
|
1191
|
-
signedSetup: prepared.signedSetup,
|
|
1192
|
-
auth: prepared.auth,
|
|
1193
|
-
createdAtMs: prepared.createdAtMs,
|
|
1194
|
-
updatedAtMs: Date.now(),
|
|
1195
|
-
localMaterial: {
|
|
1196
|
-
keyFamilies: ["ed25519"],
|
|
1197
|
-
custodyCommit: joined.commitPayload,
|
|
1198
|
-
ed25519: {
|
|
1199
|
-
activationReference: joined.activationReference,
|
|
1200
|
-
localMaterial: joined.localMaterial,
|
|
1201
|
-
metadata: pendingRegistrationEd25519MetadataFromJoined(joined)
|
|
1202
|
-
}
|
|
1203
|
-
}
|
|
1204
|
-
});
|
|
1205
|
-
if (joinedPending.operation !== "near_provisioning" || joinedPending.phase !== "joined") throw new Error("Invalid joined NEAR continuation");
|
|
1206
|
-
await IndexedDBManager.advancePendingNearRegistration({
|
|
1207
|
-
expected: prepared,
|
|
1208
|
-
next: joinedPending
|
|
1209
|
-
});
|
|
1210
|
-
recordWalletCustodyTiming(pending.registrationCeremonyId, "journal_joined", journalStartedAt);
|
|
1211
|
-
return {
|
|
1212
|
-
joined,
|
|
1213
|
-
admissionReceipt
|
|
1214
|
-
};
|
|
1215
|
-
}
|
|
1216
|
-
function nearRegistrationChainTarget(target) {
|
|
1217
|
-
return target.chainTarget;
|
|
1218
|
-
}
|
|
1219
|
-
function resumedNearRegistrationAuth(pending, factor) {
|
|
1220
|
-
if (pending.auth.kind === "passkey" && factor.kind === "passkey" && pending.auth.rpId === factor.rpId && pending.auth.credentialIdB64u === factor.credentialIdB64u) return {
|
|
1221
|
-
kind: "passkey",
|
|
1222
|
-
rpId: factor.rpId,
|
|
1223
|
-
credentialIdB64u: factor.credentialIdB64u,
|
|
1224
|
-
prfFirstB64u: factor.prfFirstB64u
|
|
1225
|
-
};
|
|
1226
|
-
if (pending.auth.kind === "email_otp" && factor.kind === "email_otp" && pending.auth.providerSubject === factor.providerSubject) {
|
|
1227
|
-
const authority = parseEmailOtpWalletAuthAuthority({
|
|
1228
|
-
walletId: pending.walletId,
|
|
1229
|
-
bindingId: pending.walletAuthMethodId,
|
|
1230
|
-
factor: {
|
|
1231
|
-
kind: "email_otp",
|
|
1232
|
-
provider: factor.provider,
|
|
1233
|
-
providerUserId: factor.providerSubject
|
|
1234
|
-
},
|
|
1235
|
-
verifier: {
|
|
1236
|
-
kind: "email_otp_wallet_auth_method",
|
|
1237
|
-
emailHashHex: factor.emailHashHex
|
|
1238
|
-
}
|
|
1239
|
-
});
|
|
1240
|
-
if (!authority) throw new Error("NEAR continuation requires its founding Email OTP method");
|
|
1241
|
-
return {
|
|
1242
|
-
kind: "email_otp",
|
|
1243
|
-
enrollment: pending.auth.enrollment,
|
|
1244
|
-
emailOtpAuthContext: buildEmailOtpAuthContext({
|
|
1245
|
-
policy: "session",
|
|
1246
|
-
retention: "session",
|
|
1247
|
-
reason: "login",
|
|
1248
|
-
authority
|
|
1249
|
-
})
|
|
1250
|
-
};
|
|
1251
|
-
}
|
|
1252
|
-
throw new Error("NEAR continuation requires its founding authentication method");
|
|
1253
|
-
}
|
|
1254
|
-
async function resumeNearRegistrationCustodyWork(args) {
|
|
1255
|
-
await requireCurrentNearRegistrationSession(args.sessionAuthority);
|
|
1256
|
-
if (args.pending.phase === "joined" && args.pending.completion.kind === "sealed_material") {
|
|
1257
|
-
const restored = await restorePendingNearRegistrationMaterial({
|
|
1258
|
-
pending: args.pending,
|
|
1259
|
-
relayerUrl: args.relayerUrl,
|
|
1260
|
-
operationCredential: args.sessionAuthority.operationCredential
|
|
1261
|
-
});
|
|
1262
|
-
return {
|
|
1263
|
-
joined: restored.joined,
|
|
1264
|
-
admissionRequest: restored.admissionRequest,
|
|
1265
|
-
admissionReceipt: restored.admissionReceipt,
|
|
1266
|
-
envelope: args.envelope,
|
|
1267
|
-
factorSecret32: args.factorSecret
|
|
1268
|
-
};
|
|
1269
|
-
}
|
|
1270
|
-
const prepared = args.pending.phase === "joined" ? args.pending.completion.prepared : args.pending;
|
|
1271
|
-
if (!prepared) throw new Error("NEAR continuation has no encrypted checkpoint");
|
|
1272
|
-
const result = await continueNearRegistrationCustody({
|
|
1273
|
-
pending: args.pending,
|
|
1274
|
-
signingEngine: args.context.signingEngine,
|
|
1275
|
-
relayerUrl: args.relayerUrl,
|
|
1276
|
-
credential: args.sessionAuthority.operationCredential.token,
|
|
1277
|
-
traceContext: createRouterAbTraceContextV1(),
|
|
1278
|
-
factorSecret: args.factorSecret
|
|
1279
|
-
});
|
|
1280
|
-
return {
|
|
1281
|
-
joined: result.joined,
|
|
1282
|
-
admissionReceipt: result.admissionReceipt,
|
|
1283
|
-
admissionRequest: prepared.admissionRequest,
|
|
1284
|
-
envelope: args.envelope,
|
|
1285
|
-
factorSecret32: args.factorSecret
|
|
1286
|
-
};
|
|
1287
|
-
}
|
|
1288
|
-
/** Owns the factor copy; ordinary unlock is already complete when this starts. */
|
|
1289
|
-
async function resumeNearRegistrationAfterUnlock(args) {
|
|
1290
|
-
const startedAt = performance.now();
|
|
1291
|
-
try {
|
|
1292
|
-
const rows = await IndexedDBManager.listPendingWalletRegistrationCommits();
|
|
1293
|
-
for (const pending of rows) {
|
|
1294
|
-
if (pending.operation !== "near_provisioning" || pending.walletId !== args.sessionAuthority.record.walletId || pending.walletAuthMethodId !== args.sessionAuthority.record.authMethodId || pending.signerPlanKind !== "near_ed25519_and_evm_family_ecdsa") continue;
|
|
1295
|
-
if (await IndexedDBManager.getPendingWalletRegistrationCommit({
|
|
1296
|
-
registrationCeremonyId: pending.registrationCeremonyId,
|
|
1297
|
-
operation: "registration_activate"
|
|
1298
|
-
})) continue;
|
|
1299
|
-
const relayerUrl = args.context.configs.network.relayer.url;
|
|
1300
|
-
const authMaterial = resumedNearRegistrationAuth(pending, args.factor);
|
|
1301
|
-
const work = resumeNearRegistrationCustodyWork.bind(void 0, {
|
|
1302
|
-
context: args.context,
|
|
1303
|
-
pending,
|
|
1304
|
-
envelope: args.custodyEnvelope,
|
|
1305
|
-
relayerUrl,
|
|
1306
|
-
sessionAuthority: args.sessionAuthority,
|
|
1307
|
-
factorSecret: args.ownedFactorSecret
|
|
1308
|
-
});
|
|
1309
|
-
await runDeferredEd25519Provisioning({
|
|
1310
|
-
context: args.context,
|
|
1311
|
-
walletId: pending.walletId,
|
|
1312
|
-
commit: {
|
|
1313
|
-
context: args.context,
|
|
1314
|
-
registrationTiming: null,
|
|
1315
|
-
registrationStartedAt: startedAt,
|
|
1316
|
-
clientPrewarm: Promise.resolve(),
|
|
1317
|
-
relayerUrl,
|
|
1318
|
-
registrationCeremonyId: pending.registrationCeremonyId,
|
|
1319
|
-
signedSetup: pending.signedSetup,
|
|
1320
|
-
headers: registrationRouteHeaders(),
|
|
1321
|
-
nearCustodyWork: work,
|
|
1322
|
-
sessionAuthority: args.sessionAuthority,
|
|
1323
|
-
expectedChainTargets: listConfiguredThresholdEcdsaPublicationTargets(args.context.configs.network.chains).map(nearRegistrationChainTarget),
|
|
1324
|
-
walletId: pending.walletId,
|
|
1325
|
-
authMaterial
|
|
1326
|
-
}
|
|
1327
|
-
});
|
|
1328
|
-
}
|
|
1329
|
-
} catch (error) {
|
|
1330
|
-
console.warn("[registration] NEAR continuation remains pending", error instanceof Error ? error.message : "continuation failed");
|
|
1331
|
-
} finally {
|
|
1332
|
-
zeroizeArrayBuffer(args.ownedFactorSecret);
|
|
1333
|
-
}
|
|
1334
|
-
}
|
|
1335
|
-
function requireDeferredNearCustodyWork(work) {
|
|
1336
|
-
if (!work) throw new Error("Mixed registration did not start its NEAR custody join");
|
|
1337
|
-
return work;
|
|
1338
|
-
}
|
|
1339
|
-
function mixedRegistrationSessionFromDeferredResult(existing, result, finalAuthority, finalAuthMethod) {
|
|
1340
|
-
if (result.kind !== "already_committed" || result.session.tokens.kind !== "near_ed25519_and_evm_family_ecdsa") throw new Error("NEAR completion must extend the current Wallet Session");
|
|
1341
|
-
const projection = result.session;
|
|
1342
|
-
const current = existing.record;
|
|
1343
|
-
const next = projection.walletSession;
|
|
1344
|
-
if (projection.walletId !== current.walletId || projection.authorizationId !== current.authorizationId || projection.quotaId !== current.quotaId || projection.walletSessionId !== existing.operationCredential.walletSessionId || next.authorityId !== current.authorityId || next.authMethodId !== current.authMethodId || next.issuedAtMs !== current.issuedAtMs || next.expiresAtMs !== current.expiresAtMs || next.authorityRevocationEpoch !== current.authorityRevocationEpoch || next.expiresAtMs <= Date.now() || !walletSessionPreservesCapabilities(current, next) || finalAuthority.authorityId !== next.authorityId || finalAuthority.walletId !== next.walletId || finalAuthority.authorityDigestB64u !== next.authorityDigestB64u || finalAuthority.revocationEpoch !== next.authorityRevocationEpoch || finalAuthMethod.walletAuthMethodId !== next.authMethodId || finalAuthMethod.walletId !== next.walletId || finalAuthMethod.walletAuthorityId !== next.authorityId) throw new Error("NEAR completion changed the current Wallet Session authority");
|
|
1345
|
-
return {
|
|
1346
|
-
kind: "registration_established_wallet_session_v2",
|
|
1347
|
-
walletId: projection.walletId,
|
|
1348
|
-
authorizationId: projection.authorizationId,
|
|
1349
|
-
walletSessionId: projection.walletSessionId,
|
|
1350
|
-
quotaId: projection.quotaId,
|
|
1351
|
-
expiresAtMs: projection.expiresAtMs,
|
|
1352
|
-
remainingUses: projection.remainingUses,
|
|
1353
|
-
walletSession: next,
|
|
1354
|
-
operationCredential: existing.operationCredential,
|
|
1355
|
-
tokens: projection.tokens
|
|
1356
|
-
};
|
|
1357
|
-
}
|
|
1358
|
-
async function requireCurrentNearRegistrationSession(expected) {
|
|
1359
|
-
const current = await walletSessionAuthorizations.readExactWithOperationCredential({
|
|
1360
|
-
walletId: expected.record.walletId,
|
|
1361
|
-
authorityId: expected.record.authorityId,
|
|
1362
|
-
authMethodId: expected.record.authMethodId
|
|
1363
|
-
});
|
|
1364
|
-
if (current.kind !== "found" || current.record.expiresAtMs <= Date.now() || current.record.authorizationId !== expected.record.authorizationId || current.record.authorityRevocationEpoch !== expected.record.authorityRevocationEpoch || current.operationCredential.token !== expected.operationCredential.token) throw new Error("NEAR continuation requires the current unlocked Wallet Session");
|
|
1365
|
-
}
|
|
1366
|
-
async function readJoinedNearRegistrationCommit(args) {
|
|
1367
|
-
const pending = await IndexedDBManager.getPendingWalletRegistrationCommit({
|
|
1368
|
-
registrationCeremonyId: args.registrationCeremonyId,
|
|
1369
|
-
operation: "near_provisioning"
|
|
1370
|
-
});
|
|
1371
|
-
if (!pending || pending.operation !== "near_provisioning" || pending.phase !== "joined" || pending.walletId !== args.walletId || pending.walletAuthMethodId !== args.walletAuthMethodId) throw new Error("NEAR joined checkpoint was not persisted");
|
|
1372
|
-
return pending;
|
|
1373
|
-
}
|
|
1374
|
-
async function activatePasskeyRegistrationEd25519Material(args) {
|
|
1375
|
-
const { metadata, materialFacts } = args;
|
|
1376
|
-
const activationFacts = {
|
|
1377
|
-
materialActivation: nearEd25519YaoMaterialActivationFromMetadata(metadata),
|
|
1378
|
-
lifecycleId: metadata.scope.lifecycle_id,
|
|
1379
|
-
signingRootVersion: metadata.scope.root_share_epoch,
|
|
1380
|
-
signingRootId: metadata.applicationBinding.signing_root_id,
|
|
1381
|
-
signerSetId: metadata.scope.signer_set_id,
|
|
1382
|
-
thresholdSessionId: materialFacts.identity.thresholdSessionId,
|
|
1383
|
-
activationTranscriptB64u: base64UrlEncode(metadata.transcript),
|
|
1384
|
-
activationCapabilityBindingB64u: base64UrlEncode(Uint8Array.from(metadata.activeCapabilityBinding))
|
|
1385
|
-
};
|
|
1386
|
-
let activeClient = null;
|
|
1387
|
-
try {
|
|
1388
|
-
activeClient = await openWalletCustodyEd25519ActiveClientV1({
|
|
1389
|
-
material: args.material,
|
|
1390
|
-
activation: activationFacts,
|
|
1391
|
-
envelope: args.envelope,
|
|
1392
|
-
ownedFactorSecret: args.ownedFactorSecret
|
|
1393
|
-
});
|
|
1394
|
-
await persistPasskeyEd25519YaoSignerMaterialV1({
|
|
1395
|
-
store: IndexedDBManager,
|
|
1396
|
-
activeClient,
|
|
1397
|
-
identity: {
|
|
1398
|
-
walletId: materialFacts.identity.walletId,
|
|
1399
|
-
nearAccountId: materialFacts.identity.nearAccountId,
|
|
1400
|
-
nearEd25519SigningKeyId: materialFacts.identity.nearEd25519SigningKeyId,
|
|
1401
|
-
thresholdSessionId: materialFacts.identity.thresholdSessionId,
|
|
1402
|
-
signerSlot: materialFacts.identity.signerSlot,
|
|
1403
|
-
rpId: args.rpId,
|
|
1404
|
-
credentialIdB64u: args.credentialIdB64u,
|
|
1405
|
-
signingRootId: materialFacts.identity.signingRootId,
|
|
1406
|
-
signingRootVersion: materialFacts.identity.signingRootVersion,
|
|
1407
|
-
signingWorkerId: materialFacts.stableServerScope.routerAbNormalSigning.signingWorkerId
|
|
1408
|
-
},
|
|
1409
|
-
stableServerScope: materialFacts.stableServerScope,
|
|
1410
|
-
passkeyPrfFirstB64u: args.passkeyPrfFirstB64u
|
|
1411
|
-
});
|
|
1412
|
-
await requireCurrentNearRegistrationSession(args.sessionAuthority);
|
|
1413
|
-
await args.signingEngine.activateVerifiedNearEd25519YaoMaterial({
|
|
1414
|
-
activeClient,
|
|
1415
|
-
facts: {
|
|
1416
|
-
thresholdSessionId: materialFacts.identity.thresholdSessionId,
|
|
1417
|
-
signer: nearEd25519SignerBindingFromBoundaryFields({
|
|
1418
|
-
walletId: toWalletId(materialFacts.identity.walletId),
|
|
1419
|
-
nearAccountId: toAccountId(materialFacts.identity.nearAccountId),
|
|
1420
|
-
nearEd25519SigningKeyId: parseNearEd25519SigningKeyId(materialFacts.identity.nearEd25519SigningKeyId),
|
|
1421
|
-
signerSlot: materialFacts.identity.signerSlot
|
|
1422
|
-
}),
|
|
1423
|
-
signingRootId: materialFacts.identity.signingRootId,
|
|
1424
|
-
signingRootVersion: materialFacts.identity.signingRootVersion,
|
|
1425
|
-
routerAbNormalSigning: materialFacts.stableServerScope.routerAbNormalSigning,
|
|
1426
|
-
runtimePolicyScope: materialFacts.stableServerScope.runtimePolicyScope,
|
|
1427
|
-
relayerUrl: args.relayerUrl
|
|
1428
|
-
}
|
|
1429
|
-
});
|
|
1430
|
-
await requireCurrentNearRegistrationSession(args.sessionAuthority);
|
|
1431
|
-
activeClient = null;
|
|
1432
|
-
} catch (error) {
|
|
1433
|
-
activeClient?.dispose();
|
|
1434
|
-
throw error;
|
|
1435
|
-
} finally {
|
|
1436
|
-
args.ownedFactorSecret.fill(0);
|
|
1437
|
-
}
|
|
1438
|
-
}
|
|
1439
|
-
async function prewarmDeferredPasskeyEd25519Client(auth) {
|
|
1440
|
-
if (auth.kind !== "passkey") return;
|
|
1441
|
-
try {
|
|
1442
|
-
await RouterAbEd25519YaoClientV1.initializeBundled();
|
|
1443
|
-
} catch {}
|
|
1444
|
-
}
|
|
1445
|
-
async function hydrateDeferredNearRegistrationSession(args) {
|
|
1446
|
-
const startedAt = performance.now();
|
|
1447
|
-
let outcome = "failure";
|
|
1448
|
-
try {
|
|
1449
|
-
await args.signingEngine.hydrateSigningSession(args.input);
|
|
1450
|
-
outcome = "success";
|
|
1451
|
-
return { kind: "completed" };
|
|
1452
|
-
} catch (error) {
|
|
1453
|
-
return {
|
|
1454
|
-
kind: "failed",
|
|
1455
|
-
error
|
|
1456
|
-
};
|
|
1457
|
-
} finally {
|
|
1458
|
-
emitNearRegistrationTiming({
|
|
1459
|
-
ceremonyId: args.ceremonyId,
|
|
1460
|
-
stage: "session_hydration",
|
|
1461
|
-
startedAt,
|
|
1462
|
-
outcome
|
|
1463
|
-
});
|
|
1464
|
-
}
|
|
1465
|
-
}
|
|
1466
|
-
async function prepareDeferredNearSessionHydration(args) {
|
|
1467
|
-
const startedAt = performance.now();
|
|
1468
|
-
let outcome = "failure";
|
|
1469
|
-
try {
|
|
1470
|
-
await args.signingEngine.prepareSigningSessionHydration(args.input);
|
|
1471
|
-
outcome = "success";
|
|
1472
|
-
return { kind: "completed" };
|
|
1473
|
-
} catch (error) {
|
|
1474
|
-
return {
|
|
1475
|
-
kind: "failed",
|
|
1476
|
-
error
|
|
1477
|
-
};
|
|
1478
|
-
} finally {
|
|
1479
|
-
emitNearRegistrationTiming({
|
|
1480
|
-
ceremonyId: args.ceremonyId,
|
|
1481
|
-
stage: "session_seal_preparation",
|
|
1482
|
-
startedAt,
|
|
1483
|
-
outcome
|
|
1484
|
-
});
|
|
1485
|
-
}
|
|
1486
|
-
}
|
|
1487
|
-
function startNearRegistrationSealPreparation(args) {
|
|
1488
|
-
const sessionId = parseThresholdEd25519SessionId(args.thresholdSessionId);
|
|
1489
|
-
if (!sessionId.ok) throw new Error("Invalid admitted NEAR session identity");
|
|
1490
|
-
const preparationId = createRegistrationOperationIdempotencyKey("near-session-client-seal");
|
|
1491
|
-
return {
|
|
1492
|
-
kind: "preparing",
|
|
1493
|
-
thresholdSessionId: String(sessionId.value),
|
|
1494
|
-
preparationId,
|
|
1495
|
-
result: prepareDeferredNearSessionHydration({
|
|
1496
|
-
signingEngine: args.signingEngine,
|
|
1497
|
-
ceremonyId: args.ceremonyId,
|
|
1498
|
-
input: {
|
|
1499
|
-
preparationId,
|
|
1500
|
-
thresholdSessionId: String(sessionId.value),
|
|
1501
|
-
prfFirstB64u: args.prfFirstB64u
|
|
1502
|
-
}
|
|
1503
|
-
})
|
|
1504
|
-
};
|
|
1505
|
-
}
|
|
1506
|
-
async function prepareNearSessionSealWhileCustodyRuns(args) {
|
|
1507
|
-
try {
|
|
1508
|
-
await requireCurrentNearRegistrationSession(args.sessionAuthority);
|
|
1509
|
-
const pending = await IndexedDBManager.getPendingWalletRegistrationCommit({
|
|
1510
|
-
registrationCeremonyId: args.ceremonyId,
|
|
1511
|
-
operation: "near_provisioning"
|
|
1512
|
-
});
|
|
1513
|
-
if (!pending || pending.operation !== "near_provisioning" || pending.phase === "joined") return { kind: "none" };
|
|
1514
|
-
if (pending.walletId !== args.sessionAuthority.record.walletId || pending.walletAuthMethodId !== args.sessionAuthority.record.authMethodId) return { kind: "none" };
|
|
1515
|
-
return startNearRegistrationSealPreparation({
|
|
1516
|
-
signingEngine: args.signingEngine,
|
|
1517
|
-
ceremonyId: args.ceremonyId,
|
|
1518
|
-
thresholdSessionId: pending.admissionRequest.scope.threshold_session_id,
|
|
1519
|
-
prfFirstB64u: args.prfFirstB64u
|
|
1520
|
-
});
|
|
1521
|
-
} catch {
|
|
1522
|
-
return { kind: "none" };
|
|
1523
|
-
}
|
|
1524
|
-
}
|
|
1525
|
-
function nearRegistrationProfileUnavailable() {
|
|
1526
|
-
return null;
|
|
1527
|
-
}
|
|
1528
|
-
/** NEAR failures retain their repair journal while the committed ECDSA wallet stays usable. */
|
|
1529
|
-
async function commitDeferredEd25519Registration(args) {
|
|
1530
|
-
const auth = args.authMaterial;
|
|
1531
|
-
const startedAt = performance.now();
|
|
1532
|
-
let outcome = "failure";
|
|
1533
|
-
let retainedFactorSecret32 = null;
|
|
1534
|
-
let hydration = Promise.resolve({ kind: "completed" });
|
|
1535
|
-
let preparation = { kind: "none" };
|
|
1536
|
-
try {
|
|
1537
|
-
if (auth.kind === "passkey") preparation = await prepareNearSessionSealWhileCustodyRuns({
|
|
1538
|
-
signingEngine: args.context.signingEngine,
|
|
1539
|
-
ceremonyId: args.registrationCeremonyId,
|
|
1540
|
-
sessionAuthority: args.sessionAuthority,
|
|
1541
|
-
prfFirstB64u: auth.prfFirstB64u
|
|
1542
|
-
});
|
|
1543
|
-
const nearCustody = await args.nearCustodyWork();
|
|
1544
|
-
retainedFactorSecret32 = nearCustody.factorSecret32;
|
|
1545
|
-
const joined = nearCustody.joined;
|
|
1546
|
-
const clientPublicKey = `ed25519:${base58Encode(joined.metadata.registeredPublicKey)}`;
|
|
1547
|
-
const activationReference = joined.activationReference;
|
|
1548
|
-
const nearProvisioningIdempotencyKey = await deriveNearProvisioningIdempotencyKey({
|
|
1549
|
-
registrationCeremonyId: args.registrationCeremonyId,
|
|
1550
|
-
activationReference
|
|
1551
|
-
});
|
|
1552
|
-
const pending = await readJoinedNearRegistrationCommit({
|
|
1553
|
-
registrationCeremonyId: args.registrationCeremonyId,
|
|
1554
|
-
walletId: args.walletId,
|
|
1555
|
-
walletAuthMethodId: String(args.sessionAuthority.record.authMethodId)
|
|
1556
|
-
});
|
|
1557
|
-
await requireCurrentNearRegistrationSession(args.sessionAuthority);
|
|
1558
|
-
if (auth.kind === "passkey" && preparation.kind === "none") preparation = startNearRegistrationSealPreparation({
|
|
1559
|
-
signingEngine: args.context.signingEngine,
|
|
1560
|
-
ceremonyId: args.registrationCeremonyId,
|
|
1561
|
-
thresholdSessionId: joined.metadata.scope.threshold_session_id,
|
|
1562
|
-
prfFirstB64u: auth.prfFirstB64u
|
|
1563
|
-
});
|
|
1564
|
-
let preparedSessionSeal;
|
|
1565
|
-
if (preparation.kind === "preparing") {
|
|
1566
|
-
const preparationWaitStartedAt = performance.now();
|
|
1567
|
-
const prepared = await preparation.result;
|
|
1568
|
-
emitNearRegistrationTiming({
|
|
1569
|
-
ceremonyId: args.registrationCeremonyId,
|
|
1570
|
-
stage: "session_seal_preparation_wait",
|
|
1571
|
-
startedAt: preparationWaitStartedAt,
|
|
1572
|
-
outcome: prepared.kind === "completed" ? "success" : "failure"
|
|
1573
|
-
});
|
|
1574
|
-
if (prepared.kind === "failed") throw prepared.error;
|
|
1575
|
-
await requireCurrentNearRegistrationSession(args.sessionAuthority);
|
|
1576
|
-
const clientSeal = await args.context.signingEngine.readPreparedSigningSessionHydration({
|
|
1577
|
-
thresholdSessionId: preparation.thresholdSessionId,
|
|
1578
|
-
preparationId: preparation.preparationId
|
|
1579
|
-
});
|
|
1580
|
-
preparedSessionSeal = {
|
|
1581
|
-
preparationId: preparation.preparationId,
|
|
1582
|
-
thresholdSessionId: preparation.thresholdSessionId,
|
|
1583
|
-
ciphertext: clientSeal.ciphertext
|
|
1584
|
-
};
|
|
1585
|
-
}
|
|
1586
|
-
const finalizationStartedAt = performance.now();
|
|
1587
|
-
const nearProvisioningRequest = {
|
|
1588
|
-
relayerUrl: args.relayerUrl,
|
|
1589
|
-
registrationCeremonyId: args.registrationCeremonyId,
|
|
1590
|
-
signedSetup: args.signedSetup,
|
|
1591
|
-
headers: {
|
|
1592
|
-
...args.headers,
|
|
1593
|
-
Authorization: `Bearer ${args.sessionAuthority.operationCredential.token}`
|
|
1594
|
-
},
|
|
1595
|
-
idempotencyKey: nearProvisioningIdempotencyKey,
|
|
1596
|
-
ed25519: { activationReference },
|
|
1597
|
-
walletCustodyCommit: joined.commitPayload,
|
|
1598
|
-
onServerTiming: recordRegistrationServerTimingBuckets.bind(void 0, args.registrationTiming)
|
|
1599
|
-
};
|
|
1600
|
-
let completed;
|
|
1601
|
-
if (preparedSessionSeal) {
|
|
1602
|
-
if (args.authMaterial.kind !== "passkey") throw new Error("Prepared session sealing requires a passkey authority");
|
|
1603
|
-
completed = await completeWalletRegistrationNearProvisioning({
|
|
1604
|
-
...nearProvisioningRequest,
|
|
1605
|
-
auth: { kind: "passkey" },
|
|
1606
|
-
sessionSeal: {
|
|
1607
|
-
thresholdSessionId: preparedSessionSeal.thresholdSessionId,
|
|
1608
|
-
ciphertext: preparedSessionSeal.ciphertext
|
|
1609
|
-
}
|
|
1610
|
-
});
|
|
1611
|
-
} else completed = await completeWalletRegistrationNearProvisioning({
|
|
1612
|
-
...nearProvisioningRequest,
|
|
1613
|
-
auth: args.authMaterial
|
|
1614
|
-
});
|
|
1615
|
-
if (!completed.ok) throw new Error("Deferred NEAR provisioning did not complete");
|
|
1616
|
-
const finalized = completed;
|
|
1617
|
-
if (finalized.kind !== "near_ed25519") throw new Error("Deferred Ed25519 finalize returned a different signer branch");
|
|
1618
|
-
if (finalized.walletCustody?.status !== "joined") {
|
|
1619
|
-
const status = finalized.walletCustody?.status ?? "not_reported";
|
|
1620
|
-
throw new Error(`Deferred NEAR custody join did not commit (${status})`);
|
|
1621
|
-
}
|
|
1622
|
-
if (preparedSessionSeal && !finalized.sessionSeal) throw new Error("Deferred NEAR finalization did not return the prepared session seal");
|
|
1623
|
-
emitNearRegistrationTiming({
|
|
1624
|
-
ceremonyId: args.registrationCeremonyId,
|
|
1625
|
-
stage: "server_finalize",
|
|
1626
|
-
startedAt: finalizationStartedAt,
|
|
1627
|
-
outcome: "success"
|
|
1628
|
-
});
|
|
1629
|
-
const registrationSession = mixedRegistrationSessionFromDeferredResult(args.sessionAuthority, finalized.registrationEstablishedSession, finalized.foundingAuthority, finalized.foundingAuthMethod);
|
|
1630
|
-
const nearAccountId = toAccountId(finalized.ed25519.nearAccountId);
|
|
1631
|
-
const passkeyCredentialIdB64u = args.authMaterial.kind === "passkey" ? args.authMaterial.credentialIdB64u : "";
|
|
1632
|
-
if (auth.kind === "passkey") requireEd25519YaoRegistrationPublicResultMatches({
|
|
1633
|
-
clientPublicKey,
|
|
1634
|
-
finalized,
|
|
1635
|
-
expectedRpId: auth.rpId,
|
|
1636
|
-
expectedWalletId: args.walletId
|
|
1637
|
-
});
|
|
1638
|
-
else requireEmailOtpEd25519YaoRegistrationPublicResultMatches({
|
|
1639
|
-
clientPublicKey,
|
|
1640
|
-
finalized,
|
|
1641
|
-
expectedRegistrationAuthorityId: pending.auth.kind === "email_otp" ? pending.auth.registrationAuthorityId : "",
|
|
1642
|
-
expectedWalletId: args.walletId
|
|
1643
|
-
});
|
|
1644
|
-
const materialFacts = registrationEd25519MaterialFacts({
|
|
1645
|
-
deferredNear: {
|
|
1646
|
-
status: "deferred",
|
|
1647
|
-
admissionRequest: nearCustody.admissionRequest
|
|
1648
|
-
},
|
|
1649
|
-
finalized: finalized.ed25519,
|
|
1650
|
-
walletId: args.walletId,
|
|
1651
|
-
expectedRuntimePolicyScope: normalizeRuntimePolicyScope(finalized.ed25519.runtimePolicyScope)
|
|
1652
|
-
});
|
|
1653
|
-
const metadata = joined.metadata;
|
|
1654
|
-
const materialActivation = nearEd25519YaoMaterialActivationFromMetadata(metadata);
|
|
1655
|
-
const custodyMaterial = walletCustodyRegistrationMaterial({
|
|
1656
|
-
established: joined,
|
|
1657
|
-
walletId: String(args.walletId),
|
|
1658
|
-
nearAccountId: String(nearAccountId),
|
|
1659
|
-
nearEd25519SigningKeyId: finalized.ed25519.nearEd25519SigningKeyId,
|
|
1660
|
-
signerSlot: finalized.ed25519.signerSlot
|
|
1661
|
-
});
|
|
1662
|
-
const publicationStartedAt = performance.now();
|
|
1663
|
-
const registration = await registrationProjectionFromPending(pending, finalized);
|
|
1664
|
-
await requireCurrentNearRegistrationSession(args.sessionAuthority);
|
|
1665
|
-
const storedNearActivation = (await IndexedDBManager.publishPendingWalletRegistrationCommitAndRetain({
|
|
1666
|
-
pending,
|
|
1667
|
-
ecdsaContinuity: [],
|
|
1668
|
-
authority: finalized.authority,
|
|
1669
|
-
foundingAuthority: {
|
|
1670
|
-
authority: finalized.foundingAuthority,
|
|
1671
|
-
authMethod: finalized.foundingAuthMethod
|
|
1672
|
-
},
|
|
1673
|
-
request: {
|
|
1674
|
-
operation: pending.operation,
|
|
1675
|
-
registrationCeremonyId: args.registrationCeremonyId,
|
|
1676
|
-
idempotencyKey: pending.idempotencyKey,
|
|
1677
|
-
walletId: args.walletId,
|
|
1678
|
-
walletAuthMethodId: finalized.foundingAuthMethod.walletAuthMethodId
|
|
1679
|
-
},
|
|
1680
|
-
walletSessionPublication: {
|
|
1681
|
-
kind: "credential_free_projection",
|
|
1682
|
-
walletSession: registrationSession.walletSession
|
|
1683
|
-
},
|
|
1684
|
-
registration
|
|
1685
|
-
})).signerActivations[0];
|
|
1686
|
-
if (!storedNearActivation || storedNearActivation.signerSlot !== finalized.ed25519.signerSlot) throw new Error("Deferred Ed25519 registration persisted a different signer slot");
|
|
1687
|
-
const prefillStatusReads = new WalletSessionStatusReadScope();
|
|
1688
|
-
for (const chainTarget of args.expectedChainTargets) scheduleEcdsaSessionPresignaturePrefill({
|
|
1689
|
-
signingEngine: args.context.signingEngine,
|
|
1690
|
-
walletId: args.walletId,
|
|
1691
|
-
chainTarget,
|
|
1692
|
-
trigger: "registration",
|
|
1693
|
-
statusReads: prefillStatusReads
|
|
1694
|
-
});
|
|
1695
|
-
emitNearRegistrationTiming({
|
|
1696
|
-
ceremonyId: args.registrationCeremonyId,
|
|
1697
|
-
stage: "local_publication",
|
|
1698
|
-
startedAt: publicationStartedAt,
|
|
1699
|
-
outcome: "success"
|
|
1700
|
-
});
|
|
1701
|
-
await requireCurrentNearRegistrationSession(args.sessionAuthority);
|
|
1702
|
-
if (args.authMaterial.kind === "passkey" && registrationSession.remainingUses > 0) hydration = hydrateDeferredNearRegistrationSession({
|
|
1703
|
-
signingEngine: args.context.signingEngine,
|
|
1704
|
-
ceremonyId: args.registrationCeremonyId,
|
|
1705
|
-
input: buildRegistrationPasskeyEd25519SessionHydration({
|
|
1706
|
-
session: registrationSession,
|
|
1707
|
-
ceremonyId: args.registrationCeremonyId,
|
|
1708
|
-
walletId: String(args.walletId),
|
|
1709
|
-
relayerUrl: args.relayerUrl,
|
|
1710
|
-
prfFirstB64u: args.authMaterial.prfFirstB64u,
|
|
1711
|
-
preparedServerSeal: preparedSessionSeal && finalized.sessionSeal ? {
|
|
1712
|
-
preparationId: preparedSessionSeal.preparationId,
|
|
1713
|
-
...finalized.sessionSeal
|
|
1714
|
-
} : null,
|
|
1715
|
-
restore: {
|
|
1716
|
-
rpId: args.authMaterial.rpId,
|
|
1717
|
-
nearAccountId: String(nearAccountId),
|
|
1718
|
-
nearEd25519SigningKeyId: finalized.ed25519.nearEd25519SigningKeyId,
|
|
1719
|
-
relayerKeyId: finalized.ed25519.relayerKeyId,
|
|
1720
|
-
participantIds: finalized.ed25519.participantIds,
|
|
1721
|
-
signerSlot: finalized.ed25519.signerSlot,
|
|
1722
|
-
credentialIdB64u: args.authMaterial.credentialIdB64u,
|
|
1723
|
-
materialActivation
|
|
1724
|
-
}
|
|
1725
|
-
})
|
|
1726
|
-
});
|
|
1727
|
-
const sessionStartedAt = performance.now();
|
|
1728
|
-
await args.context.signingEngine.activateAuthenticatedWalletState({
|
|
1729
|
-
walletId: args.walletId,
|
|
1730
|
-
nearAccountId,
|
|
1731
|
-
signerSlot: finalized.ed25519.signerSlot,
|
|
1732
|
-
nearClient: args.context.nearClient
|
|
1733
|
-
});
|
|
1734
|
-
await args.context.signingEngine.upsertEd25519YaoPublicCapabilityLaneReference({
|
|
1735
|
-
walletId: args.walletId,
|
|
1736
|
-
nearAccountId,
|
|
1737
|
-
thresholdSessionId: materialFacts.identity.thresholdSessionId,
|
|
1738
|
-
runtimePolicyScope: materialFacts.stableServerScope.runtimePolicyScope,
|
|
1739
|
-
materialActivation,
|
|
1740
|
-
...registrationEd25519LaneAuthorization(auth, passkeyCredentialIdB64u, registrationSession),
|
|
1741
|
-
nearEd25519SigningKeyId: parseNearEd25519SigningKeyId(finalized.ed25519.nearEd25519SigningKeyId),
|
|
1742
|
-
signerSlot: finalized.ed25519.signerSlot
|
|
1743
|
-
});
|
|
1744
|
-
emitNearRegistrationTiming({
|
|
1745
|
-
ceremonyId: args.registrationCeremonyId,
|
|
1746
|
-
stage: "session_install",
|
|
1747
|
-
startedAt: sessionStartedAt,
|
|
1748
|
-
outcome: "success"
|
|
1749
|
-
});
|
|
1750
|
-
const activationStartedAt = performance.now();
|
|
1751
|
-
if (auth.kind === "email_otp" && registrationSession.remainingUses > 0) {
|
|
1752
|
-
const walletSessionState = await buildRegistrationEmailOtpEd25519SessionState({
|
|
1753
|
-
registrationEstablishedSession: registrationSession,
|
|
1754
|
-
walletId: args.walletId,
|
|
1755
|
-
nearAccountId: String(nearAccountId),
|
|
1756
|
-
nearEd25519SigningKeyId: finalized.ed25519.nearEd25519SigningKeyId,
|
|
1757
|
-
thresholdSessionId: materialFacts.identity.thresholdSessionId,
|
|
1758
|
-
runtimePolicyScope: materialFacts.stableServerScope.runtimePolicyScope,
|
|
1759
|
-
signerSlot: finalized.ed25519.signerSlot,
|
|
1760
|
-
relayerUrl: args.relayerUrl,
|
|
1761
|
-
emailOtpAuthContext: auth.emailOtpAuthContext
|
|
1762
|
-
});
|
|
1763
|
-
const bootstrap = buildRegistrationEmailOtpEd25519RecoveryBootstrap({
|
|
1764
|
-
walletId: args.walletId,
|
|
1765
|
-
nearAccountId: String(nearAccountId),
|
|
1766
|
-
nearEd25519SigningKeyId: finalized.ed25519.nearEd25519SigningKeyId,
|
|
1767
|
-
sessionState: walletSessionState,
|
|
1768
|
-
joined,
|
|
1769
|
-
deferredNear: {
|
|
1770
|
-
status: "deferred",
|
|
1771
|
-
admissionRequest: nearCustody.admissionRequest
|
|
1772
|
-
},
|
|
1773
|
-
admissionReceipt: nearCustody.admissionReceipt,
|
|
1774
|
-
authContext: auth.emailOtpAuthContext
|
|
1775
|
-
});
|
|
1776
|
-
await args.context.signingEngine.activateEmailOtpEd25519RegistrationMaterialInternal({
|
|
1777
|
-
walletSession: {
|
|
1778
|
-
walletId: args.walletId,
|
|
1779
|
-
walletSessionUserId: String(args.walletId)
|
|
1780
|
-
},
|
|
1781
|
-
providerSubject: emailOtpAuthContextProviderUserId(auth.emailOtpAuthContext),
|
|
1782
|
-
emailHashHex: emailOtpAuthContextEmailHashHex(auth.emailOtpAuthContext),
|
|
1783
|
-
signerSlot: finalized.ed25519.signerSlot,
|
|
1784
|
-
expectedOperationalPublicKey: clientPublicKey,
|
|
1785
|
-
expectedThresholdSessionId: materialFacts.identity.thresholdSessionId,
|
|
1786
|
-
bootstrap,
|
|
1787
|
-
material: custodyMaterial,
|
|
1788
|
-
envelope: walletCustodyCacheEnvelopeFromRecordV1(nearCustody.envelope),
|
|
1789
|
-
factorSecret32: retainedFactorSecret32
|
|
1790
|
-
});
|
|
1791
|
-
retainedFactorSecret32 = null;
|
|
1792
|
-
} else if (auth.kind === "passkey") {
|
|
1793
|
-
if (args.authMaterial.kind !== "passkey") throw new Error("Deferred passkey registration has no Passkey authorization material");
|
|
1794
|
-
if (!retainedFactorSecret32) throw new Error("Deferred passkey registration has no custody factor secret");
|
|
1795
|
-
await args.clientPrewarm;
|
|
1796
|
-
await activatePasskeyRegistrationEd25519Material({
|
|
1797
|
-
signingEngine: args.context.signingEngine,
|
|
1798
|
-
sessionAuthority: args.sessionAuthority,
|
|
1799
|
-
metadata,
|
|
1800
|
-
material: custodyMaterial,
|
|
1801
|
-
materialFacts,
|
|
1802
|
-
envelope: walletCustodyCacheEnvelopeFromRecordV1(nearCustody.envelope),
|
|
1803
|
-
ownedFactorSecret: new Uint8Array(retainedFactorSecret32),
|
|
1804
|
-
rpId: args.authMaterial.rpId,
|
|
1805
|
-
credentialIdB64u: args.authMaterial.credentialIdB64u,
|
|
1806
|
-
passkeyPrfFirstB64u: args.authMaterial.prfFirstB64u,
|
|
1807
|
-
relayerUrl: args.relayerUrl
|
|
1808
|
-
});
|
|
1809
|
-
retainedFactorSecret32 = null;
|
|
1810
|
-
}
|
|
1811
|
-
if (args.authMaterial.kind === "passkey") await rememberPasskeyCustodySessionEnvelope({
|
|
1812
|
-
walletId: String(args.walletId),
|
|
1813
|
-
credentialIdB64u: args.authMaterial.credentialIdB64u,
|
|
1814
|
-
envelope: nearCustody.envelope
|
|
1815
|
-
});
|
|
1816
|
-
emitNearRegistrationTiming({
|
|
1817
|
-
ceremonyId: args.registrationCeremonyId,
|
|
1818
|
-
stage: "signer_activation",
|
|
1819
|
-
startedAt: activationStartedAt,
|
|
1820
|
-
outcome: "success"
|
|
1821
|
-
});
|
|
1822
|
-
await requireCurrentNearRegistrationSession(args.sessionAuthority);
|
|
1823
|
-
const hydrationWaitStartedAt = performance.now();
|
|
1824
|
-
const hydrated = await hydration;
|
|
1825
|
-
emitNearRegistrationTiming({
|
|
1826
|
-
ceremonyId: args.registrationCeremonyId,
|
|
1827
|
-
stage: "session_hydration_wait",
|
|
1828
|
-
startedAt: hydrationWaitStartedAt,
|
|
1829
|
-
outcome: hydrated.kind === "completed" ? "success" : "failure"
|
|
1830
|
-
});
|
|
1831
|
-
if (hydrated.kind === "failed") throw hydrated.error;
|
|
1832
|
-
await requireCurrentNearRegistrationSession(args.sessionAuthority);
|
|
1833
|
-
const readyStartedAt = performance.now();
|
|
1834
|
-
await IndexedDBManager.completePendingNearRegistration({
|
|
1835
|
-
pending,
|
|
1836
|
-
walletSession: registrationSession.walletSession,
|
|
1837
|
-
operationCredential: registrationSession.operationCredential,
|
|
1838
|
-
nearAccountId: String(nearAccountId)
|
|
1839
|
-
});
|
|
1840
|
-
emitNearRegistrationTiming({
|
|
1841
|
-
ceremonyId: args.registrationCeremonyId,
|
|
1842
|
-
stage: "durable_ready",
|
|
1843
|
-
startedAt: readyStartedAt,
|
|
1844
|
-
outcome: "success"
|
|
1845
|
-
});
|
|
1846
|
-
outcome = "success";
|
|
1847
|
-
return {
|
|
1848
|
-
status: "near_ready",
|
|
1849
|
-
updatedAtMs: Date.now(),
|
|
1850
|
-
nearAccountId: String(nearAccountId)
|
|
1851
|
-
};
|
|
1852
|
-
} catch (error) {
|
|
1853
|
-
const profile = await IndexedDBManager.getProfile(String(args.walletId)).catch(nearRegistrationProfileUnavailable);
|
|
1854
|
-
if (profile?.nearProvisioning?.status === "near_ready") return profile.nearProvisioning;
|
|
1855
|
-
const errorCode = nearProvisioningErrorCode(error);
|
|
1856
|
-
try {
|
|
1857
|
-
await args.context.signingEngine.setWalletNearProvisioningState({
|
|
1858
|
-
walletId: String(args.walletId),
|
|
1859
|
-
status: "near_failed_retryable",
|
|
1860
|
-
errorCode
|
|
1861
|
-
});
|
|
1862
|
-
} catch {}
|
|
1863
|
-
return {
|
|
1864
|
-
status: "near_failed_retryable",
|
|
1865
|
-
updatedAtMs: Date.now(),
|
|
1866
|
-
error: getUserFriendlyErrorMessage(error, "registration", String(args.walletId)),
|
|
1867
|
-
errorCode
|
|
1868
|
-
};
|
|
1869
|
-
} finally {
|
|
1870
|
-
await hydration;
|
|
1871
|
-
if (preparation.kind === "preparing") {
|
|
1872
|
-
await preparation.result;
|
|
1873
|
-
await args.context.signingEngine.discardSigningSessionHydration({
|
|
1874
|
-
thresholdSessionId: preparation.thresholdSessionId,
|
|
1875
|
-
preparationId: preparation.preparationId
|
|
1876
|
-
}).catch(ignoreNearCustodyFailure);
|
|
1877
|
-
}
|
|
1878
|
-
if (retainedFactorSecret32) zeroizeArrayBuffer(retainedFactorSecret32);
|
|
1879
|
-
emitNearRegistrationTiming({
|
|
1880
|
-
ceremonyId: args.registrationCeremonyId,
|
|
1881
|
-
stage: "provisioning_total",
|
|
1882
|
-
startedAt,
|
|
1883
|
-
outcome
|
|
1884
|
-
});
|
|
1885
|
-
emitNearRegistrationTiming({
|
|
1886
|
-
ceremonyId: args.registrationCeremonyId,
|
|
1887
|
-
stage: "registration_total",
|
|
1888
|
-
startedAt: args.registrationStartedAt,
|
|
1889
|
-
outcome
|
|
1890
|
-
});
|
|
1891
|
-
}
|
|
1892
|
-
}
|
|
1893
|
-
async function runDeferredEd25519Provisioning(args) {
|
|
1894
|
-
try {
|
|
1895
|
-
await args.context.signingEngine.setWalletNearProvisioningState({
|
|
1896
|
-
walletId: String(args.walletId),
|
|
1897
|
-
status: "near_provisioning"
|
|
1898
|
-
});
|
|
1899
|
-
} catch (error) {
|
|
1900
|
-
const errorCode = nearProvisioningErrorCode(error);
|
|
1901
|
-
const state = {
|
|
1902
|
-
status: "near_failed_retryable",
|
|
1903
|
-
updatedAtMs: Date.now(),
|
|
1904
|
-
error: getUserFriendlyErrorMessage(error, "registration", String(args.walletId)),
|
|
1905
|
-
errorCode
|
|
1906
|
-
};
|
|
1907
|
-
try {
|
|
1908
|
-
await args.context.signingEngine.setWalletNearProvisioningState({
|
|
1909
|
-
walletId: String(args.walletId),
|
|
1910
|
-
status: "near_failed_retryable",
|
|
1911
|
-
errorCode
|
|
1912
|
-
});
|
|
1913
|
-
} catch {}
|
|
1914
|
-
publishNearProvisioningState(args.walletId, state);
|
|
1915
|
-
return;
|
|
1916
|
-
}
|
|
1917
|
-
await runSingleFlightNearProvisioning({
|
|
1918
|
-
walletId: args.walletId,
|
|
1919
|
-
nowMs: Date.now,
|
|
1920
|
-
attempt: commitDeferredEd25519Registration.bind(void 0, args.commit)
|
|
1921
|
-
});
|
|
1922
|
-
}
|
|
1923
|
-
/** Maps a deferred-commit throw onto the closed set of provisioning codes. */
|
|
1924
|
-
function nearProvisioningErrorCode(error) {
|
|
1925
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
1926
|
-
if (message.includes("finalize")) return "near_finalize_failed";
|
|
1927
|
-
if (message.includes("seal") || message.includes("Yao")) return "near_seal_failed";
|
|
1928
|
-
if (message.includes("wallet session")) return "near_capability_persist_failed";
|
|
1929
|
-
return "near_provisioning_failed";
|
|
1930
|
-
}
|
|
1931
|
-
async function markMixedNearProvisioningRetryable(args) {
|
|
1932
|
-
const errorCode = nearProvisioningErrorCode(args.error);
|
|
1933
|
-
const errorMessage = getUserFriendlyErrorMessage(args.error, "registration", String(args.walletId));
|
|
1934
|
-
try {
|
|
1935
|
-
await args.context.signingEngine.setWalletNearProvisioningState({
|
|
1936
|
-
walletId: String(args.walletId),
|
|
1937
|
-
status: "near_failed_retryable",
|
|
1938
|
-
errorCode
|
|
1939
|
-
});
|
|
1940
|
-
} catch {}
|
|
1941
|
-
publishNearProvisioningState(args.walletId, {
|
|
1942
|
-
status: "near_failed_retryable",
|
|
1943
|
-
updatedAtMs: Date.now(),
|
|
1944
|
-
error: errorMessage,
|
|
1945
|
-
errorCode
|
|
1946
|
-
});
|
|
1947
|
-
return {
|
|
1948
|
-
status: "retryable",
|
|
1949
|
-
error: errorMessage,
|
|
1950
|
-
errorCode
|
|
1951
|
-
};
|
|
1952
|
-
}
|
|
1953
|
-
async function markMixedNearProvisioningPending(args) {
|
|
1954
|
-
try {
|
|
1955
|
-
await args.context.signingEngine.setWalletNearProvisioningState({
|
|
1956
|
-
walletId: String(args.walletId),
|
|
1957
|
-
status: "near_pending"
|
|
1958
|
-
});
|
|
1959
|
-
publishNearProvisioningState(args.walletId, {
|
|
1960
|
-
status: "near_pending",
|
|
1961
|
-
updatedAtMs: Date.now()
|
|
1962
|
-
});
|
|
1963
|
-
return { status: "pending" };
|
|
1964
|
-
} catch (error) {
|
|
1965
|
-
return await markMixedNearProvisioningRetryable({
|
|
1966
|
-
context: args.context,
|
|
1967
|
-
walletId: args.walletId,
|
|
1968
|
-
error
|
|
1969
|
-
});
|
|
1970
|
-
}
|
|
1971
|
-
}
|
|
1972
|
-
async function registerEcdsaOrMixedWallet(args) {
|
|
1973
|
-
const { context, wallet, signerSelection } = args;
|
|
1974
|
-
const options = args.options || {};
|
|
1975
|
-
const { onEvent, onError, afterCall } = options;
|
|
1976
|
-
const startedAt = performance.now();
|
|
1977
|
-
const registrationTiming = new RegistrationTimingRecorder(startedAt);
|
|
1978
|
-
const clientPrewarm = args.kind === "near_ed25519_and_evm_family_ecdsa" ? prewarmDeferredPasskeyEd25519Client(args.authMethod) : Promise.resolve();
|
|
1979
|
-
const traceContext = createRouterAbTraceContextV1();
|
|
1980
|
-
let postTouchIdCompletedAt = null;
|
|
1981
|
-
let emailOtpCustodyCapabilityFactorSecret32 = null;
|
|
1982
|
-
const initialEventAccountId = registrationEventAccountId(wallet.kind === "provided" ? String(wallet.walletId) : "wallet-registration");
|
|
1983
|
-
emitRegistrationEvent(onEvent, initialEventAccountId, {
|
|
1984
|
-
authMethod: args.authMethod.kind,
|
|
1985
|
-
phase: RegistrationEventPhase.STEP_01_STARTED,
|
|
1986
|
-
status: "started"
|
|
1987
|
-
});
|
|
1988
|
-
try {
|
|
1989
|
-
const finalizeIdempotencyKey = createRegistrationOperationIdempotencyKey("wallet-registration-finalize");
|
|
1990
|
-
const prepared = await setupRegistrationForPasskeyExecution({
|
|
1991
|
-
context,
|
|
1992
|
-
authMethod: args.authMethod,
|
|
1993
|
-
wallet,
|
|
1994
|
-
signerSelection,
|
|
1995
|
-
recorder: registrationTiming,
|
|
1996
|
-
passkeyExecution: args.passkeyExecution
|
|
1997
|
-
});
|
|
1998
|
-
if (args.authMethod.kind === "email_otp") observeRegistrationWarmup({
|
|
1999
|
-
recorder: registrationTiming,
|
|
2000
|
-
warmup: prepared.registrationWarmup
|
|
2001
|
-
});
|
|
2002
|
-
const { relayerUrl, setup } = prepared;
|
|
2003
|
-
const ecdsaPrepare = materializeWalletRegistrationSetupEcdsaPrepare(requireEcdsaRegistrationSetup(setup, args.kind).ecdsa);
|
|
2004
|
-
const ecdsaClientCeremony = ecdsaRegistrationClientCeremonyForExecution({
|
|
2005
|
-
passkeyExecution: args.passkeyExecution,
|
|
2006
|
-
ceremonyId: setup.registrationCeremonyId
|
|
2007
|
-
});
|
|
2008
|
-
const intentResponse = {
|
|
2009
|
-
intent: setup.intent,
|
|
2010
|
-
registrationIntentDigestB64u: setup.registrationIntentDigestB64u
|
|
2011
|
-
};
|
|
2012
|
-
const walletId = intentResponse.intent.walletId;
|
|
2013
|
-
const eventAccountId = registrationEventAccountId(String(walletId));
|
|
2014
|
-
let emailOtpEnrollmentMaterial = null;
|
|
2015
|
-
let emailOtpRegistrationAuthorityId = "";
|
|
2016
|
-
let emailOtpEmail = "";
|
|
2017
|
-
let emailOtpProviderSubject = "";
|
|
2018
|
-
let emailOtpProvider = null;
|
|
2019
|
-
let emailOtpWalletCustodyFactorSecret = null;
|
|
2020
|
-
let passkeyAuthority = null;
|
|
2021
|
-
let startAuthority;
|
|
2022
|
-
if (args.authMethod.kind === "passkey") {
|
|
2023
|
-
emitRegistrationEvent(onEvent, eventAccountId, {
|
|
2024
|
-
authMethod: args.authMethod.kind,
|
|
2025
|
-
phase: RegistrationEventPhase.STEP_04_PASSKEY_CREATE_STARTED,
|
|
2026
|
-
status: "waiting_for_user",
|
|
2027
|
-
interaction: {
|
|
2028
|
-
kind: "passkey_create",
|
|
2029
|
-
overlay: "show"
|
|
2030
|
-
}
|
|
2031
|
-
});
|
|
2032
|
-
const confirmationConfig = {
|
|
2033
|
-
uiMode: "modal",
|
|
2034
|
-
behavior: "requireClick",
|
|
2035
|
-
...args.confirmationConfigOverride ?? options?.confirmationConfig ?? {}
|
|
2036
|
-
};
|
|
2037
|
-
passkeyAuthority = await registrationTiming.measure("authProofMs", () => resolvePasskeyRegistrationAuthority({
|
|
2038
|
-
context,
|
|
2039
|
-
walletId,
|
|
2040
|
-
signerSlot: registrationPasskeySignerSlot(args),
|
|
2041
|
-
registrationIntentDigestB64u: intentResponse.registrationIntentDigestB64u,
|
|
2042
|
-
options,
|
|
2043
|
-
confirmationConfigOverride: confirmationConfig,
|
|
2044
|
-
passkeyExecution: args.passkeyExecution
|
|
2045
|
-
}));
|
|
2046
|
-
registrationTiming.capturePasskeyAuthDiagnostics(passkeyAuthority.diagnostics);
|
|
2047
|
-
postTouchIdCompletedAt = performance.now();
|
|
2048
|
-
const custodyCredentialId = parseWebAuthnCredentialIdB64u(String(passkeyAuthority.credential.rawId || passkeyAuthority.credential.id || "").trim());
|
|
2049
|
-
if (!custodyCredentialId.ok) throw new Error(`passkey credential id ${custodyCredentialId.error.message}`);
|
|
2050
|
-
startAuthority = {
|
|
2051
|
-
kind: "passkey",
|
|
2052
|
-
webauthnRegistration: passkeyAuthority.webauthnRegistration,
|
|
2053
|
-
walletCustodyFactorJson: JSON.stringify({
|
|
2054
|
-
envelopeId: `wallet-custody-envelope:${crypto.randomUUID()}`,
|
|
2055
|
-
factor: buildPasskeyEnvelopeFactor({
|
|
2056
|
-
rpId: requireWebAuthnRpId(args.authMethod.rpId),
|
|
2057
|
-
credentialIdB64u: custodyCredentialId.value
|
|
2058
|
-
}),
|
|
2059
|
-
walletAuthMethodId: intentResponse.intent.foundingWalletAuthMethodId
|
|
2060
|
-
}),
|
|
2061
|
-
walletCustodyFactorSecret: base64UrlDecode(passkeyAuthority.prfFirstB64u).buffer
|
|
2062
|
-
};
|
|
2063
|
-
emitRegistrationEvent(onEvent, eventAccountId, {
|
|
2064
|
-
authMethod: args.authMethod.kind,
|
|
2065
|
-
phase: RegistrationEventPhase.STEP_04_PASSKEY_CREATE_SUCCEEDED,
|
|
2066
|
-
status: "succeeded",
|
|
2067
|
-
interaction: {
|
|
2068
|
-
kind: "passkey_create",
|
|
2069
|
-
overlay: "hide"
|
|
2070
|
-
}
|
|
2071
|
-
});
|
|
2072
|
-
} else {
|
|
2073
|
-
const emailOtpAuthMethod = args.authMethod;
|
|
2074
|
-
const emailOtpEnrollmentSecret = crypto.getRandomValues(new Uint8Array(32));
|
|
2075
|
-
emailOtpCustodyCapabilityFactorSecret32 = emailOtpEnrollmentSecret.slice();
|
|
2076
|
-
emailOtpWalletCustodyFactorSecret = emailOtpEnrollmentSecret.slice().buffer;
|
|
2077
|
-
const emailAuthority = await registrationTiming.measure("authProofMs", () => collectEmailOtpRegistrationAuthority({
|
|
2078
|
-
authMethod: emailOtpAuthMethod,
|
|
2079
|
-
relayUrl: relayerUrl,
|
|
2080
|
-
walletId: String(walletId),
|
|
2081
|
-
registrationIntentDigestB64u: intentResponse.registrationIntentDigestB64u
|
|
2082
|
-
}));
|
|
2083
|
-
emailOtpEnrollmentMaterial = startEmailOtpRegistrationEnrollmentMaterial({
|
|
2084
|
-
recorder: registrationTiming,
|
|
2085
|
-
context,
|
|
2086
|
-
authMethod: emailOtpAuthMethod,
|
|
2087
|
-
relayerUrl,
|
|
2088
|
-
walletId: String(walletId),
|
|
2089
|
-
providerSubject: emailAuthority.providerSubject,
|
|
2090
|
-
clientSecret32: emailOtpEnrollmentSecret
|
|
2091
|
-
});
|
|
2092
|
-
emailOtpRegistrationAuthorityId = emailAuthority.registrationAuthorityId;
|
|
2093
|
-
emailOtpEmail = emailAuthority.email;
|
|
2094
|
-
emailOtpProviderSubject = emailAuthority.providerSubject;
|
|
2095
|
-
emailOtpProvider = emailOtpProviderFromRegistrationProof(emailAuthority.proof);
|
|
2096
|
-
startAuthority = {
|
|
2097
|
-
kind: "email_otp",
|
|
2098
|
-
emailOtpRegistrationProof: emailAuthority.proof,
|
|
2099
|
-
walletCustodyFactorSecret: emailOtpWalletCustodyFactorSecret
|
|
2100
|
-
};
|
|
2101
|
-
}
|
|
2102
|
-
const setupWalletAuthMethodId = parseWalletAuthMethodId(setup.walletAuthMethodId);
|
|
2103
|
-
if (!setupWalletAuthMethodId.ok) throw new Error(`Registration setup auth-method identity is invalid: ${setupWalletAuthMethodId.error.message}`);
|
|
2104
|
-
let materialAuthority;
|
|
2105
|
-
if (args.authMethod.kind === "passkey") {
|
|
2106
|
-
if (!passkeyAuthority) throw new Error("ECDSA registration is missing its verified passkey authority");
|
|
2107
|
-
materialAuthority = await walletAuthAuthorityRef({ authority: {
|
|
2108
|
-
...passkeyWalletAuthAuthorityFromCredential({
|
|
2109
|
-
walletId,
|
|
2110
|
-
rpId: args.authMethod.rpId,
|
|
2111
|
-
credential: passkeyAuthority.credential
|
|
2112
|
-
}),
|
|
2113
|
-
bindingId: setupWalletAuthMethodId.value
|
|
2114
|
-
} });
|
|
2115
|
-
} else {
|
|
2116
|
-
if (!emailOtpProvider) throw new Error("Email OTP registration is missing its verified provider");
|
|
2117
|
-
materialAuthority = await walletAuthAuthorityRef({ authority: {
|
|
2118
|
-
...buildEmailOtpWalletAuthAuthority({
|
|
2119
|
-
walletId,
|
|
2120
|
-
provider: emailOtpProvider,
|
|
2121
|
-
providerUserId: emailOtpProviderSubject,
|
|
2122
|
-
emailHashHex: await emailOtpEmailHashHex(emailOtpEmail)
|
|
2123
|
-
}),
|
|
2124
|
-
bindingId: setupWalletAuthMethodId.value
|
|
2125
|
-
} });
|
|
2126
|
-
}
|
|
2127
|
-
emitRegistrationEvent(onEvent, eventAccountId, {
|
|
2128
|
-
authMethod: args.authMethod.kind,
|
|
2129
|
-
phase: RegistrationEventPhase.STEP_05_ED25519_SIGNER_PREPARE_STARTED,
|
|
2130
|
-
status: "running"
|
|
2131
|
-
});
|
|
2132
|
-
const walletCustodyNearJoinFactorSecretOwner = { value: args.kind === "near_ed25519_and_evm_family_ecdsa" ? startAuthority.walletCustodyFactorSecret.slice(0) : null };
|
|
2133
|
-
let persistedPendingCommit = null;
|
|
2134
|
-
let ceremony;
|
|
2135
|
-
try {
|
|
2136
|
-
ceremony = await registrationTiming.measure("ecdsaRegistrationTotalMs", () => runEcdsaEnabledThreeRouteRegistrationCeremony({
|
|
2137
|
-
context,
|
|
2138
|
-
relayerUrl,
|
|
2139
|
-
registrationCeremonyId: setup.registrationCeremonyId,
|
|
2140
|
-
signerPlanKind: args.kind,
|
|
2141
|
-
signedSetup: setup.signedSetup,
|
|
2142
|
-
ecdsaPrepare,
|
|
2143
|
-
clientCeremony: ecdsaClientCeremony,
|
|
2144
|
-
authority: startAuthority,
|
|
2145
|
-
materialAuthority,
|
|
2146
|
-
idempotencyKey: finalizeIdempotencyKey,
|
|
2147
|
-
resolveActivateEmailOtp: async () => {
|
|
2148
|
-
let enrollment = null;
|
|
2149
|
-
let walletCustodyFactorJson = null;
|
|
2150
|
-
if (args.authMethod.kind === "email_otp") {
|
|
2151
|
-
const material = await requireEmailOtpRegistrationEnrollmentMaterial({
|
|
2152
|
-
material: emailOtpEnrollmentMaterial,
|
|
2153
|
-
operation: "activate"
|
|
2154
|
-
});
|
|
2155
|
-
enrollment = material.emailOtpEnrollment ?? null;
|
|
2156
|
-
walletCustodyFactorJson = JSON.stringify({
|
|
2157
|
-
envelopeId: `wallet-custody-envelope:${crypto.randomUUID()}`,
|
|
2158
|
-
factor: buildEmailOtpEnvelopeFactor({
|
|
2159
|
-
enrollmentId: material.enrollmentId,
|
|
2160
|
-
enrollmentSealKeyVersion: material.enrollmentSealKeyVersion
|
|
2161
|
-
}),
|
|
2162
|
-
walletAuthMethodId: intentResponse.intent.foundingWalletAuthMethodId
|
|
2163
|
-
});
|
|
2164
|
-
}
|
|
2165
|
-
return {
|
|
2166
|
-
enrollment,
|
|
2167
|
-
walletCustodyFactorJson
|
|
2168
|
-
};
|
|
2169
|
-
},
|
|
2170
|
-
traceContext,
|
|
2171
|
-
registrationTiming,
|
|
2172
|
-
confirmRecoveryCodesBackedUp: confirmWalletRecoveryCodesBackedUp.bind(void 0, context, String(walletId), options.recoveryCodeBackup),
|
|
2173
|
-
persistPendingCommit: async (input) => {
|
|
2174
|
-
const common = {
|
|
2175
|
-
operation: "registration_activate",
|
|
2176
|
-
registrationCeremonyId: setup.registrationCeremonyId,
|
|
2177
|
-
idempotencyKey: finalizeIdempotencyKey,
|
|
2178
|
-
walletId: String(walletId),
|
|
2179
|
-
walletAuthMethodId: String(intentResponse.intent.foundingWalletAuthMethodId),
|
|
2180
|
-
signedSetup: String(setup.signedSetup),
|
|
2181
|
-
auth: pendingRegistrationAuthFromRegistrationInputs({
|
|
2182
|
-
authMethod: args.authMethod,
|
|
2183
|
-
passkeyAuthority,
|
|
2184
|
-
email: emailOtpEmail,
|
|
2185
|
-
registrationAuthorityId: emailOtpRegistrationAuthorityId,
|
|
2186
|
-
providerSubject: emailOtpProviderSubject,
|
|
2187
|
-
emailOtpEnrollment: input.emailOtpEnrollment
|
|
2188
|
-
})
|
|
2189
|
-
};
|
|
2190
|
-
if (input.signerPlanKind === "near_ed25519_and_evm_family_ecdsa") {
|
|
2191
|
-
const nowMs = Date.now();
|
|
2192
|
-
const activation = requireMixedRegistrationActivatePendingCommit(buildPendingRegistrationCommit({
|
|
2193
|
-
...common,
|
|
2194
|
-
signerPlanKind: input.signerPlanKind,
|
|
2195
|
-
localMaterial: input.localMaterial,
|
|
2196
|
-
createdAtMs: nowMs,
|
|
2197
|
-
updatedAtMs: nowMs
|
|
2198
|
-
}));
|
|
2199
|
-
const continuation = planPendingNearRegistration(activation, input.deferredNear.admissionRequest);
|
|
2200
|
-
await IndexedDBManager.putPendingWalletRegistrationCommits([activation, continuation]);
|
|
2201
|
-
persistedPendingCommit = activation;
|
|
2202
|
-
return;
|
|
2203
|
-
}
|
|
2204
|
-
persistedPendingCommit = await persistPendingRegistrationCommit({
|
|
2205
|
-
...common,
|
|
2206
|
-
signerPlanKind: input.signerPlanKind,
|
|
2207
|
-
localMaterial: input.localMaterial
|
|
2208
|
-
});
|
|
2209
|
-
},
|
|
2210
|
-
startDeferredNearCustody: startDeferredNearWalletCustody.bind(void 0, {
|
|
2211
|
-
context,
|
|
2212
|
-
factorSecretOwner: walletCustodyNearJoinFactorSecretOwner,
|
|
2213
|
-
registrationCeremonyId: setup.registrationCeremonyId,
|
|
2214
|
-
relayerUrl,
|
|
2215
|
-
signedSetup: String(setup.signedSetup),
|
|
2216
|
-
traceContext
|
|
2217
|
-
})
|
|
2218
|
-
}));
|
|
2219
|
-
} finally {
|
|
2220
|
-
zeroizeArrayBuffer(startAuthority.walletCustodyFactorSecret);
|
|
2221
|
-
if (walletCustodyNearJoinFactorSecretOwner.value) {
|
|
2222
|
-
zeroizeArrayBuffer(walletCustodyNearJoinFactorSecretOwner.value);
|
|
2223
|
-
walletCustodyNearJoinFactorSecretOwner.value = null;
|
|
2224
|
-
}
|
|
2225
|
-
}
|
|
2226
|
-
const ecdsaSession = ceremony.session;
|
|
2227
|
-
if (ceremony.activated.kind !== "evm_family_ecdsa") throw new Error("Wallet registration activate returned a different signer branch");
|
|
2228
|
-
const finalized = finalizeResponseViewFromActivatedEcdsa(ceremony.activated);
|
|
2229
|
-
const emailOtpEnrollment = ceremony.activateEmailOtp.enrollment;
|
|
2230
|
-
if (finalized.kind !== "evm_family_ecdsa") throw new Error("Wallet registration finalize returned a different signer branch");
|
|
2231
|
-
if (args.authMethod.kind === "email_otp") {
|
|
2232
|
-
if (!isEmailOtpWalletRegistrationFinalizeResponse(finalized)) throw new Error("Email OTP registration finalize returned a different auth method");
|
|
2233
|
-
}
|
|
2234
|
-
registrationTiming.captureRouteDiagnostics(finalized.registrationDiagnostics);
|
|
2235
|
-
const walletKeys = finalized.ecdsa.walletKeys;
|
|
2236
|
-
if (walletKeys.length === 0) throw new Error("Wallet registration finalize did not return ECDSA wallet keys");
|
|
2237
|
-
const persistenceAuth = await buildRegistrationPersistenceAuth({
|
|
2238
|
-
authMethod: args.authMethod,
|
|
2239
|
-
configs: context.configs,
|
|
2240
|
-
walletId: toWalletId(finalized.walletId),
|
|
2241
|
-
finalized,
|
|
2242
|
-
passkeyAuthority,
|
|
2243
|
-
email: emailOtpEmail,
|
|
2244
|
-
providerSubject: emailOtpProviderSubject,
|
|
2245
|
-
registrationAuthorityId: emailOtpRegistrationAuthorityId
|
|
2246
|
-
});
|
|
2247
|
-
const persistencePlan = buildRegistrationPersistencePlan({
|
|
2248
|
-
walletId: toWalletId(finalized.walletId),
|
|
2249
|
-
auth: persistenceAuth,
|
|
2250
|
-
foundingAuthority: finalized.foundingAuthority,
|
|
2251
|
-
foundingAuthMethod: finalized.foundingAuthMethod,
|
|
2252
|
-
ecdsa: buildRegistrationPersistenceEcdsa({
|
|
2253
|
-
session: ecdsaSession,
|
|
2254
|
-
walletKeys,
|
|
2255
|
-
expectedChainTargets: ecdsaSession.chainTargets
|
|
2256
|
-
})
|
|
2257
|
-
});
|
|
2258
|
-
emitRegistrationEvent(onEvent, eventAccountId, {
|
|
2259
|
-
authMethod: args.authMethod.kind,
|
|
2260
|
-
phase: RegistrationEventPhase.STEP_05_ED25519_SIGNER_PREPARE_SUCCEEDED,
|
|
2261
|
-
status: "succeeded"
|
|
2262
|
-
});
|
|
2263
|
-
emitRegistrationEvent(onEvent, eventAccountId, {
|
|
2264
|
-
authMethod: args.authMethod.kind,
|
|
2265
|
-
phase: RegistrationEventPhase.STEP_08_STORAGE_PERSIST_STARTED,
|
|
2266
|
-
status: "running"
|
|
2267
|
-
});
|
|
2268
|
-
const deferredWalletId = toWalletId(finalized.walletId);
|
|
2269
|
-
let registrationNearProvisioning = { status: "pending" };
|
|
2270
|
-
if (args.kind === "near_ed25519_and_evm_family_ecdsa") {
|
|
2271
|
-
await publishMixedEcdsaRegistrationCommit({
|
|
2272
|
-
context,
|
|
2273
|
-
relayerUrl,
|
|
2274
|
-
registrationTiming,
|
|
2275
|
-
pending: requireMixedRegistrationActivatePendingCommit(persistedPendingCommit),
|
|
2276
|
-
plan: persistencePlan,
|
|
2277
|
-
activated: ceremony.activated
|
|
2278
|
-
});
|
|
2279
|
-
registrationNearProvisioning = await markMixedNearProvisioningPending({
|
|
2280
|
-
context,
|
|
2281
|
-
walletId: deferredWalletId
|
|
2282
|
-
});
|
|
2283
|
-
} else await commitRegistrationPersistencePlan({
|
|
2284
|
-
context,
|
|
2285
|
-
relayerUrl,
|
|
2286
|
-
registrationTiming,
|
|
2287
|
-
plan: persistencePlan
|
|
2288
|
-
});
|
|
2289
|
-
const prefillStatusReads = new WalletSessionStatusReadScope();
|
|
2290
|
-
for (const chainTarget of ecdsaSession.chainTargets) scheduleEcdsaSessionPresignaturePrefill({
|
|
2291
|
-
signingEngine: context.signingEngine,
|
|
2292
|
-
walletId: deferredWalletId,
|
|
2293
|
-
chainTarget,
|
|
2294
|
-
trigger: "registration",
|
|
2295
|
-
statusReads: prefillStatusReads
|
|
2296
|
-
});
|
|
2297
|
-
const primaryEcdsaKey = persistencePlan.ecdsa.walletKeys[0];
|
|
2298
|
-
if (args.authMethod.kind === "passkey") {
|
|
2299
|
-
if (!passkeyAuthority) throw new Error("Passkey registration authority was not collected");
|
|
2300
|
-
const registrationSession = persistencePlan.ecdsa.session.registrationEstablishedSession;
|
|
2301
|
-
try {
|
|
2302
|
-
await establishPasskeyRegistrationEd25519ExportRootCapability({
|
|
2303
|
-
signingEngine: context.signingEngine,
|
|
2304
|
-
commit: ceremony.walletCustody.commitPayload,
|
|
2305
|
-
passkeyPrfFirstB64u: passkeyAuthority.prfFirstB64u,
|
|
2306
|
-
walletId: String(walletId),
|
|
2307
|
-
walletAuthMethodId: String(persistencePlan.foundingAuthMethod.walletAuthMethodId),
|
|
2308
|
-
walletSessionId: String(registrationSession.walletSessionId),
|
|
2309
|
-
expiresAtMs: registrationSession.expiresAtMs
|
|
2310
|
-
});
|
|
2311
|
-
} catch (error) {
|
|
2312
|
-
if (args.kind !== "near_ed25519_and_evm_family_ecdsa") throw error;
|
|
2313
|
-
registrationNearProvisioning = await markMixedNearProvisioningRetryable({
|
|
2314
|
-
context,
|
|
2315
|
-
walletId: deferredWalletId,
|
|
2316
|
-
error
|
|
2317
|
-
});
|
|
2318
|
-
}
|
|
2319
|
-
} else {
|
|
2320
|
-
if (persistenceAuth.kind !== "email_otp" || !emailOtpCustodyCapabilityFactorSecret32) throw new Error("Email OTP registration has no custody capability material");
|
|
2321
|
-
const registrationSession = persistencePlan.ecdsa.session.registrationEstablishedSession;
|
|
2322
|
-
await establishEmailOtpRegistrationEd25519ExportRootCapability({
|
|
2323
|
-
context,
|
|
2324
|
-
commit: ceremony.walletCustody.commitPayload,
|
|
2325
|
-
factorSecret32: emailOtpCustodyCapabilityFactorSecret32,
|
|
2326
|
-
emailOtpAuthContext: persistenceAuth.emailOtpAuthContext,
|
|
2327
|
-
walletId: String(walletId),
|
|
2328
|
-
walletSessionId: String(registrationSession.walletSessionId),
|
|
2329
|
-
expiresAtMs: registrationSession.expiresAtMs
|
|
2330
|
-
});
|
|
2331
|
-
}
|
|
2332
|
-
if (args.kind === "near_ed25519_and_evm_family_ecdsa") {
|
|
2333
|
-
const deferredAuthMaterial = buildDeferredRegistrationFinalizeAuthMaterial({
|
|
2334
|
-
auth: persistencePlan.auth,
|
|
2335
|
-
emailOtpEnrollment,
|
|
2336
|
-
passkeyAuthority
|
|
2337
|
-
});
|
|
2338
|
-
try {
|
|
2339
|
-
runDeferredEd25519Provisioning({
|
|
2340
|
-
context,
|
|
2341
|
-
walletId: deferredWalletId,
|
|
2342
|
-
commit: {
|
|
2343
|
-
context,
|
|
2344
|
-
registrationTiming,
|
|
2345
|
-
registrationStartedAt: startedAt,
|
|
2346
|
-
clientPrewarm,
|
|
2347
|
-
relayerUrl,
|
|
2348
|
-
registrationCeremonyId: setup.registrationCeremonyId,
|
|
2349
|
-
signedSetup: setup.signedSetup,
|
|
2350
|
-
headers: registrationRouteHeaders(traceContext),
|
|
2351
|
-
nearCustodyWork: requireDeferredNearCustodyWork.bind(void 0, ceremony.deferredNearCustodyWork),
|
|
2352
|
-
sessionAuthority: {
|
|
2353
|
-
record: persistencePlan.ecdsa.session.registrationEstablishedSession.walletSession,
|
|
2354
|
-
operationCredential: persistencePlan.ecdsa.session.registrationEstablishedSession.operationCredential
|
|
2355
|
-
},
|
|
2356
|
-
expectedChainTargets: persistencePlan.ecdsa.expectedChainTargets,
|
|
2357
|
-
walletId: deferredWalletId,
|
|
2358
|
-
authMaterial: deferredAuthMaterial
|
|
2359
|
-
}
|
|
2360
|
-
});
|
|
2361
|
-
} catch (error) {
|
|
2362
|
-
const errorCode = nearProvisioningErrorCode(error);
|
|
2363
|
-
registrationNearProvisioning = {
|
|
2364
|
-
status: "retryable",
|
|
2365
|
-
error: getUserFriendlyErrorMessage(error, "registration", String(deferredWalletId)),
|
|
2366
|
-
errorCode
|
|
2367
|
-
};
|
|
2368
|
-
publishNearProvisioningState(deferredWalletId, {
|
|
2369
|
-
status: "near_failed_retryable",
|
|
2370
|
-
updatedAtMs: Date.now(),
|
|
2371
|
-
error: registrationNearProvisioning.error,
|
|
2372
|
-
errorCode
|
|
2373
|
-
});
|
|
2374
|
-
}
|
|
2375
|
-
}
|
|
2376
|
-
if (args.kind === "evm_family_ecdsa") await IndexedDBManager.deletePendingWalletRegistrationCommit({
|
|
2377
|
-
registrationCeremonyId: setup.registrationCeremonyId,
|
|
2378
|
-
operation: "registration_activate"
|
|
2379
|
-
});
|
|
2380
|
-
const result = args.kind === "near_ed25519_and_evm_family_ecdsa" ? {
|
|
2381
|
-
success: true,
|
|
2382
|
-
kind: "ecdsa_wallet_registered_near_pending",
|
|
2383
|
-
walletId: finalized.walletId,
|
|
2384
|
-
capabilities: [{
|
|
2385
|
-
kind: "evm_family_ecdsa",
|
|
2386
|
-
thresholdEcdsaEthereumAddress: primaryEcdsaKey.thresholdOwnerAddress,
|
|
2387
|
-
thresholdEcdsaPublicKeyB64u: primaryEcdsaKey.thresholdEcdsaPublicKeyB64u
|
|
2388
|
-
}],
|
|
2389
|
-
nearProvisioning: registrationNearProvisioning
|
|
2390
|
-
} : {
|
|
2391
|
-
success: true,
|
|
2392
|
-
kind: "wallet_registered",
|
|
2393
|
-
walletId: finalized.walletId,
|
|
2394
|
-
capabilities: [{
|
|
2395
|
-
kind: "evm_family_ecdsa",
|
|
2396
|
-
thresholdEcdsaEthereumAddress: primaryEcdsaKey.thresholdOwnerAddress,
|
|
2397
|
-
thresholdEcdsaPublicKeyB64u: primaryEcdsaKey.thresholdEcdsaPublicKeyB64u
|
|
2398
|
-
}]
|
|
2399
|
-
};
|
|
2400
|
-
emitRegistrationEvent(onEvent, eventAccountId, {
|
|
2401
|
-
authMethod: args.authMethod.kind,
|
|
2402
|
-
phase: RegistrationEventPhase.STEP_08_STORAGE_PERSIST_SUCCEEDED,
|
|
2403
|
-
status: "succeeded"
|
|
2404
|
-
});
|
|
2405
|
-
emitRegistrationEvent(onEvent, eventAccountId, {
|
|
2406
|
-
authMethod: args.authMethod.kind,
|
|
2407
|
-
phase: RegistrationEventPhase.STEP_11_COMPLETED,
|
|
2408
|
-
status: "succeeded"
|
|
2409
|
-
});
|
|
2410
|
-
if (postTouchIdCompletedAt !== null) {
|
|
2411
|
-
const walletReadyAt = performance.now();
|
|
2412
|
-
emitRegistrationTimingSpan({
|
|
2413
|
-
callback: options.onTimingSpan,
|
|
2414
|
-
span: "registration.post_touch_id",
|
|
2415
|
-
outcome: "success",
|
|
2416
|
-
durationMs: walletReadyAt - postTouchIdCompletedAt,
|
|
2417
|
-
traceContext
|
|
2418
|
-
});
|
|
2419
|
-
emitRegistrationTimingSpan({
|
|
2420
|
-
callback: options.onTimingSpan,
|
|
2421
|
-
span: "frontend.wallet_ready",
|
|
2422
|
-
outcome: "success",
|
|
2423
|
-
durationMs: 0,
|
|
2424
|
-
traceContext
|
|
2425
|
-
});
|
|
2426
|
-
}
|
|
2427
|
-
emitRegistrationTimingSummary(createSucceededRegistrationTimingSummary({
|
|
2428
|
-
recorder: registrationTiming,
|
|
2429
|
-
authMethod: args.authMethod.kind,
|
|
2430
|
-
signerSet: registrationTimingSignerSetFromPlan(args.signerPlan)
|
|
2431
|
-
}));
|
|
2432
|
-
commitSuccessfulWalletAuthentication(args.context, result, args.authMethod.kind);
|
|
2433
|
-
afterCall?.(true, result);
|
|
2434
|
-
return result;
|
|
2435
|
-
} catch (error) {
|
|
2436
|
-
const errorCode = registrationErrorCodeFromUnknown(error);
|
|
2437
|
-
const errorMessage = getUserFriendlyErrorMessage(error, "registration", initialEventAccountId);
|
|
2438
|
-
if (postTouchIdCompletedAt !== null) emitRegistrationTimingSpan({
|
|
2439
|
-
callback: options.onTimingSpan,
|
|
2440
|
-
span: "registration.post_touch_id",
|
|
2441
|
-
outcome: "failure",
|
|
2442
|
-
durationMs: performance.now() - postTouchIdCompletedAt,
|
|
2443
|
-
traceContext
|
|
2444
|
-
});
|
|
2445
|
-
const errorObject = registrationErrorWithCode(errorMessage, errorCode);
|
|
2446
|
-
onError?.(errorObject);
|
|
2447
|
-
emitRegistrationEvent(onEvent, initialEventAccountId, {
|
|
2448
|
-
authMethod: args.authMethod.kind,
|
|
2449
|
-
phase: RegistrationEventPhase.FAILED,
|
|
2450
|
-
status: "failed",
|
|
2451
|
-
message: errorMessage,
|
|
2452
|
-
interaction: {
|
|
2453
|
-
kind: "passkey_create",
|
|
2454
|
-
overlay: "hide"
|
|
2455
|
-
},
|
|
2456
|
-
error: {
|
|
2457
|
-
...errorCode ? { code: errorCode } : {},
|
|
2458
|
-
message: errorMessage
|
|
2459
|
-
}
|
|
2460
|
-
});
|
|
2461
|
-
const result = {
|
|
2462
|
-
success: false,
|
|
2463
|
-
error: errorMessage,
|
|
2464
|
-
...errorCode ? { errorCode } : {}
|
|
2465
|
-
};
|
|
2466
|
-
emitRegistrationTimingSummary(createFailedRegistrationTimingSummary({
|
|
2467
|
-
recorder: registrationTiming,
|
|
2468
|
-
authMethod: args.authMethod.kind,
|
|
2469
|
-
signerSet: registrationTimingSignerSetFromPlan(args.signerPlan),
|
|
2470
|
-
errorCode: errorCode || null
|
|
2471
|
-
}));
|
|
2472
|
-
afterCall?.(false);
|
|
2473
|
-
return result;
|
|
2474
|
-
} finally {
|
|
2475
|
-
emailOtpCustodyCapabilityFactorSecret32?.fill(0);
|
|
2476
|
-
}
|
|
2477
|
-
}
|
|
2478
|
-
async function registerEmailOtpEd25519YaoWalletOnly(args) {
|
|
2479
|
-
const { context, options } = args;
|
|
2480
|
-
const initialEventAccountId = registrationEventAccountId(args.wallet.kind === "provided" ? String(args.wallet.walletId) : "wallet-registration");
|
|
2481
|
-
const registrationTiming = new RegistrationTimingRecorder(performance.now());
|
|
2482
|
-
let emailOtpCustodyCapabilityFactorSecret32 = null;
|
|
2483
|
-
emitRegistrationEvent(options.onEvent, initialEventAccountId, {
|
|
2484
|
-
authMethod: "email_otp",
|
|
2485
|
-
phase: RegistrationEventPhase.STEP_01_STARTED,
|
|
2486
|
-
status: "started"
|
|
2487
|
-
});
|
|
2488
|
-
try {
|
|
2489
|
-
const finalizeIdempotencyKey = createRegistrationOperationIdempotencyKey("wallet-registration-finalize");
|
|
2490
|
-
const prepared = await setupThreeRouteRegistration({
|
|
2491
|
-
context,
|
|
2492
|
-
authMethod: args.authMethod,
|
|
2493
|
-
wallet: args.wallet,
|
|
2494
|
-
signerSelection: args.signerSelection,
|
|
2495
|
-
recorder: registrationTiming
|
|
2496
|
-
});
|
|
2497
|
-
observeRegistrationWarmup({
|
|
2498
|
-
recorder: registrationTiming,
|
|
2499
|
-
warmup: prepared.registrationWarmup
|
|
2500
|
-
});
|
|
2501
|
-
const { relayerUrl, setup } = prepared;
|
|
2502
|
-
const walletId = setup.intent.walletId;
|
|
2503
|
-
const eventAccountId = registrationEventAccountId(String(walletId));
|
|
2504
|
-
const emailAuthority = await registrationTiming.measure("authProofMs", collectEmailOtpRegistrationAuthority.bind(void 0, {
|
|
2505
|
-
authMethod: args.authMethod,
|
|
2506
|
-
relayUrl: relayerUrl,
|
|
2507
|
-
walletId: String(walletId),
|
|
2508
|
-
registrationIntentDigestB64u: setup.registrationIntentDigestB64u
|
|
2509
|
-
}));
|
|
2510
|
-
const emailOtpEnrollmentSecret = crypto.getRandomValues(new Uint8Array(32));
|
|
2511
|
-
emailOtpCustodyCapabilityFactorSecret32 = emailOtpEnrollmentSecret.slice();
|
|
2512
|
-
const emailOtpWalletCustodyFactorSecret = emailOtpEnrollmentSecret.slice().buffer;
|
|
2513
|
-
const enrollmentMaterial = startEmailOtpRegistrationEnrollmentMaterial({
|
|
2514
|
-
recorder: registrationTiming,
|
|
2515
|
-
context,
|
|
2516
|
-
authMethod: args.authMethod,
|
|
2517
|
-
relayerUrl,
|
|
2518
|
-
walletId: String(walletId),
|
|
2519
|
-
providerSubject: emailAuthority.providerSubject,
|
|
2520
|
-
clientSecret32: emailOtpEnrollmentSecret
|
|
2521
|
-
});
|
|
2522
|
-
emitRegistrationEvent(options.onEvent, eventAccountId, {
|
|
2523
|
-
authMethod: "email_otp",
|
|
2524
|
-
phase: RegistrationEventPhase.STEP_05_ED25519_SIGNER_PREPARE_STARTED,
|
|
2525
|
-
status: "running"
|
|
2526
|
-
});
|
|
2527
|
-
const responded = await registrationTiming.measure("walletRegisterStartMs", respondWalletRegistration.bind(void 0, {
|
|
2528
|
-
relayerUrl,
|
|
2529
|
-
registrationCeremonyId: setup.registrationCeremonyId,
|
|
2530
|
-
signerPlanKind: "near_ed25519",
|
|
2531
|
-
signedSetup: setup.signedSetup,
|
|
2532
|
-
headers: registrationRouteHeaders(),
|
|
2533
|
-
kind: "email_otp",
|
|
2534
|
-
emailOtpRegistrationProof: emailAuthority.proof
|
|
2535
|
-
}));
|
|
2536
|
-
if (responded.kind !== "near_ed25519") throw new Error("Ed25519-only registration respond returned a different signer branch");
|
|
2537
|
-
const materialForActivate = await requireEmailOtpRegistrationEnrollmentMaterial({
|
|
2538
|
-
material: enrollmentMaterial,
|
|
2539
|
-
operation: "activate"
|
|
2540
|
-
});
|
|
2541
|
-
let established;
|
|
2542
|
-
try {
|
|
2543
|
-
established = await context.signingEngine.establishWalletCustodyNearEd25519KeySet({
|
|
2544
|
-
walletId: String(walletId),
|
|
2545
|
-
factorJson: JSON.stringify({
|
|
2546
|
-
envelopeId: `wallet-custody-envelope:${crypto.randomUUID()}`,
|
|
2547
|
-
factor: buildEmailOtpEnvelopeFactor({
|
|
2548
|
-
enrollmentId: materialForActivate.enrollmentId,
|
|
2549
|
-
enrollmentSealKeyVersion: materialForActivate.enrollmentSealKeyVersion
|
|
2550
|
-
}),
|
|
2551
|
-
walletAuthMethodId: setup.intent.foundingWalletAuthMethodId
|
|
2552
|
-
}),
|
|
2553
|
-
factorSecret: emailOtpWalletCustodyFactorSecret,
|
|
2554
|
-
nearEd25519SigningKeyId: responded.ed25519.admissionRequest.application_binding.near_ed25519_signing_key_id,
|
|
2555
|
-
registrationCeremonyId: setup.registrationCeremonyId,
|
|
2556
|
-
admissionRequest: responded.ed25519.admissionRequest,
|
|
2557
|
-
admissionReceipt: await admitDeferredNearRegistration(responded.ed25519, {
|
|
2558
|
-
routerOrigin: new URL(relayerUrl).origin,
|
|
2559
|
-
authorization: {
|
|
2560
|
-
kind: "bearer",
|
|
2561
|
-
value: `Bearer ${String(setup.signedSetup)}`
|
|
2562
|
-
},
|
|
2563
|
-
fetch: globalThis.fetch
|
|
2564
|
-
}),
|
|
2565
|
-
participantIds: responded.ed25519.admissionRequest.participant_ids,
|
|
2566
|
-
routerOrigin: new URL(relayerUrl).origin,
|
|
2567
|
-
authorization: `Bearer ${String(setup.signedSetup)}`
|
|
2568
|
-
});
|
|
2569
|
-
} finally {
|
|
2570
|
-
zeroizeArrayBuffer(emailOtpWalletCustodyFactorSecret);
|
|
2571
|
-
}
|
|
2572
|
-
await confirmWalletRecoveryCodesBackedUp(context, String(walletId), options.recoveryCodeBackup, established.recoveryCodes);
|
|
2573
|
-
const walletCustodyCommit = walletCustodyCommitPayloadWithRecoveryBackupAcknowledgement(established.commitPayload);
|
|
2574
|
-
if (!established.localMaterial) throw new Error("Email OTP registration produced no sealed local custody material");
|
|
2575
|
-
await persistPendingRegistrationCommit({
|
|
2576
|
-
operation: "registration_activate",
|
|
2577
|
-
signerPlanKind: "near_ed25519",
|
|
2578
|
-
registrationCeremonyId: setup.registrationCeremonyId,
|
|
2579
|
-
idempotencyKey: finalizeIdempotencyKey,
|
|
2580
|
-
walletId: String(walletId),
|
|
2581
|
-
walletAuthMethodId: String(setup.intent.foundingWalletAuthMethodId),
|
|
2582
|
-
signedSetup: String(setup.signedSetup),
|
|
2583
|
-
auth: {
|
|
2584
|
-
kind: "email_otp",
|
|
2585
|
-
email: emailAuthority.email,
|
|
2586
|
-
registrationAuthorityId: emailAuthority.registrationAuthorityId,
|
|
2587
|
-
providerSubject: emailAuthority.providerSubject,
|
|
2588
|
-
enrollment: materialForActivate.emailOtpEnrollment
|
|
2589
|
-
},
|
|
2590
|
-
localMaterial: {
|
|
2591
|
-
keyFamilies: ["ed25519"],
|
|
2592
|
-
custodyCommit: walletCustodyCommit,
|
|
2593
|
-
ed25519: {
|
|
2594
|
-
activationReference: established.activationReference,
|
|
2595
|
-
localMaterial: established.localMaterial,
|
|
2596
|
-
metadata: pendingRegistrationEd25519MetadataFromJoined(established)
|
|
2597
|
-
}
|
|
2598
|
-
}
|
|
2599
|
-
});
|
|
2600
|
-
const activated = await activateWalletRegistration({
|
|
2601
|
-
relayerUrl,
|
|
2602
|
-
registrationCeremonyId: setup.registrationCeremonyId,
|
|
2603
|
-
signerPlanKind: "near_ed25519",
|
|
2604
|
-
signedSetup: setup.signedSetup,
|
|
2605
|
-
headers: registrationRouteHeaders(),
|
|
2606
|
-
idempotencyKey: finalizeIdempotencyKey,
|
|
2607
|
-
emailOtpEnrollment: materialForActivate.emailOtpEnrollment
|
|
2608
|
-
});
|
|
2609
|
-
if (activated.kind !== "near_ed25519" || activated.nearProvisioning?.status !== "near_pending") throw new Error("Ed25519-only activate did not return a wallet pending NEAR provisioning");
|
|
2610
|
-
const nearProvisioningIdempotencyKey = await deriveNearProvisioningIdempotencyKey({
|
|
2611
|
-
registrationCeremonyId: setup.registrationCeremonyId,
|
|
2612
|
-
activationReference: established.activationReference
|
|
2613
|
-
});
|
|
2614
|
-
const nearProvisioningPending = await persistPendingRegistrationCommit({
|
|
2615
|
-
operation: "near_provisioning",
|
|
2616
|
-
completion: { kind: "sealed_material" },
|
|
2617
|
-
signerPlanKind: "near_ed25519",
|
|
2618
|
-
registrationCeremonyId: setup.registrationCeremonyId,
|
|
2619
|
-
idempotencyKey: nearProvisioningIdempotencyKey,
|
|
2620
|
-
walletId: String(walletId),
|
|
2621
|
-
walletAuthMethodId: String(setup.intent.foundingWalletAuthMethodId),
|
|
2622
|
-
signedSetup: String(setup.signedSetup),
|
|
2623
|
-
auth: {
|
|
2624
|
-
kind: "email_otp",
|
|
2625
|
-
email: emailAuthority.email,
|
|
2626
|
-
registrationAuthorityId: emailAuthority.registrationAuthorityId,
|
|
2627
|
-
providerSubject: emailAuthority.providerSubject,
|
|
2628
|
-
enrollment: materialForActivate.emailOtpEnrollment
|
|
2629
|
-
},
|
|
2630
|
-
localMaterial: {
|
|
2631
|
-
keyFamilies: ["ed25519"],
|
|
2632
|
-
custodyCommit: walletCustodyCommit,
|
|
2633
|
-
ed25519: {
|
|
2634
|
-
activationReference: established.activationReference,
|
|
2635
|
-
localMaterial: established.localMaterial,
|
|
2636
|
-
metadata: pendingRegistrationEd25519MetadataFromJoined(established)
|
|
2637
|
-
}
|
|
2638
|
-
}
|
|
2639
|
-
});
|
|
2640
|
-
await IndexedDBManager.deletePendingWalletRegistrationCommit({
|
|
2641
|
-
registrationCeremonyId: setup.registrationCeremonyId,
|
|
2642
|
-
operation: "registration_activate"
|
|
2643
|
-
});
|
|
2644
|
-
const clientPublicKey = `ed25519:${base58Encode(established.metadata.registeredPublicKey)}`;
|
|
2645
|
-
const finalized = await registrationTiming.measure("walletRegisterFinalizeMs", completeWalletRegistrationNearProvisioning.bind(void 0, {
|
|
2646
|
-
relayerUrl,
|
|
2647
|
-
registrationCeremonyId: setup.registrationCeremonyId,
|
|
2648
|
-
signedSetup: setup.signedSetup,
|
|
2649
|
-
headers: registrationRouteHeaders(),
|
|
2650
|
-
idempotencyKey: nearProvisioningIdempotencyKey,
|
|
2651
|
-
ed25519: { activationReference: established.activationReference },
|
|
2652
|
-
auth: {
|
|
2653
|
-
kind: "email_otp",
|
|
2654
|
-
enrollment: materialForActivate.emailOtpEnrollment
|
|
2655
|
-
},
|
|
2656
|
-
walletCustodyCommit
|
|
2657
|
-
}));
|
|
2658
|
-
if (!finalized.ok) throw new Error("Deferred NEAR provisioning did not complete");
|
|
2659
|
-
registrationTiming.captureRouteDiagnostics(finalized.registrationDiagnostics);
|
|
2660
|
-
if (finalized.kind !== "near_ed25519") throw new Error("Wallet registration finalize returned a different signer branch");
|
|
2661
|
-
if (!isEmailOtpWalletRegistrationFinalizeResponse(finalized)) throw new Error("Email OTP registration finalize returned a different auth method");
|
|
2662
|
-
if (finalized.walletCustody?.status !== "committed") {
|
|
2663
|
-
const status = finalized.walletCustody?.status ?? "not_reported";
|
|
2664
|
-
throw new Error(`Wallet custody did not commit (${status})`);
|
|
2665
|
-
}
|
|
2666
|
-
if (finalized.ed25519.signerSlot !== args.ed25519Selection.signerSlot) throw new Error("Ed25519 Yao finalize returned a different signer slot");
|
|
2667
|
-
const registrationSession = requireIssuedRegistrationEstablishedSession(finalized.registrationEstablishedSession);
|
|
2668
|
-
requireEmailOtpEd25519YaoRegistrationPublicResultMatches({
|
|
2669
|
-
clientPublicKey,
|
|
2670
|
-
finalized,
|
|
2671
|
-
expectedRegistrationAuthorityId: emailAuthority.registrationAuthorityId,
|
|
2672
|
-
expectedWalletId: walletId
|
|
2673
|
-
});
|
|
2674
|
-
const persistenceAuth = await buildRegistrationPersistenceAuth({
|
|
2675
|
-
authMethod: args.authMethod,
|
|
2676
|
-
configs: context.configs,
|
|
2677
|
-
walletId: toWalletId(finalized.walletId),
|
|
2678
|
-
finalized,
|
|
2679
|
-
passkeyAuthority: null,
|
|
2680
|
-
email: emailAuthority.email,
|
|
2681
|
-
providerSubject: emailAuthority.providerSubject,
|
|
2682
|
-
registrationAuthorityId: emailAuthority.registrationAuthorityId
|
|
2683
|
-
});
|
|
2684
|
-
if (persistenceAuth.kind !== "email_otp") throw new Error("Email OTP Ed25519 registration produced a different persistence authority");
|
|
2685
|
-
emitRegistrationEvent(options.onEvent, eventAccountId, {
|
|
2686
|
-
authMethod: "email_otp",
|
|
2687
|
-
phase: RegistrationEventPhase.STEP_05_ED25519_SIGNER_PREPARE_SUCCEEDED,
|
|
2688
|
-
status: "succeeded"
|
|
2689
|
-
});
|
|
2690
|
-
emitRegistrationEvent(options.onEvent, eventAccountId, {
|
|
2691
|
-
authMethod: "email_otp",
|
|
2692
|
-
phase: RegistrationEventPhase.STEP_08_STORAGE_PERSIST_STARTED,
|
|
2693
|
-
status: "running"
|
|
2694
|
-
});
|
|
2695
|
-
const materialFacts = registrationEd25519MaterialFacts({
|
|
2696
|
-
deferredNear: responded.ed25519,
|
|
2697
|
-
finalized: finalized.ed25519,
|
|
2698
|
-
walletId,
|
|
2699
|
-
expectedRuntimePolicyScope: normalizeRuntimePolicyScope(setup.intent.runtimePolicyScope)
|
|
2700
|
-
});
|
|
2701
|
-
const metadata = established.metadata;
|
|
2702
|
-
const nearAccountId = toAccountId(finalized.ed25519.nearAccountId);
|
|
2703
|
-
const custodyMaterial = walletCustodyRegistrationMaterial({
|
|
2704
|
-
established,
|
|
2705
|
-
walletId: String(finalized.walletId),
|
|
2706
|
-
nearAccountId: String(nearAccountId),
|
|
2707
|
-
nearEd25519SigningKeyId: finalized.ed25519.nearEd25519SigningKeyId,
|
|
2708
|
-
signerSlot: finalized.ed25519.signerSlot
|
|
2709
|
-
});
|
|
2710
|
-
const registration = await prepareWalletEmailOtpEd25519RegistrationPublication({
|
|
2711
|
-
walletId: finalized.walletId,
|
|
2712
|
-
nearAccountId,
|
|
2713
|
-
nearEd25519SigningKeyId: finalized.ed25519.nearEd25519SigningKeyId,
|
|
2714
|
-
email: persistenceAuth.email,
|
|
2715
|
-
registrationAuthorityId: persistenceAuth.registrationAuthorityId,
|
|
2716
|
-
authority: persistenceAuth.authority,
|
|
2717
|
-
signerSlot: finalized.ed25519.signerSlot,
|
|
2718
|
-
operationalPublicKey: clientPublicKey,
|
|
2719
|
-
relayerKeyId: finalized.ed25519.relayerKeyId,
|
|
2720
|
-
keyVersion: finalized.ed25519.keyVersion,
|
|
2721
|
-
participantIds: [...finalized.ed25519.participantIds],
|
|
2722
|
-
custodyMaterial
|
|
2723
|
-
});
|
|
2724
|
-
const storedNearActivation = (await IndexedDBManager.publishPendingWalletRegistrationCommit({
|
|
2725
|
-
pending: nearProvisioningPending,
|
|
2726
|
-
ecdsaContinuity: [],
|
|
2727
|
-
authority: finalized.authority,
|
|
2728
|
-
foundingAuthority: {
|
|
2729
|
-
authority: finalized.foundingAuthority,
|
|
2730
|
-
authMethod: finalized.foundingAuthMethod
|
|
2731
|
-
},
|
|
2732
|
-
request: {
|
|
2733
|
-
operation: "near_provisioning",
|
|
2734
|
-
registrationCeremonyId: setup.registrationCeremonyId,
|
|
2735
|
-
idempotencyKey: nearProvisioningIdempotencyKey,
|
|
2736
|
-
walletId: finalized.walletId,
|
|
2737
|
-
walletAuthMethodId: finalized.foundingAuthMethod.walletAuthMethodId
|
|
2738
|
-
},
|
|
2739
|
-
walletSessionPublication: {
|
|
2740
|
-
kind: "issued",
|
|
2741
|
-
walletSession: registrationSession.walletSession,
|
|
2742
|
-
operationCredential: registrationSession.operationCredential
|
|
2743
|
-
},
|
|
2744
|
-
registration
|
|
2745
|
-
})).signerActivations[1];
|
|
2746
|
-
if (!storedNearActivation || storedNearActivation.signerSlot !== finalized.ed25519.signerSlot) throw new Error("Ed25519 Yao registration persisted a different signer slot");
|
|
2747
|
-
await context.signingEngine.activateAuthenticatedWalletState({
|
|
2748
|
-
walletId: finalized.walletId,
|
|
2749
|
-
nearAccountId,
|
|
2750
|
-
signerSlot: finalized.ed25519.signerSlot,
|
|
2751
|
-
nearClient: context.nearClient
|
|
2752
|
-
});
|
|
2753
|
-
await context.signingEngine.upsertEd25519YaoPublicCapabilityLaneReference({
|
|
2754
|
-
walletId: finalized.walletId,
|
|
2755
|
-
nearAccountId,
|
|
2756
|
-
thresholdSessionId: materialFacts.identity.thresholdSessionId,
|
|
2757
|
-
runtimePolicyScope: materialFacts.stableServerScope.runtimePolicyScope,
|
|
2758
|
-
materialActivation: nearEd25519YaoMaterialActivationFromMetadata(metadata),
|
|
2759
|
-
auth: {
|
|
2760
|
-
kind: "email_otp",
|
|
2761
|
-
providerSubjectId: emailAuthority.providerSubject
|
|
2762
|
-
},
|
|
2763
|
-
nearEd25519SigningKeyId: parseNearEd25519SigningKeyId(finalized.ed25519.nearEd25519SigningKeyId),
|
|
2764
|
-
signerSlot: finalized.ed25519.signerSlot,
|
|
2765
|
-
remainingUses: registrationSession.remainingUses,
|
|
2766
|
-
expiresAtMs: registrationSession.expiresAtMs
|
|
2767
|
-
});
|
|
2768
|
-
if (!emailOtpCustodyCapabilityFactorSecret32) throw new Error("Email OTP registration has no custody capability material");
|
|
2769
|
-
await establishEmailOtpRegistrationEd25519ExportRootCapability({
|
|
2770
|
-
context,
|
|
2771
|
-
commit: walletCustodyCommit,
|
|
2772
|
-
factorSecret32: emailOtpCustodyCapabilityFactorSecret32,
|
|
2773
|
-
emailOtpAuthContext: persistenceAuth.emailOtpAuthContext,
|
|
2774
|
-
walletId: String(finalized.walletId),
|
|
2775
|
-
walletSessionId: String(registrationSession.walletSessionId),
|
|
2776
|
-
expiresAtMs: registrationSession.expiresAtMs
|
|
2777
|
-
});
|
|
2778
|
-
emitRegistrationEvent(options.onEvent, eventAccountId, {
|
|
2779
|
-
authMethod: "email_otp",
|
|
2780
|
-
phase: RegistrationEventPhase.STEP_08_STORAGE_PERSIST_SUCCEEDED,
|
|
2781
|
-
status: "succeeded"
|
|
2782
|
-
});
|
|
2783
|
-
emitRegistrationEvent(options.onEvent, eventAccountId, {
|
|
2784
|
-
authMethod: "email_otp",
|
|
2785
|
-
phase: RegistrationEventPhase.STEP_11_COMPLETED,
|
|
2786
|
-
status: "succeeded"
|
|
2787
|
-
});
|
|
2788
|
-
const result = {
|
|
2789
|
-
success: true,
|
|
2790
|
-
kind: "wallet_registered",
|
|
2791
|
-
walletId: finalized.walletId,
|
|
2792
|
-
capabilities: [{
|
|
2793
|
-
kind: "near_ed25519",
|
|
2794
|
-
accountProvisioning: finalized.accountProvisioning,
|
|
2795
|
-
resolvedAccount: finalized.resolvedAccount,
|
|
2796
|
-
nearEd25519SigningKeyId: parseNearEd25519SigningKeyId(finalized.ed25519.nearEd25519SigningKeyId),
|
|
2797
|
-
operationalPublicKey: clientPublicKey,
|
|
2798
|
-
nearAccountId: toAccountId(finalized.ed25519.nearAccountId),
|
|
2799
|
-
transactionId: finalized.resolvedAccount.kind === "sponsored_named_account" ? finalized.resolvedAccount.transactionHash : null
|
|
2800
|
-
}]
|
|
2801
|
-
};
|
|
2802
|
-
emitRegistrationTimingSummary(createSucceededRegistrationTimingSummary({
|
|
2803
|
-
recorder: registrationTiming,
|
|
2804
|
-
authMethod: "email_otp",
|
|
2805
|
-
signerSet: registrationTimingSignerSetFromPlan(args.signerPlan)
|
|
2806
|
-
}));
|
|
2807
|
-
commitSuccessfulWalletAuthentication(context, result, "email_otp");
|
|
2808
|
-
options.afterCall?.(true, result);
|
|
2809
|
-
return result;
|
|
2810
|
-
} catch (error) {
|
|
2811
|
-
const errorCode = registrationErrorCodeFromUnknown(error);
|
|
2812
|
-
const message = getUserFriendlyErrorMessage(error, "registration", initialEventAccountId);
|
|
2813
|
-
options.onError?.(registrationErrorWithCode(message, errorCode));
|
|
2814
|
-
emitRegistrationEvent(options.onEvent, initialEventAccountId, {
|
|
2815
|
-
authMethod: "email_otp",
|
|
2816
|
-
phase: RegistrationEventPhase.FAILED,
|
|
2817
|
-
status: "failed",
|
|
2818
|
-
message,
|
|
2819
|
-
error: {
|
|
2820
|
-
...errorCode ? { code: errorCode } : {},
|
|
2821
|
-
message
|
|
2822
|
-
}
|
|
2823
|
-
});
|
|
2824
|
-
const result = {
|
|
2825
|
-
success: false,
|
|
2826
|
-
error: message,
|
|
2827
|
-
...errorCode ? { errorCode } : {}
|
|
2828
|
-
};
|
|
2829
|
-
emitRegistrationTimingSummary(createFailedRegistrationTimingSummary({
|
|
2830
|
-
recorder: registrationTiming,
|
|
2831
|
-
authMethod: "email_otp",
|
|
2832
|
-
signerSet: registrationTimingSignerSetFromPlan(args.signerPlan),
|
|
2833
|
-
errorCode: errorCode || null
|
|
2834
|
-
}));
|
|
2835
|
-
options.afterCall?.(false);
|
|
2836
|
-
return result;
|
|
2837
|
-
} finally {
|
|
2838
|
-
emailOtpCustodyCapabilityFactorSecret32?.fill(0);
|
|
2839
|
-
}
|
|
2840
|
-
}
|
|
2841
|
-
async function registerPasskeyEd25519YaoWalletOnly(args) {
|
|
2842
|
-
const { context, options } = args;
|
|
2843
|
-
const initialEventAccountId = registrationEventAccountId(args.wallet.kind === "provided" ? String(args.wallet.walletId) : "wallet-registration");
|
|
2844
|
-
const traceContext = createRouterAbTraceContextV1();
|
|
2845
|
-
let postTouchIdCompletedAt = null;
|
|
2846
|
-
emitRegistrationEvent(options.onEvent, initialEventAccountId, {
|
|
2847
|
-
authMethod: "passkey",
|
|
2848
|
-
phase: RegistrationEventPhase.STEP_01_STARTED,
|
|
2849
|
-
status: "started"
|
|
2850
|
-
});
|
|
2851
|
-
try {
|
|
2852
|
-
const finalizeIdempotencyKey = createRegistrationOperationIdempotencyKey("wallet-registration-finalize");
|
|
2853
|
-
const registrationTiming = new RegistrationTimingRecorder(performance.now());
|
|
2854
|
-
const { relayerUrl, setup } = await setupRegistrationForPasskeyExecution({
|
|
2855
|
-
context,
|
|
2856
|
-
authMethod: args.authMethod,
|
|
2857
|
-
wallet: args.wallet,
|
|
2858
|
-
signerSelection: args.signerSelection,
|
|
2859
|
-
recorder: registrationTiming,
|
|
2860
|
-
passkeyExecution: args.passkeyExecution
|
|
2861
|
-
});
|
|
2862
|
-
registrationTiming.markNearStage(setup.registrationCeremonyId, "near_only.setup");
|
|
2863
|
-
const intent = requirePasskeyRegistrationIntent(setup.intent);
|
|
2864
|
-
const eventAccountId = registrationEventAccountId(String(intent.walletId));
|
|
2865
|
-
emitRegistrationEvent(options.onEvent, eventAccountId, {
|
|
2866
|
-
authMethod: "passkey",
|
|
2867
|
-
phase: RegistrationEventPhase.STEP_04_PASSKEY_CREATE_STARTED,
|
|
2868
|
-
status: "waiting_for_user",
|
|
2869
|
-
interaction: {
|
|
2870
|
-
kind: "passkey_create",
|
|
2871
|
-
overlay: "show"
|
|
2872
|
-
}
|
|
2873
|
-
});
|
|
2874
|
-
const passkeyAuthority = await resolvePasskeyRegistrationAuthority({
|
|
2875
|
-
context,
|
|
2876
|
-
walletId: intent.walletId,
|
|
2877
|
-
signerSlot: args.ed25519Selection.signerSlot,
|
|
2878
|
-
registrationIntentDigestB64u: setup.registrationIntentDigestB64u,
|
|
2879
|
-
options,
|
|
2880
|
-
confirmationConfigOverride: {
|
|
2881
|
-
uiMode: "modal",
|
|
2882
|
-
behavior: "requireClick",
|
|
2883
|
-
...args.confirmationConfigOverride ?? options.confirmationConfig ?? {}
|
|
2884
|
-
},
|
|
2885
|
-
passkeyExecution: args.passkeyExecution
|
|
2886
|
-
});
|
|
2887
|
-
postTouchIdCompletedAt = performance.now();
|
|
2888
|
-
registrationTiming.capturePasskeyAuthDiagnostics(passkeyAuthority.diagnostics);
|
|
2889
|
-
registrationTiming.markNearStage(setup.registrationCeremonyId, "near_only.authentication");
|
|
2890
|
-
emitRegistrationEvent(options.onEvent, eventAccountId, {
|
|
2891
|
-
authMethod: "passkey",
|
|
2892
|
-
phase: RegistrationEventPhase.STEP_04_PASSKEY_CREATE_SUCCEEDED,
|
|
2893
|
-
status: "succeeded",
|
|
2894
|
-
interaction: {
|
|
2895
|
-
kind: "passkey_create",
|
|
2896
|
-
overlay: "hide"
|
|
2897
|
-
}
|
|
2898
|
-
});
|
|
2899
|
-
const responded = await respondWalletRegistration({
|
|
2900
|
-
relayerUrl,
|
|
2901
|
-
registrationCeremonyId: setup.registrationCeremonyId,
|
|
2902
|
-
signerPlanKind: "near_ed25519",
|
|
2903
|
-
signedSetup: setup.signedSetup,
|
|
2904
|
-
headers: registrationRouteHeaders(traceContext),
|
|
2905
|
-
kind: "passkey",
|
|
2906
|
-
webauthnRegistration: passkeyAuthority.webauthnRegistration
|
|
2907
|
-
});
|
|
2908
|
-
registrationTiming.markNearStage(setup.registrationCeremonyId, "near_only.respond");
|
|
2909
|
-
if (responded.kind !== "near_ed25519") throw new Error("Ed25519-only registration respond returned a different signer branch");
|
|
2910
|
-
const parsedCredentialId = parseWebAuthnCredentialIdB64u(String(passkeyAuthority.credential.rawId || passkeyAuthority.credential.id || "").trim());
|
|
2911
|
-
if (!parsedCredentialId.ok) throw new Error(`passkey credential id ${parsedCredentialId.error.message}`);
|
|
2912
|
-
const walletCustodyFactorSecret = base64UrlDecode(passkeyAuthority.prfFirstB64u).buffer;
|
|
2913
|
-
let established;
|
|
2914
|
-
try {
|
|
2915
|
-
established = await context.signingEngine.establishWalletCustodyNearEd25519KeySet({
|
|
2916
|
-
walletId: String(intent.walletId),
|
|
2917
|
-
factorJson: JSON.stringify({
|
|
2918
|
-
envelopeId: `wallet-custody-envelope:${crypto.randomUUID()}`,
|
|
2919
|
-
factor: buildPasskeyEnvelopeFactor({
|
|
2920
|
-
rpId: requireWebAuthnRpId(args.authMethod.rpId),
|
|
2921
|
-
credentialIdB64u: parsedCredentialId.value
|
|
2922
|
-
}),
|
|
2923
|
-
walletAuthMethodId: setup.intent.foundingWalletAuthMethodId
|
|
2924
|
-
}),
|
|
2925
|
-
factorSecret: walletCustodyFactorSecret,
|
|
2926
|
-
nearEd25519SigningKeyId: responded.ed25519.admissionRequest.application_binding.near_ed25519_signing_key_id,
|
|
2927
|
-
registrationCeremonyId: setup.registrationCeremonyId,
|
|
2928
|
-
admissionRequest: responded.ed25519.admissionRequest,
|
|
2929
|
-
admissionReceipt: await admitDeferredNearRegistration(responded.ed25519, {
|
|
2930
|
-
routerOrigin: new URL(relayerUrl).origin,
|
|
2931
|
-
authorization: {
|
|
2932
|
-
kind: "bearer",
|
|
2933
|
-
value: `Bearer ${String(setup.signedSetup)}`
|
|
2934
|
-
},
|
|
2935
|
-
fetch: globalThis.fetch
|
|
2936
|
-
}),
|
|
2937
|
-
participantIds: responded.ed25519.admissionRequest.participant_ids,
|
|
2938
|
-
routerOrigin: new URL(relayerUrl).origin,
|
|
2939
|
-
authorization: `Bearer ${String(setup.signedSetup)}`,
|
|
2940
|
-
traceContext
|
|
2941
|
-
});
|
|
2942
|
-
} finally {
|
|
2943
|
-
zeroizeArrayBuffer(walletCustodyFactorSecret);
|
|
2944
|
-
}
|
|
2945
|
-
registrationTiming.markNearStage(setup.registrationCeremonyId, "near_only.custody");
|
|
2946
|
-
await confirmWalletRecoveryCodesBackedUp(context, String(intent.walletId), options.recoveryCodeBackup, established.recoveryCodes);
|
|
2947
|
-
const walletCustodyCommit = walletCustodyCommitPayloadWithRecoveryBackupAcknowledgement(established.commitPayload);
|
|
2948
|
-
if (!established.localMaterial) throw new Error("Passkey registration produced no sealed local custody material");
|
|
2949
|
-
await persistPendingRegistrationCommit({
|
|
2950
|
-
operation: "registration_activate",
|
|
2951
|
-
signerPlanKind: "near_ed25519",
|
|
2952
|
-
registrationCeremonyId: setup.registrationCeremonyId,
|
|
2953
|
-
idempotencyKey: finalizeIdempotencyKey,
|
|
2954
|
-
walletId: String(intent.walletId),
|
|
2955
|
-
walletAuthMethodId: String(setup.intent.foundingWalletAuthMethodId),
|
|
2956
|
-
signedSetup: String(setup.signedSetup),
|
|
2957
|
-
auth: {
|
|
2958
|
-
kind: "passkey",
|
|
2959
|
-
rpId: args.authMethod.rpId,
|
|
2960
|
-
credentialIdB64u: parsedCredentialId.value,
|
|
2961
|
-
transports: [...passkeyAuthority.webauthnRegistration.response.transports]
|
|
2962
|
-
},
|
|
2963
|
-
localMaterial: {
|
|
2964
|
-
keyFamilies: ["ed25519"],
|
|
2965
|
-
custodyCommit: walletCustodyCommit,
|
|
2966
|
-
ed25519: {
|
|
2967
|
-
activationReference: established.activationReference,
|
|
2968
|
-
localMaterial: established.localMaterial,
|
|
2969
|
-
metadata: pendingRegistrationEd25519MetadataFromJoined(established)
|
|
2970
|
-
}
|
|
2971
|
-
}
|
|
2972
|
-
});
|
|
2973
|
-
registrationTiming.markNearStage(setup.registrationCeremonyId, "near_only.backup_and_checkpoint");
|
|
2974
|
-
const activated = await activateWalletRegistration({
|
|
2975
|
-
relayerUrl,
|
|
2976
|
-
registrationCeremonyId: setup.registrationCeremonyId,
|
|
2977
|
-
signerPlanKind: "near_ed25519",
|
|
2978
|
-
signedSetup: setup.signedSetup,
|
|
2979
|
-
headers: registrationRouteHeaders(traceContext),
|
|
2980
|
-
idempotencyKey: finalizeIdempotencyKey
|
|
2981
|
-
});
|
|
2982
|
-
registrationTiming.markNearStage(setup.registrationCeremonyId, "near_only.activate");
|
|
2983
|
-
if (activated.kind !== "near_ed25519" || activated.nearProvisioning?.status !== "near_pending") throw new Error("Ed25519-only activate did not return a wallet pending NEAR provisioning");
|
|
2984
|
-
const nearProvisioningIdempotencyKey = await deriveNearProvisioningIdempotencyKey({
|
|
2985
|
-
registrationCeremonyId: setup.registrationCeremonyId,
|
|
2986
|
-
activationReference: established.activationReference
|
|
2987
|
-
});
|
|
2988
|
-
const nearProvisioningPending = await persistPendingRegistrationCommit({
|
|
2989
|
-
operation: "near_provisioning",
|
|
2990
|
-
completion: { kind: "sealed_material" },
|
|
2991
|
-
signerPlanKind: "near_ed25519",
|
|
2992
|
-
registrationCeremonyId: setup.registrationCeremonyId,
|
|
2993
|
-
idempotencyKey: nearProvisioningIdempotencyKey,
|
|
2994
|
-
walletId: String(intent.walletId),
|
|
2995
|
-
walletAuthMethodId: String(setup.intent.foundingWalletAuthMethodId),
|
|
2996
|
-
signedSetup: String(setup.signedSetup),
|
|
2997
|
-
auth: {
|
|
2998
|
-
kind: "passkey",
|
|
2999
|
-
rpId: args.authMethod.rpId,
|
|
3000
|
-
credentialIdB64u: parsedCredentialId.value,
|
|
3001
|
-
transports: [...passkeyAuthority.webauthnRegistration.response.transports]
|
|
3002
|
-
},
|
|
3003
|
-
localMaterial: {
|
|
3004
|
-
keyFamilies: ["ed25519"],
|
|
3005
|
-
custodyCommit: walletCustodyCommit,
|
|
3006
|
-
ed25519: {
|
|
3007
|
-
activationReference: established.activationReference,
|
|
3008
|
-
localMaterial: established.localMaterial,
|
|
3009
|
-
metadata: pendingRegistrationEd25519MetadataFromJoined(established)
|
|
3010
|
-
}
|
|
3011
|
-
}
|
|
3012
|
-
});
|
|
3013
|
-
await IndexedDBManager.deletePendingWalletRegistrationCommit({
|
|
3014
|
-
registrationCeremonyId: setup.registrationCeremonyId,
|
|
3015
|
-
operation: "registration_activate"
|
|
3016
|
-
});
|
|
3017
|
-
const clientPublicKey = `ed25519:${base58Encode(established.metadata.registeredPublicKey)}`;
|
|
3018
|
-
registrationTiming.markNearStage(setup.registrationCeremonyId, "near_only.provision_checkpoint");
|
|
3019
|
-
const finalized = await completeWalletRegistrationNearProvisioning({
|
|
3020
|
-
relayerUrl,
|
|
3021
|
-
registrationCeremonyId: setup.registrationCeremonyId,
|
|
3022
|
-
signedSetup: setup.signedSetup,
|
|
3023
|
-
headers: registrationRouteHeaders(traceContext),
|
|
3024
|
-
idempotencyKey: nearProvisioningIdempotencyKey,
|
|
3025
|
-
ed25519: { activationReference: established.activationReference },
|
|
3026
|
-
auth: { kind: "passkey" },
|
|
3027
|
-
walletCustodyCommit
|
|
3028
|
-
});
|
|
3029
|
-
registrationTiming.markNearStage(setup.registrationCeremonyId, "near_only.finalize");
|
|
3030
|
-
if (!finalized.ok || finalized.kind !== "near_ed25519") throw new Error("Deferred NEAR provisioning returned a different signer branch");
|
|
3031
|
-
if (established.commitPayload && finalized.walletCustody?.status !== "committed") {
|
|
3032
|
-
const status = finalized.walletCustody?.status ?? "not_reported";
|
|
3033
|
-
const reason = finalized.walletCustody?.status === "rejected" ? `: ${finalized.walletCustody.reason}` : "";
|
|
3034
|
-
throw new Error(`Wallet custody did not commit (${status})${reason}. The recovery codes shown are not usable.`);
|
|
3035
|
-
}
|
|
3036
|
-
const registrationSession = requireIssuedRegistrationEstablishedSession(finalized.registrationEstablishedSession);
|
|
3037
|
-
const finalizedPasskey = requireEd25519YaoRegistrationPublicResultMatches({
|
|
3038
|
-
clientPublicKey,
|
|
3039
|
-
finalized,
|
|
3040
|
-
expectedRpId: args.authMethod.rpId,
|
|
3041
|
-
expectedWalletId: intent.walletId
|
|
3042
|
-
});
|
|
3043
|
-
const nearAccountId = toAccountId(finalized.ed25519.nearAccountId);
|
|
3044
|
-
const credentialPublicKeyB64u = requireFinalizedPasskeyCredentialPublicKeyB64u({
|
|
3045
|
-
finalized,
|
|
3046
|
-
credential: passkeyAuthority.credential
|
|
3047
|
-
});
|
|
3048
|
-
const materialFacts = registrationEd25519MaterialFacts({
|
|
3049
|
-
deferredNear: responded.ed25519,
|
|
3050
|
-
finalized: finalized.ed25519,
|
|
3051
|
-
walletId: intent.walletId,
|
|
3052
|
-
expectedRuntimePolicyScope: normalizeRuntimePolicyScope(intent.runtimePolicyScope)
|
|
3053
|
-
});
|
|
3054
|
-
const metadata = established.metadata;
|
|
3055
|
-
const custodyMaterial = walletCustodyRegistrationMaterial({
|
|
3056
|
-
established,
|
|
3057
|
-
walletId: String(finalized.walletId),
|
|
3058
|
-
nearAccountId: String(nearAccountId),
|
|
3059
|
-
nearEd25519SigningKeyId: finalized.ed25519.nearEd25519SigningKeyId,
|
|
3060
|
-
signerSlot: finalized.ed25519.signerSlot
|
|
3061
|
-
});
|
|
3062
|
-
await rememberPasskeyRegistrationCustodyEnvelope({
|
|
3063
|
-
commit: established.commitPayload,
|
|
3064
|
-
walletId: String(finalized.walletId),
|
|
3065
|
-
activatedAtMs: Date.now()
|
|
3066
|
-
});
|
|
3067
|
-
await context.signingEngine.upsertEd25519YaoPublicCapabilityLaneReference({
|
|
3068
|
-
walletId: finalized.walletId,
|
|
3069
|
-
nearAccountId: toAccountId(finalized.ed25519.nearAccountId),
|
|
3070
|
-
thresholdSessionId: materialFacts.identity.thresholdSessionId,
|
|
3071
|
-
runtimePolicyScope: materialFacts.stableServerScope.runtimePolicyScope,
|
|
3072
|
-
materialActivation: nearEd25519YaoMaterialActivationFromMetadata(metadata),
|
|
3073
|
-
auth: {
|
|
3074
|
-
kind: "passkey",
|
|
3075
|
-
rpId: toRpId(finalizedPasskey.rpId),
|
|
3076
|
-
credentialIdB64u: finalizedPasskey.credentialIdB64u
|
|
3077
|
-
},
|
|
3078
|
-
nearEd25519SigningKeyId: parseNearEd25519SigningKeyId(finalized.ed25519.nearEd25519SigningKeyId),
|
|
3079
|
-
signerSlot: finalized.ed25519.signerSlot
|
|
3080
|
-
});
|
|
3081
|
-
const registration = prepareWalletEd25519RegistrationPublication({
|
|
3082
|
-
walletId: finalized.walletId,
|
|
3083
|
-
nearAccountId,
|
|
3084
|
-
nearEd25519SigningKeyId: finalized.ed25519.nearEd25519SigningKeyId,
|
|
3085
|
-
rpId: requireWebAuthnRpId(finalizedPasskey.rpId),
|
|
3086
|
-
credential: passkeyAuthority.credential,
|
|
3087
|
-
credentialPublicKeyB64u,
|
|
3088
|
-
signerSlot: finalized.ed25519.signerSlot,
|
|
3089
|
-
operationalPublicKey: clientPublicKey,
|
|
3090
|
-
relayerKeyId: finalized.ed25519.relayerKeyId,
|
|
3091
|
-
keyVersion: finalized.ed25519.keyVersion,
|
|
3092
|
-
participantIds: [...finalized.ed25519.participantIds],
|
|
3093
|
-
custodyMaterial
|
|
3094
|
-
});
|
|
3095
|
-
const storedNearActivation = (await IndexedDBManager.publishPendingWalletRegistrationCommit({
|
|
3096
|
-
pending: nearProvisioningPending,
|
|
3097
|
-
ecdsaContinuity: [],
|
|
3098
|
-
authority: finalized.authority,
|
|
3099
|
-
foundingAuthority: {
|
|
3100
|
-
authority: finalized.foundingAuthority,
|
|
3101
|
-
authMethod: finalized.foundingAuthMethod
|
|
3102
|
-
},
|
|
3103
|
-
request: {
|
|
3104
|
-
operation: "near_provisioning",
|
|
3105
|
-
registrationCeremonyId: setup.registrationCeremonyId,
|
|
3106
|
-
idempotencyKey: nearProvisioningIdempotencyKey,
|
|
3107
|
-
walletId: finalized.walletId,
|
|
3108
|
-
walletAuthMethodId: finalized.foundingAuthMethod.walletAuthMethodId
|
|
3109
|
-
},
|
|
3110
|
-
walletSessionPublication: {
|
|
3111
|
-
kind: "issued",
|
|
3112
|
-
walletSession: registrationSession.walletSession,
|
|
3113
|
-
operationCredential: registrationSession.operationCredential
|
|
3114
|
-
},
|
|
3115
|
-
registration
|
|
3116
|
-
})).signerActivations[1];
|
|
3117
|
-
if (!storedNearActivation || storedNearActivation.signerSlot !== finalized.ed25519.signerSlot) throw new Error("Ed25519 Yao registration persisted a different signer slot");
|
|
3118
|
-
registrationTiming.markNearStage(setup.registrationCeremonyId, "near_only.publication");
|
|
3119
|
-
const hydration = await hydrateDeferredNearRegistrationSession({
|
|
3120
|
-
signingEngine: context.signingEngine,
|
|
3121
|
-
ceremonyId: setup.registrationCeremonyId,
|
|
3122
|
-
input: buildRegistrationPasskeyEd25519SessionHydration({
|
|
3123
|
-
session: registrationSession,
|
|
3124
|
-
ceremonyId: setup.registrationCeremonyId,
|
|
3125
|
-
walletId: String(finalized.walletId),
|
|
3126
|
-
relayerUrl,
|
|
3127
|
-
prfFirstB64u: passkeyAuthority.prfFirstB64u,
|
|
3128
|
-
preparedServerSeal: null,
|
|
3129
|
-
restore: {
|
|
3130
|
-
rpId: finalizedPasskey.rpId,
|
|
3131
|
-
nearAccountId: String(nearAccountId),
|
|
3132
|
-
nearEd25519SigningKeyId: finalized.ed25519.nearEd25519SigningKeyId,
|
|
3133
|
-
relayerKeyId: finalized.ed25519.relayerKeyId,
|
|
3134
|
-
participantIds: finalized.ed25519.participantIds,
|
|
3135
|
-
signerSlot: finalized.ed25519.signerSlot,
|
|
3136
|
-
credentialIdB64u: finalizedPasskey.credentialIdB64u,
|
|
3137
|
-
materialActivation: nearEd25519YaoMaterialActivationFromMetadata(metadata)
|
|
3138
|
-
}
|
|
3139
|
-
})
|
|
3140
|
-
});
|
|
3141
|
-
if (hydration.kind === "failed") throw hydration.error;
|
|
3142
|
-
registrationTiming.markNearStage(setup.registrationCeremonyId, "near_only.session_hydration");
|
|
3143
|
-
await activatePasskeyRegistrationEd25519Material({
|
|
3144
|
-
signingEngine: context.signingEngine,
|
|
3145
|
-
sessionAuthority: {
|
|
3146
|
-
record: registrationSession.walletSession,
|
|
3147
|
-
operationCredential: registrationSession.operationCredential
|
|
3148
|
-
},
|
|
3149
|
-
metadata,
|
|
3150
|
-
material: custodyMaterial,
|
|
3151
|
-
materialFacts,
|
|
3152
|
-
envelope: walletCustodyCacheEnvelopeFromRegistrationCommit(established.commitPayload),
|
|
3153
|
-
ownedFactorSecret: base64UrlDecode(passkeyAuthority.prfFirstB64u),
|
|
3154
|
-
rpId: finalizedPasskey.rpId,
|
|
3155
|
-
credentialIdB64u: finalizedPasskey.credentialIdB64u,
|
|
3156
|
-
passkeyPrfFirstB64u: passkeyAuthority.prfFirstB64u,
|
|
3157
|
-
relayerUrl
|
|
3158
|
-
});
|
|
3159
|
-
registrationTiming.markNearStage(setup.registrationCeremonyId, "near_only.material_activation");
|
|
3160
|
-
await establishPasskeyRegistrationEd25519ExportRootCapability({
|
|
3161
|
-
signingEngine: context.signingEngine,
|
|
3162
|
-
commit: established.commitPayload,
|
|
3163
|
-
passkeyPrfFirstB64u: passkeyAuthority.prfFirstB64u,
|
|
3164
|
-
walletId: String(finalized.walletId),
|
|
3165
|
-
walletAuthMethodId: String(finalized.foundingAuthMethod.walletAuthMethodId),
|
|
3166
|
-
walletSessionId: String(registrationSession.walletSessionId),
|
|
3167
|
-
expiresAtMs: registrationSession.expiresAtMs
|
|
3168
|
-
});
|
|
3169
|
-
registrationTiming.markNearStage(setup.registrationCeremonyId, "near_only.export_capability");
|
|
3170
|
-
await context.signingEngine.activateAuthenticatedWalletState({
|
|
3171
|
-
walletId: finalized.walletId,
|
|
3172
|
-
nearAccountId,
|
|
3173
|
-
signerSlot: finalized.ed25519.signerSlot,
|
|
3174
|
-
nearClient: context.nearClient
|
|
3175
|
-
});
|
|
3176
|
-
emitRegistrationEvent(options.onEvent, eventAccountId, {
|
|
3177
|
-
authMethod: "passkey",
|
|
3178
|
-
phase: RegistrationEventPhase.STEP_11_COMPLETED,
|
|
3179
|
-
status: "succeeded"
|
|
3180
|
-
});
|
|
3181
|
-
if (postTouchIdCompletedAt !== null) {
|
|
3182
|
-
const walletReadyAt = performance.now();
|
|
3183
|
-
emitRegistrationTimingSpan({
|
|
3184
|
-
callback: options.onTimingSpan,
|
|
3185
|
-
span: "registration.post_touch_id",
|
|
3186
|
-
outcome: "success",
|
|
3187
|
-
durationMs: walletReadyAt - postTouchIdCompletedAt,
|
|
3188
|
-
traceContext
|
|
3189
|
-
});
|
|
3190
|
-
emitRegistrationTimingSpan({
|
|
3191
|
-
callback: options.onTimingSpan,
|
|
3192
|
-
span: "frontend.wallet_ready",
|
|
3193
|
-
outcome: "success",
|
|
3194
|
-
durationMs: 0,
|
|
3195
|
-
traceContext
|
|
3196
|
-
});
|
|
3197
|
-
}
|
|
3198
|
-
registrationTiming.markNearStage(setup.registrationCeremonyId, "near_only.wallet_ready");
|
|
3199
|
-
emitRegistrationTimingSummary(createSucceededRegistrationTimingSummary({
|
|
3200
|
-
recorder: registrationTiming,
|
|
3201
|
-
authMethod: "passkey",
|
|
3202
|
-
signerSet: registrationTimingSignerSetFromPlan(args.signerPlan)
|
|
3203
|
-
}));
|
|
3204
|
-
const result = {
|
|
3205
|
-
success: true,
|
|
3206
|
-
kind: "wallet_registered",
|
|
3207
|
-
walletId: finalized.walletId,
|
|
3208
|
-
capabilities: [{
|
|
3209
|
-
kind: "near_ed25519",
|
|
3210
|
-
accountProvisioning: finalized.accountProvisioning,
|
|
3211
|
-
resolvedAccount: finalized.resolvedAccount,
|
|
3212
|
-
nearEd25519SigningKeyId: parseNearEd25519SigningKeyId(finalized.ed25519.nearEd25519SigningKeyId),
|
|
3213
|
-
operationalPublicKey: clientPublicKey,
|
|
3214
|
-
nearAccountId: toAccountId(finalized.ed25519.nearAccountId),
|
|
3215
|
-
transactionId: finalized.resolvedAccount.kind === "sponsored_named_account" ? finalized.resolvedAccount.transactionHash : null
|
|
3216
|
-
}]
|
|
3217
|
-
};
|
|
3218
|
-
commitSuccessfulWalletAuthentication(context, result, "passkey");
|
|
3219
|
-
options.afterCall?.(true, result);
|
|
3220
|
-
return result;
|
|
3221
|
-
} catch (error) {
|
|
3222
|
-
const errorCode = registrationErrorCodeFromUnknown(error);
|
|
3223
|
-
const message = getUserFriendlyErrorMessage(error, "registration", initialEventAccountId);
|
|
3224
|
-
if (postTouchIdCompletedAt !== null) emitRegistrationTimingSpan({
|
|
3225
|
-
callback: options.onTimingSpan,
|
|
3226
|
-
span: "registration.post_touch_id",
|
|
3227
|
-
outcome: "failure",
|
|
3228
|
-
durationMs: performance.now() - postTouchIdCompletedAt,
|
|
3229
|
-
traceContext
|
|
3230
|
-
});
|
|
3231
|
-
options.onError?.(registrationErrorWithCode(message, errorCode));
|
|
3232
|
-
emitRegistrationEvent(options.onEvent, initialEventAccountId, {
|
|
3233
|
-
authMethod: "passkey",
|
|
3234
|
-
phase: RegistrationEventPhase.FAILED,
|
|
3235
|
-
status: "failed",
|
|
3236
|
-
message,
|
|
3237
|
-
interaction: {
|
|
3238
|
-
kind: "passkey_create",
|
|
3239
|
-
overlay: "hide"
|
|
3240
|
-
},
|
|
3241
|
-
error: {
|
|
3242
|
-
...errorCode ? { code: errorCode } : {},
|
|
3243
|
-
message
|
|
3244
|
-
}
|
|
3245
|
-
});
|
|
3246
|
-
const result = {
|
|
3247
|
-
success: false,
|
|
3248
|
-
error: message,
|
|
3249
|
-
...errorCode ? { errorCode } : {}
|
|
3250
|
-
};
|
|
3251
|
-
options.afterCall?.(false);
|
|
3252
|
-
return result;
|
|
3253
|
-
}
|
|
3254
|
-
}
|
|
3255
|
-
async function registerWalletInternal(args) {
|
|
3256
|
-
const signerPlan = registrationSignerPlanFromSignerSet(args.signerSelection);
|
|
3257
|
-
const ed25519Branch = findRegistrationSignerPlanNearEd25519Branch(signerPlan);
|
|
3258
|
-
if (ed25519Branch) {
|
|
3259
|
-
const ecdsaBranch = findRegistrationSignerPlanEvmFamilyEcdsaBranch(signerPlan);
|
|
3260
|
-
if (ecdsaBranch) return await registerEcdsaOrMixedWallet({
|
|
3261
|
-
kind: "near_ed25519_and_evm_family_ecdsa",
|
|
3262
|
-
context: args.context,
|
|
3263
|
-
authMethod: args.authMethod,
|
|
3264
|
-
wallet: args.wallet,
|
|
3265
|
-
signerSelection: args.signerSelection,
|
|
3266
|
-
signerPlan,
|
|
3267
|
-
ed25519Selection: ed25519Branch,
|
|
3268
|
-
ecdsaSelection: ecdsaBranch,
|
|
3269
|
-
options: args.options,
|
|
3270
|
-
passkeyExecution: args.passkeyExecution,
|
|
3271
|
-
...args.confirmationConfigOverride ? { confirmationConfigOverride: args.confirmationConfigOverride } : {}
|
|
3272
|
-
});
|
|
3273
|
-
if (args.authMethod.kind === "email_otp") {
|
|
3274
|
-
if (args.passkeyExecution.kind !== "collect_during_registration") throw new Error("Prepared registration authority requires passkey authentication");
|
|
3275
|
-
return await registerEmailOtpEd25519YaoWalletOnly({
|
|
3276
|
-
context: args.context,
|
|
3277
|
-
authMethod: args.authMethod,
|
|
3278
|
-
wallet: args.wallet,
|
|
3279
|
-
signerSelection: args.signerSelection,
|
|
3280
|
-
signerPlan,
|
|
3281
|
-
ed25519Selection: ed25519Branch,
|
|
3282
|
-
options: args.options,
|
|
3283
|
-
passkeyExecution: args.passkeyExecution
|
|
3284
|
-
});
|
|
3285
|
-
}
|
|
3286
|
-
return await registerPasskeyEd25519YaoWalletOnly({
|
|
3287
|
-
context: args.context,
|
|
3288
|
-
authMethod: args.authMethod,
|
|
3289
|
-
wallet: args.wallet,
|
|
3290
|
-
signerSelection: args.signerSelection,
|
|
3291
|
-
signerPlan,
|
|
3292
|
-
ed25519Selection: ed25519Branch,
|
|
3293
|
-
options: args.options,
|
|
3294
|
-
passkeyExecution: args.passkeyExecution,
|
|
3295
|
-
...args.confirmationConfigOverride ? { confirmationConfigOverride: args.confirmationConfigOverride } : {}
|
|
3296
|
-
});
|
|
3297
|
-
}
|
|
3298
|
-
const ecdsaBranch = findRegistrationSignerPlanEvmFamilyEcdsaBranch(signerPlan);
|
|
3299
|
-
if (!ecdsaBranch) throw new Error("Wallet registration requires an ECDSA signer branch");
|
|
3300
|
-
return await registerEcdsaOrMixedWallet({
|
|
3301
|
-
kind: "evm_family_ecdsa",
|
|
3302
|
-
context: args.context,
|
|
3303
|
-
authMethod: args.authMethod,
|
|
3304
|
-
wallet: args.wallet,
|
|
3305
|
-
signerSelection: args.signerSelection,
|
|
3306
|
-
signerPlan,
|
|
3307
|
-
ecdsaSelection: ecdsaBranch,
|
|
3308
|
-
options: args.options,
|
|
3309
|
-
passkeyExecution: args.passkeyExecution,
|
|
3310
|
-
...args.confirmationConfigOverride ? { confirmationConfigOverride: args.confirmationConfigOverride } : {}
|
|
3311
|
-
});
|
|
3312
|
-
}
|
|
3313
|
-
function commitSuccessfulWalletAuthentication(context, result, authMethod) {
|
|
3314
|
-
context.signingEngine.setWalletAuthenticated({
|
|
3315
|
-
kind: "authenticated",
|
|
3316
|
-
walletId: result.walletId,
|
|
3317
|
-
authMethod
|
|
3318
|
-
});
|
|
3319
|
-
}
|
|
3320
|
-
async function registerWallet(args) {
|
|
3321
|
-
try {
|
|
3322
|
-
return await registerWalletInternal({
|
|
3323
|
-
context: args.context,
|
|
3324
|
-
authMethod: args.authMethod,
|
|
3325
|
-
wallet: args.wallet,
|
|
3326
|
-
signerSelection: args.signerSelection,
|
|
3327
|
-
options: args.options,
|
|
3328
|
-
authenticatorOptions: args.authenticatorOptions,
|
|
3329
|
-
...args.confirmationConfigOverride ? { confirmationConfigOverride: args.confirmationConfigOverride } : {},
|
|
3330
|
-
passkeyExecution: { kind: "collect_during_registration" }
|
|
3331
|
-
});
|
|
3332
|
-
} finally {
|
|
3333
|
-
args.context.signingEngine.closeRegistrationPreparationModal();
|
|
3334
|
-
}
|
|
3335
|
-
}
|
|
3336
|
-
function emitAddSignerEventSafely(onEvent, accountId, event) {
|
|
3337
|
-
try {
|
|
3338
|
-
emitRegistrationEvent(onEvent, accountId, event);
|
|
3339
|
-
} catch {}
|
|
3340
|
-
}
|
|
3341
|
-
function notifyAddSignerErrorSafely(onError, error) {
|
|
3342
|
-
try {
|
|
3343
|
-
onError?.(error);
|
|
3344
|
-
} catch {}
|
|
3345
|
-
}
|
|
3346
|
-
function notifyAddSignerAfterCallSafely(afterCall, success, result) {
|
|
3347
|
-
try {
|
|
3348
|
-
if (success && result) afterCall?.(true, result);
|
|
3349
|
-
else afterCall?.(false);
|
|
3350
|
-
} catch {}
|
|
3351
|
-
}
|
|
3352
|
-
function addSignerAllowCredentials(authenticators) {
|
|
3353
|
-
const credentials = [];
|
|
3354
|
-
for (const authenticator of authenticators) {
|
|
3355
|
-
const credentialId = String(authenticator.credentialId || "").trim();
|
|
3356
|
-
if (!credentialId) continue;
|
|
3357
|
-
credentials.push({
|
|
3358
|
-
id: credentialId,
|
|
3359
|
-
type: "public-key",
|
|
3360
|
-
transports: webAuthnTransportsFromRaw(authenticator.transports)
|
|
3361
|
-
});
|
|
3362
|
-
}
|
|
3363
|
-
if (credentials.length === 0) throw new Error("Wallet add-signer requires an existing passkey credential");
|
|
3364
|
-
return credentials;
|
|
3365
|
-
}
|
|
3366
|
-
function requireSelectedAddSignerCredentialId(credential, allowCredentials) {
|
|
3367
|
-
const id = String(credential.id || "").trim();
|
|
3368
|
-
const rawId = String(credential.rawId || "").trim();
|
|
3369
|
-
if (!id || !rawId || id !== rawId) throw new Error("Wallet add-signer selected an invalid passkey credential identity");
|
|
3370
|
-
for (const allowed of allowCredentials) if (allowed.id === rawId) return rawId;
|
|
3371
|
-
throw new Error("Wallet add-signer selected a passkey outside the authorized wallet");
|
|
3372
|
-
}
|
|
3373
|
-
async function requireMatchingStartedAddSignerIntent(args) {
|
|
3374
|
-
if (args.started.intent.walletId !== args.walletId) throw new Error("Wallet add-signer start returned a different wallet");
|
|
3375
|
-
if (await computeAddSignerIntentDigest(args.started.intent) !== args.expectedDigestB64u) throw new Error("Wallet add-signer start returned a different intent");
|
|
3376
|
-
if (!String(args.started.addSignerCeremonyId || "").trim()) throw new Error("Wallet add-signer start returned an invalid ceremony ID");
|
|
3377
|
-
}
|
|
3378
|
-
function sameParticipantIds(left, right) {
|
|
3379
|
-
return left.length === 2 && right.length === 2 && left[0] === right[0] && left[1] === right[1];
|
|
3380
|
-
}
|
|
3381
|
-
function requireVerifiedEd25519AddSignerFinalize(args) {
|
|
3382
|
-
const selection = args.started.intent.signerSelection;
|
|
3383
|
-
if (selection.mode !== "ed25519") throw new Error("Wallet add-signer start intent changed signer branch");
|
|
3384
|
-
const requested = selection.ed25519;
|
|
3385
|
-
const admission = args.started.ed25519.admissionRequest;
|
|
3386
|
-
const finalized = args.finalized;
|
|
3387
|
-
const signer = finalized.ed25519;
|
|
3388
|
-
const expectedNearAccountId = deriveImplicitNearAccountIdFromEd25519PublicKey(args.clientPublicKey);
|
|
3389
|
-
if (finalized.walletId !== args.walletId || finalized.rpId !== args.rpId || finalized.credentialIdB64u !== args.credentialIdB64u || signer.publicKey !== args.clientPublicKey || signer.nearAccountId !== expectedNearAccountId || signer.signerSlot !== requested.signerSlot || signer.keyVersion !== requested.keyVersion || signer.recoveryExportCapable !== true || !sameParticipantIds(signer.participantIds, requested.participantIds) || signer.nearEd25519SigningKeyId !== admission.application_binding.near_ed25519_signing_key_id || signer.relayerKeyId !== admission.scope.signing_worker_id || admission.application_binding.wallet_id !== args.walletId || admission.application_binding.key_creation_signer_slot !== requested.signerSlot) throw new Error("Wallet add-signer finalize returned mismatched Ed25519 Yao identity");
|
|
3390
|
-
return finalized;
|
|
3391
|
-
}
|
|
3392
|
-
function verifiedEd25519AddSignerIntent(started) {
|
|
3393
|
-
const selection = started.intent.signerSelection;
|
|
3394
|
-
if (selection.mode !== "ed25519") throw new Error("Wallet add-signer start intent changed signer branch");
|
|
3395
|
-
return {
|
|
3396
|
-
version: started.intent.version,
|
|
3397
|
-
walletId: started.intent.walletId,
|
|
3398
|
-
signerSelection: selection,
|
|
3399
|
-
...started.intent.runtimePolicyScope ? { runtimePolicyScope: started.intent.runtimePolicyScope } : {},
|
|
3400
|
-
nonceB64u: started.intent.nonceB64u
|
|
3401
|
-
};
|
|
3402
|
-
}
|
|
3403
|
-
async function addPasskeyEd25519YaoWalletSigner(input) {
|
|
3404
|
-
if (input.started.intent.signerSelection.mode !== "ed25519") throw new Error("Wallet add-signer start returned a different signer branch");
|
|
3405
|
-
let persistedSignerRollbackReceipt = null;
|
|
3406
|
-
let persistedMaterialTarget = null;
|
|
3407
|
-
let factorSecret = null;
|
|
3408
|
-
try {
|
|
3409
|
-
if (input.started.authorizationKind !== "webauthn_assertion") throw new Error("Wallet custody Ed25519 add-signer requires WebAuthn authorization");
|
|
3410
|
-
const admitted = await admitVerifiedPasskeyEd25519YaoAddSignerV1({
|
|
3411
|
-
kind: "verified_passkey_ed25519_yao_add_signer_input_v1",
|
|
3412
|
-
verifiedIntent: {
|
|
3413
|
-
kind: "verified_passkey_ed25519_add_signer_intent_v1",
|
|
3414
|
-
intent: verifiedEd25519AddSignerIntent(input.started),
|
|
3415
|
-
addSignerIntentDigestB64u: input.intentResponse.addSignerIntentDigestB64u,
|
|
3416
|
-
addSignerIntentGrant: input.intentResponse.addSignerIntentGrant,
|
|
3417
|
-
addSignerCeremonyId: input.started.addSignerCeremonyId
|
|
3418
|
-
},
|
|
3419
|
-
verifiedAuthority: {
|
|
3420
|
-
kind: "verified_passkey_ed25519_add_signer_authority_v1",
|
|
3421
|
-
walletId: input.walletId,
|
|
3422
|
-
addSignerIntentDigestB64u: input.intentResponse.addSignerIntentDigestB64u,
|
|
3423
|
-
credentialIdB64u: input.credentialIdB64u
|
|
3424
|
-
},
|
|
3425
|
-
admissionRequest: input.started.ed25519.admissionRequest,
|
|
3426
|
-
httpTransport: {
|
|
3427
|
-
kind: "passkey_ed25519_yao_http_transport_v1",
|
|
3428
|
-
routerOrigin: new URL(input.relayerUrl).origin,
|
|
3429
|
-
fetch: globalThis.fetch
|
|
3430
|
-
}
|
|
3431
|
-
});
|
|
3432
|
-
const custodyWire = joinCustodyWireFromEnvelopeRecord(input.started.ed25519.custodyEnvelope);
|
|
3433
|
-
if (!custodyWire.ok) throw new Error(custodyWire.reason);
|
|
3434
|
-
factorSecret = Uint8Array.from(base64UrlDecode(input.passkeyPrfFirstB64u)).buffer;
|
|
3435
|
-
const joined = await input.context.signingEngine.joinWalletCustodyNearEd25519KeySet({
|
|
3436
|
-
preparation: { kind: "fresh" },
|
|
3437
|
-
custodyJson: custodyWire.custodyJson,
|
|
3438
|
-
factorSecret,
|
|
3439
|
-
nearEd25519SigningKeyId: admitted.request.application_binding.near_ed25519_signing_key_id,
|
|
3440
|
-
registrationCeremonyId: input.started.addSignerCeremonyId,
|
|
3441
|
-
admissionRequest: admitted.request,
|
|
3442
|
-
admissionReceipt: admitted.receipt,
|
|
3443
|
-
participantIds: admitted.request.participant_ids,
|
|
3444
|
-
routerOrigin: new URL(input.relayerUrl).origin,
|
|
3445
|
-
authorization: `Bearer ${String(input.intentResponse.addSignerIntentGrant)}`
|
|
3446
|
-
});
|
|
3447
|
-
const clientPublicKey = `ed25519:${base58Encode(joined.metadata.registeredPublicKey)}`;
|
|
3448
|
-
const finalizedRaw = await finalizeWalletAddSigner({
|
|
3449
|
-
relayerUrl: input.relayerUrl,
|
|
3450
|
-
walletId: input.walletId,
|
|
3451
|
-
addSignerCeremonyId: input.started.addSignerCeremonyId,
|
|
3452
|
-
idempotencyKey: createRegistrationOperationIdempotencyKey("wallet-ed25519-add-signer-finalize"),
|
|
3453
|
-
kind: "near_ed25519",
|
|
3454
|
-
ed25519: { activationReference: joined.activationReference },
|
|
3455
|
-
custodyKeySet: {
|
|
3456
|
-
kind: "near_ed25519_v1",
|
|
3457
|
-
keyManifestDigestB64u: joined.commitPayload.keyManifestDigestB64u,
|
|
3458
|
-
registeredPublicKeyB64u: base64UrlEncode(joined.metadata.registeredPublicKey)
|
|
3459
|
-
}
|
|
3460
|
-
});
|
|
3461
|
-
if (finalizedRaw.kind !== "near_ed25519") throw new Error("Wallet add-signer finalize returned a different signer branch");
|
|
3462
|
-
const finalized = requireVerifiedEd25519AddSignerFinalize({
|
|
3463
|
-
finalized: finalizedRaw,
|
|
3464
|
-
started: input.started,
|
|
3465
|
-
walletId: input.walletId,
|
|
3466
|
-
rpId: input.rpId,
|
|
3467
|
-
credentialIdB64u: input.credentialIdB64u,
|
|
3468
|
-
clientPublicKey
|
|
3469
|
-
});
|
|
3470
|
-
emitAddSignerEventSafely(input.onEvent, input.eventAccountId, {
|
|
3471
|
-
authMethod: "passkey",
|
|
3472
|
-
phase: RegistrationEventPhase.STEP_08_STORAGE_PERSIST_STARTED,
|
|
3473
|
-
status: "running"
|
|
3474
|
-
});
|
|
3475
|
-
const stored = await input.context.signingEngine.finalizeWalletEd25519SignerRegistration({
|
|
3476
|
-
walletId: input.walletId,
|
|
3477
|
-
nearAccountId: toAccountId(finalized.ed25519.nearAccountId),
|
|
3478
|
-
nearEd25519SigningKeyId: finalized.ed25519.nearEd25519SigningKeyId,
|
|
3479
|
-
auth: {
|
|
3480
|
-
kind: "passkey",
|
|
3481
|
-
credential: input.credential
|
|
3482
|
-
},
|
|
3483
|
-
signerSlot: finalized.ed25519.signerSlot,
|
|
3484
|
-
operationalPublicKey: clientPublicKey,
|
|
3485
|
-
relayerKeyId: finalized.ed25519.relayerKeyId,
|
|
3486
|
-
keyVersion: finalized.ed25519.keyVersion,
|
|
3487
|
-
participantIds: [...finalized.ed25519.participantIds]
|
|
3488
|
-
});
|
|
3489
|
-
if (stored.signerSlot !== finalized.ed25519.signerSlot) throw new Error("Wallet add-signer persisted a different Ed25519 signer slot");
|
|
3490
|
-
persistedSignerRollbackReceipt = stored.rollbackReceipt;
|
|
3491
|
-
const admission = input.started.ed25519.admissionRequest;
|
|
3492
|
-
const thresholdSessionId = parseThresholdEd25519SessionId(admission.scope.threshold_session_id);
|
|
3493
|
-
if (!thresholdSessionId.ok) throw new Error("Wallet add-signer threshold-session identity is invalid");
|
|
3494
|
-
const metadata = joined.metadata;
|
|
3495
|
-
await input.context.signingEngine.persistWalletCustodyEd25519Material({
|
|
3496
|
-
binding: {
|
|
3497
|
-
kind: WALLET_CUSTODY_ED25519_MATERIAL_KEY_KIND,
|
|
3498
|
-
applicationBindingDigestB64u: joined.localMaterial.applicationBindingDigestB64u,
|
|
3499
|
-
registeredPublicKeyB64u: base64UrlEncode(metadata.registeredPublicKey),
|
|
3500
|
-
participantIds: metadata.participantIds,
|
|
3501
|
-
stateEpoch: String(metadata.stateEpoch),
|
|
3502
|
-
walletId: String(finalized.walletId),
|
|
3503
|
-
nearAccountId: String(finalized.ed25519.nearAccountId),
|
|
3504
|
-
nearEd25519SigningKeyId: finalized.ed25519.nearEd25519SigningKeyId,
|
|
3505
|
-
signerSlot: finalized.ed25519.signerSlot,
|
|
3506
|
-
signingWorkerId: metadata.scope.signing_worker_id,
|
|
3507
|
-
signingWorkerVerifyingShareB64u: base64UrlEncode(metadata.signingWorkerVerifyingShare)
|
|
3508
|
-
},
|
|
3509
|
-
sealed: {
|
|
3510
|
-
ciphertextB64u: joined.localMaterial.b64u,
|
|
3511
|
-
nonceB64u: joined.localMaterial.nonceB64u
|
|
3512
|
-
}
|
|
3513
|
-
});
|
|
3514
|
-
persistedMaterialTarget = {
|
|
3515
|
-
nearAccountId: finalized.ed25519.nearAccountId,
|
|
3516
|
-
signerSlot: finalized.ed25519.signerSlot
|
|
3517
|
-
};
|
|
3518
|
-
await input.context.signingEngine.upsertEd25519YaoPublicCapabilityLaneReference({
|
|
3519
|
-
walletId: finalized.walletId,
|
|
3520
|
-
nearAccountId: toAccountId(finalized.ed25519.nearAccountId),
|
|
3521
|
-
thresholdSessionId: thresholdSessionId.value,
|
|
3522
|
-
runtimePolicyScope: normalizeRuntimePolicyScope(input.started.intent.runtimePolicyScope),
|
|
3523
|
-
materialActivation: nearEd25519YaoMaterialActivationFromMetadata(metadata),
|
|
3524
|
-
auth: {
|
|
3525
|
-
kind: "passkey",
|
|
3526
|
-
rpId: toRpId(input.rpId),
|
|
3527
|
-
credentialIdB64u: input.credentialIdB64u
|
|
3528
|
-
},
|
|
3529
|
-
nearEd25519SigningKeyId: parseNearEd25519SigningKeyId(finalized.ed25519.nearEd25519SigningKeyId),
|
|
3530
|
-
signerSlot: finalized.ed25519.signerSlot
|
|
3531
|
-
});
|
|
3532
|
-
persistedSignerRollbackReceipt = null;
|
|
3533
|
-
emitAddSignerEventSafely(input.onEvent, input.eventAccountId, {
|
|
3534
|
-
authMethod: "passkey",
|
|
3535
|
-
phase: RegistrationEventPhase.STEP_08_STORAGE_PERSIST_SUCCEEDED,
|
|
3536
|
-
status: "succeeded"
|
|
3537
|
-
});
|
|
3538
|
-
return {
|
|
3539
|
-
success: true,
|
|
3540
|
-
kind: "wallet_signer_added",
|
|
3541
|
-
walletId: finalized.walletId,
|
|
3542
|
-
capabilities: [{
|
|
3543
|
-
kind: "near_ed25519",
|
|
3544
|
-
nearEd25519SigningKeyId: parseNearEd25519SigningKeyId(finalized.ed25519.nearEd25519SigningKeyId),
|
|
3545
|
-
operationalPublicKey: clientPublicKey,
|
|
3546
|
-
nearAccountId: toAccountId(finalized.ed25519.nearAccountId)
|
|
3547
|
-
}]
|
|
3548
|
-
};
|
|
3549
|
-
} catch (error) {
|
|
3550
|
-
const cleanupErrors = [];
|
|
3551
|
-
if (persistedMaterialTarget) try {
|
|
3552
|
-
await input.context.signingEngine.deleteWalletCustodyEd25519Material({
|
|
3553
|
-
nearAccountId: persistedMaterialTarget.nearAccountId,
|
|
3554
|
-
signerSlot: persistedMaterialTarget.signerSlot
|
|
3555
|
-
});
|
|
3556
|
-
} catch (cleanupError) {
|
|
3557
|
-
cleanupErrors.push(cleanupError instanceof Error ? cleanupError.message : String(cleanupError));
|
|
3558
|
-
}
|
|
3559
|
-
if (persistedSignerRollbackReceipt) try {
|
|
3560
|
-
await input.context.signingEngine.rollbackWalletEd25519SignerRegistration(persistedSignerRollbackReceipt);
|
|
3561
|
-
} catch (cleanupError) {
|
|
3562
|
-
cleanupErrors.push(cleanupError instanceof Error ? cleanupError.message : String(cleanupError));
|
|
3563
|
-
}
|
|
3564
|
-
if (cleanupErrors.length > 0) {
|
|
3565
|
-
const primary = error instanceof Error ? error.message : String(error);
|
|
3566
|
-
throw new Error(`${primary}; add-signer cleanup failed: ${cleanupErrors.join("; ")}`);
|
|
3567
|
-
}
|
|
3568
|
-
throw error;
|
|
3569
|
-
} finally {
|
|
3570
|
-
if (factorSecret) zeroizeArrayBuffer(factorSecret);
|
|
3571
|
-
}
|
|
3572
|
-
}
|
|
3573
|
-
async function addPasskeyEcdsaWalletSigner(input) {
|
|
3574
|
-
if (input.started.authorizationKind !== "webauthn_assertion") throw new Error("Wallet custody ECDSA add-signer requires WebAuthn authorization");
|
|
3575
|
-
const authority = await exactPasskeyWalletAuthAuthorityRefForCredential({
|
|
3576
|
-
walletId: input.walletId,
|
|
3577
|
-
rpId: input.rpId,
|
|
3578
|
-
credentialIdB64u: input.credentialIdB64u
|
|
3579
|
-
});
|
|
3580
|
-
const factorSecret = Uint8Array.from(base64UrlDecode(input.passkeyPrfFirstB64u)).buffer;
|
|
3581
|
-
let pendingLocalFinalization;
|
|
3582
|
-
try {
|
|
3583
|
-
pendingLocalFinalization = await runStrictEcdsaFamilyCeremony({
|
|
3584
|
-
context: input.context,
|
|
3585
|
-
relayerUrl: input.relayerUrl,
|
|
3586
|
-
walletId: input.walletId,
|
|
3587
|
-
addSignerCeremonyId: input.started.addSignerCeremonyId,
|
|
3588
|
-
started: input.started.ecdsa,
|
|
3589
|
-
custodyEnvelope: input.started.ecdsa.custodyEnvelope,
|
|
3590
|
-
factorSecret,
|
|
3591
|
-
authority,
|
|
3592
|
-
registrationTiming: null
|
|
3593
|
-
});
|
|
3594
|
-
} finally {
|
|
3595
|
-
zeroizeArrayBuffer(factorSecret);
|
|
3596
|
-
}
|
|
3597
|
-
const finalizeRequest = {
|
|
3598
|
-
relayerUrl: input.relayerUrl,
|
|
3599
|
-
walletId: input.walletId,
|
|
3600
|
-
addSignerCeremonyId: input.started.addSignerCeremonyId,
|
|
3601
|
-
idempotencyKey: createRegistrationOperationIdempotencyKey("wallet-add-signer-finalize"),
|
|
3602
|
-
kind: "evm_family_ecdsa",
|
|
3603
|
-
ecdsa: { expectedKeyHandles: [pendingLocalFinalization.bootstrap.keyHandle] },
|
|
3604
|
-
custodyKeySet: pendingLocalFinalization.custodyKeySet
|
|
3605
|
-
};
|
|
3606
|
-
let finalized;
|
|
3607
|
-
try {
|
|
3608
|
-
finalized = await finalizeWalletAddSigner(finalizeRequest);
|
|
3609
|
-
} catch (error) {
|
|
3610
|
-
if (!(error instanceof TypeError)) throw error;
|
|
3611
|
-
finalized = await finalizeWalletAddSigner(finalizeRequest);
|
|
3612
|
-
}
|
|
3613
|
-
if (finalized.kind !== "evm_family_ecdsa" || finalized.walletId !== input.walletId || finalized.rpId !== input.rpId) throw new Error("Wallet add-signer finalize returned a different ECDSA identity");
|
|
3614
|
-
const walletKeys = finalized.ecdsa.walletKeys;
|
|
3615
|
-
const primaryKey = walletKeys[0];
|
|
3616
|
-
if (!primaryKey) throw new Error("Wallet add-signer finalize did not return ECDSA wallet keys");
|
|
3617
|
-
const session = await finalizeStrictEcdsaFamilyLocalActivation({
|
|
3618
|
-
context: input.context,
|
|
3619
|
-
pending: pendingLocalFinalization
|
|
3620
|
-
});
|
|
3621
|
-
emitAddSignerEventSafely(input.onEvent, input.eventAccountId, {
|
|
3622
|
-
authMethod: "passkey",
|
|
3623
|
-
phase: RegistrationEventPhase.STEP_08_STORAGE_PERSIST_STARTED,
|
|
3624
|
-
status: "running"
|
|
3625
|
-
});
|
|
3626
|
-
const localEcdsaWalletKeys = await input.context.signingEngine.finalizeWalletRegistrationEcdsaSessions({
|
|
3627
|
-
walletId: toWalletId(input.walletId),
|
|
3628
|
-
session,
|
|
3629
|
-
walletKeys: [primaryKey, ...walletKeys.slice(1)]
|
|
3630
|
-
});
|
|
3631
|
-
await input.context.signingEngine.storeWalletEcdsaSignerRecords({
|
|
3632
|
-
walletId: input.walletId,
|
|
3633
|
-
walletKeys: localEcdsaWalletKeys
|
|
3634
|
-
});
|
|
3635
|
-
await IndexedDBManager.adoptAddedEcdsaSignerAuthority({
|
|
3636
|
-
authority: finalized.authority,
|
|
3637
|
-
materialActivation: session.materialActivation
|
|
3638
|
-
});
|
|
3639
|
-
emitAddSignerEventSafely(input.onEvent, input.eventAccountId, {
|
|
3640
|
-
authMethod: "passkey",
|
|
3641
|
-
phase: RegistrationEventPhase.STEP_08_STORAGE_PERSIST_SUCCEEDED,
|
|
3642
|
-
status: "succeeded"
|
|
3643
|
-
});
|
|
3644
|
-
return {
|
|
3645
|
-
success: true,
|
|
3646
|
-
kind: "wallet_signer_added",
|
|
3647
|
-
walletId: input.walletId,
|
|
3648
|
-
capabilities: [{
|
|
3649
|
-
kind: "evm_family_ecdsa",
|
|
3650
|
-
thresholdEcdsaEthereumAddress: primaryKey.thresholdOwnerAddress,
|
|
3651
|
-
thresholdEcdsaPublicKeyB64u: primaryKey.thresholdEcdsaPublicKeyB64u
|
|
3652
|
-
}]
|
|
3653
|
-
};
|
|
3654
|
-
}
|
|
3655
|
-
async function dispatchPasskeyWalletAddSigner(args) {
|
|
3656
|
-
switch (args.signerSelection.mode) {
|
|
3657
|
-
case "ed25519":
|
|
3658
|
-
if (args.started.kind !== "near_ed25519") throw new Error("Wallet add-signer start returned a different signer branch");
|
|
3659
|
-
return await addPasskeyEd25519YaoWalletSigner({
|
|
3660
|
-
context: args.input.context,
|
|
3661
|
-
walletId: args.input.walletId,
|
|
3662
|
-
rpId: args.input.rpId,
|
|
3663
|
-
relayerUrl: args.input.relayerUrl,
|
|
3664
|
-
intentResponse: args.input.intentResponse,
|
|
3665
|
-
credential: args.input.credential,
|
|
3666
|
-
credentialIdB64u: args.input.credentialIdB64u,
|
|
3667
|
-
passkeyPrfFirstB64u: args.input.passkeyPrfFirstB64u,
|
|
3668
|
-
eventAccountId: args.input.eventAccountId,
|
|
3669
|
-
onEvent: args.input.onEvent,
|
|
3670
|
-
started: args.started
|
|
3671
|
-
});
|
|
3672
|
-
case "ecdsa":
|
|
3673
|
-
if (args.started.kind !== "evm_family_ecdsa") throw new Error("Wallet add-signer start returned a different signer branch");
|
|
3674
|
-
return await addPasskeyEcdsaWalletSigner({
|
|
3675
|
-
context: args.input.context,
|
|
3676
|
-
walletId: args.input.walletId,
|
|
3677
|
-
rpId: args.input.rpId,
|
|
3678
|
-
relayerUrl: args.input.relayerUrl,
|
|
3679
|
-
intentResponse: args.input.intentResponse,
|
|
3680
|
-
credential: args.input.credential,
|
|
3681
|
-
credentialIdB64u: args.input.credentialIdB64u,
|
|
3682
|
-
passkeyPrfFirstB64u: args.input.passkeyPrfFirstB64u,
|
|
3683
|
-
eventAccountId: args.input.eventAccountId,
|
|
3684
|
-
onEvent: args.input.onEvent,
|
|
3685
|
-
started: args.started
|
|
3686
|
-
});
|
|
3687
|
-
default: return assertNever(args.signerSelection);
|
|
3688
|
-
}
|
|
3689
|
-
}
|
|
3690
|
-
async function addWalletSigner(args) {
|
|
3691
|
-
const { context, signerSelection } = args;
|
|
3692
|
-
const options = args.options || {};
|
|
3693
|
-
const walletId = walletIdFromString(String(args.walletId || "").trim());
|
|
3694
|
-
const eventAccountId = registrationEventAccountId(String(walletId));
|
|
3695
|
-
const rpId = requireWebAuthnRpId(String(args.rpId || "").trim());
|
|
3696
|
-
emitAddSignerEventSafely(options.onEvent, eventAccountId, {
|
|
3697
|
-
authMethod: "passkey",
|
|
3698
|
-
phase: RegistrationEventPhase.STEP_01_STARTED,
|
|
3699
|
-
status: "started"
|
|
3700
|
-
});
|
|
3701
|
-
try {
|
|
3702
|
-
const relayerUrl = String(context.configs.network.relayer.url || "").trim();
|
|
3703
|
-
if (!relayerUrl) throw new Error("addWalletSigner requires relayer.url");
|
|
3704
|
-
const managedRuntimeScope = resolveManagedRuntimeScopeBootstrap(context.configs);
|
|
3705
|
-
if (!managedRuntimeScope) throw new Error("addWalletSigner requires registration.publishableKey and registration.projectEnvironmentId");
|
|
3706
|
-
const intentResponse = await createWalletAddSignerIntent({
|
|
3707
|
-
relayerUrl,
|
|
3708
|
-
walletId,
|
|
3709
|
-
request: {
|
|
3710
|
-
walletId,
|
|
3711
|
-
rpId,
|
|
3712
|
-
signerSelection
|
|
3713
|
-
},
|
|
3714
|
-
auth: {
|
|
3715
|
-
publishableKey: managedRuntimeScope.publishableKey,
|
|
3716
|
-
environmentId: managedRuntimeScope.projectEnvironmentId
|
|
3717
|
-
}
|
|
3718
|
-
});
|
|
3719
|
-
if (await computeAddSignerIntentDigest(intentResponse.intent) !== intentResponse.addSignerIntentDigestB64u) throw new Error("Add-signer intent digest mismatch");
|
|
3720
|
-
emitAddSignerEventSafely(options.onEvent, eventAccountId, {
|
|
3721
|
-
authMethod: "passkey",
|
|
3722
|
-
phase: RegistrationEventPhase.STEP_04_PASSKEY_CREATE_STARTED,
|
|
3723
|
-
status: "waiting_for_user",
|
|
3724
|
-
interaction: {
|
|
3725
|
-
kind: "passkey_assert",
|
|
3726
|
-
overlay: "show"
|
|
3727
|
-
}
|
|
3728
|
-
});
|
|
3729
|
-
const allowCredentials = addSignerAllowCredentials(await IndexedDBManager.listProfileAuthenticators(String(walletId)));
|
|
3730
|
-
const credential = await context.signingEngine.getAuthenticationCredentialsSerialized({
|
|
3731
|
-
subjectId: String(walletId),
|
|
3732
|
-
challengeB64u: intentResponse.addSignerIntentDigestB64u,
|
|
3733
|
-
allowCredentials,
|
|
3734
|
-
includeSecondPrfOutput: false
|
|
3735
|
-
});
|
|
3736
|
-
const credentialIdB64u = requireSelectedAddSignerCredentialId(credential, allowCredentials);
|
|
3737
|
-
const passkeyPrfFirstB64u = requirePasskeyPrfFirstB64u(credential, "Wallet add-signer authorization");
|
|
3738
|
-
emitAddSignerEventSafely(options.onEvent, eventAccountId, {
|
|
3739
|
-
authMethod: "passkey",
|
|
3740
|
-
phase: RegistrationEventPhase.STEP_04_PASSKEY_CREATE_SUCCEEDED,
|
|
3741
|
-
status: "succeeded",
|
|
3742
|
-
interaction: {
|
|
3743
|
-
kind: "passkey_assert",
|
|
3744
|
-
overlay: "hide"
|
|
3745
|
-
}
|
|
3746
|
-
});
|
|
3747
|
-
const started = await startWalletAddSigner({
|
|
3748
|
-
relayerUrl,
|
|
3749
|
-
walletId,
|
|
3750
|
-
addSignerIntentGrant: intentResponse.addSignerIntentGrant,
|
|
3751
|
-
addSignerIntentDigestB64u: intentResponse.addSignerIntentDigestB64u,
|
|
3752
|
-
intent: intentResponse.intent,
|
|
3753
|
-
auth: {
|
|
3754
|
-
kind: "webauthn_assertion",
|
|
3755
|
-
rpId,
|
|
3756
|
-
credential: redactCredentialExtensionOutputs(credential),
|
|
3757
|
-
expectedChallengeDigestB64u: intentResponse.addSignerIntentDigestB64u
|
|
3758
|
-
}
|
|
3759
|
-
});
|
|
3760
|
-
await requireMatchingStartedAddSignerIntent({
|
|
3761
|
-
started,
|
|
3762
|
-
walletId,
|
|
3763
|
-
expectedDigestB64u: intentResponse.addSignerIntentDigestB64u
|
|
3764
|
-
});
|
|
3765
|
-
const result = await dispatchPasskeyWalletAddSigner({
|
|
3766
|
-
input: {
|
|
3767
|
-
context,
|
|
3768
|
-
walletId,
|
|
3769
|
-
rpId,
|
|
3770
|
-
relayerUrl,
|
|
3771
|
-
intentResponse,
|
|
3772
|
-
credential,
|
|
3773
|
-
credentialIdB64u,
|
|
3774
|
-
passkeyPrfFirstB64u,
|
|
3775
|
-
eventAccountId,
|
|
3776
|
-
onEvent: options.onEvent
|
|
3777
|
-
},
|
|
3778
|
-
signerSelection,
|
|
3779
|
-
started
|
|
3780
|
-
});
|
|
3781
|
-
emitAddSignerEventSafely(options.onEvent, eventAccountId, {
|
|
3782
|
-
authMethod: "passkey",
|
|
3783
|
-
phase: RegistrationEventPhase.STEP_11_COMPLETED,
|
|
3784
|
-
status: "succeeded"
|
|
3785
|
-
});
|
|
3786
|
-
notifyAddSignerAfterCallSafely(options.afterCall, true, result);
|
|
3787
|
-
return result;
|
|
3788
|
-
} catch (error) {
|
|
3789
|
-
const errorCode = registrationErrorCodeFromUnknown(error);
|
|
3790
|
-
const errorMessage = getUserFriendlyErrorMessage(error, "registration", eventAccountId);
|
|
3791
|
-
notifyAddSignerErrorSafely(options.onError, registrationErrorWithCode(errorMessage, errorCode));
|
|
3792
|
-
emitAddSignerEventSafely(options.onEvent, eventAccountId, {
|
|
3793
|
-
authMethod: "passkey",
|
|
3794
|
-
phase: RegistrationEventPhase.FAILED,
|
|
3795
|
-
status: "failed",
|
|
3796
|
-
message: errorMessage,
|
|
3797
|
-
interaction: {
|
|
3798
|
-
kind: "passkey_assert",
|
|
3799
|
-
overlay: "hide"
|
|
3800
|
-
},
|
|
3801
|
-
error: {
|
|
3802
|
-
...errorCode ? { code: errorCode } : {},
|
|
3803
|
-
message: errorMessage
|
|
3804
|
-
}
|
|
3805
|
-
});
|
|
3806
|
-
const result = {
|
|
3807
|
-
success: false,
|
|
3808
|
-
error: errorMessage,
|
|
3809
|
-
...errorCode ? { errorCode } : {}
|
|
3810
|
-
};
|
|
3811
|
-
notifyAddSignerAfterCallSafely(options.afterCall, false);
|
|
3812
|
-
return result;
|
|
3813
|
-
}
|
|
3814
|
-
}
|
|
3815
|
-
//#endregion
|
|
3816
|
-
export { addWalletSigner, registerWallet, resumeNearRegistrationAfterUnlock };
|
|
3817
|
-
|
|
3818
|
-
//# sourceMappingURL=registration.js.map
|