tapimo 0.7.1 → 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 +99 -43
- 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 +12125 -7913
- 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 +1625 -718
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +656 -193
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts +108 -108
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +59 -8
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/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 +30 -30
- 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 +263 -263
- 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 +39 -8
- package/dist/apps/data/routes/tokenlist.js.map +1 -1
- package/dist/apps/data/routes/tokens.d.ts +114 -86
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +194 -91
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +53 -53
- package/dist/apps/data/routes/transactions.d.ts.map +1 -1
- package/dist/apps/data/routes/transactions.js +78 -39
- package/dist/apps/data/routes/transactions.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +76 -27
- package/dist/apps/data/routes/transfers.d.ts.map +1 -1
- package/dist/apps/data/routes/transfers.js +165 -67
- package/dist/apps/data/routes/transfers.js.map +1 -1
- package/dist/apps/data/routes/valuation.d.ts +42 -42
- package/dist/apps/data/routes/valuation.js +2 -2
- package/dist/apps/data/routes/valuation.js.map +1 -1
- package/dist/apps/data/routes/webhooks.d.ts +369 -367
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +161 -59
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +281 -0
- package/dist/apps/data/routes/zones.d.ts.map +1 -0
- package/dist/apps/data/routes/zones.js +252 -0
- package/dist/apps/data/routes/zones.js.map +1 -0
- package/dist/apps/docs/reference.js +6 -5
- package/dist/apps/docs/reference.js.map +1 -1
- package/dist/apps/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 +2 -2
- 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 +2 -2
- 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/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 +183 -23
- package/dist/apps/relay/App.js.map +1 -1
- package/dist/apps/relay/Sponsorships.d.ts +4 -0
- package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
- package/dist/apps/relay/Sponsorships.js +15 -6
- package/dist/apps/relay/Sponsorships.js.map +1 -1
- package/dist/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 +16 -0
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/projects.d.ts +8 -0
- package/dist/db/tables/projects.d.ts.map +1 -1
- package/dist/db/tables/projects.js +16 -0
- package/dist/db/tables/projects.js.map +1 -1
- package/dist/db/tables/requestUsage.d.ts +13 -0
- package/dist/db/tables/requestUsage.d.ts.map +1 -1
- package/dist/db/tables/requestUsage.js +16 -0
- package/dist/db/tables/requestUsage.js.map +1 -1
- package/dist/db/tables/sponsoredTransactions.d.ts +2 -2
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +1 -1
- package/dist/db/tables/sponsoredTransactions.js.map +1 -1
- package/dist/db/tables/users.d.ts +8 -0
- package/dist/db/tables/users.d.ts.map +1 -1
- package/dist/db/tables/users.js +16 -0
- package/dist/db/tables/users.js.map +1 -1
- package/dist/db/tables/verifiedTokens.d.ts +14 -7
- package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
- package/dist/db/tables/verifiedTokens.js +9 -7
- package/dist/db/tables/verifiedTokens.js.map +1 -1
- package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
- package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
- package/dist/db/tables/webhookSubscriptions.js +24 -3
- package/dist/db/tables/webhookSubscriptions.js.map +1 -1
- package/dist/handlers/relay.js +108 -108
- package/dist/handlers/relay.js.map +1 -1
- package/dist/internal/Auth.d.ts +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 +8 -1
- package/dist/internal/EdgeCache.d.ts.map +1 -1
- package/dist/internal/EdgeCache.js +33 -7
- 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 +6 -1
- package/dist/internal/Schema.d.ts.map +1 -1
- package/dist/internal/Schema.js +20 -11
- package/dist/internal/Schema.js.map +1 -1
- package/dist/internal/Store.d.ts +6 -0
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +35 -0
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/Tidx.d.ts +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 +113 -43
- 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 +28 -11
- 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.ts +72 -19
- package/src/apps/data/routes/tokens.ts +258 -86
- package/src/apps/data/routes/transactions.test.ts +2 -0
- package/src/apps/data/routes/transactions.ts +77 -42
- package/src/apps/data/routes/transfers.test.ts +166 -4
- package/src/apps/data/routes/transfers.ts +216 -78
- package/src/apps/data/routes/valuation.test.ts +62 -9
- package/src/apps/data/routes/valuation.ts +2 -2
- package/src/apps/data/routes/webhooks.test.ts +386 -43
- package/src/apps/data/routes/webhooks.ts +172 -71
- package/src/apps/data/routes/zones.test.ts +473 -0
- package/src/apps/data/routes/zones.ts +338 -0
- package/src/apps/docs/reference.ts +8 -6
- package/src/apps/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 +493 -62
- package/src/apps/relay/App.ts +233 -23
- package/src/apps/relay/Sponsorships.test.ts +49 -0
- package/src/apps/relay/Sponsorships.ts +18 -6
- package/src/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.ts +16 -0
- package/src/db/tables/projects.ts +16 -0
- package/src/db/tables/requestUsage.ts +23 -0
- package/src/db/tables/sponsoredTransactions.test.ts +11 -0
- package/src/db/tables/sponsoredTransactions.ts +3 -3
- package/src/db/tables/users.ts +16 -0
- package/src/db/tables/verifiedTokens.ts +19 -14
- package/src/db/tables/webhookSubscriptions.ts +58 -3
- package/src/handlers/relay.test.ts +2 -0
- package/src/handlers/relay.ts +95 -99
- package/src/internal/Auth.test.ts +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 +19 -0
- package/src/internal/EdgeCache.ts +35 -5
- 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.ts +27 -17
- package/src/internal/Store.test.ts +25 -0
- package/src/internal/Store.ts +46 -0
- package/src/internal/Tidx.local.test.ts +78 -3
- package/src/internal/Tidx.test.ts +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,6 +1,7 @@
|
|
|
1
1
|
import { type Db, Webhooks as Core } from 'tapimo'
|
|
2
2
|
import * as z from 'zod/mini'
|
|
3
3
|
|
|
4
|
+
import * as Cursor from '../../../internal/Cursor.js'
|
|
4
5
|
import * as Tidx from '../../../internal/Tidx.js'
|
|
5
6
|
import * as Viem from '../../../internal/Viem.js'
|
|
6
7
|
import * as TestApp from '../../../../test/App.js'
|
|
@@ -163,12 +164,7 @@ describe('access matrix', () => {
|
|
|
163
164
|
const zone = 421_700_001
|
|
164
165
|
const app = TestApp.client({
|
|
165
166
|
auth: { keys: [writer] },
|
|
166
|
-
zones: [
|
|
167
|
-
{
|
|
168
|
-
chainId: zone,
|
|
169
|
-
forwardRpcUrl: 'https://zone.rpc.test',
|
|
170
|
-
},
|
|
171
|
-
],
|
|
167
|
+
zones: [TestApp.zone({ chainId: zone, rpcUrl: 'https://zone.rpc.test' })],
|
|
172
168
|
})
|
|
173
169
|
const response = await app.v1.webhooks.$post(
|
|
174
170
|
{ json: { ...validBody, chainId: zone } },
|
|
@@ -226,7 +222,11 @@ describe('access matrix', () => {
|
|
|
226
222
|
|
|
227
223
|
describe('CRUD lifecycle', () => {
|
|
228
224
|
test('creates, reads, lists, updates, and deletes a subscription', async () => {
|
|
229
|
-
const
|
|
225
|
+
const db = TestApp.database()
|
|
226
|
+
const app = TestApp.client({
|
|
227
|
+
auth: { keys: [writer, reader, other] },
|
|
228
|
+
db,
|
|
229
|
+
})
|
|
230
230
|
|
|
231
231
|
// Create returns the one-time signing secret.
|
|
232
232
|
const created = await app.v1.webhooks.$post({ json: validBody }, as(writer))
|
|
@@ -239,6 +239,9 @@ describe('CRUD lifecycle', () => {
|
|
|
239
239
|
// API-key-owned subscriptions never expire.
|
|
240
240
|
expect(createdBody.expiresAt).toMatchInlineSnapshot(`undefined`)
|
|
241
241
|
expect(createdBody).not.toHaveProperty('owner')
|
|
242
|
+
expect(Cursor.decode((await Core.getCursor(db, createdBody.id))!, ['int'])).toEqual([
|
|
243
|
+
expect.any(Number),
|
|
244
|
+
])
|
|
242
245
|
|
|
243
246
|
// Reads never expose the secret.
|
|
244
247
|
const read = await app.v1.webhooks[':id{wh_[A-Za-z0-9_-]+}'].$get(
|
|
@@ -1320,15 +1323,17 @@ describe('envelope schema', () => {
|
|
|
1320
1323
|
describe('MPP access (disabled for now — API-key-only)', () => {
|
|
1321
1324
|
test('rejects an MPP payer with 401, offering no payment challenge', async () => {
|
|
1322
1325
|
const app = TestApp.create({
|
|
1323
|
-
auth: {
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1326
|
+
auth: {
|
|
1327
|
+
keys: [],
|
|
1328
|
+
mpp: {
|
|
1329
|
+
secretKey: 'secret_test_key_0123456789abcdef',
|
|
1330
|
+
session: {
|
|
1331
|
+
chainId: Tempo.chain.id,
|
|
1332
|
+
currency: Tempo.currency,
|
|
1333
|
+
decimals: 6,
|
|
1334
|
+
getClient: () => Tempo.client,
|
|
1335
|
+
recipient: Tempo.accounts[2].address,
|
|
1336
|
+
},
|
|
1332
1337
|
},
|
|
1333
1338
|
},
|
|
1334
1339
|
})
|
|
@@ -1352,11 +1357,11 @@ describe('MPP access (disabled for now — API-key-only)', () => {
|
|
|
1352
1357
|
// redirected to the disposable local chain, which lacks that history, so the
|
|
1353
1358
|
// whole block is testnet-only.
|
|
1354
1359
|
describe.skipIf(Runtime.get().mode === 'localnet')('poll', () => {
|
|
1355
|
-
/** Decodes
|
|
1356
|
-
function decodeCursor(token: string | null): [
|
|
1360
|
+
/** Decodes an opaque creation checkpoint or `(block, index)` poller cursor. */
|
|
1361
|
+
function decodeCursor(token: string | null): number[] | null {
|
|
1357
1362
|
if (!token) return null
|
|
1358
1363
|
const json = atob(token.replaceAll('-', '+').replaceAll('_', '/'))
|
|
1359
|
-
return JSON.parse(json) as [
|
|
1364
|
+
return JSON.parse(json) as number[]
|
|
1360
1365
|
}
|
|
1361
1366
|
|
|
1362
1367
|
/** Encodes a `(block, index)` keyset cursor in the poller's opaque format. */
|
|
@@ -1373,7 +1378,7 @@ describe.skipIf(Runtime.get().mode === 'localnet')('poll', () => {
|
|
|
1373
1378
|
// the real keyset/`toBlock` SQL and decode path end to end — no fabricated rows.
|
|
1374
1379
|
const realTidx = Tidx.getClient({
|
|
1375
1380
|
chainId: 42431,
|
|
1376
|
-
tidx: { baseUrl: 'https://tidx.tempo.xyz'
|
|
1381
|
+
tidx: { auth: process.env.TIDX_AUTH, baseUrl: 'https://tidx.tempo.xyz' },
|
|
1377
1382
|
})
|
|
1378
1383
|
// The monitoring scanners (`log:emitted`/`block:created`/`transaction:included`)
|
|
1379
1384
|
// read the same immutable historical window over real RPC (chain 42431 →
|
|
@@ -1390,6 +1395,9 @@ describe.skipIf(Runtime.get().mode === 'localnet')('poll', () => {
|
|
|
1390
1395
|
// rows, both in block 1,000,002 (`log_idx` 0 then 1): a TIP-20 transfer
|
|
1391
1396
|
// followed by its fee payment. Filtering on it makes the scan deterministic.
|
|
1392
1397
|
const windowSender = '0xe7687128b0a808c2831ff94d4f7b2fb35c65af38'
|
|
1398
|
+
// This token has 226 transfers across blocks 1,000,000 through 1,000,003.
|
|
1399
|
+
const volumeHead = 1_000_005
|
|
1400
|
+
const volumeToken = '0x20c0000000000000000000000000000000000001'
|
|
1393
1401
|
|
|
1394
1402
|
async function createTransferSubscription(db: Db.Db) {
|
|
1395
1403
|
return Core.createSubscription(db, {
|
|
@@ -1401,6 +1409,16 @@ describe.skipIf(Runtime.get().mode === 'localnet')('poll', () => {
|
|
|
1401
1409
|
})
|
|
1402
1410
|
}
|
|
1403
1411
|
|
|
1412
|
+
async function createVolumeSubscription(db: Db.Db, ownerId = 'org_test') {
|
|
1413
|
+
return Core.createSubscription(db, {
|
|
1414
|
+
chainId: 42431,
|
|
1415
|
+
destination: { type: 'url', url: `https://hooks.example.com/${ownerId}` },
|
|
1416
|
+
eventType: 'token:transfer',
|
|
1417
|
+
filters: { token: volumeToken },
|
|
1418
|
+
owner: { orgId: ownerId, type: 'api_key' },
|
|
1419
|
+
})
|
|
1420
|
+
}
|
|
1421
|
+
|
|
1404
1422
|
test('dispatches a signed envelope per row and advances the cursor', async () => {
|
|
1405
1423
|
const db = TestApp.database()
|
|
1406
1424
|
const subscription = await createTransferSubscription(db)
|
|
@@ -1519,6 +1537,104 @@ describe.skipIf(Runtime.get().mode === 'localnet')('poll', () => {
|
|
|
1519
1537
|
`)
|
|
1520
1538
|
})
|
|
1521
1539
|
|
|
1540
|
+
test('drains two bounded transfer pages per tick without gaps', async () => {
|
|
1541
|
+
const db = TestApp.database()
|
|
1542
|
+
const subscription = await createVolumeSubscription(db)
|
|
1543
|
+
await Core.setCursor(db, subscription.id, windowCursor)
|
|
1544
|
+
|
|
1545
|
+
const positions: string[] = []
|
|
1546
|
+
const tick = () =>
|
|
1547
|
+
Webhooks.poll({
|
|
1548
|
+
chainId: 42431,
|
|
1549
|
+
client,
|
|
1550
|
+
db,
|
|
1551
|
+
dispatch: async ({ envelope }) => {
|
|
1552
|
+
const data = envelope.data as { blockNumber: number; logIndex: number }
|
|
1553
|
+
positions.push(`${data.blockNumber}:${data.logIndex}`)
|
|
1554
|
+
return { ok: true }
|
|
1555
|
+
},
|
|
1556
|
+
eventTypes: ['token:transfer'],
|
|
1557
|
+
headBlockNumber: volumeHead,
|
|
1558
|
+
tidx: realTidx,
|
|
1559
|
+
})
|
|
1560
|
+
|
|
1561
|
+
expect((await tick()).dispatched).toBe(200)
|
|
1562
|
+
expect(decodeCursor(await Core.getCursor(db, subscription.id))).toEqual([1_000_003, 144])
|
|
1563
|
+
expect((await tick()).dispatched).toBe(26)
|
|
1564
|
+
expect(decodeCursor(await Core.getCursor(db, subscription.id))).toEqual([1_000_003, 223])
|
|
1565
|
+
expect(positions).toHaveLength(226)
|
|
1566
|
+
expect(new Set(positions).size).toBe(226)
|
|
1567
|
+
expect(positions[99]).toBe('1000002:9')
|
|
1568
|
+
expect(positions[100]).toBe('1000002:10')
|
|
1569
|
+
})
|
|
1570
|
+
|
|
1571
|
+
test('commits the first page before a continuation delivery fails', async () => {
|
|
1572
|
+
const db = TestApp.database()
|
|
1573
|
+
const subscription = await createVolumeSubscription(db)
|
|
1574
|
+
await Core.setCursor(db, subscription.id, windowCursor)
|
|
1575
|
+
|
|
1576
|
+
let calls = 0
|
|
1577
|
+
const first = await Webhooks.poll({
|
|
1578
|
+
chainId: 42431,
|
|
1579
|
+
client,
|
|
1580
|
+
db,
|
|
1581
|
+
dispatch: async () => (++calls === 101 ? { error: 'unreachable', ok: false } : { ok: true }),
|
|
1582
|
+
eventTypes: ['token:transfer'],
|
|
1583
|
+
headBlockNumber: volumeHead,
|
|
1584
|
+
tidx: realTidx,
|
|
1585
|
+
})
|
|
1586
|
+
|
|
1587
|
+
expect(first.dispatched).toBe(100)
|
|
1588
|
+
expect(first.failed).toBe(1)
|
|
1589
|
+
expect(decodeCursor(await Core.getCursor(db, subscription.id))).toEqual([1_000_002, 9])
|
|
1590
|
+
|
|
1591
|
+
let resumed: readonly [number, number] | undefined
|
|
1592
|
+
await Webhooks.poll({
|
|
1593
|
+
batchSize: 1,
|
|
1594
|
+
chainId: 42431,
|
|
1595
|
+
client,
|
|
1596
|
+
db,
|
|
1597
|
+
dispatch: async ({ envelope }) => {
|
|
1598
|
+
const data = envelope.data as { blockNumber: number; logIndex: number }
|
|
1599
|
+
resumed = [data.blockNumber, data.logIndex]
|
|
1600
|
+
return { ok: true }
|
|
1601
|
+
},
|
|
1602
|
+
eventTypes: ['token:transfer'],
|
|
1603
|
+
headBlockNumber: volumeHead,
|
|
1604
|
+
tidx: realTidx,
|
|
1605
|
+
})
|
|
1606
|
+
expect(resumed).toEqual([1_000_002, 10])
|
|
1607
|
+
})
|
|
1608
|
+
|
|
1609
|
+
test('round-robins continuation pages across subscriptions', async () => {
|
|
1610
|
+
const db = TestApp.database()
|
|
1611
|
+
const a = await createVolumeSubscription(db, 'org_a')
|
|
1612
|
+
const b = await createVolumeSubscription(db, 'org_b')
|
|
1613
|
+
await Core.setCursor(db, a.id, windowCursor)
|
|
1614
|
+
await Core.setCursor(db, b.id, windowCursor)
|
|
1615
|
+
const [first, second] = [a.id, b.id].sort()
|
|
1616
|
+
|
|
1617
|
+
const order: string[] = []
|
|
1618
|
+
await Webhooks.poll({
|
|
1619
|
+
chainId: 42431,
|
|
1620
|
+
client,
|
|
1621
|
+
db,
|
|
1622
|
+
dispatch: async ({ subscription }) => {
|
|
1623
|
+
order.push(subscription.id)
|
|
1624
|
+
return { ok: true }
|
|
1625
|
+
},
|
|
1626
|
+
eventTypes: ['token:transfer'],
|
|
1627
|
+
headBlockNumber: volumeHead,
|
|
1628
|
+
tidx: realTidx,
|
|
1629
|
+
})
|
|
1630
|
+
|
|
1631
|
+
expect(order).toHaveLength(400)
|
|
1632
|
+
expect(new Set(order.slice(0, 100))).toEqual(new Set([first]))
|
|
1633
|
+
expect(new Set(order.slice(100, 200))).toEqual(new Set([second]))
|
|
1634
|
+
expect(new Set(order.slice(200, 300))).toEqual(new Set([first]))
|
|
1635
|
+
expect(new Set(order.slice(300, 400))).toEqual(new Set([second]))
|
|
1636
|
+
})
|
|
1637
|
+
|
|
1522
1638
|
test('anchors a first-seen subscription at the confirmed head without backfilling', async () => {
|
|
1523
1639
|
const db = TestApp.database()
|
|
1524
1640
|
const subscription = await createTransferSubscription(db)
|
|
@@ -1550,6 +1666,82 @@ describe.skipIf(Runtime.get().mode === 'localnet')('poll', () => {
|
|
|
1550
1666
|
`)
|
|
1551
1667
|
})
|
|
1552
1668
|
|
|
1669
|
+
test('dispatches creation-head replacements once confirmed', async () => {
|
|
1670
|
+
const db = TestApp.database()
|
|
1671
|
+
const creationHead = windowTo
|
|
1672
|
+
const subscription = await Core.createSubscription(
|
|
1673
|
+
db,
|
|
1674
|
+
{
|
|
1675
|
+
chainId: 42431,
|
|
1676
|
+
destination: { type: 'url', url: 'https://hooks.example.com/x' },
|
|
1677
|
+
eventType: 'token:transfer',
|
|
1678
|
+
filters: { sender: windowSender },
|
|
1679
|
+
owner: { orgId: 'org_test', type: 'api_key' },
|
|
1680
|
+
},
|
|
1681
|
+
{ startBlockNumber: creationHead },
|
|
1682
|
+
)
|
|
1683
|
+
|
|
1684
|
+
const result = await Webhooks.poll({
|
|
1685
|
+
chainId: 42431,
|
|
1686
|
+
confirmations: 3,
|
|
1687
|
+
dispatch: async () => ({ ok: true }),
|
|
1688
|
+
eventTypes: ['token:transfer'],
|
|
1689
|
+
headBlockNumber: creationHead + 3,
|
|
1690
|
+
client,
|
|
1691
|
+
db,
|
|
1692
|
+
tidx: realTidx,
|
|
1693
|
+
})
|
|
1694
|
+
|
|
1695
|
+
expect(result.dispatched).toBe(2)
|
|
1696
|
+
expect(decodeCursor(await Core.getCursor(db, subscription.id))).toEqual([windowTo, 1])
|
|
1697
|
+
})
|
|
1698
|
+
|
|
1699
|
+
test('keeps confirmed creation anchors while sources catch up', async () => {
|
|
1700
|
+
const db = TestApp.database()
|
|
1701
|
+
const startBlockNumber = windowTo + 100
|
|
1702
|
+
const transfer = await Core.createSubscription(
|
|
1703
|
+
db,
|
|
1704
|
+
{
|
|
1705
|
+
chainId: 42431,
|
|
1706
|
+
destination: { type: 'url', url: 'https://hooks.example.com/transfer' },
|
|
1707
|
+
eventType: 'token:transfer',
|
|
1708
|
+
filters: { sender: windowSender },
|
|
1709
|
+
owner: { orgId: 'org_transfer', type: 'api_key' },
|
|
1710
|
+
},
|
|
1711
|
+
{ startBlockNumber },
|
|
1712
|
+
)
|
|
1713
|
+
const block = await Core.createSubscription(
|
|
1714
|
+
db,
|
|
1715
|
+
{
|
|
1716
|
+
chainId: 42431,
|
|
1717
|
+
destination: { type: 'url', url: 'https://hooks.example.com/block' },
|
|
1718
|
+
eventType: 'block:created',
|
|
1719
|
+
filters: {},
|
|
1720
|
+
owner: { orgId: 'org_block', type: 'api_key' },
|
|
1721
|
+
},
|
|
1722
|
+
{ startBlockNumber },
|
|
1723
|
+
)
|
|
1724
|
+
|
|
1725
|
+
await Webhooks.poll({
|
|
1726
|
+
chainId: 42431,
|
|
1727
|
+
dispatch: async () => ({ ok: true }),
|
|
1728
|
+
eventTypes: ['token:transfer', 'block:created'],
|
|
1729
|
+
headBlockNumber: windowHead,
|
|
1730
|
+
client,
|
|
1731
|
+
db,
|
|
1732
|
+
tidx: realTidx,
|
|
1733
|
+
})
|
|
1734
|
+
|
|
1735
|
+
expect(decodeCursor(await Core.getCursor(db, transfer.id))).toEqual([
|
|
1736
|
+
startBlockNumber - 2,
|
|
1737
|
+
endOfBlockIndex,
|
|
1738
|
+
])
|
|
1739
|
+
expect(decodeCursor(await Core.getCursor(db, block.id))).toEqual([
|
|
1740
|
+
startBlockNumber - 2,
|
|
1741
|
+
endOfBlockIndex,
|
|
1742
|
+
])
|
|
1743
|
+
})
|
|
1744
|
+
|
|
1553
1745
|
test('advances to the end of the confirmed window on an empty scan', async () => {
|
|
1554
1746
|
const db = TestApp.database()
|
|
1555
1747
|
const subscription = await createTransferSubscription(db)
|
|
@@ -1687,27 +1879,67 @@ describe.skipIf(Runtime.get().mode === 'localnet')('poll', () => {
|
|
|
1687
1879
|
`)
|
|
1688
1880
|
})
|
|
1689
1881
|
|
|
1690
|
-
test('
|
|
1882
|
+
test('log:emitted limits a tick and resumes within the block', async () => {
|
|
1691
1883
|
const db = TestApp.database()
|
|
1692
1884
|
const subscription = await Core.createSubscription(db, {
|
|
1693
1885
|
chainId: 42431,
|
|
1694
|
-
eventType: 'block:created',
|
|
1695
|
-
// Pin to a single block so the heartbeat feed is deterministic.
|
|
1696
|
-
filters: { number: { eq: `0x${windowTo.toString(16)}` } },
|
|
1697
|
-
owner: { orgId: 'org_test', type: 'api_key' },
|
|
1698
1886
|
destination: { type: 'url', url: 'https://hooks.example.com/x' },
|
|
1887
|
+
eventType: 'log:emitted',
|
|
1888
|
+
filters: { args: { from: windowSender }, signature: transferSignature },
|
|
1889
|
+
owner: { orgId: 'org_test', type: 'api_key' },
|
|
1699
1890
|
})
|
|
1700
1891
|
await Core.setCursor(db, subscription.id, windowCursor)
|
|
1701
1892
|
|
|
1893
|
+
const dispatched: Webhooks.poll.Dispatchable[] = []
|
|
1894
|
+
const tick = () =>
|
|
1895
|
+
Webhooks.poll({
|
|
1896
|
+
batchSize: 1,
|
|
1897
|
+
chainId: 42431,
|
|
1898
|
+
client,
|
|
1899
|
+
db,
|
|
1900
|
+
dispatch: async (input) => {
|
|
1901
|
+
dispatched.push(input)
|
|
1902
|
+
return { ok: true }
|
|
1903
|
+
},
|
|
1904
|
+
eventTypes: ['log:emitted'],
|
|
1905
|
+
headBlockNumber: windowHead,
|
|
1906
|
+
tidx: realTidx,
|
|
1907
|
+
})
|
|
1908
|
+
|
|
1909
|
+
expect((await tick()).dispatched).toBe(1)
|
|
1910
|
+
expect(decodeCursor(await Core.getCursor(db, subscription.id))).toEqual([windowTo, 0])
|
|
1911
|
+
expect((await tick()).dispatched).toBe(1)
|
|
1912
|
+
expect(decodeCursor(await Core.getCursor(db, subscription.id))).toEqual([windowTo, 1])
|
|
1913
|
+
expect(
|
|
1914
|
+
dispatched.map(({ envelope }) => (envelope.data as { logIndex: number }).logIndex),
|
|
1915
|
+
).toEqual([0, 1])
|
|
1916
|
+
})
|
|
1917
|
+
|
|
1918
|
+
test('block:created scans new blocks and resolves transaction counts', async () => {
|
|
1919
|
+
const db = TestApp.database()
|
|
1920
|
+
const subscription = await Core.createSubscription(
|
|
1921
|
+
db,
|
|
1922
|
+
{
|
|
1923
|
+
chainId: 42431,
|
|
1924
|
+
eventType: 'block:created',
|
|
1925
|
+
// Pin to the creation-head height, which may be replaced before confirmation.
|
|
1926
|
+
filters: { number: { eq: `0x${windowTo.toString(16)}` } },
|
|
1927
|
+
owner: { orgId: 'org_test', type: 'api_key' },
|
|
1928
|
+
destination: { type: 'url', url: 'https://hooks.example.com/x' },
|
|
1929
|
+
},
|
|
1930
|
+
{ startBlockNumber: windowTo },
|
|
1931
|
+
)
|
|
1932
|
+
|
|
1702
1933
|
const dispatched: Webhooks.poll.Dispatchable[] = []
|
|
1703
1934
|
const result = await Webhooks.poll({
|
|
1704
1935
|
chainId: 42431,
|
|
1936
|
+
confirmations: 3,
|
|
1705
1937
|
dispatch: async (input) => {
|
|
1706
1938
|
dispatched.push(input)
|
|
1707
1939
|
return { ok: true }
|
|
1708
1940
|
},
|
|
1709
1941
|
eventTypes: ['block:created'],
|
|
1710
|
-
headBlockNumber:
|
|
1942
|
+
headBlockNumber: windowTo + 3,
|
|
1711
1943
|
client,
|
|
1712
1944
|
db,
|
|
1713
1945
|
tidx: realTidx,
|
|
@@ -1736,55 +1968,126 @@ describe.skipIf(Runtime.get().mode === 'localnet')('poll', () => {
|
|
|
1736
1968
|
`)
|
|
1737
1969
|
})
|
|
1738
1970
|
|
|
1739
|
-
test('block:created
|
|
1971
|
+
test('block:created limits a tick and resumes at the next block', async () => {
|
|
1740
1972
|
const db = TestApp.database()
|
|
1741
|
-
const missingBlock = 4_000_000_000
|
|
1742
|
-
const cursor = encodeCursor([missingBlock - 1, endOfBlockIndex])
|
|
1743
1973
|
const subscription = await Core.createSubscription(db, {
|
|
1744
1974
|
chainId: 42431,
|
|
1745
1975
|
destination: { type: 'url', url: 'https://hooks.example.com/x' },
|
|
1746
1976
|
eventType: 'block:created',
|
|
1747
|
-
filters: {
|
|
1977
|
+
filters: {},
|
|
1748
1978
|
owner: { orgId: 'org_test', type: 'api_key' },
|
|
1749
1979
|
})
|
|
1750
|
-
await Core.setCursor(db, subscription.id,
|
|
1980
|
+
await Core.setCursor(db, subscription.id, windowCursor)
|
|
1981
|
+
|
|
1982
|
+
const dispatched: Webhooks.poll.Dispatchable[] = []
|
|
1983
|
+
const tick = () =>
|
|
1984
|
+
Webhooks.poll({
|
|
1985
|
+
batchSize: 1,
|
|
1986
|
+
chainId: 42431,
|
|
1987
|
+
client,
|
|
1988
|
+
db,
|
|
1989
|
+
dispatch: async (input) => {
|
|
1990
|
+
dispatched.push(input)
|
|
1991
|
+
return { ok: true }
|
|
1992
|
+
},
|
|
1993
|
+
eventTypes: ['block:created'],
|
|
1994
|
+
headBlockNumber: windowHead,
|
|
1995
|
+
tidx: realTidx,
|
|
1996
|
+
})
|
|
1997
|
+
|
|
1998
|
+
expect((await tick()).dispatched).toBe(1)
|
|
1999
|
+
expect(decodeCursor(await Core.getCursor(db, subscription.id))).toEqual([windowFrom, 0])
|
|
2000
|
+
expect((await tick()).dispatched).toBe(1)
|
|
2001
|
+
expect(decodeCursor(await Core.getCursor(db, subscription.id))).toEqual([windowFrom + 1, 0])
|
|
2002
|
+
expect(dispatched.map(({ envelope }) => (envelope.data as { number: number }).number)).toEqual([
|
|
2003
|
+
windowFrom,
|
|
2004
|
+
windowFrom + 1,
|
|
2005
|
+
])
|
|
2006
|
+
})
|
|
2007
|
+
|
|
2008
|
+
test('block:created continues other subscriptions when a block header cannot be read', async () => {
|
|
2009
|
+
const db = TestApp.database()
|
|
2010
|
+
const missingBlock = 4_000_000_000
|
|
2011
|
+
const cursor = encodeCursor([missingBlock - 1, endOfBlockIndex])
|
|
2012
|
+
const unavailable = await Core.createSubscription(
|
|
2013
|
+
db,
|
|
2014
|
+
{
|
|
2015
|
+
chainId: 42431,
|
|
2016
|
+
destination: { type: 'url', url: 'https://hooks.example.com/unavailable' },
|
|
2017
|
+
eventType: 'block:created',
|
|
2018
|
+
filters: { number: { eq: `0x${missingBlock.toString(16)}` } },
|
|
2019
|
+
owner: { orgId: 'org_test', type: 'api_key' },
|
|
2020
|
+
},
|
|
2021
|
+
{ now: () => new Date('2026-01-01T00:00:00.000Z') },
|
|
2022
|
+
)
|
|
2023
|
+
const healthy = await Core.createSubscription(
|
|
2024
|
+
db,
|
|
2025
|
+
{
|
|
2026
|
+
chainId: 42431,
|
|
2027
|
+
destination: { type: 'url', url: 'https://hooks.example.com/healthy' },
|
|
2028
|
+
eventType: 'block:created',
|
|
2029
|
+
filters: { number: { eq: `0x${windowTo.toString(16)}` } },
|
|
2030
|
+
owner: { orgId: 'org_test', type: 'api_key' },
|
|
2031
|
+
},
|
|
2032
|
+
{ now: () => new Date('2026-01-01T00:00:01.000Z') },
|
|
2033
|
+
)
|
|
2034
|
+
await Core.setCursor(db, unavailable.id, cursor)
|
|
2035
|
+
await Core.setCursor(db, healthy.id, windowCursor)
|
|
2036
|
+
|
|
2037
|
+
const dispatched: Webhooks.poll.Dispatchable[] = []
|
|
1751
2038
|
|
|
1752
2039
|
await expect(
|
|
1753
2040
|
Webhooks.poll({
|
|
1754
2041
|
chainId: 42431,
|
|
2042
|
+
dispatch: async (input) => {
|
|
2043
|
+
dispatched.push(input)
|
|
2044
|
+
return { ok: true }
|
|
2045
|
+
},
|
|
1755
2046
|
eventTypes: ['block:created'],
|
|
1756
2047
|
headBlockNumber: missingBlock + 2,
|
|
1757
2048
|
client,
|
|
1758
2049
|
db,
|
|
2050
|
+
maxBlocks: 3,
|
|
1759
2051
|
tidx: realTidx,
|
|
1760
2052
|
}),
|
|
1761
2053
|
).rejects.toThrow()
|
|
1762
2054
|
|
|
1763
|
-
expect(await Core.getCursor(db,
|
|
2055
|
+
expect(await Core.getCursor(db, unavailable.id)).toBe(cursor)
|
|
2056
|
+
expect(decodeCursor(await Core.getCursor(db, healthy.id))).toMatchInlineSnapshot(`
|
|
2057
|
+
[
|
|
2058
|
+
1000002,
|
|
2059
|
+
2147483647,
|
|
2060
|
+
]
|
|
2061
|
+
`)
|
|
2062
|
+
expect(dispatched.map(({ subscription }) => subscription.id)).toEqual([healthy.id])
|
|
1764
2063
|
})
|
|
1765
2064
|
|
|
1766
2065
|
test('transaction:included filters on txs columns and inner calls', async () => {
|
|
1767
2066
|
const db = TestApp.database()
|
|
1768
|
-
const subscription = await Core.createSubscription(
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
2067
|
+
const subscription = await Core.createSubscription(
|
|
2068
|
+
db,
|
|
2069
|
+
{
|
|
2070
|
+
chainId: 42431,
|
|
2071
|
+
eventType: 'transaction:included',
|
|
2072
|
+
// `from` + an `input` selector (ERC20 `transfer` = 0xa9059cbb) pins the
|
|
2073
|
+
// scan to the deterministic creation-head transaction.
|
|
2074
|
+
filters: { from: windowSender, input: { selector: '0xa9059cbb' } },
|
|
2075
|
+
owner: { orgId: 'org_test', type: 'api_key' },
|
|
2076
|
+
destination: { type: 'url', url: 'https://hooks.example.com/x' },
|
|
2077
|
+
},
|
|
2078
|
+
{ startBlockNumber: windowTo },
|
|
2079
|
+
)
|
|
1778
2080
|
|
|
1779
2081
|
const dispatched: Webhooks.poll.Dispatchable[] = []
|
|
1780
2082
|
const result = await Webhooks.poll({
|
|
1781
2083
|
chainId: 42431,
|
|
2084
|
+
confirmations: 3,
|
|
1782
2085
|
dispatch: async (input) => {
|
|
1783
2086
|
dispatched.push(input)
|
|
1784
2087
|
return { ok: true }
|
|
1785
2088
|
},
|
|
1786
2089
|
eventTypes: ['transaction:included'],
|
|
1787
|
-
headBlockNumber:
|
|
2090
|
+
headBlockNumber: windowTo + 3,
|
|
1788
2091
|
client,
|
|
1789
2092
|
db,
|
|
1790
2093
|
tidx: realTidx,
|
|
@@ -1803,6 +2106,46 @@ describe.skipIf(Runtime.get().mode === 'localnet')('poll', () => {
|
|
|
1803
2106
|
expect(typeof tx.feeToken?.name).toBe('string')
|
|
1804
2107
|
expect(typeof tx.feeToken?.symbol).toBe('string')
|
|
1805
2108
|
} else expect(tx?.feeToken).toBeUndefined()
|
|
2109
|
+
expect(decodeCursor(await Core.getCursor(db, subscription.id))).toEqual([
|
|
2110
|
+
windowTo,
|
|
2111
|
+
endOfBlockIndex,
|
|
2112
|
+
])
|
|
2113
|
+
})
|
|
2114
|
+
|
|
2115
|
+
test('transaction:included limits a tick and resumes within the block', async () => {
|
|
2116
|
+
const db = TestApp.database()
|
|
2117
|
+
const subscription = await Core.createSubscription(db, {
|
|
2118
|
+
chainId: 42431,
|
|
2119
|
+
destination: { type: 'url', url: 'https://hooks.example.com/x' },
|
|
2120
|
+
eventType: 'transaction:included',
|
|
2121
|
+
filters: {},
|
|
2122
|
+
owner: { orgId: 'org_test', type: 'api_key' },
|
|
2123
|
+
})
|
|
2124
|
+
await Core.setCursor(db, subscription.id, encodeCursor([windowTo - 1, endOfBlockIndex]))
|
|
2125
|
+
|
|
2126
|
+
const dispatched: Webhooks.poll.Dispatchable[] = []
|
|
2127
|
+
const tick = () =>
|
|
2128
|
+
Webhooks.poll({
|
|
2129
|
+
batchSize: 1,
|
|
2130
|
+
chainId: 42431,
|
|
2131
|
+
client,
|
|
2132
|
+
db,
|
|
2133
|
+
dispatch: async (input) => {
|
|
2134
|
+
dispatched.push(input)
|
|
2135
|
+
return { ok: true }
|
|
2136
|
+
},
|
|
2137
|
+
eventTypes: ['transaction:included'],
|
|
2138
|
+
headBlockNumber: windowHead,
|
|
2139
|
+
tidx: realTidx,
|
|
2140
|
+
})
|
|
2141
|
+
|
|
2142
|
+
expect((await tick()).dispatched).toBe(1)
|
|
2143
|
+
expect(decodeCursor(await Core.getCursor(db, subscription.id))).toEqual([windowTo, 0])
|
|
2144
|
+
expect((await tick()).dispatched).toBe(1)
|
|
2145
|
+
expect(decodeCursor(await Core.getCursor(db, subscription.id))).toEqual([windowTo, 1])
|
|
2146
|
+
expect(
|
|
2147
|
+
new Set(dispatched.map(({ envelope }) => (envelope.data as { hash: string }).hash)).size,
|
|
2148
|
+
).toBe(2)
|
|
1806
2149
|
})
|
|
1807
2150
|
|
|
1808
2151
|
test('transaction:included preserves the cursor when a confirmed block is unavailable', async () => {
|