@cheqd/studio 3.18.0-develop.2 → 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 (31) hide show
  1. package/README.md +15 -4
  2. package/dist/controllers/api/account.d.ts +1 -1
  3. package/dist/controllers/api/account.d.ts.map +1 -1
  4. package/dist/controllers/api/account.js +45 -9
  5. package/dist/controllers/api/account.js.map +1 -1
  6. package/dist/database/entities/faucet-request.entity.d.ts +1 -2
  7. package/dist/database/entities/faucet-request.entity.d.ts.map +1 -1
  8. package/dist/database/entities/faucet-request.entity.js +11 -12
  9. package/dist/database/entities/faucet-request.entity.js.map +1 -1
  10. package/dist/database/migrations/1791500000002-studio-migrations.d.ts +7 -0
  11. package/dist/database/migrations/1791500000002-studio-migrations.d.ts.map +1 -0
  12. package/dist/database/migrations/1791500000002-studio-migrations.js +10 -0
  13. package/dist/database/migrations/1791500000002-studio-migrations.js.map +1 -0
  14. package/dist/database/types/types.d.ts.map +1 -1
  15. package/dist/database/types/types.js +3 -0
  16. package/dist/database/types/types.js.map +1 -1
  17. package/dist/helpers/faucet-quota.d.ts +30 -2
  18. package/dist/helpers/faucet-quota.d.ts.map +1 -1
  19. package/dist/helpers/faucet-quota.js +73 -9
  20. package/dist/helpers/faucet-quota.js.map +1 -1
  21. package/dist/services/api/faucet-request.d.ts +24 -2
  22. package/dist/services/api/faucet-request.d.ts.map +1 -1
  23. package/dist/services/api/faucet-request.js +102 -13
  24. package/dist/services/api/faucet-request.js.map +1 -1
  25. package/dist/static/swagger-api.json +0 -60
  26. package/dist/types/constants.d.ts +2 -0
  27. package/dist/types/constants.d.ts.map +1 -1
  28. package/dist/types/constants.js +7 -0
  29. package/dist/types/constants.js.map +1 -1
  30. package/example.env +4 -0
  31. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"faucet-quota.d.ts","sourceRoot":"","sources":["../../src/helpers/faucet-quota.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"faucet-quota.d.ts","sourceRoot":"","sources":["../../src/helpers/faucet-quota.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,KAAK,EAAuB,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAGnF;;;GAGG;AAEH,MAAM,WAAW,iBAAiB;IACjC,KAAK,EAAE,IAAI,CAAC;IACZ,QAAQ,EAAE,IAAI,CAAC;CACf;AAED,oDAAoD;AACpD,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,IAAiB,GAAG,iBAAiB,CAO9E;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,GAAE,IAAiB,GAAG,MAAM,CAE3F;AAED,uFAAuF;AACvF,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAElG;AAED,sHAAsH;AACtH,wBAAgB,mBAAmB,CAAC,iBAAiB,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,GAAG,MAAM,CAGlG;AAED,uCAAuC;AACvC,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,wBAAgB,uBAAuB,CACtC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,iBAAiB,GACvB,kBAAkB,CAUpB;AAED,mHAAmH;AACnH,wBAAgB,eAAe,CAAC,GAAG,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI,CAExE;AAED,wGAAwG;AACxG,wBAAgB,uBAAuB,CACtC,aAAa,EAAE,IAAI,GAAG,IAAI,EAC1B,kBAAkB,EAAE,MAAM,EAC1B,GAAG,GAAE,IAAiB,GACpB,MAAM,CAIR;AAED,sHAAsH;AACtH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAG7G;AAED,MAAM,WAAW,gBAAgB;IAEhC,QAAQ,EAAE,MAAM,CAAC;IAEjB,mBAAmB,EAAE,MAAM,CAAC;IAE5B,aAAa,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IAEpC,UAAU,EAAE,MAAM,CAAC;IAEnB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AAED,MAAM,MAAM,iBAAiB,GAC1B;IAAE,QAAQ,EAAE,IAAI,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,GACzF;IAAE,QAAQ,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,GAC3F;IAAE,QAAQ,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,cAAc,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,GACjG;IAAE,QAAQ,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAErG,gGAAgG;AAChG,MAAM,WAAW,iBAAiB;IACjC,OAAO,CACN,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,oBAAoB,GAC3B,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC9B,OAAO,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,uCAAuC;IACvC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,uGAAuG;IACvG,WAAW,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpD;AAiBD,MAAM,MAAM,kBAAkB,GAC3B;IAAE,OAAO,EAAE,gBAAgB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,GAC3E;IAAE,OAAO,EAAE,cAAc,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,GACjF;IAAE,OAAO,EAAE,sBAAsB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAEtD;IAAE,OAAO,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,GACrE;IAAE,OAAO,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AACvD,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;AAE3G;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,YAE5B,CAAC;AAIF;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACtC,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE,MAAM,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EAC1D,MAAM,EAAE;IACP,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC9B,EACD,GAAG,GAAE,YAA6B,GAChC,OAAO,CAAC,kBAAkB,CAAC,CA6E7B"}
@@ -36,6 +36,10 @@ export function buildFaucetQuotaSummary(usedNcheq, limitNcheq, window) {
36
36
  resetsAt: window.resetsAt.toISOString(),
37
37
  };
38
38
  }
39
+ /** Rows older than this are past retention: the start of the calendar month `retentionMonths` months ago (UTC). */
40
+ export function retentionCutoff(now, retentionMonths) {
41
+ return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth() - retentionMonths, 1));
42
+ }
39
43
  /** Seconds the customer still has to wait before their next faucet request; 0 if one is allowed now. */
40
44
  export function secondsUntilNextRequest(lastRequestAt, minIntervalSeconds, now = new Date()) {
41
45
  if (!lastRequestAt || minIntervalSeconds <= 0)
@@ -43,52 +47,112 @@ export function secondsUntilNextRequest(lastRequestAt, minIntervalSeconds, now =
43
47
  const remainingMs = minIntervalSeconds * 1000 - (now.getTime() - lastRequestAt.getTime());
44
48
  return remainingMs > 0 ? Math.ceil(remainingMs / 1000) : 0;
45
49
  }
46
- async function markUnknownBestEffort(ledger, faucetRequestId) {
50
+ /** Room left under an address cap once its balance and requests still in flight are accounted for; never negative. */
51
+ export function addressRoomNcheq(capNcheq, currentBalanceNcheq, inFlightNcheq) {
52
+ const room = capNcheq - currentBalanceNcheq - inFlightNcheq;
53
+ return room > 0n ? room : 0n;
54
+ }
55
+ async function markUnknownBestEffort(ledger, faucetRequestId, log) {
47
56
  try {
48
57
  await ledger.markUnknown(faucetRequestId);
49
58
  }
50
59
  catch (error) {
51
- console.error(`Failed to mark faucet request ${faucetRequestId} as unknown:`, error);
60
+ log('error', 'faucet.mark_unknown_failed', {
61
+ reservationId: faucetRequestId,
62
+ error: error?.message ?? String(error),
63
+ });
52
64
  }
53
65
  }
66
+ /**
67
+ * Writes one structured log line per faucet decision, e.g. `{"event":"faucet.quota_exceeded","customerId":"..."}`,
68
+ * so "why was this customer blocked?" and "where did this month's quota go?" can be answered from the logs.
69
+ * Amounts are ncheq strings. Pass another logger to creditWithinQuota to capture events in tests.
70
+ */
71
+ export const logFaucetEvent = (level, event, fields) => {
72
+ console[level](JSON.stringify({ event, ...fields }));
73
+ };
74
+ const shorten = (text) => (text.length > 200 ? `${text.slice(0, 200)}...` : text);
54
75
  /**
55
76
  * Reserves quota, calls the faucet, and settles the reservation.
56
- * - Quota does not fit: the faucet is not called.
77
+ * - Quota, minimum interval or address cap does not allow it: the faucet is not called.
57
78
  * - Faucet answers with an error status: it definitely did not credit the account, so the quota is released.
58
79
  * - Faucet call throws (e.g. a timeout): the outcome is unknown and tokens may have been sent, so the
59
80
  * reservation is marked unknown and keeps counting for good (over-counting is safer than refunding quota
60
81
  * for tokens that were credited).
61
82
  * - Faucet confirms: the reservation is marked completed.
83
+ * Every outcome is logged through `log`.
62
84
  */
63
- export async function creditWithinQuota(ledger, delegate, params) {
85
+ export async function creditWithinQuota(ledger, delegate, params, log = logFaucetEvent) {
86
+ const base = {
87
+ customerId: params.customer.customerId,
88
+ address: params.address,
89
+ amountNcheq: params.amountNcheq.toString(),
90
+ };
64
91
  const reservation = await ledger.reserve(params.customer, params.address, params.amountNcheq, {
65
92
  limitNcheq: params.limitNcheq,
66
93
  minIntervalSeconds: params.minIntervalSeconds,
94
+ addressCap: params.addressCap,
67
95
  });
68
96
  if (!reservation.reserved) {
69
- return reservation.reason === 'too_frequent'
70
- ? { outcome: 'too_frequent', retryAfterSeconds: reservation.retryAfterSeconds, window: reservation.window }
71
- : { outcome: 'quota_exceeded', usedNcheq: reservation.usedNcheq, window: reservation.window };
97
+ switch (reservation.reason) {
98
+ case 'too_frequent':
99
+ log('warn', 'faucet.too_frequent', { ...base, retryAfterSeconds: reservation.retryAfterSeconds });
100
+ return {
101
+ outcome: 'too_frequent',
102
+ retryAfterSeconds: reservation.retryAfterSeconds,
103
+ window: reservation.window,
104
+ };
105
+ case 'address_cap_exceeded':
106
+ log('warn', 'faucet.address_cap_exceeded', { ...base, roomNcheq: reservation.roomNcheq.toString() });
107
+ return { outcome: 'address_cap_exceeded', roomNcheq: reservation.roomNcheq };
108
+ default:
109
+ log('warn', 'faucet.quota_exceeded', {
110
+ ...base,
111
+ usedNcheq: reservation.usedNcheq.toString(),
112
+ limitNcheq: params.limitNcheq.toString(),
113
+ });
114
+ return { outcome: 'quota_exceeded', usedNcheq: reservation.usedNcheq, window: reservation.window };
115
+ }
72
116
  }
117
+ const withReservation = { ...base, reservationId: reservation.faucetRequestId };
118
+ log('info', 'faucet.reserved', {
119
+ ...withReservation,
120
+ usedNcheq: reservation.usedNcheq.toString(),
121
+ limitNcheq: params.limitNcheq.toString(),
122
+ });
73
123
  let faucet;
74
124
  try {
75
125
  faucet = await delegate();
76
126
  }
77
127
  catch (error) {
78
- await markUnknownBestEffort(ledger, reservation.faucetRequestId);
128
+ log('warn', 'faucet.unknown', {
129
+ ...withReservation,
130
+ error: shorten(error?.message ?? String(error)),
131
+ note: 'faucet call threw; tokens may have been sent, so the reservation keeps counting',
132
+ });
133
+ await markUnknownBestEffort(ledger, reservation.faucetRequestId, log);
79
134
  throw error;
80
135
  }
81
136
  if (faucet.status !== 200) {
82
137
  await ledger.release(reservation.faucetRequestId);
138
+ log('warn', 'faucet.released', {
139
+ ...withReservation,
140
+ faucetStatus: faucet.status,
141
+ error: shorten(faucet.error),
142
+ });
83
143
  return { outcome: 'faucet_failed', status: faucet.status, error: faucet.error };
84
144
  }
85
145
  try {
86
146
  await ledger.complete(reservation.faucetRequestId);
147
+ log('info', 'faucet.completed', withReservation);
87
148
  }
88
149
  catch (error) {
89
150
  // The tokens were sent, so do not fail the request. The reservation stays pending and keeps counting
90
151
  // until it times out.
91
- console.error(`Failed to mark faucet request ${reservation.faucetRequestId} as completed:`, error);
152
+ log('error', 'faucet.complete_failed', {
153
+ ...withReservation,
154
+ error: shorten(error?.message ?? String(error)),
155
+ });
92
156
  }
93
157
  return {
94
158
  outcome: 'credited',
@@ -1 +1 @@
1
- {"version":3,"file":"faucet-quota.js","sourceRoot":"","sources":["../../src/helpers/faucet-quota.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"faucet-quota.js","sourceRoot":"","sources":["../../src/helpers/faucet-quota.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,19 @@
1
1
  import type { Repository } from 'typeorm';
2
2
  import type { CustomerEntity } from '../../database/entities/customer.entity.js';
3
3
  import { FaucetRequestEntity } from '../../database/entities/faucet-request.entity.js';
4
- import { type FaucetQuotaLedger, type FaucetReservation, type FaucetReserveOptions } from '../../helpers/faucet-quota.js';
4
+ import { type FaucetQuotaLedger, type FaucetQuotaWindow, type FaucetReservation, type FaucetReserveOptions } from '../../helpers/faucet-quota.js';
5
5
  export declare class FaucetRequestService implements FaucetQuotaLedger {
6
6
  faucetRequestRepository: Repository<FaucetRequestEntity>;
7
+ private lastRetentionCleanupAt;
7
8
  static instance: FaucetRequestService;
8
9
  constructor(repository?: Repository<FaucetRequestEntity>);
10
+ /**
11
+ * The database's clock. `createdAt` is set by the database, so every comparison (month window, minimum interval,
12
+ * pending timeout, settle window, retention) must use its clock too, not the application's: instances with
13
+ * slightly different clocks would otherwise disagree about how old a row is. `clock_timestamp()` rather than
14
+ * `now()`, because inside a transaction `now()` stays at the start of the transaction, before any wait for the lock.
15
+ */
16
+ private static databaseNow;
9
17
  private static pendingCutoff;
10
18
  /**
11
19
  * Total ncheq requested by the customer since `since`, using the given manager (and so its transaction).
@@ -13,6 +21,8 @@ export declare class FaucetRequestService implements FaucetQuotaLedger {
13
21
  * `pendingCutoff`, after which it is treated as abandoned.
14
22
  */
15
23
  private static sumRequestedNcheq;
24
+ /** Total ncheq requested for one address since `since`, excluding abandoned reservations. */
25
+ private static sumRecentForAddress;
16
26
  /** When the customer last made a faucet request, or null if never. */
17
27
  private static lastRequestAt;
18
28
  /**
@@ -20,6 +30,11 @@ export declare class FaucetRequestService implements FaucetQuotaLedger {
20
30
  * before any expensive work; `reserve` repeats the check under the lock so concurrent requests cannot slip through.
21
31
  */
22
32
  getSecondsUntilNextAllowed(customer: CustomerEntity, minIntervalSeconds: number, now?: Date): Promise<number>;
33
+ /** What the customer has requested in the current quota window, and the window itself (both on the database clock). */
34
+ getQuotaStatus(customer: CustomerEntity, now?: Date, pendingTimeoutSeconds?: number): Promise<{
35
+ usedNcheq: bigint;
36
+ window: FaucetQuotaWindow;
37
+ }>;
23
38
  /** Total ncheq requested by the customer in the current quota window. */
24
39
  getUsedNcheq(customer: CustomerEntity, now?: Date, pendingTimeoutSeconds?: number): Promise<bigint>;
25
40
  /**
@@ -28,7 +43,14 @@ export declare class FaucetRequestService implements FaucetQuotaLedger {
28
43
  * Afterwards call `complete` when the faucet confirms, `release` if it definitely failed, or `markUnknown`
29
44
  * if the call threw.
30
45
  */
31
- reserve(customer: CustomerEntity, address: string, amountNcheq: bigint, { limitNcheq, minIntervalSeconds, pendingTimeoutSeconds, }: FaucetReserveOptions, now?: Date): Promise<FaucetReservation>;
46
+ reserve(customer: CustomerEntity, address: string, amountNcheq: bigint, { limitNcheq, minIntervalSeconds, pendingTimeoutSeconds, addressCap, }: FaucetReserveOptions, nowOverride?: Date): Promise<FaucetReservation>;
47
+ /** Deletes faucet request rows older than the retention period. Returns how many were deleted. */
48
+ runRetentionCleanup(now?: Date, retentionMonths?: number): Promise<number>;
49
+ /**
50
+ * Runs the retention cleanup in the background, at most once an hour per process. Called from normal requests
51
+ * because Studio has no scheduler; it never delays or fails the request that triggered it.
52
+ */
53
+ private maybeRunRetentionCleanup;
32
54
  /** Releases a reservation, e.g. when the upstream faucet reported that it did not credit the account. */
33
55
  release(faucetRequestId: string): Promise<void>;
34
56
  /** The faucet confirmed the credit. Also applies to a reservation that was already marked abandoned. */
@@ -1 +1 @@
1
- {"version":3,"file":"faucet-request.d.ts","sourceRoot":"","sources":["../../../src/services/api/faucet-request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,UAAU,EAAE,MAAM,SAAS,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AAGvF,OAAO,EAIN,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,MAAM,+BAA+B,CAAC;AAEvC,qBAAa,oBAAqB,YAAW,iBAAiB;IACtD,uBAAuB,EAAE,UAAU,CAAC,mBAAmB,CAAC,CAAC;IAEhE,OAAc,QAAQ,uBAA8B;gBAExC,UAAU,CAAC,EAAE,UAAU,CAAC,mBAAmB,CAAC;IAKxD,OAAO,CAAC,MAAM,CAAC,aAAa;IAI5B;;;;OAIG;mBACkB,iBAAiB;IAmBtC,sEAAsE;mBACjD,aAAa;IAUlC;;;OAGG;IACU,0BAA0B,CACtC,QAAQ,EAAE,cAAc,EACxB,kBAAkB,EAAE,MAAM,EAC1B,GAAG,GAAE,IAAiB,GACpB,OAAO,CAAC,MAAM,CAAC;IASlB,yEAAyE;IAC5D,YAAY,CACxB,QAAQ,EAAE,cAAc,EACxB,GAAG,GAAE,IAAiB,EACtB,qBAAqB,GAAE,MAAuC,GAC5D,OAAO,CAAC,MAAM,CAAC;IAUlB;;;;;OAKG;IACU,OAAO,CACnB,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,EACC,UAAU,EACV,kBAAsB,EACtB,qBAAsD,GACtD,EAAE,oBAAoB,EACvB,GAAG,GAAE,IAAiB,GACpB,OAAO,CAAC,iBAAiB,CAAC;IA8C7B,yGAAyG;IAC5F,OAAO,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5D,wGAAwG;IAC3F,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7D,uGAAuG;IAC1F,WAAW,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGhE"}
1
+ {"version":3,"file":"faucet-request.d.ts","sourceRoot":"","sources":["../../../src/services/api/faucet-request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,UAAU,EAAE,MAAM,SAAS,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AAGvF,OAAO,EAON,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,MAAM,+BAA+B,CAAC;AAKvC,qBAAa,oBAAqB,YAAW,iBAAiB;IACtD,uBAAuB,EAAE,UAAU,CAAC,mBAAmB,CAAC,CAAC;IAChE,OAAO,CAAC,sBAAsB,CAAK;IAEnC,OAAc,QAAQ,uBAA8B;gBAExC,UAAU,CAAC,EAAE,UAAU,CAAC,mBAAmB,CAAC;IAKxD;;;;;OAKG;mBACkB,WAAW;IAMhC,OAAO,CAAC,MAAM,CAAC,aAAa;IAI5B;;;;OAIG;mBACkB,iBAAiB;IAmBtC,6FAA6F;mBACxE,mBAAmB;IAiBxC,sEAAsE;mBACjD,aAAa;IAUlC;;;OAGG;IACU,0BAA0B,CACtC,QAAQ,EAAE,cAAc,EACxB,kBAAkB,EAAE,MAAM,EAC1B,GAAG,CAAC,EAAE,IAAI,GACR,OAAO,CAAC,MAAM,CAAC;IAWlB,uHAAuH;IAC1G,cAAc,CAC1B,QAAQ,EAAE,cAAc,EACxB,GAAG,CAAC,EAAE,IAAI,EACV,qBAAqB,GAAE,MAAuC,GAC5D,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,iBAAiB,CAAA;KAAE,CAAC;IAa5D,yEAAyE;IAC5D,YAAY,CACxB,QAAQ,EAAE,cAAc,EACxB,GAAG,CAAC,EAAE,IAAI,EACV,qBAAqB,GAAE,MAAuC,GAC5D,OAAO,CAAC,MAAM,CAAC;IAIlB;;;;;OAKG;IACU,OAAO,CACnB,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,EACC,UAAU,EACV,kBAAsB,EACtB,qBAAsD,EACtD,UAAU,GACV,EAAE,oBAAoB,EACvB,WAAW,CAAC,EAAE,IAAI,GAChB,OAAO,CAAC,iBAAiB,CAAC;IAyE7B,kGAAkG;IACrF,mBAAmB,CAC/B,GAAG,CAAC,EAAE,IAAI,EACV,eAAe,GAAE,MAAwC,GACvD,OAAO,CAAC,MAAM,CAAC;IAYlB;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAiBhC,yGAAyG;IAC5F,OAAO,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5D,wGAAwG;IAC3F,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7D,uGAAuG;IAC1F,WAAW,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGhE"}
@@ -1,14 +1,29 @@
1
1
  import { FaucetRequestEntity } from '../../database/entities/faucet-request.entity.js';
2
2
  import { Connection } from '../../database/connection/connection.js';
3
- import { FAUCET_PENDING_TIMEOUT_SECONDS } from '../../types/constants.js';
4
- import { fitsInQuota, getFaucetQuotaWindow, secondsUntilNextRequest, } 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;
5
7
  export class FaucetRequestService {
6
8
  faucetRequestRepository;
9
+ lastRetentionCleanupAt = 0;
7
10
  static instance = new FaucetRequestService();
8
11
  constructor(repository) {
9
12
  this.faucetRequestRepository =
10
13
  repository ?? Connection.instance.dbConnection.getRepository(FaucetRequestEntity);
11
14
  }
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
+ }
12
27
  static pendingCutoff(now, pendingTimeoutSeconds) {
13
28
  return new Date(now.getTime() - pendingTimeoutSeconds * 1000);
14
29
  }
@@ -27,6 +42,18 @@ export class FaucetRequestService {
27
42
  .getRawOne();
28
43
  return BigInt(row?.total ?? '0');
29
44
  }
45
+ /** Total ncheq requested for one address since `since`, excluding abandoned reservations. */
46
+ static async sumRecentForAddress(manager, customerId, address, since) {
47
+ const row = await manager
48
+ .createQueryBuilder(FaucetRequestEntity, 'request')
49
+ .select('COALESCE(SUM(request.amountNcheq), 0)', 'total')
50
+ .where('request.customerId = :customerId', { customerId })
51
+ .andWhere('request.address = :address', { address })
52
+ .andWhere('request.createdAt >= :since', { since })
53
+ .andWhere(`request.status <> 'abandoned'`)
54
+ .getRawOne();
55
+ return BigInt(row?.total ?? '0');
56
+ }
30
57
  /** When the customer last made a faucet request, or null if never. */
31
58
  static async lastRequestAt(manager, customerId) {
32
59
  const row = await manager
@@ -41,16 +68,24 @@ export class FaucetRequestService {
41
68
  * Seconds the customer must still wait before their next request (0 if allowed). This is a cheap read taken
42
69
  * before any expensive work; `reserve` repeats the check under the lock so concurrent requests cannot slip through.
43
70
  */
44
- async getSecondsUntilNextAllowed(customer, minIntervalSeconds, now = new Date()) {
71
+ async getSecondsUntilNextAllowed(customer, minIntervalSeconds, now) {
45
72
  if (minIntervalSeconds <= 0)
46
73
  return 0;
47
- const last = await FaucetRequestService.lastRequestAt(this.faucetRequestRepository.manager, customer.customerId);
48
- return secondsUntilNextRequest(last, minIntervalSeconds, now);
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 };
49
85
  }
50
86
  /** Total ncheq requested by the customer in the current quota window. */
51
- async getUsedNcheq(customer, now = new Date(), pendingTimeoutSeconds = FAUCET_PENDING_TIMEOUT_SECONDS) {
52
- const { start } = getFaucetQuotaWindow(now);
53
- return FaucetRequestService.sumRequestedNcheq(this.faucetRequestRepository.manager, customer.customerId, start, FaucetRequestService.pendingCutoff(now, pendingTimeoutSeconds));
87
+ async getUsedNcheq(customer, now, pendingTimeoutSeconds = FAUCET_PENDING_TIMEOUT_SECONDS) {
88
+ return (await this.getQuotaStatus(customer, now, pendingTimeoutSeconds)).usedNcheq;
54
89
  }
55
90
  /**
56
91
  * Atomically checks the customer's monthly quota and, if the amount fits, records it as pending.
@@ -58,14 +93,16 @@ export class FaucetRequestService {
58
93
  * Afterwards call `complete` when the faucet confirms, `release` if it definitely failed, or `markUnknown`
59
94
  * if the call threw.
60
95
  */
61
- async reserve(customer, address, amountNcheq, { limitNcheq, minIntervalSeconds = 0, pendingTimeoutSeconds = FAUCET_PENDING_TIMEOUT_SECONDS, }, now = new Date()) {
62
- const window = getFaucetQuotaWindow(now);
63
- 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) => {
64
98
  if (manager.connection.options.type === 'postgres') {
65
99
  await manager.query('SELECT pg_advisory_xact_lock(hashtext($1))', [
66
100
  `faucet-quota:${customer.customerId}`,
67
101
  ]);
68
102
  }
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);
69
106
  if (minIntervalSeconds > 0) {
70
107
  const retryAfterSeconds = secondsUntilNextRequest(await FaucetRequestService.lastRequestAt(manager, customer.customerId), minIntervalSeconds, now);
71
108
  if (retryAfterSeconds > 0) {
@@ -74,7 +111,7 @@ export class FaucetRequestService {
74
111
  }
75
112
  // Reservations that were never confirmed stop counting; mark them so the history shows why
76
113
  const pendingCutoff = FaucetRequestService.pendingCutoff(now, pendingTimeoutSeconds);
77
- await manager
114
+ const swept = await manager
78
115
  .createQueryBuilder()
79
116
  .update(FaucetRequestEntity)
80
117
  .set({ status: 'abandoned' })
@@ -82,13 +119,65 @@ export class FaucetRequestService {
82
119
  .andWhere(`status = 'pending'`)
83
120
  .andWhere('createdAt < :pendingCutoff', { pendingCutoff })
84
121
  .execute();
122
+ if (swept.affected) {
123
+ logFaucetEvent('warn', 'faucet.reservations_abandoned', {
124
+ customerId: customer.customerId,
125
+ count: swept.affected,
126
+ pendingTimeoutSeconds,
127
+ });
128
+ }
85
129
  const usedNcheq = await FaucetRequestService.sumRequestedNcheq(manager, customer.customerId, window.start, pendingCutoff);
86
130
  if (!fitsInQuota(usedNcheq, amountNcheq, limitNcheq)) {
87
131
  return { reserved: false, reason: 'quota_exceeded', usedNcheq, window };
88
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
+ }
141
+ }
89
142
  const entity = await manager.save(new FaucetRequestEntity(customer, address, amountNcheq));
90
143
  return { reserved: true, faucetRequestId: entity.faucetRequestId, usedNcheq, window };
91
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
+ }));
92
181
  }
93
182
  /** Releases a reservation, e.g. when the upstream faucet reported that it did not credit the account. */
94
183
  async release(faucetRequestId) {
@@ -96,7 +185,7 @@ export class FaucetRequestService {
96
185
  }
97
186
  /** The faucet confirmed the credit. Also applies to a reservation that was already marked abandoned. */
98
187
  async complete(faucetRequestId) {
99
- await this.faucetRequestRepository.update({ faucetRequestId }, { status: 'completed', completedAt: new Date() });
188
+ await this.faucetRequestRepository.update({ faucetRequestId }, { status: 'completed', completedAt: () => 'now()' });
100
189
  }
101
190
  /** The faucet call threw, so tokens may have been sent: keep counting this reservation permanently. */
102
191
  async markUnknown(faucetRequestId) {
@@ -1 +1 @@
1
- {"version":3,"file":"faucet-request.js","sourceRoot":"","sources":["../../../src/services/api/faucet-request.ts"],"names":[],"mappings":"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"}
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": "Too many requests. Either the customer's monthly faucet quota is exhausted (the body includes the quota details), or a request was made too soon after the previous one (FAUCET_MIN_INTERVAL_SECONDS). The Retry-After header gives the seconds to wait."
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": [
@@ -40,6 +40,8 @@ export declare const FAUCET_ADDRESS_CAP_CHEQ: number;
40
40
  export declare const FAUCET_SUBSCRIPTION_CACHE_SECONDS: number;
41
41
  export declare const FAUCET_MIN_INTERVAL_SECONDS: number;
42
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;
43
45
  export declare const FAUCET_REQUEST_TIMEOUT_SECONDS: number;
44
46
  export declare const FAUCET_AMOUNT: number;
45
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":"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"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/types/constants.ts"],"names":[],"mappings":"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"}
@@ -89,6 +89,13 @@ export const FAUCET_MIN_INTERVAL_SECONDS = parseNonNegativeIntEnv(process.env.FA
89
89
  // before it is treated as abandoned (e.g. the process died before calling the faucet). Must be longer than the
90
90
  // longest time a faucet call can take. Reservations whose faucet call threw (outcome unknown) always keep counting.
91
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');
92
99
  // How long, in seconds, to wait for the faucet service to answer before giving up. Without a limit a hung faucet
93
100
  // holds the caller (and a quota reservation) for as long as Node's own default, several minutes.
94
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
@@ -48,6 +48,10 @@ TESTNET_INITIAL_TOPUP_CHEQ="10000"
48
48
  # FAUCET_MIN_INTERVAL_SECONDS="10"
49
49
  # Seconds an unconfirmed faucet quota reservation keeps counting before it is treated as abandoned
50
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"
51
55
  # Seconds to wait for the faucet service to answer before giving up
52
56
  # FAUCET_REQUEST_TIMEOUT_SECONDS="30"
53
57
  # FAUCET_URI="https://faucet-api.cheqd.network/credit"