@seams/wallet-server 0.7.1 → 0.7.3

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 (259) hide show
  1. package/THIRD_PARTY_NOTICES.md +1 -105
  2. package/artifact-manifest.json +21 -21
  3. package/cloudflare-router-ab/build/deriver-a/build-stamp.json +1 -1
  4. package/cloudflare-router-ab/build/deriver-a/index_bg.wasm +0 -0
  5. package/cloudflare-router-ab/build/deriver-b/build-stamp.json +1 -1
  6. package/cloudflare-router-ab/build/deriver-b/index_bg.wasm +0 -0
  7. package/cloudflare-router-ab/build/local-tools/darwin-arm64/router_ab_local_init +0 -0
  8. package/cloudflare-router-ab/build/local-tools/darwin-x64/router_ab_local_init +0 -0
  9. package/cloudflare-router-ab/build/local-tools/linux-x64/router_ab_local_init +0 -0
  10. package/cloudflare-router-ab/build/router/build-stamp.json +1 -1
  11. package/cloudflare-router-ab/build/router/index_bg.wasm +0 -0
  12. package/cloudflare-router-ab/build/signing-worker/build-stamp.json +1 -1
  13. package/cloudflare-router-ab/build/signing-worker/index_bg.wasm +0 -0
  14. package/cloudflare-router-ab/build/tenant-root-control-plane/build-stamp.json +1 -1
  15. package/cloudflare-router-ab/build/tenant-root-control-plane/index_bg.wasm +0 -0
  16. package/dist/esm/authorization/service.js +8 -0
  17. package/dist/esm/authorization/vaultProxyUse.js +2 -6
  18. package/dist/esm/cloud-host.js +4 -4
  19. package/dist/esm/core/IdentityStore.js +23 -110
  20. package/dist/esm/core/SessionService.js +7 -30
  21. package/dist/esm/core/ThresholdService/routerAbNormalSigningPolicy.js +3 -10
  22. package/dist/esm/core/ThresholdService/stores/WalletSessionStore.js +21 -97
  23. package/dist/esm/core/ThresholdService/stores/exportReplayGuard.js +7 -0
  24. package/dist/esm/core/WalletStore.js +4 -6
  25. package/dist/esm/core/authService/bytes.js +1 -4
  26. package/dist/esm/core/authService/emailOtpChallengeOperations.js +2 -5
  27. package/dist/esm/core/authService/emailOtpChallengeProof.js +9 -40
  28. package/dist/esm/core/authService/emailOtpChallengeVerification.js +19 -90
  29. package/dist/esm/core/authService/emailOtpChallenges.js +10 -45
  30. package/dist/esm/core/authService/emailOtpDelivery.js +10 -45
  31. package/dist/esm/core/authService/emailOtpEnrollment.js +9 -40
  32. package/dist/esm/core/authService/emailOtpGrant.js +9 -40
  33. package/dist/esm/core/authService/emailOtpRegistrationEnrollment.js +9 -40
  34. package/dist/esm/core/authService/emailOtpSeal.js +5 -20
  35. package/dist/esm/core/authService/emailOtpUnlock.js +20 -110
  36. package/dist/esm/core/authService/googleEmailOtpRegistration.js +28 -115
  37. package/dist/esm/core/authService/identity.js +5 -20
  38. package/dist/esm/core/authService/nearPublicKeyMetadata.js +6 -25
  39. package/dist/esm/core/authService/oidcVerification.js +22 -34
  40. package/dist/esm/core/authService/rateLimits.js +2 -5
  41. package/dist/esm/core/authService/thresholdEcdsaKeyInventory.js +2 -1
  42. package/dist/esm/core/authService/webauthn.js +37 -191
  43. package/dist/esm/core/authService/webauthnVerificationOutcomes.js +5 -24
  44. package/dist/esm/core/d1EcdsaSignerRead.js +76 -0
  45. package/dist/esm/core/d1IdentityStore.js +16 -75
  46. package/dist/esm/core/d1TenantStore.js +1 -1
  47. package/dist/esm/core/d1WalletStore.js +15 -25
  48. package/dist/esm/core/deviceLinking/linkedDeviceEmailOtpGrant.js +1 -5
  49. package/dist/esm/core/deviceLinking/linkedDeviceSessionApproval.js +1 -3
  50. package/dist/esm/core/deviceLinking/linkedDeviceSessionRecord.js +2 -8
  51. package/dist/esm/core/deviceLinking/requestProof.js +13 -4
  52. package/dist/esm/core/ecdsaMaterialReadSnapshot.js +85 -0
  53. package/dist/esm/core/nearRelayerAccountProvisioning.js +2 -5
  54. package/dist/esm/core/signingLanes/WalletExecutionLaneProjection.js +3 -6
  55. package/dist/esm/core/signingMaterial/ordinaryInactiveSignerMaterialReservation.js +2 -5
  56. package/dist/esm/core/storeBackends.js +1 -1
  57. package/dist/esm/core/thresholdEcdsaChainTarget.js +1 -3
  58. package/dist/esm/hosted-wallet-gateway.js +2 -2
  59. package/dist/esm/localHostedWalletGatewayHandler.js +13 -0
  60. package/dist/esm/localIntendedMaterialAdmissionFault.js +176 -0
  61. package/dist/esm/localIntendedPresignCancellation.js +44 -0
  62. package/dist/esm/router/auth/commonRouterUtils.js +24 -10
  63. package/dist/esm/router/auth/walletSessionFailure.js +2 -5
  64. package/dist/esm/router/auth/webAuthnCredentialCodecs.js +4 -15
  65. package/dist/esm/router/cloudflare/d1/auth/d1AuthorizedOperationRouteService.js +1 -0
  66. package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthBoundary.js +2 -6
  67. package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthService.js +5 -27
  68. package/dist/esm/router/cloudflare/d1/auth/walletSessionCredentialReaders.js +76 -0
  69. package/dist/esm/router/cloudflare/d1/authorization/authorizedOperationStatements.js +28 -21
  70. package/dist/esm/router/cloudflare/d1/authorization/d1AuthorizationStore.js +209 -44
  71. package/dist/esm/router/cloudflare/d1/authorization/d1VaultProxyStore.js +8 -12
  72. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.js +50 -8
  73. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.js +1 -1
  74. package/dist/esm/router/cloudflare/d1/deviceLinking/index.js +3 -3
  75. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.js +12 -55
  76. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeService.js +17 -80
  77. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpDeliveryRuntime.js +6 -25
  78. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.js +12 -47
  79. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecoveryService.js +24 -85
  80. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRegistrationEnrollmentFinalizer.js +7 -30
  81. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpServerSealRuntime.js +5 -20
  82. package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpSessionResolver.js +23 -110
  83. package/dist/esm/router/cloudflare/d1/identity/d1IdentityService.js +9 -40
  84. package/dist/esm/router/cloudflare/d1/near/d1NearPublicKeyStore.js +3 -10
  85. package/dist/esm/router/cloudflare/d1/oidc/d1OidcBoundary.js +18 -91
  86. package/dist/esm/router/cloudflare/d1/oidc/d1OidcVerificationService.js +6 -30
  87. package/dist/esm/router/cloudflare/d1/passkeyCustody/d1PasskeyCustodyRouteService.js +4 -15
  88. package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.js +2 -7
  89. package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletRecoveryGoogleEmailOtpRecords.js +9 -13
  90. package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletRecoveryGoogleEmailOtpService.js +11 -50
  91. package/dist/esm/router/cloudflare/d1/registration/d1EvmFamilyEcdsaRegistrationBranch.js +5 -20
  92. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.js +4 -7
  93. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.js +2 -1
  94. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationIntentService.js +7 -30
  95. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationService.js +32 -22
  96. package/dist/esm/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.js +1 -4
  97. package/dist/esm/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.js +119 -25
  98. package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnAuthService.js +31 -168
  99. package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnRecords.js +6 -9
  100. package/dist/esm/router/cloudflare/durableObjects/thresholdStore.js +59 -66
  101. package/dist/esm/router/cloudflare/runtime/routerAbPrewarm.js +2 -2
  102. package/dist/esm/router/cloudflare/runtime/staticWalletConsoleBinding.js +5 -20
  103. package/dist/esm/router/cloudflare/runtime/tenantRootCreationGrant.js +2 -9
  104. package/dist/esm/router/cloudflare/runtime/walletControlOps.js +2 -1
  105. package/dist/esm/router/cloudflare/signingLanes/cloudflareLaneCurveExecution.js +2 -1
  106. package/dist/esm/router/cloudflare/signingLanes/cloudflareLaneProtocolCommitter.js +2 -2
  107. package/dist/esm/router/cloudflare.js +2146 -1802
  108. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPersistence.js +5 -8
  109. package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryWalletSessionAuthorization.js +3 -6
  110. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.js +6 -25
  111. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.js +39 -55
  112. package/dist/esm/router/domains/emailOtp/emailOtpRouteHandlers.js +15 -62
  113. package/dist/esm/router/domains/signingOperations/routerAbEcdsaDerivationNormalSigningRoute.js +83 -74
  114. package/dist/esm/router/domains/signingOperations/routerAbNormalSigningAdmission.js +1 -0
  115. package/dist/esm/router/domains/signingOperations/routerAbOperationStepUp.js +1 -0
  116. package/dist/esm/router/domains/signingOperations/walletExecutionAdmission.js +1 -4
  117. package/dist/esm/router/domains/tenantRoot/tenantRootIdentityResolution.js +7 -13
  118. package/dist/esm/router/domains/walletUnlock/walletUnlockRouteHandlers.js +41 -200
  119. package/dist/esm/router/express.js +317 -699
  120. package/dist/esm/router/framework/http.js +5 -1
  121. package/dist/esm/router/framework/runtimeSnapshotConsumer.js +8 -35
  122. package/dist/esm/router/transport/fetch/createFetchRouter.js +3 -6
  123. package/dist/esm/router/transport/fetch/routes/auth.js +9 -41
  124. package/dist/esm/router/transport/fetch/routes/deviceLinkingOwnerAuthorization.js +5 -22
  125. package/dist/esm/router/transport/fetch/routes/nearPublicKeys.js +4 -16
  126. package/dist/esm/router/transport/fetch/routes/sessions.js +1 -0
  127. package/dist/esm/router/transport/fetch/routes/syncAccount.js +8 -36
  128. package/dist/esm/router/transport/fetch/routes/thresholdEcdsa.js +27 -79
  129. package/dist/esm/router/transport/fetch/routes/walletExecutionLanePreflight.js +4 -1
  130. package/dist/esm/router/transport/fetch/routes/webauthnAuthenticators.js +4 -16
  131. package/dist/esm/shared-ts/src/authorization/walletSignerActivationEquality.js +12 -0
  132. package/dist/esm/shared-ts/src/device-linking/committedSignerPackages.js +2 -5
  133. package/dist/esm/shared-ts/src/device-linking/delegatedActivationPlan.js +1 -5
  134. package/dist/esm/shared-ts/src/device-linking/ed25519ExportRoot.js +12 -16
  135. package/dist/esm/shared-ts/src/device-linking/sourceContribution.js +5 -8
  136. package/dist/esm/shared-ts/src/passkey-custody/primitives.js +5 -1
  137. package/dist/esm/shared-ts/src/signing-lanes/ownerContinuity.js +4 -8
  138. package/dist/esm/shared-ts/src/tenant-root/tenantRootIdentifier.js +12 -0
  139. package/dist/esm/shared-ts/src/tenant-root/tenantRootIdentity.js +2 -9
  140. package/dist/esm/shared-ts/src/tenant-root/tenantRootOperationRecord.js +1 -4
  141. package/dist/esm/shared-ts/src/utils/ecdsaKeyFactsInventory.js +2 -4
  142. package/dist/esm/shared-ts/src/utils/ecdsaServerTiming.js +0 -1
  143. package/dist/esm/shared-ts/src/utils/emailOtpDomain.js +3 -1
  144. package/dist/esm/shared-ts/src/utils/exactKeys.js +17 -0
  145. package/dist/esm/shared-ts/src/utils/failure.js +20 -0
  146. package/dist/esm/shared-ts/src/utils/registrationIntent.js +3 -12
  147. package/dist/esm/shared-ts/src/utils/registrationSignerPlan.js +2 -5
  148. package/dist/esm/shared-ts/src/utils/routerAbEcdsaDerivation.js +1 -1
  149. package/dist/esm/shared-ts/src/utils/routerAbEd25519Yao.js +1 -1
  150. package/dist/esm/shared-ts/src/utils/thresholdEcdsaChainTarget.js +9 -0
  151. package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryCommittedProjection.js +1 -4
  152. package/dist/esm/threshold/session/signingSessionSeal/crypto/cipher.js +10 -32
  153. package/dist/esm/threshold/session/signingSessionSeal/idempotencyBackends.js +3 -3
  154. package/dist/esm/threshold/session/signingSessionSeal/idempotencyRecords.js +3 -9
  155. package/dist/esm/threshold/session/signingSessionSeal/service.js +8 -35
  156. package/dist/esm/threshold/session/signingSessionSeal/transport/express.js +18 -94
  157. package/dist/esm/threshold/session/signingSessionSeal/transport/fetch.js +6 -30
  158. package/dist/esm/threshold/session/signingSessionSeal/transport/shared.js +5 -20
  159. package/dist/esm/wasm/evm_crypto/pkg/evm_crypto_bg.wasm +0 -0
  160. package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker_bg.wasm +0 -0
  161. package/dist/types/shared-ts/src/authorization/delegatedAuthority.d.ts +2 -1
  162. package/dist/types/shared-ts/src/authorization/walletSessionIssuance.d.ts +9 -2
  163. package/dist/types/shared-ts/src/authorization/walletSignerActivationEquality.d.ts +4 -0
  164. package/dist/types/shared-ts/src/device-linking/committedSignerPackages.d.ts +3 -4
  165. package/dist/types/shared-ts/src/device-linking/contracts.d.ts +5 -63
  166. package/dist/types/shared-ts/src/device-linking/sourceContribution.d.ts +2 -0
  167. package/dist/types/shared-ts/src/passkey-custody/custodyEnvelope.d.ts +5 -12
  168. package/dist/types/shared-ts/src/passkey-custody/primitives.d.ts +9 -0
  169. package/dist/types/shared-ts/src/signing-lanes/execution.d.ts +11 -1
  170. package/dist/types/shared-ts/src/signing-lanes/ids.d.ts +1 -10
  171. package/dist/types/shared-ts/src/signing-lanes/rotation.d.ts +3 -5
  172. package/dist/types/shared-ts/src/tenant-root/tenantRootIdentifier.d.ts +3 -0
  173. package/dist/types/shared-ts/src/tenant-root/tenantRootOperationRecord.d.ts +2 -1
  174. package/dist/types/shared-ts/src/threshold/ecdsaDerivationRoleLocalBootstrap.d.ts +6 -0
  175. package/dist/types/shared-ts/src/threshold/signingRootScope.d.ts +1 -0
  176. package/dist/types/shared-ts/src/utils/ecdsaKeyFactsInventory.d.ts +2 -11
  177. package/dist/types/shared-ts/src/utils/eip1559TxWasmJson.d.ts +16 -0
  178. package/dist/types/shared-ts/src/utils/emailOtpDomain.d.ts +2 -0
  179. package/dist/types/shared-ts/src/utils/exactKeys.d.ts +11 -0
  180. package/dist/types/shared-ts/src/utils/failure.d.ts +12 -0
  181. package/dist/types/shared-ts/src/utils/jsonRpc.d.ts +3 -4
  182. package/dist/types/shared-ts/src/utils/nearRpcResults.d.ts +1 -0
  183. package/dist/types/shared-ts/src/utils/registrationAuthMethodInput.d.ts +3 -8
  184. package/dist/types/shared-ts/src/utils/registrationSignerPlan.d.ts +7 -19
  185. package/dist/types/shared-ts/src/utils/routerAbEcdsaDerivation.d.ts +3 -1
  186. package/dist/types/shared-ts/src/utils/routerAbEd25519Yao.d.ts +1 -0
  187. package/dist/types/shared-ts/src/utils/routerAbEd25519YaoDigests.d.ts +3 -4
  188. package/dist/types/shared-ts/src/utils/routerAbNormalSigningIdentity.d.ts +30 -8
  189. package/dist/types/shared-ts/src/utils/routerApiKeyAuth.d.ts +2 -0
  190. package/dist/types/shared-ts/src/utils/signingSessionSeal.d.ts +10 -11
  191. package/dist/types/shared-ts/src/utils/thresholdEcdsaChainTarget.d.ts +25 -0
  192. package/dist/types/shared-ts/src/utils/variant.d.ts +18 -0
  193. package/dist/types/shared-ts/src/utils/walletAuthMethodRecord.d.ts +3 -6
  194. package/dist/types/shared-ts/src/utils/webauthnDeviceInfo.d.ts +4 -2
  195. package/dist/types/shared-ts/src/wallet-recovery/recoveryEnvelopes.d.ts +3 -16
  196. package/dist/types/shared-ts/src/wallet-recovery/walletRecoveryPreparation.d.ts +15 -0
  197. package/dist/types/shared-ts/src/wallet-recovery/walletRecoveryTarget.d.ts +3 -4
  198. package/dist/types/wallet-server/src/authorization/domain.d.ts +13 -2
  199. package/dist/types/wallet-server/src/authorization/ecdsaWalletSessionAdmission.d.ts +27 -3
  200. package/dist/types/wallet-server/src/authorization/service.d.ts +19 -0
  201. package/dist/types/wallet-server/src/core/ThresholdService/stores/SessionStore.d.ts +2 -2
  202. package/dist/types/wallet-server/src/core/ThresholdService/stores/WalletSessionStore.d.ts +1 -1
  203. package/dist/types/wallet-server/src/core/ThresholdService/stores/exportReplayGuard.d.ts +3 -0
  204. package/dist/types/wallet-server/src/core/ThresholdService/validation.d.ts +8 -101
  205. package/dist/types/wallet-server/src/core/WebAuthnAuthenticatorStore.d.ts +8 -0
  206. package/dist/types/wallet-server/src/core/authService/bytes.d.ts +0 -1
  207. package/dist/types/wallet-server/src/core/authService/emailOtpChallenges.d.ts +2 -10
  208. package/dist/types/wallet-server/src/core/authService/emailOtpSeal.d.ts +1 -1
  209. package/dist/types/wallet-server/src/core/authService/emailOtpUnlock.d.ts +3 -10
  210. package/dist/types/wallet-server/src/core/d1EcdsaSignerRead.d.ts +39 -0
  211. package/dist/types/wallet-server/src/core/d1WalletStore.d.ts +10 -0
  212. package/dist/types/wallet-server/src/core/deviceLinking/linkedDeviceSessionRecord.d.ts +3 -4
  213. package/dist/types/wallet-server/src/core/ecdsaMaterialReadSnapshot.d.ts +19 -0
  214. package/dist/types/wallet-server/src/core/routerAbSigning/RouterAbNormalSigningRuntime.d.ts +3 -5
  215. package/dist/types/wallet-server/src/core/rpcClients/near/NearClient.d.ts +1 -2
  216. package/dist/types/wallet-server/src/core/signingLanes/WalletExecutionLaneProjection.d.ts +2 -11
  217. package/dist/types/wallet-server/src/core/signingLanes/signingWorkerLaneMaterialIdentity.d.ts +2 -19
  218. package/dist/types/wallet-server/src/core/thresholdEcdsaChainTarget.d.ts +3 -11
  219. package/dist/types/wallet-server/src/core/types.d.ts +2 -6
  220. package/dist/types/wallet-server/src/localIntendedMaterialAdmissionFault.d.ts +38 -0
  221. package/dist/types/wallet-server/src/localIntendedPresignCancellation.d.ts +4 -0
  222. package/dist/types/wallet-server/src/router/auth/authRequestValidation.d.ts +4 -9
  223. package/dist/types/wallet-server/src/router/auth/commonRouterUtils.d.ts +15 -1
  224. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthBoundary.d.ts +0 -1
  225. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthService.d.ts +1 -1
  226. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/walletSessionCredentialReaders.d.ts +9 -0
  227. package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/authorizedOperationStatements.d.ts +4 -0
  228. package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/d1AuthorizationStore.d.ts +10 -1
  229. package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.d.ts +19 -2
  230. package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionStore.d.ts +2 -6
  231. package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.d.ts +5 -8
  232. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpEnrollmentStore.d.ts +2 -8
  233. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.d.ts +2 -9
  234. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.d.ts +5 -5
  235. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpServerSealRuntime.d.ts +4 -14
  236. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.d.ts +2 -6
  237. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationService.d.ts +8 -6
  238. package/dist/types/wallet-server/src/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.d.ts +14 -1
  239. package/dist/types/wallet-server/src/router/cloudflare/d1/webauthn/d1WebAuthnRecords.d.ts +10 -39
  240. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOps.d.ts +8 -34
  241. package/dist/types/wallet-server/src/router/domains/ecdsa/thresholdEcdsaRequestValidation.d.ts +3 -15
  242. package/dist/types/wallet-server/src/router/domains/ed25519Yao/session/routerAbEd25519YaoWalletSession.d.ts +9 -50
  243. package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletRecoveryKeyManifest.d.ts +1 -13
  244. package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbEcdsaDerivationNormalSigningRoute.d.ts +8 -9
  245. package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbNormalSigningAdmission.d.ts +13 -0
  246. package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbOperationStepUp.d.ts +3 -4
  247. package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbPrivateSigningWorker.d.ts +7 -16
  248. package/dist/types/wallet-server/src/router/domains/syncAccount/syncAccountRequestValidation.d.ts +2 -7
  249. package/dist/types/wallet-server/src/router/framework/apiCredentialPorts.d.ts +3 -1
  250. package/dist/types/wallet-server/src/router/framework/authServicePort.d.ts +25 -4
  251. package/dist/types/wallet-server/src/router/framework/http.d.ts +1 -0
  252. package/dist/types/wallet-server/src/router/framework/ror/normalize.d.ts +1 -9
  253. package/dist/types/wallet-server/src/router/transport/fetch/routes/deviceLinkingOwnerAuthorization.d.ts +3 -6
  254. package/dist/types/wallet-server/src/router/transport/fetch/routes/syncAccountBootstrap.d.ts +3 -5
  255. package/dist/types/wallet-server/src/router/transport/fetch/routes/thresholdEcdsa.d.ts +0 -1
  256. package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/idempotencyRecords.d.ts +1 -2
  257. package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/signingSessionSeal.types.d.ts +6 -8
  258. package/package.json +1 -1
  259. package/dist/esm/wasm/router_ab_ecdsa_signing_worker/pkg/router_ab_ecdsa_signing_worker_bg.wasm +0 -0
@@ -0,0 +1,76 @@
1
+ import { isPlainObject } from "../shared-ts/src/utils/validation.js";
2
+ import { sameRouterAbMpcMaterialActivationRef } from "../shared-ts/src/utils/routerAbNormalSigningIdentity.js";
3
+ import { EcdsaMaterialReadSnapshot } from "./ecdsaMaterialReadSnapshot.js";
4
+ import { parseD1JsonColumn } from "../storage/d1Sql.js";
5
+ import { parseWalletEcdsaSignerRecord } from "./WalletStore.js";
6
+ //#region src/core/d1EcdsaSignerRead.ts
7
+ function prepareWalletEcdsaSignersRead(database, scope, walletId) {
8
+ return database.prepare(`SELECT record_json FROM wallet_signers
9
+ WHERE namespace = ? AND org_id = ? AND project_id = ? AND env_id = ?
10
+ AND wallet_id = ? AND signer_family = 'ecdsa'
11
+ ORDER BY signer_id`).bind(scope.namespace, scope.orgId, scope.projectId, scope.envId, walletId);
12
+ }
13
+ function parseWalletEcdsaSignerRows(rows, walletId) {
14
+ const signers = [];
15
+ for (const row of rows) {
16
+ const signer = parseWalletEcdsaSignerRecord(parseD1JsonColumn(row.record_json));
17
+ if (!signer || signer.walletId !== walletId) throw new Error("Wallet ECDSA signer record is invalid");
18
+ signers.push(signer);
19
+ }
20
+ return signers;
21
+ }
22
+ /** Parsed persistence evidence; material failures are surfaced after session validation. */
23
+ var EcdsaMaterialRead = class EcdsaMaterialRead {
24
+ #result;
25
+ constructor(walletId, scope, activation, result, linkedSnapshot) {
26
+ this.walletId = walletId;
27
+ this.scope = scope;
28
+ this.activation = activation;
29
+ this.linkedSnapshot = linkedSnapshot;
30
+ this.#result = result;
31
+ }
32
+ static fromRows(scope, walletId, activation, rows, linkedSnapshot) {
33
+ try {
34
+ if (!Array.isArray(rows)) throw new Error("ECDSA material rows are invalid");
35
+ const storedRows = [];
36
+ const matches = [];
37
+ for (const raw of rows) {
38
+ if (!isPlainObject(raw) || typeof raw.record_json !== "string") throw new Error("ECDSA material row is invalid");
39
+ storedRows.push({ record_json: raw.record_json });
40
+ const signer = parseWalletEcdsaSignerRecord(parseD1JsonColumn(raw.record_json));
41
+ if (signer && signer.walletId === walletId && sameRouterAbMpcMaterialActivationRef(signer.walletKey.publicCapability.material_activation, activation)) matches.push(signer);
42
+ }
43
+ const signer = matches[0];
44
+ if (!signer) return new EcdsaMaterialRead(walletId, scope, activation, {
45
+ ok: true,
46
+ value: null
47
+ }, linkedSnapshot);
48
+ for (const other of matches) if (!signer.walletKey.keyHandle || other.walletKey.keyHandle !== signer.walletKey.keyHandle) throw new Error("Wallet has conflicting ECDSA material activations");
49
+ return new EcdsaMaterialRead(walletId, scope, activation, {
50
+ ok: true,
51
+ value: {
52
+ signer,
53
+ readSnapshot: EcdsaMaterialReadSnapshot.canonical(scope, walletId, activation.activation_id, storedRows)
54
+ }
55
+ }, linkedSnapshot);
56
+ } catch (error) {
57
+ return new EcdsaMaterialRead(walletId, scope, activation, {
58
+ ok: false,
59
+ message: error instanceof Error ? error.message : "ECDSA material read failed"
60
+ }, linkedSnapshot);
61
+ }
62
+ }
63
+ resolveLinked(scope, walletId, activation) {
64
+ this.resolve(scope, walletId, activation);
65
+ return this.linkedSnapshot;
66
+ }
67
+ resolve(scope, walletId, activation) {
68
+ if (walletId !== this.walletId || !sameRouterAbMpcMaterialActivationRef(activation, this.activation) || scope.namespace !== this.scope.namespace || scope.orgId !== this.scope.orgId || scope.projectId !== this.scope.projectId || scope.envId !== this.scope.envId) throw new Error("ECDSA material read scope does not match");
69
+ if (!this.#result.ok) throw new Error(this.#result.message);
70
+ return this.#result.value;
71
+ }
72
+ };
73
+ //#endregion
74
+ export { EcdsaMaterialRead, parseWalletEcdsaSignerRows, prepareWalletEcdsaSignersRead };
75
+
76
+ //# sourceMappingURL=d1EcdsaSignerRead.js.map
@@ -1,5 +1,6 @@
1
1
  import { normalizeOptionalTrimmedString } from "../shared-ts/src/utils/normalize.js";
2
2
  import "../shared-ts/src/utils/validation.js";
3
+ import { failure } from "../shared-ts/src/utils/failure.js";
3
4
  import { d1ChangedRows } from "../storage/d1Sql.js";
4
5
  import { D1TenantTable, ensureD1Schema } from "./d1TenantStore.js";
5
6
  //#region src/core/d1IdentityStore.ts
@@ -112,16 +113,8 @@ var D1IdentityStore = class {
112
113
  await this.table.ensureSchema();
113
114
  const userId = normalizeOptionalTrimmedString(input.userId);
114
115
  const subject = normalizeOptionalTrimmedString(input.subject);
115
- if (!userId) return {
116
- ok: false,
117
- code: "invalid_args",
118
- message: "Missing userId"
119
- };
120
- if (!subject) return {
121
- ok: false,
122
- code: "invalid_args",
123
- message: "Missing subject"
124
- };
116
+ if (!userId) return failure("invalid_args", "Missing userId");
117
+ if (!subject) return failure("invalid_args", "Missing subject");
125
118
  const now = this.now().getTime();
126
119
  const existing = await this.table.prepare(`SELECT user_id, created_at_ms
127
120
  FROM identity_links
@@ -135,11 +128,7 @@ var D1IdentityStore = class {
135
128
  const existingCreatedAtMs = Number(existing?.created_at_ms);
136
129
  const createdAtMs = Number.isFinite(existingCreatedAtMs) && existingCreatedAtMs > 0 ? Math.floor(existingCreatedAtMs) : now;
137
130
  if (existingUserId && existingUserId !== userId) {
138
- if (!input.allowMoveIfSoleIdentity) return {
139
- ok: false,
140
- code: "already_linked",
141
- message: "Subject is already linked to a different user"
142
- };
131
+ if (!input.allowMoveIfSoleIdentity) return failure("already_linked", "Subject is already linked to a different user");
143
132
  if (d1ChangedRows(await this.table.database.prepare(`UPDATE identity_links
144
133
  SET user_id = ?,
145
134
  record_json = ?,
@@ -167,16 +156,8 @@ var D1IdentityStore = class {
167
156
  ok: true,
168
157
  movedFromUserId: existingUserId
169
158
  };
170
- if (parseSubjectCount((await this.table.prepare(SUBJECT_COUNT_SQL, [existingUserId]).first())?.subject_count) !== 1) return {
171
- ok: false,
172
- code: "already_linked",
173
- message: "Subject is linked to a different user with other identities; merge is not allowed"
174
- };
175
- return {
176
- ok: false,
177
- code: "already_linked",
178
- message: "Subject is already linked to a different user"
179
- };
159
+ if (parseSubjectCount((await this.table.prepare(SUBJECT_COUNT_SQL, [existingUserId]).first())?.subject_count) !== 1) return failure("already_linked", "Subject is linked to a different user with other identities; merge is not allowed");
160
+ return failure("already_linked", "Subject is already linked to a different user");
180
161
  }
181
162
  await this.table.prepare(`INSERT INTO identity_links (
182
163
  namespace,
@@ -209,31 +190,15 @@ var D1IdentityStore = class {
209
190
  ]).run();
210
191
  const finalUserId = await this.getUserIdBySubject(subject);
211
192
  if (finalUserId === userId) return { ok: true };
212
- if (finalUserId) return {
213
- ok: false,
214
- code: "already_linked",
215
- message: "Subject is already linked to a different user"
216
- };
217
- return {
218
- ok: false,
219
- code: "internal",
220
- message: "Failed to link identity"
221
- };
193
+ if (finalUserId) return failure("already_linked", "Subject is already linked to a different user");
194
+ return failure("internal", "Failed to link identity");
222
195
  }
223
196
  async unlinkSubjectFromUserId(input) {
224
197
  await this.table.ensureSchema();
225
198
  const userId = normalizeOptionalTrimmedString(input.userId);
226
199
  const subject = normalizeOptionalTrimmedString(input.subject);
227
- if (!userId) return {
228
- ok: false,
229
- code: "invalid_args",
230
- message: "Missing userId"
231
- };
232
- if (!subject) return {
233
- ok: false,
234
- code: "invalid_args",
235
- message: "Missing subject"
236
- };
200
+ if (!userId) return failure("invalid_args", "Missing userId");
201
+ if (!subject) return failure("invalid_args", "Missing subject");
237
202
  if (d1ChangedRows(await this.table.database.prepare(`DELETE FROM identity_links
238
203
  WHERE namespace = ?
239
204
  AND org_id = ?
@@ -250,44 +215,20 @@ var D1IdentityStore = class {
250
215
  AND env_id = ?
251
216
  AND user_id = ?
252
217
  ) > 1`).bind(this.table.scope.namespace, this.table.scope.orgId, this.table.scope.projectId, this.table.scope.envId, subject, userId, this.table.scope.namespace, this.table.scope.orgId, this.table.scope.projectId, this.table.scope.envId, userId).run()) > 0) return { ok: true };
253
- if (await this.getUserIdBySubject(subject) !== userId) return {
254
- ok: false,
255
- code: "not_found",
256
- message: "Subject is not linked to this user"
257
- };
258
- if (parseSubjectCount((await this.table.prepare(SUBJECT_COUNT_SQL, [userId]).first())?.subject_count) <= 1) return {
259
- ok: false,
260
- code: "cannot_unlink_last_identity",
261
- message: "Refusing to remove the last remaining identity"
262
- };
263
- return {
264
- ok: false,
265
- code: "internal",
266
- message: "Failed to unlink identity"
267
- };
218
+ if (await this.getUserIdBySubject(subject) !== userId) return failure("not_found", "Subject is not linked to this user");
219
+ if (parseSubjectCount((await this.table.prepare(SUBJECT_COUNT_SQL, [userId]).first())?.subject_count) <= 1) return failure("cannot_unlink_last_identity", "Refusing to remove the last remaining identity");
220
+ return failure("internal", "Failed to unlink identity");
268
221
  }
269
222
  async deleteSubjectLinkForDevCleanup(input) {
270
223
  await this.table.ensureSchema();
271
224
  const userId = normalizeOptionalTrimmedString(input.userId);
272
225
  const subject = normalizeOptionalTrimmedString(input.subject);
273
- if (!userId) return {
274
- ok: false,
275
- code: "invalid_args",
276
- message: "Missing userId"
277
- };
278
- if (!subject) return {
279
- ok: false,
280
- code: "invalid_args",
281
- message: "Missing subject"
282
- };
226
+ if (!userId) return failure("invalid_args", "Missing userId");
227
+ if (!subject) return failure("invalid_args", "Missing subject");
283
228
  if (await this.deleteIdentityLink({
284
229
  userId,
285
230
  subject
286
- }) === 0) return {
287
- ok: false,
288
- code: "not_found",
289
- message: "Subject is not linked to this user"
290
- };
231
+ }) === 0) return failure("not_found", "Subject is not linked to this user");
291
232
  return { ok: true };
292
233
  }
293
234
  async deleteIdentityLink(input) {
@@ -1,8 +1,8 @@
1
1
  import { normalizeOptionalTrimmedString } from "../shared-ts/src/utils/normalize.js";
2
2
  import "../shared-ts/src/utils/validation.js";
3
- import { formatD1ExecStatement } from "../storage/d1Sql.js";
4
3
  import "./defaultConfigsServer.js";
5
4
  import { toPrefixWithColon } from "./ThresholdService/validation.js";
5
+ import { formatD1ExecStatement } from "../storage/d1Sql.js";
6
6
  //#region src/core/d1TenantStore.ts
7
7
  /**
8
8
  * A store's key prefix, which is also its D1 namespace: the first of `explicitKeys` set in
@@ -5,10 +5,11 @@ import { sameRouterAbMpcMaterialActivationRef } from "../shared-ts/src/utils/rou
5
5
  import { parseRouterAbEd25519YaoRecoveryActivationResultV1, parseRouterAbEd25519YaoRecoveryAdmissionRequestV1, parseRouterAbEd25519YaoRegistrationActivationAdmissionReceiptV1, parseRouterAbEd25519YaoRegistrationActivationResultV1, parseRouterAbEd25519YaoRegistrationAdmissionRequestV1 } from "../shared-ts/src/utils/routerAbEd25519Yao.js";
6
6
  import { normalizeRuntimePolicyScope, signingRootScopeFromRuntimePolicyScope } from "../shared-ts/src/threshold/signingRootScope.js";
7
7
  import { sameRouterAbEcdsaDerivationPublicCapabilityV1 } from "../shared-ts/src/utils/routerAbEcdsaDerivation.js";
8
- import { D1_BATCH_CAS_GUARD_SQL, formatD1ExecStatement, parseD1JsonColumn } from "../storage/d1Sql.js";
9
- import { thresholdEcdsaChainTargetKey } from "./thresholdEcdsaChainTarget.js";
10
8
  import { normalizeThresholdEd25519ParticipantIds } from "../shared-ts/src/threshold/participants.js";
9
+ import { D1_BATCH_CAS_GUARD_SQL, formatD1ExecStatement, parseD1JsonColumn } from "../storage/d1Sql.js";
10
+ import { thresholdEcdsaChainTargetKey } from "../shared-ts/src/utils/thresholdEcdsaChainTarget.js";
11
11
  import { ecdsaPostRegistrationRequestMatchesCapability, parseWalletEcdsaPendingSessionActivationRecord, parseWalletEcdsaSignerRecord } from "./WalletStore.js";
12
+ import { EcdsaMaterialRead, parseWalletEcdsaSignerRows, prepareWalletEcdsaSignersRead } from "./d1EcdsaSignerRead.js";
12
13
  //#region src/core/d1WalletStore.ts
13
14
  function sameD1WalletRuntimePolicyScopeV1(left, right) {
14
15
  return left.orgId === right.orgId && left.projectId === right.projectId && left.envId === right.envId && left.signingRootVersion === right.signingRootVersion;
@@ -455,10 +456,18 @@ var D1WalletStore = class {
455
456
  return matches[0] ?? null;
456
457
  }
457
458
  async getEcdsaSignerByMaterialActivation(input) {
459
+ return (await this.readEcdsaSignerMaterialSnapshot({
460
+ walletId: input.walletId,
461
+ materialActivation: input.materialActivation,
462
+ source: { kind: "database" }
463
+ }))?.signer ?? null;
464
+ }
465
+ async readEcdsaSignerMaterialSnapshot(input) {
466
+ if (input.source.kind === "credential_snapshot") return input.source.materialRead.resolve(this.scope, input.walletId, input.materialActivation);
458
467
  await this.ensureSchema();
459
468
  const walletId = normalizeOptionalTrimmedString(input.walletId);
460
469
  if (!walletId) return null;
461
- const matches = ((await this.database.prepare(`SELECT record_json
470
+ const result = await this.database.prepare(`SELECT record_json
462
471
  FROM wallet_signers
463
472
  WHERE namespace = ?
464
473
  AND org_id = ?
@@ -469,12 +478,8 @@ var D1WalletStore = class {
469
478
  AND json_extract(
470
479
  record_json,
471
480
  '$.walletKey.publicCapability.material_activation.activation_id'
472
- ) = ?
473
- LIMIT 4`).bind(this.scope.namespace, this.scope.orgId, this.scope.projectId, this.scope.envId, walletId, input.materialActivation.activation_id).all()).results || []).map((row) => parseWalletEcdsaSignerRecord(parseD1JsonColumn(row.record_json))).filter((record) => record !== null && record.walletId === walletId && sameRouterAbMpcMaterialActivationRef(record.walletKey.publicCapability.material_activation, input.materialActivation));
474
- if (matches.length === 0) return null;
475
- const keyHandle = matches[0]?.walletKey.keyHandle;
476
- if (!keyHandle || matches.some((record) => record.walletKey.keyHandle !== keyHandle)) throw new Error("Wallet has conflicting ECDSA material activations");
477
- return matches[0] ?? null;
481
+ ) = ?`).bind(this.scope.namespace, this.scope.orgId, this.scope.projectId, this.scope.envId, walletId, input.materialActivation.activation_id).all();
482
+ return EcdsaMaterialRead.fromRows(this.scope, input.walletId, input.materialActivation, result.results ?? [], null).resolve(this.scope, input.walletId, input.materialActivation);
478
483
  }
479
484
  async getEcdsaSignerByPostRegistrationRequest(input) {
480
485
  await this.ensureSchema();
@@ -503,22 +508,7 @@ var D1WalletStore = class {
503
508
  }
504
509
  async listEcdsaSignersForWallet(input) {
505
510
  await this.ensureSchema();
506
- const result = await this.database.prepare(`SELECT record_json
507
- FROM wallet_signers
508
- WHERE namespace = ?
509
- AND org_id = ?
510
- AND project_id = ?
511
- AND env_id = ?
512
- AND wallet_id = ?
513
- AND signer_family = 'ecdsa'
514
- ORDER BY signer_id`).bind(this.scope.namespace, this.scope.orgId, this.scope.projectId, this.scope.envId, input.walletId).all();
515
- const signers = [];
516
- for (const row of result.results || []) {
517
- const signer = parseWalletEcdsaSignerRecord(parseD1JsonColumn(row.record_json));
518
- if (!signer || signer.walletId !== input.walletId) throw new Error("Wallet ECDSA signer record is invalid");
519
- signers.push(signer);
520
- }
521
- return signers;
511
+ return parseWalletEcdsaSignerRows((await prepareWalletEcdsaSignersRead(this.database, this.scope, input.walletId).all()).results ?? [], input.walletId);
522
512
  }
523
513
  async listEcdsaPendingSessionActivationsForLifecycle(input) {
524
514
  await this.ensureSchema();
@@ -4,7 +4,7 @@ import { sha256BytesUtf8 } from "../../shared-ts/src/utils/digests.js";
4
4
  import { parseDigestB64u, sha256Utf8DigestB64u } from "../../shared-ts/src/utils/canonicalPrimitives.js";
5
5
  import { requireRecord } from "../../shared-ts/src/utils/validation.js";
6
6
  import { rejectUnknownFields } from "../../shared-ts/src/utils/exactRecord.js";
7
- import { parseUnixMs } from "../../shared-ts/src/passkey-custody/primitives.js";
7
+ import { parseUnixMs, requireParsed } from "../../shared-ts/src/passkey-custody/primitives.js";
8
8
  //#region src/core/deviceLinking/linkedDeviceEmailOtpGrant.ts
9
9
  /**
10
10
  * The durable one-time Email OTP verification grant.
@@ -203,10 +203,6 @@ function requireGrantDigest(raw, label) {
203
203
  throw new Error(`${label} ${error instanceof Error ? error.message : "is invalid"}`);
204
204
  }
205
205
  }
206
- function requireParsed(parsed, label) {
207
- if (!parsed.ok) throw new Error(`${label} ${parsed.error.message}`);
208
- return parsed.value;
209
- }
210
206
  //#endregion
211
207
  export { computeLinkedDeviceEmailOtpAuthorityDigestV1, computeLinkedDeviceEmailOtpChallengeBindingDigestV1, computeLinkedDeviceEmailOtpGrantTokenDigestV1, linkedDeviceEmailOtpDescriptorCredentialIdV1, linkedDeviceEmailOtpGrantAdmitsUseV1, parseLinkedDeviceEmailOtpGrantRecordV1 };
212
208
 
@@ -1,6 +1,7 @@
1
1
  import { mpcMaterialActivationRefsEqual } from "../../shared-ts/src/utils/domainIds.js";
2
2
  import { hasDelegatedWalletPermissionV1, sameDelegatedWalletAuthorityV1, validateDelegatedWalletAuthorityAttenuationV1 } from "../../shared-ts/src/authorization/delegatedAuthority.js";
3
3
  import { routerAbMpcMaterialActivationRefFromWire, sameRouterAbMpcMaterialActivationRef } from "../../shared-ts/src/utils/routerAbNormalSigningIdentity.js";
4
+ import { sameRouterAbEd25519YaoByteSequence } from "../../shared-ts/src/utils/routerAbEd25519Yao.js";
4
5
  import { assertLinkedDeviceOrdinaryMaterialSourceContributionMatchesContextV1 } from "../../shared-ts/src/device-linking/sourceContribution.js";
5
6
  import { parseDeviceIdValue } from "./linkedDeviceSessionRecord.js";
6
7
  //#region src/core/deviceLinking/linkedDeviceSessionApproval.ts
@@ -93,9 +94,6 @@ function linkedDeviceOwnerAuthorizationsEqualV1(left, right) {
93
94
  function linkedDeviceEd25519BindingsEqualV1(left, right) {
94
95
  return left.operation === right.operation && sameRouterAbEd25519YaoByteSequence(left.session_id, right.session_id) && sameRouterAbEd25519YaoByteSequence(left.stable_key_context_binding, right.stable_key_context_binding) && sameRouterAbMpcMaterialActivationRef(left.material_activation, right.material_activation) && left.lifecycle.lifecycle_id === right.lifecycle.lifecycle_id && left.lifecycle.work_kind === right.lifecycle.work_kind && left.lifecycle.primitive_request_kind === right.lifecycle.primitive_request_kind && left.lifecycle.root_share_epoch === right.lifecycle.root_share_epoch && left.lifecycle.account_id === right.lifecycle.account_id && left.lifecycle.session_id === right.lifecycle.session_id && left.lifecycle.signer_set_id === right.lifecycle.signer_set_id && left.lifecycle.selected_server_id === right.lifecycle.selected_server_id;
95
96
  }
96
- function sameRouterAbEd25519YaoByteSequence(left, right) {
97
- return left.length === right.length && left.every((value, index) => value === right[index]);
98
- }
99
97
  //#endregion
100
98
  export { validateApprovalMatchesSession, validateLinkedDeviceRequestedAuthorityV1, validateSourceContributionApprovalMatchesSession, validateSourceContributionPreparationMatchesApproval };
101
99
 
@@ -6,7 +6,7 @@ import { requireRecordCopy } from "../../shared-ts/src/utils/validation.js";
6
6
  import { sameDelegatedWalletAuthorityV1 } from "../../shared-ts/src/authorization/delegatedAuthority.js";
7
7
  import { parseExactAdministeredSignerManifestV1 } from "../../shared-ts/src/device-linking/delegatedActivationPlan.js";
8
8
  import { parseLinkedDeviceOrdinaryMaterialSourceContributionPreparationTupleV1 } from "../../shared-ts/src/device-linking/sourceContribution.js";
9
- import { parseLinkSessionStateV1, parseLinkedDeviceApprovalV1 as parseLinkedDeviceApprovalV1$1, parseLinkedDeviceSessionClaimV1, parseQrLinkedDeviceSessionPayloadV5 } from "../../shared-ts/src/device-linking/parsers.js";
9
+ import { parseLinkSessionStateV1, parseLinkedDeviceApprovalV1, parseLinkedDeviceSessionClaimV1, parseQrLinkedDeviceSessionPayloadV5 } from "../../shared-ts/src/device-linking/parsers.js";
10
10
  import "../../shared-ts/src/device-linking/requestProof.js";
11
11
  //#region src/core/deviceLinking/linkedDeviceSessionRecord.ts
12
12
  function sourceKeyManifestDigestForFamilyV1(digests, keyFamily) {
@@ -377,19 +377,13 @@ function assertNeverLinkedDeviceEmailOtpChallengeV1(value) {
377
377
  function assertNeverLinkPrecommitFailureV1(value) {
378
378
  throw new Error(`unsupported linked-device precommit failure: ${String(value)}`);
379
379
  }
380
- function parseLinkedDeviceApprovalV1(raw) {
381
- return parseLinkedDeviceApprovalV1$1(raw);
382
- }
383
- function parseLinkedDeviceClaimV1(raw) {
384
- return parseLinkedDeviceSessionClaimV1(raw);
385
- }
386
380
  function parseOptionalClaimTranscript(raw) {
387
381
  if (raw === void 0) return void 0;
388
382
  const record = requireRecordCopy(raw, "claimTranscript");
389
383
  requireExactKeys(record, ["digestB64u", "value"]);
390
384
  return {
391
385
  digestB64u: requireDigest(record.digestB64u, "claimTranscript.digestB64u"),
392
- value: parseLinkedDeviceClaimV1(record.value)
386
+ value: parseLinkedDeviceSessionClaimV1(record.value)
393
387
  };
394
388
  }
395
389
  /**
@@ -2,6 +2,7 @@ import { parseLinkDeviceSessionId } from "../../shared-ts/src/utils/domainIds.js
2
2
  import { base64UrlDecode, base64UrlEncode } from "../../shared-ts/src/utils/base64.js";
3
3
  import { parseDigestB64u } from "../../shared-ts/src/utils/canonicalPrimitives.js";
4
4
  import { LINKED_DEVICE_CLOCK_SKEW_TOLERANCE_MS_V1, LINKED_DEVICE_REQUEST_PROOF_HEADER_V1, LINKED_DEVICE_REQUEST_PROOF_MAX_TTL_MS_V1, computeLinkedDevicePublicKeyDigestV1, computeLinkedDeviceRequestProofDigestV1, encodeLinkedDeviceRequestProofV1 } from "../../shared-ts/src/device-linking/requestProof.js";
5
+ import { hasExactKeys } from "../../shared-ts/src/utils/exactKeys.js";
5
6
  //#region src/core/deviceLinking/requestProof.ts
6
7
  var LinkedDeviceRequestProofVerifierV1 = class {
7
8
  constructor(input) {
@@ -62,7 +63,18 @@ var LinkedDeviceRequestProofVerifierV1 = class {
62
63
  };
63
64
  function parseLinkedDeviceRequestProofV1(raw) {
64
65
  if (raw === null || typeof raw !== "object" || Array.isArray(raw)) throw new Error("linked-device request proof must be an object");
65
- if (!isLinkedDeviceRequestProofRecordV1(raw)) throw new Error("record contains invalid fields");
66
+ if (!hasExactKeys(raw, [
67
+ "kind",
68
+ "linkSessionId",
69
+ "devicePublicKeyDigestB64u",
70
+ "requestNonceB64u",
71
+ "method",
72
+ "canonicalPath",
73
+ "bodyDigestB64u",
74
+ "issuedAtMs",
75
+ "expiresAtMs",
76
+ "signatureB64u"
77
+ ])) throw new Error("record contains invalid fields");
66
78
  const record = raw;
67
79
  if (record.kind !== "linked_device_request_proof_v1") throw new Error("linked-device request proof kind is invalid");
68
80
  const linkSessionId = parseSessionId(record.linkSessionId);
@@ -152,9 +164,6 @@ function parseFixedB64u(raw, expectedBytes, field) {
152
164
  function toArrayBuffer(bytes) {
153
165
  return bytes.slice().buffer;
154
166
  }
155
- function isLinkedDeviceRequestProofRecordV1(value) {
156
- return Object.keys(value).sort().join("|") === "bodyDigestB64u|canonicalPath|devicePublicKeyDigestB64u|expiresAtMs|issuedAtMs|kind|linkSessionId|method|requestNonceB64u|signatureB64u";
157
- }
158
167
  function errorMessage(error) {
159
168
  return error instanceof Error ? error.message : String(error || "invalid device request proof");
160
169
  }
@@ -0,0 +1,85 @@
1
+ //#region src/core/ecdsaMaterialReadSnapshot.ts
2
+ const ECDSA_INSTALLATION_SNAPSHOT_COLUMNS = [
3
+ "link_session_id",
4
+ "authority_id",
5
+ "wallet_id",
6
+ "auth_method_id",
7
+ "device_id",
8
+ "package_set_digest_b64u",
9
+ "target_factor_verification_digest_b64u",
10
+ "target_factor_verified_at_ms",
11
+ "source_manifest_digest_b64u",
12
+ "delivery_recipient_public_key_b64u",
13
+ "packages_json",
14
+ "server_reservation_ids_json",
15
+ "installed_record_set_digest_b64u",
16
+ "activated_at_ms"
17
+ ];
18
+ /** Request-local evidence of the exact records a material resolver examined. */
19
+ var EcdsaMaterialReadSnapshot = class EcdsaMaterialReadSnapshot {
20
+ #scope;
21
+ #conditions;
22
+ constructor(walletId, scope, conditions) {
23
+ this.walletId = walletId;
24
+ this.#scope = scope;
25
+ this.#conditions = conditions;
26
+ }
27
+ static canonical(scope, walletId, activationId, rows) {
28
+ return new EcdsaMaterialReadSnapshot(walletId, scope, [recordSetCondition("wallet_signers", scope, walletId, ["record_json"], rows, "signer_family = 'ecdsa' AND json_extract(record_json, '$.walletKey.publicCapability.material_activation.activation_id') = ?", [activationId])]);
29
+ }
30
+ static linked(scope, walletId, installations, signers) {
31
+ return new EcdsaMaterialReadSnapshot(walletId, scope, [recordSetCondition("linked_device_authority_installations", scope, walletId, ECDSA_INSTALLATION_SNAPSHOT_COLUMNS, installations, "1", []), recordSetCondition("wallet_signers", scope, walletId, ["record_json"], signers, "signer_family = 'ecdsa'", [])]);
32
+ }
33
+ condition(scope) {
34
+ if (scope.namespace !== this.#scope.namespace || scope.orgId !== this.#scope.orgId || scope.projectId !== this.#scope.projectId || scope.envId !== this.#scope.envId) return {
35
+ sql: "0",
36
+ bindings: []
37
+ };
38
+ const clauses = [];
39
+ const bindings = [];
40
+ for (const condition of this.#conditions) {
41
+ clauses.push(`(${condition.sql})`);
42
+ bindings.push(...condition.bindings);
43
+ }
44
+ return {
45
+ sql: clauses.join(" AND "),
46
+ bindings
47
+ };
48
+ }
49
+ };
50
+ function recordSetCondition(table, scope, walletId, columns, rows, filter, filterBindings) {
51
+ const values = [];
52
+ for (const row of rows) {
53
+ const tuple = [];
54
+ for (const column of columns) {
55
+ const value = row[column];
56
+ if (value !== null && typeof value !== "string" && typeof value !== "number") throw new Error(`Invalid stored material column: ${column}`);
57
+ tuple.push(value);
58
+ }
59
+ values.push(tuple);
60
+ }
61
+ const predicate = `namespace = ? AND org_id = ? AND project_id = ? AND env_id = ? AND wallet_id = ? AND ${filter}`;
62
+ const identity = [
63
+ scope.namespace,
64
+ scope.orgId,
65
+ scope.projectId,
66
+ scope.envId,
67
+ walletId,
68
+ ...filterBindings
69
+ ];
70
+ return {
71
+ sql: `(SELECT COUNT(*) FROM ${table} WHERE ${predicate}) = ?
72
+ AND NOT EXISTS (SELECT 1 FROM ${table} WHERE ${predicate}
73
+ AND json_array(${columns.join(", ")}) NOT IN (SELECT value FROM json_each(?)))`,
74
+ bindings: [
75
+ ...identity,
76
+ rows.length,
77
+ ...identity,
78
+ JSON.stringify(values)
79
+ ]
80
+ };
81
+ }
82
+ //#endregion
83
+ export { ECDSA_INSTALLATION_SNAPSHOT_COLUMNS, EcdsaMaterialReadSnapshot };
84
+
85
+ //# sourceMappingURL=ecdsaMaterialReadSnapshot.js.map
@@ -4,6 +4,7 @@ import { base58Encode } from "../shared-ts/src/utils/base58.js";
4
4
  import "../shared-ts/src/utils/encoders.js";
5
5
  import { deriveImplicitNearAccountIdFromEd25519PublicKey, parseImplicitNearAccountId, parseNamedNearAccountId } from "../shared-ts/src/utils/near.js";
6
6
  import { coerceNonEmptyString, requireRecordOrArray } from "../shared-ts/src/utils/validation.js";
7
+ import { failure } from "../shared-ts/src/utils/failure.js";
7
8
  import { ActionType, validateActionArgsWasm } from "../shared-ts/src/near/actions.js";
8
9
  import { errorMessage } from "../shared-ts/src/utils/errors.js";
9
10
  import { toPublicKeyStringFromSecretKey } from "./nearKeys.js";
@@ -265,11 +266,7 @@ async function fundImplicitNearAccountWithRelayer(input) {
265
266
  message: "Implicit NEAR account funding transaction submitted"
266
267
  };
267
268
  } catch (error) {
268
- return {
269
- ok: false,
270
- code: "funding_failed",
271
- message: errorMessage(error) || "Failed to fund implicit NEAR account"
272
- };
269
+ return failure("funding_failed", errorMessage(error) || "Failed to fund implicit NEAR account");
273
270
  }
274
271
  }
275
272
  /**
@@ -1,4 +1,4 @@
1
- import { parseEmailOtpProviderUserId, parseLaneShareEpoch, parseMpcSigningWorkerRef, parseSigningLaneId, parseWalletKeyId, parseWebAuthnCredentialIdB64u } from "../../shared-ts/src/utils/domainIds.js";
1
+ import { mpcMaterialActivationRefsEqual, parseEmailOtpProviderUserId, parseLaneShareEpoch, parseMpcSigningWorkerRef, parseSigningLaneId, parseWalletKeyId, parseWebAuthnCredentialIdB64u } from "../../shared-ts/src/utils/domainIds.js";
2
2
  import { base64UrlEncode } from "../../shared-ts/src/utils/base64.js";
3
3
  import { alphabetizeStringify } from "../../shared-ts/src/utils/digests.js";
4
4
  import { parseDigestB64u, sha256Utf8DigestB64u } from "../../shared-ts/src/utils/canonicalPrimitives.js";
@@ -218,13 +218,13 @@ function requireOnlyEcdsaSigners(signers) {
218
218
  function signerMatchesMaterialActivation(signer, expected) {
219
219
  const wire = signer.version === "wallet_signer_ed25519_v1" ? signer.activeYaoCapability.activationResult.public_receipt.material_activation : signer.walletKey.publicCapability.material_activation;
220
220
  try {
221
- return sameMaterialActivation(routerAbMpcMaterialActivationRefFromWire(wire), expected);
221
+ return mpcMaterialActivationRefsEqual(routerAbMpcMaterialActivationRefFromWire(wire), expected);
222
222
  } catch {
223
223
  return false;
224
224
  }
225
225
  }
226
226
  function assertExpectedActivation(wire, expected) {
227
- if (!sameMaterialActivation(routerAbMpcMaterialActivationRefFromWire(wire), expected)) throw new Error("wallet signer material activation changed");
227
+ if (!mpcMaterialActivationRefsEqual(routerAbMpcMaterialActivationRefFromWire(wire), expected)) throw new Error("wallet signer material activation changed");
228
228
  }
229
229
  function assertEcdsaReceiptContinuity(signer) {
230
230
  const capability = signer.walletKey.publicCapability;
@@ -241,9 +241,6 @@ async function digestPublicIdentity(value) {
241
241
  async function digestValue(domain, value) {
242
242
  return sha256Utf8DigestB64u(`${domain}\u0000${alphabetizeStringify(value)}`);
243
243
  }
244
- function sameMaterialActivation(left, right) {
245
- return left.activationId === right.activationId && left.capability === right.capability && left.materialOwner === right.materialOwner && left.keyBinding === right.keyBinding && left.lifecycleBinding === right.lifecycleBinding && left.signingWorker === right.signingWorker;
246
- }
247
244
  function requireParsed(result) {
248
245
  if (result.ok) return result.value;
249
246
  throw new Error("wallet execution lane identity is invalid");
@@ -1,7 +1,7 @@
1
1
  import { hasWhitespaceOrControlCharacters, mpcMaterialActivationRefsEqual, parseMpcMaterialActivationRef } from "../../shared-ts/src/utils/domainIds.js";
2
2
  import { parseExactAdministeredSignerManifestV1 } from "../../shared-ts/src/device-linking/delegatedActivationPlan.js";
3
3
  import { routerAbMpcMaterialActivationRefFromWire } from "../../shared-ts/src/utils/routerAbNormalSigningIdentity.js";
4
- import { parseRouterAbEd25519YaoActivationPublicReceiptV1, parseRouterAbEd25519YaoCeremonyBindingV1, parseRouterAbEd25519YaoEncryptedPackageV1, parseRouterAbEd25519YaoParticipantIdsV1 } from "../../shared-ts/src/utils/routerAbEd25519Yao.js";
4
+ import { parseRouterAbEd25519YaoActivationPublicReceiptV1, parseRouterAbEd25519YaoCeremonyBindingV1, parseRouterAbEd25519YaoEncryptedPackageV1, parseRouterAbEd25519YaoParticipantIdsV1, sameRouterAbEd25519YaoByteSequence } from "../../shared-ts/src/utils/routerAbEd25519Yao.js";
5
5
  import { parseLinkedDeviceEcdsaEncryptedSourceContributionV1, parseLinkedDeviceEcdsaSourceContributionPackageV1, parseLinkedDeviceEcdsaSourceDerivationV1, parseLinkedDeviceEcdsaSourcePreservingActivationReceiptV1 } from "../../shared-ts/src/device-linking/sourceContribution.js";
6
6
  //#region src/core/signingMaterial/ordinaryInactiveSignerMaterialReservation.ts
7
7
  function validateOrdinaryInactiveSignerMaterialDeactivationRequestV1(request) {
@@ -130,7 +130,7 @@ function parseOrdinaryEd25519SignerMaterialWorkerReservationV1(request, raw) {
130
130
  const activationReceipt = parseRouterAbEd25519YaoActivationPublicReceiptV1(reservation.activationReceipt);
131
131
  assertMaterialActivationMatchesV1(request.plannedActivationRef, routerAbMpcMaterialActivationRefFromWire(activationReceipt.material_activation));
132
132
  const clientMaterial = parseEd25519ClientMaterialV1(reservation.clientMaterial);
133
- if (!sameBytes(activationReceipt.transcript, clientMaterial.deriver_a_client_package.transcript) || !sameBytes(activationReceipt.transcript, clientMaterial.deriver_b_client_package.transcript)) throw new Error("ordinary Ed25519 worker receipt transcript does not match client packages");
133
+ if (!sameRouterAbEd25519YaoByteSequence(activationReceipt.transcript, clientMaterial.deriver_a_client_package.transcript) || !sameRouterAbEd25519YaoByteSequence(activationReceipt.transcript, clientMaterial.deriver_b_client_package.transcript)) throw new Error("ordinary Ed25519 worker receipt transcript does not match client packages");
134
134
  return {
135
135
  kind: "ordinary_ed25519_signer_material_worker_reservation_v1",
136
136
  keyFamily: "ed25519",
@@ -247,9 +247,6 @@ function sameEcdsaSourceSigner(left, right) {
247
247
  function sameEcdsaTarget(left, right) {
248
248
  return mpcMaterialActivationRefsEqual(left.activation, right.activation) && String(left.targetDeviceId) === String(right.targetDeviceId) && left.targetFactorVerificationDigestB64u === right.targetFactorVerificationDigestB64u && left.clientRecipientPublicKeyB64u === right.clientRecipientPublicKeyB64u && left.signingWorkerRecipientPublicKeyB64u === right.signingWorkerRecipientPublicKeyB64u;
249
249
  }
250
- function sameBytes(left, right) {
251
- return left.length === right.length && left.every((value, index) => value === right[index]);
252
- }
253
250
  function parseEd25519ClientPackageV1(raw, label, expectedRole) {
254
251
  const parsed = parseRouterAbEd25519YaoEncryptedPackageV1(raw);
255
252
  if (!parsed.ok) throw new Error(`${label} ${parsed.message}`);
@@ -1,7 +1,7 @@
1
1
  import { normalizeOptionalTrimmedString } from "../shared-ts/src/utils/normalize.js";
2
2
  import { isObject, isPlainObject } from "../shared-ts/src/utils/validation.js";
3
- import { resolveD1DatabaseFromConfig } from "../storage/d1Sql.js";
4
3
  import "./defaultConfigsServer.js";
4
+ import { resolveD1DatabaseFromConfig } from "../storage/d1Sql.js";
5
5
  import { d1TenantScopeFromConfig } from "./d1TenantStore.js";
6
6
  import { RedisTcpClient, UpstashRedisRestClient, redisDel, redisGetJson, redisGetdelJson, redisSetJson } from "./ThresholdService/kv.js";
7
7
  //#region src/core/storeBackends.ts
@@ -1,3 +1,4 @@
1
+ import { thresholdEcdsaChainTargetKey } from "../shared-ts/src/utils/thresholdEcdsaChainTarget.js";
1
2
  //#region src/core/thresholdEcdsaChainTarget.ts
2
3
  function positiveSafeInteger(value) {
3
4
  return typeof value === "number" && Number.isSafeInteger(value) && value > 0 ? value : null;
@@ -31,9 +32,6 @@ function thresholdEcdsaChainTargetFromValue(value) {
31
32
  }
32
33
  return null;
33
34
  }
34
- function thresholdEcdsaChainTargetKey(target) {
35
- return target.kind === "evm" ? `evm:eip155:${target.chainId}` : `tempo:${target.chainId}`;
36
- }
37
35
  function thresholdEcdsaChainTargetsEqual(left, right) {
38
36
  return thresholdEcdsaChainTargetKey(left) === thresholdEcdsaChainTargetKey(right);
39
37
  }
@@ -16,6 +16,8 @@ import { handleWalletControlRequest } from "./router/cloudflare/runtime/walletCo
16
16
  import { resolveRuntimeTenantRootLineage } from "./router/cloudflare/runtime/walletConsoleTenantRootLineage.js";
17
17
  import { ROUTER_AB_MPC_ROUTER_ORIGIN, ROUTER_AB_SIGNING_WORKER_ORIGIN, createRouterAbServiceBindingFetch } from "./router/cloudflare/runtime/routerAbServiceBindings.js";
18
18
  import { readEnvironmentCsv, readEnvironmentString, requireEnvironmentString } from "./router/cloudflare/runtime/environment.js";
19
+ import { createD1LinkedDeviceSourceContributionPreparationPlannerV1 } from "./router/cloudflare/d1/deviceLinking/d1LinkedDeviceSourceContributionPreparationPlanner.js";
20
+ import { readD1LinkedDeviceEcdsaSourceV1, readD1LinkedDeviceEd25519SourceV1 } from "./router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.js";
19
21
  import { RouterAbEd25519YaoExportOwnerProofAuthorizationAdapter } from "./router/domains/ed25519Yao/export/routerAbEd25519YaoExport.js";
20
22
  import { createRouterAbEd25519YaoHttpRegistrationBackendFromEnv } from "./router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.js";
21
23
  import { createRouterAbEd25519YaoProductRegistrationPartitionedStateStoreFromD1V1 } from "./router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.js";
@@ -25,8 +27,6 @@ import { handleRouterAbEd25519YaoRegistrationRequestScopedCloudflareV1 } from ".
25
27
  import { CloudflareD1RouterAbEd25519YaoCapabilityPersistence } from "./router/cloudflare/d1/ed25519Yao/d1Ed25519YaoCapabilityPersistence.js";
26
28
  import { createSigningSessionSealOptions } from "./threshold/session/signingSessionSeal/options.js";
27
29
  import { createRouterAbEcdsaEd25519CeremonyTokenIssuer, createRouterAbEcdsaStrictPostRegistrationPort, createRouterAbEcdsaStrictRegistrationPort, parseRouterAbEcdsaEd25519PrivateJwk, parseRouterAbEcdsaStrictRegistrationTopology } from "./router/domains/ecdsa/routerAbEcdsaStrictRegistration.js";
28
- import { createD1LinkedDeviceSourceContributionPreparationPlannerV1 } from "./router/cloudflare/d1/deviceLinking/d1LinkedDeviceSourceContributionPreparationPlanner.js";
29
- import { readD1LinkedDeviceEcdsaSourceV1, readD1LinkedDeviceEd25519SourceV1 } from "./router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.js";
30
30
  import { D1LinkedDeviceTargetCredentialProviderV1 } from "./router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.js";
31
31
  import { createD1LinkedDeviceOwnerSourceChildReaderV1 } from "./router/cloudflare/d1/deviceLinking/d1LinkedDeviceOwnerAuthorizationProvider.js";
32
32
  import { createCloudflareD1RouterApiAuthService } from "./router/cloudflare/d1/auth/d1RouterApiAuthService.js";