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
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import * as ApiKey from '../../ApiKey.js'
|
|
2
|
+
|
|
3
|
+
import * as TestAdmin from '../../../test/Admin.js'
|
|
4
|
+
import * as TestApp from '../../../test/App.js'
|
|
5
|
+
import * as ApiKeys from './api-keys.js'
|
|
6
|
+
|
|
7
|
+
/** Minimal valid mint payload. */
|
|
8
|
+
const validBody = { orgId: 'org_test', scopes: ['data:read'] } as const
|
|
9
|
+
|
|
10
|
+
describe('POST /api-keys', () => {
|
|
11
|
+
test('mints a key, returns the token once, persists a hashed record', async () => {
|
|
12
|
+
const { client, source, store } = TestAdmin.setup()
|
|
13
|
+
const response = await client['api-keys'].$post({ json: { ...validBody, name: 'CI' } })
|
|
14
|
+
const body = await TestApp.json(response, ApiKeys.schema.createApiKey.Response)
|
|
15
|
+
|
|
16
|
+
expect(response.status).toBe(200)
|
|
17
|
+
// The plaintext token is returned exactly once, in the documented format.
|
|
18
|
+
expect(body.token).toMatch(/^tempo:sk:[a-f0-9]{48}$/)
|
|
19
|
+
// createdBy is the verified admin email, not anything the client sent.
|
|
20
|
+
expect(body.createdBy).toBe(TestAdmin.identity.email)
|
|
21
|
+
expect(TestAdmin.redact(body)).toMatchInlineSnapshot(`
|
|
22
|
+
{
|
|
23
|
+
"createdAt": "<createdAt>",
|
|
24
|
+
"createdBy": "admin@tempo.xyz",
|
|
25
|
+
"environment": "production",
|
|
26
|
+
"id": "<id>",
|
|
27
|
+
"name": "CI",
|
|
28
|
+
"orgId": "org_test",
|
|
29
|
+
"scopes": [
|
|
30
|
+
"data:read",
|
|
31
|
+
],
|
|
32
|
+
"token": "<token>",
|
|
33
|
+
"tokenLast4": "<tokenLast4>",
|
|
34
|
+
}
|
|
35
|
+
`)
|
|
36
|
+
|
|
37
|
+
// The token resolves through the source (proving the record persisted),
|
|
38
|
+
// and at rest it is keyed by the token hash — never the plaintext token.
|
|
39
|
+
const resolved = await source.resolve(body.token)
|
|
40
|
+
expect(resolved?.orgId).toBe('org_test')
|
|
41
|
+
expect(await store.get(body.token)).toBeNull()
|
|
42
|
+
expect(await store.get(ApiKey.keyFor(body.token))).not.toBeNull()
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
test('defaults to the production environment', async () => {
|
|
46
|
+
const { client, source } = TestAdmin.setup()
|
|
47
|
+
const response = await client['api-keys'].$post({ json: validBody })
|
|
48
|
+
const body = await TestApp.json(response, ApiKeys.schema.createApiKey.Response)
|
|
49
|
+
|
|
50
|
+
expect(response.status).toBe(200)
|
|
51
|
+
expect(body.environment).toBe('production')
|
|
52
|
+
expect((await source.list())[0]?.environment).toBe('production')
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
test('persists a sandbox environment when provided', async () => {
|
|
56
|
+
const { client, source } = TestAdmin.setup()
|
|
57
|
+
const response = await client['api-keys'].$post({
|
|
58
|
+
json: { ...validBody, environment: 'sandbox' },
|
|
59
|
+
})
|
|
60
|
+
const body = await TestApp.json(response, ApiKeys.schema.createApiKey.Response)
|
|
61
|
+
|
|
62
|
+
expect(response.status).toBe(200)
|
|
63
|
+
expect(body.environment).toBe('sandbox')
|
|
64
|
+
// Sandbox tokens carry a distinct prefix for recognizability/leak detection.
|
|
65
|
+
expect(body.token).toMatch(/^tempo_sandbox:sk:[a-f0-9]{48}$/)
|
|
66
|
+
const resolved = await source.resolve(body.token)
|
|
67
|
+
expect(resolved?.environment).toBe('sandbox')
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
test('records the expiry when provided', async () => {
|
|
71
|
+
const { client, source } = TestAdmin.setup()
|
|
72
|
+
const expiresAt = '2100-01-01T00:00:00.000Z'
|
|
73
|
+
const response = await client['api-keys'].$post({ json: { ...validBody, expiresAt } })
|
|
74
|
+
const body = await TestApp.json(response, ApiKeys.schema.createApiKey.Response)
|
|
75
|
+
|
|
76
|
+
expect(response.status).toBe(200)
|
|
77
|
+
expect(body.expiresAt).toBe(expiresAt)
|
|
78
|
+
expect((await source.list())[0]?.expiresAt).toBe(expiresAt)
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
test('rejects an unknown scope with 400', async () => {
|
|
82
|
+
const { client } = TestAdmin.setup()
|
|
83
|
+
const response = await client['api-keys'].$post({
|
|
84
|
+
// Cast past the typed client to exercise runtime validation.
|
|
85
|
+
json: { ...validBody, scopes: ['nope:read'] } as never,
|
|
86
|
+
})
|
|
87
|
+
const body = (await response.json()) as { error?: { code?: string } }
|
|
88
|
+
|
|
89
|
+
expect(response.status).toMatchInlineSnapshot(`400`)
|
|
90
|
+
expect(body.error?.code).toMatchInlineSnapshot(`"body_invalid"`)
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
test('ignores a client-supplied createdBy (audit trail is server-set)', async () => {
|
|
94
|
+
const { client } = TestAdmin.setup()
|
|
95
|
+
const response = await client['api-keys'].$post({
|
|
96
|
+
// Cast past the typed client: the body schema omits createdBy, so an
|
|
97
|
+
// unknown key is stripped and the server records the verified identity.
|
|
98
|
+
json: { ...validBody, createdBy: 'spoof@example.com' } as never,
|
|
99
|
+
})
|
|
100
|
+
const body = await TestApp.json(response, ApiKeys.schema.createApiKey.Response)
|
|
101
|
+
|
|
102
|
+
expect(response.status).toBe(200)
|
|
103
|
+
expect(body.createdBy).toBe(TestAdmin.identity.email)
|
|
104
|
+
})
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
describe('GET /api-keys', () => {
|
|
108
|
+
test('lists records as metadata only (never the token)', async () => {
|
|
109
|
+
const { client, source } = TestAdmin.setup()
|
|
110
|
+
const { token } = await source.mint(validBody)
|
|
111
|
+
|
|
112
|
+
const response = await client['api-keys'].$get({ query: {} })
|
|
113
|
+
const body = await TestApp.json(response, ApiKeys.schema.listApiKeys.Response)
|
|
114
|
+
|
|
115
|
+
expect(response.status).toBe(200)
|
|
116
|
+
expect(body.data).toHaveLength(1)
|
|
117
|
+
// No record (and no serialized response) may carry the plaintext token.
|
|
118
|
+
expect(body.data[0]).not.toHaveProperty('token')
|
|
119
|
+
expect(JSON.stringify(body)).not.toContain(token)
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
test('filters by orgId', async () => {
|
|
123
|
+
const { client, source } = TestAdmin.setup()
|
|
124
|
+
await source.mint({ orgId: 'org_a', scopes: ['data:read'] })
|
|
125
|
+
await source.mint({ orgId: 'org_b', scopes: ['data:read'] })
|
|
126
|
+
|
|
127
|
+
const response = await client['api-keys'].$get({ query: { orgId: 'org_a' } })
|
|
128
|
+
const body = await TestApp.json(response, ApiKeys.schema.listApiKeys.Response)
|
|
129
|
+
|
|
130
|
+
expect(body.data.map((record) => record.orgId)).toEqual(['org_a'])
|
|
131
|
+
})
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
describe('DELETE /api-keys/:id', () => {
|
|
135
|
+
test('revokes a key, after which it no longer resolves or lists', async () => {
|
|
136
|
+
const { client, source } = TestAdmin.setup()
|
|
137
|
+
const { record, token } = await source.mint(validBody)
|
|
138
|
+
|
|
139
|
+
const response = await client['api-keys'][':id'].$delete({ param: { id: record.id } })
|
|
140
|
+
const body = await TestApp.json(response, ApiKeys.schema.revokeApiKey.Response)
|
|
141
|
+
|
|
142
|
+
expect(response.status).toBe(200)
|
|
143
|
+
expect(body).toEqual({ id: record.id })
|
|
144
|
+
expect(await source.resolve(token)).toBeNull()
|
|
145
|
+
expect(await source.list()).toEqual([])
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
test('unknown id → 404', async () => {
|
|
149
|
+
const { client } = TestAdmin.setup()
|
|
150
|
+
const response = await client['api-keys'][':id'].$delete({ param: { id: 'key_missing' } })
|
|
151
|
+
const body = (await response.json()) as { error?: { code?: string } }
|
|
152
|
+
|
|
153
|
+
expect(response.status).toMatchInlineSnapshot(`404`)
|
|
154
|
+
expect(body.error?.code).toMatchInlineSnapshot(`"not_found"`)
|
|
155
|
+
})
|
|
156
|
+
})
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { Hono } from 'hono'
|
|
2
|
+
import * as z from 'zod/mini'
|
|
3
|
+
|
|
4
|
+
import * as ApiKeySource from '../../ApiKeySource.js'
|
|
5
|
+
import * as OpenApi from '../../internal/OpenApi.js'
|
|
6
|
+
import * as Response from '../../internal/Response.js'
|
|
7
|
+
import * as Schema from '../../internal/Schema.js'
|
|
8
|
+
import type * as App from '../App.js'
|
|
9
|
+
|
|
10
|
+
/** Zod schemas owned by the admin API-keys handler. */
|
|
11
|
+
export namespace schema {
|
|
12
|
+
/** Schemas for the createApiKey operation. */
|
|
13
|
+
export namespace createApiKey {
|
|
14
|
+
/**
|
|
15
|
+
* Request body for minting a key (`MintInput` minus `createdBy`, which the
|
|
16
|
+
* server sets from the verified identity so it can't be spoofed).
|
|
17
|
+
*/
|
|
18
|
+
export const Body = Schema.describe(
|
|
19
|
+
z.omit(ApiKeySource.schema.MintInput, { createdBy: true }),
|
|
20
|
+
'Fields accepted when minting an API key.',
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
/** Response: the record plus the one-time plaintext token. */
|
|
24
|
+
export const Response = Schema.describe(
|
|
25
|
+
z.extend(ApiKeySource.schema.Record, {
|
|
26
|
+
token: z
|
|
27
|
+
.string()
|
|
28
|
+
.check(z.describe('The plaintext token, shown once and unrecoverable afterward.')),
|
|
29
|
+
}),
|
|
30
|
+
'A minted API key, including its one-time token.',
|
|
31
|
+
)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Schemas for the listApiKeys operation. */
|
|
35
|
+
export namespace listApiKeys {
|
|
36
|
+
/** Query parameters for listing keys. */
|
|
37
|
+
export const Query = z
|
|
38
|
+
.object({
|
|
39
|
+
orgId: z
|
|
40
|
+
.optional(z.string())
|
|
41
|
+
.check(z.describe('Restrict results to keys owned by this organization.')),
|
|
42
|
+
})
|
|
43
|
+
.check(z.describe('Query parameters for listing API keys.'))
|
|
44
|
+
|
|
45
|
+
/** Response body: a list of key records (metadata only — never tokens). */
|
|
46
|
+
export const Response = Schema.describe(
|
|
47
|
+
z.object({
|
|
48
|
+
data: z
|
|
49
|
+
.array(ApiKeySource.schema.Record)
|
|
50
|
+
.check(z.describe('API-key records, newest first (metadata only — never tokens).')),
|
|
51
|
+
}),
|
|
52
|
+
'A list of API-key records.',
|
|
53
|
+
)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Schemas for the revokeApiKey operation. */
|
|
57
|
+
export namespace revokeApiKey {
|
|
58
|
+
/** Path parameters for revoking a key. */
|
|
59
|
+
export const Params = z
|
|
60
|
+
.object({
|
|
61
|
+
id: z.string().check(z.describe('Stable id of the key to revoke.')),
|
|
62
|
+
})
|
|
63
|
+
.check(z.describe('Path parameters for revoking an API key.'))
|
|
64
|
+
|
|
65
|
+
/** Response body for a successful revocation. */
|
|
66
|
+
export const Response = z
|
|
67
|
+
.object({ id: z.string().check(z.describe('Revoked key id.')) })
|
|
68
|
+
.check(z.describe('API-key revocation result.'))
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Provisioning routes for API keys, backed by the request's
|
|
74
|
+
* {@link App.Environment} `source`:
|
|
75
|
+
*
|
|
76
|
+
* - `POST /` mints a key, recording `createdBy` from the verified identity and
|
|
77
|
+
* returning the one-time token.
|
|
78
|
+
* - `GET /` lists key records (metadata only), optionally filtered by `orgId`.
|
|
79
|
+
* - `DELETE /:id` revokes a key by id (`404` if absent).
|
|
80
|
+
*/
|
|
81
|
+
export function apiKeys() {
|
|
82
|
+
return new Hono<App.Environment>()
|
|
83
|
+
.post(
|
|
84
|
+
'/',
|
|
85
|
+
OpenApi.validate('json', schema.createApiKey.Body, {
|
|
86
|
+
code: 'body_invalid',
|
|
87
|
+
message: 'Invalid request body',
|
|
88
|
+
}),
|
|
89
|
+
OpenApi.describeRoute({
|
|
90
|
+
operationId: 'createApiKey',
|
|
91
|
+
responses: OpenApi.responses({
|
|
92
|
+
success: {
|
|
93
|
+
description: 'Minted key (includes the one-time token).',
|
|
94
|
+
schema: schema.createApiKey.Response,
|
|
95
|
+
},
|
|
96
|
+
}),
|
|
97
|
+
summary: 'Create API key',
|
|
98
|
+
tags: ['API keys'],
|
|
99
|
+
}),
|
|
100
|
+
async (c) => {
|
|
101
|
+
// `createdBy` is the verified admin email, never client-supplied.
|
|
102
|
+
// `requireAuth` guarantees identity on this gated route.
|
|
103
|
+
const { record, token } = await c.get('source').mint({
|
|
104
|
+
...c.req.valid('json'),
|
|
105
|
+
createdBy: c.get('identity')!.email,
|
|
106
|
+
})
|
|
107
|
+
return c.json(Response.validated(schema.createApiKey.Response, { ...record, token }))
|
|
108
|
+
},
|
|
109
|
+
)
|
|
110
|
+
.get(
|
|
111
|
+
'/',
|
|
112
|
+
OpenApi.validate('query', schema.listApiKeys.Query, {
|
|
113
|
+
code: 'query_invalid',
|
|
114
|
+
message: 'Invalid query parameters',
|
|
115
|
+
}),
|
|
116
|
+
OpenApi.describeRoute({
|
|
117
|
+
operationId: 'listApiKeys',
|
|
118
|
+
responses: OpenApi.responses({
|
|
119
|
+
success: { description: 'API-key records.', schema: schema.listApiKeys.Response },
|
|
120
|
+
}),
|
|
121
|
+
summary: 'List API keys',
|
|
122
|
+
tags: ['API keys'],
|
|
123
|
+
}),
|
|
124
|
+
async (c) => {
|
|
125
|
+
const { orgId } = c.req.valid('query')
|
|
126
|
+
const data = await c.get('source').list(orgId ? { orgId } : {})
|
|
127
|
+
return c.json(Response.validated(schema.listApiKeys.Response, { data }))
|
|
128
|
+
},
|
|
129
|
+
)
|
|
130
|
+
.delete(
|
|
131
|
+
'/:id',
|
|
132
|
+
OpenApi.validate('param', schema.revokeApiKey.Params, {
|
|
133
|
+
code: 'param_invalid',
|
|
134
|
+
message: 'Invalid path parameters',
|
|
135
|
+
}),
|
|
136
|
+
OpenApi.describeRoute({
|
|
137
|
+
operationId: 'revokeApiKey',
|
|
138
|
+
responses: OpenApi.responses({
|
|
139
|
+
errors: { 404: 'API key not found.' },
|
|
140
|
+
success: { description: 'Key revoked.', schema: schema.revokeApiKey.Response },
|
|
141
|
+
}),
|
|
142
|
+
summary: 'Revoke API key',
|
|
143
|
+
tags: ['API keys'],
|
|
144
|
+
}),
|
|
145
|
+
async (c) => {
|
|
146
|
+
const { id } = c.req.valid('param')
|
|
147
|
+
const revoked = await c.get('source').revoke(id)
|
|
148
|
+
if (!revoked)
|
|
149
|
+
return Response.error(c, {
|
|
150
|
+
code: 'not_found',
|
|
151
|
+
message: 'API key not found.',
|
|
152
|
+
status: 404,
|
|
153
|
+
})
|
|
154
|
+
return c.json(Response.validated(schema.revokeApiKey.Response, { id }))
|
|
155
|
+
},
|
|
156
|
+
)
|
|
157
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as Scope from '../../Scope.js'
|
|
2
|
+
|
|
3
|
+
import * as TestAdmin from '../../../test/Admin.js'
|
|
4
|
+
import * as TestApp from '../../../test/App.js'
|
|
5
|
+
import * as Scopes from './scopes.js'
|
|
6
|
+
|
|
7
|
+
describe('GET /scopes', () => {
|
|
8
|
+
test('serves the issuable scope catalog', async () => {
|
|
9
|
+
const { client } = TestAdmin.setup()
|
|
10
|
+
const response = await client.scopes.$get()
|
|
11
|
+
const body = await TestApp.json(response, Scopes.schema.getScopes.Response)
|
|
12
|
+
|
|
13
|
+
expect(response.status).toBe(200)
|
|
14
|
+
expect(body).toMatchInlineSnapshot(`
|
|
15
|
+
{
|
|
16
|
+
"data": [
|
|
17
|
+
{
|
|
18
|
+
"description": "Read public chain data: tokens, transactions, transfers, blocks, and receipts.",
|
|
19
|
+
"scope": "data:read",
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"description": "Run ad-hoc queries against the raw indexer passthrough.",
|
|
23
|
+
"scope": "indexer:query",
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"description": "Read webhook subscriptions.",
|
|
27
|
+
"scope": "webhooks:read",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"description": "Create, update, and delete webhook subscriptions.",
|
|
31
|
+
"scope": "webhooks:write",
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
}
|
|
35
|
+
`)
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
test('serves the Scope.catalog source of truth verbatim', async () => {
|
|
39
|
+
const { client } = TestAdmin.setup()
|
|
40
|
+
const response = await client.scopes.$get()
|
|
41
|
+
const body = await TestApp.json(response, Scopes.schema.getScopes.Response)
|
|
42
|
+
|
|
43
|
+
expect(body.data).toEqual(Scope.catalog)
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
test('is never cached (admin responses are per-principal)', async () => {
|
|
47
|
+
const { client } = TestAdmin.setup()
|
|
48
|
+
const response = await client.scopes.$get()
|
|
49
|
+
|
|
50
|
+
expect(response.headers.get('cache-control')).toMatchInlineSnapshot(`"no-store"`)
|
|
51
|
+
})
|
|
52
|
+
})
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Hono } from 'hono'
|
|
2
|
+
import * as z from 'zod/mini'
|
|
3
|
+
|
|
4
|
+
import * as OpenApi from '../../internal/OpenApi.js'
|
|
5
|
+
import * as Scope from '../../Scope.js'
|
|
6
|
+
import type * as App from '../App.js'
|
|
7
|
+
|
|
8
|
+
/** Zod schemas owned by the admin scope catalog handler. */
|
|
9
|
+
export namespace schema {
|
|
10
|
+
/** Schemas for the getAdminScopes operation. */
|
|
11
|
+
export namespace getScopes {
|
|
12
|
+
/** A single issuable API-key scope. */
|
|
13
|
+
export const Scope = z
|
|
14
|
+
.object({
|
|
15
|
+
description: z
|
|
16
|
+
.string()
|
|
17
|
+
.check(z.describe('Human-readable explanation of what the scope grants.')),
|
|
18
|
+
scope: z
|
|
19
|
+
.string()
|
|
20
|
+
.check(z.describe('Scope identifier used in API-key grants and route policies.')),
|
|
21
|
+
})
|
|
22
|
+
.check(z.describe('A single issuable API-key scope.'))
|
|
23
|
+
|
|
24
|
+
/** Response body for the scope catalog. */
|
|
25
|
+
export const Response = z
|
|
26
|
+
.object({
|
|
27
|
+
data: z.array(Scope).check(z.describe('Issuable API-key scopes.')),
|
|
28
|
+
})
|
|
29
|
+
.check(z.describe('Response body for the scope catalog.'))
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Catalog of issuable API-key scopes, served from {@link Scope.catalog}. */
|
|
34
|
+
export function scopes() {
|
|
35
|
+
return new Hono<App.Environment>().get(
|
|
36
|
+
'/',
|
|
37
|
+
OpenApi.describeRoute({
|
|
38
|
+
operationId: 'getAdminScopes',
|
|
39
|
+
responses: OpenApi.responses({
|
|
40
|
+
success: { description: 'Issuable scope catalog.', schema: schema.getScopes.Response },
|
|
41
|
+
}),
|
|
42
|
+
summary: 'List scopes',
|
|
43
|
+
tags: ['Scopes'],
|
|
44
|
+
}),
|
|
45
|
+
(c) => c.json({ data: Scope.catalog }),
|
|
46
|
+
)
|
|
47
|
+
}
|