@seams/wallet-server 0.8.0 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD_PARTY_NOTICES.md +7 -1
- package/artifact-manifest.json +196 -41
- 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/migrations/deriver-a/0019_wallet_object_addresses.sql +10 -0
- package/cloudflare-router-ab/migrations/deriver-b/0019_wallet_object_addresses.sql +10 -0
- package/cloudflare-router-ab/scripts/prepare-local-runtime-config.mjs +3 -117
- package/cloudflare-router-ab/wrangler.deriver-a.toml +0 -8
- package/cloudflare-router-ab/wrangler.deriver-b.toml +24 -8
- package/cloudflare-router-ab/wrangler.router.toml +0 -2
- package/cloudflare-router-ab/wrangler.signing-worker.toml +29 -0
- package/dist/esm/authorization/domain.js +3 -2
- package/dist/esm/authorization/ed25519WalletSessionAdmission.js +0 -0
- package/dist/esm/authorization/service.js +64 -36
- package/dist/esm/cloud-host.js +24 -19
- package/dist/esm/core/EmailOtpRecords.js +29 -6
- package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.js +2 -0
- package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPresignBridge.js +10 -0
- package/dist/esm/core/ThresholdService/routerAb/internalServiceHttp.js +1 -0
- package/dist/esm/core/ThresholdService/validation.js +2 -2
- package/dist/esm/core/authService/nearPrivateKeySigning.js +1 -1
- package/dist/esm/core/authService/webauthn.js +1 -1
- package/dist/esm/core/d1Ed25519SignerRead.js +55 -0
- package/dist/esm/core/d1WalletStore.js +14 -11
- package/dist/esm/core/deviceLinking/linkedDeviceEmailOtpGrant.js +2 -2
- package/dist/esm/core/deviceLinking/linkedDeviceManagement.js +1 -1
- package/dist/esm/core/deviceLinking/linkedDeviceSessionRecord.js +2 -2
- package/dist/esm/core/emailOtpD1Statements.js +1 -0
- package/dist/esm/core/nearRelayerAccountProvisioning.js +1 -1
- package/dist/esm/core/routerAbSigning/RouterAbEcdsaPresignRuntime.js +4 -0
- package/dist/esm/core/signingLanes/WalletExecutionLaneProjection.js +1 -1
- package/dist/esm/core/signingMaterial/ordinaryInactiveSignerMaterialReservation.js +1 -0
- package/dist/esm/hosted-wallet-gateway.js +93 -10
- package/dist/esm/localHostedWalletGatewayHandler.js +12 -9
- package/dist/esm/localIntendedYaoSigningFault.js +2 -30
- package/dist/esm/localRegistrationSetupAuthority.js +8 -1
- package/dist/esm/router/auth/commonRouterUtils.js +17 -10
- package/dist/esm/router/auth/routerApiCredentialAuth.js +26 -7
- package/dist/esm/router/auth/walletRegistrationContext.js +49 -0
- package/dist/esm/router/auth/webAuthnCredentialCodecs.js +1 -1
- package/dist/esm/router/cloudflare/d1/auth/d1AuthorizationAssembly.js +4 -3
- package/dist/esm/router/cloudflare/d1/auth/d1AuthorizedOperationRouteService.js +2 -0
- package/dist/esm/router/cloudflare/d1/auth/d1EmailOtpRouteService.js +25 -0
- package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthConfig.js +14 -6
- package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthService.js +44 -40
- package/dist/esm/router/cloudflare/d1/auth/walletSessionCredentialReaders.js +17 -1
- package/dist/esm/router/cloudflare/d1/authorization/authorizedOperationStatements.js +35 -5
- package/dist/esm/router/cloudflare/d1/authorization/d1AuthorizationStore.js +258 -99
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.js +31 -4
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceOwnerAuthorizationProvider.js +1 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRequestProofNonceStore.js +1 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionRecords.js +1 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.js +1 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetPlanner.js +1 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceVerifiedLinkBuilder.js +1 -1
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoLifecycleDecisionStore.js +11 -2
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.js +100 -10
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoStateWriteFence.js +92 -0
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1WalletCeremonyActivity.js +77 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.js +14 -8
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.js +14 -8
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.js +3 -1
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.js +58 -38
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.js +27 -20
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecoveryService.js +1 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpSessionResolver.js +1 -0
- package/dist/esm/router/cloudflare/d1/oidc/d1OidcBoundary.js +1 -1
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.js +18 -7
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.js +75 -14
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.js +1 -1
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.js +49 -29
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationSessionTransaction.js +28 -0
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationSetupSupport.js +11 -1
- package/dist/esm/router/cloudflare/d1/registration/d1WalletExecutionAuthority.js +168 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletOperationStore.js +53 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.js +83 -42
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationInitialSession.js +33 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationPreparation.js +16 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationRead.js +58 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationService.js +439 -500
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetup.js +1 -1
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.js +104 -90
- package/dist/esm/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.js +78 -44
- package/dist/esm/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.js +11 -35
- package/dist/esm/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.js +98 -39
- package/dist/esm/router/cloudflare/d1/versionedJson/d1VersionedJsonRecordStore.js +12 -9
- package/dist/esm/router/cloudflare/d1/wallet/authorizationSnapshotLayout.js +168 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerFinalizeRecord.js +1 -1
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerService.js +15 -6
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthMethodService.js +3 -40
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorityStore.js +54 -1
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationCleanup.js +157 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationFreeze.js +56 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationHistory.js +238 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationIntake.js +287 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationSnapshot.js +295 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationApprovals.js +140 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationChallenges.js +170 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationEmailOtp.js +60 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationOwner.js +33 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationOwnerRequest.js +74 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationPasskey.js +77 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationReadAccess.js +37 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationSessions.js +97 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationWriteBlock.js +133 -0
- package/dist/esm/router/cloudflare/d1/walletObjectAddresses.js +47 -0
- package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnAuthService.js +1 -1
- package/dist/esm/router/cloudflare/runtime/routerAbServiceBindings.js +32 -1
- package/dist/esm/router/cloudflare/runtime/staticWalletConsoleBinding.js +20 -8
- package/dist/esm/router/cloudflare/runtime/walletAuthorizationRelocationRoutes.js +488 -0
- package/dist/esm/router/cloudflare/runtime/walletConsoleOps.js +1 -1
- package/dist/esm/router/cloudflare/runtime/walletConsoleOpsClient.js +26 -6
- package/dist/esm/router/cloudflare/runtime/walletControlOps.js +3 -0
- package/dist/esm/router/cloudflare/runtime/walletGateway.js +1 -1
- package/dist/esm/router/cloudflare/runtime/walletObjectAddresses.js +105 -0
- package/dist/esm/router/cloudflare/runtime/walletPlacementRoutes.js +339 -0
- package/dist/esm/router/cloudflare/runtime/walletRelocationDeriver.js +244 -0
- package/dist/esm/router/cloudflare/runtime/walletRelocationEcdsa.js +212 -0
- package/dist/esm/router/cloudflare/runtime/walletRelocationEd25519.js +172 -0
- package/dist/esm/router/cloudflare/runtime/walletRelocationOps.js +183 -0
- package/dist/esm/router/cloudflare/runtime/walletRelocationPresign.js +185 -0
- package/dist/esm/router/cloudflare/runtime/walletRelocationSource.js +221 -0
- package/dist/esm/router/cloudflare/signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.js +30 -8
- package/dist/esm/router/cloudflare-adaptor.js +8 -8
- package/dist/esm/router/cloudflare.js +34115 -32240
- package/dist/esm/router/domains/ecdsa/routerAbEcdsaStrictRegistration.js +35 -9
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoCapabilityCommit.js +42 -0
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.js +32 -6
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.js +61 -1
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPersistence.js +70 -3
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRuntime.js +59 -87
- package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.js +52 -22
- package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExportRequestScopedCloudflare.js +10 -7
- package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.js +108 -78
- package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryRequestScopedCloudflare.js +19 -5
- package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryWalletSessionAuthorization.js +71 -22
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.js +37 -25
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.js +3 -3
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationExecutionRecord.js +2 -1
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.js +24 -3
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationRequestScopedCloudflare.js +4 -3
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.js +20 -7
- package/dist/esm/router/domains/ed25519Yao/routerAbEd25519YaoGatewayEnvelope.js +7 -1
- package/dist/esm/router/domains/emailOtp/emailOtpRouteHandlers.js +2 -2
- package/dist/esm/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrieval.js +1 -1
- package/dist/esm/router/domains/passkeyCustody/registrationCustodyOutcome.js +34 -18
- package/dist/esm/router/domains/passkeyCustody/walletCustodyRegistrationAdmission.js +2 -2
- package/dist/esm/router/domains/passkeyCustody/walletCustodyRegistrationCommit.js +16 -6
- package/dist/esm/router/domains/signingOperations/authorizedOperationWire.js +73 -0
- package/dist/esm/router/domains/signingOperations/ecdsaSigningResponse.js +31 -0
- package/dist/esm/router/domains/signingOperations/ed25519AuthorizedOperationReceipt.js +1 -1
- package/dist/esm/router/domains/signingOperations/routerAbEcdsaDerivationNormalSigningRoute.js +2 -1
- package/dist/esm/router/domains/signingOperations/routerAbEd25519NormalSigningRoute.js +31 -121
- package/dist/esm/router/domains/signingOperations/routerAbNormalSigningAdmission.js +2 -93
- package/dist/esm/router/domains/signingOperations/routerAbPrivateSigningWorker.js +1 -1
- package/dist/esm/router/domains/signingOperations/signingPrepareSession.js +33 -0
- package/dist/esm/router/domains/walletRegistration/registrationSessionSeal.js +121 -0
- package/dist/esm/router/domains/walletRegistration/walletRegistrationReservation.js +4 -4
- package/dist/esm/router/domains/walletRegistration/walletRegistrationRoutes.js +46 -157
- package/dist/esm/router/domains/walletRegistration/walletRegistrationSetupPayload.js +1 -1
- package/dist/esm/router/express.js +764 -894
- package/dist/esm/router/framework/http.js +2 -1
- package/dist/esm/router/transport/fetch/createFetchRouter.js +2 -2
- package/dist/esm/router/transport/fetch/routes/auth.js +1 -1
- package/dist/esm/router/transport/fetch/routes/deviceLinking.js +3 -3
- package/dist/esm/router/transport/fetch/routes/deviceLinkingOwnerAuthorization.js +2 -2
- package/dist/esm/router/transport/fetch/routes/ed25519AuthorizedOperationRevalidation.js +65 -0
- package/dist/esm/router/transport/fetch/routes/normalSigningRouterProxy.js +13 -3
- package/dist/esm/router/transport/fetch/routes/passkeyCustody.js +3 -3
- package/dist/esm/router/transport/fetch/routes/sessions.js +3 -2
- package/dist/esm/router/transport/fetch/routes/thresholdEcdsa.js +67 -130
- package/dist/esm/router/transport/fetch/routes/thresholdEd25519.js +76 -212
- package/dist/esm/router/transport/fetch/routes/walletExecutionLanePreflight.js +18 -41
- package/dist/esm/router/transport/fetch/routes/walletRegistration.js +6 -5
- package/dist/esm/router/transport/fetch/routes/webauthnAuthenticators.js +1 -1
- package/dist/esm/shared-ts/src/authorization/index.js +1 -1
- package/dist/esm/shared-ts/src/authorization/walletAuthority.js +2 -2
- package/dist/esm/shared-ts/src/device-linking/activeWalletSession.js +12 -2
- package/dist/esm/shared-ts/src/device-linking/digests.js +1 -1
- package/dist/esm/shared-ts/src/device-linking/ed25519ExportRoot.js +1 -1
- package/dist/esm/shared-ts/src/device-linking/index.js +1 -1
- package/dist/esm/shared-ts/src/device-linking/parsers.js +1 -1
- package/dist/esm/shared-ts/src/device-linking/sourceContribution.js +1 -1
- package/dist/esm/shared-ts/src/device-linking/wireFields.js +1 -1
- package/dist/esm/shared-ts/src/near/nearClient.js +1 -1
- package/dist/esm/shared-ts/src/signing-lanes/ownerContinuity.js +2 -2
- package/dist/esm/shared-ts/src/utils/ecdsaServerTiming.js +6 -1
- package/dist/esm/shared-ts/src/utils/emailOtpDomain.js +4 -2
- package/dist/esm/shared-ts/src/utils/routerAbEcdsaDerivation.js +1 -1
- package/dist/esm/shared-ts/src/utils/routerAbPublicKeyset.js +0 -27
- package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryEcdsaPossession.js +1 -1
- package/dist/esm/threshold/session/signingSessionSeal/options.js +1 -1
- package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker_bg.wasm +0 -0
- package/dist/types/shared-ts/src/device-linking/activeWalletSession.d.ts +2 -1
- package/dist/types/shared-ts/src/device-linking/contracts.d.ts +10 -0
- package/dist/types/shared-ts/src/threshold/ed25519OperationFingerprint.d.ts +2 -1
- package/dist/types/shared-ts/src/utils/emailOtpDomain.d.ts +3 -1
- package/dist/types/shared-ts/src/utils/routerAbPublicKeyset.d.ts +0 -9
- package/dist/types/shared-ts/src/utils/walletManagementProtocol.d.ts +1 -1
- package/dist/types/wallet-server/src/authorization/domain.d.ts +17 -1
- package/dist/types/wallet-server/src/authorization/ecdsaWalletSessionAdmission.d.ts +1 -0
- package/dist/types/wallet-server/src/authorization/ed25519WalletSessionAdmission.d.ts +35 -0
- package/dist/types/wallet-server/src/authorization/ed25519WalletSessionAdmission.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/authorization/service.d.ts +43 -5
- package/dist/types/wallet-server/src/authorization/sessionRouting.d.ts +2 -0
- package/dist/types/wallet-server/src/cloud-host.d.ts +7 -3
- package/dist/types/wallet-server/src/core/EmailOtpRecords.d.ts +2 -1
- package/dist/types/wallet-server/src/core/EmailOtpStores.d.ts +19 -5
- package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.d.ts +1 -0
- package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPresignBridge.d.ts +6 -0
- package/dist/types/wallet-server/src/core/ThresholdService/routerAb/internalServiceHttp.d.ts +1 -0
- package/dist/types/wallet-server/src/core/d1Ed25519SignerRead.d.ts +17 -0
- package/dist/types/wallet-server/src/core/d1WalletStore.d.ts +6 -0
- package/dist/types/wallet-server/src/core/emailOtpD1Statements.d.ts +1 -0
- package/dist/types/wallet-server/src/core/routerAbSigning/RouterAbEcdsaPresignRuntime.d.ts +5 -1
- package/dist/types/wallet-server/src/core/signingMaterial/ordinaryInactiveSignerMaterialReservation.d.ts +1 -0
- package/dist/types/wallet-server/src/core/threeRouteRegistrationContracts.d.ts +14 -48
- package/dist/types/wallet-server/src/hosted-wallet-gateway.d.ts +4 -3
- package/dist/types/wallet-server/src/localIntendedYaoSigningFault.d.ts +1 -16
- package/dist/types/wallet-server/src/localRegistrationSetupAuthority.d.ts +1 -1
- package/dist/types/wallet-server/src/router/auth/commonRouterUtils.d.ts +7 -1
- package/dist/types/wallet-server/src/router/auth/routerApiCredentialAuth.d.ts +11 -3
- package/dist/types/wallet-server/src/router/auth/walletRegistrationContext.d.ts +8 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1AuthorizationAssembly.d.ts +1 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1EmailOtpRouteService.d.ts +16 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthConfig.d.ts +7 -4
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthService.d.ts +4 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/walletSessionCredentialReaders.d.ts +7 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/d1AuthorizationStore.d.ts +32 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.d.ts +2 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoLifecycleDecisionStore.d.ts +3 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.d.ts +1 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoStateWriteFence.d.ts +8 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1WalletCeremonyActivity.d.ts +15 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.d.ts +6 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.d.ts +1 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.d.ts +4 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpCounters.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.d.ts +6 -29
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.d.ts +21 -7
- package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.d.ts +17 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.d.ts +32 -7
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.d.ts +16 -7
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationSessionTransaction.d.ts +13 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationSetupSupport.d.ts +7 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletExecutionAuthority.d.ts +41 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletOperationStore.d.ts +28 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.d.ts +6 -9
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationInitialSession.d.ts +17 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationPreparation.d.ts +12 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationRead.d.ts +43 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationService.d.ts +24 -45
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.d.ts +9 -4
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.d.ts +42 -14
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.d.ts +5 -4
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.d.ts +24 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/versionedJson/d1VersionedJsonRecordStore.d.ts +10 -4
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/authorizationSnapshotLayout.d.ts +21 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAddSignerService.d.ts +3 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthMethodService.d.ts +3 -7
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorityStore.d.ts +8 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationCleanup.d.ts +20 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationFreeze.d.ts +12 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationHistory.d.ts +20 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationIntake.d.ts +29 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationSnapshot.d.ts +31 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationApprovals.d.ts +49 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationChallenges.d.ts +47 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationEmailOtp.d.ts +25 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationOwner.d.ts +88 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationOwnerRequest.d.ts +37 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationPasskey.d.ts +12 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationReadAccess.d.ts +18 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationSessions.d.ts +23 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationWriteBlock.d.ts +16 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/walletObjectAddresses.d.ts +14 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/routerAbServiceBindings.d.ts +13 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletAuthorizationRelocationRoutes.d.ts +21 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOps.d.ts +1 -1
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOpsClient.d.ts +3 -3
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletControlOps.d.ts +2 -1
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletGateway.d.ts +3 -1
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletObjectAddresses.d.ts +45 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletPlacementRoutes.d.ts +30 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationDeriver.d.ts +11 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationEcdsa.d.ts +7 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationEd25519.d.ts +7 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationOps.d.ts +11 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationPresign.d.ts +7 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationSource.d.ts +26 -0
- package/dist/types/wallet-server/src/router/cloudflare/signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.d.ts +5 -0
- package/dist/types/wallet-server/src/router/domains/ecdsa/routerAbEcdsaStrictRegistration.d.ts +3 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoCapabilityCommit.d.ts +7 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.d.ts +41 -7
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.d.ts +33 -2
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.d.ts +12 -6
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.d.ts +17 -9
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryWalletSessionAuthorization.d.ts +2 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.d.ts +13 -14
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.d.ts +7 -3
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationExecutionRecord.d.ts +1 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.d.ts +6 -1
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.d.ts +11 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/routerAbEd25519YaoGatewayEnvelope.d.ts +12 -3
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/registrationCustodyOutcome.d.ts +10 -6
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationAdmission.d.ts +10 -3
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationCommit.d.ts +12 -5
- package/dist/types/wallet-server/src/router/domains/signingOperations/authorizedOperationWire.d.ts +97 -0
- package/dist/types/wallet-server/src/router/domains/signingOperations/ecdsaSigningResponse.d.ts +13 -0
- package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbNormalSigningAdmission.d.ts +9 -206
- package/dist/types/wallet-server/src/router/domains/signingOperations/signingPrepareSession.d.ts +23 -0
- package/dist/types/wallet-server/src/router/domains/walletRegistration/registrationSessionSeal.d.ts +36 -0
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationInputs.d.ts +7 -7
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationReservation.d.ts +80 -6
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationRoutes.d.ts +15 -5
- package/dist/types/wallet-server/src/router/framework/apiCredentialPorts.d.ts +24 -0
- package/dist/types/wallet-server/src/router/framework/authServicePort.d.ts +21 -7
- package/dist/types/wallet-server/src/router/framework/routerApi.d.ts +3 -12
- package/dist/types/wallet-server/src/router/transport/fetch/routes/ed25519AuthorizedOperationRevalidation.d.ts +37 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/thresholdEcdsa.d.ts +1 -17
- package/dist/types/wallet-server/src/storage/tenantRoute.d.ts +1 -1
- package/migrations/d1-signer/0049_wallet_relocation_challenges.sql +16 -0
- package/migrations/d1-signer/0050_wallet_relocation_approvals.sql +14 -0
- package/migrations/d1-signer/0051_wallet_relocation_email_otp.sql +92 -0
- package/migrations/d1-signer/0052_wallet_relocation_session_fences.sql +91 -0
- package/migrations/d1-signer/0053_wallet_hosted_history_import.sql +164 -0
- package/migrations/d1-signer/0054_wallet_authorization_freeze.sql +318 -0
- package/migrations/d1-signer/0055_wallet_authorization_snapshot.sql +120 -0
- package/migrations/d1-signer/0056_wallet_authorization_history_import.sql +424 -0
- package/migrations/d1-signer/0057_wallet_authorization_intake.sql +44 -0
- package/migrations/d1-signer/0058_wallet_ceremony_activity.sql +59 -0
- package/migrations/d1-signer/0059_wallet_authorization_activation.sql +45 -0
- package/migrations/d1-signer/0060_wallet_authorization_cleanup.sql +153 -0
- package/migrations/d1-signer/0061_wallet_session_operation_settlement.sql +28 -0
- package/migrations/d1-signer/0062_wallet_step_up_operation_settlement.sql +204 -0
- package/migrations/d1-signer/0063_wallet_operation_history_transfer.sql +466 -0
- package/migrations/d1-signer/0064_wallet_execution_generations.sql +93 -0
- package/migrations/d1-signer/0065_wallet_operation_execution_generation.sql +37 -0
- package/migrations/d1-signer/0066_regional_deployment_admission.sql +59 -0
- package/migrations/d1-signer/0067_registration_completion_decision.sql +12 -0
- package/migrations/d1-signer/0068_registration_cancellation_write_fence.sql +24 -0
- package/migrations/d1-signer/0069_cancelled_registration_session_fence.sql +11 -0
- package/migrations/d1-signer/0070_wallet_passkey_relocation.sql +369 -0
- package/migrations/d1-signer/0071_regional_wallet_otp_counters.sql +98 -0
- package/migrations/d1-signer/0072_linked_device_relocation_history.sql +899 -0
- package/migrations/d1-signer/0073_wallet_recovery_relocation.sql +86 -0
- package/migrations/d1-signer/0074_email_otp_relocation.sql +158 -0
- package/migrations/d1-signer/0075_wallet_authorization_return.sql +107 -0
- package/migrations/d1-signer/0076_wallet_relocation_write_block.sql +406 -0
- package/migrations/d1-signer/0077_wallet_object_addresses.sql +24 -0
- package/package.json +1 -1
- package/src/README.md +23 -1
- package/cloudflare-router-ab/scripts/local-key-material.mjs +0 -29
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { parseWalletId } from "../../../../shared-ts/src/utils/domainIds.js";
|
|
2
|
+
import { isPlainObject } from "../../../../shared-ts/src/utils/validation.js";
|
|
3
|
+
import { parseUnixMs } from "../../../../shared-ts/src/passkey-custody/primitives.js";
|
|
4
|
+
import { D1_BATCH_CAS_GUARD_SQL } from "../../../../storage/d1Sql.js";
|
|
5
|
+
import { prepareD1TenantStatement } from "../../../../core/d1TenantStore.js";
|
|
6
|
+
//#region src/router/cloudflare/d1/wallet/d1WalletRelocationSessions.ts
|
|
7
|
+
var WalletRelocationSessionSource = class WalletRelocationSessionSource {
|
|
8
|
+
#validated = true;
|
|
9
|
+
constructor(walletId, moveId, requestDigestHex, sourceGeneration) {
|
|
10
|
+
this.walletId = walletId;
|
|
11
|
+
this.moveId = moveId;
|
|
12
|
+
this.requestDigestHex = requestDigestHex;
|
|
13
|
+
this.sourceGeneration = sourceGeneration;
|
|
14
|
+
Object.freeze(this);
|
|
15
|
+
}
|
|
16
|
+
static parse(raw) {
|
|
17
|
+
if (!isPlainObject(raw) || Object.keys(raw).length !== 4) throw new Error("Invalid session relocation identity");
|
|
18
|
+
const wallet = parseWalletId(raw.walletId);
|
|
19
|
+
if (!wallet.ok || typeof raw.moveId !== "string" || !/^wmove_[A-Za-z0-9_-]{43}$/u.test(raw.moveId) || typeof raw.requestDigestHex !== "string" || !/^[a-f0-9]{64}$/u.test(raw.requestDigestHex) || typeof raw.sourceGeneration !== "number" || !Number.isSafeInteger(raw.sourceGeneration) || raw.sourceGeneration < 1 || raw.sourceGeneration >= Number.MAX_SAFE_INTEGER) throw new Error("Invalid session relocation identity");
|
|
20
|
+
return new WalletRelocationSessionSource(wallet.value, raw.moveId, raw.requestDigestHex, raw.sourceGeneration);
|
|
21
|
+
}
|
|
22
|
+
matches(row) {
|
|
23
|
+
return this.#validated && row.wallet_id === this.walletId && row.move_id === this.moveId && row.request_digest_hex === this.requestDigestHex && row.source_generation === this.sourceGeneration;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
var D1WalletRelocationSessions = class {
|
|
27
|
+
constructor(database, scope) {
|
|
28
|
+
this.database = database;
|
|
29
|
+
this.scope = scope;
|
|
30
|
+
}
|
|
31
|
+
async hasPendingOperations(walletId) {
|
|
32
|
+
return await prepareD1TenantStatement(this.database, this.scope, `SELECT 1 FROM wallet_pending_operations
|
|
33
|
+
WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
|
|
34
|
+
AND wallet_id = ?5 LIMIT 1`, [walletId]).first() !== null;
|
|
35
|
+
}
|
|
36
|
+
async retire(source, nowMs) {
|
|
37
|
+
parseUnixMs(nowMs, "session relocation time");
|
|
38
|
+
const existing = await this.read(source);
|
|
39
|
+
if (existing !== null) return existing;
|
|
40
|
+
await this.database.batch(this.retirementStatements(source, nowMs));
|
|
41
|
+
const retiredAtMs = await this.read(source);
|
|
42
|
+
if (retiredAtMs === null) throw new Error("Session relocation retirement disappeared");
|
|
43
|
+
return retiredAtMs;
|
|
44
|
+
}
|
|
45
|
+
retirementStatements(source, nowMs) {
|
|
46
|
+
parseUnixMs(nowMs, "session relocation time");
|
|
47
|
+
const identity = [
|
|
48
|
+
source.walletId,
|
|
49
|
+
source.moveId,
|
|
50
|
+
source.requestDigestHex,
|
|
51
|
+
source.sourceGeneration
|
|
52
|
+
];
|
|
53
|
+
return [
|
|
54
|
+
prepareD1TenantStatement(this.database, this.scope, `
|
|
55
|
+
INSERT INTO wallet_relocation_session_fences
|
|
56
|
+
(namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation, retired_at_ms)
|
|
57
|
+
VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9)
|
|
58
|
+
ON CONFLICT (namespace, org_id, project_id, env_id, wallet_id) DO NOTHING`, [...identity, nowMs]),
|
|
59
|
+
prepareD1TenantStatement(this.database, this.scope, `
|
|
60
|
+
UPDATE wallet_relocation_session_fences SET retired_at_ms = retired_at_ms
|
|
61
|
+
WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
|
|
62
|
+
AND wallet_id = ?5 AND move_id = ?6 AND request_digest_hex = ?7 AND source_generation = ?8`, identity),
|
|
63
|
+
this.database.prepare(D1_BATCH_CAS_GUARD_SQL),
|
|
64
|
+
prepareD1TenantStatement(this.database, this.scope, `
|
|
65
|
+
UPDATE authorization_wallet_session_quotas AS quota SET remaining_uses = 0, lifecycle_kind = 'exhausted'
|
|
66
|
+
WHERE quota.lifecycle_kind = 'active' AND EXISTS (
|
|
67
|
+
SELECT 1 FROM wallet_session_authorizations_v2 AS session
|
|
68
|
+
WHERE session.namespace = ?1 AND session.org_id = ?2 AND session.project_id = ?3 AND session.env_id = ?4
|
|
69
|
+
AND session.wallet_id = ?5 AND session.retired_at_ms IS NULL
|
|
70
|
+
AND session.namespace = quota.namespace AND session.tenant_id = quota.tenant_id
|
|
71
|
+
AND session.quota_id = quota.quota_id AND session.wallet_session_id = quota.wallet_session_id
|
|
72
|
+
)`, [source.walletId]),
|
|
73
|
+
prepareD1TenantStatement(this.database, this.scope, `
|
|
74
|
+
UPDATE wallet_session_hosted_credentials_v2 SET lifecycle_kind = 'retired',
|
|
75
|
+
retired_at_ms = MAX(issued_at_ms, ?6)
|
|
76
|
+
WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
|
|
77
|
+
AND wallet_id = ?5 AND lifecycle_kind = 'active' AND retired_at_ms IS NULL`, [source.walletId, nowMs]),
|
|
78
|
+
prepareD1TenantStatement(this.database, this.scope, `
|
|
79
|
+
UPDATE wallet_session_authorizations_v2 SET retired_at_ms = MAX(issued_at_ms, ?6)
|
|
80
|
+
WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
|
|
81
|
+
AND wallet_id = ?5 AND retired_at_ms IS NULL`, [source.walletId, nowMs])
|
|
82
|
+
];
|
|
83
|
+
}
|
|
84
|
+
async read(source) {
|
|
85
|
+
const row = await prepareD1TenantStatement(this.database, this.scope, `
|
|
86
|
+
SELECT wallet_id, move_id, request_digest_hex, source_generation, retired_at_ms
|
|
87
|
+
FROM wallet_relocation_session_fences
|
|
88
|
+
WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4 AND wallet_id = ?5`, [source.walletId]).first();
|
|
89
|
+
if (!row) return null;
|
|
90
|
+
if (!source.matches(row)) throw new Error("Session relocation identity conflicts with its source fence");
|
|
91
|
+
return parseUnixMs(row.retired_at_ms, "stored session relocation time");
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
//#endregion
|
|
95
|
+
export { D1WalletRelocationSessions, WalletRelocationSessionSource };
|
|
96
|
+
|
|
97
|
+
//# sourceMappingURL=d1WalletRelocationSessions.js.map
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { parseUnixMs } from "../../../../shared-ts/src/passkey-custody/primitives.js";
|
|
2
|
+
import { D1_BATCH_CAS_GUARD_SQL } from "../../../../storage/d1Sql.js";
|
|
3
|
+
import { prepareD1TenantStatement } from "../../../../core/d1TenantStore.js";
|
|
4
|
+
import { D1WalletCeremonyActivity } from "../ed25519Yao/d1WalletCeremonyActivity.js";
|
|
5
|
+
import { D1WalletAuthorizationSnapshot } from "./d1WalletAuthorizationSnapshot.js";
|
|
6
|
+
import { D1WalletRelocationSessions } from "./d1WalletRelocationSessions.js";
|
|
7
|
+
import { D1WalletAuthorizationFreeze } from "./d1WalletAuthorizationFreeze.js";
|
|
8
|
+
//#region src/router/cloudflare/d1/wallet/d1WalletRelocationWriteBlock.ts
|
|
9
|
+
const SCOPE = "namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4 AND wallet_id = ?5";
|
|
10
|
+
var D1WalletRelocationWriteBlock = class {
|
|
11
|
+
constructor(database, scope) {
|
|
12
|
+
this.database = database;
|
|
13
|
+
this.scope = scope;
|
|
14
|
+
}
|
|
15
|
+
async check(source, nowMs) {
|
|
16
|
+
const identity = [
|
|
17
|
+
source.walletId,
|
|
18
|
+
source.moveId,
|
|
19
|
+
source.requestDigestHex,
|
|
20
|
+
source.sourceGeneration
|
|
21
|
+
];
|
|
22
|
+
await prepareD1TenantStatement(this.database, this.scope, `
|
|
23
|
+
INSERT INTO wallet_relocation_write_blocks
|
|
24
|
+
(namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex,
|
|
25
|
+
source_generation, state, started_at_ms)
|
|
26
|
+
SELECT ?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, 'draining', ?9
|
|
27
|
+
FROM wallet_execution_generations WHERE ${SCOPE} AND generation = ?8 AND state = 'active'
|
|
28
|
+
ON CONFLICT DO NOTHING`, [...identity, nowMs]).run();
|
|
29
|
+
const state = await this.read(source);
|
|
30
|
+
if (state === "checked") return "ready";
|
|
31
|
+
if (state !== "draining") throw new Error("Wallet write block is unavailable");
|
|
32
|
+
if (await new D1WalletRelocationSessions(this.database, this.scope).hasPendingOperations(source.walletId) || await new D1WalletCeremonyActivity(this.database, this.scope).hasPending(source.walletId)) return "draining";
|
|
33
|
+
await prepareD1TenantStatement(this.database, this.scope, `
|
|
34
|
+
INSERT INTO wallet_relocation_authorization_fences
|
|
35
|
+
(namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation, frozen_at_ms)
|
|
36
|
+
SELECT ?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9 FROM wallet_relocation_write_blocks
|
|
37
|
+
WHERE ${SCOPE} AND move_id = ?6 AND request_digest_hex = ?7 AND source_generation = ?8 AND state = 'draining'
|
|
38
|
+
ON CONFLICT DO NOTHING`, [...identity, nowMs]).run();
|
|
39
|
+
await new D1WalletAuthorizationSnapshot(this.database, this.scope).assertCapacity(source.walletId);
|
|
40
|
+
await this.database.batch([prepareD1TenantStatement(this.database, this.scope, `UPDATE wallet_relocation_write_blocks
|
|
41
|
+
SET state = 'checked' WHERE ${SCOPE} AND move_id = ?6 AND request_digest_hex = ?7
|
|
42
|
+
AND source_generation = ?8 AND state IN ('draining', 'checked')
|
|
43
|
+
AND EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences fence
|
|
44
|
+
WHERE fence.namespace = ?1 AND fence.org_id = ?2 AND fence.project_id = ?3
|
|
45
|
+
AND fence.env_id = ?4 AND fence.wallet_id = ?5 AND fence.move_id = ?6
|
|
46
|
+
AND fence.request_digest_hex = ?7 AND fence.source_generation = ?8)`, identity), this.database.prepare(D1_BATCH_CAS_GUARD_SQL)]);
|
|
47
|
+
return "ready";
|
|
48
|
+
}
|
|
49
|
+
async release(source, nowMs) {
|
|
50
|
+
const identity = [
|
|
51
|
+
source.walletId,
|
|
52
|
+
source.moveId,
|
|
53
|
+
source.requestDigestHex,
|
|
54
|
+
source.sourceGeneration
|
|
55
|
+
];
|
|
56
|
+
await this.database.batch([
|
|
57
|
+
prepareD1TenantStatement(this.database, this.scope, `INSERT INTO wallet_relocation_write_blocks
|
|
58
|
+
(namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex,
|
|
59
|
+
source_generation, state, started_at_ms)
|
|
60
|
+
VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, 'released', ?9)
|
|
61
|
+
ON CONFLICT DO UPDATE SET state = 'released'
|
|
62
|
+
WHERE request_digest_hex = ?7 AND source_generation = ?8 AND state != 'frozen'`, [...identity, nowMs]),
|
|
63
|
+
this.database.prepare(D1_BATCH_CAS_GUARD_SQL),
|
|
64
|
+
prepareD1TenantStatement(this.database, this.scope, `DELETE FROM wallet_relocation_authorization_fences
|
|
65
|
+
WHERE ${SCOPE} AND move_id = ?6 AND request_digest_hex = ?7 AND source_generation = ?8`, identity)
|
|
66
|
+
]);
|
|
67
|
+
}
|
|
68
|
+
async freeze(source, nowMs) {
|
|
69
|
+
const sessions = new D1WalletRelocationSessions(this.database, this.scope);
|
|
70
|
+
const freeze = new D1WalletAuthorizationFreeze(this.database, this.scope);
|
|
71
|
+
const completed = await prepareD1TenantStatement(this.database, this.scope, `
|
|
72
|
+
SELECT fence.frozen_at_ms, retired.retired_at_ms FROM wallet_relocation_authorization_fences fence
|
|
73
|
+
JOIN wallet_relocation_session_fences retired
|
|
74
|
+
USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
|
|
75
|
+
WHERE fence.namespace = ?1 AND fence.org_id = ?2 AND fence.project_id = ?3 AND fence.env_id = ?4
|
|
76
|
+
AND fence.wallet_id = ?5 AND fence.move_id = ?6 AND fence.request_digest_hex = ?7 AND fence.source_generation = ?8`, [
|
|
77
|
+
source.walletId,
|
|
78
|
+
source.moveId,
|
|
79
|
+
source.requestDigestHex,
|
|
80
|
+
source.sourceGeneration
|
|
81
|
+
]).first();
|
|
82
|
+
if (completed) return {
|
|
83
|
+
retiredAtMs: parseUnixMs(completed.retired_at_ms, "session retirement"),
|
|
84
|
+
frozenAtMs: parseUnixMs(completed.frozen_at_ms, "authorization freeze")
|
|
85
|
+
};
|
|
86
|
+
const state = await this.read(source);
|
|
87
|
+
if (state !== "checked" && state !== "frozen") throw new Error("Wallet capacity is not reserved");
|
|
88
|
+
if (state === "checked") {
|
|
89
|
+
const identity = [
|
|
90
|
+
source.walletId,
|
|
91
|
+
source.moveId,
|
|
92
|
+
source.requestDigestHex,
|
|
93
|
+
source.sourceGeneration
|
|
94
|
+
];
|
|
95
|
+
try {
|
|
96
|
+
await this.database.batch([
|
|
97
|
+
prepareD1TenantStatement(this.database, this.scope, `DELETE FROM wallet_relocation_authorization_fences
|
|
98
|
+
WHERE ${SCOPE} AND move_id = ?6 AND request_digest_hex = ?7 AND source_generation = ?8`, identity),
|
|
99
|
+
this.database.prepare(D1_BATCH_CAS_GUARD_SQL),
|
|
100
|
+
...sessions.retirementStatements(source, nowMs),
|
|
101
|
+
...freeze.freezeStatements(source, nowMs),
|
|
102
|
+
prepareD1TenantStatement(this.database, this.scope, `UPDATE wallet_relocation_write_blocks SET state = 'frozen'
|
|
103
|
+
WHERE ${SCOPE} AND move_id = ?6 AND request_digest_hex = ?7 AND source_generation = ?8
|
|
104
|
+
AND state = 'checked'`, identity),
|
|
105
|
+
this.database.prepare(D1_BATCH_CAS_GUARD_SQL)
|
|
106
|
+
]);
|
|
107
|
+
} catch (error) {
|
|
108
|
+
if (await this.read(source) !== "frozen") throw error;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
retiredAtMs: await sessions.retire(source, nowMs),
|
|
113
|
+
frozenAtMs: await freeze.freeze(source, nowMs)
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
async read(source) {
|
|
117
|
+
const row = await prepareD1TenantStatement(this.database, this.scope, `SELECT * FROM wallet_relocation_write_blocks
|
|
118
|
+
WHERE ${SCOPE} AND move_id = ?6`, [source.walletId, source.moveId]).first();
|
|
119
|
+
if (!row) return null;
|
|
120
|
+
if (!source.matches(row)) throw new Error("Wallet write block identity conflicts");
|
|
121
|
+
switch (row.state) {
|
|
122
|
+
case "draining":
|
|
123
|
+
case "checked":
|
|
124
|
+
case "released":
|
|
125
|
+
case "frozen": return row.state;
|
|
126
|
+
default: throw new Error("Wallet write block state is invalid");
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
//#endregion
|
|
131
|
+
export { D1WalletRelocationWriteBlock };
|
|
132
|
+
|
|
133
|
+
//# sourceMappingURL=d1WalletRelocationWriteBlock.js.map
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { prepareD1TenantStatement } from "../../../core/d1TenantStore.js";
|
|
2
|
+
import { WalletObjectAddresses } from "../runtime/walletObjectAddresses.js";
|
|
3
|
+
//#region src/router/cloudflare/d1/walletObjectAddresses.ts
|
|
4
|
+
const READ = `SELECT router, deriver_a, deriver_b, signing_worker FROM wallet_object_addresses
|
|
5
|
+
WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
|
|
6
|
+
AND wallet_id = ?5 AND ownership_generation = ?6`;
|
|
7
|
+
var D1WalletObjectAddresses = class {
|
|
8
|
+
constructor(database, scope) {
|
|
9
|
+
this.database = database;
|
|
10
|
+
this.scope = scope;
|
|
11
|
+
}
|
|
12
|
+
async initialize(identity, router, credential) {
|
|
13
|
+
const existing = await this.read(identity);
|
|
14
|
+
if (existing !== null) return existing;
|
|
15
|
+
const response = await router.fetch("https://mpc-router.router-ab.internal/router-ab/router/wallet/allocate", {
|
|
16
|
+
method: "POST",
|
|
17
|
+
headers: { "x-router-ab-internal-service-auth": credential },
|
|
18
|
+
signal: AbortSignal.timeout(1e4)
|
|
19
|
+
});
|
|
20
|
+
if (!response.ok) throw new Error("Custody address allocation failed");
|
|
21
|
+
return this.insert(identity, WalletObjectAddresses.parse(await response.json()));
|
|
22
|
+
}
|
|
23
|
+
async read(identity) {
|
|
24
|
+
const row = await prepareD1TenantStatement(this.database, this.scope, READ, [identity.walletId, identity.ownershipGeneration]).first();
|
|
25
|
+
return row === null ? null : WalletObjectAddresses.parse(row);
|
|
26
|
+
}
|
|
27
|
+
/** Competing allocations return the same persisted winner before either starts work. */
|
|
28
|
+
async insert(identity, addresses) {
|
|
29
|
+
const identityValues = [identity.walletId, identity.ownershipGeneration];
|
|
30
|
+
const row = (await this.database.batch([prepareD1TenantStatement(this.database, this.scope, `INSERT INTO wallet_object_addresses
|
|
31
|
+
(namespace, org_id, project_id, env_id, wallet_id, ownership_generation,
|
|
32
|
+
router, deriver_a, deriver_b, signing_worker)
|
|
33
|
+
VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)
|
|
34
|
+
ON CONFLICT (namespace, org_id, project_id, env_id, wallet_id, ownership_generation) DO NOTHING`, [
|
|
35
|
+
...identityValues,
|
|
36
|
+
addresses.router,
|
|
37
|
+
addresses.deriver_a,
|
|
38
|
+
addresses.deriver_b,
|
|
39
|
+
addresses.signing_worker
|
|
40
|
+
]), prepareD1TenantStatement(this.database, this.scope, READ, identityValues)]))[1]?.results?.[0];
|
|
41
|
+
return WalletObjectAddresses.parse(row);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
//#endregion
|
|
45
|
+
export { D1WalletObjectAddresses };
|
|
46
|
+
|
|
47
|
+
//# sourceMappingURL=walletObjectAddresses.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { parseWebAuthnRpId } from "../../../../shared-ts/src/utils/domainIds.js";
|
|
2
|
-
import { parseDigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
|
|
3
2
|
import { normalizeOptionalTrimmedString } from "../../../../shared-ts/src/utils/normalize.js";
|
|
3
|
+
import { parseDigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
|
|
4
4
|
import { WalletLifecycleLocator } from "../../../../authorization/lifecycleRouting.js";
|
|
5
5
|
import { secureRandomBase64Url } from "../../../../shared-ts/src/utils/secureRandomId.js";
|
|
6
6
|
import { failedVerification, failure } from "../../../../shared-ts/src/utils/failure.js";
|
|
@@ -1,4 +1,35 @@
|
|
|
1
|
+
import { WALLET_OBJECT_ADDRESSES_HEADER, WALLET_OBJECT_IDENTITY_HEADER, readWalletObjectIdentityHeader } from "./walletObjectAddresses.js";
|
|
2
|
+
import { D1WalletObjectAddresses } from "../d1/walletObjectAddresses.js";
|
|
1
3
|
//#region src/router/cloudflare/runtime/routerAbServiceBindings.ts
|
|
4
|
+
/** Apply only after the host admits this request to the wallet's fixed home. */
|
|
5
|
+
var WalletHomeCustodyBinding = class {
|
|
6
|
+
constructor(binding, home, database, namespace, initialAddresses) {
|
|
7
|
+
this.binding = binding;
|
|
8
|
+
this.home = home;
|
|
9
|
+
this.database = database;
|
|
10
|
+
this.namespace = namespace;
|
|
11
|
+
this.initialAddresses = initialAddresses;
|
|
12
|
+
}
|
|
13
|
+
async fetch(input, init) {
|
|
14
|
+
const request = new Request(input, init);
|
|
15
|
+
request.headers.set("x-seams-wallet-home-region", this.home);
|
|
16
|
+
request.headers.delete(WALLET_OBJECT_ADDRESSES_HEADER);
|
|
17
|
+
const identity = readWalletObjectIdentityHeader(request.headers);
|
|
18
|
+
request.headers.delete(WALLET_OBJECT_IDENTITY_HEADER);
|
|
19
|
+
if (identity !== null) {
|
|
20
|
+
const store = new D1WalletObjectAddresses(this.database, {
|
|
21
|
+
namespace: this.namespace,
|
|
22
|
+
orgId: identity.orgId,
|
|
23
|
+
projectId: identity.projectId,
|
|
24
|
+
envId: identity.envId
|
|
25
|
+
});
|
|
26
|
+
const addresses = this.initialAddresses?.resolve(this.namespace, identity) ?? await store.read(identity);
|
|
27
|
+
if (addresses === null) throw new Error("Wallet object addresses are not initialized");
|
|
28
|
+
request.headers.set(WALLET_OBJECT_ADDRESSES_HEADER, JSON.stringify(addresses));
|
|
29
|
+
}
|
|
30
|
+
return this.binding.fetch(request);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
2
33
|
const ROUTER_AB_MPC_ROUTER_ORIGIN = "https://mpc-router.router-ab.internal";
|
|
3
34
|
const ROUTER_AB_SIGNING_WORKER_ORIGIN = "https://signing-worker.router-ab.internal";
|
|
4
35
|
var RouterAbServiceBindingDispatcher = class {
|
|
@@ -28,6 +59,6 @@ function createRouterAbServiceBindingFetch(env) {
|
|
|
28
59
|
return dispatcher.fetch.bind(dispatcher);
|
|
29
60
|
}
|
|
30
61
|
//#endregion
|
|
31
|
-
export { ROUTER_AB_MPC_ROUTER_ORIGIN, ROUTER_AB_SIGNING_WORKER_ORIGIN, createRouterAbServiceBindingFetch };
|
|
62
|
+
export { ROUTER_AB_MPC_ROUTER_ORIGIN, ROUTER_AB_SIGNING_WORKER_ORIGIN, WalletHomeCustodyBinding, createRouterAbServiceBindingFetch };
|
|
32
63
|
|
|
33
64
|
//# sourceMappingURL=routerAbServiceBindings.js.map
|
|
@@ -65,10 +65,10 @@ async function handleStaticWalletConsoleRequestV1(config, input, init) {
|
|
|
65
65
|
const body = await request.json().catch(() => null);
|
|
66
66
|
switch (new URL(request.url).pathname) {
|
|
67
67
|
case WALLET_CONSOLE_OP_PATHS_V1.publishableKeyAuth: return publishableKeyResponse(config, body);
|
|
68
|
+
case WALLET_CONSOLE_OP_PATHS_V1.registrationContext: return registrationContextResponse(config, body);
|
|
68
69
|
case WALLET_CONSOLE_OP_PATHS_V1.secretKeyAuth: return secretKeyResponse(config, body);
|
|
69
70
|
case WALLET_CONSOLE_OP_PATHS_V1.projectEnvironments: return projectEnvironmentsResponse(config, body);
|
|
70
71
|
case WALLET_CONSOLE_OP_PATHS_V1.tenantRootActiveLineage: return activeLineageResponse(config, body);
|
|
71
|
-
case WALLET_CONSOLE_OP_PATHS_V1.walletProjection:
|
|
72
72
|
case WALLET_CONSOLE_OP_PATHS_V1.usageEvents: return json({ ok: true });
|
|
73
73
|
default: return json({
|
|
74
74
|
ok: false,
|
|
@@ -86,6 +86,24 @@ function publishableKeyResponse(config, value) {
|
|
|
86
86
|
principal: principal(config)
|
|
87
87
|
});
|
|
88
88
|
}
|
|
89
|
+
function registrationContextResponse(config, value) {
|
|
90
|
+
const auth = publishableKeyResponse(config, value);
|
|
91
|
+
if (!auth.ok) return auth;
|
|
92
|
+
return json({
|
|
93
|
+
ok: true,
|
|
94
|
+
principal: principal(config),
|
|
95
|
+
environment: projectEnvironment(config)
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
function projectEnvironment(config) {
|
|
99
|
+
return {
|
|
100
|
+
id: config.deployment.environmentId,
|
|
101
|
+
projectId: config.deployment.projectId,
|
|
102
|
+
key: config.deployment.environmentKey,
|
|
103
|
+
signingRootVersion: config.deployment.signingRootVersion,
|
|
104
|
+
status: "ACTIVE"
|
|
105
|
+
};
|
|
106
|
+
}
|
|
89
107
|
function secretKeyResponse(config, value) {
|
|
90
108
|
const body = record(value);
|
|
91
109
|
if (!config.credential.secretKey || !body || body.secret !== config.credential.secretKey) return authFailure("secret_key_invalid", "Secret key is invalid");
|
|
@@ -106,13 +124,7 @@ function projectEnvironmentsResponse(config, value) {
|
|
|
106
124
|
if (!context || context.orgId !== config.deployment.orgId) return json(failure("environment_not_found", "Environment not found"), 404);
|
|
107
125
|
return json({
|
|
108
126
|
ok: true,
|
|
109
|
-
environments: [
|
|
110
|
-
id: config.deployment.environmentId,
|
|
111
|
-
projectId: config.deployment.projectId,
|
|
112
|
-
key: config.deployment.environmentKey,
|
|
113
|
-
signingRootVersion: config.deployment.signingRootVersion,
|
|
114
|
-
status: "ACTIVE"
|
|
115
|
-
}]
|
|
127
|
+
environments: [projectEnvironment(config)]
|
|
116
128
|
});
|
|
117
129
|
}
|
|
118
130
|
function activeLineageResponse(config, value) {
|