@seams/wallet-server 0.7.3 → 0.8.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/THIRD_PARTY_NOTICES.md +1 -9
- package/artifact-manifest.json +78 -33
- package/cloudflare-router-ab/build/deriver-a/build-stamp.json +1 -1
- package/cloudflare-router-ab/build/deriver-a/index.js +2 -2
- package/cloudflare-router-ab/build/deriver-a/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/deriver-b/build-stamp.json +1 -1
- package/cloudflare-router-ab/build/deriver-b/index.js +2 -2
- package/cloudflare-router-ab/build/deriver-b/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/local-tools/darwin-arm64/router_ab_local_init +0 -0
- package/cloudflare-router-ab/build/local-tools/darwin-x64/router_ab_local_init +0 -0
- package/cloudflare-router-ab/build/local-tools/linux-x64/router_ab_local_init +0 -0
- package/cloudflare-router-ab/build/router/build-stamp.json +1 -1
- package/cloudflare-router-ab/build/router/index.js +2 -2
- package/cloudflare-router-ab/build/router/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/signing-worker/build-stamp.json +1 -1
- package/cloudflare-router-ab/build/signing-worker/index.js +2 -2
- package/cloudflare-router-ab/build/signing-worker/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/tenant-root-control-plane/build-stamp.json +1 -1
- package/cloudflare-router-ab/build/tenant-root-control-plane/index.js +2 -2
- package/cloudflare-router-ab/build/tenant-root-control-plane/index_bg.wasm +0 -0
- package/cloudflare-router-ab/scripts/prepare-local-runtime-config.mjs +0 -2
- package/cloudflare-router-ab/scripts/start-local-role-workers.mjs +77 -20
- package/dist/esm/authorization/lifecycleRouting.js +62 -0
- package/dist/esm/authorization/service.js +35 -12
- package/dist/esm/cloud-host.js +20 -22
- package/dist/esm/core/EmailOtpRecords.js +1 -217
- package/dist/esm/core/EmailOtpStores.js +0 -859
- package/dist/esm/core/IdentityStore.js +2 -339
- package/dist/esm/core/ThresholdService/config.js +1 -9
- package/dist/esm/core/ThresholdService/index.js +0 -4
- package/dist/esm/core/ThresholdService/kv.js +1 -66
- package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.js +1 -13
- package/dist/esm/core/ThresholdService/routerAbNormalSigningPolicy.js +1 -11
- package/dist/esm/core/ThresholdService/stores/WalletSessionStore.js +0 -541
- package/dist/esm/core/ThresholdService/validation.js +2 -346
- package/dist/esm/core/WalletAuthMethodStore.js +2 -123
- package/dist/esm/core/WalletStore.js +3 -209
- package/dist/esm/core/WebAuthnAuthenticatorStore.js +0 -202
- package/dist/esm/core/WebAuthnCredentialBindingStore.js +2 -182
- package/dist/esm/core/WebAuthnLoginChallengeStore.js +0 -52
- package/dist/esm/core/WebAuthnSyncChallengeStore.js +0 -54
- package/dist/esm/core/authService/emailOtpConfig.js +1 -195
- package/dist/esm/core/authService/emailOtpEnrollment.js +0 -110
- package/dist/esm/core/authService/emailOtpSeal.js +0 -63
- package/dist/esm/core/authService/nearTransactions.js +3 -98
- package/dist/esm/core/authService/rateLimits.js +0 -84
- package/dist/esm/core/authService/webauthn.js +2 -298
- package/dist/esm/core/authService/webauthnOidcHelpers.js +1 -24
- package/dist/esm/core/authService/webauthnWalletBinding.js +0 -37
- package/dist/esm/core/config.js +1 -95
- package/dist/esm/core/d1EcdsaSignerRead.js +1 -1
- package/dist/esm/core/d1IdentityStore.js +1 -2
- package/dist/esm/core/d1TenantStore.js +1 -24
- package/dist/esm/core/d1WalletAuthMethodStore.js +2 -5
- package/dist/esm/core/d1WalletStore.js +2 -2
- package/dist/esm/core/deviceLinking/linkedDeviceBootstrap.js +13 -0
- package/dist/esm/core/deviceLinking/linkedDeviceSession.js +20 -14
- package/dist/esm/core/deviceLinking/requestProof.js +9 -6
- package/dist/esm/core/emailOtpD1Statements.js +107 -94
- package/dist/esm/core/keyMaterialBrands.js +2 -12
- package/dist/esm/core/nearKeys.js +0 -1
- package/dist/esm/core/nearRelayerAccountProvisioning.js +6 -9
- package/dist/esm/core/passkeyCredentialClaims.js +8 -0
- package/dist/esm/core/routerAbSigning/RouterAbEcdsaPresignRuntime.js +2 -6
- package/dist/esm/core/routerAbSigning/RouterAbNormalSigningRuntime.js +2 -30
- package/dist/esm/core/thresholdEcdsaChainTarget.js +1 -4
- package/dist/esm/hosted-wallet-gateway.js +66 -43
- package/dist/esm/index.js +6 -19
- package/dist/esm/localHostedWalletGatewayHandler.js +12 -0
- package/dist/esm/localRegistrationSetupAuthority.js +89 -0
- package/dist/esm/router/auth/authRequestValidation.js +8 -16
- package/dist/esm/router/auth/webAuthnCredentialCodecs.js +0 -1
- package/dist/esm/router/cloudflare/d1/auth/d1AuthorizationAssembly.js +87 -0
- package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthConfig.js +12 -2
- package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthService.js +32 -281
- package/dist/esm/router/cloudflare/d1/authorization/authorizedOperationStatements.js +24 -22
- package/dist/esm/router/cloudflare/d1/authorization/d1AuthorizationStore.js +8 -6
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.js +12 -13
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEd25519ExportRootStore.js +6 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEmailOtpGrantStore.js +12 -2
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEmailOtpTargetFactor.js +4 -4
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceOwnerAuthorizationProvider.js +1 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRequestProofNonceStore.js +3 -9
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRouteService.js +2 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionStore.js +89 -7
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.js +23 -14
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoCapabilityPersistence.js +9 -6
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.js +0 -1
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeService.js +0 -1
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.js +1 -1
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.js +0 -1
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpEnrollmentStore.js +1 -1
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpGrantStore.js +1 -7
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.js +19 -13
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.js +0 -1
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecoveryService.js +0 -1
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRegistrationEnrollmentFinalizer.js +2 -2
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpServerSealRuntime.js +0 -1
- package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationAttemptStore.js +44 -12
- package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationRecords.js +1 -49
- package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpSessionResolver.js +19 -31
- package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleRegistrationCompletion.js +85 -0
- package/dist/esm/router/cloudflare/d1/identity/d1IdentityRecords.js +0 -1
- package/dist/esm/router/cloudflare/d1/identity/d1IdentityService.js +0 -48
- package/dist/esm/router/cloudflare/d1/near/d1SponsoredNearAccount.js +242 -0
- package/dist/esm/router/cloudflare/d1/oidc/d1OidcBoundary.js +0 -1
- package/dist/esm/router/cloudflare/d1/oidc/d1OidcVerificationService.js +2 -29
- package/dist/esm/router/cloudflare/d1/oidc/googleOidcToken.js +41 -0
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1PasskeyCustodyRouteService.js +5 -0
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.js +34 -0
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.js +9 -3
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.js +7 -13
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.js +25 -13
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationIntentService.js +0 -1
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationSetupSupport.js +74 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.js +7 -1
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationService.js +69 -238
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetup.js +12 -56
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.js +155 -0
- package/dist/esm/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.js +1 -3
- package/dist/esm/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.js +12 -6
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerFinalizeRecord.js +68 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerService.js +7 -54
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthMethodService.js +9 -8
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorityStore.js +2 -142
- package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnAuthService.js +25 -4
- package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnRecords.js +4 -70
- package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnStore.js +23 -7
- package/dist/esm/router/cloudflare/runtime/staticWalletConsoleBinding.js +1 -0
- package/dist/esm/router/cloudflare/runtime/walletConsoleOps.js +1 -0
- package/dist/esm/router/cloudflare/runtime/walletConsoleOpsClient.js +5 -0
- package/dist/esm/router/cloudflare/runtime/walletGateway.js +1 -1
- package/dist/esm/router/cloudflare/runtime/walletRuntimeOps.js +16 -4
- package/dist/esm/router/cloudflare-adaptor.js +1 -2
- package/dist/esm/router/cloudflare.js +1342 -1733
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.js +11 -8
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.js +3 -2
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitioning.js +6 -6
- package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.js +6 -6
- package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExportRequestScopedCloudflare.js +3 -0
- package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryRequestScopedCloudflare.js +8 -0
- package/dist/esm/router/domains/emailOtp/emailOtpRequestValidation.js +0 -1
- package/dist/esm/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrieval.js +2 -8
- package/dist/esm/router/domains/passkeyCustody/walletCustodyRegistrationCommit.js +2 -8
- package/dist/esm/router/domains/signingOperations/routerAbPrivateSigningWorker.js +5 -19
- package/dist/esm/router/domains/signingOperations/walletExecutionAdmission.js +2 -3
- package/dist/esm/router/domains/walletRegistration/walletRegistrationReservation.js +70 -0
- package/dist/esm/router/domains/walletRegistration/walletRegistrationRoutes.js +10 -11
- package/dist/esm/router/domains/walletRegistration/walletRegistrationSetupPayload.js +2 -3
- package/dist/esm/router/domains/walletUnlock/walletUnlockRouteHandlers.js +14 -0
- package/dist/esm/router/express.js +574 -479
- package/dist/esm/router/framework/http.js +2 -0
- package/dist/esm/router/framework/registrationSetupDispatch.js +14 -0
- package/dist/esm/router/framework/ror/normalize.js +0 -1
- package/dist/esm/router/framework/ror/options.js +0 -1
- package/dist/esm/router/framework/ror/provider.js +0 -1
- package/dist/esm/router/framework/ror/staticProvider.js +0 -1
- package/dist/esm/router/framework/routeDefinitions.js +1 -2
- package/dist/esm/router/framework/routerApiWebhooks.js +0 -1
- package/dist/esm/router/ror.js +0 -1
- package/dist/esm/router/transport/fetch/createFetchRouter.js +0 -2
- package/dist/esm/router/transport/fetch/routes/auth.js +2 -0
- package/dist/esm/router/transport/fetch/routes/deviceLinking.js +36 -147
- package/dist/esm/router/transport/fetch/routes/deviceLinkingOwnerAuthorization.js +3 -2
- package/dist/esm/router/transport/fetch/routes/deviceLinkingResponses.js +130 -0
- package/dist/esm/router/transport/fetch/routes/ecdsaOperationStepUpFactor.js +171 -0
- package/dist/esm/router/transport/fetch/routes/passkeyCustody.js +1 -0
- package/dist/esm/router/transport/fetch/routes/syncAccount.js +7 -2
- package/dist/esm/router/transport/fetch/routes/thresholdEcdsa.js +19 -115
- package/dist/esm/router/transport/fetch/routes/walletRegistration.js +3 -1
- package/dist/esm/shared-ts/src/authorization/walletSessionIssuance.js +0 -1
- package/dist/esm/shared-ts/src/device-linking/authorityActivation.js +0 -2
- package/dist/esm/shared-ts/src/device-linking/contracts.js +16 -1
- package/dist/esm/shared-ts/src/device-linking/digests.js +1 -8
- package/dist/esm/shared-ts/src/near/actions.js +0 -1
- package/dist/esm/shared-ts/src/near/nearClient.js +0 -2
- package/dist/esm/shared-ts/src/signing-lanes/evmFamilySigningKeySlotId.js +1 -1
- package/dist/esm/shared-ts/src/signing-lanes/index.js +1 -6
- package/dist/esm/shared-ts/src/signing-lanes/ownerContinuity.js +1 -1
- package/dist/esm/shared-ts/src/signing-lanes/participantDigest.js +2 -81
- package/dist/esm/shared-ts/src/signing-lanes/participants.js +1 -219
- package/dist/esm/shared-ts/src/signing-lanes/recordParsers.js +0 -3
- package/dist/esm/shared-ts/src/tenant-root/tenantRootOperationRecord.js +1 -2
- package/dist/esm/shared-ts/src/threshold/ecdsaDerivationRoleLocalBootstrap.js +0 -1
- package/dist/esm/shared-ts/src/threshold/keyMaterialBrands.js +1 -22
- package/dist/esm/shared-ts/src/threshold/participants.js +0 -1
- package/dist/esm/shared-ts/src/threshold/signingRootScope.js +0 -1
- package/dist/esm/shared-ts/src/utils/addWalletAuthMethod.js +4 -13
- package/dist/esm/shared-ts/src/utils/canonicalPrimitives.js +1 -7
- package/dist/esm/shared-ts/src/utils/domainIds.js +1 -16
- package/dist/esm/shared-ts/src/utils/ecdsaCapabilityActivation.js +1 -11
- package/dist/esm/shared-ts/src/utils/ecdsaKeyFactsInventory.js +0 -1
- package/dist/esm/shared-ts/src/utils/errors.js +1 -19
- package/dist/esm/shared-ts/src/utils/near.js +1 -1
- package/dist/esm/shared-ts/src/utils/registrationEstablishedSession.js +1 -1
- package/dist/esm/shared-ts/src/utils/registrationIds.js +1 -5
- package/dist/esm/shared-ts/src/utils/registrationIntent.js +0 -1
- package/dist/esm/shared-ts/src/utils/registrationSetupOperation.js +8 -0
- package/dist/esm/shared-ts/src/utils/registrationSignerPlan.js +1 -1
- package/dist/esm/shared-ts/src/utils/routerAbEcdsaDerivation.js +0 -1
- package/dist/esm/shared-ts/src/utils/validation.js +1 -5
- package/dist/esm/shared-ts/src/utils/walletAuthAuthority.js +0 -1
- package/dist/esm/shared-ts/src/utils/walletManagementProtocol.js +6 -0
- package/dist/esm/shared-ts/src/utils/wireSchema.js +2 -13
- package/dist/esm/shared-ts/src/wallet-recovery/backupAcknowledgement.js +6 -24
- package/dist/esm/shared-ts/src/wallet-recovery/recoveryCodeLocator.js +0 -1
- package/dist/esm/shared-ts/src/wallet-recovery/recoveryKeyId.js +5 -6
- package/dist/esm/storage/d1Sql.js +1 -7
- package/dist/esm/threshold/session/signingSessionSeal/crypto/cipher.js +0 -1
- package/dist/esm/threshold/session/signingSessionSeal/guards/backends.js +1 -2
- package/dist/esm/threshold/session/signingSessionSeal/idempotencyBackends.js +0 -1
- package/dist/esm/threshold/session/signingSessionSeal/idempotencyRecords.js +0 -1
- package/dist/esm/threshold/session/signingSessionSeal/options.js +0 -1
- package/dist/esm/wasm/evm_crypto/pkg/evm_crypto_bg.wasm +0 -0
- package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker.js +0 -611
- package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker_bg.wasm +0 -0
- package/dist/esm/wasm/shamir3pass_runtime/pkg/shamir3pass_runtime_bg.wasm +0 -0
- package/dist/types/shared-ts/src/authorization/capabilityKinds.d.ts +0 -4
- package/dist/types/shared-ts/src/device-linking/contracts.d.ts +1 -0
- package/dist/types/shared-ts/src/signing-lanes/evmFamilySigningKeySlotId.d.ts +0 -2
- package/dist/types/shared-ts/src/signing-lanes/execution.d.ts +0 -11
- package/dist/types/shared-ts/src/signing-lanes/ids.d.ts +2 -7
- package/dist/types/shared-ts/src/signing-lanes/index.d.ts +0 -4
- package/dist/types/shared-ts/src/signing-lanes/ownerContinuity.d.ts +0 -1
- package/dist/types/shared-ts/src/signing-lanes/participantDigest.d.ts +0 -18
- package/dist/types/shared-ts/src/signing-lanes/participants.d.ts +6 -35
- package/dist/types/shared-ts/src/signing-lanes/rotation.d.ts +6 -843
- package/dist/types/shared-ts/src/threshold/keyMaterialBrands.d.ts +0 -10
- package/dist/types/shared-ts/src/threshold/participants.d.ts +1 -1
- package/dist/types/shared-ts/src/utils/addWalletAuthMethod.d.ts +1 -133
- package/dist/types/shared-ts/src/utils/addWalletAuthMethod.typecheck.d.ts +4 -18
- package/dist/types/shared-ts/src/utils/domainIds.d.ts +0 -12
- package/dist/types/shared-ts/src/utils/errors.d.ts +0 -4
- package/dist/types/shared-ts/src/utils/near.d.ts +0 -20
- package/dist/types/shared-ts/src/utils/normalize.d.ts +0 -2
- package/dist/types/shared-ts/src/utils/registrationSetupOperation.d.ts +3 -0
- package/dist/types/shared-ts/src/utils/validation.d.ts +1 -3
- package/dist/types/shared-ts/src/utils/walletCapabilityBindings.d.ts +0 -1
- package/dist/types/shared-ts/src/utils/walletManagementProtocol.d.ts +3 -0
- package/dist/types/shared-ts/src/utils/wireSchema.d.ts +0 -2
- package/dist/types/shared-ts/src/wallet-recovery/backupAcknowledgement.d.ts +0 -1
- package/dist/types/shared-ts/src/wallet-recovery/recoveryCodeReservation.d.ts +1 -10
- package/dist/types/shared-ts/src/wallet-recovery/recoveryCodes.d.ts +1 -3
- package/dist/types/shared-ts/src/wallet-recovery/recoveryKeyId.d.ts +5 -21
- package/dist/types/wallet-server/src/authorization/lifecycleRouting.d.ts +32 -0
- package/dist/types/wallet-server/src/authorization/lifecycleRouting.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/authorization/recoveryRouting.d.ts +22 -0
- package/dist/types/wallet-server/src/authorization/recoveryRouting.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/authorization/service.d.ts +8 -1
- package/dist/types/wallet-server/src/authorization/sessionRouting.d.ts +20 -0
- package/dist/types/wallet-server/src/authorization/sessionRouting.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/cloud-host.d.ts +31 -9
- package/dist/types/wallet-server/src/core/EmailOtpRecords.d.ts +1 -22
- package/dist/types/wallet-server/src/core/EmailOtpStores.d.ts +1 -79
- package/dist/types/wallet-server/src/core/IdentityStore.d.ts +0 -10
- package/dist/types/wallet-server/src/core/RegistrationCeremonyStore.d.ts +0 -1
- package/dist/types/wallet-server/src/core/ThresholdService/config.d.ts +0 -2
- package/dist/types/wallet-server/src/core/ThresholdService/index.d.ts +1 -3
- package/dist/types/wallet-server/src/core/ThresholdService/kv.d.ts +0 -7
- package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.d.ts +0 -3
- package/dist/types/wallet-server/src/core/ThresholdService/routerAbNormalSigningPolicy.d.ts +0 -1
- package/dist/types/wallet-server/src/core/ThresholdService/stores/WalletSessionStore.d.ts +7 -19
- package/dist/types/wallet-server/src/core/ThresholdService/validation.d.ts +0 -34
- package/dist/types/wallet-server/src/core/WalletAuthMethodStore.d.ts +1 -5
- package/dist/types/wallet-server/src/core/WalletStore.d.ts +0 -3
- package/dist/types/wallet-server/src/core/WebAuthnAuthenticatorStore.d.ts +0 -20
- package/dist/types/wallet-server/src/core/WebAuthnCredentialBindingStore.d.ts +1 -27
- package/dist/types/wallet-server/src/core/WebAuthnLoginChallengeStore.d.ts +2 -16
- package/dist/types/wallet-server/src/core/WebAuthnSyncChallengeStore.d.ts +22 -14
- package/dist/types/wallet-server/src/core/authService/emailOtpConfig.d.ts +0 -24
- package/dist/types/wallet-server/src/core/authService/emailOtpEnrollment.d.ts +1 -70
- package/dist/types/wallet-server/src/core/authService/emailOtpSeal.d.ts +0 -13
- package/dist/types/wallet-server/src/core/authService/githubOAuth.d.ts +2 -1
- package/dist/types/wallet-server/src/core/authService/nearTransactions.d.ts +1 -39
- package/dist/types/wallet-server/src/core/authService/rateLimits.d.ts +0 -17
- package/dist/types/wallet-server/src/core/authService/webauthn.d.ts +0 -125
- package/dist/types/wallet-server/src/core/authService/webauthnOidcHelpers.d.ts +0 -3
- package/dist/types/wallet-server/src/core/authService/webauthnVerificationOutcomes.d.ts +1 -1
- package/dist/types/wallet-server/src/core/authService/webauthnWalletBinding.d.ts +0 -12
- package/dist/types/wallet-server/src/core/config.d.ts +0 -10
- package/dist/types/wallet-server/src/core/d1IdentityStore.d.ts +0 -2
- package/dist/types/wallet-server/src/core/d1TenantStore.d.ts +0 -7
- package/dist/types/wallet-server/src/core/d1WalletAuthMethodStore.d.ts +0 -1
- package/dist/types/wallet-server/src/core/deviceLinking/linkedDeviceBootstrap.d.ts +19 -0
- package/dist/types/wallet-server/src/core/deviceLinking/linkedDeviceSession.d.ts +8 -6
- package/dist/types/wallet-server/src/core/deviceLinking/requestProof.d.ts +2 -5
- package/dist/types/wallet-server/src/core/emailOtpD1Statements.d.ts +10 -7
- package/dist/types/wallet-server/src/core/keyMaterialBrands.d.ts +1 -5
- package/dist/types/wallet-server/src/core/nearRelayerAccountProvisioning.d.ts +0 -1
- package/dist/types/wallet-server/src/core/passkeyCredentialClaims.d.ts +9 -0
- package/dist/types/wallet-server/src/core/routerAbSigning/RouterAbEcdsaPresignRuntime.d.ts +0 -2
- package/dist/types/wallet-server/src/core/routerAbSigning/RouterAbNormalSigningRuntime.d.ts +0 -2
- package/dist/types/wallet-server/src/core/threeRouteRegistrationContracts.d.ts +1 -92
- package/dist/types/wallet-server/src/core/threeRouteRegistrationContracts.typecheck.d.ts +4 -52
- package/dist/types/wallet-server/src/core/thresholdEcdsaChainTarget.d.ts +0 -1
- package/dist/types/wallet-server/src/core/types.d.ts +0 -299
- package/dist/types/wallet-server/src/hosted-wallet-gateway.d.ts +15 -3
- package/dist/types/wallet-server/src/index.d.ts +8 -13
- package/dist/types/wallet-server/src/localRegistrationSetupAuthority.d.ts +13 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1AuthorizationAssembly.d.ts +23 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthConfig.d.ts +25 -3
- package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/d1AuthorizationStore.d.ts +1 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.d.ts +3 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEmailOtpGrantStore.d.ts +7 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRequestProofNonceStore.d.ts +1 -10
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRouteService.d.ts +4 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionStore.d.ts +6 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetPlanner.d.ts +1 -13
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeService.d.ts +2 -2
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.d.ts +1 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpGrantStore.d.ts +0 -2
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.d.ts +18 -2
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationAttemptStore.d.ts +29 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationRecords.d.ts +3 -16
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpSessionResolver.d.ts +7 -2
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1GoogleRegistrationCompletion.d.ts +23 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/identity/d1IdentityService.d.ts +0 -12
- package/dist/types/wallet-server/src/router/cloudflare/d1/near/d1SponsoredNearAccount.d.ts +24 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/near/d1SponsoredNearAccount.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/oidc/d1OidcVerificationService.d.ts +0 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/oidc/googleOidcToken.d.ts +4 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1PasskeyCustodyRouteService.d.ts +5 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.d.ts +9 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.d.ts +1 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.d.ts +10 -11
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.d.ts +3 -2
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationSetupSupport.d.ts +51 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.d.ts +3 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationService.d.ts +30 -47
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationSetup.d.ts +3 -30
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.d.ts +11 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAddSignerFinalizeRecord.d.ts +27 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAddSignerService.d.ts +1 -10
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthMethodService.d.ts +2 -2
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorityStore.d.ts +0 -4
- package/dist/types/wallet-server/src/router/cloudflare/d1/webauthn/d1WebAuthnAuthService.d.ts +3 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/webauthn/d1WebAuthnRecords.d.ts +0 -13
- package/dist/types/wallet-server/src/router/cloudflare/d1/webauthn/d1WebAuthnStore.d.ts +23 -10
- package/dist/types/wallet-server/src/router/cloudflare/d1/webauthn/d1WebAuthnStore.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/cloudflare.types.d.ts +0 -2
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOps.d.ts +1 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOpsClient.d.ts +2 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletGateway.d.ts +1 -1
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRuntimeOps.d.ts +3 -0
- package/dist/types/wallet-server/src/router/cloudflare-adaptor.d.ts +0 -1
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.d.ts +1 -1
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitioning.d.ts +2 -2
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.d.ts +2 -2
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/export/routerAbEd25519YaoExportRequestScopedCloudflare.d.ts +2 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryRequestScopedCloudflare.d.ts +2 -0
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrieval.d.ts +0 -2
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationCommit.d.ts +0 -3
- package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbPrivateSigningWorker.d.ts +0 -17
- package/dist/types/wallet-server/src/router/domains/signingOperations/walletExecutionAdmission.d.ts +1 -2
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationInputs.d.ts +1 -0
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationReservation.d.ts +51 -0
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationRoutes.d.ts +2 -10
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationSetupPayload.d.ts +2 -2
- package/dist/types/wallet-server/src/router/framework/authServicePort.d.ts +14 -34
- package/dist/types/wallet-server/src/router/framework/googleLoginResolution.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/router/framework/registrationSetupDispatch.d.ts +13 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/deviceLinking.d.ts +1 -1
- package/dist/types/wallet-server/src/router/transport/fetch/routes/deviceLinkingResponses.d.ts +17 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/ecdsaOperationStepUpFactor.d.ts +37 -0
- package/dist/types/wallet-server/src/storage/d1Sql.d.ts +0 -1
- package/migrations/d1-signer/0040_namespace_home_challenges.sql +16 -0
- package/migrations/d1-signer/0041_step_up_admission_expiry.sql +28 -0
- package/migrations/d1-signer/0042_deployment_resource_challenges.sql +4 -0
- package/migrations/d1-signer/0043_google_registration_candidate_claim.sql +2 -0
- package/migrations/d1-signer/0044_linked_device_bootstrap_imports.sql +6 -0
- package/migrations/d1-signer/0045_wallet_owned_capability_receipts.sql +29 -0
- package/migrations/d1-signer/0046_wallet_owned_signing_abuse.sql +41 -0
- package/migrations/d1-signer/0047_remove_unused_near_public_keys.sql +2 -0
- package/migrations/d1-signer/0048_operation_owner_scope.sql +45 -0
- package/package.json +2 -3
- package/src/README.md +11 -3
- package/dist/esm/core/AuthService.js +0 -2
- package/dist/esm/core/NearPublicKeyStore.js +0 -200
- package/dist/esm/core/ThresholdService/stores/CloudflareDurableObjectStore.js +0 -397
- package/dist/esm/core/ThresholdService/stores/KeyStore.js +0 -140
- package/dist/esm/core/ThresholdService/stores/SessionStore.js +0 -361
- package/dist/esm/core/ThresholdService/stores/StoreConfig.js +0 -13
- package/dist/esm/core/ThresholdService/stores/exportReplayGuard.js +0 -7
- package/dist/esm/core/authService/AuthService.js +0 -594
- package/dist/esm/core/authService/bytes.js +0 -19
- package/dist/esm/core/authService/configValues.js +0 -15
- package/dist/esm/core/authService/emailOtpChallengeOperations.js +0 -123
- package/dist/esm/core/authService/emailOtpChallengeProof.js +0 -183
- package/dist/esm/core/authService/emailOtpChallengeVerification.js +0 -264
- package/dist/esm/core/authService/emailOtpChallenges.js +0 -225
- package/dist/esm/core/authService/emailOtpDelivery.js +0 -134
- package/dist/esm/core/authService/emailOtpGrant.js +0 -43
- package/dist/esm/core/authService/emailOtpRegistrationEnrollment.js +0 -144
- package/dist/esm/core/authService/emailOtpUnlock.js +0 -174
- package/dist/esm/core/authService/googleEmailOtpOperations.js +0 -141
- package/dist/esm/core/authService/googleEmailOtpRegistration.js +0 -587
- package/dist/esm/core/authService/identity.js +0 -42
- package/dist/esm/core/authService/identityOperations.js +0 -32
- package/dist/esm/core/authService/nearAccountOperations.js +0 -229
- package/dist/esm/core/authService/nearPublicKeyMetadata.js +0 -108
- package/dist/esm/core/authService/oidcVerification.js +0 -249
- package/dist/esm/core/authService/registrationThresholdHelpers.js +0 -30
- package/dist/esm/core/authService/runtime.js +0 -45
- package/dist/esm/core/authService/storeRegistry.js +0 -102
- package/dist/esm/core/authService/thresholdStoreSummary.js +0 -32
- package/dist/esm/core/authService/webauthnAuthority.js +0 -17
- package/dist/esm/core/defaultConfigsServer.js +0 -9
- package/dist/esm/core/hostedAccountIds.js +0 -225
- package/dist/esm/core/routerAbSigning/createRouterAbSigningRuntimes.js +0 -84
- package/dist/esm/core/signingLanes/LaneAggregateRevocationApplicationService.js +0 -86
- package/dist/esm/core/signingLanes/LaneEnrollmentActivation.js +0 -324
- package/dist/esm/core/signingLanes/LaneEnrollmentRevocation.js +0 -173
- package/dist/esm/core/signingLanes/LaneLifecycleApplicationService.js +0 -198
- package/dist/esm/core/signingLanes/ecdsaServerRetirement.js +0 -73
- package/dist/esm/core/signingLanes/ed25519ServerRetirement.js +0 -68
- package/dist/esm/core/signingLanes/signingWorkerLaneMaterialIdentity.js +0 -0
- package/dist/esm/core/storeBackends.js +0 -208
- package/dist/esm/core/utils.js +0 -14
- package/dist/esm/core/webAuthnStoreBackends.js +0 -198
- package/dist/esm/router/cloudflare/d1/near/d1NearPublicKeyStore.js +0 -49
- package/dist/esm/router/cloudflare/d1/signingLanes/d1EcdsaLanePrivateBindingResolver.js +0 -10
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneAggregateRevocationApplicationService.js +0 -22
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneEffectJournalStore.js +0 -166
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneEnrollmentGateway.js +0 -38
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneLifecycleApplicationService.js +0 -20
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneLifecycleStore.js +0 -1459
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneLockStore.js +0 -114
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneProtocolCommitter.js +0 -16
- package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneRecords.js +0 -171
- package/dist/esm/router/cloudflare/d1/signingLanes/index.js +0 -10
- package/dist/esm/router/cloudflare/durableObjects/thresholdStore.js +0 -397
- package/dist/esm/router/cloudflare/signingLanes/cloudflareLaneCurveExecution.js +0 -597
- package/dist/esm/router/cloudflare/signingLanes/cloudflareLaneProtocolCommitter.js +0 -273
- package/dist/esm/router/cloudflare/signingLanes/index.js +0 -4
- package/dist/esm/router/cloudflare/signingLanes/linkedDeviceEd25519CeremonyBinding.js +0 -32
- package/dist/esm/router/transport/fetch/routes/nearPublicKeys.js +0 -27
- package/dist/esm/shared-ts/src/signing-lanes/rotation.js +0 -8
- package/dist/esm/shared-ts/src/signing-lanes/rotationDigests.js +0 -358
- package/dist/esm/shared-ts/src/signing-lanes/rotationLifecycle.js +0 -313
- package/dist/esm/shared-ts/src/signing-lanes/rotationParsers.js +0 -532
- package/dist/esm/shared-ts/src/signing-lanes/rotationProtocolParsers.js +0 -323
- package/dist/esm/shared-ts/src/signing-lanes/rotationWireFields.js +0 -59
- package/dist/types/shared-ts/src/signing-lanes/participantDigest.typecheck.d.ts +0 -2
- package/dist/types/shared-ts/src/signing-lanes/rotation.typecheck.d.ts +0 -2
- package/dist/types/shared-ts/src/signing-lanes/rotationDigests.d.ts +0 -13
- package/dist/types/shared-ts/src/signing-lanes/rotationLifecycle.d.ts +0 -78
- package/dist/types/shared-ts/src/signing-lanes/rotationParsers.d.ts +0 -27
- package/dist/types/shared-ts/src/signing-lanes/rotationProtocolParsers.d.ts +0 -6
- package/dist/types/shared-ts/src/signing-lanes/rotationWireFields.d.ts +0 -20
- package/dist/types/shared-ts/src/wallet-recovery/recoveryCodeAttempt.d.ts +0 -59
- package/dist/types/wallet-server/src/core/AuthService.d.ts +0 -3
- package/dist/types/wallet-server/src/core/NearPublicKeyStore.d.ts +0 -48
- package/dist/types/wallet-server/src/core/ThresholdService/stores/CloudflareDurableObjectStore.d.ts +0 -21
- package/dist/types/wallet-server/src/core/ThresholdService/stores/KeyStore.d.ts +0 -40
- package/dist/types/wallet-server/src/core/ThresholdService/stores/SessionStore.d.ts +0 -98
- package/dist/types/wallet-server/src/core/ThresholdService/stores/StoreConfig.d.ts +0 -4
- package/dist/types/wallet-server/src/core/ThresholdService/stores/ThresholdStoreConfig.typecheck.d.ts +0 -2
- package/dist/types/wallet-server/src/core/ThresholdService/stores/exportReplayGuard.d.ts +0 -3
- package/dist/types/wallet-server/src/core/authService/AuthService.d.ts +0 -490
- package/dist/types/wallet-server/src/core/authService/bytes.d.ts +0 -3
- package/dist/types/wallet-server/src/core/authService/configValues.d.ts +0 -7
- package/dist/types/wallet-server/src/core/authService/emailOtpChallengeOperations.d.ts +0 -109
- package/dist/types/wallet-server/src/core/authService/emailOtpChallengeProof.d.ts +0 -169
- package/dist/types/wallet-server/src/core/authService/emailOtpChallengeVerification.d.ts +0 -47
- package/dist/types/wallet-server/src/core/authService/emailOtpChallenges.d.ts +0 -86
- package/dist/types/wallet-server/src/core/authService/emailOtpDelivery.d.ts +0 -66
- package/dist/types/wallet-server/src/core/authService/emailOtpGrant.d.ts +0 -43
- package/dist/types/wallet-server/src/core/authService/emailOtpRegistrationEnrollment.d.ts +0 -49
- package/dist/types/wallet-server/src/core/authService/emailOtpUnlock.d.ts +0 -64
- package/dist/types/wallet-server/src/core/authService/googleEmailOtpOperations.d.ts +0 -126
- package/dist/types/wallet-server/src/core/authService/googleEmailOtpRegistration.d.ts +0 -169
- package/dist/types/wallet-server/src/core/authService/identity.d.ts +0 -25
- package/dist/types/wallet-server/src/core/authService/identityOperations.d.ts +0 -19
- package/dist/types/wallet-server/src/core/authService/nearAccountOperations.d.ts +0 -55
- package/dist/types/wallet-server/src/core/authService/nearPublicKeyMetadata.d.ts +0 -44
- package/dist/types/wallet-server/src/core/authService/oidcVerification.d.ts +0 -66
- package/dist/types/wallet-server/src/core/authService/registrationThresholdHelpers.d.ts +0 -11
- package/dist/types/wallet-server/src/core/authService/runtime.d.ts +0 -20
- package/dist/types/wallet-server/src/core/authService/storeRegistry.d.ts +0 -53
- package/dist/types/wallet-server/src/core/authService/thresholdStoreSummary.d.ts +0 -3
- package/dist/types/wallet-server/src/core/authService/webauthnAuthority.d.ts +0 -5
- package/dist/types/wallet-server/src/core/defaultConfigsServer.d.ts +0 -5
- package/dist/types/wallet-server/src/core/hostedAccountIds.d.ts +0 -16
- package/dist/types/wallet-server/src/core/routerAbSigning/createRouterAbSigningRuntimes.d.ts +0 -16
- package/dist/types/wallet-server/src/core/signingLanes/LaneAggregateRevocationApplicationService.d.ts +0 -36
- package/dist/types/wallet-server/src/core/signingLanes/LaneEffectJournalStore.d.ts +0 -62
- package/dist/types/wallet-server/src/core/signingLanes/LaneEnrollmentActivation.d.ts +0 -13
- package/dist/types/wallet-server/src/core/signingLanes/LaneEnrollmentRevocation.d.ts +0 -24
- package/dist/types/wallet-server/src/core/signingLanes/LaneLifecycleApplicationService.d.ts +0 -141
- package/dist/types/wallet-server/src/core/signingLanes/LaneLifecycleStore.d.ts +0 -228
- package/dist/types/wallet-server/src/core/signingLanes/ecdsaServerRetirement.d.ts +0 -58
- package/dist/types/wallet-server/src/core/signingLanes/ed25519ServerRetirement.d.ts +0 -30
- package/dist/types/wallet-server/src/core/signingLanes/signingWorkerLaneMaterialIdentity.d.ts +0 -4
- package/dist/types/wallet-server/src/core/storeBackends.d.ts +0 -83
- package/dist/types/wallet-server/src/core/utils.d.ts +0 -3
- package/dist/types/wallet-server/src/core/webAuthnStoreBackends.d.ts +0 -96
- package/dist/types/wallet-server/src/router/cloudflare/d1/near/d1NearPublicKeyStore.d.ts +0 -29
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1EcdsaLanePrivateBindingResolver.d.ts +0 -4
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneAggregateRevocationApplicationService.d.ts +0 -4
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneEffectJournalStore.d.ts +0 -24
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneEnrollmentGateway.d.ts +0 -20
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneLifecycleApplicationService.d.ts +0 -13
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneLifecycleStore.d.ts +0 -51
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneLockStore.d.ts +0 -28
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneProtocolCommitter.d.ts +0 -5
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneRecords.d.ts +0 -107
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/index.d.ts +0 -10
- package/dist/types/wallet-server/src/router/cloudflare/durableObjects/thresholdStore.d.ts +0 -18
- package/dist/types/wallet-server/src/router/cloudflare/signingLanes/cloudflareLaneCurveExecution.d.ts +0 -217
- package/dist/types/wallet-server/src/router/cloudflare/signingLanes/cloudflareLaneProtocolCommitter.d.ts +0 -73
- package/dist/types/wallet-server/src/router/cloudflare/signingLanes/index.d.ts +0 -4
- package/dist/types/wallet-server/src/router/cloudflare/signingLanes/linkedDeviceEd25519CeremonyBinding.d.ts +0 -6
- package/dist/types/wallet-server/src/router/transport/fetch/routes/nearPublicKeys.d.ts +0 -3
- /package/dist/esm/{core/signingLanes/LaneEffectJournalStore.js → authorization/recoveryRouting.js} +0 -0
- /package/dist/esm/{core/signingLanes/LaneLifecycleStore.js → authorization/sessionRouting.js} +0 -0
|
@@ -90,6 +90,21 @@ function buildCorsOrigins(...inputs) {
|
|
|
90
90
|
}
|
|
91
91
|
//#endregion
|
|
92
92
|
//#region ../shared-ts/src/device-linking/contracts.ts
|
|
93
|
+
function isLinkSessionTerminalFailureV1(state) {
|
|
94
|
+
switch (state.state) {
|
|
95
|
+
case "failed_before_commit":
|
|
96
|
+
case "cancelled":
|
|
97
|
+
case "expired": return true;
|
|
98
|
+
case "displaying_qr":
|
|
99
|
+
case "claimed":
|
|
100
|
+
case "awaiting_target_factor":
|
|
101
|
+
case "awaiting_source_contribution":
|
|
102
|
+
case "provisioning":
|
|
103
|
+
case "authority_pending_local_install":
|
|
104
|
+
case "active": return false;
|
|
105
|
+
default: return assertNeverLinkSessionStateV1(state);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
93
108
|
function assertNeverLinkSessionStateV1(value) {
|
|
94
109
|
throw new Error(`[LinkSessionStateV1] unsupported state: ${String(value)}`);
|
|
95
110
|
}
|
|
@@ -398,112 +413,6 @@ function toRorOriginOrNull(value) {
|
|
|
398
413
|
}
|
|
399
414
|
}
|
|
400
415
|
//#endregion
|
|
401
|
-
//#region ../shared-ts/src/utils/base58.ts
|
|
402
|
-
/**
|
|
403
|
-
* Encodes binary data to base58 string using Bitcoin's base58 alphabet.
|
|
404
|
-
*
|
|
405
|
-
* @param data - Binary data to encode (Uint8Array, ArrayBuffer, or number[])
|
|
406
|
-
* @returns Base58-encoded string
|
|
407
|
-
*/
|
|
408
|
-
const base58Encode = (data) => {
|
|
409
|
-
if (data instanceof ArrayBuffer) return bs58.encode(new Uint8Array(data));
|
|
410
|
-
if (Array.isArray(data)) return bs58.encode(new Uint8Array(data));
|
|
411
|
-
return bs58.encode(data);
|
|
412
|
-
};
|
|
413
|
-
/**
|
|
414
|
-
* Decodes a base58 string to binary data using Bitcoin's base58 alphabet.
|
|
415
|
-
* Returns a Uint8Array containing the decoded bytes.
|
|
416
|
-
*
|
|
417
|
-
* @param base58String - Base58-encoded string to decode
|
|
418
|
-
* @returns Uint8Array containing the decoded bytes
|
|
419
|
-
* @throws Error if input contains invalid base58 characters
|
|
420
|
-
*/
|
|
421
|
-
const base58Decode = (base58String) => {
|
|
422
|
-
return bs58.decode(base58String);
|
|
423
|
-
};
|
|
424
|
-
//#endregion
|
|
425
|
-
//#region ../shared-ts/src/utils/near.ts
|
|
426
|
-
/**
|
|
427
|
-
* NEAR-specific utility helpers.
|
|
428
|
-
*
|
|
429
|
-
* Keep chain-specific parsing and validation logic here so generic utility
|
|
430
|
-
* modules (`validation`, `errors`, `encoders`, etc.) stay chain-agnostic.
|
|
431
|
-
*/
|
|
432
|
-
/**
|
|
433
|
-
* Ensure a key string has the NEAR Ed25519 prefix (`ed25519:`).
|
|
434
|
-
*
|
|
435
|
-
* - Accepts either `ed25519:<base58>` or a bare `<base58>` string.
|
|
436
|
-
* - Canonicalizes `ED25519:` -> `ed25519:`.
|
|
437
|
-
* - If a different prefix is present (e.g. `secp256k1:`), returns the input unchanged.
|
|
438
|
-
*/
|
|
439
|
-
function ensureEd25519Prefix(value) {
|
|
440
|
-
const raw = String(value ?? "").trim();
|
|
441
|
-
if (!raw) return "";
|
|
442
|
-
if (/^[a-z0-9_]+:/i.test(raw)) {
|
|
443
|
-
if (/^ed25519:/i.test(raw)) return `ed25519:${raw.replace(/^ed25519:/i, "")}`;
|
|
444
|
-
return raw;
|
|
445
|
-
}
|
|
446
|
-
return `ed25519:${raw}`;
|
|
447
|
-
}
|
|
448
|
-
/**
|
|
449
|
-
* Lightweight NEAR account ID validation used by server-side helpers.
|
|
450
|
-
* - length: 2..64
|
|
451
|
-
* - chars: lowercase letters, digits, `_`, `.`, `-`
|
|
452
|
-
*/
|
|
453
|
-
function isValidAccountId(accountId) {
|
|
454
|
-
if (typeof accountId !== "string") return false;
|
|
455
|
-
if (!accountId || accountId.length < 2 || accountId.length > 64) return false;
|
|
456
|
-
return /^[a-z0-9_.-]+$/.test(accountId);
|
|
457
|
-
}
|
|
458
|
-
function isImplicitNearAccountId(value) {
|
|
459
|
-
return typeof value === "string" && /^[0-9a-f]{64}$/.test(value);
|
|
460
|
-
}
|
|
461
|
-
function parseImplicitNearAccountId(raw) {
|
|
462
|
-
const value = typeof raw === "string" ? raw.trim() : "";
|
|
463
|
-
if (!value) return {
|
|
464
|
-
ok: false,
|
|
465
|
-
code: "missing",
|
|
466
|
-
message: "implicit NEAR account ID is required"
|
|
467
|
-
};
|
|
468
|
-
if (!isImplicitNearAccountId(value)) return {
|
|
469
|
-
ok: false,
|
|
470
|
-
code: "invalid",
|
|
471
|
-
message: "implicit NEAR account ID must be 64 lowercase hex characters"
|
|
472
|
-
};
|
|
473
|
-
return {
|
|
474
|
-
ok: true,
|
|
475
|
-
value
|
|
476
|
-
};
|
|
477
|
-
}
|
|
478
|
-
function parseNamedNearAccountId(raw) {
|
|
479
|
-
const value = typeof raw === "string" ? raw.trim() : "";
|
|
480
|
-
if (!value) return {
|
|
481
|
-
ok: false,
|
|
482
|
-
code: "missing",
|
|
483
|
-
message: "named NEAR account ID is required"
|
|
484
|
-
};
|
|
485
|
-
if (isImplicitNearAccountId(value) || !isValidAccountId(value) || !value.includes(".")) return {
|
|
486
|
-
ok: false,
|
|
487
|
-
code: "invalid",
|
|
488
|
-
message: "named NEAR account ID must be a valid named account containing a dot"
|
|
489
|
-
};
|
|
490
|
-
return {
|
|
491
|
-
ok: true,
|
|
492
|
-
value
|
|
493
|
-
};
|
|
494
|
-
}
|
|
495
|
-
function bytesToLowerHex(bytes) {
|
|
496
|
-
return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
497
|
-
}
|
|
498
|
-
function deriveImplicitNearAccountIdFromEd25519PublicKey(publicKey) {
|
|
499
|
-
const normalized = ensureEd25519Prefix(publicKey);
|
|
500
|
-
const encoded = normalized.startsWith("ed25519:") ? normalized.slice(8) : "";
|
|
501
|
-
if (!encoded) throw new Error("Ed25519 public key is required");
|
|
502
|
-
const decoded = base58Decode(encoded);
|
|
503
|
-
if (decoded.length !== 32) throw new Error("Ed25519 public key must decode to 32 bytes");
|
|
504
|
-
return bytesToLowerHex(decoded);
|
|
505
|
-
}
|
|
506
|
-
//#endregion
|
|
507
416
|
//#region ../shared-ts/src/utils/validation.ts
|
|
508
417
|
function requireTrimmedString(value, label, message = "is required") {
|
|
509
418
|
const parsed = normalizeOptionalTrimmedString(value);
|
|
@@ -5416,11 +5325,15 @@ function createRouterAbTraceContextV1() {
|
|
|
5416
5325
|
};
|
|
5417
5326
|
}
|
|
5418
5327
|
//#endregion
|
|
5328
|
+
//#region ../shared-ts/src/utils/walletManagementProtocol.ts
|
|
5329
|
+
const WALLET_MANAGEMENT_PROTOCOL_HEADER = "X-Seams-Wallet-Protocol";
|
|
5330
|
+
//#endregion
|
|
5419
5331
|
//#region src/router/framework/http.ts
|
|
5420
5332
|
const CORS_ALLOW_METHODS = "GET,POST,PUT,PATCH,DELETE,OPTIONS";
|
|
5421
5333
|
const CORS_PREFLIGHT_MAX_AGE_SECONDS = 600;
|
|
5422
5334
|
const CORS_ALLOW_HEADERS = [
|
|
5423
5335
|
"Content-Type",
|
|
5336
|
+
WALLET_MANAGEMENT_PROTOCOL_HEADER,
|
|
5424
5337
|
"Authorization",
|
|
5425
5338
|
"X-Seams-Benchmark-Diagnostics",
|
|
5426
5339
|
LINKED_DEVICE_REQUEST_PROOF_HEADER_V1,
|
|
@@ -5529,6 +5442,11 @@ async function handleReady(ctx) {
|
|
|
5529
5442
|
}
|
|
5530
5443
|
}
|
|
5531
5444
|
//#endregion
|
|
5445
|
+
//#region ../shared-ts/src/utils/registrationSetupOperation.ts
|
|
5446
|
+
function parseRegistrationSetupOperationId(value) {
|
|
5447
|
+
return typeof value === "string" && /^wreg_[A-Za-z0-9_-]{43}$/u.test(value) ? value : null;
|
|
5448
|
+
}
|
|
5449
|
+
//#endregion
|
|
5532
5450
|
//#region src/router/auth/routerApiKeyAuth.ts
|
|
5533
5451
|
function readHeader(headers, name) {
|
|
5534
5452
|
if (headers instanceof Headers) return String(headers.get(name) || "").trim();
|
|
@@ -5729,22 +5647,6 @@ function parseLaneParticipantBindingDigestB64u(raw) {
|
|
|
5729
5647
|
return parseDigest(raw, "participantBindingDigestB64u", brandParticipantDigest);
|
|
5730
5648
|
}
|
|
5731
5649
|
//#endregion
|
|
5732
|
-
//#region ../shared-ts/src/utils/registrationIds.ts
|
|
5733
|
-
function walletIdFromString(value) {
|
|
5734
|
-
const parsed = parseWalletId(value);
|
|
5735
|
-
if (!parsed.ok) throw new Error(parsed.error.message);
|
|
5736
|
-
return parsed.value;
|
|
5737
|
-
}
|
|
5738
|
-
function nearEd25519SigningKeyIdFromString(value) {
|
|
5739
|
-
const normalized = String(value || "").trim();
|
|
5740
|
-
if (!normalized) throw new Error("nearEd25519SigningKeyId is required");
|
|
5741
|
-
return normalized;
|
|
5742
|
-
}
|
|
5743
|
-
function parseNearEd25519SigningKeyId(value) {
|
|
5744
|
-
if (typeof value !== "string") throw new Error("nearEd25519SigningKeyId must be a string");
|
|
5745
|
-
return nearEd25519SigningKeyIdFromString(value);
|
|
5746
|
-
}
|
|
5747
|
-
//#endregion
|
|
5748
5650
|
//#region ../shared-ts/src/signing-lanes/participantDigest.ts
|
|
5749
5651
|
function u32(value) {
|
|
5750
5652
|
if (!Number.isInteger(value) || value < 0 || value > 4294967295) throw new Error("canonical u32 must be an integer between 0 and 4294967295");
|
|
@@ -5775,6 +5677,17 @@ function encodeLaneCanonicalU64V1(value) {
|
|
|
5775
5677
|
return output;
|
|
5776
5678
|
}
|
|
5777
5679
|
//#endregion
|
|
5680
|
+
//#region ../shared-ts/src/signing-lanes/execution.ts
|
|
5681
|
+
function buildPreparedOwnerWalletExecution(input) {
|
|
5682
|
+
return {
|
|
5683
|
+
kind: "prepared_owner_wallet_execution",
|
|
5684
|
+
laneKind: input.lane.laneKind,
|
|
5685
|
+
authorization: input.authorization,
|
|
5686
|
+
materialActivation: input.materialActivation,
|
|
5687
|
+
lane: input.lane
|
|
5688
|
+
};
|
|
5689
|
+
}
|
|
5690
|
+
//#endregion
|
|
5778
5691
|
//#region ../shared-ts/src/signing-lanes/ownerContinuity.ts
|
|
5779
5692
|
const OWNER_LANE_PARTICIPANT_BINDING_DOMAIN_V1 = "seams/rotatable-signing-lanes/owner-lane-participant-continuity/v1";
|
|
5780
5693
|
const OWNER_LANE_PARTICIPANT_CONTINUITY_FIELDS = [
|
|
@@ -5842,18 +5755,6 @@ function ownerLaneParticipantContinuityCanonicalBytesV1(input) {
|
|
|
5842
5755
|
async function computeOwnerLaneParticipantBindingDigestV1(input) {
|
|
5843
5756
|
return requireParsed$2(parseLaneParticipantBindingDigestB64u(base64UrlEncode(await sha256Bytes(ownerLaneParticipantContinuityCanonicalBytesV1(input)))), "owner participant digest");
|
|
5844
5757
|
}
|
|
5845
|
-
new TextEncoder();
|
|
5846
|
-
//#endregion
|
|
5847
|
-
//#region ../shared-ts/src/signing-lanes/execution.ts
|
|
5848
|
-
function buildPreparedOwnerWalletExecution(input) {
|
|
5849
|
-
return {
|
|
5850
|
-
kind: "prepared_owner_wallet_execution",
|
|
5851
|
-
laneKind: input.lane.laneKind,
|
|
5852
|
-
authorization: input.authorization,
|
|
5853
|
-
materialActivation: input.materialActivation,
|
|
5854
|
-
lane: input.lane
|
|
5855
|
-
};
|
|
5856
|
-
}
|
|
5857
5758
|
//#endregion
|
|
5858
5759
|
//#region ../shared-ts/src/authorization/operationFingerprint.ts
|
|
5859
5760
|
const CAPABILITY_OPERATION_FINGERPRINT_DOMAIN_V1 = "seams:authorization:capability-operation-fingerprint:v1";
|
|
@@ -5906,6 +5807,30 @@ function parseSigningOperationFingerprintDigest(value) {
|
|
|
5906
5807
|
return parseDigestB64u(value.slice(7));
|
|
5907
5808
|
}
|
|
5908
5809
|
//#endregion
|
|
5810
|
+
//#region ../shared-ts/src/utils/base58.ts
|
|
5811
|
+
/**
|
|
5812
|
+
* Encodes binary data to base58 string using Bitcoin's base58 alphabet.
|
|
5813
|
+
*
|
|
5814
|
+
* @param data - Binary data to encode (Uint8Array, ArrayBuffer, or number[])
|
|
5815
|
+
* @returns Base58-encoded string
|
|
5816
|
+
*/
|
|
5817
|
+
const base58Encode = (data) => {
|
|
5818
|
+
if (data instanceof ArrayBuffer) return bs58.encode(new Uint8Array(data));
|
|
5819
|
+
if (Array.isArray(data)) return bs58.encode(new Uint8Array(data));
|
|
5820
|
+
return bs58.encode(data);
|
|
5821
|
+
};
|
|
5822
|
+
/**
|
|
5823
|
+
* Decodes a base58 string to binary data using Bitcoin's base58 alphabet.
|
|
5824
|
+
* Returns a Uint8Array containing the decoded bytes.
|
|
5825
|
+
*
|
|
5826
|
+
* @param base58String - Base58-encoded string to decode
|
|
5827
|
+
* @returns Uint8Array containing the decoded bytes
|
|
5828
|
+
* @throws Error if input contains invalid base58 characters
|
|
5829
|
+
*/
|
|
5830
|
+
const base58Decode = (base58String) => {
|
|
5831
|
+
return bs58.decode(base58String);
|
|
5832
|
+
};
|
|
5833
|
+
//#endregion
|
|
5909
5834
|
//#region src/authorization/domain.ts
|
|
5910
5835
|
/**
|
|
5911
5836
|
* The digest-free authorization projection published to the browser. It carries
|
|
@@ -6144,8 +6069,7 @@ function resolveWalletSessionAuthorizationV2AdministrationAdmission(input) {
|
|
|
6144
6069
|
if (!subject || subject.authorityId !== input.authority.authorityId) return admissionRefused("capability_subject_mismatch");
|
|
6145
6070
|
return {
|
|
6146
6071
|
ok: true,
|
|
6147
|
-
operationKind: "link_devices"
|
|
6148
|
-
authorityId: input.authority.authorityId
|
|
6072
|
+
operationKind: "link_devices"
|
|
6149
6073
|
};
|
|
6150
6074
|
}
|
|
6151
6075
|
default: return assertNeverWalletSessionAuthorizationV2AdministrationOperation(input.operation.kind);
|
|
@@ -6768,6 +6692,22 @@ function toFetchRouteResponse(response) {
|
|
|
6768
6692
|
});
|
|
6769
6693
|
}
|
|
6770
6694
|
//#endregion
|
|
6695
|
+
//#region ../shared-ts/src/utils/registrationIds.ts
|
|
6696
|
+
function walletIdFromString(value) {
|
|
6697
|
+
const parsed = parseWalletId(value);
|
|
6698
|
+
if (!parsed.ok) throw new Error(parsed.error.message);
|
|
6699
|
+
return parsed.value;
|
|
6700
|
+
}
|
|
6701
|
+
function nearEd25519SigningKeyIdFromString(value) {
|
|
6702
|
+
const normalized = String(value || "").trim();
|
|
6703
|
+
if (!normalized) throw new Error("nearEd25519SigningKeyId is required");
|
|
6704
|
+
return normalized;
|
|
6705
|
+
}
|
|
6706
|
+
function parseNearEd25519SigningKeyId(value) {
|
|
6707
|
+
if (typeof value !== "string") throw new Error("nearEd25519SigningKeyId must be a string");
|
|
6708
|
+
return nearEd25519SigningKeyIdFromString(value);
|
|
6709
|
+
}
|
|
6710
|
+
//#endregion
|
|
6771
6711
|
//#region ../shared-ts/src/passkey-custody/custodySecretBinding.ts
|
|
6772
6712
|
/** The only derivation scheme owner custody supports. */
|
|
6773
6713
|
const WALLET_SEED_DERIVATION_SCHEME_V1 = "wallet_seed_parallel_hkdf_sha256_v1";
|
|
@@ -7274,40 +7214,122 @@ async function computeWalletEcdsaKeyFactsInventoryChallengeDigestB64u(input) {
|
|
|
7274
7214
|
return base64UrlEncode(await sha256BytesUtf8(canonicalizeWalletEcdsaKeyFactsInventoryChallenge(input)));
|
|
7275
7215
|
}
|
|
7276
7216
|
//#endregion
|
|
7277
|
-
//#region ../shared-ts/src/utils/
|
|
7278
|
-
|
|
7279
|
-
|
|
7280
|
-
|
|
7281
|
-
|
|
7282
|
-
|
|
7283
|
-
|
|
7284
|
-
|
|
7285
|
-
|
|
7286
|
-
|
|
7287
|
-
|
|
7217
|
+
//#region ../shared-ts/src/utils/near.ts
|
|
7218
|
+
/**
|
|
7219
|
+
* NEAR-specific utility helpers.
|
|
7220
|
+
*
|
|
7221
|
+
* Keep chain-specific parsing and validation logic here so generic utility
|
|
7222
|
+
* modules (`validation`, `errors`, `encoders`, etc.) stay chain-agnostic.
|
|
7223
|
+
*/
|
|
7224
|
+
/**
|
|
7225
|
+
* Ensure a key string has the NEAR Ed25519 prefix (`ed25519:`).
|
|
7226
|
+
*
|
|
7227
|
+
* - Accepts either `ed25519:<base58>` or a bare `<base58>` string.
|
|
7228
|
+
* - Canonicalizes `ED25519:` -> `ed25519:`.
|
|
7229
|
+
* - If a different prefix is present (e.g. `secp256k1:`), returns the input unchanged.
|
|
7230
|
+
*/
|
|
7231
|
+
function ensureEd25519Prefix(value) {
|
|
7232
|
+
const raw = String(value ?? "").trim();
|
|
7233
|
+
if (!raw) return "";
|
|
7234
|
+
if (/^[a-z0-9_]+:/i.test(raw)) {
|
|
7235
|
+
if (/^ed25519:/i.test(raw)) return `ed25519:${raw.replace(/^ed25519:/i, "")}`;
|
|
7236
|
+
return raw;
|
|
7288
7237
|
}
|
|
7289
|
-
return
|
|
7238
|
+
return `ed25519:${raw}`;
|
|
7290
7239
|
}
|
|
7291
|
-
|
|
7292
|
-
|
|
7240
|
+
/**
|
|
7241
|
+
* Lightweight NEAR account ID validation used by server-side helpers.
|
|
7242
|
+
* - length: 2..64
|
|
7243
|
+
* - chars: lowercase letters, digits, `_`, `.`, `-`
|
|
7244
|
+
*/
|
|
7245
|
+
function isValidAccountId(accountId) {
|
|
7246
|
+
if (typeof accountId !== "string") return false;
|
|
7247
|
+
if (!accountId || accountId.length < 2 || accountId.length > 64) return false;
|
|
7248
|
+
return /^[a-z0-9_.-]+$/.test(accountId);
|
|
7293
7249
|
}
|
|
7294
|
-
function
|
|
7295
|
-
|
|
7296
|
-
|
|
7297
|
-
|
|
7298
|
-
|
|
7299
|
-
|
|
7300
|
-
|
|
7301
|
-
|
|
7302
|
-
|
|
7303
|
-
|
|
7304
|
-
|
|
7305
|
-
|
|
7306
|
-
|
|
7307
|
-
|
|
7308
|
-
|
|
7309
|
-
|
|
7310
|
-
|
|
7250
|
+
function isImplicitNearAccountId(value) {
|
|
7251
|
+
return typeof value === "string" && /^[0-9a-f]{64}$/.test(value);
|
|
7252
|
+
}
|
|
7253
|
+
function parseImplicitNearAccountId(raw) {
|
|
7254
|
+
const value = typeof raw === "string" ? raw.trim() : "";
|
|
7255
|
+
if (!value) return {
|
|
7256
|
+
ok: false,
|
|
7257
|
+
code: "missing",
|
|
7258
|
+
message: "implicit NEAR account ID is required"
|
|
7259
|
+
};
|
|
7260
|
+
if (!isImplicitNearAccountId(value)) return {
|
|
7261
|
+
ok: false,
|
|
7262
|
+
code: "invalid",
|
|
7263
|
+
message: "implicit NEAR account ID must be 64 lowercase hex characters"
|
|
7264
|
+
};
|
|
7265
|
+
return {
|
|
7266
|
+
ok: true,
|
|
7267
|
+
value
|
|
7268
|
+
};
|
|
7269
|
+
}
|
|
7270
|
+
function parseNamedNearAccountId(raw) {
|
|
7271
|
+
const value = typeof raw === "string" ? raw.trim() : "";
|
|
7272
|
+
if (!value) return {
|
|
7273
|
+
ok: false,
|
|
7274
|
+
code: "missing",
|
|
7275
|
+
message: "named NEAR account ID is required"
|
|
7276
|
+
};
|
|
7277
|
+
if (isImplicitNearAccountId(value) || !isValidAccountId(value) || !value.includes(".")) return {
|
|
7278
|
+
ok: false,
|
|
7279
|
+
code: "invalid",
|
|
7280
|
+
message: "named NEAR account ID must be a valid named account containing a dot"
|
|
7281
|
+
};
|
|
7282
|
+
return {
|
|
7283
|
+
ok: true,
|
|
7284
|
+
value
|
|
7285
|
+
};
|
|
7286
|
+
}
|
|
7287
|
+
function bytesToLowerHex(bytes) {
|
|
7288
|
+
return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
7289
|
+
}
|
|
7290
|
+
function deriveImplicitNearAccountIdFromEd25519PublicKey(publicKey) {
|
|
7291
|
+
const normalized = ensureEd25519Prefix(publicKey);
|
|
7292
|
+
const encoded = normalized.startsWith("ed25519:") ? normalized.slice(8) : "";
|
|
7293
|
+
if (!encoded) throw new Error("Ed25519 public key is required");
|
|
7294
|
+
const decoded = base58Decode(encoded);
|
|
7295
|
+
if (decoded.length !== 32) throw new Error("Ed25519 public key must decode to 32 bytes");
|
|
7296
|
+
return bytesToLowerHex(decoded);
|
|
7297
|
+
}
|
|
7298
|
+
//#endregion
|
|
7299
|
+
//#region ../shared-ts/src/utils/registrationSignerPlan.ts
|
|
7300
|
+
function normalizePositiveInteger(raw, fallback) {
|
|
7301
|
+
const value = typeof raw === "number" ? raw : Number(raw);
|
|
7302
|
+
return Number.isFinite(value) && value >= 1 ? Math.floor(value) : fallback;
|
|
7303
|
+
}
|
|
7304
|
+
function collectPositiveParticipantIds(raw) {
|
|
7305
|
+
if (!Array.isArray(raw)) return [];
|
|
7306
|
+
const participantIds = [];
|
|
7307
|
+
for (const id of raw) {
|
|
7308
|
+
const numericId = Number(id);
|
|
7309
|
+
if (Number.isInteger(numericId) && numericId > 0) participantIds.push(numericId);
|
|
7310
|
+
}
|
|
7311
|
+
return participantIds;
|
|
7312
|
+
}
|
|
7313
|
+
function normalizeUnknownArray(raw) {
|
|
7314
|
+
return Array.isArray(raw) ? raw : [];
|
|
7315
|
+
}
|
|
7316
|
+
function normalizeRegistrationNearAccountProvisioning(raw) {
|
|
7317
|
+
const record = inspectRawObject(raw);
|
|
7318
|
+
if (!record || !("kind" in record)) return null;
|
|
7319
|
+
switch (trimString(record.kind)) {
|
|
7320
|
+
case "implicit_account":
|
|
7321
|
+
if (Object.prototype.hasOwnProperty.call(record, "requestedAccountId") || Object.prototype.hasOwnProperty.call(record, "sponsor")) return null;
|
|
7322
|
+
return {
|
|
7323
|
+
kind: "implicit_account",
|
|
7324
|
+
accountIdSource: "ed25519_public_key"
|
|
7325
|
+
};
|
|
7326
|
+
case "sponsored_named_account": {
|
|
7327
|
+
if (Object.prototype.hasOwnProperty.call(record, "accountIdSource") || !("requestedAccountId" in record)) return null;
|
|
7328
|
+
const parsed = parseNamedNearAccountId(record.requestedAccountId);
|
|
7329
|
+
if (!parsed.ok) return null;
|
|
7330
|
+
return {
|
|
7331
|
+
kind: "sponsored_named_account",
|
|
7332
|
+
requestedAccountId: parsed.value,
|
|
7311
7333
|
sponsor: "relayer"
|
|
7312
7334
|
};
|
|
7313
7335
|
}
|
|
@@ -7941,6 +7963,12 @@ function parseWalletRegistrationSetupWallet(raw) {
|
|
|
7941
7963
|
};
|
|
7942
7964
|
}
|
|
7943
7965
|
function parseWalletRegistrationSetupRequest(body) {
|
|
7966
|
+
const registrationOperationId = parseRegistrationSetupOperationId(body.registrationOperationId);
|
|
7967
|
+
if (!registrationOperationId) return {
|
|
7968
|
+
ok: false,
|
|
7969
|
+
code: "invalid_body",
|
|
7970
|
+
message: "registrationOperationId is required"
|
|
7971
|
+
};
|
|
7944
7972
|
const signerSelection = parseRegistrationSignerSet(body.signerSelection);
|
|
7945
7973
|
if (!signerSelection.ok) return signerSelection;
|
|
7946
7974
|
const authMethod = normalizeRegistrationAuthMethodInput(body.authMethod);
|
|
@@ -7954,6 +7982,7 @@ function parseWalletRegistrationSetupRequest(body) {
|
|
|
7954
7982
|
return {
|
|
7955
7983
|
ok: true,
|
|
7956
7984
|
value: {
|
|
7985
|
+
registrationOperationId,
|
|
7957
7986
|
...wallet.value ? { wallet: wallet.value } : {},
|
|
7958
7987
|
signerSelection: signerSelection.value.selection,
|
|
7959
7988
|
authMethod
|
|
@@ -9171,14 +9200,6 @@ async function handleRouterApiWalletAddSignerIntent(input) {
|
|
|
9171
9200
|
});
|
|
9172
9201
|
return routeJson(result.ok ? 200 : 400, result);
|
|
9173
9202
|
}
|
|
9174
|
-
/**
|
|
9175
|
-
* `POST /wallets/register/setup` — the single admitted entry point that
|
|
9176
|
-
* replaces the bootstrap grant, the intent, and start.
|
|
9177
|
-
*
|
|
9178
|
-
* Authentication is the same API-credential plane the intent route used, so
|
|
9179
|
-
* origin and environment binding are unchanged; what is gone is the stored
|
|
9180
|
-
* grant that used to sit between the check and its only reader.
|
|
9181
|
-
*/
|
|
9182
9203
|
async function handleRouterApiWalletRegistrationSetup(input) {
|
|
9183
9204
|
if (!isPlainObject(input.body)) return routeError(400, "invalid_body", "JSON body required");
|
|
9184
9205
|
const origin = normalizeCorsOrigin(input.origin);
|
|
@@ -9221,7 +9242,7 @@ async function handleRouterApiWalletRegistrationSetup(input) {
|
|
|
9221
9242
|
if (!session) return routeError(500, "internal", "wallet registration setup requires session signing");
|
|
9222
9243
|
const request = parseWalletRegistrationSetupRequest(input.body);
|
|
9223
9244
|
if (!request.ok) return routeError(400, request.code, request.message);
|
|
9224
|
-
|
|
9245
|
+
return input.services.walletRegistration.setupWalletRegistration({
|
|
9225
9246
|
request: request.value,
|
|
9226
9247
|
orgId: principal.orgId,
|
|
9227
9248
|
expectedOrigin: origin,
|
|
@@ -9232,7 +9253,6 @@ async function handleRouterApiWalletRegistrationSetup(input) {
|
|
|
9232
9253
|
signingRootVersion: runtimePolicyScope.signingRootVersion
|
|
9233
9254
|
} : {}
|
|
9234
9255
|
});
|
|
9235
|
-
return routeJson(result.ok ? 200 : 400, result);
|
|
9236
9256
|
}
|
|
9237
9257
|
/**
|
|
9238
9258
|
* `POST /wallets/register/respond` — the authenticated leg.
|
|
@@ -10233,7 +10253,6 @@ const ROUTER_API_ECDSA_STRICT_LIFECYCLE_SERVICES = [
|
|
|
10233
10253
|
"session"
|
|
10234
10254
|
];
|
|
10235
10255
|
const ROUTER_API_WEBAUTHN_AUTHENTICATOR_SERVICES = ["webAuthn", "session"];
|
|
10236
|
-
const ROUTER_API_NEAR_PUBLIC_KEY_SERVICES = ["nearFunding", "session"];
|
|
10237
10256
|
const ROUTER_API_PASSKEY_CUSTODY_SERVICES = [
|
|
10238
10257
|
"passkeyCustody",
|
|
10239
10258
|
"walletAuthMethods",
|
|
@@ -10600,7 +10619,7 @@ function createRouterApiRouteDefinitions(options = {}) {
|
|
|
10600
10619
|
}, ROUTER_API_ED25519_WALLET_SESSION_SERVICES), sessionPrincipalRoute("router_ab_ed25519_sign_prepare", "POST", ROUTER_AB_ED25519_NORMAL_SIGNING_PREPARE_PATH, "Prepare Router A/B Ed25519 normal signing", ROUTER_API_NORMAL_SIGNING_PROXY_SERVICES), sessionPrincipalRoute("router_ab_ed25519_sign_finalize", "POST", ROUTER_AB_ED25519_NORMAL_SIGNING_PATH, "Finalize Router A/B Ed25519 normal signing", ROUTER_API_NORMAL_SIGNING_PROXY_SERVICES), publicRoute("router_ab_ecdsa_derivation_healthz", "GET", ROUTER_AB_ECDSA_DERIVATION_HEALTH_PATH, "Router A/B ECDSA derivation health probe", {
|
|
10601
10620
|
plane: "public",
|
|
10602
10621
|
rationale: "Router A/B health probes are intentionally public diagnostics."
|
|
10603
|
-
}, ROUTER_API_THRESHOLD_RUNTIME_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_export", "POST", ROUTER_AB_ECDSA_DERIVATION_EXPORT_PATH, "Export authorized Router A/B ECDSA derivation material", ROUTER_API_ECDSA_STRICT_LIFECYCLE_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_refresh", "POST", ROUTER_AB_ECDSA_DERIVATION_REFRESH_PATH, "Refresh Router A/B ECDSA derivation activation", ROUTER_API_ECDSA_STRICT_LIFECYCLE_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_session_activate", "POST", ROUTER_AB_ECDSA_DERIVATION_SESSION_ACTIVATION_PATH, "Activate Router A/B ECDSA normal-signing session", ROUTER_API_THRESHOLD_SESSION_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_sign_prepare", "POST", ROUTER_AB_ECDSA_DERIVATION_NORMAL_SIGNING_PREPARE_PATH, "Prepare Router A/B ECDSA derivation normal signing", ROUTER_API_NORMAL_SIGNING_PROXY_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_sign_finalize", "POST", ROUTER_AB_ECDSA_DERIVATION_NORMAL_SIGNING_PATH, "Finalize Router A/B ECDSA derivation normal signing", ROUTER_API_NORMAL_SIGNING_PROXY_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_presignature_pool_fill_init", "POST", ROUTER_AB_ECDSA_DERIVATION_PRESIGNATURE_POOL_FILL_INIT_PATH, "Begin Router A/B ECDSA derivation presignature pool-fill session", ROUTER_API_THRESHOLD_SESSION_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_presignature_pool_fill_step", "POST", ROUTER_AB_ECDSA_DERIVATION_PRESIGNATURE_POOL_FILL_STEP_PATH, "Continue Router A/B ECDSA derivation presignature pool-fill session", ROUTER_API_THRESHOLD_SESSION_SERVICES), sessionPrincipalRoute("webauthn_authenticators", "GET", "/webauthn/authenticators", "List registered WebAuthn authenticators", ROUTER_API_WEBAUTHN_AUTHENTICATOR_SERVICES),
|
|
10622
|
+
}, ROUTER_API_THRESHOLD_RUNTIME_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_export", "POST", ROUTER_AB_ECDSA_DERIVATION_EXPORT_PATH, "Export authorized Router A/B ECDSA derivation material", ROUTER_API_ECDSA_STRICT_LIFECYCLE_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_refresh", "POST", ROUTER_AB_ECDSA_DERIVATION_REFRESH_PATH, "Refresh Router A/B ECDSA derivation activation", ROUTER_API_ECDSA_STRICT_LIFECYCLE_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_session_activate", "POST", ROUTER_AB_ECDSA_DERIVATION_SESSION_ACTIVATION_PATH, "Activate Router A/B ECDSA normal-signing session", ROUTER_API_THRESHOLD_SESSION_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_sign_prepare", "POST", ROUTER_AB_ECDSA_DERIVATION_NORMAL_SIGNING_PREPARE_PATH, "Prepare Router A/B ECDSA derivation normal signing", ROUTER_API_NORMAL_SIGNING_PROXY_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_sign_finalize", "POST", ROUTER_AB_ECDSA_DERIVATION_NORMAL_SIGNING_PATH, "Finalize Router A/B ECDSA derivation normal signing", ROUTER_API_NORMAL_SIGNING_PROXY_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_presignature_pool_fill_init", "POST", ROUTER_AB_ECDSA_DERIVATION_PRESIGNATURE_POOL_FILL_INIT_PATH, "Begin Router A/B ECDSA derivation presignature pool-fill session", ROUTER_API_THRESHOLD_SESSION_SERVICES), sessionPrincipalRoute("router_ab_ecdsa_derivation_presignature_pool_fill_step", "POST", ROUTER_AB_ECDSA_DERIVATION_PRESIGNATURE_POOL_FILL_STEP_PATH, "Continue Router A/B ECDSA derivation presignature pool-fill session", ROUTER_API_THRESHOLD_SESSION_SERVICES), sessionPrincipalRoute("webauthn_authenticators", "GET", "/webauthn/authenticators", "List registered WebAuthn authenticators", ROUTER_API_WEBAUTHN_AUTHENTICATOR_SERVICES), publicRoute("wallet_unlock_challenge", "POST", "/wallet/unlock/challenge", "Create wallet unlock challenge", {
|
|
10604
10623
|
plane: "public",
|
|
10605
10624
|
proof: "challenge_exchange",
|
|
10606
10625
|
rationale: "Wallet unlock challenge issuance is intentionally public."
|
|
@@ -10680,6 +10699,7 @@ function resolveWalletRegistrationRoute(ctx) {
|
|
|
10680
10699
|
async function handleWalletRegistration(ctx) {
|
|
10681
10700
|
const route = resolveWalletRegistrationRoute(ctx);
|
|
10682
10701
|
if (!route) return null;
|
|
10702
|
+
if (ctx.request.headers.get("X-Seams-Wallet-Protocol") !== "2") return jsonFailure(409, "wallet_protocol_mismatch", "Your wallet application needs an update. Reload this page and try again. If the problem continues, ask the application developer to upgrade the Wallet SDK.");
|
|
10683
10703
|
const common = {
|
|
10684
10704
|
body: await readJson(ctx.request),
|
|
10685
10705
|
headers: Object.fromEntries(ctx.request.headers.entries()),
|
|
@@ -11748,6 +11768,7 @@ async function handleWalletRecoveryPrepare(ctx) {
|
|
|
11748
11768
|
case "refused": return toFetchRouteResponse(refusedSpend());
|
|
11749
11769
|
case "reserved":
|
|
11750
11770
|
case "consumed": return routeErrorResponse(401, "recovery_code_used", "that recovery code has already been used");
|
|
11771
|
+
case "routing_unavailable": return routeErrorResponse(503, "wallet_home_unavailable", "Wallet recovery routing is temporarily unavailable");
|
|
11751
11772
|
case "manifest_unavailable":
|
|
11752
11773
|
case "registration_unavailable": return routeErrorResponse(409, "recovery_preparation_conflict", "wallet recovery could not be prepared");
|
|
11753
11774
|
}
|
|
@@ -12949,6 +12970,20 @@ async function handleWalletUnlockChallengeRoute(input) {
|
|
|
12949
12970
|
orgId: body.orgId,
|
|
12950
12971
|
ttlMs: body.ttlMs
|
|
12951
12972
|
});
|
|
12973
|
+
if (!result.ok && result.code === "wallet_home_unavailable") return {
|
|
12974
|
+
status: 503,
|
|
12975
|
+
body: {
|
|
12976
|
+
...result,
|
|
12977
|
+
unlockBackend
|
|
12978
|
+
}
|
|
12979
|
+
};
|
|
12980
|
+
if (!result.ok && result.code === "wallet_home_conflict") return {
|
|
12981
|
+
status: 409,
|
|
12982
|
+
body: {
|
|
12983
|
+
...result,
|
|
12984
|
+
unlockBackend
|
|
12985
|
+
}
|
|
12986
|
+
};
|
|
12952
12987
|
return {
|
|
12953
12988
|
status: result.ok ? 200 : result.code === "internal" ? 500 : 400,
|
|
12954
12989
|
body: {
|
|
@@ -14382,7 +14417,7 @@ async function buildRouterAbEd25519PrivateSigningWorkerBody(input) {
|
|
|
14382
14417
|
const scope = parseRouterAbEd25519NormalSigningScopeV2(input.body.scope);
|
|
14383
14418
|
const signingContext = privateSigningAuthorizationContext(scope, input.authorization);
|
|
14384
14419
|
const trustedSourceDigest = await privateSigningTrustedSourceDigest(input.headers);
|
|
14385
|
-
const materialSource =
|
|
14420
|
+
const materialSource = registrationMaterialSourceV1({
|
|
14386
14421
|
accountId: scope.account_id,
|
|
14387
14422
|
materialActivationId: scope.material_activation.activation_id,
|
|
14388
14423
|
signingWorkerId: scope.signing_worker_id
|
|
@@ -15296,6 +15331,164 @@ function parseRouterAbEcdsaDerivationPoolFillStepRouteRequest(raw) {
|
|
|
15296
15331
|
};
|
|
15297
15332
|
}
|
|
15298
15333
|
//#endregion
|
|
15334
|
+
//#region src/router/transport/fetch/routes/ecdsaOperationStepUpFactor.ts
|
|
15335
|
+
async function verifyEcdsaOperationStepUpFactor(input) {
|
|
15336
|
+
const proof = input.proof;
|
|
15337
|
+
switch (proof.kind) {
|
|
15338
|
+
case "passkey": {
|
|
15339
|
+
if (input.authSource.kind !== "passkey" || proof.authority.factor.credentialIdB64u !== input.authSource.credentialIdB64u) return {
|
|
15340
|
+
ok: false,
|
|
15341
|
+
response: json$1({
|
|
15342
|
+
ok: false,
|
|
15343
|
+
code: "scope_mismatch",
|
|
15344
|
+
message: "Passkey authority changed"
|
|
15345
|
+
}, { status: 403 })
|
|
15346
|
+
};
|
|
15347
|
+
const credential = proof.webauthn_authentication;
|
|
15348
|
+
if (String(credential.rawId || credential.id).trim() !== input.authSource.credentialIdB64u) return {
|
|
15349
|
+
ok: false,
|
|
15350
|
+
response: json$1({
|
|
15351
|
+
ok: false,
|
|
15352
|
+
code: "unauthorized",
|
|
15353
|
+
message: "Passkey credential changed"
|
|
15354
|
+
}, { status: 401 })
|
|
15355
|
+
};
|
|
15356
|
+
const verified = await input.webAuthn.verifyWebAuthnAuthenticationLite({
|
|
15357
|
+
userId: input.walletId,
|
|
15358
|
+
rpId: proof.authority.verifier.rpId,
|
|
15359
|
+
expectedChallenge: input.expectedChallenge,
|
|
15360
|
+
expected_origin: input.requestOrigin,
|
|
15361
|
+
webauthn_authentication: credential
|
|
15362
|
+
});
|
|
15363
|
+
if (!verified.success || !verified.verified) return {
|
|
15364
|
+
ok: false,
|
|
15365
|
+
response: json$1({
|
|
15366
|
+
ok: false,
|
|
15367
|
+
code: verified.code || "not_verified",
|
|
15368
|
+
message: verified.message || "WebAuthn authentication verification failed"
|
|
15369
|
+
}, { status: 401 })
|
|
15370
|
+
};
|
|
15371
|
+
const assertionDigest = parseDigestB64u(base64UrlEncode(await sha256BytesUtf8(alphabetizeStringify(credential))));
|
|
15372
|
+
const verifiedAtMs = Date.now();
|
|
15373
|
+
if (input.expiresAtMs <= verifiedAtMs) return expiredStepUpFactor();
|
|
15374
|
+
const factorId = parseAuthFactorId(`passkey:${input.authSource.credentialIdB64u}`);
|
|
15375
|
+
if (!factorId.ok) throw new Error(factorId.error.message);
|
|
15376
|
+
return {
|
|
15377
|
+
ok: true,
|
|
15378
|
+
factor: buildVerifiedWalletOperationPasskeyFactorResult({
|
|
15379
|
+
tenantId: input.operation.tenantId,
|
|
15380
|
+
principalId: input.operation.principalId,
|
|
15381
|
+
walletId: input.walletId,
|
|
15382
|
+
requestOrigin: input.requestOrigin,
|
|
15383
|
+
audience: input.requestOrigin,
|
|
15384
|
+
factorId: factorId.value,
|
|
15385
|
+
authorityRef: input.authorityRef,
|
|
15386
|
+
operation: input.operation,
|
|
15387
|
+
credentialIdB64u: proof.authority.factor.credentialIdB64u,
|
|
15388
|
+
assertionDigest,
|
|
15389
|
+
verifiedAtMs,
|
|
15390
|
+
expiresAtMs: input.expiresAtMs
|
|
15391
|
+
}),
|
|
15392
|
+
unseal: { kind: "not_requested" }
|
|
15393
|
+
};
|
|
15394
|
+
}
|
|
15395
|
+
case "email_otp": {
|
|
15396
|
+
const isExport = input.operation.operation.operationKind === "evm.export_key";
|
|
15397
|
+
const emailOtpOperation = isExport ? WALLET_EMAIL_OTP_EXPORT_OPERATION : WALLET_EMAIL_OTP_TRANSACTION_SIGN_OPERATION;
|
|
15398
|
+
const operationBinding = await hashEmailOtpOperationBinding({
|
|
15399
|
+
walletId: input.walletId,
|
|
15400
|
+
providerUserId: proof.authority.factor.providerUserId,
|
|
15401
|
+
orgId: input.operation.tenantId,
|
|
15402
|
+
operation: emailOtpOperation,
|
|
15403
|
+
requestOrigin: input.requestOrigin,
|
|
15404
|
+
audience: input.requestOrigin,
|
|
15405
|
+
authorityRef: input.authorityRef,
|
|
15406
|
+
...isExport ? {} : { operationFingerprintDigest: input.operation.digests.laneDigest }
|
|
15407
|
+
});
|
|
15408
|
+
const verified = await input.emailOtp.verifyEmailOtpChallenge({
|
|
15409
|
+
userId: proof.authority.factor.providerUserId,
|
|
15410
|
+
walletId: input.walletId,
|
|
15411
|
+
orgId: input.operation.tenantId,
|
|
15412
|
+
challengeId: proof.challenge_id,
|
|
15413
|
+
otpCode: proof.otp_code,
|
|
15414
|
+
otpChannel: EMAIL_OTP_CHANNEL,
|
|
15415
|
+
ownerProofBindingDigest: operationBinding,
|
|
15416
|
+
operation: emailOtpOperation
|
|
15417
|
+
});
|
|
15418
|
+
if (!verified.ok) return {
|
|
15419
|
+
ok: false,
|
|
15420
|
+
response: json$1(verified, { status: verified.code === "invalid_body" ? 400 : 401 })
|
|
15421
|
+
};
|
|
15422
|
+
let verifiedChallengeId = verified.challengeId;
|
|
15423
|
+
if (!isExport) {
|
|
15424
|
+
const orgId = parseOrgId(input.operation.tenantId);
|
|
15425
|
+
const providerSubject = parseProviderSubject(proof.authority.factor.providerUserId);
|
|
15426
|
+
if (!orgId.ok) throw new Error(orgId.error.message);
|
|
15427
|
+
if (!providerSubject.ok) throw new Error(providerSubject.error.message);
|
|
15428
|
+
const consumed = await input.emailOtp.consumeEmailOtpGrant({
|
|
15429
|
+
subject: {
|
|
15430
|
+
kind: "provider_identity",
|
|
15431
|
+
orgId: orgId.value,
|
|
15432
|
+
providerSubject: providerSubject.value,
|
|
15433
|
+
walletId: input.walletId
|
|
15434
|
+
},
|
|
15435
|
+
loginGrant: verified.loginGrant,
|
|
15436
|
+
otpChannel: EMAIL_OTP_CHANNEL
|
|
15437
|
+
});
|
|
15438
|
+
if (!consumed.ok) return {
|
|
15439
|
+
ok: false,
|
|
15440
|
+
response: json$1(consumed, { status: consumed.code === "invalid_body" ? 400 : 401 })
|
|
15441
|
+
};
|
|
15442
|
+
verifiedChallengeId = consumed.challengeId;
|
|
15443
|
+
}
|
|
15444
|
+
const verificationReceiptDigest = parseDigestB64u(base64UrlEncode(await sha256BytesUtf8(alphabetizeStringify({
|
|
15445
|
+
challengeId: verifiedChallengeId,
|
|
15446
|
+
operationFingerprint: input.expectedChallenge
|
|
15447
|
+
}))));
|
|
15448
|
+
const verifiedAtMs = Date.now();
|
|
15449
|
+
const expiresAtMs = Math.min(input.expiresAtMs, verified.grantExpiresAtMs);
|
|
15450
|
+
if (expiresAtMs <= verifiedAtMs) return expiredStepUpFactor();
|
|
15451
|
+
const factorId = parseAuthFactorId(`email_otp:${proof.authority.factor.provider}:${proof.authority.factor.providerUserId}`);
|
|
15452
|
+
const challengeId = parseEmailOtpChallengeId(verifiedChallengeId);
|
|
15453
|
+
if (!factorId.ok) throw new Error(factorId.error.message);
|
|
15454
|
+
if (!challengeId.ok) throw new Error(challengeId.error.message);
|
|
15455
|
+
return {
|
|
15456
|
+
ok: true,
|
|
15457
|
+
factor: buildVerifiedWalletOperationEmailOtpFactorResult({
|
|
15458
|
+
tenantId: input.operation.tenantId,
|
|
15459
|
+
principalId: input.operation.principalId,
|
|
15460
|
+
walletId: input.walletId,
|
|
15461
|
+
requestOrigin: input.requestOrigin,
|
|
15462
|
+
audience: input.requestOrigin,
|
|
15463
|
+
factorId: factorId.value,
|
|
15464
|
+
authorityRef: input.authorityRef,
|
|
15465
|
+
operation: input.operation,
|
|
15466
|
+
challengeId: challengeId.value,
|
|
15467
|
+
verificationReceiptDigest,
|
|
15468
|
+
verifiedAtMs,
|
|
15469
|
+
expiresAtMs
|
|
15470
|
+
}),
|
|
15471
|
+
unseal: isExport ? {
|
|
15472
|
+
kind: "email_otp_grant",
|
|
15473
|
+
grant: verified.loginGrant,
|
|
15474
|
+
challenge_id: verified.challengeId
|
|
15475
|
+
} : { kind: "not_requested" }
|
|
15476
|
+
};
|
|
15477
|
+
}
|
|
15478
|
+
default: throw new Error("Unsupported ECDSA operation step-up proof");
|
|
15479
|
+
}
|
|
15480
|
+
}
|
|
15481
|
+
function expiredStepUpFactor() {
|
|
15482
|
+
return {
|
|
15483
|
+
ok: false,
|
|
15484
|
+
response: json$1({
|
|
15485
|
+
ok: false,
|
|
15486
|
+
code: "verified_step_up_rejected",
|
|
15487
|
+
message: "Operation step-up authorization expired"
|
|
15488
|
+
}, { status: 403 })
|
|
15489
|
+
};
|
|
15490
|
+
}
|
|
15491
|
+
//#endregion
|
|
15299
15492
|
//#region ../shared-ts/src/signing-lanes/recordParsers.ts
|
|
15300
15493
|
const WALLET_KEY_COMMON_FIELDS = [
|
|
15301
15494
|
"kind",
|
|
@@ -16057,7 +16250,6 @@ async function issueEcdsaOperationStepUpAuthorization(input) {
|
|
|
16057
16250
|
}, { status: 400 });
|
|
16058
16251
|
}
|
|
16059
16252
|
const expectedChallenge = await computeRouterAbEcdsaOperationStepUpChallengeB64u(operation);
|
|
16060
|
-
const nowMs = Date.now();
|
|
16061
16253
|
const requestId = operation.operation_id;
|
|
16062
16254
|
let freshMaterial;
|
|
16063
16255
|
if (v2Resolution.kind === "admitted") {
|
|
@@ -16098,112 +16290,24 @@ async function issueEcdsaOperationStepUpAuthorization(input) {
|
|
|
16098
16290
|
const evidenceSetId = requireAuthorizationValue$1(parseAuthorizationEvidenceSetId(`ecdsa-step-up-evidence-set:${requestId}`));
|
|
16099
16291
|
const expiresAtMs = operation.expires_at_ms;
|
|
16100
16292
|
const requestOrigin = authenticated.requestOrigin;
|
|
16101
|
-
|
|
16102
|
-
|
|
16103
|
-
|
|
16104
|
-
|
|
16105
|
-
|
|
16106
|
-
|
|
16107
|
-
|
|
16108
|
-
|
|
16109
|
-
|
|
16110
|
-
|
|
16111
|
-
|
|
16112
|
-
|
|
16113
|
-
|
|
16114
|
-
message: "Passkey credential changed"
|
|
16115
|
-
}, { status: 401 });
|
|
16116
|
-
const verified = await input.ctx.service.webAuthn.verifyWebAuthnAuthenticationLite({
|
|
16117
|
-
userId: authenticated.session.walletId,
|
|
16118
|
-
rpId: proof.authority.verifier.rpId,
|
|
16119
|
-
expectedChallenge,
|
|
16120
|
-
expected_origin: requestOrigin,
|
|
16121
|
-
webauthn_authentication: credential
|
|
16122
|
-
});
|
|
16123
|
-
if (!verified.success || !verified.verified) return json$1({
|
|
16124
|
-
ok: false,
|
|
16125
|
-
code: verified.code || "not_verified",
|
|
16126
|
-
message: verified.message || "WebAuthn authentication verification failed"
|
|
16127
|
-
}, { status: 401 });
|
|
16128
|
-
factor = buildVerifiedWalletOperationPasskeyFactorResult({
|
|
16129
|
-
tenantId: authenticated.session.tenantId,
|
|
16130
|
-
principalId: authenticated.session.principalId,
|
|
16131
|
-
walletId: walletIdFromString(authenticated.session.walletId),
|
|
16132
|
-
requestOrigin,
|
|
16133
|
-
audience: requestOrigin,
|
|
16134
|
-
factorId: requireAuthorizationValue$1(parseAuthFactorId(`passkey:${authenticated.session.laneAuthorization.authSource.credentialIdB64u}`)),
|
|
16135
|
-
authorityRef: authenticated.authorityRef,
|
|
16136
|
-
operation: envelope,
|
|
16137
|
-
credentialIdB64u: proof.authority.factor.credentialIdB64u,
|
|
16138
|
-
assertionDigest: parseDigestB64u(base64UrlEncode(await sha256BytesUtf8(alphabetizeStringify(credential)))),
|
|
16139
|
-
verifiedAtMs: nowMs,
|
|
16140
|
-
expiresAtMs
|
|
16141
|
-
});
|
|
16142
|
-
break;
|
|
16143
|
-
}
|
|
16144
|
-
case "email_otp": {
|
|
16145
|
-
const operationBinding = await hashEmailOtpOperationBinding({
|
|
16146
|
-
walletId: authenticated.session.walletId,
|
|
16147
|
-
providerUserId: proof.authority.factor.providerUserId,
|
|
16148
|
-
orgId: authenticated.session.tenantId,
|
|
16149
|
-
operation: operation.operation_kind === "evm.export_key" ? WALLET_EMAIL_OTP_EXPORT_OPERATION : WALLET_EMAIL_OTP_TRANSACTION_SIGN_OPERATION,
|
|
16150
|
-
requestOrigin,
|
|
16151
|
-
audience: requestOrigin,
|
|
16152
|
-
authorityRef: authenticated.authorityRef,
|
|
16153
|
-
...operation.operation_kind === "evm.sign_transaction" ? { operationFingerprintDigest: envelope.digests.laneDigest } : {}
|
|
16154
|
-
});
|
|
16155
|
-
const verified = await input.ctx.service.emailOtp.verifyEmailOtpChallenge({
|
|
16156
|
-
userId: proof.authority.factor.providerUserId,
|
|
16157
|
-
walletId: authenticated.session.walletId,
|
|
16158
|
-
orgId: authenticated.session.tenantId,
|
|
16159
|
-
challengeId: proof.challenge_id,
|
|
16160
|
-
otpCode: proof.otp_code,
|
|
16161
|
-
otpChannel: EMAIL_OTP_CHANNEL,
|
|
16162
|
-
ownerProofBindingDigest: operationBinding,
|
|
16163
|
-
operation: operation.operation_kind === "evm.export_key" ? WALLET_EMAIL_OTP_EXPORT_OPERATION : WALLET_EMAIL_OTP_TRANSACTION_SIGN_OPERATION
|
|
16164
|
-
});
|
|
16165
|
-
if (!verified.ok) return json$1(verified, { status: verified.code === "invalid_body" ? 400 : 401 });
|
|
16166
|
-
const consumed = operation.operation_kind === "evm.export_key" ? null : await input.ctx.service.emailOtp.consumeEmailOtpGrant({
|
|
16167
|
-
subject: {
|
|
16168
|
-
kind: "provider_identity",
|
|
16169
|
-
orgId: requireAuthorizationValue$1(parseOrgId(authenticated.session.tenantId)),
|
|
16170
|
-
providerSubject: requireAuthorizationValue$1(parseProviderSubject(proof.authority.factor.providerUserId)),
|
|
16171
|
-
walletId: walletIdFromString(authenticated.session.walletId)
|
|
16172
|
-
},
|
|
16173
|
-
loginGrant: verified.loginGrant,
|
|
16174
|
-
otpChannel: EMAIL_OTP_CHANNEL
|
|
16175
|
-
});
|
|
16176
|
-
if (consumed && !consumed.ok) return json$1(consumed, { status: consumed.code === "invalid_body" ? 400 : 401 });
|
|
16177
|
-
if (operation.operation_kind === "evm.export_key") emailOtpUnseal = {
|
|
16178
|
-
grant: verified.loginGrant,
|
|
16179
|
-
challengeId: verified.challengeId
|
|
16180
|
-
};
|
|
16181
|
-
const verifiedChallengeId = consumed?.ok ? consumed.challengeId : verified.challengeId;
|
|
16182
|
-
factor = buildVerifiedWalletOperationEmailOtpFactorResult({
|
|
16183
|
-
tenantId: authenticated.session.tenantId,
|
|
16184
|
-
principalId: authenticated.session.principalId,
|
|
16185
|
-
walletId: walletIdFromString(authenticated.session.walletId),
|
|
16186
|
-
requestOrigin,
|
|
16187
|
-
audience: requestOrigin,
|
|
16188
|
-
factorId: requireAuthorizationValue$1(parseAuthFactorId(`email_otp:${proof.authority.factor.provider}:${proof.authority.factor.providerUserId}`)),
|
|
16189
|
-
authorityRef: authenticated.authorityRef,
|
|
16190
|
-
operation: envelope,
|
|
16191
|
-
challengeId: requireAuthorizationValue$1(parseEmailOtpChallengeId(verifiedChallengeId)),
|
|
16192
|
-
verificationReceiptDigest: parseDigestB64u(base64UrlEncode(await sha256BytesUtf8(alphabetizeStringify({
|
|
16193
|
-
challengeId: verifiedChallengeId,
|
|
16194
|
-
operationFingerprint: expectedChallenge
|
|
16195
|
-
})))),
|
|
16196
|
-
verifiedAtMs: nowMs,
|
|
16197
|
-
expiresAtMs: Math.min(expiresAtMs, verified.grantExpiresAtMs)
|
|
16198
|
-
});
|
|
16199
|
-
break;
|
|
16200
|
-
}
|
|
16201
|
-
}
|
|
16293
|
+
const verifiedFactor = await verifyEcdsaOperationStepUpFactor({
|
|
16294
|
+
proof,
|
|
16295
|
+
operation: envelope,
|
|
16296
|
+
walletId: walletIdFromString(authenticated.session.walletId),
|
|
16297
|
+
authorityRef: authenticated.authorityRef,
|
|
16298
|
+
authSource: authenticated.session.laneAuthorization.authSource,
|
|
16299
|
+
requestOrigin,
|
|
16300
|
+
expectedChallenge,
|
|
16301
|
+
expiresAtMs,
|
|
16302
|
+
webAuthn: input.ctx.service.webAuthn,
|
|
16303
|
+
emailOtp: input.ctx.service.emailOtp
|
|
16304
|
+
});
|
|
16305
|
+
if (!verifiedFactor.ok) return verifiedFactor.response;
|
|
16202
16306
|
const evidenceSet = await input.ctx.service.authorizedOperations.recordVerifiedWalletOperationFactorEvidenceSet({
|
|
16203
16307
|
operation: envelope,
|
|
16204
16308
|
evidenceId,
|
|
16205
16309
|
evidenceSetId,
|
|
16206
|
-
factor
|
|
16310
|
+
factor: verifiedFactor.factor
|
|
16207
16311
|
});
|
|
16208
16312
|
const authorizedOperationId = requireAuthorizationValue$1(parseAuthorizedOperationId(`ecdsa-step-up-authorized-operation:${operation.operation_id}`));
|
|
16209
16313
|
const atomicOperation = await input.ctx.service.authorizedOperations.admitAuthorizedOperation({
|
|
@@ -16217,7 +16321,7 @@ async function issueEcdsaOperationStepUpAuthorization(input) {
|
|
|
16217
16321
|
evidenceSetDigest: evidenceSet.evidenceSetDigest
|
|
16218
16322
|
},
|
|
16219
16323
|
quota: { kind: "quota_neutral" },
|
|
16220
|
-
claimedAtMs:
|
|
16324
|
+
claimedAtMs: Date.now()
|
|
16221
16325
|
},
|
|
16222
16326
|
material: {
|
|
16223
16327
|
walletId: walletIdFromString(authenticated.session.walletId),
|
|
@@ -16250,11 +16354,7 @@ async function issueEcdsaOperationStepUpAuthorization(input) {
|
|
|
16250
16354
|
const responseAuthorization = {
|
|
16251
16355
|
kind: "operation_step_up",
|
|
16252
16356
|
evidence_set_digest: evidenceSet.evidenceSetDigest,
|
|
16253
|
-
unseal:
|
|
16254
|
-
kind: "email_otp_grant",
|
|
16255
|
-
grant: emailOtpUnseal.grant,
|
|
16256
|
-
challenge_id: emailOtpUnseal.challengeId
|
|
16257
|
-
} : { kind: "not_requested" }
|
|
16357
|
+
unseal: verifiedFactor.unseal
|
|
16258
16358
|
};
|
|
16259
16359
|
if (operation.operation_kind === "evm.export_key") {
|
|
16260
16360
|
const exportTopology = v2Resolution.kind === "admitted" && v2Resolution.operationKind === "evm.export_key" ? v2Resolution.exportTopology : await resolveStrictEcdsaExportTopology({
|
|
@@ -18829,7 +18929,12 @@ function bootstrapError(code, message, status) {
|
|
|
18829
18929
|
//#region src/router/transport/fetch/routes/syncAccount.ts
|
|
18830
18930
|
function syncAccountResponseStatus(result) {
|
|
18831
18931
|
if (result.ok && result.verified) return 200;
|
|
18832
|
-
|
|
18932
|
+
return syncAccountFailureStatus(result.code);
|
|
18933
|
+
}
|
|
18934
|
+
function syncAccountFailureStatus(code) {
|
|
18935
|
+
switch (code) {
|
|
18936
|
+
case "wallet_home_unavailable": return 503;
|
|
18937
|
+
case "wallet_home_conflict": return 409;
|
|
18833
18938
|
case "internal": return 500;
|
|
18834
18939
|
case "ed25519_not_provisioned": return 409;
|
|
18835
18940
|
default: return 400;
|
|
@@ -18859,7 +18964,7 @@ async function handleSyncAccount(ctx) {
|
|
|
18859
18964
|
const parsed = parseSyncAccountOptionsRequest(await readJson(ctx.request));
|
|
18860
18965
|
if (!parsed.ok) return json$1(parsed.body, { status: parsed.status });
|
|
18861
18966
|
const result = await ctx.service.webAuthn.createWebAuthnSyncAccountOptions(parsed.request);
|
|
18862
|
-
return json$1(result, { status: result.ok ? 200 : result.code
|
|
18967
|
+
return json$1(result, { status: result.ok ? 200 : syncAccountFailureStatus(result.code) });
|
|
18863
18968
|
}
|
|
18864
18969
|
if (ctx.pathname === "/sync-account/verify") {
|
|
18865
18970
|
const parsed = parseSyncAccountVerifyRequest({
|
|
@@ -21652,23 +21757,15 @@ function parseOptionalPositiveInteger(raw, fieldName) {
|
|
|
21652
21757
|
value: Math.floor(value)
|
|
21653
21758
|
};
|
|
21654
21759
|
}
|
|
21655
|
-
function parseAuthProviderAction(input) {
|
|
21656
|
-
const provider = normalizeOptionalTrimmedString(input.provider);
|
|
21657
|
-
const action = normalizeOptionalTrimmedString(input.action);
|
|
21658
|
-
if (provider === "passkey" && action === "options") return { kind: "passkey_options" };
|
|
21659
|
-
if (provider === "passkey" && action === "verify") return { kind: "passkey_verify" };
|
|
21660
|
-
if (provider === "google" && action === "options") return { kind: "google_options" };
|
|
21661
|
-
if (provider === "google" && action === "verify") return { kind: "google_verify" };
|
|
21662
|
-
if (provider === "github" && action === "options") return { kind: "github_options" };
|
|
21663
|
-
return null;
|
|
21664
|
-
}
|
|
21665
21760
|
function parseAuthProviderActionPath(pathname) {
|
|
21666
|
-
|
|
21667
|
-
|
|
21668
|
-
|
|
21669
|
-
|
|
21670
|
-
|
|
21671
|
-
|
|
21761
|
+
switch (pathname) {
|
|
21762
|
+
case "/auth/passkey/options": return { kind: "passkey_options" };
|
|
21763
|
+
case "/auth/passkey/verify": return { kind: "passkey_verify" };
|
|
21764
|
+
case "/auth/google/options": return { kind: "google_options" };
|
|
21765
|
+
case "/auth/google/verify": return { kind: "google_verify" };
|
|
21766
|
+
case "/auth/github/options": return { kind: "github_options" };
|
|
21767
|
+
default: return null;
|
|
21768
|
+
}
|
|
21672
21769
|
}
|
|
21673
21770
|
function parsePasskeyLoginOptionsRequest(raw) {
|
|
21674
21771
|
const body = requireJsonObject(raw);
|
|
@@ -21963,6 +22060,8 @@ async function handleAuth(ctx) {
|
|
|
21963
22060
|
const parsed = parsePasskeyLoginOptionsRequest(await readJson(ctx.request));
|
|
21964
22061
|
if (!parsed.ok) return json$1(parsed.body, { status: parsed.status });
|
|
21965
22062
|
const result = await ctx.service.webAuthn.createWebAuthnLoginOptions(parsed.request);
|
|
22063
|
+
if (result.code === "wallet_home_unavailable") return json$1(result, { status: 503 });
|
|
22064
|
+
if (result.code === "wallet_home_conflict") return json$1(result, { status: 409 });
|
|
21966
22065
|
return json$1(result, { status: result.ok ? 200 : result.code === "internal" ? 500 : 400 });
|
|
21967
22066
|
}
|
|
21968
22067
|
case "passkey_verify": {
|
|
@@ -22015,28 +22114,6 @@ async function handleAuth(ctx) {
|
|
|
22015
22114
|
}
|
|
22016
22115
|
}
|
|
22017
22116
|
//#endregion
|
|
22018
|
-
//#region src/router/transport/fetch/routes/nearPublicKeys.ts
|
|
22019
|
-
async function handleNearPublicKeys(ctx) {
|
|
22020
|
-
if (ctx.method !== "GET") return null;
|
|
22021
|
-
if (ctx.pathname !== "/near/public-keys") return null;
|
|
22022
|
-
try {
|
|
22023
|
-
const token = extractBearerCredential(ctx.request.headers);
|
|
22024
|
-
if (!token) return jsonFailure(401, "unauthorized", "No valid Wallet Session");
|
|
22025
|
-
const nowMs = Date.now();
|
|
22026
|
-
const exact = await ctx.service.authorizationSessions.readWalletSessionAuthorizationV2ByOperationCredential({
|
|
22027
|
-
tenantId: ctx.service.authorizationSessions.tenantId,
|
|
22028
|
-
token,
|
|
22029
|
-
nowMs
|
|
22030
|
-
});
|
|
22031
|
-
if (!exact) return jsonFailure(401, "unauthorized", "No valid Wallet Session");
|
|
22032
|
-
const result = await ctx.service.nearFunding.listNearPublicKeysForUser({ userId: String(exact.authorization.session.walletId) });
|
|
22033
|
-
if (!result.ok) return json$1(result, { status: result.code === "not_supported" ? 501 : result.code === "invalid_args" ? 400 : 500 });
|
|
22034
|
-
return json$1(result, { status: 200 });
|
|
22035
|
-
} catch (e) {
|
|
22036
|
-
return jsonFailure(500, "internal", e?.message || "Internal error");
|
|
22037
|
-
}
|
|
22038
|
-
}
|
|
22039
|
-
//#endregion
|
|
22040
22117
|
//#region src/router/framework/ror/normalize.ts
|
|
22041
22118
|
function sanitizeRorOrigins(origins) {
|
|
22042
22119
|
const list = Array.isArray(origins) ? origins : [];
|
|
@@ -22151,6 +22228,137 @@ async function handleWellKnown(ctx) {
|
|
|
22151
22228
|
});
|
|
22152
22229
|
}
|
|
22153
22230
|
//#endregion
|
|
22231
|
+
//#region src/router/transport/fetch/routes/deviceLinkingResponses.ts
|
|
22232
|
+
function projectLinkSessionStateV1(state) {
|
|
22233
|
+
switch (state.state) {
|
|
22234
|
+
case "displaying_qr": return { state: "displaying_qr" };
|
|
22235
|
+
case "claimed":
|
|
22236
|
+
case "awaiting_target_factor":
|
|
22237
|
+
case "awaiting_source_contribution":
|
|
22238
|
+
case "provisioning": return {
|
|
22239
|
+
state: state.state,
|
|
22240
|
+
deviceId: state.deviceId
|
|
22241
|
+
};
|
|
22242
|
+
case "authority_pending_local_install": return {
|
|
22243
|
+
state: "authority_pending_local_install",
|
|
22244
|
+
deviceId: state.deviceId,
|
|
22245
|
+
authorityId: state.authorityId,
|
|
22246
|
+
packageSetDigestB64u: state.packageSetDigestB64u
|
|
22247
|
+
};
|
|
22248
|
+
case "active": return {
|
|
22249
|
+
state: "active",
|
|
22250
|
+
deviceId: state.deviceId,
|
|
22251
|
+
authorityId: state.authorityId,
|
|
22252
|
+
activatedAtMs: state.activatedAtMs
|
|
22253
|
+
};
|
|
22254
|
+
case "failed_before_commit": return {
|
|
22255
|
+
state: "failed_before_commit",
|
|
22256
|
+
error: state.error
|
|
22257
|
+
};
|
|
22258
|
+
case "cancelled": return {
|
|
22259
|
+
state: "cancelled",
|
|
22260
|
+
cancelledAtMs: state.cancelledAtMs
|
|
22261
|
+
};
|
|
22262
|
+
case "expired": return {
|
|
22263
|
+
state: "expired",
|
|
22264
|
+
expiredAtMs: state.expiredAtMs
|
|
22265
|
+
};
|
|
22266
|
+
default: return assertNeverLinkSessionStateV1(state);
|
|
22267
|
+
}
|
|
22268
|
+
}
|
|
22269
|
+
function projectSession(record) {
|
|
22270
|
+
return {
|
|
22271
|
+
kind: "linked_device_session_projection_v1",
|
|
22272
|
+
linkSessionId: record.linkSessionId,
|
|
22273
|
+
qrPayload: record.qrPayload,
|
|
22274
|
+
revision: record.revision,
|
|
22275
|
+
createdAtMs: record.createdAtMs,
|
|
22276
|
+
updatedAtMs: record.updatedAtMs,
|
|
22277
|
+
state: projectLinkSessionStateV1(record.state)
|
|
22278
|
+
};
|
|
22279
|
+
}
|
|
22280
|
+
function invalidStateResponse(record) {
|
|
22281
|
+
return json$1({
|
|
22282
|
+
ok: false,
|
|
22283
|
+
outcome: "invalid_state",
|
|
22284
|
+
state: record.state.state,
|
|
22285
|
+
session: projectSession(record)
|
|
22286
|
+
}, { status: 409 });
|
|
22287
|
+
}
|
|
22288
|
+
function sessionProjectionResponse(record, outcome) {
|
|
22289
|
+
return json$1({
|
|
22290
|
+
ok: true,
|
|
22291
|
+
outcome,
|
|
22292
|
+
session: projectSession(record)
|
|
22293
|
+
}, { status: 200 });
|
|
22294
|
+
}
|
|
22295
|
+
function targetCredentialResultResponse(record, outcome, targetCredential) {
|
|
22296
|
+
return json$1({
|
|
22297
|
+
ok: true,
|
|
22298
|
+
outcome,
|
|
22299
|
+
targetCredential,
|
|
22300
|
+
session: projectSession(record)
|
|
22301
|
+
}, { status: 200 });
|
|
22302
|
+
}
|
|
22303
|
+
function exportRootWriteResponse(result) {
|
|
22304
|
+
return result.outcome === "conflict" ? json$1({
|
|
22305
|
+
ok: false,
|
|
22306
|
+
code: result.reason ?? "conflict",
|
|
22307
|
+
message: "export-root relay conflict"
|
|
22308
|
+
}, { status: 409 }) : json$1({
|
|
22309
|
+
ok: true,
|
|
22310
|
+
outcome: result.outcome
|
|
22311
|
+
}, { status: 200 });
|
|
22312
|
+
}
|
|
22313
|
+
function invalidInputResponse(message) {
|
|
22314
|
+
return json$1({
|
|
22315
|
+
ok: false,
|
|
22316
|
+
outcome: "invalid_input",
|
|
22317
|
+
code: "invalid_input",
|
|
22318
|
+
message
|
|
22319
|
+
}, { status: 400 });
|
|
22320
|
+
}
|
|
22321
|
+
function notSupportedResponse(message = "Device linking is not configured") {
|
|
22322
|
+
return json$1({
|
|
22323
|
+
ok: false,
|
|
22324
|
+
code: "not_supported",
|
|
22325
|
+
message
|
|
22326
|
+
}, { status: 501 });
|
|
22327
|
+
}
|
|
22328
|
+
function notFoundResponse() {
|
|
22329
|
+
return json$1({
|
|
22330
|
+
ok: false,
|
|
22331
|
+
code: "not_found",
|
|
22332
|
+
message: "Linked-device session not found"
|
|
22333
|
+
}, { status: 404 });
|
|
22334
|
+
}
|
|
22335
|
+
function methodNotAllowedResponse$2() {
|
|
22336
|
+
return json$1({
|
|
22337
|
+
ok: false,
|
|
22338
|
+
code: "method_not_allowed",
|
|
22339
|
+
message: "Method is not allowed"
|
|
22340
|
+
}, { status: 405 });
|
|
22341
|
+
}
|
|
22342
|
+
function authDeniedResponse$2(result) {
|
|
22343
|
+
if (result.code === "unavailable") return json$1({
|
|
22344
|
+
ok: false,
|
|
22345
|
+
code: result.code,
|
|
22346
|
+
message: result.message
|
|
22347
|
+
}, { status: 503 });
|
|
22348
|
+
return json$1({
|
|
22349
|
+
ok: false,
|
|
22350
|
+
outcome: "unauthorized",
|
|
22351
|
+
code: result.code,
|
|
22352
|
+
message: result.message
|
|
22353
|
+
}, { status: result.code === "expired" ? 410 : 401 });
|
|
22354
|
+
}
|
|
22355
|
+
//#endregion
|
|
22356
|
+
//#region src/core/deviceLinking/linkedDeviceBootstrap.ts
|
|
22357
|
+
function linkedDeviceBootstrapFailure(error) {
|
|
22358
|
+
if (error && typeof error === "object" && "code" in error && (error.code === "home_conflict" || error.code === "home_unavailable")) return error.code;
|
|
22359
|
+
return null;
|
|
22360
|
+
}
|
|
22361
|
+
//#endregion
|
|
22154
22362
|
//#region ../shared-ts/src/utils/exactKeys.ts
|
|
22155
22363
|
/**
|
|
22156
22364
|
* True when `value` is a non-array object whose own enumerable string keys are exactly `keys`.
|
|
@@ -22272,6 +22480,11 @@ async function handleDeviceLinking(ctx) {
|
|
|
22272
22480
|
default: return assertNever$1(action);
|
|
22273
22481
|
}
|
|
22274
22482
|
} catch (error) {
|
|
22483
|
+
const bootstrapFailure = linkedDeviceBootstrapFailure(error);
|
|
22484
|
+
if (bootstrapFailure) return sessionResultResponse({
|
|
22485
|
+
outcome: bootstrapFailure,
|
|
22486
|
+
message: "Linked-device bootstrap authority failed"
|
|
22487
|
+
});
|
|
22275
22488
|
if (error instanceof DeviceLinkingInputError) return invalidInputResponse(error.message);
|
|
22276
22489
|
return json$1({
|
|
22277
22490
|
ok: false,
|
|
@@ -22283,7 +22496,7 @@ async function handleDeviceLinking(ctx) {
|
|
|
22283
22496
|
async function handleCreate(ctx, service, nowMs) {
|
|
22284
22497
|
if (ctx.method !== "POST") return methodNotAllowedResponse$2();
|
|
22285
22498
|
const bodyDigestB64u = await requestBodyDigest$1(ctx.request);
|
|
22286
|
-
const rawBody = await
|
|
22499
|
+
const rawBody = await readJson(ctx.request);
|
|
22287
22500
|
const body = parseBoundary$1(() => parseCreateRequest(rawBody));
|
|
22288
22501
|
const keyDigest = await computeDevicePublicKeyDigestB64u(body.payload.devicePublicKeyB64u);
|
|
22289
22502
|
const proof = parseBoundary$1(() => parseRequestProofHeader(ctx.request));
|
|
@@ -22360,7 +22573,7 @@ async function handleApproval(ctx, service, rawLinkSessionId, nowMs) {
|
|
|
22360
22573
|
});
|
|
22361
22574
|
if (!session) return notFoundResponse();
|
|
22362
22575
|
const ownerMismatch = requireOwnerMatchesClaimedWallet(authentication.owner, session);
|
|
22363
|
-
if (ownerMismatch) return ownerMismatch;
|
|
22576
|
+
if (ownerMismatch) return authDeniedResponse$2(ownerMismatch);
|
|
22364
22577
|
if (authentication.owner.walletId !== approval.walletId) return authDeniedResponse$2({
|
|
22365
22578
|
kind: "denied",
|
|
22366
22579
|
code: "unauthorized",
|
|
@@ -22444,6 +22657,7 @@ async function handleCredential(ctx, service, rawLinkSessionId, nowMs) {
|
|
|
22444
22657
|
async function handleSourceContributionPreparation(ctx, service, rawLinkSessionId, nowMs) {
|
|
22445
22658
|
const owner = await authenticateOwnerForSession(ctx, service, parseSessionId(rawLinkSessionId), nowMs);
|
|
22446
22659
|
if (owner.kind !== "authorized") return ownerSessionResponse(owner);
|
|
22660
|
+
if (isLinkSessionTerminalFailureV1(owner.session.state)) return invalidStateResponse(owner.session);
|
|
22447
22661
|
if (ctx.method !== "GET") return methodNotAllowedResponse$2();
|
|
22448
22662
|
const preparation = owner.session.sourceContributionPreparation;
|
|
22449
22663
|
if (!preparation) return new Response(null, { status: 204 });
|
|
@@ -22494,10 +22708,6 @@ async function handleSourceContribution(ctx, service, rawLinkSessionId, nowMs) {
|
|
|
22494
22708
|
}));
|
|
22495
22709
|
return sessionProjectionResponse(committed.session, committed.kind === "replayed" ? "replayed" : recorded.outcome);
|
|
22496
22710
|
}
|
|
22497
|
-
/**
|
|
22498
|
-
* A precommit failure's reason is a single token. The installer's message
|
|
22499
|
-
* keeps its words, joined, so the session still says what failed.
|
|
22500
|
-
*/
|
|
22501
22711
|
function precommitFailureReasonV1(message) {
|
|
22502
22712
|
const token = message.trim().replace(/\s+/g, "_").replace(/[\u0000-\u001f\u007f]/g, "");
|
|
22503
22713
|
return token.length > 0 ? token : "authority_commit_failed";
|
|
@@ -22506,6 +22716,7 @@ async function handleSourceContributionExecute(ctx, service, rawLinkSessionId, n
|
|
|
22506
22716
|
if (ctx.method !== "POST") return methodNotAllowedResponse$2();
|
|
22507
22717
|
const owner = await authenticateOwnerForSession(ctx, service, parseSessionId(rawLinkSessionId), nowMs);
|
|
22508
22718
|
if (owner.kind !== "authorized") return ownerSessionResponse(owner);
|
|
22719
|
+
if (isLinkSessionTerminalFailureV1(owner.session.state)) return invalidStateResponse(owner.session);
|
|
22509
22720
|
const router = service.sourceContributionRouter;
|
|
22510
22721
|
if (!router) return notSupportedResponse("Ed25519 source-preserving linking is not configured");
|
|
22511
22722
|
const preparation = requireEd25519SourceContributionPreparation(owner.session);
|
|
@@ -22578,8 +22789,6 @@ async function handleEmailOtpBaseFactor(ctx, service, rawLinkSessionId, nowMs) {
|
|
|
22578
22789
|
const authenticated = await authenticateOwnerForSession(ctx, service, parseSessionId(rawLinkSessionId), nowMs);
|
|
22579
22790
|
if (authenticated.kind !== "authorized") return ownerSessionResponse(authenticated);
|
|
22580
22791
|
const session = authenticated.session;
|
|
22581
|
-
const ownerMismatch = requireOwnerMatchesClaimedWallet(authenticated.owner, session);
|
|
22582
|
-
if (ownerMismatch) return ownerMismatch;
|
|
22583
22792
|
if (session.state.state !== "claimed" || session.qrPayload.targetFactor.kind !== "email_otp" || !session.claimTranscript) return invalidStateResponse(session);
|
|
22584
22793
|
const walletId = session.claimTranscript.value.walletId;
|
|
22585
22794
|
const request = parseBoundary$1(() => parseLinkedDeviceEmailOtpBaseFactorRequestV1(authenticated.body));
|
|
@@ -22607,8 +22816,6 @@ async function handleOwnerCancel(ctx, service, rawLinkSessionId, nowMs) {
|
|
|
22607
22816
|
if (authenticated.kind !== "authorized") return ownerSessionResponse(authenticated);
|
|
22608
22817
|
parseBoundary$1(() => parseOwnerCancelRequest(authenticated.body));
|
|
22609
22818
|
const session = authenticated.session;
|
|
22610
|
-
const ownerMismatch = requireOwnerMatchesClaimedWallet(authenticated.owner, session);
|
|
22611
|
-
if (ownerMismatch) return ownerMismatch;
|
|
22612
22819
|
if (session.state.state === "cancelled") return sessionProjectionResponse(session, "replayed");
|
|
22613
22820
|
return sessionResultResponse(await service.sessionService.cancelSessionV1({
|
|
22614
22821
|
linkSessionId,
|
|
@@ -22656,6 +22863,7 @@ async function handleExportRootRecipient(ctx, service, rawLinkSessionId, nowMs)
|
|
|
22656
22863
|
if (ctx.method === "GET") {
|
|
22657
22864
|
const owner = await authenticateOwnerForSession(ctx, service, sessionId, nowMs);
|
|
22658
22865
|
if (owner.kind !== "authorized") return ownerSessionResponse(owner);
|
|
22866
|
+
if (isLinkSessionTerminalFailureV1(owner.session.state)) return invalidStateResponse(owner.session);
|
|
22659
22867
|
const transfer = await port.readTransferV1(sessionId);
|
|
22660
22868
|
return transfer ? json$1(transfer.recipient, { status: 200 }) : new Response(null, { status: 204 });
|
|
22661
22869
|
}
|
|
@@ -22663,8 +22871,14 @@ async function handleExportRootRecipient(ctx, service, rawLinkSessionId, nowMs)
|
|
|
22663
22871
|
const authenticated = await authenticateDeviceForSession(ctx, service, rawLinkSessionId, nowMs);
|
|
22664
22872
|
if (authenticated.kind === "denied") return authDeniedResponse$2(authenticated);
|
|
22665
22873
|
if (authenticated.kind === "not_found") return notFoundResponse();
|
|
22874
|
+
if (isLinkSessionTerminalFailureV1(authenticated.session.state)) return invalidStateResponse(authenticated.session);
|
|
22666
22875
|
const recipient = parseBoundary$1(() => parseLinkedDeviceEd25519ExportRootRecipientV1(authenticated.body));
|
|
22667
22876
|
if (recipient.linkSessionId !== authenticated.linkSessionId) return invalidInputResponse("link session id does not match route");
|
|
22877
|
+
const session = authenticated.session;
|
|
22878
|
+
const preparation = await readTargetPreparation(service, session, requireApproval(session), { access: "replay_only" }, nowMs);
|
|
22879
|
+
if (preparation.kind === "conflict") return invalidStateResponse(session);
|
|
22880
|
+
const facts = preparation.ed25519ExportRoot;
|
|
22881
|
+
if (!facts || recipient.walletId !== preparation.walletId || recipient.enrollmentId !== preparation.enrollmentId || recipient.deviceId !== preparation.deviceId || recipient.targetFactor.kind !== preparation.targetFactor.kind || recipient.walletKeyId !== facts.walletKeyId || recipient.revocationEpoch !== facts.revocationEpoch || recipient.applicationBindingDigestB64u !== facts.applicationBindingDigestB64u || recipient.registeredPublicKeyB64u !== facts.registeredPublicKeyB64u) return invalidInputResponse("export-root recipient does not match target preparation");
|
|
22668
22882
|
return exportRootWriteResponse(await port.registerRecipientV1({ recipient }));
|
|
22669
22883
|
}
|
|
22670
22884
|
async function handleExportRootPackage(ctx, service, rawLinkSessionId, nowMs) {
|
|
@@ -22675,12 +22889,14 @@ async function handleExportRootPackage(ctx, service, rawLinkSessionId, nowMs) {
|
|
|
22675
22889
|
const authenticated = await authenticateDeviceForSession(ctx, service, rawLinkSessionId, nowMs);
|
|
22676
22890
|
if (authenticated.kind === "denied") return authDeniedResponse$2(authenticated);
|
|
22677
22891
|
if (authenticated.kind === "not_found") return notFoundResponse();
|
|
22892
|
+
if (isLinkSessionTerminalFailureV1(authenticated.session.state)) return invalidStateResponse(authenticated.session);
|
|
22678
22893
|
const transfer = await port.readTransferV1(sessionId);
|
|
22679
22894
|
return transfer?.state === "sealed" ? json$1(transfer.package, { status: 200 }) : new Response(null, { status: 204 });
|
|
22680
22895
|
}
|
|
22681
22896
|
if (ctx.method !== "POST") return methodNotAllowedResponse$2();
|
|
22682
22897
|
const owner = await authenticateOwnerForSession(ctx, service, sessionId, nowMs);
|
|
22683
22898
|
if (owner.kind !== "authorized") return ownerSessionResponse(owner);
|
|
22899
|
+
if (isLinkSessionTerminalFailureV1(owner.session.state)) return invalidStateResponse(owner.session);
|
|
22684
22900
|
const submission = parseBoundary$1(() => parseLinkedDeviceEd25519ExportRootSubmissionV1(owner.body));
|
|
22685
22901
|
if (submission.linkSessionId !== sessionId) return invalidInputResponse("link session id does not match route");
|
|
22686
22902
|
return exportRootWriteResponse(await port.submitPackageV1({
|
|
@@ -22692,7 +22908,7 @@ async function handleReceipt(ctx, service, rawLinkSessionId, nowMs) {
|
|
|
22692
22908
|
if (!service.installationReceipt) return notSupportedResponse("Installation receipt is not configured");
|
|
22693
22909
|
if (ctx.method !== "POST") return methodNotAllowedResponse$2();
|
|
22694
22910
|
const linkSessionId = parseSessionId(rawLinkSessionId);
|
|
22695
|
-
const rawBody = await
|
|
22911
|
+
const rawBody = await readJson(ctx.request.clone());
|
|
22696
22912
|
if (isFinalActivationAcknowledgement(rawBody)) {
|
|
22697
22913
|
const acknowledgement = parseBoundary$1(() => parseLocalAuthorityActivationFinalAckV1(rawBody));
|
|
22698
22914
|
if (acknowledgement.linkSessionId !== linkSessionId) return invalidInputResponse("activation acknowledgement session does not match the route");
|
|
@@ -22878,6 +23094,8 @@ async function authenticateOwnerForSession(ctx, service, linkSessionId, nowMs) {
|
|
|
22878
23094
|
});
|
|
22879
23095
|
if (!session) return { kind: "not_found" };
|
|
22880
23096
|
validateOwnerRequestBinding(authentication.binding, ctx, bodyDigestB64u, nowMs);
|
|
23097
|
+
const ownerMismatch = requireOwnerMatchesClaimedWallet(authentication.owner, session);
|
|
23098
|
+
if (ownerMismatch) return ownerMismatch;
|
|
22881
23099
|
return {
|
|
22882
23100
|
kind: "authorized",
|
|
22883
23101
|
body: authentication.body,
|
|
@@ -23082,69 +23300,6 @@ async function authenticateTargetPasskeyOriginV1(ctx, routeId) {
|
|
|
23082
23300
|
expectedOrigin
|
|
23083
23301
|
};
|
|
23084
23302
|
}
|
|
23085
|
-
function projectLinkSessionStateV1(state) {
|
|
23086
|
-
switch (state.state) {
|
|
23087
|
-
case "displaying_qr": return { state: "displaying_qr" };
|
|
23088
|
-
case "claimed":
|
|
23089
|
-
case "awaiting_target_factor":
|
|
23090
|
-
case "awaiting_source_contribution":
|
|
23091
|
-
case "provisioning": return {
|
|
23092
|
-
state: state.state,
|
|
23093
|
-
deviceId: state.deviceId
|
|
23094
|
-
};
|
|
23095
|
-
case "authority_pending_local_install": return {
|
|
23096
|
-
state: "authority_pending_local_install",
|
|
23097
|
-
deviceId: state.deviceId,
|
|
23098
|
-
authorityId: state.authorityId,
|
|
23099
|
-
packageSetDigestB64u: state.packageSetDigestB64u
|
|
23100
|
-
};
|
|
23101
|
-
case "active": return {
|
|
23102
|
-
state: "active",
|
|
23103
|
-
deviceId: state.deviceId,
|
|
23104
|
-
authorityId: state.authorityId,
|
|
23105
|
-
activatedAtMs: state.activatedAtMs
|
|
23106
|
-
};
|
|
23107
|
-
case "failed_before_commit": return {
|
|
23108
|
-
state: "failed_before_commit",
|
|
23109
|
-
error: state.error
|
|
23110
|
-
};
|
|
23111
|
-
case "cancelled": return {
|
|
23112
|
-
state: "cancelled",
|
|
23113
|
-
cancelledAtMs: state.cancelledAtMs
|
|
23114
|
-
};
|
|
23115
|
-
case "expired": return {
|
|
23116
|
-
state: "expired",
|
|
23117
|
-
expiredAtMs: state.expiredAtMs
|
|
23118
|
-
};
|
|
23119
|
-
default: return assertNeverLinkSessionStateV1(state);
|
|
23120
|
-
}
|
|
23121
|
-
}
|
|
23122
|
-
function projectSession(record) {
|
|
23123
|
-
return {
|
|
23124
|
-
kind: "linked_device_session_projection_v1",
|
|
23125
|
-
linkSessionId: record.linkSessionId,
|
|
23126
|
-
qrPayload: record.qrPayload,
|
|
23127
|
-
revision: record.revision,
|
|
23128
|
-
createdAtMs: record.createdAtMs,
|
|
23129
|
-
updatedAtMs: record.updatedAtMs,
|
|
23130
|
-
state: projectLinkSessionStateV1(record.state)
|
|
23131
|
-
};
|
|
23132
|
-
}
|
|
23133
|
-
function sessionProjectionResponse(record, outcome) {
|
|
23134
|
-
return json$1({
|
|
23135
|
-
ok: true,
|
|
23136
|
-
outcome,
|
|
23137
|
-
session: projectSession(record)
|
|
23138
|
-
}, { status: 200 });
|
|
23139
|
-
}
|
|
23140
|
-
function targetCredentialResultResponse(record, outcome, targetCredential) {
|
|
23141
|
-
return json$1({
|
|
23142
|
-
ok: true,
|
|
23143
|
-
outcome,
|
|
23144
|
-
targetCredential,
|
|
23145
|
-
session: projectSession(record)
|
|
23146
|
-
}, { status: 200 });
|
|
23147
|
-
}
|
|
23148
23303
|
function claimResultResponse(result) {
|
|
23149
23304
|
if (result.outcome !== "applied" && result.outcome !== "replayed") return sessionResultResponse(result);
|
|
23150
23305
|
const claim = result.record.claimTranscript?.value;
|
|
@@ -23173,6 +23328,16 @@ function approvalResultResponse(result) {
|
|
|
23173
23328
|
}
|
|
23174
23329
|
function sessionResultResponse(result) {
|
|
23175
23330
|
switch (result.outcome) {
|
|
23331
|
+
case "home_conflict": return json$1({
|
|
23332
|
+
ok: false,
|
|
23333
|
+
code: "wallet_home_conflict",
|
|
23334
|
+
message: result.message
|
|
23335
|
+
}, { status: 409 });
|
|
23336
|
+
case "home_unavailable": return json$1({
|
|
23337
|
+
ok: false,
|
|
23338
|
+
code: "wallet_home_unavailable",
|
|
23339
|
+
message: result.message
|
|
23340
|
+
}, { status: 503 });
|
|
23176
23341
|
case "applied":
|
|
23177
23342
|
case "replayed": return sessionProjectionResponse(result.record, result.outcome);
|
|
23178
23343
|
case "conflict": return json$1({
|
|
@@ -23213,49 +23378,19 @@ function sessionResultResponse(result) {
|
|
|
23213
23378
|
default: return assertNever$1(result);
|
|
23214
23379
|
}
|
|
23215
23380
|
}
|
|
23216
|
-
function invalidStateResponse(record) {
|
|
23217
|
-
return json$1({
|
|
23218
|
-
ok: false,
|
|
23219
|
-
outcome: "invalid_state",
|
|
23220
|
-
state: record.state.state,
|
|
23221
|
-
session: projectSession(record)
|
|
23222
|
-
}, { status: 409 });
|
|
23223
|
-
}
|
|
23224
|
-
function exportRootWriteResponse(result) {
|
|
23225
|
-
return result.outcome === "conflict" ? json$1({
|
|
23226
|
-
ok: false,
|
|
23227
|
-
code: result.reason ?? "conflict",
|
|
23228
|
-
message: "export-root relay conflict"
|
|
23229
|
-
}, { status: 409 }) : json$1({
|
|
23230
|
-
ok: true,
|
|
23231
|
-
outcome: result.outcome
|
|
23232
|
-
}, { status: 200 });
|
|
23233
|
-
}
|
|
23234
23381
|
function ownerSessionResponse(context) {
|
|
23235
23382
|
return context.kind === "denied" ? authDeniedResponse$2(context) : notFoundResponse();
|
|
23236
23383
|
}
|
|
23237
|
-
/**
|
|
23238
|
-
* The one owner-to-session binding, shared by every owner route on a claimed
|
|
23239
|
-
* session. It runs before any state is disclosed: an authenticated owner of a
|
|
23240
|
-
* DIFFERENT wallet must get the same denial for every state, not a projection
|
|
23241
|
-
* or an invalid-state body. An unclaimed session has no wallet to bind to yet,
|
|
23242
|
-
* so the caller's state checks answer instead.
|
|
23243
|
-
*/
|
|
23244
23384
|
function requireOwnerMatchesClaimedWallet(owner, session) {
|
|
23245
23385
|
const claimWalletId = session.claimTranscript?.value.walletId;
|
|
23246
23386
|
if (claimWalletId === void 0) return null;
|
|
23247
23387
|
if (owner.walletId === claimWalletId) return null;
|
|
23248
|
-
return
|
|
23388
|
+
return {
|
|
23249
23389
|
kind: "denied",
|
|
23250
23390
|
code: "unauthorized",
|
|
23251
23391
|
message: "owner session does not match link wallet"
|
|
23252
|
-
}
|
|
23392
|
+
};
|
|
23253
23393
|
}
|
|
23254
|
-
/**
|
|
23255
|
-
* Approval-time revalidation of the selected Email OTP base method. The same
|
|
23256
|
-
* eligibility question the dedicated base-factor route answers, asked once
|
|
23257
|
-
* more with the id the approval names, so the two paths cannot drift.
|
|
23258
|
-
*/
|
|
23259
23394
|
async function requireSelectedEmailOtpBaseFactorV1(service, session, input) {
|
|
23260
23395
|
const provider = service.emailOtpTargetFactor;
|
|
23261
23396
|
if (!provider) return notSupportedResponse("Email OTP linking is not configured");
|
|
@@ -23274,43 +23409,6 @@ async function requireSelectedEmailOtpBaseFactorV1(service, session, input) {
|
|
|
23274
23409
|
});
|
|
23275
23410
|
return null;
|
|
23276
23411
|
}
|
|
23277
|
-
function authDeniedResponse$2(result) {
|
|
23278
|
-
return json$1({
|
|
23279
|
-
ok: false,
|
|
23280
|
-
outcome: "unauthorized",
|
|
23281
|
-
code: result.code,
|
|
23282
|
-
message: result.message
|
|
23283
|
-
}, { status: result.code === "expired" ? 410 : 401 });
|
|
23284
|
-
}
|
|
23285
|
-
function invalidInputResponse(message) {
|
|
23286
|
-
return json$1({
|
|
23287
|
-
ok: false,
|
|
23288
|
-
outcome: "invalid_input",
|
|
23289
|
-
code: "invalid_input",
|
|
23290
|
-
message
|
|
23291
|
-
}, { status: 400 });
|
|
23292
|
-
}
|
|
23293
|
-
function notSupportedResponse(message = "Device linking is not configured") {
|
|
23294
|
-
return json$1({
|
|
23295
|
-
ok: false,
|
|
23296
|
-
code: "not_supported",
|
|
23297
|
-
message
|
|
23298
|
-
}, { status: 501 });
|
|
23299
|
-
}
|
|
23300
|
-
function notFoundResponse() {
|
|
23301
|
-
return json$1({
|
|
23302
|
-
ok: false,
|
|
23303
|
-
code: "not_found",
|
|
23304
|
-
message: "Linked-device session not found"
|
|
23305
|
-
}, { status: 404 });
|
|
23306
|
-
}
|
|
23307
|
-
function methodNotAllowedResponse$2() {
|
|
23308
|
-
return json$1({
|
|
23309
|
-
ok: false,
|
|
23310
|
-
code: "method_not_allowed",
|
|
23311
|
-
message: "Method is not allowed"
|
|
23312
|
-
}, { status: 405 });
|
|
23313
|
-
}
|
|
23314
23412
|
function parseCreateRequest(raw) {
|
|
23315
23413
|
const record = requireRecord(raw, "device-linking create request");
|
|
23316
23414
|
requireExactKeys$1(record, ["kind", "payload"]);
|
|
@@ -23375,9 +23473,6 @@ function parseB64uBytes(raw, field) {
|
|
|
23375
23473
|
if (bytes.length === 0 || base64UrlEncode(bytes) !== raw) throw new Error(`${field} is not canonical base64url`);
|
|
23376
23474
|
return bytes;
|
|
23377
23475
|
}
|
|
23378
|
-
async function readJsonBody(request) {
|
|
23379
|
-
return await readJson(request);
|
|
23380
|
-
}
|
|
23381
23476
|
function parseBoundary$1(parse) {
|
|
23382
23477
|
try {
|
|
23383
23478
|
return parse();
|
|
@@ -23924,7 +24019,8 @@ function methodNotAllowedResponse() {
|
|
|
23924
24019
|
}, { status: 405 });
|
|
23925
24020
|
}
|
|
23926
24021
|
function authDeniedResponse(value) {
|
|
23927
|
-
|
|
24022
|
+
if (value.code === "unavailable") return jsonFailure(503, value.code, value.message);
|
|
24023
|
+
return jsonFailure(value.code === "invalid" ? 403 : 401, value.code, value.message);
|
|
23928
24024
|
}
|
|
23929
24025
|
//#endregion
|
|
23930
24026
|
//#region src/threshold/session/signingSessionSeal/transport/fetch.ts
|
|
@@ -24330,7 +24426,6 @@ function createFetchRouter(service, opts, runtime) {
|
|
|
24330
24426
|
handleThresholdEcdsa,
|
|
24331
24427
|
handleExactWalletSigningSessionSeal,
|
|
24332
24428
|
handleWebAuthnAuthenticators,
|
|
24333
|
-
handleNearPublicKeys,
|
|
24334
24429
|
handleExactWalletSessionStatus,
|
|
24335
24430
|
handleHostedWalletSessionExchangeIssue,
|
|
24336
24431
|
handleHostedWalletSessionExchangeRedeem,
|
|
@@ -25938,8 +26033,8 @@ function resolveTraceContext(request) {
|
|
|
25938
26033
|
var InMemoryRouterAbEd25519YaoExportStateV1 = class {
|
|
25939
26034
|
constructor() {
|
|
25940
26035
|
this.exports = /* @__PURE__ */ new Map();
|
|
25941
|
-
this.
|
|
25942
|
-
this.
|
|
26036
|
+
this.authorizationNonceOwners = /* @__PURE__ */ new Map();
|
|
26037
|
+
this.authorizationUncertainOwners = /* @__PURE__ */ new Map();
|
|
25943
26038
|
}
|
|
25944
26039
|
};
|
|
25945
26040
|
const ROUTES = Object.freeze([defineRoute({
|