@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,11 +1,11 @@
1
1
  import { parseEmailOtpChallengeId, parseThresholdEd25519SessionId, parseWalletId, parseWebAuthnCredentialIdB64u, parseWebAuthnRpId } from "../../../../shared-ts/src/utils/domainIds.js";
2
2
  import { parseAuthFactorId, parseAuthorizationAuditEventId, parseAuthorizationEvidenceId, parseAuthorizationEvidenceSetId, parseAuthorizedOperationId, parseCapabilityId, parseCapabilityOperationId, parsePrincipalId } from "../../../../shared-ts/src/authorization/capabilityKinds.js";
3
+ import { isPlainObject } from "../../../../shared-ts/src/utils/validation.js";
3
4
  import { base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
4
5
  import { alphabetizeStringify, sha256BytesUtf8 } from "../../../../shared-ts/src/utils/digests.js";
5
6
  import { parseDigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
6
7
  import { buildCapabilityOperationEnvelope } from "../../../../shared-ts/src/authorization/operationFingerprint.js";
7
8
  import "../../../../shared-ts/src/utils/encoders.js";
8
- import { isPlainObject } from "../../../../shared-ts/src/utils/validation.js";
9
9
  import { sameRouterAbMpcMaterialActivationRef } from "../../../../shared-ts/src/utils/routerAbNormalSigningIdentity.js";
10
10
  import { deriveRouterAbEd25519YaoExportAuthorizationDigestV1, deriveRouterAbEd25519YaoExportConfirmationDigestV1, deriveRouterAbEd25519YaoRuntimePolicyBindingV1 } from "../../../../shared-ts/src/utils/routerAbEd25519YaoDigests.js";
11
11
  import { ROUTER_AB_ED25519_YAO_EXPORT_ADMISSION_PATH_V1, ROUTER_AB_ED25519_YAO_EXPORT_EXECUTE_PATH_V1, parseRouterAbEd25519YaoExportAdmissionReceiptV1, parseRouterAbEd25519YaoExportAdmissionRequestV1, parseRouterAbEd25519YaoExportExecuteRequestV1, parseRouterAbEd25519YaoExportResultV1 } from "../../../../shared-ts/src/utils/routerAbEd25519Yao.js";
@@ -182,14 +182,14 @@ var InMemoryRouterAbEd25519YaoExportService = class {
182
182
  recordAuthorizationUncertain(request) {
183
183
  this.state.authorizationUncertainOwners.set(exportKey(request), request.scope.account_id);
184
184
  }
185
- async admitExport(request, authorizationIdentity, admission, factorRelease, traceContext) {
185
+ async admitExport(request, authorizationIdentity, ownershipGeneration, admission, factorRelease, traceContext) {
186
186
  const admitted = await admission.admit();
187
187
  if (!admitted.ok) return failure({
188
188
  status: admitted.status === 503 ? 503 : 409,
189
189
  code: "admission_failed",
190
190
  message: admitted.message
191
191
  });
192
- const authorization = this.authorizeExport(request, exportKey(request), authorizationIdentity, factorRelease);
192
+ const authorization = this.authorizeExport(request, exportKey(request), authorizationIdentity, ownershipGeneration, factorRelease);
193
193
  if (authorization.kind === "completed" && !authorization.value.ok) return failure({
194
194
  status: authorization.value.status === 503 ? 503 : 409,
195
195
  code: "admission_failed",
@@ -226,11 +226,11 @@ var InMemoryRouterAbEd25519YaoExportService = class {
226
226
  * admission. An export already here answers from its state instead, with
227
227
  * the factor release it recorded.
228
228
  */
229
- authorizeExport(request, authorizationFingerprint, authorizationIdentity, factorRelease) {
229
+ authorizeExport(request, authorizationFingerprint, authorizationIdentity, ownershipGeneration, factorRelease) {
230
230
  const key = exportKey(request);
231
231
  const existing = this.state.exports.get(key);
232
232
  if (existing) {
233
- if (!sameExportServerAuthorizationIdentityV1(existing.authorizationIdentity, authorizationIdentity)) return {
233
+ if (existing.ownershipGeneration !== ownershipGeneration || !sameExportServerAuthorizationIdentityV1(existing.authorizationIdentity, authorizationIdentity)) return {
234
234
  kind: "completed",
235
235
  value: authorizationConflict("export_authorization_conflict", "Export authorization owner changed for an existing request")
236
236
  };
@@ -266,12 +266,18 @@ var InMemoryRouterAbEd25519YaoExportService = class {
266
266
  request,
267
267
  authorizationFingerprint,
268
268
  authorizationIdentity,
269
+ ownershipGeneration,
269
270
  factorRelease
270
271
  });
271
272
  return { kind: "authorized" };
272
273
  }
273
- readAuthorizationIdentity(request) {
274
- return this.state.exports.get(exportKey(request))?.authorizationIdentity ?? null;
274
+ readAdmissionAuthority(request) {
275
+ const current = this.state.exports.get(exportKey(request));
276
+ if (!current) return null;
277
+ return {
278
+ authorizationIdentity: current.authorizationIdentity,
279
+ ownershipGeneration: current.ownershipGeneration
280
+ };
275
281
  }
276
282
  async prepareAdmitExport(request, _authorizationIdentity) {
277
283
  const key = exportKey(request);
@@ -351,6 +357,7 @@ var InMemoryRouterAbEd25519YaoExportService = class {
351
357
  request: current.request,
352
358
  authorizationFingerprint: current.authorizationFingerprint,
353
359
  authorizationIdentity: current.authorizationIdentity,
360
+ ownershipGeneration: current.ownershipGeneration,
354
361
  factorRelease: current.factorRelease
355
362
  });
356
363
  return {
@@ -412,6 +419,7 @@ var InMemoryRouterAbEd25519YaoExportService = class {
412
419
  request: current.request,
413
420
  authorizationFingerprint: current.authorizationFingerprint,
414
421
  authorizationIdentity: current.authorizationIdentity,
422
+ ownershipGeneration: current.ownershipGeneration,
415
423
  factorRelease: current.factorRelease,
416
424
  receipt: parsed.value
417
425
  });
@@ -436,7 +444,7 @@ var InMemoryRouterAbEd25519YaoExportService = class {
436
444
  try {
437
445
  outcome = {
438
446
  kind: "backend_response",
439
- result: await this.backend.executeExport(request, preparation.claim.admissionRequest, traceContext)
447
+ result: await this.backend.executeExport(request, preparation.claim, traceContext)
440
448
  };
441
449
  } catch (error) {
442
450
  return this.failUncertainExecution(preparation.claim, error);
@@ -470,6 +478,7 @@ var InMemoryRouterAbEd25519YaoExportService = class {
470
478
  request: current.request,
471
479
  authorizationFingerprint: current.authorizationFingerprint,
472
480
  authorizationIdentity: current.authorizationIdentity,
481
+ ownershipGeneration: current.ownershipGeneration,
473
482
  factorRelease: current.factorRelease,
474
483
  receipt: current.receipt,
475
484
  executeFingerprint: canonicalFingerprint(request),
@@ -488,6 +497,7 @@ var InMemoryRouterAbEd25519YaoExportService = class {
488
497
  request: current.request,
489
498
  authorizationFingerprint: current.authorizationFingerprint,
490
499
  authorizationIdentity: current.authorizationIdentity,
500
+ ownershipGeneration: current.ownershipGeneration,
491
501
  factorRelease: current.factorRelease,
492
502
  receipt: current.receipt,
493
503
  executeFingerprint
@@ -500,7 +510,8 @@ var InMemoryRouterAbEd25519YaoExportService = class {
500
510
  exportKey: found.key,
501
511
  sessionId: session,
502
512
  executeFingerprint,
503
- admissionRequest: current.request
513
+ admissionRequest: current.request,
514
+ ownershipGeneration: current.ownershipGeneration
504
515
  }
505
516
  };
506
517
  case "executing": return {
@@ -561,6 +572,7 @@ var InMemoryRouterAbEd25519YaoExportService = class {
561
572
  request: current.request,
562
573
  authorizationFingerprint: current.authorizationFingerprint,
563
574
  authorizationIdentity: current.authorizationIdentity,
575
+ ownershipGeneration: current.ownershipGeneration,
564
576
  factorRelease: current.factorRelease,
565
577
  receipt: current.receipt,
566
578
  executeFingerprint: current.executeFingerprint,
@@ -598,6 +610,7 @@ var InMemoryRouterAbEd25519YaoExportService = class {
598
610
  request: current.request,
599
611
  authorizationFingerprint: current.authorizationFingerprint,
600
612
  authorizationIdentity: current.authorizationIdentity,
613
+ ownershipGeneration: current.ownershipGeneration,
601
614
  factorRelease: current.factorRelease,
602
615
  failure: rejected
603
616
  });
@@ -608,6 +621,7 @@ var InMemoryRouterAbEd25519YaoExportService = class {
608
621
  request: current.request,
609
622
  authorizationFingerprint: current.authorizationFingerprint,
610
623
  authorizationIdentity: current.authorizationIdentity,
624
+ ownershipGeneration: current.ownershipGeneration,
611
625
  factorRelease: current.factorRelease,
612
626
  receipt: current.receipt,
613
627
  executeFingerprint: current.executeFingerprint,
@@ -810,6 +824,7 @@ async function authorizeExportAdmission(args) {
810
824
  });
811
825
  if (!checked.ok) return checked;
812
826
  return await recordFreshExportProof({
827
+ walletId: walletId.value,
813
828
  input: args.input,
814
829
  authority,
815
830
  authorizedOperations: args.authorizedOperations,
@@ -836,6 +851,7 @@ async function authorizeExportAdmission(args) {
836
851
  });
837
852
  if (!checked.ok) return checked;
838
853
  const recorded = await recordFreshExportProof({
854
+ walletId: walletId.value,
839
855
  input: args.input,
840
856
  authority: authority.authority,
841
857
  authorizedOperations: args.authorizedOperations,
@@ -847,18 +863,13 @@ async function authorizeExportAdmission(args) {
847
863
  return {
848
864
  ok: true,
849
865
  admission: recorded.admission,
866
+ walletId: recorded.walletId,
850
867
  factorRelease: checked.factorRelease
851
868
  };
852
869
  }
853
870
  async function recordFreshExportProof(args) {
854
- const walletId = parseWalletId(args.input.body.application_binding.wallet_id);
855
- if (!walletId.ok) return authorizationFailure({
856
- status: 403,
857
- code: "invalid_body",
858
- message: walletId.error.message
859
- });
860
871
  const authorizationIdentitySuffix = base64UrlEncode(Uint8Array.from(args.input.body.authorization.authorization_digest));
861
- const principalId = parsePrincipalId(`ed25519-export:${walletId.value}`);
872
+ const principalId = parsePrincipalId(`ed25519-export:${args.walletId}`);
862
873
  const capabilityId = parseCapabilityId(String(args.input.body.scope.material_activation.capability));
863
874
  const operationId = parseCapabilityOperationId(`ed25519-export:${args.input.body.scope.lifecycle_id}:${authorizationIdentitySuffix}`);
864
875
  const evidenceId = parseAuthorizationEvidenceId(`ed25519-export:evidence:${args.input.body.scope.lifecycle_id}:${authorizationIdentitySuffix}`);
@@ -931,7 +942,7 @@ async function recordFreshExportProof(args) {
931
942
  factor = buildVerifiedWalletOperationPasskeyFactorResult({
932
943
  tenantId: args.authorizedOperations.tenantId,
933
944
  principalId: principalId.value,
934
- walletId: walletId.value,
945
+ walletId: args.walletId,
935
946
  requestOrigin,
936
947
  audience: requestOrigin,
937
948
  factorId: factorId.value,
@@ -948,7 +959,7 @@ async function recordFreshExportProof(args) {
948
959
  factor = buildVerifiedWalletOperationEmailOtpFactorResult({
949
960
  tenantId: args.authorizedOperations.tenantId,
950
961
  principalId: principalId.value,
951
- walletId: walletId.value,
962
+ walletId: args.walletId,
952
963
  requestOrigin,
953
964
  audience: requestOrigin,
954
965
  factorId: factorId.value,
@@ -974,6 +985,7 @@ async function recordFreshExportProof(args) {
974
985
  });
975
986
  return {
976
987
  ok: true,
988
+ walletId: args.walletId,
977
989
  admission: new ExportOperationAdmission(args.authorizedOperations, {
978
990
  tenantId: args.authorizedOperations.tenantId,
979
991
  authorizedOperationId: authorizedOperationId.value,
@@ -1036,12 +1048,13 @@ function exportOwnerProofRejected(code) {
1036
1048
  });
1037
1049
  }
1038
1050
  var RouterAbEd25519YaoExportOwnerProofAuthorizationAdapter = class {
1039
- constructor(webAuthn, emailOtp, walletAuthMethods, authorizedOperations, resolveEd25519MaterialActivation) {
1051
+ constructor(webAuthn, emailOtp, walletAuthMethods, authorizedOperations, resolveEd25519MaterialActivation, admitEstablishedHome) {
1040
1052
  this.webAuthn = webAuthn;
1041
1053
  this.emailOtp = emailOtp;
1042
1054
  this.walletAuthMethods = walletAuthMethods;
1043
1055
  this.authorizedOperations = authorizedOperations;
1044
1056
  this.resolveEd25519MaterialActivation = resolveEd25519MaterialActivation;
1057
+ this.admitEstablishedHome = admitEstablishedHome;
1045
1058
  }
1046
1059
  async authorizeAdmission(input) {
1047
1060
  const activeIdentity = await resolveActiveExportAuthorizationIdentity({
@@ -1056,12 +1069,29 @@ var RouterAbEd25519YaoExportOwnerProofAuthorizationAdapter = class {
1056
1069
  walletAuthMethods: this.walletAuthMethods,
1057
1070
  authorizedOperations: this.authorizedOperations
1058
1071
  });
1059
- return checked.ok ? {
1072
+ if (!checked.ok) return checked;
1073
+ let home;
1074
+ try {
1075
+ home = await this.admitEstablishedHome({ walletId: checked.walletId });
1076
+ } catch {
1077
+ return authorizationFailure({
1078
+ status: 503,
1079
+ code: "wallet_home_unavailable",
1080
+ message: "Export wallet home is unavailable"
1081
+ });
1082
+ }
1083
+ if (!home.ok) return authorizationFailure({
1084
+ status: 409,
1085
+ code: home.code,
1086
+ message: home.message
1087
+ });
1088
+ return {
1060
1089
  ok: true,
1061
1090
  authorizationIdentity: activeIdentity.authorizationIdentity,
1091
+ ownershipGeneration: home.ownershipGeneration,
1062
1092
  admission: checked.admission,
1063
1093
  ...checked.factorRelease ? { factorRelease: checked.factorRelease } : {}
1064
- } : checked;
1094
+ };
1065
1095
  }
1066
1096
  authorizeExecution(input) {
1067
1097
  const thresholdSessionId = parseThresholdEd25519SessionId(input.body.binding.ceremony.lifecycle.session_id);
@@ -1273,7 +1303,7 @@ var RouterAbEd25519YaoExportRouteExtension = class {
1273
1303
  code: authorized.code,
1274
1304
  message: authorized.message
1275
1305
  }, { status: authorized.status });
1276
- const result = await this.service.admitExport(parsed.protocol, authorized.authorizationIdentity, authorized.admission, authorized.factorRelease ?? null, traceContext.value);
1306
+ const result = await this.service.admitExport(parsed.protocol, authorized.authorizationIdentity, authorized.ownershipGeneration, authorized.admission, authorized.factorRelease ?? null, traceContext.value);
1277
1307
  return result.ok ? json({
1278
1308
  protocol: result.value,
1279
1309
  ...authorized.factorRelease ? { factorRelease: authorized.factorRelease } : {}
@@ -85,11 +85,11 @@ var ExportExecutionRequestRun = class {
85
85
  };
86
86
  }
87
87
  }
88
- async backend(_claim) {
88
+ async backend(claim) {
89
89
  try {
90
90
  return {
91
91
  kind: "response",
92
- value: await this.context.input.backend.executeExport(this.request, _claim.admissionRequest, this.context.trace)
92
+ value: await this.context.input.backend.executeExport(this.request, claim, this.context.trace)
93
93
  };
94
94
  } catch (error) {
95
95
  return {
@@ -197,15 +197,16 @@ async function runAuthorization(context, parsed, expectedOrigin) {
197
197
  let loaded = await context.input.store.load(lifecycleId);
198
198
  const service = exportService(context, loaded.state);
199
199
  if (service.authorizationIsUncertain(parsed.protocol)) return authorizationFailure(503, "export_authorization_uncertain", "Export authorization outcome is uncertain and cannot be retried");
200
- const existingIdentity = service.readAuthorizationIdentity(parsed.protocol);
200
+ const existingAuthority = service.readAdmissionAuthority(parsed.protocol);
201
201
  let verified;
202
- if (existingIdentity) {
202
+ if (existingAuthority) {
203
203
  if (parsed.protocol.authorization.expires_at_ms <= Date.now()) return authorizationFailure(403, "export_authorization_expired", "Ed25519 Yao export authorization is expired");
204
204
  const resolved = await context.input.authorization.resolveAuthorizationIdentity(parsed.protocol);
205
205
  if (!resolved.ok) return resolved;
206
- if (!sameAuthorizationIdentity(resolved.authorizationIdentity, existingIdentity)) return authorizationFailure(409, "export_authorization_conflict", "Export authorization owner changed for an existing request");
206
+ if (!sameAuthorizationIdentity(resolved.authorizationIdentity, existingAuthority.authorizationIdentity)) return authorizationFailure(409, "export_authorization_conflict", "Export authorization owner changed for an existing request");
207
207
  verified = {
208
- identity: existingIdentity,
208
+ identity: existingAuthority.authorizationIdentity,
209
+ ownershipGeneration: existingAuthority.ownershipGeneration,
209
210
  admission: null
210
211
  };
211
212
  } else {
@@ -223,15 +224,17 @@ async function runAuthorization(context, parsed, expectedOrigin) {
223
224
  if (!authorized.ok) return authorized;
224
225
  verified = {
225
226
  identity: authorized.authorizationIdentity,
227
+ ownershipGeneration: authorized.ownershipGeneration,
226
228
  admission: authorized.admission,
227
229
  ...authorized.factorRelease ? { factorRelease: authorized.factorRelease } : {}
228
230
  };
229
231
  }
230
232
  const authorizationFingerprint = await authorizationFingerprintForIdentity(parsed, verified.identity);
231
233
  for (let attempt = 1;; attempt += 1) {
232
- const decision = exportService(context, loaded.state).authorizeExport(parsed.protocol, authorizationFingerprint, verified.identity, verified.factorRelease ?? null);
234
+ const decision = exportService(context, loaded.state).authorizeExport(parsed.protocol, authorizationFingerprint, verified.identity, verified.ownershipGeneration, verified.factorRelease ?? null);
233
235
  if (decision.kind === "completed") return decision.value.ok ? authorizedRun({
234
236
  identity: verified.identity,
237
+ ownershipGeneration: verified.ownershipGeneration,
235
238
  admission: verified.admission,
236
239
  ...decision.value.factorRelease ? { factorRelease: decision.value.factorRelease } : {}
237
240
  }) : decision.value;
@@ -36,11 +36,17 @@ function resolveTraceContext(request) {
36
36
  message: parsed.message
37
37
  };
38
38
  }
39
- function recoveryAuthorizationBinding(authorization) {
40
- if (authorization.kind === "wallet_recovery") return authorization;
39
+ function recoveryAuthorizationBinding(admitted) {
40
+ const authorization = admitted.authorization;
41
+ if (authorization.kind === "wallet_recovery") return {
42
+ kind: "wallet_recovery",
43
+ walletId: authorization.walletId,
44
+ ownershipGeneration: admitted.ownershipGeneration
45
+ };
41
46
  const session = authorization.kind === "wallet_session_v2" ? authorization.context.authorization.session : authorization.context.status.session;
42
47
  return {
43
48
  kind: "wallet_session_v2",
49
+ ownershipGeneration: admitted.ownershipGeneration,
44
50
  tenantId: session.tenantId,
45
51
  principalId: session.principalId,
46
52
  walletId: session.walletId,
@@ -160,7 +166,7 @@ function equalBytes(left, right) {
160
166
  return true;
161
167
  }
162
168
  function sameRecoveryAuthorizationBindingV1(left, right) {
163
- if (left.kind !== right.kind) return false;
169
+ if (left.kind !== right.kind || left.ownershipGeneration !== right.ownershipGeneration) return false;
164
170
  switch (left.kind) {
165
171
  case "wallet_recovery": return right.kind === "wallet_recovery" && left.walletId === right.walletId;
166
172
  case "wallet_session_v2": return right.kind === "wallet_session_v2" && left.tenantId === right.tenantId && left.principalId === right.principalId && left.walletId === right.walletId && left.authorityId === right.authorityId && left.walletAuthMethodId === right.walletAuthMethodId && left.mintId === right.mintId && left.authorizationId === right.authorizationId && left.walletSessionId === right.walletSessionId && left.quotaId === right.quotaId;
@@ -649,6 +655,77 @@ function activationReplayResult(state, fingerprint) {
649
655
  default: return assertNever(state);
650
656
  }
651
657
  }
658
+ function resolveRouterAbEd25519YaoActiveCapability(capabilities, input) {
659
+ const walletId = String(input.walletId || "").trim();
660
+ const nearEd25519SigningKeyId = String(input.nearEd25519SigningKeyId || "").trim();
661
+ const signingWorkerId = String(input.signingWorkerId || "").trim();
662
+ const firstParticipantId = input.participantIds?.[0];
663
+ const secondParticipantId = input.participantIds?.[1];
664
+ if (input.kind !== "router_ab_ed25519_yao_active_capability_lookup_v1" || !walletId || !nearEd25519SigningKeyId || !signingWorkerId || !Number.isSafeInteger(input.signerSlot) || input.signerSlot < 1 || !Array.isArray(input.participantIds) || input.participantIds.length !== 2 || !Number.isSafeInteger(firstParticipantId) || !Number.isSafeInteger(secondParticipantId) || Number(firstParticipantId) < 1 || Number(secondParticipantId) < 1 || firstParticipantId === secondParticipantId) return {
665
+ ok: false,
666
+ code: "invalid_lookup",
667
+ message: "active Ed25519 Yao capability lookup is invalid"
668
+ };
669
+ let matched = null;
670
+ for (const state of capabilities.values()) {
671
+ if (state.kind !== "active") continue;
672
+ const identity = state.identity;
673
+ if (identity.applicationBinding.wallet_id !== walletId || identity.applicationBinding.near_ed25519_signing_key_id !== nearEd25519SigningKeyId || identity.applicationBinding.key_creation_signer_slot !== input.signerSlot || identity.activationBinding.lifecycle.selected_server_id !== signingWorkerId || identity.participantIds[0] !== firstParticipantId || identity.participantIds[1] !== secondParticipantId) continue;
674
+ if (matched) return {
675
+ ok: false,
676
+ code: "capability_conflict",
677
+ message: "multiple active Ed25519 Yao capabilities match the wallet identity"
678
+ };
679
+ matched = identity;
680
+ }
681
+ if (!matched) return {
682
+ ok: false,
683
+ code: "unknown_capability",
684
+ message: "active Ed25519 Yao capability was not found"
685
+ };
686
+ const lifecycle = matched.activationBinding.lifecycle;
687
+ return {
688
+ ok: true,
689
+ capability: {
690
+ kind: "router_ab_ed25519_yao_active_capability_v1",
691
+ materialActivation: matched.activationBinding.material_activation,
692
+ activeCapabilityBinding: [...matched.capabilityBinding],
693
+ registeredPublicKey: [...matched.registeredPublicKey],
694
+ nearAccountId: matched.nearAccountId,
695
+ applicationBinding: {
696
+ wallet_id: matched.applicationBinding.wallet_id,
697
+ near_ed25519_signing_key_id: matched.applicationBinding.near_ed25519_signing_key_id,
698
+ signing_root_id: matched.applicationBinding.signing_root_id,
699
+ key_creation_signer_slot: matched.applicationBinding.key_creation_signer_slot
700
+ },
701
+ runtimePolicyScope: {
702
+ orgId: matched.runtimePolicyScope.orgId,
703
+ projectId: matched.runtimePolicyScope.projectId,
704
+ envId: matched.runtimePolicyScope.envId,
705
+ signingRootVersion: matched.runtimePolicyScope.signingRootVersion
706
+ },
707
+ participantIds: [matched.participantIds[0], matched.participantIds[1]],
708
+ lifecycle: {
709
+ lifecycleId: lifecycle.lifecycle_id,
710
+ rootShareEpoch: lifecycle.root_share_epoch,
711
+ accountId: lifecycle.account_id,
712
+ thresholdSessionId: requireThresholdEd25519SessionId(lifecycle.session_id, "active capability threshold session identity"),
713
+ signerSetId: lifecycle.signer_set_id,
714
+ signingWorkerId: lifecycle.selected_server_id
715
+ },
716
+ stateEpoch: matched.stateEpoch,
717
+ registrationContinuity: matched.persisted.version === "wallet_ed25519_yao_registration_capability_v1" ? {
718
+ kind: "registration",
719
+ admissionRequest: matched.persisted.admissionRequest,
720
+ admissionReceipt: matched.persisted.admissionReceipt,
721
+ activationTranscript: [...matched.persisted.activationResult.public_receipt.transcript]
722
+ } : {
723
+ kind: "recovery",
724
+ activationTranscript: [...matched.persisted.activationResult.public_receipt.transcript]
725
+ }
726
+ }
727
+ };
728
+ }
652
729
  var InMemoryRouterAbEd25519YaoRecoveryService = class {
653
730
  constructor(backend, state = new InMemoryRouterAbEd25519YaoRecoveryStateV1(), capabilityPersistence = new EphemeralRouterAbEd25519YaoCapabilityPersistenceV1()) {
654
731
  this.backend = backend;
@@ -711,75 +788,7 @@ var InMemoryRouterAbEd25519YaoRecoveryService = class {
711
788
  return capabilityInstallResult("installed", identity);
712
789
  }
713
790
  resolveActiveCapability(input) {
714
- const walletId = String(input.walletId || "").trim();
715
- const nearEd25519SigningKeyId = String(input.nearEd25519SigningKeyId || "").trim();
716
- const signingWorkerId = String(input.signingWorkerId || "").trim();
717
- const firstParticipantId = input.participantIds?.[0];
718
- const secondParticipantId = input.participantIds?.[1];
719
- if (input.kind !== "router_ab_ed25519_yao_active_capability_lookup_v1" || !walletId || !nearEd25519SigningKeyId || !signingWorkerId || !Number.isSafeInteger(input.signerSlot) || input.signerSlot < 1 || !Array.isArray(input.participantIds) || input.participantIds.length !== 2 || !Number.isSafeInteger(firstParticipantId) || !Number.isSafeInteger(secondParticipantId) || Number(firstParticipantId) < 1 || Number(secondParticipantId) < 1 || firstParticipantId === secondParticipantId) return {
720
- ok: false,
721
- code: "invalid_lookup",
722
- message: "active Ed25519 Yao capability lookup is invalid"
723
- };
724
- let matched = null;
725
- for (const state of this.capabilities.values()) {
726
- if (state.kind !== "active") continue;
727
- const identity = state.identity;
728
- if (identity.applicationBinding.wallet_id !== walletId || identity.applicationBinding.near_ed25519_signing_key_id !== nearEd25519SigningKeyId || identity.applicationBinding.key_creation_signer_slot !== input.signerSlot || identity.activationBinding.lifecycle.selected_server_id !== signingWorkerId || identity.participantIds[0] !== firstParticipantId || identity.participantIds[1] !== secondParticipantId) continue;
729
- if (matched) return {
730
- ok: false,
731
- code: "capability_conflict",
732
- message: "multiple active Ed25519 Yao capabilities match the wallet identity"
733
- };
734
- matched = identity;
735
- }
736
- if (!matched) return {
737
- ok: false,
738
- code: "unknown_capability",
739
- message: "active Ed25519 Yao capability was not found"
740
- };
741
- const lifecycle = matched.activationBinding.lifecycle;
742
- return {
743
- ok: true,
744
- capability: {
745
- kind: "router_ab_ed25519_yao_active_capability_v1",
746
- materialActivation: matched.activationBinding.material_activation,
747
- activeCapabilityBinding: [...matched.capabilityBinding],
748
- registeredPublicKey: [...matched.registeredPublicKey],
749
- nearAccountId: matched.nearAccountId,
750
- applicationBinding: {
751
- wallet_id: matched.applicationBinding.wallet_id,
752
- near_ed25519_signing_key_id: matched.applicationBinding.near_ed25519_signing_key_id,
753
- signing_root_id: matched.applicationBinding.signing_root_id,
754
- key_creation_signer_slot: matched.applicationBinding.key_creation_signer_slot
755
- },
756
- runtimePolicyScope: {
757
- orgId: matched.runtimePolicyScope.orgId,
758
- projectId: matched.runtimePolicyScope.projectId,
759
- envId: matched.runtimePolicyScope.envId,
760
- signingRootVersion: matched.runtimePolicyScope.signingRootVersion
761
- },
762
- participantIds: [matched.participantIds[0], matched.participantIds[1]],
763
- lifecycle: {
764
- lifecycleId: lifecycle.lifecycle_id,
765
- rootShareEpoch: lifecycle.root_share_epoch,
766
- accountId: lifecycle.account_id,
767
- thresholdSessionId: requireThresholdEd25519SessionId(lifecycle.session_id, "active capability threshold session identity"),
768
- signerSetId: lifecycle.signer_set_id,
769
- signingWorkerId: lifecycle.selected_server_id
770
- },
771
- stateEpoch: matched.stateEpoch,
772
- registrationContinuity: matched.persisted.version === "wallet_ed25519_yao_registration_capability_v1" ? {
773
- kind: "registration",
774
- admissionRequest: matched.persisted.admissionRequest,
775
- admissionReceipt: matched.persisted.admissionReceipt,
776
- activationTranscript: [...matched.persisted.activationResult.public_receipt.transcript]
777
- } : {
778
- kind: "recovery",
779
- activationTranscript: [...matched.persisted.activationResult.public_receipt.transcript]
780
- }
781
- }
782
- };
791
+ return resolveRouterAbEd25519YaoActiveCapability(this.capabilities, input);
783
792
  }
784
793
  async admitRecovery(request, authorization, traceContext) {
785
794
  const dispatchRoot = await this.backend.resolveRecoveryDispatchRoot(request);
@@ -998,7 +1007,7 @@ var InMemoryRouterAbEd25519YaoRecoveryService = class {
998
1007
  try {
999
1008
  outcome = {
1000
1009
  kind: "backend_response",
1001
- result: await this.backend.executeRecovery(request, preparation.claim.admissionRequest, preparation.claim.dispatchRoot, preparation.claim.attempt, preparation.claim.replay, traceContext)
1010
+ result: await this.backend.executeRecovery(request, preparation.claim, traceContext)
1002
1011
  };
1003
1012
  } catch (error) {
1004
1013
  return this.failUncertainExecution(preparation.claim, error);
@@ -1011,6 +1020,19 @@ var InMemoryRouterAbEd25519YaoRecoveryService = class {
1011
1020
  }
1012
1021
  }
1013
1022
  }
1023
+ recoveryOwnershipGeneration(binding) {
1024
+ const state = this.stateForSession(binding.session_id);
1025
+ if (!state) return recoveryFailure({
1026
+ status: 404,
1027
+ code: "unknown_recovery",
1028
+ message: "Recovery admission was not found"
1029
+ });
1030
+ return {
1031
+ ok: true,
1032
+ status: 200,
1033
+ value: state.context.authorization.ownershipGeneration
1034
+ };
1035
+ }
1014
1036
  prepareExecuteRecovery(request, authorization, nowMs) {
1015
1037
  const parsed = parseRouterAbEd25519YaoRecoveryActivationExecuteRequestV1(request);
1016
1038
  if (!parsed.ok) return {
@@ -1063,6 +1085,7 @@ var InMemoryRouterAbEd25519YaoRecoveryService = class {
1063
1085
  kind: "claimed",
1064
1086
  claim: {
1065
1087
  kind: "router_ab_ed25519_yao_recovery_execute_claim_v1",
1088
+ ownershipGeneration: claimed.context.authorization.ownershipGeneration,
1066
1089
  lifecycleId: executionRequest.binding.lifecycle.lifecycle_id,
1067
1090
  recoveryKey: claimed.context.recoveryKey,
1068
1091
  sessionId,
@@ -1174,7 +1197,7 @@ var InMemoryRouterAbEd25519YaoRecoveryService = class {
1174
1197
  try {
1175
1198
  outcome = {
1176
1199
  kind: "backend_response",
1177
- result: await this.backend.activateRecovery(request, preparation.claim.dispatchRoot, traceContext)
1200
+ result: await this.backend.activateRecovery(request, preparation.claim.dispatchRoot, preparation.claim.ownershipGeneration, traceContext)
1178
1201
  };
1179
1202
  } catch (error) {
1180
1203
  return this.activationUncertainFailure(error);
@@ -1438,6 +1461,7 @@ var InMemoryRouterAbEd25519YaoRecoveryService = class {
1438
1461
  activationClaim(state, authorityProjection, disposition) {
1439
1462
  return {
1440
1463
  kind: "router_ab_ed25519_yao_recovery_activation_claim_v1",
1464
+ ownershipGeneration: state.context.authorization.ownershipGeneration,
1441
1465
  lifecycleId: state.context.admissionRequest.scope.lifecycle_id,
1442
1466
  recoveryKey: state.context.recoveryKey,
1443
1467
  sessionId: bytesToHex(state.admissionReceipt.binding.session_id),
@@ -1700,7 +1724,7 @@ var RouterAbEd25519YaoRecoveryRouteExtension = class {
1700
1724
  body: parsed.value
1701
1725
  });
1702
1726
  if (!authorization.ok) return routeFailureResponse(authorization);
1703
- const result = await this.service.admitRecovery(parsed.value, recoveryAuthorizationBinding(authorization.authorization), traceContext.value);
1727
+ const result = await this.service.admitRecovery(parsed.value, recoveryAuthorizationBinding(authorization), traceContext.value);
1704
1728
  if (!result.ok) return routeFailureResponse(result);
1705
1729
  return json(result.value, { status: result.status });
1706
1730
  }
@@ -1717,13 +1741,16 @@ var RouterAbEd25519YaoRecoveryRouteExtension = class {
1717
1741
  code: parsed.code,
1718
1742
  message: parsed.message
1719
1743
  }, { status: 400 });
1744
+ const ownership = this.service.recoveryOwnershipGeneration(parsed.value.binding);
1745
+ if (!ownership.ok) return routeFailureResponse(ownership);
1720
1746
  const authorization = await this.authorization.authorize({
1721
1747
  kind: "execute",
1748
+ ownershipGeneration: ownership.value,
1722
1749
  request,
1723
1750
  body: parsed.value
1724
1751
  });
1725
1752
  if (!authorization.ok) return routeFailureResponse(authorization);
1726
- const result = await this.service.executeRecovery(parsed.value, recoveryAuthorizationBinding(authorization.authorization), traceContext.value);
1753
+ const result = await this.service.executeRecovery(parsed.value, recoveryAuthorizationBinding(authorization), traceContext.value);
1727
1754
  if (!result.ok) return routeFailureResponse(result);
1728
1755
  return json(result.value, { status: result.status });
1729
1756
  }
@@ -1740,13 +1767,16 @@ var RouterAbEd25519YaoRecoveryRouteExtension = class {
1740
1767
  code: parsed.code,
1741
1768
  message: parsed.message
1742
1769
  }, { status: 400 });
1770
+ const ownership = this.service.recoveryOwnershipGeneration(parsed.value.binding);
1771
+ if (!ownership.ok) return routeFailureResponse(ownership);
1743
1772
  const authorization = await this.authorization.authorize({
1744
1773
  kind: "activate",
1774
+ ownershipGeneration: ownership.value,
1745
1775
  request,
1746
1776
  body: parsed.value
1747
1777
  });
1748
1778
  if (!authorization.ok) return routeFailureResponse(authorization);
1749
- const result = await this.service.activateRecovery(parsed.value, recoveryAuthorizationBinding(authorization.authorization), traceContext.value);
1779
+ const result = await this.service.activateRecovery(parsed.value, recoveryAuthorizationBinding(authorization), traceContext.value);
1750
1780
  if (!result.ok) return routeFailureResponse(result);
1751
1781
  return json(result.value, { status: result.status });
1752
1782
  }
@@ -1758,6 +1788,6 @@ function createRouterAbEd25519YaoRecoveryModule(input) {
1758
1788
  });
1759
1789
  }
1760
1790
  //#endregion
1761
- export { InMemoryRouterAbEd25519YaoRecoveryService, InMemoryRouterAbEd25519YaoRecoveryStateV1, buildRouterAbEd25519YaoRegistrationCapabilityRecordV1, buildWarmRecoveryBootstrapResponse, createRouterAbEd25519YaoRecoveryModule, recoveryAuthorityProjection, recoveryAuthorizationBinding };
1791
+ export { InMemoryRouterAbEd25519YaoRecoveryService, InMemoryRouterAbEd25519YaoRecoveryStateV1, buildRouterAbEd25519YaoRegistrationCapabilityRecordV1, buildWarmRecoveryBootstrapResponse, createRouterAbEd25519YaoRecoveryModule, recoveryAuthorityProjection, recoveryAuthorizationBinding, resolveRouterAbEd25519YaoActiveCapability };
1762
1792
 
1763
1793
  //# sourceMappingURL=routerAbEd25519YaoRecovery.js.map
@@ -20,7 +20,7 @@ var RecoveryAdmissionRequestRun = class {
20
20
  kind: "rejected",
21
21
  value: authorized
22
22
  };
23
- const prepared = this.service(state).prepareAdmitRecovery(this.request, recoveryAuthorizationBinding(authorized.authorization), await this.context.input.backend.resolveRecoveryDispatchRoot(this.request), Date.now());
23
+ const prepared = this.service(state).prepareAdmitRecovery(this.request, recoveryAuthorizationBinding(authorized), await this.context.input.backend.resolveRecoveryDispatchRoot(this.request), Date.now());
24
24
  if (prepared.kind !== "failed") {
25
25
  const published = await publishWalletLifecycleHome(this.context.input.lifecycleRouting ?? null, "yao_recovery", this.request);
26
26
  if (!published.ok) return {
@@ -85,8 +85,15 @@ var RecoveryExecutionRequestRun = class {
85
85
  this.request = request;
86
86
  }
87
87
  async prepare(state) {
88
+ const service = this.service(state);
89
+ const ownership = service.recoveryOwnershipGeneration(this.request.binding);
90
+ if (!ownership.ok) return {
91
+ kind: "rejected",
92
+ value: ownership
93
+ };
88
94
  const authorized = await this.context.input.authorization.authorize({
89
95
  kind: "execute",
96
+ ownershipGeneration: ownership.value,
90
97
  request: this.context.input.request,
91
98
  body: this.request
92
99
  });
@@ -94,7 +101,7 @@ var RecoveryExecutionRequestRun = class {
94
101
  kind: "rejected",
95
102
  value: authorized
96
103
  };
97
- const prepared = this.service(state).prepareExecuteRecovery(this.request, recoveryAuthorizationBinding(authorized.authorization), Date.now());
104
+ const prepared = service.prepareExecuteRecovery(this.request, recoveryAuthorizationBinding(authorized), Date.now());
98
105
  switch (prepared.kind) {
99
106
  case "claimed": return {
100
107
  kind: "claimed",
@@ -119,7 +126,7 @@ var RecoveryExecutionRequestRun = class {
119
126
  try {
120
127
  return {
121
128
  kind: "response",
122
- value: await this.context.input.backend.executeRecovery(this.request, claim.admissionRequest, claim.dispatchRoot, claim.attempt, claim.replay, this.context.trace)
129
+ value: await this.context.input.backend.executeRecovery(this.request, claim, this.context.trace)
123
130
  };
124
131
  } catch (error) {
125
132
  return {
@@ -152,8 +159,15 @@ var RecoveryActivationRequestRun = class {
152
159
  this.request = request;
153
160
  }
154
161
  async prepare(state) {
162
+ const service = this.service(state);
163
+ const ownership = service.recoveryOwnershipGeneration(this.request.binding);
164
+ if (!ownership.ok) return {
165
+ kind: "rejected",
166
+ value: ownership
167
+ };
155
168
  const authorized = await this.context.input.authorization.authorize({
156
169
  kind: "activate",
170
+ ownershipGeneration: ownership.value,
157
171
  request: this.context.input.request,
158
172
  body: this.request
159
173
  });
@@ -161,7 +175,7 @@ var RecoveryActivationRequestRun = class {
161
175
  kind: "rejected",
162
176
  value: authorized
163
177
  };
164
- const prepared = this.service(state).prepareActivateRecovery(this.request, recoveryAuthorizationBinding(authorized.authorization));
178
+ const prepared = service.prepareActivateRecovery(this.request, recoveryAuthorizationBinding(authorized));
165
179
  switch (prepared.kind) {
166
180
  case "claimed": return {
167
181
  kind: "claimed",
@@ -186,7 +200,7 @@ var RecoveryActivationRequestRun = class {
186
200
  try {
187
201
  return {
188
202
  kind: "response",
189
- value: await this.context.input.backend.activateRecovery(this.request, claim.dispatchRoot, this.context.trace)
203
+ value: await this.context.input.backend.activateRecovery(this.request, claim.dispatchRoot, claim.ownershipGeneration, this.context.trace)
190
204
  };
191
205
  } catch (error) {
192
206
  return {