@seams/wallet-server 0.9.4 → 0.10.0

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 (74) hide show
  1. package/artifact-manifest.json +51 -31
  2. package/cloudflare-router-ab/build/deriver-a/build-stamp.json +1 -1
  3. package/cloudflare-router-ab/build/deriver-a/index.js +2 -2
  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.js +2 -2
  7. package/cloudflare-router-ab/build/deriver-b/index_bg.wasm +0 -0
  8. package/cloudflare-router-ab/build/local-tools/darwin-arm64/router_ab_local_init +0 -0
  9. package/cloudflare-router-ab/build/local-tools/darwin-x64/router_ab_local_init +0 -0
  10. package/cloudflare-router-ab/build/local-tools/linux-x64/router_ab_local_init +0 -0
  11. package/cloudflare-router-ab/build/router/build-stamp.json +1 -1
  12. package/cloudflare-router-ab/build/router/index_bg.wasm +0 -0
  13. package/cloudflare-router-ab/build/signing-worker/build-stamp.json +1 -1
  14. package/cloudflare-router-ab/build/signing-worker/index_bg.wasm +0 -0
  15. package/cloudflare-router-ab/build/tenant-root-control-plane/build-stamp.json +1 -1
  16. package/cloudflare-router-ab/build/tenant-root-control-plane/index_bg.wasm +0 -0
  17. package/cloudflare-router-ab/migrations/deriver-a/0020_registration_preparation.sql +7 -0
  18. package/cloudflare-router-ab/migrations/deriver-b/0020_registration_preparation.sql +7 -0
  19. package/dist/esm/cloud-host.js +9 -9
  20. package/dist/esm/core/d1Ed25519SignerRead.js +3 -19
  21. package/dist/esm/hosted-wallet-gateway.js +15 -1
  22. package/dist/esm/localHostedWalletGatewayHandler.js +1 -1
  23. package/dist/esm/router/cloudflare/d1/authorization/d1AuthorizationStore.js +26 -20
  24. package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.js +1 -1
  25. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.js +21 -2
  26. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationSetupRateLimit.js +34 -0
  27. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.js +17 -16
  28. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationService.js +45 -65
  29. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.js +85 -9
  30. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerService.js +1 -1
  31. package/dist/esm/router/cloudflare/runtime/walletGateway.js +2 -0
  32. package/dist/esm/router/cloudflare-adaptor.js +7 -7
  33. package/dist/esm/router/cloudflare.js +8812 -8594
  34. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoCapabilityCommit.js +45 -24
  35. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.js +52 -3
  36. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.js +1 -1
  37. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitioning.js +13 -5
  38. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRuntime.js +41 -7
  39. package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryRequestScopedCloudflare.js +1 -1
  40. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.js +24 -4
  41. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.js +24 -14
  42. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.js +10 -1
  43. package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationRequestScopedCloudflare.js +45 -5
  44. package/dist/esm/router/domains/walletRegistration/walletRegistrationRoutes.js +48 -8
  45. package/dist/esm/router/express.js +107 -16
  46. package/dist/esm/router/framework/registrationSetupRateLimit.js +0 -0
  47. package/dist/esm/router/transport/fetch/routes/walletRegistration.js +3 -2
  48. package/dist/types/shared-ts/src/utils/walletManagementProtocol.d.ts +1 -1
  49. package/dist/types/wallet-server/src/core/RegistrationCeremonyStore.d.ts +12 -0
  50. package/dist/types/wallet-server/src/core/d1Ed25519SignerRead.d.ts +1 -4
  51. package/dist/types/wallet-server/src/core/threeRouteRegistrationContracts.d.ts +50 -6
  52. package/dist/types/wallet-server/src/hosted-wallet-gateway.d.ts +1 -1
  53. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationSetupRateLimit.d.ts +7 -0
  54. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationService.d.ts +1 -1
  55. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.d.ts +3 -0
  56. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletGateway.d.ts +1 -1
  57. package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoCapabilityCommit.d.ts +18 -4
  58. package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.d.ts +35 -4
  59. package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRuntime.d.ts +1 -1
  60. package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.d.ts +7 -0
  61. package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryRequestScopedCloudflare.d.ts +2 -2
  62. package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.d.ts +5 -3
  63. package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.d.ts +18 -3
  64. package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.d.ts +2 -0
  65. package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationRequestScopedCloudflare.d.ts +39 -0
  66. package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationInputs.d.ts +6 -0
  67. package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationReservation.d.ts +16 -2
  68. package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationRoutes.d.ts +1 -0
  69. package/dist/types/wallet-server/src/router/framework/registrationSetupRateLimit.d.ts +11 -0
  70. package/dist/types/wallet-server/src/router/framework/routerApi.d.ts +1 -0
  71. package/migrations/d1-signer/0079_tenant_lookup_indexes.sql +33 -0
  72. package/migrations/d1-signer/0080_registration_setup_rate_limits.sql +11 -0
  73. package/package.json +1 -1
  74. package/src/README.md +1 -1
@@ -30,11 +30,16 @@ export type RouterAbEd25519YaoRegistrationBackendResult = {
30
30
  } | RouterAbEd25519YaoRegistrationBackendFailure;
31
31
  export interface RouterAbEd25519YaoRegistrationBackend {
32
32
  takeLastRouterServerTiming?(): string | null;
33
- admit(request: RouterAbEd25519YaoRegistrationAdmissionRequestV1, traceContext?: RouterAbTraceContextV1): Promise<RouterAbEd25519YaoRegistrationBackendResult> | RouterAbEd25519YaoRegistrationBackendResult;
33
+ /**
34
+ * Issues the admission receipt. A registration passes the session that its
35
+ * setup minted, and the receipt is over that session. Without one the
36
+ * backend mints the session here.
37
+ */
38
+ admit(request: RouterAbEd25519YaoRegistrationAdmissionRequestV1, traceContext?: RouterAbTraceContextV1, mintedSessionId?: RouterAbEd25519YaoBytes32V1): Promise<RouterAbEd25519YaoRegistrationBackendResult> | RouterAbEd25519YaoRegistrationBackendResult;
34
39
  execute(request: RouterAbEd25519YaoRegistrationExecuteRequestV1, admissionRequest: RouterAbEd25519YaoRegistrationExecuteAdmissionContextV1, ownershipGeneration: number, traceContext?: RouterAbTraceContextV1): Promise<RouterAbEd25519YaoRegistrationBackendResult> | RouterAbEd25519YaoRegistrationBackendResult;
35
40
  }
36
41
  export interface RouterAbEd25519YaoRegistrationService {
37
- admit(request: RouterAbEd25519YaoRegistrationAdmissionRequestV1, traceContext?: RouterAbTraceContextV1): Promise<RouterAbEd25519YaoRegistrationServiceResult<RouterAbEd25519YaoRegistrationAdmissionReceiptV1>>;
42
+ admit(request: RouterAbEd25519YaoRegistrationAdmissionRequestV1, traceContext?: RouterAbTraceContextV1, mintedSessionId?: RouterAbEd25519YaoBytes32V1): Promise<RouterAbEd25519YaoRegistrationServiceResult<RouterAbEd25519YaoRegistrationAdmissionReceiptV1>>;
38
43
  execute(request: RouterAbEd25519YaoRegistrationExecuteRequestV1, ownershipGeneration: number, traceContext?: RouterAbTraceContextV1): Promise<RouterAbEd25519YaoRegistrationServiceResult<RouterAbEd25519YaoRegistrationResultV1>>;
39
44
  }
40
45
  export type RouterAbEd25519YaoRegistrationAdmissionClaimV1 = {
@@ -181,6 +186,16 @@ export interface RouterAbEd25519YaoActivationConsumerV1 {
181
186
  consumeActivated(request: RouterAbEd25519YaoActivationConsumptionRequestV1): Promise<RouterAbEd25519YaoActivationConsumptionResultV1> | RouterAbEd25519YaoActivationConsumptionResultV1;
182
187
  }
183
188
  export declare function encodeRouterAbEd25519YaoRegistrationAdmissionFingerprintV1(request: RouterAbEd25519YaoRegistrationAdmissionRequestV1): string;
189
+ /**
190
+ * The receipt that `backend` issues for `request` over the session that setup
191
+ * minted, checked as an admission checks it. It stores nothing and admits
192
+ * nothing: the admission still follows the verified proof.
193
+ */
194
+ export declare function describeRouterAbEd25519YaoRegistrationAdmissionV1(input: {
195
+ readonly backend: RouterAbEd25519YaoRegistrationBackend;
196
+ readonly request: RouterAbEd25519YaoRegistrationAdmissionRequestV1;
197
+ readonly mintedSessionId: RouterAbEd25519YaoBytes32V1;
198
+ }): Promise<RouterAbEd25519YaoRegistrationServiceResult<RouterAbEd25519YaoRegistrationAdmissionReceiptV1>>;
184
199
  export declare function routerAbEd25519YaoExecutionMatchesAdmissionV1(request: RouterAbEd25519YaoRegistrationExecuteRequestV1, receipt: RouterAbEd25519YaoRegistrationAdmissionReceiptV1): boolean;
185
200
  export declare function createRouterAbEd25519YaoRegistrationModule(input: {
186
201
  service: RouterAbEd25519YaoRegistrationService;
@@ -192,7 +207,7 @@ export declare class InMemoryRouterAbEd25519YaoRegistrationService implements Ro
192
207
  private readonly lifecycleSessions;
193
208
  private readonly admissionClaims;
194
209
  constructor(backend: RouterAbEd25519YaoRegistrationBackend, state?: InMemoryRouterAbEd25519YaoRegistrationStateV1);
195
- admit(request: RouterAbEd25519YaoRegistrationAdmissionRequestV1, traceContext?: RouterAbTraceContextV1): Promise<RouterAbEd25519YaoRegistrationServiceResult<RouterAbEd25519YaoRegistrationAdmissionReceiptV1>>;
210
+ admit(request: RouterAbEd25519YaoRegistrationAdmissionRequestV1, traceContext?: RouterAbTraceContextV1, mintedSessionId?: RouterAbEd25519YaoBytes32V1): Promise<RouterAbEd25519YaoRegistrationServiceResult<RouterAbEd25519YaoRegistrationAdmissionReceiptV1>>;
196
211
  prepareAdmit(request: RouterAbEd25519YaoRegistrationAdmissionRequestV1): RouterAbEd25519YaoRegistrationAdmissionPreparationV1;
197
212
  commitAdmit(input: RouterAbEd25519YaoRegistrationAdmissionCommitInputV1): RouterAbEd25519YaoRegistrationServiceResult<RouterAbEd25519YaoRegistrationAdmissionReceiptV1>;
198
213
  execute(request: RouterAbEd25519YaoRegistrationExecuteRequestV1, ownershipGeneration: number, traceContext?: RouterAbTraceContextV1): Promise<RouterAbEd25519YaoRegistrationServiceResult<RouterAbEd25519YaoRegistrationResultV1>>;
@@ -68,6 +68,8 @@ type RouterAbEd25519YaoBearerCredentialDigestResultV1 = {
68
68
  };
69
69
  export declare function routerAbEd25519YaoBearerCredentialDigestV1(request: Request): Promise<RouterAbEd25519YaoBearerCredentialDigestResultV1>;
70
70
  export declare function routerAbEd25519YaoCredentialDigestHexV1(digest: Uint8Array): string;
71
+ /** The digest that an admission binds for the credential of its registration intent. */
72
+ export declare function routerAbEd25519YaoCredentialDigestSha256HexV1(credential: string): Promise<string>;
71
73
  export declare class InMemoryRouterAbEd25519YaoRegistrationIntentAuthorizationStateV1 {
72
74
  readonly authorities: IntentAuthority[];
73
75
  }
@@ -1,4 +1,7 @@
1
1
  import type { VerifiedNearRegistrationContinuationV1 } from './routerAbEd25519YaoRegistrationIntentAuthorization';
2
+ import { type RouterAbEd25519YaoActivationExecuteRequestV1, type RouterAbEd25519YaoActivationResultV1 } from '../../../../../../shared-ts/src/utils/routerAbEd25519Yao';
3
+ import { type RouterAbTraceContextV1 } from '../../../../../../shared-ts/src/utils/routerAbTraceContext';
4
+ import type { RouterAbEd25519YaoRegistrationServiceResult } from './routerAbEd25519YaoRegistration';
2
5
  import type { RouterAbEd25519YaoPinnedRegistrationBackend } from './routerAbEd25519YaoHttpRegistrationBackend';
3
6
  import { type RouterAbEd25519YaoProductRegistrationPartitionedStateStoreV1 } from '../capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore';
4
7
  export type RouterAbEd25519YaoRegistrationRequestScopedCloudflareInputV1 = {
@@ -10,5 +13,41 @@ export type RouterAbEd25519YaoRegistrationRequestScopedCloudflareInputV1 = {
10
13
  readonly store: RouterAbEd25519YaoProductRegistrationPartitionedStateStoreV1;
11
14
  readonly backend: RouterAbEd25519YaoPinnedRegistrationBackend;
12
15
  };
16
+ type RouterAbEd25519YaoRegistrationExecuteRequestV1 = RouterAbEd25519YaoActivationExecuteRequestV1<'registration'>;
17
+ type RouterAbEd25519YaoRegistrationResultV1 = RouterAbEd25519YaoActivationResultV1<'registration'>;
18
+ type AuthorizationFailure = {
19
+ readonly ok: false;
20
+ readonly status: 401 | 403 | 409 | 429 | 503;
21
+ readonly code: string;
22
+ readonly message: string;
23
+ };
24
+ type RegistrationExecutionTimingV1 = {
25
+ readonly credentialDigestMs: number;
26
+ readonly d1AdmissionReadMs: number;
27
+ readonly routerExecutionMs: number;
28
+ readonly routerServerTiming: string | null;
29
+ readonly resultReconstructionMs: number;
30
+ };
31
+ export type RouterAbEd25519YaoTimedRegistrationExecutionResultV1 = {
32
+ readonly result: RouterAbEd25519YaoRegistrationServiceResult<RouterAbEd25519YaoRegistrationResultV1> | AuthorizationFailure;
33
+ readonly timing: RegistrationExecutionTimingV1;
34
+ };
13
35
  export declare function handleRouterAbEd25519YaoRegistrationRequestScopedCloudflareV1(input: RouterAbEd25519YaoRegistrationRequestScopedCloudflareInputV1): Promise<Response>;
36
+ /**
37
+ * Runs one admitted registration for the holder of its credential. The
38
+ * execute route takes the credential from its bearer. A respond that carries
39
+ * the execute request takes it from the signed setup that it just verified.
40
+ */
41
+ export declare function executeRouterAbEd25519YaoAdmittedRegistrationV1(input: Pick<RouterAbEd25519YaoRegistrationRequestScopedCloudflareInputV1, 'store' | 'backend'> & {
42
+ readonly request: RouterAbEd25519YaoRegistrationExecuteRequestV1;
43
+ readonly credentialDigestSha256Hex: string;
44
+ readonly credentialDigestMs: number;
45
+ readonly trace: RouterAbTraceContextV1;
46
+ }): Promise<RouterAbEd25519YaoTimedRegistrationExecutionResultV1>;
47
+ /**
48
+ * The timing of one execution as Server-Timing entries, for a route that
49
+ * reports them in its own header: a respond that ran the execution.
50
+ */
51
+ export declare function routerAbEd25519YaoRegistrationExecutionTimingEntriesV1(timing: RouterAbEd25519YaoTimedRegistrationExecutionResultV1['timing']): Array<readonly [string, number]>;
52
+ export {};
14
53
  //# sourceMappingURL=routerAbEd25519YaoRegistrationRequestScopedCloudflare.d.ts.map
@@ -3,6 +3,7 @@ import type { RegistrationSignerSetSelection } from '../../../../../shared-ts/sr
3
3
  import type { RegistrationEstablishedSessionProjectionV2 } from '../../../../../shared-ts/src/utils/registrationEstablishedSession';
4
4
  import type { RegisterWalletInput, RegistrationAuthMethodInput } from '../../../../../shared-ts/src/utils/registrationAuthMethodInput';
5
5
  import type { RouterAbEcdsaRegistrationRequestV1, RouterAbEcdsaVerifiedClientActivationFactsV1 } from '../../../../../shared-ts/src/utils/routerAbEcdsaDerivation';
6
+ import type { RouterAbEd25519YaoActivationExecuteRequestV1 } from '../../../../../shared-ts/src/utils/routerAbEd25519Yao';
6
7
  import type { WalletRegistrationAuthorityInput, WalletRegistrationFinalizeSignerWork } from '../../../core/registrationContracts';
7
8
  import type { ThresholdRuntimePolicyScope } from '../../../core/types';
8
9
  import type { WalletRegistrationSetupMinter, WalletRegistrationSetupVerifier } from './walletRegistrationSetupPayload';
@@ -33,6 +34,11 @@ export type WalletRegistrationRespondInput = {
33
34
  readonly strictRegistration: RouterAbEcdsaRegistrationRequestV1;
34
35
  readonly requestDigestB64u: string;
35
36
  };
37
+ /**
38
+ * The execute request of an Ed25519-only plan, prepared from the admission
39
+ * that setup described. Respond admits, then runs it in the same request.
40
+ */
41
+ readonly ed25519Execution?: RouterAbEd25519YaoActivationExecuteRequestV1<'registration'>;
36
42
  /** Verifies the opaque setup token before authority-bound work begins. */
37
43
  readonly verifier: WalletRegistrationSetupVerifier;
38
44
  readonly userAgent?: string;
@@ -1,9 +1,11 @@
1
+ import type { Variant } from '../../../../../shared-ts/src/utils/variant';
1
2
  import type { WalletSessionLocatorPublication } from '../../../authorization/sessionRouting';
2
3
  import type { CommittedWalletRegistration } from '../../../authorization/domain';
3
4
  import type { D1PreparedStatementLike } from '../../../storage/tenantRoute';
4
5
  import { type DeviceId } from '../../../../../shared-ts/src/authorization/capabilityKinds';
5
6
  import { type WalletAuthorityId, type WalletAuthMethodId, type WalletId } from '../../../../../shared-ts/src/utils/domainIds';
6
7
  import type { WalletRegistrationSetupInput } from './walletRegistrationInputs';
8
+ import type { RouterAbEd25519YaoActivationAdmissionReceiptV1, RouterAbEd25519YaoRegistrationAdmissionRequestV1 } from '../../../../../shared-ts/src/utils/routerAbEd25519Yao';
7
9
  export type WalletRegistrationSetupReservation = {
8
10
  readonly walletId: WalletId;
9
11
  readonly ceremonyId: string;
@@ -30,10 +32,22 @@ export type WalletRegistrationSetupReservationResult = {
30
32
  readonly lifecycle?: never;
31
33
  };
32
34
  /** Persist custody addresses before setup completes, then start the reserved wallet objects. */
33
- export type RegistrationWalletStarter = (registration: {
35
+ export type RegistrationWalletStartup = {
34
36
  readonly walletId: WalletId;
35
37
  readonly ownershipGeneration: number;
36
- }) => Promise<void>;
38
+ } & ({
39
+ readonly kind: 'objects';
40
+ readonly admissionRequest?: never;
41
+ readonly admissionReceipt?: never;
42
+ readonly expiresAtMs?: never;
43
+ } | {
44
+ readonly kind: 'pair';
45
+ readonly admissionRequest: RouterAbEd25519YaoRegistrationAdmissionRequestV1;
46
+ readonly admissionReceipt: RouterAbEd25519YaoActivationAdmissionReceiptV1<'registration'>;
47
+ readonly expiresAtMs: number;
48
+ });
49
+ export type RegistrationPairStartup = Variant<RegistrationWalletStartup, 'kind', 'pair'>;
50
+ export type RegistrationWalletStarter = (registration: RegistrationWalletStartup) => Promise<void>;
37
51
  type ReservationOutcome = {
38
52
  readonly ok: true;
39
53
  } | {
@@ -21,6 +21,7 @@ type RouterApiWalletRegistrationServices = {
21
21
  session?: SessionAdapter | null;
22
22
  publishableKeyAuth?: RouterApiPublishableKeyAuthAdapter | null;
23
23
  registrationContext?: WalletRegistrationContextResolver | null;
24
+ registrationSetupRateLimit?: import('../../framework/registrationSetupRateLimit').RegistrationSetupRateLimit;
24
25
  };
25
26
  type RouterApiWalletRegistrationInput = {
26
27
  body: unknown;
@@ -0,0 +1,11 @@
1
+ export type RegistrationSetupRateLimitInput = {
2
+ readonly apiKeyId: string;
3
+ readonly orgId: string;
4
+ readonly projectId: string;
5
+ readonly envId: string;
6
+ readonly sourceIp: string;
7
+ };
8
+ export type RegistrationSetupRateLimit = (input: RegistrationSetupRateLimitInput) => Promise<{
9
+ readonly allowed: boolean;
10
+ }>;
11
+ //# sourceMappingURL=registrationSetupRateLimit.d.ts.map
@@ -157,6 +157,7 @@ export interface RouterApiOptions {
157
157
  publishableKeyAuth?: RouterApiPublishableKeyAuthAdapter | null;
158
158
  /** Fresh credential and active-environment resolution for registration setup. */
159
159
  registrationContext?: WalletRegistrationContextResolver | null;
160
+ registrationSetupRateLimit?: import('./registrationSetupRateLimit').RegistrationSetupRateLimit;
160
161
  /**
161
162
  * Optional Router API usage-meter adapter used to emit host runtime events.
162
163
  */
@@ -0,0 +1,33 @@
1
+ -- Lookups that had no usable index and read every session or every wallet of
2
+ -- a tenant. Each index below serves statements that already exist; no
3
+ -- statement changes its result.
4
+ --
5
+ -- Without statistics the planner expects about ten rows behind the first
6
+ -- column of any index. An index that covers a lookup therefore wins over a
7
+ -- narrower one that needs the table row, although its first column is the
8
+ -- namespace, which every row shares. The two session indexes carry the columns
9
+ -- that their lookups read so that the planner selects them.
10
+
11
+ -- The operation triggers find the session that owns an operation through
12
+ -- wallet_operation_authorizations with the namespace, the tenant and the
13
+ -- authorization only. The primary key has org_id, project_id and env_id before
14
+ -- tenant_id, and the triggers compare those three inside an OR, so the key
15
+ -- gave a namespace prefix and the triggers read every session.
16
+ CREATE INDEX wallet_session_authorizations_v2_tenant_authorization_idx
17
+ ON wallet_session_authorizations_v2 (
18
+ namespace, tenant_id, authorization_id, org_id, project_id, env_id, wallet_id
19
+ );
20
+
21
+ -- The quota freeze triggers find the session of a quota with the namespace,
22
+ -- the tenant, the quota and the wallet session only.
23
+ CREATE INDEX wallet_session_authorizations_v2_tenant_quota_idx
24
+ ON wallet_session_authorizations_v2 (
25
+ namespace, tenant_id, quota_id, wallet_session_id, org_id, project_id, env_id, wallet_id
26
+ );
27
+
28
+ -- The registration cancellation fences and the Gateway admission find a wallet
29
+ -- by its registration ceremony. wallet_id is last so that the first match is
30
+ -- the one the primary key order gave, and so that the admission reads the
31
+ -- index only.
32
+ CREATE INDEX wallet_execution_generations_origin_idx
33
+ ON wallet_execution_generations (namespace, org_id, project_id, env_id, origin, origin_id, wallet_id);
@@ -0,0 +1,11 @@
1
+ CREATE TABLE registration_setup_rate_limits (
2
+ namespace TEXT NOT NULL,
3
+ org_id TEXT NOT NULL,
4
+ project_id TEXT NOT NULL,
5
+ env_id TEXT NOT NULL,
6
+ rate_key TEXT NOT NULL,
7
+ consumed_count INTEGER NOT NULL CHECK (consumed_count BETWEEN 1 AND 30),
8
+ reset_at_ms INTEGER NOT NULL,
9
+ PRIMARY KEY (namespace, org_id, project_id, env_id, rate_key)
10
+ );
11
+ CREATE INDEX registration_setup_rate_limits_expiry ON registration_setup_rate_limits (reset_at_ms);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seams/wallet-server",
3
- "version": "0.9.4",
3
+ "version": "0.10.0",
4
4
  "type": "module",
5
5
  "description": "Seams server TypeScript SDK for NEAR and EVM-family wallets",
6
6
  "main": "./dist/esm/index.js",
package/src/README.md CHANGED
@@ -23,7 +23,7 @@ authentication is intentionally outside this package.
23
23
  ## Primary wallet routes
24
24
 
25
25
  Wallet-management routes (registration, signer setup/inventory, auth-method
26
- management and implicit NEAR funding) require `X-Seams-Wallet-Protocol: 3`.
26
+ management and implicit NEAR funding) require `X-Seams-Wallet-Protocol: 4`.
27
27
  Missing or unsupported values return HTTP 409, `wallet_protocol_mismatch`, with
28
28
  reload/upgrade instructions before parsing the body or invoking route services.
29
29
  The current Wallet SDK sends this header automatically. Direct HTTP clients,