@cheqd/studio 3.17.0 → 3.18.0-develop.2
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.
- package/README.md +13 -7
- package/dist/controllers/api/account.d.ts +8 -3
- package/dist/controllers/api/account.d.ts.map +1 -1
- package/dist/controllers/api/account.js +153 -34
- package/dist/controllers/api/account.js.map +1 -1
- package/dist/database/cache/store.d.ts +7 -0
- package/dist/database/cache/store.d.ts.map +1 -1
- package/dist/database/cache/store.js +6 -0
- package/dist/database/cache/store.js.map +1 -1
- package/dist/database/entities/faucet-request.entity.d.ts +25 -0
- package/dist/database/entities/faucet-request.entity.d.ts.map +1 -0
- package/dist/database/entities/faucet-request.entity.js +89 -0
- package/dist/database/entities/faucet-request.entity.js.map +1 -0
- package/dist/database/migrations/1791500000000-studio-migrations.d.ts +7 -0
- package/dist/database/migrations/1791500000000-studio-migrations.d.ts.map +1 -0
- package/dist/database/migrations/1791500000000-studio-migrations.js +14 -0
- package/dist/database/migrations/1791500000000-studio-migrations.js.map +1 -0
- package/dist/database/migrations/1791500000001-studio-migrations.d.ts +7 -0
- package/dist/database/migrations/1791500000001-studio-migrations.d.ts.map +1 -0
- package/dist/database/migrations/1791500000001-studio-migrations.js +16 -0
- package/dist/database/migrations/1791500000001-studio-migrations.js.map +1 -0
- package/dist/database/types/types.d.ts.map +1 -1
- package/dist/database/types/types.js +8 -0
- package/dist/database/types/types.js.map +1 -1
- package/dist/helpers/faucet-quota.d.ts +90 -0
- package/dist/helpers/faucet-quota.d.ts.map +1 -0
- package/dist/helpers/faucet-quota.js +99 -0
- package/dist/helpers/faucet-quota.js.map +1 -0
- package/dist/helpers/faucet.d.ts +3 -1
- package/dist/helpers/faucet.d.ts.map +1 -1
- package/dist/helpers/faucet.js +9 -2
- package/dist/helpers/faucet.js.map +1 -1
- package/dist/services/api/faucet-request.d.ts +39 -0
- package/dist/services/api/faucet-request.d.ts.map +1 -0
- package/dist/services/api/faucet-request.js +106 -0
- package/dist/services/api/faucet-request.js.map +1 -0
- package/dist/static/swagger-api.json +65 -3
- package/dist/types/account.d.ts +16 -0
- package/dist/types/account.d.ts.map +1 -1
- package/dist/types/constants.d.ts +14 -1
- package/dist/types/constants.d.ts.map +1 -1
- package/dist/types/constants.js +42 -5
- package/dist/types/constants.js.map +1 -1
- package/dist/types/swagger-api-types.d.ts +39 -0
- package/dist/types/swagger-api-types.d.ts.map +1 -1
- package/dist/types/swagger-api-types.js +39 -0
- package/dist/types/swagger-api-types.js.map +1 -1
- package/example.env +13 -1
- package/package.json +1 -1
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { FaucetRequestEntity } from '../../database/entities/faucet-request.entity.js';
|
|
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';
|
|
5
|
+
export class FaucetRequestService {
|
|
6
|
+
faucetRequestRepository;
|
|
7
|
+
static instance = new FaucetRequestService();
|
|
8
|
+
constructor(repository) {
|
|
9
|
+
this.faucetRequestRepository =
|
|
10
|
+
repository ?? Connection.instance.dbConnection.getRepository(FaucetRequestEntity);
|
|
11
|
+
}
|
|
12
|
+
static pendingCutoff(now, pendingTimeoutSeconds) {
|
|
13
|
+
return new Date(now.getTime() - pendingTimeoutSeconds * 1000);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Total ncheq requested by the customer since `since`, using the given manager (and so its transaction).
|
|
17
|
+
* Completed and unknown requests always count; a pending one counts only until it is older than
|
|
18
|
+
* `pendingCutoff`, after which it is treated as abandoned.
|
|
19
|
+
*/
|
|
20
|
+
static async sumRequestedNcheq(manager, customerId, since, pendingCutoff) {
|
|
21
|
+
const row = await manager
|
|
22
|
+
.createQueryBuilder(FaucetRequestEntity, 'request')
|
|
23
|
+
.select('COALESCE(SUM(request.amountNcheq), 0)', 'total')
|
|
24
|
+
.where('request.customerId = :customerId', { customerId })
|
|
25
|
+
.andWhere('request.createdAt >= :since', { since })
|
|
26
|
+
.andWhere(`(request.status IN ('completed', 'unknown') OR (request.status = 'pending' AND request.createdAt >= :pendingCutoff))`, { pendingCutoff })
|
|
27
|
+
.getRawOne();
|
|
28
|
+
return BigInt(row?.total ?? '0');
|
|
29
|
+
}
|
|
30
|
+
/** When the customer last made a faucet request, or null if never. */
|
|
31
|
+
static async lastRequestAt(manager, customerId) {
|
|
32
|
+
const row = await manager
|
|
33
|
+
.createQueryBuilder(FaucetRequestEntity, 'request')
|
|
34
|
+
.select('MAX(request.createdAt)', 'last')
|
|
35
|
+
.where('request.customerId = :customerId', { customerId })
|
|
36
|
+
.andWhere(`request.status <> 'abandoned'`)
|
|
37
|
+
.getRawOne();
|
|
38
|
+
return row?.last ? new Date(row.last) : null;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Seconds the customer must still wait before their next request (0 if allowed). This is a cheap read taken
|
|
42
|
+
* before any expensive work; `reserve` repeats the check under the lock so concurrent requests cannot slip through.
|
|
43
|
+
*/
|
|
44
|
+
async getSecondsUntilNextAllowed(customer, minIntervalSeconds, now = new Date()) {
|
|
45
|
+
if (minIntervalSeconds <= 0)
|
|
46
|
+
return 0;
|
|
47
|
+
const last = await FaucetRequestService.lastRequestAt(this.faucetRequestRepository.manager, customer.customerId);
|
|
48
|
+
return secondsUntilNextRequest(last, minIntervalSeconds, now);
|
|
49
|
+
}
|
|
50
|
+
/** 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));
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Atomically checks the customer's monthly quota and, if the amount fits, records it as pending.
|
|
57
|
+
* A per-customer advisory lock serialises concurrent requests so they cannot overshoot the limit.
|
|
58
|
+
* Afterwards call `complete` when the faucet confirms, `release` if it definitely failed, or `markUnknown`
|
|
59
|
+
* if the call threw.
|
|
60
|
+
*/
|
|
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) => {
|
|
64
|
+
if (manager.connection.options.type === 'postgres') {
|
|
65
|
+
await manager.query('SELECT pg_advisory_xact_lock(hashtext($1))', [
|
|
66
|
+
`faucet-quota:${customer.customerId}`,
|
|
67
|
+
]);
|
|
68
|
+
}
|
|
69
|
+
if (minIntervalSeconds > 0) {
|
|
70
|
+
const retryAfterSeconds = secondsUntilNextRequest(await FaucetRequestService.lastRequestAt(manager, customer.customerId), minIntervalSeconds, now);
|
|
71
|
+
if (retryAfterSeconds > 0) {
|
|
72
|
+
return { reserved: false, reason: 'too_frequent', retryAfterSeconds, window };
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Reservations that were never confirmed stop counting; mark them so the history shows why
|
|
76
|
+
const pendingCutoff = FaucetRequestService.pendingCutoff(now, pendingTimeoutSeconds);
|
|
77
|
+
await manager
|
|
78
|
+
.createQueryBuilder()
|
|
79
|
+
.update(FaucetRequestEntity)
|
|
80
|
+
.set({ status: 'abandoned' })
|
|
81
|
+
.where('customerId = :customerId', { customerId: customer.customerId })
|
|
82
|
+
.andWhere(`status = 'pending'`)
|
|
83
|
+
.andWhere('createdAt < :pendingCutoff', { pendingCutoff })
|
|
84
|
+
.execute();
|
|
85
|
+
const usedNcheq = await FaucetRequestService.sumRequestedNcheq(manager, customer.customerId, window.start, pendingCutoff);
|
|
86
|
+
if (!fitsInQuota(usedNcheq, amountNcheq, limitNcheq)) {
|
|
87
|
+
return { reserved: false, reason: 'quota_exceeded', usedNcheq, window };
|
|
88
|
+
}
|
|
89
|
+
const entity = await manager.save(new FaucetRequestEntity(customer, address, amountNcheq));
|
|
90
|
+
return { reserved: true, faucetRequestId: entity.faucetRequestId, usedNcheq, window };
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/** Releases a reservation, e.g. when the upstream faucet reported that it did not credit the account. */
|
|
94
|
+
async release(faucetRequestId) {
|
|
95
|
+
await this.faucetRequestRepository.delete({ faucetRequestId });
|
|
96
|
+
}
|
|
97
|
+
/** The faucet confirmed the credit. Also applies to a reservation that was already marked abandoned. */
|
|
98
|
+
async complete(faucetRequestId) {
|
|
99
|
+
await this.faucetRequestRepository.update({ faucetRequestId }, { status: 'completed', completedAt: new Date() });
|
|
100
|
+
}
|
|
101
|
+
/** The faucet call threw, so tokens may have been sent: keep counting this reservation permanently. */
|
|
102
|
+
async markUnknown(faucetRequestId) {
|
|
103
|
+
await this.faucetRequestRepository.update({ faucetRequestId }, { status: 'unknown' });
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=faucet-request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"faucet-request.js","sourceRoot":"","sources":["../../../src/services/api/faucet-request.ts"],"names":[],"mappings":"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"}
|
|
@@ -3182,6 +3182,19 @@
|
|
|
3182
3182
|
}
|
|
3183
3183
|
}
|
|
3184
3184
|
},
|
|
3185
|
+
"FaucetAmount": {
|
|
3186
|
+
"type": "object",
|
|
3187
|
+
"properties": {
|
|
3188
|
+
"cheq": {
|
|
3189
|
+
"type": "number",
|
|
3190
|
+
"example": 10000
|
|
3191
|
+
},
|
|
3192
|
+
"ncheq": {
|
|
3193
|
+
"type": "string",
|
|
3194
|
+
"example": "10000000000000"
|
|
3195
|
+
}
|
|
3196
|
+
}
|
|
3197
|
+
},
|
|
3185
3198
|
"AccountBalancesResponse": {
|
|
3186
3199
|
"type": "object",
|
|
3187
3200
|
"properties": {
|
|
@@ -3191,6 +3204,49 @@
|
|
|
3191
3204
|
"testnet": {
|
|
3192
3205
|
"$ref": "#/components/schemas/AccountNetworkBalance"
|
|
3193
3206
|
},
|
|
3207
|
+
"faucet": {
|
|
3208
|
+
"type": "object",
|
|
3209
|
+
"nullable": true,
|
|
3210
|
+
"description": "Testnet faucet cap and the customer's monthly faucet quota usage. `null` when there is no testnet account or it could not be read.",
|
|
3211
|
+
"properties": {
|
|
3212
|
+
"cap": {
|
|
3213
|
+
"type": "object",
|
|
3214
|
+
"description": "Most CHEQ a testnet address can hold before the faucet stops topping it up.",
|
|
3215
|
+
"properties": {
|
|
3216
|
+
"cheq": {
|
|
3217
|
+
"type": "number",
|
|
3218
|
+
"example": 100000
|
|
3219
|
+
},
|
|
3220
|
+
"ncheq": {
|
|
3221
|
+
"type": "string",
|
|
3222
|
+
"example": "100000000000000"
|
|
3223
|
+
}
|
|
3224
|
+
}
|
|
3225
|
+
},
|
|
3226
|
+
"quota": {
|
|
3227
|
+
"type": "object",
|
|
3228
|
+
"properties": {
|
|
3229
|
+
"period": {
|
|
3230
|
+
"type": "string",
|
|
3231
|
+
"example": "month"
|
|
3232
|
+
},
|
|
3233
|
+
"limit": {
|
|
3234
|
+
"$ref": "#/components/schemas/FaucetAmount"
|
|
3235
|
+
},
|
|
3236
|
+
"used": {
|
|
3237
|
+
"$ref": "#/components/schemas/FaucetAmount"
|
|
3238
|
+
},
|
|
3239
|
+
"remaining": {
|
|
3240
|
+
"$ref": "#/components/schemas/FaucetAmount"
|
|
3241
|
+
},
|
|
3242
|
+
"resetsAt": {
|
|
3243
|
+
"type": "string",
|
|
3244
|
+
"format": "date-time"
|
|
3245
|
+
}
|
|
3246
|
+
}
|
|
3247
|
+
}
|
|
3248
|
+
}
|
|
3249
|
+
},
|
|
3194
3250
|
"rate": {
|
|
3195
3251
|
"type": "object",
|
|
3196
3252
|
"nullable": true,
|
|
@@ -3433,7 +3489,7 @@
|
|
|
3433
3489
|
"Account"
|
|
3434
3490
|
],
|
|
3435
3491
|
"summary": "Request cheqd testnet CHEQ tokens for a Studio payment account.",
|
|
3436
|
-
"description": "Funds an authenticated Studio user's owned testnet payment account up to the
|
|
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.",
|
|
3437
3493
|
"requestBody": {
|
|
3438
3494
|
"content": {
|
|
3439
3495
|
"application/json": {
|
|
@@ -3446,7 +3502,7 @@
|
|
|
3446
3502
|
},
|
|
3447
3503
|
"amount": {
|
|
3448
3504
|
"type": "number",
|
|
3449
|
-
"description": "Optional amount in CHEQ. Defaults to the
|
|
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)."
|
|
3450
3506
|
}
|
|
3451
3507
|
}
|
|
3452
3508
|
}
|
|
@@ -3469,6 +3525,9 @@
|
|
|
3469
3525
|
"404": {
|
|
3470
3526
|
"description": "No Studio testnet payment account was found for this customer."
|
|
3471
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
|
+
},
|
|
3472
3531
|
"500": {
|
|
3473
3532
|
"$ref": "#/components/schemas/InternalError"
|
|
3474
3533
|
},
|
|
@@ -3477,6 +3536,9 @@
|
|
|
3477
3536
|
},
|
|
3478
3537
|
"503": {
|
|
3479
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."
|
|
3480
3542
|
}
|
|
3481
3543
|
}
|
|
3482
3544
|
}
|
|
@@ -3531,7 +3593,7 @@
|
|
|
3531
3593
|
"Account"
|
|
3532
3594
|
],
|
|
3533
3595
|
"summary": "Fetch payment account balances.",
|
|
3534
|
-
"description": "Returns the on-chain balance of the authenticated customer's mainnet and testnet payment accounts, expressed in ncheq, CHEQ and USD. The CHEQ/USD rate is sourced from CoinGecko and cached; if it (or a network's RPC endpoint) is unavailable the response still returns 200 with the affected `usd`/`rate`/`balance` fields set to `null`.",
|
|
3596
|
+
"description": "Returns the on-chain balance of the authenticated customer's mainnet and testnet payment accounts, expressed in ncheq, CHEQ and USD. The CHEQ/USD rate is sourced from CoinGecko and cached; if it (or a network's RPC endpoint) is unavailable the response still returns 200 with the affected `usd`/`rate`/`balance` fields set to `null`. Also returns the testnet faucet cap and the customer's monthly faucet quota usage under `faucet`.",
|
|
3535
3597
|
"responses": {
|
|
3536
3598
|
"200": {
|
|
3537
3599
|
"description": "The request was successful.",
|
package/dist/types/account.d.ts
CHANGED
|
@@ -19,9 +19,25 @@ export interface AccountNetworkBalance {
|
|
|
19
19
|
} | null;
|
|
20
20
|
usd: number | null;
|
|
21
21
|
}
|
|
22
|
+
export interface FaucetAmountSummary {
|
|
23
|
+
cheq: number;
|
|
24
|
+
ncheq: string;
|
|
25
|
+
}
|
|
26
|
+
export interface FaucetQuotaSummary {
|
|
27
|
+
period: 'month';
|
|
28
|
+
limit: FaucetAmountSummary;
|
|
29
|
+
used: FaucetAmountSummary;
|
|
30
|
+
remaining: FaucetAmountSummary;
|
|
31
|
+
resetsAt: string;
|
|
32
|
+
}
|
|
33
|
+
export interface AccountFaucetInfo {
|
|
34
|
+
cap: FaucetAmountSummary;
|
|
35
|
+
quota: FaucetQuotaSummary;
|
|
36
|
+
}
|
|
22
37
|
export interface QueryAccountBalancesResponseBody {
|
|
23
38
|
mainnet: AccountNetworkBalance | null;
|
|
24
39
|
testnet: AccountNetworkBalance | null;
|
|
40
|
+
faucet: AccountFaucetInfo | null;
|
|
25
41
|
rate: {
|
|
26
42
|
cheqUsd: number;
|
|
27
43
|
source: 'coingecko';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../src/types/account.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB;IACxC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,yBAAyB,EAAE,OAAO,CAAC;IACnC,yBAAyB,EAAE,OAAO,CAAC;IACnC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,MAAM,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,eAAO,MAAM,wBAAwB;kBAU9B,wBAAwB;CAE9B,CAAC;AAIF,MAAM,WAAW,qBAAqB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IAEd,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAEhD,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,gCAAgC;IAEhD,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACtC,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAEtC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACpE"}
|
|
1
|
+
{"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../src/types/account.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB;IACxC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,yBAAyB,EAAE,OAAO,CAAC;IACnC,yBAAyB,EAAE,OAAO,CAAC;IACnC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,MAAM,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,eAAO,MAAM,wBAAwB;kBAU9B,wBAAwB;CAE9B,CAAC;AAIF,MAAM,WAAW,qBAAqB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IAEd,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAEhD,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,SAAS,EAAE,mBAAmB,CAAC;IAE/B,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAEjC,GAAG,EAAE,mBAAmB,CAAC;IACzB,KAAK,EAAE,kBAAkB,CAAC;CAC1B;AAED,MAAM,WAAW,gCAAgC;IAEhD,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACtC,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAEtC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAEjC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACpE"}
|
|
@@ -22,12 +22,25 @@ export declare const configLogToExpress: {
|
|
|
22
22
|
getAccessToken: boolean;
|
|
23
23
|
fetchUserInfo: boolean;
|
|
24
24
|
};
|
|
25
|
+
/**
|
|
26
|
+
* Reads a positive number from an environment variable. An unset variable uses the fallback silently; a variable that
|
|
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
|
+
*/
|
|
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;
|
|
25
32
|
export declare const MINIMAL_DENOM = "ncheq";
|
|
26
33
|
export declare const FAUCET_URI: string;
|
|
27
34
|
export declare const FAUCET_API_KEY: string;
|
|
28
35
|
export declare const DEFAULT_DENOM_EXPONENT = 9;
|
|
29
36
|
export declare const TESTNET_MINIMUM_BALANCE: number;
|
|
30
|
-
export declare const
|
|
37
|
+
export declare const TESTNET_INITIAL_TOPUP_CHEQ: number;
|
|
38
|
+
export declare const FAUCET_MONTHLY_LIMIT_CHEQ: number;
|
|
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_REQUEST_TIMEOUT_SECONDS: number;
|
|
31
44
|
export declare const FAUCET_AMOUNT: number;
|
|
32
45
|
export declare const FAUCET_ACCESS_CLIENT_ID: string;
|
|
33
46
|
export declare const FAUCET_ACCESS_CLIENT_SECRET: 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;
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/types/constants.ts"],"names":[],"mappings":"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"}
|
package/dist/types/constants.js
CHANGED
|
@@ -43,19 +43,56 @@ export const configLogToExpress = {
|
|
|
43
43
|
fetchUserInfo: true,
|
|
44
44
|
};
|
|
45
45
|
// Faucet constants
|
|
46
|
-
|
|
46
|
+
/**
|
|
47
|
+
* Reads a positive number from an environment variable. An unset variable uses the fallback silently; a variable that
|
|
48
|
+
* is set but invalid also uses the fallback but says so loudly, so a typo in a limit is not mistaken for the default.
|
|
49
|
+
*/
|
|
50
|
+
export const parseNumberEnv = (value, fallback, name = 'environment variable') => {
|
|
47
51
|
if (!value?.trim())
|
|
48
52
|
return fallback;
|
|
49
53
|
const parsed = Number(value);
|
|
50
|
-
|
|
54
|
+
if (Number.isFinite(parsed) && parsed > 0)
|
|
55
|
+
return parsed;
|
|
56
|
+
console.warn(`Ignoring invalid ${name}="${value}": expected a positive number. Using the default, ${fallback}.`);
|
|
57
|
+
return fallback;
|
|
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;
|
|
51
68
|
};
|
|
52
69
|
export const MINIMAL_DENOM = 'ncheq';
|
|
53
70
|
export const FAUCET_URI = process.env.FAUCET_URI || 'https://faucet-api.cheqd.network/credit';
|
|
54
71
|
export const FAUCET_API_KEY = process.env.FAUCET_API_KEY || 'default-api-key';
|
|
55
72
|
export const DEFAULT_DENOM_EXPONENT = 9;
|
|
56
|
-
export const TESTNET_MINIMUM_BALANCE = parseNumberEnv(process.env.TESTNET_MINIMUM_BALANCE, 10000);
|
|
57
|
-
|
|
58
|
-
|
|
73
|
+
export const TESTNET_MINIMUM_BALANCE = parseNumberEnv(process.env.TESTNET_MINIMUM_BALANCE, 10000, 'TESTNET_MINIMUM_BALANCE');
|
|
74
|
+
// Amount, in CHEQ, a new account's testnet address is topped up to when it is bootstrapped (ENABLE_ACCOUNT_TOPUP).
|
|
75
|
+
// TESTNET_FAUCET_UPPER_CAP_CHEQ is the previous name and is still honoured as a fallback.
|
|
76
|
+
export const TESTNET_INITIAL_TOPUP_CHEQ = parseNumberEnv(process.env.TESTNET_INITIAL_TOPUP_CHEQ || process.env.TESTNET_FAUCET_UPPER_CAP_CHEQ, TESTNET_MINIMUM_BALANCE, process.env.TESTNET_INITIAL_TOPUP_CHEQ ? 'TESTNET_INITIAL_TOPUP_CHEQ' : 'TESTNET_FAUCET_UPPER_CAP_CHEQ');
|
|
77
|
+
// Most CHEQ a customer can request through POST /account/faucet per calendar month (UTC)
|
|
78
|
+
export const FAUCET_MONTHLY_LIMIT_CHEQ = parseNumberEnv(process.env.FAUCET_MONTHLY_LIMIT_CHEQ, 100000, 'FAUCET_MONTHLY_LIMIT_CHEQ');
|
|
79
|
+
// Most CHEQ a single testnet address can hold before POST /account/faucet stops topping it up.
|
|
80
|
+
// Defaults to the monthly limit, so there is one figure unless this is set explicitly.
|
|
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
|
+
// How long, in seconds, to wait for the faucet service to answer before giving up. Without a limit a hung faucet
|
|
93
|
+
// holds the caller (and a quota reservation) for as long as Node's own default, several minutes.
|
|
94
|
+
export const FAUCET_REQUEST_TIMEOUT_SECONDS = parseNumberEnv(process.env.FAUCET_REQUEST_TIMEOUT_SECONDS, 30, 'FAUCET_REQUEST_TIMEOUT_SECONDS');
|
|
95
|
+
export const FAUCET_AMOUNT = parseNumberEnv(process.env.FAUCET_AMOUNT, 100000000000000, 'FAUCET_AMOUNT');
|
|
59
96
|
export const FAUCET_ACCESS_CLIENT_ID = process.env.FAUCET_ACCESS_CLIENT_ID || '';
|
|
60
97
|
export const FAUCET_ACCESS_CLIENT_SECRET = process.env.FAUCET_ACCESS_CLIENT_SECRET || '';
|
|
61
98
|
// CHEQ market data (CoinGecko), used by GET /account/balances for CHEQ to USD conversion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/types/constants.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,mBAAmB;AACnB,MAAM,CAAC,MAAM,OAAO,GAAG;IACtB,IAAI,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;IAC5C,IAAI,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE;CACtC,CAAC;AAEF,wBAAwB;AACxB,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,uBAAuB,CAAC;AAChG,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,oBAAoB,CAAC;AAC7F,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AACrC,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACxC,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AACrC,wDAAwD;AACxD,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC;AAEzD,iBAAiB;AACjB,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;AAE9F,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,+BAA+B,CAAC;AAExG,MAAM,CAAC,MAAM,kBAAkB,GAAG;IACjC,QAAQ,EACP,cAAc;QACd,CAAC;YACA,IAAI,qBAAqB,KAAK,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACvF,OAAO,EAAE,CAAC;QACX,CAAC,CAAC,EAAE;IACL,KAAK,EACJ,YAAY;QACZ,CAAC;YACA,IAAI,qBAAqB,KAAK,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YACrF,OAAO,EAAE,CAAC;QACX,CAAC,CAAC,EAAE;IACL,SAAS,EACR,gBAAgB;QAChB,CAAC;YACA,IAAI,qBAAqB,KAAK,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACzF,OAAO,EAAE,CAAC;QACX,CAAC,CAAC,EAAE;IACL,OAAO,EACN,oBAAoB;QACpB,CAAC;YACA,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACxD,CAAC,CAAC,EAAE;IACL,cAAc,EAAE,KAAK;IACrB,aAAa,EAAE,IAAI;CACnB,CAAC;AAEF,mBAAmB;AACnB,MAAM,cAAc,GAAG,CAAC,KAAyB,EAAE,QAAgB,EAAU,EAAE;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/types/constants.ts"],"names":[],"mappings":"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"}
|
|
@@ -2152,6 +2152,15 @@
|
|
|
2152
2152
|
* nullable: true
|
|
2153
2153
|
* description: balance.cheq multiplied by the CHEQ/USD rate. `null` when the balance or the rate is unavailable.
|
|
2154
2154
|
* example: 3.03
|
|
2155
|
+
* FaucetAmount:
|
|
2156
|
+
* type: object
|
|
2157
|
+
* properties:
|
|
2158
|
+
* cheq:
|
|
2159
|
+
* type: number
|
|
2160
|
+
* example: 10000
|
|
2161
|
+
* ncheq:
|
|
2162
|
+
* type: string
|
|
2163
|
+
* example: "10000000000000"
|
|
2155
2164
|
* AccountBalancesResponse:
|
|
2156
2165
|
* type: object
|
|
2157
2166
|
* properties:
|
|
@@ -2159,6 +2168,36 @@
|
|
|
2159
2168
|
* $ref: '#/components/schemas/AccountNetworkBalance'
|
|
2160
2169
|
* testnet:
|
|
2161
2170
|
* $ref: '#/components/schemas/AccountNetworkBalance'
|
|
2171
|
+
* faucet:
|
|
2172
|
+
* type: object
|
|
2173
|
+
* nullable: true
|
|
2174
|
+
* description: Testnet faucet cap and the customer's monthly faucet quota usage. `null` when there is no testnet account or it could not be read.
|
|
2175
|
+
* properties:
|
|
2176
|
+
* cap:
|
|
2177
|
+
* type: object
|
|
2178
|
+
* description: Most CHEQ a testnet address can hold before the faucet stops topping it up.
|
|
2179
|
+
* properties:
|
|
2180
|
+
* cheq:
|
|
2181
|
+
* type: number
|
|
2182
|
+
* example: 100000
|
|
2183
|
+
* ncheq:
|
|
2184
|
+
* type: string
|
|
2185
|
+
* example: "100000000000000"
|
|
2186
|
+
* quota:
|
|
2187
|
+
* type: object
|
|
2188
|
+
* properties:
|
|
2189
|
+
* period:
|
|
2190
|
+
* type: string
|
|
2191
|
+
* example: month
|
|
2192
|
+
* limit:
|
|
2193
|
+
* $ref: '#/components/schemas/FaucetAmount'
|
|
2194
|
+
* used:
|
|
2195
|
+
* $ref: '#/components/schemas/FaucetAmount'
|
|
2196
|
+
* remaining:
|
|
2197
|
+
* $ref: '#/components/schemas/FaucetAmount'
|
|
2198
|
+
* resetsAt:
|
|
2199
|
+
* type: string
|
|
2200
|
+
* format: date-time
|
|
2162
2201
|
* rate:
|
|
2163
2202
|
* type: object
|
|
2164
2203
|
* nullable: true
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swagger-api-types.d.ts","sourceRoot":"","sources":["../../src/types/swagger-api-types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"swagger-api-types.d.ts","sourceRoot":"","sources":["../../src/types/swagger-api-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwuEG"}
|
|
@@ -2153,6 +2153,15 @@
|
|
|
2153
2153
|
* nullable: true
|
|
2154
2154
|
* description: balance.cheq multiplied by the CHEQ/USD rate. `null` when the balance or the rate is unavailable.
|
|
2155
2155
|
* example: 3.03
|
|
2156
|
+
* FaucetAmount:
|
|
2157
|
+
* type: object
|
|
2158
|
+
* properties:
|
|
2159
|
+
* cheq:
|
|
2160
|
+
* type: number
|
|
2161
|
+
* example: 10000
|
|
2162
|
+
* ncheq:
|
|
2163
|
+
* type: string
|
|
2164
|
+
* example: "10000000000000"
|
|
2156
2165
|
* AccountBalancesResponse:
|
|
2157
2166
|
* type: object
|
|
2158
2167
|
* properties:
|
|
@@ -2160,6 +2169,36 @@
|
|
|
2160
2169
|
* $ref: '#/components/schemas/AccountNetworkBalance'
|
|
2161
2170
|
* testnet:
|
|
2162
2171
|
* $ref: '#/components/schemas/AccountNetworkBalance'
|
|
2172
|
+
* faucet:
|
|
2173
|
+
* type: object
|
|
2174
|
+
* nullable: true
|
|
2175
|
+
* description: Testnet faucet cap and the customer's monthly faucet quota usage. `null` when there is no testnet account or it could not be read.
|
|
2176
|
+
* properties:
|
|
2177
|
+
* cap:
|
|
2178
|
+
* type: object
|
|
2179
|
+
* description: Most CHEQ a testnet address can hold before the faucet stops topping it up.
|
|
2180
|
+
* properties:
|
|
2181
|
+
* cheq:
|
|
2182
|
+
* type: number
|
|
2183
|
+
* example: 100000
|
|
2184
|
+
* ncheq:
|
|
2185
|
+
* type: string
|
|
2186
|
+
* example: "100000000000000"
|
|
2187
|
+
* quota:
|
|
2188
|
+
* type: object
|
|
2189
|
+
* properties:
|
|
2190
|
+
* period:
|
|
2191
|
+
* type: string
|
|
2192
|
+
* example: month
|
|
2193
|
+
* limit:
|
|
2194
|
+
* $ref: '#/components/schemas/FaucetAmount'
|
|
2195
|
+
* used:
|
|
2196
|
+
* $ref: '#/components/schemas/FaucetAmount'
|
|
2197
|
+
* remaining:
|
|
2198
|
+
* $ref: '#/components/schemas/FaucetAmount'
|
|
2199
|
+
* resetsAt:
|
|
2200
|
+
* type: string
|
|
2201
|
+
* format: date-time
|
|
2163
2202
|
* rate:
|
|
2164
2203
|
* type: object
|
|
2165
2204
|
* nullable: true
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swagger-api-types.js","sourceRoot":"","sources":["../../src/types/swagger-api-types.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"swagger-api-types.js","sourceRoot":"","sources":["../../src/types/swagger-api-types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwuEG"}
|
package/example.env
CHANGED
|
@@ -37,7 +37,19 @@ PROVIDER_EXPORT_PASSWORD=password-with-lowercase-uppercase-number-specialchar
|
|
|
37
37
|
# Faucet settings
|
|
38
38
|
ENABLE_ACCOUNT_TOPUP="false"
|
|
39
39
|
TESTNET_MINIMUM_BALANCE="10000"
|
|
40
|
-
|
|
40
|
+
TESTNET_INITIAL_TOPUP_CHEQ="10000"
|
|
41
|
+
# Max CHEQ a customer can request via POST /account/faucet per calendar month (UTC)
|
|
42
|
+
# FAUCET_MONTHLY_LIMIT_CHEQ="100000"
|
|
43
|
+
# Max CHEQ a single testnet address can hold before the faucet stops topping it up (defaults to the monthly limit)
|
|
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 to wait for the faucet service to answer before giving up
|
|
52
|
+
# FAUCET_REQUEST_TIMEOUT_SECONDS="30"
|
|
41
53
|
# FAUCET_URI="https://faucet-api.cheqd.network/credit"
|
|
42
54
|
# FAUCET_API_KEY="faucet-api-key"
|
|
43
55
|
# FAUCET_ACCESS_CLIENT_ID="cloudflare-access-client-id"
|