tapimo 0.0.0 → 0.0.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/LICENSE +21 -0
- package/README.md +119 -0
- package/dist/ApiKey.d.ts +65 -0
- package/dist/ApiKey.d.ts.map +1 -0
- package/dist/ApiKey.js +105 -0
- package/dist/ApiKey.js.map +1 -0
- package/dist/ApiKeySource.d.ts +166 -0
- package/dist/ApiKeySource.d.ts.map +1 -0
- package/dist/ApiKeySource.js +234 -0
- package/dist/ApiKeySource.js.map +1 -0
- package/dist/App.d.ts +19317 -0
- package/dist/App.d.ts.map +1 -0
- package/dist/App.js +612 -0
- package/dist/App.js.map +1 -0
- package/dist/Assets.d.ts +44 -0
- package/dist/Assets.d.ts.map +1 -0
- package/dist/Assets.js +23 -0
- package/dist/Assets.js.map +1 -0
- package/dist/Auth.d.ts +2 -0
- package/dist/Auth.d.ts.map +1 -0
- package/dist/Auth.js +2 -0
- package/dist/Auth.js.map +1 -0
- package/dist/Cli.d.ts +21 -0
- package/dist/Cli.d.ts.map +1 -0
- package/dist/Cli.js +13 -0
- package/dist/Cli.js.map +1 -0
- package/dist/Client.d.ts +20 -0
- package/dist/Client.d.ts.map +1 -0
- package/dist/Client.js +24 -0
- package/dist/Client.js.map +1 -0
- package/dist/Metrics.d.ts +70 -0
- package/dist/Metrics.d.ts.map +1 -0
- package/dist/Metrics.js +91 -0
- package/dist/Metrics.js.map +1 -0
- package/dist/Scope.d.ts +35 -0
- package/dist/Scope.d.ts.map +1 -0
- package/dist/Scope.js +38 -0
- package/dist/Scope.js.map +1 -0
- package/dist/Webhooks.d.ts +79 -0
- package/dist/Webhooks.d.ts.map +1 -0
- package/dist/Webhooks.js +107 -0
- package/dist/Webhooks.js.map +1 -0
- package/dist/admin/Access.d.ts +41 -0
- package/dist/admin/Access.d.ts.map +1 -0
- package/dist/admin/Access.js +75 -0
- package/dist/admin/Access.js.map +1 -0
- package/dist/admin/App.d.ts +1221 -0
- package/dist/admin/App.d.ts.map +1 -0
- package/dist/admin/App.js +113 -0
- package/dist/admin/App.js.map +1 -0
- package/dist/admin/apps/api-keys.d.ts +209 -0
- package/dist/admin/apps/api-keys.d.ts.map +1 -0
- package/dist/admin/apps/api-keys.js +129 -0
- package/dist/admin/apps/api-keys.js.map +1 -0
- package/dist/admin/apps/scopes.d.ts +46 -0
- package/dist/admin/apps/scopes.d.ts.map +1 -0
- package/dist/admin/apps/scopes.js +41 -0
- package/dist/admin/apps/scopes.js.map +1 -0
- package/dist/admin/apps/verified-tokens.d.ts +1206 -0
- package/dist/admin/apps/verified-tokens.d.ts.map +1 -0
- package/dist/admin/apps/verified-tokens.js +485 -0
- package/dist/admin/apps/verified-tokens.js.map +1 -0
- package/dist/admin/index.d.ts +3 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +3 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/ui.generated.d.ts +11 -0
- package/dist/admin/ui.generated.d.ts.map +1 -0
- package/dist/admin/ui.generated.js +43 -0
- package/dist/admin/ui.generated.js.map +1 -0
- package/dist/apps/activities.d.ts +18725 -0
- package/dist/apps/activities.d.ts.map +1 -0
- package/dist/apps/activities.js +3138 -0
- package/dist/apps/activities.js.map +1 -0
- package/dist/apps/addresses.d.ts +3662 -0
- package/dist/apps/addresses.d.ts.map +1 -0
- package/dist/apps/addresses.js +22 -0
- package/dist/apps/addresses.js.map +1 -0
- package/dist/apps/balances.d.ts +342 -0
- package/dist/apps/balances.d.ts.map +1 -0
- package/dist/apps/balances.js +393 -0
- package/dist/apps/balances.js.map +1 -0
- package/dist/apps/blocks.d.ts +931 -0
- package/dist/apps/blocks.d.ts.map +1 -0
- package/dist/apps/blocks.js +689 -0
- package/dist/apps/blocks.js.map +1 -0
- package/dist/apps/coingecko.d.ts +1053 -0
- package/dist/apps/coingecko.d.ts.map +1 -0
- package/dist/apps/coingecko.js +1015 -0
- package/dist/apps/coingecko.js.map +1 -0
- package/dist/apps/exchanges.d.ts +3000 -0
- package/dist/apps/exchanges.d.ts.map +1 -0
- package/dist/apps/exchanges.js +3570 -0
- package/dist/apps/exchanges.js.map +1 -0
- package/dist/apps/fee-amm.d.ts +640 -0
- package/dist/apps/fee-amm.d.ts.map +1 -0
- package/dist/apps/fee-amm.js +815 -0
- package/dist/apps/fee-amm.js.map +1 -0
- package/dist/apps/indexer.d.ts +116 -0
- package/dist/apps/indexer.d.ts.map +1 -0
- package/dist/apps/indexer.js +270 -0
- package/dist/apps/indexer.js.map +1 -0
- package/dist/apps/receipts.d.ts +1438 -0
- package/dist/apps/receipts.d.ts.map +1 -0
- package/dist/apps/receipts.js +874 -0
- package/dist/apps/receipts.js.map +1 -0
- package/dist/apps/rpc.d.ts +173 -0
- package/dist/apps/rpc.d.ts.map +1 -0
- package/dist/apps/rpc.js +191 -0
- package/dist/apps/rpc.js.map +1 -0
- package/dist/apps/tokenlist.d.ts +192 -0
- package/dist/apps/tokenlist.d.ts.map +1 -0
- package/dist/apps/tokenlist.js +153 -0
- package/dist/apps/tokenlist.js.map +1 -0
- package/dist/apps/tokens.d.ts +2246 -0
- package/dist/apps/tokens.d.ts.map +1 -0
- package/dist/apps/tokens.js +1789 -0
- package/dist/apps/tokens.js.map +1 -0
- package/dist/apps/transactions.d.ts +2327 -0
- package/dist/apps/transactions.d.ts.map +1 -0
- package/dist/apps/transactions.js +975 -0
- package/dist/apps/transactions.js.map +1 -0
- package/dist/apps/transfers.d.ts +589 -0
- package/dist/apps/transfers.d.ts.map +1 -0
- package/dist/apps/transfers.js +769 -0
- package/dist/apps/transfers.js.map +1 -0
- package/dist/apps/verified-tokens.d.ts +544 -0
- package/dist/apps/verified-tokens.d.ts.map +1 -0
- package/dist/apps/verified-tokens.js +234 -0
- package/dist/apps/verified-tokens.js.map +1 -0
- package/dist/apps/webhooks.d.ts +7684 -0
- package/dist/apps/webhooks.d.ts.map +1 -0
- package/dist/apps/webhooks.js +2112 -0
- package/dist/apps/webhooks.js.map +1 -0
- package/dist/cloudflare.d.ts +32 -0
- package/dist/cloudflare.d.ts.map +1 -0
- package/dist/cloudflare.js +45 -0
- package/dist/cloudflare.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/Auth.d.ts +298 -0
- package/dist/internal/Auth.d.ts.map +1 -0
- package/dist/internal/Auth.js +618 -0
- package/dist/internal/Auth.js.map +1 -0
- package/dist/internal/Cache.d.ts +74 -0
- package/dist/internal/Cache.d.ts.map +1 -0
- package/dist/internal/Cache.js +215 -0
- package/dist/internal/Cache.js.map +1 -0
- package/dist/internal/Cursor.d.ts +79 -0
- package/dist/internal/Cursor.d.ts.map +1 -0
- package/dist/internal/Cursor.js +116 -0
- package/dist/internal/Cursor.js.map +1 -0
- package/dist/internal/EdgeCache.d.ts +59 -0
- package/dist/internal/EdgeCache.d.ts.map +1 -0
- package/dist/internal/EdgeCache.js +174 -0
- package/dist/internal/EdgeCache.js.map +1 -0
- package/dist/internal/Log.d.ts +104 -0
- package/dist/internal/Log.d.ts.map +1 -0
- package/dist/internal/Log.js +118 -0
- package/dist/internal/Log.js.map +1 -0
- package/dist/internal/MetricSink.d.ts +65 -0
- package/dist/internal/MetricSink.d.ts.map +1 -0
- package/dist/internal/MetricSink.js +146 -0
- package/dist/internal/MetricSink.js.map +1 -0
- package/dist/internal/Mpp.d.ts +71 -0
- package/dist/internal/Mpp.d.ts.map +1 -0
- package/dist/internal/Mpp.js +105 -0
- package/dist/internal/Mpp.js.map +1 -0
- package/dist/internal/OpenApi.d.ts +313 -0
- package/dist/internal/OpenApi.d.ts.map +1 -0
- package/dist/internal/OpenApi.fonts.d.ts +2 -0
- package/dist/internal/OpenApi.fonts.d.ts.map +1 -0
- package/dist/internal/OpenApi.fonts.js +39 -0
- package/dist/internal/OpenApi.fonts.js.map +1 -0
- package/dist/internal/OpenApi.js +335 -0
- package/dist/internal/OpenApi.js.map +1 -0
- package/dist/internal/OpenApi.logo.d.ts +6 -0
- package/dist/internal/OpenApi.logo.d.ts.map +1 -0
- package/dist/internal/OpenApi.logo.js +19 -0
- package/dist/internal/OpenApi.logo.js.map +1 -0
- package/dist/internal/Path.d.ts +5 -0
- package/dist/internal/Path.d.ts.map +1 -0
- package/dist/internal/Path.js +16 -0
- package/dist/internal/Path.js.map +1 -0
- package/dist/internal/RateLimit.d.ts +60 -0
- package/dist/internal/RateLimit.d.ts.map +1 -0
- package/dist/internal/RateLimit.js +48 -0
- package/dist/internal/RateLimit.js.map +1 -0
- package/dist/internal/Response.d.ts +132 -0
- package/dist/internal/Response.d.ts.map +1 -0
- package/dist/internal/Response.js +72 -0
- package/dist/internal/Response.js.map +1 -0
- package/dist/internal/Schema.d.ts +257 -0
- package/dist/internal/Schema.d.ts.map +1 -0
- package/dist/internal/Schema.js +360 -0
- package/dist/internal/Schema.js.map +1 -0
- package/dist/internal/Store.d.ts +204 -0
- package/dist/internal/Store.d.ts.map +1 -0
- package/dist/internal/Store.js +291 -0
- package/dist/internal/Store.js.map +1 -0
- package/dist/internal/Tidx.d.ts +120 -0
- package/dist/internal/Tidx.d.ts.map +1 -0
- package/dist/internal/Tidx.js +156 -0
- package/dist/internal/Tidx.js.map +1 -0
- package/dist/internal/Timing.d.ts +22 -0
- package/dist/internal/Timing.d.ts.map +1 -0
- package/dist/internal/Timing.js +32 -0
- package/dist/internal/Timing.js.map +1 -0
- package/dist/internal/Ttl.d.ts +25 -0
- package/dist/internal/Ttl.d.ts.map +1 -0
- package/dist/internal/Ttl.js +49 -0
- package/dist/internal/Ttl.js.map +1 -0
- package/dist/internal/Value.d.ts +47 -0
- package/dist/internal/Value.d.ts.map +1 -0
- package/dist/internal/Value.js +122 -0
- package/dist/internal/Value.js.map +1 -0
- package/dist/internal/VerifiedTokens.d.ts +228 -0
- package/dist/internal/VerifiedTokens.d.ts.map +1 -0
- package/dist/internal/VerifiedTokens.js +450 -0
- package/dist/internal/VerifiedTokens.js.map +1 -0
- package/dist/internal/Viem.d.ts +2082 -0
- package/dist/internal/Viem.d.ts.map +1 -0
- package/dist/internal/Viem.js +63 -0
- package/dist/internal/Viem.js.map +1 -0
- package/dist/internal/WebhookDestination.d.ts +198 -0
- package/dist/internal/WebhookDestination.d.ts.map +1 -0
- package/dist/internal/WebhookDestination.js +170 -0
- package/dist/internal/WebhookDestination.js.map +1 -0
- package/dist/internal/Webhooks.d.ts +433 -0
- package/dist/internal/Webhooks.d.ts.map +1 -0
- package/dist/internal/Webhooks.js +489 -0
- package/dist/internal/Webhooks.js.map +1 -0
- package/dist/internal/webhookDestinations/betterStack.d.ts +26 -0
- package/dist/internal/webhookDestinations/betterStack.d.ts.map +1 -0
- package/dist/internal/webhookDestinations/betterStack.js +76 -0
- package/dist/internal/webhookDestinations/betterStack.js.map +1 -0
- package/dist/internal/webhookDestinations/slack.d.ts +59 -0
- package/dist/internal/webhookDestinations/slack.d.ts.map +1 -0
- package/dist/internal/webhookDestinations/slack.js +422 -0
- package/dist/internal/webhookDestinations/slack.js.map +1 -0
- package/dist/internal/webhookDestinations/url.d.ts +17 -0
- package/dist/internal/webhookDestinations/url.d.ts.map +1 -0
- package/dist/internal/webhookDestinations/url.js +130 -0
- package/dist/internal/webhookDestinations/url.js.map +1 -0
- package/dist/openrpc.json +5302 -0
- package/package.json +46 -4
- package/seeds/31318/icons/0x20c0000000000000000000000000000000000000.svg +1 -0
- package/seeds/31318/icons/0x20c0000000000000000000000000000000000001.svg +1 -0
- package/seeds/31318/icons/0x20c0000000000000000000000000000000000002.svg +1 -0
- package/seeds/31318/icons/0x20c0000000000000000000000000000000000003.svg +1 -0
- package/seeds/31318/verified-tokens.json +30 -0
- package/seeds/4217/icons/0x20c0000000000000000000000000000000000000.svg +25 -0
- package/seeds/4217/icons/0x20c000000000000000000000048c8f36df1c9a4a.svg +1 -0
- package/seeds/4217/icons/0x20c0000000000000000000000520792dcccccccc.svg +1 -0
- package/seeds/4217/icons/0x20c0000000000000000000000a6da882d075a4c3.svg +4 -0
- package/seeds/4217/icons/0x20c000000000000000000000111111111e910f0f.svg +30 -0
- package/seeds/4217/icons/0x20c00000000000000000000014f22ca97301eb73.svg +1 -0
- package/seeds/4217/icons/0x20c0000000000000000000001621e21f71cf12fb.svg +1 -0
- package/seeds/4217/icons/0x20c0000000000000000000002f52d5cc21a3207b.svg +1 -0
- package/seeds/4217/icons/0x20c0000000000000000000003158081efd85bfc2.svg +11 -0
- package/seeds/4217/icons/0x20c0000000000000000000003554d28269e0f3c2.svg +1 -0
- package/seeds/4217/icons/0x20c000000000000000000000383a23bacb546ab9.svg +1 -0
- package/seeds/4217/icons/0x20c00000000000000000000042109aef2f8b28e1.png +0 -0
- package/seeds/4217/icons/0x20c0000000000000000000005c0bac7cef389a11.svg +1 -0
- package/seeds/4217/icons/0x20c0000000000000000000006fd9a167923ba194.png +0 -0
- package/seeds/4217/icons/0x20c0000000000000000000007f7ba549dd0251b9.svg +1 -0
- package/seeds/4217/icons/0x20c0000000000000000000008191667423f70e67.svg +5 -0
- package/seeds/4217/icons/0x20c0000000000000000000008ee4fcff88888888.svg +1 -0
- package/seeds/4217/icons/0x20c0000000000000000000009a4a4b17e0dc6651.svg +1 -0
- package/seeds/4217/icons/0x20c000000000000000000000ab02d39df30bd17e.svg +1 -0
- package/seeds/4217/icons/0x20c000000000000000000000ae247a1130450f09.svg +1 -0
- package/seeds/4217/icons/0x20c000000000000000000000aeed2ec36a54d0e5.svg +1 -0
- package/seeds/4217/icons/0x20c000000000000000000000b9537d11c60e8b50.svg +1 -0
- package/seeds/4217/icons/0x20c000000000000000000000bd95bfb69fbe6ce3.svg +1 -0
- package/seeds/4217/icons/0x20c000000000000000000000c412ec89d0c08be5.svg +1 -0
- package/seeds/4217/icons/0x20c000000000000000000000f047dd7018e50367.png +0 -0
- package/seeds/4217/verified-tokens.json +177 -0
- package/seeds/42431/icons/0x20c0000000000000000000000000000000000000.svg +25 -0
- package/seeds/42431/icons/0x20c0000000000000000000000000000000000001.svg +1 -0
- package/seeds/42431/icons/0x20c0000000000000000000000000000000000002.svg +1 -0
- package/seeds/42431/icons/0x20c0000000000000000000000000000000000003.svg +1 -0
- package/seeds/42431/icons/0x20c0000000000000000000009e8d7eb59b783726.svg +1 -0
- package/seeds/42431/icons/0x20c000000000000000000000d72572838bbee59c.svg +1 -0
- package/seeds/42431/verified-tokens.json +44 -0
- package/seeds/openrpc/README.md +27 -0
- package/seeds/openrpc/execution-apis.json +8989 -0
- package/src/ApiKey.test.ts +91 -0
- package/src/ApiKey.ts +122 -0
- package/src/ApiKeySource.test-d.ts +11 -0
- package/src/ApiKeySource.test.ts +295 -0
- package/src/ApiKeySource.ts +303 -0
- package/src/App.test-d.ts +38 -0
- package/src/App.test.ts +65927 -0
- package/src/App.ts +855 -0
- package/src/Assets.ts +58 -0
- package/src/Auth.ts +1 -0
- package/src/Cli.test.ts +81 -0
- package/src/Cli.ts +38 -0
- package/src/Client.test-d.ts +1438 -0
- package/src/Client.test.ts +134 -0
- package/src/Client.ts +45 -0
- package/src/Metrics.ts +154 -0
- package/src/Scope.ts +50 -0
- package/src/Webhooks.test.ts +49 -0
- package/src/Webhooks.ts +172 -0
- package/src/admin/Access.test.ts +130 -0
- package/src/admin/Access.ts +87 -0
- package/src/admin/App.test.ts +225 -0
- package/src/admin/App.ts +216 -0
- package/src/admin/apps/api-keys.test.ts +156 -0
- package/src/admin/apps/api-keys.ts +157 -0
- package/src/admin/apps/scopes.test.ts +52 -0
- package/src/admin/apps/scopes.ts +47 -0
- package/src/admin/apps/verified-tokens.test.ts +415 -0
- package/src/admin/apps/verified-tokens.ts +566 -0
- package/src/admin/index.ts +2 -0
- package/src/admin/ui/plugin.ts +135 -0
- package/src/admin/ui/src/components/Checkbox.tsx +22 -0
- package/src/admin/ui/src/components/Dialog.tsx +32 -0
- package/src/admin/ui/src/components/MobileProfile.tsx +31 -0
- package/src/admin/ui/src/components/Page.tsx +53 -0
- package/src/admin/ui/src/components/TempoLogo.tsx +37 -0
- package/src/admin/ui/src/fonts/Pilat-Demi.woff2 +0 -0
- package/src/admin/ui/src/fonts/Pilat-Regular.woff2 +0 -0
- package/src/admin/ui/src/lib/api-keys.ts +63 -0
- package/src/admin/ui/src/lib/client.ts +15 -0
- package/src/admin/ui/src/lib/config.ts +57 -0
- package/src/admin/ui/src/lib/query-client.ts +26 -0
- package/src/admin/ui/src/lib/scopes.ts +25 -0
- package/src/admin/ui/src/lib/verified-tokens.ts +89 -0
- package/src/admin/ui/src/lib/wagmi.ts +18 -0
- package/src/admin/ui/src/routeTree.gen.ts +104 -0
- package/src/admin/ui/src/router.tsx +25 -0
- package/src/admin/ui/src/routes/__root.tsx +219 -0
- package/src/admin/ui/src/routes/api-keys.tsx +329 -0
- package/src/admin/ui/src/routes/index.tsx +7 -0
- package/src/admin/ui/src/routes/verified-tokens.tsx +331 -0
- package/src/admin/ui/src/styles.css +20 -0
- package/src/admin/ui/tsconfig.json +16 -0
- package/src/admin/ui/vite.config.ts +29 -0
- package/src/admin/ui.generated.ts +60 -0
- package/src/apps/activities.test.ts +1020 -0
- package/src/apps/activities.ts +3934 -0
- package/src/apps/addresses.ts +24 -0
- package/src/apps/balances.test.ts +274 -0
- package/src/apps/balances.ts +533 -0
- package/src/apps/blocks.test.ts +385 -0
- package/src/apps/blocks.ts +896 -0
- package/src/apps/coingecko.test.ts +218 -0
- package/src/apps/coingecko.ts +1383 -0
- package/src/apps/exchanges.test.ts +958 -0
- package/src/apps/exchanges.ts +4773 -0
- package/src/apps/fee-amm.test.ts +321 -0
- package/src/apps/fee-amm.ts +1121 -0
- package/src/apps/indexer.test.ts +153 -0
- package/src/apps/indexer.ts +330 -0
- package/src/apps/receipts.test.ts +285 -0
- package/src/apps/receipts.ts +1193 -0
- package/src/apps/rpc.test.ts +302 -0
- package/src/apps/rpc.ts +222 -0
- package/src/apps/tokenlist.test.ts +80 -0
- package/src/apps/tokenlist.ts +207 -0
- package/src/apps/tokens.test.ts +1062 -0
- package/src/apps/tokens.ts +2292 -0
- package/src/apps/transactions.test.ts +408 -0
- package/src/apps/transactions.ts +1363 -0
- package/src/apps/transfers.test.ts +371 -0
- package/src/apps/transfers.ts +1116 -0
- package/src/apps/verified-tokens.test.ts +114 -0
- package/src/apps/verified-tokens.ts +295 -0
- package/src/apps/webhooks.test.ts +1937 -0
- package/src/apps/webhooks.ts +2926 -0
- package/src/cloudflare.ts +55 -0
- package/src/index.ts +15 -0
- package/src/internal/Auth.test.ts +980 -0
- package/src/internal/Auth.ts +1012 -0
- package/src/internal/Cache.test.ts +240 -0
- package/src/internal/Cache.ts +262 -0
- package/src/internal/Cursor.test.ts +100 -0
- package/src/internal/Cursor.ts +149 -0
- package/src/internal/EdgeCache.test.ts +234 -0
- package/src/internal/EdgeCache.ts +224 -0
- package/src/internal/Errors.ts +14 -0
- package/src/internal/Log.test.ts +244 -0
- package/src/internal/Log.ts +216 -0
- package/src/internal/MetricSink.ts +220 -0
- package/src/internal/Mpp.test.ts +64 -0
- package/src/internal/Mpp.ts +141 -0
- package/src/internal/OpenApi.fonts.ts +38 -0
- package/src/internal/OpenApi.logo.ts +18 -0
- package/src/internal/OpenApi.ts +488 -0
- package/src/internal/Path.test.ts +14 -0
- package/src/internal/Path.ts +15 -0
- package/src/internal/RateLimit.test.ts +93 -0
- package/src/internal/RateLimit.ts +93 -0
- package/src/internal/Response.ts +131 -0
- package/src/internal/Schema.test.ts +34 -0
- package/src/internal/Schema.ts +523 -0
- package/src/internal/Store.test.ts +545 -0
- package/src/internal/Store.ts +526 -0
- package/src/internal/Tidx.local.test.ts +33 -0
- package/src/internal/Tidx.test.ts +294 -0
- package/src/internal/Tidx.ts +238 -0
- package/src/internal/Timing.test.ts +22 -0
- package/src/internal/Timing.ts +62 -0
- package/src/internal/Ttl.test.ts +18 -0
- package/src/internal/Ttl.ts +59 -0
- package/src/internal/Value.ts +114 -0
- package/src/internal/VerifiedTokens.test.ts +333 -0
- package/src/internal/VerifiedTokens.ts +645 -0
- package/src/internal/Viem.test.ts +115 -0
- package/src/internal/Viem.ts +165 -0
- package/src/internal/WebhookDestination.test.ts +648 -0
- package/src/internal/WebhookDestination.ts +331 -0
- package/src/internal/Webhooks.test.ts +668 -0
- package/src/internal/Webhooks.ts +940 -0
- package/src/internal/webhookDestinations/betterStack.ts +91 -0
- package/src/internal/webhookDestinations/slack.ts +496 -0
- package/src/internal/webhookDestinations/url.ts +128 -0
- package/src/openrpc.json +5302 -0
package/dist/App.js
ADDED
|
@@ -0,0 +1,612 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { compress as hono_compress } from 'hono/compress';
|
|
3
|
+
import { cors as hono_cors } from 'hono/cors';
|
|
4
|
+
import { HTTPException } from 'hono/http-exception';
|
|
5
|
+
import { requestId } from 'hono/request-id';
|
|
6
|
+
import { generateSpecs } from 'hono-openapi';
|
|
7
|
+
import { Handler } from 'vocs/server';
|
|
8
|
+
import * as z from 'zod/mini';
|
|
9
|
+
import * as ApiKey from './ApiKey.js';
|
|
10
|
+
import * as Assets from './Assets.js';
|
|
11
|
+
import * as Auth from './internal/Auth.js';
|
|
12
|
+
import * as EdgeCache from './internal/EdgeCache.js';
|
|
13
|
+
import * as Log from './internal/Log.js';
|
|
14
|
+
import * as MetricSink from './internal/MetricSink.js';
|
|
15
|
+
import * as OpenApi from './internal/OpenApi.js';
|
|
16
|
+
import * as Store from './internal/Store.js';
|
|
17
|
+
import * as Path from './internal/Path.js';
|
|
18
|
+
import * as Response from './internal/Response.js';
|
|
19
|
+
import * as Schema from './internal/Schema.js';
|
|
20
|
+
import * as Tidx from './internal/Tidx.js';
|
|
21
|
+
import * as Timing from './internal/Timing.js';
|
|
22
|
+
import * as Viem from './internal/Viem.js';
|
|
23
|
+
import openrpcSpec from './openrpc.json' with { type: 'json' };
|
|
24
|
+
import { transactions as transactionActivities } from './apps/activities.js';
|
|
25
|
+
import { addresses } from './apps/addresses.js';
|
|
26
|
+
import { blocks, blocksByTimestampCompat } from './apps/blocks.js';
|
|
27
|
+
import { coingecko } from './apps/coingecko.js';
|
|
28
|
+
import { exchanges } from './apps/exchanges.js';
|
|
29
|
+
import { feeAmm } from './apps/fee-amm.js';
|
|
30
|
+
import { indexer } from './apps/indexer.js';
|
|
31
|
+
import { receipts } from './apps/receipts.js';
|
|
32
|
+
import { rpc as rpcApp } from './apps/rpc.js';
|
|
33
|
+
import { tokens } from './apps/tokens.js';
|
|
34
|
+
import { transactions } from './apps/transactions.js';
|
|
35
|
+
import { transfers } from './apps/transfers.js';
|
|
36
|
+
import { verifiedTokens } from './apps/verified-tokens.js';
|
|
37
|
+
import { tokenlist } from './apps/tokenlist.js';
|
|
38
|
+
import { schema as webhookSchema, webhooks } from './apps/webhooks.js';
|
|
39
|
+
/** Top-level OpenAPI `info.description`, rendered above the reference. */
|
|
40
|
+
const infoDescription = 'REST API for reading and interacting with Tempo';
|
|
41
|
+
/** Creates the Tempo API Hono app. */
|
|
42
|
+
export function create(options = {}) {
|
|
43
|
+
const { assets, defaultChainId = Viem.defaultChainId, path = '/', rpc } = options;
|
|
44
|
+
// Capture as the literal generic so `Hono.basePath(...)` preserves the
|
|
45
|
+
// typed prefix. testClient's `Client<T, ...>` inference collapses to a
|
|
46
|
+
// `Record<string, ...>` index signature when the BasePath generic is the
|
|
47
|
+
// unconstrained `string`, which strips per-route typing.
|
|
48
|
+
const basePath = Path.normalize(path);
|
|
49
|
+
// The cache store backs both caching layers: handler `memoize` (upstream
|
|
50
|
+
// RPC/indexer reads, keyed by data identity) and the edge response cache
|
|
51
|
+
// (whole responses, keyed by URL). Both are caches, not durable storage — a
|
|
52
|
+
// miss simply re-fetches — so it defaults to in-memory. Point it at a
|
|
53
|
+
// colo-local store (`Store.cache(caches.default)`) in production; never the
|
|
54
|
+
// Durable Object, or edge-cache hits re-incur the round-trip they skip.
|
|
55
|
+
// Authoritative state (webhooks) lives in its own state store, configured
|
|
56
|
+
// separately via `options.webhook.store` (a Durable Object in production).
|
|
57
|
+
const store = options.cache?.store ?? Store.memory();
|
|
58
|
+
// Memoize one viem client per resolved upstream. Clients are stateless HTTP
|
|
59
|
+
// transports, so reusing them avoids per-request construction cost. The cache
|
|
60
|
+
// key is the resolved output (`url` + `basicAuth` + `chainId`), not the
|
|
61
|
+
// principal, so a resolver `rpc` may branch on any principal field while
|
|
62
|
+
// client cardinality stays bounded by the number of distinct upstreams —
|
|
63
|
+
// callers that resolve to the same upstream share a client.
|
|
64
|
+
const clients = new Map();
|
|
65
|
+
const getClient = (chainId = defaultChainId, principal = null) => {
|
|
66
|
+
// Resolve to derive the cache key; `Viem.getClient` re-resolves to build the
|
|
67
|
+
// client on a miss. `resolve` is pure and cheap, so the extra call is free.
|
|
68
|
+
const { url, basicAuth } = Viem.resolve(rpc, { chainId, principal });
|
|
69
|
+
const cacheKey = `${url}|${basicAuth ?? ''}|${chainId}`;
|
|
70
|
+
const existing = clients.get(cacheKey);
|
|
71
|
+
if (existing)
|
|
72
|
+
return existing;
|
|
73
|
+
const client = Viem.getClient({ chainId, principal, rpc });
|
|
74
|
+
clients.set(cacheKey, client);
|
|
75
|
+
return client;
|
|
76
|
+
};
|
|
77
|
+
// Memoize TIDX clients per `chainId` so the base URL resolver runs once per
|
|
78
|
+
// chain instead of on every request. The same factory backs the scheduled
|
|
79
|
+
// webhook poller (`Webhooks.createPoller`), keeping client construction in
|
|
80
|
+
// one place.
|
|
81
|
+
const getTidx = Tidx.createGetClient({ defaultChainId, tidx: options.tidx });
|
|
82
|
+
// Build the app in two phases: register middleware imperatively, then chain
|
|
83
|
+
// route mounts so the merged Hono schema flows through the return type. The
|
|
84
|
+
// chained type is what makes `testClient(create())` produce typed path
|
|
85
|
+
// proxies in tests. `basePath` is typed as the literal `path` generic above,
|
|
86
|
+
// which keeps the merged schema keys typed (vs. the unconstrained `string`
|
|
87
|
+
// basePath that would collapse them to an index signature).
|
|
88
|
+
const base = new Hono().basePath(basePath);
|
|
89
|
+
if (options.cors !== false)
|
|
90
|
+
base.use('*', hono_cors(typeof options.cors === 'object' ? options.cors : undefined));
|
|
91
|
+
if (options.compress)
|
|
92
|
+
base.use('*', hono_compress(typeof options.compress === 'object' ? options.compress : undefined));
|
|
93
|
+
base.use('*', requestId({ headerName: 'tempo-request-id' }));
|
|
94
|
+
// One canonical structured log line per request, plus request metrics.
|
|
95
|
+
// Registered after `requestId` (the entry embeds it) and before the timing and
|
|
96
|
+
// edge-cache layers so the entry covers edge-cache hits and includes the
|
|
97
|
+
// Server-Timing metrics collected inside the request.
|
|
98
|
+
//
|
|
99
|
+
// Logging and metrics are separate concerns sharing one entry: `logger` emits
|
|
100
|
+
// the structured log line, the request metrics sink records HTTP series, and
|
|
101
|
+
// the optional `metrics.analytics` hook ships the full wide-event entry. The
|
|
102
|
+
// webhook poller/queue run outside this app, so they wire their own
|
|
103
|
+
// `MetricSink.webhooks` sink over the same backend.
|
|
104
|
+
// Wire the request (HTTP) metrics sink over the provided backend.
|
|
105
|
+
const recordRequest = options.metrics ? MetricSink.requests(options.metrics) : undefined;
|
|
106
|
+
// Per-request analytics hook (e.g. ClickHouse wide events), if the backend
|
|
107
|
+
// provides one. Its promise is returned from `emit` below so `Log.middleware`
|
|
108
|
+
// keeps it alive via `waitUntil` without holding the response open.
|
|
109
|
+
const recordAnalytics = options.metrics?.analytics;
|
|
110
|
+
// Resolve `logger` to a single emit sink: a custom function as-is, `true` to
|
|
111
|
+
// the level-matched console emit, a level string to that emit filtered to the
|
|
112
|
+
// level and above (e.g. `'warn'` drops successful-request info lines).
|
|
113
|
+
const log = (() => {
|
|
114
|
+
if (typeof options.logger === 'function')
|
|
115
|
+
return options.logger;
|
|
116
|
+
if (options.logger === true)
|
|
117
|
+
return Log.emit;
|
|
118
|
+
if (typeof options.logger === 'string')
|
|
119
|
+
return Log.withMinLevel(options.logger);
|
|
120
|
+
return undefined;
|
|
121
|
+
})();
|
|
122
|
+
if (log || recordRequest || recordAnalytics)
|
|
123
|
+
base.use('*', Log.middleware({
|
|
124
|
+
emit: (entry) => {
|
|
125
|
+
log?.(entry);
|
|
126
|
+
recordRequest?.(entry);
|
|
127
|
+
// Return the analytics promise so `Log.middleware` extends the
|
|
128
|
+
// response with `waitUntil`; otherwise the async sink's `queue.send`
|
|
129
|
+
// is a floating promise the Workers runtime cancels once the response
|
|
130
|
+
// is returned, and no analytics ever reach the sink.
|
|
131
|
+
return recordAnalytics?.(entry);
|
|
132
|
+
},
|
|
133
|
+
}));
|
|
134
|
+
// The chain ids this deployment serves: the built-in public chains plus the
|
|
135
|
+
// configured `defaultChainId` and any explicit `supportedChainIds`. Exposed on
|
|
136
|
+
// context so mounted apps with a path `chainId` (e.g. GeckoTerminal) can guard
|
|
137
|
+
// it too.
|
|
138
|
+
const supportedChainIds = new Set([
|
|
139
|
+
...Object.keys(Viem.url).map(Number),
|
|
140
|
+
...Object.keys(Tidx.url).map(Number),
|
|
141
|
+
defaultChainId,
|
|
142
|
+
...(options.supportedChainIds ?? []),
|
|
143
|
+
]);
|
|
144
|
+
base.use('*', Timing.middleware());
|
|
145
|
+
base.use('*', async (c, next) => {
|
|
146
|
+
// Put app-level dependencies on Hono context so mounted handlers only
|
|
147
|
+
// receive request-local state from `c`.
|
|
148
|
+
c.set('basePath', basePath);
|
|
149
|
+
c.set('chainId', defaultChainId);
|
|
150
|
+
c.set('getAsset', createGetAsset({ assets, basePath, origin: new URL(c.req.url).origin }));
|
|
151
|
+
c.set('getClient', (chainId) => getClient(chainId, Auth.getPrincipal(c)));
|
|
152
|
+
c.set('getTidx', (chainId) => getTidx(chainId, Auth.getPrincipal(c)));
|
|
153
|
+
c.set('rpc', rpc);
|
|
154
|
+
c.set('store', store);
|
|
155
|
+
c.set('supportedChainIds', supportedChainIds);
|
|
156
|
+
c.set('tidx', options.tidx);
|
|
157
|
+
c.set('verifiedTokens', options.verifiedTokens);
|
|
158
|
+
c.set('webhook', options.webhook);
|
|
159
|
+
await next();
|
|
160
|
+
});
|
|
161
|
+
// Reject a syntactically valid `chainId` this deployment does not serve before
|
|
162
|
+
// it reaches an upstream — an unknown chain otherwise hits the configured
|
|
163
|
+
// RPC/indexer (a static `tidx.baseUrl` answers for any chain id) and comes
|
|
164
|
+
// back as an opaque `upstream_error`.
|
|
165
|
+
base.use('*', async (c, next) => {
|
|
166
|
+
const raw = c.req.query('chainId') ?? c.req.query('chain_id');
|
|
167
|
+
if (raw === undefined)
|
|
168
|
+
return next();
|
|
169
|
+
// Only reject a well-formed-but-unsupported chain here; malformed values
|
|
170
|
+
// (e.g. `abc`, `0`) fall through to the route's own query validation.
|
|
171
|
+
const parsed = Schema.ChainId.safeParse(raw);
|
|
172
|
+
if (!parsed.success || supportedChainIds.has(parsed.data))
|
|
173
|
+
return next();
|
|
174
|
+
return Response.unsupportedChainId(c, parsed.data, supportedChainIds);
|
|
175
|
+
});
|
|
176
|
+
// Skip the static asset route entirely when no store is configured; token
|
|
177
|
+
// logo URIs simply go unresolved.
|
|
178
|
+
if (assets)
|
|
179
|
+
base.use('/assets/*', async (c, next) => {
|
|
180
|
+
const key = stripAssetPath(c.req.path, basePath).replace(/^\/+/, '');
|
|
181
|
+
const asset = key ? await assets.get(key) : undefined;
|
|
182
|
+
if (!asset)
|
|
183
|
+
return next();
|
|
184
|
+
return c.body(asset.body, 200, {
|
|
185
|
+
'Cache-Control': 'public, max-age=86400',
|
|
186
|
+
'Content-Type': asset.contentType,
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
// Safety net: any non-2xx response (auth/validation errors, MPP `402`
|
|
190
|
+
// challenges, rate-limit `429`s, upstream `502`s, etc.) must never be
|
|
191
|
+
// cached. This wraps endpoint middleware and handlers registered below.
|
|
192
|
+
base.use('*', async (c, next) => {
|
|
193
|
+
await next();
|
|
194
|
+
if (c.res.status >= 200 && c.res.status < 300)
|
|
195
|
+
return;
|
|
196
|
+
if (c.res.headers.has('Cache-Control'))
|
|
197
|
+
return;
|
|
198
|
+
c.res.headers.set('Cache-Control', 'no-store');
|
|
199
|
+
});
|
|
200
|
+
// Serve GETs from the cache store before user middleware (auth, rate limiting)
|
|
201
|
+
// runs, so cache hits skip the per-request store round-trips that dominate
|
|
202
|
+
// latency.
|
|
203
|
+
if (options.cache?.edge !== false)
|
|
204
|
+
base.use('*', EdgeCache.middleware({ store }));
|
|
205
|
+
const base_routed = base.get('/health', OpenApi.describeRoute({ hide: true }), (c) => c.json({ status: 'ok' }, 200));
|
|
206
|
+
for (const middleware of options.middleware ?? [])
|
|
207
|
+
base_routed.use('*', middleware);
|
|
208
|
+
const app = base_routed
|
|
209
|
+
.route('/v1/addresses', addresses())
|
|
210
|
+
.route('/v1/blocks', blocks())
|
|
211
|
+
.route('/v1/exchange', exchanges())
|
|
212
|
+
.route('/v1/fee-amm', feeAmm())
|
|
213
|
+
.route('/v1/indexer', indexer())
|
|
214
|
+
.route('/v1/tokenlist', tokenlist())
|
|
215
|
+
.route('/v1/tokens', tokens())
|
|
216
|
+
.route('/v1/transactions', receipts())
|
|
217
|
+
.route('/v1/transactions', transactions())
|
|
218
|
+
.route('/v1/transactions', transactionActivities())
|
|
219
|
+
.route('/v1/transfers', transfers())
|
|
220
|
+
.route('/v1/verified-tokens', verifiedTokens())
|
|
221
|
+
.route('/v1/webhooks', webhooks({ enabled: options.webhook !== undefined }))
|
|
222
|
+
.route('/rpc', rpcApp())
|
|
223
|
+
.route('/gecko', coingecko())
|
|
224
|
+
// Hidden compatibility route for the prior Tempo API's
|
|
225
|
+
// `GET /chains/:chainId/blocks/by-timestamp` (chain id in the path).
|
|
226
|
+
.route('/chains', blocksByTimestampCompat());
|
|
227
|
+
const spec = (async () => {
|
|
228
|
+
// OAS 3.1 `webhooks`: document the signed envelope Tempo API POSTs to subscriber
|
|
229
|
+
// URLs (an outbound payload, not an endpoint of this API). Only when enabled.
|
|
230
|
+
const webhooksDoc = (() => {
|
|
231
|
+
if (!options.webhook)
|
|
232
|
+
return {};
|
|
233
|
+
// `io: 'output'` documents the delivered (serialized) shape; `unrepresentable: 'any'`
|
|
234
|
+
// tolerates the transaction payload's transforms (e.g. lazy fee-token metadata),
|
|
235
|
+
// which have no JSON-Schema form, by emitting `{}` for those nodes rather than throwing.
|
|
236
|
+
const envelope = z.toJSONSchema(webhookSchema.Envelope, {
|
|
237
|
+
io: 'output',
|
|
238
|
+
target: 'draft-2020-12',
|
|
239
|
+
unrepresentable: 'any',
|
|
240
|
+
});
|
|
241
|
+
delete envelope.$schema;
|
|
242
|
+
const header = (name, description) => ({
|
|
243
|
+
description,
|
|
244
|
+
in: 'header',
|
|
245
|
+
name,
|
|
246
|
+
required: true,
|
|
247
|
+
schema: { type: 'string' },
|
|
248
|
+
});
|
|
249
|
+
return {
|
|
250
|
+
webhooks: {
|
|
251
|
+
event: {
|
|
252
|
+
post: {
|
|
253
|
+
description: 'When an event you subscribed to happens, Tempo sends this signed message to your webhook URL as an HTTP POST (the same shape is used by `POST /webhooks/:id/ping` so you can test your endpoint). Always verify the `tempo-signature` header before trusting the body, then reply with any 2xx status to confirm you received it. If your endpoint returns a non-2xx status, times out, or redirects, Tempo retries with increasing delays; an endpoint that keeps failing is eventually disabled.',
|
|
254
|
+
parameters: [
|
|
255
|
+
header('tempo-signature', 'Signature proving the message really came from Tempo. An HMAC-SHA256 of the body using your webhook secret, formatted `t=<unix>,v1=<hex>`. Verify this before trusting the payload.'),
|
|
256
|
+
header('tempo-event-id', 'A unique, stable id for this event (`evt_…`). The same event may be delivered more than once, so use this id to skip duplicates.'),
|
|
257
|
+
header('tempo-event-type', 'What happened: `token:transfer`, `transaction:included`, `log:emitted`, `block:created`, or `ping`.'), // prettier-ignore
|
|
258
|
+
],
|
|
259
|
+
requestBody: {
|
|
260
|
+
content: { 'application/json': { schema: envelope } },
|
|
261
|
+
required: true,
|
|
262
|
+
},
|
|
263
|
+
responses: { '2xx': { description: 'Delivery acknowledged.' } },
|
|
264
|
+
summary: 'Webhook event delivery',
|
|
265
|
+
tags: ['Webhooks'],
|
|
266
|
+
},
|
|
267
|
+
},
|
|
268
|
+
},
|
|
269
|
+
};
|
|
270
|
+
})();
|
|
271
|
+
const generated = await generateSpecs(app, {
|
|
272
|
+
documentation: {
|
|
273
|
+
components: {
|
|
274
|
+
headers: OpenApi.headerComponents,
|
|
275
|
+
responses: OpenApi.responseComponents,
|
|
276
|
+
securitySchemes: {
|
|
277
|
+
apiKey: {
|
|
278
|
+
description: 'Your Tempo API key, sent in the `tempo-api-key` request header. This is the canonical and recommended API-key header.',
|
|
279
|
+
in: 'header',
|
|
280
|
+
name: 'tempo-api-key',
|
|
281
|
+
type: 'apiKey',
|
|
282
|
+
},
|
|
283
|
+
bearerAuth: {
|
|
284
|
+
description: 'Compatibility alternative for API keys: send `Authorization: Bearer <key>`. Prefer the `tempo-api-key` header when your HTTP client supports custom headers.', // prettier-ignore
|
|
285
|
+
scheme: 'bearer',
|
|
286
|
+
type: 'http',
|
|
287
|
+
},
|
|
288
|
+
},
|
|
289
|
+
},
|
|
290
|
+
info: {
|
|
291
|
+
description: infoDescription,
|
|
292
|
+
title: 'Tempo API',
|
|
293
|
+
version: '1.0.0',
|
|
294
|
+
},
|
|
295
|
+
security: [{ apiKey: [] }, { bearerAuth: [] }],
|
|
296
|
+
servers: [
|
|
297
|
+
...(options.servers ?? [
|
|
298
|
+
{ url: basePath || '/', description: 'Relative to the host serving this document.' },
|
|
299
|
+
]),
|
|
300
|
+
],
|
|
301
|
+
tags: [
|
|
302
|
+
{
|
|
303
|
+
name: 'Activities',
|
|
304
|
+
description: 'A readable feed of what an account did onchain.',
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
name: 'Balances',
|
|
308
|
+
description: 'How much of each token an account holds.',
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
name: 'Blocks',
|
|
312
|
+
description: 'The ordered batches of transactions making up the chain.',
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
name: 'Exchange',
|
|
316
|
+
description: "Tempo's built-in stablecoin exchange: pairs, swaps, orders, prices.",
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
name: 'Fee AMM',
|
|
320
|
+
description: 'Pools that convert stablecoins to pay fees.',
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
name: 'Tokens',
|
|
324
|
+
description: 'TIP-20 token details, supply, and holders.',
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
name: 'Transactions',
|
|
328
|
+
description: 'Transactions submitted to Tempo, and their receipts.',
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
name: 'Transfers',
|
|
332
|
+
description: 'Token movements from executing transactions.',
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
name: 'Verified Tokens',
|
|
336
|
+
description: 'A curated, trusted list of TIP-20 tokens.',
|
|
337
|
+
},
|
|
338
|
+
...(options.webhook
|
|
339
|
+
? [
|
|
340
|
+
{
|
|
341
|
+
name: 'Webhooks',
|
|
342
|
+
description: 'Get signed callbacks when onchain events happen.',
|
|
343
|
+
},
|
|
344
|
+
]
|
|
345
|
+
: []),
|
|
346
|
+
{
|
|
347
|
+
name: 'Indexer',
|
|
348
|
+
description: "Run read-only SQL queries against Tempo's indexed data.",
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
name: 'RPC',
|
|
352
|
+
description: 'Direct access to the chain over Ethereum JSON-RPC. Not part of the stable API contract; best-effort support only. No compatibility, latency, availability, or data-freshness guarantees. Breaking changes may happen with limited notice.',
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
name: 'CoinGecko',
|
|
356
|
+
description: "Exchange data in CoinGecko's GeckoTerminal format.",
|
|
357
|
+
},
|
|
358
|
+
],
|
|
359
|
+
},
|
|
360
|
+
});
|
|
361
|
+
// Set per-operation `security` and the `402` payment-challenge response from
|
|
362
|
+
// each route's resolved auth policy (the single source of truth), so the
|
|
363
|
+
// anonymous option and `402` appear only where the public/MPP lanes are
|
|
364
|
+
// enabled — not on every operation via the document default.
|
|
365
|
+
applyAccess(generated.paths, Auth.describeAccess(app));
|
|
366
|
+
// Point the `/rpc` operation at the OpenRPC document via `x-openrpc`.
|
|
367
|
+
applyOpenrpcLink(generated.paths, basePath);
|
|
368
|
+
// Re-order paths so list endpoints appear before get endpoints inside each
|
|
369
|
+
// tag group in the sidebar. We classify by operation summary, which every
|
|
370
|
+
// handler sets as either "List ..." or "Get ...". The reference groups by
|
|
371
|
+
// tag and preserves document path order within a tag, so reordering here
|
|
372
|
+
// drives the sidebar sub-item order.
|
|
373
|
+
return { ...generated, ...webhooksDoc, paths: sortPaths(generated.paths) };
|
|
374
|
+
})();
|
|
375
|
+
app.get('/openapi.json', async (c) => c.json(await spec));
|
|
376
|
+
// The OpenRPC document is a committed build artifact (no runtime generator);
|
|
377
|
+
// see scripts/openrpc/build.ts and `pnpm openrpc:build`.
|
|
378
|
+
app.get('/openrpc.json', (c) => c.json(openrpcSpec));
|
|
379
|
+
if (options.docs !== false)
|
|
380
|
+
app.route('/', Handler.openApi({
|
|
381
|
+
// Inline the OpenRPC doc so vocs expands it without a self-subrequest
|
|
382
|
+
// (see `inlineOpenrpc`); the public `/openapi.json` keeps the URL ref.
|
|
383
|
+
spec: spec.then(inlineOpenrpc),
|
|
384
|
+
sidebar: { collapsed: true },
|
|
385
|
+
vocs: { logoUrl: OpenApi.logoUrl, title: 'Tempo API Reference', ...options.docs },
|
|
386
|
+
}, { fallback: 'next', css: OpenApi.css }));
|
|
387
|
+
app.notFound((c) => Response.error(c, { code: 'not_found', message: 'Route not found', status: 404 }));
|
|
388
|
+
app.onError((cause, c) => {
|
|
389
|
+
if (cause instanceof HTTPException)
|
|
390
|
+
return errorFromException(c, cause);
|
|
391
|
+
// Redact any leaked API-key token from the logged error/stack.
|
|
392
|
+
console.error(ApiKey.redact(cause instanceof Error ? (cause.stack ?? cause.message) : String(cause)));
|
|
393
|
+
return Response.error(c, {
|
|
394
|
+
code: 'internal_error',
|
|
395
|
+
message: 'Internal server error',
|
|
396
|
+
status: 500,
|
|
397
|
+
});
|
|
398
|
+
});
|
|
399
|
+
// Return the typed chained Hono directly. Spreading `store`/`listener` onto
|
|
400
|
+
// the app would intersect the inferred Hono type and breaks `testClient`'s
|
|
401
|
+
// schema inference for downstream consumers. The cache `store` is owned by
|
|
402
|
+
// the caller (pass `options.cache.store`), and a Node listener is produced on
|
|
403
|
+
// demand via `App.listener(app)`.
|
|
404
|
+
return app;
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Wraps a Tempo API app with a `node:http`-compatible request listener.
|
|
408
|
+
* Lifted out of `create()` so the returned `app` keeps its precise chained
|
|
409
|
+
* Hono type (which `testClient` needs); intersecting the listener onto the
|
|
410
|
+
* app degrades the typed proxy inference.
|
|
411
|
+
*/
|
|
412
|
+
export function listener(app) {
|
|
413
|
+
return getRequestListener(app.fetch);
|
|
414
|
+
}
|
|
415
|
+
function getRequestId(c) {
|
|
416
|
+
return c.get('requestId');
|
|
417
|
+
}
|
|
418
|
+
async function errorFromException(c, cause) {
|
|
419
|
+
const requestId = getRequestId(c);
|
|
420
|
+
const response = cause.getResponse();
|
|
421
|
+
response.headers.set('tempo-request-id', requestId);
|
|
422
|
+
if (!isJson(response))
|
|
423
|
+
return response;
|
|
424
|
+
const body = await response
|
|
425
|
+
.clone()
|
|
426
|
+
.json()
|
|
427
|
+
.catch(() => null);
|
|
428
|
+
if (!isRecord(body))
|
|
429
|
+
return response;
|
|
430
|
+
return c.json({ ...body, requestId }, cause.status, Object.fromEntries(response.headers));
|
|
431
|
+
}
|
|
432
|
+
// Reorder OpenAPI `paths` so reads come before writes within each tag group,
|
|
433
|
+
// and shallower paths come before deeper paths inside each bucket so root-level
|
|
434
|
+
// routes ("List tokens" — `/tokens`) win over nested ones ("List address
|
|
435
|
+
// tokens" — `/addresses/{address}/tokens`). Tie-break by original document
|
|
436
|
+
// order to keep registered grouping.
|
|
437
|
+
//
|
|
438
|
+
// A path is ranked as a unit because REST groups verbs onto shared paths (and
|
|
439
|
+
// the reference renders all methods of a path adjacently, in the fixed canonical
|
|
440
|
+
// method order GET→POST→PATCH→DELETE), so two operations on the same path can
|
|
441
|
+
// never be separated or reordered relative to each other.
|
|
442
|
+
//
|
|
443
|
+
// Read-only tags keep lists-before-gets (tiers 0/2). The `Webhooks` tag instead
|
|
444
|
+
// groups all reads (lists, then the item GET) ahead of the item writes, scoped
|
|
445
|
+
// to that tag so the read tags are untouched. The shared-path constraint means
|
|
446
|
+
// the desired "Create, all GETs (lists first), Update, Delete" can only be
|
|
447
|
+
// approximated: `Create webhook` shares `/webhooks` with `List webhooks`, and
|
|
448
|
+
// vocs renders GET before POST, so "List webhooks" unavoidably precedes
|
|
449
|
+
// "Create". `Get`/`Update`/`Delete` all share `/webhooks/{id}`, so they render
|
|
450
|
+
// adjacently as Get→Update→Delete. The `{id}` item is tiered right after the
|
|
451
|
+
// collection root, so `Get/Update/Delete` sit just below `List webhooks/Create`,
|
|
452
|
+
// ahead of the remaining lists and action POSTs. Tiers:
|
|
453
|
+
// 0 collection root (`GET`+`POST /webhooks`) → "List webhooks, Create webhook"
|
|
454
|
+
// 1 item (`GET`+`PATCH`+`DELETE /webhooks/{id}`) → "Get, Update, Delete"
|
|
455
|
+
// 2 other list-only paths (`/event-types`, `/deliveries`)
|
|
456
|
+
// 3 other writes/actions (`POST .../ping`, `.../retry`)
|
|
457
|
+
function sortPaths(paths) {
|
|
458
|
+
const entries = Object.entries(paths);
|
|
459
|
+
const rank = (entry) => {
|
|
460
|
+
const operations = Object.values(entry[1]);
|
|
461
|
+
const summaries = operations.flatMap((op) => isOperation(op) && op.summary ? [op.summary] : []);
|
|
462
|
+
const has = (prefix) => summaries.some((summary) => summary.startsWith(prefix));
|
|
463
|
+
if (operations.some((op) => isOperation(op) && op.tags?.includes('Webhooks'))) {
|
|
464
|
+
if (has('Create'))
|
|
465
|
+
return 0;
|
|
466
|
+
if (has('Get'))
|
|
467
|
+
return 1;
|
|
468
|
+
if (has('List'))
|
|
469
|
+
return 2;
|
|
470
|
+
return 3;
|
|
471
|
+
}
|
|
472
|
+
if (has('List'))
|
|
473
|
+
return has('Create') ? 1 : 0;
|
|
474
|
+
if (has('Get'))
|
|
475
|
+
return 2;
|
|
476
|
+
if (has('Create'))
|
|
477
|
+
return 3;
|
|
478
|
+
return 4;
|
|
479
|
+
};
|
|
480
|
+
const depth = (path) => path.endsWith('/rpc') ? 2 : path.split('/').filter(Boolean).length;
|
|
481
|
+
const indexed = entries.map((entry, index) => [entry, index, rank(entry), depth(entry[0])]);
|
|
482
|
+
indexed.sort(([, ai, ar, ad], [, bi, br, bd]) => ar - br || ad - bd || ai - bi);
|
|
483
|
+
return Object.fromEntries(indexed.map(([entry]) => entry));
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Sets per-operation `security` and the `402` payment-challenge response from
|
|
487
|
+
* each route's resolved access lanes (see {@link Auth.describeAccess}). The
|
|
488
|
+
* anonymous (`{}`) security option and the `402` response are emitted only where
|
|
489
|
+
* the route's policy enables the public and MPP lanes respectively; required
|
|
490
|
+
* API-key scopes are surfaced as the `x-required-scopes` extension.
|
|
491
|
+
*/
|
|
492
|
+
function applyAccess(paths, access) {
|
|
493
|
+
for (const item of Object.values(paths)) {
|
|
494
|
+
for (const op of Object.values(item)) {
|
|
495
|
+
if (!isMutableOperation(op))
|
|
496
|
+
continue;
|
|
497
|
+
const lanes = access[op.operationId];
|
|
498
|
+
if (!lanes)
|
|
499
|
+
continue;
|
|
500
|
+
op.security = [{ apiKey: [] }, { bearerAuth: [] }, ...(lanes.public ? [{}] : [])];
|
|
501
|
+
if (lanes.scopes.length > 0)
|
|
502
|
+
op['x-required-scopes'] = [...lanes.scopes];
|
|
503
|
+
if (lanes.mpp)
|
|
504
|
+
op.responses = { ...op.responses, 402: OpenApi.paymentChallengeRef };
|
|
505
|
+
else if (op.responses)
|
|
506
|
+
delete op.responses['402'];
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Links the JSON-RPC passthrough operation to the OpenRPC document (served at
|
|
512
|
+
* `{basePath}/openrpc.json`) via an `x-openrpc` vendor extension. The raw `/rpc`
|
|
513
|
+
* request body is opaque to OpenAPI, so this lets consumers discover the
|
|
514
|
+
* method/param/return schemas it accepts.
|
|
515
|
+
*
|
|
516
|
+
* The public `/openapi.json` keeps a URL reference (small, conventional). The
|
|
517
|
+
* docs handler instead receives the document inlined — see `inlineOpenrpc`.
|
|
518
|
+
*/
|
|
519
|
+
function applyOpenrpcLink(paths, basePath) {
|
|
520
|
+
// `basePath` is `/` at the root mount and `/api` etc. otherwise; strip any
|
|
521
|
+
// trailing slash so the join never doubles up (`//openrpc.json`).
|
|
522
|
+
const url = `${basePath.replace(/\/$/, '')}/openrpc.json`;
|
|
523
|
+
for (const item of Object.values(paths))
|
|
524
|
+
for (const op of Object.values(item))
|
|
525
|
+
if (isMutableOperation(op) && isRpcOperation(op))
|
|
526
|
+
op['x-openrpc'] = url;
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* Returns a shallow copy of `spec` with the JSON-RPC passthrough operation's
|
|
530
|
+
* `x-openrpc` replaced by the inline OpenRPC document, for the docs handler.
|
|
531
|
+
*
|
|
532
|
+
* Vocs expands `x-openrpc` at request time. A URL reference (as kept in the
|
|
533
|
+
* public `/openapi.json`) would make the docs worker fetch its own
|
|
534
|
+
* `/openrpc.json` — a self-subrequest that is unreliable on Cloudflare Workers
|
|
535
|
+
* and silently falls back to a single, unexpanded operation. Inlining the
|
|
536
|
+
* committed artifact keeps expansion deterministic across local and deployed
|
|
537
|
+
* environments, without bloating the public spec. Only the affected path/op are
|
|
538
|
+
* cloned; the rest of the (large) document is shared by reference.
|
|
539
|
+
*/
|
|
540
|
+
function inlineOpenrpc(spec) {
|
|
541
|
+
const paths = {};
|
|
542
|
+
for (const [pathname, item] of Object.entries(spec.paths)) {
|
|
543
|
+
let next = item;
|
|
544
|
+
if (isRecord(item))
|
|
545
|
+
for (const [method, op] of Object.entries(item))
|
|
546
|
+
if (isMutableOperation(op) && isRpcOperation(op))
|
|
547
|
+
next = { ...item, [method]: { ...op, 'x-openrpc': openrpcSpec } };
|
|
548
|
+
paths[pathname] = next;
|
|
549
|
+
}
|
|
550
|
+
return { ...spec, paths };
|
|
551
|
+
}
|
|
552
|
+
function isRpcOperation(op) {
|
|
553
|
+
return op.operationId === 'rpcRequest';
|
|
554
|
+
}
|
|
555
|
+
function isOperation(value) {
|
|
556
|
+
return !!value && typeof value === 'object' && 'summary' in value;
|
|
557
|
+
}
|
|
558
|
+
function isMutableOperation(value) {
|
|
559
|
+
return isRecord(value) && typeof value['operationId'] === 'string';
|
|
560
|
+
}
|
|
561
|
+
function isJson(response) {
|
|
562
|
+
return response.headers.get('content-type')?.includes('application/json') ?? false;
|
|
563
|
+
}
|
|
564
|
+
function isRecord(value) {
|
|
565
|
+
return !!value && typeof value === 'object' && !Array.isArray(value);
|
|
566
|
+
}
|
|
567
|
+
function createGetAsset(options) {
|
|
568
|
+
const { assets, basePath, origin } = options;
|
|
569
|
+
// Without an asset store, every lookup misses so callers fall back to their
|
|
570
|
+
// "no static data" behavior (undefined logo URIs).
|
|
571
|
+
if (!assets)
|
|
572
|
+
return () => undefined;
|
|
573
|
+
return async (chainId, path) => {
|
|
574
|
+
// Public URLs include `/assets/:chainId`, but the store is keyed by
|
|
575
|
+
// `:chainId/:path` (e.g. an R2 object key), decoupled from the URL shape.
|
|
576
|
+
// `path` may be absolute (`Path.join` returns a leading slash); strip it so
|
|
577
|
+
// the key is `:chainId/:path`, not `:chainId//:path`.
|
|
578
|
+
const pathname = Path.join(basePath, 'assets', String(chainId), path);
|
|
579
|
+
const key = `${chainId}/${path.replace(/^\/+/, '')}`;
|
|
580
|
+
const asset = await assets.get(key);
|
|
581
|
+
if (!asset)
|
|
582
|
+
return undefined;
|
|
583
|
+
// Return an absolute public URL (scheme + host) against the request origin
|
|
584
|
+
// so logo URLs work for any consumer regardless of the API's domain.
|
|
585
|
+
return {
|
|
586
|
+
response: new globalThis.Response(asset.body, {
|
|
587
|
+
headers: { 'Content-Type': asset.contentType },
|
|
588
|
+
}),
|
|
589
|
+
uri: new URL(pathname, origin).toString(),
|
|
590
|
+
};
|
|
591
|
+
};
|
|
592
|
+
}
|
|
593
|
+
function stripAssetPath(path, basePath) {
|
|
594
|
+
for (const prefix of [`${Path.join(basePath, 'assets')}/`, '/assets/'])
|
|
595
|
+
if (path.startsWith(prefix))
|
|
596
|
+
return `/${path.slice(prefix.length)}`;
|
|
597
|
+
return path;
|
|
598
|
+
}
|
|
599
|
+
function getRequestListener(fetch) {
|
|
600
|
+
let listener;
|
|
601
|
+
return async (incoming_, outgoing_) => {
|
|
602
|
+
// Resolve the Node-only adapter at call time. The split specifier keeps
|
|
603
|
+
// Worker bundlers from eagerly including a server adapter they never run.
|
|
604
|
+
if (listener === undefined) {
|
|
605
|
+
const nodeServer = (await import(
|
|
606
|
+
/* @vite-ignore */ ['@hono', 'node-server'].join('/')));
|
|
607
|
+
listener = nodeServer.getRequestListener(fetch);
|
|
608
|
+
}
|
|
609
|
+
return listener(incoming_, outgoing_);
|
|
610
|
+
};
|
|
611
|
+
}
|
|
612
|
+
//# sourceMappingURL=App.js.map
|
package/dist/App.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.js","sourceRoot":"","sources":["../src/App.ts"],"names":[],"mappings":"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"}
|