tapimo 0.7.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -7
- package/dist/ApiKey.d.ts +3 -0
- package/dist/ApiKey.d.ts.map +1 -1
- package/dist/ApiKey.js +10 -0
- package/dist/ApiKey.js.map +1 -1
- package/dist/ApiKeys.d.ts +29 -8
- package/dist/ApiKeys.d.ts.map +1 -1
- package/dist/ApiKeys.js +24 -5
- package/dist/ApiKeys.js.map +1 -1
- package/dist/App.d.ts +20680 -15487
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +250 -129
- package/dist/App.js.map +1 -1
- package/dist/Assets.d.ts +10 -0
- package/dist/Assets.d.ts.map +1 -1
- package/dist/Assets.js +17 -4
- package/dist/Assets.js.map +1 -1
- package/dist/Scope.d.ts +19 -8
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +25 -9
- package/dist/Scope.js.map +1 -1
- package/dist/Webhooks.d.ts +1 -1
- package/dist/admin/App.d.ts +667 -76
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/App.js +12 -2
- package/dist/admin/App.js.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +107 -11
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +145 -32
- package/dist/admin/apps/api-keys.js.map +1 -1
- package/dist/admin/apps/earn-vaults.d.ts +1069 -0
- package/dist/admin/apps/earn-vaults.d.ts.map +1 -0
- package/dist/admin/apps/earn-vaults.js +409 -0
- package/dist/admin/apps/earn-vaults.js.map +1 -0
- package/dist/admin/apps/organizations.d.ts +2 -0
- package/dist/admin/apps/organizations.d.ts.map +1 -1
- package/dist/admin/apps/verified-tokens.d.ts +74 -74
- package/dist/admin/ui.generated.d.ts +1 -1
- package/dist/admin/ui.generated.d.ts.map +1 -1
- package/dist/admin/ui.generated.js +99 -43
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/analytics/Analytics.d.ts +4 -0
- package/dist/analytics/Analytics.d.ts.map +1 -1
- package/dist/analytics/Analytics.js +21 -2
- package/dist/analytics/Analytics.js.map +1 -1
- package/dist/analytics/tables/requestEvents.d.ts +22 -1
- package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
- package/dist/analytics/tables/requestEvents.js +59 -39
- package/dist/analytics/tables/requestEvents.js.map +1 -1
- package/dist/apps/Zones.d.ts +8335 -0
- package/dist/apps/Zones.d.ts.map +1 -0
- package/dist/apps/Zones.js +38 -0
- package/dist/apps/Zones.js.map +1 -0
- package/dist/apps/data/App.d.ts +5666 -3934
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/App.js +90 -22
- package/dist/apps/data/App.js.map +1 -1
- package/dist/apps/data/FxOracle.d.ts +1 -1
- package/dist/apps/data/FxOracle.d.ts.map +1 -1
- package/dist/apps/data/index.d.ts +0 -1
- package/dist/apps/data/index.d.ts.map +1 -1
- package/dist/apps/data/index.js +0 -1
- package/dist/apps/data/index.js.map +1 -1
- package/dist/apps/data/routes/activities.d.ts +56 -56
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +130 -65
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +65 -65
- package/dist/apps/data/routes/balances.d.ts +14 -14
- package/dist/apps/data/routes/balances.js +5 -5
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/blocks.d.ts +39 -39
- package/dist/apps/data/routes/coingecko.d.ts +54 -54
- package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
- package/dist/apps/data/routes/coingecko.js +62 -35
- package/dist/apps/data/routes/coingecko.js.map +1 -1
- package/dist/apps/data/routes/earn.d.ts +2574 -0
- package/dist/apps/data/routes/earn.d.ts.map +1 -0
- package/dist/apps/data/routes/earn.js +1574 -0
- package/dist/apps/data/routes/earn.js.map +1 -0
- package/dist/apps/data/routes/exchanges.d.ts +1626 -719
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +656 -193
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts +108 -108
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +59 -8
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +35 -35
- package/dist/apps/data/routes/indexer.d.ts.map +1 -1
- package/dist/apps/data/routes/indexer.js +23 -3
- package/dist/apps/data/routes/indexer.js.map +1 -1
- package/dist/apps/data/routes/receipts.d.ts +33 -33
- package/dist/apps/data/routes/receipts.d.ts.map +1 -1
- package/dist/apps/data/routes/receipts.js +11 -11
- package/dist/apps/data/routes/receipts.js.map +1 -1
- package/dist/apps/data/routes/rpc.d.ts +6 -6
- package/dist/apps/data/routes/rpc.d.ts.map +1 -1
- package/dist/apps/data/routes/rpc.js +214 -22
- package/dist/apps/data/routes/rpc.js.map +1 -1
- package/dist/apps/data/routes/tokenlist.d.ts +1 -1
- package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
- package/dist/apps/data/routes/tokenlist.js +39 -8
- package/dist/apps/data/routes/tokenlist.js.map +1 -1
- package/dist/apps/data/routes/tokens.d.ts +115 -87
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +194 -91
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +54 -54
- package/dist/apps/data/routes/transactions.d.ts.map +1 -1
- package/dist/apps/data/routes/transactions.js +78 -39
- package/dist/apps/data/routes/transactions.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +76 -27
- package/dist/apps/data/routes/transfers.d.ts.map +1 -1
- package/dist/apps/data/routes/transfers.js +165 -67
- package/dist/apps/data/routes/transfers.js.map +1 -1
- package/dist/apps/data/routes/valuation.d.ts +42 -42
- package/dist/apps/data/routes/valuation.js +2 -2
- package/dist/apps/data/routes/valuation.js.map +1 -1
- package/dist/apps/data/routes/verified-tokens.d.ts +36 -36
- package/dist/apps/data/routes/webhooks.d.ts +370 -368
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +161 -59
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +281 -0
- package/dist/apps/data/routes/zones.d.ts.map +1 -0
- package/dist/apps/data/routes/zones.js +252 -0
- package/dist/apps/data/routes/zones.js.map +1 -0
- package/dist/apps/docs/reference.js +6 -5
- package/dist/apps/docs/reference.js.map +1 -1
- package/dist/apps/funding/Access.d.ts +16 -0
- package/dist/apps/funding/Access.d.ts.map +1 -0
- package/dist/apps/funding/Access.js +22 -0
- package/dist/apps/funding/Access.js.map +1 -0
- package/dist/apps/funding/App.d.ts +3183 -0
- package/dist/apps/funding/App.d.ts.map +1 -0
- package/dist/apps/funding/App.js +46 -0
- package/dist/apps/funding/App.js.map +1 -0
- package/dist/apps/funding/Inventory.d.ts +5 -0
- package/dist/apps/funding/Inventory.d.ts.map +1 -0
- package/dist/apps/funding/Inventory.js +25 -0
- package/dist/apps/funding/Inventory.js.map +1 -0
- package/dist/apps/funding/ProviderAttempts.d.ts +5 -0
- package/dist/apps/funding/ProviderAttempts.d.ts.map +1 -0
- package/dist/apps/funding/ProviderAttempts.js +24 -0
- package/dist/apps/funding/ProviderAttempts.js.map +1 -0
- package/dist/apps/funding/index.d.ts +2 -0
- package/dist/apps/funding/index.d.ts.map +1 -0
- package/dist/apps/funding/index.js +2 -0
- package/dist/apps/funding/index.js.map +1 -0
- package/dist/apps/funding/routes/chains.d.ts +169 -0
- package/dist/apps/funding/routes/chains.d.ts.map +1 -0
- package/dist/apps/funding/routes/chains.js +80 -0
- package/dist/apps/funding/routes/chains.js.map +1 -0
- package/dist/apps/funding/routes/deposit-addresses.d.ts +2388 -0
- package/dist/apps/funding/routes/deposit-addresses.d.ts.map +1 -0
- package/dist/apps/funding/routes/deposit-addresses.js +860 -0
- package/dist/apps/funding/routes/deposit-addresses.js.map +1 -0
- package/dist/apps/funding/routes/providers.d.ts +91 -0
- package/dist/apps/funding/routes/providers.d.ts.map +1 -0
- package/dist/apps/funding/routes/providers.js +56 -0
- package/dist/apps/funding/routes/providers.js.map +1 -0
- package/dist/apps/{data/routes/funding.d.ts → funding/routes/quotes.d.ts} +26 -396
- package/dist/apps/funding/routes/quotes.d.ts.map +1 -0
- package/dist/apps/funding/routes/quotes.js +188 -0
- package/dist/apps/funding/routes/quotes.js.map +1 -0
- package/dist/apps/funding/routes/transfers.d.ts +1999 -0
- package/dist/apps/funding/routes/transfers.d.ts.map +1 -0
- package/dist/apps/funding/routes/transfers.js +614 -0
- package/dist/apps/funding/routes/transfers.js.map +1 -0
- package/dist/apps/index.d.ts +3 -1
- package/dist/apps/index.d.ts.map +1 -1
- package/dist/apps/index.js +3 -1
- package/dist/apps/index.js.map +1 -1
- package/dist/apps/management/App.d.ts +839 -574
- package/dist/apps/management/App.d.ts.map +1 -1
- package/dist/apps/management/Billing.d.ts +8 -0
- package/dist/apps/management/Billing.d.ts.map +1 -1
- package/dist/apps/management/Billing.js +12 -0
- package/dist/apps/management/Billing.js.map +1 -1
- package/dist/apps/management/Error.d.ts +12 -0
- package/dist/apps/management/Error.d.ts.map +1 -0
- package/dist/apps/management/Error.js +10 -0
- package/dist/apps/management/Error.js.map +1 -0
- package/dist/apps/management/routes/api-keys.d.ts +296 -19
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +77 -9
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +119 -119
- package/dist/apps/management/routes/faucet.d.ts +35 -35
- package/dist/apps/management/routes/invitations.d.ts +17 -17
- package/dist/apps/management/routes/invitations.d.ts.map +1 -1
- package/dist/apps/management/routes/invitations.js +4 -10
- package/dist/apps/management/routes/invitations.js.map +1 -1
- package/dist/apps/management/routes/invite-links.d.ts +38 -38
- package/dist/apps/management/routes/me.d.ts +6 -6
- package/dist/apps/management/routes/members.d.ts +69 -69
- package/dist/apps/management/routes/orgs.d.ts +16 -16
- package/dist/apps/management/routes/orgs.d.ts.map +1 -1
- package/dist/apps/management/routes/orgs.js +2 -8
- package/dist/apps/management/routes/orgs.js.map +1 -1
- package/dist/apps/management/routes/projects.d.ts +19 -19
- package/dist/apps/management/routes/scopes.d.ts +1 -1
- package/dist/apps/management/routes/scopes.js +2 -2
- package/dist/apps/management/routes/scopes.js.map +1 -1
- package/dist/apps/management/routes/usage.d.ts +72 -72
- package/dist/apps/management/routes/verified-token-requests.d.ts +18 -18
- package/dist/apps/management/routes/webhooks.d.ts +122 -122
- package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/management/routes/webhooks.js +15 -3
- package/dist/apps/management/routes/webhooks.js.map +1 -1
- package/dist/apps/mcp.d.ts +2 -3
- package/dist/apps/mcp.d.ts.map +1 -1
- package/dist/apps/mcp.js +16 -14
- package/dist/apps/mcp.js.map +1 -1
- package/dist/apps/metadata.d.ts +4 -0
- package/dist/apps/metadata.d.ts.map +1 -1
- package/dist/apps/metadata.js +10 -0
- package/dist/apps/metadata.js.map +1 -1
- package/dist/apps/mpp/App.d.ts +57 -58
- package/dist/apps/mpp/App.d.ts.map +1 -1
- package/dist/apps/mpp/App.js +192 -27
- package/dist/apps/mpp/App.js.map +1 -1
- package/dist/apps/mpp/Mpp.d.ts +0 -20
- package/dist/apps/mpp/Mpp.d.ts.map +1 -1
- package/dist/apps/mpp/Mpp.js +0 -24
- package/dist/apps/mpp/Mpp.js.map +1 -1
- package/dist/apps/mpp/internal/Adapter.d.ts +40 -0
- package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Adapter.js +66 -0
- package/dist/apps/mpp/internal/Adapter.js.map +1 -0
- package/dist/apps/mpp/internal/Error.d.ts +4 -0
- package/dist/apps/mpp/internal/Error.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Error.js +41 -0
- package/dist/apps/mpp/internal/Error.js.map +1 -0
- package/dist/apps/mpp/internal/Idempotency.d.ts +33 -0
- package/dist/apps/mpp/internal/Idempotency.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Idempotency.js +28 -0
- package/dist/apps/mpp/internal/Idempotency.js.map +1 -0
- package/dist/apps/mpp/internal/Policy.d.ts +46 -0
- package/dist/apps/mpp/internal/Policy.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Policy.js +57 -0
- package/dist/apps/mpp/internal/Policy.js.map +1 -0
- package/dist/apps/mpp/internal/ScreenManager.d.ts +27 -0
- package/dist/apps/mpp/internal/ScreenManager.d.ts.map +1 -0
- package/dist/apps/mpp/internal/ScreenManager.js +18 -0
- package/dist/apps/mpp/internal/ScreenManager.js.map +1 -0
- package/dist/apps/mpp/internal/Screening.d.ts +35 -0
- package/dist/apps/mpp/internal/Screening.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Screening.js +20 -0
- package/dist/apps/mpp/internal/Screening.js.map +1 -0
- package/dist/apps/mpp/internal/Sponsorship.d.ts +36 -0
- package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Sponsorship.js +103 -0
- package/dist/apps/mpp/internal/Sponsorship.js.map +1 -0
- package/dist/apps/mpp/internal/Utils.d.ts +7 -0
- package/dist/apps/mpp/internal/Utils.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Utils.js +24 -0
- package/dist/apps/mpp/internal/Utils.js.map +1 -0
- package/dist/apps/relay/App.js +183 -23
- package/dist/apps/relay/App.js.map +1 -1
- package/dist/apps/relay/Sponsorships.d.ts +4 -0
- package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
- package/dist/apps/relay/Sponsorships.js +15 -6
- package/dist/apps/relay/Sponsorships.js.map +1 -1
- package/dist/cloudflare.d.ts +50 -0
- package/dist/cloudflare.d.ts.map +1 -1
- package/dist/cloudflare.js +178 -0
- package/dist/cloudflare.js.map +1 -1
- package/dist/db/Db.d.ts +22 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +379 -0
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +933 -1
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +289 -1
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/earnVaults.d.ts +68 -0
- package/dist/db/tables/earnVaults.d.ts.map +1 -0
- package/dist/db/tables/earnVaults.js +72 -0
- package/dist/db/tables/earnVaults.js.map +1 -0
- package/dist/db/tables/fundingCatalog.d.ts +56 -0
- package/dist/db/tables/fundingCatalog.d.ts.map +1 -0
- package/dist/db/tables/fundingCatalog.js +85 -0
- package/dist/db/tables/fundingCatalog.js.map +1 -0
- package/dist/db/tables/fundingDepositAddresses.d.ts +172 -0
- package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
- package/dist/db/tables/fundingDepositAddresses.js +218 -0
- package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
- package/dist/db/tables/fundingDepositRequestObservations.d.ts +45 -0
- package/dist/db/tables/fundingDepositRequestObservations.d.ts.map +1 -0
- package/dist/db/tables/fundingDepositRequestObservations.js +46 -0
- package/dist/db/tables/fundingDepositRequestObservations.js.map +1 -0
- package/dist/db/tables/fundingDeposits.d.ts +171 -0
- package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
- package/dist/db/tables/fundingDeposits.js +182 -0
- package/dist/db/tables/fundingDeposits.js.map +1 -0
- package/dist/db/tables/fundingIdempotency.d.ts +91 -0
- package/dist/db/tables/fundingIdempotency.d.ts.map +1 -0
- package/dist/db/tables/fundingIdempotency.js +103 -0
- package/dist/db/tables/fundingIdempotency.js.map +1 -0
- package/dist/db/tables/fundingTransferEvents.d.ts +12 -0
- package/dist/db/tables/fundingTransferEvents.d.ts.map +1 -0
- package/dist/db/tables/fundingTransferEvents.js +18 -0
- package/dist/db/tables/fundingTransferEvents.js.map +1 -0
- package/dist/db/tables/fundingTransferTransactions.d.ts +15 -0
- package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -0
- package/dist/db/tables/fundingTransferTransactions.js +27 -0
- package/dist/db/tables/fundingTransferTransactions.js.map +1 -0
- package/dist/db/tables/fundingTransfers.d.ts +82 -0
- package/dist/db/tables/fundingTransfers.d.ts.map +1 -0
- package/dist/db/tables/fundingTransfers.js +89 -0
- package/dist/db/tables/fundingTransfers.js.map +1 -0
- package/dist/db/tables/organizations.d.ts +8 -0
- package/dist/db/tables/organizations.d.ts.map +1 -1
- package/dist/db/tables/organizations.js +16 -0
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/projects.d.ts +8 -0
- package/dist/db/tables/projects.d.ts.map +1 -1
- package/dist/db/tables/projects.js +16 -0
- package/dist/db/tables/projects.js.map +1 -1
- package/dist/db/tables/requestUsage.d.ts +13 -0
- package/dist/db/tables/requestUsage.d.ts.map +1 -1
- package/dist/db/tables/requestUsage.js +16 -0
- package/dist/db/tables/requestUsage.js.map +1 -1
- package/dist/db/tables/sponsoredTransactions.d.ts +2 -2
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +1 -1
- package/dist/db/tables/sponsoredTransactions.js.map +1 -1
- package/dist/db/tables/users.d.ts +8 -0
- package/dist/db/tables/users.d.ts.map +1 -1
- package/dist/db/tables/users.js +16 -0
- package/dist/db/tables/users.js.map +1 -1
- package/dist/db/tables/verifiedTokens.d.ts +14 -7
- package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
- package/dist/db/tables/verifiedTokens.js +9 -7
- package/dist/db/tables/verifiedTokens.js.map +1 -1
- package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
- package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
- package/dist/db/tables/webhookSubscriptions.js +24 -3
- package/dist/db/tables/webhookSubscriptions.js.map +1 -1
- package/dist/handlers/relay.js +108 -108
- package/dist/handlers/relay.js.map +1 -1
- package/dist/internal/Auth.d.ts +37 -11
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +75 -16
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +17 -11
- package/dist/internal/Cache.js.map +1 -1
- package/dist/internal/Cursor.js +1 -1
- package/dist/internal/Cursor.js.map +1 -1
- package/dist/internal/EarnRates.d.ts +89 -0
- package/dist/internal/EarnRates.d.ts.map +1 -0
- package/dist/internal/EarnRates.js +266 -0
- package/dist/internal/EarnRates.js.map +1 -0
- package/dist/internal/EarnVaults.d.ts +171 -0
- package/dist/internal/EarnVaults.d.ts.map +1 -0
- package/dist/internal/EarnVaults.js +547 -0
- package/dist/internal/EarnVaults.js.map +1 -0
- package/dist/internal/EdgeCache.d.ts +10 -3
- package/dist/internal/EdgeCache.d.ts.map +1 -1
- package/dist/internal/EdgeCache.js +43 -11
- package/dist/internal/EdgeCache.js.map +1 -1
- package/dist/internal/Id.d.ts +11 -0
- package/dist/internal/Id.d.ts.map +1 -1
- package/dist/internal/Id.js +13 -0
- package/dist/internal/Id.js.map +1 -1
- package/dist/internal/Idempotency.d.ts +83 -0
- package/dist/internal/Idempotency.d.ts.map +1 -0
- package/dist/internal/Idempotency.js +113 -0
- package/dist/internal/Idempotency.js.map +1 -0
- package/dist/internal/IpAllowlist.d.ts +15 -0
- package/dist/internal/IpAllowlist.d.ts.map +1 -0
- package/dist/internal/IpAllowlist.js +27 -0
- package/dist/internal/IpAllowlist.js.map +1 -0
- package/dist/internal/Log.d.ts +64 -9
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +29 -7
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/MetricSink.d.ts.map +1 -1
- package/dist/internal/MetricSink.js +47 -1
- package/dist/internal/MetricSink.js.map +1 -1
- package/dist/internal/OpenApi.d.ts +2 -2
- package/dist/internal/OpenApi.d.ts.map +1 -1
- package/dist/internal/OpenApi.js +4 -1
- package/dist/internal/OpenApi.js.map +1 -1
- package/dist/internal/Provider.d.ts +14 -0
- package/dist/internal/Provider.d.ts.map +1 -0
- package/dist/internal/Provider.js +5 -0
- package/dist/internal/Provider.js.map +1 -0
- package/dist/internal/Schema.d.ts +6 -1
- package/dist/internal/Schema.d.ts.map +1 -1
- package/dist/internal/Schema.js +20 -11
- package/dist/internal/Schema.js.map +1 -1
- package/dist/internal/Store.d.ts +6 -0
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +35 -0
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/Tidx.d.ts +49 -24
- package/dist/internal/Tidx.d.ts.map +1 -1
- package/dist/internal/Tidx.js +90 -12
- package/dist/internal/Tidx.js.map +1 -1
- package/dist/internal/Viem.d.ts +90 -65
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Viem.js +90 -12
- package/dist/internal/Viem.js.map +1 -1
- package/dist/internal/WebhookDestination.d.ts.map +1 -1
- package/dist/internal/WebhookDestination.js +34 -28
- package/dist/internal/WebhookDestination.js.map +1 -1
- package/dist/internal/Webhooks.d.ts +9 -0
- package/dist/internal/Webhooks.d.ts.map +1 -1
- package/dist/internal/Webhooks.js +15 -10
- package/dist/internal/Webhooks.js.map +1 -1
- package/dist/internal/exchange/Provider.d.ts +219 -0
- package/dist/internal/exchange/Provider.d.ts.map +1 -0
- package/dist/internal/exchange/Provider.js +117 -0
- package/dist/internal/exchange/Provider.js.map +1 -0
- package/dist/internal/exchange/index.d.ts +2 -0
- package/dist/internal/exchange/index.d.ts.map +1 -0
- package/dist/internal/exchange/index.js +2 -0
- package/dist/internal/exchange/index.js.map +1 -0
- package/dist/internal/exchange/providers/uniswap.d.ts +57 -0
- package/dist/internal/exchange/providers/uniswap.d.ts.map +1 -0
- package/dist/internal/exchange/providers/uniswap.js +553 -0
- package/dist/internal/exchange/providers/uniswap.js.map +1 -0
- package/dist/internal/funding/Action.d.ts +55 -0
- package/dist/internal/funding/Action.d.ts.map +1 -0
- package/dist/internal/funding/Action.js +74 -0
- package/dist/internal/funding/Action.js.map +1 -0
- package/dist/internal/funding/Catalog.d.ts +107 -0
- package/dist/internal/funding/Catalog.d.ts.map +1 -0
- package/dist/internal/funding/Catalog.js +270 -0
- package/dist/internal/funding/Catalog.js.map +1 -0
- package/dist/internal/funding/Chain.d.ts +76 -0
- package/dist/internal/funding/Chain.d.ts.map +1 -0
- package/dist/internal/funding/Chain.js +38 -0
- package/dist/internal/funding/Chain.js.map +1 -0
- package/dist/internal/funding/Deposit.d.ts +408 -0
- package/dist/internal/funding/Deposit.d.ts.map +1 -0
- package/dist/internal/funding/Deposit.js +318 -0
- package/dist/internal/funding/Deposit.js.map +1 -0
- package/dist/internal/funding/DepositAddress.d.ts +345 -0
- package/dist/internal/funding/DepositAddress.d.ts.map +1 -0
- package/dist/internal/funding/DepositAddress.js +189 -0
- package/dist/internal/funding/DepositAddress.js.map +1 -0
- package/dist/internal/funding/Evidence.d.ts +48 -0
- package/dist/internal/funding/Evidence.d.ts.map +1 -0
- package/dist/internal/funding/Evidence.js +315 -0
- package/dist/internal/funding/Evidence.js.map +1 -0
- package/dist/internal/funding/Provider.d.ts +1288 -0
- package/dist/internal/funding/Provider.d.ts.map +1 -0
- package/dist/internal/funding/Provider.js +1086 -0
- package/dist/internal/funding/Provider.js.map +1 -0
- package/dist/internal/funding/Reconciliation.d.ts +127 -0
- package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
- package/dist/internal/funding/Reconciliation.js +885 -0
- package/dist/internal/funding/Reconciliation.js.map +1 -0
- package/dist/internal/funding/Route.d.ts +21 -0
- package/dist/internal/funding/Route.d.ts.map +1 -0
- package/dist/internal/funding/Route.js +5 -0
- package/dist/internal/funding/Route.js.map +1 -0
- package/dist/internal/funding/SourceObservation.d.ts +108 -0
- package/dist/internal/funding/SourceObservation.d.ts.map +1 -0
- package/dist/internal/funding/SourceObservation.js +143 -0
- package/dist/internal/funding/SourceObservation.js.map +1 -0
- package/dist/internal/funding/Subsidy.d.ts +113 -0
- package/dist/internal/funding/Subsidy.d.ts.map +1 -0
- package/dist/internal/funding/Subsidy.js +138 -0
- package/dist/internal/funding/Subsidy.js.map +1 -0
- package/dist/internal/funding/Token.d.ts +41 -0
- package/dist/internal/funding/Token.d.ts.map +1 -0
- package/dist/internal/funding/Token.js +22 -0
- package/dist/internal/funding/Token.js.map +1 -0
- package/dist/internal/funding/Transfer.d.ts +643 -0
- package/dist/internal/funding/Transfer.d.ts.map +1 -0
- package/dist/internal/funding/Transfer.js +332 -0
- package/dist/internal/funding/Transfer.js.map +1 -0
- package/dist/internal/funding/index.d.ts +14 -0
- package/dist/internal/funding/index.d.ts.map +1 -0
- package/dist/internal/funding/index.js +14 -0
- package/dist/internal/funding/index.js.map +1 -0
- package/dist/internal/funding/providers/across.d.ts +21 -0
- package/dist/internal/funding/providers/across.d.ts.map +1 -0
- package/dist/internal/funding/providers/across.js +117 -0
- package/dist/internal/funding/providers/across.js.map +1 -0
- package/dist/internal/funding/providers/relay.d.ts +88 -0
- package/dist/internal/funding/providers/relay.d.ts.map +1 -0
- package/dist/internal/funding/providers/relay.js +871 -0
- package/dist/internal/funding/providers/relay.js.map +1 -0
- package/dist/internal/funding/providers/rhino.d.ts +15 -0
- package/dist/internal/funding/providers/rhino.d.ts.map +1 -0
- package/dist/internal/funding/providers/rhino.js +116 -0
- package/dist/internal/funding/providers/rhino.js.map +1 -0
- package/dist/internal/funding/providers/squid.d.ts +19 -0
- package/dist/internal/funding/providers/squid.d.ts.map +1 -0
- package/dist/internal/funding/providers/squid.js +120 -0
- package/dist/internal/funding/providers/squid.js.map +1 -0
- package/dist/internal/funding/providers/symbiosis.d.ts +20 -0
- package/dist/internal/funding/providers/symbiosis.d.ts.map +1 -0
- package/dist/internal/funding/providers/symbiosis.js +176 -0
- package/dist/internal/funding/providers/symbiosis.js.map +1 -0
- package/dist/internal/index.d.ts +5 -1
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +5 -1
- package/dist/internal/index.js.map +1 -1
- package/dist/internal/webhookDestinations/url.js +61 -57
- package/dist/internal/webhookDestinations/url.js.map +1 -1
- package/dist/providers/index.d.ts +43 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +19 -0
- package/dist/providers/index.js.map +1 -0
- package/package.json +10 -5
- package/src/ApiKey.test.ts +35 -0
- package/src/ApiKey.ts +27 -0
- package/src/ApiKeys.test.ts +40 -7
- package/src/ApiKeys.ts +46 -10
- package/src/App.test.ts +108 -15
- package/src/App.ts +296 -138
- package/src/Assets.ts +29 -4
- package/src/Client.test-d.ts +809 -37
- package/src/Scope.test.ts +19 -0
- package/src/Scope.ts +28 -11
- package/src/Webhooks.test.ts +25 -0
- package/src/Webhooks.ts +1 -1
- package/src/admin/App.test.ts +9 -2
- package/src/admin/App.ts +32 -9
- package/src/admin/apps/api-keys.test.ts +190 -22
- package/src/admin/apps/api-keys.ts +170 -28
- package/src/admin/apps/earn-vaults.test.ts +338 -0
- package/src/admin/apps/earn-vaults.ts +572 -0
- package/src/admin/apps/scopes.test.ts +16 -1
- package/src/admin/ui/plugin.ts +2 -2
- package/src/admin/ui/src/components/EarnVaultForm.tsx +137 -0
- package/src/admin/ui/src/components/MobileProfile.tsx +2 -2
- package/src/admin/ui/src/components/Page.tsx +1 -1
- package/src/admin/ui/src/components/ThemeToggle.tsx +1 -1
- package/src/admin/ui/src/lib/api-keys.ts +37 -7
- package/src/admin/ui/src/lib/client.ts +1 -1
- package/src/admin/ui/src/lib/config.ts +1 -1
- package/src/admin/ui/src/lib/early-access.ts +8 -9
- package/src/admin/ui/src/lib/earn-vaults.ts +207 -0
- package/src/admin/ui/src/lib/format.ts +13 -0
- package/src/admin/ui/src/lib/organizations.test.ts +14 -4
- package/src/admin/ui/src/lib/organizations.ts +7 -1
- package/src/admin/ui/src/lib/response.ts +22 -0
- package/src/admin/ui/src/lib/scopes.test.ts +19 -11
- package/src/admin/ui/src/lib/scopes.ts +28 -7
- package/src/admin/ui/src/lib/verified-tokens.ts +10 -9
- package/src/admin/ui/src/routeTree.gen.ts +70 -7
- package/src/admin/ui/src/router.tsx +2 -2
- package/src/admin/ui/src/routes/__root.tsx +9 -8
- package/src/admin/ui/src/routes/api-keys.tsx +475 -64
- package/src/admin/ui/src/routes/early-access.tsx +5 -12
- package/src/admin/ui/src/routes/earn.vaults.tsx +348 -0
- package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +154 -0
- package/src/admin/ui/src/routes/earn.vaults_.new.tsx +190 -0
- package/src/admin/ui/src/routes/organizations.tsx +4 -7
- package/src/admin/ui/src/routes/organizations_.$orgId.tsx +56 -54
- package/src/admin/ui/src/routes/verified-tokens.tsx +4 -4
- package/src/admin/ui/vite.config.ts +4 -1
- package/src/admin/ui.generated.ts +113 -43
- package/src/analytics/Analytics.test.ts +69 -10
- package/src/analytics/Analytics.ts +24 -1
- package/src/analytics/tables/requestEvents.ts +79 -37
- package/src/apps/Zones.test.ts +33 -0
- package/src/apps/Zones.ts +40 -0
- package/src/apps/composition.test.ts +184 -3
- package/src/apps/data/App.test.ts +28 -23
- package/src/apps/data/App.ts +95 -36
- package/src/apps/data/FxOracle.ts +1 -1
- package/src/apps/data/index.ts +0 -1
- package/src/apps/data/routes/activities.test.ts +82 -6
- package/src/apps/data/routes/activities.ts +131 -71
- package/src/apps/data/routes/balances.test.ts +50 -37
- package/src/apps/data/routes/balances.ts +5 -5
- package/src/apps/data/routes/blocks.test.ts +2 -0
- package/src/apps/data/routes/coingecko.test.ts +22 -0
- package/src/apps/data/routes/coingecko.ts +84 -48
- package/src/apps/data/routes/earn.test.ts +1391 -0
- package/src/apps/data/routes/earn.ts +2188 -0
- package/src/apps/data/routes/exchanges.test.ts +82 -33
- package/src/apps/data/routes/exchanges.ts +842 -227
- package/src/apps/data/routes/fee-amm.test.ts +4 -6
- package/src/apps/data/routes/fee-amm.ts +69 -12
- package/src/apps/data/routes/indexer.test.ts +43 -34
- package/src/apps/data/routes/indexer.ts +21 -3
- package/src/apps/data/routes/receipts.test.ts +5 -3
- package/src/apps/data/routes/receipts.ts +13 -11
- package/src/apps/data/routes/rpc.test.ts +446 -28
- package/src/apps/data/routes/rpc.ts +245 -25
- package/src/apps/data/routes/tokenlist.ts +72 -19
- package/src/apps/data/routes/tokens.test.ts +6 -8
- package/src/apps/data/routes/tokens.ts +258 -86
- package/src/apps/data/routes/transactions.test.ts +2 -0
- package/src/apps/data/routes/transactions.ts +77 -42
- package/src/apps/data/routes/transfers.test.ts +166 -4
- package/src/apps/data/routes/transfers.ts +216 -78
- package/src/apps/data/routes/valuation.test.ts +62 -9
- package/src/apps/data/routes/valuation.ts +2 -2
- package/src/apps/data/routes/webhooks.test.ts +386 -43
- package/src/apps/data/routes/webhooks.ts +172 -71
- package/src/apps/data/routes/zones.test.ts +473 -0
- package/src/apps/data/routes/zones.ts +338 -0
- package/src/apps/docs/reference.ts +8 -6
- package/src/apps/funding/Access.ts +26 -0
- package/src/apps/funding/App.test.ts +78 -0
- package/src/apps/funding/App.ts +63 -0
- package/src/apps/funding/Inventory.ts +30 -0
- package/src/apps/funding/ProviderAttempts.ts +26 -0
- package/src/apps/funding/index.ts +1 -0
- package/src/apps/funding/routes/chains.test.ts +78 -0
- package/src/apps/funding/routes/chains.ts +101 -0
- package/src/apps/funding/routes/deposit-addresses.test.ts +1628 -0
- package/src/apps/funding/routes/deposit-addresses.ts +1015 -0
- package/src/apps/funding/routes/providers.test.ts +165 -0
- package/src/apps/funding/routes/providers.ts +73 -0
- package/src/apps/funding/routes/quotes.test.ts +511 -0
- package/src/apps/funding/routes/quotes.ts +205 -0
- package/src/apps/funding/routes/transfers.test.ts +1255 -0
- package/src/apps/funding/routes/transfers.ts +704 -0
- package/src/apps/index.ts +3 -1
- package/src/apps/management/Billing.test.ts +29 -0
- package/src/apps/management/Billing.ts +23 -0
- package/src/apps/management/Error.ts +12 -0
- package/src/apps/management/routes/api-keys.test.ts +103 -3
- package/src/apps/management/routes/api-keys.ts +98 -10
- package/src/apps/management/routes/invitations.ts +4 -11
- package/src/apps/management/routes/orgs.ts +2 -9
- package/src/apps/management/routes/scopes.test.ts +7 -2
- package/src/apps/management/routes/scopes.ts +2 -2
- package/src/apps/management/routes/webhooks.test.ts +6 -1
- package/src/apps/management/routes/webhooks.ts +15 -3
- package/src/apps/mcp.test.ts +17 -2
- package/src/apps/mcp.ts +18 -13
- package/src/apps/metadata.ts +12 -0
- package/src/apps/mpp/App.ts +276 -29
- package/src/apps/mpp/Mpp.test.ts +631 -26
- package/src/apps/mpp/Mpp.ts +0 -42
- package/src/apps/mpp/internal/Adapter.ts +108 -3
- package/src/apps/mpp/internal/Error.test.ts +33 -0
- package/src/apps/mpp/internal/Error.ts +44 -6
- package/src/apps/mpp/internal/Idempotency.test.ts +213 -0
- package/src/apps/mpp/internal/Idempotency.ts +59 -5
- package/src/apps/mpp/internal/Policy.test.ts +128 -0
- package/src/apps/mpp/internal/Policy.ts +98 -0
- package/src/apps/mpp/internal/ScreenManager.test.ts +68 -0
- package/src/apps/mpp/internal/ScreenManager.ts +41 -0
- package/src/apps/mpp/internal/Screening.ts +40 -3
- package/src/apps/mpp/internal/Sponsorship.ts +144 -0
- package/src/apps/mpp/internal/Utils.ts +30 -0
- package/src/apps/relay/App.test.ts +493 -62
- package/src/apps/relay/App.ts +233 -23
- package/src/apps/relay/Sponsorships.test.ts +49 -0
- package/src/apps/relay/Sponsorships.ts +18 -6
- package/src/cloudflare.ts +279 -0
- package/src/db/Db.ts +501 -0
- package/src/db/Schema.ts +349 -2
- package/src/db/tables/earnVaults.test.ts +185 -0
- package/src/db/tables/earnVaults.ts +151 -0
- package/src/db/tables/fundingCatalog.test.ts +108 -0
- package/src/db/tables/fundingCatalog.ts +157 -0
- package/src/db/tables/fundingDepositAddresses.test.ts +580 -0
- package/src/db/tables/fundingDepositAddresses.ts +404 -0
- package/src/db/tables/fundingDepositRequestObservations.test.ts +106 -0
- package/src/db/tables/fundingDepositRequestObservations.ts +99 -0
- package/src/db/tables/fundingDeposits.test.ts +399 -0
- package/src/db/tables/fundingDeposits.ts +373 -0
- package/src/db/tables/fundingIdempotency.test.ts +182 -0
- package/src/db/tables/fundingIdempotency.ts +180 -0
- package/src/db/tables/fundingTransferEvents.ts +28 -0
- package/src/db/tables/fundingTransferTransactions.test.ts +69 -0
- package/src/db/tables/fundingTransferTransactions.ts +37 -0
- package/src/db/tables/fundingTransfers.test.ts +89 -0
- package/src/db/tables/fundingTransfers.ts +153 -0
- package/src/db/tables/organizations.ts +16 -0
- package/src/db/tables/projects.ts +16 -0
- package/src/db/tables/requestUsage.ts +23 -0
- package/src/db/tables/sponsoredTransactions.test.ts +11 -0
- package/src/db/tables/sponsoredTransactions.ts +3 -3
- package/src/db/tables/users.ts +16 -0
- package/src/db/tables/verifiedTokens.ts +19 -14
- package/src/db/tables/webhookSubscriptions.ts +58 -3
- package/src/handlers/relay.test.ts +2 -0
- package/src/handlers/relay.ts +95 -99
- package/src/internal/Auth.test.ts +225 -5
- package/src/internal/Auth.ts +109 -20
- package/src/internal/Cache.test.ts +37 -3
- package/src/internal/Cache.ts +14 -10
- package/src/internal/Cursor.test.ts +2 -2
- package/src/internal/Cursor.ts +1 -1
- package/src/internal/EarnRates.test.ts +125 -0
- package/src/internal/EarnRates.ts +409 -0
- package/src/internal/EarnVaults.test.ts +195 -0
- package/src/internal/EarnVaults.ts +876 -0
- package/src/internal/EdgeCache.test.ts +26 -7
- package/src/internal/EdgeCache.ts +48 -9
- package/src/internal/Id.ts +14 -0
- package/src/internal/Idempotency.test.ts +109 -0
- package/src/internal/Idempotency.ts +237 -0
- package/src/internal/IpAllowlist.test.ts +52 -0
- package/src/internal/IpAllowlist.ts +39 -0
- package/src/internal/Log.test-d.ts +41 -8
- package/src/internal/Log.test.ts +196 -9
- package/src/internal/Log.ts +124 -17
- package/src/internal/MetricSink.test.ts +244 -4
- package/src/internal/MetricSink.ts +51 -1
- package/src/internal/OpenApi.ts +4 -1
- package/src/internal/Provider.test.ts +17 -0
- package/src/internal/Provider.ts +17 -0
- package/src/internal/Schema.ts +27 -17
- package/src/internal/Store.test.ts +25 -0
- package/src/internal/Store.ts +46 -0
- package/src/internal/Tidx.local.test.ts +78 -3
- package/src/internal/Tidx.test.ts +240 -18
- package/src/internal/Tidx.ts +129 -33
- package/src/internal/VerifiedTokens.test.ts +15 -0
- package/src/internal/Viem.test.ts +198 -17
- package/src/internal/Viem.ts +127 -28
- package/src/internal/WebhookDestination.ts +25 -23
- package/src/internal/Webhooks.test.ts +59 -0
- package/src/internal/Webhooks.ts +34 -10
- package/src/internal/exchange/Provider.test.ts +216 -0
- package/src/internal/exchange/Provider.ts +326 -0
- package/src/internal/exchange/index.test.ts +6 -0
- package/src/internal/exchange/index.ts +1 -0
- package/src/internal/exchange/providers/uniswap.test.ts +122 -0
- package/src/internal/exchange/providers/uniswap.ts +682 -0
- package/src/internal/funding/Action.test.ts +138 -0
- package/src/internal/funding/Action.ts +117 -0
- package/src/internal/funding/Catalog.test.ts +311 -0
- package/src/internal/funding/Catalog.ts +347 -0
- package/src/internal/funding/Chain.test.ts +79 -0
- package/src/internal/funding/Chain.ts +120 -0
- package/src/internal/funding/Deposit.test.ts +26 -0
- package/src/internal/funding/Deposit.ts +522 -0
- package/src/internal/funding/DepositAddress.test.ts +18 -0
- package/src/internal/funding/DepositAddress.ts +312 -0
- package/src/internal/funding/Evidence.test.ts +297 -0
- package/src/internal/funding/Evidence.ts +425 -0
- package/src/internal/funding/Provider.test.ts +1328 -0
- package/src/internal/funding/Provider.ts +1911 -0
- package/src/internal/funding/Reconciliation.local.test.ts +511 -0
- package/src/internal/funding/Reconciliation.test.ts +3037 -0
- package/src/internal/funding/Reconciliation.ts +1202 -0
- package/src/internal/funding/Route.test.ts +66 -0
- package/src/internal/funding/Route.ts +29 -0
- package/src/internal/funding/SourceObservation.test.ts +301 -0
- package/src/internal/funding/SourceObservation.ts +267 -0
- package/src/internal/funding/Subsidy.local.test.ts +152 -0
- package/src/internal/funding/Subsidy.test.ts +75 -0
- package/src/internal/funding/Subsidy.ts +260 -0
- package/src/internal/funding/Token.test.ts +47 -0
- package/src/internal/funding/Token.ts +59 -0
- package/src/internal/funding/Transfer.test.ts +369 -0
- package/src/internal/funding/Transfer.ts +522 -0
- package/src/internal/funding/index.test.ts +21 -0
- package/src/internal/funding/index.ts +13 -0
- package/src/internal/funding/providers/across.ts +149 -0
- package/src/{apps/data/FundingQuoteProviders.test.ts → internal/funding/providers/index.test.ts} +178 -157
- package/src/internal/funding/providers/relay.test.ts +564 -0
- package/src/internal/funding/providers/relay.ts +1060 -0
- package/src/internal/funding/providers/rhino.ts +139 -0
- package/src/internal/funding/providers/squid.ts +151 -0
- package/src/internal/funding/providers/symbiosis.ts +221 -0
- package/src/internal/index.test.ts +5 -1
- package/src/internal/index.ts +5 -1
- package/src/internal/webhookDestinations/url.ts +49 -45
- package/src/providers/index.test.ts +14 -0
- package/src/providers/index.ts +54 -0
- package/dist/apps/data/FundingQuoteProviders.d.ts +0 -174
- package/dist/apps/data/FundingQuoteProviders.d.ts.map +0 -1
- package/dist/apps/data/FundingQuoteProviders.js +0 -775
- package/dist/apps/data/FundingQuoteProviders.js.map +0 -1
- package/dist/apps/data/routes/funding.d.ts.map +0 -1
- package/dist/apps/data/routes/funding.js +0 -410
- package/dist/apps/data/routes/funding.js.map +0 -1
- package/dist/internal/FundingQuotes.d.ts +0 -864
- package/dist/internal/FundingQuotes.d.ts.map +0 -1
- package/dist/internal/FundingQuotes.js +0 -672
- package/dist/internal/FundingQuotes.js.map +0 -1
- package/src/apps/data/FundingQuoteProviders.ts +0 -1043
- package/src/apps/data/routes/funding.test.ts +0 -503
- package/src/apps/data/routes/funding.ts +0 -604
- package/src/internal/FundingQuotes.test.ts +0 -456
- package/src/internal/FundingQuotes.ts +0 -944
package/src/internal/Viem.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { ZoneRpcAuthentication } from 'ox/tempo'
|
|
2
2
|
import { createClient, http, publicActions } from 'viem'
|
|
3
|
-
import type { Client as core_Client, HttpTransport, PublicActions } from 'viem'
|
|
3
|
+
import type { Chain as core_Chain, Client as core_Client, HttpTransport, PublicActions } from 'viem'
|
|
4
4
|
import { tempoActions } from 'viem/tempo'
|
|
5
5
|
import type { TempoActions } from 'viem/tempo'
|
|
6
6
|
import { tempoMainnet, tempoTestnet } from 'viem/tempo/chains'
|
|
7
7
|
import type * as z from 'zod/mini'
|
|
8
8
|
|
|
9
|
-
import
|
|
9
|
+
import * as Auth from './Auth.js'
|
|
10
10
|
import type * as Schema from './Schema.js'
|
|
11
11
|
|
|
12
12
|
/** Known Tempo chains keyed by id, for metadata lookups. */
|
|
@@ -41,22 +41,32 @@ export type Chain = Omit<typeof tempoMainnet, 'id'> & { id: ChainId }
|
|
|
41
41
|
/** Gets a Tempo viem client for a chain id. */
|
|
42
42
|
export type GetClient = (chainId?: ChainId) => getClient.ReturnType
|
|
43
43
|
|
|
44
|
-
/**
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
44
|
+
/** Shared, per-chain, or dynamically resolved RPC URLs. */
|
|
45
|
+
export type UrlResolver =
|
|
46
|
+
| string
|
|
47
|
+
| Record<number, string>
|
|
48
|
+
| ((chainId: ChainId) => string | undefined)
|
|
49
|
+
|
|
50
|
+
/** Headers required when connecting to a Zone upstream. */
|
|
51
|
+
export type ZoneHeaders = Record<string, string>
|
|
52
|
+
|
|
53
|
+
/** Returns chain ids declared by a static chain-id-to-URL map. */
|
|
54
|
+
export function configuredChainIds(value: UrlResolver | undefined): number[] {
|
|
55
|
+
const urls = parseUrls(value)
|
|
56
|
+
if (!urls || typeof urls === 'string' || typeof urls === 'function') return []
|
|
57
|
+
return Object.keys(urls).map(Number)
|
|
58
|
+
}
|
|
49
59
|
|
|
50
60
|
/**
|
|
51
61
|
* Resolves the effective RPC config for a single request.
|
|
52
62
|
*
|
|
53
63
|
* Accepts either a static config object or a per-request resolver function. The
|
|
54
|
-
* resolver receives a {@link
|
|
64
|
+
* resolver receives a {@link resolveRpc.Context} (`chainId` plus the request
|
|
55
65
|
* `principal`), so callers can route traffic per caller — e.g. send anonymous
|
|
56
66
|
* (`principal.type === 'public'`) traffic to a separate, no-auth upstream. A
|
|
57
67
|
* `null` principal denotes a trusted, non-request caller (the scheduled
|
|
58
68
|
* webhook poller). A missing `url` falls back to the built-in public host map
|
|
59
|
-
* ({@link url});
|
|
69
|
+
* ({@link url}); missing `auth` means no Authorization header is sent.
|
|
60
70
|
*
|
|
61
71
|
* Memoization is keyed on the resolved output (see {@link createGetClient} and
|
|
62
72
|
* {@link Tidx.createGetClient}), not the context, so a resolver may branch on
|
|
@@ -64,20 +74,28 @@ export type UrlResolver = (chainId: ChainId) => string | undefined
|
|
|
64
74
|
* resolve to the same upstream share a client. Pass the result to
|
|
65
75
|
* {@link getClient} (or let `getClient` resolve for you) to build a client.
|
|
66
76
|
*/
|
|
67
|
-
export function
|
|
77
|
+
export function resolveRpc(
|
|
68
78
|
rpc: getClient.Rpc | undefined,
|
|
69
|
-
context:
|
|
70
|
-
):
|
|
79
|
+
context: resolveRpc.Context,
|
|
80
|
+
): resolveRpc.Resolved {
|
|
71
81
|
const config = typeof rpc === 'function' ? rpc(context) : rpc
|
|
82
|
+
const auth = Auth.resolveCredential({ chainId: context.chainId, value: config?.auth })
|
|
83
|
+
const publicZoneUrl = context.zone
|
|
84
|
+
? (resolveUrl(config?.publicZoneUrl, context.chainId) ?? context.zone.rpcUrls.default.http[0])
|
|
85
|
+
: undefined
|
|
72
86
|
return {
|
|
73
|
-
|
|
87
|
+
...auth,
|
|
88
|
+
...(publicZoneUrl ? { publicZoneUrl } : {}),
|
|
89
|
+
...(context.zone && config?.zoneHeaders ? { zoneHeaders: config.zoneHeaders } : {}),
|
|
74
90
|
url:
|
|
75
|
-
(
|
|
91
|
+
resolveUrl(config?.url, context.chainId) ??
|
|
92
|
+
context.zone?.rpcUrls['internal']?.http[0] ??
|
|
93
|
+
context.zone?.rpcUrls.default.http[0] ??
|
|
76
94
|
url[context.chainId],
|
|
77
95
|
}
|
|
78
96
|
}
|
|
79
97
|
|
|
80
|
-
export declare namespace
|
|
98
|
+
export declare namespace resolveRpc {
|
|
81
99
|
/** RPC resolution context. */
|
|
82
100
|
type Context = {
|
|
83
101
|
/** Tempo chain id. */
|
|
@@ -88,12 +106,20 @@ export declare namespace resolve {
|
|
|
88
106
|
* `type: 'public'` principal; authenticated requests a `type: 'api_key'` one.
|
|
89
107
|
*/
|
|
90
108
|
principal: Auth.Principal | null
|
|
109
|
+
/** Zone chain selected for this request, when applicable. */
|
|
110
|
+
zone?: core_Chain | undefined
|
|
91
111
|
}
|
|
92
112
|
|
|
93
113
|
/** Resolved RPC config for a single request. */
|
|
94
114
|
type Resolved = {
|
|
95
115
|
/** Basic auth credentials, or undefined to send no Basic auth. */
|
|
96
116
|
basicAuth?: string | undefined
|
|
117
|
+
/** Bearer auth credential, or undefined to send no Bearer auth. */
|
|
118
|
+
bearerAuth?: string | undefined
|
|
119
|
+
/** Public Zone RPC URL that accepts a caller-provided authorization token. */
|
|
120
|
+
publicZoneUrl?: string | undefined
|
|
121
|
+
/** Headers sent to Zone RPC upstreams. */
|
|
122
|
+
zoneHeaders?: ZoneHeaders | undefined
|
|
97
123
|
/**
|
|
98
124
|
* Resolved RPC URL, or `undefined` when neither a configured `rpc` nor the
|
|
99
125
|
* built-in {@link url} map covers the chain (e.g. an unconfigured localnet).
|
|
@@ -104,13 +130,28 @@ export declare namespace resolve {
|
|
|
104
130
|
}
|
|
105
131
|
|
|
106
132
|
export function getClient(options: getClient.Options): getClient.ReturnType {
|
|
107
|
-
const { chainId = defaultChainId, principal = null, rpc, zoneToken } = options
|
|
108
|
-
const { basicAuth, url
|
|
133
|
+
const { chainId = defaultChainId, principal = null, rpc, zone, zoneToken } = options
|
|
134
|
+
const { basicAuth, bearerAuth, publicZoneUrl, url, zoneHeaders } = resolveRpc(rpc, {
|
|
135
|
+
chainId,
|
|
136
|
+
principal,
|
|
137
|
+
zone,
|
|
138
|
+
})
|
|
139
|
+
const usePublicZoneUrl = Boolean(zoneToken && publicZoneUrl)
|
|
140
|
+
const rpcUrl = usePublicZoneUrl ? publicZoneUrl : url
|
|
141
|
+
// Public Zone endpoints authenticate with the caller's token, never internal RPC credentials.
|
|
142
|
+
const authorization = usePublicZoneUrl
|
|
143
|
+
? undefined
|
|
144
|
+
: basicAuth
|
|
145
|
+
? `Basic ${btoa(basicAuth)}`
|
|
146
|
+
: bearerAuth
|
|
147
|
+
? `Bearer ${bearerAuth}`
|
|
148
|
+
: undefined
|
|
109
149
|
const fetchOptions =
|
|
110
|
-
|
|
150
|
+
authorization || zoneToken || zoneHeaders
|
|
111
151
|
? {
|
|
112
152
|
headers: {
|
|
113
|
-
...(
|
|
153
|
+
...(zoneHeaders ? Object.fromEntries(new Headers(zoneHeaders)) : {}),
|
|
154
|
+
...(authorization ? { Authorization: authorization } : {}),
|
|
114
155
|
...(zoneToken ? { [ZoneRpcAuthentication.headerName]: zoneToken } : {}),
|
|
115
156
|
},
|
|
116
157
|
}
|
|
@@ -134,16 +175,26 @@ export function getClient(options: getClient.Options): getClient.ReturnType {
|
|
|
134
175
|
export function createGetClient(options: createGetClient.Options = {}): createGetClient.ReturnType {
|
|
135
176
|
const { defaultChainId: defaultChainId_option = defaultChainId, rpc } = options
|
|
136
177
|
const clients = new Map<string, getClient.ReturnType>()
|
|
178
|
+
const zones = new Map((options.zones ?? []).map((zone) => [zone.id, zone]))
|
|
137
179
|
|
|
138
180
|
return (chainId = defaultChainId_option, principal = null) => {
|
|
139
|
-
const { basicAuth, url } =
|
|
140
|
-
|
|
181
|
+
const { basicAuth, bearerAuth, url, zoneHeaders } = resolveRpc(rpc, {
|
|
182
|
+
chainId,
|
|
183
|
+
principal,
|
|
184
|
+
zone: zones.get(chainId),
|
|
185
|
+
})
|
|
186
|
+
const cacheKey = JSON.stringify([url, basicAuth, bearerAuth, zoneHeaders, chainId])
|
|
141
187
|
const existing = clients.get(cacheKey)
|
|
142
188
|
if (existing) return existing
|
|
143
189
|
|
|
144
190
|
const client = getClient({
|
|
145
191
|
chainId,
|
|
146
|
-
rpc: {
|
|
192
|
+
rpc: {
|
|
193
|
+
auth: basicAuth ?? bearerAuth,
|
|
194
|
+
url: () => url,
|
|
195
|
+
...(zoneHeaders ? { zoneHeaders } : {}),
|
|
196
|
+
},
|
|
197
|
+
zone: zones.get(chainId),
|
|
147
198
|
})
|
|
148
199
|
clients.set(cacheKey, client)
|
|
149
200
|
return client
|
|
@@ -157,6 +208,8 @@ export declare namespace createGetClient {
|
|
|
157
208
|
defaultChainId?: ChainId | undefined
|
|
158
209
|
/** Tempo RPC options applied to every constructed client. */
|
|
159
210
|
rpc?: getClient.Rpc | undefined
|
|
211
|
+
/** Zone chains whose internal RPC URLs serve as per-chain defaults. */
|
|
212
|
+
zones?: readonly core_Chain[] | undefined
|
|
160
213
|
}
|
|
161
214
|
|
|
162
215
|
/** Memoized Tempo client resolver. */
|
|
@@ -182,26 +235,72 @@ export declare namespace getClient {
|
|
|
182
235
|
principal?: Auth.Principal | null | undefined
|
|
183
236
|
/** Tempo RPC options. */
|
|
184
237
|
rpc?: Rpc | undefined
|
|
238
|
+
/** Zone chain metadata used for RPC URL resolution. */
|
|
239
|
+
zone?: core_Chain | undefined
|
|
185
240
|
/** Zone authorization token forwarded to the RPC node. */
|
|
186
241
|
zoneToken?: string | undefined
|
|
187
242
|
}
|
|
188
243
|
|
|
189
244
|
/**
|
|
190
245
|
* Tempo RPC options: either a static config, or a per-request resolver
|
|
191
|
-
* function that receives a {@link
|
|
246
|
+
* function that receives a {@link resolveRpc.Context} and returns the config to
|
|
192
247
|
* use (e.g. routing anonymous callers to a public, no-auth RPC).
|
|
193
248
|
*/
|
|
194
249
|
type Rpc =
|
|
195
250
|
| {
|
|
196
|
-
/** Basic auth
|
|
197
|
-
|
|
251
|
+
/** Shared or per-chain RPC credentials. Values containing `:` use Basic auth; others use Bearer auth. */
|
|
252
|
+
auth?: Auth.ChainCredential | undefined
|
|
253
|
+
/** Resolves the public Zone RPC URL used with caller-provided authorization. */
|
|
254
|
+
publicZoneUrl?: UrlResolver | undefined
|
|
255
|
+
/** Headers sent to Zone RPC upstreams. */
|
|
256
|
+
zoneHeaders?: ZoneHeaders | undefined
|
|
198
257
|
/** Resolves the RPC URL for a Tempo chain id. */
|
|
199
258
|
url?: UrlResolver | undefined
|
|
200
259
|
}
|
|
201
|
-
| ((context:
|
|
202
|
-
/**
|
|
203
|
-
|
|
260
|
+
| ((context: resolveRpc.Context) => {
|
|
261
|
+
/** Shared or per-chain RPC credentials, or undefined for none. */
|
|
262
|
+
auth?: Auth.ChainCredential | undefined
|
|
263
|
+
/** Public Zone RPC URL used with caller-provided authorization. */
|
|
264
|
+
publicZoneUrl?: string | undefined
|
|
265
|
+
/** Headers sent to Zone RPC upstreams. */
|
|
266
|
+
zoneHeaders?: ZoneHeaders | undefined
|
|
204
267
|
/** RPC URL to use; falls back to the built-in public host when omitted. */
|
|
205
268
|
url?: string | undefined
|
|
206
269
|
})
|
|
207
270
|
}
|
|
271
|
+
|
|
272
|
+
/** Resolves a shared or per-chain URL for one chain id. */
|
|
273
|
+
export function resolveUrl(value: UrlResolver | undefined, chainId: ChainId) {
|
|
274
|
+
if (typeof value === 'function') return value(chainId)
|
|
275
|
+
const urls = parseUrls(value)
|
|
276
|
+
if (!urls) return undefined
|
|
277
|
+
if (typeof urls === 'string') return urls
|
|
278
|
+
return urls[chainId]
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
function parseUrls(value: UrlResolver | undefined): Record<number, string> | string | undefined {
|
|
282
|
+
if (!value || typeof value === 'function') return undefined
|
|
283
|
+
const urls =
|
|
284
|
+
typeof value === 'string'
|
|
285
|
+
? (() => {
|
|
286
|
+
try {
|
|
287
|
+
return JSON.parse(value) as unknown
|
|
288
|
+
} catch {
|
|
289
|
+
return value
|
|
290
|
+
}
|
|
291
|
+
})()
|
|
292
|
+
: value
|
|
293
|
+
if (typeof urls === 'string') return urls
|
|
294
|
+
if (
|
|
295
|
+
!urls ||
|
|
296
|
+
typeof urls !== 'object' ||
|
|
297
|
+
Array.isArray(urls) ||
|
|
298
|
+
Object.keys(urls).some((chainId) => {
|
|
299
|
+
const id = Number(chainId)
|
|
300
|
+
return !Number.isSafeInteger(id) || id <= 0 || String(id) !== chainId
|
|
301
|
+
}) ||
|
|
302
|
+
Object.values(urls).some((url) => typeof url !== 'string')
|
|
303
|
+
)
|
|
304
|
+
throw new Error('Expected a URL or a chain-id-to-URL JSON object.')
|
|
305
|
+
return urls as Record<number, string>
|
|
306
|
+
}
|
|
@@ -232,7 +232,7 @@ export const eventTypeHeader = 'tempo-event-type'
|
|
|
232
232
|
*/
|
|
233
233
|
export function sign(options: sign.Options): string {
|
|
234
234
|
const timestamp = options.timestamp ?? Math.floor(Date.now() / 1_000)
|
|
235
|
-
const v1 = hmac(options.secret, `${timestamp}.${options.body}`)
|
|
235
|
+
const v1 = Signature.hmac(options.secret, `${timestamp}.${options.body}`)
|
|
236
236
|
return `t=${timestamp},v1=${v1}`
|
|
237
237
|
}
|
|
238
238
|
|
|
@@ -253,15 +253,15 @@ export declare namespace sign {
|
|
|
253
253
|
* rejects signatures older than `tolerance` seconds (default 300).
|
|
254
254
|
*/
|
|
255
255
|
export function verify(options: verify.Options): boolean {
|
|
256
|
-
const parsed =
|
|
256
|
+
const parsed = Signature.parse(options.signature)
|
|
257
257
|
if (!parsed) return false
|
|
258
258
|
|
|
259
259
|
const tolerance = options.tolerance ?? 300
|
|
260
260
|
const now = options.now ?? Math.floor(Date.now() / 1_000)
|
|
261
261
|
if (Math.abs(now - parsed.timestamp) > tolerance) return false
|
|
262
262
|
|
|
263
|
-
const expected = hmac(options.secret, `${parsed.timestamp}.${options.body}`)
|
|
264
|
-
return timingSafeEqual(expected, parsed.v1)
|
|
263
|
+
const expected = Signature.hmac(options.secret, `${parsed.timestamp}.${options.body}`)
|
|
264
|
+
return Signature.timingSafeEqual(expected, parsed.v1)
|
|
265
265
|
}
|
|
266
266
|
|
|
267
267
|
export declare namespace verify {
|
|
@@ -280,28 +280,30 @@ export declare namespace verify {
|
|
|
280
280
|
}
|
|
281
281
|
}
|
|
282
282
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
283
|
+
namespace Signature {
|
|
284
|
+
export function hmac(secret: string, message: string): string {
|
|
285
|
+
return Hash.hmac256(Hex.fromString(secret), Hex.fromString(message)).slice(2)
|
|
286
|
+
}
|
|
286
287
|
|
|
287
|
-
function
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
288
|
+
export function parse(signature: string): { timestamp: number; v1: string } | null {
|
|
289
|
+
let timestamp: number | undefined
|
|
290
|
+
let v1: string | undefined
|
|
291
|
+
for (const part of signature.split(',')) {
|
|
292
|
+
const [key, value] = part.split('=', 2)
|
|
293
|
+
if (key === 't' && value) timestamp = Number(value)
|
|
294
|
+
else if (key === 'v1' && value) v1 = value
|
|
295
|
+
}
|
|
296
|
+
if (timestamp === undefined || Number.isNaN(timestamp) || !v1) return null
|
|
297
|
+
return { timestamp, v1 }
|
|
294
298
|
}
|
|
295
|
-
if (timestamp === undefined || Number.isNaN(timestamp) || !v1) return null
|
|
296
|
-
return { timestamp, v1 }
|
|
297
|
-
}
|
|
298
299
|
|
|
299
|
-
function timingSafeEqual(
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
300
|
+
export function timingSafeEqual(left: string, right: string): boolean {
|
|
301
|
+
if (left.length !== right.length) return false
|
|
302
|
+
let mismatch = 0
|
|
303
|
+
for (let index = 0; index < left.length; index++)
|
|
304
|
+
mismatch |= left.charCodeAt(index) ^ right.charCodeAt(index)
|
|
305
|
+
return mismatch === 0
|
|
306
|
+
}
|
|
305
307
|
}
|
|
306
308
|
|
|
307
309
|
/** Thrown when a subscriber URL fails SSRF/format validation. */
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Webhooks } from 'tapimo'
|
|
2
2
|
import * as TestApp from '../../test/App.js'
|
|
3
|
+
import * as Cursor from './Cursor.js'
|
|
3
4
|
|
|
4
5
|
const apiKeyOwner = { orgId: 'org_1', type: 'api_key' } as const
|
|
5
6
|
const mppOwner = { payer: 'did:pkh:eip155:1:0xabc', type: 'mpp' } as const
|
|
@@ -56,6 +57,42 @@ describe('createSubscription', () => {
|
|
|
56
57
|
expect(read).toEqual(subscription)
|
|
57
58
|
})
|
|
58
59
|
|
|
60
|
+
test('commits an initial poller cursor through both insert paths', async () => {
|
|
61
|
+
const db = TestApp.database()
|
|
62
|
+
const direct = await Webhooks.createSubscription(db, createInput(), {
|
|
63
|
+
startBlockNumber: 123,
|
|
64
|
+
})
|
|
65
|
+
const capped = await Webhooks.createSubscription(db, createInput({ owner: mppOwner }), {
|
|
66
|
+
maxPerOwner: 1,
|
|
67
|
+
startBlockNumber: 456,
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
expect(Cursor.decode((await Webhooks.getCursor(db, direct.id))!, ['int']))
|
|
71
|
+
.toMatchInlineSnapshot(`
|
|
72
|
+
[
|
|
73
|
+
123,
|
|
74
|
+
]
|
|
75
|
+
`)
|
|
76
|
+
expect(Cursor.decode((await Webhooks.getCursor(db, capped.id))!, ['int']))
|
|
77
|
+
.toMatchInlineSnapshot(`
|
|
78
|
+
[
|
|
79
|
+
456,
|
|
80
|
+
]
|
|
81
|
+
`)
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
test('rejects an invalid initial block number before persisting', async () => {
|
|
85
|
+
const db = TestApp.database()
|
|
86
|
+
|
|
87
|
+
for (const startBlockNumber of [-1, 1.5, Number.MAX_SAFE_INTEGER + 1])
|
|
88
|
+
await expect(
|
|
89
|
+
Webhooks.createSubscription(db, createInput(), { startBlockNumber }),
|
|
90
|
+
).rejects.toThrowErrorMatchingInlineSnapshot(
|
|
91
|
+
`[RangeError: startBlockNumber must be a non-negative safe integer.]`,
|
|
92
|
+
)
|
|
93
|
+
expect(await Webhooks.listSubscriptions(db, apiKeyOwner)).toEqual([])
|
|
94
|
+
})
|
|
95
|
+
|
|
59
96
|
test('sets expiresAt from ttl for MPP-owned subscriptions', async () => {
|
|
60
97
|
const db = TestApp.database()
|
|
61
98
|
const subscription = await Webhooks.createSubscription(
|
|
@@ -301,6 +338,28 @@ describe('cursors', () => {
|
|
|
301
338
|
await Webhooks.setCursor(db, created.id, '12345:7')
|
|
302
339
|
expect(await Webhooks.getCursor(db, created.id)).toMatchInlineSnapshot(`"12345:7"`)
|
|
303
340
|
})
|
|
341
|
+
|
|
342
|
+
test('atomically rejects a stale cursor write', async () => {
|
|
343
|
+
const db = TestApp.database()
|
|
344
|
+
const created = await Webhooks.createSubscription(db, createInput())
|
|
345
|
+
const a = Cursor.encode([100, 1])
|
|
346
|
+
const b = Cursor.encode([100, 2])
|
|
347
|
+
const results = await Promise.all([
|
|
348
|
+
Webhooks.compareAndSetCursor(db, {
|
|
349
|
+
cursor: a,
|
|
350
|
+
expectedCursor: null,
|
|
351
|
+
subscriptionId: created.id,
|
|
352
|
+
}),
|
|
353
|
+
Webhooks.compareAndSetCursor(db, {
|
|
354
|
+
cursor: b,
|
|
355
|
+
expectedCursor: null,
|
|
356
|
+
subscriptionId: created.id,
|
|
357
|
+
}),
|
|
358
|
+
])
|
|
359
|
+
|
|
360
|
+
expect(results.toSorted((a, b) => Number(a) - Number(b))).toEqual([false, true])
|
|
361
|
+
expect([a, b]).toContain(await Webhooks.getCursor(db, created.id))
|
|
362
|
+
})
|
|
304
363
|
})
|
|
305
364
|
|
|
306
365
|
describe('recordSuccess / recordFailure', () => {
|
package/src/internal/Webhooks.ts
CHANGED
|
@@ -5,6 +5,7 @@ import type * as Db from '../db/Db.js'
|
|
|
5
5
|
import * as WebhookDeliveries from '../db/tables/webhookDeliveries.js'
|
|
6
6
|
import * as WebhookSubscriptions from '../db/tables/webhookSubscriptions.js'
|
|
7
7
|
import type * as Metrics from '../Metrics.js'
|
|
8
|
+
import * as Cursor from './Cursor.js'
|
|
8
9
|
import * as Id from './Id.js'
|
|
9
10
|
import * as MetricSink from './MetricSink.js'
|
|
10
11
|
import * as WebhookDestination from './WebhookDestination.js'
|
|
@@ -170,9 +171,18 @@ export async function createSubscription(
|
|
|
170
171
|
options: createSubscription.Options = {},
|
|
171
172
|
): Promise<Subscription> {
|
|
172
173
|
WebhookDestination.assertDestination(input.destination)
|
|
174
|
+
if (
|
|
175
|
+
options.startBlockNumber !== undefined &&
|
|
176
|
+
(!Number.isSafeInteger(options.startBlockNumber) || options.startBlockNumber < 0)
|
|
177
|
+
)
|
|
178
|
+
throw new RangeError('startBlockNumber must be a non-negative safe integer.')
|
|
173
179
|
|
|
174
180
|
const now = (options.now ?? (() => new Date()))()
|
|
175
181
|
const iso = now.toISOString()
|
|
182
|
+
// A one-field checkpoint records the live creation head without claiming it
|
|
183
|
+
// was scanned. The poller expands it using its confirmation depth.
|
|
184
|
+
const pollerCursor =
|
|
185
|
+
options.startBlockNumber === undefined ? undefined : Cursor.encode([options.startBlockNumber])
|
|
176
186
|
|
|
177
187
|
const subscription: Subscription = {
|
|
178
188
|
chainId: input.chainId,
|
|
@@ -196,9 +206,15 @@ export async function createSubscription(
|
|
|
196
206
|
const inserted = await WebhookSubscriptions.insertWithinLimit(db, subscription, {
|
|
197
207
|
maxPerOwner: options.maxPerOwner,
|
|
198
208
|
now: iso,
|
|
209
|
+
...(pollerCursor === undefined ? {} : { pollerCursor }),
|
|
199
210
|
})
|
|
200
211
|
if (!inserted) throw new LimitExceededError(options.maxPerOwner)
|
|
201
|
-
} else
|
|
212
|
+
} else
|
|
213
|
+
await WebhookSubscriptions.insert(
|
|
214
|
+
db,
|
|
215
|
+
subscription,
|
|
216
|
+
pollerCursor === undefined ? {} : { pollerCursor },
|
|
217
|
+
)
|
|
202
218
|
return subscription
|
|
203
219
|
}
|
|
204
220
|
|
|
@@ -209,6 +225,8 @@ export declare namespace createSubscription {
|
|
|
209
225
|
maxPerOwner?: number | undefined
|
|
210
226
|
/** Clock used for timestamps (injectable for tests). */
|
|
211
227
|
now?: (() => Date) | undefined
|
|
228
|
+
/** Chain head observed immediately before the subscription becomes visible. */
|
|
229
|
+
startBlockNumber?: number | undefined
|
|
212
230
|
}
|
|
213
231
|
}
|
|
214
232
|
|
|
@@ -316,6 +334,19 @@ export async function getCursor(db: Db.Db, subscriptionId: string): Promise<stri
|
|
|
316
334
|
return WebhookSubscriptions.getCursor(db, subscriptionId)
|
|
317
335
|
}
|
|
318
336
|
|
|
337
|
+
/** Writes a cursor only when its stored value matches the expected cursor. */
|
|
338
|
+
export async function compareAndSetCursor(
|
|
339
|
+
db: Db.Db,
|
|
340
|
+
options: compareAndSetCursor.Options,
|
|
341
|
+
): Promise<boolean> {
|
|
342
|
+
return WebhookSubscriptions.compareAndSetCursor(db, options)
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
export declare namespace compareAndSetCursor {
|
|
346
|
+
/** Options for {@link compareAndSetCursor}. */
|
|
347
|
+
type Options = WebhookSubscriptions.compareAndSetCursor.Options
|
|
348
|
+
}
|
|
349
|
+
|
|
319
350
|
/** Writes a subscription's keyset cursor. */
|
|
320
351
|
export async function setCursor(db: Db.Db, subscriptionId: string, cursor: string): Promise<void> {
|
|
321
352
|
await WebhookSubscriptions.setCursor(db, subscriptionId, cursor)
|
|
@@ -790,18 +821,11 @@ export declare namespace ping {
|
|
|
790
821
|
}
|
|
791
822
|
|
|
792
823
|
function generateId(now: Date): string {
|
|
793
|
-
|
|
794
|
-
// (mirroring delivery ids), letting listSubscriptions page newest-first; 15
|
|
795
|
-
// digits leaves headroom well past the year 5138.
|
|
796
|
-
const timestamp = now.getTime().toString().padStart(15, '0')
|
|
797
|
-
return `wh_${timestamp}_${Id.random()}`
|
|
824
|
+
return Id.generateSortable('wh', now)
|
|
798
825
|
}
|
|
799
826
|
|
|
800
827
|
function generateDeliveryId(now: Date): string {
|
|
801
|
-
|
|
802
|
-
// digits leaves headroom well past the year 5138.
|
|
803
|
-
const timestamp = now.getTime().toString().padStart(15, '0')
|
|
804
|
-
return `whd_${timestamp}_${Id.random()}`
|
|
828
|
+
return Id.generateSortable('whd', now)
|
|
805
829
|
}
|
|
806
830
|
|
|
807
831
|
function generateSecret(): string {
|