tapimo 0.5.3 → 0.7.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/dist/App.d.ts +15830 -7220
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +9 -1
- package/dist/App.js.map +1 -1
- package/dist/Scope.d.ts +4 -0
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +5 -0
- package/dist/Scope.js.map +1 -1
- package/dist/admin/App.d.ts +1011 -412
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/App.js +4 -0
- package/dist/admin/App.js.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +2 -1
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/early-access.d.ts +148 -0
- package/dist/admin/apps/early-access.d.ts.map +1 -0
- package/dist/admin/apps/early-access.js +133 -0
- package/dist/admin/apps/early-access.js.map +1 -0
- package/dist/admin/apps/organizations.d.ts +124 -1
- package/dist/admin/apps/organizations.d.ts.map +1 -1
- package/dist/admin/apps/organizations.js +97 -6
- package/dist/admin/apps/organizations.js.map +1 -1
- package/dist/admin/apps/verified-tokens.d.ts +526 -1
- package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
- package/dist/admin/apps/verified-tokens.js +214 -1
- package/dist/admin/apps/verified-tokens.js.map +1 -1
- package/dist/admin/ui.generated.d.ts +1 -1
- package/dist/admin/ui.generated.d.ts.map +1 -1
- package/dist/admin/ui.generated.js +95 -75
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/analytics/Analytics.d.ts.map +1 -1
- package/dist/analytics/Analytics.js +20 -0
- package/dist/analytics/Analytics.js.map +1 -1
- package/dist/analytics/tables/requestEvents.d.ts +18 -0
- package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
- package/dist/analytics/tables/requestEvents.js +36 -7
- package/dist/analytics/tables/requestEvents.js.map +1 -1
- package/dist/apps/data/App.d.ts +6260 -4924
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/App.js +11 -6
- package/dist/apps/data/App.js.map +1 -1
- package/dist/apps/data/FundingQuoteProviders.d.ts +34 -1
- package/dist/apps/data/FundingQuoteProviders.d.ts.map +1 -1
- package/dist/apps/data/FundingQuoteProviders.js +194 -16
- package/dist/apps/data/FundingQuoteProviders.js.map +1 -1
- package/dist/apps/data/FxOracle.d.ts +71 -0
- package/dist/apps/data/FxOracle.d.ts.map +1 -0
- package/dist/apps/data/FxOracle.js +97 -0
- package/dist/apps/data/FxOracle.js.map +1 -0
- package/dist/apps/data/index.d.ts +1 -0
- package/dist/apps/data/index.d.ts.map +1 -1
- package/dist/apps/data/index.js +1 -0
- package/dist/apps/data/index.js.map +1 -1
- package/dist/apps/data/routes/activities.d.ts +3599 -1382
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +250 -88
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +872 -251
- package/dist/apps/data/routes/addresses.d.ts.map +1 -1
- package/dist/apps/data/routes/addresses.js +11 -9
- package/dist/apps/data/routes/addresses.js.map +1 -1
- package/dist/apps/data/routes/balances.d.ts +77 -26
- package/dist/apps/data/routes/balances.d.ts.map +1 -1
- package/dist/apps/data/routes/balances.js +88 -45
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/blocks.d.ts +39 -39
- package/dist/apps/data/routes/coingecko.d.ts +54 -54
- package/dist/apps/data/routes/exchanges.d.ts +856 -105
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +518 -76
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts +81 -67
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +76 -91
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/funding.d.ts +80 -36
- package/dist/apps/data/routes/funding.d.ts.map +1 -1
- package/dist/apps/data/routes/funding.js +65 -31
- package/dist/apps/data/routes/funding.js.map +1 -1
- package/dist/apps/data/routes/receipts.d.ts +392 -315
- package/dist/apps/data/routes/receipts.d.ts.map +1 -1
- package/dist/apps/data/routes/receipts.js +152 -77
- package/dist/apps/data/routes/receipts.js.map +1 -1
- package/dist/apps/data/routes/tokens.d.ts +167 -174
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +15 -13
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +277 -536
- package/dist/apps/data/routes/transactions.d.ts.map +1 -1
- package/dist/apps/data/routes/transactions.js +96 -77
- package/dist/apps/data/routes/transactions.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +157 -81
- package/dist/apps/data/routes/transfers.d.ts.map +1 -1
- package/dist/apps/data/routes/transfers.js +272 -130
- package/dist/apps/data/routes/transfers.js.map +1 -1
- package/dist/apps/data/routes/valuation.d.ts +307 -0
- package/dist/apps/data/routes/valuation.d.ts.map +1 -0
- package/dist/apps/data/routes/valuation.js +292 -0
- package/dist/apps/data/routes/valuation.js.map +1 -0
- package/dist/apps/data/routes/verified-tokens.d.ts +36 -36
- package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/verified-tokens.js +7 -5
- package/dist/apps/data/routes/verified-tokens.js.map +1 -1
- package/dist/apps/data/routes/webhooks.d.ts +103 -123
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +124 -25
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/index.d.ts +2 -1
- package/dist/apps/index.d.ts.map +1 -1
- package/dist/apps/index.js +2 -1
- package/dist/apps/index.js.map +1 -1
- package/dist/apps/management/App.d.ts +8554 -1692
- package/dist/apps/management/App.d.ts.map +1 -1
- package/dist/apps/management/App.js +12 -1
- package/dist/apps/management/App.js.map +1 -1
- package/dist/apps/management/routes/api-keys.d.ts +7 -0
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +17 -3
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +157 -162
- package/dist/apps/management/routes/billing.d.ts.map +1 -1
- package/dist/apps/management/routes/billing.js +31 -23
- package/dist/apps/management/routes/billing.js.map +1 -1
- package/dist/apps/management/routes/faucet.d.ts +232 -0
- package/dist/apps/management/routes/faucet.d.ts.map +1 -0
- package/dist/apps/management/routes/faucet.js +154 -0
- package/dist/apps/management/routes/faucet.js.map +1 -0
- package/dist/apps/management/routes/invitations.d.ts +60 -60
- package/dist/apps/management/routes/invite-links.d.ts +49 -20
- package/dist/apps/management/routes/invite-links.d.ts.map +1 -1
- package/dist/apps/management/routes/invite-links.js +26 -1
- package/dist/apps/management/routes/invite-links.js.map +1 -1
- package/dist/apps/management/routes/me.d.ts +6 -6
- package/dist/apps/management/routes/members.d.ts +6 -6
- package/dist/apps/management/routes/orgs.d.ts +42 -42
- package/dist/apps/management/routes/orgs.d.ts.map +1 -1
- package/dist/apps/management/routes/orgs.js +5 -0
- package/dist/apps/management/routes/orgs.js.map +1 -1
- package/dist/apps/management/routes/projects.d.ts +44 -44
- package/dist/apps/management/routes/usage.d.ts +3 -0
- package/dist/apps/management/routes/usage.d.ts.map +1 -1
- package/dist/apps/management/routes/usage.js +4 -0
- package/dist/apps/management/routes/usage.js.map +1 -1
- package/dist/apps/management/routes/verified-token-requests.d.ts +697 -0
- package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -0
- package/dist/apps/management/routes/verified-token-requests.js +271 -0
- package/dist/apps/management/routes/verified-token-requests.js.map +1 -0
- package/dist/apps/management/routes/webhooks.d.ts +6977 -0
- package/dist/apps/management/routes/webhooks.d.ts.map +1 -0
- package/dist/apps/management/routes/webhooks.js +573 -0
- package/dist/apps/management/routes/webhooks.js.map +1 -0
- package/dist/apps/mpp/App.d.ts +363 -0
- package/dist/apps/mpp/App.d.ts.map +1 -0
- package/dist/apps/mpp/App.js +72 -0
- package/dist/apps/mpp/App.js.map +1 -0
- package/dist/apps/mpp/Mpp.d.ts +178 -0
- package/dist/apps/mpp/Mpp.d.ts.map +1 -0
- package/dist/apps/mpp/Mpp.js +183 -0
- package/dist/apps/mpp/Mpp.js.map +1 -0
- package/dist/apps/mpp/index.d.ts +3 -0
- package/dist/apps/mpp/index.d.ts.map +1 -0
- package/dist/apps/mpp/index.js +3 -0
- package/dist/apps/mpp/index.js.map +1 -0
- package/dist/apps/relay/App.d.ts.map +1 -1
- package/dist/apps/relay/App.js +56 -9
- package/dist/apps/relay/App.js.map +1 -1
- package/dist/db/Db.d.ts +6 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +110 -0
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +53 -0
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +56 -0
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/earlyAccess.d.ts +50 -0
- package/dist/db/tables/earlyAccess.d.ts.map +1 -0
- package/dist/db/tables/earlyAccess.js +63 -0
- package/dist/db/tables/earlyAccess.js.map +1 -0
- package/dist/db/tables/enabledBillingSources.d.ts +73 -0
- package/dist/db/tables/enabledBillingSources.d.ts.map +1 -0
- package/dist/db/tables/enabledBillingSources.js +69 -0
- package/dist/db/tables/enabledBillingSources.js.map +1 -0
- package/dist/db/tables/invitations.d.ts.map +1 -1
- package/dist/db/tables/invitations.js +3 -0
- package/dist/db/tables/invitations.js.map +1 -1
- package/dist/db/tables/inviteLinks.d.ts +10 -2
- package/dist/db/tables/inviteLinks.d.ts.map +1 -1
- package/dist/db/tables/inviteLinks.js +10 -1
- package/dist/db/tables/inviteLinks.js.map +1 -1
- package/dist/db/tables/organizations.d.ts +5 -2
- package/dist/db/tables/organizations.d.ts.map +1 -1
- package/dist/db/tables/organizations.js +13 -2
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/sponsoredTransactions.d.ts +2 -0
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +2 -0
- package/dist/db/tables/sponsoredTransactions.js.map +1 -1
- package/dist/db/tables/verifiedTokenRequests.d.ts +94 -0
- package/dist/db/tables/verifiedTokenRequests.d.ts.map +1 -0
- package/dist/db/tables/verifiedTokenRequests.js +120 -0
- package/dist/db/tables/verifiedTokenRequests.js.map +1 -0
- package/dist/db/tables/webhookSubscriptions.d.ts +14 -0
- package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
- package/dist/db/tables/webhookSubscriptions.js +16 -0
- package/dist/db/tables/webhookSubscriptions.js.map +1 -1
- package/dist/handlers/internal/utils.d.ts +1 -16
- package/dist/handlers/internal/utils.d.ts.map +1 -1
- package/dist/handlers/internal/utils.js +17 -6
- package/dist/handlers/internal/utils.js.map +1 -1
- package/dist/handlers/relay.d.ts.map +1 -1
- package/dist/handlers/relay.js +37 -5
- package/dist/handlers/relay.js.map +1 -1
- package/dist/internal/Auth.d.ts +11 -2
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +14 -47
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/FundingQuotes.d.ts +147 -47
- package/dist/internal/FundingQuotes.d.ts.map +1 -1
- package/dist/internal/FundingQuotes.js +119 -33
- package/dist/internal/FundingQuotes.js.map +1 -1
- package/dist/internal/Log.d.ts +37 -5
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +52 -3
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/MetricSink.d.ts.map +1 -1
- package/dist/internal/MetricSink.js +24 -0
- package/dist/internal/MetricSink.js.map +1 -1
- package/dist/internal/OpenApi.d.ts +2 -2
- package/dist/internal/OpenApi.d.ts.map +1 -1
- package/dist/internal/OpenApi.js +3 -0
- package/dist/internal/OpenApi.js.map +1 -1
- package/dist/internal/Response.d.ts +2 -2
- package/dist/internal/Response.d.ts.map +1 -1
- package/dist/internal/Response.js +12 -4
- package/dist/internal/Response.js.map +1 -1
- package/dist/internal/Schema.d.ts +14 -5
- package/dist/internal/Schema.d.ts.map +1 -1
- package/dist/internal/Schema.js +23 -5
- package/dist/internal/Schema.js.map +1 -1
- package/dist/internal/Value.d.ts +18 -0
- package/dist/internal/Value.d.ts.map +1 -1
- package/dist/internal/Value.js +11 -1
- package/dist/internal/Value.js.map +1 -1
- package/dist/internal/VerifiedTokens.d.ts.map +1 -1
- package/dist/internal/VerifiedTokens.js +10 -1
- package/dist/internal/VerifiedTokens.js.map +1 -1
- package/dist/internal/Webhooks.d.ts +24 -3
- package/dist/internal/Webhooks.d.ts.map +1 -1
- package/dist/internal/Webhooks.js +34 -8
- package/dist/internal/Webhooks.js.map +1 -1
- package/package.json +7 -2
- package/src/App.test.ts +9 -4
- package/src/App.ts +23 -3
- package/src/Client.test-d.ts +733 -20
- package/src/Scope.ts +5 -0
- package/src/admin/App.test.ts +4 -0
- package/src/admin/App.ts +4 -0
- package/src/admin/apps/early-access.test.ts +125 -0
- package/src/admin/apps/early-access.ts +176 -0
- package/src/admin/apps/organizations.test.ts +86 -2
- package/src/admin/apps/organizations.ts +155 -31
- package/src/admin/apps/scopes.test.ts +5 -0
- package/src/admin/apps/verified-tokens.test.ts +201 -0
- package/src/admin/apps/verified-tokens.ts +532 -286
- package/src/admin/ui/plugin.ts +2 -1
- package/src/admin/ui/src/lib/early-access.ts +63 -0
- package/src/admin/ui/src/lib/organizations.test.ts +81 -1
- package/src/admin/ui/src/lib/organizations.ts +92 -0
- package/src/admin/ui/src/lib/verified-tokens.ts +79 -0
- package/src/admin/ui/src/routeTree.gen.ts +33 -2
- package/src/admin/ui/src/routes/__root.tsx +2 -1
- package/src/admin/ui/src/routes/api-keys.tsx +1 -1
- package/src/admin/ui/src/routes/early-access.tsx +162 -0
- package/src/admin/ui/src/routes/organizations_.$orgId.tsx +103 -0
- package/src/admin/ui/src/routes/verified-tokens.tsx +230 -19
- package/src/admin/ui.generated.ts +95 -94
- package/src/analytics/Analytics.test.ts +83 -0
- package/src/analytics/Analytics.ts +20 -0
- package/src/analytics/tables/requestEvents.ts +60 -7
- package/src/apps/composition.test.ts +11 -2
- package/src/apps/data/App.test.ts +1 -1
- package/src/apps/data/App.ts +22 -14
- package/src/apps/data/FundingQuoteProviders.test.ts +297 -4
- package/src/apps/data/FundingQuoteProviders.ts +255 -29
- package/src/apps/data/FxOracle.test.ts +118 -0
- package/src/apps/data/FxOracle.ts +153 -0
- package/src/apps/data/index.ts +1 -0
- package/src/apps/data/routes/activities.test.ts +177 -3
- package/src/apps/data/routes/activities.ts +441 -132
- package/src/apps/data/routes/addresses.ts +19 -9
- package/src/apps/data/routes/balances.test.ts +148 -11
- package/src/apps/data/routes/balances.ts +140 -51
- package/src/apps/data/routes/exchanges.test.ts +544 -9
- package/src/apps/data/routes/exchanges.ts +690 -103
- package/src/apps/data/routes/fee-amm.test.ts +47 -23
- package/src/apps/data/routes/fee-amm.ts +98 -119
- package/src/apps/data/routes/funding.test.ts +113 -8
- package/src/apps/data/routes/funding.ts +77 -51
- package/src/apps/data/routes/receipts.test.ts +129 -23
- package/src/apps/data/routes/receipts.ts +205 -100
- package/src/apps/data/routes/tokens.test.ts +43 -0
- package/src/apps/data/routes/tokens.ts +28 -13
- package/src/apps/data/routes/transactions.test.ts +72 -19
- package/src/apps/data/routes/transactions.ts +162 -92
- package/src/apps/data/routes/transfers.test.ts +341 -31
- package/src/apps/data/routes/transfers.ts +358 -158
- package/src/apps/data/routes/valuation.test.ts +437 -0
- package/src/apps/data/routes/valuation.ts +423 -0
- package/src/apps/data/routes/verified-tokens.ts +14 -2
- package/src/apps/data/routes/webhooks.test.ts +56 -8
- package/src/apps/data/routes/webhooks.ts +144 -27
- package/src/apps/index.ts +2 -1
- package/src/apps/management/App.ts +13 -0
- package/src/apps/management/routes/api-keys.test.ts +14 -0
- package/src/apps/management/routes/api-keys.ts +27 -3
- package/src/apps/management/routes/billing.test.ts +152 -20
- package/src/apps/management/routes/billing.ts +34 -18
- package/src/apps/management/routes/faucet.test.ts +87 -0
- package/src/apps/management/routes/faucet.ts +201 -0
- package/src/apps/management/routes/invite-links.test.ts +117 -0
- package/src/apps/management/routes/invite-links.ts +43 -1
- package/src/apps/management/routes/me.test.ts +9 -99
- package/src/apps/management/routes/orgs.test.ts +45 -2
- package/src/apps/management/routes/orgs.ts +6 -0
- package/src/apps/management/routes/scopes.test.ts +1 -0
- package/src/apps/management/routes/usage.test.ts +6 -0
- package/src/apps/management/routes/usage.ts +7 -0
- package/src/apps/management/routes/verified-token-requests.test.ts +377 -0
- package/src/apps/management/routes/verified-token-requests.ts +397 -0
- package/src/apps/management/routes/webhooks.test.ts +426 -0
- package/src/apps/management/routes/webhooks.ts +672 -0
- package/src/apps/mpp/App.ts +86 -0
- package/src/apps/mpp/Mpp.test.ts +193 -0
- package/src/apps/mpp/Mpp.ts +353 -0
- package/src/apps/mpp/index.ts +2 -0
- package/src/apps/mpp/internal/Adapter.ts +11 -0
- package/src/apps/mpp/internal/Error.ts +9 -0
- package/src/apps/mpp/internal/Idempotency.ts +7 -0
- package/src/apps/mpp/internal/Screening.ts +10 -0
- package/src/apps/relay/App.test.ts +88 -6
- package/src/apps/relay/App.ts +61 -9
- package/src/db/Db.test.ts +19 -0
- package/src/db/Db.ts +125 -0
- package/src/db/Schema.ts +68 -0
- package/src/db/tables/earlyAccess.ts +86 -0
- package/src/db/tables/enabledBillingSources.test.ts +303 -0
- package/src/db/tables/enabledBillingSources.ts +118 -0
- package/src/db/tables/invitations.ts +3 -0
- package/src/db/tables/inviteLinks.ts +22 -3
- package/src/db/tables/organizations.test.ts +103 -0
- package/src/db/tables/organizations.ts +18 -2
- package/src/db/tables/sponsoredTransactions.ts +4 -0
- package/src/db/tables/verifiedTokenRequests.test.ts +200 -0
- package/src/db/tables/verifiedTokenRequests.ts +182 -0
- package/src/db/tables/webhookSubscriptions.ts +31 -0
- package/src/handlers/internal/utils.ts +22 -6
- package/src/handlers/relay.errors.test.ts +153 -0
- package/src/handlers/relay.ts +42 -7
- package/src/internal/Auth.test.ts +3 -3
- package/src/internal/Auth.ts +15 -47
- package/src/internal/FundingQuotes.test.ts +161 -6
- package/src/internal/FundingQuotes.ts +141 -39
- package/src/internal/Log.test-d.ts +21 -0
- package/src/internal/Log.test.ts +141 -0
- package/src/internal/Log.ts +93 -6
- package/src/internal/MetricSink.test.ts +215 -0
- package/src/internal/MetricSink.ts +24 -0
- package/src/internal/OpenApi.ts +3 -0
- package/src/internal/Response.test.ts +28 -0
- package/src/internal/Response.ts +12 -4
- package/src/internal/Schema.ts +50 -5
- package/src/internal/Value.test.ts +20 -0
- package/src/internal/Value.ts +24 -1
- package/src/internal/VerifiedTokens.ts +9 -1
- package/src/internal/Webhooks.test.ts +140 -0
- package/src/internal/Webhooks.ts +53 -9
|
@@ -21,7 +21,7 @@ import * as Receipts from './receipts.js'
|
|
|
21
21
|
import * as Transactions from './transactions.js'
|
|
22
22
|
import * as Transfers from './transfers.js'
|
|
23
23
|
|
|
24
|
-
/** Default cap on
|
|
24
|
+
/** Default cap on live subscriptions per owner, overridable via `webhook.maxPerOwner`. */
|
|
25
25
|
const defaultMaxPerOwner = 100
|
|
26
26
|
|
|
27
27
|
/**
|
|
@@ -1317,10 +1317,13 @@ export function webhooks(options: webhooks.Options = {}) {
|
|
|
1317
1317
|
responses: OpenApi.responses({
|
|
1318
1318
|
errors: {
|
|
1319
1319
|
400: {
|
|
1320
|
-
codes: ['chain_id_unsupported'],
|
|
1321
|
-
description: '
|
|
1320
|
+
codes: ['body_invalid', 'chain_id_unsupported', 'filters_invalid', 'url_invalid'],
|
|
1321
|
+
description: 'The request, destination, filters, or chain are invalid.',
|
|
1322
|
+
},
|
|
1323
|
+
403: {
|
|
1324
|
+
codes: ['limit_exceeded'],
|
|
1325
|
+
description: 'You have reached the webhook subscription limit.',
|
|
1322
1326
|
},
|
|
1323
|
-
403: 'You have reached the webhook subscription limit.',
|
|
1324
1327
|
},
|
|
1325
1328
|
success: {
|
|
1326
1329
|
description:
|
|
@@ -1347,12 +1350,9 @@ export function webhooks(options: webhooks.Options = {}) {
|
|
|
1347
1350
|
|
|
1348
1351
|
const body = c.req.valid('json')
|
|
1349
1352
|
const chainId = body.chainId ?? c.get('chainId')
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
message: 'Webhook subscriptions do not support Zone chains.',
|
|
1354
|
-
status: 400,
|
|
1355
|
-
})
|
|
1353
|
+
const supportedChainIds = new Set(webhook.supportedChainIds)
|
|
1354
|
+
if (!supportedChainIds.has(chainId))
|
|
1355
|
+
return Response.unsupportedChainId(c, chainId, supportedChainIds)
|
|
1356
1356
|
|
|
1357
1357
|
try {
|
|
1358
1358
|
const subscription = await Webhooks.createSubscription(
|
|
@@ -1373,7 +1373,7 @@ export function webhooks(options: webhooks.Options = {}) {
|
|
|
1373
1373
|
200,
|
|
1374
1374
|
)
|
|
1375
1375
|
} catch (cause) {
|
|
1376
|
-
return
|
|
1376
|
+
return createMutationError(c, cause)
|
|
1377
1377
|
}
|
|
1378
1378
|
},
|
|
1379
1379
|
)
|
|
@@ -1747,6 +1747,16 @@ export function webhooks(options: webhooks.Options = {}) {
|
|
|
1747
1747
|
operationId: 'updateWebhook',
|
|
1748
1748
|
responses: OpenApi.responses({
|
|
1749
1749
|
errors: {
|
|
1750
|
+
400: {
|
|
1751
|
+
codes: [
|
|
1752
|
+
'body_invalid',
|
|
1753
|
+
'destination_transition_invalid',
|
|
1754
|
+
'filters_invalid',
|
|
1755
|
+
'param_invalid',
|
|
1756
|
+
'url_invalid',
|
|
1757
|
+
],
|
|
1758
|
+
description: 'The update, destination, or filters are invalid.',
|
|
1759
|
+
},
|
|
1750
1760
|
404: {
|
|
1751
1761
|
description: 'No webhook subscription was found for that ID.',
|
|
1752
1762
|
codes: ['webhook_not_found'],
|
|
@@ -1798,7 +1808,7 @@ export function webhooks(options: webhooks.Options = {}) {
|
|
|
1798
1808
|
200,
|
|
1799
1809
|
)
|
|
1800
1810
|
} catch (cause) {
|
|
1801
|
-
return
|
|
1811
|
+
return updateMutationError(c, cause)
|
|
1802
1812
|
}
|
|
1803
1813
|
},
|
|
1804
1814
|
)
|
|
@@ -1987,13 +1997,14 @@ export async function poll(options: poll.Options): Promise<poll.Result> {
|
|
|
1987
1997
|
let accepted: readonly [number, number] | undefined
|
|
1988
1998
|
let failed = false
|
|
1989
1999
|
for (const item of page.items) {
|
|
1990
|
-
//
|
|
1991
|
-
//
|
|
1992
|
-
// payloads) can render `amount` in token units. Non-fatal on failure.
|
|
2000
|
+
// Token metadata is best-effort for webhooks: transfers use it for display,
|
|
2001
|
+
// while transactions expose fee-token references without blocking delivery.
|
|
1993
2002
|
const data =
|
|
1994
2003
|
eventType === 'token:transfer'
|
|
1995
2004
|
? await withTokenMetadata(item.data, { cache: cache_metadata, chainId, client })
|
|
1996
|
-
:
|
|
2005
|
+
: eventType === 'transaction:included'
|
|
2006
|
+
? await withFeeTokenMetadata(item.data, { cache: cache_metadata, chainId, client })
|
|
2007
|
+
: item.data
|
|
1997
2008
|
const envelope = Webhooks.buildEnvelope({
|
|
1998
2009
|
blockNumber: item.cursor[0],
|
|
1999
2010
|
createdAt: now(),
|
|
@@ -2106,27 +2117,45 @@ async function withTokenMetadata(
|
|
|
2106
2117
|
const address = (data as Record<string, unknown>)['address']
|
|
2107
2118
|
if (typeof address !== 'string') return data
|
|
2108
2119
|
const token = await resolveTokenMetadata(address, deps)
|
|
2109
|
-
return token
|
|
2120
|
+
return token
|
|
2121
|
+
? {
|
|
2122
|
+
...(data as Record<string, unknown>),
|
|
2123
|
+
token: { decimals: token.decimals, symbol: token.symbol },
|
|
2124
|
+
}
|
|
2125
|
+
: data
|
|
2126
|
+
}
|
|
2127
|
+
|
|
2128
|
+
/** Core RPC metadata needed by a humanized token reference. */
|
|
2129
|
+
type TokenMetadata = {
|
|
2130
|
+
currency: string
|
|
2131
|
+
decimals: number
|
|
2132
|
+
name: string
|
|
2133
|
+
symbol: string
|
|
2110
2134
|
}
|
|
2111
2135
|
|
|
2112
2136
|
/**
|
|
2113
|
-
* Resolves
|
|
2137
|
+
* Resolves core token metadata via `token.getMetadata`, memoized per
|
|
2114
2138
|
* `(chainId, address)` with a short TTL so a busy transfer stream shares one RPC
|
|
2115
|
-
* lookup per token. Returns `undefined` on any failure
|
|
2139
|
+
* lookup per token. Returns `undefined` on any failure; metadata is a rendering
|
|
2116
2140
|
* nicety, never a delivery blocker.
|
|
2117
2141
|
*/
|
|
2118
2142
|
async function resolveTokenMetadata(
|
|
2119
2143
|
address: string,
|
|
2120
2144
|
deps: { cache: Store.Store; chainId: number; client: Viem.getClient.ReturnType },
|
|
2121
|
-
): Promise<
|
|
2145
|
+
): Promise<TokenMetadata | undefined> {
|
|
2122
2146
|
try {
|
|
2123
2147
|
return await Store.memoize(
|
|
2124
2148
|
async () => {
|
|
2125
2149
|
const meta = await deps.client.token.getMetadata({ token: address as `0x${string}` })
|
|
2126
|
-
return {
|
|
2150
|
+
return {
|
|
2151
|
+
currency: meta.currency,
|
|
2152
|
+
decimals: meta.decimals,
|
|
2153
|
+
name: meta.name,
|
|
2154
|
+
symbol: meta.symbol,
|
|
2155
|
+
}
|
|
2127
2156
|
},
|
|
2128
2157
|
{
|
|
2129
|
-
key: `webhook:token-meta:
|
|
2158
|
+
key: `webhook:token-meta:v2:${deps.chainId}:${address}`,
|
|
2130
2159
|
store: deps.cache,
|
|
2131
2160
|
ttl: Ttl.minutes(5),
|
|
2132
2161
|
},
|
|
@@ -2137,6 +2166,69 @@ async function resolveTokenMetadata(
|
|
|
2137
2166
|
}
|
|
2138
2167
|
}
|
|
2139
2168
|
|
|
2169
|
+
/** Returns the address from an unenriched or enriched fee-token value. */
|
|
2170
|
+
function feeTokenAddress(value: unknown) {
|
|
2171
|
+
if (typeof value === 'string') return value
|
|
2172
|
+
if (typeof value !== 'object' || value === null) return undefined
|
|
2173
|
+
const address = (value as Record<string, unknown>)['address']
|
|
2174
|
+
return typeof address === 'string' ? address : undefined
|
|
2175
|
+
}
|
|
2176
|
+
|
|
2177
|
+
/** Replaces an address-valued fee token with its resolved reference, or omits it on failure. */
|
|
2178
|
+
function withResolvedFeeToken(data: Record<string, unknown>, metadata: Map<string, TokenMetadata>) {
|
|
2179
|
+
const address = feeTokenAddress(data['feeToken'])
|
|
2180
|
+
if (!address) return data
|
|
2181
|
+
const result = { ...data }
|
|
2182
|
+
delete result['feeToken']
|
|
2183
|
+
const token = metadata.get(address.toLowerCase())
|
|
2184
|
+
if (token) result['feeToken'] = { address, ...token }
|
|
2185
|
+
return result
|
|
2186
|
+
}
|
|
2187
|
+
|
|
2188
|
+
/** Adds best-effort fee-token references to a transaction and its embedded receipt. */
|
|
2189
|
+
async function withFeeTokenMetadata(
|
|
2190
|
+
data: unknown,
|
|
2191
|
+
deps: {
|
|
2192
|
+
cache: Store.Store
|
|
2193
|
+
chainId: number
|
|
2194
|
+
client: Viem.getClient.ReturnType
|
|
2195
|
+
},
|
|
2196
|
+
): Promise<unknown> {
|
|
2197
|
+
if (typeof data !== 'object' || data === null) return data
|
|
2198
|
+
const transaction = data as Record<string, unknown>
|
|
2199
|
+
const meta = transaction['meta']
|
|
2200
|
+
const receipt =
|
|
2201
|
+
typeof meta === 'object' && meta !== null
|
|
2202
|
+
? (meta as Record<string, unknown>)['receipt']
|
|
2203
|
+
: undefined
|
|
2204
|
+
const addresses = new Set<string>()
|
|
2205
|
+
const transactionAddress = feeTokenAddress(transaction['feeToken'])
|
|
2206
|
+
if (transactionAddress) addresses.add(transactionAddress.toLowerCase())
|
|
2207
|
+
if (typeof receipt === 'object' && receipt !== null) {
|
|
2208
|
+
const receiptAddress = feeTokenAddress((receipt as Record<string, unknown>)['feeToken'])
|
|
2209
|
+
if (receiptAddress) addresses.add(receiptAddress.toLowerCase())
|
|
2210
|
+
}
|
|
2211
|
+
if (addresses.size === 0) return data
|
|
2212
|
+
|
|
2213
|
+
const resolved = await Promise.all(
|
|
2214
|
+
[...addresses].map(
|
|
2215
|
+
async (address) => [address, await resolveTokenMetadata(address, deps)] as const,
|
|
2216
|
+
),
|
|
2217
|
+
)
|
|
2218
|
+
const metadata = new Map(
|
|
2219
|
+
resolved.filter((entry): entry is readonly [string, TokenMetadata] => entry[1] !== undefined),
|
|
2220
|
+
)
|
|
2221
|
+
const result = withResolvedFeeToken(transaction, metadata)
|
|
2222
|
+
if (typeof receipt !== 'object' || receipt === null) return result
|
|
2223
|
+
return {
|
|
2224
|
+
...result,
|
|
2225
|
+
meta: {
|
|
2226
|
+
...(meta as Record<string, unknown>),
|
|
2227
|
+
receipt: withResolvedFeeToken(receipt as Record<string, unknown>, metadata),
|
|
2228
|
+
},
|
|
2229
|
+
}
|
|
2230
|
+
}
|
|
2231
|
+
|
|
2140
2232
|
/** Returns the live RPC head block number for the chain. */
|
|
2141
2233
|
export async function getRpcHead(client: Viem.getClient.ReturnType): Promise<number> {
|
|
2142
2234
|
return Number(await client.getBlockNumber())
|
|
@@ -2883,8 +2975,8 @@ const txFields = {
|
|
|
2883
2975
|
* Scans included transactions over the confirmed window. Each block is fetched
|
|
2884
2976
|
* with full transactions via `eth_getBlockByNumber(n, true)`; receipts are
|
|
2885
2977
|
* fetched lazily (only when a `status`/`gasUsed`/`feePayer` filter needs them).
|
|
2886
|
-
* The delivered payload
|
|
2887
|
-
*
|
|
2978
|
+
* The delivered payload starts from `Transactions.humanizeTransaction`; the
|
|
2979
|
+
* poller then resolves its fee-token references.
|
|
2888
2980
|
*/
|
|
2889
2981
|
async function scanTxs(options: {
|
|
2890
2982
|
cache: ChainCache
|
|
@@ -2921,13 +3013,19 @@ async function scanTxs(options: {
|
|
|
2921
3013
|
if (!matchesTx(tx, f, includeCalls, receipt, timestamp, n)) continue
|
|
2922
3014
|
const parsed = Transactions.schema.Rpc.Transaction.safeParse(tx)
|
|
2923
3015
|
if (!parsed.success) continue
|
|
2924
|
-
let data = Transactions.humanizeTransaction(parsed.data)
|
|
3016
|
+
let data: Record<string, unknown> = Transactions.humanizeTransaction(parsed.data)
|
|
2925
3017
|
// Embed the humanized receipt under `meta.receipt`, matching the read
|
|
2926
3018
|
// endpoint's `include=receipt` shape so `data` stays a valid envelope.
|
|
2927
3019
|
if (includeReceipt && receipt) {
|
|
2928
3020
|
const r = Receipts.schema.Rpc.Receipt.safeParse(receipt)
|
|
2929
3021
|
if (r.success)
|
|
2930
|
-
data = {
|
|
3022
|
+
data = {
|
|
3023
|
+
...data,
|
|
3024
|
+
meta: {
|
|
3025
|
+
...(data['meta'] as Record<string, unknown>),
|
|
3026
|
+
receipt: Receipts.humanizeReceipt(r.data),
|
|
3027
|
+
},
|
|
3028
|
+
}
|
|
2931
3029
|
}
|
|
2932
3030
|
items.push({ cursor: [n, index], data })
|
|
2933
3031
|
}
|
|
@@ -3040,7 +3138,7 @@ function redactDestination(destination: WebhookDestination.Destination) {
|
|
|
3040
3138
|
return destination
|
|
3041
3139
|
}
|
|
3042
3140
|
|
|
3043
|
-
function
|
|
3141
|
+
function createMutationError(c: Context<App.Environment>, cause: unknown) {
|
|
3044
3142
|
if (cause instanceof Webhooks.InvalidUrlError)
|
|
3045
3143
|
return Response.error(c, { code: 'url_invalid', message: cause.message, status: 400 })
|
|
3046
3144
|
if (cause instanceof Webhooks.InvalidFilterError)
|
|
@@ -3055,6 +3153,25 @@ function mutationError(c: Context<App.Environment>, cause: unknown) {
|
|
|
3055
3153
|
return Response.upstream(c, cause)
|
|
3056
3154
|
}
|
|
3057
3155
|
|
|
3156
|
+
function updateMutationError(c: Context<App.Environment>, cause: unknown) {
|
|
3157
|
+
if (cause instanceof Webhooks.InvalidDestinationTransitionError)
|
|
3158
|
+
return Response.error(c, {
|
|
3159
|
+
code: 'destination_transition_invalid',
|
|
3160
|
+
message: cause.message,
|
|
3161
|
+
status: 400,
|
|
3162
|
+
})
|
|
3163
|
+
if (cause instanceof Webhooks.InvalidUrlError)
|
|
3164
|
+
return Response.error(c, { code: 'url_invalid', message: cause.message, status: 400 })
|
|
3165
|
+
if (cause instanceof Webhooks.InvalidFilterError)
|
|
3166
|
+
return Response.error(c, {
|
|
3167
|
+
code: 'filters_invalid',
|
|
3168
|
+
details: cause.details,
|
|
3169
|
+
message: cause.message,
|
|
3170
|
+
status: 400,
|
|
3171
|
+
})
|
|
3172
|
+
return Response.upstream(c, cause)
|
|
3173
|
+
}
|
|
3174
|
+
|
|
3058
3175
|
function notFound(c: Context<App.Environment>) {
|
|
3059
3176
|
return Response.error(c, {
|
|
3060
3177
|
code: 'webhook_not_found',
|
package/src/apps/index.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { data, FundingQuoteProviders } from './data/index.js'
|
|
1
|
+
export { data, FundingQuoteProviders, FxOracle } from './data/index.js'
|
|
2
2
|
export { management } from './management/index.js'
|
|
3
3
|
export { mcp } from './mcp.js'
|
|
4
|
+
export { mpp } from './mpp/index.js'
|
|
4
5
|
export { relay } from './relay/index.js'
|
|
@@ -6,6 +6,7 @@ import * as Metadata from '../metadata.js'
|
|
|
6
6
|
|
|
7
7
|
import { apiKeys } from './routes/api-keys.js'
|
|
8
8
|
import { billing } from './routes/billing.js'
|
|
9
|
+
import { faucet } from './routes/faucet.js'
|
|
9
10
|
import { invitations } from './routes/invitations.js'
|
|
10
11
|
import { inviteLinks } from './routes/invite-links.js'
|
|
11
12
|
import { me } from './routes/me.js'
|
|
@@ -14,6 +15,8 @@ import { orgs } from './routes/orgs.js'
|
|
|
14
15
|
import { projects } from './routes/projects.js'
|
|
15
16
|
import { scopes } from './routes/scopes.js'
|
|
16
17
|
import { usage } from './routes/usage.js'
|
|
18
|
+
import { verifiedTokenRequests } from './routes/verified-token-requests.js'
|
|
19
|
+
import { webhooks } from './routes/webhooks.js'
|
|
17
20
|
|
|
18
21
|
/**
|
|
19
22
|
* Minimal transactional email sender. Cloudflare deployments wrap the Email
|
|
@@ -105,6 +108,7 @@ export function management(options: management.Options = {}) {
|
|
|
105
108
|
})
|
|
106
109
|
.route('/', apiKeys({ enabled: options.apiKeys !== false }))
|
|
107
110
|
.route('/', billing())
|
|
111
|
+
.route('/', faucet())
|
|
108
112
|
.route('/', invitations())
|
|
109
113
|
.route('/', inviteLinks())
|
|
110
114
|
.route('/', me())
|
|
@@ -113,6 +117,8 @@ export function management(options: management.Options = {}) {
|
|
|
113
117
|
.route('/', projects())
|
|
114
118
|
.route('/', scopes())
|
|
115
119
|
.route('/', usage())
|
|
120
|
+
.route('/', verifiedTokenRequests())
|
|
121
|
+
.route('/', webhooks({ webhook: options.webhook === false ? undefined : options.webhook }))
|
|
116
122
|
return Metadata.attach(app, openapi)
|
|
117
123
|
}
|
|
118
124
|
|
|
@@ -125,6 +131,8 @@ export declare namespace management {
|
|
|
125
131
|
billing?: Billing | undefined
|
|
126
132
|
/** Transactional email sender for management emails (e.g. invitations); omit to disable dispatch — notified flows still work in-product. */
|
|
127
133
|
email?: Email | undefined
|
|
134
|
+
/** Webhook capability shared with the data group and host poller; omit or pass false to disable management. */
|
|
135
|
+
webhook?: App.Webhook | false | undefined
|
|
128
136
|
}
|
|
129
137
|
}
|
|
130
138
|
|
|
@@ -145,6 +153,7 @@ const openapi = {
|
|
|
145
153
|
tags: [
|
|
146
154
|
{ name: 'API Keys', description: 'Credentials for accessing the Tempo API.' },
|
|
147
155
|
{ name: 'Billing', description: 'Organization billing backed by Stripe.' },
|
|
156
|
+
{ name: 'Faucet', description: 'Test token funding for Tempo testnet accounts.' },
|
|
148
157
|
{ name: 'Invitations', description: 'Pending organization invitations.' },
|
|
149
158
|
{ name: 'Invite Links', description: 'Reusable organization invite links.' },
|
|
150
159
|
{ name: 'Members', description: 'Organization team membership.' },
|
|
@@ -152,6 +161,8 @@ const openapi = {
|
|
|
152
161
|
{ name: 'Projects', description: 'Application workspaces within an organization.' },
|
|
153
162
|
{ name: 'Usage', description: 'Request and sponsorship usage for organizations.' },
|
|
154
163
|
{ name: 'Users', description: 'Users on the Tempo Platform.' },
|
|
164
|
+
{ name: 'Verified Token Requests', description: 'Organization requests to add tokens to the curated verified list.' }, // prettier-ignore
|
|
165
|
+
{ name: 'Webhooks', description: 'Organization webhook subscriptions.' },
|
|
155
166
|
],
|
|
156
167
|
'x-tagGroups': [
|
|
157
168
|
{
|
|
@@ -167,6 +178,8 @@ const openapi = {
|
|
|
167
178
|
'Projects',
|
|
168
179
|
'Usage',
|
|
169
180
|
'Users',
|
|
181
|
+
'Verified Token Requests',
|
|
182
|
+
'Webhooks',
|
|
170
183
|
],
|
|
171
184
|
},
|
|
172
185
|
],
|
|
@@ -671,3 +671,17 @@ describe('keys', () => {
|
|
|
671
671
|
expect(response.status).toBe(403)
|
|
672
672
|
})
|
|
673
673
|
})
|
|
674
|
+
|
|
675
|
+
describe('early access', () => {
|
|
676
|
+
test('does not require an early-access grant', async () => {
|
|
677
|
+
const app = createApp()
|
|
678
|
+
const cookie = await session(app)
|
|
679
|
+
const { org, project } = await fixture(app, cookie)
|
|
680
|
+
|
|
681
|
+
const minted = await app.request(
|
|
682
|
+
`/v1/orgs/${org.id}/projects/${project.id}/api-keys`,
|
|
683
|
+
json('POST', cookie, { scopes: ['data:read'] }),
|
|
684
|
+
)
|
|
685
|
+
expect(minted.status).toBe(200)
|
|
686
|
+
})
|
|
687
|
+
})
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { type Context, Hono } from 'hono'
|
|
2
2
|
import * as z from 'zod/mini'
|
|
3
3
|
|
|
4
|
+
import * as Analytics from '../../../analytics/Analytics.js'
|
|
5
|
+
import * as RequestEvents from '../../../analytics/tables/requestEvents.js'
|
|
4
6
|
import * as ApiKeys from '../../../ApiKeys.js'
|
|
5
7
|
import type * as App from '../../../App.js'
|
|
6
8
|
import * as Db from '../../../db/Db.js'
|
|
@@ -43,6 +45,12 @@ export namespace schema {
|
|
|
43
45
|
z.describe('Opaque key id (`key_…`).'),
|
|
44
46
|
z.meta({ examples: ['key_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
|
|
45
47
|
),
|
|
48
|
+
lastUsedAt: z
|
|
49
|
+
.optional(z.string())
|
|
50
|
+
.check(
|
|
51
|
+
z.describe('When the key last authenticated a request (ISO 8601).'),
|
|
52
|
+
z.meta({ examples: ['2026-07-21T12:34:56.000Z'] }),
|
|
53
|
+
),
|
|
46
54
|
name: z
|
|
47
55
|
.optional(z.string())
|
|
48
56
|
.check(z.describe('Human-readable key name.'), z.meta({ examples: ['CI'] })),
|
|
@@ -374,7 +382,7 @@ export function apiKeys(options: apiKeys.Options = {}) {
|
|
|
374
382
|
})
|
|
375
383
|
return c.json(
|
|
376
384
|
Response.validated(schema.listApiKeys.Response, {
|
|
377
|
-
data: records
|
|
385
|
+
data: await serializeKeys(c, records),
|
|
378
386
|
}),
|
|
379
387
|
200,
|
|
380
388
|
)
|
|
@@ -435,7 +443,7 @@ export function apiKeys(options: apiKeys.Options = {}) {
|
|
|
435
443
|
})
|
|
436
444
|
return c.json(
|
|
437
445
|
Response.validated(schema.listOrgApiKeys.Response, {
|
|
438
|
-
data: records
|
|
446
|
+
data: await serializeKeys(c, records),
|
|
439
447
|
}),
|
|
440
448
|
200,
|
|
441
449
|
)
|
|
@@ -505,14 +513,30 @@ export declare namespace apiKeys {
|
|
|
505
513
|
}
|
|
506
514
|
}
|
|
507
515
|
|
|
516
|
+
/** Enriches key records with their latest authenticated request timestamp. */
|
|
517
|
+
async function serializeKeys(c: Context<App.Environment>, records: readonly ApiKeys.Record[]) {
|
|
518
|
+
const source = c.get('analytics')
|
|
519
|
+
if (!source || records.length === 0) return records.map((record) => serializeKey(record))
|
|
520
|
+
const lastUsedAt = new Map(
|
|
521
|
+
(
|
|
522
|
+
await RequestEvents.readLastUsedAt(
|
|
523
|
+
Analytics.get(source),
|
|
524
|
+
records.map(({ id }) => id),
|
|
525
|
+
)
|
|
526
|
+
).map((usage) => [usage.apiKeyId, usage.lastUsedAt]),
|
|
527
|
+
)
|
|
528
|
+
return records.map((record) => serializeKey(record, lastUsedAt.get(record.id)))
|
|
529
|
+
}
|
|
530
|
+
|
|
508
531
|
/** Projects a persisted record onto the management key shape (no rate limits, no token). */
|
|
509
|
-
function serializeKey(record: ApiKeys.Record) {
|
|
532
|
+
function serializeKey(record: ApiKeys.Record, lastUsedAt?: string) {
|
|
510
533
|
return {
|
|
511
534
|
createdAt: record.createdAt,
|
|
512
535
|
...(record.createdBy === undefined ? {} : { createdBy: record.createdBy }),
|
|
513
536
|
environment: record.environment,
|
|
514
537
|
...(record.expiresAt === undefined ? {} : { expiresAt: record.expiresAt }),
|
|
515
538
|
id: record.id,
|
|
539
|
+
...(lastUsedAt === undefined ? {} : { lastUsedAt }),
|
|
516
540
|
...(record.name === undefined ? {} : { name: record.name }),
|
|
517
541
|
orgId: record.orgId,
|
|
518
542
|
...(record.projectId === undefined ? {} : { projectId: record.projectId }),
|