@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,12 @@
1
+ -- A terminal registration decision survives an uncertain directory reply.
2
+ ALTER TABLE wallet_execution_generations ADD COLUMN registration_completion TEXT NOT NULL
3
+ DEFAULT 'pending' CHECK(registration_completion IN ('pending', 'established', 'cancelled'));
4
+
5
+ CREATE TRIGGER wallet_registration_completion_immutable
6
+ BEFORE UPDATE ON wallet_execution_generations
7
+ WHEN (OLD.registration_completion != 'pending'
8
+ AND NEW.registration_completion != OLD.registration_completion)
9
+ OR (NEW.registration_completion != 'pending' AND NEW.origin != 'registration')
10
+ OR (NEW.registration_completion = 'cancelled' AND NEW.state != 'retired')
11
+ OR (NEW.registration_completion = 'established' AND NEW.state = 'inactive')
12
+ BEGIN SELECT RAISE(ABORT, 'wallet_registration_completion_conflicts'); END;
@@ -0,0 +1,24 @@
1
+ -- Cancellation closes outstanding ceremony writes while permitting cleanup deletes.
2
+ CREATE TRIGGER registration_cancelled_insert_fence
3
+ BEFORE INSERT ON registration_ceremony_records
4
+ WHEN NEW.record_scope IN ('ceremony', 'setup-ceremony') AND EXISTS (
5
+ SELECT 1 FROM wallet_execution_generations AS execution
6
+ WHERE execution.namespace = NEW.namespace AND execution.org_id = NEW.org_id
7
+ AND execution.project_id = NEW.project_id AND execution.env_id = NEW.env_id
8
+ AND execution.origin = 'registration'
9
+ AND execution.origin_id = json_extract(NEW.record_json, '$.registrationCeremonyId')
10
+ AND execution.registration_completion = 'cancelled'
11
+ )
12
+ BEGIN SELECT RAISE(ABORT, 'registration_cancelled'); END;
13
+
14
+ CREATE TRIGGER registration_cancelled_update_fence
15
+ BEFORE UPDATE ON registration_ceremony_records
16
+ WHEN OLD.record_scope IN ('ceremony', 'setup-ceremony') AND EXISTS (
17
+ SELECT 1 FROM wallet_execution_generations AS execution
18
+ WHERE execution.namespace = OLD.namespace AND execution.org_id = OLD.org_id
19
+ AND execution.project_id = OLD.project_id AND execution.env_id = OLD.env_id
20
+ AND execution.origin = 'registration'
21
+ AND execution.origin_id = json_extract(OLD.record_json, '$.registrationCeremonyId')
22
+ AND execution.registration_completion = 'cancelled'
23
+ )
24
+ BEGIN SELECT RAISE(ABORT, 'registration_cancelled'); END;
@@ -0,0 +1,11 @@
1
+ -- A previously admitted registration cannot publish a session after cancellation.
2
+ CREATE TRIGGER cancelled_registration_session_insert_fence
3
+ BEFORE INSERT ON wallet_session_authorizations_v2
4
+ WHEN EXISTS (
5
+ SELECT 1 FROM wallet_execution_generations AS execution
6
+ WHERE execution.namespace = NEW.namespace AND execution.org_id = NEW.org_id
7
+ AND execution.project_id = NEW.project_id AND execution.env_id = NEW.env_id
8
+ AND execution.wallet_id = NEW.wallet_id
9
+ AND execution.registration_completion = 'cancelled'
10
+ )
11
+ BEGIN SELECT RAISE(ABORT, 'registration_cancelled'); END;
@@ -0,0 +1,369 @@
1
+ -- Reject unfinished transfers. Completed receipts remain immutable.
2
+ CREATE TABLE wallet_passkey_relocation_upgrade_guard (count INTEGER NOT NULL CHECK (count = 0));
3
+ INSERT INTO wallet_passkey_relocation_upgrade_guard
4
+ SELECT (SELECT COUNT(*) FROM wallet_relocation_authorization_snapshots AS snapshot
5
+ WHERE NOT EXISTS (
6
+ SELECT 1 FROM wallet_relocation_authorization_cleanups AS cleanup
7
+ WHERE cleanup.namespace = snapshot.namespace AND cleanup.org_id = snapshot.org_id
8
+ AND cleanup.project_id = snapshot.project_id AND cleanup.env_id = snapshot.env_id
9
+ AND cleanup.wallet_id = snapshot.wallet_id AND cleanup.move_id = snapshot.move_id
10
+ AND cleanup.request_digest_hex = snapshot.request_digest_hex
11
+ AND cleanup.source_generation = snapshot.source_generation
12
+ AND cleanup.state = 'cleaned'))
13
+ + (SELECT COUNT(*) FROM wallet_relocation_authorization_imports WHERE state != 'activated');
14
+ DROP TABLE wallet_passkey_relocation_upgrade_guard;
15
+
16
+ CREATE TRIGGER router_ab_yao_versioned_json_records_relocation_frozen_insert
17
+ BEFORE INSERT ON router_ab_yao_versioned_json_records
18
+ WHEN (substr(NEW.record_key, 1, 17) = 'passkey-envelope:' OR substr(NEW.record_key, 1, 28) = 'passkey-credential-activity:') AND EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
19
+ WHERE fence.namespace = NEW.namespace AND fence.org_id = NEW.org_id
20
+ AND fence.project_id = NEW.project_id AND fence.env_id = NEW.env_id
21
+ AND fence.wallet_id = json_extract(NEW.record_json, '$.walletId'))
22
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_history_frozen'); END;
23
+
24
+ CREATE TRIGGER router_ab_yao_versioned_json_records_relocation_frozen_update
25
+ BEFORE UPDATE ON router_ab_yao_versioned_json_records
26
+ WHEN (substr(OLD.record_key, 1, 17) = 'passkey-envelope:' OR substr(OLD.record_key, 1, 28) = 'passkey-credential-activity:') AND EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
27
+ WHERE fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
28
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
29
+ AND fence.wallet_id = json_extract(OLD.record_json, '$.walletId'))
30
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_history_frozen'); END;
31
+
32
+ CREATE TRIGGER router_ab_yao_versioned_json_records_relocation_frozen_delete
33
+ BEFORE DELETE ON router_ab_yao_versioned_json_records
34
+ WHEN (substr(OLD.record_key, 1, 17) = 'passkey-envelope:' OR substr(OLD.record_key, 1, 28) = 'passkey-credential-activity:') AND EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
35
+ WHERE fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
36
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
37
+ AND fence.wallet_id = json_extract(OLD.record_json, '$.walletId')
38
+ AND NOT EXISTS (SELECT 1 FROM wallet_relocation_authorization_cleanups AS cleanup
39
+ WHERE cleanup.namespace = fence.namespace AND cleanup.org_id = fence.org_id
40
+ AND cleanup.project_id = fence.project_id AND cleanup.env_id = fence.env_id
41
+ AND cleanup.wallet_id = fence.wallet_id AND cleanup.move_id = fence.move_id
42
+ AND cleanup.request_digest_hex = fence.request_digest_hex
43
+ AND cleanup.source_generation = fence.source_generation AND cleanup.state = 'cleaning'))
44
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_history_frozen'); END;
45
+
46
+ CREATE TRIGGER router_ab_yao_versioned_json_records_relocation_inactive_insert
47
+ BEFORE INSERT ON router_ab_yao_versioned_json_records
48
+ WHEN (substr(NEW.record_key, 1, 17) = 'passkey-envelope:' OR substr(NEW.record_key, 1, 28) = 'passkey-credential-activity:') AND EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
49
+ WHERE destination.namespace = NEW.namespace AND destination.org_id = NEW.org_id
50
+ AND destination.project_id = NEW.project_id AND destination.env_id = NEW.env_id
51
+ AND destination.wallet_id = json_extract(NEW.record_json, '$.walletId') AND destination.state != 'activated')
52
+ AND NOT EXISTS (SELECT 1 FROM wallet_relocation_authorization_import_context AS context
53
+ JOIN wallet_relocation_authorization_imports AS destination
54
+ ON destination.namespace = context.namespace AND destination.org_id = context.org_id
55
+ AND destination.project_id = context.project_id AND destination.env_id = context.env_id
56
+ AND destination.wallet_id = context.wallet_id AND destination.move_id = context.move_id
57
+ AND destination.request_digest_hex = context.request_digest_hex
58
+ AND destination.source_generation = context.source_generation
59
+ WHERE context.namespace = NEW.namespace AND context.org_id = NEW.org_id
60
+ AND context.project_id = NEW.project_id AND context.env_id = NEW.env_id
61
+ AND context.wallet_id = json_extract(NEW.record_json, '$.walletId')
62
+ AND destination.state = 'importing' AND context.table_name = 'router_ab_yao_versioned_json_records'
63
+ AND context.record_key = json_array(NEW.env_id, NEW.namespace, NEW.org_id, NEW.project_id, NEW.record_key))
64
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
65
+
66
+ CREATE TRIGGER router_ab_yao_versioned_json_records_relocation_inactive_update
67
+ BEFORE UPDATE ON router_ab_yao_versioned_json_records
68
+ WHEN (substr(OLD.record_key, 1, 17) = 'passkey-envelope:' OR substr(OLD.record_key, 1, 28) = 'passkey-credential-activity:') AND EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
69
+ WHERE destination.namespace = OLD.namespace AND destination.org_id = OLD.org_id
70
+ AND destination.project_id = OLD.project_id AND destination.env_id = OLD.env_id
71
+ AND destination.wallet_id = json_extract(OLD.record_json, '$.walletId') AND destination.state != 'activated')
72
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
73
+
74
+ CREATE TRIGGER router_ab_yao_versioned_json_records_relocation_inactive_delete
75
+ BEFORE DELETE ON router_ab_yao_versioned_json_records
76
+ WHEN (substr(OLD.record_key, 1, 17) = 'passkey-envelope:' OR substr(OLD.record_key, 1, 28) = 'passkey-credential-activity:') AND EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
77
+ WHERE destination.namespace = OLD.namespace AND destination.org_id = OLD.org_id
78
+ AND destination.project_id = OLD.project_id AND destination.env_id = OLD.env_id
79
+ AND destination.wallet_id = json_extract(OLD.record_json, '$.walletId') AND destination.state != 'activated')
80
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
81
+
82
+ CREATE TRIGGER router_ab_yao_versioned_json_records_relocation_owner_immutable
83
+ BEFORE UPDATE ON router_ab_yao_versioned_json_records
84
+ WHEN (substr(OLD.record_key, 1, 17) = 'passkey-envelope:' OR substr(OLD.record_key, 1, 28) = 'passkey-credential-activity:') AND (NEW.namespace IS NOT OLD.namespace OR NEW.org_id IS NOT OLD.org_id OR NEW.project_id IS NOT OLD.project_id OR NEW.env_id IS NOT OLD.env_id OR json_extract(NEW.record_json, '$.walletId') IS NOT json_extract(OLD.record_json, '$.walletId'))
85
+ BEGIN SELECT RAISE(ABORT, 'wallet_record_owner_changed'); END;
86
+
87
+ CREATE TRIGGER wallets_relocation_frozen_insert
88
+ BEFORE INSERT ON wallets
89
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
90
+ WHERE fence.namespace = NEW.namespace AND fence.org_id = NEW.org_id
91
+ AND fence.project_id = NEW.project_id AND fence.env_id = NEW.env_id
92
+ AND fence.wallet_id = NEW.wallet_id)
93
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_history_frozen'); END;
94
+
95
+ CREATE TRIGGER wallets_relocation_frozen_update
96
+ BEFORE UPDATE ON wallets
97
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
98
+ WHERE fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
99
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
100
+ AND fence.wallet_id = OLD.wallet_id)
101
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_history_frozen'); END;
102
+
103
+ CREATE TRIGGER wallets_relocation_frozen_delete
104
+ BEFORE DELETE ON wallets
105
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
106
+ WHERE fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
107
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
108
+ AND fence.wallet_id = OLD.wallet_id
109
+ AND NOT EXISTS (SELECT 1 FROM wallet_relocation_authorization_cleanups AS cleanup
110
+ WHERE cleanup.namespace = fence.namespace AND cleanup.org_id = fence.org_id
111
+ AND cleanup.project_id = fence.project_id AND cleanup.env_id = fence.env_id
112
+ AND cleanup.wallet_id = fence.wallet_id AND cleanup.move_id = fence.move_id
113
+ AND cleanup.request_digest_hex = fence.request_digest_hex
114
+ AND cleanup.source_generation = fence.source_generation AND cleanup.state = 'cleaning'))
115
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_history_frozen'); END;
116
+
117
+ CREATE TRIGGER wallets_relocation_inactive_insert
118
+ BEFORE INSERT ON wallets
119
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
120
+ WHERE destination.namespace = NEW.namespace AND destination.org_id = NEW.org_id
121
+ AND destination.project_id = NEW.project_id AND destination.env_id = NEW.env_id
122
+ AND destination.wallet_id = NEW.wallet_id AND destination.state != 'activated')
123
+ AND NOT EXISTS (SELECT 1 FROM wallet_relocation_authorization_import_context AS context
124
+ JOIN wallet_relocation_authorization_imports AS destination
125
+ ON destination.namespace = context.namespace AND destination.org_id = context.org_id
126
+ AND destination.project_id = context.project_id AND destination.env_id = context.env_id
127
+ AND destination.wallet_id = context.wallet_id AND destination.move_id = context.move_id
128
+ AND destination.request_digest_hex = context.request_digest_hex
129
+ AND destination.source_generation = context.source_generation
130
+ WHERE context.namespace = NEW.namespace AND context.org_id = NEW.org_id
131
+ AND context.project_id = NEW.project_id AND context.env_id = NEW.env_id
132
+ AND context.wallet_id = NEW.wallet_id
133
+ AND destination.state = 'importing' AND context.table_name = 'wallets'
134
+ AND context.record_key = json_array(NEW.env_id, NEW.namespace, NEW.org_id, NEW.project_id, NEW.wallet_id))
135
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
136
+
137
+ CREATE TRIGGER wallets_relocation_inactive_update
138
+ BEFORE UPDATE ON wallets
139
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
140
+ WHERE destination.namespace = OLD.namespace AND destination.org_id = OLD.org_id
141
+ AND destination.project_id = OLD.project_id AND destination.env_id = OLD.env_id
142
+ AND destination.wallet_id = OLD.wallet_id AND destination.state != 'activated')
143
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
144
+
145
+ CREATE TRIGGER wallets_relocation_inactive_delete
146
+ BEFORE DELETE ON wallets
147
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
148
+ WHERE destination.namespace = OLD.namespace AND destination.org_id = OLD.org_id
149
+ AND destination.project_id = OLD.project_id AND destination.env_id = OLD.env_id
150
+ AND destination.wallet_id = OLD.wallet_id AND destination.state != 'activated')
151
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
152
+
153
+ CREATE TRIGGER wallets_relocation_owner_immutable
154
+ BEFORE UPDATE ON wallets
155
+ WHEN NEW.namespace IS NOT OLD.namespace OR NEW.org_id IS NOT OLD.org_id OR NEW.project_id IS NOT OLD.project_id OR NEW.env_id IS NOT OLD.env_id OR NEW.wallet_id IS NOT OLD.wallet_id
156
+ BEGIN SELECT RAISE(ABORT, 'wallet_record_owner_changed'); END;
157
+
158
+ CREATE TRIGGER wallet_signers_relocation_frozen_insert
159
+ BEFORE INSERT ON wallet_signers
160
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
161
+ WHERE fence.namespace = NEW.namespace AND fence.org_id = NEW.org_id
162
+ AND fence.project_id = NEW.project_id AND fence.env_id = NEW.env_id
163
+ AND fence.wallet_id = NEW.wallet_id)
164
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_history_frozen'); END;
165
+
166
+ CREATE TRIGGER wallet_signers_relocation_frozen_update
167
+ BEFORE UPDATE ON wallet_signers
168
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
169
+ WHERE fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
170
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
171
+ AND fence.wallet_id = OLD.wallet_id)
172
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_history_frozen'); END;
173
+
174
+ CREATE TRIGGER wallet_signers_relocation_frozen_delete
175
+ BEFORE DELETE ON wallet_signers
176
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
177
+ WHERE fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
178
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
179
+ AND fence.wallet_id = OLD.wallet_id
180
+ AND NOT EXISTS (SELECT 1 FROM wallet_relocation_authorization_cleanups AS cleanup
181
+ WHERE cleanup.namespace = fence.namespace AND cleanup.org_id = fence.org_id
182
+ AND cleanup.project_id = fence.project_id AND cleanup.env_id = fence.env_id
183
+ AND cleanup.wallet_id = fence.wallet_id AND cleanup.move_id = fence.move_id
184
+ AND cleanup.request_digest_hex = fence.request_digest_hex
185
+ AND cleanup.source_generation = fence.source_generation AND cleanup.state = 'cleaning'))
186
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_history_frozen'); END;
187
+
188
+ CREATE TRIGGER wallet_signers_relocation_inactive_insert
189
+ BEFORE INSERT ON wallet_signers
190
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
191
+ WHERE destination.namespace = NEW.namespace AND destination.org_id = NEW.org_id
192
+ AND destination.project_id = NEW.project_id AND destination.env_id = NEW.env_id
193
+ AND destination.wallet_id = NEW.wallet_id AND destination.state != 'activated')
194
+ AND NOT EXISTS (SELECT 1 FROM wallet_relocation_authorization_import_context AS context
195
+ JOIN wallet_relocation_authorization_imports AS destination
196
+ ON destination.namespace = context.namespace AND destination.org_id = context.org_id
197
+ AND destination.project_id = context.project_id AND destination.env_id = context.env_id
198
+ AND destination.wallet_id = context.wallet_id AND destination.move_id = context.move_id
199
+ AND destination.request_digest_hex = context.request_digest_hex
200
+ AND destination.source_generation = context.source_generation
201
+ WHERE context.namespace = NEW.namespace AND context.org_id = NEW.org_id
202
+ AND context.project_id = NEW.project_id AND context.env_id = NEW.env_id
203
+ AND context.wallet_id = NEW.wallet_id
204
+ AND destination.state = 'importing' AND context.table_name = 'wallet_signers'
205
+ AND context.record_key = json_array(NEW.env_id, NEW.namespace, NEW.org_id, NEW.project_id, NEW.signer_family, NEW.signer_id, NEW.wallet_id))
206
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
207
+
208
+ CREATE TRIGGER wallet_signers_relocation_inactive_update
209
+ BEFORE UPDATE ON wallet_signers
210
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
211
+ WHERE destination.namespace = OLD.namespace AND destination.org_id = OLD.org_id
212
+ AND destination.project_id = OLD.project_id AND destination.env_id = OLD.env_id
213
+ AND destination.wallet_id = OLD.wallet_id AND destination.state != 'activated')
214
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
215
+
216
+ CREATE TRIGGER wallet_signers_relocation_inactive_delete
217
+ BEFORE DELETE ON wallet_signers
218
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
219
+ WHERE destination.namespace = OLD.namespace AND destination.org_id = OLD.org_id
220
+ AND destination.project_id = OLD.project_id AND destination.env_id = OLD.env_id
221
+ AND destination.wallet_id = OLD.wallet_id AND destination.state != 'activated')
222
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
223
+
224
+ CREATE TRIGGER wallet_signers_relocation_owner_immutable
225
+ BEFORE UPDATE ON wallet_signers
226
+ WHEN NEW.namespace IS NOT OLD.namespace OR NEW.org_id IS NOT OLD.org_id OR NEW.project_id IS NOT OLD.project_id OR NEW.env_id IS NOT OLD.env_id OR NEW.wallet_id IS NOT OLD.wallet_id
227
+ BEGIN SELECT RAISE(ABORT, 'wallet_record_owner_changed'); END;
228
+
229
+ CREATE TRIGGER webauthn_credential_bindings_relocation_frozen_insert
230
+ BEFORE INSERT ON webauthn_credential_bindings
231
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
232
+ WHERE fence.namespace = NEW.namespace AND fence.org_id = NEW.org_id
233
+ AND fence.project_id = NEW.project_id AND fence.env_id = NEW.env_id
234
+ AND fence.wallet_id = NEW.user_id)
235
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_history_frozen'); END;
236
+
237
+ CREATE TRIGGER webauthn_credential_bindings_relocation_frozen_update
238
+ BEFORE UPDATE ON webauthn_credential_bindings
239
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
240
+ WHERE fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
241
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
242
+ AND fence.wallet_id = OLD.user_id)
243
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_history_frozen'); END;
244
+
245
+ CREATE TRIGGER webauthn_credential_bindings_relocation_frozen_delete
246
+ BEFORE DELETE ON webauthn_credential_bindings
247
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
248
+ WHERE fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
249
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
250
+ AND fence.wallet_id = OLD.user_id
251
+ AND NOT EXISTS (SELECT 1 FROM wallet_relocation_authorization_cleanups AS cleanup
252
+ WHERE cleanup.namespace = fence.namespace AND cleanup.org_id = fence.org_id
253
+ AND cleanup.project_id = fence.project_id AND cleanup.env_id = fence.env_id
254
+ AND cleanup.wallet_id = fence.wallet_id AND cleanup.move_id = fence.move_id
255
+ AND cleanup.request_digest_hex = fence.request_digest_hex
256
+ AND cleanup.source_generation = fence.source_generation AND cleanup.state = 'cleaning'))
257
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_history_frozen'); END;
258
+
259
+ CREATE TRIGGER webauthn_credential_bindings_relocation_inactive_insert
260
+ BEFORE INSERT ON webauthn_credential_bindings
261
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
262
+ WHERE destination.namespace = NEW.namespace AND destination.org_id = NEW.org_id
263
+ AND destination.project_id = NEW.project_id AND destination.env_id = NEW.env_id
264
+ AND destination.wallet_id = NEW.user_id AND destination.state != 'activated')
265
+ AND NOT EXISTS (SELECT 1 FROM wallet_relocation_authorization_import_context AS context
266
+ JOIN wallet_relocation_authorization_imports AS destination
267
+ ON destination.namespace = context.namespace AND destination.org_id = context.org_id
268
+ AND destination.project_id = context.project_id AND destination.env_id = context.env_id
269
+ AND destination.wallet_id = context.wallet_id AND destination.move_id = context.move_id
270
+ AND destination.request_digest_hex = context.request_digest_hex
271
+ AND destination.source_generation = context.source_generation
272
+ WHERE context.namespace = NEW.namespace AND context.org_id = NEW.org_id
273
+ AND context.project_id = NEW.project_id AND context.env_id = NEW.env_id
274
+ AND context.wallet_id = NEW.user_id
275
+ AND destination.state = 'importing' AND context.table_name = 'webauthn_credential_bindings'
276
+ AND context.record_key = json_array(NEW.credential_id_b64u, NEW.env_id, NEW.namespace, NEW.org_id, NEW.project_id, NEW.rp_id))
277
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
278
+
279
+ CREATE TRIGGER webauthn_credential_bindings_relocation_inactive_update
280
+ BEFORE UPDATE ON webauthn_credential_bindings
281
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
282
+ WHERE destination.namespace = OLD.namespace AND destination.org_id = OLD.org_id
283
+ AND destination.project_id = OLD.project_id AND destination.env_id = OLD.env_id
284
+ AND destination.wallet_id = OLD.user_id AND destination.state != 'activated')
285
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
286
+
287
+ CREATE TRIGGER webauthn_credential_bindings_relocation_inactive_delete
288
+ BEFORE DELETE ON webauthn_credential_bindings
289
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
290
+ WHERE destination.namespace = OLD.namespace AND destination.org_id = OLD.org_id
291
+ AND destination.project_id = OLD.project_id AND destination.env_id = OLD.env_id
292
+ AND destination.wallet_id = OLD.user_id AND destination.state != 'activated')
293
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
294
+
295
+ CREATE TRIGGER webauthn_credential_bindings_relocation_owner_immutable
296
+ BEFORE UPDATE ON webauthn_credential_bindings
297
+ WHEN NEW.namespace IS NOT OLD.namespace OR NEW.org_id IS NOT OLD.org_id OR NEW.project_id IS NOT OLD.project_id OR NEW.env_id IS NOT OLD.env_id OR NEW.user_id IS NOT OLD.user_id
298
+ BEGIN SELECT RAISE(ABORT, 'wallet_record_owner_changed'); END;
299
+
300
+ CREATE TRIGGER webauthn_authenticators_relocation_frozen_insert
301
+ BEFORE INSERT ON webauthn_authenticators
302
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
303
+ WHERE fence.namespace = NEW.namespace AND fence.org_id = NEW.org_id
304
+ AND fence.project_id = NEW.project_id AND fence.env_id = NEW.env_id
305
+ AND fence.wallet_id = NEW.user_id)
306
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_history_frozen'); END;
307
+
308
+ CREATE TRIGGER webauthn_authenticators_relocation_frozen_update
309
+ BEFORE UPDATE ON webauthn_authenticators
310
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
311
+ WHERE fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
312
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
313
+ AND fence.wallet_id = OLD.user_id)
314
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_history_frozen'); END;
315
+
316
+ CREATE TRIGGER webauthn_authenticators_relocation_frozen_delete
317
+ BEFORE DELETE ON webauthn_authenticators
318
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
319
+ WHERE fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
320
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
321
+ AND fence.wallet_id = OLD.user_id
322
+ AND NOT EXISTS (SELECT 1 FROM wallet_relocation_authorization_cleanups AS cleanup
323
+ WHERE cleanup.namespace = fence.namespace AND cleanup.org_id = fence.org_id
324
+ AND cleanup.project_id = fence.project_id AND cleanup.env_id = fence.env_id
325
+ AND cleanup.wallet_id = fence.wallet_id AND cleanup.move_id = fence.move_id
326
+ AND cleanup.request_digest_hex = fence.request_digest_hex
327
+ AND cleanup.source_generation = fence.source_generation AND cleanup.state = 'cleaning'))
328
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_history_frozen'); END;
329
+
330
+ CREATE TRIGGER webauthn_authenticators_relocation_inactive_insert
331
+ BEFORE INSERT ON webauthn_authenticators
332
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
333
+ WHERE destination.namespace = NEW.namespace AND destination.org_id = NEW.org_id
334
+ AND destination.project_id = NEW.project_id AND destination.env_id = NEW.env_id
335
+ AND destination.wallet_id = NEW.user_id AND destination.state != 'activated')
336
+ AND NOT EXISTS (SELECT 1 FROM wallet_relocation_authorization_import_context AS context
337
+ JOIN wallet_relocation_authorization_imports AS destination
338
+ ON destination.namespace = context.namespace AND destination.org_id = context.org_id
339
+ AND destination.project_id = context.project_id AND destination.env_id = context.env_id
340
+ AND destination.wallet_id = context.wallet_id AND destination.move_id = context.move_id
341
+ AND destination.request_digest_hex = context.request_digest_hex
342
+ AND destination.source_generation = context.source_generation
343
+ WHERE context.namespace = NEW.namespace AND context.org_id = NEW.org_id
344
+ AND context.project_id = NEW.project_id AND context.env_id = NEW.env_id
345
+ AND context.wallet_id = NEW.user_id
346
+ AND destination.state = 'importing' AND context.table_name = 'webauthn_authenticators'
347
+ AND context.record_key = json_array(NEW.credential_id_b64u, NEW.env_id, NEW.namespace, NEW.org_id, NEW.project_id, NEW.user_id))
348
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
349
+
350
+ CREATE TRIGGER webauthn_authenticators_relocation_inactive_update
351
+ BEFORE UPDATE ON webauthn_authenticators
352
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
353
+ WHERE destination.namespace = OLD.namespace AND destination.org_id = OLD.org_id
354
+ AND destination.project_id = OLD.project_id AND destination.env_id = OLD.env_id
355
+ AND destination.wallet_id = OLD.user_id AND destination.state != 'activated')
356
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
357
+
358
+ CREATE TRIGGER webauthn_authenticators_relocation_inactive_delete
359
+ BEFORE DELETE ON webauthn_authenticators
360
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
361
+ WHERE destination.namespace = OLD.namespace AND destination.org_id = OLD.org_id
362
+ AND destination.project_id = OLD.project_id AND destination.env_id = OLD.env_id
363
+ AND destination.wallet_id = OLD.user_id AND destination.state != 'activated')
364
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
365
+
366
+ CREATE TRIGGER webauthn_authenticators_relocation_owner_immutable
367
+ BEFORE UPDATE ON webauthn_authenticators
368
+ WHEN NEW.namespace IS NOT OLD.namespace OR NEW.org_id IS NOT OLD.org_id OR NEW.project_id IS NOT OLD.project_id OR NEW.env_id IS NOT OLD.env_id OR NEW.user_id IS NOT OLD.user_id
369
+ BEGIN SELECT RAISE(ABORT, 'wallet_record_owner_changed'); END;
@@ -0,0 +1,98 @@
1
+ -- Snapshot inventories must not change during an in-progress transfer.
2
+ CREATE TABLE wallet_otp_relocation_upgrade_guard (count INTEGER NOT NULL CHECK (count = 0));
3
+ INSERT INTO wallet_otp_relocation_upgrade_guard
4
+ SELECT (SELECT COUNT(*) FROM wallet_relocation_authorization_snapshots AS snapshot
5
+ WHERE NOT EXISTS (
6
+ SELECT 1 FROM wallet_relocation_authorization_cleanups AS cleanup
7
+ WHERE cleanup.namespace = snapshot.namespace AND cleanup.org_id = snapshot.org_id
8
+ AND cleanup.project_id = snapshot.project_id AND cleanup.env_id = snapshot.env_id
9
+ AND cleanup.wallet_id = snapshot.wallet_id AND cleanup.move_id = snapshot.move_id
10
+ AND cleanup.request_digest_hex = snapshot.request_digest_hex
11
+ AND cleanup.source_generation = snapshot.source_generation
12
+ AND cleanup.state = 'cleaned'))
13
+ + (SELECT COUNT(*) FROM wallet_relocation_authorization_imports WHERE state != 'activated');
14
+ DROP TABLE wallet_otp_relocation_upgrade_guard;
15
+
16
+ CREATE TABLE wallet_email_otp_rate_limits (
17
+ namespace TEXT NOT NULL CHECK (length(namespace) > 0),
18
+ org_id TEXT NOT NULL CHECK (length(org_id) > 0),
19
+ project_id TEXT NOT NULL CHECK (length(project_id) > 0),
20
+ env_id TEXT NOT NULL CHECK (length(env_id) > 0),
21
+ wallet_id TEXT NOT NULL CHECK (length(wallet_id) > 0),
22
+ rate_key TEXT NOT NULL CHECK (length(rate_key) > 0),
23
+ consumed_count INTEGER NOT NULL CHECK (consumed_count > 0),
24
+ reset_at_ms INTEGER NOT NULL CHECK (reset_at_ms > 0),
25
+ updated_at_ms INTEGER NOT NULL CHECK (updated_at_ms > 0 AND reset_at_ms > updated_at_ms),
26
+ PRIMARY KEY (namespace, org_id, project_id, env_id, wallet_id, rate_key)
27
+ );
28
+
29
+ CREATE TRIGGER wallet_email_otp_rate_limits_relocation_frozen_insert
30
+ BEFORE INSERT ON wallet_email_otp_rate_limits
31
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
32
+ WHERE fence.namespace = NEW.namespace AND fence.org_id = NEW.org_id
33
+ AND fence.project_id = NEW.project_id AND fence.env_id = NEW.env_id
34
+ AND fence.wallet_id = NEW.wallet_id)
35
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_history_frozen'); END;
36
+
37
+ CREATE TRIGGER wallet_email_otp_rate_limits_relocation_frozen_update
38
+ BEFORE UPDATE ON wallet_email_otp_rate_limits
39
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
40
+ WHERE fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
41
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
42
+ AND fence.wallet_id = OLD.wallet_id)
43
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_history_frozen'); END;
44
+
45
+ CREATE TRIGGER wallet_email_otp_rate_limits_relocation_frozen_delete
46
+ BEFORE DELETE ON wallet_email_otp_rate_limits
47
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_fences AS fence
48
+ WHERE fence.namespace = OLD.namespace AND fence.org_id = OLD.org_id
49
+ AND fence.project_id = OLD.project_id AND fence.env_id = OLD.env_id
50
+ AND fence.wallet_id = OLD.wallet_id
51
+ AND NOT EXISTS (SELECT 1 FROM wallet_relocation_authorization_cleanups AS cleanup
52
+ WHERE cleanup.namespace = fence.namespace AND cleanup.org_id = fence.org_id
53
+ AND cleanup.project_id = fence.project_id AND cleanup.env_id = fence.env_id
54
+ AND cleanup.wallet_id = fence.wallet_id AND cleanup.move_id = fence.move_id
55
+ AND cleanup.request_digest_hex = fence.request_digest_hex
56
+ AND cleanup.source_generation = fence.source_generation AND cleanup.state = 'cleaning'))
57
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_history_frozen'); END;
58
+
59
+ CREATE TRIGGER wallet_email_otp_rate_limits_relocation_inactive_insert
60
+ BEFORE INSERT ON wallet_email_otp_rate_limits
61
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
62
+ WHERE destination.namespace = NEW.namespace AND destination.org_id = NEW.org_id
63
+ AND destination.project_id = NEW.project_id AND destination.env_id = NEW.env_id
64
+ AND destination.wallet_id = NEW.wallet_id AND destination.state != 'activated')
65
+ AND NOT EXISTS (SELECT 1 FROM wallet_relocation_authorization_import_context AS context
66
+ JOIN wallet_relocation_authorization_imports AS destination
67
+ ON destination.namespace = context.namespace AND destination.org_id = context.org_id
68
+ AND destination.project_id = context.project_id AND destination.env_id = context.env_id
69
+ AND destination.wallet_id = context.wallet_id AND destination.move_id = context.move_id
70
+ AND destination.request_digest_hex = context.request_digest_hex
71
+ AND destination.source_generation = context.source_generation
72
+ WHERE context.namespace = NEW.namespace AND context.org_id = NEW.org_id
73
+ AND context.project_id = NEW.project_id AND context.env_id = NEW.env_id
74
+ AND context.wallet_id = NEW.wallet_id
75
+ AND destination.state = 'importing' AND context.table_name = 'wallet_email_otp_rate_limits'
76
+ AND context.record_key = json_array(NEW.env_id, NEW.namespace, NEW.org_id, NEW.project_id, NEW.rate_key, NEW.wallet_id))
77
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
78
+
79
+ CREATE TRIGGER wallet_email_otp_rate_limits_relocation_inactive_update
80
+ BEFORE UPDATE ON wallet_email_otp_rate_limits
81
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
82
+ WHERE destination.namespace = OLD.namespace AND destination.org_id = OLD.org_id
83
+ AND destination.project_id = OLD.project_id AND destination.env_id = OLD.env_id
84
+ AND destination.wallet_id = OLD.wallet_id AND destination.state != 'activated')
85
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
86
+
87
+ CREATE TRIGGER wallet_email_otp_rate_limits_relocation_inactive_delete
88
+ BEFORE DELETE ON wallet_email_otp_rate_limits
89
+ WHEN EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
90
+ WHERE destination.namespace = OLD.namespace AND destination.org_id = OLD.org_id
91
+ AND destination.project_id = OLD.project_id AND destination.env_id = OLD.env_id
92
+ AND destination.wallet_id = OLD.wallet_id AND destination.state != 'activated')
93
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
94
+
95
+ CREATE TRIGGER wallet_email_otp_rate_limits_relocation_owner_immutable
96
+ BEFORE UPDATE ON wallet_email_otp_rate_limits
97
+ WHEN NEW.namespace IS NOT OLD.namespace OR NEW.org_id IS NOT OLD.org_id OR NEW.project_id IS NOT OLD.project_id OR NEW.env_id IS NOT OLD.env_id OR NEW.wallet_id IS NOT OLD.wallet_id OR NEW.rate_key IS NOT OLD.rate_key
98
+ BEGIN SELECT RAISE(ABORT, 'wallet_record_owner_changed'); END;