@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.
Files changed (369) hide show
  1. package/THIRD_PARTY_NOTICES.md +7 -1
  2. package/artifact-manifest.json +196 -41
  3. package/cloudflare-router-ab/build/deriver-a/build-stamp.json +1 -1
  4. package/cloudflare-router-ab/build/deriver-a/index.js +2 -2
  5. package/cloudflare-router-ab/build/deriver-a/index_bg.wasm +0 -0
  6. package/cloudflare-router-ab/build/deriver-b/build-stamp.json +1 -1
  7. package/cloudflare-router-ab/build/deriver-b/index.js +2 -2
  8. package/cloudflare-router-ab/build/deriver-b/index_bg.wasm +0 -0
  9. package/cloudflare-router-ab/build/local-tools/darwin-arm64/router_ab_local_init +0 -0
  10. package/cloudflare-router-ab/build/local-tools/darwin-x64/router_ab_local_init +0 -0
  11. package/cloudflare-router-ab/build/local-tools/linux-x64/router_ab_local_init +0 -0
  12. package/cloudflare-router-ab/build/router/build-stamp.json +1 -1
  13. package/cloudflare-router-ab/build/router/index.js +2 -2
  14. package/cloudflare-router-ab/build/router/index_bg.wasm +0 -0
  15. package/cloudflare-router-ab/build/signing-worker/build-stamp.json +1 -1
  16. package/cloudflare-router-ab/build/signing-worker/index.js +2 -2
  17. package/cloudflare-router-ab/build/signing-worker/index_bg.wasm +0 -0
  18. package/cloudflare-router-ab/build/tenant-root-control-plane/build-stamp.json +1 -1
  19. package/cloudflare-router-ab/build/tenant-root-control-plane/index.js +2 -2
  20. package/cloudflare-router-ab/build/tenant-root-control-plane/index_bg.wasm +0 -0
  21. package/cloudflare-router-ab/migrations/deriver-a/0019_wallet_object_addresses.sql +10 -0
  22. package/cloudflare-router-ab/migrations/deriver-b/0019_wallet_object_addresses.sql +10 -0
  23. package/cloudflare-router-ab/scripts/prepare-local-runtime-config.mjs +3 -117
  24. package/cloudflare-router-ab/wrangler.deriver-a.toml +0 -8
  25. package/cloudflare-router-ab/wrangler.deriver-b.toml +24 -8
  26. package/cloudflare-router-ab/wrangler.router.toml +0 -2
  27. package/cloudflare-router-ab/wrangler.signing-worker.toml +29 -0
  28. package/dist/esm/authorization/domain.js +3 -2
  29. package/dist/esm/authorization/ed25519WalletSessionAdmission.js +0 -0
  30. package/dist/esm/authorization/service.js +64 -36
  31. package/dist/esm/cloud-host.js +24 -19
  32. package/dist/esm/core/EmailOtpRecords.js +29 -6
  33. package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.js +2 -0
  34. package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPresignBridge.js +10 -0
  35. package/dist/esm/core/ThresholdService/routerAb/internalServiceHttp.js +1 -0
  36. package/dist/esm/core/ThresholdService/validation.js +2 -2
  37. package/dist/esm/core/authService/nearPrivateKeySigning.js +1 -1
  38. package/dist/esm/core/authService/webauthn.js +1 -1
  39. package/dist/esm/core/d1Ed25519SignerRead.js +55 -0
  40. package/dist/esm/core/d1WalletStore.js +14 -11
  41. package/dist/esm/core/deviceLinking/linkedDeviceEmailOtpGrant.js +2 -2
  42. package/dist/esm/core/deviceLinking/linkedDeviceManagement.js +1 -1
  43. package/dist/esm/core/deviceLinking/linkedDeviceSessionRecord.js +2 -2
  44. package/dist/esm/core/emailOtpD1Statements.js +1 -0
  45. package/dist/esm/core/nearRelayerAccountProvisioning.js +1 -1
  46. package/dist/esm/core/routerAbSigning/RouterAbEcdsaPresignRuntime.js +4 -0
  47. package/dist/esm/core/signingLanes/WalletExecutionLaneProjection.js +1 -1
  48. package/dist/esm/core/signingMaterial/ordinaryInactiveSignerMaterialReservation.js +1 -0
  49. package/dist/esm/hosted-wallet-gateway.js +93 -10
  50. package/dist/esm/localHostedWalletGatewayHandler.js +12 -9
  51. package/dist/esm/localIntendedYaoSigningFault.js +2 -30
  52. package/dist/esm/localRegistrationSetupAuthority.js +8 -1
  53. package/dist/esm/router/auth/commonRouterUtils.js +17 -10
  54. package/dist/esm/router/auth/routerApiCredentialAuth.js +26 -7
  55. package/dist/esm/router/auth/walletRegistrationContext.js +49 -0
  56. package/dist/esm/router/auth/webAuthnCredentialCodecs.js +1 -1
  57. package/dist/esm/router/cloudflare/d1/auth/d1AuthorizationAssembly.js +4 -3
  58. package/dist/esm/router/cloudflare/d1/auth/d1AuthorizedOperationRouteService.js +2 -0
  59. package/dist/esm/router/cloudflare/d1/auth/d1EmailOtpRouteService.js +25 -0
  60. package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthConfig.js +14 -6
  61. package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthService.js +44 -40
  62. package/dist/esm/router/cloudflare/d1/auth/walletSessionCredentialReaders.js +17 -1
  63. package/dist/esm/router/cloudflare/d1/authorization/authorizedOperationStatements.js +35 -5
  64. package/dist/esm/router/cloudflare/d1/authorization/d1AuthorizationStore.js +258 -99
  65. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.js +31 -4
  66. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceOwnerAuthorizationProvider.js +1 -1
  67. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRequestProofNonceStore.js +1 -1
  68. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionRecords.js +1 -1
  69. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.js +1 -1
  70. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetPlanner.js +1 -1
  71. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceVerifiedLinkBuilder.js +1 -1
  72. package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoLifecycleDecisionStore.js +11 -2
  73. package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.js +100 -10
  74. package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoStateWriteFence.js +92 -0
  75. package/dist/esm/router/cloudflare/d1/ed25519Yao/d1WalletCeremonyActivity.js +77 -0
  76. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.js +14 -8
  77. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.js +14 -8
  78. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.js +3 -1
  79. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.js +58 -38
  80. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.js +27 -20
  81. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecoveryService.js +1 -0
  82. package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpSessionResolver.js +1 -0
  83. package/dist/esm/router/cloudflare/d1/oidc/d1OidcBoundary.js +1 -1
  84. package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.js +18 -7
  85. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.js +75 -14
  86. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.js +1 -1
  87. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.js +49 -29
  88. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationSessionTransaction.js +28 -0
  89. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationSetupSupport.js +11 -1
  90. package/dist/esm/router/cloudflare/d1/registration/d1WalletExecutionAuthority.js +168 -0
  91. package/dist/esm/router/cloudflare/d1/registration/d1WalletOperationStore.js +53 -0
  92. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.js +83 -42
  93. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationInitialSession.js +33 -0
  94. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationPreparation.js +16 -0
  95. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationRead.js +58 -0
  96. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationService.js +439 -500
  97. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetup.js +1 -1
  98. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.js +104 -90
  99. package/dist/esm/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.js +78 -44
  100. package/dist/esm/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.js +11 -35
  101. package/dist/esm/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.js +98 -39
  102. package/dist/esm/router/cloudflare/d1/versionedJson/d1VersionedJsonRecordStore.js +12 -9
  103. package/dist/esm/router/cloudflare/d1/wallet/authorizationSnapshotLayout.js +168 -0
  104. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerFinalizeRecord.js +1 -1
  105. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerService.js +15 -6
  106. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthMethodService.js +3 -40
  107. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorityStore.js +54 -1
  108. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationCleanup.js +157 -0
  109. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationFreeze.js +56 -0
  110. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationHistory.js +238 -0
  111. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationIntake.js +287 -0
  112. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationSnapshot.js +295 -0
  113. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationApprovals.js +140 -0
  114. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationChallenges.js +170 -0
  115. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationEmailOtp.js +60 -0
  116. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationOwner.js +33 -0
  117. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationOwnerRequest.js +74 -0
  118. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationPasskey.js +77 -0
  119. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationReadAccess.js +37 -0
  120. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationSessions.js +97 -0
  121. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationWriteBlock.js +133 -0
  122. package/dist/esm/router/cloudflare/d1/walletObjectAddresses.js +47 -0
  123. package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnAuthService.js +1 -1
  124. package/dist/esm/router/cloudflare/runtime/routerAbServiceBindings.js +32 -1
  125. package/dist/esm/router/cloudflare/runtime/staticWalletConsoleBinding.js +20 -8
  126. package/dist/esm/router/cloudflare/runtime/walletAuthorizationRelocationRoutes.js +488 -0
  127. package/dist/esm/router/cloudflare/runtime/walletConsoleOps.js +1 -1
  128. package/dist/esm/router/cloudflare/runtime/walletConsoleOpsClient.js +26 -6
  129. package/dist/esm/router/cloudflare/runtime/walletControlOps.js +3 -0
  130. package/dist/esm/router/cloudflare/runtime/walletGateway.js +1 -1
  131. package/dist/esm/router/cloudflare/runtime/walletObjectAddresses.js +105 -0
  132. package/dist/esm/router/cloudflare/runtime/walletPlacementRoutes.js +339 -0
  133. package/dist/esm/router/cloudflare/runtime/walletRelocationDeriver.js +244 -0
  134. package/dist/esm/router/cloudflare/runtime/walletRelocationEcdsa.js +212 -0
  135. package/dist/esm/router/cloudflare/runtime/walletRelocationEd25519.js +172 -0
  136. package/dist/esm/router/cloudflare/runtime/walletRelocationOps.js +183 -0
  137. package/dist/esm/router/cloudflare/runtime/walletRelocationPresign.js +185 -0
  138. package/dist/esm/router/cloudflare/runtime/walletRelocationSource.js +221 -0
  139. package/dist/esm/router/cloudflare/signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.js +30 -8
  140. package/dist/esm/router/cloudflare-adaptor.js +8 -8
  141. package/dist/esm/router/cloudflare.js +34115 -32240
  142. package/dist/esm/router/domains/ecdsa/routerAbEcdsaStrictRegistration.js +35 -9
  143. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoCapabilityCommit.js +42 -0
  144. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.js +32 -6
  145. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.js +61 -1
  146. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPersistence.js +70 -3
  147. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRuntime.js +59 -87
  148. package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.js +52 -22
  149. package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExportRequestScopedCloudflare.js +10 -7
  150. package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.js +108 -78
  151. package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryRequestScopedCloudflare.js +19 -5
  152. package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryWalletSessionAuthorization.js +71 -22
  153. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.js +37 -25
  154. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.js +3 -3
  155. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationExecutionRecord.js +2 -1
  156. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.js +24 -3
  157. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationRequestScopedCloudflare.js +4 -3
  158. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.js +20 -7
  159. package/dist/esm/router/domains/ed25519Yao/routerAbEd25519YaoGatewayEnvelope.js +7 -1
  160. package/dist/esm/router/domains/emailOtp/emailOtpRouteHandlers.js +2 -2
  161. package/dist/esm/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrieval.js +1 -1
  162. package/dist/esm/router/domains/passkeyCustody/registrationCustodyOutcome.js +34 -18
  163. package/dist/esm/router/domains/passkeyCustody/walletCustodyRegistrationAdmission.js +2 -2
  164. package/dist/esm/router/domains/passkeyCustody/walletCustodyRegistrationCommit.js +16 -6
  165. package/dist/esm/router/domains/signingOperations/authorizedOperationWire.js +73 -0
  166. package/dist/esm/router/domains/signingOperations/ecdsaSigningResponse.js +31 -0
  167. package/dist/esm/router/domains/signingOperations/ed25519AuthorizedOperationReceipt.js +1 -1
  168. package/dist/esm/router/domains/signingOperations/routerAbEcdsaDerivationNormalSigningRoute.js +2 -1
  169. package/dist/esm/router/domains/signingOperations/routerAbEd25519NormalSigningRoute.js +31 -121
  170. package/dist/esm/router/domains/signingOperations/routerAbNormalSigningAdmission.js +2 -93
  171. package/dist/esm/router/domains/signingOperations/routerAbPrivateSigningWorker.js +1 -1
  172. package/dist/esm/router/domains/signingOperations/signingPrepareSession.js +33 -0
  173. package/dist/esm/router/domains/walletRegistration/registrationSessionSeal.js +121 -0
  174. package/dist/esm/router/domains/walletRegistration/walletRegistrationReservation.js +4 -4
  175. package/dist/esm/router/domains/walletRegistration/walletRegistrationRoutes.js +46 -157
  176. package/dist/esm/router/domains/walletRegistration/walletRegistrationSetupPayload.js +1 -1
  177. package/dist/esm/router/express.js +764 -894
  178. package/dist/esm/router/framework/http.js +2 -1
  179. package/dist/esm/router/transport/fetch/createFetchRouter.js +2 -2
  180. package/dist/esm/router/transport/fetch/routes/auth.js +1 -1
  181. package/dist/esm/router/transport/fetch/routes/deviceLinking.js +3 -3
  182. package/dist/esm/router/transport/fetch/routes/deviceLinkingOwnerAuthorization.js +2 -2
  183. package/dist/esm/router/transport/fetch/routes/ed25519AuthorizedOperationRevalidation.js +65 -0
  184. package/dist/esm/router/transport/fetch/routes/normalSigningRouterProxy.js +13 -3
  185. package/dist/esm/router/transport/fetch/routes/passkeyCustody.js +3 -3
  186. package/dist/esm/router/transport/fetch/routes/sessions.js +3 -2
  187. package/dist/esm/router/transport/fetch/routes/thresholdEcdsa.js +67 -130
  188. package/dist/esm/router/transport/fetch/routes/thresholdEd25519.js +76 -212
  189. package/dist/esm/router/transport/fetch/routes/walletExecutionLanePreflight.js +18 -41
  190. package/dist/esm/router/transport/fetch/routes/walletRegistration.js +6 -5
  191. package/dist/esm/router/transport/fetch/routes/webauthnAuthenticators.js +1 -1
  192. package/dist/esm/shared-ts/src/authorization/index.js +1 -1
  193. package/dist/esm/shared-ts/src/authorization/walletAuthority.js +2 -2
  194. package/dist/esm/shared-ts/src/device-linking/activeWalletSession.js +12 -2
  195. package/dist/esm/shared-ts/src/device-linking/digests.js +1 -1
  196. package/dist/esm/shared-ts/src/device-linking/ed25519ExportRoot.js +1 -1
  197. package/dist/esm/shared-ts/src/device-linking/index.js +1 -1
  198. package/dist/esm/shared-ts/src/device-linking/parsers.js +1 -1
  199. package/dist/esm/shared-ts/src/device-linking/sourceContribution.js +1 -1
  200. package/dist/esm/shared-ts/src/device-linking/wireFields.js +1 -1
  201. package/dist/esm/shared-ts/src/near/nearClient.js +1 -1
  202. package/dist/esm/shared-ts/src/signing-lanes/ownerContinuity.js +2 -2
  203. package/dist/esm/shared-ts/src/utils/ecdsaServerTiming.js +6 -1
  204. package/dist/esm/shared-ts/src/utils/emailOtpDomain.js +4 -2
  205. package/dist/esm/shared-ts/src/utils/routerAbEcdsaDerivation.js +1 -1
  206. package/dist/esm/shared-ts/src/utils/routerAbPublicKeyset.js +0 -27
  207. package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryEcdsaPossession.js +1 -1
  208. package/dist/esm/threshold/session/signingSessionSeal/options.js +1 -1
  209. package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker_bg.wasm +0 -0
  210. package/dist/types/shared-ts/src/device-linking/activeWalletSession.d.ts +2 -1
  211. package/dist/types/shared-ts/src/device-linking/contracts.d.ts +10 -0
  212. package/dist/types/shared-ts/src/threshold/ed25519OperationFingerprint.d.ts +2 -1
  213. package/dist/types/shared-ts/src/utils/emailOtpDomain.d.ts +3 -1
  214. package/dist/types/shared-ts/src/utils/routerAbPublicKeyset.d.ts +0 -9
  215. package/dist/types/shared-ts/src/utils/walletManagementProtocol.d.ts +1 -1
  216. package/dist/types/wallet-server/src/authorization/domain.d.ts +17 -1
  217. package/dist/types/wallet-server/src/authorization/ecdsaWalletSessionAdmission.d.ts +1 -0
  218. package/dist/types/wallet-server/src/authorization/ed25519WalletSessionAdmission.d.ts +35 -0
  219. package/dist/types/wallet-server/src/authorization/ed25519WalletSessionAdmission.typecheck.d.ts +2 -0
  220. package/dist/types/wallet-server/src/authorization/service.d.ts +43 -5
  221. package/dist/types/wallet-server/src/authorization/sessionRouting.d.ts +2 -0
  222. package/dist/types/wallet-server/src/cloud-host.d.ts +7 -3
  223. package/dist/types/wallet-server/src/core/EmailOtpRecords.d.ts +2 -1
  224. package/dist/types/wallet-server/src/core/EmailOtpStores.d.ts +19 -5
  225. package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.d.ts +1 -0
  226. package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPresignBridge.d.ts +6 -0
  227. package/dist/types/wallet-server/src/core/ThresholdService/routerAb/internalServiceHttp.d.ts +1 -0
  228. package/dist/types/wallet-server/src/core/d1Ed25519SignerRead.d.ts +17 -0
  229. package/dist/types/wallet-server/src/core/d1WalletStore.d.ts +6 -0
  230. package/dist/types/wallet-server/src/core/emailOtpD1Statements.d.ts +1 -0
  231. package/dist/types/wallet-server/src/core/routerAbSigning/RouterAbEcdsaPresignRuntime.d.ts +5 -1
  232. package/dist/types/wallet-server/src/core/signingMaterial/ordinaryInactiveSignerMaterialReservation.d.ts +1 -0
  233. package/dist/types/wallet-server/src/core/threeRouteRegistrationContracts.d.ts +14 -48
  234. package/dist/types/wallet-server/src/hosted-wallet-gateway.d.ts +4 -3
  235. package/dist/types/wallet-server/src/localIntendedYaoSigningFault.d.ts +1 -16
  236. package/dist/types/wallet-server/src/localRegistrationSetupAuthority.d.ts +1 -1
  237. package/dist/types/wallet-server/src/router/auth/commonRouterUtils.d.ts +7 -1
  238. package/dist/types/wallet-server/src/router/auth/routerApiCredentialAuth.d.ts +11 -3
  239. package/dist/types/wallet-server/src/router/auth/walletRegistrationContext.d.ts +8 -0
  240. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1AuthorizationAssembly.d.ts +1 -1
  241. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1EmailOtpRouteService.d.ts +16 -0
  242. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthConfig.d.ts +7 -4
  243. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthService.d.ts +4 -1
  244. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/walletSessionCredentialReaders.d.ts +7 -1
  245. package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/d1AuthorizationStore.d.ts +32 -1
  246. package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.d.ts +2 -0
  247. package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoLifecycleDecisionStore.d.ts +3 -1
  248. package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.d.ts +1 -0
  249. package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoStateWriteFence.d.ts +8 -0
  250. package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1WalletCeremonyActivity.d.ts +15 -0
  251. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.d.ts +6 -1
  252. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.d.ts +1 -0
  253. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.d.ts +4 -1
  254. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpCounters.typecheck.d.ts +2 -0
  255. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.d.ts +6 -29
  256. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.d.ts +21 -7
  257. package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.d.ts +17 -1
  258. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.d.ts +32 -7
  259. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.d.ts +16 -7
  260. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationSessionTransaction.d.ts +13 -0
  261. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationSetupSupport.d.ts +7 -0
  262. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletExecutionAuthority.d.ts +41 -0
  263. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletOperationStore.d.ts +28 -0
  264. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.d.ts +6 -9
  265. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationInitialSession.d.ts +17 -0
  266. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationPreparation.d.ts +12 -0
  267. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationRead.d.ts +43 -0
  268. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationService.d.ts +24 -45
  269. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.d.ts +9 -4
  270. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.d.ts +42 -14
  271. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.d.ts +5 -4
  272. package/dist/types/wallet-server/src/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.d.ts +24 -1
  273. package/dist/types/wallet-server/src/router/cloudflare/d1/versionedJson/d1VersionedJsonRecordStore.d.ts +10 -4
  274. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/authorizationSnapshotLayout.d.ts +21 -0
  275. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAddSignerService.d.ts +3 -0
  276. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthMethodService.d.ts +3 -7
  277. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorityStore.d.ts +8 -0
  278. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationCleanup.d.ts +20 -0
  279. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationFreeze.d.ts +12 -0
  280. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationHistory.d.ts +20 -0
  281. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationIntake.d.ts +29 -0
  282. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationSnapshot.d.ts +31 -0
  283. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationApprovals.d.ts +49 -0
  284. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationChallenges.d.ts +47 -0
  285. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationEmailOtp.d.ts +25 -0
  286. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationOwner.d.ts +88 -0
  287. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationOwnerRequest.d.ts +37 -0
  288. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationPasskey.d.ts +12 -0
  289. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationReadAccess.d.ts +18 -0
  290. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationSessions.d.ts +23 -0
  291. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationWriteBlock.d.ts +16 -0
  292. package/dist/types/wallet-server/src/router/cloudflare/d1/walletObjectAddresses.d.ts +14 -0
  293. package/dist/types/wallet-server/src/router/cloudflare/runtime/routerAbServiceBindings.d.ts +13 -0
  294. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletAuthorizationRelocationRoutes.d.ts +21 -0
  295. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOps.d.ts +1 -1
  296. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOpsClient.d.ts +3 -3
  297. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletControlOps.d.ts +2 -1
  298. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletGateway.d.ts +3 -1
  299. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletObjectAddresses.d.ts +45 -0
  300. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletPlacementRoutes.d.ts +30 -0
  301. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationDeriver.d.ts +11 -0
  302. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationEcdsa.d.ts +7 -0
  303. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationEd25519.d.ts +7 -0
  304. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationOps.d.ts +11 -0
  305. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationPresign.d.ts +7 -0
  306. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationSource.d.ts +26 -0
  307. package/dist/types/wallet-server/src/router/cloudflare/signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.d.ts +5 -0
  308. package/dist/types/wallet-server/src/router/domains/ecdsa/routerAbEcdsaStrictRegistration.d.ts +3 -0
  309. package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoCapabilityCommit.d.ts +7 -0
  310. package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.d.ts +41 -7
  311. package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.d.ts +33 -2
  312. package/dist/types/wallet-server/src/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.d.ts +12 -6
  313. package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.d.ts +17 -9
  314. package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryWalletSessionAuthorization.d.ts +2 -0
  315. package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.d.ts +13 -14
  316. package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.d.ts +7 -3
  317. package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationExecutionRecord.d.ts +1 -0
  318. package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.d.ts +6 -1
  319. package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.d.ts +11 -0
  320. package/dist/types/wallet-server/src/router/domains/ed25519Yao/routerAbEd25519YaoGatewayEnvelope.d.ts +12 -3
  321. package/dist/types/wallet-server/src/router/domains/passkeyCustody/registrationCustodyOutcome.d.ts +10 -6
  322. package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationAdmission.d.ts +10 -3
  323. package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationCommit.d.ts +12 -5
  324. package/dist/types/wallet-server/src/router/domains/signingOperations/authorizedOperationWire.d.ts +97 -0
  325. package/dist/types/wallet-server/src/router/domains/signingOperations/ecdsaSigningResponse.d.ts +13 -0
  326. package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbNormalSigningAdmission.d.ts +9 -206
  327. package/dist/types/wallet-server/src/router/domains/signingOperations/signingPrepareSession.d.ts +23 -0
  328. package/dist/types/wallet-server/src/router/domains/walletRegistration/registrationSessionSeal.d.ts +36 -0
  329. package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationInputs.d.ts +7 -7
  330. package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationReservation.d.ts +80 -6
  331. package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationRoutes.d.ts +15 -5
  332. package/dist/types/wallet-server/src/router/framework/apiCredentialPorts.d.ts +24 -0
  333. package/dist/types/wallet-server/src/router/framework/authServicePort.d.ts +21 -7
  334. package/dist/types/wallet-server/src/router/framework/routerApi.d.ts +3 -12
  335. package/dist/types/wallet-server/src/router/transport/fetch/routes/ed25519AuthorizedOperationRevalidation.d.ts +37 -0
  336. package/dist/types/wallet-server/src/router/transport/fetch/routes/thresholdEcdsa.d.ts +1 -17
  337. package/dist/types/wallet-server/src/storage/tenantRoute.d.ts +1 -1
  338. package/migrations/d1-signer/0049_wallet_relocation_challenges.sql +16 -0
  339. package/migrations/d1-signer/0050_wallet_relocation_approvals.sql +14 -0
  340. package/migrations/d1-signer/0051_wallet_relocation_email_otp.sql +92 -0
  341. package/migrations/d1-signer/0052_wallet_relocation_session_fences.sql +91 -0
  342. package/migrations/d1-signer/0053_wallet_hosted_history_import.sql +164 -0
  343. package/migrations/d1-signer/0054_wallet_authorization_freeze.sql +318 -0
  344. package/migrations/d1-signer/0055_wallet_authorization_snapshot.sql +120 -0
  345. package/migrations/d1-signer/0056_wallet_authorization_history_import.sql +424 -0
  346. package/migrations/d1-signer/0057_wallet_authorization_intake.sql +44 -0
  347. package/migrations/d1-signer/0058_wallet_ceremony_activity.sql +59 -0
  348. package/migrations/d1-signer/0059_wallet_authorization_activation.sql +45 -0
  349. package/migrations/d1-signer/0060_wallet_authorization_cleanup.sql +153 -0
  350. package/migrations/d1-signer/0061_wallet_session_operation_settlement.sql +28 -0
  351. package/migrations/d1-signer/0062_wallet_step_up_operation_settlement.sql +204 -0
  352. package/migrations/d1-signer/0063_wallet_operation_history_transfer.sql +466 -0
  353. package/migrations/d1-signer/0064_wallet_execution_generations.sql +93 -0
  354. package/migrations/d1-signer/0065_wallet_operation_execution_generation.sql +37 -0
  355. package/migrations/d1-signer/0066_regional_deployment_admission.sql +59 -0
  356. package/migrations/d1-signer/0067_registration_completion_decision.sql +12 -0
  357. package/migrations/d1-signer/0068_registration_cancellation_write_fence.sql +24 -0
  358. package/migrations/d1-signer/0069_cancelled_registration_session_fence.sql +11 -0
  359. package/migrations/d1-signer/0070_wallet_passkey_relocation.sql +369 -0
  360. package/migrations/d1-signer/0071_regional_wallet_otp_counters.sql +98 -0
  361. package/migrations/d1-signer/0072_linked_device_relocation_history.sql +899 -0
  362. package/migrations/d1-signer/0073_wallet_recovery_relocation.sql +86 -0
  363. package/migrations/d1-signer/0074_email_otp_relocation.sql +158 -0
  364. package/migrations/d1-signer/0075_wallet_authorization_return.sql +107 -0
  365. package/migrations/d1-signer/0076_wallet_relocation_write_block.sql +406 -0
  366. package/migrations/d1-signer/0077_wallet_object_addresses.sql +24 -0
  367. package/package.json +1 -1
  368. package/src/README.md +23 -1
  369. package/cloudflare-router-ab/scripts/local-key-material.mjs +0 -29
@@ -1,10 +1,10 @@
1
1
  import { mpcMaterialActivationRefsEqual, parseLinkDeviceSessionId, parseWalletAuthMethodId, parseWalletAuthorityId, parseWalletId, parseWalletKeyId } from "../../../../shared-ts/src/utils/domainIds.js";
2
2
  import { parseDeviceId, parsePrincipalId, parseTenantId, parseWalletSessionMintId } from "../../../../shared-ts/src/authorization/capabilityKinds.js";
3
+ import { isPlainObject } from "../../../../shared-ts/src/utils/validation.js";
4
+ import { buildDelegatedWalletAuthorityV1, parseDelegatedWalletPermissionSetV1, validateDelegatedWalletAuthorityAttenuationV1 } from "../../../../shared-ts/src/authorization/delegatedAuthority.js";
3
5
  import { base64UrlDecode, base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
4
6
  import { alphabetizeStringify, sha256BytesUtf8 } from "../../../../shared-ts/src/utils/digests.js";
5
7
  import { parseDigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
6
- import { isPlainObject } from "../../../../shared-ts/src/utils/validation.js";
7
- import { buildDelegatedWalletAuthorityV1, parseDelegatedWalletPermissionSetV1, validateDelegatedWalletAuthorityAttenuationV1 } from "../../../../shared-ts/src/authorization/delegatedAuthority.js";
8
8
  import { routerAbMpcMaterialActivationRefFromWire, routerAbMpcMaterialActivationRefToWire } from "../../../../shared-ts/src/utils/routerAbNormalSigningIdentity.js";
9
9
  import { parseRouterAbEd25519YaoApplicationBindingFactsV1, parseRouterAbEd25519YaoCeremonyBindingV1, sameRouterAbEd25519YaoActivationBindingV1 } from "../../../../shared-ts/src/utils/routerAbEd25519Yao.js";
10
10
  import { assertLinkedDeviceOrdinaryMaterialSourceContributionMatchesContextV1, parseLinkedDeviceEcdsaSourceContributionPackageV1, parseLinkedDeviceEcdsaSourceDerivationV1, parseLinkedDeviceOrdinaryMaterialSourceContributionV1 } from "../../../../shared-ts/src/device-linking/sourceContribution.js";
@@ -25,6 +25,7 @@ import "../../../../core/deviceLinking/requestProof.js";
25
25
  import { reservePasskeyCredential } from "../../../../core/passkeyCredentialClaims.js";
26
26
  import { prepareD1WebAuthnCredentialBindingInsertStatement } from "../../../../core/WebAuthnCredentialBindingStore.js";
27
27
  import { prepareD1WebAuthnAuthenticatorInsertStatement } from "../webauthn/d1WebAuthnStore.js";
28
+ import { admitD1EstablishedWalletHome } from "../registration/d1WalletExecutionAuthority.js";
28
29
  import { findInstalledEcdsaAuthority, installedEcdsaAuthorityChain, projectInstalledEcdsaAuthority } from "./installedEcdsaAuthority.js";
29
30
  import { buildAuthorityActiveSessionRecordV1, buildAuthorityPendingLocalInstallSessionRecordV1 } from "../../../../core/deviceLinking/linkedDeviceSessionRecord.js";
30
31
  import { linkedDeviceX25519RecipientPublicKeyB64uV1 } from "./d1LinkedDeviceSourceContributionPreparationPlanner.js";
@@ -738,6 +739,9 @@ var D1LinkedDeviceAuthorityInstallServiceV1 = class {
738
739
  }
739
740
  async reserveSignerMaterial(input, sourceContributionPreparation) {
740
741
  assertRecipientRequestsMatchManifest(input);
742
+ const admitted = await admitD1EstablishedWalletHome(this.options.database, this.options.scope, { walletId: input.walletId });
743
+ if (!admitted.ok) throw new Error(admitted.message);
744
+ const ownershipGeneration = admitted.ownershipGeneration;
741
745
  let ed25519;
742
746
  let ecdsa;
743
747
  let ed25519Preparation;
@@ -777,6 +781,7 @@ var D1LinkedDeviceAuthorityInstallServiceV1 = class {
777
781
  assertPreparationActivationMatches(targetMaterialActivation, workerPreparation.sourceContribution.targetMaterialActivation);
778
782
  const reservation = await this.options.reservationService.reserveOrdinaryInactiveSignerMaterialV1({
779
783
  kind: "ordinary_ed25519_signer_material_reservation_request_v1",
784
+ ownershipGeneration,
780
785
  keyFamily: "ed25519",
781
786
  signer,
782
787
  plannedActivationRef: targetMaterialActivation,
@@ -792,6 +797,7 @@ var D1LinkedDeviceAuthorityInstallServiceV1 = class {
792
797
  assertPreparationActivationMatches(targetMaterialActivation, workerPreparation.sourceContribution.binding.target.activation);
793
798
  const reservation = await this.options.reservationService.reserveOrdinaryInactiveSignerMaterialV1({
794
799
  kind: "ordinary_ecdsa_signer_material_reservation_request_v1",
800
+ ownershipGeneration,
795
801
  keyFamily: "ecdsa_secp256k1",
796
802
  signer,
797
803
  plannedActivationRef: targetMaterialActivation,
@@ -814,10 +820,12 @@ var D1LinkedDeviceAuthorityInstallServiceV1 = class {
814
820
  ordinarySignerMaterialPreparations: sourceContributionPreparation,
815
821
  serverReservationIds: {
816
822
  ed25519: {
823
+ ownershipGeneration,
817
824
  reservationId: ed25519.serverMaterial.reservationId,
818
825
  preparation: ed25519Preparation
819
826
  },
820
827
  ecdsa_secp256k1: {
828
+ ownershipGeneration,
821
829
  reservationId: ecdsa.serverMaterial.reservationId,
822
830
  preparation: ecdsaPreparation
823
831
  }
@@ -834,6 +842,7 @@ var D1LinkedDeviceAuthorityInstallServiceV1 = class {
834
842
  },
835
843
  ordinarySignerMaterialPreparations: sourceContributionPreparation,
836
844
  serverReservationIds: { ed25519: {
845
+ ownershipGeneration,
837
846
  reservationId: ed25519.serverMaterial.reservationId,
838
847
  preparation: ed25519Preparation
839
848
  } }
@@ -849,6 +858,7 @@ var D1LinkedDeviceAuthorityInstallServiceV1 = class {
849
858
  },
850
859
  ordinarySignerMaterialPreparations: sourceContributionPreparation,
851
860
  serverReservationIds: { ecdsa_secp256k1: {
861
+ ownershipGeneration,
852
862
  reservationId: ecdsa.serverMaterial.reservationId,
853
863
  preparation: ecdsaPreparation
854
864
  } }
@@ -862,6 +872,7 @@ var D1LinkedDeviceAuthorityInstallServiceV1 = class {
862
872
  const reservation = stored.serverReservationIds.ed25519;
863
873
  if (!reservation || !packageValue) throw new Error("server reservation for ed25519 is missing");
864
874
  await activation.activateOrdinaryInactiveSignerMaterialV1({
875
+ ownershipGeneration: reservation.ownershipGeneration,
865
876
  keyFamily: "ed25519",
866
877
  reservationId: reservation.reservationId,
867
878
  materialActivation: packageValue.materialActivation,
@@ -877,6 +888,7 @@ var D1LinkedDeviceAuthorityInstallServiceV1 = class {
877
888
  const reservation = stored.serverReservationIds.ecdsa_secp256k1;
878
889
  if (!reservation || !packageValue) throw new Error("server reservation for ECDSA is missing");
879
890
  await activation.activateOrdinaryInactiveSignerMaterialV1({
891
+ ownershipGeneration: reservation.ownershipGeneration,
880
892
  keyFamily: "ecdsa_secp256k1",
881
893
  reservationId: reservation.reservationId,
882
894
  materialActivation: packageValue.materialActivation,
@@ -1616,7 +1628,11 @@ function parseServerReservationIds(raw) {
1616
1628
  }
1617
1629
  function parseEd25519ServerReservationRecord(raw) {
1618
1630
  const record = requireRecord(raw, "Ed25519 server reservation");
1619
- requireExactKeys(record, ["reservationId", "preparation"], "Ed25519 server reservation");
1631
+ requireExactKeys(record, Object.hasOwn(record, "ownershipGeneration") ? [
1632
+ "reservationId",
1633
+ "preparation",
1634
+ "ownershipGeneration"
1635
+ ] : ["reservationId", "preparation"], "Ed25519 server reservation");
1620
1636
  const preparationRecord = requireRecord(record.preparation, "Ed25519 reservation preparation");
1621
1637
  requireExactKeys(preparationRecord, [
1622
1638
  "kind",
@@ -1631,6 +1647,7 @@ function parseEd25519ServerReservationRecord(raw) {
1631
1647
  const applicationBinding = parseRouterAbEd25519YaoApplicationBindingFactsV1(preparationRecord.applicationBinding);
1632
1648
  if (targetBinding.operation !== "registration") throw new Error("Ed25519 target binding must use registration");
1633
1649
  return {
1650
+ ownershipGeneration: storedReservationGeneration(record),
1634
1651
  reservationId: requireReservationId(record.reservationId, "Ed25519 server reservation id"),
1635
1652
  preparation: {
1636
1653
  kind: "ordinary_ed25519_signer_material_reservation_preparation_v1",
@@ -1642,7 +1659,11 @@ function parseEd25519ServerReservationRecord(raw) {
1642
1659
  }
1643
1660
  function parseEcdsaServerReservationRecord(raw) {
1644
1661
  const record = requireRecord(raw, "ECDSA server reservation");
1645
- requireExactKeys(record, ["reservationId", "preparation"], "ECDSA server reservation");
1662
+ requireExactKeys(record, Object.hasOwn(record, "ownershipGeneration") ? [
1663
+ "reservationId",
1664
+ "preparation",
1665
+ "ownershipGeneration"
1666
+ ] : ["reservationId", "preparation"], "ECDSA server reservation");
1646
1667
  const preparationRecord = requireRecord(record.preparation, "ECDSA reservation preparation");
1647
1668
  requireExactKeys(preparationRecord, [
1648
1669
  "kind",
@@ -1651,6 +1672,7 @@ function parseEcdsaServerReservationRecord(raw) {
1651
1672
  ], "ECDSA reservation preparation");
1652
1673
  if (preparationRecord.kind !== "ordinary_ecdsa_signer_material_reservation_preparation_v1") throw new Error("ECDSA reservation preparation kind is invalid");
1653
1674
  return {
1675
+ ownershipGeneration: storedReservationGeneration(record),
1654
1676
  reservationId: requireReservationId(record.reservationId, "ECDSA server reservation id"),
1655
1677
  preparation: {
1656
1678
  kind: "ordinary_ecdsa_signer_material_reservation_preparation_v1",
@@ -1865,6 +1887,11 @@ function requireTime(raw, label) {
1865
1887
  function errorMessage(error) {
1866
1888
  return error instanceof Error ? error.message : String(error);
1867
1889
  }
1890
+ function storedReservationGeneration(record) {
1891
+ const generation = Object.hasOwn(record, "ownershipGeneration") ? record.ownershipGeneration : 1;
1892
+ if (typeof generation !== "number" || !Number.isSafeInteger(generation) || generation < 1) throw new Error("Stored reservation ownership generation is invalid");
1893
+ return generation;
1894
+ }
1868
1895
  //#endregion
1869
1896
  export { D1LinkedDeviceAuthorityInstallServiceV1, parseInstalledEcdsaCustodySnapshotV1, readD1LinkedDeviceEcdsaSourceV1, readD1LinkedDeviceEd25519SourceV1 };
1870
1897
 
@@ -1,9 +1,9 @@
1
1
  import { mpcMaterialActivationRefsEqual, parseEcdsaRelayerKeyId, parseLinkDeviceSessionId, parseLinkedDeviceEnrollmentId, parseLinkedDeviceId, parseProviderSubject } from "../../../../shared-ts/src/utils/domainIds.js";
2
2
  import { parseWalletSessionAuthorizationId, parseWalletSessionId } from "../../../../shared-ts/src/authorization/capabilityKinds.js";
3
+ import { buildFullOwnerDelegatedWalletAuthorityV1, hasDelegatedWalletPermissionV1, validateDelegatedWalletAuthorityAttenuationV1 } from "../../../../shared-ts/src/authorization/delegatedAuthority.js";
3
4
  import { base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
4
5
  import { alphabetizeStringify, sha256BytesUtf8 } from "../../../../shared-ts/src/utils/digests.js";
5
6
  import { parseDigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
6
- import { buildFullOwnerDelegatedWalletAuthorityV1, hasDelegatedWalletPermissionV1, validateDelegatedWalletAuthorityAttenuationV1 } from "../../../../shared-ts/src/authorization/delegatedAuthority.js";
7
7
  import { parseSecp256k1CompressedPublicKeyB64u } from "../../../../shared-ts/src/passkey-custody/primitives.js";
8
8
  import { routerAbMpcMaterialActivationRefFromWire } from "../../../../shared-ts/src/utils/routerAbNormalSigningIdentity.js";
9
9
  import { deriveRouterAbEd25519YaoApplicationBindingDigestV1 } from "../../../../shared-ts/src/utils/routerAbEd25519YaoDigests.js";
@@ -1,7 +1,7 @@
1
1
  import { parseLinkDeviceSessionId } from "../../../../shared-ts/src/utils/domainIds.js";
2
+ import { isObject, requireCanonicalString } from "../../../../shared-ts/src/utils/validation.js";
2
3
  import { base64UrlDecode, base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
3
4
  import { parseDigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
4
- import { isObject, requireCanonicalString } from "../../../../shared-ts/src/utils/validation.js";
5
5
  import { d1ChangedRows } from "../../../../storage/d1Sql.js";
6
6
  //#region src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRequestProofNonceStore.ts
7
7
  const NONCE_TABLE = "linked_device_request_proof_nonces";
@@ -1,6 +1,6 @@
1
1
  import { parseWalletAuthorityId } from "../../../../shared-ts/src/utils/domainIds.js";
2
- import { parseDigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
3
2
  import { requireCanonicalString } from "../../../../shared-ts/src/utils/validation.js";
3
+ import { parseDigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
4
4
  import { parseLinkedDeviceSessionRecordV1 } from "../../../../core/deviceLinking/linkedDeviceSessionRecord.js";
5
5
  //#region src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionRecords.ts
6
6
  function parseD1LinkedDeviceSessionRowV1(row) {
@@ -1,8 +1,8 @@
1
1
  import { hasControlCharacter, mpcMaterialActivationRefsEqual, parseWebAuthnCredentialIdB64u } from "../../../../shared-ts/src/utils/domainIds.js";
2
+ import { requireCanonicalString, requireRecord } from "../../../../shared-ts/src/utils/validation.js";
2
3
  import { base64UrlDecode, base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
3
4
  import { alphabetizeStringify } from "../../../../shared-ts/src/utils/digests.js";
4
5
  import { parseDigestB64u, sha256Utf8DigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
5
- import { requireCanonicalString, requireRecord } from "../../../../shared-ts/src/utils/validation.js";
6
6
  import { routerAbMpcMaterialActivationRefFromWire } from "../../../../shared-ts/src/utils/routerAbNormalSigningIdentity.js";
7
7
  import { parseLinkedDeviceOrdinaryMaterialSourceContributionPreparationTupleV1 } from "../../../../shared-ts/src/device-linking/sourceContribution.js";
8
8
  import { parseLinkedDeviceTargetCredentialRegistrationResultV1, parseLinkedDeviceTargetCredentialRegistrationV1, parseLinkedDeviceTargetPreparationV1 } from "../../../../shared-ts/src/device-linking/parsers.js";
@@ -1,6 +1,6 @@
1
1
  import { parseWalletAuthMethodId, parseWebAuthnRpId } from "../../../../shared-ts/src/utils/domainIds.js";
2
- import { base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
3
2
  import { hasDelegatedWalletPermissionV1 } from "../../../../shared-ts/src/authorization/delegatedAuthority.js";
3
+ import { base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
4
4
  import { buildLinkedDeviceTargetPreparationV1 } from "../../../../shared-ts/src/device-linking/parsers.js";
5
5
  import { computeLinkedDevicePasskeyTargetConfigurationDigestV1 } from "../../../../shared-ts/src/device-linking/digests.js";
6
6
  import { secureRandomBase64Url } from "../../../../shared-ts/src/utils/secureRandomId.js";
@@ -1,9 +1,9 @@
1
1
  import { parseWebAuthnCredentialIdB64u } from "../../../../shared-ts/src/utils/domainIds.js";
2
2
  import { parseDeviceId } from "../../../../shared-ts/src/authorization/capabilityKinds.js";
3
+ import { buildDelegatedWalletAuthorityV1, validateDelegatedWalletAuthorityAttenuationV1 } from "../../../../shared-ts/src/authorization/delegatedAuthority.js";
3
4
  import { base64UrlDecode, base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
4
5
  import { alphabetizeStringify } from "../../../../shared-ts/src/utils/digests.js";
5
6
  import { sha256Utf8DigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
6
- import { buildDelegatedWalletAuthorityV1, validateDelegatedWalletAuthorityAttenuationV1 } from "../../../../shared-ts/src/authorization/delegatedAuthority.js";
7
7
  import { buildExactAdministeredSignerManifestV1 } from "../../../../shared-ts/src/device-linking/delegatedActivationPlan.js";
8
8
  import { walletAuthorityDigestsMatchV1 } from "../../../../shared-ts/src/authorization/walletAuthority.js";
9
9
  import { sourceKeyManifestDigestForFamilyV1 } from "../../../../core/deviceLinking/linkedDeviceSessionRecord.js";
@@ -16,16 +16,25 @@ var CloudflareD1Ed25519YaoLifecycleDecisionStoreV1 = class {
16
16
  };
17
17
  }
18
18
  async read(lifecycleId) {
19
- const row = await this.database.prepare(`SELECT decision_kind, decision_id, wallet_id
19
+ const result = await this.prepareRead(lifecycleId).all();
20
+ return this.parseRead(lifecycleId, result);
21
+ }
22
+ prepareRead(lifecycleId) {
23
+ return this.database.prepare(`SELECT decision_kind, decision_id, wallet_id
20
24
  FROM yao_lifecycle_decisions
21
25
  WHERE namespace = ?1
22
26
  AND org_id = ?2
23
27
  AND project_id = ?3
24
28
  AND env_id = ?4
25
- AND lifecycle_id = ?5`).bind(this.scope.namespace, this.scope.orgId, this.scope.projectId, this.scope.envId, lifecycleId).first();
29
+ AND lifecycle_id = ?5`).bind(this.scope.namespace, this.scope.orgId, this.scope.projectId, this.scope.envId, lifecycleId);
30
+ }
31
+ parseRead(lifecycleId, result) {
32
+ if (!result.success) throw new Error("Ed25519 Yao lifecycle decision read failed");
33
+ const row = result.results?.[0];
26
34
  if (!row) return null;
27
35
  const kind = parseDecisionKind(row.decision_kind);
28
36
  if (!kind) throw new Error("Stored Ed25519 Yao lifecycle decision has an unknown kind");
37
+ if (typeof row.decision_id !== "string" || typeof row.wallet_id !== "string") throw new Error("Stored Ed25519 Yao lifecycle decision has invalid identities");
29
38
  return {
30
39
  lifecycleId,
31
40
  kind,
@@ -1,21 +1,111 @@
1
+ import { ROUTER_AB_ED25519_YAO_SHARED_STATE_RECORD_KEY_V1, createRouterAbEd25519YaoProductRegistrationPartitionedStateStoreV1, encodeRouterAbEd25519YaoProductRegistrationPartitionRecordV1, parseRouterAbEd25519YaoProductRegistrationPartitionRecordJsonV1, parseRouterAbEd25519YaoProductRegistrationPartitionRecordV1 } from "../../../domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.js";
1
2
  import { createCloudflareD1VersionedJsonRecordStore } from "../versionedJson/d1VersionedJsonRecordStore.js";
2
- import { createRouterAbEd25519YaoProductRegistrationPartitionedStateStoreV1, parseRouterAbEd25519YaoProductRegistrationPartitionRecordJsonV1 } from "../../../domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.js";
3
+ import { D1WalletCeremonyActivity, ceremonySettled } from "./d1WalletCeremonyActivity.js";
4
+ import { collectChangedStateWallets, lifecycleWriteFenceStatements } from "./d1Ed25519YaoStateWriteFence.js";
3
5
  //#region src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.ts
4
6
  function createRouterAbEd25519YaoProductRegistrationPartitionedStateStoreFromD1V1(options) {
5
- const records = createCloudflareD1VersionedJsonRecordStore({
7
+ return createRouterAbEd25519YaoProductRegistrationPartitionedStateStoreV1(new D1LifecycleRecords(options, createLifecycleRecords(options)));
8
+ }
9
+ var D1LifecycleRecords = class {
10
+ constructor(options, records) {
11
+ this.options = options;
12
+ this.records = records;
13
+ this.observed = /* @__PURE__ */ new Map();
14
+ }
15
+ async readMany(keys) {
16
+ const entries = await this.records.readMany(keys);
17
+ this.observed.clear();
18
+ for (const entry of entries) if (entry.result.kind === "present") this.observed.set(entry.key, {
19
+ version: entry.result.version,
20
+ value: structuredClone(entry.result.value)
21
+ });
22
+ return entries;
23
+ }
24
+ async putMany(mutations, companion) {
25
+ const keys = [];
26
+ const wallets = /* @__PURE__ */ new Set();
27
+ const previousValues = /* @__PURE__ */ new Map();
28
+ for (const mutation of mutations) {
29
+ if (mutation.expectedVersion === null) continue;
30
+ const observed = this.observed.get(mutation.key);
31
+ if (observed?.version === mutation.expectedVersion) previousValues.set(mutation.key, observed.value);
32
+ else keys.push(mutation.key);
33
+ }
34
+ this.observed.clear();
35
+ const previous = keys.length === 0 ? [] : await this.records.readMany(keys);
36
+ for (const entry of previous) if (entry.result.kind === "present") previousValues.set(entry.key, entry.result.value);
37
+ const activity = new D1WalletCeremonyActivity(this.options.database, this.options.scope);
38
+ const projections = [];
39
+ for (const mutation of mutations) {
40
+ const previousValue = previousValues.get(mutation.key);
41
+ const before = previousValue === void 0 ? null : readPartition(previousValue);
42
+ const after = readPartition(mutation.value);
43
+ const changedWallets = /* @__PURE__ */ new Set();
44
+ collectChangedStateWallets(before, after, changedWallets);
45
+ for (const walletId of changedWallets) wallets.add(walletId);
46
+ if (after.kind === "router_ab_ed25519_yao_product_registration_ceremony_record_v1") {
47
+ if (changedWallets.size > 1) throw new Error("Ceremony wallet owner changed");
48
+ for (const walletId of changedWallets) projections.push(activity.project(this.records.storageKey(mutation.key), walletId, ceremonySettled(after.value)));
49
+ }
50
+ }
51
+ return this.records.putManyWithAdditionalStatements(mutations, [
52
+ ...lifecycleWriteFenceStatements(this.options, wallets),
53
+ ...projections,
54
+ ...companion?.statements ?? []
55
+ ], companion?.executeBatch);
56
+ }
57
+ };
58
+ function identityVersionedJsonObject(value) {
59
+ return value;
60
+ }
61
+ function readPartition(value) {
62
+ const record = parseRouterAbEd25519YaoProductRegistrationPartitionRecordV1(value);
63
+ if (!record) throw new Error("Lifecycle mutation contains an invalid partition record");
64
+ return record;
65
+ }
66
+ async function evictWalletEd25519CapabilityCache(options, walletId) {
67
+ const records = createLifecycleRecords(options);
68
+ const key = ROUTER_AB_ED25519_YAO_SHARED_STATE_RECORD_KEY_V1;
69
+ const current = await records.read(key);
70
+ if (current.kind !== "present") return;
71
+ const partition = readPartition(current.value);
72
+ if (partition.kind !== "router_ab_ed25519_yao_product_registration_shared_record_v1") throw new Error("Capability cache has an invalid partition kind");
73
+ const capabilities = new Map(partition.value.recoveryCapabilities);
74
+ const identities = new Map(partition.value.recoveryIdentityCapabilities);
75
+ const removed = /* @__PURE__ */ new Set();
76
+ for (const [capabilityKey, capability] of capabilities) {
77
+ if (capability.identity.applicationBinding.wallet_id !== walletId) continue;
78
+ if (capability.kind === "suspended") throw new Error("Relocation cleanup cannot evict an unsettled capability");
79
+ capabilities.delete(capabilityKey);
80
+ removed.add(capabilityKey);
81
+ }
82
+ if (removed.size === 0) return;
83
+ for (const [identity, capabilityKey] of identities) if (removed.has(capabilityKey)) identities.delete(identity);
84
+ const value = encodeRouterAbEd25519YaoProductRegistrationPartitionRecordV1({
85
+ kind: "router_ab_ed25519_yao_product_registration_shared_record_v1",
86
+ value: {
87
+ kind: partition.value.kind,
88
+ recoveryCapabilities: capabilities,
89
+ recoveryIdentityCapabilities: identities,
90
+ recoverySessions: partition.value.recoverySessions,
91
+ exportAuthorizationNonceOwners: partition.value.exportAuthorizationNonceOwners,
92
+ exportAuthorizationUncertainOwners: partition.value.exportAuthorizationUncertainOwners
93
+ }
94
+ });
95
+ if ((await records.putMany([{
96
+ key,
97
+ value,
98
+ expectedVersion: current.version
99
+ }])).kind !== "stored") throw new Error("Capability cache changed during cleanup");
100
+ }
101
+ function createLifecycleRecords(options) {
102
+ return createCloudflareD1VersionedJsonRecordStore({
6
103
  ...options,
7
104
  encode: identityVersionedJsonObject,
8
105
  parse: parseRouterAbEd25519YaoProductRegistrationPartitionRecordJsonV1
9
106
  });
10
- return createRouterAbEd25519YaoProductRegistrationPartitionedStateStoreV1({
11
- readMany: records.readMany.bind(records),
12
- putMany: async (mutations, companion) => await records.putManyWithAdditionalStatements(mutations, companion?.statements ?? [])
13
- });
14
- }
15
- function identityVersionedJsonObject(value) {
16
- return value;
17
107
  }
18
108
  //#endregion
19
- export { createRouterAbEd25519YaoProductRegistrationPartitionedStateStoreFromD1V1 };
109
+ export { createRouterAbEd25519YaoProductRegistrationPartitionedStateStoreFromD1V1, evictWalletEd25519CapabilityCache };
20
110
 
21
111
  //# sourceMappingURL=d1Ed25519YaoProductRegistrationPartitionedStateStore.js.map
@@ -0,0 +1,92 @@
1
+ import { parseWalletId } from "../../../../shared-ts/src/utils/domainIds.js";
2
+ import { parseRouterAbEd25519YaoRecoveryAdmissionRequestV1 } from "../../../../shared-ts/src/utils/routerAbEd25519Yao.js";
3
+ //#region src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoStateWriteFence.ts
4
+ function collectChangedStateWallets(before, after, wallets) {
5
+ if (before && before.kind !== after.kind) throw new Error("Lifecycle partition kind changed");
6
+ if (after.kind === "router_ab_ed25519_yao_product_registration_ceremony_record_v1") {
7
+ collectCeremonyWallets(after, wallets);
8
+ if (before) collectCeremonyWallets(before, wallets);
9
+ return;
10
+ }
11
+ if (before?.kind === "router_ab_ed25519_yao_product_registration_ceremony_record_v1") throw new Error("Lifecycle partition kind changed");
12
+ collectChangedRecoveryCapabilities(before?.value ?? null, after.value, wallets);
13
+ const empty = /* @__PURE__ */ new Map();
14
+ collectChangedOwners(before?.value.exportAuthorizationNonceOwners ?? empty, after.value.exportAuthorizationNonceOwners, walletOwner, wallets);
15
+ collectChangedOwners(before?.value.exportAuthorizationUncertainOwners ?? empty, after.value.exportAuthorizationUncertainOwners, walletOwner, wallets);
16
+ collectChangedOwners(before?.value.recoverySessions ?? empty, after.value.recoverySessions, recoverySessionOwner, wallets);
17
+ }
18
+ function collectChangedRecoveryCapabilities(before, after, wallets) {
19
+ for (const [key, capability] of after.recoveryCapabilities) {
20
+ const previous = before?.recoveryCapabilities.get(key);
21
+ if (JSON.stringify(previous) === JSON.stringify(capability)) continue;
22
+ if (previous) wallets.add(walletOwner(previous.identity.applicationBinding.wallet_id));
23
+ wallets.add(walletOwner(capability.identity.applicationBinding.wallet_id));
24
+ }
25
+ for (const [key, capability] of before?.recoveryCapabilities ?? []) if (capability.kind === "suspended" && !after.recoveryCapabilities.has(key)) wallets.add(walletOwner(capability.identity.applicationBinding.wallet_id));
26
+ const identities = new Set([...before?.recoveryIdentityCapabilities.keys() ?? [], ...after.recoveryIdentityCapabilities.keys()]);
27
+ for (const identity of identities) {
28
+ const previousKey = before?.recoveryIdentityCapabilities.get(identity);
29
+ const nextKey = after.recoveryIdentityCapabilities.get(identity);
30
+ if (previousKey === nextKey) continue;
31
+ if (nextKey === void 0 && previousKey !== void 0 && !after.recoveryCapabilities.has(previousKey)) continue;
32
+ if (previousKey !== void 0) {
33
+ const previous = before?.recoveryCapabilities.get(previousKey);
34
+ if (!previous) throw new Error("Recovery identity index has no capability owner");
35
+ wallets.add(walletOwner(previous.identity.applicationBinding.wallet_id));
36
+ }
37
+ if (nextKey !== void 0) {
38
+ const next = after.recoveryCapabilities.get(nextKey);
39
+ if (!next) throw new Error("Recovery identity index has no capability owner");
40
+ wallets.add(walletOwner(next.identity.applicationBinding.wallet_id));
41
+ }
42
+ }
43
+ }
44
+ function walletOwner(value) {
45
+ const parsed = parseWalletId(value);
46
+ if (!parsed.ok) throw new Error("Lifecycle wallet owner is invalid");
47
+ return parsed.value;
48
+ }
49
+ function recoverySessionOwner(value) {
50
+ const parsed = parseRouterAbEd25519YaoRecoveryAdmissionRequestV1(JSON.parse(value));
51
+ if (!parsed.ok) throw new Error("Stored recovery session request is invalid");
52
+ return walletOwner(parsed.value.application_binding.wallet_id);
53
+ }
54
+ function collectChangedOwners(before, after, owner, wallets) {
55
+ for (const key of new Set([...before.keys(), ...after.keys()])) {
56
+ const oldValue = before.get(key);
57
+ const newValue = after.get(key);
58
+ if (oldValue === newValue) continue;
59
+ if (oldValue !== void 0) wallets.add(owner(oldValue));
60
+ if (newValue !== void 0) wallets.add(owner(newValue));
61
+ }
62
+ }
63
+ function collectCeremonyWallets(record, wallets) {
64
+ if (record.kind === "router_ab_ed25519_yao_product_registration_shared_record_v1") return;
65
+ const state = record.value;
66
+ const owners = /* @__PURE__ */ new Set();
67
+ for (const authority of state.authorization.authorities) owners.add(authority.admissionRequest.application_binding.wallet_id);
68
+ for (const registration of state.registration.states.values()) owners.add(registration.admissionRequest.application_binding.wallet_id);
69
+ for (const recovery of state.recovery.recoveries.values()) owners.add(recovery.context.authorization.walletId);
70
+ for (const exported of state.export.exports.values()) owners.add(exported.request.application_binding.wallet_id);
71
+ if (owners.size > 1 || owners.size === 0 && (state.registration.admissionClaims.size > 0 || state.registration.dispatchRoots.size > 0 || state.registration.lifecycleSessions.size > 0)) throw new Error("Ceremony mutation has no unique wallet owner");
72
+ for (const owner of owners) wallets.add(walletOwner(owner));
73
+ }
74
+ function lifecycleWriteFenceStatements(options, wallets) {
75
+ const statements = [];
76
+ for (const walletId of wallets) statements.push(options.database.prepare(`
77
+ INSERT INTO router_ab_yao_versioned_json_cas_guard (guard_id)
78
+ SELECT 1 WHERE EXISTS (
79
+ SELECT 1 FROM wallet_relocation_authorization_fences
80
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
81
+ AND wallet_id = ?5
82
+ ) OR EXISTS (
83
+ SELECT 1 FROM wallet_execution_generations
84
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
85
+ AND wallet_id = ?5 AND registration_completion = 'cancelled'
86
+ )`).bind(options.scope.namespace, options.scope.orgId, options.scope.projectId, options.scope.envId, walletId));
87
+ return statements;
88
+ }
89
+ //#endregion
90
+ export { collectChangedStateWallets, lifecycleWriteFenceStatements };
91
+
92
+ //# sourceMappingURL=d1Ed25519YaoStateWriteFence.js.map
@@ -0,0 +1,77 @@
1
+ import { prepareD1TenantStatement } from "../../../../core/d1TenantStore.js";
2
+ //#region src/router/cloudflare/d1/ed25519Yao/d1WalletCeremonyActivity.ts
3
+ var D1WalletCeremonyActivity = class {
4
+ constructor(database, scope) {
5
+ this.database = database;
6
+ this.scope = scope;
7
+ }
8
+ async hasPending(walletId) {
9
+ return await prepareD1TenantStatement(this.database, this.scope, `
10
+ SELECT 1 AS pending FROM wallet_ceremony_activity
11
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
12
+ AND wallet_id = ?5 AND settled = 0 LIMIT 1`, [walletId]).first() !== null;
13
+ }
14
+ project(recordKey, walletId, settled) {
15
+ return prepareD1TenantStatement(this.database, this.scope, `
16
+ INSERT INTO wallet_ceremony_activity
17
+ (namespace, org_id, project_id, env_id, record_key, wallet_id, settled)
18
+ VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)
19
+ ON CONFLICT (namespace, org_id, project_id, env_id, record_key)
20
+ DO UPDATE SET wallet_id = excluded.wallet_id, settled = excluded.settled`, [
21
+ recordKey,
22
+ walletId,
23
+ settled ? 1 : 0
24
+ ]);
25
+ }
26
+ };
27
+ function ceremonySettled(ceremony) {
28
+ if (ceremony.registration.admissionClaims.size > 0) return false;
29
+ for (const registration of ceremony.registration.states.values()) if (!registrationSettled(registration)) return false;
30
+ for (const recovery of ceremony.recovery.recoveries.values()) if (!recoverySettled(recovery)) return false;
31
+ for (const exported of ceremony.export.exports.values()) if (!exportSettled(exported)) return false;
32
+ return true;
33
+ }
34
+ function registrationSettled(state) {
35
+ switch (state.kind) {
36
+ case "activated": return state.activationConsumerBinding !== null;
37
+ case "admitted": return true;
38
+ case "executing":
39
+ case "failed": return false;
40
+ default: return assertNever(state);
41
+ }
42
+ }
43
+ function recoverySettled(state) {
44
+ switch (state.kind) {
45
+ case "promoted":
46
+ case "superseded": return true;
47
+ case "admitting":
48
+ case "admission_failed":
49
+ case "admitted":
50
+ case "executing":
51
+ case "execution_interrupted":
52
+ case "execution_failed":
53
+ case "staged":
54
+ case "activating":
55
+ case "activation_failed": return false;
56
+ default: return assertNever(state);
57
+ }
58
+ }
59
+ function exportSettled(state) {
60
+ switch (state.kind) {
61
+ case "completed": return true;
62
+ case "authorized":
63
+ case "admitting":
64
+ case "admission_failed":
65
+ case "admitted":
66
+ case "executing":
67
+ case "execution_failed": return false;
68
+ default: return assertNever(state);
69
+ }
70
+ }
71
+ function assertNever(value) {
72
+ throw new Error(`Unknown ceremony state: ${String(value)}`);
73
+ }
74
+ //#endregion
75
+ export { D1WalletCeremonyActivity, ceremonySettled };
76
+
77
+ //# sourceMappingURL=d1WalletCeremonyActivity.js.map
@@ -21,6 +21,9 @@ var CloudflareD1EmailOtpChallengeIssuer = class {
21
21
  this.emailOtpEnrollments = input.emailOtpEnrollments;
22
22
  this.emailOtpRateLimits = input.emailOtpRateLimits;
23
23
  }
24
+ challengeExpiresAt(nowMs) {
25
+ return nowMs + this.config.challengeTtlMs;
26
+ }
24
27
  async create(input) {
25
28
  try {
26
29
  const userId = normalizeOptionalTrimmedString(input.userId);
@@ -61,8 +64,9 @@ var CloudflareD1EmailOtpChallengeIssuer = class {
61
64
  }
62
65
  if (!challengeEmail) return failure("recovery_email_missing", "Authenticated identity does not include a recovery email");
63
66
  const nowMs = Date.now();
67
+ if (input.action === WALLET_EMAIL_OTP_ACTIONS.relocation && (!Number.isSafeInteger(input.expiresAtMs) || input.expiresAtMs <= nowMs || input.expiresAtMs > nowMs + this.config.challengeTtlMs)) return failure("invalid_body", "Relocation OTP expiry is invalid");
64
68
  await this.emailOtpChallenges.pruneExpired(nowMs);
65
- if (input.reuseActiveChallenge === true) {
69
+ if (input.reuseActiveChallenge === true && action !== WALLET_EMAIL_OTP_ACTIONS.relocation) {
66
70
  const existing = await this.emailOtpChallenges.findLatestActive({
67
71
  challengeSubjectId: userId,
68
72
  walletId,
@@ -94,6 +98,7 @@ var CloudflareD1EmailOtpChallengeIssuer = class {
94
98
  }
95
99
  }
96
100
  const rateLimit = await this.emailOtpRateLimits.consume({
101
+ kind: "wallet",
97
102
  scope: "challenge",
98
103
  action,
99
104
  userId,
@@ -102,7 +107,7 @@ var CloudflareD1EmailOtpChallengeIssuer = class {
102
107
  clientIp
103
108
  });
104
109
  if (!rateLimit.ok) return rateLimit;
105
- await this.emailOtpChallenges.deleteActiveOverflow({
110
+ if (action !== WALLET_EMAIL_OTP_ACTIONS.relocation) await this.emailOtpChallenges.deleteActiveOverflow({
106
111
  challengeSubjectId: userId,
107
112
  walletId,
108
113
  orgId,
@@ -112,10 +117,10 @@ var CloudflareD1EmailOtpChallengeIssuer = class {
112
117
  nowMs,
113
118
  maxActiveChallenges: this.config.maxActiveChallengesPerContext
114
119
  });
115
- const challengeId = secureRandomBase64Url(16, "email otp challenge ids");
120
+ const challengeId = action === WALLET_EMAIL_OTP_ACTIONS.relocation ? `relocation:${ownerProofBindingDigest}` : secureRandomBase64Url(16, "email otp challenge ids");
116
121
  const otpCode = generateNumericOtp(this.config.codeLength);
117
- const expiresAtMs = nowMs + this.config.challengeTtlMs;
118
- const record = emailOtpChallengeRecord({
122
+ const expiresAtMs = input.action === WALLET_EMAIL_OTP_ACTIONS.relocation ? input.expiresAtMs : nowMs + this.config.challengeTtlMs;
123
+ let record = emailOtpChallengeRecord({
119
124
  challengeId,
120
125
  challengeSubjectId: userId,
121
126
  walletId,
@@ -129,17 +134,18 @@ var CloudflareD1EmailOtpChallengeIssuer = class {
129
134
  expiresAtMs,
130
135
  maxAttempts: this.config.maxAttempts
131
136
  });
132
- await this.emailOtpChallenges.put(record);
137
+ if (action === WALLET_EMAIL_OTP_ACTIONS.relocation) record = await this.emailOtpChallenges.putIfAbsent(record);
138
+ else await this.emailOtpChallenges.put(record);
133
139
  const delivery = await this.emailOtpDelivery.deliverEmailOtpCode(record, input.requestOrigin);
134
140
  if (!delivery.ok) {
135
- await this.emailOtpChallenges.delete(challengeId);
141
+ if (action !== WALLET_EMAIL_OTP_ACTIONS.relocation) await this.emailOtpChallenges.delete(challengeId);
136
142
  return delivery;
137
143
  }
138
144
  return {
139
145
  ok: true,
140
146
  challenge: {
141
147
  challengeId,
142
- issuedAtMs: nowMs,
148
+ issuedAtMs: record.createdAtMs,
143
149
  expiresAtMs,
144
150
  challengeSubjectId: userId,
145
151
  walletId,
@@ -87,20 +87,26 @@ var CloudflareD1EmailOtpChallengeStore = class {
87
87
  }
88
88
  return deletedRecords;
89
89
  }
90
+ async putIfAbsent(record) {
91
+ await emailOtpChallengeRows.insertIfAbsent(this.prepare, record).run();
92
+ const stored = await this.read(record.challengeId);
93
+ if (!stored || stored.walletId !== record.walletId || stored.orgId !== record.orgId || stored.challengeSubjectId !== record.challengeSubjectId || stored.email !== record.email || stored.action !== record.action || stored.operation !== record.operation || stored.ownerProofBindingDigest !== record.ownerProofBindingDigest || stored.expiresAtMs !== record.expiresAtMs || stored.createdAtMs > record.createdAtMs) throw new Error("Email OTP challenge identity conflict");
94
+ return stored;
95
+ }
90
96
  async put(record) {
91
97
  await emailOtpChallengeRows.insert(this.prepare, record).run();
92
98
  }
93
99
  async updateAttemptCount(record, attemptCount) {
94
100
  const next = emailOtpChallengeWithAttemptCount(record, attemptCount);
95
101
  await this.prepare(`UPDATE email_otp_challenges
96
- SET record_json = ?,
97
- otp_code = ?,
98
- expires_at_ms = ?
99
- WHERE namespace = ?
100
- AND org_id = ?
101
- AND project_id = ?
102
- AND env_id = ?
103
- AND challenge_id = ?`, [
102
+ SET record_json = ?5,
103
+ otp_code = ?6,
104
+ expires_at_ms = ?7
105
+ WHERE namespace = ?1
106
+ AND org_id = ?2
107
+ AND project_id = ?3
108
+ AND env_id = ?4
109
+ AND challenge_id = ?8`, [
104
110
  JSON.stringify(next),
105
111
  next.otpCode,
106
112
  next.expiresAtMs,