@seams/wallet-server 0.8.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (369) hide show
  1. package/THIRD_PARTY_NOTICES.md +7 -1
  2. package/artifact-manifest.json +196 -41
  3. package/cloudflare-router-ab/build/deriver-a/build-stamp.json +1 -1
  4. package/cloudflare-router-ab/build/deriver-a/index.js +2 -2
  5. package/cloudflare-router-ab/build/deriver-a/index_bg.wasm +0 -0
  6. package/cloudflare-router-ab/build/deriver-b/build-stamp.json +1 -1
  7. package/cloudflare-router-ab/build/deriver-b/index.js +2 -2
  8. package/cloudflare-router-ab/build/deriver-b/index_bg.wasm +0 -0
  9. package/cloudflare-router-ab/build/local-tools/darwin-arm64/router_ab_local_init +0 -0
  10. package/cloudflare-router-ab/build/local-tools/darwin-x64/router_ab_local_init +0 -0
  11. package/cloudflare-router-ab/build/local-tools/linux-x64/router_ab_local_init +0 -0
  12. package/cloudflare-router-ab/build/router/build-stamp.json +1 -1
  13. package/cloudflare-router-ab/build/router/index.js +2 -2
  14. package/cloudflare-router-ab/build/router/index_bg.wasm +0 -0
  15. package/cloudflare-router-ab/build/signing-worker/build-stamp.json +1 -1
  16. package/cloudflare-router-ab/build/signing-worker/index.js +2 -2
  17. package/cloudflare-router-ab/build/signing-worker/index_bg.wasm +0 -0
  18. package/cloudflare-router-ab/build/tenant-root-control-plane/build-stamp.json +1 -1
  19. package/cloudflare-router-ab/build/tenant-root-control-plane/index.js +2 -2
  20. package/cloudflare-router-ab/build/tenant-root-control-plane/index_bg.wasm +0 -0
  21. package/cloudflare-router-ab/migrations/deriver-a/0019_wallet_object_addresses.sql +10 -0
  22. package/cloudflare-router-ab/migrations/deriver-b/0019_wallet_object_addresses.sql +10 -0
  23. package/cloudflare-router-ab/scripts/prepare-local-runtime-config.mjs +3 -117
  24. package/cloudflare-router-ab/wrangler.deriver-a.toml +0 -8
  25. package/cloudflare-router-ab/wrangler.deriver-b.toml +24 -8
  26. package/cloudflare-router-ab/wrangler.router.toml +0 -2
  27. package/cloudflare-router-ab/wrangler.signing-worker.toml +29 -0
  28. package/dist/esm/authorization/domain.js +3 -2
  29. package/dist/esm/authorization/ed25519WalletSessionAdmission.js +0 -0
  30. package/dist/esm/authorization/service.js +64 -36
  31. package/dist/esm/cloud-host.js +24 -19
  32. package/dist/esm/core/EmailOtpRecords.js +29 -6
  33. package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.js +2 -0
  34. package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPresignBridge.js +10 -0
  35. package/dist/esm/core/ThresholdService/routerAb/internalServiceHttp.js +1 -0
  36. package/dist/esm/core/ThresholdService/validation.js +2 -2
  37. package/dist/esm/core/authService/nearPrivateKeySigning.js +1 -1
  38. package/dist/esm/core/authService/webauthn.js +1 -1
  39. package/dist/esm/core/d1Ed25519SignerRead.js +55 -0
  40. package/dist/esm/core/d1WalletStore.js +14 -11
  41. package/dist/esm/core/deviceLinking/linkedDeviceEmailOtpGrant.js +2 -2
  42. package/dist/esm/core/deviceLinking/linkedDeviceManagement.js +1 -1
  43. package/dist/esm/core/deviceLinking/linkedDeviceSessionRecord.js +2 -2
  44. package/dist/esm/core/emailOtpD1Statements.js +1 -0
  45. package/dist/esm/core/nearRelayerAccountProvisioning.js +1 -1
  46. package/dist/esm/core/routerAbSigning/RouterAbEcdsaPresignRuntime.js +4 -0
  47. package/dist/esm/core/signingLanes/WalletExecutionLaneProjection.js +1 -1
  48. package/dist/esm/core/signingMaterial/ordinaryInactiveSignerMaterialReservation.js +1 -0
  49. package/dist/esm/hosted-wallet-gateway.js +93 -10
  50. package/dist/esm/localHostedWalletGatewayHandler.js +12 -9
  51. package/dist/esm/localIntendedYaoSigningFault.js +2 -30
  52. package/dist/esm/localRegistrationSetupAuthority.js +8 -1
  53. package/dist/esm/router/auth/commonRouterUtils.js +17 -10
  54. package/dist/esm/router/auth/routerApiCredentialAuth.js +26 -7
  55. package/dist/esm/router/auth/walletRegistrationContext.js +49 -0
  56. package/dist/esm/router/auth/webAuthnCredentialCodecs.js +1 -1
  57. package/dist/esm/router/cloudflare/d1/auth/d1AuthorizationAssembly.js +4 -3
  58. package/dist/esm/router/cloudflare/d1/auth/d1AuthorizedOperationRouteService.js +2 -0
  59. package/dist/esm/router/cloudflare/d1/auth/d1EmailOtpRouteService.js +25 -0
  60. package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthConfig.js +14 -6
  61. package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthService.js +44 -40
  62. package/dist/esm/router/cloudflare/d1/auth/walletSessionCredentialReaders.js +17 -1
  63. package/dist/esm/router/cloudflare/d1/authorization/authorizedOperationStatements.js +35 -5
  64. package/dist/esm/router/cloudflare/d1/authorization/d1AuthorizationStore.js +258 -99
  65. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.js +31 -4
  66. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceOwnerAuthorizationProvider.js +1 -1
  67. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRequestProofNonceStore.js +1 -1
  68. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionRecords.js +1 -1
  69. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.js +1 -1
  70. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetPlanner.js +1 -1
  71. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceVerifiedLinkBuilder.js +1 -1
  72. package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoLifecycleDecisionStore.js +11 -2
  73. package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.js +100 -10
  74. package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoStateWriteFence.js +92 -0
  75. package/dist/esm/router/cloudflare/d1/ed25519Yao/d1WalletCeremonyActivity.js +77 -0
  76. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.js +14 -8
  77. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.js +14 -8
  78. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.js +3 -1
  79. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.js +58 -38
  80. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.js +27 -20
  81. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecoveryService.js +1 -0
  82. package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpSessionResolver.js +1 -0
  83. package/dist/esm/router/cloudflare/d1/oidc/d1OidcBoundary.js +1 -1
  84. package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.js +18 -7
  85. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.js +75 -14
  86. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.js +1 -1
  87. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.js +49 -29
  88. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationSessionTransaction.js +28 -0
  89. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationSetupSupport.js +11 -1
  90. package/dist/esm/router/cloudflare/d1/registration/d1WalletExecutionAuthority.js +168 -0
  91. package/dist/esm/router/cloudflare/d1/registration/d1WalletOperationStore.js +53 -0
  92. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.js +83 -42
  93. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationInitialSession.js +33 -0
  94. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationPreparation.js +16 -0
  95. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationRead.js +58 -0
  96. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationService.js +439 -500
  97. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetup.js +1 -1
  98. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.js +104 -90
  99. package/dist/esm/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.js +78 -44
  100. package/dist/esm/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.js +11 -35
  101. package/dist/esm/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.js +98 -39
  102. package/dist/esm/router/cloudflare/d1/versionedJson/d1VersionedJsonRecordStore.js +12 -9
  103. package/dist/esm/router/cloudflare/d1/wallet/authorizationSnapshotLayout.js +168 -0
  104. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerFinalizeRecord.js +1 -1
  105. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerService.js +15 -6
  106. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthMethodService.js +3 -40
  107. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorityStore.js +54 -1
  108. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationCleanup.js +157 -0
  109. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationFreeze.js +56 -0
  110. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationHistory.js +238 -0
  111. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationIntake.js +287 -0
  112. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationSnapshot.js +295 -0
  113. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationApprovals.js +140 -0
  114. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationChallenges.js +170 -0
  115. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationEmailOtp.js +60 -0
  116. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationOwner.js +33 -0
  117. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationOwnerRequest.js +74 -0
  118. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationPasskey.js +77 -0
  119. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationReadAccess.js +37 -0
  120. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationSessions.js +97 -0
  121. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationWriteBlock.js +133 -0
  122. package/dist/esm/router/cloudflare/d1/walletObjectAddresses.js +47 -0
  123. package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnAuthService.js +1 -1
  124. package/dist/esm/router/cloudflare/runtime/routerAbServiceBindings.js +32 -1
  125. package/dist/esm/router/cloudflare/runtime/staticWalletConsoleBinding.js +20 -8
  126. package/dist/esm/router/cloudflare/runtime/walletAuthorizationRelocationRoutes.js +488 -0
  127. package/dist/esm/router/cloudflare/runtime/walletConsoleOps.js +1 -1
  128. package/dist/esm/router/cloudflare/runtime/walletConsoleOpsClient.js +26 -6
  129. package/dist/esm/router/cloudflare/runtime/walletControlOps.js +3 -0
  130. package/dist/esm/router/cloudflare/runtime/walletGateway.js +1 -1
  131. package/dist/esm/router/cloudflare/runtime/walletObjectAddresses.js +105 -0
  132. package/dist/esm/router/cloudflare/runtime/walletPlacementRoutes.js +339 -0
  133. package/dist/esm/router/cloudflare/runtime/walletRelocationDeriver.js +244 -0
  134. package/dist/esm/router/cloudflare/runtime/walletRelocationEcdsa.js +212 -0
  135. package/dist/esm/router/cloudflare/runtime/walletRelocationEd25519.js +172 -0
  136. package/dist/esm/router/cloudflare/runtime/walletRelocationOps.js +183 -0
  137. package/dist/esm/router/cloudflare/runtime/walletRelocationPresign.js +185 -0
  138. package/dist/esm/router/cloudflare/runtime/walletRelocationSource.js +221 -0
  139. package/dist/esm/router/cloudflare/signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.js +30 -8
  140. package/dist/esm/router/cloudflare-adaptor.js +8 -8
  141. package/dist/esm/router/cloudflare.js +34115 -32240
  142. package/dist/esm/router/domains/ecdsa/routerAbEcdsaStrictRegistration.js +35 -9
  143. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoCapabilityCommit.js +42 -0
  144. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.js +32 -6
  145. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.js +61 -1
  146. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPersistence.js +70 -3
  147. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRuntime.js +59 -87
  148. package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.js +52 -22
  149. package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExportRequestScopedCloudflare.js +10 -7
  150. package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.js +108 -78
  151. package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryRequestScopedCloudflare.js +19 -5
  152. package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryWalletSessionAuthorization.js +71 -22
  153. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.js +37 -25
  154. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.js +3 -3
  155. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationExecutionRecord.js +2 -1
  156. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.js +24 -3
  157. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationRequestScopedCloudflare.js +4 -3
  158. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.js +20 -7
  159. package/dist/esm/router/domains/ed25519Yao/routerAbEd25519YaoGatewayEnvelope.js +7 -1
  160. package/dist/esm/router/domains/emailOtp/emailOtpRouteHandlers.js +2 -2
  161. package/dist/esm/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrieval.js +1 -1
  162. package/dist/esm/router/domains/passkeyCustody/registrationCustodyOutcome.js +34 -18
  163. package/dist/esm/router/domains/passkeyCustody/walletCustodyRegistrationAdmission.js +2 -2
  164. package/dist/esm/router/domains/passkeyCustody/walletCustodyRegistrationCommit.js +16 -6
  165. package/dist/esm/router/domains/signingOperations/authorizedOperationWire.js +73 -0
  166. package/dist/esm/router/domains/signingOperations/ecdsaSigningResponse.js +31 -0
  167. package/dist/esm/router/domains/signingOperations/ed25519AuthorizedOperationReceipt.js +1 -1
  168. package/dist/esm/router/domains/signingOperations/routerAbEcdsaDerivationNormalSigningRoute.js +2 -1
  169. package/dist/esm/router/domains/signingOperations/routerAbEd25519NormalSigningRoute.js +31 -121
  170. package/dist/esm/router/domains/signingOperations/routerAbNormalSigningAdmission.js +2 -93
  171. package/dist/esm/router/domains/signingOperations/routerAbPrivateSigningWorker.js +1 -1
  172. package/dist/esm/router/domains/signingOperations/signingPrepareSession.js +33 -0
  173. package/dist/esm/router/domains/walletRegistration/registrationSessionSeal.js +121 -0
  174. package/dist/esm/router/domains/walletRegistration/walletRegistrationReservation.js +4 -4
  175. package/dist/esm/router/domains/walletRegistration/walletRegistrationRoutes.js +46 -157
  176. package/dist/esm/router/domains/walletRegistration/walletRegistrationSetupPayload.js +1 -1
  177. package/dist/esm/router/express.js +764 -894
  178. package/dist/esm/router/framework/http.js +2 -1
  179. package/dist/esm/router/transport/fetch/createFetchRouter.js +2 -2
  180. package/dist/esm/router/transport/fetch/routes/auth.js +1 -1
  181. package/dist/esm/router/transport/fetch/routes/deviceLinking.js +3 -3
  182. package/dist/esm/router/transport/fetch/routes/deviceLinkingOwnerAuthorization.js +2 -2
  183. package/dist/esm/router/transport/fetch/routes/ed25519AuthorizedOperationRevalidation.js +65 -0
  184. package/dist/esm/router/transport/fetch/routes/normalSigningRouterProxy.js +13 -3
  185. package/dist/esm/router/transport/fetch/routes/passkeyCustody.js +3 -3
  186. package/dist/esm/router/transport/fetch/routes/sessions.js +3 -2
  187. package/dist/esm/router/transport/fetch/routes/thresholdEcdsa.js +67 -130
  188. package/dist/esm/router/transport/fetch/routes/thresholdEd25519.js +76 -212
  189. package/dist/esm/router/transport/fetch/routes/walletExecutionLanePreflight.js +18 -41
  190. package/dist/esm/router/transport/fetch/routes/walletRegistration.js +6 -5
  191. package/dist/esm/router/transport/fetch/routes/webauthnAuthenticators.js +1 -1
  192. package/dist/esm/shared-ts/src/authorization/index.js +1 -1
  193. package/dist/esm/shared-ts/src/authorization/walletAuthority.js +2 -2
  194. package/dist/esm/shared-ts/src/device-linking/activeWalletSession.js +12 -2
  195. package/dist/esm/shared-ts/src/device-linking/digests.js +1 -1
  196. package/dist/esm/shared-ts/src/device-linking/ed25519ExportRoot.js +1 -1
  197. package/dist/esm/shared-ts/src/device-linking/index.js +1 -1
  198. package/dist/esm/shared-ts/src/device-linking/parsers.js +1 -1
  199. package/dist/esm/shared-ts/src/device-linking/sourceContribution.js +1 -1
  200. package/dist/esm/shared-ts/src/device-linking/wireFields.js +1 -1
  201. package/dist/esm/shared-ts/src/near/nearClient.js +1 -1
  202. package/dist/esm/shared-ts/src/signing-lanes/ownerContinuity.js +2 -2
  203. package/dist/esm/shared-ts/src/utils/ecdsaServerTiming.js +6 -1
  204. package/dist/esm/shared-ts/src/utils/emailOtpDomain.js +4 -2
  205. package/dist/esm/shared-ts/src/utils/routerAbEcdsaDerivation.js +1 -1
  206. package/dist/esm/shared-ts/src/utils/routerAbPublicKeyset.js +0 -27
  207. package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryEcdsaPossession.js +1 -1
  208. package/dist/esm/threshold/session/signingSessionSeal/options.js +1 -1
  209. package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker_bg.wasm +0 -0
  210. package/dist/types/shared-ts/src/device-linking/activeWalletSession.d.ts +2 -1
  211. package/dist/types/shared-ts/src/device-linking/contracts.d.ts +10 -0
  212. package/dist/types/shared-ts/src/threshold/ed25519OperationFingerprint.d.ts +2 -1
  213. package/dist/types/shared-ts/src/utils/emailOtpDomain.d.ts +3 -1
  214. package/dist/types/shared-ts/src/utils/routerAbPublicKeyset.d.ts +0 -9
  215. package/dist/types/shared-ts/src/utils/walletManagementProtocol.d.ts +1 -1
  216. package/dist/types/wallet-server/src/authorization/domain.d.ts +17 -1
  217. package/dist/types/wallet-server/src/authorization/ecdsaWalletSessionAdmission.d.ts +1 -0
  218. package/dist/types/wallet-server/src/authorization/ed25519WalletSessionAdmission.d.ts +35 -0
  219. package/dist/types/wallet-server/src/authorization/ed25519WalletSessionAdmission.typecheck.d.ts +2 -0
  220. package/dist/types/wallet-server/src/authorization/service.d.ts +43 -5
  221. package/dist/types/wallet-server/src/authorization/sessionRouting.d.ts +2 -0
  222. package/dist/types/wallet-server/src/cloud-host.d.ts +7 -3
  223. package/dist/types/wallet-server/src/core/EmailOtpRecords.d.ts +2 -1
  224. package/dist/types/wallet-server/src/core/EmailOtpStores.d.ts +19 -5
  225. package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.d.ts +1 -0
  226. package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPresignBridge.d.ts +6 -0
  227. package/dist/types/wallet-server/src/core/ThresholdService/routerAb/internalServiceHttp.d.ts +1 -0
  228. package/dist/types/wallet-server/src/core/d1Ed25519SignerRead.d.ts +17 -0
  229. package/dist/types/wallet-server/src/core/d1WalletStore.d.ts +6 -0
  230. package/dist/types/wallet-server/src/core/emailOtpD1Statements.d.ts +1 -0
  231. package/dist/types/wallet-server/src/core/routerAbSigning/RouterAbEcdsaPresignRuntime.d.ts +5 -1
  232. package/dist/types/wallet-server/src/core/signingMaterial/ordinaryInactiveSignerMaterialReservation.d.ts +1 -0
  233. package/dist/types/wallet-server/src/core/threeRouteRegistrationContracts.d.ts +14 -48
  234. package/dist/types/wallet-server/src/hosted-wallet-gateway.d.ts +4 -3
  235. package/dist/types/wallet-server/src/localIntendedYaoSigningFault.d.ts +1 -16
  236. package/dist/types/wallet-server/src/localRegistrationSetupAuthority.d.ts +1 -1
  237. package/dist/types/wallet-server/src/router/auth/commonRouterUtils.d.ts +7 -1
  238. package/dist/types/wallet-server/src/router/auth/routerApiCredentialAuth.d.ts +11 -3
  239. package/dist/types/wallet-server/src/router/auth/walletRegistrationContext.d.ts +8 -0
  240. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1AuthorizationAssembly.d.ts +1 -1
  241. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1EmailOtpRouteService.d.ts +16 -0
  242. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthConfig.d.ts +7 -4
  243. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthService.d.ts +4 -1
  244. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/walletSessionCredentialReaders.d.ts +7 -1
  245. package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/d1AuthorizationStore.d.ts +32 -1
  246. package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.d.ts +2 -0
  247. package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoLifecycleDecisionStore.d.ts +3 -1
  248. package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.d.ts +1 -0
  249. package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoStateWriteFence.d.ts +8 -0
  250. package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1WalletCeremonyActivity.d.ts +15 -0
  251. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.d.ts +6 -1
  252. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.d.ts +1 -0
  253. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.d.ts +4 -1
  254. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpCounters.typecheck.d.ts +2 -0
  255. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.d.ts +6 -29
  256. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.d.ts +21 -7
  257. package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.d.ts +17 -1
  258. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.d.ts +32 -7
  259. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.d.ts +16 -7
  260. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationSessionTransaction.d.ts +13 -0
  261. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationSetupSupport.d.ts +7 -0
  262. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletExecutionAuthority.d.ts +41 -0
  263. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletOperationStore.d.ts +28 -0
  264. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.d.ts +6 -9
  265. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationInitialSession.d.ts +17 -0
  266. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationPreparation.d.ts +12 -0
  267. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationRead.d.ts +43 -0
  268. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationService.d.ts +24 -45
  269. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.d.ts +9 -4
  270. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.d.ts +42 -14
  271. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.d.ts +5 -4
  272. package/dist/types/wallet-server/src/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.d.ts +24 -1
  273. package/dist/types/wallet-server/src/router/cloudflare/d1/versionedJson/d1VersionedJsonRecordStore.d.ts +10 -4
  274. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/authorizationSnapshotLayout.d.ts +21 -0
  275. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAddSignerService.d.ts +3 -0
  276. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthMethodService.d.ts +3 -7
  277. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorityStore.d.ts +8 -0
  278. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationCleanup.d.ts +20 -0
  279. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationFreeze.d.ts +12 -0
  280. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationHistory.d.ts +20 -0
  281. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationIntake.d.ts +29 -0
  282. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationSnapshot.d.ts +31 -0
  283. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationApprovals.d.ts +49 -0
  284. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationChallenges.d.ts +47 -0
  285. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationEmailOtp.d.ts +25 -0
  286. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationOwner.d.ts +88 -0
  287. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationOwnerRequest.d.ts +37 -0
  288. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationPasskey.d.ts +12 -0
  289. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationReadAccess.d.ts +18 -0
  290. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationSessions.d.ts +23 -0
  291. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationWriteBlock.d.ts +16 -0
  292. package/dist/types/wallet-server/src/router/cloudflare/d1/walletObjectAddresses.d.ts +14 -0
  293. package/dist/types/wallet-server/src/router/cloudflare/runtime/routerAbServiceBindings.d.ts +13 -0
  294. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletAuthorizationRelocationRoutes.d.ts +21 -0
  295. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOps.d.ts +1 -1
  296. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOpsClient.d.ts +3 -3
  297. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletControlOps.d.ts +2 -1
  298. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletGateway.d.ts +3 -1
  299. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletObjectAddresses.d.ts +45 -0
  300. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletPlacementRoutes.d.ts +30 -0
  301. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationDeriver.d.ts +11 -0
  302. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationEcdsa.d.ts +7 -0
  303. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationEd25519.d.ts +7 -0
  304. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationOps.d.ts +11 -0
  305. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationPresign.d.ts +7 -0
  306. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationSource.d.ts +26 -0
  307. package/dist/types/wallet-server/src/router/cloudflare/signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.d.ts +5 -0
  308. package/dist/types/wallet-server/src/router/domains/ecdsa/routerAbEcdsaStrictRegistration.d.ts +3 -0
  309. package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoCapabilityCommit.d.ts +7 -0
  310. package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.d.ts +41 -7
  311. package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.d.ts +33 -2
  312. package/dist/types/wallet-server/src/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.d.ts +12 -6
  313. package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.d.ts +17 -9
  314. package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryWalletSessionAuthorization.d.ts +2 -0
  315. package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.d.ts +13 -14
  316. package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.d.ts +7 -3
  317. package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationExecutionRecord.d.ts +1 -0
  318. package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.d.ts +6 -1
  319. package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.d.ts +11 -0
  320. package/dist/types/wallet-server/src/router/domains/ed25519Yao/routerAbEd25519YaoGatewayEnvelope.d.ts +12 -3
  321. package/dist/types/wallet-server/src/router/domains/passkeyCustody/registrationCustodyOutcome.d.ts +10 -6
  322. package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationAdmission.d.ts +10 -3
  323. package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationCommit.d.ts +12 -5
  324. package/dist/types/wallet-server/src/router/domains/signingOperations/authorizedOperationWire.d.ts +97 -0
  325. package/dist/types/wallet-server/src/router/domains/signingOperations/ecdsaSigningResponse.d.ts +13 -0
  326. package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbNormalSigningAdmission.d.ts +9 -206
  327. package/dist/types/wallet-server/src/router/domains/signingOperations/signingPrepareSession.d.ts +23 -0
  328. package/dist/types/wallet-server/src/router/domains/walletRegistration/registrationSessionSeal.d.ts +36 -0
  329. package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationInputs.d.ts +7 -7
  330. package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationReservation.d.ts +80 -6
  331. package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationRoutes.d.ts +15 -5
  332. package/dist/types/wallet-server/src/router/framework/apiCredentialPorts.d.ts +24 -0
  333. package/dist/types/wallet-server/src/router/framework/authServicePort.d.ts +21 -7
  334. package/dist/types/wallet-server/src/router/framework/routerApi.d.ts +3 -12
  335. package/dist/types/wallet-server/src/router/transport/fetch/routes/ed25519AuthorizedOperationRevalidation.d.ts +37 -0
  336. package/dist/types/wallet-server/src/router/transport/fetch/routes/thresholdEcdsa.d.ts +1 -17
  337. package/dist/types/wallet-server/src/storage/tenantRoute.d.ts +1 -1
  338. package/migrations/d1-signer/0049_wallet_relocation_challenges.sql +16 -0
  339. package/migrations/d1-signer/0050_wallet_relocation_approvals.sql +14 -0
  340. package/migrations/d1-signer/0051_wallet_relocation_email_otp.sql +92 -0
  341. package/migrations/d1-signer/0052_wallet_relocation_session_fences.sql +91 -0
  342. package/migrations/d1-signer/0053_wallet_hosted_history_import.sql +164 -0
  343. package/migrations/d1-signer/0054_wallet_authorization_freeze.sql +318 -0
  344. package/migrations/d1-signer/0055_wallet_authorization_snapshot.sql +120 -0
  345. package/migrations/d1-signer/0056_wallet_authorization_history_import.sql +424 -0
  346. package/migrations/d1-signer/0057_wallet_authorization_intake.sql +44 -0
  347. package/migrations/d1-signer/0058_wallet_ceremony_activity.sql +59 -0
  348. package/migrations/d1-signer/0059_wallet_authorization_activation.sql +45 -0
  349. package/migrations/d1-signer/0060_wallet_authorization_cleanup.sql +153 -0
  350. package/migrations/d1-signer/0061_wallet_session_operation_settlement.sql +28 -0
  351. package/migrations/d1-signer/0062_wallet_step_up_operation_settlement.sql +204 -0
  352. package/migrations/d1-signer/0063_wallet_operation_history_transfer.sql +466 -0
  353. package/migrations/d1-signer/0064_wallet_execution_generations.sql +93 -0
  354. package/migrations/d1-signer/0065_wallet_operation_execution_generation.sql +37 -0
  355. package/migrations/d1-signer/0066_regional_deployment_admission.sql +59 -0
  356. package/migrations/d1-signer/0067_registration_completion_decision.sql +12 -0
  357. package/migrations/d1-signer/0068_registration_cancellation_write_fence.sql +24 -0
  358. package/migrations/d1-signer/0069_cancelled_registration_session_fence.sql +11 -0
  359. package/migrations/d1-signer/0070_wallet_passkey_relocation.sql +369 -0
  360. package/migrations/d1-signer/0071_regional_wallet_otp_counters.sql +98 -0
  361. package/migrations/d1-signer/0072_linked_device_relocation_history.sql +899 -0
  362. package/migrations/d1-signer/0073_wallet_recovery_relocation.sql +86 -0
  363. package/migrations/d1-signer/0074_email_otp_relocation.sql +158 -0
  364. package/migrations/d1-signer/0075_wallet_authorization_return.sql +107 -0
  365. package/migrations/d1-signer/0076_wallet_relocation_write_block.sql +406 -0
  366. package/migrations/d1-signer/0077_wallet_object_addresses.sql +24 -0
  367. package/package.json +1 -1
  368. package/src/README.md +23 -1
  369. package/cloudflare-router-ab/scripts/local-key-material.mjs +0 -29
@@ -219,6 +219,16 @@ function parseWalletEd25519YaoActiveCapabilityRecord(raw) {
219
219
  default: return null;
220
220
  }
221
221
  }
222
+ /** Where an Ed25519 signer row names the material activation it serves. */
223
+ const ED25519_SIGNER_ACTIVATION_ID_PATH = "$.activeYaoCapability.admissionRequest.scope.material_activation.activation_id";
224
+ /** The wallet's signer for one material activation, among the rows that name its id. */
225
+ function selectWalletEd25519Signer(rows, walletId, materialActivation) {
226
+ const matches = rows.map((row) => parseWalletEd25519SignerRecord(parseD1JsonColumn(row.record_json))).filter((record) => record !== null && record.walletId === walletId && sameRouterAbMpcMaterialActivationRef(record.activeYaoCapability.admissionRequest.scope.material_activation, materialActivation));
227
+ if (matches.length === 0) return null;
228
+ const signerId = matches[0]?.signerId;
229
+ if (!signerId || matches.some((record) => record.signerId !== signerId)) throw new Error("Wallet has conflicting Ed25519 material activations");
230
+ return matches[0] ?? null;
231
+ }
222
232
  function parseWalletEd25519SignerRecord(raw) {
223
233
  if (!isPlainObject(raw) || raw.version !== "wallet_signer_ed25519_v1") return null;
224
234
  const walletId = parseWalletId(raw.walletId);
@@ -579,7 +589,7 @@ var D1WalletStore = class {
579
589
  await this.ensureSchema();
580
590
  const walletId = normalizeOptionalTrimmedString(input.walletId);
581
591
  if (!walletId) return null;
582
- const matches = ((await this.database.prepare(`SELECT record_json
592
+ return selectWalletEd25519Signer((await this.database.prepare(`SELECT record_json
583
593
  FROM wallet_signers
584
594
  WHERE namespace = ?
585
595
  AND org_id = ?
@@ -587,15 +597,8 @@ var D1WalletStore = class {
587
597
  AND env_id = ?
588
598
  AND wallet_id = ?
589
599
  AND signer_family = 'ed25519'
590
- AND json_extract(
591
- record_json,
592
- '$.activeYaoCapability.admissionRequest.scope.material_activation.activation_id'
593
- ) = ?
594
- LIMIT 4`).bind(this.scope.namespace, this.scope.orgId, this.scope.projectId, this.scope.envId, walletId, input.materialActivation.activation_id).all()).results || []).map((row) => parseWalletEd25519SignerRecord(parseD1JsonColumn(row.record_json))).filter((record) => record !== null && record.walletId === walletId && sameRouterAbMpcMaterialActivationRef(record.activeYaoCapability.admissionRequest.scope.material_activation, input.materialActivation));
595
- if (matches.length === 0) return null;
596
- const signerId = matches[0]?.signerId;
597
- if (!signerId || matches.some((record) => record.signerId !== signerId)) throw new Error("Wallet has conflicting Ed25519 material activations");
598
- return matches[0] ?? null;
600
+ AND json_extract(record_json, '\$.activeYaoCapability.admissionRequest.scope.material_activation.activation_id') = ?
601
+ LIMIT 4`).bind(this.scope.namespace, this.scope.orgId, this.scope.projectId, this.scope.envId, walletId, input.materialActivation.activation_id).all()).results || [], walletId, input.materialActivation);
599
602
  }
600
603
  async getEd25519SignerBySlot(input) {
601
604
  await this.ensureSchema();
@@ -711,6 +714,6 @@ var D1WalletStore = class {
711
714
  }
712
715
  };
713
716
  //#endregion
714
- export { D1WalletStore, WALLET_STORE_D1_SCHEMA_SQL, buildWalletEcdsaSignerRecord, ensureWalletStoreD1Schema, parseWalletEd25519SignerRecord, prepareD1WalletPutSignerStatement, prepareD1WalletPutSubjectStatement };
717
+ export { D1WalletStore, ED25519_SIGNER_ACTIVATION_ID_PATH, WALLET_STORE_D1_SCHEMA_SQL, buildWalletEcdsaSignerRecord, ensureWalletStoreD1Schema, parseWalletEd25519SignerRecord, prepareD1WalletPutSignerStatement, prepareD1WalletPutSubjectStatement, selectWalletEd25519Signer };
715
718
 
716
719
  //# sourceMappingURL=d1WalletStore.js.map
@@ -1,9 +1,9 @@
1
1
  import { parseLinkDeviceSessionId, parseLinkedDeviceEnrollmentId, parseLinkedDeviceId, parseVerifiedEmailAddress, parseWalletAuthMethodId, parseWalletId, parseWebAuthnCredentialIdB64u } from "../../shared-ts/src/utils/domainIds.js";
2
+ import { requireRecord } from "../../shared-ts/src/utils/validation.js";
3
+ import { rejectUnknownFields } from "../../shared-ts/src/utils/exactRecord.js";
2
4
  import { base64UrlEncode } from "../../shared-ts/src/utils/base64.js";
3
5
  import { sha256BytesUtf8 } from "../../shared-ts/src/utils/digests.js";
4
6
  import { parseDigestB64u, sha256Utf8DigestB64u } from "../../shared-ts/src/utils/canonicalPrimitives.js";
5
- import { requireRecord } from "../../shared-ts/src/utils/validation.js";
6
- import { rejectUnknownFields } from "../../shared-ts/src/utils/exactRecord.js";
7
7
  import { parseUnixMs, requireParsed } from "../../shared-ts/src/passkey-custody/primitives.js";
8
8
  //#region src/core/deviceLinking/linkedDeviceEmailOtpGrant.ts
9
9
  /**
@@ -1,6 +1,6 @@
1
1
  import { parseLinkedDeviceId, parseVerifiedEmailAddress, parseWalletAuthorityId } from "../../shared-ts/src/utils/domainIds.js";
2
- import { base64UrlDecode, base64UrlEncode } from "../../shared-ts/src/utils/base64.js";
3
2
  import { buildDelegatedWalletAuthorityV1, buildFullOwnerPermissionsV1, hasDelegatedWalletPermissionV1, sameDelegatedWalletAuthorityV1 } from "../../shared-ts/src/authorization/delegatedAuthority.js";
3
+ import { base64UrlDecode, base64UrlEncode } from "../../shared-ts/src/utils/base64.js";
4
4
  //#region src/core/deviceLinking/linkedDeviceManagement.ts
5
5
  const MAX_LINKED_DEVICE_LIST_LIMIT_V1 = 50;
6
6
  var LinkedDeviceListCursorError = class extends Error {
@@ -1,9 +1,9 @@
1
1
  import { hasWhitespaceOrControlCharacters, parseLinkDeviceSessionId, parseVerifiedEmailAddress, parseWalletAuthMethodId, parseWalletAuthorityId } 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
- import { assertNeverLinkSessionStateV1 } from "../../shared-ts/src/device-linking/contracts.js";
5
3
  import { requireRecordCopy } from "../../shared-ts/src/utils/validation.js";
6
4
  import { sameDelegatedWalletAuthorityV1 } from "../../shared-ts/src/authorization/delegatedAuthority.js";
5
+ import { parseDigestB64u } from "../../shared-ts/src/utils/canonicalPrimitives.js";
6
+ import { assertNeverLinkSessionStateV1 } from "../../shared-ts/src/device-linking/contracts.js";
7
7
  import { parseExactAdministeredSignerManifestV1 } from "../../shared-ts/src/device-linking/delegatedActivationPlan.js";
8
8
  import { parseLinkedDeviceOrdinaryMaterialSourceContributionPreparationTupleV1 } from "../../shared-ts/src/device-linking/sourceContribution.js";
9
9
  import { parseLinkSessionStateV1, parseLinkedDeviceApprovalV1, parseLinkedDeviceSessionClaimV1, parseQrLinkedDeviceSessionPayloadV5 } from "../../shared-ts/src/device-linking/parsers.js";
@@ -39,6 +39,7 @@ function challengeValues(record) {
39
39
  /** Statements on `email_otp_challenges`. */
40
40
  const emailOtpChallengeRows = {
41
41
  insert: (prepare, record) => prepare(INSERT_CHALLENGE_SQL, challengeValues(record)),
42
+ insertIfAbsent: (prepare, record) => prepare(`${INSERT_CHALLENGE_SQL} ON CONFLICT(namespace, org_id, project_id, env_id, challenge_id) DO NOTHING`, challengeValues(record)),
42
43
  delete: (prepare, challengeId) => prepare(`DELETE FROM email_otp_challenges
43
44
  WHERE namespace = ?
44
45
  AND org_id = ?
@@ -1,8 +1,8 @@
1
+ import { coerceNonEmptyString, requireRecordOrArray } from "../shared-ts/src/utils/validation.js";
1
2
  import { base64UrlDecode, base64UrlEncode } from "../shared-ts/src/utils/base64.js";
2
3
  import { sha256Bytes } from "../shared-ts/src/utils/digests.js";
3
4
  import { base58Encode } from "../shared-ts/src/utils/base58.js";
4
5
  import "../shared-ts/src/utils/encoders.js";
5
- import { coerceNonEmptyString, requireRecordOrArray } from "../shared-ts/src/utils/validation.js";
6
6
  import { failure } from "../shared-ts/src/utils/failure.js";
7
7
  import { ActionType, validateActionArgsWasm } from "../shared-ts/src/near/actions.js";
8
8
  import { deriveImplicitNearAccountIdFromEd25519PublicKey, parseImplicitNearAccountId, parseNamedNearAccountId } from "../shared-ts/src/utils/near.js";
@@ -40,6 +40,8 @@ var RouterAbEcdsaPresignRuntime = class {
40
40
  return await startRouterAbLinkedDeviceEcdsaPresignSession({
41
41
  signingWorkerBaseUrl: transport.signingWorkerBaseUrl,
42
42
  request: input.request,
43
+ walletScope: input.walletScope,
44
+ ownershipGeneration: input.ownershipGeneration,
43
45
  materialSource: input.materialSource,
44
46
  presignSessionId: input.presignSessionId,
45
47
  expiresAtMs: input.expiresAtMs,
@@ -52,6 +54,8 @@ var RouterAbEcdsaPresignRuntime = class {
52
54
  return await stepRouterAbLinkedDeviceEcdsaPresignSession({
53
55
  signingWorkerBaseUrl: transport.signingWorkerBaseUrl,
54
56
  request: input.request,
57
+ walletScope: input.walletScope,
58
+ ownershipGeneration: input.ownershipGeneration,
55
59
  materialSource: input.materialSource,
56
60
  presignSessionId: input.presignSessionId,
57
61
  requestedStage: input.requestedStage,
@@ -2,8 +2,8 @@ import { mpcMaterialActivationRefsEqual, parseEmailOtpProviderUserId, parseLaneS
2
2
  import { base64UrlEncode } from "../../shared-ts/src/utils/base64.js";
3
3
  import { alphabetizeStringify } from "../../shared-ts/src/utils/digests.js";
4
4
  import { parseDigestB64u, sha256Utf8DigestB64u } from "../../shared-ts/src/utils/canonicalPrimitives.js";
5
- import { base58Encode } from "../../shared-ts/src/utils/base58.js";
6
5
  import { parseEd25519PublicKeyB64u, parseKeyCreationSignerSlot, parseSecp256k1CompressedPublicKeyB64u } from "../../shared-ts/src/passkey-custody/primitives.js";
6
+ import { base58Encode } from "../../shared-ts/src/utils/base58.js";
7
7
  import { routerAbMpcMaterialActivationRefFromWire, sameRouterAbMpcMaterialActivationRef } from "../../shared-ts/src/utils/routerAbNormalSigningIdentity.js";
8
8
  import { deriveEvmFamilySigningKeySlotId } from "../../shared-ts/src/signing-lanes/evmFamilySigningKeySlotId.js";
9
9
  import { walletAuthAuthorityRef } from "../../shared-ts/src/utils/walletAuthAuthority.js";
@@ -85,6 +85,7 @@ var OrdinaryInactiveSignerMaterialReservationServiceV1 = class {
85
85
  }
86
86
  };
87
87
  function validateOrdinaryInactiveSignerMaterialReservationRequestV1(request) {
88
+ if (!Number.isSafeInteger(request.ownershipGeneration) || request.ownershipGeneration < 1) throw new Error("ordinary signer material ownership generation is invalid");
88
89
  switch (request.kind) {
89
90
  case "ordinary_ed25519_signer_material_reservation_request_v1": {
90
91
  if (request.preparation.kind !== "ordinary_ed25519_signer_material_reservation_preparation_v1") throw new Error("ordinary Ed25519 reservation preparation kind is invalid");
@@ -1,10 +1,13 @@
1
1
  import { parseWalletId } from "./shared-ts/src/utils/domainIds.js";
2
+ import { parseTenantId } from "./shared-ts/src/authorization/capabilityKinds.js";
2
3
  import { base64UrlEncode } from "./shared-ts/src/utils/base64.js";
3
4
  import { parseRouterAbPublicKeysetV2 } from "./shared-ts/src/utils/routerAbPublicKeyset.js";
4
5
  import { ROUTER_AB_ED25519_YAO_EXPORT_ADMISSION_PATH_V1, ROUTER_AB_ED25519_YAO_EXPORT_EXECUTE_PATH_V1, ROUTER_AB_ED25519_YAO_RECOVERY_ACTIVATE_PATH_V1, ROUTER_AB_ED25519_YAO_RECOVERY_ADMISSION_PATH_V1, ROUTER_AB_ED25519_YAO_RECOVERY_EXECUTE_PATH_V1, ROUTER_AB_ED25519_YAO_RECOVERY_STATUS_PATH_V1, ROUTER_AB_ED25519_YAO_REGISTRATION_ADMISSION_PATH_V1, ROUTER_AB_ED25519_YAO_REGISTRATION_EXECUTE_PATH_V1, ROUTER_AB_ED25519_YAO_WARM_RECOVERY_BOOTSTRAP_PATH_V1 } from "./shared-ts/src/utils/routerAbEd25519Yao.js";
6
+ import { parseSessionOrigin } from "./authorization/domain.js";
5
7
  import { parseD1JsonColumn } from "./storage/d1Sql.js";
6
8
  import { D1WalletStore } from "./core/d1WalletStore.js";
7
9
  import { D1WalletAuthMethodStore } from "./core/d1WalletAuthMethodStore.js";
10
+ import { WALLET_OBJECT_ADDRESSES_HEADER, WALLET_OBJECT_IDENTITY_HEADER, walletObjectIdentity, walletObjectIdentityHeaders } from "./router/cloudflare/runtime/walletObjectAddresses.js";
8
11
  import { RouterAbEcdsaPresignRuntime } from "./core/routerAbSigning/RouterAbEcdsaPresignRuntime.js";
9
12
  import { buildTenantRootIdentityFromAuthenticatedDeploymentV1, decodeTenantRootIdentityWireV1 } from "./shared-ts/src/tenant-root/tenantRootIdentity.js";
10
13
  import "./shared-ts/src/tenant-root/index.js";
@@ -14,8 +17,10 @@ import { createCloudflareWalletGatewayRouterV1 } from "./router/cloudflare/runti
14
17
  import { createWalletRuntimeOpsHandler } from "./router/cloudflare/runtime/walletRuntimeOpsHandler.js";
15
18
  import { handleWalletControlRequest } from "./router/cloudflare/runtime/walletControlOps.js";
16
19
  import { resolveRuntimeTenantRootLineage } from "./router/cloudflare/runtime/walletConsoleTenantRootLineage.js";
20
+ import { D1WalletObjectAddresses } from "./router/cloudflare/d1/walletObjectAddresses.js";
17
21
  import { ROUTER_AB_MPC_ROUTER_ORIGIN, ROUTER_AB_SIGNING_WORKER_ORIGIN, createRouterAbServiceBindingFetch } from "./router/cloudflare/runtime/routerAbServiceBindings.js";
18
22
  import { readEnvironmentCsv, readEnvironmentString, requireEnvironmentString } from "./router/cloudflare/runtime/environment.js";
23
+ import { admitD1EstablishedWalletHome } from "./router/cloudflare/d1/registration/d1WalletExecutionAuthority.js";
19
24
  import { createD1LinkedDeviceSourceContributionPreparationPlannerV1 } from "./router/cloudflare/d1/deviceLinking/d1LinkedDeviceSourceContributionPreparationPlanner.js";
20
25
  import { readD1LinkedDeviceEcdsaSourceV1, readD1LinkedDeviceEd25519SourceV1 } from "./router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.js";
21
26
  import { RouterAbEd25519YaoExportOwnerProofAuthorizationAdapter } from "./router/domains/ed25519Yao/export/routerAbEd25519YaoExport.js";
@@ -32,10 +37,12 @@ import { createD1LinkedDeviceOwnerSourceChildReaderV1 } from "./router/cloudflar
32
37
  import { createCloudflareD1RouterApiAuthService } from "./router/cloudflare/d1/auth/d1RouterApiAuthService.js";
33
38
  import { loadCloudflareSignerWasmModule } from "./router/cloudflare/runtime/cloudflareSignerWasm.js";
34
39
  import { createEd25519SessionAdapter } from "./router/cloudflare/runtime/ed25519SessionAdapter.js";
40
+ import { WalletPlacementRoutes } from "./router/cloudflare/runtime/walletPlacementRoutes.js";
35
41
  import { handleRouterAbEd25519YaoExportRequestScopedCloudflareV1 } from "./router/domains/ed25519Yao/export/routerAbEd25519YaoExportRequestScopedCloudflare.js";
36
42
  import { handleRouterAbEd25519YaoRecoveryRequestScopedCloudflareV1 } from "./router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryRequestScopedCloudflare.js";
37
43
  import { RouterAbEd25519YaoRecoveryWalletSessionAuthorizationAdapter } from "./router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryWalletSessionAuthorization.js";
38
44
  import "./cloud-host.js";
45
+ import { WalletAuthorizationRelocationRoutes } from "./router/cloudflare/runtime/walletAuthorizationRelocationRoutes.js";
39
46
  //#region src/hosted-wallet-gateway.ts
40
47
  function readStagingHostedWalletOrigins(env) {
41
48
  return readEnvironmentCsv(requireEnvironmentString(env, "HOSTED_WALLET_ORIGINS"));
@@ -43,6 +50,17 @@ function readStagingHostedWalletOrigins(env) {
43
50
  const RELAY_SIGNER_READY_TABLES = Object.freeze([
44
51
  "wallets",
45
52
  "wallet_auth_methods",
53
+ "wallet_relocation_challenges",
54
+ "wallet_relocation_approvals",
55
+ "wallet_relocation_session_fences",
56
+ "wallet_relocation_authorization_fences",
57
+ "wallet_relocation_authorization_snapshots",
58
+ "wallet_relocation_authorization_chunks",
59
+ "wallet_relocation_authorization_intakes",
60
+ "wallet_relocation_authorization_intake_chunks",
61
+ "wallet_relocation_authorization_imports",
62
+ "wallet_relocation_authorization_import_context",
63
+ "wallet_relocation_authorization_import_receipts",
46
64
  "authorization_wallet_session_quotas",
47
65
  "wallet_session_authorizations_v2",
48
66
  "wallet_session_hosted_credentials_v2",
@@ -134,14 +152,14 @@ async function resolveStagingDeploymentTenantRoot(scope, tenantRootCustodyLineag
134
152
  }
135
153
  async function resolveStagingRegistrationTenantRoot(context, input) {
136
154
  switch (input.operation) {
137
- case "registration": return await resolveStagingDeploymentTenantRoot(context.scope, context.tenantRootCustodyLineage, input.admissionRequest.application_binding, input.admissionRequest.scope.root_share_epoch);
155
+ case "registration": return await resolveStagingDeploymentTenantRoot(context.scope, context.tenantRootCustodyLineage, input, input.root_share_epoch);
138
156
  case "recovery":
139
157
  case "export": throw new Error("Ed25519 active-material tenant-root resolver is unavailable");
140
158
  }
141
159
  }
142
160
  async function resolveStagingTenantRoot(context, input) {
143
161
  switch (input.operation) {
144
- case "registration": return await resolveStagingDeploymentTenantRoot(context.scope, context.tenantRootCustodyLineage, input.admissionRequest.application_binding, input.admissionRequest.scope.root_share_epoch);
162
+ case "registration": return await resolveStagingDeploymentTenantRoot(context.scope, context.tenantRootCustodyLineage, input, input.root_share_epoch);
145
163
  case "recovery": return await context.resolveActiveTenantRoot({
146
164
  walletId: input.admissionRequest.application_binding.wallet_id,
147
165
  materialActivation: input.admissionRequest.active_material_activation
@@ -174,7 +192,7 @@ function createStagingLinkedDeviceTenantRootResolver(scope, tenantRootCustodyLin
174
192
  tenantRootCustodyLineage
175
193
  });
176
194
  }
177
- async function createStagingRouterApiAuthComposition(env, scope, yaoRuntime, tenantRootCustodyLineage, dependencies) {
195
+ async function createStagingRouterApiAuthComposition(env, scope, yaoRuntime, tenantRootCustodyLineage, dependencies, startRegistrationWallets) {
178
196
  const ecdsaCeremonyTokenIssuer = createStagingEcdsaCeremonyTokenIssuer(env);
179
197
  const topology = requireStagingEcdsaRegistrationTopology(env);
180
198
  const tokenScope = {
@@ -183,12 +201,14 @@ async function createStagingRouterApiAuthComposition(env, scope, yaoRuntime, ten
183
201
  environment: scope.envId
184
202
  };
185
203
  const ecdsaStrictRegistration = createRouterAbEcdsaStrictRegistrationPort({
204
+ internalServiceAuthSecret: requireEnvironmentString(env, "ROUTER_AB_GATEWAY_TO_ROUTER_AUTH_SECRET"),
186
205
  router: env.MPC_ROUTER,
187
206
  tokenIssuer: ecdsaCeremonyTokenIssuer,
188
207
  tokenScope,
189
208
  topology
190
209
  });
191
210
  const ecdsaStrictPostRegistration = createRouterAbEcdsaStrictPostRegistrationPort({
211
+ internalServiceAuthSecret: requireEnvironmentString(env, "ROUTER_AB_GATEWAY_TO_ROUTER_AUTH_SECRET"),
192
212
  router: env.MPC_ROUTER,
193
213
  tokenIssuer: ecdsaCeremonyTokenIssuer,
194
214
  tokenScope,
@@ -198,12 +218,12 @@ async function createStagingRouterApiAuthComposition(env, scope, yaoRuntime, ten
198
218
  service: createCloudflareD1RouterApiAuthService({
199
219
  database: env.SIGNER_DB,
200
220
  identityStore: dependencies.identityStore,
201
- emailOtpRateLimitCounter: dependencies.emailOtpRateLimitCounter,
202
221
  googleRegistrationAttempts: dependencies.googleRegistrationAttempts,
203
222
  sessionRouting: dependencies.sessionRouting,
204
223
  recoveryRouting: dependencies.recoveryRouting,
205
224
  lifecycleRouting: dependencies.lifecycleRouting,
206
225
  registrationAuthority: dependencies.registrationAuthority,
226
+ startRegistrationWallets,
207
227
  credentialClaims: dependencies.credentialClaims,
208
228
  syncChallenges: dependencies.syncChallenges,
209
229
  linkedDeviceProofNonces: dependencies.linkedDeviceProofNonces,
@@ -263,7 +283,9 @@ async function resolveStagingActiveTenantRootFromLoader(context, input) {
263
283
  }
264
284
  async function resolveStagingRecoveryAuthorizationServices(context) {
265
285
  const { service } = await loadStagingRouterApiAuthComposition(context);
286
+ const authority = service.walletExecution;
266
287
  return {
288
+ admitEstablishedHome: authority.admitEstablishedHome.bind(authority),
267
289
  authorizationSessions: service.authorizationSessions,
268
290
  preparedRecoveryAdmission: service.passkeyCustody,
269
291
  resolveEd25519MaterialActivation: service.walletRegistration.resolveEd25519MaterialActivation.bind(service.walletRegistration)
@@ -331,12 +353,14 @@ function stagingLinkedDeviceSessionComposition(env, scope, tenantRootCustodyLine
331
353
  tenant: scope
332
354
  }),
333
355
  deactivationEndpoint: createCloudflareOrdinaryInactiveSignerMaterialDeactivationEndpointV1({
356
+ admitEstablishedHome: admitD1EstablishedWalletHome.bind(void 0, env.SIGNER_DB, scope),
334
357
  fetch: serviceFetch,
335
358
  internalServiceAuthSecret,
336
359
  tenant: scope
337
360
  })
338
361
  },
339
362
  sourceContributionRouter: createCloudflareLinkedDeviceEd25519SourcePreservingRouterEndpointV1({
363
+ admitEstablishedHome: admitD1EstablishedWalletHome.bind(void 0, env.SIGNER_DB, scope),
340
364
  fetch: serviceFetch,
341
365
  internalServiceAuthSecret: requireEnvironmentString(env, "ROUTER_AB_GATEWAY_TO_ROUTER_AUTH_SECRET"),
342
366
  resolveTenantRoot: createStagingLinkedDeviceTenantRootResolver(scope, tenantRootCustodyLineage)
@@ -350,18 +374,34 @@ function stagingLinkedDeviceSessionComposition(env, scope, tenantRootCustodyLine
350
374
  * stay on the Wallet Console deployment until policy/sponsorship resolution
351
375
  * operations join the binding.
352
376
  */
353
- async function createHostedWalletGatewayCompositionV1(env, dependencies = {}) {
377
+ async function createHostedWalletGatewayCompositionV1(env, dependencies = {}, background = null) {
354
378
  const scope = stagingTenantScope(env);
355
379
  const session = stagingSessionAdapter(env);
356
380
  const tenantRootCustodyLineage = createStagingTenantRootCustodyLineage(createWalletConsoleOpsClient(env.WALLET_CONSOLE));
357
381
  const yaoRuntime = createStagingYaoRequestScopedRuntime(env, createStagingRegistrationTenantRootResolver(scope, tenantRootCustodyLineage));
358
- const { service, ecdsaStrictPostRegistration } = await createStagingRouterApiAuthComposition(env, scope, yaoRuntime, tenantRootCustodyLineage, dependencies);
382
+ const { service, ecdsaStrictPostRegistration } = await createStagingRouterApiAuthComposition(env, scope, yaoRuntime, tenantRootCustodyLineage, dependencies, background ? scheduleRegistrationRouterStartup.bind(void 0, env, background) : void 0);
383
+ const tenantId = parseTenantId(scope.orgId);
384
+ if (!tenantId.ok) throw new Error("Wallet placement authorization tenant is invalid");
359
385
  return {
360
386
  handler: createCloudflareWalletGatewayRouterV1({
361
387
  service,
362
388
  walletConsole: env.WALLET_CONSOLE,
389
+ registrationContext: dependencies.registrationContext,
363
390
  signerDatabase: env.SIGNER_DB,
364
391
  signerStorageNamespace: scope.namespace,
392
+ routeExtensions: [new WalletAuthorizationRelocationRoutes({
393
+ database: env.SIGNER_DB,
394
+ scope,
395
+ directory: env.WALLET_CONSOLE
396
+ }), new WalletPlacementRoutes({
397
+ emailOtp: service.relocationEmailOtp,
398
+ database: env.SIGNER_DB,
399
+ scope,
400
+ tenantId: tenantId.value,
401
+ allowedOrigins: readStagingHostedWalletOrigins(env).map(parseSessionOrigin),
402
+ authorizationSessions: service.authorizationSessions,
403
+ directory: env.WALLET_CONSOLE
404
+ })],
365
405
  router: {
366
406
  healthz: true,
367
407
  readyz: true,
@@ -390,8 +430,8 @@ async function createHostedWalletGatewayCompositionV1(env, dependencies = {}) {
390
430
  session
391
431
  };
392
432
  }
393
- async function createSplitGatewayRouterHandler(env, dependencies = {}) {
394
- return (await createHostedWalletGatewayCompositionV1(env, dependencies)).handler;
433
+ async function createSplitGatewayRouterHandler(env, dependencies = {}, background = null) {
434
+ return (await createHostedWalletGatewayCompositionV1(env, dependencies, background)).handler;
395
435
  }
396
436
  async function handleSplitGatewayWalletRuntimeRequest(request, env, dependencies = {}) {
397
437
  const controlResponse = await handleWalletControlRequest(request, env);
@@ -463,6 +503,10 @@ async function readWalletRuntimeIdentities(env, input) {
463
503
  return { identities: result };
464
504
  }
465
505
  async function handleSplitGatewayRequest(request, env, ctx, dependencies = {}) {
506
+ const headers = new Headers(request.headers);
507
+ headers.delete(WALLET_OBJECT_IDENTITY_HEADER);
508
+ headers.delete(WALLET_OBJECT_ADDRESSES_HEADER);
509
+ request = new Request(request, { headers });
466
510
  if (request.method === "GET" && new URL(request.url).pathname === ROUTER_AB_CEREMONY_JWKS_PATH) return routerAbCeremonyJwksResponse(env);
467
511
  const operation = yaoDirectOperationForRequest(request);
468
512
  if (operation !== null) {
@@ -470,7 +514,7 @@ async function handleSplitGatewayRequest(request, env, ctx, dependencies = {}) {
470
514
  withCors(response.headers, { corsOrigins: readEnvironmentCsv(env.RELAY_CORS_ORIGINS) }, request);
471
515
  return response;
472
516
  }
473
- return await (await createSplitGatewayRouterHandler(env, dependencies))(request, env, ctx);
517
+ return await (await createSplitGatewayRouterHandler(env, dependencies, ctx))(request, env, ctx);
474
518
  }
475
519
  function requireStagingRouterAbPublicKeyset(env) {
476
520
  const parsed = parseJsonValue(requireEnvironmentString(env, "ROUTER_AB_PUBLIC_KEYSET_JSON"));
@@ -673,6 +717,44 @@ function createStagingYaoRequestScopedRuntime(env, resolveTenantRoot) {
673
717
  loadPersistedActiveCapability: loadStagingPersistedActiveCapability.bind(void 0, env)
674
718
  });
675
719
  }
720
+ async function scheduleRegistrationRouterStartup(env, background, registration) {
721
+ const tenant = stagingTenantScope(env);
722
+ const identity = walletObjectIdentity(registration.walletId, registration.ownershipGeneration, tenant);
723
+ await new D1WalletObjectAddresses(env.SIGNER_DB, tenant).initialize(identity, env.MPC_ROUTER, requireEnvironmentString(env, "ROUTER_AB_GATEWAY_TO_ROUTER_AUTH_SECRET"));
724
+ background.waitUntil(startRegistrationRouter(env, identity));
725
+ }
726
+ async function startRegistrationRouter(env, registration) {
727
+ const started = Date.now();
728
+ let outcome = "failure";
729
+ try {
730
+ const scope = stagingTenantScope(env);
731
+ const response = await env.MPC_ROUTER.fetch(`${ROUTER_AB_MPC_ROUTER_ORIGIN}/router-ab/router/wallet/start`, {
732
+ method: "POST",
733
+ headers: {
734
+ "content-type": "application/json",
735
+ ...walletObjectIdentityHeaders(registration),
736
+ "x-router-ab-internal-service-auth": requireEnvironmentString(env, "ROUTER_AB_GATEWAY_TO_ROUTER_AUTH_SECRET")
737
+ },
738
+ body: JSON.stringify({
739
+ owner: {
740
+ org_id: scope.orgId,
741
+ project_id: scope.projectId,
742
+ env_id: scope.envId,
743
+ wallet_id: registration.walletId
744
+ },
745
+ ownership_generation: registration.ownershipGeneration
746
+ }),
747
+ signal: AbortSignal.timeout(3e3)
748
+ });
749
+ await response.arrayBuffer();
750
+ if (response.ok) outcome = "success";
751
+ } catch {}
752
+ console.log(JSON.stringify({
753
+ event: "registration_router_startup",
754
+ outcome,
755
+ duration_ms: Date.now() - started
756
+ }));
757
+ }
676
758
  /**
677
759
  * Builds the recovery request-scoped dependencies from the environment alone.
678
760
  * This is new composition wiring over the existing authorization classes, not a
@@ -711,13 +793,14 @@ function createStagingRecoveryRequestScopedDependencies(env, tenantRootCustodyLi
711
793
  * Router API factor and owner-proof services.
712
794
  */
713
795
  function createStagingExportRequestScopedDependencies(env, service, tenantRootCustodyLineage) {
796
+ const authority = service.walletExecution;
714
797
  const scope = stagingTenantScope(env);
715
798
  const registrationTenantRootResolver = createStagingRegistrationTenantRootResolver(scope, tenantRootCustodyLineage);
716
799
  const resolveActiveTenantRoot = resolveStagingActiveTenantRootFromService.bind(void 0, service);
717
800
  return {
718
801
  store: createStagingYaoPartitionedStateStore(env),
719
802
  backend: createStagingEd25519YaoBackend(env, createStagingTenantRootResolver(scope, tenantRootCustodyLineage, resolveActiveTenantRoot)),
720
- authorization: new RouterAbEd25519YaoExportOwnerProofAuthorizationAdapter(service.webAuthn, service.emailOtp, service.walletAuthMethods, service.authorizedOperations, service.walletRegistration.resolveEd25519MaterialActivation.bind(service.walletRegistration)),
803
+ authorization: new RouterAbEd25519YaoExportOwnerProofAuthorizationAdapter(service.webAuthn, service.emailOtp, service.walletAuthMethods, service.authorizedOperations, service.walletRegistration.resolveEd25519MaterialActivation.bind(service.walletRegistration), authority.admitEstablishedHome.bind(authority)),
721
804
  capabilities: createStagingYaoRequestScopedRuntime(env, registrationTenantRootResolver)
722
805
  };
723
806
  }
@@ -1,6 +1,7 @@
1
1
  import { requireCanonicalString } from "./shared-ts/src/utils/validation.js";
2
2
  import "./shared-ts/src/utils/routerAbEd25519Yao.js";
3
3
  import { WALLET_CONSOLE_OP_PATHS_V1 } from "./router/cloudflare/runtime/walletConsoleOps.js";
4
+ import { WalletHomeCustodyBinding } from "./router/cloudflare/runtime/routerAbServiceBindings.js";
4
5
  import { createStaticWalletConsoleBindingV1, parseStaticWalletConsoleBindingConfigV1 } from "./router/cloudflare/runtime/staticWalletConsoleBinding.js";
5
6
  import { handleSplitGatewayRequest } from "./hosted-wallet-gateway.js";
6
7
  import { LocalRegistrationSetupAuthority } from "./localRegistrationSetupAuthority.js";
@@ -11,7 +12,7 @@ import { LOCAL_INTENDED_ECDSA_FINALIZE_FAULT_HEADER_V1, LOCAL_INTENDED_ECDSA_FIN
11
12
  import { LOCAL_INTENDED_YAO_FINALIZE_FAULT_HEADER_V1, LOCAL_INTENDED_YAO_FINALIZE_FAULT_TOKEN_HEADER_V1, LocalIntendedYaoFinalizeFaultDatabaseV1, parseLocalIntendedYaoFinalizeFaultModeV1, parseLocalIntendedYaoFinalizeFaultTokenV1, requestWithoutLocalIntendedYaoFinalizeFaultHeadersV1, responseWithLocalIntendedYaoFinalizeFaultOutcomeV1 } from "./localIntendedYaoFinalizeFault.js";
12
13
  import { LOCAL_INTENDED_YAO_RECOVERY_FAULT_HEADER_V1, LOCAL_INTENDED_YAO_RECOVERY_FAULT_TOKEN_HEADER_V1, LocalIntendedYaoRecoveryFaultControllerV1, parseLocalIntendedYaoRecoveryFaultModeV1, parseLocalIntendedYaoRecoveryFaultTokenV1, releaseLocalIntendedYaoRecoveryExecuteV1, requestWithoutLocalIntendedYaoRecoveryFaultHeadersV1, responseWithLocalIntendedYaoRecoveryFaultOutcomeV1 } from "./localIntendedYaoRecoveryFault.js";
13
14
  import { LOCAL_INTENDED_YAO_EXPORT_FAULT_HEADER_V1, LOCAL_INTENDED_YAO_EXPORT_FAULT_TOKEN_HEADER_V1, LocalIntendedYaoExportFaultDatabaseV1, parseLocalIntendedYaoExportFaultModeV1, parseLocalIntendedYaoExportFaultTokenV1, requestWithoutLocalIntendedYaoExportFaultHeadersV1, responseWithLocalIntendedYaoExportFaultOutcomeV1 } from "./localIntendedYaoExportFault.js";
14
- import { LOCAL_INTENDED_YAO_SIGNING_FAULT_HEADER_V1, LOCAL_INTENDED_YAO_SIGNING_FAULT_TOKEN_HEADER_V1, LocalIntendedYaoSigningFaultControllerV1, commandLocalIntendedSigningWorkerHoldV1, parseLocalIntendedYaoSigningFaultModeV1, parseLocalIntendedYaoSigningFaultTokenV1, releaseLocalIntendedYaoSigningFinalizeV1, requestWithoutLocalIntendedYaoSigningFaultHeadersV1, responseWithLocalIntendedYaoSigningFaultOutcomeV1 } from "./localIntendedYaoSigningFault.js";
15
+ import { LOCAL_INTENDED_YAO_SIGNING_FAULT_HEADER_V1, LOCAL_INTENDED_YAO_SIGNING_FAULT_TOKEN_HEADER_V1, LocalIntendedYaoSigningFaultControllerV1, parseLocalIntendedYaoSigningFaultModeV1, parseLocalIntendedYaoSigningFaultTokenV1, releaseLocalIntendedYaoSigningFinalizeV1, requestWithoutLocalIntendedYaoSigningFaultHeadersV1, responseWithLocalIntendedYaoSigningFaultOutcomeV1 } from "./localIntendedYaoSigningFault.js";
15
16
  import { LOCAL_INTENDED_LINK_EXECUTE_FAULT_HEADER_V1, LOCAL_INTENDED_LINK_EXECUTE_FAULT_TOKEN_HEADER_V1, LocalIntendedLinkExecuteFaultControllerV1, parseLocalIntendedLinkExecuteFaultModeV1, parseLocalIntendedLinkExecuteFaultTokenV1, requestWithoutLocalIntendedLinkExecuteFaultHeadersV1, responseWithLocalIntendedLinkExecuteFaultOutcomeV1 } from "./localIntendedLinkExecuteFault.js";
16
17
  import { LINKED_DEVICE_REVOKE_PATH_PATTERN_V1, LOCAL_INTENDED_REVOKE_FAULT_HEADER_V1, LOCAL_INTENDED_REVOKE_FAULT_TOKEN_HEADER_V1, LocalIntendedRevokeFaultDatabaseV1, WALLET_REVOKE_AUTH_METHOD_PATH_PATTERN_V1, parseLocalIntendedRevokeFaultModeV1, parseLocalIntendedRevokeFaultTokenV1, requestWithoutLocalIntendedRevokeFaultHeadersV1, responseWithLocalIntendedRevokeFaultOutcomeV1 } from "./localIntendedRevokeFault.js";
17
18
  import { LOCAL_INTENDED_SESSION_ADMISSION_FAULT_HEADER_V1, LOCAL_INTENDED_SESSION_ADMISSION_FAULT_TOKEN_HEADER_V1, LocalIntendedSessionAdmissionFaultDatabaseV1, parseLocalIntendedSessionAdmissionFaultModeV1, parseLocalIntendedSessionAdmissionFaultTokenV1, requestWithoutLocalIntendedSessionAdmissionFaultHeadersV1, responseWithLocalIntendedSessionAdmissionFaultOutcomeV1 } from "./localIntendedSessionAdmissionFault.js";
@@ -104,18 +105,21 @@ async function handleEcdsaRespondFault(request, env, ctx, dependencies, fault, e
104
105
  */
105
106
  async function handleLocalHostedWalletGatewayRequestV1(request, env, ctx, dependencies) {
106
107
  const config = parseStaticWalletConsoleBindingConfigV1(JSON.parse(env.WALLET_LOCAL_DEPLOYMENT_JSON));
108
+ const tenantScope = {
109
+ namespace: requireCanonicalString(env.SEAMS_TENANT_STORAGE_NAMESPACE, "Local namespace"),
110
+ orgId: config.deployment.orgId,
111
+ projectId: config.deployment.projectId,
112
+ envId: config.deployment.environmentKey
113
+ };
107
114
  dependencies = {
108
115
  emailOtpDeliveryProvider: dependencies?.emailOtpDeliveryProvider,
109
116
  signerWasm: dependencies?.signerWasm,
110
- registrationAuthority: new LocalRegistrationSetupAuthority(env.SIGNER_DB, {
111
- namespace: requireCanonicalString(env.SEAMS_TENANT_STORAGE_NAMESPACE, "Local namespace"),
112
- orgId: config.deployment.orgId,
113
- projectId: config.deployment.projectId,
114
- envId: config.deployment.environmentKey
115
- })
117
+ registrationAuthority: new LocalRegistrationSetupAuthority(env.SIGNER_DB, tenantScope)
116
118
  };
117
119
  const gatewayEnv = {
118
120
  ...env,
121
+ MPC_ROUTER: new WalletHomeCustodyBinding(env.MPC_ROUTER, "US", env.SIGNER_DB, tenantScope.namespace, null),
122
+ SIGNING_WORKER: new WalletHomeCustodyBinding(env.SIGNING_WORKER, "US", env.SIGNER_DB, tenantScope.namespace, null),
119
123
  WALLET_CONSOLE: createStaticWalletConsoleBindingV1(config)
120
124
  };
121
125
  const canceledPresign = await localPresignCancellationProbe(request, gatewayEnv, ctx, dependencies);
@@ -163,7 +167,7 @@ async function handleLocalHostedWalletGatewayRequestV1(request, env, ctx, depend
163
167
  const token = parseLocalIntendedYaoFaultTokenV1(rawToken);
164
168
  const url = new URL(request.url);
165
169
  if (url.protocol !== "http:" || url.hostname !== "127.0.0.1" || url.pathname !== "/router-ab/ed25519/yao/registration/execute" || request.method !== "POST" || !mode || !token) return Response.json({ code: "invalid_intended_yao_fault" }, { status: 400 });
166
- const controller = new LocalIntendedYaoFaultControllerV1(env.MPC_ROUTER.fetch.bind(env.MPC_ROUTER));
170
+ const controller = new LocalIntendedYaoFaultControllerV1(gatewayEnv.MPC_ROUTER.fetch.bind(gatewayEnv.MPC_ROUTER));
167
171
  controller.arm(mode);
168
172
  return responseWithLocalIntendedYaoFaultOutcomeV1(await handleSplitGatewayRequest(sanitizedRequest, {
169
173
  ...gatewayEnv,
@@ -262,7 +266,6 @@ async function handleYaoSigningFault(request, env, ctx, dependencies, rawMode, r
262
266
  const url = new URL(request.url);
263
267
  if (url.protocol !== "http:" || url.hostname !== "127.0.0.1" || url.pathname !== "/router-ab/ed25519/sign" || request.method !== "POST" || !mode || !token) return Response.json({ code: "invalid_intended_yao_signing_fault" }, { status: 400 });
264
268
  if (mode === "release_signing_finalize") return await releaseLocalIntendedYaoSigningFinalizeV1(env.MPC_ROUTER, token);
265
- if (mode === "arm_signing_worker_hold" || mode === "read_signing_worker_hold") return await commandLocalIntendedSigningWorkerHoldV1(env.SIGNING_WORKER, env.ROUTER_AB_GATEWAY_TO_SIGNING_WORKER_PRESIGN_AUTH_SECRET, mode, await request.json().catch(() => null));
266
269
  const controller = new LocalIntendedYaoSigningFaultControllerV1(env.MPC_ROUTER.fetch.bind(env.MPC_ROUTER), mode, token);
267
270
  return responseWithLocalIntendedYaoSigningFaultOutcomeV1(await handleSplitGatewayRequest(requestWithoutLocalIntendedYaoSigningFaultHeadersV1(request), {
268
271
  ...env,
@@ -4,16 +4,12 @@ const LOCAL_INTENDED_YAO_SIGNING_FAULT_HEADER_V1 = "x-seams-intended-yao-signing
4
4
  const LOCAL_INTENDED_YAO_SIGNING_FAULT_TOKEN_HEADER_V1 = "x-seams-intended-yao-signing-fault-token-v1";
5
5
  const LOCAL_INTENDED_YAO_FAULT_PROOF_HEADER_V1 = "x-seams-intended-yao-fault-proof-v1";
6
6
  const ROUTER_AB_ED25519_SIGNING_FINALIZE_PATH_V1 = "/router-ab/ed25519/sign";
7
- const SIGNING_WORKER_LOCAL_INTENDED_HOLD_URL_V1 = "https://signing-worker.router-ab.internal/router-ab/signing-worker/local-intended/hold";
8
- const ROUTER_AB_INTERNAL_SERVICE_AUTH_HEADER_V1 = "x-router-ab-internal-service-auth";
9
7
  const keptFinalizes = /* @__PURE__ */ new Map();
10
8
  function parseLocalIntendedYaoSigningFaultModeV1(value) {
11
9
  switch (value) {
12
10
  case "capture_signing_finalize":
13
11
  case "withhold_signing_finalize":
14
- case "release_signing_finalize":
15
- case "arm_signing_worker_hold":
16
- case "read_signing_worker_hold": return value;
12
+ case "release_signing_finalize": return value;
17
13
  default: return null;
18
14
  }
19
15
  }
@@ -82,30 +78,6 @@ async function releaseLocalIntendedYaoSigningFinalizeV1(router, token) {
82
78
  original: kept.original
83
79
  });
84
80
  }
85
- /**
86
- * Arms or reads the SigningWorker's hold on one wallet's next NEAR finalize,
87
- * with the Gateway's own SigningWorker credential, and answers with the
88
- * SigningWorker's reply.
89
- */
90
- async function commandLocalIntendedSigningWorkerHoldV1(signingWorker, credential, mode, body) {
91
- const walletId = body?.wallet_id;
92
- if (!credential || typeof walletId !== "string" || walletId === "") return Response.json({ code: "invalid_intended_signing_worker_hold" }, { status: 400 });
93
- const reply = await signingWorker.fetch(new Request(SIGNING_WORKER_LOCAL_INTENDED_HOLD_URL_V1, {
94
- method: "POST",
95
- headers: {
96
- "content-type": "application/json",
97
- [ROUTER_AB_INTERNAL_SERVICE_AUTH_HEADER_V1]: credential
98
- },
99
- body: JSON.stringify({
100
- command: mode === "arm_signing_worker_hold" ? "arm" : "read",
101
- wallet_id: walletId
102
- })
103
- }));
104
- return Response.json({
105
- status: reply.status,
106
- body: await reply.text()
107
- });
108
- }
109
81
  function requestWithoutLocalIntendedYaoSigningFaultHeadersV1(request) {
110
82
  const headers = new Headers(request.headers);
111
83
  headers.delete(LOCAL_INTENDED_YAO_SIGNING_FAULT_HEADER_V1);
@@ -122,6 +94,6 @@ function responseWithLocalIntendedYaoSigningFaultOutcomeV1(response, outcome) {
122
94
  });
123
95
  }
124
96
  //#endregion
125
- export { LOCAL_INTENDED_YAO_SIGNING_FAULT_HEADER_V1, LOCAL_INTENDED_YAO_SIGNING_FAULT_TOKEN_HEADER_V1, LocalIntendedYaoSigningFaultControllerV1, ROUTER_AB_ED25519_SIGNING_FINALIZE_PATH_V1, commandLocalIntendedSigningWorkerHoldV1, parseLocalIntendedYaoSigningFaultModeV1, parseLocalIntendedYaoSigningFaultTokenV1, releaseLocalIntendedYaoSigningFinalizeV1, requestWithoutLocalIntendedYaoSigningFaultHeadersV1, responseWithLocalIntendedYaoSigningFaultOutcomeV1 };
97
+ export { LOCAL_INTENDED_YAO_SIGNING_FAULT_HEADER_V1, LOCAL_INTENDED_YAO_SIGNING_FAULT_TOKEN_HEADER_V1, LocalIntendedYaoSigningFaultControllerV1, ROUTER_AB_ED25519_SIGNING_FINALIZE_PATH_V1, parseLocalIntendedYaoSigningFaultModeV1, parseLocalIntendedYaoSigningFaultTokenV1, releaseLocalIntendedYaoSigningFinalizeV1, requestWithoutLocalIntendedYaoSigningFaultHeadersV1, responseWithLocalIntendedYaoSigningFaultOutcomeV1 };
126
98
 
127
99
  //# sourceMappingURL=localIntendedYaoSigningFault.js.map
@@ -1,6 +1,8 @@
1
1
  import { D1RegistrationCeremonyRecordStore } from "./router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.js";
2
2
  import { parseWalletRegistrationSetupReservation, proposeWalletRegistrationSetup, walletRegistrationSetupRequestDigest } from "./router/domains/walletRegistration/walletRegistrationReservation.js";
3
3
  //#region src/localRegistrationSetupAuthority.ts
4
+ /** The standalone host never relocates a wallet, so every wallet keeps its first generation. */
5
+ const LOCAL_OWNERSHIP_GENERATION = 1;
4
6
  var LocalRegistrationSetupAuthority = class {
5
7
  constructor(database, scope) {
6
8
  this.scope = scope;
@@ -48,6 +50,7 @@ var LocalRegistrationSetupAuthority = class {
48
50
  return {
49
51
  ok: true,
50
52
  reservation,
53
+ ownershipGeneration: LOCAL_OWNERSHIP_GENERATION,
51
54
  lifecycle: terminal?.value.outcome === "established" ? "established" : "reserved"
52
55
  };
53
56
  }
@@ -59,7 +62,11 @@ var LocalRegistrationSetupAuthority = class {
59
62
  code: "wallet_home_unavailable",
60
63
  message: "Registration home is unavailable"
61
64
  };
62
- return { ok: true };
65
+ return {
66
+ ok: true,
67
+ ownershipGeneration: LOCAL_OWNERSHIP_GENERATION,
68
+ purpose: terminal?.value.outcome === "established" ? "ordinary" : "registration"
69
+ };
63
70
  }
64
71
  async complete(input) {
65
72
  const identity = await this.storage.get("setup-ceremony-index", input.ceremonyId);
@@ -109,12 +109,23 @@ async function validateRouterAbEd25519WalletSessionInputs(input) {
109
109
  const token = extractBearerCredential(input.headers);
110
110
  if (!token) return walletSessionFailure("wallet_session_missing");
111
111
  const nowMs = input.nowMs || Date.now;
112
+ let read;
112
113
  let resolution;
113
114
  try {
114
- resolution = await resolveWalletSessionOperationCredentialAdmission({
115
- authorizationSessions,
115
+ read = await authorizationSessions.readEd25519WalletSessionSigningReadByOperationCredential({
116
+ tenantId: authorizationSessions.tenantId,
116
117
  token,
117
118
  nowMs: nowMs(),
119
+ materialActivation: input.materialActivation
120
+ });
121
+ if (!read) return {
122
+ ok: false,
123
+ code: "wallet_session_invalid",
124
+ message: walletSessionFailureMessage("wallet_session_invalid")
125
+ };
126
+ resolution = resolveWalletSessionOperationCredentialAdmissionFromContext({
127
+ context: read.context,
128
+ nowMs: nowMs(),
118
129
  operation: {
119
130
  keyFamily: "ed25519",
120
131
  operationKind: input.operationKind
@@ -123,18 +134,14 @@ async function validateRouterAbEd25519WalletSessionInputs(input) {
123
134
  } catch {
124
135
  return walletSessionFailure("wallet_session_unavailable");
125
136
  }
126
- if (resolution.kind === "rejected") return walletSessionFailure("wallet_session_scope_mismatch");
127
- if (resolution.kind === "not_found") return {
128
- ok: false,
129
- code: "wallet_session_invalid",
130
- message: walletSessionFailureMessage("wallet_session_invalid")
131
- };
132
- if (resolution.admission.curve !== "ed25519") return walletSessionFailure("wallet_session_scope_mismatch");
137
+ if (resolution.kind === "rejected" || resolution.admission.curve !== "ed25519") return walletSessionFailure("wallet_session_scope_mismatch");
133
138
  return {
134
139
  ok: true,
135
140
  kind: "wallet_session_operation_credential_v1",
136
141
  admission: resolution.admission,
137
- context: resolution.admission.context
142
+ context: resolution.admission.context,
143
+ signerRead: read.signerRead,
144
+ policyRead: read.policyRead
138
145
  };
139
146
  }
140
147
  async function validateEcdsaPreprocessingSession(input) {