tapimo 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -3
- package/dist/ApiKey.d.ts +1 -0
- package/dist/ApiKey.d.ts.map +1 -1
- package/dist/ApiKey.js +5 -2
- package/dist/ApiKey.js.map +1 -1
- package/dist/ApiKeys.d.ts +28 -1
- package/dist/ApiKeys.d.ts.map +1 -1
- package/dist/ApiKeys.js +34 -1
- package/dist/ApiKeys.js.map +1 -1
- package/dist/App.d.ts +7167 -4507
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +8 -0
- package/dist/App.js.map +1 -1
- package/dist/Scope.d.ts +11 -2
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +14 -3
- package/dist/Scope.js.map +1 -1
- package/dist/admin/App.d.ts +128 -118
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +7 -0
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/scopes.d.ts +8 -0
- package/dist/admin/apps/scopes.d.ts.map +1 -1
- package/dist/admin/apps/scopes.js +3 -0
- package/dist/admin/apps/scopes.js.map +1 -1
- package/dist/admin/apps/verified-tokens.d.ts +57 -57
- package/dist/admin/ui.generated.d.ts +1 -1
- package/dist/admin/ui.generated.js +13 -13
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/analytics/Analytics.d.ts +151 -0
- package/dist/analytics/Analytics.d.ts.map +1 -0
- package/dist/analytics/Analytics.js +212 -0
- package/dist/analytics/Analytics.js.map +1 -0
- package/dist/analytics/tables/requestEvents.d.ts +215 -0
- package/dist/analytics/tables/requestEvents.d.ts.map +1 -0
- package/dist/analytics/tables/requestEvents.js +264 -0
- package/dist/analytics/tables/requestEvents.js.map +1 -0
- package/dist/apps/data/App.d.ts +1024 -624
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/App.js +36 -0
- package/dist/apps/data/App.js.map +1 -1
- package/dist/apps/data/routes/balances.d.ts +45 -45
- package/dist/apps/data/routes/coingecko.d.ts +176 -176
- package/dist/apps/data/routes/exchanges.d.ts +455 -455
- package/dist/apps/data/routes/fee-amm.d.ts +101 -101
- package/dist/apps/data/routes/funding.d.ts +765 -0
- package/dist/apps/data/routes/funding.d.ts.map +1 -0
- package/dist/apps/data/routes/funding.js +383 -0
- package/dist/apps/data/routes/funding.js.map +1 -0
- package/dist/apps/data/routes/receipts.d.ts.map +1 -1
- package/dist/apps/data/routes/receipts.js +2 -8
- package/dist/apps/data/routes/receipts.js.map +1 -1
- package/dist/apps/data/routes/rpc.d.ts +29 -36
- package/dist/apps/data/routes/rpc.d.ts.map +1 -1
- package/dist/apps/data/routes/rpc.js +29 -1
- package/dist/apps/data/routes/rpc.js.map +1 -1
- package/dist/apps/data/routes/tokenlist.d.ts +36 -36
- package/dist/apps/data/routes/transfers.d.ts +56 -56
- package/dist/apps/data/routes/verified-tokens.d.ts +36 -36
- package/dist/apps/data/routes/webhooks.d.ts +45 -45
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +8 -8
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/docs/App.d.ts +4 -2
- package/dist/apps/docs/App.d.ts.map +1 -1
- package/dist/apps/docs/App.js +27 -95
- package/dist/apps/docs/App.js.map +1 -1
- package/dist/apps/docs/reference.d.ts +21 -0
- package/dist/apps/docs/reference.d.ts.map +1 -0
- package/dist/apps/docs/reference.js +112 -0
- package/dist/apps/docs/reference.js.map +1 -0
- package/dist/apps/index.d.ts +1 -0
- package/dist/apps/index.d.ts.map +1 -1
- package/dist/apps/index.js +1 -0
- package/dist/apps/index.js.map +1 -1
- package/dist/apps/mcp.d.ts +76 -0
- package/dist/apps/mcp.d.ts.map +1 -0
- package/dist/apps/mcp.js +188 -0
- package/dist/apps/mcp.js.map +1 -0
- package/dist/apps/platform/App.d.ts +3005 -728
- package/dist/apps/platform/App.d.ts.map +1 -1
- package/dist/apps/platform/App.js +13 -3
- package/dist/apps/platform/App.js.map +1 -1
- package/dist/apps/platform/Billing.d.ts +279 -0
- package/dist/apps/platform/Billing.d.ts.map +1 -0
- package/dist/apps/platform/Billing.js +477 -0
- package/dist/apps/platform/Billing.js.map +1 -0
- package/dist/apps/platform/index.d.ts +1 -0
- package/dist/apps/platform/index.d.ts.map +1 -1
- package/dist/apps/platform/index.js +1 -0
- package/dist/apps/platform/index.js.map +1 -1
- package/dist/apps/platform/routes/api-keys.d.ts +341 -49
- package/dist/apps/platform/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/platform/routes/api-keys.js +115 -13
- package/dist/apps/platform/routes/api-keys.js.map +1 -1
- package/dist/apps/platform/routes/billing.d.ts +1520 -0
- package/dist/apps/platform/routes/billing.d.ts.map +1 -0
- package/dist/apps/platform/routes/billing.js +795 -0
- package/dist/apps/platform/routes/billing.js.map +1 -0
- package/dist/apps/platform/routes/invitations.d.ts +201 -83
- package/dist/apps/platform/routes/invitations.d.ts.map +1 -1
- package/dist/apps/platform/routes/invitations.js +58 -0
- package/dist/apps/platform/routes/invitations.js.map +1 -1
- package/dist/apps/platform/routes/me.d.ts +17 -17
- package/dist/apps/platform/routes/orgs.d.ts +50 -36
- package/dist/apps/platform/routes/orgs.d.ts.map +1 -1
- package/dist/apps/platform/routes/orgs.js +14 -3
- package/dist/apps/platform/routes/orgs.js.map +1 -1
- package/dist/apps/platform/routes/projects.d.ts +97 -97
- package/dist/apps/platform/routes/scopes.d.ts +107 -0
- package/dist/apps/platform/routes/scopes.d.ts.map +1 -0
- package/dist/apps/platform/routes/scopes.js +66 -0
- package/dist/apps/platform/routes/scopes.js.map +1 -0
- package/dist/apps/platform/routes/usage.d.ts +588 -0
- package/dist/apps/platform/routes/usage.d.ts.map +1 -0
- package/dist/apps/platform/routes/usage.js +391 -0
- package/dist/apps/platform/routes/usage.js.map +1 -0
- package/dist/apps/relay/App.d.ts +4 -1
- package/dist/apps/relay/App.d.ts.map +1 -1
- package/dist/apps/relay/App.js +118 -10
- package/dist/apps/relay/App.js.map +1 -1
- package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
- package/dist/apps/relay/Sponsorships.js +2 -1
- package/dist/apps/relay/Sponsorships.js.map +1 -1
- package/dist/cli/Cli.d.ts +8 -1
- package/dist/cli/Cli.d.ts.map +1 -1
- package/dist/cli/Cli.js +11 -3
- package/dist/cli/Cli.js.map +1 -1
- package/dist/cli/commands/admin.d.ts +4 -0
- package/dist/cli/commands/admin.d.ts.map +1 -1
- package/dist/cli/commands/admin.js +80 -1
- package/dist/cli/commands/admin.js.map +1 -1
- package/dist/db/Db.d.ts +7 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +126 -0
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +79 -0
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +88 -2
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/billingSettings.d.ts +55 -0
- package/dist/db/tables/billingSettings.d.ts.map +1 -0
- package/dist/db/tables/billingSettings.js +70 -0
- package/dist/db/tables/billingSettings.js.map +1 -0
- package/dist/db/tables/invitations.js +2 -2
- package/dist/db/tables/invitations.js.map +1 -1
- package/dist/db/tables/organizations.d.ts +6 -2
- package/dist/db/tables/organizations.d.ts.map +1 -1
- package/dist/db/tables/organizations.js +10 -4
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/projects.js +2 -2
- package/dist/db/tables/projects.js.map +1 -1
- package/dist/db/tables/requestUsage.d.ts +121 -0
- package/dist/db/tables/requestUsage.d.ts.map +1 -0
- package/dist/db/tables/requestUsage.js +150 -0
- package/dist/db/tables/requestUsage.js.map +1 -0
- package/dist/db/tables/sponsoredTransactions.d.ts +119 -0
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +155 -2
- package/dist/db/tables/sponsoredTransactions.js.map +1 -1
- package/dist/db/tables/stripeCustomers.d.ts +81 -0
- package/dist/db/tables/stripeCustomers.d.ts.map +1 -0
- package/dist/db/tables/stripeCustomers.js +120 -0
- package/dist/db/tables/stripeCustomers.js.map +1 -0
- package/dist/db/tables/users.js +2 -2
- package/dist/db/tables/users.js.map +1 -1
- package/dist/handlers/internal/sponsorship.d.ts +5 -2
- package/dist/handlers/internal/sponsorship.d.ts.map +1 -1
- package/dist/handlers/internal/sponsorship.js +19 -5
- package/dist/handlers/internal/sponsorship.js.map +1 -1
- package/dist/handlers/internal/utils.d.ts +10 -3
- package/dist/handlers/internal/utils.d.ts.map +1 -1
- package/dist/handlers/internal/utils.js +14 -6
- package/dist/handlers/internal/utils.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/Auth.d.ts +18 -4
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +148 -76
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +4 -1
- package/dist/internal/Cache.js.map +1 -1
- package/dist/internal/EdgeCache.d.ts +10 -0
- package/dist/internal/EdgeCache.d.ts.map +1 -1
- package/dist/internal/EdgeCache.js +39 -8
- package/dist/internal/EdgeCache.js.map +1 -1
- package/dist/internal/Fees.d.ts +27 -0
- package/dist/internal/Fees.d.ts.map +1 -0
- package/dist/internal/Fees.js +48 -0
- package/dist/internal/Fees.js.map +1 -0
- package/dist/internal/FundingRoutes.d.ts +183 -0
- package/dist/internal/FundingRoutes.d.ts.map +1 -0
- package/dist/internal/FundingRoutes.js +490 -0
- package/dist/internal/FundingRoutes.js.map +1 -0
- package/dist/internal/Id.d.ts +15 -0
- package/dist/internal/Id.d.ts.map +1 -0
- package/dist/internal/Id.js +22 -0
- package/dist/internal/Id.js.map +1 -0
- package/dist/internal/Log.d.ts +2 -0
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +3 -0
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/OpenApi.d.ts +10 -1
- package/dist/internal/OpenApi.d.ts.map +1 -1
- package/dist/internal/OpenApi.js +8 -1
- package/dist/internal/OpenApi.js.map +1 -1
- package/dist/internal/RateLimit.d.ts +25 -0
- package/dist/internal/RateLimit.d.ts.map +1 -1
- package/dist/internal/RateLimit.js +51 -0
- package/dist/internal/RateLimit.js.map +1 -1
- package/dist/internal/Response.d.ts +1 -1
- package/dist/internal/Response.d.ts.map +1 -1
- package/dist/internal/Schema.d.ts +8 -0
- package/dist/internal/Schema.d.ts.map +1 -1
- package/dist/internal/Schema.js +7 -0
- package/dist/internal/Schema.js.map +1 -1
- package/dist/internal/Webhooks.d.ts.map +1 -1
- package/dist/internal/Webhooks.js +3 -3
- package/dist/internal/Webhooks.js.map +1 -1
- package/package.json +4 -3
- package/src/ApiKey.ts +9 -2
- package/src/ApiKeys.test.ts +51 -0
- package/src/ApiKeys.ts +50 -1
- package/src/App.test.ts +33 -86718
- package/src/App.ts +18 -0
- package/src/Client.test-d.ts +351 -0
- package/src/Scope.ts +16 -3
- package/src/admin/apps/scopes.test.ts +6 -0
- package/src/admin/apps/scopes.ts +3 -0
- package/src/admin/ui/src/components/Page.tsx +2 -3
- package/src/admin/ui/src/routes/__root.tsx +2 -2
- package/src/admin/ui/src/routes/api-keys.tsx +2 -2
- package/src/admin/ui.generated.ts +13 -13
- package/src/analytics/Analytics.test.ts +527 -0
- package/src/analytics/Analytics.ts +318 -0
- package/src/analytics/tables/requestEvents.ts +523 -0
- package/src/apps/data/App.test.ts +72 -0
- package/src/apps/data/App.ts +35 -0
- package/src/apps/data/routes/funding.test.ts +214 -0
- package/src/apps/data/routes/funding.ts +584 -0
- package/src/apps/data/routes/receipts.ts +2 -9
- package/src/apps/data/routes/rpc.test.ts +78 -2
- package/src/apps/data/routes/rpc.ts +31 -1
- package/src/apps/data/routes/webhooks.test.ts +1 -1
- package/src/apps/data/routes/webhooks.ts +11 -8
- package/src/apps/docs/App.ts +29 -100
- package/src/apps/docs/reference.ts +132 -0
- package/src/apps/index.ts +1 -0
- package/src/apps/mcp.test.ts +206 -0
- package/src/apps/mcp.ts +250 -0
- package/src/apps/platform/App.ts +43 -4
- package/src/apps/platform/Billing.test.ts +530 -0
- package/src/apps/platform/Billing.ts +682 -0
- package/src/apps/platform/index.ts +1 -0
- package/src/apps/platform/routes/api-keys.test.ts +172 -9
- package/src/apps/platform/routes/api-keys.ts +136 -20
- package/src/apps/platform/routes/billing.test.ts +1100 -0
- package/src/apps/platform/routes/billing.ts +966 -0
- package/src/apps/platform/routes/invitations.test.ts +55 -7
- package/src/apps/platform/routes/invitations.ts +68 -0
- package/src/apps/platform/routes/me.test.ts +230 -0
- package/src/apps/platform/routes/orgs.ts +26 -4
- package/src/apps/platform/routes/scopes.test.ts +29 -0
- package/src/apps/platform/routes/scopes.ts +85 -0
- package/src/apps/platform/routes/usage.test.ts +422 -0
- package/src/apps/platform/routes/usage.ts +527 -0
- package/src/apps/relay/App.test.ts +457 -8
- package/src/apps/relay/App.ts +120 -12
- package/src/apps/relay/Sponsorships.test.ts +1 -1
- package/src/apps/relay/Sponsorships.ts +2 -1
- package/src/cli/Cli.test.ts +25 -2
- package/src/cli/Cli.ts +17 -2
- package/src/cli/commands/admin.test.ts +83 -0
- package/src/cli/commands/admin.ts +89 -1
- package/src/db/Db.ts +137 -0
- package/src/db/Schema.ts +104 -2
- package/src/db/tables/billingSettings.test.ts +87 -0
- package/src/db/tables/billingSettings.ts +108 -0
- package/src/db/tables/invitations.ts +2 -2
- package/src/db/tables/organizations.test.ts +1 -1
- package/src/db/tables/organizations.ts +15 -5
- package/src/db/tables/projects.ts +2 -2
- package/src/db/tables/requestUsage.ts +231 -0
- package/src/db/tables/sponsoredTransactions.test.ts +108 -1
- package/src/db/tables/sponsoredTransactions.ts +230 -2
- package/src/db/tables/stripeCustomers.test.ts +109 -0
- package/src/db/tables/stripeCustomers.ts +162 -0
- package/src/db/tables/users.ts +2 -2
- package/src/handlers/internal/sponsorship.ts +34 -7
- package/src/handlers/internal/utils.ts +19 -7
- package/src/index.ts +1 -0
- package/src/internal/Auth.test.ts +175 -25
- package/src/internal/Auth.ts +175 -86
- package/src/internal/Cache.ts +5 -1
- package/src/internal/EdgeCache.test.ts +27 -4
- package/src/internal/EdgeCache.ts +47 -9
- package/src/internal/Fees.test.ts +32 -0
- package/src/internal/Fees.ts +51 -0
- package/src/internal/FundingRoutes.ts +583 -0
- package/src/internal/Id.test.ts +17 -0
- package/src/internal/Id.ts +24 -0
- package/src/internal/Log.test.ts +1 -0
- package/src/internal/Log.ts +5 -0
- package/src/internal/OpenApi.ts +12 -1
- package/src/internal/RateLimit.test.ts +84 -0
- package/src/internal/RateLimit.ts +70 -0
- package/src/internal/Response.ts +1 -1
- package/src/internal/Schema.ts +8 -0
- package/src/internal/Webhooks.test.ts +3 -3
- package/src/internal/Webhooks.ts +3 -3
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import * as z from 'zod/mini';
|
|
3
|
+
import * as Analytics from '../../../analytics/Analytics.js';
|
|
4
|
+
import * as ApiKeys from '../../../ApiKeys.js';
|
|
5
|
+
import * as Auth from '../../../internal/Auth.js';
|
|
6
|
+
import * as BillingSettings from '../../../db/tables/billingSettings.js';
|
|
7
|
+
import * as Db from '../../../db/Db.js';
|
|
8
|
+
import * as OpenApi from '../../../internal/OpenApi.js';
|
|
9
|
+
import * as RequestEvents from '../../../analytics/tables/requestEvents.js';
|
|
10
|
+
import * as Response from '../../../internal/Response.js';
|
|
11
|
+
import * as Schema from '../../../internal/Schema.js';
|
|
12
|
+
import * as SponsoredTransactions from '../../../db/tables/sponsoredTransactions.js';
|
|
13
|
+
import * as core_Billing from '../Billing.js';
|
|
14
|
+
/** Zod schemas owned by the usage resource. */
|
|
15
|
+
export var schema;
|
|
16
|
+
(function (schema) {
|
|
17
|
+
/** Schemas for the getRequestUsage operation. */
|
|
18
|
+
let getRequestUsage;
|
|
19
|
+
(function (getRequestUsage) {
|
|
20
|
+
/** Usage grouped by API key. */
|
|
21
|
+
getRequestUsage.KeyBreakdown = z
|
|
22
|
+
.object({
|
|
23
|
+
apiKeyId: z
|
|
24
|
+
.string()
|
|
25
|
+
.check(z.describe('API key id (`key_…`).'), z.meta({ examples: ['key_1a2b3c4d5e6f7g8h9j0k1m2n'] })),
|
|
26
|
+
averageDurationMs: z
|
|
27
|
+
.number()
|
|
28
|
+
.check(z.describe('Average request duration in milliseconds.'), z.meta({ examples: [12.3] })),
|
|
29
|
+
errors: z
|
|
30
|
+
.number()
|
|
31
|
+
.check(z.int(), z.describe('Requests whose status was at least 400.'), z.meta({ examples: [3] })), // prettier-ignore
|
|
32
|
+
requests: z
|
|
33
|
+
.number()
|
|
34
|
+
.check(z.int(), z.describe('Total requests.'), z.meta({ examples: [120] })),
|
|
35
|
+
})
|
|
36
|
+
.check(z.describe('Usage grouped by API key.'));
|
|
37
|
+
/** Path parameters addressing one organization's usage. */
|
|
38
|
+
getRequestUsage.Params = z
|
|
39
|
+
.object({
|
|
40
|
+
orgId: z
|
|
41
|
+
.string()
|
|
42
|
+
.check(z.describe('The organization id (`org_…`).'), z.meta({ examples: ['org_1a2b3c4d5e6f7g8h9j0k1m2n'] })),
|
|
43
|
+
})
|
|
44
|
+
.check(z.describe("Path parameters for an organization's usage."));
|
|
45
|
+
/** Query parameters for request usage. */
|
|
46
|
+
getRequestUsage.Query = z
|
|
47
|
+
.strictObject({
|
|
48
|
+
environment: z
|
|
49
|
+
.optional(z.enum(['production', 'sandbox']))
|
|
50
|
+
.check(z.describe('Only include requests made with this API-key environment.'), z.meta({ examples: ['sandbox'] })), // prettier-ignore
|
|
51
|
+
from: z
|
|
52
|
+
.optional(z.iso.datetime({ offset: true }))
|
|
53
|
+
.check(z.describe('Only include requests at or after this ISO 8601 timestamp.'), z.meta({ examples: ['2026-01-01T00:00:00Z'] })),
|
|
54
|
+
interval: z
|
|
55
|
+
._default(z.enum(['day', 'hour']), 'day')
|
|
56
|
+
.check(z.describe('Time bucket size for the usage series.'), z.meta({ examples: ['day'] })),
|
|
57
|
+
projectId: z.optional(z.string()).check(z.describe('Only include requests attributed to this project (`prj_…`). Omit for organization-wide usage.'), // prettier-ignore
|
|
58
|
+
z.meta({ examples: ['prj_1a2b3c4d5e6f7g8h9j0k1m2n'] })),
|
|
59
|
+
to: z
|
|
60
|
+
.optional(z.iso.datetime({ offset: true }))
|
|
61
|
+
.check(z.describe('Only include requests at or before this ISO 8601 timestamp.'), z.meta({ examples: ['2026-01-31T23:59:59Z'] })),
|
|
62
|
+
})
|
|
63
|
+
.check(z.describe('Query parameters for request usage.'));
|
|
64
|
+
/** Usage grouped by route. */
|
|
65
|
+
getRequestUsage.RouteBreakdown = z
|
|
66
|
+
.object({
|
|
67
|
+
averageDurationMs: z
|
|
68
|
+
.number()
|
|
69
|
+
.check(z.describe('Average request duration in milliseconds.'), z.meta({ examples: [18.2] })),
|
|
70
|
+
errors: z
|
|
71
|
+
.number()
|
|
72
|
+
.check(z.int(), z.describe('Requests whose status was at least 400.'), z.meta({ examples: [2] })), // prettier-ignore
|
|
73
|
+
requests: z
|
|
74
|
+
.number()
|
|
75
|
+
.check(z.int(), z.describe('Total requests.'), z.meta({ examples: [80] })),
|
|
76
|
+
route: z
|
|
77
|
+
.string()
|
|
78
|
+
.check(z.describe('Matched route pattern.'), z.meta({ examples: ['/v1/transactions/:hash'] })),
|
|
79
|
+
})
|
|
80
|
+
.check(z.describe('Usage grouped by route.'));
|
|
81
|
+
/** One usage series point. */
|
|
82
|
+
getRequestUsage.SeriesPoint = z
|
|
83
|
+
.object({
|
|
84
|
+
errors: z
|
|
85
|
+
.number()
|
|
86
|
+
.check(z.int(), z.describe('Requests whose status was at least 400.'), z.meta({ examples: [1] })), // prettier-ignore
|
|
87
|
+
requests: z
|
|
88
|
+
.number()
|
|
89
|
+
.check(z.int(), z.describe('Total requests.'), z.meta({ examples: [40] })),
|
|
90
|
+
time: z
|
|
91
|
+
.string()
|
|
92
|
+
.check(z.describe('Bucket start timestamp (ISO 8601).'), z.meta({ examples: ['2026-01-01T00:00:00.000Z'] })),
|
|
93
|
+
})
|
|
94
|
+
.check(z.describe('One usage series point.'));
|
|
95
|
+
/** Usage grouped by status code. */
|
|
96
|
+
getRequestUsage.StatusBreakdown = z
|
|
97
|
+
.object({
|
|
98
|
+
requests: z
|
|
99
|
+
.number()
|
|
100
|
+
.check(z.int(), z.describe('Total requests.'), z.meta({ examples: [100] })),
|
|
101
|
+
status: z
|
|
102
|
+
.number()
|
|
103
|
+
.check(z.int(), z.describe('HTTP status code.'), z.meta({ examples: [200] })),
|
|
104
|
+
})
|
|
105
|
+
.check(z.describe('Usage grouped by status code.'));
|
|
106
|
+
/** Overall usage totals. */
|
|
107
|
+
getRequestUsage.Totals = z
|
|
108
|
+
.object({
|
|
109
|
+
averageDurationMs: z
|
|
110
|
+
.number()
|
|
111
|
+
.check(z.describe('Average request duration in milliseconds.'), z.meta({ examples: [15.6] })),
|
|
112
|
+
errors: z
|
|
113
|
+
.number()
|
|
114
|
+
.check(z.int(), z.describe('Requests whose status was at least 400.'), z.meta({ examples: [5] })), // prettier-ignore
|
|
115
|
+
requests: z
|
|
116
|
+
.number()
|
|
117
|
+
.check(z.int(), z.describe('Total requests.'), z.meta({ examples: [200] })),
|
|
118
|
+
})
|
|
119
|
+
.check(z.describe('Overall usage totals.'));
|
|
120
|
+
/** Request usage. */
|
|
121
|
+
getRequestUsage.Response = Schema.describe(z.object({
|
|
122
|
+
byKey: z.array(getRequestUsage.KeyBreakdown).check(z.describe('Usage grouped by API key.')),
|
|
123
|
+
byRoute: z.array(getRequestUsage.RouteBreakdown).check(z.describe('Usage grouped by route.')),
|
|
124
|
+
byStatus: z.array(getRequestUsage.StatusBreakdown).check(z.describe('Usage grouped by status code.')),
|
|
125
|
+
from: z
|
|
126
|
+
.string()
|
|
127
|
+
.check(z.describe('Inclusive lower timestamp bound used for the read (ISO 8601).'), z.meta({ examples: ['2026-01-01T00:00:00.000Z'] })),
|
|
128
|
+
interval: z
|
|
129
|
+
.enum(['day', 'hour'])
|
|
130
|
+
.check(z.describe('Bucket size used for the time series.'), z.meta({ examples: ['day'] })),
|
|
131
|
+
series: z.array(getRequestUsage.SeriesPoint).check(z.describe('Usage grouped into time buckets.')),
|
|
132
|
+
to: z
|
|
133
|
+
.string()
|
|
134
|
+
.check(z.describe('Inclusive upper timestamp bound used for the read (ISO 8601).'), z.meta({ examples: ['2026-01-31T23:59:59.000Z'] })),
|
|
135
|
+
totals: getRequestUsage.Totals,
|
|
136
|
+
}), 'Request usage.');
|
|
137
|
+
})(getRequestUsage = schema.getRequestUsage || (schema.getRequestUsage = {}));
|
|
138
|
+
/** Schemas for the getSponsorshipUsage operation. */
|
|
139
|
+
let getSponsorshipUsage;
|
|
140
|
+
(function (getSponsorshipUsage) {
|
|
141
|
+
/** One time bucket of sponsorship usage. */
|
|
142
|
+
getSponsorshipUsage.Bucket = Schema.describe(z.object({
|
|
143
|
+
count: z
|
|
144
|
+
.number()
|
|
145
|
+
.check(z.describe('Sponsored transactions recorded in the bucket, any status.'), z.meta({ examples: [42] })),
|
|
146
|
+
feeTotal: z
|
|
147
|
+
.object({
|
|
148
|
+
amount: z.string().check(z.describe('Committed fees as a decimal string: finalized fees plus in-flight fee caps; failed rows contribute zero.'), // prettier-ignore
|
|
149
|
+
z.meta({ examples: ['12.34'] })),
|
|
150
|
+
currency: z
|
|
151
|
+
.enum(BillingSettings.currencies)
|
|
152
|
+
.check(z.describe('Currency of the fee figure.'), z.meta({ examples: ['usd'] })),
|
|
153
|
+
})
|
|
154
|
+
.check(z.describe('Committed fees for the bucket.'), z.meta({ examples: [{ amount: '12.34', currency: 'usd' }] })),
|
|
155
|
+
timestamp: z
|
|
156
|
+
.string()
|
|
157
|
+
.check(z.describe('Bucket start (ISO 8601), aligned to UTC calendar boundaries.'), z.meta({ examples: ['2026-01-01T00:00:00.000Z'] })),
|
|
158
|
+
}), 'One time bucket of sponsorship usage.');
|
|
159
|
+
/** Path parameters addressing one organization's usage. */
|
|
160
|
+
getSponsorshipUsage.Params = z
|
|
161
|
+
.object({
|
|
162
|
+
orgId: z
|
|
163
|
+
.string()
|
|
164
|
+
.check(z.describe('The organization id (`org_…`).'), z.meta({ examples: ['org_1a2b3c4d5e6f7g8h9j0k1m2n'] })),
|
|
165
|
+
})
|
|
166
|
+
.check(z.describe("Path parameters for one organization's usage."));
|
|
167
|
+
/** Query parameters scoping the sponsorship usage series. */
|
|
168
|
+
getSponsorshipUsage.Query = z
|
|
169
|
+
.strictObject({
|
|
170
|
+
environment: z
|
|
171
|
+
.optional(z.enum(['production', 'sandbox']))
|
|
172
|
+
.check(z.describe('Only include sponsorships requested under this key environment.'), z.meta({ examples: ['production'] })),
|
|
173
|
+
from: z
|
|
174
|
+
.optional(z.iso.datetime({ offset: true }))
|
|
175
|
+
.check(z.describe('Window start (ISO 8601), inclusive. Defaults to 30 days before `to`.'), z.meta({ examples: ['2026-01-01T00:00:00Z'] })),
|
|
176
|
+
interval: z
|
|
177
|
+
._default(z.enum(['day', 'hour', 'month', 'week']), 'day')
|
|
178
|
+
.check(z.describe('Bucket width, aligned to UTC calendar boundaries.'), z.meta({ examples: ['day'] })),
|
|
179
|
+
projectId: z
|
|
180
|
+
.optional(z.string())
|
|
181
|
+
.check(z.describe('Only include sponsorships attributed to this project (`prj_…`).'), z.meta({ examples: ['prj_1a2b3c4d5e6f7g8h9j0k1m2n'] })),
|
|
182
|
+
to: z
|
|
183
|
+
.optional(z.iso.datetime({ offset: true }))
|
|
184
|
+
.check(z.describe('Window end (ISO 8601), exclusive. Defaults to now.'), z.meta({ examples: ['2026-01-31T00:00:00Z'] })),
|
|
185
|
+
})
|
|
186
|
+
.check(z.describe('Query parameters scoping the sponsorship usage series.'));
|
|
187
|
+
/** Sponsorship usage bucketed over time. */
|
|
188
|
+
getSponsorshipUsage.Response = Schema.describe(z.object({
|
|
189
|
+
data: z
|
|
190
|
+
.array(getSponsorshipUsage.Bucket)
|
|
191
|
+
.check(z.describe('Time-ordered usage buckets; buckets with no sponsorships are omitted.')),
|
|
192
|
+
}), 'Sponsorship usage bucketed over time.');
|
|
193
|
+
})(getSponsorshipUsage = schema.getSponsorshipUsage || (schema.getSponsorshipUsage = {}));
|
|
194
|
+
})(schema || (schema = {}));
|
|
195
|
+
/**
|
|
196
|
+
* Mounts the usage surface: project request usage (read from a host-supplied
|
|
197
|
+
* analytics capability) and an organization's sponsorship volume and fees
|
|
198
|
+
* over time. Session lane; reads for members.
|
|
199
|
+
*/
|
|
200
|
+
export function usage() {
|
|
201
|
+
return new Hono()
|
|
202
|
+
.get('/v1/orgs/:orgId{org_[A-Za-z0-9_-]+}/usage/requests', Auth.policy({ session: true }), Auth.ensureOrg(), OpenApi.validate('param', schema.getRequestUsage.Params, {
|
|
203
|
+
code: 'param_invalid',
|
|
204
|
+
message: 'Check the path parameters and try again.',
|
|
205
|
+
}), OpenApi.validate('query', schema.getRequestUsage.Query, {
|
|
206
|
+
code: 'query_invalid',
|
|
207
|
+
message: 'Check the query parameters and try again.',
|
|
208
|
+
}), OpenApi.describeRoute({
|
|
209
|
+
operationId: 'getRequestUsage',
|
|
210
|
+
responses: OpenApi.responses({
|
|
211
|
+
errors: {
|
|
212
|
+
400: { codes: ['query_invalid'], description: 'Invalid query parameters.' },
|
|
213
|
+
404: {
|
|
214
|
+
codes: ['organization_not_found'],
|
|
215
|
+
description: 'No accessible organization was found for this id.',
|
|
216
|
+
},
|
|
217
|
+
501: {
|
|
218
|
+
codes: ['analytics_unconfigured'],
|
|
219
|
+
description: 'Usage analytics is not configured on this deployment.',
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
success: {
|
|
223
|
+
description: 'The request usage.',
|
|
224
|
+
schema: schema.getRequestUsage.Response,
|
|
225
|
+
},
|
|
226
|
+
}),
|
|
227
|
+
summary: 'Get request usage',
|
|
228
|
+
tags: ['Usage'],
|
|
229
|
+
}), async (c) => {
|
|
230
|
+
if (Auth.narrowAccess)
|
|
231
|
+
return Auth.superAdminAccessError(c);
|
|
232
|
+
if (Auth.narrowScope)
|
|
233
|
+
return Auth.ensureOrgError(c);
|
|
234
|
+
if (OpenApi.narrowValidation)
|
|
235
|
+
return OpenApi.validationError(c, {
|
|
236
|
+
code: 'param_invalid',
|
|
237
|
+
message: 'Check the path parameters and try again.',
|
|
238
|
+
});
|
|
239
|
+
if (OpenApi.narrowValidation)
|
|
240
|
+
return OpenApi.validationError(c, {
|
|
241
|
+
code: 'query_invalid',
|
|
242
|
+
message: 'Check the query parameters and try again.',
|
|
243
|
+
});
|
|
244
|
+
const analytics = c.get('analytics');
|
|
245
|
+
if (!analytics)
|
|
246
|
+
return analyticsUnconfigured(c);
|
|
247
|
+
const query = c.req.valid('query');
|
|
248
|
+
const to = new Date(Date.parse(query.to ?? new Date().toISOString())).toISOString();
|
|
249
|
+
const lookback = query.interval === 'day' ? 30 * dayMs : 24 * hourMs;
|
|
250
|
+
const from = new Date(Date.parse(query.from ?? new Date(Date.parse(to) - lookback).toISOString())).toISOString(); // prettier-ignore
|
|
251
|
+
if (Date.parse(from) > Date.parse(to))
|
|
252
|
+
return Response.error(c, {
|
|
253
|
+
code: 'query_invalid',
|
|
254
|
+
message: '`from` must be before or equal to `to`.',
|
|
255
|
+
status: 400,
|
|
256
|
+
});
|
|
257
|
+
if (Date.parse(to) - Date.parse(from) > (maxBuckets - 1) * intervalMs(query.interval))
|
|
258
|
+
return Response.error(c, {
|
|
259
|
+
code: 'query_invalid',
|
|
260
|
+
message: `Usage series are limited to ${maxBuckets} buckets.`,
|
|
261
|
+
status: 400,
|
|
262
|
+
});
|
|
263
|
+
try {
|
|
264
|
+
const environment = query.environment === undefined ? {} : { environment: query.environment };
|
|
265
|
+
const keyIds = await legacyKeyIds(c, {
|
|
266
|
+
environment: query.environment,
|
|
267
|
+
projectId: query.projectId,
|
|
268
|
+
});
|
|
269
|
+
return c.json(Response.validated(schema.getRequestUsage.Response, await RequestEvents.readProjectUsage(Analytics.get(analytics), {
|
|
270
|
+
attributions: [
|
|
271
|
+
// `projectId` present scopes to one project; absent covers the
|
|
272
|
+
// whole org. Either way legacy null-project rows are folded in
|
|
273
|
+
// by explicit key id below.
|
|
274
|
+
{
|
|
275
|
+
...environment,
|
|
276
|
+
...(query.projectId === undefined ? {} : { projectId: query.projectId }),
|
|
277
|
+
},
|
|
278
|
+
...(keyIds.length > 0
|
|
279
|
+
? [{ apiKeyIds: keyIds, ...environment, projectId: null }]
|
|
280
|
+
: []),
|
|
281
|
+
],
|
|
282
|
+
from,
|
|
283
|
+
interval: query.interval,
|
|
284
|
+
orgId: Auth.org(c).id,
|
|
285
|
+
to,
|
|
286
|
+
})), 200);
|
|
287
|
+
}
|
|
288
|
+
catch (cause) {
|
|
289
|
+
return Response.upstream(c, cause);
|
|
290
|
+
}
|
|
291
|
+
})
|
|
292
|
+
.get('/v1/orgs/:orgId{org_[A-Za-z0-9_-]+}/usage/sponsorships', Auth.policy({ session: true }), Auth.ensureOrg(), OpenApi.validate('param', schema.getSponsorshipUsage.Params, {
|
|
293
|
+
code: 'param_invalid',
|
|
294
|
+
message: 'Check the path parameters and try again.',
|
|
295
|
+
}), OpenApi.validate('query', schema.getSponsorshipUsage.Query, {
|
|
296
|
+
code: 'query_invalid',
|
|
297
|
+
message: 'Check the query parameters and try again.',
|
|
298
|
+
}), OpenApi.describeRoute({
|
|
299
|
+
operationId: 'getSponsorshipUsage',
|
|
300
|
+
responses: OpenApi.responses({
|
|
301
|
+
errors: {
|
|
302
|
+
404: 'No accessible organization was found for this id.',
|
|
303
|
+
},
|
|
304
|
+
success: {
|
|
305
|
+
description: "The organization's sponsorship usage series.",
|
|
306
|
+
schema: schema.getSponsorshipUsage.Response,
|
|
307
|
+
},
|
|
308
|
+
}),
|
|
309
|
+
summary: 'Get sponsorship usage',
|
|
310
|
+
tags: ['Usage'],
|
|
311
|
+
}), async (c) => {
|
|
312
|
+
if (Auth.narrowAccess)
|
|
313
|
+
return Auth.superAdminAccessError(c);
|
|
314
|
+
if (Auth.narrowScope)
|
|
315
|
+
return Auth.ensureOrgError(c);
|
|
316
|
+
if (OpenApi.narrowValidation)
|
|
317
|
+
return OpenApi.validationError(c, {
|
|
318
|
+
code: 'param_invalid',
|
|
319
|
+
message: 'Check the path parameters and try again.',
|
|
320
|
+
});
|
|
321
|
+
if (OpenApi.narrowValidation)
|
|
322
|
+
return OpenApi.validationError(c, {
|
|
323
|
+
code: 'query_invalid',
|
|
324
|
+
message: 'Check the query parameters and try again.',
|
|
325
|
+
});
|
|
326
|
+
const query = c.req.valid('query');
|
|
327
|
+
const to = query.to ? new Date(query.to) : new Date();
|
|
328
|
+
const from = query.from ? new Date(query.from) : new Date(to.getTime() - 30 * dayMs);
|
|
329
|
+
if (from.getTime() >= to.getTime())
|
|
330
|
+
return windowInvalid(c, '`from` must be before `to`');
|
|
331
|
+
// Bound the scan, not just the output: 31 days of hours is 744 buckets;
|
|
332
|
+
// wider intervals cap at 400 days regardless of bucket count.
|
|
333
|
+
const maxDays = query.interval === 'hour' ? 31 : 400;
|
|
334
|
+
if (to.getTime() - from.getTime() > maxDays * dayMs)
|
|
335
|
+
return windowInvalid(c, `The window may span at most ${maxDays} days at \`${query.interval}\` interval`);
|
|
336
|
+
try {
|
|
337
|
+
const buckets = await SponsoredTransactions.usage(Db.get(c.get('dbCached')), {
|
|
338
|
+
environment: query.environment,
|
|
339
|
+
from: from.toISOString(),
|
|
340
|
+
interval: query.interval,
|
|
341
|
+
orgId: Auth.org(c).id,
|
|
342
|
+
projectId: query.projectId,
|
|
343
|
+
to: to.toISOString(),
|
|
344
|
+
});
|
|
345
|
+
// Sponsored fees settle in USD: the relay refuses non-USD fee tokens
|
|
346
|
+
// on mainnet and rows snapshot `currency`, so one constant is correct
|
|
347
|
+
// until multi-currency sponsorship ships (then group by currency).
|
|
348
|
+
const currency = 'usd';
|
|
349
|
+
return c.json(Response.validated(schema.getSponsorshipUsage.Response, {
|
|
350
|
+
data: buckets.map((bucket) => ({
|
|
351
|
+
count: bucket.count,
|
|
352
|
+
feeTotal: { amount: core_Billing.fromBaseUnits(bucket.feeTotal), currency },
|
|
353
|
+
timestamp: bucket.timestamp,
|
|
354
|
+
})),
|
|
355
|
+
}), 200);
|
|
356
|
+
}
|
|
357
|
+
catch (cause) {
|
|
358
|
+
return Response.upstream(c, cause);
|
|
359
|
+
}
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
/** One day in milliseconds; window defaults and caps derive from it. */
|
|
363
|
+
const dayMs = 24 * 60 * 60 * 1000;
|
|
364
|
+
/** One hour in milliseconds. */
|
|
365
|
+
const hourMs = 60 * 60 * 1000;
|
|
366
|
+
/** Upper bound on request-usage series length. */
|
|
367
|
+
const maxBuckets = 200;
|
|
368
|
+
/** API-key ids minted before project attribution; matched by explicit id. */
|
|
369
|
+
async function legacyKeyIds(c, options) {
|
|
370
|
+
const kv = c.get('kv');
|
|
371
|
+
if (!kv)
|
|
372
|
+
return [];
|
|
373
|
+
const records = await ApiKeys.listByOrg(kv.store, Auth.org(c).id, options.projectId === undefined ? {} : { projectId: options.projectId });
|
|
374
|
+
return records
|
|
375
|
+
.filter((record) => options.environment === undefined || record.environment === options.environment) // prettier-ignore
|
|
376
|
+
.map((record) => record.id);
|
|
377
|
+
}
|
|
378
|
+
function analyticsUnconfigured(c) {
|
|
379
|
+
return Response.error(c, {
|
|
380
|
+
code: 'analytics_unconfigured',
|
|
381
|
+
message: 'Usage analytics is not configured on this deployment',
|
|
382
|
+
status: 501,
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
function intervalMs(interval) {
|
|
386
|
+
return interval === 'day' ? dayMs : hourMs;
|
|
387
|
+
}
|
|
388
|
+
function windowInvalid(c, message) {
|
|
389
|
+
return Response.error(c, { code: 'query_invalid', message, status: 400 });
|
|
390
|
+
}
|
|
391
|
+
//# sourceMappingURL=usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../../src/apps/platform/routes/usage.ts"],"names":[],"mappings":"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"}
|
package/dist/apps/relay/App.d.ts
CHANGED
|
@@ -35,7 +35,10 @@ export declare function relay(options?: relay.Options): import("hono/hono-base")
|
|
|
35
35
|
export declare namespace relay {
|
|
36
36
|
/** Options for the relay route group. */
|
|
37
37
|
type Options = {
|
|
38
|
-
feePayer?: Pick<NonNullable<Handler.relay.Options['feePayer']>, 'account' | 'feeToken' | 'name' | 'url'>
|
|
38
|
+
feePayer?: (Pick<NonNullable<Handler.relay.Options['feePayer']>, 'account' | 'feeToken' | 'name' | 'url'> & {
|
|
39
|
+
/** Per-transaction fee cap (decimal USD string); orgs tighten it, never loosen. @default '1.00' */
|
|
40
|
+
txFeeLimit?: string | undefined;
|
|
41
|
+
}) | undefined;
|
|
39
42
|
};
|
|
40
43
|
}
|
|
41
44
|
//# sourceMappingURL=App.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../src/apps/relay/App.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../src/apps/relay/App.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAA;AAMxC,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAA;AAQ3C;;;;;;;;GAQG;AACH,wBAAgB,KAAK,CAAC,OAAO,GAAE,KAAK,CAAC,OAAY;;;;;;;;;;;;;;;;;;;;;;+BAehD;AAED,MAAM,CAAC,OAAO,WAAW,KAAK,CAAC;IAC7B,yCAAyC;IACzC,KAAK,OAAO,GAAG;QACb,QAAQ,CAAC,EACL,CAAC,IAAI,CACH,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EAC9C,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,CACxC,GAAG;YACF,mGAAmG;YACnG,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAChC,CAAC,GACF,SAAS,CAAA;KACd,CAAA;CACF"}
|
package/dist/apps/relay/App.js
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { Hono } from 'hono';
|
|
2
2
|
import { createMiddleware } from 'hono/factory';
|
|
3
|
-
import {
|
|
3
|
+
import { RpcResponse } from 'ox';
|
|
4
|
+
import { Addresses, TokenId, Transaction } from 'viem/tempo';
|
|
5
|
+
import * as BillingSettings from '../../db/tables/billingSettings.js';
|
|
4
6
|
import * as Db from '../../db/Db.js';
|
|
7
|
+
import * as Fees from '../../internal/Fees.js';
|
|
5
8
|
import * as SponsoredTransactions from '../../db/tables/sponsoredTransactions.js';
|
|
9
|
+
import * as Billing from '../platform/Billing.js';
|
|
6
10
|
import * as Handler from '../../Handler.js';
|
|
7
11
|
import * as Auth from '../../internal/Auth.js';
|
|
8
12
|
import * as OpenApi from '../../internal/OpenApi.js';
|
|
@@ -32,6 +36,10 @@ export function relay(options = {}) {
|
|
|
32
36
|
// than closed over group locals; relay traffic is low-QPS and the viem
|
|
33
37
|
// clients are memoized upstream, so per-request handler construction is cheap.
|
|
34
38
|
function middleware(options = {}) {
|
|
39
|
+
// Platform-wide per-transaction cap; org settings tighten it, never loosen.
|
|
40
|
+
const txFeeLimit = options.feePayer
|
|
41
|
+
? Billing.toBaseUnits(options.feePayer.txFeeLimit ?? '1.00')
|
|
42
|
+
: 0n;
|
|
35
43
|
return createMiddleware(async (c) => {
|
|
36
44
|
const verifiedTokens = c.get('verifiedTokens');
|
|
37
45
|
const feePayer = (() => {
|
|
@@ -50,21 +58,99 @@ function middleware(options = {}) {
|
|
|
50
58
|
principal?.type === 'api_key' &&
|
|
51
59
|
(principal.apiKey.scopes.includes('rpc-relay:sponsor') ||
|
|
52
60
|
principal.apiKey.scopes.includes(Scope.wildcard));
|
|
61
|
+
// Lifted so validation and the sponsored-token default read one value.
|
|
62
|
+
const feeToken_sponsor = options.feePayer.feeToken ?? Addresses.pathUsd;
|
|
53
63
|
return {
|
|
54
64
|
...options.feePayer,
|
|
55
|
-
feeToken:
|
|
56
|
-
validate: (
|
|
65
|
+
feeToken: feeToken_sponsor,
|
|
66
|
+
validate: async (transaction) => {
|
|
57
67
|
// Allowlist the chains this deployment serves rather than denylisting
|
|
58
68
|
// only mainnet: the relay resolves chainId from the request body, so
|
|
59
|
-
// the query-string chain guard never sees it.
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
69
|
+
// the query-string chain guard never sees it.
|
|
70
|
+
const id = Number(transaction.chainId);
|
|
71
|
+
if (!attribution || !sponsorable || !c.get('supportedChainIds').has(id))
|
|
72
|
+
return false;
|
|
73
|
+
if (!Viem.isMainnet(id))
|
|
74
|
+
return true;
|
|
75
|
+
// Mainnet is production-only: a sandbox key resolves chainId from the
|
|
76
|
+
// request body, so the auth-layer sandbox/mainnet guard never sees
|
|
77
|
+
// it. Refuse here, or sandbox spend would sponsor mainnet unbilled.
|
|
78
|
+
if (attribution.environment !== 'production')
|
|
79
|
+
return false;
|
|
80
|
+
// Enforcement reads hit the primary, never the cached replica: a
|
|
81
|
+
// stale `past_due`, a lowered limit, or another isolate's pending
|
|
82
|
+
// spend must not keep the gate open.
|
|
83
|
+
const db = Db.get(c.get('db'));
|
|
84
|
+
// Mainnet sponsorship requires an active billing source; deployments
|
|
85
|
+
// without billing configured have no rows, so mainnet stays closed.
|
|
86
|
+
// `past_due` gets its own reason: the caller must settle an invoice,
|
|
87
|
+
// not attach a card.
|
|
88
|
+
const billing = await Billing.status(db, attribution.orgId);
|
|
89
|
+
if (billing === 'past_due')
|
|
90
|
+
return 'billing_past_due';
|
|
91
|
+
if (billing !== 'active')
|
|
92
|
+
return 'billing_required';
|
|
93
|
+
const feeToken = (() => {
|
|
94
|
+
try {
|
|
95
|
+
return TokenId.toAddress(transaction.feeToken ?? feeToken_sponsor);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
})();
|
|
101
|
+
const verified = feeToken
|
|
102
|
+
? (await VerifiedTokens.read(Db.get(c.get('dbCached')), id))?.byAddress.get(feeToken.toLowerCase()) // prettier-ignore
|
|
103
|
+
: undefined;
|
|
104
|
+
if (!verified ||
|
|
105
|
+
verified.currency.toLowerCase() !== 'usd' ||
|
|
106
|
+
verified.decimals !== Fees.tokenDecimals)
|
|
107
|
+
// prettier-ignore
|
|
108
|
+
return 'fee_token_unsupported';
|
|
109
|
+
// Fail closed: a transaction whose signed cap cannot be computed
|
|
110
|
+
// cannot be bounded, so it never sponsors on mainnet.
|
|
111
|
+
const feeMax = Fees.maxOf(transaction);
|
|
112
|
+
if (feeMax === undefined)
|
|
113
|
+
return 'tx_fee_limit_exceeded';
|
|
114
|
+
const settings = await BillingSettings.get(db, attribution.orgId);
|
|
115
|
+
const cap = (() => {
|
|
116
|
+
if (settings?.txFeeLimit == null)
|
|
117
|
+
return txFeeLimit;
|
|
118
|
+
const org = Billing.toBaseUnits(settings.txFeeLimit);
|
|
119
|
+
return org < txFeeLimit ? org : txFeeLimit;
|
|
120
|
+
})();
|
|
121
|
+
if (feeMax > cap)
|
|
122
|
+
return 'tx_fee_limit_exceeded';
|
|
123
|
+
// The period spend limit is enforced atomically at recording time
|
|
124
|
+
// (`onSponsored` → `SponsoredTransactions.reserve`); a check here
|
|
125
|
+
// would be a check-then-act race a burst could slip through.
|
|
126
|
+
return true;
|
|
63
127
|
},
|
|
64
128
|
onSponsored: async (event) => {
|
|
65
129
|
if (!attribution)
|
|
66
130
|
return;
|
|
67
|
-
|
|
131
|
+
const mainnet = Viem.isMainnet(event.chainId);
|
|
132
|
+
// Defense in depth: `validate` already refuses non-production
|
|
133
|
+
// mainnet, so reaching here with that pair is a wiring bug.
|
|
134
|
+
if (mainnet && attribution.environment !== 'production')
|
|
135
|
+
throw new RpcResponse.InvalidParamsError({ message: 'Sponsorship rejected.' });
|
|
136
|
+
// The cap recomputes from canonical envelope bytes, mirroring the
|
|
137
|
+
// reconciliation convention; pending rows charge it to spend limits.
|
|
138
|
+
const feeMax = Fees.maxOf(Transaction.deserialize(event.transaction));
|
|
139
|
+
const db = Db.get(c.get('db'));
|
|
140
|
+
const feeToken = (() => {
|
|
141
|
+
try {
|
|
142
|
+
return event.feeToken !== undefined ? TokenId.toAddress(event.feeToken) : undefined;
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
})();
|
|
148
|
+
const currency = feeToken
|
|
149
|
+
? (await VerifiedTokens.read(Db.get(c.get('dbCached')), event.chainId))?.byAddress
|
|
150
|
+
.get(feeToken.toLowerCase())
|
|
151
|
+
?.currency.toLowerCase()
|
|
152
|
+
: undefined;
|
|
153
|
+
const input = {
|
|
68
154
|
apiKeyId: attribution.apiKeyId,
|
|
69
155
|
billable: attribution.environment === 'production',
|
|
70
156
|
chainId: event.chainId,
|
|
@@ -73,9 +159,31 @@ function middleware(options = {}) {
|
|
|
73
159
|
projectId: attribution.projectId,
|
|
74
160
|
signPayload: event.signPayload,
|
|
75
161
|
transaction: event.transaction,
|
|
76
|
-
...(
|
|
162
|
+
...(currency ? { currency } : {}),
|
|
163
|
+
...(feeMax !== undefined ? { feeMax: feeMax.toString() } : {}),
|
|
164
|
+
...(feeToken ? { feeToken } : {}),
|
|
77
165
|
...(event.transactionHash ? { transactionHash: event.transactionHash } : {}),
|
|
78
|
-
}
|
|
166
|
+
};
|
|
167
|
+
// Re-read settings on the authoritative path: the limit may have
|
|
168
|
+
// changed since `validate`, and only mainnet spend is limited.
|
|
169
|
+
const settings = mainnet ? await BillingSettings.get(db, attribution.orgId) : undefined;
|
|
170
|
+
if (settings?.spendLimit == null)
|
|
171
|
+
return void (await SponsoredTransactions.upsert(db, input)); // prettier-ignore
|
|
172
|
+
try {
|
|
173
|
+
await SponsoredTransactions.reserve(db, input, {
|
|
174
|
+
chainIds: [Viem.chainId.mainnet],
|
|
175
|
+
max: Billing.toBaseUnits(settings.spendLimit),
|
|
176
|
+
since: Billing.periodStart(settings.period),
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
if (error instanceof SponsoredTransactions.PeriodSpendLimitError)
|
|
181
|
+
throw new RpcResponse.InvalidParamsError({
|
|
182
|
+
data: { code: 'spend_limit_exceeded' },
|
|
183
|
+
message: 'Spend limit exceeded.',
|
|
184
|
+
});
|
|
185
|
+
throw error;
|
|
186
|
+
}
|
|
79
187
|
},
|
|
80
188
|
};
|
|
81
189
|
})();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../../src/apps/relay/App.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../../src/apps/relay/App.ts"],"names":[],"mappings":"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"}
|