@seams/wallet-server 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,6 +1,7 @@
1
1
  import { isPlainObject, requireNonEmptyString } from "../../../../shared-ts/src/utils/validation.js";
2
2
  import { normalizeRuntimePolicyScope } from "../../../../shared-ts/src/threshold/signingRootScope.js";
3
3
  import { isD1DatabaseLike, parseD1JsonColumn } from "../../../../storage/d1Sql.js";
4
+ import { ED25519_SIGNER_ACTIVATION_ID_PATH } from "../../../../core/d1WalletStore.js";
4
5
  import { abusePrincipalKey, runtimePolicyScopeKey } from "../../../domains/signingOperations/routerAbNormalSigningAdmissionCore.js";
5
6
  //#region src/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.ts
6
7
  const ROUTER_AB_NORMAL_SIGNING_ADMISSION_TABLE = "router_ab_normal_signing_admission_records";
@@ -12,10 +13,8 @@ var CloudflareD1RouterAbNormalSigningAdmissionStore = class {
12
13
  this.now = options.now || Date.now;
13
14
  }
14
15
  async evaluatePolicy(input) {
15
- if (input.curve === "ecdsa" && input.policyReadSource.kind === "credential_snapshot") {
16
- const decision = input.policyReadSource.policyRead.resolve(this.database, this.storageNamespace, input);
17
- if (decision) return decision;
18
- }
16
+ const snapshot = credentialPolicyDecision(input, this.database, this.storageNamespace);
17
+ if (snapshot) return snapshot;
19
18
  const scope = input.runtimePolicyScope;
20
19
  return parsePolicyRow(await this.database.prepare(`WITH scope(namespace, org_id, project_id, env_id, signing_root_version,
21
20
  project_key, abuse_key) AS (VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7))
@@ -181,33 +180,7 @@ var D1EcdsaAdmissionPolicyRead = class D1EcdsaAdmissionPolicyRead {
181
180
  this.#decisions = decisions;
182
181
  }
183
182
  static fromRows(database, namespace, walletId, activationId, rows) {
184
- if (!Array.isArray(rows)) throw new Error("ECDSA policy candidates are invalid");
185
- const decisions = /* @__PURE__ */ new Map();
186
- for (const row of rows) {
187
- if (!isPlainObject(row)) throw new Error("ECDSA policy candidate is invalid");
188
- const key = runtimePolicyScopeKey(normalizeRuntimePolicyScope(parseD1JsonColumn(row.scope_json)));
189
- if (decisions.has(key)) throw new Error("ECDSA policy scope is ambiguous");
190
- try {
191
- const decision = parsePolicyRow({
192
- project_key: row.project_key,
193
- project_decision: row.project_decision,
194
- project_retry_after_ms: row.project_retry_after_ms,
195
- abuse_key: row.abuse_key,
196
- abuse_decision: row.abuse_decision,
197
- abuse_retry_after_ms: row.abuse_retry_after_ms
198
- });
199
- decisions.set(key, {
200
- ok: true,
201
- decision
202
- });
203
- } catch (error) {
204
- decisions.set(key, {
205
- ok: false,
206
- message: error instanceof Error ? error.message : "ECDSA policy read failed"
207
- });
208
- }
209
- }
210
- return new D1EcdsaAdmissionPolicyRead(database, namespace, walletId, activationId, decisions);
183
+ return new D1EcdsaAdmissionPolicyRead(database, namespace, walletId, activationId, parsePolicyCandidates(rows, "ECDSA"));
211
184
  }
212
185
  resolve(database, namespace, input) {
213
186
  if (database !== this.database || namespace !== this.namespace) return null;
@@ -218,13 +191,79 @@ var D1EcdsaAdmissionPolicyRead = class D1EcdsaAdmissionPolicyRead {
218
191
  return result.decision;
219
192
  }
220
193
  };
221
- const ECDSA_CREDENTIAL_POLICY_PROJECTION = `
194
+ /** Policy rows read with an Ed25519 Wallet Session, for the scopes of its signer. */
195
+ var D1Ed25519AdmissionPolicyRead = class D1Ed25519AdmissionPolicyRead {
196
+ #decisions;
197
+ constructor(database, namespace, walletId, authorityId, decisions) {
198
+ this.database = database;
199
+ this.namespace = namespace;
200
+ this.walletId = walletId;
201
+ this.authorityId = authorityId;
202
+ this.#decisions = decisions;
203
+ }
204
+ static fromRows(database, namespace, walletId, authorityId, rows) {
205
+ return new D1Ed25519AdmissionPolicyRead(database, namespace, walletId, authorityId, parsePolicyCandidates(rows, "Ed25519"));
206
+ }
207
+ /**
208
+ * Null sends the caller to the database: another store, or a scope this read
209
+ * did not select. Linked-device material has no signer row to select from.
210
+ */
211
+ resolve(database, namespace, input) {
212
+ if (database !== this.database || namespace !== this.namespace) return null;
213
+ if (input.walletId !== this.walletId || input.authorityId !== this.authorityId) throw new Error("Ed25519 policy credential scope does not match");
214
+ const result = this.#decisions.get(runtimePolicyScopeKey(input.runtimePolicyScope));
215
+ if (!result) return null;
216
+ if (!result.ok) throw new Error(result.message);
217
+ return result.decision;
218
+ }
219
+ };
220
+ /** The decision a credential read already holds for this store, when the request carries one. */
221
+ function credentialPolicyDecision(input, database, namespace) {
222
+ if (input.curve === "ecdsa") return input.policyReadSource.kind === "credential_snapshot" ? input.policyReadSource.policyRead.resolve(database, namespace, input) : null;
223
+ if (input.authorityKind !== "wallet_authority_v1" || input.policyReadSource.kind !== "credential_snapshot") return null;
224
+ return input.policyReadSource.policyRead.resolve(database, namespace, input);
225
+ }
226
+ function parsePolicyCandidates(rows, curve) {
227
+ if (!Array.isArray(rows)) throw new Error(`${curve} policy candidates are invalid`);
228
+ const decisions = /* @__PURE__ */ new Map();
229
+ for (const row of rows) {
230
+ if (!isPlainObject(row)) throw new Error(`${curve} policy candidate is invalid`);
231
+ const key = runtimePolicyScopeKey(normalizeRuntimePolicyScope(parseD1JsonColumn(row.scope_json)));
232
+ if (decisions.has(key)) throw new Error(`${curve} policy scope is ambiguous`);
233
+ try {
234
+ const decision = parsePolicyRow({
235
+ project_key: row.project_key,
236
+ project_decision: row.project_decision,
237
+ project_retry_after_ms: row.project_retry_after_ms,
238
+ abuse_key: row.abuse_key,
239
+ abuse_decision: row.abuse_decision,
240
+ abuse_retry_after_ms: row.abuse_retry_after_ms
241
+ });
242
+ decisions.set(key, {
243
+ ok: true,
244
+ decision
245
+ });
246
+ } catch (error) {
247
+ decisions.set(key, {
248
+ ok: false,
249
+ message: error instanceof Error ? error.message : `${curve} policy read failed`
250
+ });
251
+ }
252
+ }
253
+ return decisions;
254
+ }
255
+ /**
256
+ * Policy rows for the runtime scopes of the session wallet's signers, read in
257
+ * the session's own statement. `signers` selects the signer rows, `scopePath`
258
+ * is where a row holds its scope, and `principal` names the abuse principal.
259
+ */
260
+ function credentialPolicyProjection(input) {
261
+ return `
222
262
  (WITH candidates AS (
223
- SELECT DISTINCT json_extract(signer.record_json, '$.runtimePolicyScope') AS scope_json
263
+ SELECT DISTINCT json_extract(signer.record_json, '${input.scopePath}') AS scope_json
224
264
  FROM wallet_signers AS signer
225
- WHERE signer.namespace = session.namespace AND signer.org_id = session.org_id
226
- AND signer.project_id = session.project_id AND signer.env_id = session.env_id
227
- AND signer.wallet_id = session.wallet_id AND signer.signer_family = 'ecdsa'
265
+ WHERE ${input.signers}
266
+ AND signer.wallet_id = session.wallet_id AND signer.signer_family = '${input.family}'
228
267
  AND json_valid(signer.record_json)
229
268
  ), scopes AS (
230
269
  SELECT scope_json,
@@ -256,9 +295,29 @@ const ECDSA_CREDENTIAL_POLICY_PROJECTION = `
256
295
  AND abuse.signing_root_version = scopes.signing_root_version
257
296
  AND abuse.record_kind = 'abuse'
258
297
  AND abuse.record_key = scopes.project_key || char(31) || session.wallet_id || char(31) ||
259
- 'material_activation:' || ? || char(31) || 'ecdsa'
260
- ) AS ecdsa_policy_records_json,`;
298
+ ${input.principal} || char(31) || '${input.family}'
299
+ ) AS ${input.family}_policy_records_json,`;
300
+ }
301
+ /** Binds the material activation id. */
302
+ const ECDSA_CREDENTIAL_POLICY_PROJECTION = credentialPolicyProjection({
303
+ family: "ecdsa",
304
+ signers: `signer.namespace = session.namespace AND signer.org_id = session.org_id
305
+ AND signer.project_id = session.project_id AND signer.env_id = session.env_id`,
306
+ scopePath: "$.runtimePolicyScope",
307
+ principal: `'material_activation:' || ?`
308
+ });
309
+ /** Binds the signer scope (namespace, organization, project, environment) and the activation id. */
310
+ const ED25519_CREDENTIAL_POLICY_PROJECTION = credentialPolicyProjection({
311
+ family: "ed25519",
312
+ signers: `signer.namespace = ? AND signer.org_id = ?
313
+ AND signer.project_id = ? AND signer.env_id = ?
314
+ AND CASE WHEN json_valid(signer.record_json) THEN
315
+ json_extract(signer.record_json, '${ED25519_SIGNER_ACTIVATION_ID_PATH}') = ?
316
+ ELSE 0 END`,
317
+ scopePath: "$.activeYaoCapability.runtimePolicyScope",
318
+ principal: `'wallet_authority:' || session.authority_id`
319
+ });
261
320
  //#endregion
262
- export { CloudflareD1RouterAbNormalSigningAdmissionStore, D1EcdsaAdmissionPolicyRead, ECDSA_CREDENTIAL_POLICY_PROJECTION, createCloudflareD1RouterAbNormalSigningAdmissionStore };
321
+ export { CloudflareD1RouterAbNormalSigningAdmissionStore, D1EcdsaAdmissionPolicyRead, D1Ed25519AdmissionPolicyRead, ECDSA_CREDENTIAL_POLICY_PROJECTION, ED25519_CREDENTIAL_POLICY_PROJECTION, createCloudflareD1RouterAbNormalSigningAdmissionStore };
263
322
 
264
323
  //# sourceMappingURL=d1RouterAbNormalSigningAdmissionStore.js.map
@@ -75,13 +75,7 @@ var CloudflareD1VersionedJsonRecordStore = class {
75
75
  }
76
76
  async readMany(keys) {
77
77
  const preparedKeys = prepareReadKeys(keys, this.keyPrefix);
78
- const statements = preparedKeys.map(({ storageKey }) => this.database.prepare(`SELECT version, record_json
79
- FROM ${TABLE_NAME}
80
- WHERE namespace = ?1
81
- AND org_id = ?2
82
- AND project_id = ?3
83
- AND env_id = ?4
84
- AND record_key = ?5`).bind(this.scope.namespace, this.scope.orgId, this.scope.projectId, this.scope.envId, storageKey));
78
+ const statements = preparedKeys.map(({ key }) => this.prepareRead(key));
85
79
  let results;
86
80
  try {
87
81
  results = await this.database.batch(statements);
@@ -98,6 +92,15 @@ var CloudflareD1VersionedJsonRecordStore = class {
98
92
  result: this.parseReadResult(results[index])
99
93
  }));
100
94
  }
95
+ prepareRead(key) {
96
+ return this.database.prepare(`SELECT version, record_json
97
+ FROM ${TABLE_NAME}
98
+ WHERE namespace = ?1
99
+ AND org_id = ?2
100
+ AND project_id = ?3
101
+ AND env_id = ?4
102
+ AND record_key = ?5`).bind(this.scope.namespace, this.scope.orgId, this.scope.projectId, this.scope.envId, this.storageKey(key));
103
+ }
101
104
  parseReadResult(result) {
102
105
  const row = firstResult(result);
103
106
  if (row === null) return { kind: "missing" };
@@ -136,7 +139,7 @@ var CloudflareD1VersionedJsonRecordStore = class {
136
139
  * commit spans this JSON store and a normalized table (for example, a
137
140
  * recovery envelope plus its WebAuthn authenticator and binding).
138
141
  */
139
- async putManyWithAdditionalStatements(mutations, additionalStatements) {
142
+ async putManyWithAdditionalStatements(mutations, additionalStatements, executeBatch) {
140
143
  const prepared = this.prepareBatchMutations(mutations);
141
144
  const statements = [];
142
145
  for (const mutation of prepared) {
@@ -145,7 +148,7 @@ var CloudflareD1VersionedJsonRecordStore = class {
145
148
  }
146
149
  statements.push(...additionalStatements);
147
150
  try {
148
- assertBatchSucceeded(await this.database.batch(statements), statements.length);
151
+ assertBatchSucceeded(executeBatch ? await executeBatch(statements) : await this.database.batch(statements), statements.length);
149
152
  return {
150
153
  kind: "stored",
151
154
  versions: prepared.map((mutation) => ({
@@ -0,0 +1,168 @@
1
+ import { requireArray, requireRecord } from "../../../../shared-ts/src/utils/validation.js";
2
+ //#region src/router/cloudflare/d1/wallet/authorizationSnapshotLayout.ts
3
+ const TABLES = [
4
+ "wallet_email_otp_rate_limits",
5
+ "email_otp_wallet_enrollments",
6
+ "email_otp_auth_states",
7
+ "wallets",
8
+ "wallet_signers",
9
+ "wallet_recovery_code_locators",
10
+ "wallet_authorities",
11
+ "wallet_auth_methods",
12
+ "wallet_relocation_approvals",
13
+ "webauthn_credential_bindings",
14
+ "webauthn_authenticators",
15
+ "router_ab_yao_versioned_json_records",
16
+ "authorization_wallet_session_quotas",
17
+ "wallet_session_authorizations_v2",
18
+ "wallet_session_hosted_credentials_v2",
19
+ "wallet_session_hosted_exchange_codes_v2",
20
+ "verified_wallet_operation_evidence_sets",
21
+ "authorized_operations",
22
+ "authorized_operation_audit_events",
23
+ "linked_device_sessions",
24
+ "linked_device_authority_allocations",
25
+ "linked_device_authority_installations",
26
+ "linked_device_target_credentials",
27
+ "linked_device_target_commit_reservations",
28
+ "linked_device_session_transcripts",
29
+ "linked_device_ed25519_export_root_transfers",
30
+ "linked_device_email_otp_grants",
31
+ "linked_device_request_proof_nonces",
32
+ "linked_device_bootstrap_imports",
33
+ "linked_device_wallet_session_credential_deliveries_v1"
34
+ ];
35
+ var AuthorizationSnapshotLayout = class AuthorizationSnapshotLayout {
36
+ #validated = true;
37
+ constructor(table, columns, keyColumns) {
38
+ this.table = table;
39
+ this.columns = columns;
40
+ this.keyColumns = keyColumns;
41
+ Object.freeze(this);
42
+ }
43
+ static async read(database) {
44
+ const layout = [];
45
+ const statements = [];
46
+ for (const table of TABLES) statements.push(database.prepare(`PRAGMA table_info(${table})`));
47
+ const results = await database.batch(statements);
48
+ for (const [index, table] of TABLES.entries()) {
49
+ const result = results[index];
50
+ if (!result) throw new Error("Authorization snapshot schema is incomplete");
51
+ const columns = [];
52
+ const keys = [];
53
+ for (const field of result.results ?? []) {
54
+ if (!Number.isSafeInteger(field.pk) || field.pk < 0) throw new Error("Authorization snapshot primary key is invalid");
55
+ if (field.type !== "TEXT" && field.type !== "INTEGER") throw new Error("Authorization snapshot column type is unsupported");
56
+ columns.push(field.name);
57
+ if (field.pk > 0) keys.push(field.name);
58
+ }
59
+ columns.sort();
60
+ keys.sort();
61
+ layout.push({
62
+ table,
63
+ columns,
64
+ keyColumns: keys
65
+ });
66
+ }
67
+ return AuthorizationSnapshotLayout.parse(layout);
68
+ }
69
+ static parse(raw) {
70
+ const entries = requireArray(raw, "authorization snapshot layout");
71
+ if (entries.length !== TABLES.length) throw new Error("Authorization snapshot table set conflicts");
72
+ const result = [];
73
+ for (const [index, table] of TABLES.entries()) {
74
+ const entry = requireRecord(entries[index], "authorization snapshot table");
75
+ if (Object.keys(entry).length !== 3 || entry.table !== table) throw new Error("Authorization snapshot table order conflicts");
76
+ const columns = columnNames(entry.columns);
77
+ const keyColumns = columnNames(entry.keyColumns);
78
+ for (const key of keyColumns) if (!columns.includes(key)) throw new Error("Authorization snapshot key column is absent");
79
+ result.push(new AuthorizationSnapshotLayout(table, columns, keyColumns));
80
+ }
81
+ return Object.freeze(result);
82
+ }
83
+ expressions() {
84
+ if (!this.#validated) throw new Error("Authorization snapshot layout is unvalidated");
85
+ const fields = [];
86
+ for (const column of this.columns) fields.push(`'${column}', target.${column}`);
87
+ const keys = [];
88
+ for (const column of this.keyColumns) keys.push(`target.${column}`);
89
+ return {
90
+ key: `json_array(${keys.join(", ")})`,
91
+ record: `json_object(${fields.join(", ")})`,
92
+ ownership: AuthorizationSnapshotLayout.ownership(this.table)
93
+ };
94
+ }
95
+ snapshotSelection() {
96
+ const ownership = AuthorizationSnapshotLayout.ownership(this.table);
97
+ if (this.table !== "wallet_email_otp_rate_limits") return ownership;
98
+ return `${ownership} AND target.reset_at_ms > (
99
+ SELECT frozen_at_ms FROM wallet_relocation_authorization_fences
100
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4 AND wallet_id = ?5)`;
101
+ }
102
+ static ownership(table) {
103
+ switch (table) {
104
+ case "linked_device_sessions": return `target.namespace = ?1 AND target.org_id = ?2 AND target.project_id = ?3
105
+ AND target.env_id = ?4 AND json_extract(target.record_json, '$.claimTranscript.value.walletId') = ?5`;
106
+ case "linked_device_target_commit_reservations":
107
+ case "linked_device_session_transcripts":
108
+ case "linked_device_request_proof_nonces":
109
+ case "linked_device_bootstrap_imports": return `target.namespace = ?1 AND target.org_id = ?2 AND target.project_id = ?3
110
+ AND target.env_id = ?4 AND EXISTS (SELECT 1 FROM linked_device_sessions AS parent
111
+ WHERE parent.namespace = target.namespace AND parent.org_id = target.org_id
112
+ AND parent.project_id = target.project_id AND parent.env_id = target.env_id
113
+ AND parent.link_session_id = target.link_session_id
114
+ AND json_extract(parent.record_json, '$.claimTranscript.value.walletId') = ?5)`;
115
+ case "router_ab_yao_versioned_json_records": return `target.namespace = ?1 AND target.org_id = ?2 AND target.project_id = ?3
116
+ AND target.env_id = ?4 AND json_extract(target.record_json, '$.walletId') = ?5
117
+ AND CASE
118
+ WHEN substr(target.record_key, 1, 17) = 'passkey-envelope:' AND json_valid(substr(target.record_key, 18))
119
+ THEN json_extract(substr(target.record_key, 18), '$[0]') = ?5
120
+ WHEN substr(target.record_key, 1, 28) = 'passkey-credential-activity:' AND json_valid(substr(target.record_key, 29))
121
+ THEN json_extract(substr(target.record_key, 29), '$[0]') = ?5
122
+ ELSE target.record_key IN ('passkey-envelope:recovery-set:' || ?5,
123
+ 'passkey-envelope:wallet-recovery-backup-ack/' || ?5)
124
+ END`;
125
+ case "webauthn_credential_bindings":
126
+ case "webauthn_authenticators": return `target.namespace = ?1 AND target.org_id = ?2 AND target.project_id = ?3
127
+ AND target.env_id = ?4 AND target.user_id = ?5
128
+ AND EXISTS (SELECT 1 FROM wallet_auth_methods AS method
129
+ WHERE method.namespace = target.namespace AND method.org_id = target.org_id
130
+ AND method.project_id = target.project_id AND method.env_id = target.env_id
131
+ AND method.wallet_id = ?5 AND method.kind = 'passkey'
132
+ AND method.credential_id_b64u = target.credential_id_b64u
133
+ AND ${table === "webauthn_credential_bindings" ? "method.rp_id = target.rp_id" : "method.credential_public_key_b64u = target.credential_public_key_b64u"})`;
134
+ case "authorization_wallet_session_quotas": return `EXISTS (SELECT 1 FROM wallet_session_authorizations_v2 AS session
135
+ WHERE session.namespace = ?1 AND session.org_id = ?2 AND session.project_id = ?3 AND session.env_id = ?4
136
+ AND session.wallet_id = ?5 AND session.namespace = target.namespace AND session.tenant_id = target.tenant_id
137
+ AND session.quota_id = target.quota_id AND session.wallet_session_id = target.wallet_session_id)`;
138
+ case "authorized_operations": return `EXISTS (SELECT 1 FROM wallet_operation_authorizations AS owner
139
+ WHERE owner.namespace = ?1 AND owner.org_id = ?2 AND owner.project_id = ?3 AND owner.env_id = ?4
140
+ AND owner.wallet_id = ?5 AND owner.namespace = target.namespace AND owner.tenant_id = target.tenant_id
141
+ AND owner.source_kind = target.authorization_source_kind
142
+ AND owner.source_id = CASE target.authorization_source_kind
143
+ WHEN 'authorization_grant' THEN target.authorization_id ELSE target.evidence_set_digest END
144
+ AND (target.authorization_source_kind = 'verified_step_up' OR
145
+ (target.authorization_grant_kind = 'wallet_session_authorization'
146
+ AND owner.org_id = target.owner_scope_org_id AND owner.project_id = target.owner_scope_project_id
147
+ AND owner.env_id = target.owner_scope_env_id)))`;
148
+ case "authorized_operation_audit_events": return `EXISTS (SELECT 1 FROM wallet_operation_owners AS owner
149
+ WHERE owner.namespace = ?1 AND owner.org_id = ?2 AND owner.project_id = ?3 AND owner.env_id = ?4
150
+ AND owner.wallet_id = ?5 AND owner.namespace = target.namespace AND owner.tenant_id = target.tenant_id
151
+ AND owner.authorized_operation_id = target.authorized_operation_id)`;
152
+ default: return "target.namespace = ?1 AND target.org_id = ?2 AND target.project_id = ?3 AND target.env_id = ?4 AND target.wallet_id = ?5";
153
+ }
154
+ }
155
+ };
156
+ function columnNames(raw) {
157
+ const names = [];
158
+ for (const name of requireArray(raw, "authorization snapshot columns")) {
159
+ if (typeof name !== "string" || !/^[a-z][a-z0-9_]*$/u.test(name) || names.includes(name)) throw new Error("Authorization snapshot column is invalid");
160
+ names.push(name);
161
+ }
162
+ if (names.length === 0) throw new Error("Authorization snapshot columns are empty");
163
+ return Object.freeze(names);
164
+ }
165
+ //#endregion
166
+ export { AuthorizationSnapshotLayout };
167
+
168
+ //# sourceMappingURL=authorizationSnapshotLayout.js.map
@@ -1,7 +1,7 @@
1
+ import { isPlainObject } from "../../../../shared-ts/src/utils/validation.js";
1
2
  import { base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
2
3
  import { alphabetizeStringify, sha256BytesUtf8 } from "../../../../shared-ts/src/utils/digests.js";
3
4
  import "../../../../shared-ts/src/utils/encoders.js";
4
- import { isPlainObject } from "../../../../shared-ts/src/utils/validation.js";
5
5
  import { parseRouterAbEd25519YaoRegistrationSideEffectRecordV1 } from "../../../domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.js";
6
6
  import { parseD1WalletAddSignerFinalizeTerminalResponse, parseWalletIdForIntent } from "../registration/d1RegistrationCeremonyRecords.js";
7
7
  //#region src/router/cloudflare/d1/wallet/d1WalletAddSignerFinalizeRecord.ts
@@ -1,10 +1,10 @@
1
1
  import { mpcMaterialActivationRefsEqual, parseWalletKeyId, parseWebAuthnCredentialIdB64u, parseWebAuthnRpId } from "../../../../shared-ts/src/utils/domainIds.js";
2
- import { base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
3
- import { alphabetizeStringify, sha256BytesUtf8 } from "../../../../shared-ts/src/utils/digests.js";
4
- import "../../../../shared-ts/src/utils/encoders.js";
5
2
  import { normalizeOptionalTrimmedString } from "../../../../shared-ts/src/utils/normalize.js";
6
3
  import { isPlainObject } from "../../../../shared-ts/src/utils/validation.js";
4
+ import { base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
5
+ import { alphabetizeStringify, sha256BytesUtf8 } from "../../../../shared-ts/src/utils/digests.js";
7
6
  import { parseSecp256k1CompressedPublicKeyB64u } from "../../../../shared-ts/src/passkey-custody/primitives.js";
7
+ import "../../../../shared-ts/src/utils/encoders.js";
8
8
  import { routerAbMpcMaterialActivationRefFromWire } from "../../../../shared-ts/src/utils/routerAbNormalSigningIdentity.js";
9
9
  import { parseRouterAbEd25519YaoRegistrationAdmissionRequestV1, sameRouterAbEd25519YaoRegistrationAdmissionRequestV1 } from "../../../../shared-ts/src/utils/routerAbEd25519Yao.js";
10
10
  import { ecdsaClientRootPublicKey33B64uFromString } from "../../../../shared-ts/src/threshold/ecdsaDerivationRoleLocalBootstrap.js";
@@ -12,11 +12,11 @@ import { deriveSigningRootId } from "../../../../shared-ts/src/threshold/signing
12
12
  import { buildRouterAbEcdsaDerivationPublicCapabilityV1, parseRouterAbEcdsaRegistrationRequestFactsV1, sameRouterAbEcdsaDerivationNormalSigningStateV1, sameRouterAbEcdsaRegistrationActivationReceiptV1, sameRouterAbEcdsaRegistrationRequestFactsV1, sameRouterAbEcdsaVerifiedClientActivationFactsV1 } from "../../../../shared-ts/src/utils/routerAbEcdsaDerivation.js";
13
13
  import { buildWalletEcdsaSignerActivationV1, extendEd25519WalletAuthorityWithEcdsa, isActiveEd25519WalletAuthorityV1 } from "../../../../shared-ts/src/authorization/walletAuthority.js";
14
14
  import { registrationPreparationIdFromString } from "../../../../core/types.js";
15
- import { buildTenantRootIdentityFromAuthenticatedDeploymentV1 } from "../../../../shared-ts/src/tenant-root/tenantRootIdentity.js";
16
15
  import { addSignerIntentGrantFromString, computeAddSignerIntentDigestB64u, sameAddSignerIntentV1 } from "../../../../shared-ts/src/utils/registrationIntent.js";
17
- import { WalletAuthorityCommitConflictError } from "./d1WalletAuthorityStore.js";
16
+ import { buildTenantRootIdentityFromAuthenticatedDeploymentV1 } from "../../../../shared-ts/src/tenant-root/tenantRootIdentity.js";
18
17
  import { buildRouterAbEd25519YaoRegistrationCapabilityRecordV1 } from "../../../domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.js";
19
18
  import { buildRouterAbEd25519YaoAddSignerAdmissionRequestV1, createRouterAbEd25519YaoMaterialActivationRefV1 } from "../../../domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.js";
19
+ import { WalletAuthorityCommitConflictError } from "./d1WalletAuthorityStore.js";
20
20
  import { parseRouterAbEd25519YaoRegistrationSideEffectRecordV1, runRouterAbEd25519YaoRegistrationSideEffectV1, throwIfRouterAbEd25519YaoRetryableSideEffectFailureV1 } from "../../../domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.js";
21
21
  import { buildYaoEd25519WalletSignerRecord, ed25519NearPublicKeyFromBytes, implicitNearAccountIdFromEd25519PublicKeyBytes } from "../ed25519Yao/d1Ed25519YaoWalletSigner.js";
22
22
  import { routerAbEcdsaStrictRegistrationRequestMatchesFacts } from "../../../domains/ecdsa/routerAbEcdsaStrictRegistration.js";
@@ -373,6 +373,7 @@ function sameEcdsaSignerActivation(left, right) {
373
373
  }
374
374
  var CloudflareD1WalletAddSignerService = class {
375
375
  constructor(input) {
376
+ this.executionAuthority = input.executionAuthority;
376
377
  this.getRegistrationCeremonyIntentStore = input.getRegistrationCeremonyIntentStore;
377
378
  this.getEd25519YaoProductRegistration = input.getEd25519YaoProductRegistration;
378
379
  this.ecdsaStrictRegistration = input.ecdsaStrictRegistration;
@@ -682,8 +683,11 @@ var CloudflareD1WalletAddSignerService = class {
682
683
  signingWorkerId: yaoRuntime.signingWorkerId
683
684
  })
684
685
  });
686
+ const homeAdmission = await this.executionAuthority.admitEstablishedHome({ walletId: input.walletId });
687
+ if (!homeAdmission.ok) return rejectedWalletAddSignerStartTerminal(homeAdmission.code, homeAdmission.message);
685
688
  const bound = await yaoRuntime.bindVerifiedIntent({
686
689
  kind: "verified_add_signer_intent",
690
+ ownershipGeneration: homeAdmission.ownershipGeneration,
687
691
  addSignerIntentGrant: storedIntent.grant,
688
692
  intent: ed25519Intent,
689
693
  admissionRequest,
@@ -811,9 +815,14 @@ var CloudflareD1WalletAddSignerService = class {
811
815
  code: "invalid_state",
812
816
  message: "ECDSA add-signer tenant root is not active"
813
817
  };
818
+ const home = await this.executionAuthority.admitEstablishedHome({ walletId: ceremony.intent.walletId });
819
+ if (!home.ok) return home;
814
820
  const registered = await this.ecdsaStrictRegistration.registerWithTenantRoot({
815
821
  request: request.ecdsa.strictRegistration,
816
- tenantRoot,
822
+ tenantRoot: {
823
+ ...tenantRoot,
824
+ ownershipGeneration: home.ownershipGeneration
825
+ },
817
826
  requestPolicy: {
818
827
  policyVersion: WALLET_ADD_SIGNER_ROUTER_POLICY_VERSION,
819
828
  requestDigestB64u: request.ecdsa.requestDigestB64u
@@ -1,9 +1,9 @@
1
1
  import { parseChallengeSubjectId, parseEmailOtpChallengeId, parseOrgId, parseProviderSubject, parseWalletAuthMethodId, parseWebAuthnCredentialIdB64u, parseWebAuthnRpId } from "../../../../shared-ts/src/utils/domainIds.js";
2
+ import { normalizeOptionalTrimmedString } from "../../../../shared-ts/src/utils/normalize.js";
3
+ import { buildDelegatedWalletAuthorityV1, buildFullOwnerPermissionsV1, sameDelegatedWalletAuthorityV1 } from "../../../../shared-ts/src/authorization/delegatedAuthority.js";
2
4
  import { base64UrlDecode, base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
3
5
  import { alphabetizeStringify } from "../../../../shared-ts/src/utils/digests.js";
4
6
  import "../../../../shared-ts/src/utils/encoders.js";
5
- import { normalizeOptionalTrimmedString } from "../../../../shared-ts/src/utils/normalize.js";
6
- import { buildDelegatedWalletAuthorityV1, buildFullOwnerPermissionsV1, sameDelegatedWalletAuthorityV1 } from "../../../../shared-ts/src/authorization/delegatedAuthority.js";
7
7
  import { parseWalletAddAuthMethodRegistrationOptions } from "../../../../shared-ts/src/utils/addAuthMethodRegistration.js";
8
8
  import { normalizeRuntimePolicyScope } from "../../../../shared-ts/src/threshold/signingRootScope.js";
9
9
  import { buildEmailOtpWalletAuthAuthority, walletAuthAuthorityRef } from "../../../../shared-ts/src/utils/walletAuthAuthority.js";
@@ -1458,44 +1458,7 @@ var CloudflareD1WalletAuthMethodService = class {
1458
1458
  * Ed25519 leg arrives, so that leg must address the same rows.
1459
1459
  */
1460
1460
  async readActiveRegistrationIdentity(authority) {
1461
- let record;
1462
- switch (authority.kind) {
1463
- case "passkey":
1464
- record = await this.getWalletAuthMethodStore().getPasskeyV2({
1465
- rpId: authority.rpId,
1466
- credentialIdB64u: authority.credentialIdB64u
1467
- });
1468
- break;
1469
- case "email_otp":
1470
- record = await this.getWalletAuthMethodStore().getEmailOtpV2({
1471
- walletId: String(authority.walletId),
1472
- emailHashHex: authority.emailHashHex
1473
- });
1474
- break;
1475
- default: return unreachableRegistrationStartAuthority(authority);
1476
- }
1477
- if (!record || record.status !== "active" || record.walletId !== authority.walletId) return null;
1478
- if (authority.kind === "passkey") {
1479
- if (record.kind !== "passkey" || record.rpId !== authority.rpId || record.credentialIdB64u !== authority.credentialIdB64u || record.credentialPublicKeyB64u !== authority.credentialPublicKeyB64u) return null;
1480
- } else if (record.kind !== "email_otp" || record.emailHashHex !== authority.emailHashHex || record.registrationAuthorityId !== authority.registrationAuthorityId) return null;
1481
- const walletAuthority = await this.walletAuthorityStore.readById(record.walletAuthorityId);
1482
- if (!walletAuthority || walletAuthority.state !== "active" || walletAuthority.walletId !== record.walletId) return null;
1483
- return {
1484
- walletAuthorityId: record.walletAuthorityId,
1485
- walletAuthMethodId: record.walletAuthMethodId,
1486
- authority: walletAuthority,
1487
- authMethod: record
1488
- };
1489
- }
1490
- async readActiveRegistrationAuthority(authority) {
1491
- const identity = await this.readActiveRegistrationIdentity(authority);
1492
- if (!identity) return null;
1493
- const walletAuthority = await this.walletAuthorityStore.readById(identity.walletAuthorityId);
1494
- if (!walletAuthority || walletAuthority.state !== "active" || walletAuthority.walletId !== authority.walletId || walletAuthority.authorityId !== identity.walletAuthorityId) return null;
1495
- return {
1496
- authority: walletAuthority,
1497
- walletAuthMethodId: identity.walletAuthMethodId
1498
- };
1461
+ return await this.walletAuthorityStore.readActiveRegistrationIdentity(authority);
1499
1462
  }
1500
1463
  /**
1501
1464
  * Verifies a revocation's source proof: bound to this operation, and from a
@@ -1,7 +1,7 @@
1
1
  import { mpcMaterialActivationRefsEqual, parseLinkDeviceSessionId, parseLinkedDeviceEnrollmentId, parseWalletAuthorityId, parseWalletId, parseWalletRecoveryOperationId } from "../../../../shared-ts/src/utils/domainIds.js";
2
2
  import { parseDeviceId } from "../../../../shared-ts/src/authorization/capabilityKinds.js";
3
- import { parseDigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
4
3
  import { parseDelegatedWalletPermissionSetV1 } from "../../../../shared-ts/src/authorization/delegatedAuthority.js";
4
+ import { parseDigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
5
5
  import { parseWalletAuthMethodRecordV2 } from "../../../../shared-ts/src/utils/walletAuthMethodRecord.js";
6
6
  import { buildRevokedWalletAuthorityV1, computeWalletAuthorityDigestB64u, parseWalletAuthorityV1, parseWalletSignerActivationSetV1, walletAuthorityDigestsMatchV1 } from "../../../../shared-ts/src/authorization/walletAuthority.js";
7
7
  import { buildWalletSessionCapabilitySubjectsV1 } from "../../../../authorization/domain.js";
@@ -10,6 +10,29 @@ import { prepareD1WalletPutSignerStatement } from "../../../../core/d1WalletStor
10
10
  import { prepareD1WalletAuthMethodV2PutStatement } from "../../../../core/d1WalletAuthMethodStore.js";
11
11
  import { prepareD1WalletSessionAuthorityProjectionStatements } from "../authorization/walletSessionAuthorityProjection.js";
12
12
  //#region src/router/cloudflare/d1/wallet/d1WalletAuthorityStore.ts
13
+ function registrationMethodSelector(authority) {
14
+ switch (authority.kind) {
15
+ case "passkey": return {
16
+ predicate: "kind = 'passkey' AND rp_id = ? AND credential_id_b64u = ?",
17
+ values: [authority.rpId, authority.credentialIdB64u]
18
+ };
19
+ case "email_otp": return {
20
+ predicate: "kind = 'email_otp' AND wallet_id = ? AND email_hash_hex = ?",
21
+ values: [authority.walletId, authority.emailHashHex]
22
+ };
23
+ default: return assertNeverRegistrationAuthority(authority);
24
+ }
25
+ }
26
+ function registrationMethodMatches(expected, method) {
27
+ switch (expected.kind) {
28
+ case "passkey": return method.kind === "passkey" && method.rpId === expected.rpId && method.credentialIdB64u === expected.credentialIdB64u && method.credentialPublicKeyB64u === expected.credentialPublicKeyB64u;
29
+ case "email_otp": return method.kind === "email_otp" && method.emailHashHex === expected.emailHashHex && method.registrationAuthorityId === expected.registrationAuthorityId;
30
+ default: return assertNeverRegistrationAuthority(expected);
31
+ }
32
+ }
33
+ function assertNeverRegistrationAuthority(value) {
34
+ throw new Error(`Unsupported registration authority: ${String(value)}`);
35
+ }
13
36
  function normalizeScope(input) {
14
37
  return {
15
38
  namespace: requireScopeString(input.namespace, "namespace"),
@@ -321,6 +344,36 @@ var D1WalletAuthorityStore = class {
321
344
  if (!row) return null;
322
345
  return await parseD1WalletAuthorityRow(row);
323
346
  }
347
+ /** Reads the method and its authority from one database snapshot. */
348
+ async readActiveRegistrationIdentity(expected) {
349
+ const selector = registrationMethodSelector(expected);
350
+ const row = await this.database.prepare(`SELECT authority.*, method.record_json AS auth_method_record_json,
351
+ method.wallet_auth_method_id, method.status AS auth_method_status
352
+ FROM (
353
+ SELECT * FROM wallet_auth_methods
354
+ WHERE namespace = ? AND org_id = ? AND project_id = ? AND env_id = ?
355
+ AND ${selector.predicate}
356
+ ORDER BY created_at_ms ASC LIMIT 1
357
+ ) AS method
358
+ JOIN wallet_authorities AS authority
359
+ ON authority.namespace = method.namespace
360
+ AND authority.org_id = method.org_id
361
+ AND authority.project_id = method.project_id
362
+ AND authority.env_id = method.env_id
363
+ AND authority.authority_id = method.wallet_authority_id
364
+ AND authority.wallet_id = method.wallet_id`).bind(...scopeValues(this.scope), ...selector.values).first();
365
+ if (!row) return null;
366
+ const method = parseWalletAuthMethodRecordV2(parseD1JsonColumn(row.auth_method_record_json));
367
+ if (!method || method.status !== "active" || method.status !== row.auth_method_status || method.walletAuthMethodId !== row.wallet_auth_method_id || method.walletId !== expected.walletId || !registrationMethodMatches(expected, method)) return null;
368
+ const authority = await parseD1WalletAuthorityRow(row);
369
+ if (authority.state !== "active" || authority.walletId !== method.walletId || authority.authorityId !== method.walletAuthorityId) return null;
370
+ return {
371
+ walletAuthorityId: authority.authorityId,
372
+ walletAuthMethodId: method.walletAuthMethodId,
373
+ authority,
374
+ authMethod: method
375
+ };
376
+ }
324
377
  async readByWalletAndDevice(input) {
325
378
  const row = await this.database.prepare(`SELECT *
326
379
  FROM wallet_authorities