tapimo 0.14.0 → 0.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -4
- package/dist/ApiKey.js +1 -1
- package/dist/ApiKey.js.map +1 -1
- package/dist/ApiKeys.d.ts +95 -14
- package/dist/ApiKeys.d.ts.map +1 -1
- package/dist/ApiKeys.js +360 -49
- package/dist/ApiKeys.js.map +1 -1
- package/dist/App.d.ts +12466 -10374
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +300 -22
- package/dist/App.js.map +1 -1
- package/dist/Assets.d.ts.map +1 -1
- package/dist/Assets.js +2 -1
- package/dist/Assets.js.map +1 -1
- package/dist/Handler.d.ts +0 -1
- package/dist/Handler.d.ts.map +1 -1
- package/dist/Handler.js +0 -1
- package/dist/Handler.js.map +1 -1
- package/dist/Scope.d.ts +13 -5
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +16 -5
- package/dist/Scope.js.map +1 -1
- package/dist/Webhooks.js +1 -1
- package/dist/Webhooks.js.map +1 -1
- package/dist/admin/App.d.ts +3057 -546
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/App.js +26 -5
- package/dist/admin/App.js.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +179 -27
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +95 -43
- package/dist/admin/apps/api-keys.js.map +1 -1
- package/dist/admin/apps/earn-vaults.d.ts +1398 -0
- package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
- package/dist/admin/apps/earn-vaults.js +463 -7
- package/dist/admin/apps/earn-vaults.js.map +1 -1
- package/dist/admin/apps/organizations.d.ts +267 -15
- package/dist/admin/apps/organizations.d.ts.map +1 -1
- package/dist/admin/apps/organizations.js +241 -25
- package/dist/admin/apps/organizations.js.map +1 -1
- package/dist/admin/apps/routes-support.d.ts +95 -0
- package/dist/admin/apps/routes-support.d.ts.map +1 -0
- package/dist/admin/apps/routes-support.js +151 -0
- package/dist/admin/apps/routes-support.js.map +1 -0
- package/dist/admin/apps/routes.d.ts +2764 -0
- package/dist/admin/apps/routes.d.ts.map +1 -0
- package/dist/admin/apps/routes.js +728 -0
- package/dist/admin/apps/routes.js.map +1 -0
- package/dist/admin/apps/subsidies.d.ts +501 -0
- package/dist/admin/apps/subsidies.d.ts.map +1 -0
- package/dist/admin/apps/subsidies.js +384 -0
- package/dist/admin/apps/subsidies.js.map +1 -0
- package/dist/admin/apps/verified-tokens.d.ts +166 -160
- package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
- package/dist/admin/apps/verified-tokens.js +27 -7
- package/dist/admin/apps/verified-tokens.js.map +1 -1
- 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 +201 -149
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/analytics/Analytics.d.ts +5 -2
- package/dist/analytics/Analytics.d.ts.map +1 -1
- package/dist/analytics/Analytics.js +31 -1
- package/dist/analytics/Analytics.js.map +1 -1
- package/dist/analytics/tables/requestEvents.d.ts +2 -1
- package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
- package/dist/analytics/tables/requestEvents.js +10 -1
- package/dist/analytics/tables/requestEvents.js.map +1 -1
- package/dist/analytics/tables/routesLifecycleIntervals.d.ts +72 -0
- package/dist/analytics/tables/routesLifecycleIntervals.d.ts.map +1 -0
- package/dist/analytics/tables/routesLifecycleIntervals.js +56 -0
- package/dist/analytics/tables/routesLifecycleIntervals.js.map +1 -0
- package/dist/apps/Zones.d.ts +21 -12526
- package/dist/apps/Zones.d.ts.map +1 -1
- package/dist/apps/Zones.js +37 -5
- package/dist/apps/Zones.js.map +1 -1
- package/dist/apps/data/App.d.ts +3971 -2595
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/App.js +76 -21
- package/dist/apps/data/App.js.map +1 -1
- package/dist/apps/data/routes/activities.d.ts +629 -299
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +495 -190
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +72 -0
- package/dist/apps/data/routes/addresses.d.ts.map +1 -1
- package/dist/apps/data/routes/blocks.d.ts +116 -116
- package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
- package/dist/apps/data/routes/coingecko.js +47 -21
- package/dist/apps/data/routes/coingecko.js.map +1 -1
- package/dist/apps/data/routes/earn.d.ts +1450 -337
- package/dist/apps/data/routes/earn.d.ts.map +1 -1
- package/dist/apps/data/routes/earn.js +1226 -144
- package/dist/apps/data/routes/earn.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts +113 -108
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +41 -21
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +142 -17
- package/dist/apps/data/routes/indexer.d.ts.map +1 -1
- package/dist/apps/data/routes/indexer.js +83 -27
- package/dist/apps/data/routes/indexer.js.map +1 -1
- package/dist/apps/data/routes/receipts.d.ts +235 -235
- package/dist/apps/data/routes/rpc.d.ts +507 -33
- package/dist/apps/data/routes/rpc.d.ts.map +1 -1
- package/dist/apps/data/routes/rpc.js +309 -165
- package/dist/apps/data/routes/rpc.js.map +1 -1
- package/dist/apps/data/routes/tokenlist.d.ts +47 -15
- package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
- package/dist/apps/data/routes/tokenlist.js +68 -11
- package/dist/apps/data/routes/tokenlist.js.map +1 -1
- package/dist/apps/data/routes/tokens.d.ts +2 -0
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +26 -14
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +93 -77
- package/dist/apps/data/routes/transfers.d.ts.map +1 -1
- package/dist/apps/data/routes/transfers.js +9 -7
- package/dist/apps/data/routes/transfers.js.map +1 -1
- package/dist/apps/data/routes/valuation.d.ts +32 -32
- package/dist/apps/data/routes/verified-tokens.d.ts +88 -88
- package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/verified-tokens.js +64 -20
- package/dist/apps/data/routes/verified-tokens.js.map +1 -1
- package/dist/apps/data/routes/webhooks.d.ts +614 -177
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +308 -205
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +31 -31
- package/dist/apps/data/routes/zones.d.ts.map +1 -1
- package/dist/apps/data/routes/zones.js +20 -12
- package/dist/apps/data/routes/zones.js.map +1 -1
- package/dist/apps/docs/reference.js +2 -2
- package/dist/apps/docs/reference.js.map +1 -1
- package/dist/apps/index.d.ts +1 -1
- package/dist/apps/index.d.ts.map +1 -1
- package/dist/apps/index.js +1 -1
- package/dist/apps/index.js.map +1 -1
- package/dist/apps/management/App.d.ts +3780 -3402
- package/dist/apps/management/App.d.ts.map +1 -1
- package/dist/apps/management/App.js +5 -14
- package/dist/apps/management/App.js.map +1 -1
- package/dist/apps/management/Billing.d.ts +48 -7
- package/dist/apps/management/Billing.d.ts.map +1 -1
- package/dist/apps/management/Billing.js +204 -25
- package/dist/apps/management/Billing.js.map +1 -1
- package/dist/apps/management/routes/api-keys.d.ts +317 -215
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +43 -15
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +290 -4
- package/dist/apps/management/routes/billing.d.ts.map +1 -1
- package/dist/apps/management/routes/billing.js +274 -49
- package/dist/apps/management/routes/billing.js.map +1 -1
- package/dist/apps/management/routes/faucet.d.ts +6 -6
- package/dist/apps/management/routes/faucet.js +1 -1
- package/dist/apps/management/routes/faucet.js.map +1 -1
- package/dist/apps/management/routes/invitations.d.ts +213 -138
- package/dist/apps/management/routes/invitations.d.ts.map +1 -1
- package/dist/apps/management/routes/invitations.js +117 -13
- package/dist/apps/management/routes/invitations.js.map +1 -1
- package/dist/apps/management/routes/invite-links.d.ts +166 -166
- package/dist/apps/management/routes/me.d.ts.map +1 -1
- package/dist/apps/management/routes/me.js +6 -2
- package/dist/apps/management/routes/me.js.map +1 -1
- package/dist/apps/management/routes/members.d.ts +30 -30
- package/dist/apps/management/routes/orgs.d.ts +103 -87
- package/dist/apps/management/routes/orgs.d.ts.map +1 -1
- package/dist/apps/management/routes/orgs.js +52 -12
- package/dist/apps/management/routes/orgs.js.map +1 -1
- package/dist/apps/management/routes/projects.d.ts +125 -125
- package/dist/apps/management/routes/projects.d.ts.map +1 -1
- package/dist/apps/management/routes/projects.js +6 -1
- package/dist/apps/management/routes/projects.js.map +1 -1
- package/dist/apps/management/routes/scopes.d.ts.map +1 -1
- package/dist/apps/management/routes/scopes.js +4 -1
- package/dist/apps/management/routes/scopes.js.map +1 -1
- package/dist/apps/management/routes/usage.d.ts +24 -24
- package/dist/apps/management/routes/usage.js +21 -4
- package/dist/apps/management/routes/usage.js.map +1 -1
- package/dist/apps/management/routes/verified-token-requests.d.ts +95 -95
- package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
- package/dist/apps/management/routes/verified-token-requests.js +7 -9
- package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
- package/dist/apps/management/routes/webhooks.d.ts +682 -616
- package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/management/routes/webhooks.js +58 -12
- package/dist/apps/management/routes/webhooks.js.map +1 -1
- package/dist/apps/mcp.d.ts +1 -1
- package/dist/apps/mcp.d.ts.map +1 -1
- package/dist/apps/mcp.js +23 -10
- package/dist/apps/mcp.js.map +1 -1
- package/dist/apps/mpp/App.d.ts +44 -44
- package/dist/apps/mpp/App.d.ts.map +1 -1
- package/dist/apps/mpp/App.js +35 -7
- package/dist/apps/mpp/App.js.map +1 -1
- package/dist/apps/mpp/internal/Adapter.d.ts +2 -0
- package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Adapter.js +30 -1
- package/dist/apps/mpp/internal/Adapter.js.map +1 -1
- package/dist/apps/mpp/internal/Policy.d.ts +22 -4
- package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Policy.js +24 -6
- package/dist/apps/mpp/internal/Policy.js.map +1 -1
- package/dist/apps/mpp/internal/Sponsorship.d.ts +3 -0
- package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Sponsorship.js +6 -3
- package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
- package/dist/apps/relay/App.d.ts +2 -0
- package/dist/apps/relay/App.d.ts.map +1 -1
- package/dist/apps/relay/App.js +134 -75
- package/dist/apps/relay/App.js.map +1 -1
- package/dist/apps/relay/Sponsorships.d.ts +5 -3
- package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
- package/dist/apps/relay/Sponsorships.js +209 -28
- package/dist/apps/relay/Sponsorships.js.map +1 -1
- package/dist/apps/{funding → routes}/Access.d.ts +4 -4
- package/dist/apps/routes/Access.d.ts.map +1 -0
- package/dist/apps/{funding → routes}/Access.js +4 -4
- package/dist/apps/routes/Access.js.map +1 -0
- package/dist/apps/{funding → routes}/App.d.ts +418 -124
- package/dist/apps/{funding → routes}/App.d.ts.map +1 -1
- package/dist/apps/{funding → routes}/App.js +16 -16
- package/dist/apps/routes/App.js.map +1 -0
- package/dist/apps/routes/Inventory.d.ts.map +1 -0
- package/dist/apps/{funding → routes}/Inventory.js +2 -2
- package/dist/apps/routes/Inventory.js.map +1 -0
- package/dist/apps/routes/index.d.ts +2 -0
- package/dist/apps/routes/index.d.ts.map +1 -0
- package/dist/apps/routes/index.js +2 -0
- package/dist/apps/routes/index.js.map +1 -0
- package/dist/apps/{funding → routes}/routes/chains.d.ts +32 -32
- package/dist/apps/routes/routes/chains.d.ts.map +1 -0
- package/dist/apps/{funding → routes}/routes/chains.js +25 -25
- package/dist/apps/routes/routes/chains.js.map +1 -0
- package/dist/apps/{funding → routes}/routes/deposit-addresses.d.ts +107 -43
- package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -0
- package/dist/apps/{funding → routes}/routes/deposit-addresses.js +497 -222
- package/dist/apps/routes/routes/deposit-addresses.js.map +1 -0
- package/dist/apps/{funding → routes}/routes/providers.d.ts +8 -8
- package/dist/apps/routes/routes/providers.d.ts.map +1 -0
- package/dist/apps/routes/routes/providers.js +57 -0
- package/dist/apps/routes/routes/providers.js.map +1 -0
- package/dist/apps/{funding → routes}/routes/quotes.d.ts +106 -103
- package/dist/apps/routes/routes/quotes.d.ts.map +1 -0
- package/dist/apps/{funding → routes}/routes/quotes.js +55 -38
- package/dist/apps/routes/routes/quotes.js.map +1 -0
- package/dist/apps/{funding → routes}/routes/transfers.d.ts +733 -428
- package/dist/apps/routes/routes/transfers.d.ts.map +1 -0
- package/dist/apps/routes/routes/transfers.js +1140 -0
- package/dist/apps/routes/routes/transfers.js.map +1 -0
- package/dist/cli/Cli.d.ts +30 -0
- package/dist/cli/Cli.d.ts.map +1 -1
- package/dist/cli/commands/admin.d.ts +36 -0
- package/dist/cli/commands/admin.d.ts.map +1 -1
- package/dist/cli/commands/admin.js +273 -0
- package/dist/cli/commands/admin.js.map +1 -1
- package/dist/cloudflare.d.ts +16 -14
- package/dist/cloudflare.d.ts.map +1 -1
- package/dist/cloudflare.js +26 -21
- package/dist/cloudflare.js.map +1 -1
- package/dist/db/Db.d.ts +63 -21
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +1035 -15
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +780 -133
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +575 -162
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/apiKeyAdmissionBootstraps.d.ts +4 -0
- package/dist/db/tables/apiKeyAdmissionBootstraps.d.ts.map +1 -0
- package/dist/db/tables/apiKeyAdmissionBootstraps.js +2 -0
- package/dist/db/tables/apiKeyAdmissionBootstraps.js.map +1 -0
- package/dist/db/tables/apiKeyAdmissions.d.ts +73 -0
- package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -0
- package/dist/db/tables/apiKeyAdmissions.js +142 -0
- package/dist/db/tables/apiKeyAdmissions.js.map +1 -0
- package/dist/db/tables/apiKeyOwnerAdmissions.d.ts +4 -0
- package/dist/db/tables/apiKeyOwnerAdmissions.d.ts.map +1 -0
- package/dist/db/tables/apiKeyOwnerAdmissions.js +2 -0
- package/dist/db/tables/apiKeyOwnerAdmissions.js.map +1 -0
- package/dist/db/tables/apiKeyOwnerTombstones.d.ts +20 -0
- package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -0
- package/dist/db/tables/apiKeyOwnerTombstones.js +57 -0
- package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -0
- package/dist/db/tables/apiKeyRevocations.d.ts +21 -0
- package/dist/db/tables/apiKeyRevocations.d.ts.map +1 -0
- package/dist/db/tables/apiKeyRevocations.js +98 -0
- package/dist/db/tables/apiKeyRevocations.js.map +1 -0
- package/dist/db/tables/authAccounts.d.ts +47 -0
- package/dist/db/tables/authAccounts.d.ts.map +1 -0
- package/dist/db/tables/authAccounts.js +72 -0
- package/dist/db/tables/authAccounts.js.map +1 -0
- package/dist/db/tables/authSessions.d.ts +12 -0
- package/dist/db/tables/authSessions.d.ts.map +1 -0
- package/dist/db/tables/authSessions.js +2 -0
- package/dist/db/tables/authSessions.js.map +1 -0
- package/dist/db/tables/authVerifications.d.ts +12 -0
- package/dist/db/tables/authVerifications.d.ts.map +1 -0
- package/dist/db/tables/authVerifications.js +2 -0
- package/dist/db/tables/authVerifications.js.map +1 -0
- package/dist/db/tables/invitations.d.ts +17 -1
- package/dist/db/tables/invitations.d.ts.map +1 -1
- package/dist/db/tables/invitations.js +123 -43
- package/dist/db/tables/invitations.js.map +1 -1
- package/dist/db/tables/memberships.d.ts +8 -0
- package/dist/db/tables/memberships.d.ts.map +1 -1
- package/dist/db/tables/memberships.js +51 -2
- package/dist/db/tables/memberships.js.map +1 -1
- package/dist/db/tables/organizations.d.ts +32 -10
- package/dist/db/tables/organizations.d.ts.map +1 -1
- package/dist/db/tables/organizations.js +110 -49
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/projects.d.ts +2 -0
- package/dist/db/tables/projects.d.ts.map +1 -1
- package/dist/db/tables/projects.js +12 -3
- package/dist/db/tables/projects.js.map +1 -1
- package/dist/db/tables/requestUsage.d.ts.map +1 -1
- package/dist/db/tables/requestUsage.js.map +1 -1
- package/dist/db/tables/rewardAccounts.d.ts +86 -0
- package/dist/db/tables/rewardAccounts.d.ts.map +1 -0
- package/dist/db/tables/rewardAccounts.js +88 -0
- package/dist/db/tables/rewardAccounts.js.map +1 -0
- package/dist/db/tables/rewardCampaignDistributors.d.ts +36 -0
- package/dist/db/tables/rewardCampaignDistributors.d.ts.map +1 -0
- package/dist/db/tables/rewardCampaignDistributors.js +30 -0
- package/dist/db/tables/rewardCampaignDistributors.js.map +1 -0
- package/dist/db/tables/rewardCampaigns.d.ts +171 -0
- package/dist/db/tables/rewardCampaigns.d.ts.map +1 -0
- package/dist/db/tables/rewardCampaigns.js +392 -0
- package/dist/db/tables/rewardCampaigns.js.map +1 -0
- package/dist/db/tables/rewardCredits.d.ts +53 -0
- package/dist/db/tables/rewardCredits.d.ts.map +1 -0
- package/dist/db/tables/rewardCredits.js +63 -0
- package/dist/db/tables/rewardCredits.js.map +1 -0
- package/dist/db/tables/rewardEligibilityAssociations.d.ts +61 -0
- package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -0
- package/dist/db/tables/rewardEligibilityAssociations.js +103 -0
- package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -0
- package/dist/db/tables/rewardRuns.d.ts +188 -0
- package/dist/db/tables/rewardRuns.d.ts.map +1 -0
- package/dist/db/tables/rewardRuns.js +278 -0
- package/dist/db/tables/rewardRuns.js.map +1 -0
- package/dist/db/tables/rewardTransactionAttempts.d.ts +100 -0
- package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -0
- package/dist/db/tables/rewardTransactionAttempts.js +163 -0
- package/dist/db/tables/rewardTransactionAttempts.js.map +1 -0
- package/dist/db/tables/routesCatalog.d.ts +58 -0
- package/dist/db/tables/routesCatalog.d.ts.map +1 -0
- package/dist/db/tables/{fundingCatalog.js → routesCatalog.js} +19 -19
- package/dist/db/tables/routesCatalog.js.map +1 -0
- package/dist/db/tables/routesDepositAddresses.d.ts +476 -0
- package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -0
- package/dist/db/tables/routesDepositAddresses.js +587 -0
- package/dist/db/tables/routesDepositAddresses.js.map +1 -0
- package/dist/db/tables/{fundingDepositRequestObservations.d.ts → routesDepositRequestObservations.d.ts} +6 -6
- package/dist/db/tables/routesDepositRequestObservations.d.ts.map +1 -0
- package/dist/db/tables/{fundingDepositRequestObservations.js → routesDepositRequestObservations.js} +6 -6
- package/dist/db/tables/routesDepositRequestObservations.js.map +1 -0
- package/dist/db/tables/{fundingDeposits.d.ts → routesDeposits.d.ts} +210 -22
- package/dist/db/tables/routesDeposits.d.ts.map +1 -0
- package/dist/db/tables/routesDeposits.js +576 -0
- package/dist/db/tables/routesDeposits.js.map +1 -0
- package/dist/db/tables/routesIdempotency.d.ts +166 -0
- package/dist/db/tables/routesIdempotency.d.ts.map +1 -0
- package/dist/db/tables/routesIdempotency.js +330 -0
- package/dist/db/tables/routesIdempotency.js.map +1 -0
- package/dist/db/tables/routesSubsidies.d.ts +27 -0
- package/dist/db/tables/routesSubsidies.d.ts.map +1 -0
- package/dist/db/tables/routesSubsidies.js +45 -0
- package/dist/db/tables/routesSubsidies.js.map +1 -0
- package/dist/db/tables/{fundingTransferEvents.d.ts → routesTransferEvents.d.ts} +3 -3
- package/dist/db/tables/routesTransferEvents.d.ts.map +1 -0
- package/dist/db/tables/{fundingTransferEvents.js → routesTransferEvents.js} +3 -3
- package/dist/db/tables/routesTransferEvents.js.map +1 -0
- package/dist/db/tables/routesTransferSubsidies.d.ts +19 -0
- package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -0
- package/dist/db/tables/routesTransferSubsidies.js +17 -0
- package/dist/db/tables/routesTransferSubsidies.js.map +1 -0
- package/dist/db/tables/routesTransferSubsidyNonces.d.ts +51 -0
- package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -0
- package/dist/db/tables/routesTransferSubsidyNonces.js +82 -0
- package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -0
- package/dist/db/tables/routesTransferTransactions.d.ts +77 -0
- package/dist/db/tables/routesTransferTransactions.d.ts.map +1 -0
- package/dist/db/tables/{fundingTransferTransactions.js → routesTransferTransactions.js} +31 -13
- package/dist/db/tables/routesTransferTransactions.js.map +1 -0
- package/dist/db/tables/routesTransfers.d.ts +319 -0
- package/dist/db/tables/routesTransfers.d.ts.map +1 -0
- package/dist/db/tables/routesTransfers.js +372 -0
- package/dist/db/tables/routesTransfers.js.map +1 -0
- package/dist/db/tables/sponsoredTransactions.d.ts +75 -20
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +124 -54
- package/dist/db/tables/sponsoredTransactions.js.map +1 -1
- package/dist/db/tables/sponsorshipAttributions.d.ts +69 -0
- package/dist/db/tables/sponsorshipAttributions.d.ts.map +1 -0
- package/dist/db/tables/sponsorshipAttributions.js +77 -0
- package/dist/db/tables/sponsorshipAttributions.js.map +1 -0
- package/dist/db/tables/sponsorshipReconciliationCursors.d.ts +22 -0
- package/dist/db/tables/sponsorshipReconciliationCursors.d.ts.map +1 -0
- package/dist/db/tables/sponsorshipReconciliationCursors.js +45 -0
- package/dist/db/tables/sponsorshipReconciliationCursors.js.map +1 -0
- package/dist/db/tables/stripeCustomers.d.ts +11 -0
- package/dist/db/tables/stripeCustomers.d.ts.map +1 -1
- package/dist/db/tables/stripeCustomers.js +13 -0
- package/dist/db/tables/stripeCustomers.js.map +1 -1
- package/dist/db/tables/users.d.ts +17 -1
- package/dist/db/tables/users.d.ts.map +1 -1
- package/dist/db/tables/users.js +47 -2
- package/dist/db/tables/users.js.map +1 -1
- package/dist/db/tables/verifiedTokenRequests.d.ts +21 -4
- package/dist/db/tables/verifiedTokenRequests.d.ts.map +1 -1
- package/dist/db/tables/verifiedTokenRequests.js +65 -44
- package/dist/db/tables/verifiedTokenRequests.js.map +1 -1
- package/dist/db/tables/webhookQueueEvents.d.ts.map +1 -1
- package/dist/db/tables/webhookQueueEvents.js +5 -1
- package/dist/db/tables/webhookQueueEvents.js.map +1 -1
- package/dist/db/tables/webhookSubscriptions.d.ts +19 -11
- package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
- package/dist/db/tables/webhookSubscriptions.js +45 -13
- package/dist/db/tables/webhookSubscriptions.js.map +1 -1
- package/dist/handlers/internal/executionError.d.ts +2 -2
- package/dist/handlers/internal/executionError.d.ts.map +1 -1
- package/dist/handlers/internal/executionError.js +1 -2
- package/dist/handlers/internal/executionError.js.map +1 -1
- package/dist/handlers/internal/multisig.d.ts +4 -232
- package/dist/handlers/internal/multisig.d.ts.map +1 -1
- package/dist/handlers/internal/multisig.js +11 -537
- package/dist/handlers/internal/multisig.js.map +1 -1
- package/dist/handlers/internal/sponsorship.d.ts +19 -8
- package/dist/handlers/internal/sponsorship.d.ts.map +1 -1
- package/dist/handlers/internal/sponsorship.js +13 -9
- package/dist/handlers/internal/sponsorship.js.map +1 -1
- package/dist/handlers/relay.d.ts +9 -12
- package/dist/handlers/relay.d.ts.map +1 -1
- package/dist/handlers/relay.js +81 -85
- package/dist/handlers/relay.js.map +1 -1
- package/dist/index.d.ts +0 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -17
- package/dist/index.js.map +1 -1
- package/dist/internal/AssetResponse.d.ts +12 -0
- package/dist/internal/AssetResponse.d.ts.map +1 -0
- package/dist/internal/AssetResponse.js +21 -0
- package/dist/internal/AssetResponse.js.map +1 -0
- package/dist/internal/Auth.d.ts +64 -12
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +631 -180
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/BetterAuth.d.ts +1488 -0
- package/dist/internal/BetterAuth.d.ts.map +1 -0
- package/dist/internal/BetterAuth.js +253 -0
- package/dist/internal/BetterAuth.js.map +1 -0
- package/dist/internal/Cache.d.ts +2 -0
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +2 -0
- package/dist/internal/Cache.js.map +1 -1
- package/dist/internal/EarnRates.d.ts +26 -3
- package/dist/internal/EarnRates.d.ts.map +1 -1
- package/dist/internal/EarnRates.js +84 -19
- package/dist/internal/EarnRates.js.map +1 -1
- package/dist/internal/EarnSharePrices.d.ts +120 -0
- package/dist/internal/EarnSharePrices.d.ts.map +1 -0
- package/dist/internal/EarnSharePrices.js +179 -0
- package/dist/internal/EarnSharePrices.js.map +1 -0
- package/dist/internal/EarnVaults.d.ts +4 -0
- package/dist/internal/EarnVaults.d.ts.map +1 -1
- package/dist/internal/EarnVaults.js +27 -10
- package/dist/internal/EarnVaults.js.map +1 -1
- package/dist/internal/Email.d.ts +37 -0
- package/dist/internal/Email.d.ts.map +1 -0
- package/dist/internal/Email.js +16 -0
- package/dist/internal/Email.js.map +1 -0
- package/dist/internal/Log.d.ts +32 -28
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +18 -11
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/MetricSink.d.ts +3 -0
- package/dist/internal/MetricSink.d.ts.map +1 -1
- package/dist/internal/MetricSink.js +67 -8
- package/dist/internal/MetricSink.js.map +1 -1
- package/dist/internal/Mpp.d.ts.map +1 -1
- package/dist/internal/Mpp.js +20 -25
- package/dist/internal/Mpp.js.map +1 -1
- package/dist/internal/OpenApi.d.ts +26 -3
- package/dist/internal/OpenApi.d.ts.map +1 -1
- package/dist/internal/OpenApi.js +25 -10
- package/dist/internal/OpenApi.js.map +1 -1
- package/dist/internal/Provider.d.ts +1 -1
- package/dist/internal/Provider.d.ts.map +1 -1
- package/dist/internal/RateLimit.d.ts.map +1 -1
- package/dist/internal/RateLimit.js +13 -1
- package/dist/internal/RateLimit.js.map +1 -1
- package/dist/internal/Store.d.ts +16 -0
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +59 -8
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/Tidx.d.ts +9 -2
- package/dist/internal/Tidx.d.ts.map +1 -1
- package/dist/internal/Tidx.js +78 -11
- package/dist/internal/Tidx.js.map +1 -1
- package/dist/internal/Timing.d.ts +26 -0
- package/dist/internal/Timing.d.ts.map +1 -1
- package/dist/internal/Timing.js +63 -5
- package/dist/internal/Timing.js.map +1 -1
- package/dist/internal/VercelOidc.d.ts +94 -0
- package/dist/internal/VercelOidc.d.ts.map +1 -0
- package/dist/internal/VercelOidc.js +128 -0
- package/dist/internal/VercelOidc.js.map +1 -0
- package/dist/internal/VerifiedTokens.d.ts +2 -8
- package/dist/internal/VerifiedTokens.d.ts.map +1 -1
- package/dist/internal/VerifiedTokens.js +24 -24
- package/dist/internal/VerifiedTokens.js.map +1 -1
- package/dist/internal/Viem.d.ts +30 -2067
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Viem.js +167 -17
- package/dist/internal/Viem.js.map +1 -1
- package/dist/internal/Webhooks.d.ts +12 -4
- package/dist/internal/Webhooks.d.ts.map +1 -1
- package/dist/internal/Webhooks.js +9 -3
- package/dist/internal/Webhooks.js.map +1 -1
- package/dist/internal/ZoneRpc.d.ts +7 -0
- package/dist/internal/ZoneRpc.d.ts.map +1 -0
- package/dist/internal/ZoneRpc.js +49 -0
- package/dist/internal/ZoneRpc.js.map +1 -0
- package/dist/internal/index.d.ts +3 -1
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +3 -1
- package/dist/internal/index.js.map +1 -1
- package/dist/internal/rewards/Audit.d.ts +88 -0
- package/dist/internal/rewards/Audit.d.ts.map +1 -0
- package/dist/internal/rewards/Audit.js +134 -0
- package/dist/internal/rewards/Audit.js.map +1 -0
- package/dist/internal/rewards/Campaigns.d.ts +572 -0
- package/dist/internal/rewards/Campaigns.d.ts.map +1 -0
- package/dist/internal/rewards/Campaigns.js +531 -0
- package/dist/internal/rewards/Campaigns.js.map +1 -0
- package/dist/internal/rewards/Credits.d.ts +76 -0
- package/dist/internal/rewards/Credits.d.ts.map +1 -0
- package/dist/internal/rewards/Credits.js +95 -0
- package/dist/internal/rewards/Credits.js.map +1 -0
- package/dist/internal/rewards/Events.d.ts +100 -0
- package/dist/internal/rewards/Events.d.ts.map +1 -0
- package/dist/internal/rewards/Events.js +340 -0
- package/dist/internal/rewards/Events.js.map +1 -0
- package/dist/internal/rewards/Projection.d.ts +237 -0
- package/dist/internal/rewards/Projection.d.ts.map +1 -0
- package/dist/internal/rewards/Projection.js +616 -0
- package/dist/internal/rewards/Projection.js.map +1 -0
- package/dist/internal/rewards/Rates.d.ts +44 -0
- package/dist/internal/rewards/Rates.d.ts.map +1 -0
- package/dist/internal/rewards/Rates.js +60 -0
- package/dist/internal/rewards/Rates.js.map +1 -0
- package/dist/internal/rewards/Read.d.ts +158 -0
- package/dist/internal/rewards/Read.d.ts.map +1 -0
- package/dist/internal/rewards/Read.js +292 -0
- package/dist/internal/rewards/Read.js.map +1 -0
- package/dist/internal/rewards/Runner.d.ts +164 -0
- package/dist/internal/rewards/Runner.d.ts.map +1 -0
- package/dist/internal/rewards/Runner.js +1778 -0
- package/dist/internal/rewards/Runner.js.map +1 -0
- package/dist/internal/rewards/Signer.d.ts +224 -0
- package/dist/internal/rewards/Signer.d.ts.map +1 -0
- package/dist/internal/rewards/Signer.js +135 -0
- package/dist/internal/rewards/Signer.js.map +1 -0
- package/dist/internal/rewards/index.d.ts +15 -0
- package/dist/internal/rewards/index.d.ts.map +1 -0
- package/dist/internal/rewards/index.js +15 -0
- package/dist/internal/rewards/index.js.map +1 -0
- package/dist/internal/{funding → routes}/Action.d.ts +12 -1
- package/dist/internal/routes/Action.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/Action.js +17 -9
- package/dist/internal/routes/Action.js.map +1 -0
- package/dist/internal/{funding → routes}/Catalog.d.ts +20 -20
- package/dist/internal/routes/Catalog.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/Catalog.js +29 -29
- package/dist/internal/routes/Catalog.js.map +1 -0
- package/dist/internal/{funding → routes}/Chain.d.ts +10 -10
- package/dist/internal/routes/Chain.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/Chain.js +3 -3
- package/dist/internal/routes/Chain.js.map +1 -0
- package/dist/internal/{funding → routes}/Deposit.d.ts +45 -23
- package/dist/internal/routes/Deposit.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/Deposit.js +60 -27
- package/dist/internal/routes/Deposit.js.map +1 -0
- package/dist/internal/{funding → routes}/DepositAddress.d.ts +56 -27
- package/dist/internal/routes/DepositAddress.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/DepositAddress.js +95 -33
- package/dist/internal/routes/DepositAddress.js.map +1 -0
- package/dist/internal/{funding → routes}/DepositWebhook.d.ts +4 -4
- package/dist/internal/routes/DepositWebhook.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/DepositWebhook.js +4 -4
- package/dist/internal/routes/DepositWebhook.js.map +1 -0
- package/dist/internal/routes/Economics.d.ts +25 -0
- package/dist/internal/routes/Economics.d.ts.map +1 -0
- package/dist/internal/routes/Economics.js +28 -0
- package/dist/internal/routes/Economics.js.map +1 -0
- package/dist/internal/{funding → routes}/Evidence.d.ts +3 -3
- package/dist/internal/routes/Evidence.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/Evidence.js +7 -7
- package/dist/internal/routes/Evidence.js.map +1 -0
- package/dist/internal/routes/Observability.d.ts +154 -0
- package/dist/internal/routes/Observability.d.ts.map +1 -0
- package/dist/internal/routes/Observability.js +389 -0
- package/dist/internal/routes/Observability.js.map +1 -0
- package/dist/internal/{funding → routes}/Provider.d.ts +311 -105
- package/dist/internal/routes/Provider.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/Provider.js +229 -98
- package/dist/internal/routes/Provider.js.map +1 -0
- package/dist/internal/{funding → routes}/Reconciliation.d.ts +11 -6
- package/dist/internal/routes/Reconciliation.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/Reconciliation.js +408 -158
- package/dist/internal/routes/Reconciliation.js.map +1 -0
- package/dist/internal/routes/Route.d.ts +21 -0
- package/dist/internal/routes/Route.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/Route.js +1 -1
- package/dist/internal/routes/Route.js.map +1 -0
- package/dist/internal/{funding → routes}/SourceObservation.d.ts +6 -6
- package/dist/internal/routes/SourceObservation.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/SourceObservation.js +8 -8
- package/dist/internal/routes/SourceObservation.js.map +1 -0
- package/dist/internal/{funding → routes}/Subsidy.d.ts +48 -3
- package/dist/internal/routes/Subsidy.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/Subsidy.js +43 -3
- package/dist/internal/routes/Subsidy.js.map +1 -0
- package/dist/internal/{funding → routes}/Token.d.ts +4 -4
- package/dist/internal/routes/Token.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/Token.js +3 -3
- package/dist/internal/routes/Token.js.map +1 -0
- package/dist/internal/{funding → routes}/Transfer.d.ts +241 -46
- package/dist/internal/routes/Transfer.d.ts.map +1 -0
- package/dist/internal/routes/Transfer.js +728 -0
- package/dist/internal/routes/Transfer.js.map +1 -0
- package/dist/internal/{funding → routes}/TransferReconciliation.d.ts +13 -10
- package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -0
- package/dist/internal/routes/TransferReconciliation.js +422 -0
- package/dist/internal/routes/TransferReconciliation.js.map +1 -0
- package/dist/internal/routes/TransferSubsidy.d.ts +201 -0
- package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -0
- package/dist/internal/routes/TransferSubsidy.js +256 -0
- package/dist/internal/routes/TransferSubsidy.js.map +1 -0
- package/dist/internal/{funding → routes}/TransferWebhook.d.ts +5 -5
- package/dist/internal/routes/TransferWebhook.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/TransferWebhook.js +3 -3
- package/dist/internal/routes/TransferWebhook.js.map +1 -0
- package/dist/internal/{funding → routes}/index.d.ts +2 -0
- package/dist/internal/routes/index.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/index.js +2 -0
- package/dist/internal/routes/index.js.map +1 -0
- package/dist/internal/{funding → routes}/providers/across.d.ts +4 -4
- package/dist/internal/routes/providers/across.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/providers/across.js +13 -13
- package/dist/internal/routes/providers/across.js.map +1 -0
- package/dist/internal/{funding → routes}/providers/relay.d.ts +21 -12
- package/dist/internal/routes/providers/relay.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/providers/relay.js +194 -110
- package/dist/internal/routes/providers/relay.js.map +1 -0
- package/dist/internal/{funding → routes}/providers/rhino.d.ts +4 -4
- package/dist/internal/routes/providers/rhino.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/providers/rhino.js +10 -10
- package/dist/internal/routes/providers/rhino.js.map +1 -0
- package/dist/internal/{funding → routes}/providers/squid.d.ts +4 -4
- package/dist/internal/routes/providers/squid.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/providers/squid.js +14 -14
- package/dist/internal/routes/providers/squid.js.map +1 -0
- package/dist/internal/{funding → routes}/providers/stargate.d.ts +46 -18
- package/dist/internal/routes/providers/stargate.d.ts.map +1 -0
- package/dist/internal/routes/providers/stargate.js +898 -0
- package/dist/internal/routes/providers/stargate.js.map +1 -0
- package/dist/internal/{funding → routes}/providers/symbiosis.d.ts +4 -4
- package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/providers/symbiosis.js +30 -20
- package/dist/internal/routes/providers/symbiosis.js.map +1 -0
- package/dist/internal/webhookDestinations/slack.js +12 -12
- package/dist/internal/webhookDestinations/slack.js.map +1 -1
- package/dist/providers/index.d.ts +12 -12
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +12 -12
- package/dist/providers/index.js.map +1 -1
- package/dist/server.d.ts +19 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +19 -0
- package/dist/server.js.map +1 -0
- package/package.json +15 -4
- package/src/ApiKey.ts +1 -1
- package/src/ApiKeys.test.ts +1033 -3
- package/src/ApiKeys.ts +489 -48
- package/src/App.test-d.ts +1 -1
- package/src/App.test.ts +216 -25
- package/src/App.ts +334 -31
- package/src/Assets.test.ts +2 -2
- package/src/Assets.ts +3 -1
- package/src/Auth.test-d.ts +1 -1
- package/src/Client.test-d.ts +539 -110
- package/src/Handler.ts +0 -1
- package/src/OpenApi.contract.test.ts +195 -0
- package/src/Scope.ts +17 -5
- package/src/Webhooks.ts +1 -1
- package/src/admin/App.test.ts +30 -2
- package/src/admin/App.ts +42 -6
- package/src/admin/apps/api-keys.test.ts +267 -5
- package/src/admin/apps/api-keys.ts +100 -50
- package/src/admin/apps/earn-vaults.test.ts +158 -0
- package/src/admin/apps/earn-vaults.ts +679 -6
- package/src/admin/apps/organizations.test.ts +306 -17
- package/src/admin/apps/organizations.ts +299 -24
- package/src/admin/apps/routes-support.test.ts +200 -0
- package/src/admin/apps/routes-support.ts +201 -0
- package/src/admin/apps/routes.test.ts +450 -0
- package/src/admin/apps/routes.ts +896 -0
- package/src/admin/apps/scopes.test.ts +15 -5
- package/src/admin/apps/subsidies.test.ts +306 -0
- package/src/admin/apps/subsidies.ts +457 -0
- package/src/admin/apps/verified-tokens.test.ts +40 -3
- package/src/admin/apps/verified-tokens.ts +33 -7
- package/src/admin/ui/plugin.ts +1 -2
- package/src/admin/ui/src/components/RewardCampaignForm.tsx +1009 -0
- package/src/admin/ui/src/lib/config.ts +11 -2
- package/src/admin/ui/src/lib/earn-vaults.ts +2 -2
- package/src/admin/ui/src/lib/organizations.test.ts +83 -50
- package/src/admin/ui/src/lib/organizations.ts +106 -25
- package/src/admin/ui/src/lib/query-client.ts +1 -1
- package/src/admin/ui/src/lib/reward-campaigns.ts +136 -0
- package/src/admin/ui/src/lib/routes.test.ts +88 -0
- package/src/admin/ui/src/lib/routes.ts +304 -0
- package/src/admin/ui/src/lib/subsidies.ts +75 -0
- package/src/admin/ui/src/lib/verified-tokens.ts +24 -9
- package/src/admin/ui/src/routeTree.gen.ts +63 -0
- package/src/admin/ui/src/routes/__root.tsx +13 -2
- package/src/admin/ui/src/routes/api-keys.tsx +196 -84
- package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +105 -70
- package/src/admin/ui/src/routes/organizations.tsx +34 -4
- package/src/admin/ui/src/routes/organizations_.$orgId.tsx +239 -23
- package/src/admin/ui/src/routes/routes.tsx +1615 -0
- package/src/admin/ui/src/routes/routes_.support.tsx +248 -0
- package/src/admin/ui/src/routes/subsidies.tsx +799 -0
- package/src/admin/ui/src/routes/verified-tokens.tsx +64 -20
- package/src/admin/ui.generated.ts +202 -188
- package/src/analytics/Analytics.test.ts +108 -18
- package/src/analytics/Analytics.ts +38 -6
- package/src/analytics/tables/requestEvents.test.ts +100 -0
- package/src/analytics/tables/requestEvents.ts +10 -1
- package/src/analytics/tables/routesLifecycleIntervals.ts +140 -0
- package/src/apps/Zones.test.ts +15 -0
- package/src/apps/Zones.ts +52 -5
- package/src/apps/composition.test.ts +68 -60
- package/src/apps/data/App.test.ts +180 -2
- package/src/apps/data/App.ts +88 -28
- package/src/apps/data/routes/activities.test.ts +419 -7
- package/src/apps/data/routes/activities.ts +683 -216
- package/src/apps/data/routes/balances.test.ts +2 -2
- package/src/apps/data/routes/blocks.test.ts +46 -1
- package/src/apps/data/routes/coingecko.test.ts +419 -1
- package/src/apps/data/routes/coingecko.ts +309 -253
- package/src/apps/data/routes/earn.discovery.test.ts +274 -0
- package/src/apps/data/routes/earn.test.ts +1294 -17
- package/src/apps/data/routes/earn.ts +1838 -321
- package/src/apps/data/routes/exchanges.test.ts +12 -15
- package/src/apps/data/routes/fee-amm.test.ts +243 -0
- package/src/apps/data/routes/fee-amm.ts +201 -162
- package/src/apps/data/routes/indexer.test.ts +389 -0
- package/src/apps/data/routes/indexer.ts +165 -69
- package/src/apps/data/routes/receipts.test.ts +1 -1
- package/src/apps/data/routes/rpc.test.ts +384 -8
- package/src/apps/data/routes/rpc.ts +452 -227
- package/src/apps/data/routes/rpc.zone.test.ts +340 -0
- package/src/apps/data/routes/tokenlist.test.ts +285 -0
- package/src/apps/data/routes/tokenlist.ts +173 -88
- package/src/apps/data/routes/tokens.test.ts +93 -3
- package/src/apps/data/routes/tokens.ts +39 -23
- package/src/apps/data/routes/transactions.test.ts +1 -1
- package/src/apps/data/routes/transfers.test.ts +56 -24
- package/src/apps/data/routes/transfers.ts +19 -8
- package/src/apps/data/routes/valuation.test.ts +1 -1
- package/src/apps/data/routes/verified-tokens.test.ts +345 -0
- package/src/apps/data/routes/verified-tokens.ts +99 -29
- package/src/apps/data/routes/webhooks.scan.test.ts +29 -0
- package/src/apps/data/routes/webhooks.test.ts +651 -83
- package/src/apps/data/routes/webhooks.ts +1113 -868
- package/src/apps/data/routes/zones.test.ts +148 -71
- package/src/apps/data/routes/zones.ts +71 -55
- package/src/apps/docs/reference.ts +2 -2
- package/src/apps/index.ts +1 -1
- package/src/apps/management/App.ts +9 -51
- package/src/apps/management/Billing.test.ts +375 -14
- package/src/apps/management/Billing.ts +265 -29
- package/src/apps/management/routes/api-keys.test.ts +269 -7
- package/src/apps/management/routes/api-keys.ts +61 -20
- package/src/apps/management/routes/billing.test.ts +477 -15
- package/src/apps/management/routes/billing.ts +377 -50
- package/src/apps/management/routes/faucet.test.ts +1 -1
- package/src/apps/management/routes/faucet.ts +1 -1
- package/src/apps/management/routes/invitations.test.ts +270 -3
- package/src/apps/management/routes/invitations.ts +185 -15
- package/src/apps/management/routes/invoicePreview.test.ts +549 -0
- package/src/apps/management/routes/me.test.ts +246 -5
- package/src/apps/management/routes/me.ts +7 -2
- package/src/apps/management/routes/members.test.ts +108 -0
- package/src/apps/management/routes/orgs.test.ts +191 -3
- package/src/apps/management/routes/orgs.ts +58 -11
- package/src/apps/management/routes/projects.test.ts +33 -3
- package/src/apps/management/routes/projects.ts +6 -1
- package/src/apps/management/routes/scopes.test.ts +30 -2
- package/src/apps/management/routes/scopes.ts +4 -1
- package/src/apps/management/routes/usage.test.ts +32 -0
- package/src/apps/management/routes/usage.ts +22 -4
- package/src/apps/management/routes/verified-token-requests.test.ts +16 -2
- package/src/apps/management/routes/verified-token-requests.ts +7 -10
- package/src/apps/management/routes/webhooks.test.ts +49 -26
- package/src/apps/management/routes/webhooks.ts +78 -22
- package/src/apps/mcp.test.ts +113 -30
- package/src/apps/mcp.ts +22 -10
- package/src/apps/mpp/App.ts +37 -7
- package/src/apps/mpp/Mpp.test.ts +49 -8
- package/src/apps/mpp/Mpp.zone.test.ts +219 -0
- package/src/apps/mpp/internal/Adapter.ts +34 -0
- package/src/apps/mpp/internal/Policy.test.ts +86 -31
- package/src/apps/mpp/internal/Policy.ts +49 -7
- package/src/apps/mpp/internal/Sponsorship.test.ts +207 -0
- package/src/apps/mpp/internal/Sponsorship.ts +9 -3
- package/src/apps/relay/App.test.ts +839 -64
- package/src/apps/relay/App.ts +148 -81
- package/src/apps/relay/App.zone-billing.test.ts +257 -0
- package/src/apps/relay/Sponsorships.test.ts +67 -4
- package/src/apps/relay/Sponsorships.ts +233 -32
- package/src/apps/relay/Sponsorships.zone.test.ts +102 -0
- package/src/apps/{funding → routes}/Access.ts +6 -6
- package/src/apps/routes/App.test.ts +165 -0
- package/src/apps/routes/App.ts +96 -0
- package/src/apps/{funding → routes}/Inventory.ts +2 -2
- package/src/apps/routes/index.ts +1 -0
- package/src/apps/{funding → routes}/routes/chains.test.ts +66 -66
- package/src/apps/{funding → routes}/routes/chains.ts +23 -23
- package/src/apps/{funding → routes}/routes/deposit-addresses.test.ts +1358 -458
- package/src/apps/{funding → routes}/routes/deposit-addresses.ts +566 -246
- package/src/apps/{funding → routes}/routes/providers.test.ts +27 -33
- package/src/apps/{funding → routes}/routes/providers.ts +23 -23
- package/src/apps/{funding → routes}/routes/quotes.test.ts +298 -41
- package/src/apps/{funding → routes}/routes/quotes.ts +57 -40
- package/src/apps/{funding → routes}/routes/transfers.test.ts +1100 -353
- package/src/apps/routes/routes/transfers.ts +1332 -0
- package/src/cli/Cli.test.ts +1 -1
- package/src/cli/commands/admin.test.ts +748 -1
- package/src/cli/commands/admin.ts +278 -0
- package/src/cloudflare.ts +52 -47
- package/src/db/Db.test.ts +245 -2
- package/src/db/Db.ts +1485 -34
- package/src/db/Schema.ts +729 -228
- package/src/db/tables/apiKeyAdmissionBootstraps.ts +4 -0
- package/src/db/tables/apiKeyAdmissions.ts +218 -0
- package/src/db/tables/apiKeyOwnerAdmissions.ts +4 -0
- package/src/db/tables/apiKeyOwnerTombstones.ts +81 -0
- package/src/db/tables/apiKeyRevocations.test.ts +74 -0
- package/src/db/tables/apiKeyRevocations.ts +121 -0
- package/src/db/tables/authAccounts.ts +105 -0
- package/src/db/tables/authSessions.ts +13 -0
- package/src/db/tables/authVerifications.ts +13 -0
- package/src/db/tables/invitations.ts +142 -45
- package/src/db/tables/memberships.ts +79 -3
- package/src/db/tables/organizations.test.ts +690 -13
- package/src/db/tables/organizations.ts +139 -55
- package/src/db/tables/projects.test.ts +16 -0
- package/src/db/tables/projects.ts +13 -3
- package/src/db/tables/requestUsage.ts +4 -1
- package/src/db/tables/rewardAccounts.ts +178 -0
- package/src/db/tables/rewardCampaignDistributors.ts +68 -0
- package/src/db/tables/rewardCampaigns.test.ts +1388 -0
- package/src/db/tables/rewardCampaigns.ts +647 -0
- package/src/db/tables/rewardCredits.ts +110 -0
- package/src/db/tables/rewardEligibilityAssociations.test.ts +271 -0
- package/src/db/tables/rewardEligibilityAssociations.ts +184 -0
- package/src/db/tables/rewardRuns.ts +514 -0
- package/src/db/tables/rewardTransactionAttempts.ts +272 -0
- package/src/db/tables/routesCatalog.test.ts +185 -0
- package/src/db/tables/routesCatalog.ts +163 -0
- package/src/db/tables/routesDepositAddresses.test.ts +1048 -0
- package/src/db/tables/routesDepositAddresses.ts +1008 -0
- package/src/db/tables/{fundingDepositRequestObservations.test.ts → routesDepositRequestObservations.test.ts} +13 -14
- package/src/db/tables/{fundingDepositRequestObservations.ts → routesDepositRequestObservations.ts} +10 -10
- package/src/db/tables/{fundingDeposits.test.ts → routesDeposits.test.ts} +388 -46
- package/src/db/tables/routesDeposits.ts +1062 -0
- package/src/db/tables/routesIdempotency.test.ts +796 -0
- package/src/db/tables/routesIdempotency.ts +496 -0
- package/src/db/tables/routesSubsidies.test.ts +120 -0
- package/src/db/tables/routesSubsidies.ts +71 -0
- package/src/db/tables/{fundingTransferEvents.ts → routesTransferEvents.ts} +4 -4
- package/src/db/tables/routesTransferSubsidies.ts +38 -0
- package/src/db/tables/routesTransferSubsidyNonces.ts +124 -0
- package/src/db/tables/routesTransferTransactions.test.ts +195 -0
- package/src/db/tables/{fundingTransferTransactions.ts → routesTransferTransactions.ts} +63 -18
- package/src/db/tables/routesTransfers.test.ts +338 -0
- package/src/db/tables/routesTransfers.ts +662 -0
- package/src/db/tables/sponsoredTransactions.test.ts +269 -45
- package/src/db/tables/sponsoredTransactions.ts +225 -65
- package/src/db/tables/sponsorshipAttributions.test.ts +160 -0
- package/src/db/tables/sponsorshipAttributions.ts +168 -0
- package/src/db/tables/sponsorshipReconciliationCursors.test.ts +115 -0
- package/src/db/tables/sponsorshipReconciliationCursors.ts +67 -0
- package/src/db/tables/stripeCustomers.test.ts +85 -0
- package/src/db/tables/stripeCustomers.ts +24 -0
- package/src/db/tables/users.test.ts +129 -0
- package/src/db/tables/users.ts +49 -3
- package/src/db/tables/verifiedTokenRequests.test.ts +39 -20
- package/src/db/tables/verifiedTokenRequests.ts +80 -44
- package/src/db/tables/webhookQueueEvents.ts +8 -1
- package/src/db/tables/webhookSubscriptions.ts +95 -20
- package/src/handlers/internal/executionError.ts +3 -4
- package/src/handlers/internal/multisig.ts +13 -816
- package/src/handlers/internal/sponsorship.ts +26 -10
- package/src/handlers/relay.test-d.ts +9 -1
- package/src/handlers/relay.test.ts +823 -3
- package/src/handlers/relay.ts +127 -107
- package/src/index.test-d.ts +7 -0
- package/src/index.ts +0 -17
- package/src/internal/AssetResponse.ts +26 -0
- package/src/internal/Auth.test.ts +1656 -9
- package/src/internal/Auth.ts +880 -244
- package/src/internal/BetterAuth.test.ts +242 -0
- package/src/internal/BetterAuth.ts +349 -0
- package/src/internal/Cache.ts +2 -0
- package/src/internal/EarnRates.test.ts +17 -0
- package/src/internal/EarnRates.ts +124 -31
- package/src/internal/EarnSharePrices.test.ts +182 -0
- package/src/internal/EarnSharePrices.ts +313 -0
- package/src/internal/EarnVaults.test.ts +21 -0
- package/src/internal/EarnVaults.ts +33 -11
- package/src/internal/Email.ts +54 -0
- package/src/internal/Idempotency.test.ts +2 -2
- package/src/internal/Log.test-d.ts +8 -7
- package/src/internal/Log.test.ts +114 -16
- package/src/internal/Log.ts +53 -40
- package/src/internal/MetricSink.test.ts +313 -26
- package/src/internal/MetricSink.ts +73 -8
- package/src/internal/Mpp.test.ts +31 -0
- package/src/internal/Mpp.ts +21 -24
- package/src/internal/OpenApi.ts +45 -12
- package/src/internal/Provider.test.ts +1 -1
- package/src/internal/Provider.ts +1 -1
- package/src/internal/RateLimit.test.ts +21 -3
- package/src/internal/RateLimit.ts +12 -1
- package/src/internal/Store.test-d.ts +1 -1
- package/src/internal/Store.test.ts +151 -8
- package/src/internal/Store.ts +76 -9
- package/src/internal/Tidx.test.ts +59 -8
- package/src/internal/Tidx.ts +86 -14
- package/src/internal/Timing.test.ts +77 -0
- package/src/internal/Timing.ts +83 -6
- package/src/internal/VercelOidc.test.ts +188 -0
- package/src/internal/VercelOidc.ts +193 -0
- package/src/internal/VerifiedTokens.test.ts +60 -6
- package/src/internal/VerifiedTokens.ts +21 -24
- package/src/internal/Viem.batch.test.ts +80 -0
- package/src/internal/Viem.test.ts +201 -2
- package/src/internal/Viem.ts +221 -25
- package/src/internal/Webhooks.test.ts +85 -6
- package/src/internal/Webhooks.ts +22 -4
- package/src/internal/ZoneRpc.ts +50 -0
- package/src/internal/exchange/Provider.test.ts +2 -2
- package/src/internal/index.test.ts +3 -1
- package/src/internal/index.ts +3 -1
- package/src/internal/rewards/Audit.ts +231 -0
- package/src/internal/rewards/Campaigns.test.ts +1234 -0
- package/src/internal/rewards/Campaigns.ts +1205 -0
- package/src/internal/rewards/Credits.ts +165 -0
- package/src/internal/rewards/Events.local.test.ts +113 -0
- package/src/internal/rewards/Events.test.ts +152 -0
- package/src/internal/rewards/Events.ts +468 -0
- package/src/internal/rewards/Projection.test.ts +681 -0
- package/src/internal/rewards/Projection.ts +987 -0
- package/src/internal/rewards/Rates.test.ts +171 -0
- package/src/internal/rewards/Rates.ts +110 -0
- package/src/internal/rewards/Read.test.ts +501 -0
- package/src/internal/rewards/Read.ts +476 -0
- package/src/internal/rewards/Runner.checkpoint.test.ts +80 -0
- package/src/internal/rewards/Runner.states.test.ts +188 -0
- package/src/internal/rewards/Runner.test.ts +90 -0
- package/src/internal/rewards/Runner.ts +2229 -0
- package/src/internal/rewards/Signer.test.ts +79 -0
- package/src/internal/rewards/Signer.ts +180 -0
- package/src/internal/rewards/index.ts +14 -0
- package/src/internal/{funding → routes}/Action.test.ts +63 -14
- package/src/internal/{funding → routes}/Action.ts +35 -8
- package/src/internal/{funding → routes}/Catalog.test.ts +3 -3
- package/src/internal/{funding → routes}/Catalog.ts +39 -39
- package/src/internal/{funding → routes}/Chain.test.ts +1 -1
- package/src/internal/{funding → routes}/Chain.ts +11 -11
- package/src/internal/{funding → routes}/Deposit.test.ts +1 -1
- package/src/internal/{funding → routes}/Deposit.ts +93 -45
- package/src/internal/{funding → routes}/DepositAddress.test.ts +11 -3
- package/src/internal/{funding → routes}/DepositAddress.ts +132 -53
- package/src/internal/{funding → routes}/DepositWebhook.test.ts +61 -18
- package/src/internal/{funding → routes}/DepositWebhook.ts +9 -9
- package/src/internal/routes/Economics.test.ts +42 -0
- package/src/internal/routes/Economics.ts +47 -0
- package/src/internal/{funding → routes}/Evidence.test.ts +6 -6
- package/src/internal/{funding → routes}/Evidence.ts +9 -9
- package/src/internal/routes/Observability.test.ts +636 -0
- package/src/internal/routes/Observability.ts +668 -0
- package/src/internal/{funding → routes}/Provider.test.ts +489 -153
- package/src/internal/{funding → routes}/Provider.ts +489 -186
- package/src/internal/{funding → routes}/Reconciliation.local.test.ts +84 -12
- package/src/internal/{funding → routes}/Reconciliation.test.ts +1213 -279
- package/src/internal/{funding → routes}/Reconciliation.ts +501 -203
- package/src/internal/routes/Reconciliation.unattributed.test.ts +250 -0
- package/src/internal/{funding → routes}/Route.ts +7 -7
- package/src/internal/{funding → routes}/SourceObservation.test.ts +13 -14
- package/src/internal/{funding → routes}/SourceObservation.ts +13 -13
- package/src/internal/{funding → routes}/Subsidy.local.test.ts +7 -7
- package/src/internal/routes/Subsidy.test.ts +169 -0
- package/src/internal/{funding → routes}/Subsidy.ts +86 -6
- package/src/internal/{funding → routes}/Token.test.ts +1 -1
- package/src/internal/{funding → routes}/Token.ts +5 -5
- package/src/internal/routes/Transfer.test.ts +1199 -0
- package/src/internal/routes/Transfer.ts +1206 -0
- package/src/internal/routes/TransferReconciliation.test.ts +731 -0
- package/src/internal/routes/TransferReconciliation.ts +527 -0
- package/src/internal/routes/TransferSubsidy.test.ts +172 -0
- package/src/internal/routes/TransferSubsidy.ts +447 -0
- package/src/internal/{funding → routes}/TransferWebhook.test.ts +13 -13
- package/src/internal/{funding → routes}/TransferWebhook.ts +7 -7
- package/src/internal/{funding → routes}/index.test.ts +5 -3
- package/src/internal/{funding → routes}/index.ts +2 -0
- package/src/internal/{funding → routes}/providers/across.ts +16 -16
- package/src/internal/{funding → routes}/providers/index.test.ts +157 -44
- package/src/internal/{funding → routes}/providers/relay.test.ts +224 -32
- package/src/internal/{funding → routes}/providers/relay.ts +228 -121
- package/src/internal/{funding → routes}/providers/rhino.ts +16 -16
- package/src/internal/{funding → routes}/providers/squid.ts +17 -17
- package/src/internal/routes/providers/stargate.test.ts +728 -0
- package/src/internal/routes/providers/stargate.ts +1276 -0
- package/src/internal/{funding → routes}/providers/symbiosis.ts +64 -24
- package/src/internal/webhookDestinations/slack.ts +10 -10
- package/src/providers/index.ts +13 -13
- package/src/server.ts +18 -0
- package/dist/apps/funding/Access.d.ts.map +0 -1
- package/dist/apps/funding/Access.js.map +0 -1
- package/dist/apps/funding/App.js.map +0 -1
- package/dist/apps/funding/Inventory.d.ts.map +0 -1
- package/dist/apps/funding/Inventory.js.map +0 -1
- package/dist/apps/funding/ProviderAttempts.d.ts +0 -5
- package/dist/apps/funding/ProviderAttempts.d.ts.map +0 -1
- package/dist/apps/funding/ProviderAttempts.js +0 -24
- package/dist/apps/funding/ProviderAttempts.js.map +0 -1
- package/dist/apps/funding/index.d.ts +0 -2
- package/dist/apps/funding/index.d.ts.map +0 -1
- package/dist/apps/funding/index.js +0 -2
- package/dist/apps/funding/index.js.map +0 -1
- package/dist/apps/funding/routes/chains.d.ts.map +0 -1
- package/dist/apps/funding/routes/chains.js.map +0 -1
- package/dist/apps/funding/routes/deposit-addresses.d.ts.map +0 -1
- package/dist/apps/funding/routes/deposit-addresses.js.map +0 -1
- package/dist/apps/funding/routes/providers.d.ts.map +0 -1
- package/dist/apps/funding/routes/providers.js +0 -57
- package/dist/apps/funding/routes/providers.js.map +0 -1
- package/dist/apps/funding/routes/quotes.d.ts.map +0 -1
- package/dist/apps/funding/routes/quotes.js.map +0 -1
- package/dist/apps/funding/routes/transfers.d.ts.map +0 -1
- package/dist/apps/funding/routes/transfers.js +0 -828
- package/dist/apps/funding/routes/transfers.js.map +0 -1
- package/dist/db/tables/fundingCatalog.d.ts +0 -58
- package/dist/db/tables/fundingCatalog.d.ts.map +0 -1
- package/dist/db/tables/fundingCatalog.js.map +0 -1
- package/dist/db/tables/fundingDepositAddresses.d.ts +0 -192
- package/dist/db/tables/fundingDepositAddresses.d.ts.map +0 -1
- package/dist/db/tables/fundingDepositAddresses.js +0 -235
- package/dist/db/tables/fundingDepositAddresses.js.map +0 -1
- package/dist/db/tables/fundingDepositRequestObservations.d.ts.map +0 -1
- package/dist/db/tables/fundingDepositRequestObservations.js.map +0 -1
- package/dist/db/tables/fundingDeposits.d.ts.map +0 -1
- package/dist/db/tables/fundingDeposits.js +0 -295
- package/dist/db/tables/fundingDeposits.js.map +0 -1
- package/dist/db/tables/fundingIdempotency.d.ts +0 -91
- package/dist/db/tables/fundingIdempotency.d.ts.map +0 -1
- package/dist/db/tables/fundingIdempotency.js +0 -103
- package/dist/db/tables/fundingIdempotency.js.map +0 -1
- package/dist/db/tables/fundingTransferEvents.d.ts.map +0 -1
- package/dist/db/tables/fundingTransferEvents.js.map +0 -1
- package/dist/db/tables/fundingTransferTransactions.d.ts +0 -53
- package/dist/db/tables/fundingTransferTransactions.d.ts.map +0 -1
- package/dist/db/tables/fundingTransferTransactions.js.map +0 -1
- package/dist/db/tables/fundingTransfers.d.ts +0 -99
- package/dist/db/tables/fundingTransfers.d.ts.map +0 -1
- package/dist/db/tables/fundingTransfers.js +0 -110
- package/dist/db/tables/fundingTransfers.js.map +0 -1
- package/dist/internal/funding/Action.d.ts.map +0 -1
- package/dist/internal/funding/Action.js.map +0 -1
- package/dist/internal/funding/Catalog.d.ts.map +0 -1
- package/dist/internal/funding/Catalog.js.map +0 -1
- package/dist/internal/funding/Chain.d.ts.map +0 -1
- package/dist/internal/funding/Chain.js.map +0 -1
- package/dist/internal/funding/Deposit.d.ts.map +0 -1
- package/dist/internal/funding/Deposit.js.map +0 -1
- package/dist/internal/funding/DepositAddress.d.ts.map +0 -1
- package/dist/internal/funding/DepositAddress.js.map +0 -1
- package/dist/internal/funding/DepositWebhook.d.ts.map +0 -1
- package/dist/internal/funding/DepositWebhook.js.map +0 -1
- package/dist/internal/funding/Evidence.d.ts.map +0 -1
- package/dist/internal/funding/Evidence.js.map +0 -1
- package/dist/internal/funding/Provider.d.ts.map +0 -1
- package/dist/internal/funding/Provider.js.map +0 -1
- package/dist/internal/funding/Reconciliation.d.ts.map +0 -1
- package/dist/internal/funding/Reconciliation.js.map +0 -1
- package/dist/internal/funding/Route.d.ts +0 -21
- package/dist/internal/funding/Route.d.ts.map +0 -1
- package/dist/internal/funding/Route.js.map +0 -1
- package/dist/internal/funding/SourceObservation.d.ts.map +0 -1
- package/dist/internal/funding/SourceObservation.js.map +0 -1
- package/dist/internal/funding/Subsidy.d.ts.map +0 -1
- package/dist/internal/funding/Subsidy.js.map +0 -1
- package/dist/internal/funding/Token.d.ts.map +0 -1
- package/dist/internal/funding/Token.js.map +0 -1
- package/dist/internal/funding/Transfer.d.ts.map +0 -1
- package/dist/internal/funding/Transfer.js +0 -462
- package/dist/internal/funding/Transfer.js.map +0 -1
- package/dist/internal/funding/TransferReconciliation.d.ts.map +0 -1
- package/dist/internal/funding/TransferReconciliation.js +0 -192
- package/dist/internal/funding/TransferReconciliation.js.map +0 -1
- package/dist/internal/funding/TransferWebhook.d.ts.map +0 -1
- package/dist/internal/funding/TransferWebhook.js.map +0 -1
- package/dist/internal/funding/index.d.ts.map +0 -1
- package/dist/internal/funding/index.js.map +0 -1
- package/dist/internal/funding/providers/across.d.ts.map +0 -1
- package/dist/internal/funding/providers/across.js.map +0 -1
- package/dist/internal/funding/providers/relay.d.ts.map +0 -1
- package/dist/internal/funding/providers/relay.js.map +0 -1
- package/dist/internal/funding/providers/rhino.d.ts.map +0 -1
- package/dist/internal/funding/providers/rhino.js.map +0 -1
- package/dist/internal/funding/providers/squid.d.ts.map +0 -1
- package/dist/internal/funding/providers/squid.js.map +0 -1
- package/dist/internal/funding/providers/stargate.d.ts.map +0 -1
- package/dist/internal/funding/providers/stargate.js +0 -579
- package/dist/internal/funding/providers/stargate.js.map +0 -1
- package/dist/internal/funding/providers/symbiosis.d.ts.map +0 -1
- package/dist/internal/funding/providers/symbiosis.js.map +0 -1
- package/src/apps/funding/App.test.ts +0 -78
- package/src/apps/funding/App.ts +0 -88
- package/src/apps/funding/ProviderAttempts.ts +0 -26
- package/src/apps/funding/index.ts +0 -1
- package/src/apps/funding/routes/transfers.ts +0 -987
- package/src/db/tables/fundingCatalog.test.ts +0 -122
- package/src/db/tables/fundingCatalog.ts +0 -163
- package/src/db/tables/fundingDepositAddresses.test.ts +0 -608
- package/src/db/tables/fundingDepositAddresses.ts +0 -443
- package/src/db/tables/fundingDeposits.ts +0 -572
- package/src/db/tables/fundingIdempotency.test.ts +0 -182
- package/src/db/tables/fundingIdempotency.ts +0 -180
- package/src/db/tables/fundingTransferTransactions.test.ts +0 -112
- package/src/db/tables/fundingTransfers.test.ts +0 -115
- package/src/db/tables/fundingTransfers.ts +0 -189
- package/src/handlers/internal/multisig.test.ts +0 -818
- package/src/internal/funding/Subsidy.test.ts +0 -75
- package/src/internal/funding/Transfer.test.ts +0 -524
- package/src/internal/funding/Transfer.ts +0 -762
- package/src/internal/funding/TransferReconciliation.test.ts +0 -147
- package/src/internal/funding/TransferReconciliation.ts +0 -264
- package/src/internal/funding/providers/stargate.test.ts +0 -328
- package/src/internal/funding/providers/stargate.ts +0 -856
- /package/dist/apps/{funding → routes}/Inventory.d.ts +0 -0
- /package/src/internal/{funding → routes}/Route.test.ts +0 -0
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
// TODO(tidx-v1): Restore `queryOutbound` from commit `de87725` after TIDX v1 ships. Remove the receipt-side merge and bounded follow-up lookup.
|
|
2
|
-
|
|
3
1
|
import { Hono, type Context } from 'hono'
|
|
4
2
|
import { Address, Hex } from 'ox'
|
|
5
3
|
import { type Log, parseEventLogs, zeroAddress } from 'viem'
|
|
@@ -1500,6 +1498,16 @@ export namespace schema {
|
|
|
1500
1498
|
'ActivityItem',
|
|
1501
1499
|
)
|
|
1502
1500
|
|
|
1501
|
+
/** Public activity types accepted by the address feed's `type` filter. */
|
|
1502
|
+
export const ActivityType = z
|
|
1503
|
+
.enum(
|
|
1504
|
+
items.map((item) => item.shape.type.def.values[0]) as unknown as readonly [
|
|
1505
|
+
z.output<typeof Item>['type'],
|
|
1506
|
+
...z.output<typeof Item>['type'][],
|
|
1507
|
+
],
|
|
1508
|
+
)
|
|
1509
|
+
.check(z.describe('A classified activity type.'))
|
|
1510
|
+
|
|
1503
1511
|
/** A folded access-key group: consecutive same-signer items on one UTC day. */
|
|
1504
1512
|
export const Group = z
|
|
1505
1513
|
.object({
|
|
@@ -1568,6 +1576,25 @@ export namespace schema {
|
|
|
1568
1576
|
'Comma-separated activity options. `zones` combines the selected parent chain with every readable Zone.',
|
|
1569
1577
|
)
|
|
1570
1578
|
|
|
1579
|
+
/** Parses comma-separated activity types with OR semantics. */
|
|
1580
|
+
export const typeQuery = Schema.includeQuery(
|
|
1581
|
+
ActivityType,
|
|
1582
|
+
'Only include these activity types, such as `transfer,swap`. Multiple values use OR semantics.',
|
|
1583
|
+
)
|
|
1584
|
+
|
|
1585
|
+
const RawAmountBound = z
|
|
1586
|
+
.optional(Schema.DecimalString)
|
|
1587
|
+
.check(z.describe("A token quantity in the token's smallest unit."))
|
|
1588
|
+
|
|
1589
|
+
const ValuationAmountBound = z
|
|
1590
|
+
.optional(z.string().check(z.regex(/^\d+(\.\d{1,6})?$/)))
|
|
1591
|
+
.check(
|
|
1592
|
+
z.describe(
|
|
1593
|
+
'A non-negative decimal amount in `valuation.currency`, with up to six decimal places.',
|
|
1594
|
+
),
|
|
1595
|
+
z.meta({ examples: ['1'] }),
|
|
1596
|
+
)
|
|
1597
|
+
|
|
1571
1598
|
/** Schemas for the getAddressActivities operation. */
|
|
1572
1599
|
export namespace getAddressActivities {
|
|
1573
1600
|
/** Path parameters for address activity requests. */
|
|
@@ -1582,6 +1609,16 @@ export namespace schema {
|
|
|
1582
1609
|
/** Query parameters for address activity requests. */
|
|
1583
1610
|
export const Query = z
|
|
1584
1611
|
.strictObject({
|
|
1612
|
+
'amount.from': RawAmountBound.check(
|
|
1613
|
+
z.describe(
|
|
1614
|
+
'Only include activities with at least one token amount greater than or equal to this base-unit quantity.',
|
|
1615
|
+
),
|
|
1616
|
+
),
|
|
1617
|
+
'amount.to': RawAmountBound.check(
|
|
1618
|
+
z.describe(
|
|
1619
|
+
'Only include activities with at least one token amount less than or equal to this base-unit quantity.',
|
|
1620
|
+
),
|
|
1621
|
+
),
|
|
1585
1622
|
chainId: Schema.ChainIdQuery,
|
|
1586
1623
|
cursor: Schema.Cursor,
|
|
1587
1624
|
// Folding is opt-in: by default every item is returned at the root.
|
|
@@ -1605,9 +1642,65 @@ export namespace schema {
|
|
|
1605
1642
|
),
|
|
1606
1643
|
z.meta({ examples: [true] }),
|
|
1607
1644
|
),
|
|
1645
|
+
recipient: z
|
|
1646
|
+
.optional(Schema.Address)
|
|
1647
|
+
.check(z.describe('Only include activities sent to this recipient address.')),
|
|
1648
|
+
sender: z
|
|
1649
|
+
.optional(Schema.Address)
|
|
1650
|
+
.check(z.describe('Only include activities sent from this sender address.')),
|
|
1651
|
+
token: z
|
|
1652
|
+
.optional(Schema.TokenAddress)
|
|
1653
|
+
.check(
|
|
1654
|
+
z.describe(
|
|
1655
|
+
'Only include activities with a source, destination, or refund token for this TIP-20 contract.',
|
|
1656
|
+
),
|
|
1657
|
+
),
|
|
1658
|
+
type: typeQuery,
|
|
1659
|
+
'valuation.amount.from': ValuationAmountBound.check(
|
|
1660
|
+
z.describe(
|
|
1661
|
+
'Only include activities with at least one valued amount greater than or equal to this amount. Requires `valuation.currency`.',
|
|
1662
|
+
),
|
|
1663
|
+
),
|
|
1664
|
+
'valuation.amount.to': ValuationAmountBound.check(
|
|
1665
|
+
z.describe(
|
|
1666
|
+
'Only include activities with at least one valued amount less than or equal to this amount. Requires `valuation.currency`.',
|
|
1667
|
+
),
|
|
1668
|
+
),
|
|
1608
1669
|
'valuation.currency': Schema.Denomination,
|
|
1609
1670
|
})
|
|
1610
1671
|
.check(
|
|
1672
|
+
z.refine(
|
|
1673
|
+
(query) => {
|
|
1674
|
+
const from = parseRawAmount(query['amount.from'])
|
|
1675
|
+
const to = parseRawAmount(query['amount.to'])
|
|
1676
|
+
return from === undefined || to === undefined || from <= to
|
|
1677
|
+
},
|
|
1678
|
+
{
|
|
1679
|
+
error: '`amount.from` must be less than or equal to `amount.to`.',
|
|
1680
|
+
path: ['amount.from'],
|
|
1681
|
+
},
|
|
1682
|
+
),
|
|
1683
|
+
z.refine(
|
|
1684
|
+
(query) =>
|
|
1685
|
+
(query['valuation.amount.from'] === undefined &&
|
|
1686
|
+
query['valuation.amount.to'] === undefined) ||
|
|
1687
|
+
query['valuation.currency'] !== undefined,
|
|
1688
|
+
{
|
|
1689
|
+
error: '`valuation.currency` is required when filtering by valuation amount.',
|
|
1690
|
+
path: ['valuation.currency'],
|
|
1691
|
+
},
|
|
1692
|
+
),
|
|
1693
|
+
z.refine(
|
|
1694
|
+
(query) =>
|
|
1695
|
+
query['valuation.amount.from'] === undefined ||
|
|
1696
|
+
query['valuation.amount.to'] === undefined ||
|
|
1697
|
+
parseValuationAmount(query['valuation.amount.from']) <=
|
|
1698
|
+
parseValuationAmount(query['valuation.amount.to']),
|
|
1699
|
+
{
|
|
1700
|
+
error: '`valuation.amount.from` must be less than or equal to `valuation.amount.to`.',
|
|
1701
|
+
path: ['valuation.amount.from'],
|
|
1702
|
+
},
|
|
1703
|
+
),
|
|
1611
1704
|
z.describe(
|
|
1612
1705
|
'Query parameters for the address activity request. This feed uses cursor pagination only because activity classification can fold a variable number of rows into each entry, so positional `page` pagination would not be stable.',
|
|
1613
1706
|
),
|
|
@@ -1714,7 +1807,7 @@ type UnenrichedData<data> = {
|
|
|
1714
1807
|
}
|
|
1715
1808
|
|
|
1716
1809
|
/** A classified item whose token stubs have not been enriched with structured amounts. */
|
|
1717
|
-
type UnenrichedItem = {
|
|
1810
|
+
export type UnenrichedItem = {
|
|
1718
1811
|
[type in Item['type']]: Omit<Extract<Item, { type: type }>, 'data'> & {
|
|
1719
1812
|
data: UnenrichedData<Extract<Item, { type: type }>['data']>
|
|
1720
1813
|
}
|
|
@@ -1891,9 +1984,6 @@ const closeRequestedSelector = '0xf5a36fc00a96cbb9cf1f8f59299165e1d8ffffe94396d8
|
|
|
1891
1984
|
// access-key publicKey, i.e. the real signer.
|
|
1892
1985
|
const accessKeySpendSelector = '0xe0815e3aaadddf4dd75bde97fc060f0c38afe18e87a169be86a3f5c28247f192'
|
|
1893
1986
|
|
|
1894
|
-
/** TIP-20 / ERC-20 `Transfer` event signature for the decoded CTE. */
|
|
1895
|
-
const transferSignature = 'event Transfer(address indexed from, address indexed to, uint256 value)'
|
|
1896
|
-
|
|
1897
1987
|
// Standard ERC-4626 vault events, absent from the merged `viem/tempo` ABI.
|
|
1898
1988
|
// Decoding them lets external vault deposits/withdrawals classify instead of
|
|
1899
1989
|
// falling through to the share-token mint/burn legs.
|
|
@@ -1921,18 +2011,13 @@ const erc4626Events = [
|
|
|
1921
2011
|
},
|
|
1922
2012
|
] as const
|
|
1923
2013
|
|
|
1924
|
-
|
|
1925
|
-
// `Addresses`, so the known address is pinned here: channel events
|
|
1926
|
-
// (`ChannelOpened`/`Settled`/`TopUp`/`ChannelClosed`) are emitted here, and
|
|
1927
|
-
// their paired TIP-20 `Transfer` legs use it as the funding counterparty, which
|
|
1928
|
-
// is how `channel-funded`/`channel-settled`/`channel-closed` recover the token.
|
|
1929
|
-
const tip20ChannelReserve = '0x4d50500000000000000000000000000000000000' as Address.Address
|
|
2014
|
+
const tip20ChannelReserve = Addresses.tip20ChannelReserve
|
|
1930
2015
|
|
|
1931
2016
|
// Tempo system addresses other than the DEX are never swap-route
|
|
1932
2017
|
// counterparties; a newly shipped precompile joins the exclusion automatically.
|
|
1933
2018
|
const nonRouteSystemAddresses = new Set(
|
|
1934
|
-
|
|
1935
|
-
.filter((value) => value !== Addresses.stablecoinDex)
|
|
2019
|
+
Object.values(Addresses)
|
|
2020
|
+
.filter((value) => typeof value === 'string' && value !== Addresses.stablecoinDex)
|
|
1936
2021
|
.map((value) => value.toLowerCase()),
|
|
1937
2022
|
)
|
|
1938
2023
|
|
|
@@ -1942,6 +2027,8 @@ const minGroupEntries = 5
|
|
|
1942
2027
|
/** Largest number of items folded into a single access-key group. */
|
|
1943
2028
|
const maxGroupSize = 50
|
|
1944
2029
|
|
|
2030
|
+
const maxTokenAmount = 2n ** 256n - 1n
|
|
2031
|
+
|
|
1945
2032
|
/** Token-bearing keys on an item's `data` payload, walked for enrichment. */
|
|
1946
2033
|
const tokenKeys = ['destinationToken', 'refund', 'sourceToken'] as const
|
|
1947
2034
|
|
|
@@ -1951,6 +2038,111 @@ const amountKeyByTokenKey = {
|
|
|
1951
2038
|
sourceToken: 'sourceAmount',
|
|
1952
2039
|
} as const
|
|
1953
2040
|
|
|
2041
|
+
function parseRawAmount(value: string | undefined): bigint | undefined {
|
|
2042
|
+
return value !== undefined && /^\d+$/.test(value) ? BigInt(value) : undefined
|
|
2043
|
+
}
|
|
2044
|
+
|
|
2045
|
+
/** Converts a decimal valuation amount to the API's fixed six-decimal scale. */
|
|
2046
|
+
function parseValuationAmount(value: string): bigint {
|
|
2047
|
+
const [whole, fraction = ''] = value.split('.')
|
|
2048
|
+
return BigInt(whole!) * 1_000_000n + BigInt(fraction.padEnd(6, '0'))
|
|
2049
|
+
}
|
|
2050
|
+
|
|
2051
|
+
/** Inclusive token amount bounds in raw base units. */
|
|
2052
|
+
export type RawAmountBounds = {
|
|
2053
|
+
/** Smallest matching amount. */
|
|
2054
|
+
from?: bigint | undefined
|
|
2055
|
+
/** Largest matching amount. */
|
|
2056
|
+
to?: bigint | undefined
|
|
2057
|
+
}
|
|
2058
|
+
|
|
2059
|
+
/** Exact activity predicates evaluated against classified token movements. */
|
|
2060
|
+
export type ActivityFilter = {
|
|
2061
|
+
/** Inclusive raw base-unit range for one token leg. */
|
|
2062
|
+
amount?: RawAmountBounds | undefined
|
|
2063
|
+
/** Required recipient on the classified activity. */
|
|
2064
|
+
recipient?: Address.Address | undefined
|
|
2065
|
+
/** Required sender on the classified activity. */
|
|
2066
|
+
sender?: Address.Address | undefined
|
|
2067
|
+
/** Required source, destination, or refund token on the same leg as the amount range. */
|
|
2068
|
+
token?: Address.Address | undefined
|
|
2069
|
+
}
|
|
2070
|
+
|
|
2071
|
+
/** Returns whether an activity satisfies its participant and same-leg token predicates. */
|
|
2072
|
+
function matchesActivityFilter(item: UnenrichedItem, filter: ActivityFilter): boolean {
|
|
2073
|
+
const data = item.data as Record<string, unknown> &
|
|
2074
|
+
Partial<Record<(typeof tokenKeys)[number], UnenrichedToken>>
|
|
2075
|
+
const recipient = data['recipient']
|
|
2076
|
+
if (
|
|
2077
|
+
filter.recipient !== undefined &&
|
|
2078
|
+
(typeof recipient !== 'string' ||
|
|
2079
|
+
!Address.isEqual(recipient as Address.Address, filter.recipient))
|
|
2080
|
+
)
|
|
2081
|
+
return false
|
|
2082
|
+
const sender = data['sender']
|
|
2083
|
+
if (
|
|
2084
|
+
filter.sender !== undefined &&
|
|
2085
|
+
(typeof sender !== 'string' || !Address.isEqual(sender as Address.Address, filter.sender))
|
|
2086
|
+
)
|
|
2087
|
+
return false
|
|
2088
|
+
|
|
2089
|
+
const amount = filter.amount
|
|
2090
|
+
if (amount === undefined && filter.token === undefined) return true
|
|
2091
|
+
for (const key of tokenKeys) {
|
|
2092
|
+
const token = data[key]
|
|
2093
|
+
if (!token) continue
|
|
2094
|
+
if (filter.token !== undefined && !Address.isEqual(token.address, filter.token)) continue
|
|
2095
|
+
const value = BigInt(token.amount)
|
|
2096
|
+
if (amount?.from !== undefined && value < amount.from) continue
|
|
2097
|
+
if (amount?.to !== undefined && value > amount.to) continue
|
|
2098
|
+
return true
|
|
2099
|
+
}
|
|
2100
|
+
return false
|
|
2101
|
+
}
|
|
2102
|
+
|
|
2103
|
+
/** Applies exact participant and same-leg token predicates after classification. */
|
|
2104
|
+
export function filterActivities<item extends UnenrichedItem>(
|
|
2105
|
+
options: filterActivities.Options<item>,
|
|
2106
|
+
): item[] {
|
|
2107
|
+
const { filter, items } = options
|
|
2108
|
+
return items.filter((item) => matchesActivityFilter(item, filter))
|
|
2109
|
+
}
|
|
2110
|
+
|
|
2111
|
+
export declare namespace filterActivities {
|
|
2112
|
+
/** Inputs for exact classified activity refinement. */
|
|
2113
|
+
type Options<item extends UnenrichedItem> = {
|
|
2114
|
+
/** Exact participant and token-leg predicates. */
|
|
2115
|
+
filter: ActivityFilter
|
|
2116
|
+
/** Classified activity items to refine. */
|
|
2117
|
+
items: readonly item[]
|
|
2118
|
+
}
|
|
2119
|
+
}
|
|
2120
|
+
|
|
2121
|
+
/** Returns whether any valued token leg in an activity falls within the requested range. */
|
|
2122
|
+
function matchesValuationAmount(item: Item, bounds: matchesValuationAmount.Bounds): boolean {
|
|
2123
|
+
if (bounds.from === undefined && bounds.to === undefined) return true
|
|
2124
|
+
const data = item.data as Record<string, unknown>
|
|
2125
|
+
for (const key of Object.values(amountKeyByTokenKey)) {
|
|
2126
|
+
const amount = data[key]
|
|
2127
|
+
if (!amount || typeof amount !== 'object' || !('valuation' in amount)) continue
|
|
2128
|
+
const valuation = amount.valuation
|
|
2129
|
+
if (!valuation || typeof valuation !== 'object' || !('amount' in valuation)) continue
|
|
2130
|
+
if (typeof valuation.amount !== 'string') continue
|
|
2131
|
+
const value = parseValuationAmount(valuation.amount)
|
|
2132
|
+
if (bounds.from !== undefined && value < bounds.from) continue
|
|
2133
|
+
if (bounds.to !== undefined && value > bounds.to) continue
|
|
2134
|
+
return true
|
|
2135
|
+
}
|
|
2136
|
+
return false
|
|
2137
|
+
}
|
|
2138
|
+
|
|
2139
|
+
declare namespace matchesValuationAmount {
|
|
2140
|
+
type Bounds = {
|
|
2141
|
+
from?: bigint | undefined
|
|
2142
|
+
to?: bigint | undefined
|
|
2143
|
+
}
|
|
2144
|
+
}
|
|
2145
|
+
|
|
1954
2146
|
/** The base fields ({@link schema.base}) every activity item carries. */
|
|
1955
2147
|
type Base = {
|
|
1956
2148
|
id: string
|
|
@@ -2011,10 +2203,23 @@ export type Provider = {
|
|
|
2011
2203
|
fetchRows(options: {
|
|
2012
2204
|
address: Address.Address
|
|
2013
2205
|
cursor?: string | undefined
|
|
2206
|
+
/** Sound indexed predicates that may reduce the candidate set before classification. */
|
|
2207
|
+
filter?: CandidateFilter | undefined
|
|
2014
2208
|
limit: number
|
|
2015
2209
|
}): Promise<{ rows: Row[] }>
|
|
2016
2210
|
}
|
|
2017
2211
|
|
|
2212
|
+
/** A reusable two-stage filter: sound indexed candidate narrowing plus exact classified refinement. */
|
|
2213
|
+
type QueryFilter<item extends UnenrichedItem = UnenrichedItem> = {
|
|
2214
|
+
/** Predicates the provider can apply without excluding a possible classified match. */
|
|
2215
|
+
candidate?: CandidateFilter | undefined
|
|
2216
|
+
/** Exact API semantics evaluated after transaction-level classification. */
|
|
2217
|
+
refine?: ((items: readonly item[]) => Promise<item[]> | item[]) | undefined
|
|
2218
|
+
}
|
|
2219
|
+
|
|
2220
|
+
/** Sound predicates an activity provider can apply before classification. */
|
|
2221
|
+
export type CandidateFilter = ActivityFilter
|
|
2222
|
+
|
|
2018
2223
|
/** Internal group of rows that share a transaction hash. */
|
|
2019
2224
|
type TxGroup = {
|
|
2020
2225
|
blockNum: number
|
|
@@ -2105,20 +2310,77 @@ export function addresses(options: addresses.Options = {}) {
|
|
|
2105
2310
|
|
|
2106
2311
|
try {
|
|
2107
2312
|
const chainId = query.chainId ?? c.get('chainId')
|
|
2313
|
+
const amountBounds = {
|
|
2314
|
+
from: parseRawAmount(query['amount.from']),
|
|
2315
|
+
to: parseRawAmount(query['amount.to']),
|
|
2316
|
+
}
|
|
2317
|
+
const valuationBounds = {
|
|
2318
|
+
from:
|
|
2319
|
+
query['valuation.amount.from'] === undefined
|
|
2320
|
+
? undefined
|
|
2321
|
+
: parseValuationAmount(query['valuation.amount.from']),
|
|
2322
|
+
to:
|
|
2323
|
+
query['valuation.amount.to'] === undefined
|
|
2324
|
+
? undefined
|
|
2325
|
+
: parseValuationAmount(query['valuation.amount.to']),
|
|
2326
|
+
}
|
|
2327
|
+
const filterByValuation =
|
|
2328
|
+
valuationBounds.from !== undefined || valuationBounds.to !== undefined
|
|
2329
|
+
const activityFilter = {
|
|
2330
|
+
...(amountBounds.from !== undefined || amountBounds.to !== undefined
|
|
2331
|
+
? { amount: amountBounds }
|
|
2332
|
+
: {}),
|
|
2333
|
+
...(query.recipient ? { recipient: query.recipient } : {}),
|
|
2334
|
+
...(query.sender ? { sender: query.sender } : {}),
|
|
2335
|
+
...(query.token ? { token: query.token } : {}),
|
|
2336
|
+
}
|
|
2337
|
+
const candidate = Object.keys(activityFilter).length > 0 ? activityFilter : undefined
|
|
2338
|
+
const types = new Set(query.type)
|
|
2339
|
+
const refine = types.size > 0 || candidate ? <item extends UnenrichedItem>(items: readonly item[]) => filterActivities({ filter: activityFilter, items: items.filter((item) => types.size === 0 || types.has(item.type)) }) : undefined // prettier-ignore
|
|
2108
2340
|
const listed = await Timing.time(c, 'address_activities', async () => {
|
|
2109
2341
|
if (!query.include.includes('zones')) {
|
|
2110
2342
|
const result = await Store.memoize(
|
|
2111
2343
|
(signal) =>
|
|
2112
|
-
list(
|
|
2113
|
-
|
|
2114
|
-
|
|
2115
|
-
|
|
2116
|
-
|
|
2117
|
-
|
|
2118
|
-
|
|
2119
|
-
|
|
2344
|
+
list(
|
|
2345
|
+
tidx({
|
|
2346
|
+
chainId,
|
|
2347
|
+
signal,
|
|
2348
|
+
tidx: c.get('getTidx')(chainId),
|
|
2349
|
+
time: (name, fn) => Timing.sum(c, name, fn),
|
|
2350
|
+
}),
|
|
2351
|
+
{
|
|
2352
|
+
address: address as Hex.Hex,
|
|
2353
|
+
cursor: query.cursor,
|
|
2354
|
+
...(refine || filterByValuation || candidate
|
|
2355
|
+
? {
|
|
2356
|
+
filter: {
|
|
2357
|
+
candidate,
|
|
2358
|
+
refine: async (items: readonly UnenrichedItem[]) => {
|
|
2359
|
+
const filtered = refine ? refine(items) : [...items]
|
|
2360
|
+
if (!filterByValuation) return filtered
|
|
2361
|
+
const enriched = await enrichTokens(c, {
|
|
2362
|
+
chainId,
|
|
2363
|
+
denomination: query['valuation.currency'],
|
|
2364
|
+
include: query.include,
|
|
2365
|
+
items: filtered,
|
|
2366
|
+
oracle,
|
|
2367
|
+
})
|
|
2368
|
+
return filtered.filter((_, index) =>
|
|
2369
|
+
matchesValuationAmount(enriched.items[index]!, valuationBounds),
|
|
2370
|
+
)
|
|
2371
|
+
},
|
|
2372
|
+
},
|
|
2373
|
+
}
|
|
2374
|
+
: {}),
|
|
2375
|
+
group: query.group,
|
|
2376
|
+
limit: query.limit,
|
|
2377
|
+
logs: query.logs,
|
|
2378
|
+
store: c.get('store'),
|
|
2379
|
+
time: (name, fn) => Timing.sum(c, name, fn),
|
|
2380
|
+
},
|
|
2381
|
+
),
|
|
2120
2382
|
{
|
|
2121
|
-
key: `activities:
|
|
2383
|
+
key: `activities:v4:${chainId}:${address.toLowerCase()}:${query.type.join(',')}:${query['amount.from'] ?? ''}:${query['amount.to'] ?? ''}:${query.recipient ?? ''}:${query.sender ?? ''}:${query.token ?? ''}:${query['valuation.amount.from'] ?? ''}:${query['valuation.amount.to'] ?? ''}:${query['valuation.currency'] ?? ''}:${query.group ?? false}:${query.logs ?? false}:${query.cursor ?? 'head'}:${query.limit}`,
|
|
2122
2384
|
store: c.get('store'),
|
|
2123
2385
|
ttl: Ttl.seconds(15),
|
|
2124
2386
|
},
|
|
@@ -2134,6 +2396,26 @@ export function addresses(options: addresses.Options = {}) {
|
|
|
2134
2396
|
listChains({
|
|
2135
2397
|
address: address as Hex.Hex,
|
|
2136
2398
|
cursor: query.cursor,
|
|
2399
|
+
...(refine || filterByValuation || candidate
|
|
2400
|
+
? {
|
|
2401
|
+
filter: {
|
|
2402
|
+
candidate,
|
|
2403
|
+
refine: async (items: readonly listChains.Item[]) => {
|
|
2404
|
+
const filtered = refine ? refine(items) : [...items]
|
|
2405
|
+
if (!filterByValuation) return filtered
|
|
2406
|
+
const enriched = await enrichChainTokens(c, {
|
|
2407
|
+
denomination: query['valuation.currency'],
|
|
2408
|
+
include: query.include,
|
|
2409
|
+
items: filtered,
|
|
2410
|
+
oracle,
|
|
2411
|
+
})
|
|
2412
|
+
return filtered.filter((_, index) =>
|
|
2413
|
+
matchesValuationAmount(enriched.items[index]!, valuationBounds),
|
|
2414
|
+
)
|
|
2415
|
+
},
|
|
2416
|
+
},
|
|
2417
|
+
}
|
|
2418
|
+
: {}),
|
|
2137
2419
|
group: query.group,
|
|
2138
2420
|
limit: query.limit,
|
|
2139
2421
|
logs: query.logs,
|
|
@@ -2143,12 +2425,14 @@ export function addresses(options: addresses.Options = {}) {
|
|
|
2143
2425
|
chainId,
|
|
2144
2426
|
signal,
|
|
2145
2427
|
tidx: c.get('getTidx')(chainId),
|
|
2428
|
+
time: (name, fn) => Timing.sum(c, name, fn),
|
|
2146
2429
|
}),
|
|
2147
2430
|
})),
|
|
2148
2431
|
store: c.get('store'),
|
|
2432
|
+
time: (name, fn) => Timing.sum(c, name, fn),
|
|
2149
2433
|
}),
|
|
2150
2434
|
{
|
|
2151
|
-
key: `activities:zones:
|
|
2435
|
+
key: `activities:zones:v5:${chainIds.join(',')}:${address.toLowerCase()}:${query.type.join(',')}:${query['amount.from'] ?? ''}:${query['amount.to'] ?? ''}:${query.recipient ?? ''}:${query.sender ?? ''}:${query.token ?? ''}:${query['valuation.amount.from'] ?? ''}:${query['valuation.amount.to'] ?? ''}:${query['valuation.currency'] ?? ''}:${query.group ?? false}:${query.logs ?? false}:${query.cursor ?? 'head'}:${query.limit}`,
|
|
2152
2436
|
store: c.get('store'),
|
|
2153
2437
|
ttl: Ttl.seconds(15),
|
|
2154
2438
|
},
|
|
@@ -2570,6 +2854,19 @@ type TransactionActivityOptions = getTransactionActivities.Options & {
|
|
|
2570
2854
|
) => Promise<value>
|
|
2571
2855
|
}
|
|
2572
2856
|
|
|
2857
|
+
type AddressActivityTimingName =
|
|
2858
|
+
| 'address_activity_classify'
|
|
2859
|
+
| 'address_activity_mpp'
|
|
2860
|
+
| 'address_activity_outbound'
|
|
2861
|
+
| 'address_activity_transfers'
|
|
2862
|
+
|
|
2863
|
+
type AddressActivityTime = <value>(
|
|
2864
|
+
name: AddressActivityTimingName,
|
|
2865
|
+
fn: () => Promise<value> | value,
|
|
2866
|
+
) => Promise<value>
|
|
2867
|
+
|
|
2868
|
+
const noAddressActivityTiming: AddressActivityTime = async (_name, fn) => fn()
|
|
2869
|
+
|
|
2573
2870
|
/**
|
|
2574
2871
|
* Lists classified activity for an address by running the shared pipeline
|
|
2575
2872
|
* (`groupByTx` → `classifyGroup` → `enrichItem`) over rows from a
|
|
@@ -2578,11 +2875,14 @@ type TransactionActivityOptions = getTransactionActivities.Options & {
|
|
|
2578
2875
|
*/
|
|
2579
2876
|
export async function list(provider: Provider, options: list.Options): Promise<list.ReturnType> {
|
|
2580
2877
|
const { address, cursor, group = false, limit = 20, logs = false } = options
|
|
2878
|
+
const time = options.time ?? noAddressActivityTiming
|
|
2581
2879
|
const viewer = address.toLowerCase() as Address.Address
|
|
2582
2880
|
|
|
2583
2881
|
// Best-effort MPP service directory: a fetch failure yields an empty map, so
|
|
2584
2882
|
// enrichment never blocks the feed.
|
|
2585
|
-
const fingerprintMap_promise =
|
|
2883
|
+
const fingerprintMap_promise = time('address_activity_mpp', () =>
|
|
2884
|
+
Mpp.fingerprintMap({ store: options.store }),
|
|
2885
|
+
).catch(() => ({}))
|
|
2586
2886
|
|
|
2587
2887
|
let currentCursor: string | undefined = cursor
|
|
2588
2888
|
const allItems: UnenrichedItem[] = []
|
|
@@ -2594,7 +2894,12 @@ export async function list(provider: Provider, options: list.Options): Promise<l
|
|
|
2594
2894
|
// measured against grouped entries (folding can collapse a page to very few),
|
|
2595
2895
|
// otherwise against the raw item count.
|
|
2596
2896
|
for (let attempt = 0; attempt < 3; attempt++) {
|
|
2597
|
-
const { rows } = await provider.fetchRows({
|
|
2897
|
+
const { rows } = await provider.fetchRows({
|
|
2898
|
+
address: viewer,
|
|
2899
|
+
cursor: currentCursor,
|
|
2900
|
+
...(options.filter?.candidate ? { filter: options.filter.candidate } : {}),
|
|
2901
|
+
limit,
|
|
2902
|
+
})
|
|
2598
2903
|
const grouped = groupByTx(rows)
|
|
2599
2904
|
|
|
2600
2905
|
const txGroups = grouped.slice(0, limit + 1)
|
|
@@ -2604,11 +2909,14 @@ export async function list(provider: Provider, options: list.Options): Promise<l
|
|
|
2604
2909
|
const fingerprintMap = await fingerprintMap_promise
|
|
2605
2910
|
if (page.length === 0) break
|
|
2606
2911
|
|
|
2607
|
-
|
|
2608
|
-
|
|
2912
|
+
const classified = await time('address_activity_classify', () =>
|
|
2913
|
+
page.flatMap((txGroup) =>
|
|
2609
2914
|
classifyGroup(txGroup, viewer, fingerprintMap, logs).map(withTitle),
|
|
2610
2915
|
),
|
|
2611
2916
|
)
|
|
2917
|
+
allItems.push(
|
|
2918
|
+
...(options.filter?.refine ? await options.filter.refine(classified) : classified),
|
|
2919
|
+
)
|
|
2612
2920
|
lastGroup = page[page.length - 1]
|
|
2613
2921
|
|
|
2614
2922
|
const enough = group
|
|
@@ -2634,6 +2942,8 @@ export declare namespace list {
|
|
|
2634
2942
|
address: Address.Address
|
|
2635
2943
|
/** Opaque cursor from a previous page; omit for the head page. */
|
|
2636
2944
|
cursor?: string | undefined
|
|
2945
|
+
/** Indexed candidate narrowing and exact classified refinement. */
|
|
2946
|
+
filter?: QueryFilter | undefined
|
|
2637
2947
|
/** Whether the caller will fold items into access-key groups (tunes the page-fill target). */
|
|
2638
2948
|
group?: boolean | undefined
|
|
2639
2949
|
/** Attach each item's full transaction `events` capture (decoded + raw logs). */
|
|
@@ -2642,6 +2952,8 @@ export declare namespace list {
|
|
|
2642
2952
|
limit?: number | undefined
|
|
2643
2953
|
/** Cache store for the MPP fingerprint-directory lookup. */
|
|
2644
2954
|
store: Store.Store
|
|
2955
|
+
/** Request-scoped timing hook for address activity work. */
|
|
2956
|
+
time?: AddressActivityTime | undefined
|
|
2645
2957
|
}
|
|
2646
2958
|
/** Result of {@link list}. */
|
|
2647
2959
|
type ReturnType = {
|
|
@@ -2670,11 +2982,14 @@ type ChainPageState = {
|
|
|
2670
2982
|
export async function listChains(options: listChains.Options): Promise<listChains.ReturnType> {
|
|
2671
2983
|
const { address, cursor, limit = 20, logs = false, providers, store } = options
|
|
2672
2984
|
const group = options.group ?? false
|
|
2985
|
+
const time = options.time ?? noAddressActivityTiming
|
|
2673
2986
|
const orderedProviders = [...providers].sort((a, b) => a.chainId - b.chainId)
|
|
2674
2987
|
const chainIds = orderedProviders.map(({ chainId }) => chainId)
|
|
2675
2988
|
const cursors = decodeChainCursor(cursor, chainIds)
|
|
2676
2989
|
const viewer = address.toLowerCase() as Address.Address
|
|
2677
|
-
const fingerprintMap_promise =
|
|
2990
|
+
const fingerprintMap_promise = time('address_activity_mpp', () =>
|
|
2991
|
+
Mpp.fingerprintMap({ store }),
|
|
2992
|
+
).catch(() => ({}))
|
|
2678
2993
|
const states: ChainPageState[] = orderedProviders.map(({ chainId, provider }) => ({
|
|
2679
2994
|
chainId,
|
|
2680
2995
|
exhausted: false,
|
|
@@ -2691,6 +3006,7 @@ export async function listChains(options: listChains.Options): Promise<listChain
|
|
|
2691
3006
|
const { rows } = await state.provider.fetchRows({
|
|
2692
3007
|
address: viewer,
|
|
2693
3008
|
cursor: cursors.get(state.chainId),
|
|
3009
|
+
...(options.filter?.candidate ? { filter: options.filter.candidate } : {}),
|
|
2694
3010
|
limit,
|
|
2695
3011
|
})
|
|
2696
3012
|
const groups = groupByTx(rows).slice(0, limit + 1)
|
|
@@ -2712,16 +3028,23 @@ export async function listChains(options: listChains.Options): Promise<listChain
|
|
|
2712
3028
|
const fingerprintMap = await fingerprintMap_promise
|
|
2713
3029
|
if (page.length === 0) break
|
|
2714
3030
|
|
|
2715
|
-
|
|
2716
|
-
|
|
2717
|
-
|
|
2718
|
-
|
|
2719
|
-
|
|
2720
|
-
|
|
2721
|
-
|
|
2722
|
-
|
|
2723
|
-
|
|
2724
|
-
|
|
3031
|
+
const classified = await time('address_activity_classify', () => {
|
|
3032
|
+
const items: listChains.Item[] = []
|
|
3033
|
+
for (const { state, txGroup } of page) {
|
|
3034
|
+
state.groups.splice(state.groups.indexOf(txGroup), 1)
|
|
3035
|
+
cursors.set(state.chainId, state.provider.cursorForGroup(txGroup))
|
|
3036
|
+
items.push(
|
|
3037
|
+
...classifyGroup(txGroup, viewer, fingerprintMap, logs).map((item) => ({
|
|
3038
|
+
...withTitle(item),
|
|
3039
|
+
chainId: state.chainId,
|
|
3040
|
+
})),
|
|
3041
|
+
)
|
|
3042
|
+
}
|
|
3043
|
+
return items
|
|
3044
|
+
})
|
|
3045
|
+
allItems.push(
|
|
3046
|
+
...(options.filter?.refine ? await options.filter.refine(classified) : classified),
|
|
3047
|
+
)
|
|
2725
3048
|
|
|
2726
3049
|
hasMore = states.some((state) => !state.exhausted || state.groups.length > 0)
|
|
2727
3050
|
const enough = group
|
|
@@ -2738,6 +3061,7 @@ export async function listChains(options: listChains.Options): Promise<listChain
|
|
|
2738
3061
|
const { rows } = await state.provider.fetchRows({
|
|
2739
3062
|
address: viewer,
|
|
2740
3063
|
cursor: cursors.get(state.chainId),
|
|
3064
|
+
...(options.filter?.candidate ? { filter: options.filter.candidate } : {}),
|
|
2741
3065
|
limit: 1,
|
|
2742
3066
|
})
|
|
2743
3067
|
const group = groupByTx(rows)[0]
|
|
@@ -2774,6 +3098,8 @@ export declare namespace listChains {
|
|
|
2774
3098
|
address: Address.Address
|
|
2775
3099
|
/** Opaque multi-chain cursor from a previous page. */
|
|
2776
3100
|
cursor?: string | undefined
|
|
3101
|
+
/** Indexed candidate narrowing and exact classified refinement. */
|
|
3102
|
+
filter?: QueryFilter<Item> | undefined
|
|
2777
3103
|
/** Whether the caller will fold access-key items. */
|
|
2778
3104
|
group?: boolean | undefined
|
|
2779
3105
|
/** Target number of transaction groups per page. */
|
|
@@ -2784,6 +3110,8 @@ export declare namespace listChains {
|
|
|
2784
3110
|
providers: readonly ChainProvider[]
|
|
2785
3111
|
/** Cache store for the MPP fingerprint-directory lookup. */
|
|
2786
3112
|
store: Store.Store
|
|
3113
|
+
/** Request-scoped timing hook for address activity work. */
|
|
3114
|
+
time?: AddressActivityTime | undefined
|
|
2787
3115
|
}
|
|
2788
3116
|
|
|
2789
3117
|
/** Multi-chain classified page before token enrichment. */
|
|
@@ -2820,16 +3148,13 @@ function encodeChainCursor(cursors: ReadonlyMap<number, string>, chainIds: reado
|
|
|
2820
3148
|
}
|
|
2821
3149
|
|
|
2822
3150
|
/**
|
|
2823
|
-
* Creates a TIDX-backed {@link Provider} that runs
|
|
2824
|
-
*
|
|
2825
|
-
*
|
|
2826
|
-
* then fetch the selected transactions' logs with a bounded lookup.
|
|
2827
|
-
* - Q2 (inbound): decoded `Transfer` events to the address.
|
|
2828
|
-
* - Q3 (outbound transfers): decoded `Transfer` events from the address
|
|
2829
|
-
* (catches access-key-signed sends where `tx.from` differs from the address).
|
|
3151
|
+
* Creates a TIDX-backed {@link Provider} that runs two sub-queries in parallel:
|
|
3152
|
+
* one joins bounded outbound transactions to their logs, and one reads inbound
|
|
3153
|
+
* and outbound `Transfer` logs.
|
|
2830
3154
|
*/
|
|
2831
3155
|
export function tidx(deps: tidx.Deps): Provider {
|
|
2832
3156
|
const { chainId, signal, tidx: tidxClient } = deps
|
|
3157
|
+
const time = deps.time ?? noAddressActivityTiming
|
|
2833
3158
|
|
|
2834
3159
|
const fetch: Tidx.Client['fetch'] = (options) => {
|
|
2835
3160
|
const requestSignal =
|
|
@@ -2851,187 +3176,310 @@ export function tidx(deps: tidx.Deps): Provider {
|
|
|
2851
3176
|
return { blockNum: decoded[0] as number, txIdx: decoded[1] as number }
|
|
2852
3177
|
}
|
|
2853
3178
|
|
|
2854
|
-
/**
|
|
2855
|
-
* Q1 pages outbound receipts, then fetches their logs by bounded block range
|
|
2856
|
-
* and transaction hash. The cursor preserves block and transaction index order.
|
|
2857
|
-
*/
|
|
3179
|
+
/** Q1 joins bounded outbound transactions to their logs. */
|
|
2858
3180
|
async function queryOutbound(options: {
|
|
2859
3181
|
address: Address.Address
|
|
2860
3182
|
cursor: { blockNum: number; txIdx: number } | undefined
|
|
2861
3183
|
limit: number
|
|
2862
3184
|
}): Promise<Row[]> {
|
|
2863
3185
|
const { address, cursor, limit } = options
|
|
2864
|
-
const
|
|
3186
|
+
const receiptKeyset = cursor
|
|
2865
3187
|
? `AND block_num <= ${cursor.blockNum} AND (block_num < ${cursor.blockNum} OR tx_idx < ${cursor.txIdx})`
|
|
2866
3188
|
: ''
|
|
2867
3189
|
const queryLimit = limit + 1
|
|
2868
|
-
const
|
|
3190
|
+
const txKeyset = cursor
|
|
3191
|
+
? `AND block_num <= ${cursor.blockNum} AND (block_num < ${cursor.blockNum} OR idx < ${cursor.txIdx})`
|
|
3192
|
+
: ''
|
|
3193
|
+
const result = await time('address_activity_outbound', () =>
|
|
2869
3194
|
fetch({
|
|
2870
3195
|
chainId,
|
|
2871
3196
|
// Raw-table query (no signature-decoded CTE), so the inline SQL is cast
|
|
2872
3197
|
// to `string`.
|
|
2873
3198
|
query: `
|
|
2874
|
-
|
|
2875
|
-
|
|
2876
|
-
|
|
2877
|
-
|
|
2878
|
-
|
|
3199
|
+
WITH outbound_candidates AS (
|
|
3200
|
+
(SELECT hash AS tx_hash, block_num, block_timestamp, idx AS tx_idx, "from", fee_payer
|
|
3201
|
+
FROM txs
|
|
3202
|
+
WHERE "from" = '${address}' ${txKeyset}
|
|
3203
|
+
ORDER BY block_num DESC, idx DESC
|
|
3204
|
+
LIMIT ${queryLimit})
|
|
3205
|
+
UNION
|
|
3206
|
+
(SELECT tx_hash, block_num, block_timestamp, tx_idx, "from", fee_payer
|
|
3207
|
+
FROM receipts
|
|
3208
|
+
WHERE fee_payer = '${address}' ${receiptKeyset}
|
|
3209
|
+
ORDER BY block_num DESC, tx_idx DESC
|
|
3210
|
+
LIMIT ${queryLimit})
|
|
3211
|
+
), outbound AS (
|
|
3212
|
+
SELECT tx_hash, block_num, block_timestamp, tx_idx, "from", fee_payer
|
|
3213
|
+
FROM outbound_candidates
|
|
3214
|
+
ORDER BY block_num DESC, tx_idx DESC
|
|
3215
|
+
LIMIT ${queryLimit}
|
|
3216
|
+
)
|
|
3217
|
+
SELECT outbound.tx_hash, outbound.block_num, outbound.block_timestamp,
|
|
3218
|
+
outbound.tx_idx, outbound."from", outbound.fee_payer, logs.log_idx,
|
|
3219
|
+
logs.address, logs.selector, logs.topic1, logs.topic2, logs.topic3, logs.data
|
|
3220
|
+
FROM outbound
|
|
3221
|
+
INNER JOIN logs
|
|
3222
|
+
ON logs.tx_hash = outbound.tx_hash AND logs.block_num = outbound.block_num
|
|
3223
|
+
ORDER BY outbound.block_num DESC, outbound.tx_idx DESC, logs.log_idx ASC
|
|
2879
3224
|
` as string,
|
|
2880
|
-
})
|
|
2881
|
-
|
|
2882
|
-
// Fetching `limit + 1` from each side is sufficient to form the newest
|
|
2883
|
-
// `limit + 1` transactions after the two ordered sets are merged.
|
|
2884
|
-
const [paid, sent] = await Promise.all([fetchReceipts('fee_payer'), fetchReceipts('from')])
|
|
2885
|
-
const seen = new Set<string>()
|
|
2886
|
-
const receipts = [...paid.rows, ...sent.rows]
|
|
2887
|
-
.map((r) => ({
|
|
2888
|
-
blockNum: Number(Value.toNumber(r['block_num'])),
|
|
2889
|
-
blockTimestamp: Number(Value.toNumber(r['block_timestamp'])),
|
|
2890
|
-
feePayer: lowerOrNull(r['fee_payer']),
|
|
2891
|
-
txHash: lowerHash(r['tx_hash']),
|
|
2892
|
-
txIdx: Number(Value.toNumber(r['tx_idx'])),
|
|
2893
|
-
txSender: lowerOrNull(r['from']),
|
|
2894
|
-
}))
|
|
2895
|
-
.filter((receipt) => {
|
|
2896
|
-
if (seen.has(receipt.txHash)) return false
|
|
2897
|
-
seen.add(receipt.txHash)
|
|
2898
|
-
return true
|
|
2899
|
-
})
|
|
2900
|
-
.sort((a, b) => {
|
|
2901
|
-
if (a.blockNum !== b.blockNum) return b.blockNum - a.blockNum
|
|
2902
|
-
return b.txIdx - a.txIdx
|
|
2903
|
-
})
|
|
2904
|
-
.slice(0, queryLimit)
|
|
2905
|
-
if (receipts.length === 0) return []
|
|
2906
|
-
|
|
2907
|
-
const blocks = receipts.map((receipt) => receipt.blockNum)
|
|
2908
|
-
const receiptByHash = new Map(receipts.map((receipt) => [receipt.txHash, receipt]))
|
|
2909
|
-
const txHashes = receipts.map((receipt) => `'${receipt.txHash}'`).join(', ')
|
|
2910
|
-
|
|
2911
|
-
// `logs` is not keyed by transaction hash, so pair the bounded hash list
|
|
2912
|
-
// with the selected receipts' block range to avoid a full archive scan.
|
|
2913
|
-
const logs = await fetch({
|
|
2914
|
-
chainId,
|
|
2915
|
-
// Raw-table query (no signature-decoded CTE), so the inline SQL is cast
|
|
2916
|
-
// to `string`.
|
|
2917
|
-
query: `
|
|
2918
|
-
SELECT tx_hash, block_num, tx_idx, log_idx, address, selector, topic1, topic2, topic3, data
|
|
2919
|
-
FROM logs
|
|
2920
|
-
WHERE block_num BETWEEN ${Math.min(...blocks)} AND ${Math.max(...blocks)}
|
|
2921
|
-
AND tx_hash IN (${txHashes})
|
|
2922
|
-
ORDER BY block_num DESC, tx_idx DESC, log_idx ASC
|
|
2923
|
-
` as string,
|
|
2924
|
-
})
|
|
3225
|
+
}),
|
|
3226
|
+
)
|
|
2925
3227
|
|
|
2926
|
-
|
|
2927
|
-
|
|
2928
|
-
|
|
2929
|
-
|
|
2930
|
-
|
|
2931
|
-
|
|
2932
|
-
|
|
2933
|
-
|
|
2934
|
-
|
|
2935
|
-
|
|
2936
|
-
|
|
2937
|
-
|
|
2938
|
-
|
|
2939
|
-
|
|
2940
|
-
|
|
2941
|
-
|
|
2942
|
-
txHash: receipt.txHash,
|
|
2943
|
-
txIdx: receipt.txIdx,
|
|
2944
|
-
txSender: receipt.txSender,
|
|
2945
|
-
},
|
|
2946
|
-
]
|
|
2947
|
-
})
|
|
2948
|
-
return mergeAndSort(rows, [], [])
|
|
3228
|
+
return result.rows.map((r) => ({
|
|
3229
|
+
blockNum: Number(Value.toNumber(r['block_num'])),
|
|
3230
|
+
blockTimestamp: Number(Value.toNumber(r['block_timestamp'])),
|
|
3231
|
+
data: Value.toText(r['data']) ?? null,
|
|
3232
|
+
feePayer: lowerOrNull(r['fee_payer']),
|
|
3233
|
+
logAddress: lower(r['address']),
|
|
3234
|
+
logIdx: Number(Value.toNumber(r['log_idx'])),
|
|
3235
|
+
selector: Value.toText(r['selector']) ?? null,
|
|
3236
|
+
source: 'q1' as const,
|
|
3237
|
+
topic1: Value.toText(r['topic1']) ?? null,
|
|
3238
|
+
topic2: Value.toText(r['topic2']) ?? null,
|
|
3239
|
+
topic3: Value.toText(r['topic3']) ?? null,
|
|
3240
|
+
txHash: lowerHash(r['tx_hash']),
|
|
3241
|
+
txIdx: Number(Value.toNumber(r['tx_idx'])),
|
|
3242
|
+
txSender: lowerOrNull(r['from']),
|
|
3243
|
+
}))
|
|
2949
3244
|
}
|
|
2950
3245
|
|
|
2951
|
-
/** Q2
|
|
3246
|
+
/** Q2 reads inbound and outbound `Transfer` logs in one request. */
|
|
2952
3247
|
async function queryTransfers(options: {
|
|
2953
3248
|
address: Address.Address
|
|
2954
3249
|
cursor: { blockNum: number; txIdx: number } | undefined
|
|
3250
|
+
filter: CandidateFilter | undefined
|
|
2955
3251
|
limit: number
|
|
2956
|
-
side: 'inbound' | 'outbound'
|
|
2957
3252
|
}): Promise<Row[]> {
|
|
2958
|
-
const { address, cursor,
|
|
2959
|
-
const
|
|
2960
|
-
|
|
2961
|
-
|
|
2962
|
-
|
|
2963
|
-
const
|
|
2964
|
-
|
|
2965
|
-
|
|
2966
|
-
|
|
2967
|
-
|
|
2968
|
-
|
|
2969
|
-
|
|
2970
|
-
|
|
2971
|
-
|
|
3253
|
+
const { address, cursor, filter, limit } = options
|
|
3254
|
+
const keyset = cursor
|
|
3255
|
+
? `AND (block_num < ${cursor.blockNum} OR (block_num = ${cursor.blockNum} AND tx_idx < ${cursor.txIdx}))`
|
|
3256
|
+
: ''
|
|
3257
|
+
const amount = filter?.amount
|
|
3258
|
+
const participantPredicates = [
|
|
3259
|
+
...(filter?.recipient !== undefined ? [`"to" = '${filter.recipient}'`] : []),
|
|
3260
|
+
...(filter?.sender !== undefined ? [`"from" = '${filter.sender}'`] : []),
|
|
3261
|
+
]
|
|
3262
|
+
const materializedPredicate = [
|
|
3263
|
+
...participantPredicates,
|
|
3264
|
+
...(filter?.token !== undefined ? [`token = '${filter.token}'`] : []),
|
|
3265
|
+
...(amount?.from !== undefined
|
|
3266
|
+
? amount.from > maxTokenAmount
|
|
3267
|
+
? ['0']
|
|
3268
|
+
: [`toUInt256(amount) >= toUInt256('${amount.from}')`]
|
|
3269
|
+
: []),
|
|
3270
|
+
...(amount?.to !== undefined && amount.to < maxTokenAmount
|
|
3271
|
+
? [`toUInt256(amount) <= toUInt256('${amount.to}')`]
|
|
3272
|
+
: []),
|
|
3273
|
+
]
|
|
3274
|
+
.map((predicate) => `AND ${predicate}`)
|
|
3275
|
+
.join(' ')
|
|
3276
|
+
const decodedPredicate = [
|
|
3277
|
+
...participantPredicates,
|
|
3278
|
+
...(filter?.token !== undefined ? [`address = '${filter.token}'`] : []),
|
|
3279
|
+
...(amount?.from !== undefined
|
|
3280
|
+
? amount.from > maxTokenAmount
|
|
3281
|
+
? ['0']
|
|
3282
|
+
: [`value >= ${amount.from}`]
|
|
3283
|
+
: []),
|
|
3284
|
+
...(amount?.to !== undefined && amount.to < maxTokenAmount ? [`value <= ${amount.to}`] : []),
|
|
3285
|
+
]
|
|
3286
|
+
.map((predicate) => `AND ${predicate}`)
|
|
3287
|
+
.join(' ')
|
|
3288
|
+
const queryLimit = limit + 1
|
|
3289
|
+
const result = await time('address_activity_transfers', async () => {
|
|
2972
3290
|
try {
|
|
2973
3291
|
return await fetch({
|
|
2974
3292
|
chainId,
|
|
2975
|
-
|
|
2976
|
-
|
|
3293
|
+
engine: 'clickhouse',
|
|
3294
|
+
// Bound transaction candidates first, then return every matching row
|
|
3295
|
+
// for each selected transaction so the group cursor cannot split one.
|
|
3296
|
+
query: `
|
|
3297
|
+
WITH transfer_candidates AS (
|
|
3298
|
+
(SELECT DISTINCT tx_hash, block_num, tx_idx
|
|
3299
|
+
FROM token_transfers
|
|
3300
|
+
WHERE "to" = '${address}' AND "from" != '${address}' ${materializedPredicate} ${keyset}
|
|
3301
|
+
ORDER BY block_num DESC, tx_idx DESC
|
|
3302
|
+
LIMIT ${queryLimit})
|
|
3303
|
+
UNION DISTINCT
|
|
3304
|
+
(SELECT DISTINCT tx_hash, block_num, tx_idx
|
|
3305
|
+
FROM token_transfers
|
|
3306
|
+
WHERE "from" = '${address}' AND "to" != '${address}' ${materializedPredicate} ${keyset}
|
|
3307
|
+
ORDER BY block_num DESC, tx_idx DESC
|
|
3308
|
+
LIMIT ${queryLimit})
|
|
3309
|
+
), selected_transactions AS (
|
|
3310
|
+
SELECT tx_hash, block_num, tx_idx
|
|
3311
|
+
FROM transfer_candidates
|
|
3312
|
+
ORDER BY block_num DESC, tx_idx DESC
|
|
3313
|
+
LIMIT ${queryLimit}
|
|
3314
|
+
)
|
|
3315
|
+
SELECT DISTINCT indexed.token AS address,
|
|
3316
|
+
toString(toUInt256(indexed.amount)) AS amount, indexed.tx_hash, indexed.block_num,
|
|
3317
|
+
toUnixTimestamp(indexed.block_timestamp) AS block_timestamp_unix,
|
|
3318
|
+
indexed.log_idx, indexed.tx_idx, indexed."from", indexed."to"
|
|
3319
|
+
FROM token_transfers AS indexed
|
|
3320
|
+
INNER JOIN selected_transactions AS selected
|
|
3321
|
+
ON selected.tx_hash = indexed.tx_hash AND selected.block_num = indexed.block_num
|
|
3322
|
+
AND selected.tx_idx = indexed.tx_idx
|
|
3323
|
+
WHERE (indexed."to" = '${address}' AND indexed."from" != '${address}')
|
|
3324
|
+
OR (indexed."from" = '${address}' AND indexed."to" != '${address}')
|
|
3325
|
+
ORDER BY indexed.block_num DESC, indexed.tx_idx DESC, indexed.log_idx DESC
|
|
3326
|
+
` as string,
|
|
2977
3327
|
})
|
|
2978
3328
|
} catch (error) {
|
|
2979
|
-
|
|
2980
|
-
|
|
2981
|
-
|
|
2982
|
-
|
|
2983
|
-
|
|
2984
|
-
|
|
2985
|
-
|
|
2986
|
-
|
|
2987
|
-
|
|
2988
|
-
|
|
2989
|
-
|
|
2990
|
-
|
|
2991
|
-
|
|
2992
|
-
|
|
2993
|
-
|
|
2994
|
-
|
|
2995
|
-
|
|
2996
|
-
|
|
3329
|
+
// Older indexers reject materialized address scans. Retain the decoded
|
|
3330
|
+
// Transfer source so activity feeds remain available on those chains.
|
|
3331
|
+
if (!Tidx.isQueryRejection(error)) throw error
|
|
3332
|
+
const predicates = [
|
|
3333
|
+
`"to" = '${address}' AND "from" != '${address}'`,
|
|
3334
|
+
`"from" = '${address}' AND "to" != '${address}'`,
|
|
3335
|
+
]
|
|
3336
|
+
const fetchDecoded = async (predicate: string, queryLimit: number) => {
|
|
3337
|
+
const where = `WHERE ${predicate} ${decodedPredicate}`
|
|
3338
|
+
try {
|
|
3339
|
+
return await fetch({
|
|
3340
|
+
chainId,
|
|
3341
|
+
query: `
|
|
3342
|
+
SELECT DISTINCT tx_hash, block_num, tx_idx
|
|
3343
|
+
FROM Transfer
|
|
3344
|
+
${where}
|
|
3345
|
+
ORDER BY block_num DESC, tx_idx DESC
|
|
3346
|
+
LIMIT ${queryLimit}
|
|
3347
|
+
` as string,
|
|
3348
|
+
signatures: [Transfers.signature],
|
|
3349
|
+
})
|
|
3350
|
+
} catch (error) {
|
|
3351
|
+
// Match the transfer feed's bounded fallback when sparse decoded
|
|
3352
|
+
// top-N queries are rejected by an older indexer.
|
|
3353
|
+
if (!Tidx.isDeterministicError(error)) throw error
|
|
3354
|
+
const sample = await fetch({
|
|
3355
|
+
chainId,
|
|
3356
|
+
query: `
|
|
3357
|
+
SELECT DISTINCT tx_hash, block_num, tx_idx
|
|
3358
|
+
FROM Transfer
|
|
3359
|
+
${where}
|
|
3360
|
+
LIMIT ${Schema.countCap}
|
|
3361
|
+
` as string,
|
|
3362
|
+
signatures: [Transfers.signature],
|
|
3363
|
+
})
|
|
3364
|
+
// An unordered sample is safe only when complete. At the cap,
|
|
3365
|
+
// preserve the rejection rather than issue a cursor that can skip rows.
|
|
3366
|
+
if (sample.rows.length >= Schema.countCap) throw error
|
|
3367
|
+
return {
|
|
3368
|
+
rows: sample.rows
|
|
3369
|
+
.sort(
|
|
3370
|
+
(a, b) =>
|
|
3371
|
+
Number(b['block_num']) - Number(a['block_num']) ||
|
|
3372
|
+
Number(b['tx_idx']) - Number(a['tx_idx']),
|
|
3373
|
+
)
|
|
3374
|
+
.slice(0, queryLimit),
|
|
3375
|
+
}
|
|
3376
|
+
}
|
|
2997
3377
|
}
|
|
3378
|
+
const rows = await Promise.all(
|
|
3379
|
+
predicates.map(async (predicate) => {
|
|
3380
|
+
const sameBlock = cursor
|
|
3381
|
+
? `AND block_num = ${cursor.blockNum} AND tx_idx < ${cursor.txIdx}`
|
|
3382
|
+
: ''
|
|
3383
|
+
const first = await fetchDecoded(`${predicate} ${sameBlock}`, queryLimit)
|
|
3384
|
+
if (!cursor || first.rows.length >= queryLimit) return first.rows
|
|
3385
|
+
|
|
3386
|
+
const older = await fetchDecoded(
|
|
3387
|
+
`${predicate} AND block_num < ${cursor.blockNum}`,
|
|
3388
|
+
queryLimit - first.rows.length,
|
|
3389
|
+
)
|
|
3390
|
+
return [...first.rows, ...older.rows]
|
|
3391
|
+
}),
|
|
3392
|
+
)
|
|
3393
|
+
const candidates = rows
|
|
3394
|
+
.flat()
|
|
3395
|
+
.sort(
|
|
3396
|
+
(a, b) =>
|
|
3397
|
+
Number(b['block_num']) - Number(a['block_num']) ||
|
|
3398
|
+
Number(b['tx_idx']) - Number(a['tx_idx']),
|
|
3399
|
+
)
|
|
3400
|
+
const hashes = [...new Set(candidates.map((row) => lowerHash(row['tx_hash'])))].slice(
|
|
3401
|
+
0,
|
|
3402
|
+
queryLimit,
|
|
3403
|
+
)
|
|
3404
|
+
if (hashes.length === 0) return { rows: [] }
|
|
3405
|
+
|
|
3406
|
+
// Candidate limits count transactions. Hydrate all viewer transfers,
|
|
3407
|
+
// including rows outside candidate filters, before classification.
|
|
3408
|
+
const transfers = await fetch({
|
|
3409
|
+
chainId,
|
|
3410
|
+
query: `
|
|
3411
|
+
SELECT address, value AS amount, tx_hash, block_num, block_timestamp,
|
|
3412
|
+
log_idx, tx_idx, "from", "to"
|
|
3413
|
+
FROM Transfer
|
|
3414
|
+
WHERE tx_hash IN (${hashes.map((hash) => `'${hash}'`).join(', ')})
|
|
3415
|
+
AND (("to" = '${address}' AND "from" != '${address}')
|
|
3416
|
+
OR ("from" = '${address}' AND "to" != '${address}'))
|
|
3417
|
+
LIMIT ${Schema.countCap}
|
|
3418
|
+
` as string,
|
|
3419
|
+
signatures: [Transfers.signature],
|
|
3420
|
+
})
|
|
3421
|
+
// TIDX caps results even without a SQL limit. Never publish a page
|
|
3422
|
+
// whose selected transactions might have been truncated by that cap.
|
|
3423
|
+
if (transfers.rows.length >= Schema.countCap) throw error
|
|
3424
|
+
return transfers
|
|
2998
3425
|
}
|
|
2999
|
-
})
|
|
3000
|
-
const rows = result.rows.
|
|
3001
|
-
|
|
3002
|
-
|
|
3003
|
-
|
|
3004
|
-
|
|
3005
|
-
|
|
3006
|
-
|
|
3007
|
-
|
|
3008
|
-
|
|
3009
|
-
|
|
3010
|
-
|
|
3011
|
-
|
|
3012
|
-
|
|
3013
|
-
|
|
3014
|
-
|
|
3015
|
-
|
|
3016
|
-
|
|
3017
|
-
|
|
3018
|
-
|
|
3019
|
-
|
|
3020
|
-
|
|
3426
|
+
})
|
|
3427
|
+
const rows = result.rows.flatMap((r) => {
|
|
3428
|
+
const transferAmount = Value.toIntegerString(r['amount'])
|
|
3429
|
+
const transferFrom = lowerOrNull(r['from'])
|
|
3430
|
+
const transferTo = lowerOrNull(r['to'])
|
|
3431
|
+
const blockTimestamp = (() => {
|
|
3432
|
+
const value = r['block_timestamp_unix'] ?? r['block_timestamp']
|
|
3433
|
+
const numeric = Value.toNumber(value)
|
|
3434
|
+
if (numeric !== undefined && Number.isFinite(numeric)) return numeric
|
|
3435
|
+
const timestamp = Value.toIsoDateTime(value)
|
|
3436
|
+
return timestamp === undefined ? undefined : Date.parse(timestamp) / 1_000
|
|
3437
|
+
})()
|
|
3438
|
+
if (
|
|
3439
|
+
transferAmount === undefined ||
|
|
3440
|
+
!transferFrom ||
|
|
3441
|
+
!transferTo ||
|
|
3442
|
+
blockTimestamp === undefined ||
|
|
3443
|
+
!Number.isFinite(blockTimestamp)
|
|
3444
|
+
)
|
|
3445
|
+
return []
|
|
3446
|
+
return [
|
|
3447
|
+
{
|
|
3448
|
+
blockNum: Number(Value.toNumber(r['block_num'])),
|
|
3449
|
+
blockTimestamp,
|
|
3450
|
+
data: null,
|
|
3451
|
+
feePayer: null,
|
|
3452
|
+
logAddress: lower(r['address']),
|
|
3453
|
+
logIdx: Number(Value.toNumber(r['log_idx'])),
|
|
3454
|
+
selector: null,
|
|
3455
|
+
source: 'q2' as const,
|
|
3456
|
+
topic1: null,
|
|
3457
|
+
topic2: null,
|
|
3458
|
+
topic3: null,
|
|
3459
|
+
transferAmount: BigInt(transferAmount),
|
|
3460
|
+
transferFrom,
|
|
3461
|
+
transferTo,
|
|
3462
|
+
transferToken: lower(r['address']),
|
|
3463
|
+
txHash: lowerHash(r['tx_hash']),
|
|
3464
|
+
txIdx: Number(Value.toNumber(r['tx_idx'])),
|
|
3465
|
+
txSender: null,
|
|
3466
|
+
},
|
|
3467
|
+
]
|
|
3468
|
+
})
|
|
3469
|
+
return mergeAndSort([], rows, [])
|
|
3021
3470
|
}
|
|
3022
3471
|
|
|
3023
3472
|
return {
|
|
3024
3473
|
cursorForGroup(group) {
|
|
3025
3474
|
return Cursor.encode([group.blockNum, group.txIdx])
|
|
3026
3475
|
},
|
|
3027
|
-
async fetchRows({ address, cursor, limit }) {
|
|
3476
|
+
async fetchRows({ address, cursor, filter, limit }) {
|
|
3028
3477
|
const parsed = cursor ? parseCursor(cursor) : undefined
|
|
3029
|
-
const [q1, q2
|
|
3478
|
+
const [q1, q2] = await Promise.all([
|
|
3030
3479
|
queryOutbound({ address, cursor: parsed, limit }),
|
|
3031
|
-
queryTransfers({ address, cursor: parsed,
|
|
3032
|
-
queryTransfers({ address, cursor: parsed, limit, side: 'outbound' }),
|
|
3480
|
+
queryTransfers({ address, cursor: parsed, filter, limit }),
|
|
3033
3481
|
])
|
|
3034
|
-
return { rows: mergeAndSort(q1, q2,
|
|
3482
|
+
return { rows: mergeAndSort(q1, q2, []) }
|
|
3035
3483
|
},
|
|
3036
3484
|
}
|
|
3037
3485
|
}
|
|
@@ -3045,6 +3493,8 @@ export declare namespace tidx {
|
|
|
3045
3493
|
signal?: AbortSignal | undefined
|
|
3046
3494
|
/** TIDX query client. */
|
|
3047
3495
|
tidx: Tidx.Client
|
|
3496
|
+
/** Request-scoped timing hook for the provider's logical queries. */
|
|
3497
|
+
time?: AddressActivityTime | undefined
|
|
3048
3498
|
}
|
|
3049
3499
|
}
|
|
3050
3500
|
|
|
@@ -3476,7 +3926,7 @@ function classifyFromLogsCore(
|
|
|
3476
3926
|
if (nested) claim(nested)
|
|
3477
3927
|
else takeEvent((e) => e.eventName === 'Deposited' && Address.isEqual(e.address, vault))
|
|
3478
3928
|
claimVaultLegs(vault, [args.inputAmount, args.vaultAssets, args.earnShares])
|
|
3479
|
-
// The
|
|
3929
|
+
// The routes leg pays the router (the emitting contract), not the vault.
|
|
3480
3930
|
claimVaultLegs(event.address as Address.Address, [args.inputAmount])
|
|
3481
3931
|
return { ...itemBase(event.logIndex), data, type: 'private-assets-deposited' }
|
|
3482
3932
|
})
|
|
@@ -4359,7 +4809,7 @@ function classifyFromLogsCore(
|
|
|
4359
4809
|
})
|
|
4360
4810
|
|
|
4361
4811
|
// Reward pool funded: the funded token is the emitting contract itself;
|
|
4362
|
-
// claim the
|
|
4812
|
+
// claim the route transfer.
|
|
4363
4813
|
recognize(named('RewardDistributed'), (event) => {
|
|
4364
4814
|
const args = event.args as { amount: bigint; funder: Address.Address }
|
|
4365
4815
|
takeTransfer(
|
|
@@ -5136,7 +5586,7 @@ function decodeRows(rows: readonly Row[]) {
|
|
|
5136
5586
|
// logs per log and can yield `args: undefined`; normalize so `in`-guards
|
|
5137
5587
|
// never throw.
|
|
5138
5588
|
return parseEventLogs({
|
|
5139
|
-
abi: [...Abis.
|
|
5589
|
+
abi: [...Abis.core, ...Abis.earnRouter, ...Abis.earnVault, ...erc4626Events],
|
|
5140
5590
|
logs,
|
|
5141
5591
|
strict: false,
|
|
5142
5592
|
}).map((event) => ({ ...event, args: event.args ?? {} }))
|
|
@@ -5242,19 +5692,26 @@ function getActivityTokenMetadata(
|
|
|
5242
5692
|
): Promise<Omit<ResolvedToken, 'verified'>> {
|
|
5243
5693
|
const { address, chainId } = options
|
|
5244
5694
|
if (address.startsWith(tip20AddressPrefix))
|
|
5245
|
-
return Tokens.getTokenMetadata(c, {
|
|
5695
|
+
return Tokens.getTokenMetadata(c, {
|
|
5696
|
+
address,
|
|
5697
|
+
chainId,
|
|
5698
|
+
timeOrigin: (fn) => Timing.sum(c, 'activity_token_metadata_origin', fn),
|
|
5699
|
+
})
|
|
5246
5700
|
|
|
5247
5701
|
return Store.memoize(
|
|
5248
|
-
|
|
5249
|
-
|
|
5250
|
-
|
|
5251
|
-
|
|
5252
|
-
|
|
5253
|
-
|
|
5254
|
-
|
|
5255
|
-
|
|
5256
|
-
|
|
5257
|
-
|
|
5702
|
+
() =>
|
|
5703
|
+
Timing.sum(c, 'activity_token_metadata_origin', async () => {
|
|
5704
|
+
const metadata = await viem_Token.getMetadata(c.get('getClient')(chainId), {
|
|
5705
|
+
token: address,
|
|
5706
|
+
})
|
|
5707
|
+
// ERC-20 has no currency field; its symbol is the amount's unit label.
|
|
5708
|
+
return {
|
|
5709
|
+
currency: metadata.symbol,
|
|
5710
|
+
decimals: metadata.decimals,
|
|
5711
|
+
name: metadata.name,
|
|
5712
|
+
symbol: metadata.symbol,
|
|
5713
|
+
}
|
|
5714
|
+
}),
|
|
5258
5715
|
{ key: `token:erc20:v1:${chainId}:${address}:metadata`, store: c.get('store'), ttl: Ttl.minutes(1) }, // prettier-ignore
|
|
5259
5716
|
)
|
|
5260
5717
|
}
|
|
@@ -5278,21 +5735,31 @@ async function enrichTokens(
|
|
|
5278
5735
|
for (const item of items) collectTokens(item, addresses)
|
|
5279
5736
|
const includeLogoUri = include.includes('token.logoUri')
|
|
5280
5737
|
const includeVerified = include.includes('token.verified')
|
|
5738
|
+
const tokenAddresses = [...addresses]
|
|
5281
5739
|
const resolved_promise =
|
|
5282
|
-
|
|
5283
|
-
? Timing.time(c, 'tokens', () =>
|
|
5284
|
-
|
|
5285
|
-
|
|
5286
|
-
|
|
5287
|
-
|
|
5288
|
-
|
|
5289
|
-
|
|
5290
|
-
|
|
5291
|
-
|
|
5292
|
-
|
|
5293
|
-
|
|
5294
|
-
|
|
5295
|
-
|
|
5740
|
+
tokenAddresses.length > 0
|
|
5741
|
+
? Timing.time(c, 'tokens', async () => {
|
|
5742
|
+
const metadata_promise = Timing.sum(c, 'activity_token_metadata', () =>
|
|
5743
|
+
Promise.all(
|
|
5744
|
+
tokenAddresses.map((address) => getActivityTokenMetadata(c, { address, chainId })),
|
|
5745
|
+
),
|
|
5746
|
+
)
|
|
5747
|
+
const logoUris_promise = includeLogoUri
|
|
5748
|
+
? Timing.sum(c, 'activity_token_logos', () =>
|
|
5749
|
+
Promise.all(
|
|
5750
|
+
tokenAddresses.map((address) =>
|
|
5751
|
+
Tokens.getTokenLogo(c, { address, chainId }).catch(() => undefined),
|
|
5752
|
+
),
|
|
5753
|
+
),
|
|
5754
|
+
)
|
|
5755
|
+
: Promise.resolve(tokenAddresses.map(() => undefined))
|
|
5756
|
+
const [metadata, logoUris] = await Promise.all([metadata_promise, logoUris_promise])
|
|
5757
|
+
return tokenAddresses.map((address, index) => ({
|
|
5758
|
+
address: address.toLowerCase(),
|
|
5759
|
+
logoUri: logoUris[index],
|
|
5760
|
+
metadata: metadata[index]!,
|
|
5761
|
+
}))
|
|
5762
|
+
})
|
|
5296
5763
|
: undefined
|
|
5297
5764
|
// Curated data is needed only for requested valuation or token fields.
|
|
5298
5765
|
const snapshot_promise =
|