@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
@@ -0,0 +1,406 @@
1
+ -- A temporary wallet-local fence protects the final capacity check.
2
+ CREATE TABLE wallet_relocation_write_blocks (
3
+ namespace TEXT NOT NULL, org_id TEXT NOT NULL, project_id TEXT NOT NULL, env_id TEXT NOT NULL,
4
+ wallet_id TEXT NOT NULL, move_id TEXT NOT NULL, request_digest_hex TEXT NOT NULL,
5
+ source_generation INTEGER NOT NULL,
6
+ state TEXT NOT NULL CHECK (state IN ('draining', 'checked', 'released', 'frozen')),
7
+ started_at_ms INTEGER NOT NULL,
8
+ PRIMARY KEY (namespace, org_id, project_id, env_id, wallet_id, move_id)
9
+ );
10
+ CREATE UNIQUE INDEX wallet_relocation_write_block_active ON wallet_relocation_write_blocks
11
+ (namespace, org_id, project_id, env_id, wallet_id) WHERE state IN ('draining', 'checked');
12
+
13
+ DROP TRIGGER wallet_relocation_authorization_fences_retired;
14
+ CREATE TRIGGER wallet_relocation_authorization_fences_retired
15
+ BEFORE INSERT ON wallet_relocation_authorization_fences
16
+ WHEN (EXISTS (
17
+ SELECT 1 FROM wallet_relocation_authorization_fences AS existing
18
+ WHERE existing.namespace = NEW.namespace AND existing.org_id = NEW.org_id
19
+ AND existing.project_id = NEW.project_id AND existing.env_id = NEW.env_id
20
+ AND existing.wallet_id = NEW.wallet_id
21
+ ) OR NOT EXISTS (
22
+ SELECT 1 FROM wallet_relocation_session_fences AS retired
23
+ WHERE retired.namespace = NEW.namespace AND retired.org_id = NEW.org_id
24
+ AND retired.project_id = NEW.project_id AND retired.env_id = NEW.env_id
25
+ AND retired.wallet_id = NEW.wallet_id AND retired.move_id = NEW.move_id
26
+ AND retired.request_digest_hex = NEW.request_digest_hex
27
+ AND retired.source_generation = NEW.source_generation
28
+ AND retired.retired_at_ms <= NEW.frozen_at_ms
29
+ ) OR EXISTS (
30
+ SELECT 1 FROM wallet_session_authorizations_v2 AS session
31
+ WHERE session.namespace = NEW.namespace AND session.org_id = NEW.org_id
32
+ AND session.project_id = NEW.project_id AND session.env_id = NEW.env_id
33
+ AND session.wallet_id = NEW.wallet_id AND session.retired_at_ms IS NULL
34
+ ) OR EXISTS (
35
+ SELECT 1 FROM wallet_session_hosted_credentials_v2 AS credential
36
+ WHERE credential.namespace = NEW.namespace AND credential.org_id = NEW.org_id
37
+ AND credential.project_id = NEW.project_id AND credential.env_id = NEW.env_id
38
+ AND credential.wallet_id = NEW.wallet_id AND credential.lifecycle_kind = 'active'
39
+ )) AND NOT EXISTS (
40
+ SELECT 1 FROM wallet_relocation_write_blocks AS block
41
+ JOIN wallet_execution_generations AS execution USING (namespace, org_id, project_id, env_id, wallet_id)
42
+ WHERE block.namespace = NEW.namespace AND block.org_id = NEW.org_id
43
+ AND block.project_id = NEW.project_id AND block.env_id = NEW.env_id
44
+ AND block.wallet_id = NEW.wallet_id AND block.move_id = NEW.move_id
45
+ AND block.request_digest_hex = NEW.request_digest_hex AND block.source_generation = NEW.source_generation
46
+ AND block.state = 'draining' AND execution.state = 'active' AND execution.generation = block.source_generation
47
+ AND NOT EXISTS (SELECT 1 FROM wallet_pending_operations AS pending
48
+ WHERE pending.namespace = block.namespace AND pending.org_id = block.org_id
49
+ AND pending.project_id = block.project_id AND pending.env_id = block.env_id AND pending.wallet_id = block.wallet_id)
50
+ AND NOT EXISTS (SELECT 1 FROM wallet_ceremony_activity AS pending
51
+ WHERE pending.namespace = block.namespace AND pending.org_id = block.org_id
52
+ AND pending.project_id = block.project_id AND pending.env_id = block.env_id
53
+ AND pending.wallet_id = block.wallet_id AND pending.settled = 0)
54
+ )
55
+ BEGIN
56
+ SELECT RAISE(ABORT, 'wallet_authorization_freeze_requires_retirement');
57
+ END;
58
+
59
+ DROP TRIGGER wallet_relocation_authorization_fences_retain;
60
+ CREATE TRIGGER wallet_relocation_authorization_fences_retain
61
+ BEFORE DELETE ON wallet_relocation_authorization_fences
62
+ WHEN (NOT EXISTS (
63
+ SELECT 1 FROM wallet_relocation_authorization_returns AS returned
64
+ WHERE returned.namespace = OLD.namespace AND returned.org_id = OLD.org_id
65
+ AND returned.project_id = OLD.project_id AND returned.env_id = OLD.env_id
66
+ AND returned.wallet_id = OLD.wallet_id AND OLD.source_generation = returned.retired_generation
67
+ AND OLD.move_id = returned.previous_move_id
68
+ AND OLD.request_digest_hex = returned.previous_request_digest_hex
69
+ )) AND NOT EXISTS (
70
+ SELECT 1 FROM wallet_relocation_write_blocks AS block
71
+ WHERE block.namespace = OLD.namespace AND block.org_id = OLD.org_id
72
+ AND block.project_id = OLD.project_id AND block.env_id = OLD.env_id AND block.wallet_id = OLD.wallet_id
73
+ AND block.move_id = OLD.move_id AND block.request_digest_hex = OLD.request_digest_hex
74
+ AND block.source_generation = OLD.source_generation AND block.state IN ('released', 'checked')
75
+ AND NOT EXISTS (SELECT 1 FROM wallet_relocation_session_fences AS retired
76
+ WHERE retired.namespace = block.namespace AND retired.org_id = block.org_id
77
+ AND retired.project_id = block.project_id AND retired.env_id = block.env_id AND retired.wallet_id = block.wallet_id)
78
+ )
79
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_fence_retained'); END;
80
+
81
+ CREATE TRIGGER wallet_ceremony_activity_relocation_write_block BEFORE INSERT ON wallet_ceremony_activity
82
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_write_blocks block
83
+ WHERE block.namespace = NEW.namespace AND block.org_id = NEW.org_id
84
+ AND block.project_id = NEW.project_id AND block.env_id = NEW.env_id AND block.wallet_id = NEW.wallet_id
85
+ AND block.state IN ('draining', 'checked')) AND NEW.settled = 0 AND NOT EXISTS (SELECT 1 FROM wallet_ceremony_activity existing WHERE existing.namespace = NEW.namespace AND existing.org_id = NEW.org_id AND existing.project_id = NEW.project_id AND existing.env_id = NEW.env_id AND existing.record_key = NEW.record_key AND existing.wallet_id = NEW.wallet_id AND existing.settled = 0)
86
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
87
+
88
+ CREATE TRIGGER wallet_operations_write_block
89
+ BEFORE INSERT ON authorized_operations
90
+ WHEN EXISTS (
91
+ SELECT 1 FROM (SELECT * FROM wallet_relocation_write_blocks WHERE state IN ('draining', 'checked')) AS fence
92
+ JOIN (SELECT owner.namespace, owner.org_id, owner.project_id, owner.env_id, owner.wallet_id
93
+ FROM wallet_operation_authorizations AS owner
94
+ WHERE owner.namespace = NEW.namespace AND owner.tenant_id = NEW.tenant_id
95
+ AND owner.source_kind = NEW.authorization_source_kind
96
+ AND owner.source_id = CASE NEW.authorization_source_kind
97
+ WHEN 'authorization_grant' THEN NEW.authorization_id ELSE NEW.evidence_set_digest END
98
+ AND (NEW.authorization_source_kind = 'verified_step_up' OR
99
+ (NEW.authorization_grant_kind = 'wallet_session_authorization'
100
+ AND owner.org_id = NEW.owner_scope_org_id AND owner.project_id = NEW.owner_scope_project_id
101
+ AND owner.env_id = NEW.owner_scope_env_id))) AS selected ON selected.namespace = fence.namespace
102
+ AND selected.org_id = fence.org_id AND selected.project_id = fence.project_id AND selected.env_id = fence.env_id
103
+ AND selected.wallet_id = fence.wallet_id
104
+ )
105
+ BEGIN
106
+ SELECT RAISE(ABORT, 'authorization_evidence_claim_rejected')
107
+ WHERE NEW.authorization_source_kind = 'verified_step_up';
108
+ SELECT RAISE(ABORT, 'authorization_wallet_session_rejected')
109
+ WHERE NEW.authorization_source_kind IS NOT 'verified_step_up';
110
+ END;
111
+
112
+ CREATE TRIGGER linked_device_sessions_capacity_insert BEFORE INSERT ON linked_device_sessions
113
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
114
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
115
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = NEW.namespace AND fence.org_id = NEW.org_id
116
+ AND fence.project_id = NEW.project_id AND fence.env_id = NEW.env_id
117
+ AND fence.wallet_id = json_extract(NEW.record_json, '$.claimTranscript.value.walletId'))
118
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
119
+
120
+ CREATE TRIGGER linked_device_sessions_capacity_update BEFORE UPDATE ON linked_device_sessions
121
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
122
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
123
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
124
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
125
+ AND fence.wallet_id = json_extract(OLD.record_json, '$.claimTranscript.value.walletId'))
126
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
127
+
128
+ CREATE TRIGGER linked_device_sessions_capacity_delete BEFORE DELETE ON linked_device_sessions
129
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
130
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
131
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
132
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
133
+ AND fence.wallet_id = json_extract(OLD.record_json, '$.claimTranscript.value.walletId'))
134
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
135
+
136
+ CREATE TRIGGER linked_device_authority_allocations_capacity_insert BEFORE INSERT ON linked_device_authority_allocations
137
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
138
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
139
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = NEW.namespace AND fence.org_id = NEW.org_id
140
+ AND fence.project_id = NEW.project_id AND fence.env_id = NEW.env_id
141
+ AND fence.wallet_id = NEW.wallet_id)
142
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
143
+
144
+ CREATE TRIGGER linked_device_authority_allocations_capacity_update BEFORE UPDATE ON linked_device_authority_allocations
145
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
146
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
147
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
148
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
149
+ AND fence.wallet_id = OLD.wallet_id)
150
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
151
+
152
+ CREATE TRIGGER linked_device_authority_allocations_capacity_delete BEFORE DELETE ON linked_device_authority_allocations
153
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
154
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
155
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
156
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
157
+ AND fence.wallet_id = OLD.wallet_id)
158
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
159
+
160
+ CREATE TRIGGER linked_device_authority_installations_capacity_insert BEFORE INSERT ON linked_device_authority_installations
161
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
162
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
163
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = NEW.namespace AND fence.org_id = NEW.org_id
164
+ AND fence.project_id = NEW.project_id AND fence.env_id = NEW.env_id
165
+ AND fence.wallet_id = NEW.wallet_id)
166
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
167
+
168
+ CREATE TRIGGER linked_device_authority_installations_capacity_update BEFORE UPDATE ON linked_device_authority_installations
169
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
170
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
171
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
172
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
173
+ AND fence.wallet_id = OLD.wallet_id)
174
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
175
+
176
+ CREATE TRIGGER linked_device_authority_installations_capacity_delete BEFORE DELETE ON linked_device_authority_installations
177
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
178
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
179
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
180
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
181
+ AND fence.wallet_id = OLD.wallet_id)
182
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
183
+
184
+ CREATE TRIGGER linked_device_target_credentials_capacity_insert BEFORE INSERT ON linked_device_target_credentials
185
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
186
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
187
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = NEW.namespace AND fence.org_id = NEW.org_id
188
+ AND fence.project_id = NEW.project_id AND fence.env_id = NEW.env_id
189
+ AND fence.wallet_id = NEW.wallet_id)
190
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
191
+
192
+ CREATE TRIGGER linked_device_target_credentials_capacity_update BEFORE UPDATE ON linked_device_target_credentials
193
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
194
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
195
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
196
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
197
+ AND fence.wallet_id = OLD.wallet_id)
198
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
199
+
200
+ CREATE TRIGGER linked_device_target_credentials_capacity_delete BEFORE DELETE ON linked_device_target_credentials
201
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
202
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
203
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
204
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
205
+ AND fence.wallet_id = OLD.wallet_id)
206
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
207
+
208
+ CREATE TRIGGER linked_device_target_commit_reservations_capacity_insert BEFORE INSERT ON linked_device_target_commit_reservations
209
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
210
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
211
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = NEW.namespace AND fence.org_id = NEW.org_id
212
+ AND fence.project_id = NEW.project_id AND fence.env_id = NEW.env_id
213
+ AND fence.wallet_id = (SELECT json_extract(parent.record_json, '$.claimTranscript.value.walletId') FROM linked_device_sessions AS parent WHERE parent.namespace = NEW.namespace AND parent.org_id = NEW.org_id AND parent.project_id = NEW.project_id AND parent.env_id = NEW.env_id AND parent.link_session_id = NEW.link_session_id))
214
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
215
+
216
+ CREATE TRIGGER linked_device_target_commit_reservations_capacity_update BEFORE UPDATE ON linked_device_target_commit_reservations
217
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
218
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
219
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
220
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
221
+ AND fence.wallet_id = (SELECT json_extract(parent.record_json, '$.claimTranscript.value.walletId') FROM linked_device_sessions AS parent WHERE parent.namespace = OLD.namespace AND parent.org_id = OLD.org_id AND parent.project_id = OLD.project_id AND parent.env_id = OLD.env_id AND parent.link_session_id = OLD.link_session_id))
222
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
223
+
224
+ CREATE TRIGGER linked_device_target_commit_reservations_capacity_delete BEFORE DELETE ON linked_device_target_commit_reservations
225
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
226
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
227
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
228
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
229
+ AND fence.wallet_id = (SELECT json_extract(parent.record_json, '$.claimTranscript.value.walletId') FROM linked_device_sessions AS parent WHERE parent.namespace = OLD.namespace AND parent.org_id = OLD.org_id AND parent.project_id = OLD.project_id AND parent.env_id = OLD.env_id AND parent.link_session_id = OLD.link_session_id))
230
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
231
+
232
+ CREATE TRIGGER linked_device_session_transcripts_capacity_insert BEFORE INSERT ON linked_device_session_transcripts
233
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
234
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
235
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = NEW.namespace AND fence.org_id = NEW.org_id
236
+ AND fence.project_id = NEW.project_id AND fence.env_id = NEW.env_id
237
+ AND fence.wallet_id = (SELECT json_extract(parent.record_json, '$.claimTranscript.value.walletId') FROM linked_device_sessions AS parent WHERE parent.namespace = NEW.namespace AND parent.org_id = NEW.org_id AND parent.project_id = NEW.project_id AND parent.env_id = NEW.env_id AND parent.link_session_id = NEW.link_session_id))
238
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
239
+
240
+ CREATE TRIGGER linked_device_session_transcripts_capacity_update BEFORE UPDATE ON linked_device_session_transcripts
241
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
242
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
243
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
244
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
245
+ AND fence.wallet_id = (SELECT json_extract(parent.record_json, '$.claimTranscript.value.walletId') FROM linked_device_sessions AS parent WHERE parent.namespace = OLD.namespace AND parent.org_id = OLD.org_id AND parent.project_id = OLD.project_id AND parent.env_id = OLD.env_id AND parent.link_session_id = OLD.link_session_id))
246
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
247
+
248
+ CREATE TRIGGER linked_device_session_transcripts_capacity_delete BEFORE DELETE ON linked_device_session_transcripts
249
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
250
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
251
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
252
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
253
+ AND fence.wallet_id = (SELECT json_extract(parent.record_json, '$.claimTranscript.value.walletId') FROM linked_device_sessions AS parent WHERE parent.namespace = OLD.namespace AND parent.org_id = OLD.org_id AND parent.project_id = OLD.project_id AND parent.env_id = OLD.env_id AND parent.link_session_id = OLD.link_session_id))
254
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
255
+
256
+ CREATE TRIGGER linked_device_ed25519_export_root_transfers_capacity_insert BEFORE INSERT ON linked_device_ed25519_export_root_transfers
257
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
258
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
259
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = NEW.namespace AND fence.org_id = NEW.org_id
260
+ AND fence.project_id = NEW.project_id AND fence.env_id = NEW.env_id
261
+ AND fence.wallet_id = NEW.wallet_id)
262
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
263
+
264
+ CREATE TRIGGER linked_device_ed25519_export_root_transfers_capacity_update BEFORE UPDATE ON linked_device_ed25519_export_root_transfers
265
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
266
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
267
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
268
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
269
+ AND fence.wallet_id = OLD.wallet_id)
270
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
271
+
272
+ CREATE TRIGGER linked_device_ed25519_export_root_transfers_capacity_delete BEFORE DELETE ON linked_device_ed25519_export_root_transfers
273
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
274
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
275
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
276
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
277
+ AND fence.wallet_id = OLD.wallet_id)
278
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
279
+
280
+ CREATE TRIGGER linked_device_email_otp_grants_capacity_insert BEFORE INSERT ON linked_device_email_otp_grants
281
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
282
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
283
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = NEW.namespace AND fence.org_id = NEW.org_id
284
+ AND fence.project_id = NEW.project_id AND fence.env_id = NEW.env_id
285
+ AND fence.wallet_id = NEW.wallet_id)
286
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
287
+
288
+ CREATE TRIGGER linked_device_email_otp_grants_capacity_update BEFORE UPDATE ON linked_device_email_otp_grants
289
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
290
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
291
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
292
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
293
+ AND fence.wallet_id = OLD.wallet_id)
294
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
295
+
296
+ CREATE TRIGGER linked_device_email_otp_grants_capacity_delete BEFORE DELETE ON linked_device_email_otp_grants
297
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
298
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
299
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
300
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
301
+ AND fence.wallet_id = OLD.wallet_id)
302
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
303
+
304
+ CREATE TRIGGER linked_device_request_proof_nonces_capacity_insert BEFORE INSERT ON linked_device_request_proof_nonces
305
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
306
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
307
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = NEW.namespace AND fence.org_id = NEW.org_id
308
+ AND fence.project_id = NEW.project_id AND fence.env_id = NEW.env_id
309
+ AND fence.wallet_id = (SELECT json_extract(parent.record_json, '$.claimTranscript.value.walletId') FROM linked_device_sessions AS parent WHERE parent.namespace = NEW.namespace AND parent.org_id = NEW.org_id AND parent.project_id = NEW.project_id AND parent.env_id = NEW.env_id AND parent.link_session_id = NEW.link_session_id))
310
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
311
+
312
+ CREATE TRIGGER linked_device_request_proof_nonces_capacity_update BEFORE UPDATE ON linked_device_request_proof_nonces
313
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
314
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
315
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
316
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
317
+ AND fence.wallet_id = (SELECT json_extract(parent.record_json, '$.claimTranscript.value.walletId') FROM linked_device_sessions AS parent WHERE parent.namespace = OLD.namespace AND parent.org_id = OLD.org_id AND parent.project_id = OLD.project_id AND parent.env_id = OLD.env_id AND parent.link_session_id = OLD.link_session_id))
318
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
319
+
320
+ CREATE TRIGGER linked_device_request_proof_nonces_capacity_delete BEFORE DELETE ON linked_device_request_proof_nonces
321
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
322
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
323
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
324
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
325
+ AND fence.wallet_id = (SELECT json_extract(parent.record_json, '$.claimTranscript.value.walletId') FROM linked_device_sessions AS parent WHERE parent.namespace = OLD.namespace AND parent.org_id = OLD.org_id AND parent.project_id = OLD.project_id AND parent.env_id = OLD.env_id AND parent.link_session_id = OLD.link_session_id))
326
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
327
+
328
+ CREATE TRIGGER linked_device_bootstrap_imports_capacity_insert BEFORE INSERT ON linked_device_bootstrap_imports
329
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
330
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
331
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = NEW.namespace AND fence.org_id = NEW.org_id
332
+ AND fence.project_id = NEW.project_id AND fence.env_id = NEW.env_id
333
+ AND fence.wallet_id = (SELECT json_extract(parent.record_json, '$.claimTranscript.value.walletId') FROM linked_device_sessions AS parent WHERE parent.namespace = NEW.namespace AND parent.org_id = NEW.org_id AND parent.project_id = NEW.project_id AND parent.env_id = NEW.env_id AND parent.link_session_id = NEW.link_session_id))
334
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
335
+
336
+ CREATE TRIGGER linked_device_bootstrap_imports_capacity_update BEFORE UPDATE ON linked_device_bootstrap_imports
337
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
338
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
339
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
340
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
341
+ AND fence.wallet_id = (SELECT json_extract(parent.record_json, '$.claimTranscript.value.walletId') FROM linked_device_sessions AS parent WHERE parent.namespace = OLD.namespace AND parent.org_id = OLD.org_id AND parent.project_id = OLD.project_id AND parent.env_id = OLD.env_id AND parent.link_session_id = OLD.link_session_id))
342
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
343
+
344
+ CREATE TRIGGER linked_device_bootstrap_imports_capacity_delete BEFORE DELETE ON linked_device_bootstrap_imports
345
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
346
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
347
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
348
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
349
+ AND fence.wallet_id = (SELECT json_extract(parent.record_json, '$.claimTranscript.value.walletId') FROM linked_device_sessions AS parent WHERE parent.namespace = OLD.namespace AND parent.org_id = OLD.org_id AND parent.project_id = OLD.project_id AND parent.env_id = OLD.env_id AND parent.link_session_id = OLD.link_session_id))
350
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
351
+
352
+ CREATE TRIGGER linked_device_wallet_session_credential_deliveries_v1_capacity_insert BEFORE INSERT ON linked_device_wallet_session_credential_deliveries_v1
353
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
354
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
355
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = NEW.namespace AND fence.org_id = NEW.org_id
356
+ AND fence.project_id = NEW.project_id AND fence.env_id = NEW.env_id
357
+ AND fence.wallet_id = NEW.wallet_id)
358
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
359
+
360
+ CREATE TRIGGER linked_device_wallet_session_credential_deliveries_v1_capacity_update BEFORE UPDATE ON linked_device_wallet_session_credential_deliveries_v1
361
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
362
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
363
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
364
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
365
+ AND fence.wallet_id = OLD.wallet_id)
366
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
367
+
368
+ CREATE TRIGGER linked_device_wallet_session_credential_deliveries_v1_capacity_delete BEFORE DELETE ON linked_device_wallet_session_credential_deliveries_v1
369
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
370
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
371
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
372
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
373
+ AND fence.wallet_id = OLD.wallet_id)
374
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
375
+
376
+ CREATE TRIGGER wallet_relocation_approvals_capacity_insert BEFORE INSERT ON wallet_relocation_approvals
377
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
378
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
379
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = NEW.namespace
380
+ AND fence.org_id = NEW.org_id AND fence.project_id = NEW.project_id
381
+ AND fence.env_id = NEW.env_id AND fence.wallet_id = NEW.wallet_id)
382
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
383
+
384
+ CREATE TRIGGER wallet_relocation_approvals_capacity_update BEFORE UPDATE ON wallet_relocation_approvals
385
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
386
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
387
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = OLD.namespace
388
+ AND fence.org_id = OLD.org_id AND fence.project_id = OLD.project_id
389
+ AND fence.env_id = OLD.env_id AND fence.wallet_id = OLD.wallet_id)
390
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
391
+
392
+ CREATE TRIGGER wallet_relocation_approvals_capacity_delete BEFORE DELETE ON wallet_relocation_approvals
393
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
394
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
395
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = OLD.namespace
396
+ AND fence.org_id = OLD.org_id AND fence.project_id = OLD.project_id
397
+ AND fence.env_id = OLD.env_id AND fence.wallet_id = OLD.wallet_id)
398
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
399
+
400
+ CREATE TRIGGER verified_wallet_operation_evidence_sets_capacity_insert BEFORE INSERT ON verified_wallet_operation_evidence_sets
401
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
402
+ JOIN wallet_relocation_write_blocks AS block USING (namespace, org_id, project_id, env_id, wallet_id, move_id, request_digest_hex, source_generation)
403
+ WHERE block.state IN ('draining', 'checked') AND fence.namespace = NEW.namespace
404
+ AND fence.org_id = NEW.org_id AND fence.project_id = NEW.project_id
405
+ AND fence.env_id = NEW.env_id AND fence.wallet_id = NEW.wallet_id)
406
+ BEGIN SELECT RAISE(ABORT, 'wallet_relocation_write_blocked'); END;
@@ -0,0 +1,24 @@
1
+ CREATE TABLE wallet_object_addresses (
2
+ namespace TEXT NOT NULL,
3
+ org_id TEXT NOT NULL,
4
+ project_id TEXT NOT NULL,
5
+ env_id TEXT NOT NULL,
6
+ wallet_id TEXT NOT NULL,
7
+ ownership_generation INTEGER NOT NULL
8
+ CHECK (ownership_generation > 0 AND ownership_generation <= 9007199254740991),
9
+ router TEXT NOT NULL CHECK (length(router) = 64 AND router NOT GLOB '*[^a-f0-9]*'),
10
+ deriver_a TEXT NOT NULL CHECK (length(deriver_a) = 64 AND deriver_a NOT GLOB '*[^a-f0-9]*'),
11
+ deriver_b TEXT NOT NULL CHECK (length(deriver_b) = 64 AND deriver_b NOT GLOB '*[^a-f0-9]*'),
12
+ signing_worker TEXT NOT NULL CHECK (length(signing_worker) = 64 AND signing_worker NOT GLOB '*[^a-f0-9]*'),
13
+ PRIMARY KEY (namespace, org_id, project_id, env_id, wallet_id, ownership_generation)
14
+ );
15
+
16
+ -- A retry must use the winning allocation. Changing or deleting it would allow
17
+ -- two sets of custody objects to execute for the same ownership generation.
18
+ CREATE TRIGGER wallet_object_addresses_immutable
19
+ BEFORE UPDATE ON wallet_object_addresses
20
+ BEGIN SELECT RAISE(ABORT, 'wallet_object_addresses_immutable'); END;
21
+
22
+ CREATE TRIGGER wallet_object_addresses_retained
23
+ BEFORE DELETE ON wallet_object_addresses
24
+ BEGIN SELECT RAISE(ABORT, 'wallet_object_addresses_retained'); END;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seams/wallet-server",
3
- "version": "0.8.0",
3
+ "version": "0.9.1",
4
4
  "type": "module",
5
5
  "description": "Seams server TypeScript SDK for NEAR and EVM-family wallets",
6
6
  "main": "./dist/esm/index.js",
package/src/README.md CHANGED
@@ -23,7 +23,7 @@ authentication is intentionally outside this package.
23
23
  ## Primary wallet routes
24
24
 
25
25
  Wallet-management routes (registration, signer setup/inventory, auth-method
26
- management and implicit NEAR funding) require `X-Seams-Wallet-Protocol: 2`.
26
+ management and implicit NEAR funding) require `X-Seams-Wallet-Protocol: 3`.
27
27
  Missing or unsupported values return HTTP 409, `wallet_protocol_mismatch`, with
28
28
  reload/upgrade instructions before parsing the body or invoking route services.
29
29
  The current Wallet SDK sends this header automatically. Direct HTTP clients,
@@ -48,6 +48,28 @@ The hosted-wallet exchange routes deliver one opaque Wallet Session token
48
48
  through a short-lived, origin-bound, single-use capability. They do not create
49
49
  an application session, and the outer application never receives the token.
50
50
 
51
+ ## Initial Cloudflare wallet placement
52
+
53
+ The regional host must admit each request to the wallet's fixed home before calling
54
+ custody services. Wrap the existing `MPC_ROUTER` and `SIGNING_WORKER` bindings with
55
+ `WalletHomeCustodyBinding` from `@seams/wallet-server/cloud-host`. Pass the admitted
56
+ `US`, `WEUR`, `APAC`, or `OC` home. Never use an incoming client header as this value.
57
+ This applies to custom hosts that call the exported hosted Gateway Worker as well.
58
+
59
+ The binding overwrites `x-seams-wallet-home-region`. The Router accepts this header
60
+ only after checking the existing private Gateway credential. Missing or invalid
61
+ values fail before wallet-object access. Gateway and custody versions must deploy
62
+ together. No additional environment variable or service credential is required.
63
+
64
+ The Router carries the home through Yao setup, status lookups, retries, deferred
65
+ execution, and signing-worker delivery. Initial object lookups request `enam`,
66
+ `weur`, `apac`, or `oc`, respectively. Wallet identity and ownership generation
67
+ remain unchanged. The local fixture explicitly uses `US`.
68
+
69
+ Cloudflare location hints are advisory and apply to initial placement. They do not
70
+ move existing objects or guarantee D1, Workers, and objects share one data centre.
71
+ Use fresh wallets when measuring this change.
72
+
51
73
  ## PRF Session Seal Module
52
74
 
53
75
  `signingSessionSeal` is optional and preserves sealed signing refresh material.
@@ -1,29 +0,0 @@
1
- import { createPrivateKey, createPublicKey } from 'node:crypto';
2
-
3
- const ED25519_PKCS8_SEED_PREFIX = Buffer.from('302e020100300506032b657004220420', 'hex');
4
-
5
- export function localPeerSigningKeyBase64Url(value) {
6
- return Buffer.from(localPeerSigningSeedHex(value), 'hex').toString('base64url');
7
- }
8
-
9
- export function localPeerVerifyingKeyHex(value) {
10
- const seed = Buffer.from(localPeerSigningSeedHex(value), 'hex');
11
- const privateKey = createPrivateKey({
12
- key: Buffer.concat([ED25519_PKCS8_SEED_PREFIX, seed]),
13
- format: 'der',
14
- type: 'pkcs8',
15
- });
16
- const publicKey = createPublicKey(privateKey).export({ format: 'der', type: 'spki' });
17
- return Buffer.from(publicKey).subarray(-32).toString('hex');
18
- }
19
-
20
- function localPeerSigningSeedHex(value) {
21
- if (!/^[A-Za-z0-9_-]{43}$/.test(value)) {
22
- throw new Error('Router A/B local peer signing key must be 32-byte base64url');
23
- }
24
- const seed = Buffer.from(value, 'base64url');
25
- if (seed.length !== 32) {
26
- throw new Error('Router A/B local peer signing key must decode to 32 bytes');
27
- }
28
- return seed.toString('hex');
29
- }