@seams/wallet-server 0.8.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (369) hide show
  1. package/THIRD_PARTY_NOTICES.md +7 -1
  2. package/artifact-manifest.json +196 -41
  3. package/cloudflare-router-ab/build/deriver-a/build-stamp.json +1 -1
  4. package/cloudflare-router-ab/build/deriver-a/index.js +2 -2
  5. package/cloudflare-router-ab/build/deriver-a/index_bg.wasm +0 -0
  6. package/cloudflare-router-ab/build/deriver-b/build-stamp.json +1 -1
  7. package/cloudflare-router-ab/build/deriver-b/index.js +2 -2
  8. package/cloudflare-router-ab/build/deriver-b/index_bg.wasm +0 -0
  9. package/cloudflare-router-ab/build/local-tools/darwin-arm64/router_ab_local_init +0 -0
  10. package/cloudflare-router-ab/build/local-tools/darwin-x64/router_ab_local_init +0 -0
  11. package/cloudflare-router-ab/build/local-tools/linux-x64/router_ab_local_init +0 -0
  12. package/cloudflare-router-ab/build/router/build-stamp.json +1 -1
  13. package/cloudflare-router-ab/build/router/index.js +2 -2
  14. package/cloudflare-router-ab/build/router/index_bg.wasm +0 -0
  15. package/cloudflare-router-ab/build/signing-worker/build-stamp.json +1 -1
  16. package/cloudflare-router-ab/build/signing-worker/index.js +2 -2
  17. package/cloudflare-router-ab/build/signing-worker/index_bg.wasm +0 -0
  18. package/cloudflare-router-ab/build/tenant-root-control-plane/build-stamp.json +1 -1
  19. package/cloudflare-router-ab/build/tenant-root-control-plane/index.js +2 -2
  20. package/cloudflare-router-ab/build/tenant-root-control-plane/index_bg.wasm +0 -0
  21. package/cloudflare-router-ab/migrations/deriver-a/0019_wallet_object_addresses.sql +10 -0
  22. package/cloudflare-router-ab/migrations/deriver-b/0019_wallet_object_addresses.sql +10 -0
  23. package/cloudflare-router-ab/scripts/prepare-local-runtime-config.mjs +3 -117
  24. package/cloudflare-router-ab/wrangler.deriver-a.toml +0 -8
  25. package/cloudflare-router-ab/wrangler.deriver-b.toml +24 -8
  26. package/cloudflare-router-ab/wrangler.router.toml +0 -2
  27. package/cloudflare-router-ab/wrangler.signing-worker.toml +29 -0
  28. package/dist/esm/authorization/domain.js +3 -2
  29. package/dist/esm/authorization/ed25519WalletSessionAdmission.js +0 -0
  30. package/dist/esm/authorization/service.js +64 -36
  31. package/dist/esm/cloud-host.js +24 -19
  32. package/dist/esm/core/EmailOtpRecords.js +29 -6
  33. package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.js +2 -0
  34. package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPresignBridge.js +10 -0
  35. package/dist/esm/core/ThresholdService/routerAb/internalServiceHttp.js +1 -0
  36. package/dist/esm/core/ThresholdService/validation.js +2 -2
  37. package/dist/esm/core/authService/nearPrivateKeySigning.js +1 -1
  38. package/dist/esm/core/authService/webauthn.js +1 -1
  39. package/dist/esm/core/d1Ed25519SignerRead.js +55 -0
  40. package/dist/esm/core/d1WalletStore.js +14 -11
  41. package/dist/esm/core/deviceLinking/linkedDeviceEmailOtpGrant.js +2 -2
  42. package/dist/esm/core/deviceLinking/linkedDeviceManagement.js +1 -1
  43. package/dist/esm/core/deviceLinking/linkedDeviceSessionRecord.js +2 -2
  44. package/dist/esm/core/emailOtpD1Statements.js +1 -0
  45. package/dist/esm/core/nearRelayerAccountProvisioning.js +1 -1
  46. package/dist/esm/core/routerAbSigning/RouterAbEcdsaPresignRuntime.js +4 -0
  47. package/dist/esm/core/signingLanes/WalletExecutionLaneProjection.js +1 -1
  48. package/dist/esm/core/signingMaterial/ordinaryInactiveSignerMaterialReservation.js +1 -0
  49. package/dist/esm/hosted-wallet-gateway.js +93 -10
  50. package/dist/esm/localHostedWalletGatewayHandler.js +12 -9
  51. package/dist/esm/localIntendedYaoSigningFault.js +2 -30
  52. package/dist/esm/localRegistrationSetupAuthority.js +8 -1
  53. package/dist/esm/router/auth/commonRouterUtils.js +17 -10
  54. package/dist/esm/router/auth/routerApiCredentialAuth.js +26 -7
  55. package/dist/esm/router/auth/walletRegistrationContext.js +49 -0
  56. package/dist/esm/router/auth/webAuthnCredentialCodecs.js +1 -1
  57. package/dist/esm/router/cloudflare/d1/auth/d1AuthorizationAssembly.js +4 -3
  58. package/dist/esm/router/cloudflare/d1/auth/d1AuthorizedOperationRouteService.js +2 -0
  59. package/dist/esm/router/cloudflare/d1/auth/d1EmailOtpRouteService.js +25 -0
  60. package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthConfig.js +14 -6
  61. package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthService.js +44 -40
  62. package/dist/esm/router/cloudflare/d1/auth/walletSessionCredentialReaders.js +17 -1
  63. package/dist/esm/router/cloudflare/d1/authorization/authorizedOperationStatements.js +35 -5
  64. package/dist/esm/router/cloudflare/d1/authorization/d1AuthorizationStore.js +258 -99
  65. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.js +31 -4
  66. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceOwnerAuthorizationProvider.js +1 -1
  67. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRequestProofNonceStore.js +1 -1
  68. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionRecords.js +1 -1
  69. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.js +1 -1
  70. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetPlanner.js +1 -1
  71. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceVerifiedLinkBuilder.js +1 -1
  72. package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoLifecycleDecisionStore.js +11 -2
  73. package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.js +100 -10
  74. package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoStateWriteFence.js +92 -0
  75. package/dist/esm/router/cloudflare/d1/ed25519Yao/d1WalletCeremonyActivity.js +77 -0
  76. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.js +14 -8
  77. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.js +14 -8
  78. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.js +3 -1
  79. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.js +58 -38
  80. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.js +27 -20
  81. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecoveryService.js +1 -0
  82. package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpSessionResolver.js +1 -0
  83. package/dist/esm/router/cloudflare/d1/oidc/d1OidcBoundary.js +1 -1
  84. package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.js +18 -7
  85. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.js +75 -14
  86. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.js +1 -1
  87. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.js +49 -29
  88. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationSessionTransaction.js +28 -0
  89. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationSetupSupport.js +11 -1
  90. package/dist/esm/router/cloudflare/d1/registration/d1WalletExecutionAuthority.js +168 -0
  91. package/dist/esm/router/cloudflare/d1/registration/d1WalletOperationStore.js +53 -0
  92. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.js +83 -42
  93. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationInitialSession.js +33 -0
  94. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationPreparation.js +16 -0
  95. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationRead.js +58 -0
  96. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationService.js +439 -500
  97. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetup.js +1 -1
  98. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.js +104 -90
  99. package/dist/esm/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.js +78 -44
  100. package/dist/esm/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.js +11 -35
  101. package/dist/esm/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.js +98 -39
  102. package/dist/esm/router/cloudflare/d1/versionedJson/d1VersionedJsonRecordStore.js +12 -9
  103. package/dist/esm/router/cloudflare/d1/wallet/authorizationSnapshotLayout.js +168 -0
  104. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerFinalizeRecord.js +1 -1
  105. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerService.js +15 -6
  106. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthMethodService.js +3 -40
  107. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorityStore.js +54 -1
  108. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationCleanup.js +157 -0
  109. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationFreeze.js +56 -0
  110. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationHistory.js +238 -0
  111. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationIntake.js +287 -0
  112. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationSnapshot.js +295 -0
  113. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationApprovals.js +140 -0
  114. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationChallenges.js +170 -0
  115. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationEmailOtp.js +60 -0
  116. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationOwner.js +33 -0
  117. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationOwnerRequest.js +74 -0
  118. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationPasskey.js +77 -0
  119. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationReadAccess.js +37 -0
  120. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationSessions.js +97 -0
  121. package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationWriteBlock.js +133 -0
  122. package/dist/esm/router/cloudflare/d1/walletObjectAddresses.js +47 -0
  123. package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnAuthService.js +1 -1
  124. package/dist/esm/router/cloudflare/runtime/routerAbServiceBindings.js +32 -1
  125. package/dist/esm/router/cloudflare/runtime/staticWalletConsoleBinding.js +20 -8
  126. package/dist/esm/router/cloudflare/runtime/walletAuthorizationRelocationRoutes.js +488 -0
  127. package/dist/esm/router/cloudflare/runtime/walletConsoleOps.js +1 -1
  128. package/dist/esm/router/cloudflare/runtime/walletConsoleOpsClient.js +26 -6
  129. package/dist/esm/router/cloudflare/runtime/walletControlOps.js +3 -0
  130. package/dist/esm/router/cloudflare/runtime/walletGateway.js +1 -1
  131. package/dist/esm/router/cloudflare/runtime/walletObjectAddresses.js +105 -0
  132. package/dist/esm/router/cloudflare/runtime/walletPlacementRoutes.js +339 -0
  133. package/dist/esm/router/cloudflare/runtime/walletRelocationDeriver.js +244 -0
  134. package/dist/esm/router/cloudflare/runtime/walletRelocationEcdsa.js +212 -0
  135. package/dist/esm/router/cloudflare/runtime/walletRelocationEd25519.js +172 -0
  136. package/dist/esm/router/cloudflare/runtime/walletRelocationOps.js +183 -0
  137. package/dist/esm/router/cloudflare/runtime/walletRelocationPresign.js +185 -0
  138. package/dist/esm/router/cloudflare/runtime/walletRelocationSource.js +221 -0
  139. package/dist/esm/router/cloudflare/signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.js +30 -8
  140. package/dist/esm/router/cloudflare-adaptor.js +8 -8
  141. package/dist/esm/router/cloudflare.js +34115 -32240
  142. package/dist/esm/router/domains/ecdsa/routerAbEcdsaStrictRegistration.js +35 -9
  143. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoCapabilityCommit.js +42 -0
  144. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.js +32 -6
  145. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.js +61 -1
  146. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPersistence.js +70 -3
  147. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRuntime.js +59 -87
  148. package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.js +52 -22
  149. package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExportRequestScopedCloudflare.js +10 -7
  150. package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.js +108 -78
  151. package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryRequestScopedCloudflare.js +19 -5
  152. package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryWalletSessionAuthorization.js +71 -22
  153. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.js +37 -25
  154. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.js +3 -3
  155. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationExecutionRecord.js +2 -1
  156. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.js +24 -3
  157. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationRequestScopedCloudflare.js +4 -3
  158. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.js +20 -7
  159. package/dist/esm/router/domains/ed25519Yao/routerAbEd25519YaoGatewayEnvelope.js +7 -1
  160. package/dist/esm/router/domains/emailOtp/emailOtpRouteHandlers.js +2 -2
  161. package/dist/esm/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrieval.js +1 -1
  162. package/dist/esm/router/domains/passkeyCustody/registrationCustodyOutcome.js +34 -18
  163. package/dist/esm/router/domains/passkeyCustody/walletCustodyRegistrationAdmission.js +2 -2
  164. package/dist/esm/router/domains/passkeyCustody/walletCustodyRegistrationCommit.js +16 -6
  165. package/dist/esm/router/domains/signingOperations/authorizedOperationWire.js +73 -0
  166. package/dist/esm/router/domains/signingOperations/ecdsaSigningResponse.js +31 -0
  167. package/dist/esm/router/domains/signingOperations/ed25519AuthorizedOperationReceipt.js +1 -1
  168. package/dist/esm/router/domains/signingOperations/routerAbEcdsaDerivationNormalSigningRoute.js +2 -1
  169. package/dist/esm/router/domains/signingOperations/routerAbEd25519NormalSigningRoute.js +31 -121
  170. package/dist/esm/router/domains/signingOperations/routerAbNormalSigningAdmission.js +2 -93
  171. package/dist/esm/router/domains/signingOperations/routerAbPrivateSigningWorker.js +1 -1
  172. package/dist/esm/router/domains/signingOperations/signingPrepareSession.js +33 -0
  173. package/dist/esm/router/domains/walletRegistration/registrationSessionSeal.js +121 -0
  174. package/dist/esm/router/domains/walletRegistration/walletRegistrationReservation.js +4 -4
  175. package/dist/esm/router/domains/walletRegistration/walletRegistrationRoutes.js +46 -157
  176. package/dist/esm/router/domains/walletRegistration/walletRegistrationSetupPayload.js +1 -1
  177. package/dist/esm/router/express.js +764 -894
  178. package/dist/esm/router/framework/http.js +2 -1
  179. package/dist/esm/router/transport/fetch/createFetchRouter.js +2 -2
  180. package/dist/esm/router/transport/fetch/routes/auth.js +1 -1
  181. package/dist/esm/router/transport/fetch/routes/deviceLinking.js +3 -3
  182. package/dist/esm/router/transport/fetch/routes/deviceLinkingOwnerAuthorization.js +2 -2
  183. package/dist/esm/router/transport/fetch/routes/ed25519AuthorizedOperationRevalidation.js +65 -0
  184. package/dist/esm/router/transport/fetch/routes/normalSigningRouterProxy.js +13 -3
  185. package/dist/esm/router/transport/fetch/routes/passkeyCustody.js +3 -3
  186. package/dist/esm/router/transport/fetch/routes/sessions.js +3 -2
  187. package/dist/esm/router/transport/fetch/routes/thresholdEcdsa.js +67 -130
  188. package/dist/esm/router/transport/fetch/routes/thresholdEd25519.js +76 -212
  189. package/dist/esm/router/transport/fetch/routes/walletExecutionLanePreflight.js +18 -41
  190. package/dist/esm/router/transport/fetch/routes/walletRegistration.js +6 -5
  191. package/dist/esm/router/transport/fetch/routes/webauthnAuthenticators.js +1 -1
  192. package/dist/esm/shared-ts/src/authorization/index.js +1 -1
  193. package/dist/esm/shared-ts/src/authorization/walletAuthority.js +2 -2
  194. package/dist/esm/shared-ts/src/device-linking/activeWalletSession.js +12 -2
  195. package/dist/esm/shared-ts/src/device-linking/digests.js +1 -1
  196. package/dist/esm/shared-ts/src/device-linking/ed25519ExportRoot.js +1 -1
  197. package/dist/esm/shared-ts/src/device-linking/index.js +1 -1
  198. package/dist/esm/shared-ts/src/device-linking/parsers.js +1 -1
  199. package/dist/esm/shared-ts/src/device-linking/sourceContribution.js +1 -1
  200. package/dist/esm/shared-ts/src/device-linking/wireFields.js +1 -1
  201. package/dist/esm/shared-ts/src/near/nearClient.js +1 -1
  202. package/dist/esm/shared-ts/src/signing-lanes/ownerContinuity.js +2 -2
  203. package/dist/esm/shared-ts/src/utils/ecdsaServerTiming.js +6 -1
  204. package/dist/esm/shared-ts/src/utils/emailOtpDomain.js +4 -2
  205. package/dist/esm/shared-ts/src/utils/routerAbEcdsaDerivation.js +1 -1
  206. package/dist/esm/shared-ts/src/utils/routerAbPublicKeyset.js +0 -27
  207. package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryEcdsaPossession.js +1 -1
  208. package/dist/esm/threshold/session/signingSessionSeal/options.js +1 -1
  209. package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker_bg.wasm +0 -0
  210. package/dist/types/shared-ts/src/device-linking/activeWalletSession.d.ts +2 -1
  211. package/dist/types/shared-ts/src/device-linking/contracts.d.ts +10 -0
  212. package/dist/types/shared-ts/src/threshold/ed25519OperationFingerprint.d.ts +2 -1
  213. package/dist/types/shared-ts/src/utils/emailOtpDomain.d.ts +3 -1
  214. package/dist/types/shared-ts/src/utils/routerAbPublicKeyset.d.ts +0 -9
  215. package/dist/types/shared-ts/src/utils/walletManagementProtocol.d.ts +1 -1
  216. package/dist/types/wallet-server/src/authorization/domain.d.ts +17 -1
  217. package/dist/types/wallet-server/src/authorization/ecdsaWalletSessionAdmission.d.ts +1 -0
  218. package/dist/types/wallet-server/src/authorization/ed25519WalletSessionAdmission.d.ts +35 -0
  219. package/dist/types/wallet-server/src/authorization/ed25519WalletSessionAdmission.typecheck.d.ts +2 -0
  220. package/dist/types/wallet-server/src/authorization/service.d.ts +43 -5
  221. package/dist/types/wallet-server/src/authorization/sessionRouting.d.ts +2 -0
  222. package/dist/types/wallet-server/src/cloud-host.d.ts +7 -3
  223. package/dist/types/wallet-server/src/core/EmailOtpRecords.d.ts +2 -1
  224. package/dist/types/wallet-server/src/core/EmailOtpStores.d.ts +19 -5
  225. package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.d.ts +1 -0
  226. package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPresignBridge.d.ts +6 -0
  227. package/dist/types/wallet-server/src/core/ThresholdService/routerAb/internalServiceHttp.d.ts +1 -0
  228. package/dist/types/wallet-server/src/core/d1Ed25519SignerRead.d.ts +17 -0
  229. package/dist/types/wallet-server/src/core/d1WalletStore.d.ts +6 -0
  230. package/dist/types/wallet-server/src/core/emailOtpD1Statements.d.ts +1 -0
  231. package/dist/types/wallet-server/src/core/routerAbSigning/RouterAbEcdsaPresignRuntime.d.ts +5 -1
  232. package/dist/types/wallet-server/src/core/signingMaterial/ordinaryInactiveSignerMaterialReservation.d.ts +1 -0
  233. package/dist/types/wallet-server/src/core/threeRouteRegistrationContracts.d.ts +14 -48
  234. package/dist/types/wallet-server/src/hosted-wallet-gateway.d.ts +4 -3
  235. package/dist/types/wallet-server/src/localIntendedYaoSigningFault.d.ts +1 -16
  236. package/dist/types/wallet-server/src/localRegistrationSetupAuthority.d.ts +1 -1
  237. package/dist/types/wallet-server/src/router/auth/commonRouterUtils.d.ts +7 -1
  238. package/dist/types/wallet-server/src/router/auth/routerApiCredentialAuth.d.ts +11 -3
  239. package/dist/types/wallet-server/src/router/auth/walletRegistrationContext.d.ts +8 -0
  240. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1AuthorizationAssembly.d.ts +1 -1
  241. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1EmailOtpRouteService.d.ts +16 -0
  242. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthConfig.d.ts +7 -4
  243. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthService.d.ts +4 -1
  244. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/walletSessionCredentialReaders.d.ts +7 -1
  245. package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/d1AuthorizationStore.d.ts +32 -1
  246. package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.d.ts +2 -0
  247. package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoLifecycleDecisionStore.d.ts +3 -1
  248. package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.d.ts +1 -0
  249. package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoStateWriteFence.d.ts +8 -0
  250. package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1WalletCeremonyActivity.d.ts +15 -0
  251. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.d.ts +6 -1
  252. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.d.ts +1 -0
  253. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.d.ts +4 -1
  254. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpCounters.typecheck.d.ts +2 -0
  255. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.d.ts +6 -29
  256. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.d.ts +21 -7
  257. package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.d.ts +17 -1
  258. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.d.ts +32 -7
  259. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.d.ts +16 -7
  260. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationSessionTransaction.d.ts +13 -0
  261. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationSetupSupport.d.ts +7 -0
  262. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletExecutionAuthority.d.ts +41 -0
  263. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletOperationStore.d.ts +28 -0
  264. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.d.ts +6 -9
  265. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationInitialSession.d.ts +17 -0
  266. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationPreparation.d.ts +12 -0
  267. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationRead.d.ts +43 -0
  268. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationService.d.ts +24 -45
  269. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.d.ts +9 -4
  270. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.d.ts +42 -14
  271. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.d.ts +5 -4
  272. package/dist/types/wallet-server/src/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.d.ts +24 -1
  273. package/dist/types/wallet-server/src/router/cloudflare/d1/versionedJson/d1VersionedJsonRecordStore.d.ts +10 -4
  274. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/authorizationSnapshotLayout.d.ts +21 -0
  275. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAddSignerService.d.ts +3 -0
  276. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthMethodService.d.ts +3 -7
  277. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorityStore.d.ts +8 -0
  278. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationCleanup.d.ts +20 -0
  279. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationFreeze.d.ts +12 -0
  280. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationHistory.d.ts +20 -0
  281. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationIntake.d.ts +29 -0
  282. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationSnapshot.d.ts +31 -0
  283. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationApprovals.d.ts +49 -0
  284. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationChallenges.d.ts +47 -0
  285. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationEmailOtp.d.ts +25 -0
  286. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationOwner.d.ts +88 -0
  287. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationOwnerRequest.d.ts +37 -0
  288. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationPasskey.d.ts +12 -0
  289. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationReadAccess.d.ts +18 -0
  290. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationSessions.d.ts +23 -0
  291. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationWriteBlock.d.ts +16 -0
  292. package/dist/types/wallet-server/src/router/cloudflare/d1/walletObjectAddresses.d.ts +14 -0
  293. package/dist/types/wallet-server/src/router/cloudflare/runtime/routerAbServiceBindings.d.ts +13 -0
  294. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletAuthorizationRelocationRoutes.d.ts +21 -0
  295. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOps.d.ts +1 -1
  296. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOpsClient.d.ts +3 -3
  297. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletControlOps.d.ts +2 -1
  298. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletGateway.d.ts +3 -1
  299. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletObjectAddresses.d.ts +45 -0
  300. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletPlacementRoutes.d.ts +30 -0
  301. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationDeriver.d.ts +11 -0
  302. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationEcdsa.d.ts +7 -0
  303. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationEd25519.d.ts +7 -0
  304. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationOps.d.ts +11 -0
  305. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationPresign.d.ts +7 -0
  306. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationSource.d.ts +26 -0
  307. package/dist/types/wallet-server/src/router/cloudflare/signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.d.ts +5 -0
  308. package/dist/types/wallet-server/src/router/domains/ecdsa/routerAbEcdsaStrictRegistration.d.ts +3 -0
  309. package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoCapabilityCommit.d.ts +7 -0
  310. package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.d.ts +41 -7
  311. package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.d.ts +33 -2
  312. package/dist/types/wallet-server/src/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.d.ts +12 -6
  313. package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.d.ts +17 -9
  314. package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryWalletSessionAuthorization.d.ts +2 -0
  315. package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.d.ts +13 -14
  316. package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.d.ts +7 -3
  317. package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationExecutionRecord.d.ts +1 -0
  318. package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.d.ts +6 -1
  319. package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.d.ts +11 -0
  320. package/dist/types/wallet-server/src/router/domains/ed25519Yao/routerAbEd25519YaoGatewayEnvelope.d.ts +12 -3
  321. package/dist/types/wallet-server/src/router/domains/passkeyCustody/registrationCustodyOutcome.d.ts +10 -6
  322. package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationAdmission.d.ts +10 -3
  323. package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationCommit.d.ts +12 -5
  324. package/dist/types/wallet-server/src/router/domains/signingOperations/authorizedOperationWire.d.ts +97 -0
  325. package/dist/types/wallet-server/src/router/domains/signingOperations/ecdsaSigningResponse.d.ts +13 -0
  326. package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbNormalSigningAdmission.d.ts +9 -206
  327. package/dist/types/wallet-server/src/router/domains/signingOperations/signingPrepareSession.d.ts +23 -0
  328. package/dist/types/wallet-server/src/router/domains/walletRegistration/registrationSessionSeal.d.ts +36 -0
  329. package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationInputs.d.ts +7 -7
  330. package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationReservation.d.ts +80 -6
  331. package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationRoutes.d.ts +15 -5
  332. package/dist/types/wallet-server/src/router/framework/apiCredentialPorts.d.ts +24 -0
  333. package/dist/types/wallet-server/src/router/framework/authServicePort.d.ts +21 -7
  334. package/dist/types/wallet-server/src/router/framework/routerApi.d.ts +3 -12
  335. package/dist/types/wallet-server/src/router/transport/fetch/routes/ed25519AuthorizedOperationRevalidation.d.ts +37 -0
  336. package/dist/types/wallet-server/src/router/transport/fetch/routes/thresholdEcdsa.d.ts +1 -17
  337. package/dist/types/wallet-server/src/storage/tenantRoute.d.ts +1 -1
  338. package/migrations/d1-signer/0049_wallet_relocation_challenges.sql +16 -0
  339. package/migrations/d1-signer/0050_wallet_relocation_approvals.sql +14 -0
  340. package/migrations/d1-signer/0051_wallet_relocation_email_otp.sql +92 -0
  341. package/migrations/d1-signer/0052_wallet_relocation_session_fences.sql +91 -0
  342. package/migrations/d1-signer/0053_wallet_hosted_history_import.sql +164 -0
  343. package/migrations/d1-signer/0054_wallet_authorization_freeze.sql +318 -0
  344. package/migrations/d1-signer/0055_wallet_authorization_snapshot.sql +120 -0
  345. package/migrations/d1-signer/0056_wallet_authorization_history_import.sql +424 -0
  346. package/migrations/d1-signer/0057_wallet_authorization_intake.sql +44 -0
  347. package/migrations/d1-signer/0058_wallet_ceremony_activity.sql +59 -0
  348. package/migrations/d1-signer/0059_wallet_authorization_activation.sql +45 -0
  349. package/migrations/d1-signer/0060_wallet_authorization_cleanup.sql +153 -0
  350. package/migrations/d1-signer/0061_wallet_session_operation_settlement.sql +28 -0
  351. package/migrations/d1-signer/0062_wallet_step_up_operation_settlement.sql +204 -0
  352. package/migrations/d1-signer/0063_wallet_operation_history_transfer.sql +466 -0
  353. package/migrations/d1-signer/0064_wallet_execution_generations.sql +93 -0
  354. package/migrations/d1-signer/0065_wallet_operation_execution_generation.sql +37 -0
  355. package/migrations/d1-signer/0066_regional_deployment_admission.sql +59 -0
  356. package/migrations/d1-signer/0067_registration_completion_decision.sql +12 -0
  357. package/migrations/d1-signer/0068_registration_cancellation_write_fence.sql +24 -0
  358. package/migrations/d1-signer/0069_cancelled_registration_session_fence.sql +11 -0
  359. package/migrations/d1-signer/0070_wallet_passkey_relocation.sql +369 -0
  360. package/migrations/d1-signer/0071_regional_wallet_otp_counters.sql +98 -0
  361. package/migrations/d1-signer/0072_linked_device_relocation_history.sql +899 -0
  362. package/migrations/d1-signer/0073_wallet_recovery_relocation.sql +86 -0
  363. package/migrations/d1-signer/0074_email_otp_relocation.sql +158 -0
  364. package/migrations/d1-signer/0075_wallet_authorization_return.sql +107 -0
  365. package/migrations/d1-signer/0076_wallet_relocation_write_block.sql +406 -0
  366. package/migrations/d1-signer/0077_wallet_object_addresses.sql +24 -0
  367. package/package.json +1 -1
  368. package/src/README.md +23 -1
  369. package/cloudflare-router-ab/scripts/local-key-material.mjs +0 -29
@@ -1,3 +1,4 @@
1
+ import { parseWalletId } from "../../../../shared-ts/src/utils/domainIds.js";
1
2
  import { NEAR_ED25519_MPC_OPERATION_KINDS } from "../../../../shared-ts/src/authorization/capabilityKinds.js";
2
3
  import { base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
3
4
  import { routerAbMpcMaterialActivationRefToWire, sameRouterAbMpcMaterialActivationRef } from "../../../../shared-ts/src/utils/routerAbNormalSigningIdentity.js";
@@ -344,6 +345,32 @@ async function authorizeRecoveryContinuation(input) {
344
345
  }
345
346
  };
346
347
  }
348
+ async function authorizeRecoveryCredential(input, services) {
349
+ switch (input.kind) {
350
+ case "bootstrap": return await authorizeV2WarmBootstrap({
351
+ request: input,
352
+ services
353
+ });
354
+ case "admit":
355
+ if (String(input.request.headers.get("x-seams-wallet-recovery-challenge-id") || "").trim()) return await authorizePreparedRecovery({
356
+ request: input,
357
+ services
358
+ });
359
+ if (extractBearerCredential(input.request.headers)) return await authorizeV2RecoveryAdmission({
360
+ request: input,
361
+ services
362
+ });
363
+ return await authorizePreparedRecovery({
364
+ request: input,
365
+ services
366
+ });
367
+ case "execute":
368
+ case "activate": return await authorizeRecoveryContinuation({
369
+ request: input,
370
+ services
371
+ });
372
+ }
373
+ }
347
374
  var RouterAbEd25519YaoRecoveryWalletSessionAuthorizationAdapter = class {
348
375
  constructor(resolveServices) {
349
376
  this.resolveServices = resolveServices;
@@ -359,30 +386,52 @@ var RouterAbEd25519YaoRecoveryWalletSessionAuthorizationAdapter = class {
359
386
  message: "wallet recovery admission is unavailable"
360
387
  });
361
388
  }
362
- switch (input.kind) {
363
- case "bootstrap": return await authorizeV2WarmBootstrap({
364
- request: input,
365
- services
366
- });
367
- case "admit":
368
- if (String(input.request.headers.get("x-seams-wallet-recovery-challenge-id") || "").trim()) return await authorizePreparedRecovery({
369
- request: input,
370
- services
371
- });
372
- if (extractBearerCredential(input.request.headers)) return await authorizeV2RecoveryAdmission({
373
- request: input,
374
- services
375
- });
376
- return await authorizePreparedRecovery({
377
- request: input,
378
- services
379
- });
380
- case "execute":
381
- case "activate": return await authorizeRecoveryContinuation({
382
- request: input,
383
- services
389
+ const credential = await authorizeRecoveryCredential(input, services);
390
+ if (!credential.ok) return credential;
391
+ const authorization = credential.authorization;
392
+ if (input.kind === "execute" || input.kind === "activate") return {
393
+ ok: true,
394
+ ownershipGeneration: input.ownershipGeneration,
395
+ authorization
396
+ };
397
+ let walletIdentity;
398
+ switch (authorization.kind) {
399
+ case "wallet_recovery":
400
+ walletIdentity = authorization.walletId;
401
+ break;
402
+ case "wallet_session_v2":
403
+ walletIdentity = authorization.context.authorization.session.walletId;
404
+ break;
405
+ case "wallet_session_v2_exhausted_candidate":
406
+ walletIdentity = authorization.context.status.session.walletId;
407
+ break;
408
+ }
409
+ const walletId = parseWalletId(walletIdentity);
410
+ if (!walletId.ok) return authorizationFailure({
411
+ status: 403,
412
+ code: "wallet_recovery_scope_mismatch",
413
+ message: "Recovery wallet identity is invalid"
414
+ });
415
+ let home;
416
+ try {
417
+ home = await services.admitEstablishedHome({ walletId: walletId.value });
418
+ } catch {
419
+ return authorizationFailure({
420
+ status: 503,
421
+ code: "wallet_home_unavailable",
422
+ message: "Recovery wallet home is unavailable"
384
423
  });
385
424
  }
425
+ if (!home.ok) return authorizationFailure({
426
+ status: 409,
427
+ code: home.code,
428
+ message: home.message
429
+ });
430
+ return {
431
+ ok: true,
432
+ ownershipGeneration: home.ownershipGeneration,
433
+ authorization
434
+ };
386
435
  }
387
436
  };
388
437
  //#endregion
@@ -1,8 +1,9 @@
1
1
  import { requireRecord } from "../../../../shared-ts/src/utils/validation.js";
2
2
  import { deriveRouterAbEd25519YaoStableContextBindingV1 } from "../../../../shared-ts/src/utils/routerAbEd25519YaoDigests.js";
3
3
  import { parseRouterAbEd25519YaoActivationKeysetV1, parseRouterAbEd25519YaoActivationResultV1, parseRouterAbEd25519YaoExportResultV1 } from "../../../../shared-ts/src/utils/routerAbEd25519Yao.js";
4
+ import { walletObjectIdentity, walletObjectIdentityHeaders } from "../../../cloudflare/runtime/walletObjectAddresses.js";
4
5
  import { createRouterAbTraceContextV1 } from "../../../../shared-ts/src/utils/routerAbTraceContext.js";
5
- import { routerAbEd25519YaoTenantRootWireV1 } from "../routerAbEd25519YaoGatewayEnvelope.js";
6
+ import { routerAbEd25519YaoRegistrationSigningRootIdV1, routerAbEd25519YaoTenantRootWireV1 } from "../routerAbEd25519YaoGatewayEnvelope.js";
6
7
  //#region src/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.ts
7
8
  const INTERNAL_AUTH_HEADER = "x-router-ab-internal-service-auth";
8
9
  const TRACE_ID_HEADER = "x-seams-trace-id";
@@ -216,6 +217,7 @@ function registrationRouterExecuteRequest(input, tenantRoot) {
216
217
  participant_ids: input.admissionRequest.participant_ids,
217
218
  target: {
218
219
  operation: "registration",
220
+ ownership_generation: input.ownershipGeneration,
219
221
  binding: input.request.binding,
220
222
  deriver_a_input: input.request.deriver_a_input,
221
223
  deriver_b_input: input.request.deriver_b_input
@@ -229,6 +231,7 @@ function recoveryRouterExecuteRequest(input, tenantRoot, attempt) {
229
231
  participant_ids: input.admissionRequest.participant_ids,
230
232
  target: {
231
233
  operation: "recovery",
234
+ ownership_generation: input.ownershipGeneration,
232
235
  binding: input.request.binding,
233
236
  attempt,
234
237
  deriver_a_input: input.request.deriver_a_input,
@@ -241,7 +244,7 @@ async function routerExecuteRequest(input, resolveTenantRoot) {
241
244
  switch (input.operation) {
242
245
  case "registration": return registrationRouterExecuteRequest(input, await routerAbEd25519YaoTenantRootWireV1(await resolveTenantRoot({
243
246
  operation: "registration",
244
- admissionRequest: input.admissionRequest
247
+ ...routerAbEd25519YaoRegistrationSigningRootIdV1(input.admissionRequest)
245
248
  })));
246
249
  case "export": return {
247
250
  tenant_root: await routerAbEd25519YaoTenantRootWireV1(await resolveTenantRoot({
@@ -252,6 +255,7 @@ async function routerExecuteRequest(input, resolveTenantRoot) {
252
255
  participant_ids: input.admissionRequest.participant_ids,
253
256
  target: {
254
257
  operation: "export",
258
+ ownership_generation: input.ownershipGeneration,
255
259
  binding: input.request.binding,
256
260
  deriver_a_input: input.request.deriver_a_input,
257
261
  deriver_b_input: input.request.deriver_b_input
@@ -458,11 +462,12 @@ var RouterAbEd25519YaoHttpRegistrationBackend = class {
458
462
  }
459
463
  };
460
464
  }
461
- async executeExport(request, admissionRequest, traceContext) {
465
+ async executeExport(request, claim, traceContext) {
462
466
  return await this.executeRouterRequest({
463
467
  operation: "export",
464
468
  request,
465
- admissionRequest
469
+ admissionRequest: claim.admissionRequest,
470
+ ownershipGeneration: claim.ownershipGeneration
466
471
  }, false, traceContext);
467
472
  }
468
473
  keyset() {
@@ -529,34 +534,37 @@ var RouterAbEd25519YaoHttpRegistrationBackend = class {
529
534
  };
530
535
  }
531
536
  }
532
- async execute(request, admissionRequest, traceContext) {
537
+ async execute(request, admissionRequest, ownershipGeneration, traceContext) {
533
538
  return await this.executeRouterRequest({
534
539
  operation: "registration",
535
540
  request,
536
- admissionRequest
541
+ admissionRequest,
542
+ ownershipGeneration
537
543
  }, false, traceContext);
538
544
  }
539
- async resolveRegistrationDispatchRoot(admissionRequest) {
545
+ async resolveRegistrationDispatchRoot(signingRootId) {
540
546
  return await routerAbEd25519YaoTenantRootWireV1(await this.config.resolveTenantRoot({
541
547
  operation: "registration",
542
- admissionRequest
548
+ ...signingRootId
543
549
  }));
544
550
  }
545
- async executePinnedRegistration(request, admissionRequest, dispatchRoot, traceContext) {
551
+ async executePinnedRegistration(request, authority, traceContext) {
546
552
  const routerInput = {
547
553
  operation: "registration",
548
554
  request,
549
- admissionRequest
555
+ admissionRequest: authority.admissionRequest,
556
+ ownershipGeneration: authority.ownershipGeneration
550
557
  };
551
- return await this.sendRouterRequest(routerInput, registrationRouterExecuteRequest(routerInput, dispatchRoot), traceContext.value, "exact", false);
558
+ return await this.sendRouterRequest(routerInput, registrationRouterExecuteRequest(routerInput, authority.dispatchRoot), traceContext.value, "exact", false);
552
559
  }
553
560
  async consumeRegistration(input) {
554
561
  let response;
555
562
  try {
556
- response = await this.post(ROUTER_REGISTRATION_CONSUME_PATH, {
557
- tenant_root: input.tenantRoot,
558
- wallet_id: input.walletId,
559
- lifecycle_id: input.lifecycleId,
563
+ response = await this.post(ROUTER_REGISTRATION_CONSUME_PATH, walletObjectIdentity(input.authority.admissionReceipt.binding.lifecycle.account_id, input.authority.ownershipGeneration, input.authority.dispatchRoot.identity), {
564
+ tenant_root: input.authority.dispatchRoot,
565
+ ownership_generation: input.authority.ownershipGeneration,
566
+ wallet_id: input.authority.admissionReceipt.binding.lifecycle.account_id,
567
+ lifecycle_id: input.authority.lifecycleId,
560
568
  session_id: Array.from(input.sessionId),
561
569
  consumer_binding: input.consumerBinding
562
570
  }, createRouterAbTraceContextV1().value, "exact");
@@ -578,13 +586,14 @@ var RouterAbEd25519YaoHttpRegistrationBackend = class {
578
586
  admissionRequest
579
587
  }));
580
588
  }
581
- async executeRecovery(request, admissionRequest, dispatchRoot, attempt, replay, traceContext) {
589
+ async executeRecovery(request, claim, traceContext) {
582
590
  const routerInput = {
583
591
  operation: "recovery",
584
592
  request,
585
- admissionRequest
593
+ admissionRequest: claim.admissionRequest,
594
+ ownershipGeneration: claim.ownershipGeneration
586
595
  };
587
- return await this.sendRouterRequest(routerInput, recoveryRouterExecuteRequest(routerInput, dispatchRoot, attempt), (traceContext ?? createRouterAbTraceContextV1()).value, "replay", replay);
596
+ return await this.sendRouterRequest(routerInput, recoveryRouterExecuteRequest(routerInput, claim.dispatchRoot, claim.attempt), (traceContext ?? createRouterAbTraceContextV1()).value, "replay", claim.replay);
588
597
  }
589
598
  async executeRouterRequest(request, replay, traceContext) {
590
599
  const traceId = (traceContext ?? createRouterAbTraceContextV1()).value;
@@ -604,7 +613,7 @@ var RouterAbEd25519YaoHttpRegistrationBackend = class {
604
613
  const operation = request.operation;
605
614
  const executeStartedAt = performance.now();
606
615
  try {
607
- const response = await this.post(ROUTER_EXECUTE_PATH, routerRequest, traceId, retryAfterTransportFailure, replay);
616
+ const response = await this.post(ROUTER_EXECUTE_PATH, walletObjectIdentity(request.admissionRequest.application_binding.wallet_id, request.ownershipGeneration, routerRequest.tenant_root.identity), routerRequest, traceId, retryAfterTransportFailure, replay);
608
617
  this.lastRouterServerTiming = response.ok ? response.serverTiming : null;
609
618
  const result = response.ok ? parseRouterExecuteResult(response.body, request.request) : response;
610
619
  emitGatewaySpan(this.config.onSpan, "gateway.yao_execute", operation, traceId, executeStartedAt, result.ok ? "success" : "failure");
@@ -614,10 +623,11 @@ var RouterAbEd25519YaoHttpRegistrationBackend = class {
614
623
  return unavailableFailure(error);
615
624
  }
616
625
  }
617
- async activateRecovery(request, dispatchRoot, traceContext) {
618
- const promoted = await this.post(ROUTER_RECOVERY_PROMOTE_PATH, {
626
+ async activateRecovery(request, dispatchRoot, ownershipGeneration, traceContext) {
627
+ const promoted = await this.post(ROUTER_RECOVERY_PROMOTE_PATH, walletObjectIdentity(request.binding.lifecycle.account_id, ownershipGeneration, dispatchRoot.identity), {
619
628
  ...request,
620
- tenant_root: dispatchRoot
629
+ tenant_root: dispatchRoot,
630
+ ownership_generation: ownershipGeneration
621
631
  }, (traceContext ?? createRouterAbTraceContextV1()).value);
622
632
  if (!promoted.ok) return promoted;
623
633
  if (!activeReceiptMatchesRecoveryActivation(parseActiveSigningWorkerReceipt(promoted.body, request.binding.session_id, request.public_receipt.transcript), request)) return internalFailure("recovery_promotion_mismatch", "Router promotion receipt does not match the verified recovery result");
@@ -626,10 +636,13 @@ var RouterAbEd25519YaoHttpRegistrationBackend = class {
626
636
  body: request
627
637
  };
628
638
  }
629
- async post(path, body, traceId, retryAfterTransportFailure = "none", replay = false) {
639
+ async post(path, identity, body, traceId, retryAfterTransportFailure = "none", replay = false) {
630
640
  const init = {
631
641
  method: "POST",
632
- headers: this.headers(traceId),
642
+ headers: {
643
+ ...this.headers(traceId),
644
+ ...walletObjectIdentityHeaders(identity)
645
+ },
633
646
  body: JSON.stringify(body)
634
647
  };
635
648
  return await this.request(this.config.routerUrl, path, replay ? requestInitWithReplayHeader(init) : init, retryAfterTransportFailure);
@@ -669,7 +682,6 @@ function parseRouterServerTiming(value) {
669
682
  const metrics = value.split(",").map((metric) => metric.trim());
670
683
  const allowedNames = new Set([
671
684
  "yao_router_prepare_pair",
672
- "yao_router_verify_readiness",
673
685
  "yao_router_role_execution",
674
686
  "yao_router_signing_worker_delivery"
675
687
  ]);
@@ -187,7 +187,7 @@ var RouterAbEd25519YaoRegistrationRouteExtension = class {
187
187
  body: parsed.value
188
188
  });
189
189
  if (!authorization.ok) return routeFailureResponse(authorization);
190
- const result = await this.service.execute(parsed.value, traceContext.value);
190
+ const result = await this.service.execute(parsed.value, authorization.ownershipGeneration, traceContext.value);
191
191
  if (!result.ok) return routeFailureResponse(result);
192
192
  return json(result.value, { status: result.status });
193
193
  }
@@ -324,7 +324,7 @@ var InMemoryRouterAbEd25519YaoRegistrationService = class {
324
324
  value: parsed.value
325
325
  };
326
326
  }
327
- async execute(request, traceContext) {
327
+ async execute(request, ownershipGeneration, traceContext) {
328
328
  const preparation = this.prepareExecute(request);
329
329
  switch (preparation.kind) {
330
330
  case "completed": return {
@@ -338,7 +338,7 @@ var InMemoryRouterAbEd25519YaoRegistrationService = class {
338
338
  try {
339
339
  outcome = {
340
340
  kind: "backend_response",
341
- result: await this.backend.execute(request, preparation.claim.admissionRequest, traceContext)
341
+ result: await this.backend.execute(request, preparation.claim.admissionRequest, ownershipGeneration, traceContext)
342
342
  };
343
343
  } catch (error) {
344
344
  outcome = {
@@ -9,8 +9,9 @@ import { routerAbEd25519YaoCredentialDigestHexV1 } from "./routerAbEd25519YaoReg
9
9
  */
10
10
  function buildRouterAbEd25519YaoRegistrationExecutionAuthorityV1(input) {
11
11
  const { lifecycleId, registration, authority, dispatchRoot } = input;
12
- if (dispatchRoot === void 0 || dispatchRoot.identity.signingRootId !== registration.admissionRequest.application_binding.signing_root_id || dispatchRoot.identity.signingRootVersion !== registration.admissionRequest.scope.root_share_epoch || registration.admissionRequest.scope.lifecycle_id !== lifecycleId || registration.admissionReceipt.binding.lifecycle.lifecycle_id !== lifecycleId || authority.admissionRequest.scope.lifecycle_id !== lifecycleId || authority.admissionFingerprint !== encodeRouterAbEd25519YaoRegistrationAdmissionFingerprintV1(authority.admissionRequest) || authority.admissionFingerprint !== encodeRouterAbEd25519YaoRegistrationAdmissionFingerprintV1(registration.admissionRequest) || !Number.isSafeInteger(authority.expiresAtMs) || authority.expiresAtMs <= 0) return null;
12
+ if (!Number.isSafeInteger(authority.ownershipGeneration) || authority.ownershipGeneration < 1 || dispatchRoot === void 0 || dispatchRoot.identity.signingRootId !== registration.admissionRequest.application_binding.signing_root_id || dispatchRoot.identity.signingRootVersion !== registration.admissionRequest.scope.root_share_epoch || registration.admissionRequest.scope.lifecycle_id !== lifecycleId || registration.admissionReceipt.binding.lifecycle.lifecycle_id !== lifecycleId || authority.admissionRequest.scope.lifecycle_id !== lifecycleId || authority.admissionFingerprint !== encodeRouterAbEd25519YaoRegistrationAdmissionFingerprintV1(authority.admissionRequest) || authority.admissionFingerprint !== encodeRouterAbEd25519YaoRegistrationAdmissionFingerprintV1(registration.admissionRequest) || !Number.isSafeInteger(authority.expiresAtMs) || authority.expiresAtMs <= 0) return null;
13
13
  return {
14
+ ownershipGeneration: authority.ownershipGeneration,
14
15
  lifecycleId,
15
16
  admissionRequest: registration.admissionRequest,
16
17
  admissionReceipt: registration.admissionReceipt,
@@ -180,6 +180,7 @@ function admittedAuthority(authority) {
180
180
  return {
181
181
  kind: "admitted",
182
182
  purpose: authority.purpose,
183
+ ownershipGeneration: authority.ownershipGeneration,
183
184
  credentialDigestSha256: authority.credentialDigestSha256,
184
185
  admissionRequest: authority.admissionRequest,
185
186
  admissionFingerprint: authority.admissionFingerprint,
@@ -217,6 +218,7 @@ var InMemoryRouterAbEd25519YaoRegistrationIntentAuthorizationAdapter = class {
217
218
  this.authorities = state.authorities;
218
219
  }
219
220
  async bindVerifiedIntent(verified) {
221
+ if (!Number.isSafeInteger(verified.ownershipGeneration) || verified.ownershipGeneration < 1) return failure("invalid_registration_intent", "Wallet ownership generation is invalid");
220
222
  const credential = activationIntentCredential(verified);
221
223
  if (!VERIFIED_INTENT_CREDENTIAL.test(credential)) return failure("invalid_registration_intent", "registration intent grant is not a canonical Bearer credential");
222
224
  if (!Number.isSafeInteger(verified.expiresAtMs) || verified.expiresAtMs <= Date.now()) return failure("invalid_registration_intent", "registration intent authority is expired");
@@ -229,7 +231,7 @@ var InMemoryRouterAbEd25519YaoRegistrationIntentAuthorizationAdapter = class {
229
231
  const existingLifecycle = findAuthorityByLifecycleId(this.authorities, verified.admissionRequest.scope.lifecycle_id);
230
232
  if (existingCredential || existingLifecycle) {
231
233
  const existing = existingCredential?.authority ?? existingLifecycle?.authority;
232
- const exactRetry = existing !== void 0 && existing.purpose === purpose && credentialDigestsEqual(existing.credentialDigestSha256, credentialDigest) && (existing.admissionFingerprint === admissionFingerprint || purpose === "wallet_registration" && sameAdmissionSubject(existing.admissionRequest, copiedAdmissionRequest)) && existing.expiresAtMs === verified.expiresAtMs;
234
+ const exactRetry = existing !== void 0 && existing.purpose === purpose && existing.ownershipGeneration === verified.ownershipGeneration && credentialDigestsEqual(existing.credentialDigestSha256, credentialDigest) && (existing.admissionFingerprint === admissionFingerprint || purpose === "wallet_registration" && sameAdmissionSubject(existing.admissionRequest, copiedAdmissionRequest)) && existing.expiresAtMs === verified.expiresAtMs;
233
235
  credentialDigest.fill(0);
234
236
  return exactRetry ? {
235
237
  ok: true,
@@ -238,6 +240,7 @@ var InMemoryRouterAbEd25519YaoRegistrationIntentAuthorizationAdapter = class {
238
240
  }
239
241
  this.authorities.push({
240
242
  kind: "available",
243
+ ownershipGeneration: verified.ownershipGeneration,
241
244
  purpose,
242
245
  credentialDigestSha256: credentialDigest,
243
246
  admissionRequest: copiedAdmissionRequest,
@@ -255,6 +258,7 @@ var InMemoryRouterAbEd25519YaoRegistrationIntentAuthorizationAdapter = class {
255
258
  this.authorities[existing.index] = {
256
259
  kind: existing.authority.kind,
257
260
  purpose: existing.authority.purpose,
261
+ ownershipGeneration: existing.authority.ownershipGeneration,
258
262
  admissionRequest: existing.authority.admissionRequest,
259
263
  admissionFingerprint: existing.authority.admissionFingerprint,
260
264
  credentialDigestSha256: await credentialDigestSha256(verified.credential),
@@ -265,6 +269,17 @@ var InMemoryRouterAbEd25519YaoRegistrationIntentAuthorizationAdapter = class {
265
269
  admissionRequest: copyAdmissionRequest(existing.authority.admissionRequest)
266
270
  };
267
271
  }
272
+ async bindAndAuthorizeAdmission(input) {
273
+ const bound = await this.bindVerifiedIntent(input);
274
+ if (!bound.ok) return bound;
275
+ const digest = await credentialDigestSha256(input.kind === "verified_registration_intent" ? input.registrationIntentGrant : input.addSignerIntentGrant);
276
+ try {
277
+ const authorized = this.authorizeAdmission(bound.admissionRequest, digest);
278
+ return authorized.ok ? bound : authorized;
279
+ } finally {
280
+ digest.fill(0);
281
+ }
282
+ }
268
283
  async authorize(input) {
269
284
  const bearer = extractStrictBearerCredential(input.request);
270
285
  if (!bearer.ok) return bearer.result;
@@ -296,7 +311,10 @@ var InMemoryRouterAbEd25519YaoRegistrationIntentAuthorizationAdapter = class {
296
311
  message: "registration intent credential does not authorize this admission subject"
297
312
  });
298
313
  if (matched.authority.kind === "available") this.authorities[matched.index] = admittedAuthority(matched.authority);
299
- return { ok: true };
314
+ return {
315
+ ok: true,
316
+ ownershipGeneration: matched.authority.ownershipGeneration
317
+ };
300
318
  }
301
319
  async authorizeExecution(binding, credentialDigest) {
302
320
  const matched = findAuthorityByLifecycleId(this.authorities, binding.lifecycle.lifecycle_id);
@@ -331,7 +349,10 @@ var InMemoryRouterAbEd25519YaoRegistrationIntentAuthorizationAdapter = class {
331
349
  code: "registration_intent_binding_mismatch",
332
350
  message: "registration execution context does not match its admitted application"
333
351
  });
334
- return { ok: true };
352
+ return {
353
+ ok: true,
354
+ ownershipGeneration: matched.authority.ownershipGeneration
355
+ };
335
356
  }
336
357
  };
337
358
  //#endregion
@@ -4,6 +4,7 @@ import { json, readJson } from "../../../framework/http.js";
4
4
  import { InMemoryRouterAbEd25519YaoRegistrationService, routerAbEd25519YaoExecutionMatchesAdmissionV1 } from "./routerAbEd25519YaoRegistration.js";
5
5
  import { InMemoryRouterAbEd25519YaoRegistrationIntentAuthorizationAdapter, routerAbEd25519YaoBearerCredentialDigestV1 } from "./routerAbEd25519YaoRegistrationIntentAuthorization.js";
6
6
  import { pinRouterAbEd25519YaoRegistrationDispatchRootV1, routerAbEd25519YaoRegistrationResultFromRouterAnswerV1 } from "./routerAbEd25519YaoRegistrationExecutionRecord.js";
7
+ import { routerAbEd25519YaoRegistrationSigningRootIdV1 } from "../routerAbEd25519YaoGatewayEnvelope.js";
7
8
  import { routerAbEd25519YaoAdmittedRegistrationAuthorityV1 } from "../capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.js";
8
9
  import { runRouterAbEd25519YaoRegistrationTwoPhaseV1 } from "./routerAbEd25519YaoRegistrationTwoPhaseRunner.js";
9
10
  //#region src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationRequestScopedCloudflare.ts
@@ -109,7 +110,7 @@ async function runAdmissionRequest(input, request, trace) {
109
110
  };
110
111
  case "claimed":
111
112
  try {
112
- dispatchRoot = await input.backend.resolveRegistrationDispatchRoot(request);
113
+ dispatchRoot = await input.backend.resolveRegistrationDispatchRoot(routerAbEd25519YaoRegistrationSigningRootIdV1(request));
113
114
  } catch (error) {
114
115
  return {
115
116
  kind: "rejected",
@@ -183,7 +184,7 @@ async function runExecutionRequest(input, request, trace) {
183
184
  };
184
185
  if (!credential.ok) return timedExecutionResult(credential.result, timing);
185
186
  const admissionStartedAt = performance.now();
186
- const authority = routerAbEd25519YaoAdmittedRegistrationAuthorityV1((await input.store.load(lifecycleId)).state, lifecycleId);
187
+ const authority = routerAbEd25519YaoAdmittedRegistrationAuthorityV1((await input.store.loadRegistration(lifecycleId)).state, lifecycleId);
187
188
  const timingBeforeRouter = {
188
189
  ...timing,
189
190
  d1AdmissionReadMs: elapsedMs(admissionStartedAt)
@@ -195,7 +196,7 @@ async function runExecutionRequest(input, request, trace) {
195
196
  let backend;
196
197
  const routerExecutionStartedAt = performance.now();
197
198
  try {
198
- backend = await input.backend.executePinnedRegistration(request, authority.admissionRequest, authority.dispatchRoot, trace);
199
+ backend = await input.backend.executePinnedRegistration(request, authority, trace);
199
200
  } catch (error) {
200
201
  return timedExecutionResult({
201
202
  ok: false,
@@ -104,13 +104,16 @@ function parseRouterAbEd25519YaoRegistrationSideEffectClaimFields(record, parseP
104
104
  * or allowing a network effect.
105
105
  */
106
106
  async function runRouterAbEd25519YaoRegistrationSideEffectV1(store, input) {
107
+ return runRegistrationSideEffect(store, input, store.read.bind(store));
108
+ }
109
+ async function runRegistrationSideEffect(store, input, readInitial) {
107
110
  const key = requireOpaqueKey(input.key);
108
111
  const requestFingerprint = requireRequestFingerprint(input.requestFingerprint);
109
112
  const resumeAfterMs = requirePositiveDuration(input.resumeAfterMs, "resumeAfterMs");
110
113
  let existing;
111
114
  let disposition;
112
115
  try {
113
- existing = await store.read(key);
116
+ existing = await readInitial(key);
114
117
  disposition = await existingDisposition(existing, requestFingerprint, input.derivePreparedArtifactFingerprint);
115
118
  } catch (error) {
116
119
  return uncertainResult("claim", error);
@@ -233,7 +236,8 @@ async function runRouterAbEd25519YaoRegistrationSideEffectV1(store, input) {
233
236
  * from its digest, so replay never reconstructs one.
234
237
  */
235
238
  async function runRouterAbEd25519YaoRegistrationSideEffectV2(store, input) {
236
- const result = await runRouterAbEd25519YaoRegistrationSideEffectV1(new RegistrationV2StoreAdapter(store, input.projectReceipt), {
239
+ const adaptedStore = new RegistrationV2StoreAdapter(store, input.initialRecord, input.projectReceipt, input.completionWrite);
240
+ const result = await runRegistrationSideEffect(adaptedStore, {
237
241
  kind: input.kind,
238
242
  operation: input.operation,
239
243
  key: input.key,
@@ -246,7 +250,7 @@ async function runRouterAbEd25519YaoRegistrationSideEffectV2(store, input) {
246
250
  kind: "executed_response",
247
251
  response: await input.execute(prepared, attempt)
248
252
  })
249
- });
253
+ }, adaptedStore.readInitial.bind(adaptedStore));
250
254
  switch (result.kind) {
251
255
  case "executed":
252
256
  if (result.value.kind !== "executed_response") return {
@@ -280,12 +284,19 @@ async function resolveRegistrationV2AdapterReplay(value, input) {
280
284
  }
281
285
  }
282
286
  var RegistrationV2StoreAdapter = class {
283
- constructor(store, projectReceipt) {
287
+ constructor(store, initialRecord, projectReceipt, completionWrite) {
284
288
  this.store = store;
289
+ this.initialRecord = initialRecord;
285
290
  this.projectReceipt = projectReceipt;
291
+ this.completionWrite = completionWrite;
292
+ }
293
+ async readInitial() {
294
+ return this.adaptRead(this.initialRecord);
286
295
  }
287
296
  async read(key) {
288
- const result = await this.store.read(key);
297
+ return this.adaptRead(await this.store.read(key));
298
+ }
299
+ adaptRead(result) {
289
300
  if (result.kind === "missing") return { kind: "missing" };
290
301
  switch (result.value.kind) {
291
302
  case "router_ab_ed25519_yao_registration_side_effect_claim_v1": return {
@@ -319,7 +330,7 @@ var RegistrationV2StoreAdapter = class {
319
330
  case "router_ab_ed25519_yao_registration_side_effect_completion_v1": {
320
331
  if (value.response.kind !== "executed_response") throw new Error("registration side-effect cannot persist a replay response");
321
332
  const receipt = requireReceipt(await this.projectReceipt(value.response.response));
322
- return await this.store.put(key, {
333
+ const completion = {
323
334
  kind: "router_ab_ed25519_yao_registration_side_effect_completion_v2",
324
335
  operation: value.operation,
325
336
  requestFingerprint: value.requestFingerprint,
@@ -328,7 +339,9 @@ var RegistrationV2StoreAdapter = class {
328
339
  completedAtMs: value.completedAtMs,
329
340
  prepared: value.prepared,
330
341
  receipt
331
- }, expectedVersion);
342
+ };
343
+ const companionWrite = this.completionWrite(value.response.response);
344
+ return companionWrite ? await this.store.putWithCompanion(key, completion, expectedVersion, companionWrite) : await this.store.put(key, completion, expectedVersion);
332
345
  }
333
346
  default: return assertNever(value);
334
347
  }
@@ -39,7 +39,13 @@ async function routerAbEd25519YaoTenantRootWireV1(root) {
39
39
  custody_lineage_b64u: root.custodyLineageB64u
40
40
  };
41
41
  }
42
+ function routerAbEd25519YaoRegistrationSigningRootIdV1(admissionRequest) {
43
+ return {
44
+ signing_root_id: admissionRequest.application_binding.signing_root_id,
45
+ root_share_epoch: admissionRequest.scope.root_share_epoch
46
+ };
47
+ }
42
48
  //#endregion
43
- export { parseRouterAbEd25519YaoTenantRootWireV1, routerAbEd25519YaoTenantRootWireV1 };
49
+ export { parseRouterAbEd25519YaoTenantRootWireV1, routerAbEd25519YaoRegistrationSigningRootIdV1, routerAbEd25519YaoTenantRootWireV1 };
44
50
 
45
51
  //# sourceMappingURL=routerAbEd25519YaoGatewayEnvelope.js.map
@@ -1,7 +1,7 @@
1
- import { base64UrlDecode, base64UrlEncode } from "../../../shared-ts/src/utils/base64.js";
2
- import "../../../shared-ts/src/utils/encoders.js";
3
1
  import { normalizeOptionalTrimmedString } from "../../../shared-ts/src/utils/normalize.js";
4
2
  import { isPlainObject } from "../../../shared-ts/src/utils/validation.js";
3
+ import { base64UrlDecode, base64UrlEncode } from "../../../shared-ts/src/utils/base64.js";
4
+ import "../../../shared-ts/src/utils/encoders.js";
5
5
  import { failure } from "../../../shared-ts/src/utils/failure.js";
6
6
  import { emailOtpStatusCode } from "./emailOtpSessionRouteHelpers.js";
7
7
  import { EMAIL_OTP_FACTOR_RELEASE_AAD_DOMAIN_V1 } from "../../../shared-ts/src/utils/emailOtpDomain.js";
@@ -1,5 +1,5 @@
1
- import { base64UrlEncode } from "../../../shared-ts/src/utils/base64.js";
2
1
  import { isPlainObject } from "../../../shared-ts/src/utils/validation.js";
2
+ import { base64UrlEncode } from "../../../shared-ts/src/utils/base64.js";
3
3
  import { decodeBase64UrlOrBase64 } from "../../../core/authService/webauthnOidcHelpers.js";
4
4
  import { verifyWebAuthnAuthenticationLiteWithStore } from "../../../core/authService/webauthn.js";
5
5
  //#region src/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrieval.ts
@@ -1,31 +1,47 @@
1
1
  import { admitWalletCustodyRegistrationCommit } from "./walletCustodyRegistrationAdmission.js";
2
2
  import { verifiedCustodyFactorFromAuthority } from "./verifiedCustodyFactor.js";
3
3
  //#region src/router/domains/passkeyCustody/registrationCustodyOutcome.ts
4
- async function commitRegistrationCustody(input) {
5
- if (!input.payload) return { status: "not_requested" };
6
- const factor = verifiedCustodyFactorFromAuthority({
7
- authority: input.verifiedAuthority,
8
- ...input.verifiedEmailOtpEnrollment ? { emailOtpEnrollment: input.verifiedEmailOtpEnrollment } : {}
9
- });
10
- if (!factor.ok) return {
11
- status: "rejected",
12
- reason: factor.reason
13
- };
4
+ /** Admits the custody payload and claims its routes. It never throws either. */
5
+ async function reserveRegistrationCustody(input) {
6
+ const payload = input.payload;
7
+ if (!payload) return settled({ status: "not_requested" });
14
8
  try {
15
- return toOutcome(await admitWalletCustodyRegistrationCommit({
16
- payload: input.payload,
9
+ const factor = verifiedCustodyFactorFromAuthority({
10
+ authority: input.verifiedAuthority,
11
+ ...input.verifiedEmailOtpEnrollment ? { emailOtpEnrollment: input.verifiedEmailOtpEnrollment } : {}
12
+ });
13
+ if (!factor.ok) return settled({
14
+ status: "rejected",
15
+ reason: factor.reason
16
+ });
17
+ const admitted = await admitWalletCustodyRegistrationCommit({
18
+ payload,
17
19
  verifiedWalletId: input.verifiedWalletId,
18
20
  verifiedFactor: factor.factor,
19
21
  nowMs: input.nowMs,
20
22
  store: input.store
21
- }));
22
- } catch (error) {
23
- return {
24
- status: "rejected",
25
- reason: error instanceof Error ? error.message : "wallet custody commit failed"
23
+ });
24
+ if (admitted.kind !== "reserved") return settled(toOutcome(admitted));
25
+ return async () => {
26
+ try {
27
+ return toOutcome(await admitted.commit());
28
+ } catch (error) {
29
+ return storeFailure(error);
30
+ }
26
31
  };
32
+ } catch (error) {
33
+ return settled(storeFailure(error));
27
34
  }
28
35
  }
36
+ function settled(outcome) {
37
+ return () => Promise.resolve(outcome);
38
+ }
39
+ function storeFailure(error) {
40
+ return {
41
+ status: "rejected",
42
+ reason: error instanceof Error ? error.message : "wallet custody commit failed"
43
+ };
44
+ }
29
45
  function toOutcome(admitted) {
30
46
  switch (admitted.kind) {
31
47
  case "committed": return { status: "committed" };
@@ -42,6 +58,6 @@ function toOutcome(admitted) {
42
58
  }
43
59
  }
44
60
  //#endregion
45
- export { commitRegistrationCustody };
61
+ export { reserveRegistrationCustody };
46
62
 
47
63
  //# sourceMappingURL=registrationCustodyOutcome.js.map
@@ -1,4 +1,4 @@
1
- import { commitWalletCustodyRegistration } from "./walletCustodyRegistrationCommit.js";
1
+ import { reserveWalletCustodyRegistration } from "./walletCustodyRegistrationCommit.js";
2
2
  //#region src/router/domains/passkeyCustody/walletCustodyRegistrationAdmission.ts
3
3
  async function admitWalletCustodyRegistrationCommit(input) {
4
4
  const payloadWalletId = String(input.payload.walletId ?? "").trim();
@@ -19,7 +19,7 @@ async function admitWalletCustodyRegistrationCommit(input) {
19
19
  kind: "no_custody_records",
20
20
  keyManifestDigestB64u: digest
21
21
  };
22
- return await commitWalletCustodyRegistration({
22
+ return await reserveWalletCustodyRegistration({
23
23
  payload: input.payload,
24
24
  factor: input.verifiedFactor,
25
25
  nowMs: input.nowMs,