tapimo 0.7.0 → 0.7.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/dist/ApiKeys.d.ts +24 -7
- package/dist/ApiKeys.d.ts.map +1 -1
- package/dist/ApiKeys.js +17 -5
- package/dist/ApiKeys.js.map +1 -1
- package/dist/App.d.ts +12104 -7861
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +191 -128
- 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 +601 -20
- 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 +94 -11
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +141 -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/verified-tokens.d.ts +166 -166
- 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 +151 -95
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/analytics/Analytics.d.ts +2 -0
- package/dist/analytics/Analytics.d.ts.map +1 -1
- package/dist/analytics/Analytics.js +18 -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 +14377 -10165
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/App.js +91 -19
- 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 +32 -32
- 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 +312 -312
- package/dist/apps/data/routes/balances.d.ts +18 -18
- package/dist/apps/data/routes/balances.js +5 -5
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/coingecko.d.ts +176 -176
- 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 +2144 -0
- package/dist/apps/data/routes/earn.d.ts.map +1 -0
- package/dist/apps/data/routes/earn.js +947 -0
- package/dist/apps/data/routes/earn.js.map +1 -0
- package/dist/apps/data/routes/exchanges.d.ts +1231 -324
- 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.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/funding.d.ts +4092 -387
- package/dist/apps/data/routes/funding.d.ts.map +1 -1
- package/dist/apps/data/routes/funding.js +1403 -256
- package/dist/apps/data/routes/funding.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +5 -5
- package/dist/apps/data/routes/indexer.d.ts.map +1 -1
- package/dist/apps/data/routes/indexer.js +19 -2
- package/dist/apps/data/routes/indexer.js.map +1 -1
- package/dist/apps/data/routes/receipts.d.ts +265 -265
- 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 +5 -5
- package/dist/apps/data/routes/rpc.d.ts.map +1 -1
- package/dist/apps/data/routes/rpc.js +211 -22
- package/dist/apps/data/routes/rpc.js.map +1 -1
- package/dist/apps/data/routes/tokenlist.d.ts +36 -36
- package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
- package/dist/apps/data/routes/tokenlist.js +49 -9
- package/dist/apps/data/routes/tokenlist.js.map +1 -1
- package/dist/apps/data/routes/tokens.d.ts +116 -88
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +198 -91
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +55 -55
- 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 +78 -29
- 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 +10 -10
- 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.map +1 -1
- package/dist/apps/data/routes/verified-tokens.js +34 -9
- package/dist/apps/data/routes/verified-tokens.js.map +1 -1
- package/dist/apps/data/routes/webhooks.d.ts +5 -3
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +175 -65
- 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/index.d.ts +2 -1
- package/dist/apps/index.d.ts.map +1 -1
- package/dist/apps/index.js +2 -1
- package/dist/apps/index.js.map +1 -1
- package/dist/apps/management/App.d.ts +670 -670
- 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 +5 -5
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +2 -8
- 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 +62 -62
- 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 +30 -30
- package/dist/apps/management/routes/me.d.ts +6 -6
- package/dist/apps/management/routes/members.d.ts +78 -78
- package/dist/apps/management/routes/orgs.d.ts +48 -48
- 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 +9 -9
- 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 +80 -80
- package/dist/apps/management/routes/verified-token-requests.d.ts +36 -36
- package/dist/apps/management/routes/webhooks.d.ts +50 -50
- 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/mpp/App.d.ts +55 -56
- 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 +184 -24
- 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 +16 -7
- package/dist/apps/relay/Sponsorships.js.map +1 -1
- package/dist/db/Db.d.ts +20 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +342 -0
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +921 -1
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +269 -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 +159 -0
- package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
- package/dist/db/tables/fundingDepositAddresses.js +206 -0
- package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
- package/dist/db/tables/fundingDeposits.d.ts +115 -0
- package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
- package/dist/db/tables/fundingDeposits.js +100 -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 +35 -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 +4 -2
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +14 -4
- 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 +26 -0
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +35 -2
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +16 -10
- 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 +9 -2
- package/dist/internal/EdgeCache.d.ts.map +1 -1
- package/dist/internal/EdgeCache.js +36 -9
- 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/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 +1 -1
- package/dist/internal/OpenApi.d.ts.map +1 -1
- package/dist/internal/OpenApi.js +3 -0
- package/dist/internal/OpenApi.js.map +1 -1
- package/dist/internal/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 +8 -3
- package/dist/internal/Schema.d.ts.map +1 -1
- package/dist/internal/Schema.js +24 -13
- 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 +43 -24
- package/dist/internal/Tidx.d.ts.map +1 -1
- package/dist/internal/Tidx.js +79 -11
- package/dist/internal/Tidx.js.map +1 -1
- package/dist/internal/Viem.d.ts +82 -65
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Viem.js +83 -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 +366 -0
- package/dist/internal/funding/Deposit.d.ts.map +1 -0
- package/dist/internal/funding/Deposit.js +286 -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 +52 -0
- package/dist/internal/funding/Evidence.d.ts.map +1 -0
- package/dist/internal/funding/Evidence.js +314 -0
- package/dist/internal/funding/Evidence.js.map +1 -0
- package/dist/internal/funding/Provider.d.ts +1186 -0
- package/dist/internal/funding/Provider.d.ts.map +1 -0
- package/dist/internal/funding/Provider.js +1081 -0
- package/dist/internal/funding/Provider.js.map +1 -0
- package/dist/internal/funding/Reconciliation.d.ts +113 -0
- package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
- package/dist/internal/funding/Reconciliation.js +676 -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/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 +13 -0
- package/dist/internal/funding/index.d.ts.map +1 -0
- package/dist/internal/funding/index.js +13 -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 +46 -0
- package/dist/internal/funding/providers/relay.d.ts.map +1 -0
- package/dist/internal/funding/providers/relay.js +464 -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 +9 -4
- package/src/ApiKeys.test.ts +11 -7
- package/src/ApiKeys.ts +37 -9
- package/src/App.test.ts +85 -10
- package/src/App.ts +224 -137
- package/src/Assets.ts +29 -4
- package/src/Client.test-d.ts +650 -30
- 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 +167 -23
- package/src/admin/apps/api-keys.ts +166 -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 +189 -95
- package/src/analytics/Analytics.test.ts +69 -10
- package/src/analytics/Analytics.ts +20 -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 +84 -1
- package/src/apps/data/App.test.ts +38 -9
- package/src/apps/data/App.ts +96 -33
- 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 +1108 -0
- package/src/apps/data/routes/earn.ts +1391 -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/funding.test.ts +2712 -221
- package/src/apps/data/routes/funding.ts +1604 -387
- package/src/apps/data/routes/indexer.test.ts +43 -34
- package/src/apps/data/routes/indexer.ts +19 -2
- 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 +243 -25
- package/src/apps/data/routes/tokenlist.test.ts +15 -0
- package/src/apps/data/routes/tokenlist.ts +88 -22
- package/src/apps/data/routes/tokens.ts +262 -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/verified-tokens.test.ts +51 -0
- package/src/apps/data/routes/verified-tokens.ts +52 -15
- package/src/apps/data/routes/webhooks.test.ts +432 -33
- package/src/apps/data/routes/webhooks.ts +189 -79
- 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/index.ts +2 -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 +5 -3
- package/src/apps/management/routes/api-keys.ts +2 -9
- 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/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 +122 -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 +495 -64
- package/src/apps/relay/App.ts +234 -24
- package/src/apps/relay/Sponsorships.test.ts +51 -0
- package/src/apps/relay/Sponsorships.ts +19 -7
- package/src/db/Db.ts +439 -0
- package/src/db/Schema.ts +325 -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 +376 -0
- package/src/db/tables/fundingDeposits.test.ts +261 -0
- package/src/db/tables/fundingDeposits.ts +229 -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.test.ts +88 -0
- package/src/db/tables/organizations.ts +42 -1
- package/src/db/tables/projects.ts +16 -0
- package/src/db/tables/requestUsage.ts +23 -0
- package/src/db/tables/sponsoredTransactions.test.ts +52 -2
- package/src/db/tables/sponsoredTransactions.ts +18 -6
- 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 +48 -0
- package/src/internal/Auth.ts +61 -2
- package/src/internal/Cache.ts +13 -9
- 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 +37 -5
- package/src/internal/EdgeCache.ts +39 -7
- 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/Log.test-d.ts +41 -8
- package/src/internal/Log.test.ts +189 -8
- 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 +3 -0
- package/src/internal/Provider.test.ts +17 -0
- package/src/internal/Provider.ts +17 -0
- package/src/internal/Schema.test.ts +13 -0
- package/src/internal/Schema.ts +41 -24
- 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 +212 -18
- package/src/internal/Tidx.ts +112 -32
- package/src/internal/VerifiedTokens.test.ts +15 -0
- package/src/internal/Viem.test.ts +170 -17
- package/src/internal/Viem.ts +111 -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 +453 -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 +430 -0
- package/src/internal/funding/Provider.test.ts +1328 -0
- package/src/internal/funding/Provider.ts +1796 -0
- package/src/internal/funding/Reconciliation.local.test.ts +504 -0
- package/src/internal/funding/Reconciliation.test.ts +2020 -0
- package/src/internal/funding/Reconciliation.ts +930 -0
- package/src/internal/funding/Route.test.ts +66 -0
- package/src/internal/funding/Route.ts +29 -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 +20 -0
- package/src/internal/funding/index.ts +12 -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 +474 -0
- package/src/internal/funding/providers/relay.ts +559 -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/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/internal/FundingQuotes.test.ts +0 -456
- package/src/internal/FundingQuotes.ts +0 -944
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ExpressionBuilder, Selectable } from 'kysely'
|
|
1
|
+
import type { ExpressionBuilder, Selectable, SqlBool } from 'kysely'
|
|
2
2
|
import { sql } from 'kysely'
|
|
3
3
|
|
|
4
4
|
import * as Id from '../../internal/Id.js'
|
|
@@ -11,6 +11,9 @@ export type Table = db_Schema.SponsoredTransaction
|
|
|
11
11
|
/** A stored sponsored-transaction row. */
|
|
12
12
|
export type Record = Selectable<Table>
|
|
13
13
|
|
|
14
|
+
/** How long failed fill intents remain eligible for on-chain reconciliation. */
|
|
15
|
+
export const failedIntentRecoveryTtlMs = 86_400_000
|
|
16
|
+
|
|
14
17
|
/**
|
|
15
18
|
* Records one sponsorship commitment as `pending`, keyed by its fee-payer
|
|
16
19
|
* sign payload. Written after fee-payer signing and before any broadcast, so
|
|
@@ -37,7 +40,7 @@ export async function upsert(db: Db.Db, input: upsert.Input): Promise<Record> {
|
|
|
37
40
|
id: Id.generate('stx'),
|
|
38
41
|
meterReportedAt: null,
|
|
39
42
|
orgId: input.orgId,
|
|
40
|
-
projectId: input.projectId,
|
|
43
|
+
projectId: input.projectId ?? null,
|
|
41
44
|
signPayload: input.signPayload,
|
|
42
45
|
status: 'pending',
|
|
43
46
|
transaction: input.transaction,
|
|
@@ -92,8 +95,8 @@ export declare namespace upsert {
|
|
|
92
95
|
feeToken?: string | undefined
|
|
93
96
|
/** Organization id (`org_…`) the spend attributes to. */
|
|
94
97
|
orgId: string
|
|
95
|
-
/** Project id (`prj_…`) the spend attributes to. */
|
|
96
|
-
projectId
|
|
98
|
+
/** Project id (`prj_…`) the spend attributes to; omit for organization-level spend. */
|
|
99
|
+
projectId?: string | undefined
|
|
97
100
|
/** Fee-payer sign payload — a stable identity for the sponsored envelope. */
|
|
98
101
|
signPayload: string
|
|
99
102
|
/** Serialized sponsored transaction, kept for observability beyond log retention. */
|
|
@@ -199,9 +202,15 @@ export async function assignTransactionHash(
|
|
|
199
202
|
!['failed', 'pending'].includes(record.status)
|
|
200
203
|
)
|
|
201
204
|
return
|
|
205
|
+
const failedSince = new Date(Date.now() - failedIntentRecoveryTtlMs).toISOString()
|
|
206
|
+
if (
|
|
207
|
+
record.status === 'failed' &&
|
|
208
|
+
(record.finalizedAt === null || record.finalizedAt < failedSince)
|
|
209
|
+
)
|
|
210
|
+
return
|
|
202
211
|
if (record.status === 'failed' && record.billable && limit)
|
|
203
212
|
await sql`select pg_advisory_xact_lock(${billingLockClass}, hashtext(${record.orgId}))`.execute(tx.kysely) // prettier-ignore
|
|
204
|
-
|
|
213
|
+
let query = tx.kysely
|
|
205
214
|
.updateTable('sponsored_transactions')
|
|
206
215
|
.set({
|
|
207
216
|
...(record.status === 'failed' ? { createdAt: new Date().toISOString() } : {}),
|
|
@@ -212,7 +221,10 @@ export async function assignTransactionHash(
|
|
|
212
221
|
.where('id', '=', id)
|
|
213
222
|
.where('status', '=', record.status)
|
|
214
223
|
.where('transactionHash', 'is', null)
|
|
215
|
-
|
|
224
|
+
if (record.status === 'failed')
|
|
225
|
+
query = query.where(sql<SqlBool>`exists (select 1 from organizations where organizations.id = sponsored_transactions.org_id)`) // prettier-ignore
|
|
226
|
+
const updated = await query.executeTakeFirst()
|
|
227
|
+
if (updated.numUpdatedRows === 0n) return
|
|
216
228
|
if (record.status === 'failed' && record.billable && limit) {
|
|
217
229
|
const committed = await spend(tx, {
|
|
218
230
|
chainIds: limit.chainIds,
|
package/src/db/tables/users.ts
CHANGED
|
@@ -21,6 +21,22 @@ export function get(db: Db.Db, id: string): Promise<Record | undefined> {
|
|
|
21
21
|
return db.kysely.selectFrom('users').selectAll().where('id', '=', id).executeTakeFirst()
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
+
/**
|
|
25
|
+
* Reads users by id for operational identity displays.
|
|
26
|
+
*
|
|
27
|
+
* @param db - The database.
|
|
28
|
+
* @param ids - User ids to read.
|
|
29
|
+
* @returns Matching user records.
|
|
30
|
+
*/
|
|
31
|
+
export function listByIds(db: Db.Db, ids: readonly string[]): Promise<Record[]> {
|
|
32
|
+
if (ids.length === 0) return Promise.resolve([])
|
|
33
|
+
return db.kysely
|
|
34
|
+
.selectFrom('users')
|
|
35
|
+
.selectAll()
|
|
36
|
+
.where('id', 'in', [...ids])
|
|
37
|
+
.execute()
|
|
38
|
+
}
|
|
39
|
+
|
|
24
40
|
/**
|
|
25
41
|
* Reads a user by wallet address (compared lowercase).
|
|
26
42
|
*
|
|
@@ -1,21 +1,24 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ColumnType } from 'kysely'
|
|
2
2
|
import type { Hex } from 'ox'
|
|
3
3
|
|
|
4
4
|
import type * as VerifiedTokens from '../../internal/VerifiedTokens.js'
|
|
5
5
|
import type * as Db from '../Db.js'
|
|
6
6
|
import type * as db_Schema from '../Schema.js'
|
|
7
7
|
|
|
8
|
-
/**
|
|
9
|
-
|
|
8
|
+
/** A bigint chain id, read as a string from pg and written as a number. */
|
|
9
|
+
type ChainId = ColumnType<string, number, number>
|
|
10
10
|
|
|
11
|
-
/** Columns of the `
|
|
12
|
-
export type
|
|
11
|
+
/** Columns of the `verified_tokens` table. */
|
|
12
|
+
export type Table = Omit<db_Schema.VerifiedToken, 'chainId'> & { chainId: ChainId }
|
|
13
|
+
|
|
14
|
+
/** Columns of the `verified_token_lists` table. */
|
|
15
|
+
export type ListTable = Omit<db_Schema.VerifiedTokenList, 'chainId'> & { chainId: ChainId }
|
|
13
16
|
|
|
14
17
|
/** A stored verified-token row. */
|
|
15
|
-
export type Row =
|
|
18
|
+
export type Row = db_Schema.VerifiedToken
|
|
16
19
|
|
|
17
20
|
/** A chain's list-level metadata. */
|
|
18
|
-
export type Meta =
|
|
21
|
+
export type Meta = db_Schema.VerifiedTokenList
|
|
19
22
|
|
|
20
23
|
/**
|
|
21
24
|
* Reads a chain's list metadata — the "head" the soft-refresh cache compares
|
|
@@ -25,12 +28,13 @@ export type Meta = Selectable<ListTable>
|
|
|
25
28
|
* @param chainId - The chain id.
|
|
26
29
|
* @returns The metadata, or `undefined` when the chain has no list yet.
|
|
27
30
|
*/
|
|
28
|
-
export function head(db: Db.Db, chainId: number): Promise<Meta | undefined> {
|
|
29
|
-
|
|
31
|
+
export async function head(db: Db.Db, chainId: number): Promise<Meta | undefined> {
|
|
32
|
+
const row = await db.kysely
|
|
30
33
|
.selectFrom('verified_token_lists')
|
|
31
34
|
.selectAll()
|
|
32
|
-
.where('chainId', '=', chainId)
|
|
35
|
+
.where('chainId', '=', String(chainId))
|
|
33
36
|
.executeTakeFirst()
|
|
37
|
+
return row ? { ...row, chainId: Number(row.chainId) } : undefined
|
|
34
38
|
}
|
|
35
39
|
|
|
36
40
|
/**
|
|
@@ -40,13 +44,14 @@ export function head(db: Db.Db, chainId: number): Promise<Meta | undefined> {
|
|
|
40
44
|
* @param chainId - The chain id.
|
|
41
45
|
* @returns The rows.
|
|
42
46
|
*/
|
|
43
|
-
export function list(db: Db.Db, chainId: number): Promise<Row[]> {
|
|
44
|
-
|
|
47
|
+
export async function list(db: Db.Db, chainId: number): Promise<Row[]> {
|
|
48
|
+
const rows = await db.kysely
|
|
45
49
|
.selectFrom('verified_tokens')
|
|
46
50
|
.selectAll()
|
|
47
|
-
.where('chainId', '=', chainId)
|
|
51
|
+
.where('chainId', '=', String(chainId))
|
|
48
52
|
.orderBy('position')
|
|
49
53
|
.execute()
|
|
54
|
+
return rows.map((row) => ({ ...row, chainId: Number(row.chainId) }))
|
|
50
55
|
}
|
|
51
56
|
|
|
52
57
|
/**
|
|
@@ -59,7 +64,7 @@ export function list(db: Db.Db, chainId: number): Promise<Row[]> {
|
|
|
59
64
|
* @param input - The validated list and its new version metadata.
|
|
60
65
|
*/
|
|
61
66
|
export async function publish(db: Db.Db, chainId: number, input: publish.Input): Promise<void> {
|
|
62
|
-
await db.kysely.deleteFrom('verified_tokens').where('chainId', '=', chainId).execute()
|
|
67
|
+
await db.kysely.deleteFrom('verified_tokens').where('chainId', '=', String(chainId)).execute()
|
|
63
68
|
if (input.tokens.length > 0)
|
|
64
69
|
await db.kysely
|
|
65
70
|
.insertInto('verified_tokens')
|
|
@@ -46,8 +46,13 @@ export function toSubscription(row: Record): Webhooks.Subscription {
|
|
|
46
46
|
*
|
|
47
47
|
* @param db - The database.
|
|
48
48
|
* @param subscription - The subscription to insert.
|
|
49
|
+
* @param options - Initial cursor options.
|
|
49
50
|
*/
|
|
50
|
-
export async function insert(
|
|
51
|
+
export async function insert(
|
|
52
|
+
db: Db.Db,
|
|
53
|
+
subscription: Webhooks.Subscription,
|
|
54
|
+
options: insert.Options = {},
|
|
55
|
+
): Promise<void> {
|
|
51
56
|
await db.kysely
|
|
52
57
|
.insertInto('webhook_subscriptions')
|
|
53
58
|
.values({
|
|
@@ -63,7 +68,7 @@ export async function insert(db: Db.Db, subscription: Webhooks.Subscription): Pr
|
|
|
63
68
|
lastDeliveryAt: subscription.lastDeliveryAt ?? null,
|
|
64
69
|
ownerId: ownerId(subscription.owner),
|
|
65
70
|
ownerType: subscription.owner.type,
|
|
66
|
-
pollerCursor: null,
|
|
71
|
+
pollerCursor: options.pollerCursor ?? null,
|
|
67
72
|
secret: subscription.secret,
|
|
68
73
|
status: subscription.status,
|
|
69
74
|
updatedAt: subscription.updatedAt,
|
|
@@ -71,6 +76,14 @@ export async function insert(db: Db.Db, subscription: Webhooks.Subscription): Pr
|
|
|
71
76
|
.execute()
|
|
72
77
|
}
|
|
73
78
|
|
|
79
|
+
export declare namespace insert {
|
|
80
|
+
/** Options for {@link insert}. */
|
|
81
|
+
type Options = {
|
|
82
|
+
/** Initial poller cursor committed with the subscription. */
|
|
83
|
+
pollerCursor?: string | undefined
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
74
87
|
/**
|
|
75
88
|
* Inserts a subscription when its owner remains below the configured cap.
|
|
76
89
|
* An owner-scoped transaction lock serializes the count and insert.
|
|
@@ -85,7 +98,11 @@ export async function insertWithinLimit(
|
|
|
85
98
|
await sql`select pg_advisory_xact_lock(${subscriptionLimitLockClass}, hashtext(${owner}))`.execute(tx.kysely) // prettier-ignore
|
|
86
99
|
const existing = await count(tx, subscription.owner, options.now)
|
|
87
100
|
if (existing >= options.maxPerOwner) return false
|
|
88
|
-
await insert(
|
|
101
|
+
await insert(
|
|
102
|
+
tx,
|
|
103
|
+
subscription,
|
|
104
|
+
options.pollerCursor === undefined ? {} : { pollerCursor: options.pollerCursor },
|
|
105
|
+
)
|
|
89
106
|
return true
|
|
90
107
|
})
|
|
91
108
|
}
|
|
@@ -97,6 +114,8 @@ export declare namespace insertWithinLimit {
|
|
|
97
114
|
maxPerOwner: number
|
|
98
115
|
/** ISO timestamp used to exclude expired rows from the count. */
|
|
99
116
|
now: string
|
|
117
|
+
/** Initial poller cursor committed with the subscription. */
|
|
118
|
+
pollerCursor?: string | undefined
|
|
100
119
|
}
|
|
101
120
|
}
|
|
102
121
|
|
|
@@ -312,6 +331,42 @@ export async function setCursor(db: Db.Db, id: string, cursor: string): Promise<
|
|
|
312
331
|
.execute()
|
|
313
332
|
}
|
|
314
333
|
|
|
334
|
+
/**
|
|
335
|
+
* Writes a poller cursor only when the stored cursor still matches the caller's
|
|
336
|
+
* observed value.
|
|
337
|
+
*
|
|
338
|
+
* @param db - The database.
|
|
339
|
+
* @param options - Subscription, expected cursor, and next cursor.
|
|
340
|
+
* @returns Whether the cursor was updated.
|
|
341
|
+
*/
|
|
342
|
+
export async function compareAndSetCursor(
|
|
343
|
+
db: Db.Db,
|
|
344
|
+
options: compareAndSetCursor.Options,
|
|
345
|
+
): Promise<boolean> {
|
|
346
|
+
let query = db.kysely
|
|
347
|
+
.updateTable('webhook_subscriptions')
|
|
348
|
+
.set({ pollerCursor: options.cursor })
|
|
349
|
+
.where('id', '=', options.subscriptionId)
|
|
350
|
+
query =
|
|
351
|
+
options.expectedCursor === null
|
|
352
|
+
? query.where('pollerCursor', 'is', null)
|
|
353
|
+
: query.where('pollerCursor', '=', options.expectedCursor)
|
|
354
|
+
const result = await query.executeTakeFirst()
|
|
355
|
+
return result.numUpdatedRows > 0n
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
export declare namespace compareAndSetCursor {
|
|
359
|
+
/** Options for {@link compareAndSetCursor}. */
|
|
360
|
+
type Options = {
|
|
361
|
+
/** Next keyset cursor. */
|
|
362
|
+
cursor: string
|
|
363
|
+
/** Cursor observed before scanning, or null for an uninitialized subscription. */
|
|
364
|
+
expectedCursor: string | null
|
|
365
|
+
/** Subscription whose cursor advances. */
|
|
366
|
+
subscriptionId: string
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
315
370
|
/**
|
|
316
371
|
* Records a successful delivery: resets the consecutive-failure counter and
|
|
317
372
|
* stamps `lastDeliveryAt`.
|
package/src/handlers/relay.ts
CHANGED
|
@@ -152,7 +152,7 @@ export function relay(options: relay.Options = {}): Handler {
|
|
|
152
152
|
: undefined
|
|
153
153
|
const externalFeePayerUrl =
|
|
154
154
|
typeof parameters['feePayer'] === 'string'
|
|
155
|
-
?
|
|
155
|
+
? ExternalFeePayerUrl.normalize(parameters['feePayer'], {
|
|
156
156
|
allowUnsafe: internal_allowUnsafeUrls,
|
|
157
157
|
})
|
|
158
158
|
: undefined
|
|
@@ -1563,118 +1563,114 @@ function mergeCallsFromRequest(
|
|
|
1563
1563
|
return merged
|
|
1564
1564
|
}
|
|
1565
1565
|
|
|
1566
|
-
|
|
1567
|
-
function normalizeExternalFeePayerUrl(
|
|
1568
|
-
value: string,
|
|
1569
|
-
options: normalizeExternalFeePayerUrl.Options = {},
|
|
1570
|
-
): string {
|
|
1571
|
-
let url: URL
|
|
1572
|
-
try {
|
|
1573
|
-
url = new URL(value)
|
|
1574
|
-
} catch {
|
|
1575
|
-
throw new RpcResponse.InvalidParamsError({ message: 'Invalid fee payer URL.' })
|
|
1576
|
-
}
|
|
1577
|
-
|
|
1578
|
-
const allowUnsafe = options.allowUnsafe === true
|
|
1579
|
-
if (url.protocol !== 'http:' && url.protocol !== 'https:')
|
|
1580
|
-
throw new RpcResponse.InvalidParamsError({ message: 'Invalid fee payer URL protocol.' })
|
|
1581
|
-
if (!allowUnsafe && url.protocol !== 'https:')
|
|
1582
|
-
throw new RpcResponse.InvalidParamsError({ message: 'Invalid fee payer URL protocol.' })
|
|
1583
|
-
if (!allowUnsafe && isUnsafeHostname(url.hostname))
|
|
1584
|
-
throw new RpcResponse.InvalidParamsError({ message: 'Invalid fee payer URL host.' })
|
|
1585
|
-
|
|
1586
|
-
url.username = ''
|
|
1587
|
-
url.password = ''
|
|
1588
|
-
url.hash = ''
|
|
1589
|
-
return url.href
|
|
1590
|
-
}
|
|
1591
|
-
|
|
1592
|
-
declare namespace normalizeExternalFeePayerUrl {
|
|
1566
|
+
namespace ExternalFeePayerUrl {
|
|
1593
1567
|
type Options = {
|
|
1594
1568
|
/** Whether to allow non-HTTPS or local/private external fee payer URLs. */
|
|
1595
1569
|
allowUnsafe?: boolean | undefined
|
|
1596
1570
|
}
|
|
1597
|
-
}
|
|
1598
1571
|
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
return isUnsafeIpv6(ipv6)
|
|
1608
|
-
}
|
|
1572
|
+
/** Normalizes external fee-payer relay URLs before forwarding fill payloads. */
|
|
1573
|
+
export function normalize(value: string, options: Options = {}): string {
|
|
1574
|
+
let url: URL
|
|
1575
|
+
try {
|
|
1576
|
+
url = new URL(value)
|
|
1577
|
+
} catch {
|
|
1578
|
+
throw new RpcResponse.InvalidParamsError({ message: 'Invalid fee payer URL.' })
|
|
1579
|
+
}
|
|
1609
1580
|
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1581
|
+
const allowUnsafe = options.allowUnsafe === true
|
|
1582
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:')
|
|
1583
|
+
throw new RpcResponse.InvalidParamsError({ message: 'Invalid fee payer URL protocol.' })
|
|
1584
|
+
if (!allowUnsafe && url.protocol !== 'https:')
|
|
1585
|
+
throw new RpcResponse.InvalidParamsError({ message: 'Invalid fee payer URL protocol.' })
|
|
1586
|
+
if (!allowUnsafe && isUnsafeHostname(url.hostname))
|
|
1587
|
+
throw new RpcResponse.InvalidParamsError({ message: 'Invalid fee payer URL host.' })
|
|
1588
|
+
|
|
1589
|
+
url.username = ''
|
|
1590
|
+
url.password = ''
|
|
1591
|
+
url.hash = ''
|
|
1592
|
+
return url.href
|
|
1593
|
+
}
|
|
1616
1594
|
|
|
1617
|
-
function
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1595
|
+
function isUnsafeHostname(hostname: string): boolean {
|
|
1596
|
+
const host = normalizeHostname(hostname)
|
|
1597
|
+
if (host === 'localhost' || host.endsWith('.localhost')) return true
|
|
1598
|
+
const ipv4 = parseIpv4(host)
|
|
1599
|
+
if (ipv4) return isUnsafeIpv4(ipv4)
|
|
1600
|
+
if (!host.includes(':')) return false
|
|
1601
|
+
const ipv6 = parseIpv6(host)
|
|
1602
|
+
if (!ipv6) return true
|
|
1603
|
+
return isUnsafeIpv6(ipv6)
|
|
1604
|
+
}
|
|
1624
1605
|
|
|
1625
|
-
function
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
if (a === 192 && b === 168) return true
|
|
1632
|
-
if (a >= 224) return true
|
|
1633
|
-
return false
|
|
1634
|
-
}
|
|
1606
|
+
function normalizeHostname(hostname: string): string {
|
|
1607
|
+
return hostname
|
|
1608
|
+
.toLowerCase()
|
|
1609
|
+
.replace(/^\[|\]$/g, '')
|
|
1610
|
+
.split('%')[0]!
|
|
1611
|
+
}
|
|
1635
1612
|
|
|
1636
|
-
function
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1613
|
+
function parseIpv4(value: string): [number, number, number, number] | undefined {
|
|
1614
|
+
const parts = value.split('.')
|
|
1615
|
+
if (parts.length !== 4 || parts.some((part) => !/^\d+$/.test(part))) return undefined
|
|
1616
|
+
const numbers = parts.map((part) => Number(part))
|
|
1617
|
+
if (numbers.some((part) => !Number.isInteger(part) || part < 0 || part > 255)) return undefined
|
|
1618
|
+
return numbers as [number, number, number, number]
|
|
1619
|
+
}
|
|
1641
1620
|
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1621
|
+
function isUnsafeIpv4(parts: [number, number, number, number]): boolean {
|
|
1622
|
+
const [a, b] = parts
|
|
1623
|
+
if (a === 0 || a === 10 || a === 127) return true
|
|
1624
|
+
if (a === 100 && b >= 64 && b <= 127) return true
|
|
1625
|
+
if (a === 169 && b === 254) return true
|
|
1626
|
+
if (a === 172 && b >= 16 && b <= 31) return true
|
|
1627
|
+
if (a === 192 && b === 168) return true
|
|
1628
|
+
return a >= 224
|
|
1629
|
+
}
|
|
1646
1630
|
|
|
1647
|
-
|
|
1648
|
-
|
|
1631
|
+
function parseIpv6(
|
|
1632
|
+
value: string,
|
|
1633
|
+
): [number, number, number, number, number, number, number, number] | undefined {
|
|
1634
|
+
const halves = value.split('::')
|
|
1635
|
+
if (halves.length > 2) return undefined
|
|
1649
1636
|
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
return numbers as [number, number, number, number, number, number, number, number]
|
|
1655
|
-
}
|
|
1637
|
+
const left = halves[0] ? halves[0].split(':') : []
|
|
1638
|
+
const right = halves[1] ? halves[1].split(':') : []
|
|
1639
|
+
const missing = halves.length === 2 ? 8 - left.length - right.length : 0
|
|
1640
|
+
if (missing < 0) return undefined
|
|
1656
1641
|
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
if (parts.every((part) => part === 0)) return true
|
|
1660
|
-
if (parts.slice(0, 7).every((part) => part === 0) && parts[7] === 1) return true
|
|
1661
|
-
if ((a & 0xfe00) === 0xfc00) return true
|
|
1662
|
-
if ((a & 0xffc0) === 0xfe80) return true
|
|
1663
|
-
if ((a & 0xffc0) === 0xfec0) return true
|
|
1664
|
-
if ((a & 0xff00) === 0xff00) return true
|
|
1665
|
-
|
|
1666
|
-
const ipv4 = ipv4FromIpv6(parts)
|
|
1667
|
-
if (ipv4) return isUnsafeIpv4(ipv4)
|
|
1668
|
-
return false
|
|
1669
|
-
}
|
|
1642
|
+
const parts = [...left, ...Array(missing).fill('0'), ...right]
|
|
1643
|
+
if (parts.length !== 8) return undefined
|
|
1670
1644
|
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
)
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1645
|
+
const numbers = parts.map((part) =>
|
|
1646
|
+
/^[\da-f]{1,4}$/i.test(part) ? Number.parseInt(part, 16) : NaN,
|
|
1647
|
+
)
|
|
1648
|
+
if (numbers.some((part) => !Number.isInteger(part) || part < 0 || part > 0xffff))
|
|
1649
|
+
return undefined
|
|
1650
|
+
return numbers as [number, number, number, number, number, number, number, number]
|
|
1651
|
+
}
|
|
1652
|
+
|
|
1653
|
+
function isUnsafeIpv6(parts: [number, number, number, number, number, number, number, number]) {
|
|
1654
|
+
const [a] = parts
|
|
1655
|
+
if (parts.every((part) => part === 0)) return true
|
|
1656
|
+
if (parts.slice(0, 7).every((part) => part === 0) && parts[7] === 1) return true
|
|
1657
|
+
if ((a & 0xfe00) === 0xfc00) return true
|
|
1658
|
+
if ((a & 0xffc0) === 0xfe80) return true
|
|
1659
|
+
if ((a & 0xffc0) === 0xfec0) return true
|
|
1660
|
+
if ((a & 0xff00) === 0xff00) return true
|
|
1661
|
+
|
|
1662
|
+
const ipv4 = ipv4FromIpv6(parts)
|
|
1663
|
+
return ipv4 ? isUnsafeIpv4(ipv4) : false
|
|
1664
|
+
}
|
|
1665
|
+
|
|
1666
|
+
function ipv4FromIpv6(
|
|
1667
|
+
parts: [number, number, number, number, number, number, number, number],
|
|
1668
|
+
): [number, number, number, number] | undefined {
|
|
1669
|
+
const mapped = parts.slice(0, 5).every((part) => part === 0) && parts[5] === 0xffff
|
|
1670
|
+
const compatible = parts.slice(0, 6).every((part) => part === 0)
|
|
1671
|
+
if (!mapped && !compatible) return undefined
|
|
1672
|
+
return [parts[6]! >> 8, parts[6]! & 0xff, parts[7]! >> 8, parts[7]! & 0xff]
|
|
1673
|
+
}
|
|
1678
1674
|
}
|
|
1679
1675
|
|
|
1680
1676
|
/**
|
|
@@ -1889,6 +1889,54 @@ describe('ensureProject', () => {
|
|
|
1889
1889
|
})
|
|
1890
1890
|
})
|
|
1891
1891
|
|
|
1892
|
+
describe('parseCredential', () => {
|
|
1893
|
+
test('parses credentials keyed by chain id', () => {
|
|
1894
|
+
const credential = Auth.parseCredential(
|
|
1895
|
+
JSON.stringify({ 4217: 'mainnet:secret', 421700001: 'zone:secret' }),
|
|
1896
|
+
)
|
|
1897
|
+
|
|
1898
|
+
expect(credential).toEqual({ 4217: 'mainnet:secret', 421700001: 'zone:secret' })
|
|
1899
|
+
})
|
|
1900
|
+
|
|
1901
|
+
test('supports a shared credential', () => {
|
|
1902
|
+
expect(Auth.parseCredential('shared:secret')).toBe('shared:secret')
|
|
1903
|
+
})
|
|
1904
|
+
|
|
1905
|
+
test('rejects malformed credential maps', () => {
|
|
1906
|
+
expect(() => Auth.parseCredential('{"4217":1}')).toThrowErrorMatchingInlineSnapshot(
|
|
1907
|
+
`[Error: Expected a credential or a chain-id-to-credential JSON object.]`,
|
|
1908
|
+
)
|
|
1909
|
+
})
|
|
1910
|
+
})
|
|
1911
|
+
|
|
1912
|
+
describe('resolveCredential', () => {
|
|
1913
|
+
test('infers Basic auth from a credential containing a colon', () => {
|
|
1914
|
+
expect(Auth.resolveCredential({ chainId: 4217, value: 'user:password' })).toEqual({
|
|
1915
|
+
basicAuth: 'user:password',
|
|
1916
|
+
})
|
|
1917
|
+
})
|
|
1918
|
+
|
|
1919
|
+
test('infers Bearer auth from a credential without a colon', () => {
|
|
1920
|
+
expect(Auth.resolveCredential({ chainId: 4217, value: 'bearer-token' })).toEqual({
|
|
1921
|
+
basicAuth: undefined,
|
|
1922
|
+
bearerAuth: 'bearer-token',
|
|
1923
|
+
})
|
|
1924
|
+
})
|
|
1925
|
+
|
|
1926
|
+
test('selects a credential by chain id', () => {
|
|
1927
|
+
const value = JSON.stringify({ 4217: 'mainnet:secret', 421700001: 'zone-token' })
|
|
1928
|
+
|
|
1929
|
+
expect(Auth.resolveCredential({ chainId: 4217, value })).toEqual({
|
|
1930
|
+
basicAuth: 'mainnet:secret',
|
|
1931
|
+
})
|
|
1932
|
+
expect(Auth.resolveCredential({ chainId: 421700001, value })).toEqual({
|
|
1933
|
+
basicAuth: undefined,
|
|
1934
|
+
bearerAuth: 'zone-token',
|
|
1935
|
+
})
|
|
1936
|
+
expect(Auth.resolveCredential({ chainId: 42431, value })).toEqual({ basicAuth: undefined })
|
|
1937
|
+
})
|
|
1938
|
+
})
|
|
1939
|
+
|
|
1892
1940
|
function createScopedApp(options: {
|
|
1893
1941
|
auth?: Auth.Context | undefined
|
|
1894
1942
|
routes: readonly { path: string; policy: Auth.require.Policy }[]
|
package/src/internal/Auth.ts
CHANGED
|
@@ -9,6 +9,7 @@ import { findTargetHandler } from 'hono/utils/handler'
|
|
|
9
9
|
import { Challenge, Credential, type Method } from 'mppx'
|
|
10
10
|
import { Mppx, tempo } from 'mppx/hono'
|
|
11
11
|
import { Addresses } from 'viem/tempo'
|
|
12
|
+
import { tempoMainnet } from 'viem/tempo/chains'
|
|
12
13
|
import * as z from 'zod/mini'
|
|
13
14
|
|
|
14
15
|
import type * as App from '../App.js'
|
|
@@ -26,7 +27,6 @@ import * as Response from './Response.js'
|
|
|
26
27
|
import * as Schema from './Schema.js'
|
|
27
28
|
import * as Scope from '../Scope.js'
|
|
28
29
|
import * as Users from '../db/tables/users.js'
|
|
29
|
-
import * as Viem from './Viem.js'
|
|
30
30
|
|
|
31
31
|
const policySymbol = Symbol('tempo-api.auth.policy')
|
|
32
32
|
const mppManagementSymbol = Symbol('tempo-api.auth.mpp-management')
|
|
@@ -1451,7 +1451,7 @@ export function require<environment extends Environment = Environment>(
|
|
|
1451
1451
|
if (
|
|
1452
1452
|
apiKey.environment === 'sandbox' &&
|
|
1453
1453
|
explicitChain !== undefined &&
|
|
1454
|
-
|
|
1454
|
+
explicitChain === tempoMainnet.id
|
|
1455
1455
|
)
|
|
1456
1456
|
return jsonError(c, {
|
|
1457
1457
|
code: 'api_key_forbidden',
|
|
@@ -1644,6 +1644,65 @@ type RateLimitAccess = PaymentAccess & {
|
|
|
1644
1644
|
rateLimit: RateLimit.Result
|
|
1645
1645
|
}
|
|
1646
1646
|
|
|
1647
|
+
/** Shared or per-chain credentials. */
|
|
1648
|
+
export type ChainCredential = string | Record<number, string>
|
|
1649
|
+
|
|
1650
|
+
/** Parses shared or per-chain credentials from an environment value. */
|
|
1651
|
+
export function parseCredential(value: ChainCredential | undefined): parseCredential.ReturnType {
|
|
1652
|
+
if (!value) return undefined
|
|
1653
|
+
if (typeof value !== 'string') return value
|
|
1654
|
+
const credentials = (() => {
|
|
1655
|
+
try {
|
|
1656
|
+
return JSON.parse(value) as unknown
|
|
1657
|
+
} catch {
|
|
1658
|
+
return value
|
|
1659
|
+
}
|
|
1660
|
+
})()
|
|
1661
|
+
if (typeof credentials === 'string') return credentials
|
|
1662
|
+
if (
|
|
1663
|
+
!credentials ||
|
|
1664
|
+
typeof credentials !== 'object' ||
|
|
1665
|
+
Array.isArray(credentials) ||
|
|
1666
|
+
Object.values(credentials).some((credential) => typeof credential !== 'string')
|
|
1667
|
+
)
|
|
1668
|
+
throw new Error('Expected a credential or a chain-id-to-credential JSON object.')
|
|
1669
|
+
return credentials as Record<number, string>
|
|
1670
|
+
}
|
|
1671
|
+
|
|
1672
|
+
export declare namespace parseCredential {
|
|
1673
|
+
/** Parsed shared or per-chain credentials. */
|
|
1674
|
+
type ReturnType = ChainCredential | undefined
|
|
1675
|
+
}
|
|
1676
|
+
|
|
1677
|
+
/** Resolves a chain credential and infers its HTTP authorization scheme. */
|
|
1678
|
+
export function resolveCredential(
|
|
1679
|
+
options: resolveCredential.Options,
|
|
1680
|
+
): resolveCredential.ReturnType {
|
|
1681
|
+
const credentials = parseCredential(options.value)
|
|
1682
|
+
const credential = typeof credentials === 'string' ? credentials : credentials?.[options.chainId]
|
|
1683
|
+
if (!credential) return { basicAuth: undefined }
|
|
1684
|
+
if (credential.includes(':')) return { basicAuth: credential }
|
|
1685
|
+
return { basicAuth: undefined, bearerAuth: credential }
|
|
1686
|
+
}
|
|
1687
|
+
|
|
1688
|
+
export declare namespace resolveCredential {
|
|
1689
|
+
/** Options for resolving a chain credential. */
|
|
1690
|
+
type Options = {
|
|
1691
|
+
/** Chain id selecting a per-chain credential. */
|
|
1692
|
+
chainId: number
|
|
1693
|
+
/** Shared or per-chain credentials. */
|
|
1694
|
+
value?: ChainCredential | undefined
|
|
1695
|
+
}
|
|
1696
|
+
|
|
1697
|
+
/** Resolved HTTP authorization credentials. */
|
|
1698
|
+
type ReturnType = {
|
|
1699
|
+
/** Basic credentials inferred from a value containing a colon. */
|
|
1700
|
+
basicAuth: string | undefined
|
|
1701
|
+
/** Bearer credential inferred from a value without a colon. */
|
|
1702
|
+
bearerAuth?: string | undefined
|
|
1703
|
+
}
|
|
1704
|
+
}
|
|
1705
|
+
|
|
1647
1706
|
/**
|
|
1648
1707
|
* How long to wait for the rate-limit counter before failing open. A hot
|
|
1649
1708
|
* counter backend (e.g. a single Durable Object serving one busy quota bucket)
|