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
package/src/apps/relay/App.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Hono } from 'hono'
|
|
2
2
|
import { createMiddleware } from 'hono/factory'
|
|
3
|
-
import { RpcResponse } from 'ox'
|
|
3
|
+
import { Hash, Hex, RpcResponse } from 'ox'
|
|
4
4
|
import { ZoneRpcAuthentication } from 'ox/tempo'
|
|
5
5
|
import { Addresses, TokenId, Transaction } from 'viem/tempo'
|
|
6
6
|
|
|
@@ -88,16 +88,48 @@ function middleware(options: middleware.Options) {
|
|
|
88
88
|
const verifiedTokens = c.get('verifiedTokens')
|
|
89
89
|
const zoneToken_header = c.req.header(ZoneRpcAuthentication.headerName)
|
|
90
90
|
const zoneToken = zoneToken_header?.trim() ? zoneToken_header : undefined
|
|
91
|
+
let chainId: number | null | undefined
|
|
92
|
+
let internalErrors = 0
|
|
93
|
+
let reason: Log.SponsorshipReason | null | undefined
|
|
94
|
+
let rejections = 0
|
|
95
|
+
const reasons = new Set<Log.SponsorshipReason>()
|
|
96
|
+
const requests: rejectionDiagnostics.Request[] = []
|
|
97
|
+
|
|
98
|
+
const recordRejection = (options: middleware.Rejection) => {
|
|
99
|
+
const id =
|
|
100
|
+
Number.isSafeInteger(options.chainId) && options.chainId >= 0 ? options.chainId : null
|
|
101
|
+
if (chainId !== null) chainId = chainId === undefined || chainId === id ? id : null
|
|
102
|
+
if (options.reason === 'internal_error') internalErrors = Math.min(internalErrors + 1, 65_535)
|
|
103
|
+
if (reason !== null)
|
|
104
|
+
reason = reason === undefined || reason === options.reason ? options.reason : null
|
|
105
|
+
reasons.add(options.reason)
|
|
106
|
+
rejections = Math.min(rejections + 1, 65_535)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const rejectSponsorship = (options: middleware.Refusal): never => {
|
|
110
|
+
recordRejection({ chainId: options.chainId, reason: options.reason })
|
|
111
|
+
throw new RpcResponse.InvalidParamsError({
|
|
112
|
+
data: { code: options.reason },
|
|
113
|
+
message: options.message,
|
|
114
|
+
})
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const failSponsorship = (options: middleware.Failure): never => {
|
|
118
|
+
recordRejection({ chainId: options.chainId, reason: 'internal_error' })
|
|
119
|
+
// Capability-form fills serialize `Error.message`, so retain the
|
|
120
|
+
// internal detail only as a cause.
|
|
121
|
+
throw new Error('Internal error', { cause: new Error(options.message) })
|
|
122
|
+
}
|
|
91
123
|
|
|
92
124
|
const feePayer = (() => {
|
|
93
125
|
if (!options.feePayer) return undefined
|
|
94
126
|
const attribution =
|
|
95
|
-
principal?.type === 'api_key'
|
|
127
|
+
principal?.type === 'api_key'
|
|
96
128
|
? {
|
|
97
129
|
apiKeyId: principal.id,
|
|
98
130
|
environment: principal.environment,
|
|
99
131
|
orgId: principal.orgId,
|
|
100
|
-
projectId: principal.projectId,
|
|
132
|
+
...(principal.projectId === undefined ? {} : { projectId: principal.projectId }),
|
|
101
133
|
}
|
|
102
134
|
: undefined
|
|
103
135
|
const sponsorable =
|
|
@@ -115,9 +147,30 @@ function middleware(options: middleware.Options) {
|
|
|
115
147
|
// only mainnet: the relay resolves chainId from the request body, so
|
|
116
148
|
// the query-string chain guard never sees it.
|
|
117
149
|
const id = Number(transaction.chainId)
|
|
118
|
-
if (!attribution
|
|
150
|
+
if (!attribution) {
|
|
151
|
+
if (sponsorshipRequired)
|
|
152
|
+
rejectSponsorship({
|
|
153
|
+
chainId: id,
|
|
154
|
+
message: 'Sponsorship rejected.',
|
|
155
|
+
reason: 'api_key_required',
|
|
156
|
+
})
|
|
157
|
+
return false
|
|
158
|
+
}
|
|
159
|
+
if (!sponsorable) {
|
|
119
160
|
if (sponsorshipRequired)
|
|
120
|
-
|
|
161
|
+
failSponsorship({
|
|
162
|
+
chainId: id,
|
|
163
|
+
message: 'Sponsor route accepted an ineligible API key.',
|
|
164
|
+
})
|
|
165
|
+
return false
|
|
166
|
+
}
|
|
167
|
+
if (!c.get('supportedChainIds').has(id)) {
|
|
168
|
+
if (sponsorshipRequired)
|
|
169
|
+
rejectSponsorship({
|
|
170
|
+
chainId: id,
|
|
171
|
+
message: 'Sponsorship rejected.',
|
|
172
|
+
reason: 'chain_id_unsupported',
|
|
173
|
+
})
|
|
121
174
|
return false
|
|
122
175
|
}
|
|
123
176
|
if (!Viem.isMainnet(id)) return true
|
|
@@ -126,7 +179,11 @@ function middleware(options: middleware.Options) {
|
|
|
126
179
|
// it. Refuse here, or sandbox spend would sponsor mainnet unbilled.
|
|
127
180
|
if (attribution.environment !== 'production') {
|
|
128
181
|
if (sponsorshipRequired)
|
|
129
|
-
|
|
182
|
+
rejectSponsorship({
|
|
183
|
+
chainId: id,
|
|
184
|
+
message: 'Sponsorship rejected.',
|
|
185
|
+
reason: 'production_api_key_required',
|
|
186
|
+
})
|
|
130
187
|
return false
|
|
131
188
|
}
|
|
132
189
|
|
|
@@ -141,17 +198,19 @@ function middleware(options: middleware.Options) {
|
|
|
141
198
|
const billing = await Billing.status(db, attribution.orgId)
|
|
142
199
|
if (billing === 'past_due') {
|
|
143
200
|
if (sponsorshipRequired)
|
|
144
|
-
|
|
145
|
-
|
|
201
|
+
rejectSponsorship({
|
|
202
|
+
chainId: id,
|
|
146
203
|
message: 'Billing past due.',
|
|
204
|
+
reason: 'billing_past_due',
|
|
147
205
|
})
|
|
148
206
|
return 'billing_past_due'
|
|
149
207
|
}
|
|
150
208
|
if (billing !== 'active') {
|
|
151
209
|
if (sponsorshipRequired)
|
|
152
|
-
|
|
153
|
-
|
|
210
|
+
rejectSponsorship({
|
|
211
|
+
chainId: id,
|
|
154
212
|
message: 'Billing required.',
|
|
213
|
+
reason: 'billing_required',
|
|
155
214
|
})
|
|
156
215
|
return 'billing_required'
|
|
157
216
|
}
|
|
@@ -172,9 +231,10 @@ function middleware(options: middleware.Options) {
|
|
|
172
231
|
verified.decimals !== Fees.tokenDecimals
|
|
173
232
|
) {
|
|
174
233
|
if (sponsorshipRequired)
|
|
175
|
-
|
|
176
|
-
|
|
234
|
+
rejectSponsorship({
|
|
235
|
+
chainId: id,
|
|
177
236
|
message: 'Fee token unsupported.',
|
|
237
|
+
reason: 'fee_token_unsupported',
|
|
178
238
|
})
|
|
179
239
|
return 'fee_token_unsupported'
|
|
180
240
|
}
|
|
@@ -184,9 +244,10 @@ function middleware(options: middleware.Options) {
|
|
|
184
244
|
const feeMax = Fees.maxOf(transaction)
|
|
185
245
|
if (feeMax === undefined) {
|
|
186
246
|
if (sponsorshipRequired)
|
|
187
|
-
|
|
188
|
-
|
|
247
|
+
rejectSponsorship({
|
|
248
|
+
chainId: id,
|
|
189
249
|
message: 'Transaction fee limit exceeded.',
|
|
250
|
+
reason: 'tx_fee_limit_exceeded',
|
|
190
251
|
})
|
|
191
252
|
return 'tx_fee_limit_exceeded'
|
|
192
253
|
}
|
|
@@ -198,9 +259,10 @@ function middleware(options: middleware.Options) {
|
|
|
198
259
|
})()
|
|
199
260
|
if (feeMax > cap) {
|
|
200
261
|
if (sponsorshipRequired)
|
|
201
|
-
|
|
202
|
-
|
|
262
|
+
rejectSponsorship({
|
|
263
|
+
chainId: id,
|
|
203
264
|
message: 'Transaction fee limit exceeded.',
|
|
265
|
+
reason: 'tx_fee_limit_exceeded',
|
|
204
266
|
})
|
|
205
267
|
return 'tx_fee_limit_exceeded'
|
|
206
268
|
}
|
|
@@ -215,7 +277,10 @@ function middleware(options: middleware.Options) {
|
|
|
215
277
|
// Defense in depth: `validate` already refuses non-production
|
|
216
278
|
// mainnet, so reaching here with that pair is a wiring bug.
|
|
217
279
|
if (mainnet && attribution.environment !== 'production')
|
|
218
|
-
|
|
280
|
+
failSponsorship({
|
|
281
|
+
chainId: event.chainId,
|
|
282
|
+
message: 'Non-production key reached mainnet sponsorship recording.',
|
|
283
|
+
})
|
|
219
284
|
|
|
220
285
|
// The cap recomputes from canonical envelope bytes, mirroring the
|
|
221
286
|
// reconciliation convention; pending rows charge it to spend limits.
|
|
@@ -238,11 +303,11 @@ function middleware(options: middleware.Options) {
|
|
|
238
303
|
|
|
239
304
|
const input = {
|
|
240
305
|
apiKeyId: attribution.apiKeyId,
|
|
241
|
-
billable: attribution.environment === 'production',
|
|
306
|
+
billable: mainnet && attribution.environment === 'production',
|
|
242
307
|
chainId: event.chainId,
|
|
243
308
|
environment: attribution.environment,
|
|
244
309
|
orgId: attribution.orgId,
|
|
245
|
-
projectId: attribution.projectId,
|
|
310
|
+
...(attribution.projectId === undefined ? {} : { projectId: attribution.projectId }),
|
|
246
311
|
signPayload: event.signPayload,
|
|
247
312
|
transaction: event.transaction,
|
|
248
313
|
...(currency ? { currency } : {}),
|
|
@@ -262,9 +327,10 @@ function middleware(options: middleware.Options) {
|
|
|
262
327
|
})
|
|
263
328
|
} catch (error) {
|
|
264
329
|
if (error instanceof SponsoredTransactions.PeriodSpendLimitError)
|
|
265
|
-
|
|
266
|
-
|
|
330
|
+
rejectSponsorship({
|
|
331
|
+
chainId: event.chainId,
|
|
267
332
|
message: 'Spend limit exceeded.',
|
|
333
|
+
reason: 'spend_limit_exceeded',
|
|
268
334
|
})
|
|
269
335
|
throw error
|
|
270
336
|
}
|
|
@@ -274,8 +340,15 @@ function middleware(options: middleware.Options) {
|
|
|
274
340
|
|
|
275
341
|
const authorizeChainId = (chainId: number | undefined) => {
|
|
276
342
|
const resolved = chainId ?? c.get('chainId')
|
|
277
|
-
if (!c.get('supportedChainIds').has(resolved))
|
|
343
|
+
if (!c.get('supportedChainIds').has(resolved)) {
|
|
344
|
+
if (sponsorshipRequired)
|
|
345
|
+
rejectSponsorship({
|
|
346
|
+
chainId: resolved,
|
|
347
|
+
message: 'Unsupported chain id.',
|
|
348
|
+
reason: 'chain_id_unsupported',
|
|
349
|
+
})
|
|
278
350
|
throw new RpcResponse.InvalidParamsError({ message: 'Unsupported chain id.' })
|
|
351
|
+
}
|
|
279
352
|
if (c.get('zones').has(resolved)) {
|
|
280
353
|
const scopes = principal?.type === 'api_key' ? principal.apiKey.scopes : undefined
|
|
281
354
|
const allowed =
|
|
@@ -283,9 +356,16 @@ function middleware(options: middleware.Options) {
|
|
|
283
356
|
scopes?.includes(`zone:${resolved}:read`) ||
|
|
284
357
|
zoneToken !== undefined
|
|
285
358
|
if (allowed) return resolved
|
|
359
|
+
const message = `Chain id ${resolved} is a zone. Use an API key granting \`zone:${resolved}:read\`, or pass a Zone token via \`X-Authorization-Token\`.`
|
|
360
|
+
if (sponsorshipRequired)
|
|
361
|
+
rejectSponsorship({
|
|
362
|
+
chainId: resolved,
|
|
363
|
+
message,
|
|
364
|
+
reason: 'api_key_forbidden',
|
|
365
|
+
})
|
|
286
366
|
throw new RpcResponse.InvalidParamsError({
|
|
287
367
|
data: { code: 'api_key_forbidden' },
|
|
288
|
-
message
|
|
368
|
+
message,
|
|
289
369
|
})
|
|
290
370
|
}
|
|
291
371
|
return resolved
|
|
@@ -300,7 +380,8 @@ function middleware(options: middleware.Options) {
|
|
|
300
380
|
const client = Viem.getClient({
|
|
301
381
|
chainId: resolved,
|
|
302
382
|
principal,
|
|
303
|
-
rpc:
|
|
383
|
+
rpc: c.get('rpc'),
|
|
384
|
+
zone,
|
|
304
385
|
zoneToken,
|
|
305
386
|
})
|
|
306
387
|
zoneClients.set(resolved, client)
|
|
@@ -312,6 +393,21 @@ function middleware(options: middleware.Options) {
|
|
|
312
393
|
cache: c.get('store'),
|
|
313
394
|
...(options.features ? { features: options.features } : {}),
|
|
314
395
|
getClient,
|
|
396
|
+
onRequest: async (request) => {
|
|
397
|
+
const method = sponsorshipMethod(request.method)
|
|
398
|
+
const params = 'params' in request && Array.isArray(request.params) ? request.params : []
|
|
399
|
+
const transaction = params[0]
|
|
400
|
+
requests.push({
|
|
401
|
+
id: rpcId('id' in request ? request.id : undefined),
|
|
402
|
+
...(method === undefined ? {} : { method }),
|
|
403
|
+
...(method !== undefined &&
|
|
404
|
+
requests.length === 0 &&
|
|
405
|
+
method !== 'eth_fillTransaction' &&
|
|
406
|
+
Hex.validate(transaction, { strict: true })
|
|
407
|
+
? { payloadHash: Hash.keccak256(transaction) }
|
|
408
|
+
: {}),
|
|
409
|
+
})
|
|
410
|
+
},
|
|
315
411
|
path: Path.join(c.get('basePath'), options.path),
|
|
316
412
|
...(feePayer ? { feePayer } : {}),
|
|
317
413
|
...(verifiedTokens
|
|
@@ -330,11 +426,107 @@ function middleware(options: middleware.Options) {
|
|
|
330
426
|
.catch(() => undefined)
|
|
331
427
|
const rpc = Log.rpcErrors(body)
|
|
332
428
|
if (rpc) c.set('rpcResponse', rpc)
|
|
429
|
+
if (rejections > 0) {
|
|
430
|
+
const matched = rejectionDiagnostics({
|
|
431
|
+
body,
|
|
432
|
+
reasons,
|
|
433
|
+
requests,
|
|
434
|
+
})
|
|
435
|
+
// Capability-form fill refusals are successful JSON-RPC responses, so
|
|
436
|
+
// only a non-batch request can be attributed without error matching.
|
|
437
|
+
const rejected =
|
|
438
|
+
matched.length === 0 && !Array.isArray(body) && requests.length === 1 ? requests : matched
|
|
439
|
+
const methods = new Set(rejected.map((request) => request.method))
|
|
440
|
+
const method = methods.size === 1 ? rejected[0]?.method : undefined
|
|
441
|
+
const payloadHash =
|
|
442
|
+
!Array.isArray(body) && rejected.length === 1 ? rejected[0]?.payloadHash : undefined
|
|
443
|
+
c.set('sponsorship', {
|
|
444
|
+
...(chainId === null || chainId === undefined ? {} : { chainId }),
|
|
445
|
+
...(internalErrors === 0 ? {} : { internalErrors }),
|
|
446
|
+
...(method === undefined ? {} : { method }),
|
|
447
|
+
outcome: 'rejected',
|
|
448
|
+
...(payloadHash === undefined ? {} : { payloadHash }),
|
|
449
|
+
...(reason === null || reason === undefined ? {} : { reason }),
|
|
450
|
+
rejections,
|
|
451
|
+
})
|
|
452
|
+
}
|
|
333
453
|
return response
|
|
334
454
|
})
|
|
335
455
|
}
|
|
336
456
|
|
|
457
|
+
function rejectionDiagnostics(options: rejectionDiagnostics.Options) {
|
|
458
|
+
const requests = new Map<rejectionDiagnostics.Id, rejectionDiagnostics.Request | null>()
|
|
459
|
+
for (const request of options.requests) {
|
|
460
|
+
if (requests.has(request.id)) requests.set(request.id, null)
|
|
461
|
+
else requests.set(request.id, request)
|
|
462
|
+
}
|
|
463
|
+
const responses = Array.isArray(options.body) ? options.body : [options.body]
|
|
464
|
+
return responses.flatMap((response) => {
|
|
465
|
+
if (!response || typeof response !== 'object' || Array.isArray(response)) return []
|
|
466
|
+
const record = response as Record<string, unknown>
|
|
467
|
+
if (record['jsonrpc'] !== '2.0') return []
|
|
468
|
+
const error = record['error']
|
|
469
|
+
if (!error || typeof error !== 'object' || Array.isArray(error)) return []
|
|
470
|
+
const data = (error as Record<string, unknown>)['data']
|
|
471
|
+
if (!data || typeof data !== 'object' || Array.isArray(data)) return []
|
|
472
|
+
const code = (data as Record<string, unknown>)['code']
|
|
473
|
+
if (typeof code !== 'string' || !options.reasons.has(code as Log.SponsorshipReason)) return []
|
|
474
|
+
const request = requests.get(rpcId(record['id']))
|
|
475
|
+
return request?.method === undefined ? [] : [request]
|
|
476
|
+
})
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
declare namespace rejectionDiagnostics {
|
|
480
|
+
/** JSON-RPC request id used only for request-response matching. */
|
|
481
|
+
type Id = number | string | null | undefined
|
|
482
|
+
|
|
483
|
+
/** Inputs for matching request metadata to sponsorship rejection responses. */
|
|
484
|
+
type Options = {
|
|
485
|
+
/** Parsed single or batch JSON-RPC response. */
|
|
486
|
+
body: unknown
|
|
487
|
+
/** Sponsorship codes recorded while handling the request. */
|
|
488
|
+
reasons: ReadonlySet<Log.SponsorshipReason>
|
|
489
|
+
/** Bounded request metadata in request order. */
|
|
490
|
+
requests: readonly Request[]
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
/** Bounded metadata for one valid JSON-RPC request. */
|
|
494
|
+
type Request = {
|
|
495
|
+
/** JSON-RPC request id, retained only for response matching. */
|
|
496
|
+
id: Id
|
|
497
|
+
/** Sponsorship-capable JSON-RPC method. */
|
|
498
|
+
method?: Log.SponsorshipMethod | undefined
|
|
499
|
+
/** Raw transaction hash, captured only for the first valid request. */
|
|
500
|
+
payloadHash?: Hex.Hex | undefined
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
function rpcId(value: unknown): rejectionDiagnostics.Id {
|
|
505
|
+
if (typeof value === 'number' || typeof value === 'string' || value === null) return value
|
|
506
|
+
return undefined
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
function sponsorshipMethod(value: unknown): Log.SponsorshipMethod | undefined {
|
|
510
|
+
switch (value) {
|
|
511
|
+
case 'eth_fillTransaction':
|
|
512
|
+
case 'eth_sendRawTransaction':
|
|
513
|
+
case 'eth_sendRawTransactionSync':
|
|
514
|
+
case 'eth_signRawTransaction':
|
|
515
|
+
return value
|
|
516
|
+
default:
|
|
517
|
+
return undefined
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
|
|
337
521
|
declare namespace middleware {
|
|
522
|
+
/** One invariant sponsorship failure. */
|
|
523
|
+
type Failure = {
|
|
524
|
+
/** Candidate transaction chain. */
|
|
525
|
+
chainId: number
|
|
526
|
+
/** Internal error message hidden from the client. */
|
|
527
|
+
message: string
|
|
528
|
+
}
|
|
529
|
+
|
|
338
530
|
/** Internal relay mount configuration. */
|
|
339
531
|
type Options = relay.Options & {
|
|
340
532
|
/** Optional wallet feature bundle. */
|
|
@@ -342,4 +534,22 @@ declare namespace middleware {
|
|
|
342
534
|
/** RPC mount path. */
|
|
343
535
|
path: 'rpc/relay' | 'rpc/sponsor'
|
|
344
536
|
}
|
|
537
|
+
|
|
538
|
+
/** One sponsorship rejection recorded for request logging. */
|
|
539
|
+
type Rejection = {
|
|
540
|
+
/** Candidate transaction chain, validated before it enters the log entry. */
|
|
541
|
+
chainId: number
|
|
542
|
+
/** Stable client error code. */
|
|
543
|
+
reason: Log.SponsorshipReason
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
/** One client-visible sponsorship refusal. */
|
|
547
|
+
type Refusal = {
|
|
548
|
+
/** Candidate transaction chain. */
|
|
549
|
+
chainId: number
|
|
550
|
+
/** Client-safe error message. */
|
|
551
|
+
message: string
|
|
552
|
+
/** Stable client error code. */
|
|
553
|
+
reason: Exclude<Log.SponsorshipReason, 'internal_error'>
|
|
554
|
+
}
|
|
345
555
|
}
|
|
@@ -4,6 +4,7 @@ import type { Client } from 'viem'
|
|
|
4
4
|
|
|
5
5
|
import * as Runtime from '../../../test/runtime.js'
|
|
6
6
|
import * as Db from '../../db/Db.js'
|
|
7
|
+
import * as Organizations from '../../db/tables/organizations.js'
|
|
7
8
|
import * as SponsoredTransactions from '../../db/tables/sponsoredTransactions.js'
|
|
8
9
|
import * as Sponsorships from './Sponsorships.js'
|
|
9
10
|
|
|
@@ -41,6 +42,7 @@ describe('finalize', () => {
|
|
|
41
42
|
})
|
|
42
43
|
expect(result).toMatchInlineSnapshot(`
|
|
43
44
|
{
|
|
45
|
+
"errors": 0,
|
|
44
46
|
"failed": 0,
|
|
45
47
|
"finalized": 1,
|
|
46
48
|
"pending": 0,
|
|
@@ -62,6 +64,7 @@ describe('finalize', () => {
|
|
|
62
64
|
const result = await Sponsorships.finalize(db, { getClient: () => client({}) })
|
|
63
65
|
expect(result).toMatchInlineSnapshot(`
|
|
64
66
|
{
|
|
67
|
+
"errors": 0,
|
|
65
68
|
"failed": 0,
|
|
66
69
|
"finalized": 0,
|
|
67
70
|
"pending": 1,
|
|
@@ -87,6 +90,7 @@ describe('finalize', () => {
|
|
|
87
90
|
})
|
|
88
91
|
expect(young).toMatchInlineSnapshot(`
|
|
89
92
|
{
|
|
93
|
+
"errors": 0,
|
|
90
94
|
"failed": 0,
|
|
91
95
|
"finalized": 0,
|
|
92
96
|
"pending": 1,
|
|
@@ -102,6 +106,7 @@ describe('finalize', () => {
|
|
|
102
106
|
})
|
|
103
107
|
expect(settled).toMatchInlineSnapshot(`
|
|
104
108
|
{
|
|
109
|
+
"errors": 0,
|
|
105
110
|
"failed": 1,
|
|
106
111
|
"finalized": 0,
|
|
107
112
|
"pending": 0,
|
|
@@ -124,6 +129,7 @@ describe('finalize', () => {
|
|
|
124
129
|
})
|
|
125
130
|
expect(result).toMatchInlineSnapshot(`
|
|
126
131
|
{
|
|
132
|
+
"errors": 0,
|
|
127
133
|
"failed": 1,
|
|
128
134
|
"finalized": 0,
|
|
129
135
|
"pending": 0,
|
|
@@ -151,6 +157,7 @@ describe('finalize', () => {
|
|
|
151
157
|
})
|
|
152
158
|
expect(result).toMatchInlineSnapshot(`
|
|
153
159
|
{
|
|
160
|
+
"errors": 1,
|
|
154
161
|
"failed": 0,
|
|
155
162
|
"finalized": 0,
|
|
156
163
|
"pending": 1,
|
|
@@ -178,6 +185,7 @@ describe('finalize', () => {
|
|
|
178
185
|
})
|
|
179
186
|
expect(result).toMatchInlineSnapshot(`
|
|
180
187
|
{
|
|
188
|
+
"errors": 1,
|
|
181
189
|
"failed": 1,
|
|
182
190
|
"finalized": 0,
|
|
183
191
|
"pending": 0,
|
|
@@ -206,6 +214,7 @@ describe('finalize', () => {
|
|
|
206
214
|
})
|
|
207
215
|
expect(result).toMatchInlineSnapshot(`
|
|
208
216
|
{
|
|
217
|
+
"errors": 0,
|
|
209
218
|
"failed": 0,
|
|
210
219
|
"finalized": 1,
|
|
211
220
|
"pending": 0,
|
|
@@ -256,6 +265,7 @@ describe('reconcile', () => {
|
|
|
256
265
|
})
|
|
257
266
|
expect(result).toMatchInlineSnapshot(`
|
|
258
267
|
{
|
|
268
|
+
"errors": 0,
|
|
259
269
|
"matched": 1,
|
|
260
270
|
"scanned": 1,
|
|
261
271
|
}
|
|
@@ -269,6 +279,7 @@ describe('reconcile', () => {
|
|
|
269
279
|
test('behavior: recovers recently failed intents by sign payload', async () => {
|
|
270
280
|
const db = create()
|
|
271
281
|
await db.migrate()
|
|
282
|
+
await Organizations.create(db, { id: 'org_1', name: 'One' })
|
|
272
283
|
const { transactionHash: _, ...rest } = input
|
|
273
284
|
const intent = await SponsoredTransactions.upsert(db, { ...rest, signPayload })
|
|
274
285
|
await SponsoredTransactions.fail(db, intent.id, '2026-01-01T00:00:00.000Z')
|
|
@@ -287,6 +298,7 @@ describe('reconcile', () => {
|
|
|
287
298
|
})()
|
|
288
299
|
expect(result).toMatchInlineSnapshot(`
|
|
289
300
|
{
|
|
301
|
+
"errors": 0,
|
|
290
302
|
"matched": 1,
|
|
291
303
|
"scanned": 1,
|
|
292
304
|
}
|
|
@@ -298,6 +310,43 @@ describe('reconcile', () => {
|
|
|
298
310
|
await db.close()
|
|
299
311
|
})
|
|
300
312
|
|
|
313
|
+
test('behavior: spend-limit refusals are not operational errors', async () => {
|
|
314
|
+
const db = create()
|
|
315
|
+
await db.migrate()
|
|
316
|
+
await Organizations.create(db, { id: 'org_1', name: 'One' })
|
|
317
|
+
const { transactionHash: _, ...rest } = input
|
|
318
|
+
const intent = await SponsoredTransactions.upsert(db, { ...rest, signPayload })
|
|
319
|
+
await SponsoredTransactions.fail(db, intent.id, '2026-01-01T00:00:00.000Z')
|
|
320
|
+
|
|
321
|
+
vi.useFakeTimers({ now: new Date('2026-01-01T00:01:00.000Z') })
|
|
322
|
+
const result = await (async () => {
|
|
323
|
+
try {
|
|
324
|
+
return await Sponsorships.reconcile(db, {
|
|
325
|
+
feePayer: '0xFee0000000000000000000000000000000000000',
|
|
326
|
+
getClient: () => rpc,
|
|
327
|
+
getTidx: () => tidx([{ from: sender, hash: minedHash }]),
|
|
328
|
+
limitFor: async () => ({
|
|
329
|
+
chainIds: [42431],
|
|
330
|
+
max: -1n,
|
|
331
|
+
since: '2025-01-01T00:00:00.000Z',
|
|
332
|
+
}),
|
|
333
|
+
})
|
|
334
|
+
} finally {
|
|
335
|
+
vi.useRealTimers()
|
|
336
|
+
}
|
|
337
|
+
})()
|
|
338
|
+
|
|
339
|
+
expect(result).toMatchInlineSnapshot(`
|
|
340
|
+
{
|
|
341
|
+
"errors": 0,
|
|
342
|
+
"matched": 0,
|
|
343
|
+
"scanned": 1,
|
|
344
|
+
}
|
|
345
|
+
`)
|
|
346
|
+
expect((await SponsoredTransactions.get(db, intent.id))?.transactionHash).toBeNull()
|
|
347
|
+
await db.close()
|
|
348
|
+
})
|
|
349
|
+
|
|
301
350
|
test('behavior: unmatched candidates leave intents pending', async () => {
|
|
302
351
|
const db = create()
|
|
303
352
|
await db.migrate()
|
|
@@ -311,6 +360,7 @@ describe('reconcile', () => {
|
|
|
311
360
|
})
|
|
312
361
|
expect(result).toMatchInlineSnapshot(`
|
|
313
362
|
{
|
|
363
|
+
"errors": 0,
|
|
314
364
|
"matched": 0,
|
|
315
365
|
"scanned": 1,
|
|
316
366
|
}
|
|
@@ -365,6 +415,7 @@ describe('reconcile', () => {
|
|
|
365
415
|
})
|
|
366
416
|
expect(result).toMatchInlineSnapshot(`
|
|
367
417
|
{
|
|
418
|
+
"errors": 1,
|
|
368
419
|
"matched": 0,
|
|
369
420
|
"scanned": 0,
|
|
370
421
|
}
|
|
@@ -38,7 +38,7 @@ export async function finalize(db: Db.Db, options: finalize.Options): Promise<fi
|
|
|
38
38
|
} = options
|
|
39
39
|
|
|
40
40
|
const rows = await SponsoredTransactions.listPending(db, { limit: batchSize })
|
|
41
|
-
const result = { failed: 0, finalized: 0, pending: 0 }
|
|
41
|
+
const result = { errors: 0, failed: 0, finalized: 0, pending: 0 }
|
|
42
42
|
|
|
43
43
|
for (const row of rows) {
|
|
44
44
|
// Fill intents carry no hash until reconciliation matches them on-chain;
|
|
@@ -60,6 +60,7 @@ export async function finalize(db: Db.Db, options: finalize.Options): Promise<fi
|
|
|
60
60
|
// Unmined transactions surface as a typed not-found; let the TTL decide.
|
|
61
61
|
if (error instanceof TransactionReceiptNotFoundError) receipt = null
|
|
62
62
|
else {
|
|
63
|
+
result.errors++
|
|
63
64
|
if (Date.parse(row.createdAt) + receiptErrorTtlMs <= now().getTime()) {
|
|
64
65
|
await SponsoredTransactions.fail(db, row.id, now().toISOString())
|
|
65
66
|
result.failed++
|
|
@@ -102,6 +103,8 @@ export declare namespace finalize {
|
|
|
102
103
|
|
|
103
104
|
/** Counters returned by one finalization pass. */
|
|
104
105
|
type Result = {
|
|
106
|
+
/** Receipt lookup errors that prevented finalization work. */
|
|
107
|
+
errors: number
|
|
105
108
|
/** Rows marked failed (unmined past the pending TTL). */
|
|
106
109
|
failed: number
|
|
107
110
|
/** Rows finalized with an actual fee. */
|
|
@@ -126,7 +129,7 @@ export async function reconcile(db: Db.Db, options: reconcile.Options): Promise<
|
|
|
126
129
|
const {
|
|
127
130
|
batchSize = 100,
|
|
128
131
|
candidateCap = 500,
|
|
129
|
-
failedIntentTtlMs =
|
|
132
|
+
failedIntentTtlMs = SponsoredTransactions.failedIntentRecoveryTtlMs,
|
|
130
133
|
feePayer,
|
|
131
134
|
getClient,
|
|
132
135
|
getTidx,
|
|
@@ -137,7 +140,7 @@ export async function reconcile(db: Db.Db, options: reconcile.Options): Promise<
|
|
|
137
140
|
failedSince: new Date(Date.now() - failedIntentTtlMs).toISOString(),
|
|
138
141
|
limit: batchSize,
|
|
139
142
|
})
|
|
140
|
-
const result = { matched: 0, scanned: 0 }
|
|
143
|
+
const result = { errors: 0, matched: 0, scanned: 0 }
|
|
141
144
|
if (intents.length === 0) return result
|
|
142
145
|
|
|
143
146
|
const chains = new Map<number, SponsoredTransactions.Record[]>()
|
|
@@ -161,6 +164,7 @@ export async function reconcile(db: Db.Db, options: reconcile.Options): Promise<
|
|
|
161
164
|
candidates = fetched.rows
|
|
162
165
|
} catch {
|
|
163
166
|
// Indexer outage must not fail intents; retry on the next pass.
|
|
167
|
+
result.errors++
|
|
164
168
|
continue
|
|
165
169
|
}
|
|
166
170
|
|
|
@@ -187,8 +191,10 @@ export async function reconcile(db: Db.Db, options: reconcile.Options): Promise<
|
|
|
187
191
|
)
|
|
188
192
|
bySignPayload.delete(signPayload)
|
|
189
193
|
result.matched++
|
|
190
|
-
} catch {
|
|
191
|
-
//
|
|
194
|
+
} catch (error) {
|
|
195
|
+
// Spend-limit enforcement is an expected policy refusal; dependency,
|
|
196
|
+
// lookup, and malformed-envelope failures remain operational errors.
|
|
197
|
+
if (!(error instanceof SponsoredTransactions.PeriodSpendLimitError)) result.errors++
|
|
192
198
|
}
|
|
193
199
|
}
|
|
194
200
|
}
|
|
@@ -223,6 +229,8 @@ export declare namespace reconcile {
|
|
|
223
229
|
|
|
224
230
|
/** Counters returned by one reconciliation pass. */
|
|
225
231
|
type Result = {
|
|
232
|
+
/** Dependency or candidate errors that prevented reconciliation work. */
|
|
233
|
+
errors: number
|
|
226
234
|
/** Intents matched to an on-chain transaction. */
|
|
227
235
|
matched: number
|
|
228
236
|
/** On-chain candidates inspected. */
|
|
@@ -294,14 +302,18 @@ export function createFinalizer(options: createFinalizer.Options): createFinaliz
|
|
|
294
302
|
}
|
|
295
303
|
},
|
|
296
304
|
})
|
|
297
|
-
: { matched: 0, scanned: 0 }
|
|
305
|
+
: { errors: 0, matched: 0, scanned: 0 }
|
|
298
306
|
const finalized = await finalize(db, {
|
|
299
307
|
batchSize: options.batchSize,
|
|
300
308
|
getClient,
|
|
301
309
|
now: options.now,
|
|
302
310
|
pendingTtlMs: options.pendingTtlMs,
|
|
303
311
|
})
|
|
304
|
-
return {
|
|
312
|
+
return {
|
|
313
|
+
...finalized,
|
|
314
|
+
...reconciled,
|
|
315
|
+
errors: finalized.errors + reconciled.errors,
|
|
316
|
+
}
|
|
305
317
|
},
|
|
306
318
|
}
|
|
307
319
|
}
|