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,450 @@
|
|
|
1
|
+
import { Hex } from 'ox';
|
|
2
|
+
import * as z from 'zod/mini';
|
|
3
|
+
import * as Schema from './Schema.js';
|
|
4
|
+
import * as Store from './Store.js';
|
|
5
|
+
import * as Timing from './Timing.js';
|
|
6
|
+
/** Schema for a chain's verified token list (the value stored in KV). */
|
|
7
|
+
export const Data = z
|
|
8
|
+
.array(z
|
|
9
|
+
.object({
|
|
10
|
+
address: Schema.Address.check(z.describe('Verified TIP-20 token contract address.')),
|
|
11
|
+
currency: z.string().check(z.describe('Verified token display currency.')),
|
|
12
|
+
decimals: z
|
|
13
|
+
.number()
|
|
14
|
+
.check(z.int(), z.nonnegative(), z.describe('Verified token decimal precision.')),
|
|
15
|
+
id: z.string().check(z.describe('Stable resource id (the token address).')),
|
|
16
|
+
logoUri: z
|
|
17
|
+
.optional(z.url({ protocol: /^https$/ }))
|
|
18
|
+
.check(z.describe('Curated HTTPS URL for the token logo image, when set.')),
|
|
19
|
+
name: z.string().check(z.describe('Verified token display name.')),
|
|
20
|
+
symbol: z.string().check(z.describe('Verified token ticker symbol.')),
|
|
21
|
+
})
|
|
22
|
+
.check(z.describe('Static verified token entry.')))
|
|
23
|
+
.check(z.describe("A chain's verified token list."));
|
|
24
|
+
/** Compiles a raw token list into an indexed {@link Snapshot}. */
|
|
25
|
+
export function compile(options) {
|
|
26
|
+
const { chainId, tokens, updatedAt, version } = options;
|
|
27
|
+
// Backfill the derived `id` (lowercased address) without re-parsing through
|
|
28
|
+
// `Data`/`Schema.Address`, which would lowercase the stored `address` and
|
|
29
|
+
// drop its curated checksum casing. Callers (readBlob/normalize) own validation.
|
|
30
|
+
const list = tokens.map((token) => ({
|
|
31
|
+
...token,
|
|
32
|
+
id: token.id ?? token.address.toLowerCase(),
|
|
33
|
+
}));
|
|
34
|
+
const byAddress = new Map();
|
|
35
|
+
const byCurrency = new Map();
|
|
36
|
+
const bySymbol = new Map();
|
|
37
|
+
for (const token of list) {
|
|
38
|
+
byAddress.set(token.address.toLowerCase(), token);
|
|
39
|
+
bySymbol.set(token.symbol.toLowerCase(), token);
|
|
40
|
+
const currency = token.currency.toLowerCase();
|
|
41
|
+
const group = byCurrency.get(currency);
|
|
42
|
+
if (group)
|
|
43
|
+
group.push(token);
|
|
44
|
+
else
|
|
45
|
+
byCurrency.set(currency, [token]);
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
byAddress,
|
|
49
|
+
byCurrency,
|
|
50
|
+
bySymbol,
|
|
51
|
+
chainId,
|
|
52
|
+
currencies: Array.from(new Set(list.map((token) => token.currency))).sort(),
|
|
53
|
+
list,
|
|
54
|
+
updatedAt,
|
|
55
|
+
version,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// Storage layout: one head pointer + one whole-chain blob per version, so
|
|
59
|
+
// reads are a single `get` by known key (no `list()` scans) and a publish is an
|
|
60
|
+
// atomic flip of `head` to a new, already-written `snapshot:{version}`.
|
|
61
|
+
const keyPrefix = 'verified-token:v1';
|
|
62
|
+
// Storage schema version stamped on every head/blob, so a future on-disk format
|
|
63
|
+
// change can be detected and migrated.
|
|
64
|
+
const storeSchema = 1;
|
|
65
|
+
/** Store key for a chain's head pointer (current version + metadata). */
|
|
66
|
+
function headKey(chainId) {
|
|
67
|
+
return `${keyPrefix}:${chainId}:head`;
|
|
68
|
+
}
|
|
69
|
+
/** Store key for a chain's immutable snapshot blob at a given version. */
|
|
70
|
+
function snapshotKey(chainId, version) {
|
|
71
|
+
return `${keyPrefix}:${chainId}:snapshot:${version}`;
|
|
72
|
+
}
|
|
73
|
+
// Head pointer: tiny, read once per soft-TTL window to detect version changes
|
|
74
|
+
// without fetching the (much larger) token blob.
|
|
75
|
+
const Head = z
|
|
76
|
+
.object({
|
|
77
|
+
chainId: z.number().check(z.int(), z.describe('Chain the head belongs to.')),
|
|
78
|
+
count: z.number().check(z.int(), z.nonnegative(), z.describe('Token count at this version.')),
|
|
79
|
+
schema: z.number().check(z.int(), z.describe('Storage schema version.')),
|
|
80
|
+
updatedAt: z.string().check(z.describe('ISO timestamp of the last publish.')),
|
|
81
|
+
version: z.string().check(z.describe('Current snapshot version.')),
|
|
82
|
+
})
|
|
83
|
+
.check(z.describe('Verified-token head pointer stored under the head key.'));
|
|
84
|
+
// Immutable per-version blob holding the validated token list.
|
|
85
|
+
const Blob = z
|
|
86
|
+
.object({
|
|
87
|
+
chainId: z.number().check(z.int(), z.describe('Chain the blob belongs to.')),
|
|
88
|
+
schema: z.number().check(z.int(), z.describe('Storage schema version.')),
|
|
89
|
+
tokens: Data,
|
|
90
|
+
updatedAt: z.string().check(z.describe('ISO timestamp of the last publish.')),
|
|
91
|
+
version: z.string().check(z.describe('Snapshot version this blob holds.')),
|
|
92
|
+
})
|
|
93
|
+
.check(z.describe('Verified-token snapshot blob stored under a versioned key.'));
|
|
94
|
+
/** Reads a chain's head pointer, or `null` when the chain has no head yet. */
|
|
95
|
+
async function readHead(store, chainId) {
|
|
96
|
+
const raw = await store.get(headKey(chainId));
|
|
97
|
+
if (!raw)
|
|
98
|
+
return null;
|
|
99
|
+
return Head.parse(JSON.parse(raw));
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Reads and compiles a chain's snapshot blob at a specific version. Throws
|
|
103
|
+
* {@link TornStateError} when the blob is missing (a torn write that should
|
|
104
|
+
* never happen given the write-blob-before-flip-head ordering).
|
|
105
|
+
*/
|
|
106
|
+
async function readBlob(store, chainId, version) {
|
|
107
|
+
const raw = await store.get(snapshotKey(chainId, version));
|
|
108
|
+
if (!raw)
|
|
109
|
+
throw new TornStateError({ chainId, version });
|
|
110
|
+
const parsed = JSON.parse(raw);
|
|
111
|
+
const blob = Blob.parse({
|
|
112
|
+
...parsed,
|
|
113
|
+
tokens: Array.isArray(parsed.tokens) ? withIds(parsed.tokens) : parsed.tokens,
|
|
114
|
+
});
|
|
115
|
+
return compile({
|
|
116
|
+
chainId,
|
|
117
|
+
tokens: blob.tokens,
|
|
118
|
+
updatedAt: blob.updatedAt,
|
|
119
|
+
version: blob.version,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Reads and compiles the snapshot a chain's head points at. Returns `null` when
|
|
124
|
+
* the chain has no head. Throws {@link TornStateError} when `head` references a
|
|
125
|
+
* missing snapshot blob.
|
|
126
|
+
*/
|
|
127
|
+
export async function read(store, chainId) {
|
|
128
|
+
const head = await readHead(store, chainId);
|
|
129
|
+
if (!head)
|
|
130
|
+
return null;
|
|
131
|
+
return readBlob(store, chainId, head.version);
|
|
132
|
+
}
|
|
133
|
+
// Tracks the last epoch-ms used by `nextVersion` so versions stay strictly
|
|
134
|
+
// monotonic even when multiple writes land in the same millisecond.
|
|
135
|
+
let lastVersionMs = 0;
|
|
136
|
+
// Generates a monotonic, collision-resistant snapshot version. Zero-padded
|
|
137
|
+
// epoch-ms sorts chronologically by string compare (matching webhook ids) and
|
|
138
|
+
// is bumped forward when two writes share a millisecond so the prefix alone
|
|
139
|
+
// strictly increases per process; the random suffix keeps versions opaque.
|
|
140
|
+
function nextVersion() {
|
|
141
|
+
lastVersionMs = Math.max(Date.now(), lastVersionMs + 1);
|
|
142
|
+
return `${lastVersionMs.toString().padStart(15, '0')}_${Hex.random(4).slice(2)}`;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Validates a whole token list and normalizes it for storage: addresses are
|
|
146
|
+
* lowercased, and address + case-insensitive symbol must be unique across the
|
|
147
|
+
* entire list. Throws {@link DuplicateAddressError} /
|
|
148
|
+
* {@link DuplicateSymbolError} on a collision.
|
|
149
|
+
*/
|
|
150
|
+
function normalize(chainId, tokens) {
|
|
151
|
+
const list = Data.parse(withIds(tokens)).map((token) => ({
|
|
152
|
+
...token,
|
|
153
|
+
address: token.address.toLowerCase(),
|
|
154
|
+
id: token.address.toLowerCase(),
|
|
155
|
+
}));
|
|
156
|
+
const addresses = new Set();
|
|
157
|
+
const symbols = new Set();
|
|
158
|
+
for (const token of list) {
|
|
159
|
+
if (addresses.has(token.address))
|
|
160
|
+
throw new DuplicateAddressError({ address: token.address, chainId }); // prettier-ignore
|
|
161
|
+
addresses.add(token.address);
|
|
162
|
+
const symbol = token.symbol.toLowerCase();
|
|
163
|
+
if (symbols.has(symbol))
|
|
164
|
+
throw new DuplicateSymbolError({ chainId, symbol: token.symbol });
|
|
165
|
+
symbols.add(symbol);
|
|
166
|
+
}
|
|
167
|
+
return list;
|
|
168
|
+
}
|
|
169
|
+
// Backfills the derived `id` (lowercased address) onto raw token records
|
|
170
|
+
// without touching the stored `address` casing, so compiled snapshots preserve
|
|
171
|
+
// the curated checksum form while still exposing a stable lowercase id.
|
|
172
|
+
function withIds(tokens) {
|
|
173
|
+
return tokens.map((token) => {
|
|
174
|
+
if (!token || typeof token !== 'object' || !('address' in token))
|
|
175
|
+
return token;
|
|
176
|
+
return { ...token, id: String(token.address).toLowerCase() };
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
// Returns the current authoritative list for a chain to read-modify-write
|
|
180
|
+
// against: the durable snapshot, or an empty list when the chain has no head yet
|
|
181
|
+
// (the first write starts the chain's list from scratch).
|
|
182
|
+
async function currentList(store, chainId) {
|
|
183
|
+
return (await read(store, chainId))?.list ?? [];
|
|
184
|
+
}
|
|
185
|
+
// Best-effort optimistic concurrency: when `ifMatch` is set, the caller's
|
|
186
|
+
// expected version must equal the current head version. On KV the head
|
|
187
|
+
// read can itself be stale, so this narrows — but does not eliminate — the
|
|
188
|
+
// lost-update window under concurrent writers.
|
|
189
|
+
async function assertVersion(store, chainId, ifMatch) {
|
|
190
|
+
if (ifMatch === undefined)
|
|
191
|
+
return;
|
|
192
|
+
const head = await readHead(store, chainId);
|
|
193
|
+
const actual = head?.version ?? emptyVersion;
|
|
194
|
+
if (actual !== ifMatch)
|
|
195
|
+
throw new VersionMismatchError({ actual, chainId, expected: ifMatch });
|
|
196
|
+
}
|
|
197
|
+
// Write-modify-flip-prime: validate the whole list, write the immutable
|
|
198
|
+
// blob, flip `head` to it, then prime this isolate for read-your-write. Writing
|
|
199
|
+
// the blob before flipping head means a crash in between leaves the old head
|
|
200
|
+
// valid (no torn state).
|
|
201
|
+
async function publish(store, chainId, tokens) {
|
|
202
|
+
const list = normalize(chainId, tokens);
|
|
203
|
+
const version = nextVersion();
|
|
204
|
+
const updatedAt = new Date().toISOString();
|
|
205
|
+
await store.put(snapshotKey(chainId, version), JSON.stringify({ chainId, schema: storeSchema, tokens: list, updatedAt, version }));
|
|
206
|
+
await store.put(headKey(chainId), JSON.stringify({ chainId, count: list.length, schema: storeSchema, updatedAt, version }));
|
|
207
|
+
const snapshot = compile({ chainId, tokens: list, updatedAt, version });
|
|
208
|
+
prime(chainId, snapshot);
|
|
209
|
+
return snapshot;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Appends a verified token to a chain's list and publishes a new snapshot.
|
|
213
|
+
* Throws on a duplicate address or (case-insensitive) symbol.
|
|
214
|
+
*/
|
|
215
|
+
export async function create(store, input) {
|
|
216
|
+
const { chainId, currency, decimals, logoUri, name, symbol } = input;
|
|
217
|
+
const address = input.address.toLowerCase();
|
|
218
|
+
const list = await currentList(store, chainId);
|
|
219
|
+
const token = {
|
|
220
|
+
address,
|
|
221
|
+
currency,
|
|
222
|
+
decimals,
|
|
223
|
+
id: address,
|
|
224
|
+
name,
|
|
225
|
+
symbol,
|
|
226
|
+
...(logoUri === undefined ? {} : { logoUri }),
|
|
227
|
+
};
|
|
228
|
+
const snapshot = await publish(store, chainId, [...list, token]);
|
|
229
|
+
return { snapshot, token: snapshot.byAddress.get(address) };
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Partially updates a verified token in place (preserving list order) and
|
|
233
|
+
* publishes a new snapshot. Throws {@link NotFoundError} when the address is
|
|
234
|
+
* absent, and the uniqueness errors when an edit collides with another entry.
|
|
235
|
+
*/
|
|
236
|
+
export async function patch(store, chainId, address, input, options = {}) {
|
|
237
|
+
await assertVersion(store, chainId, options.ifMatch);
|
|
238
|
+
const target = address.toLowerCase();
|
|
239
|
+
const list = await currentList(store, chainId);
|
|
240
|
+
const index = list.findIndex((token) => token.address.toLowerCase() === target);
|
|
241
|
+
if (index === -1)
|
|
242
|
+
throw new NotFoundError({ address: target, chainId });
|
|
243
|
+
// Edit in place, overriding only the fields the patch supplies.
|
|
244
|
+
const next = list.map((token, i) => {
|
|
245
|
+
if (i !== index)
|
|
246
|
+
return token;
|
|
247
|
+
const logoUri = input.logoUri ?? token.logoUri;
|
|
248
|
+
return {
|
|
249
|
+
address: target,
|
|
250
|
+
currency: input.currency ?? token.currency,
|
|
251
|
+
decimals: input.decimals ?? token.decimals,
|
|
252
|
+
id: target,
|
|
253
|
+
name: input.name ?? token.name,
|
|
254
|
+
symbol: input.symbol ?? token.symbol,
|
|
255
|
+
...(logoUri === undefined ? {} : { logoUri }),
|
|
256
|
+
};
|
|
257
|
+
});
|
|
258
|
+
const snapshot = await publish(store, chainId, next);
|
|
259
|
+
return { snapshot, token: snapshot.byAddress.get(target) };
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Removes a verified token from a chain's list and publishes a new snapshot.
|
|
263
|
+
* Throws {@link NotFoundError} when the address is absent.
|
|
264
|
+
*/
|
|
265
|
+
export async function remove(store, chainId, address, options = {}) {
|
|
266
|
+
await assertVersion(store, chainId, options.ifMatch);
|
|
267
|
+
const target = address.toLowerCase();
|
|
268
|
+
const list = await currentList(store, chainId);
|
|
269
|
+
const next = list.filter((token) => token.address.toLowerCase() !== target);
|
|
270
|
+
if (next.length === list.length)
|
|
271
|
+
throw new NotFoundError({ address: target, chainId });
|
|
272
|
+
return { snapshot: await publish(store, chainId, next) };
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Replaces a chain's entire verified list and publishes a new snapshot. Used to
|
|
276
|
+
* bulk-load the initial list and to roll back to a previous one.
|
|
277
|
+
*/
|
|
278
|
+
export async function replace(store, chainId, tokens, options = {}) {
|
|
279
|
+
await assertVersion(store, chainId, options.ifMatch);
|
|
280
|
+
return { snapshot: await publish(store, chainId, tokens) };
|
|
281
|
+
}
|
|
282
|
+
// Sentinel version/time for the empty snapshot served before a chain has any
|
|
283
|
+
// durable head (KV is the single source of truth; nothing is verified until it
|
|
284
|
+
// is written through the API). A real publish replaces these with a monotonic
|
|
285
|
+
// version + actual `updatedAt`.
|
|
286
|
+
const emptyVersion = 'empty';
|
|
287
|
+
const emptyUpdatedAt = new Date(0).toISOString();
|
|
288
|
+
const emptySnapshots = new Map();
|
|
289
|
+
/** Returns the memoized empty {@link Snapshot} for a chain (no verified tokens). */
|
|
290
|
+
function emptySnapshot(chainId) {
|
|
291
|
+
const existing = emptySnapshots.get(chainId);
|
|
292
|
+
if (existing)
|
|
293
|
+
return existing;
|
|
294
|
+
const snapshot = compile({
|
|
295
|
+
chainId,
|
|
296
|
+
tokens: [],
|
|
297
|
+
updatedAt: emptyUpdatedAt,
|
|
298
|
+
version: emptyVersion,
|
|
299
|
+
});
|
|
300
|
+
emptySnapshots.set(chainId, snapshot);
|
|
301
|
+
return snapshot;
|
|
302
|
+
}
|
|
303
|
+
// Default per-isolate soft-refresh window: lookups within this window of the
|
|
304
|
+
// last head check do zero store I/O.
|
|
305
|
+
const defaultRefreshMs = 10_000;
|
|
306
|
+
const cells = new Map();
|
|
307
|
+
// Coalesce concurrent refreshes per chain within one isolate so a soft-stale
|
|
308
|
+
// burst triggers a single head check, not one per in-flight request.
|
|
309
|
+
const refreshes = new Map();
|
|
310
|
+
/**
|
|
311
|
+
* Primes this isolate's in-memory snapshot for a chain. The writer isolate calls
|
|
312
|
+
* this after a successful publish so the next read reflects the write without
|
|
313
|
+
* waiting on store propagation (read-your-write).
|
|
314
|
+
*/
|
|
315
|
+
export function prime(chainId, snapshot) {
|
|
316
|
+
cells.set(chainId, { checkedAt: Date.now(), snapshot });
|
|
317
|
+
}
|
|
318
|
+
// Single-flight wrapper around `refreshCell`: concurrent stale/cold reads for a
|
|
319
|
+
// chain share one in-flight refresh.
|
|
320
|
+
function refresh(c, store, chainId, cell) {
|
|
321
|
+
const existing = refreshes.get(chainId);
|
|
322
|
+
if (existing)
|
|
323
|
+
return existing;
|
|
324
|
+
const flight = (async () => {
|
|
325
|
+
try {
|
|
326
|
+
return await refreshCell(c, store, chainId, cell);
|
|
327
|
+
}
|
|
328
|
+
finally {
|
|
329
|
+
refreshes.delete(chainId);
|
|
330
|
+
}
|
|
331
|
+
})();
|
|
332
|
+
refreshes.set(chainId, flight);
|
|
333
|
+
return flight;
|
|
334
|
+
}
|
|
335
|
+
// Refresh state machine. Soft-stale reads only the head and recompiles
|
|
336
|
+
// solely on a version change; cold loads the full snapshot (an empty snapshot
|
|
337
|
+
// when the chain has no head yet).
|
|
338
|
+
async function refreshCell(c, store, chainId, cell) {
|
|
339
|
+
// Cold: no prior snapshot. Load from store, or an empty snapshot when the
|
|
340
|
+
// chain has no head. A hard failure here propagates (we have nothing good to
|
|
341
|
+
// serve, and must not resurrect deleted tokens).
|
|
342
|
+
if (!cell) {
|
|
343
|
+
const loaded = await Timing.time(c, 'verified_snapshot', () => read(store, chainId));
|
|
344
|
+
const snapshot = loaded ?? emptySnapshot(chainId);
|
|
345
|
+
cells.set(chainId, { checkedAt: Date.now(), snapshot });
|
|
346
|
+
return snapshot;
|
|
347
|
+
}
|
|
348
|
+
// Soft-stale: serve the last good in-memory snapshot and log loudly on
|
|
349
|
+
// failure rather than dropping to empty (no resurrection of deleted tokens).
|
|
350
|
+
try {
|
|
351
|
+
const head = await Timing.time(c, 'verified_head', () => readHead(store, chainId));
|
|
352
|
+
// Unchanged version (or head not yet present): keep snapshot, bump checkedAt.
|
|
353
|
+
if (!head || head.version === cell.snapshot.version) {
|
|
354
|
+
cells.set(chainId, { checkedAt: Date.now(), snapshot: cell.snapshot });
|
|
355
|
+
return cell.snapshot;
|
|
356
|
+
}
|
|
357
|
+
// Version changed: load the new blob directly (head already in hand).
|
|
358
|
+
const snapshot = await Timing.time(c, 'verified_snapshot', () => readBlob(store, chainId, head.version));
|
|
359
|
+
cells.set(chainId, { checkedAt: Date.now(), snapshot });
|
|
360
|
+
return snapshot;
|
|
361
|
+
}
|
|
362
|
+
catch (error) {
|
|
363
|
+
console.error('[verified-tokens] refresh failed; serving last good snapshot', error);
|
|
364
|
+
cells.set(chainId, { checkedAt: Date.now(), snapshot: cell.snapshot });
|
|
365
|
+
return cell.snapshot;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Returns the compiled verified-token {@link Snapshot} for a chain.
|
|
370
|
+
*
|
|
371
|
+
* When the verified-tokens feature is unconfigured, serves an empty snapshot.
|
|
372
|
+
* When configured with a {@link Store.State}, serves a per-isolate snapshot
|
|
373
|
+
* refreshed on a soft TTL: fresh lookups do zero store I/O; soft-stale
|
|
374
|
+
* lookups return the current snapshot immediately and refresh in the background
|
|
375
|
+
* (single-flight, head-only unless the version changed); a cold isolate loads
|
|
376
|
+
* from the store (an empty snapshot when no head exists).
|
|
377
|
+
*/
|
|
378
|
+
export async function snapshot(c, chainId) {
|
|
379
|
+
return Timing.time(c, 'verified_tokens', () => {
|
|
380
|
+
const config = c.get('verifiedTokens');
|
|
381
|
+
// Unconfigured: nothing is verified. No store, no cell.
|
|
382
|
+
if (!config)
|
|
383
|
+
return emptySnapshot(chainId);
|
|
384
|
+
const refreshMs = config.refreshMs ?? defaultRefreshMs;
|
|
385
|
+
const cell = cells.get(chainId);
|
|
386
|
+
// Fresh: serve the in-memory snapshot with zero store I/O.
|
|
387
|
+
if (cell && Date.now() - cell.checkedAt < refreshMs)
|
|
388
|
+
return cell.snapshot;
|
|
389
|
+
// Soft-stale: serve immediately, refresh in the background. Never blocks.
|
|
390
|
+
if (cell) {
|
|
391
|
+
void refresh(c, config.store, chainId, cell);
|
|
392
|
+
return cell.snapshot;
|
|
393
|
+
}
|
|
394
|
+
// Cold: must load before the first response.
|
|
395
|
+
return refresh(c, config.store, chainId, undefined);
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Well-known display currencies surfaced as an OpenAPI `examples` hint on
|
|
400
|
+
* filters that accept any currency string but want to populate the well-known
|
|
401
|
+
* ones in Swagger/Stoplight/Scalar dropdowns. Static hint only — the
|
|
402
|
+
* authoritative set is `Snapshot.currencies` from the live store.
|
|
403
|
+
*/
|
|
404
|
+
export const currencies = ['EUR', 'USD'];
|
|
405
|
+
/**
|
|
406
|
+
* Thrown when a chain's `head` points at a snapshot version whose blob is
|
|
407
|
+
* missing from the store. The write path always writes the blob before flipping
|
|
408
|
+
* the head, so this indicates a torn write or external tampering.
|
|
409
|
+
*/
|
|
410
|
+
export class TornStateError extends Error {
|
|
411
|
+
name = 'VerifiedTokens.TornStateError';
|
|
412
|
+
constructor(options) {
|
|
413
|
+
super(`verified-token head for chain ${options.chainId} points at missing snapshot version "${options.version}".`);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
/** Thrown when a write would introduce a duplicate address on a chain. */
|
|
417
|
+
export class DuplicateAddressError extends Error {
|
|
418
|
+
name = 'VerifiedTokens.DuplicateAddressError';
|
|
419
|
+
constructor(options) {
|
|
420
|
+
super(`verified token ${options.address} already exists on chain ${options.chainId}.`);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Thrown when a write would introduce a duplicate (case-insensitive) symbol on a
|
|
425
|
+
* chain — which would make `GET /tokens/:symbol` ambiguous.
|
|
426
|
+
*/
|
|
427
|
+
export class DuplicateSymbolError extends Error {
|
|
428
|
+
name = 'VerifiedTokens.DuplicateSymbolError';
|
|
429
|
+
constructor(options) {
|
|
430
|
+
super(`verified symbol "${options.symbol}" already exists on chain ${options.chainId}.`);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
/** Thrown when a patch/delete targets an address not in a chain's verified list. */
|
|
434
|
+
export class NotFoundError extends Error {
|
|
435
|
+
name = 'VerifiedTokens.NotFoundError';
|
|
436
|
+
constructor(options) {
|
|
437
|
+
super(`verified token ${options.address} not found on chain ${options.chainId}.`);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Thrown when an `If-Match` precondition does not equal the current head version
|
|
442
|
+
* (best-effort optimistic concurrency).
|
|
443
|
+
*/
|
|
444
|
+
export class VersionMismatchError extends Error {
|
|
445
|
+
name = 'VerifiedTokens.VersionMismatchError';
|
|
446
|
+
constructor(options) {
|
|
447
|
+
super(`verified-token version mismatch on chain ${options.chainId}: expected "${options.expected}", found "${options.actual}".`);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
//# sourceMappingURL=VerifiedTokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VerifiedTokens.js","sourceRoot":"","sources":["../../src/internal/VerifiedTokens.ts"],"names":[],"mappings":"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"}
|