@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
@@ -0,0 +1,140 @@
1
+ import { parseDigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
2
+ import { D1_BATCH_CAS_GUARD_SQL } from "../../../../storage/d1Sql.js";
3
+ import { readWalletRelocationOwner } from "./d1WalletRelocationOwner.js";
4
+ import { WalletRelocationChallengeBinding } from "./d1WalletRelocationChallenges.js";
5
+ import { verifyWalletRelocationEmailOtp } from "./d1WalletRelocationEmailOtp.js";
6
+ import { verifyWalletRelocationPasskey } from "./d1WalletRelocationPasskey.js";
7
+ //#region src/router/cloudflare/d1/wallet/d1WalletRelocationApprovals.ts
8
+ var D1WalletRelocationApprovals = class {
9
+ constructor(database, scope) {
10
+ this.database = database;
11
+ this.scope = scope;
12
+ }
13
+ async approvePasskey(input) {
14
+ const previous = await this.read(input.binding);
15
+ if (previous) return {
16
+ kind: "approved",
17
+ approval: previous
18
+ };
19
+ const verified = await verifyWalletRelocationPasskey({
20
+ database: this.database,
21
+ scope: this.scope,
22
+ binding: input.binding,
23
+ credential: input.credential,
24
+ nowMs: input.nowMs
25
+ });
26
+ return this.commit(input, verified);
27
+ }
28
+ async approveEmailOtp(input) {
29
+ const previous = await this.read(input.binding);
30
+ if (previous) return {
31
+ kind: "approved",
32
+ approval: previous
33
+ };
34
+ const verified = await verifyWalletRelocationEmailOtp({
35
+ database: this.database,
36
+ scope: this.scope,
37
+ binding: input.binding,
38
+ challengeId: input.challengeId,
39
+ otpCode: input.otpCode,
40
+ nowMs: input.nowMs,
41
+ verifier: input.verifier,
42
+ emailOtpChallenges: input.emailOtpChallenges
43
+ });
44
+ return this.commit(input, verified);
45
+ }
46
+ async commit(input, verified) {
47
+ if (verified.kind === "denied") {
48
+ const concurrent = await this.read(input.binding);
49
+ return concurrent ? {
50
+ kind: "approved",
51
+ approval: concurrent
52
+ } : { kind: "denied" };
53
+ }
54
+ const statements = [
55
+ ...input.owner.prepareApprovalGuard(this.database, this.scope, input.binding, input.nowMs),
56
+ ...verified.commitPrerequisites,
57
+ this.database.prepare(`INSERT INTO wallet_relocation_approvals
58
+ (namespace, org_id, project_id, env_id, wallet_id, move_id, binding_json,
59
+ authority_digest_b64u, authority_revocation_epoch, approved_at_ms, expires_at_ms)
60
+ SELECT namespace, org_id, project_id, env_id, wallet_id, move_id, binding_json,
61
+ ?8, ?9, consumed_at_ms, expires_at_ms
62
+ FROM wallet_relocation_challenges
63
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
64
+ AND wallet_id = ?5 AND move_id = ?6 AND binding_json = ?7
65
+ AND consumed_at_ms = ?10 AND expires_at_ms > ?10
66
+ AND expires_at_ms > CAST(unixepoch('subsec') * 1000 AS INTEGER)`).bind(...this.key(input.binding), input.binding.encoded(), verified.authorityDigestB64u, verified.authorityRevocationEpoch, input.nowMs),
67
+ this.database.prepare(D1_BATCH_CAS_GUARD_SQL)
68
+ ];
69
+ try {
70
+ const results = await this.database.batch(statements);
71
+ if (results.length !== statements.length || results.some(failedStatement)) throw new Error("Relocation approval batch failed");
72
+ } catch (error) {
73
+ const concurrent = await this.read(input.binding);
74
+ if (concurrent) return {
75
+ kind: "approved",
76
+ approval: concurrent
77
+ };
78
+ throw error;
79
+ }
80
+ const approval = await this.read(input.binding);
81
+ if (!approval) throw new Error("Relocation approval was not recorded");
82
+ return {
83
+ kind: "approved",
84
+ approval
85
+ };
86
+ }
87
+ async find(walletId, moveId) {
88
+ const row = await this.database.prepare(`SELECT binding_json FROM wallet_relocation_approvals
89
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
90
+ AND wallet_id = ?5 AND move_id = ?6`).bind(this.scope.namespace, this.scope.orgId, this.scope.projectId, this.scope.envId, walletId, moveId).first();
91
+ if (!row) return null;
92
+ if (typeof row.binding_json !== "string") throw new Error("Stored relocation binding is invalid");
93
+ const binding = WalletRelocationChallengeBinding.decode(row.binding_json);
94
+ if (binding.walletId !== walletId || binding.moveId !== moveId) throw new Error("Stored relocation binding is inconsistent");
95
+ return this.read(binding);
96
+ }
97
+ async readForAdmission(binding, nowMs) {
98
+ const approval = await this.read(binding);
99
+ if (!approval || !Number.isSafeInteger(nowMs) || nowMs < approval.approvedAtMs || nowMs >= approval.expiresAtMs) return null;
100
+ const owner = await readWalletRelocationOwner(this.database, this.scope, binding);
101
+ if (!owner || owner.authority.authorityDigestB64u !== approval.authorityDigestB64u || owner.authority.revocationEpoch !== approval.authorityRevocationEpoch) return null;
102
+ return approval;
103
+ }
104
+ async read(binding) {
105
+ const row = await this.database.prepare(`SELECT binding_json, authority_digest_b64u,
106
+ authority_revocation_epoch, approved_at_ms, expires_at_ms FROM wallet_relocation_approvals
107
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
108
+ AND wallet_id = ?5 AND move_id = ?6`).bind(...this.key(binding)).first();
109
+ if (!row) return null;
110
+ if (row.binding_json !== binding.encoded()) throw new Error("Relocation approval binding changed");
111
+ const approvedAtMs = row.approved_at_ms;
112
+ const expiresAtMs = row.expires_at_ms;
113
+ const authorityRevocationEpoch = row.authority_revocation_epoch;
114
+ if (typeof approvedAtMs !== "number" || !Number.isSafeInteger(approvedAtMs) || approvedAtMs <= 0 || typeof expiresAtMs !== "number" || !Number.isSafeInteger(expiresAtMs) || expiresAtMs <= approvedAtMs || expiresAtMs - approvedAtMs > 3e5 || expiresAtMs > binding.credentialExpiresAtMs || typeof authorityRevocationEpoch !== "number" || !Number.isSafeInteger(authorityRevocationEpoch) || authorityRevocationEpoch < 0 || typeof row.authority_digest_b64u !== "string") throw new Error("Stored relocation approval is invalid");
115
+ return {
116
+ binding,
117
+ authorityDigestB64u: parseDigestB64u(row.authority_digest_b64u),
118
+ authorityRevocationEpoch,
119
+ approvedAtMs,
120
+ expiresAtMs
121
+ };
122
+ }
123
+ key(binding) {
124
+ return [
125
+ this.scope.namespace,
126
+ this.scope.orgId,
127
+ this.scope.projectId,
128
+ this.scope.envId,
129
+ binding.walletId,
130
+ binding.moveId
131
+ ];
132
+ }
133
+ };
134
+ function failedStatement(result) {
135
+ return result.success !== true;
136
+ }
137
+ //#endregion
138
+ export { D1WalletRelocationApprovals };
139
+
140
+ //# sourceMappingURL=d1WalletRelocationApprovals.js.map
@@ -0,0 +1,170 @@
1
+ import { parseWalletAuthMethodId, parseWalletAuthorityId, parseWalletId } from "../../../../shared-ts/src/utils/domainIds.js";
2
+ import { isPlainObject, requireCanonicalString } from "../../../../shared-ts/src/utils/validation.js";
3
+ import { parseSessionOrigin } from "../../../../authorization/domain.js";
4
+ import { secureRandomBase64Url } from "../../../../shared-ts/src/utils/secureRandomId.js";
5
+ import { D1_BATCH_CAS_GUARD_SQL } from "../../../../storage/d1Sql.js";
6
+ //#region src/router/cloudflare/d1/wallet/d1WalletRelocationChallenges.ts
7
+ const MAX_CHALLENGE_LIFETIME_MS = 3e5;
8
+ var WalletRelocationChallengeBinding = class WalletRelocationChallengeBinding {
9
+ #canonical;
10
+ constructor(walletId, moveId, requestDigestHex, sourceGeneration, destinationRegion, authorityId, walletAuthMethodId, credentialDigestHex, credentialExpiresAtMs, origin) {
11
+ this.walletId = walletId;
12
+ this.moveId = moveId;
13
+ this.requestDigestHex = requestDigestHex;
14
+ this.sourceGeneration = sourceGeneration;
15
+ this.destinationRegion = destinationRegion;
16
+ this.authorityId = authorityId;
17
+ this.walletAuthMethodId = walletAuthMethodId;
18
+ this.credentialDigestHex = credentialDigestHex;
19
+ this.credentialExpiresAtMs = credentialExpiresAtMs;
20
+ this.origin = origin;
21
+ this.#canonical = JSON.stringify([
22
+ "seams/wallet-relocation-challenge/v1",
23
+ walletId,
24
+ moveId,
25
+ requestDigestHex,
26
+ sourceGeneration,
27
+ destinationRegion,
28
+ authorityId,
29
+ walletAuthMethodId,
30
+ credentialDigestHex,
31
+ credentialExpiresAtMs,
32
+ origin
33
+ ]);
34
+ Object.freeze(this);
35
+ }
36
+ static parse(raw) {
37
+ if (!isPlainObject(raw) || Object.keys(raw).length !== 10) throw invalid();
38
+ const wallet = parseWalletId(raw.walletId);
39
+ const authority = parseWalletAuthorityId(raw.authorityId);
40
+ const method = parseWalletAuthMethodId(raw.walletAuthMethodId);
41
+ if (!wallet.ok || !authority.ok || !method.ok) throw invalid();
42
+ return new WalletRelocationChallengeBinding(wallet.value, matching(raw.moveId, /^wmove_[A-Za-z0-9_-]{43}$/u), matching(raw.requestDigestHex, /^[a-f0-9]{64}$/u), timestamp(raw.sourceGeneration), region(raw.destinationRegion), authority.value, method.value, matching(raw.credentialDigestHex, /^[a-f0-9]{64}$/u), timestamp(raw.credentialExpiresAtMs), parseSessionOrigin(raw.origin));
43
+ }
44
+ static decode(encoded) {
45
+ const raw = JSON.parse(encoded);
46
+ if (!Array.isArray(raw) || raw.length !== 11 || raw[0] !== "seams/wallet-relocation-challenge/v1") throw invalid();
47
+ const [, walletId, moveId, requestDigestHex, sourceGeneration, destinationRegion, authorityId, walletAuthMethodId, credentialDigestHex, credentialExpiresAtMs, origin] = raw;
48
+ const binding = WalletRelocationChallengeBinding.parse({
49
+ walletId,
50
+ moveId,
51
+ requestDigestHex,
52
+ sourceGeneration,
53
+ destinationRegion,
54
+ authorityId,
55
+ walletAuthMethodId,
56
+ credentialDigestHex,
57
+ credentialExpiresAtMs,
58
+ origin
59
+ });
60
+ if (binding.encoded() !== encoded) throw invalid();
61
+ return binding;
62
+ }
63
+ encoded() {
64
+ return this.#canonical;
65
+ }
66
+ };
67
+ var D1WalletRelocationChallenges = class {
68
+ constructor(database, scope) {
69
+ this.database = database;
70
+ this.scope = scope;
71
+ }
72
+ async issue(binding, nowMs, factorExpiresAtMs) {
73
+ timestamp(nowMs);
74
+ const previous = await this.read(binding);
75
+ if (previous) return previous;
76
+ const expiresAtMs = Math.min(nowMs + MAX_CHALLENGE_LIFETIME_MS, timestamp(factorExpiresAtMs), binding.credentialExpiresAtMs);
77
+ if (!Number.isSafeInteger(expiresAtMs) || expiresAtMs <= nowMs) throw invalid();
78
+ await this.database.prepare(`INSERT OR IGNORE INTO wallet_relocation_challenges
79
+ (namespace, org_id, project_id, env_id, wallet_id, move_id, binding_json,
80
+ challenge_b64u, created_at_ms, expires_at_ms)
81
+ VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)`).bind(...this.key(binding), binding.encoded(), secureRandomBase64Url(32, "relocation challenge"), nowMs, expiresAtMs).run();
82
+ const created = await this.read(binding);
83
+ if (!created) throw new Error("Relocation challenge was not recorded");
84
+ return created;
85
+ }
86
+ async find(walletId, moveId) {
87
+ const row = await this.database.prepare(`SELECT binding_json FROM wallet_relocation_challenges
88
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
89
+ AND wallet_id = ?5 AND move_id = ?6`).bind(this.scope.namespace, this.scope.orgId, this.scope.projectId, this.scope.envId, walletId, moveId).first();
90
+ if (!row) return null;
91
+ if (typeof row.binding_json !== "string") throw invalid();
92
+ const binding = WalletRelocationChallengeBinding.decode(row.binding_json);
93
+ if (binding.walletId !== walletId || binding.moveId !== moveId) throw invalid();
94
+ return this.read(binding);
95
+ }
96
+ async read(binding) {
97
+ const row = await this.database.prepare(`SELECT binding_json, challenge_b64u,
98
+ created_at_ms, expires_at_ms, consumed_at_ms FROM wallet_relocation_challenges
99
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
100
+ AND wallet_id = ?5 AND move_id = ?6`).bind(...this.key(binding)).first();
101
+ if (!row) return null;
102
+ if (row.binding_json !== binding.encoded()) throw new Error("Relocation challenge binding changed");
103
+ const challengeB64u = matching(row.challenge_b64u, /^[A-Za-z0-9_-]{43}$/u);
104
+ const createdAtMs = timestamp(row.created_at_ms);
105
+ const expiresAtMs = timestamp(row.expires_at_ms);
106
+ if (expiresAtMs <= createdAtMs || expiresAtMs - createdAtMs > MAX_CHALLENGE_LIFETIME_MS || expiresAtMs > binding.credentialExpiresAtMs) throw invalid();
107
+ if (row.consumed_at_ms === null) return {
108
+ state: "issued",
109
+ binding,
110
+ challengeB64u,
111
+ createdAtMs,
112
+ expiresAtMs
113
+ };
114
+ const consumedAtMs = timestamp(row.consumed_at_ms);
115
+ if (consumedAtMs < createdAtMs || consumedAtMs >= expiresAtMs) throw invalid();
116
+ return {
117
+ state: "consumed",
118
+ binding,
119
+ challengeB64u,
120
+ createdAtMs,
121
+ expiresAtMs,
122
+ consumedAtMs
123
+ };
124
+ }
125
+ prepareConsume(challenge, nowMs) {
126
+ timestamp(nowMs);
127
+ if (nowMs < challenge.createdAtMs || nowMs >= challenge.expiresAtMs) throw invalid();
128
+ return [this.database.prepare(`UPDATE wallet_relocation_challenges SET consumed_at_ms = ?7
129
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
130
+ AND wallet_id = ?5 AND move_id = ?6 AND consumed_at_ms IS NULL
131
+ AND binding_json = ?8 AND challenge_b64u = ?9
132
+ AND created_at_ms = ?10 AND expires_at_ms = ?11
133
+ AND created_at_ms <= ?7 AND expires_at_ms > ?7`).bind(...this.key(challenge.binding), nowMs, challenge.binding.encoded(), challenge.challengeB64u, challenge.createdAtMs, challenge.expiresAtMs), this.database.prepare(D1_BATCH_CAS_GUARD_SQL)];
134
+ }
135
+ key(binding) {
136
+ return [
137
+ this.scope.namespace,
138
+ this.scope.orgId,
139
+ this.scope.projectId,
140
+ this.scope.envId,
141
+ binding.walletId,
142
+ binding.moveId
143
+ ];
144
+ }
145
+ };
146
+ function matching(raw, pattern) {
147
+ const value = requireCanonicalString(raw, "relocation challenge identity");
148
+ if (!pattern.test(value)) throw invalid();
149
+ return value;
150
+ }
151
+ function timestamp(raw) {
152
+ if (typeof raw !== "number" || !Number.isSafeInteger(raw) || raw <= 0) throw invalid();
153
+ return raw;
154
+ }
155
+ function invalid() {
156
+ return /* @__PURE__ */ new Error("Relocation challenge is invalid or expired");
157
+ }
158
+ function region(raw) {
159
+ switch (raw) {
160
+ case "US":
161
+ case "WEUR":
162
+ case "APAC":
163
+ case "OC": return raw;
164
+ default: throw invalid();
165
+ }
166
+ }
167
+ //#endregion
168
+ export { D1WalletRelocationChallenges, WalletRelocationChallengeBinding };
169
+
170
+ //# sourceMappingURL=d1WalletRelocationChallenges.js.map
@@ -0,0 +1,60 @@
1
+ import { sha256HexUtf8 } from "../../../../shared-ts/src/utils/digests.js";
2
+ import { sha256Utf8DigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
3
+ import { D1_BATCH_CAS_GUARD_SQL } from "../../../../storage/d1Sql.js";
4
+ import { EMAIL_OTP_CHANNEL, WALLET_EMAIL_OTP_ACTIONS, WALLET_EMAIL_OTP_RELOCATION_OPERATION } from "../../../../shared-ts/src/utils/emailOtpDomain.js";
5
+ import { readWalletRelocationOwner } from "./d1WalletRelocationOwner.js";
6
+ import { D1WalletRelocationChallenges } from "./d1WalletRelocationChallenges.js";
7
+ //#region src/router/cloudflare/d1/wallet/d1WalletRelocationEmailOtp.ts
8
+ async function walletRelocationEmailOtpBinding(scope, binding, challengeB64u) {
9
+ return sha256Utf8DigestB64u(JSON.stringify([
10
+ "seams/wallet-relocation-email-otp/v1",
11
+ scope.namespace,
12
+ scope.orgId,
13
+ scope.projectId,
14
+ scope.envId,
15
+ binding.encoded(),
16
+ challengeB64u
17
+ ]));
18
+ }
19
+ async function verifyWalletRelocationEmailOtp(input) {
20
+ const challenges = new D1WalletRelocationChallenges(input.database, input.scope);
21
+ const challenge = await challenges.read(input.binding);
22
+ if (!challenge || challenge.state !== "issued" || !Number.isSafeInteger(input.nowMs) || input.nowMs < challenge.createdAtMs || input.nowMs >= challenge.expiresAtMs) return { kind: "denied" };
23
+ const owner = await readWalletRelocationOwner(input.database, input.scope, input.binding);
24
+ if (!owner || owner.method.kind !== "email_otp") return { kind: "denied" };
25
+ const enrollment = await input.verifier.readEnrollmentForWallet(input.binding.walletId);
26
+ if (!enrollment || enrollment.walletId !== input.binding.walletId || enrollment.orgId !== input.scope.orgId || await sha256HexUtf8(enrollment.verifiedEmail) !== owner.method.emailHashHex) return { kind: "denied" };
27
+ const otp = await input.emailOtpChallenges.read(input.challengeId);
28
+ if (!otp || otp.createdAtMs < challenge.createdAtMs || otp.createdAtMs > input.nowMs || otp.expiresAtMs < challenge.expiresAtMs) return { kind: "denied" };
29
+ const ownerProofBindingDigest = await walletRelocationEmailOtpBinding(input.scope, input.binding, challenge.challengeB64u);
30
+ const verified = await input.verifier.verifyExistingForBatch({
31
+ userId: enrollment.providerUserId,
32
+ walletId: input.binding.walletId,
33
+ orgId: input.scope.orgId,
34
+ challengeId: input.challengeId,
35
+ otpCode: input.otpCode,
36
+ otpChannel: EMAIL_OTP_CHANNEL,
37
+ ownerProofBindingDigest,
38
+ action: WALLET_EMAIL_OTP_ACTIONS.relocation,
39
+ operation: WALLET_EMAIL_OTP_RELOCATION_OPERATION
40
+ });
41
+ if (!verified.ok || verified.consumeInBatch.length === 0) return { kind: "denied" };
42
+ return {
43
+ kind: "verified",
44
+ authorityDigestB64u: owner.authority.authorityDigestB64u,
45
+ authorityRevocationEpoch: owner.authority.revocationEpoch,
46
+ commitPrerequisites: [
47
+ ...owner.commitPrerequisites,
48
+ input.database.prepare(`UPDATE email_otp_wallet_enrollments SET updated_at_ms = updated_at_ms
49
+ WHERE namespace = ? AND org_id = ? AND project_id = ? AND env_id = ?
50
+ AND wallet_id = ? AND provider_user_id = ? AND record_org_id = ? AND verified_email = ?`).bind(input.scope.namespace, input.scope.orgId, input.scope.projectId, input.scope.envId, input.binding.walletId, enrollment.providerUserId, enrollment.orgId, enrollment.verifiedEmail),
51
+ input.database.prepare(D1_BATCH_CAS_GUARD_SQL),
52
+ ...verified.consumeInBatch,
53
+ ...challenges.prepareConsume(challenge, input.nowMs)
54
+ ]
55
+ };
56
+ }
57
+ //#endregion
58
+ export { verifyWalletRelocationEmailOtp, walletRelocationEmailOtpBinding };
59
+
60
+ //# sourceMappingURL=d1WalletRelocationEmailOtp.js.map
@@ -0,0 +1,33 @@
1
+ import { buildDelegatedWalletAuthorityV1, buildFullOwnerPermissionsV1, sameDelegatedWalletAuthorityV1 } from "../../../../shared-ts/src/authorization/delegatedAuthority.js";
2
+ import { D1WalletAuthMethodStore } from "../../../../core/d1WalletAuthMethodStore.js";
3
+ import { D1WalletAuthorityStore } from "./d1WalletAuthorityStore.js";
4
+ //#region src/router/cloudflare/d1/wallet/d1WalletRelocationOwner.ts
5
+ async function readWalletRelocationOwner(database, scope, binding) {
6
+ const methods = new D1WalletAuthMethodStore({
7
+ database,
8
+ ...scope,
9
+ ensureSchema: false
10
+ });
11
+ const method = await methods.readByIdV2({ walletAuthMethodId: binding.walletAuthMethodId });
12
+ if (!method || method.status !== "active" || method.walletId !== binding.walletId || method.walletAuthorityId !== binding.authorityId) return null;
13
+ const authority = await new D1WalletAuthorityStore({
14
+ database,
15
+ scope
16
+ }).readById(method.walletAuthorityId);
17
+ if (!authority || authority.state !== "active" || authority.walletId !== binding.walletId || !sameDelegatedWalletAuthorityV1(buildDelegatedWalletAuthorityV1({ permissions: authority.permissions }), buildDelegatedWalletAuthorityV1({ permissions: buildFullOwnerPermissionsV1() }))) return null;
18
+ return {
19
+ method,
20
+ authority,
21
+ commitPrerequisites: methods.prepareActiveV2SourceGuardStatements({
22
+ walletId: binding.walletId,
23
+ walletAuthMethodId: method.walletAuthMethodId,
24
+ walletAuthorityId: method.walletAuthorityId,
25
+ authorityDigestB64u: authority.authorityDigestB64u,
26
+ authorityRevocationEpoch: authority.revocationEpoch
27
+ })
28
+ };
29
+ }
30
+ //#endregion
31
+ export { readWalletRelocationOwner };
32
+
33
+ //# sourceMappingURL=d1WalletRelocationOwner.js.map
@@ -0,0 +1,74 @@
1
+ import { buildDelegatedWalletAuthorityV1, buildFullOwnerPermissionsV1, sameDelegatedWalletAuthorityV1 } from "../../../../shared-ts/src/authorization/delegatedAuthority.js";
2
+ import { sha256HexUtf8 } from "../../../../shared-ts/src/utils/digests.js";
3
+ import { buildWalletSessionCapabilitySubjectsV1, parseSessionOrigin, walletSessionCapabilitySubjectsV1Equal } from "../../../../authorization/domain.js";
4
+ import { digestOpaqueValue } from "../../../../authorization/service.js";
5
+ import { D1_BATCH_CAS_GUARD_SQL } from "../../../../storage/d1Sql.js";
6
+ import { extractBearerCredential } from "../../../auth/routerApiKeyAuth.js";
7
+ import { WalletRelocationChallengeBinding } from "./d1WalletRelocationChallenges.js";
8
+ //#region src/router/cloudflare/d1/wallet/d1WalletRelocationOwnerRequest.ts
9
+ var WalletRelocationOwnerRequest = class WalletRelocationOwnerRequest {
10
+ #credentialDigestHex;
11
+ constructor(walletId, authorityId, walletAuthMethodId, credentialExpiresAtMs, origin, credentialDigestHex, scope, tenantId, authorizationId, credentialHash) {
12
+ this.walletId = walletId;
13
+ this.authorityId = authorityId;
14
+ this.walletAuthMethodId = walletAuthMethodId;
15
+ this.credentialExpiresAtMs = credentialExpiresAtMs;
16
+ this.origin = origin;
17
+ this.scope = scope;
18
+ this.tenantId = tenantId;
19
+ this.authorizationId = authorizationId;
20
+ this.credentialHash = credentialHash;
21
+ this.#credentialDigestHex = credentialDigestHex;
22
+ Object.freeze(this);
23
+ }
24
+ static async authenticate(input) {
25
+ if (!Number.isSafeInteger(input.nowMs) || input.nowMs <= 0) return null;
26
+ const token = extractBearerCredential(input.request.headers);
27
+ if (!token) return null;
28
+ let origin;
29
+ try {
30
+ origin = parseSessionOrigin(input.request.headers.get("origin"));
31
+ } catch {
32
+ return null;
33
+ }
34
+ if (!input.allowedOrigins.includes(origin)) return null;
35
+ const context = await input.authorizationSessions.readWalletSessionExactOperationContextByCredential({
36
+ tenantId: input.tenantId,
37
+ token,
38
+ nowMs: input.nowMs
39
+ });
40
+ if (!context) return null;
41
+ const { session, authority, ownerWalletScope } = context;
42
+ if (session.walletId !== input.walletId || session.tenantId !== input.tenantId || ownerWalletScope.orgId !== input.scope.orgId || ownerWalletScope.projectId !== input.scope.projectId || ownerWalletScope.projectEnvironmentId !== input.scope.envId || !sameDelegatedWalletAuthorityV1(buildDelegatedWalletAuthorityV1({ permissions: authority.permissions }), buildDelegatedWalletAuthorityV1({ permissions: buildFullOwnerPermissionsV1() })) || !walletSessionCapabilitySubjectsV1Equal(session.capabilitySubjects, buildWalletSessionCapabilitySubjectsV1(authority))) return null;
43
+ return new WalletRelocationOwnerRequest(session.walletId, session.authorityId, session.walletAuthMethodId, session.expiresAtMs, origin, await sha256HexUtf8(token), Object.freeze({ ...input.scope }), session.tenantId, session.authorizationId, await digestOpaqueValue(token));
44
+ }
45
+ prepareApprovalGuard(database, scope, binding, nowMs) {
46
+ if (scope.namespace !== this.scope.namespace || scope.orgId !== this.scope.orgId || scope.projectId !== this.scope.projectId || scope.envId !== this.scope.envId || this.bindMove(binding).encoded() !== binding.encoded()) throw new Error("Relocation approval owner binding changed");
47
+ return [database.prepare(`UPDATE wallet_session_authorizations_v2
48
+ SET retired_at_ms = retired_at_ms
49
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
50
+ AND tenant_id = ?5 AND authorization_id = ?6
51
+ AND wallet_id = ?7 AND authority_id = ?8 AND wallet_auth_method_id = ?9
52
+ AND operation_credential_hash = ?10 AND expires_at_ms = ?11
53
+ AND retired_at_ms IS NULL AND expires_at_ms > ?12
54
+ AND expires_at_ms > CAST(unixepoch('subsec') * 1000 AS INTEGER)`).bind(scope.namespace, scope.orgId, scope.projectId, scope.envId, this.tenantId, this.authorizationId, this.walletId, this.authorityId, this.walletAuthMethodId, this.credentialHash, this.credentialExpiresAtMs, nowMs), database.prepare(D1_BATCH_CAS_GUARD_SQL)];
55
+ }
56
+ bindMove(input) {
57
+ return WalletRelocationChallengeBinding.parse({
58
+ walletId: this.walletId,
59
+ moveId: input.moveId,
60
+ requestDigestHex: input.requestDigestHex,
61
+ sourceGeneration: input.sourceGeneration,
62
+ destinationRegion: input.destinationRegion,
63
+ authorityId: this.authorityId,
64
+ walletAuthMethodId: this.walletAuthMethodId,
65
+ credentialDigestHex: this.#credentialDigestHex,
66
+ credentialExpiresAtMs: this.credentialExpiresAtMs,
67
+ origin: this.origin
68
+ });
69
+ }
70
+ };
71
+ //#endregion
72
+ export { WalletRelocationOwnerRequest };
73
+
74
+ //# sourceMappingURL=d1WalletRelocationOwnerRequest.js.map
@@ -0,0 +1,77 @@
1
+ import { D1_BATCH_CAS_GUARD_SQL } from "../../../../storage/d1Sql.js";
2
+ import { decodeWebAuthnBase64UrlOrBase64, parseWebAuthnAuthenticationCredential, webAuthnCredentialIdB64uFromCredential } from "../../../auth/webAuthnCredentialCodecs.js";
3
+ import { CloudflareD1WebAuthnStore } from "../webauthn/d1WebAuthnStore.js";
4
+ import { d1HostIsWithinWebAuthnRpId } from "./d1WalletAuthMethodBoundary.js";
5
+ import { readWalletRelocationOwner } from "./d1WalletRelocationOwner.js";
6
+ import { D1WalletRelocationChallenges } from "./d1WalletRelocationChallenges.js";
7
+ import { verifyAuthenticationResponse } from "@simplewebauthn/server";
8
+ //#region src/router/cloudflare/d1/wallet/d1WalletRelocationPasskey.ts
9
+ async function verifyWalletRelocationPasskey(input) {
10
+ const challenges = new D1WalletRelocationChallenges(input.database, input.scope);
11
+ const challenge = await challenges.read(input.binding);
12
+ if (!challenge || challenge.state !== "issued" || !Number.isSafeInteger(input.nowMs) || input.nowMs < challenge.createdAtMs || input.nowMs >= challenge.expiresAtMs) return { kind: "denied" };
13
+ const credential = parseWebAuthnAuthenticationCredential(input.credential);
14
+ if (!credential) return { kind: "denied" };
15
+ const credentialId = webAuthnCredentialIdB64uFromCredential(credential);
16
+ if (!credentialId.ok) return { kind: "denied" };
17
+ const owner = await readWalletRelocationOwner(input.database, input.scope, input.binding);
18
+ if (!owner || owner.method.kind !== "passkey") return { kind: "denied" };
19
+ const { method, authority } = owner;
20
+ if (method.credentialIdB64u !== credentialId.credentialIdB64u || !d1HostIsWithinWebAuthnRpId(new URL(input.binding.origin).hostname, method.rpId)) return { kind: "denied" };
21
+ const authenticator = await new CloudflareD1WebAuthnStore({
22
+ database: input.database,
23
+ ...input.scope
24
+ }).readAuthenticator({
25
+ userId: method.walletId,
26
+ credentialIdB64u: method.credentialIdB64u
27
+ });
28
+ if (!authenticator || authenticator.credentialPublicKeyB64u !== method.credentialPublicKeyB64u) return { kind: "denied" };
29
+ let newCounter;
30
+ try {
31
+ const verification = await verifyAuthenticationResponse({
32
+ response: {
33
+ id: credential.id,
34
+ rawId: credential.rawId,
35
+ type: "public-key",
36
+ clientExtensionResults: {},
37
+ response: {
38
+ clientDataJSON: credential.response.clientDataJSON,
39
+ authenticatorData: credential.response.authenticatorData,
40
+ signature: credential.response.signature,
41
+ ...credential.response.userHandle === null ? {} : { userHandle: credential.response.userHandle }
42
+ }
43
+ },
44
+ expectedChallenge: challenge.challengeB64u,
45
+ expectedOrigin: input.binding.origin,
46
+ expectedRPID: method.rpId,
47
+ credential: {
48
+ id: method.credentialIdB64u,
49
+ publicKey: decodeWebAuthnBase64UrlOrBase64(method.credentialPublicKeyB64u, "passkey public key"),
50
+ counter: authenticator.counter
51
+ },
52
+ requireUserVerification: true
53
+ });
54
+ if (!verification.verified) return { kind: "denied" };
55
+ newCounter = verification.authenticationInfo.newCounter;
56
+ } catch {
57
+ return { kind: "denied" };
58
+ }
59
+ return {
60
+ kind: "verified",
61
+ authorityDigestB64u: authority.authorityDigestB64u,
62
+ authorityRevocationEpoch: authority.revocationEpoch,
63
+ commitPrerequisites: [
64
+ ...owner.commitPrerequisites,
65
+ input.database.prepare(`UPDATE webauthn_authenticators SET counter = ?, updated_at_ms = ?
66
+ WHERE namespace = ? AND org_id = ? AND project_id = ? AND env_id = ?
67
+ AND user_id = ? AND credential_id_b64u = ? AND counter = ?
68
+ AND credential_public_key_b64u = ?`).bind(newCounter, input.nowMs, input.scope.namespace, input.scope.orgId, input.scope.projectId, input.scope.envId, method.walletId, method.credentialIdB64u, authenticator.counter, authenticator.credentialPublicKeyB64u),
69
+ input.database.prepare(D1_BATCH_CAS_GUARD_SQL),
70
+ ...challenges.prepareConsume(challenge, input.nowMs)
71
+ ]
72
+ };
73
+ }
74
+ //#endregion
75
+ export { verifyWalletRelocationPasskey };
76
+
77
+ //# sourceMappingURL=d1WalletRelocationPasskey.js.map
@@ -0,0 +1,37 @@
1
+ import { sha256HexUtf8 } from "../../../../shared-ts/src/utils/digests.js";
2
+ import { parseSessionOrigin } from "../../../../authorization/domain.js";
3
+ import { extractBearerCredential } from "../../../auth/routerApiKeyAuth.js";
4
+ import { readWalletRelocationOwner } from "./d1WalletRelocationOwner.js";
5
+ import { D1WalletRelocationApprovals } from "./d1WalletRelocationApprovals.js";
6
+ //#region src/router/cloudflare/d1/wallet/d1WalletRelocationReadAccess.ts
7
+ var WalletRelocationReadAccess = class WalletRelocationReadAccess {
8
+ #binding;
9
+ constructor(binding) {
10
+ this.#binding = binding;
11
+ Object.freeze(this);
12
+ }
13
+ static async authenticate(input) {
14
+ if (!Number.isSafeInteger(input.nowMs) || input.nowMs <= 0) return null;
15
+ const token = extractBearerCredential(input.request.headers);
16
+ if (!token) return null;
17
+ let origin;
18
+ try {
19
+ origin = parseSessionOrigin(input.request.headers.get("origin"));
20
+ } catch {
21
+ return null;
22
+ }
23
+ if (origin !== input.binding.origin || !input.allowedOrigins.includes(origin) || input.nowMs >= input.binding.credentialExpiresAtMs || await sha256HexUtf8(token) !== input.binding.credentialDigestHex) return null;
24
+ const approval = await new D1WalletRelocationApprovals(input.database, input.scope).read(input.binding);
25
+ if (!approval || approval.approvedAtMs > input.nowMs) return null;
26
+ const owner = await readWalletRelocationOwner(input.database, input.scope, input.binding);
27
+ if (!owner || owner.authority.authorityDigestB64u !== approval.authorityDigestB64u || owner.authority.revocationEpoch !== approval.authorityRevocationEpoch) return null;
28
+ return new WalletRelocationReadAccess(input.binding);
29
+ }
30
+ get binding() {
31
+ return this.#binding;
32
+ }
33
+ };
34
+ //#endregion
35
+ export { WalletRelocationReadAccess };
36
+
37
+ //# sourceMappingURL=d1WalletRelocationReadAccess.js.map