@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,120 @@
1
+ CREATE TABLE wallet_relocation_authorization_snapshots (
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
+ move_id TEXT NOT NULL,
8
+ request_digest_hex TEXT NOT NULL,
9
+ source_generation INTEGER NOT NULL,
10
+ schema_json TEXT NOT NULL CHECK (json_valid(schema_json)),
11
+ state TEXT NOT NULL CHECK (state IN ('building', 'sealed')),
12
+ chunk_count INTEGER,
13
+ record_count INTEGER,
14
+ digest_hex TEXT,
15
+ PRIMARY KEY (namespace, org_id, project_id, env_id, wallet_id),
16
+ CHECK (
17
+ (state = 'building' AND chunk_count IS NULL AND record_count IS NULL AND digest_hex IS NULL)
18
+ OR (state = 'sealed' AND chunk_count IS NOT NULL AND chunk_count >= 0
19
+ AND record_count IS NOT NULL AND record_count >= 0
20
+ AND digest_hex IS NOT NULL AND length(digest_hex) = 64 AND digest_hex NOT GLOB '*[^a-f0-9]*')
21
+ )
22
+ );
23
+
24
+ CREATE TABLE wallet_relocation_authorization_chunks (
25
+ namespace TEXT NOT NULL,
26
+ org_id TEXT NOT NULL,
27
+ project_id TEXT NOT NULL,
28
+ env_id TEXT NOT NULL,
29
+ wallet_id TEXT NOT NULL,
30
+ chunk_index INTEGER NOT NULL CHECK (chunk_index >= 0),
31
+ record_count INTEGER NOT NULL CHECK (record_count >= 0 AND record_count <= chunk_index + 1),
32
+ chunk_json TEXT NOT NULL CHECK (json_valid(chunk_json) AND length(CAST(chunk_json AS BLOB)) <= 131072),
33
+ digest_hex TEXT NOT NULL CHECK (length(digest_hex) = 64 AND digest_hex NOT GLOB '*[^a-f0-9]*'),
34
+ PRIMARY KEY (namespace, org_id, project_id, env_id, wallet_id, chunk_index)
35
+ );
36
+
37
+ CREATE TRIGGER wallet_authorization_snapshot_insert
38
+ BEFORE INSERT ON wallet_relocation_authorization_snapshots
39
+ WHEN NEW.state != 'building' OR EXISTS (
40
+ SELECT 1 FROM wallet_relocation_authorization_snapshots AS existing
41
+ WHERE existing.namespace = NEW.namespace AND existing.org_id = NEW.org_id
42
+ AND existing.project_id = NEW.project_id AND existing.env_id = NEW.env_id AND existing.wallet_id = NEW.wallet_id
43
+ ) OR NOT EXISTS (
44
+ SELECT 1 FROM wallet_relocation_authorization_fences AS fence
45
+ WHERE fence.namespace = NEW.namespace AND fence.org_id = NEW.org_id
46
+ AND fence.project_id = NEW.project_id AND fence.env_id = NEW.env_id AND fence.wallet_id = NEW.wallet_id
47
+ AND fence.move_id = NEW.move_id AND fence.request_digest_hex = NEW.request_digest_hex
48
+ AND fence.source_generation = NEW.source_generation
49
+ )
50
+ BEGIN
51
+ SELECT RAISE(ABORT, 'wallet_authorization_snapshot_requires_frozen_source');
52
+ END;
53
+
54
+ CREATE TRIGGER wallet_authorization_snapshot_update
55
+ BEFORE UPDATE ON wallet_relocation_authorization_snapshots
56
+ WHEN NEW.namespace IS NOT OLD.namespace OR NEW.org_id IS NOT OLD.org_id
57
+ OR NEW.project_id IS NOT OLD.project_id OR NEW.env_id IS NOT OLD.env_id
58
+ OR NEW.wallet_id IS NOT OLD.wallet_id OR NEW.move_id IS NOT OLD.move_id
59
+ OR NEW.request_digest_hex IS NOT OLD.request_digest_hex OR NEW.source_generation IS NOT OLD.source_generation
60
+ OR NEW.schema_json IS NOT OLD.schema_json
61
+ OR (OLD.state = 'sealed' AND (NEW.state IS NOT OLD.state OR NEW.chunk_count IS NOT OLD.chunk_count
62
+ OR NEW.record_count IS NOT OLD.record_count OR NEW.digest_hex IS NOT OLD.digest_hex))
63
+ OR (NEW.state = 'sealed' AND NEW.chunk_count != (
64
+ SELECT COUNT(*) FROM wallet_relocation_authorization_chunks AS chunk
65
+ WHERE chunk.namespace = OLD.namespace AND chunk.org_id = OLD.org_id
66
+ AND chunk.project_id = OLD.project_id AND chunk.env_id = OLD.env_id AND chunk.wallet_id = OLD.wallet_id
67
+ ))
68
+ OR (NEW.state = 'sealed' AND NEW.record_count != COALESCE((
69
+ SELECT record_count FROM wallet_relocation_authorization_chunks AS chunk
70
+ WHERE chunk.namespace = OLD.namespace AND chunk.org_id = OLD.org_id
71
+ AND chunk.project_id = OLD.project_id AND chunk.env_id = OLD.env_id AND chunk.wallet_id = OLD.wallet_id
72
+ AND chunk.chunk_index = NEW.chunk_count - 1
73
+ ), 0))
74
+ OR (NEW.state = 'sealed' AND NEW.chunk_count > 0 AND NEW.digest_hex IS NOT (
75
+ SELECT digest_hex FROM wallet_relocation_authorization_chunks AS chunk
76
+ WHERE chunk.namespace = OLD.namespace AND chunk.org_id = OLD.org_id
77
+ AND chunk.project_id = OLD.project_id AND chunk.env_id = OLD.env_id AND chunk.wallet_id = OLD.wallet_id
78
+ AND chunk.chunk_index = NEW.chunk_count - 1
79
+ ))
80
+ BEGIN
81
+ SELECT RAISE(ABORT, 'wallet_authorization_snapshot_conflict');
82
+ END;
83
+
84
+ CREATE TRIGGER wallet_authorization_snapshot_delete
85
+ BEFORE DELETE ON wallet_relocation_authorization_snapshots
86
+ BEGIN
87
+ SELECT RAISE(ABORT, 'wallet_authorization_snapshot_retained');
88
+ END;
89
+
90
+ CREATE TRIGGER wallet_authorization_chunk_insert
91
+ BEFORE INSERT ON wallet_relocation_authorization_chunks
92
+ WHEN NOT EXISTS (
93
+ SELECT 1 FROM wallet_relocation_authorization_snapshots AS snapshot
94
+ WHERE snapshot.namespace = NEW.namespace AND snapshot.org_id = NEW.org_id
95
+ AND snapshot.project_id = NEW.project_id AND snapshot.env_id = NEW.env_id AND snapshot.wallet_id = NEW.wallet_id
96
+ AND snapshot.state = 'building'
97
+ ) OR NEW.chunk_index != (
98
+ SELECT COALESCE(MAX(chunk_index), -1) + 1 FROM wallet_relocation_authorization_chunks AS chunk
99
+ WHERE chunk.namespace = NEW.namespace AND chunk.org_id = NEW.org_id
100
+ AND chunk.project_id = NEW.project_id AND chunk.env_id = NEW.env_id AND chunk.wallet_id = NEW.wallet_id
101
+ )
102
+ BEGIN
103
+ SELECT RAISE(ABORT, 'wallet_authorization_chunk_out_of_order');
104
+ END;
105
+
106
+ CREATE TRIGGER wallet_authorization_chunk_update
107
+ BEFORE UPDATE ON wallet_relocation_authorization_chunks
108
+ WHEN NEW.namespace IS NOT OLD.namespace OR NEW.org_id IS NOT OLD.org_id
109
+ 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
110
+ OR NEW.chunk_index IS NOT OLD.chunk_index OR NEW.record_count IS NOT OLD.record_count
111
+ OR NEW.chunk_json IS NOT OLD.chunk_json OR NEW.digest_hex IS NOT OLD.digest_hex
112
+ BEGIN
113
+ SELECT RAISE(ABORT, 'wallet_authorization_chunk_immutable');
114
+ END;
115
+
116
+ CREATE TRIGGER wallet_authorization_chunk_delete
117
+ BEFORE DELETE ON wallet_relocation_authorization_chunks
118
+ BEGIN
119
+ SELECT RAISE(ABORT, 'wallet_authorization_chunk_retained');
120
+ END;
@@ -0,0 +1,424 @@
1
+ -- Standalone history imports cannot be upgraded into a different receipt protocol.
2
+ -- Preserve them by refusing the upgrade if any exist.
3
+ CREATE TABLE wallet_authorization_import_upgrade_guard (count INTEGER NOT NULL CHECK (count = 0));
4
+ INSERT INTO wallet_authorization_import_upgrade_guard
5
+ SELECT (SELECT COUNT(*) FROM wallet_relocation_hosted_imports)
6
+ + (SELECT COUNT(*) FROM wallet_relocation_hosted_import_context)
7
+ + (SELECT COUNT(*) FROM wallet_relocation_hosted_import_receipts);
8
+ DROP TABLE wallet_authorization_import_upgrade_guard;
9
+ DROP TRIGGER wallet_session_authorizations_v2_import_insert_guard;
10
+ DROP TRIGGER wallet_session_authorizations_v2_import_update_guard;
11
+ DROP TRIGGER wallet_session_hosted_credentials_v2_insert_lifecycle_guard;
12
+ DROP TRIGGER wallet_session_hosted_credentials_v2_parent_guard;
13
+ DROP TRIGGER wallet_session_hosted_exchange_codes_v2_insert_lifecycle_guard;
14
+ DROP TRIGGER wallet_session_hosted_exchange_codes_v2_parent_guard;
15
+ DROP TABLE wallet_relocation_hosted_import_receipts;
16
+ DROP TABLE wallet_relocation_hosted_import_context;
17
+ DROP TABLE wallet_relocation_hosted_imports;
18
+
19
+ CREATE TABLE wallet_relocation_authorization_imports (
20
+ namespace TEXT NOT NULL, org_id TEXT NOT NULL, project_id TEXT NOT NULL, env_id TEXT NOT NULL,
21
+ wallet_id TEXT NOT NULL, move_id TEXT NOT NULL, request_digest_hex TEXT NOT NULL,
22
+ source_generation INTEGER NOT NULL CHECK (source_generation > 0 AND source_generation < 9007199254740991),
23
+ state TEXT NOT NULL CHECK (state IN ('importing', 'closed', 'activated')),
24
+ PRIMARY KEY (namespace, org_id, project_id, env_id, wallet_id)
25
+ );
26
+
27
+ CREATE TABLE wallet_relocation_authorization_import_context (
28
+ namespace TEXT NOT NULL, org_id TEXT NOT NULL, project_id TEXT NOT NULL, env_id TEXT NOT NULL,
29
+ wallet_id TEXT NOT NULL, move_id TEXT NOT NULL, request_digest_hex TEXT NOT NULL, source_generation INTEGER NOT NULL,
30
+ table_name TEXT NOT NULL,
31
+ record_key TEXT NOT NULL CHECK (json_valid(record_key)),
32
+ record_digest TEXT NOT NULL CHECK (length(record_digest) = 64 AND record_digest NOT GLOB '*[^a-f0-9]*'),
33
+ PRIMARY KEY (namespace, org_id, project_id, env_id, wallet_id)
34
+ );
35
+
36
+ CREATE TABLE wallet_relocation_authorization_import_receipts (
37
+ namespace TEXT NOT NULL, org_id TEXT NOT NULL, project_id TEXT NOT NULL, env_id TEXT NOT NULL,
38
+ wallet_id TEXT NOT NULL, move_id TEXT NOT NULL, request_digest_hex TEXT NOT NULL, source_generation INTEGER NOT NULL,
39
+ table_name TEXT NOT NULL,
40
+ record_key TEXT NOT NULL CHECK (json_valid(record_key)),
41
+ record_digest TEXT NOT NULL CHECK (length(record_digest) = 64 AND record_digest NOT GLOB '*[^a-f0-9]*'),
42
+ PRIMARY KEY (namespace, org_id, project_id, env_id, wallet_id, move_id, table_name, record_key)
43
+ );
44
+
45
+ CREATE TRIGGER wallet_relocation_authorization_import_identity_guard
46
+ BEFORE UPDATE ON wallet_relocation_authorization_imports
47
+ WHEN NEW.namespace IS NOT OLD.namespace OR NEW.org_id IS NOT OLD.org_id
48
+ OR NEW.project_id IS NOT OLD.project_id OR NEW.env_id IS NOT OLD.env_id
49
+ OR NEW.wallet_id IS NOT OLD.wallet_id OR NEW.move_id IS NOT OLD.move_id
50
+ OR NEW.request_digest_hex IS NOT OLD.request_digest_hex OR NEW.source_generation IS NOT OLD.source_generation
51
+ OR (OLD.state = 'closed' AND NEW.state = 'importing')
52
+ OR (OLD.state = 'activated' AND NEW.state != 'activated')
53
+ OR (OLD.state = 'importing' AND NEW.state = 'activated')
54
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_history_import_transition_rejected'); END;
55
+
56
+ CREATE TRIGGER wallet_relocation_authorization_import_retain
57
+ BEFORE DELETE ON wallet_relocation_authorization_imports
58
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_history_import_retained'); END;
59
+
60
+ CREATE TRIGGER wallet_relocation_authorization_receipt_immutable
61
+ BEFORE UPDATE ON wallet_relocation_authorization_import_receipts
62
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_history_receipt_immutable'); END;
63
+
64
+ CREATE TRIGGER wallet_relocation_authorization_receipt_retain
65
+ BEFORE DELETE ON wallet_relocation_authorization_import_receipts
66
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_history_receipt_retained'); END;
67
+
68
+
69
+ CREATE TRIGGER wallet_session_hosted_credentials_v2_insert_lifecycle_guard
70
+ BEFORE INSERT ON wallet_session_hosted_credentials_v2
71
+ WHEN (NEW.lifecycle_kind != 'active' OR NEW.retired_at_ms IS NOT NULL) AND NOT (NEW.lifecycle_kind = 'retired' AND NEW.retired_at_ms IS NOT NULL AND EXISTS (SELECT 1 FROM wallet_relocation_authorization_import_context AS context
72
+ JOIN wallet_relocation_authorization_imports AS destination
73
+ ON destination.namespace = context.namespace AND destination.org_id = context.org_id
74
+ AND destination.project_id = context.project_id AND destination.env_id = context.env_id
75
+ AND destination.wallet_id = context.wallet_id AND destination.move_id = context.move_id
76
+ AND destination.request_digest_hex = context.request_digest_hex
77
+ AND destination.source_generation = context.source_generation AND destination.state = 'importing'
78
+ WHERE context.namespace = NEW.namespace AND context.org_id = NEW.org_id
79
+ AND context.project_id = NEW.project_id AND context.env_id = NEW.env_id
80
+ AND context.wallet_id = NEW.wallet_id AND context.table_name = 'wallet_session_hosted_credentials_v2'
81
+ AND context.record_key = json_array(NEW.env_id, NEW.hosted_credential_id, NEW.namespace, NEW.org_id, NEW.project_id, NEW.tenant_id)))
82
+ BEGIN SELECT RAISE(ABORT, 'wallet_session_hosted_credential_initial_state_rejected'); END;
83
+
84
+ CREATE TRIGGER wallet_session_hosted_credentials_v2_parent_guard
85
+ BEFORE INSERT ON wallet_session_hosted_credentials_v2
86
+ WHEN NOT EXISTS (
87
+ SELECT 1 FROM wallet_session_authorizations_v2 AS session
88
+ WHERE session.namespace = NEW.namespace AND session.org_id = NEW.org_id
89
+ AND session.project_id = NEW.project_id AND session.env_id = NEW.env_id
90
+ AND session.tenant_id = NEW.tenant_id AND session.authorization_id = NEW.authorization_id
91
+ AND session.wallet_session_id = NEW.wallet_session_id AND session.quota_id = NEW.quota_id
92
+ AND session.principal_id = NEW.principal_id AND session.wallet_id = NEW.wallet_id
93
+ AND session.authority_id = NEW.authority_id AND session.wallet_auth_method_id = NEW.wallet_auth_method_id
94
+ AND session.operation_credential_hash IS NOT NULL AND session.expires_at_ms >= NEW.expires_at_ms
95
+ AND (session.retired_at_ms IS NULL OR (NEW.lifecycle_kind = 'retired' AND NEW.retired_at_ms IS NOT NULL AND EXISTS (SELECT 1 FROM wallet_relocation_authorization_import_context AS context
96
+ JOIN wallet_relocation_authorization_imports AS destination
97
+ ON destination.namespace = context.namespace AND destination.org_id = context.org_id
98
+ AND destination.project_id = context.project_id AND destination.env_id = context.env_id
99
+ AND destination.wallet_id = context.wallet_id AND destination.move_id = context.move_id
100
+ AND destination.request_digest_hex = context.request_digest_hex
101
+ AND destination.source_generation = context.source_generation AND destination.state = 'importing'
102
+ WHERE context.namespace = NEW.namespace AND context.org_id = NEW.org_id
103
+ AND context.project_id = NEW.project_id AND context.env_id = NEW.env_id
104
+ AND context.wallet_id = NEW.wallet_id AND context.table_name = 'wallet_session_hosted_credentials_v2'
105
+ AND context.record_key = json_array(NEW.env_id, NEW.hosted_credential_id, NEW.namespace, NEW.org_id, NEW.project_id, NEW.tenant_id))))
106
+ )
107
+ BEGIN SELECT RAISE(ABORT, 'wallet_session_hosted_credential_parent_rejected'); END;
108
+
109
+ CREATE TRIGGER wallet_session_hosted_exchange_codes_v2_insert_lifecycle_guard
110
+ BEFORE INSERT ON wallet_session_hosted_exchange_codes_v2
111
+ WHEN (NEW.lifecycle_kind != 'issued' OR NEW.hosted_credential_id IS NOT NULL OR NEW.consumed_at_ms IS NOT NULL) AND NOT ((NEW.lifecycle_kind = 'issued' OR (NEW.lifecycle_kind = 'consumed' AND EXISTS (
112
+ SELECT 1 FROM wallet_session_hosted_credentials_v2 AS child
113
+ WHERE child.namespace = NEW.namespace AND child.org_id = NEW.org_id
114
+ AND child.project_id = NEW.project_id AND child.env_id = NEW.env_id
115
+ AND child.tenant_id = NEW.tenant_id AND child.hosted_credential_id = NEW.hosted_credential_id
116
+ AND child.wallet_id = NEW.wallet_id AND child.lifecycle_kind = 'retired'))) AND EXISTS (SELECT 1 FROM wallet_relocation_authorization_import_context AS context
117
+ JOIN wallet_relocation_authorization_imports AS destination
118
+ ON destination.namespace = context.namespace AND destination.org_id = context.org_id
119
+ AND destination.project_id = context.project_id AND destination.env_id = context.env_id
120
+ AND destination.wallet_id = context.wallet_id AND destination.move_id = context.move_id
121
+ AND destination.request_digest_hex = context.request_digest_hex
122
+ AND destination.source_generation = context.source_generation AND destination.state = 'importing'
123
+ WHERE context.namespace = NEW.namespace AND context.org_id = NEW.org_id
124
+ AND context.project_id = NEW.project_id AND context.env_id = NEW.env_id
125
+ AND context.wallet_id = NEW.wallet_id AND context.table_name = 'wallet_session_hosted_exchange_codes_v2'
126
+ AND context.record_key = json_array(NEW.env_id, NEW.exchange_code_id, NEW.namespace, NEW.org_id, NEW.project_id, NEW.tenant_id)))
127
+ BEGIN SELECT RAISE(ABORT, 'wallet_session_hosted_exchange_initial_state_rejected'); END;
128
+
129
+ CREATE TRIGGER wallet_session_hosted_exchange_codes_v2_parent_guard
130
+ BEFORE INSERT ON wallet_session_hosted_exchange_codes_v2
131
+ WHEN NOT EXISTS (
132
+ SELECT 1 FROM wallet_session_authorizations_v2 AS session
133
+ WHERE session.namespace = NEW.namespace AND session.org_id = NEW.org_id
134
+ AND session.project_id = NEW.project_id AND session.env_id = NEW.env_id
135
+ AND session.tenant_id = NEW.tenant_id AND session.authorization_id = NEW.authorization_id
136
+ AND session.wallet_session_id = NEW.wallet_session_id AND session.quota_id = NEW.quota_id
137
+ AND session.principal_id = NEW.principal_id AND session.wallet_id = NEW.wallet_id
138
+ AND session.authority_id = NEW.authority_id AND session.wallet_auth_method_id = NEW.wallet_auth_method_id
139
+ AND session.operation_credential_hash IS NOT NULL AND session.expires_at_ms >= NEW.expires_at_ms
140
+ AND (session.retired_at_ms IS NULL OR ((NEW.lifecycle_kind = 'issued' OR (NEW.lifecycle_kind = 'consumed' AND EXISTS (
141
+ SELECT 1 FROM wallet_session_hosted_credentials_v2 AS child
142
+ WHERE child.namespace = NEW.namespace AND child.org_id = NEW.org_id
143
+ AND child.project_id = NEW.project_id AND child.env_id = NEW.env_id
144
+ AND child.tenant_id = NEW.tenant_id AND child.hosted_credential_id = NEW.hosted_credential_id
145
+ AND child.wallet_id = NEW.wallet_id AND child.lifecycle_kind = 'retired'))) AND EXISTS (SELECT 1 FROM wallet_relocation_authorization_import_context AS context
146
+ JOIN wallet_relocation_authorization_imports AS destination
147
+ ON destination.namespace = context.namespace AND destination.org_id = context.org_id
148
+ AND destination.project_id = context.project_id AND destination.env_id = context.env_id
149
+ AND destination.wallet_id = context.wallet_id AND destination.move_id = context.move_id
150
+ AND destination.request_digest_hex = context.request_digest_hex
151
+ AND destination.source_generation = context.source_generation AND destination.state = 'importing'
152
+ WHERE context.namespace = NEW.namespace AND context.org_id = NEW.org_id
153
+ AND context.project_id = NEW.project_id AND context.env_id = NEW.env_id
154
+ AND context.wallet_id = NEW.wallet_id AND context.table_name = 'wallet_session_hosted_exchange_codes_v2'
155
+ AND context.record_key = json_array(NEW.env_id, NEW.exchange_code_id, NEW.namespace, NEW.org_id, NEW.project_id, NEW.tenant_id))))
156
+ )
157
+ BEGIN SELECT RAISE(ABORT, 'wallet_session_hosted_exchange_parent_rejected'); END;
158
+
159
+ CREATE TRIGGER wallet_authorities_inactive_import_insert
160
+ BEFORE INSERT ON wallet_authorities
161
+ WHEN (EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
162
+ WHERE destination.namespace = NEW.namespace AND destination.org_id = NEW.org_id
163
+ AND destination.project_id = NEW.project_id AND destination.env_id = NEW.env_id
164
+ AND destination.wallet_id = NEW.wallet_id AND destination.state != 'activated') AND NOT EXISTS (
165
+ SELECT 1 FROM wallet_relocation_authorization_import_context AS context
166
+ JOIN wallet_relocation_authorization_imports AS destination
167
+ ON destination.namespace = context.namespace AND destination.org_id = context.org_id
168
+ AND destination.project_id = context.project_id AND destination.env_id = context.env_id
169
+ AND destination.wallet_id = context.wallet_id AND destination.move_id = context.move_id
170
+ AND destination.request_digest_hex = context.request_digest_hex
171
+ AND destination.source_generation = context.source_generation AND destination.state = 'importing'
172
+ WHERE context.namespace = NEW.namespace AND context.wallet_id = NEW.wallet_id
173
+ AND context.table_name = 'wallet_authorities'
174
+ AND context.record_key = json_array(NEW.authority_id, NEW.env_id, NEW.namespace, NEW.org_id, NEW.project_id)
175
+ ))
176
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
177
+
178
+ CREATE TRIGGER wallet_authorities_inactive_import_update
179
+ BEFORE UPDATE ON wallet_authorities
180
+ WHEN (EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
181
+ WHERE destination.namespace = OLD.namespace AND destination.org_id = OLD.org_id
182
+ AND destination.project_id = OLD.project_id AND destination.env_id = OLD.env_id
183
+ AND destination.wallet_id = OLD.wallet_id AND destination.state != 'activated')) OR (EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
184
+ WHERE destination.namespace = NEW.namespace AND destination.org_id = NEW.org_id
185
+ AND destination.project_id = NEW.project_id AND destination.env_id = NEW.env_id
186
+ AND destination.wallet_id = NEW.wallet_id AND destination.state != 'activated'))
187
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
188
+
189
+ CREATE TRIGGER wallet_authorities_inactive_import_delete
190
+ BEFORE DELETE ON wallet_authorities
191
+ WHEN (EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
192
+ WHERE destination.namespace = OLD.namespace AND destination.org_id = OLD.org_id
193
+ AND destination.project_id = OLD.project_id AND destination.env_id = OLD.env_id
194
+ AND destination.wallet_id = OLD.wallet_id AND destination.state != 'activated'))
195
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
196
+
197
+ CREATE TRIGGER wallet_auth_methods_inactive_import_insert
198
+ BEFORE INSERT ON wallet_auth_methods
199
+ WHEN (EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
200
+ WHERE destination.namespace = NEW.namespace AND destination.org_id = NEW.org_id
201
+ AND destination.project_id = NEW.project_id AND destination.env_id = NEW.env_id
202
+ AND destination.wallet_id = NEW.wallet_id AND destination.state != 'activated') AND NOT EXISTS (
203
+ SELECT 1 FROM wallet_relocation_authorization_import_context AS context
204
+ JOIN wallet_relocation_authorization_imports AS destination
205
+ ON destination.namespace = context.namespace AND destination.org_id = context.org_id
206
+ AND destination.project_id = context.project_id AND destination.env_id = context.env_id
207
+ AND destination.wallet_id = context.wallet_id AND destination.move_id = context.move_id
208
+ AND destination.request_digest_hex = context.request_digest_hex
209
+ AND destination.source_generation = context.source_generation AND destination.state = 'importing'
210
+ WHERE context.namespace = NEW.namespace AND context.wallet_id = NEW.wallet_id
211
+ AND context.table_name = 'wallet_auth_methods'
212
+ AND context.record_key = json_array(NEW.env_id, NEW.namespace, NEW.org_id, NEW.project_id, NEW.wallet_auth_method_id)
213
+ ))
214
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
215
+
216
+ CREATE TRIGGER wallet_auth_methods_inactive_import_update
217
+ BEFORE UPDATE ON wallet_auth_methods
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')) OR (EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
222
+ WHERE destination.namespace = NEW.namespace AND destination.org_id = NEW.org_id
223
+ AND destination.project_id = NEW.project_id AND destination.env_id = NEW.env_id
224
+ AND destination.wallet_id = NEW.wallet_id AND destination.state != 'activated'))
225
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
226
+
227
+ CREATE TRIGGER wallet_auth_methods_inactive_import_delete
228
+ BEFORE DELETE ON wallet_auth_methods
229
+ WHEN (EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
230
+ WHERE destination.namespace = OLD.namespace AND destination.org_id = OLD.org_id
231
+ AND destination.project_id = OLD.project_id AND destination.env_id = OLD.env_id
232
+ AND destination.wallet_id = OLD.wallet_id AND destination.state != 'activated'))
233
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
234
+
235
+ CREATE TRIGGER authorization_wallet_session_quotas_inactive_import_insert
236
+ BEFORE INSERT ON authorization_wallet_session_quotas
237
+ WHEN (EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
238
+ WHERE destination.namespace = NEW.namespace AND (
239
+ EXISTS (SELECT 1 FROM wallet_relocation_authorization_import_receipts AS receipt
240
+ WHERE receipt.namespace = destination.namespace AND receipt.org_id = destination.org_id
241
+ AND receipt.project_id = destination.project_id AND receipt.env_id = destination.env_id
242
+ AND receipt.wallet_id = destination.wallet_id AND receipt.table_name = 'authorization_wallet_session_quotas'
243
+ AND receipt.record_key = json_array(NEW.namespace, NEW.quota_id, NEW.tenant_id))
244
+ OR EXISTS (SELECT 1 FROM wallet_session_authorizations_v2 AS session
245
+ WHERE session.namespace = destination.namespace AND session.org_id = destination.org_id
246
+ AND session.project_id = destination.project_id AND session.env_id = destination.env_id
247
+ AND session.wallet_id = destination.wallet_id AND session.namespace = NEW.namespace
248
+ AND session.tenant_id = NEW.tenant_id AND session.quota_id = NEW.quota_id
249
+ AND session.wallet_session_id = NEW.wallet_session_id)
250
+ ) AND destination.state != 'activated') AND NOT EXISTS (
251
+ SELECT 1 FROM wallet_relocation_authorization_import_context AS context
252
+ JOIN wallet_relocation_authorization_imports AS destination
253
+ ON destination.namespace = context.namespace AND destination.org_id = context.org_id
254
+ AND destination.project_id = context.project_id AND destination.env_id = context.env_id
255
+ AND destination.wallet_id = context.wallet_id AND destination.move_id = context.move_id
256
+ AND destination.request_digest_hex = context.request_digest_hex
257
+ AND destination.source_generation = context.source_generation AND destination.state = 'importing'
258
+ WHERE context.namespace = NEW.namespace AND context.table_name = 'authorization_wallet_session_quotas'
259
+ AND context.record_key = json_array(NEW.namespace, NEW.quota_id, NEW.tenant_id)
260
+ ))
261
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
262
+
263
+ CREATE TRIGGER authorization_wallet_session_quotas_inactive_import_update
264
+ BEFORE UPDATE ON authorization_wallet_session_quotas
265
+ WHEN (EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
266
+ WHERE destination.namespace = OLD.namespace AND (
267
+ EXISTS (SELECT 1 FROM wallet_relocation_authorization_import_receipts AS receipt
268
+ WHERE receipt.namespace = destination.namespace AND receipt.org_id = destination.org_id
269
+ AND receipt.project_id = destination.project_id AND receipt.env_id = destination.env_id
270
+ AND receipt.wallet_id = destination.wallet_id AND receipt.table_name = 'authorization_wallet_session_quotas'
271
+ AND receipt.record_key = json_array(OLD.namespace, OLD.quota_id, OLD.tenant_id))
272
+ OR EXISTS (SELECT 1 FROM wallet_session_authorizations_v2 AS session
273
+ WHERE session.namespace = destination.namespace AND session.org_id = destination.org_id
274
+ AND session.project_id = destination.project_id AND session.env_id = destination.env_id
275
+ AND session.wallet_id = destination.wallet_id AND session.namespace = OLD.namespace
276
+ AND session.tenant_id = OLD.tenant_id AND session.quota_id = OLD.quota_id
277
+ AND session.wallet_session_id = OLD.wallet_session_id)
278
+ ) AND destination.state != 'activated')) OR (EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
279
+ WHERE destination.namespace = NEW.namespace AND (
280
+ EXISTS (SELECT 1 FROM wallet_relocation_authorization_import_receipts AS receipt
281
+ WHERE receipt.namespace = destination.namespace AND receipt.org_id = destination.org_id
282
+ AND receipt.project_id = destination.project_id AND receipt.env_id = destination.env_id
283
+ AND receipt.wallet_id = destination.wallet_id AND receipt.table_name = 'authorization_wallet_session_quotas'
284
+ AND receipt.record_key = json_array(NEW.namespace, NEW.quota_id, NEW.tenant_id))
285
+ OR EXISTS (SELECT 1 FROM wallet_session_authorizations_v2 AS session
286
+ WHERE session.namespace = destination.namespace AND session.org_id = destination.org_id
287
+ AND session.project_id = destination.project_id AND session.env_id = destination.env_id
288
+ AND session.wallet_id = destination.wallet_id AND session.namespace = NEW.namespace
289
+ AND session.tenant_id = NEW.tenant_id AND session.quota_id = NEW.quota_id
290
+ AND session.wallet_session_id = NEW.wallet_session_id)
291
+ ) AND destination.state != 'activated'))
292
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
293
+
294
+ CREATE TRIGGER authorization_wallet_session_quotas_inactive_import_delete
295
+ BEFORE DELETE ON authorization_wallet_session_quotas
296
+ WHEN (EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
297
+ WHERE destination.namespace = OLD.namespace AND (
298
+ EXISTS (SELECT 1 FROM wallet_relocation_authorization_import_receipts AS receipt
299
+ WHERE receipt.namespace = destination.namespace AND receipt.org_id = destination.org_id
300
+ AND receipt.project_id = destination.project_id AND receipt.env_id = destination.env_id
301
+ AND receipt.wallet_id = destination.wallet_id AND receipt.table_name = 'authorization_wallet_session_quotas'
302
+ AND receipt.record_key = json_array(OLD.namespace, OLD.quota_id, OLD.tenant_id))
303
+ OR EXISTS (SELECT 1 FROM wallet_session_authorizations_v2 AS session
304
+ WHERE session.namespace = destination.namespace AND session.org_id = destination.org_id
305
+ AND session.project_id = destination.project_id AND session.env_id = destination.env_id
306
+ AND session.wallet_id = destination.wallet_id AND session.namespace = OLD.namespace
307
+ AND session.tenant_id = OLD.tenant_id AND session.quota_id = OLD.quota_id
308
+ AND session.wallet_session_id = OLD.wallet_session_id)
309
+ ) AND destination.state != 'activated'))
310
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
311
+
312
+ CREATE TRIGGER wallet_session_authorizations_v2_inactive_import_insert
313
+ BEFORE INSERT ON wallet_session_authorizations_v2
314
+ WHEN (EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
315
+ WHERE destination.namespace = NEW.namespace AND destination.org_id = NEW.org_id
316
+ AND destination.project_id = NEW.project_id AND destination.env_id = NEW.env_id
317
+ AND destination.wallet_id = NEW.wallet_id AND destination.state != 'activated') AND NOT EXISTS (
318
+ SELECT 1 FROM wallet_relocation_authorization_import_context AS context
319
+ JOIN wallet_relocation_authorization_imports AS destination
320
+ ON destination.namespace = context.namespace AND destination.org_id = context.org_id
321
+ AND destination.project_id = context.project_id AND destination.env_id = context.env_id
322
+ AND destination.wallet_id = context.wallet_id AND destination.move_id = context.move_id
323
+ AND destination.request_digest_hex = context.request_digest_hex
324
+ AND destination.source_generation = context.source_generation AND destination.state = 'importing'
325
+ WHERE context.namespace = NEW.namespace AND context.wallet_id = NEW.wallet_id
326
+ AND context.table_name = 'wallet_session_authorizations_v2'
327
+ AND context.record_key = json_array(NEW.authorization_id, NEW.env_id, NEW.namespace, NEW.org_id, NEW.project_id, NEW.tenant_id)
328
+ ))
329
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
330
+
331
+ CREATE TRIGGER wallet_session_authorizations_v2_inactive_import_update
332
+ BEFORE UPDATE ON wallet_session_authorizations_v2
333
+ WHEN (EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
334
+ WHERE destination.namespace = OLD.namespace AND destination.org_id = OLD.org_id
335
+ AND destination.project_id = OLD.project_id AND destination.env_id = OLD.env_id
336
+ AND destination.wallet_id = OLD.wallet_id AND destination.state != 'activated')) OR (EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
337
+ WHERE destination.namespace = NEW.namespace AND destination.org_id = NEW.org_id
338
+ AND destination.project_id = NEW.project_id AND destination.env_id = NEW.env_id
339
+ AND destination.wallet_id = NEW.wallet_id AND destination.state != 'activated'))
340
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
341
+
342
+ CREATE TRIGGER wallet_session_authorizations_v2_inactive_import_delete
343
+ BEFORE DELETE ON wallet_session_authorizations_v2
344
+ WHEN (EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
345
+ WHERE destination.namespace = OLD.namespace AND destination.org_id = OLD.org_id
346
+ AND destination.project_id = OLD.project_id AND destination.env_id = OLD.env_id
347
+ AND destination.wallet_id = OLD.wallet_id AND destination.state != 'activated'))
348
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
349
+
350
+ CREATE TRIGGER wallet_session_hosted_credentials_v2_inactive_import_insert
351
+ BEFORE INSERT ON wallet_session_hosted_credentials_v2
352
+ WHEN (EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
353
+ WHERE destination.namespace = NEW.namespace AND destination.org_id = NEW.org_id
354
+ AND destination.project_id = NEW.project_id AND destination.env_id = NEW.env_id
355
+ AND destination.wallet_id = NEW.wallet_id AND destination.state != 'activated') AND NOT EXISTS (
356
+ SELECT 1 FROM wallet_relocation_authorization_import_context AS context
357
+ JOIN wallet_relocation_authorization_imports AS destination
358
+ ON destination.namespace = context.namespace AND destination.org_id = context.org_id
359
+ AND destination.project_id = context.project_id AND destination.env_id = context.env_id
360
+ AND destination.wallet_id = context.wallet_id AND destination.move_id = context.move_id
361
+ AND destination.request_digest_hex = context.request_digest_hex
362
+ AND destination.source_generation = context.source_generation AND destination.state = 'importing'
363
+ WHERE context.namespace = NEW.namespace AND context.wallet_id = NEW.wallet_id
364
+ AND context.table_name = 'wallet_session_hosted_credentials_v2'
365
+ AND context.record_key = json_array(NEW.env_id, NEW.hosted_credential_id, NEW.namespace, NEW.org_id, NEW.project_id, NEW.tenant_id)
366
+ ))
367
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
368
+
369
+ CREATE TRIGGER wallet_session_hosted_credentials_v2_inactive_import_update
370
+ BEFORE UPDATE ON wallet_session_hosted_credentials_v2
371
+ WHEN (EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
372
+ WHERE destination.namespace = OLD.namespace AND destination.org_id = OLD.org_id
373
+ AND destination.project_id = OLD.project_id AND destination.env_id = OLD.env_id
374
+ AND destination.wallet_id = OLD.wallet_id AND destination.state != 'activated')) OR (EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
375
+ WHERE destination.namespace = NEW.namespace AND destination.org_id = NEW.org_id
376
+ AND destination.project_id = NEW.project_id AND destination.env_id = NEW.env_id
377
+ AND destination.wallet_id = NEW.wallet_id AND destination.state != 'activated'))
378
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
379
+
380
+ CREATE TRIGGER wallet_session_hosted_credentials_v2_inactive_import_delete
381
+ BEFORE DELETE ON wallet_session_hosted_credentials_v2
382
+ WHEN (EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
383
+ WHERE destination.namespace = OLD.namespace AND destination.org_id = OLD.org_id
384
+ AND destination.project_id = OLD.project_id AND destination.env_id = OLD.env_id
385
+ AND destination.wallet_id = OLD.wallet_id AND destination.state != 'activated'))
386
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
387
+
388
+ CREATE TRIGGER wallet_session_hosted_exchange_codes_v2_inactive_import_insert
389
+ BEFORE INSERT ON wallet_session_hosted_exchange_codes_v2
390
+ WHEN (EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
391
+ WHERE destination.namespace = NEW.namespace AND destination.org_id = NEW.org_id
392
+ AND destination.project_id = NEW.project_id AND destination.env_id = NEW.env_id
393
+ AND destination.wallet_id = NEW.wallet_id AND destination.state != 'activated') AND NOT EXISTS (
394
+ SELECT 1 FROM wallet_relocation_authorization_import_context AS context
395
+ JOIN wallet_relocation_authorization_imports AS destination
396
+ ON destination.namespace = context.namespace AND destination.org_id = context.org_id
397
+ AND destination.project_id = context.project_id AND destination.env_id = context.env_id
398
+ AND destination.wallet_id = context.wallet_id AND destination.move_id = context.move_id
399
+ AND destination.request_digest_hex = context.request_digest_hex
400
+ AND destination.source_generation = context.source_generation AND destination.state = 'importing'
401
+ WHERE context.namespace = NEW.namespace AND context.wallet_id = NEW.wallet_id
402
+ AND context.table_name = 'wallet_session_hosted_exchange_codes_v2'
403
+ AND context.record_key = json_array(NEW.env_id, NEW.exchange_code_id, NEW.namespace, NEW.org_id, NEW.project_id, NEW.tenant_id)
404
+ ))
405
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
406
+
407
+ CREATE TRIGGER wallet_session_hosted_exchange_codes_v2_inactive_import_update
408
+ BEFORE UPDATE ON wallet_session_hosted_exchange_codes_v2
409
+ WHEN (EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
410
+ WHERE destination.namespace = OLD.namespace AND destination.org_id = OLD.org_id
411
+ AND destination.project_id = OLD.project_id AND destination.env_id = OLD.env_id
412
+ AND destination.wallet_id = OLD.wallet_id AND destination.state != 'activated')) OR (EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
413
+ WHERE destination.namespace = NEW.namespace AND destination.org_id = NEW.org_id
414
+ AND destination.project_id = NEW.project_id AND destination.env_id = NEW.env_id
415
+ AND destination.wallet_id = NEW.wallet_id AND destination.state != 'activated'))
416
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
417
+
418
+ CREATE TRIGGER wallet_session_hosted_exchange_codes_v2_inactive_import_delete
419
+ BEFORE DELETE ON wallet_session_hosted_exchange_codes_v2
420
+ WHEN (EXISTS (SELECT 1 FROM wallet_relocation_authorization_imports AS destination
421
+ WHERE destination.namespace = OLD.namespace AND destination.org_id = OLD.org_id
422
+ AND destination.project_id = OLD.project_id AND destination.env_id = OLD.env_id
423
+ AND destination.wallet_id = OLD.wallet_id AND destination.state != 'activated'))
424
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_destination_inactive'); END;
@@ -0,0 +1,44 @@
1
+ CREATE TABLE wallet_relocation_authorization_intakes (
2
+ namespace TEXT NOT NULL, org_id TEXT NOT NULL, project_id TEXT NOT NULL, env_id TEXT NOT NULL,
3
+ wallet_id TEXT NOT NULL, move_id TEXT NOT NULL, request_digest_hex TEXT NOT NULL,
4
+ source_generation INTEGER NOT NULL, manifest_json TEXT NOT NULL CHECK(json_valid(manifest_json)),
5
+ next_index INTEGER NOT NULL DEFAULT 0 CHECK(next_index >= 0),
6
+ record_count INTEGER NOT NULL DEFAULT 0 CHECK(record_count >= 0),
7
+ digest_hex TEXT NOT NULL,
8
+ state TEXT NOT NULL DEFAULT 'receiving' CHECK(state IN ('receiving', 'verified')),
9
+ PRIMARY KEY(namespace, org_id, project_id, env_id, wallet_id)
10
+ );
11
+ CREATE TABLE wallet_relocation_authorization_intake_chunks (
12
+ namespace TEXT NOT NULL, org_id TEXT NOT NULL, project_id TEXT NOT NULL, env_id TEXT NOT NULL,
13
+ wallet_id TEXT NOT NULL, chunk_index INTEGER NOT NULL CHECK(chunk_index >= 0),
14
+ chunk_json TEXT NOT NULL CHECK(json_valid(chunk_json) AND length(CAST(chunk_json AS BLOB)) <= 131072),
15
+ digest_hex TEXT NOT NULL,
16
+ PRIMARY KEY(namespace, org_id, project_id, env_id, wallet_id, chunk_index)
17
+ );
18
+ CREATE TRIGGER wallet_authorization_intake_identity_immutable
19
+ BEFORE UPDATE ON wallet_relocation_authorization_intakes
20
+ WHEN NEW.namespace IS NOT OLD.namespace OR NEW.org_id IS NOT OLD.org_id
21
+ OR NEW.project_id IS NOT OLD.project_id OR NEW.env_id IS NOT OLD.env_id
22
+ OR NEW.wallet_id IS NOT OLD.wallet_id OR NEW.move_id IS NOT OLD.move_id
23
+ OR NEW.request_digest_hex IS NOT OLD.request_digest_hex OR NEW.source_generation IS NOT OLD.source_generation
24
+ OR NEW.manifest_json IS NOT OLD.manifest_json OR OLD.state = 'verified'
25
+ OR NEW.next_index < OLD.next_index OR NEW.next_index > OLD.next_index + 1
26
+ OR NEW.record_count < OLD.record_count OR NEW.record_count > OLD.record_count + 1
27
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_intake_immutable'); END;
28
+ CREATE TRIGGER wallet_authorization_intake_retained
29
+ BEFORE DELETE ON wallet_relocation_authorization_intakes
30
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_intake_retained'); END;
31
+ CREATE TRIGGER wallet_authorization_intake_chunk_immutable
32
+ BEFORE UPDATE ON wallet_relocation_authorization_intake_chunks
33
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_intake_chunk_immutable'); END;
34
+ CREATE TRIGGER wallet_authorization_intake_chunk_retained
35
+ BEFORE DELETE ON wallet_relocation_authorization_intake_chunks
36
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_intake_chunk_retained'); END;
37
+ CREATE TRIGGER wallet_authorization_intake_chunk_admission
38
+ BEFORE INSERT ON wallet_relocation_authorization_intake_chunks
39
+ WHEN NOT EXISTS (SELECT 1 FROM wallet_relocation_authorization_intakes AS intake
40
+ WHERE intake.namespace = NEW.namespace AND intake.org_id = NEW.org_id
41
+ AND intake.project_id = NEW.project_id AND intake.env_id = NEW.env_id
42
+ AND intake.wallet_id = NEW.wallet_id AND intake.state = 'receiving'
43
+ AND intake.next_index = NEW.chunk_index)
44
+ BEGIN SELECT RAISE(ABORT, 'wallet_authorization_intake_chunk_out_of_order'); END;
@@ -0,0 +1,59 @@
1
+ -- Ceremony state and its wallet activity projection commit in one transaction.
2
+ CREATE TABLE wallet_ceremony_activity (
3
+ namespace TEXT NOT NULL,
4
+ org_id TEXT NOT NULL,
5
+ project_id TEXT NOT NULL,
6
+ env_id TEXT NOT NULL,
7
+ record_key TEXT NOT NULL,
8
+ wallet_id TEXT NOT NULL,
9
+ settled INTEGER NOT NULL CHECK (settled IN (0, 1)),
10
+ PRIMARY KEY (namespace, org_id, project_id, env_id, record_key),
11
+ FOREIGN KEY (namespace, org_id, project_id, env_id, record_key)
12
+ REFERENCES router_ab_yao_versioned_json_records (namespace, org_id, project_id, env_id, record_key)
13
+ ON DELETE CASCADE
14
+ );
15
+ CREATE INDEX wallet_ceremony_activity_by_wallet
16
+ ON wallet_ceremony_activity (namespace, org_id, project_id, env_id, wallet_id, settled);
17
+
18
+ CREATE TRIGGER wallet_ceremony_activity_owner_immutable
19
+ BEFORE UPDATE ON wallet_ceremony_activity
20
+ WHEN NEW.wallet_id IS NOT OLD.wallet_id
21
+ BEGIN
22
+ SELECT RAISE(ABORT, 'wallet_ceremony_owner_changed');
23
+ END;
24
+
25
+ CREATE TRIGGER wallet_ceremony_activity_retired_insert
26
+ BEFORE INSERT ON wallet_ceremony_activity
27
+ WHEN NEW.settled = 0 AND EXISTS (
28
+ SELECT 1 FROM wallet_relocation_session_fences AS fence
29
+ WHERE fence.namespace = NEW.namespace AND fence.org_id = NEW.org_id
30
+ AND fence.project_id = NEW.project_id AND fence.env_id = NEW.env_id
31
+ AND fence.wallet_id = NEW.wallet_id
32
+ )
33
+ BEGIN
34
+ SELECT RAISE(ABORT, 'wallet_ceremony_admission_closed');
35
+ END;
36
+
37
+ CREATE TRIGGER wallet_ceremony_activity_retired_update
38
+ BEFORE UPDATE ON wallet_ceremony_activity
39
+ WHEN NEW.settled = 0 AND EXISTS (
40
+ SELECT 1 FROM wallet_relocation_session_fences AS fence
41
+ WHERE fence.namespace = NEW.namespace AND fence.org_id = NEW.org_id
42
+ AND fence.project_id = NEW.project_id AND fence.env_id = NEW.env_id
43
+ AND fence.wallet_id = NEW.wallet_id
44
+ )
45
+ BEGIN
46
+ SELECT RAISE(ABORT, 'wallet_ceremony_admission_closed');
47
+ END;
48
+
49
+ CREATE TRIGGER wallet_relocation_sessions_require_settled_ceremonies
50
+ BEFORE INSERT ON wallet_relocation_session_fences
51
+ WHEN EXISTS (
52
+ SELECT 1 FROM wallet_ceremony_activity AS activity
53
+ WHERE activity.namespace = NEW.namespace AND activity.org_id = NEW.org_id
54
+ AND activity.project_id = NEW.project_id AND activity.env_id = NEW.env_id
55
+ AND activity.wallet_id = NEW.wallet_id AND activity.settled = 0
56
+ )
57
+ BEGIN
58
+ SELECT RAISE(ABORT, 'wallet_ceremonies_unsettled');
59
+ END;