@cheqd/studio 3.18.0-develop.1 → 3.18.0-develop.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 (39) hide show
  1. package/README.md +18 -4
  2. package/dist/controllers/api/account.d.ts +2 -2
  3. package/dist/controllers/api/account.d.ts.map +1 -1
  4. package/dist/controllers/api/account.js +99 -12
  5. package/dist/controllers/api/account.js.map +1 -1
  6. package/dist/database/cache/store.d.ts +7 -0
  7. package/dist/database/cache/store.d.ts.map +1 -1
  8. package/dist/database/cache/store.js +6 -0
  9. package/dist/database/cache/store.js.map +1 -1
  10. package/dist/database/entities/faucet-request.entity.d.ts +12 -3
  11. package/dist/database/entities/faucet-request.entity.d.ts.map +1 -1
  12. package/dist/database/entities/faucet-request.entity.js +34 -11
  13. package/dist/database/entities/faucet-request.entity.js.map +1 -1
  14. package/dist/database/migrations/1791500000001-studio-migrations.d.ts +7 -0
  15. package/dist/database/migrations/1791500000001-studio-migrations.d.ts.map +1 -0
  16. package/dist/database/migrations/1791500000001-studio-migrations.js +16 -0
  17. package/dist/database/migrations/1791500000001-studio-migrations.js.map +1 -0
  18. package/dist/database/migrations/1791500000002-studio-migrations.d.ts +7 -0
  19. package/dist/database/migrations/1791500000002-studio-migrations.d.ts.map +1 -0
  20. package/dist/database/migrations/1791500000002-studio-migrations.js +10 -0
  21. package/dist/database/migrations/1791500000002-studio-migrations.js.map +1 -0
  22. package/dist/database/types/types.d.ts.map +1 -1
  23. package/dist/database/types/types.js +6 -0
  24. package/dist/database/types/types.js.map +1 -1
  25. package/dist/helpers/faucet-quota.d.ts +56 -4
  26. package/dist/helpers/faucet-quota.d.ts.map +1 -1
  27. package/dist/helpers/faucet-quota.js +107 -6
  28. package/dist/helpers/faucet-quota.js.map +1 -1
  29. package/dist/services/api/faucet-request.d.ts +45 -6
  30. package/dist/services/api/faucet-request.d.ts.map +1 -1
  31. package/dist/services/api/faucet-request.js +156 -13
  32. package/dist/services/api/faucet-request.js.map +1 -1
  33. package/dist/static/swagger-api.json +0 -60
  34. package/dist/types/constants.d.ts +7 -0
  35. package/dist/types/constants.d.ts.map +1 -1
  36. package/dist/types/constants.js +27 -0
  37. package/dist/types/constants.js.map +1 -1
  38. package/example.env +10 -0
  39. package/package.json +1 -1
@@ -1,52 +1,195 @@
1
1
  import { FaucetRequestEntity } from '../../database/entities/faucet-request.entity.js';
2
2
  import { Connection } from '../../database/connection/connection.js';
3
- import { fitsInQuota, getFaucetQuotaWindow, } from '../../helpers/faucet-quota.js';
3
+ import { FAUCET_PENDING_TIMEOUT_SECONDS, FAUCET_REQUEST_RETENTION_MONTHS } from '../../types/constants.js';
4
+ import { addressRoomNcheq, fitsInQuota, getFaucetQuotaWindow, logFaucetEvent, retentionCutoff, secondsUntilNextRequest, } from '../../helpers/faucet-quota.js';
5
+ // Retention cleanup runs inside normal requests (Studio has no scheduler), at most this often per process
6
+ const RETENTION_CLEANUP_INTERVAL_MS = 60 * 60 * 1000;
4
7
  export class FaucetRequestService {
5
8
  faucetRequestRepository;
9
+ lastRetentionCleanupAt = 0;
6
10
  static instance = new FaucetRequestService();
7
11
  constructor(repository) {
8
12
  this.faucetRequestRepository =
9
13
  repository ?? Connection.instance.dbConnection.getRepository(FaucetRequestEntity);
10
14
  }
11
- /** Total ncheq requested by the customer since `since`, using the given manager (and so its transaction). */
12
- static async sumRequestedNcheq(manager, customerId, since) {
15
+ /**
16
+ * The database's clock. `createdAt` is set by the database, so every comparison (month window, minimum interval,
17
+ * pending timeout, settle window, retention) must use its clock too, not the application's: instances with
18
+ * slightly different clocks would otherwise disagree about how old a row is. `clock_timestamp()` rather than
19
+ * `now()`, because inside a transaction `now()` stays at the start of the transaction, before any wait for the lock.
20
+ */
21
+ static async databaseNow(manager) {
22
+ if (manager.connection.options.type !== 'postgres')
23
+ return new Date();
24
+ const [row] = await manager.query('SELECT clock_timestamp() AS now');
25
+ return new Date(row.now);
26
+ }
27
+ static pendingCutoff(now, pendingTimeoutSeconds) {
28
+ return new Date(now.getTime() - pendingTimeoutSeconds * 1000);
29
+ }
30
+ /**
31
+ * Total ncheq requested by the customer since `since`, using the given manager (and so its transaction).
32
+ * Completed and unknown requests always count; a pending one counts only until it is older than
33
+ * `pendingCutoff`, after which it is treated as abandoned.
34
+ */
35
+ static async sumRequestedNcheq(manager, customerId, since, pendingCutoff) {
36
+ const row = await manager
37
+ .createQueryBuilder(FaucetRequestEntity, 'request')
38
+ .select('COALESCE(SUM(request.amountNcheq), 0)', 'total')
39
+ .where('request.customerId = :customerId', { customerId })
40
+ .andWhere('request.createdAt >= :since', { since })
41
+ .andWhere(`(request.status IN ('completed', 'unknown') OR (request.status = 'pending' AND request.createdAt >= :pendingCutoff))`, { pendingCutoff })
42
+ .getRawOne();
43
+ return BigInt(row?.total ?? '0');
44
+ }
45
+ /** Total ncheq requested for one address since `since`, excluding abandoned reservations. */
46
+ static async sumRecentForAddress(manager, customerId, address, since) {
13
47
  const row = await manager
14
48
  .createQueryBuilder(FaucetRequestEntity, 'request')
15
49
  .select('COALESCE(SUM(request.amountNcheq), 0)', 'total')
16
50
  .where('request.customerId = :customerId', { customerId })
51
+ .andWhere('request.address = :address', { address })
17
52
  .andWhere('request.createdAt >= :since', { since })
53
+ .andWhere(`request.status <> 'abandoned'`)
18
54
  .getRawOne();
19
55
  return BigInt(row?.total ?? '0');
20
56
  }
57
+ /** When the customer last made a faucet request, or null if never. */
58
+ static async lastRequestAt(manager, customerId) {
59
+ const row = await manager
60
+ .createQueryBuilder(FaucetRequestEntity, 'request')
61
+ .select('MAX(request.createdAt)', 'last')
62
+ .where('request.customerId = :customerId', { customerId })
63
+ .andWhere(`request.status <> 'abandoned'`)
64
+ .getRawOne();
65
+ return row?.last ? new Date(row.last) : null;
66
+ }
67
+ /**
68
+ * Seconds the customer must still wait before their next request (0 if allowed). This is a cheap read taken
69
+ * before any expensive work; `reserve` repeats the check under the lock so concurrent requests cannot slip through.
70
+ */
71
+ async getSecondsUntilNextAllowed(customer, minIntervalSeconds, now) {
72
+ if (minIntervalSeconds <= 0)
73
+ return 0;
74
+ const manager = this.faucetRequestRepository.manager;
75
+ const last = await FaucetRequestService.lastRequestAt(manager, customer.customerId);
76
+ return secondsUntilNextRequest(last, minIntervalSeconds, now ?? (await FaucetRequestService.databaseNow(manager)));
77
+ }
78
+ /** What the customer has requested in the current quota window, and the window itself (both on the database clock). */
79
+ async getQuotaStatus(customer, now, pendingTimeoutSeconds = FAUCET_PENDING_TIMEOUT_SECONDS) {
80
+ const manager = this.faucetRequestRepository.manager;
81
+ const at = now ?? (await FaucetRequestService.databaseNow(manager));
82
+ const window = getFaucetQuotaWindow(at);
83
+ const usedNcheq = await FaucetRequestService.sumRequestedNcheq(manager, customer.customerId, window.start, FaucetRequestService.pendingCutoff(at, pendingTimeoutSeconds));
84
+ return { usedNcheq, window };
85
+ }
21
86
  /** Total ncheq requested by the customer in the current quota window. */
22
- async getUsedNcheq(customer, now = new Date()) {
23
- const { start } = getFaucetQuotaWindow(now);
24
- return FaucetRequestService.sumRequestedNcheq(this.faucetRequestRepository.manager, customer.customerId, start);
87
+ async getUsedNcheq(customer, now, pendingTimeoutSeconds = FAUCET_PENDING_TIMEOUT_SECONDS) {
88
+ return (await this.getQuotaStatus(customer, now, pendingTimeoutSeconds)).usedNcheq;
25
89
  }
26
90
  /**
27
- * Atomically checks the customer's monthly quota and, if the amount fits, records it.
91
+ * Atomically checks the customer's monthly quota and, if the amount fits, records it as pending.
28
92
  * A per-customer advisory lock serialises concurrent requests so they cannot overshoot the limit.
29
- * Call `release` if the upstream faucet call then definitely failed.
93
+ * Afterwards call `complete` when the faucet confirms, `release` if it definitely failed, or `markUnknown`
94
+ * if the call threw.
30
95
  */
31
- async reserve(customer, address, amountNcheq, limitNcheq, now = new Date()) {
32
- const window = getFaucetQuotaWindow(now);
33
- return this.faucetRequestRepository.manager.transaction(async (manager) => {
96
+ async reserve(customer, address, amountNcheq, { limitNcheq, minIntervalSeconds = 0, pendingTimeoutSeconds = FAUCET_PENDING_TIMEOUT_SECONDS, addressCap, }, nowOverride) {
97
+ const reservation = await this.faucetRequestRepository.manager.transaction(async (manager) => {
34
98
  if (manager.connection.options.type === 'postgres') {
35
99
  await manager.query('SELECT pg_advisory_xact_lock(hashtext($1))', [
36
100
  `faucet-quota:${customer.customerId}`,
37
101
  ]);
38
102
  }
39
- const usedNcheq = await FaucetRequestService.sumRequestedNcheq(manager, customer.customerId, window.start);
103
+ // Taken after the lock, so it is current even if this request had to wait for another one
104
+ const now = nowOverride ?? (await FaucetRequestService.databaseNow(manager));
105
+ const window = getFaucetQuotaWindow(now);
106
+ if (minIntervalSeconds > 0) {
107
+ const retryAfterSeconds = secondsUntilNextRequest(await FaucetRequestService.lastRequestAt(manager, customer.customerId), minIntervalSeconds, now);
108
+ if (retryAfterSeconds > 0) {
109
+ return { reserved: false, reason: 'too_frequent', retryAfterSeconds, window };
110
+ }
111
+ }
112
+ // Reservations that were never confirmed stop counting; mark them so the history shows why
113
+ const pendingCutoff = FaucetRequestService.pendingCutoff(now, pendingTimeoutSeconds);
114
+ const swept = await manager
115
+ .createQueryBuilder()
116
+ .update(FaucetRequestEntity)
117
+ .set({ status: 'abandoned' })
118
+ .where('customerId = :customerId', { customerId: customer.customerId })
119
+ .andWhere(`status = 'pending'`)
120
+ .andWhere('createdAt < :pendingCutoff', { pendingCutoff })
121
+ .execute();
122
+ if (swept.affected) {
123
+ logFaucetEvent('warn', 'faucet.reservations_abandoned', {
124
+ customerId: customer.customerId,
125
+ count: swept.affected,
126
+ pendingTimeoutSeconds,
127
+ });
128
+ }
129
+ const usedNcheq = await FaucetRequestService.sumRequestedNcheq(manager, customer.customerId, window.start, pendingCutoff);
40
130
  if (!fitsInQuota(usedNcheq, amountNcheq, limitNcheq)) {
41
- return { reserved: false, usedNcheq, window };
131
+ return { reserved: false, reason: 'quota_exceeded', usedNcheq, window };
132
+ }
133
+ // The balance the caller read may not include transfers still on their way, so subtract recent requests
134
+ // for this address. Done under the lock, this stops simultaneous requests each getting the full room.
135
+ if (addressCap) {
136
+ const inFlightNcheq = await FaucetRequestService.sumRecentForAddress(manager, customer.customerId, address, new Date(now.getTime() - addressCap.settleSeconds * 1000));
137
+ const roomNcheq = addressRoomNcheq(addressCap.capNcheq, addressCap.currentBalanceNcheq, inFlightNcheq);
138
+ if (amountNcheq > roomNcheq) {
139
+ return { reserved: false, reason: 'address_cap_exceeded', roomNcheq, window };
140
+ }
42
141
  }
43
142
  const entity = await manager.save(new FaucetRequestEntity(customer, address, amountNcheq));
44
143
  return { reserved: true, faucetRequestId: entity.faucetRequestId, usedNcheq, window };
45
144
  });
145
+ this.maybeRunRetentionCleanup();
146
+ return reservation;
147
+ }
148
+ /** Deletes faucet request rows older than the retention period. Returns how many were deleted. */
149
+ async runRetentionCleanup(now, retentionMonths = FAUCET_REQUEST_RETENTION_MONTHS) {
150
+ if (retentionMonths <= 0)
151
+ return 0;
152
+ now ??= await FaucetRequestService.databaseNow(this.faucetRequestRepository.manager);
153
+ const result = await this.faucetRequestRepository
154
+ .createQueryBuilder()
155
+ .delete()
156
+ .from(FaucetRequestEntity)
157
+ .where('createdAt < :cutoff', { cutoff: retentionCutoff(now, retentionMonths) })
158
+ .execute();
159
+ return result.affected ?? 0;
160
+ }
161
+ /**
162
+ * Runs the retention cleanup in the background, at most once an hour per process. Called from normal requests
163
+ * because Studio has no scheduler; it never delays or fails the request that triggered it.
164
+ */
165
+ maybeRunRetentionCleanup() {
166
+ if (FAUCET_REQUEST_RETENTION_MONTHS <= 0)
167
+ return;
168
+ // This only throttles how often this process runs the cleanup, so the process clock is the right one here
169
+ const processNow = Date.now();
170
+ if (processNow - this.lastRetentionCleanupAt < RETENTION_CLEANUP_INTERVAL_MS)
171
+ return;
172
+ this.lastRetentionCleanupAt = processNow;
173
+ this.runRetentionCleanup()
174
+ .then((deleted) => {
175
+ if (deleted > 0)
176
+ logFaucetEvent('info', 'faucet.retention_deleted', { deleted });
177
+ })
178
+ .catch((error) => logFaucetEvent('error', 'faucet.retention_failed', {
179
+ error: error?.message ?? String(error),
180
+ }));
46
181
  }
47
182
  /** Releases a reservation, e.g. when the upstream faucet reported that it did not credit the account. */
48
183
  async release(faucetRequestId) {
49
184
  await this.faucetRequestRepository.delete({ faucetRequestId });
50
185
  }
186
+ /** The faucet confirmed the credit. Also applies to a reservation that was already marked abandoned. */
187
+ async complete(faucetRequestId) {
188
+ await this.faucetRequestRepository.update({ faucetRequestId }, { status: 'completed', completedAt: () => 'now()' });
189
+ }
190
+ /** The faucet call threw, so tokens may have been sent: keep counting this reservation permanently. */
191
+ async markUnknown(faucetRequestId) {
192
+ await this.faucetRequestRepository.update({ faucetRequestId }, { status: 'unknown' });
193
+ }
51
194
  }
52
195
  //# sourceMappingURL=faucet-request.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"faucet-request.js","sourceRoot":"","sources":["../../../src/services/api/faucet-request.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,MAAM,yCAAyC,CAAC;AACrE,OAAO,EACN,WAAW,EACX,oBAAoB,GAGpB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,OAAO,oBAAoB;IACzB,uBAAuB,CAAkC;IAEzD,MAAM,CAAC,QAAQ,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAEpD,YAAY,UAA4C;QACvD,IAAI,CAAC,uBAAuB;YAC3B,UAAU,IAAI,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;IACpF,CAAC;IAED,6GAA6G;IACrG,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAsB,EAAE,UAAkB,EAAE,KAAW;QAC7F,MAAM,GAAG,GAAG,MAAM,OAAO;aACvB,kBAAkB,CAAC,mBAAmB,EAAE,SAAS,CAAC;aAClD,MAAM,CAAC,uCAAuC,EAAE,OAAO,CAAC;aACxD,KAAK,CAAC,kCAAkC,EAAE,EAAE,UAAU,EAAE,CAAC;aACzD,QAAQ,CAAC,6BAA6B,EAAE,EAAE,KAAK,EAAE,CAAC;aAClD,SAAS,EAAqB,CAAC;QACjC,OAAO,MAAM,CAAC,GAAG,EAAE,KAAK,IAAI,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,yEAAyE;IAClE,KAAK,CAAC,YAAY,CAAC,QAAwB,EAAE,MAAY,IAAI,IAAI,EAAE;QACzE,MAAM,EAAE,KAAK,EAAE,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC5C,OAAO,oBAAoB,CAAC,iBAAiB,CAAC,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACjH,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,OAAO,CACnB,QAAwB,EACxB,OAAe,EACf,WAAmB,EACnB,UAAkB,EAClB,MAAY,IAAI,IAAI,EAAE;QAEtB,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YACzE,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBACpD,MAAM,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE;oBACjE,gBAAgB,QAAQ,CAAC,UAAU,EAAE;iBACrC,CAAC,CAAC;YACJ,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAAC,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3G,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,CAAC;gBACtD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAW,CAAC;YACxD,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;YAC3F,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,SAAS,EAAE,MAAM,EAAW,CAAC;QAChG,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,yGAAyG;IAClG,KAAK,CAAC,OAAO,CAAC,eAAuB;QAC3C,MAAM,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC;IAChE,CAAC"}
1
+ {"version":3,"file":"faucet-request.js","sourceRoot":"","sources":["../../../src/services/api/faucet-request.ts"],"names":[],"mappings":"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"}
@@ -3483,66 +3483,6 @@
3483
3483
  }
3484
3484
  }
3485
3485
  },
3486
- "/account/faucet": {
3487
- "post": {
3488
- "tags": [
3489
- "Account"
3490
- ],
3491
- "summary": "Request cheqd testnet CHEQ tokens for a Studio payment account.",
3492
- "description": "Funds an authenticated Studio user's owned testnet payment account. An address can hold at most FAUCET_ADDRESS_CAP_CHEQ, and a customer can request at most FAUCET_MONTHLY_LIMIT_CHEQ per calendar month (UTC) across all their addresses; both default to 100,000 CHEQ. Without an amount the address is topped up to the cap, or by the quota left if that is lower. Works with a Studio user session or an API key; the response includes the remaining quota.",
3493
- "requestBody": {
3494
- "content": {
3495
- "application/json": {
3496
- "schema": {
3497
- "type": "object",
3498
- "properties": {
3499
- "address": {
3500
- "type": "string",
3501
- "description": "Optional owned Studio testnet payment account address. Defaults to the authenticated customer's testnet account."
3502
- },
3503
- "amount": {
3504
- "type": "number",
3505
- "description": "Optional amount in CHEQ. Defaults to the most that can be requested now (the lower of the room under the address cap and the monthly quota left)."
3506
- }
3507
- }
3508
- }
3509
- }
3510
- }
3511
- },
3512
- "responses": {
3513
- "200": {
3514
- "description": "The request was processed."
3515
- },
3516
- "400": {
3517
- "$ref": "#/components/schemas/InvalidRequest"
3518
- },
3519
- "401": {
3520
- "$ref": "#/components/schemas/UnauthorizedError"
3521
- },
3522
- "403": {
3523
- "description": "Forbidden."
3524
- },
3525
- "404": {
3526
- "description": "No Studio testnet payment account was found for this customer."
3527
- },
3528
- "429": {
3529
- "description": "The customer's monthly faucet quota is exhausted. The Retry-After header gives the seconds until it resets, and the body includes the quota details."
3530
- },
3531
- "500": {
3532
- "$ref": "#/components/schemas/InternalError"
3533
- },
3534
- "502": {
3535
- "description": "Upstream faucet request failed."
3536
- },
3537
- "503": {
3538
- "description": "Stripe subscription checks are disabled."
3539
- },
3540
- "504": {
3541
- "description": "The faucet did not respond within FAUCET_REQUEST_TIMEOUT_SECONDS. The request may or may not have been processed."
3542
- }
3543
- }
3544
- }
3545
- },
3546
3486
  "/account/analytics": {
3547
3487
  "get": {
3548
3488
  "tags": [
@@ -27,6 +27,8 @@ export declare const configLogToExpress: {
27
27
  * is set but invalid also uses the fallback but says so loudly, so a typo in a limit is not mistaken for the default.
28
28
  */
29
29
  export declare const parseNumberEnv: (value: string | undefined, fallback: number, name?: string) => number;
30
+ /** Like `parseNumberEnv`, but for whole numbers where 0 is meaningful (usually "disabled"). */
31
+ export declare const parseNonNegativeIntEnv: (value: string | undefined, fallback: number, name?: string) => number;
30
32
  export declare const MINIMAL_DENOM = "ncheq";
31
33
  export declare const FAUCET_URI: string;
32
34
  export declare const FAUCET_API_KEY: string;
@@ -35,6 +37,11 @@ export declare const TESTNET_MINIMUM_BALANCE: number;
35
37
  export declare const TESTNET_INITIAL_TOPUP_CHEQ: number;
36
38
  export declare const FAUCET_MONTHLY_LIMIT_CHEQ: number;
37
39
  export declare const FAUCET_ADDRESS_CAP_CHEQ: number;
40
+ export declare const FAUCET_SUBSCRIPTION_CACHE_SECONDS: number;
41
+ export declare const FAUCET_MIN_INTERVAL_SECONDS: number;
42
+ export declare const FAUCET_PENDING_TIMEOUT_SECONDS: number;
43
+ export declare const FAUCET_BALANCE_SETTLE_SECONDS: number;
44
+ export declare const FAUCET_REQUEST_RETENTION_MONTHS: number;
38
45
  export declare const FAUCET_REQUEST_TIMEOUT_SECONDS: number;
39
46
  export declare const FAUCET_AMOUNT: number;
40
47
  export declare const FAUCET_ACCESS_CLIENT_ID: string;
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/types/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAKrD,eAAO,MAAM,OAAO;;;;;;;CAGnB,CAAC;AAGF,eAAO,MAAM,oBAAoB,QAA8D,CAAC;AAChG,eAAO,MAAM,oBAAoB,KAA2D,CAAC;AAC7F,eAAO,MAAM,cAAc,SAAS,CAAC;AACrC,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,eAAO,MAAM,SAAS,QAAkC,CAAC;AAKzD,eAAO,MAAM,oBAAoB,QAAsE,CAAC;AAExG,eAAO,MAAM,kBAAkB;;;;;;;CA0B9B,CAAC;AAGF;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,GAAG,SAAS,EAAE,UAAU,MAAM,EAAE,aAA6B,KAAG,MAM3G,CAAC;AAEF,eAAO,MAAM,aAAa,UAAU,CAAC;AACrC,eAAO,MAAM,UAAU,QAAsE,CAAC;AAC9F,eAAO,MAAM,cAAc,QAAkD,CAAC;AAC9E,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,eAAO,MAAM,uBAAuB,QAInC,CAAC;AAGF,eAAO,MAAM,0BAA0B,QAItC,CAAC;AAEF,eAAO,MAAM,yBAAyB,QAIrC,CAAC;AAGF,eAAO,MAAM,uBAAuB,QAInC,CAAC;AAGF,eAAO,MAAM,8BAA8B,QAI1C,CAAC;AACF,eAAO,MAAM,aAAa,QAA8E,CAAC;AACzG,eAAO,MAAM,uBAAuB,QAA4C,CAAC;AACjF,eAAO,MAAM,2BAA2B,QAAgD,CAAC;AAGzF,eAAO,MAAM,iBAAiB,QAAsE,CAAC;AACrG,eAAO,MAAM,kBAAkB,QAAoD,CAAC;AACpF,eAAO,MAAM,iBAAiB,QAAsC,CAAC;AACrE,eAAO,MAAM,uBAAuB,QAA2D,CAAC;AAGhG,eAAO,MAAM,UAAU,UAA6C,CAAC;AACrE,eAAO,MAAM,OAAO,yBAAyB,CAAC;AAC9C,eAAO,MAAM,eAAe,QAAQ,CAAC;AACrC,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAC9C,eAAO,MAAM,cAAc,mFAAmF,CAAC;AAG/G,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,eAAe,CAAC,OAAO,GAAG,eAAe,CAAC,OAAO,EAAE,MAAM,CAG7F,CAAC;AAEF,eAAO,MAAM,eAAe,2BAA2B,CAAC;AAExD,eAAO,MAAM,+BAA+B,wEAAwE,CAAC;AAErH,oBAAY,yBAAyB;IACpC,GAAG,QAAQ;IACX,QAAQ,aAAa;IACrB,iBAAiB,sBAAsB;IACvC,UAAU,eAAe;IACzB,YAAY,iBAAiB;IAC7B,GAAG,QAAQ;IACX,YAAY,iBAAiB;IAC7B,OAAO,YAAY;CACnB;AAED,oBAAY,uBAAuB;IAClC,UAAU,cAAc;IACxB,UAAU,cAAc;IACxB,cAAc,cAAc;IAC5B,qBAAqB,cAAc;IACnC,oBAAoB,aAAa;IACjC,qBAAqB,aAAa;CAClC;AAED,oBAAY,iBAAiB;IAE5B,UAAU,eAAe;IACzB,UAAU,eAAe;IACzB,cAAc,mBAAmB;IACjC,UAAU,eAAe;IACzB,UAAU,eAAe;IACzB,QAAQ,aAAa;IACrB,UAAU,eAAe;IAEzB,eAAe,oBAAoB;IACnC,eAAe,oBAAoB;IAGnC,oCAAoC,yCAAyC;IAC7E,kCAAkC,uCAAuC;IACzE,oCAAoC,yCAAyC;IAC7E,kCAAkC,uCAAuC;IACzE,uBAAuB,4BAA4B;IACnD,wBAAwB,6BAA6B;IACrD,sBAAsB,2BAA2B;IACjD,mCAAmC,wCAAwC;IAG3E,gBAAgB,qBAAqB;IACrC,iBAAiB,sBAAsB;IACvC,iBAAiB,sBAAsB;IACvC,kBAAkB,uBAAuB;IACzC,oBAAoB,yBAAyB;IAE7C,cAAc,mBAAmB;IACjC,WAAW,gBAAgB;IAC3B,oBAAoB,yBAAyB;IAE7C,UAAU,eAAe;IACzB,UAAU,eAAe;IACzB,QAAQ,aAAa;IAErB,mBAAmB,wBAAwB;IAC3C,mBAAmB,wBAAwB;IAE3C,mBAAmB,wBAAwB;IAC3C,mBAAmB,wBAAwB;IAC3C,mBAAmB,wBAAwB;IAC3C,2BAA2B,gCAAgC;IAG3D,cAAc,mBAAmB;IACjC,cAAc,mBAAmB;IACjC,cAAc,mBAAmB;IACjC,WAAW,gBAAgB;IAC3B,YAAY,iBAAiB;IAG7B,qBAAqB,0BAA0B;CAC/C;AAED,eAAO,MAAM,cAAc,iBAAiB,CAAC;AAC7C,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AACzD,eAAO,MAAM,wBAAwB,6BAA6B,CAAC;AACnE,eAAO,MAAM,kBAAkB,UAA2E,CAAC;AAC3G,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAChD,eAAO,MAAM,qBAAqB,EAAG,SAAkB,CAAC;AACxD,eAAO,MAAM,yBAAyB,KAAK,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/types/constants.ts"],"names":[],"mappings":"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"}
@@ -56,6 +56,16 @@ export const parseNumberEnv = (value, fallback, name = 'environment variable') =
56
56
  console.warn(`Ignoring invalid ${name}="${value}": expected a positive number. Using the default, ${fallback}.`);
57
57
  return fallback;
58
58
  };
59
+ /** Like `parseNumberEnv`, but for whole numbers where 0 is meaningful (usually "disabled"). */
60
+ export const parseNonNegativeIntEnv = (value, fallback, name = 'environment variable') => {
61
+ if (!value?.trim())
62
+ return fallback;
63
+ const parsed = Number(value);
64
+ if (Number.isInteger(parsed) && parsed >= 0)
65
+ return parsed;
66
+ console.warn(`Ignoring invalid ${name}="${value}": expected a whole number, 0 or more. Using the default, ${fallback}.`);
67
+ return fallback;
68
+ };
59
69
  export const MINIMAL_DENOM = 'ncheq';
60
70
  export const FAUCET_URI = process.env.FAUCET_URI || 'https://faucet-api.cheqd.network/credit';
61
71
  export const FAUCET_API_KEY = process.env.FAUCET_API_KEY || 'default-api-key';
@@ -69,6 +79,23 @@ export const FAUCET_MONTHLY_LIMIT_CHEQ = parseNumberEnv(process.env.FAUCET_MONTH
69
79
  // Most CHEQ a single testnet address can hold before POST /account/faucet stops topping it up.
70
80
  // Defaults to the monthly limit, so there is one figure unless this is set explicitly.
71
81
  export const FAUCET_ADDRESS_CAP_CHEQ = parseNumberEnv(process.env.FAUCET_ADDRESS_CAP_CHEQ, FAUCET_MONTHLY_LIMIT_CHEQ, 'FAUCET_ADDRESS_CAP_CHEQ');
82
+ // How long, in seconds, the faucet endpoint caches a customer's Stripe subscription status and plan, so API-key
83
+ // use does not call Stripe on every request. 0 disables the cache.
84
+ export const FAUCET_SUBSCRIPTION_CACHE_SECONDS = parseNonNegativeIntEnv(process.env.FAUCET_SUBSCRIPTION_CACHE_SECONDS, 60, 'FAUCET_SUBSCRIPTION_CACHE_SECONDS');
85
+ // Minimum gap, in seconds, between two faucet requests from the same customer (0 disables), so a script using an
86
+ // API key cannot hammer the endpoint (and Stripe, the RPC node and the faucet behind it) in a tight loop.
87
+ export const FAUCET_MIN_INTERVAL_SECONDS = parseNonNegativeIntEnv(process.env.FAUCET_MIN_INTERVAL_SECONDS, 10, 'FAUCET_MIN_INTERVAL_SECONDS');
88
+ // How long, in seconds, a faucet quota reservation that has not been confirmed keeps counting towards the quota
89
+ // before it is treated as abandoned (e.g. the process died before calling the faucet). Must be longer than the
90
+ // longest time a faucet call can take. Reservations whose faucet call threw (outcome unknown) always keep counting.
91
+ export const FAUCET_PENDING_TIMEOUT_SECONDS = parseNonNegativeIntEnv(process.env.FAUCET_PENDING_TIMEOUT_SECONDS, 600, 'FAUCET_PENDING_TIMEOUT_SECONDS');
92
+ // A faucet transfer takes a few blocks to show up in an address's on-chain balance. For this many seconds, requests
93
+ // already made for the same address are subtracted from the room left under the address cap, so simultaneous
94
+ // requests cannot each be allowed the full room. Over-subtracting briefly is the safe direction.
95
+ export const FAUCET_BALANCE_SETTLE_SECONDS = parseNonNegativeIntEnv(process.env.FAUCET_BALANCE_SETTLE_SECONDS, 20, 'FAUCET_BALANCE_SETTLE_SECONDS');
96
+ // Faucet request rows older than this many calendar months are deleted (0 keeps them forever). Only the current
97
+ // month is needed to enforce the quota; older rows are kept for a while for support.
98
+ export const FAUCET_REQUEST_RETENTION_MONTHS = parseNonNegativeIntEnv(process.env.FAUCET_REQUEST_RETENTION_MONTHS, 13, 'FAUCET_REQUEST_RETENTION_MONTHS');
72
99
  // How long, in seconds, to wait for the faucet service to answer before giving up. Without a limit a hung faucet
73
100
  // holds the caller (and a quota reservation) for as long as Node's own default, several minutes.
74
101
  export const FAUCET_REQUEST_TIMEOUT_SECONDS = parseNumberEnv(process.env.FAUCET_REQUEST_TIMEOUT_SECONDS, 30, 'FAUCET_REQUEST_TIMEOUT_SECONDS');
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/types/constants.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/types/constants.ts"],"names":[],"mappings":"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"}
package/example.env CHANGED
@@ -42,6 +42,16 @@ TESTNET_INITIAL_TOPUP_CHEQ="10000"
42
42
  # FAUCET_MONTHLY_LIMIT_CHEQ="100000"
43
43
  # Max CHEQ a single testnet address can hold before the faucet stops topping it up (defaults to the monthly limit)
44
44
  # FAUCET_ADDRESS_CAP_CHEQ="100000"
45
+ # Seconds POST /account/faucet caches a customer's Stripe subscription status and plan (0 disables)
46
+ # FAUCET_SUBSCRIPTION_CACHE_SECONDS="60"
47
+ # Minimum seconds between two POST /account/faucet requests from one customer (0 disables)
48
+ # FAUCET_MIN_INTERVAL_SECONDS="10"
49
+ # Seconds an unconfirmed faucet quota reservation keeps counting before it is treated as abandoned
50
+ # FAUCET_PENDING_TIMEOUT_SECONDS="600"
51
+ # Seconds recent requests for an address are subtracted from its room under the address cap
52
+ # FAUCET_BALANCE_SETTLE_SECONDS="20"
53
+ # Months of faucet request history to keep (0 keeps everything)
54
+ # FAUCET_REQUEST_RETENTION_MONTHS="13"
45
55
  # Seconds to wait for the faucet service to answer before giving up
46
56
  # FAUCET_REQUEST_TIMEOUT_SECONDS="30"
47
57
  # FAUCET_URI="https://faucet-api.cheqd.network/credit"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cheqd/studio",
3
- "version": "3.18.0-develop.1",
3
+ "version": "3.18.0-develop.3",
4
4
  "description": "cheqd Studio Backend",
5
5
  "source": "src/index.ts",
6
6
  "main": "dist/index.js",