tapimo 0.13.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +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 +21383 -18056
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +301 -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 +2 -2
- package/dist/Webhooks.js.map +1 -1
- package/dist/admin/App.d.ts +3936 -1337
- 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 +159 -7
- 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 +1446 -0
- package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
- package/dist/admin/apps/earn-vaults.js +465 -8
- package/dist/admin/apps/earn-vaults.js.map +1 -1
- package/dist/admin/apps/organizations.d.ts +344 -3
- package/dist/admin/apps/organizations.d.ts.map +1 -1
- package/dist/admin/apps/organizations.js +288 -10
- 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 +16 -16
- package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
- package/dist/admin/apps/verified-tokens.js +3 -3
- 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 +129 -69
- 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 +40 -8
- package/dist/apps/Zones.js.map +1 -1
- package/dist/apps/data/App.d.ts +4310 -2548
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/App.js +86 -26
- package/dist/apps/data/App.js.map +1 -1
- package/dist/apps/data/routes/activities.d.ts +364 -34
- 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 +94 -22
- package/dist/apps/data/routes/addresses.d.ts.map +1 -1
- package/dist/apps/data/routes/blocks.d.ts +37 -37
- 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 +1641 -352
- package/dist/apps/data/routes/earn.d.ts.map +1 -1
- package/dist/apps/data/routes/earn.js +1561 -120
- package/dist/apps/data/routes/earn.js.map +1 -1
- package/dist/apps/data/routes/exchanges.d.ts +15 -0
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +180 -114
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts +5 -0
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +49 -38
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +125 -0
- 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/rpc.d.ts +507 -33
- package/dist/apps/data/routes/rpc.d.ts.map +1 -1
- package/dist/apps/data/routes/rpc.js +266 -156
- 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 +95 -93
- 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 +16 -0
- 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/verified-tokens.d.ts +4 -4
- 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 +1210 -70
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +301 -163
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- 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 +4119 -3297
- 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 +49 -8
- package/dist/apps/management/Billing.d.ts.map +1 -1
- package/dist/apps/management/Billing.js +221 -26
- package/dist/apps/management/Billing.js.map +1 -1
- package/dist/apps/management/routes/api-keys.d.ts +174 -72
- 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 +364 -78
- 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 +99 -24
- 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 +42 -42
- 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 +16 -16
- package/dist/apps/management/routes/orgs.d.ts +36 -20
- 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 +40 -40
- 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 +8 -8
- 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 +16 -16
- package/dist/apps/management/routes/webhooks.d.ts +931 -215
- package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/management/routes/webhooks.js +71 -25
- package/dist/apps/management/routes/webhooks.js.map +1 -1
- package/dist/apps/mcp.d.ts +1 -1
- package/dist/apps/mcp.js +7 -7
- package/dist/apps/mcp.js.map +1 -1
- 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 +177 -26
- 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 +232 -25
- 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 +841 -136
- package/dist/apps/{funding → routes}/App.d.ts.map +1 -1
- package/dist/apps/{funding → routes}/App.js +17 -17
- 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 +7 -7
- 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 +123 -59
- package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -0
- package/dist/apps/{funding → routes}/routes/deposit-addresses.js +498 -223
- 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 +19 -16
- 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 +957 -71
- 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 +1052 -15
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +785 -133
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +590 -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 +51 -5
- package/dist/db/tables/organizations.d.ts.map +1 -1
- package/dist/db/tables/organizations.js +135 -47
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/projects.d.ts +27 -1
- package/dist/db/tables/projects.d.ts.map +1 -1
- package/dist/db/tables/projects.js +38 -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/routesTransferTransactions.js +86 -0
- 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 +112 -13
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +241 -38
- 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/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 +22 -10
- package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
- package/dist/db/tables/webhookSubscriptions.js +50 -15
- 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 +48 -12
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +603 -175
- 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 +31 -14
- 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 +46 -2068
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Viem.js +171 -11
- 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 -3
- 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 +9 -17
- 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 +350 -104
- package/dist/internal/routes/Provider.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/Provider.js +233 -97
- 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 +13 -15
- 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 +324 -34
- 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/routes/TransferReconciliation.d.ts +55 -0
- 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/routes/TransferWebhook.d.ts +21 -0
- package/dist/internal/routes/TransferWebhook.d.ts.map +1 -0
- package/dist/internal/routes/TransferWebhook.js +43 -0
- package/dist/internal/routes/TransferWebhook.js.map +1 -0
- package/dist/internal/{funding → routes}/index.d.ts +3 -0
- package/dist/internal/routes/index.d.ts.map +1 -0
- package/dist/internal/{funding → routes}/index.js +3 -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 +197 -122
- 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/routes/providers/stargate.d.ts +165 -0
- 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.d.ts.map +1 -1
- package/dist/internal/webhookDestinations/slack.js +22 -6
- 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 +335 -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 +611 -101
- package/src/Handler.ts +0 -1
- package/src/OpenApi.contract.test.ts +195 -0
- package/src/Scope.ts +17 -5
- package/src/Webhooks.ts +2 -2
- 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 +681 -7
- package/src/admin/apps/organizations.test.ts +342 -1
- package/src/admin/apps/organizations.ts +368 -8
- 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 +8 -3
- package/src/admin/apps/verified-tokens.ts +3 -3
- 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 +147 -3
- package/src/admin/ui/src/lib/organizations.ts +136 -0
- 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/routeTree.gen.ts +63 -0
- package/src/admin/ui/src/routes/__root.tsx +12 -1
- 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_.$orgId.tsx +334 -2
- 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.generated.ts +144 -69
- 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 +18 -3
- package/src/apps/Zones.ts +55 -8
- package/src/apps/composition.test.ts +68 -59
- package/src/apps/data/App.test.ts +154 -2
- package/src/apps/data/App.ts +102 -33
- 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 +1661 -29
- package/src/apps/data/routes/earn.ts +2314 -328
- package/src/apps/data/routes/exchanges.test.ts +752 -30
- package/src/apps/data/routes/exchanges.ts +954 -753
- package/src/apps/data/routes/fee-amm.test.ts +224 -0
- package/src/apps/data/routes/fee-amm.ts +208 -178
- 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 +352 -8
- package/src/apps/data/routes/rpc.ts +407 -219
- 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.test.ts +659 -81
- package/src/apps/data/routes/webhooks.ts +1104 -817
- 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 +283 -34
- 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/webhooks.test.ts +49 -26
- package/src/apps/management/routes/webhooks.ts +93 -38
- package/src/apps/mcp.test.ts +6 -6
- package/src/apps/mcp.ts +7 -7
- 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 +1024 -38
- package/src/apps/relay/App.ts +228 -32
- 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 +253 -29
- 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 +1362 -462
- package/src/apps/{funding → routes}/routes/deposit-addresses.ts +568 -248
- 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/routes/routes/transfers.test.ts +2876 -0
- 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 +1511 -34
- package/src/db/Schema.ts +744 -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 +725 -7
- package/src/db/tables/organizations.ts +182 -49
- package/src/db/tables/projects.test.ts +71 -0
- package/src/db/tables/projects.ts +59 -4
- 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} +316 -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/routesTransferTransactions.ts +158 -0
- package/src/db/tables/routesTransfers.test.ts +338 -0
- package/src/db/tables/routesTransfers.ts +662 -0
- package/src/db/tables/sponsoredTransactions.test.ts +563 -1
- package/src/db/tables/sponsoredTransactions.ts +386 -42
- 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/webhookQueueEvents.ts +8 -1
- package/src/db/tables/webhookSubscriptions.ts +103 -21
- 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 +1564 -9
- package/src/internal/Auth.ts +833 -239
- 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 +37 -15
- package/src/internal/Email.ts +54 -0
- package/src/internal/Idempotency.test.ts +2 -2
- package/src/internal/Log.test-d.ts +10 -7
- package/src/internal/Log.test.ts +114 -16
- package/src/internal/Log.ts +55 -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 +249 -17
- package/src/internal/Webhooks.test.ts +125 -1
- 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 -8
- 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 +11 -22
- 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 +531 -185
- 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 +18 -22
- 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/routes/TransferWebhook.test.ts +128 -0
- package/src/internal/routes/TransferWebhook.ts +67 -0
- package/src/internal/{funding → routes}/index.test.ts +6 -3
- package/src/internal/{funding → routes}/index.ts +3 -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 +165 -32
- package/src/internal/{funding → routes}/providers/relay.ts +231 -136
- 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 +20 -5
- 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 -622
- 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 -15
- package/dist/db/tables/fundingTransferTransactions.d.ts.map +0 -1
- package/dist/db/tables/fundingTransferTransactions.js +0 -27
- package/dist/db/tables/fundingTransferTransactions.js.map +0 -1
- package/dist/db/tables/fundingTransfers.d.ts +0 -82
- package/dist/db/tables/fundingTransfers.d.ts.map +0 -1
- package/dist/db/tables/fundingTransfers.js +0 -89
- 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 -334
- package/dist/internal/funding/Transfer.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 +0 -38
- package/dist/internal/funding/providers/stargate.d.ts.map +0 -1
- package/dist/internal/funding/providers/stargate.js +0 -277
- 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 -78
- package/src/apps/funding/ProviderAttempts.ts +0 -26
- package/src/apps/funding/index.ts +0 -1
- package/src/apps/funding/routes/transfers.test.ts +0 -1638
- package/src/apps/funding/routes/transfers.ts +0 -721
- 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 -69
- package/src/db/tables/fundingTransferTransactions.ts +0 -37
- package/src/db/tables/fundingTransfers.test.ts +0 -89
- package/src/db/tables/fundingTransfers.ts +0 -153
- 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 -369
- package/src/internal/funding/Transfer.ts +0 -545
- package/src/internal/funding/providers/stargate.test.ts +0 -163
- package/src/internal/funding/providers/stargate.ts +0 -409
- /package/dist/apps/{funding → routes}/Inventory.d.ts +0 -0
- /package/src/internal/{funding → routes}/Route.test.ts +0 -0
|
@@ -3,17 +3,21 @@ import * as NodeBuffer from 'node:buffer'
|
|
|
3
3
|
import { AbiEvent, AbiFunction, AbiParameters, Address, Hex } from 'ox'
|
|
4
4
|
|
|
5
5
|
import * as Metrics from '../../Metrics.js'
|
|
6
|
-
import * as
|
|
7
|
-
import * as
|
|
8
|
-
import * as
|
|
9
|
-
import * as
|
|
6
|
+
import * as Organizations from '../../db/tables/organizations.js'
|
|
7
|
+
import * as RoutesCatalog from '../../db/tables/routesCatalog.js'
|
|
8
|
+
import * as RoutesDepositAddresses from '../../db/tables/routesDepositAddresses.js'
|
|
9
|
+
import * as RoutesDepositRequestObservations from '../../db/tables/routesDepositRequestObservations.js'
|
|
10
|
+
import * as RoutesDeposits from '../../db/tables/routesDeposits.js'
|
|
11
|
+
import * as RoutesSubsidies from '../../db/tables/routesSubsidies.js'
|
|
12
|
+
import * as StripeCustomers from '../../db/tables/stripeCustomers.js'
|
|
10
13
|
import * as TestApp from '../../../test/App.js'
|
|
11
|
-
import * as
|
|
14
|
+
import * as TestRoutes from '../../../test/Routes.js'
|
|
12
15
|
import * as TestRelay from '../../../test/Relay.js'
|
|
13
16
|
import * as Chain from './Chain.js'
|
|
14
17
|
import * as Deposit from './Deposit.js'
|
|
15
18
|
import * as DepositAddress from './DepositAddress.js'
|
|
16
19
|
import * as Evidence from './Evidence.js'
|
|
20
|
+
import * as Observability from './Observability.js'
|
|
17
21
|
import * as Provider from './Provider.js'
|
|
18
22
|
import * as Reconciliation from './Reconciliation.js'
|
|
19
23
|
import * as Relay from './providers/relay.js'
|
|
@@ -23,13 +27,80 @@ const db = TestApp.database()
|
|
|
23
27
|
const transferTopic = AbiEvent.getSelector('event Transfer(address,address,uint256)')
|
|
24
28
|
|
|
25
29
|
describe('createTracker', () => {
|
|
30
|
+
test('schedules one poll after a provider payload failure', async () => {
|
|
31
|
+
const route = TestRoutes.transferSnapshot()
|
|
32
|
+
const address = await DepositAddress.create(db, {
|
|
33
|
+
deliveryStrategy: 'provider',
|
|
34
|
+
environment: 'production',
|
|
35
|
+
// Keep this failed record beyond the clocks used by later tick tests.
|
|
36
|
+
now: new Date('2126-09-01T22:30:00.000Z'),
|
|
37
|
+
orgId: 'org_provider_payload_failure',
|
|
38
|
+
providerOutputToken: route.destinationToken,
|
|
39
|
+
snapshot: {
|
|
40
|
+
address: `0x${'41'.repeat(20)}`,
|
|
41
|
+
destinationChain: route.destinationChain,
|
|
42
|
+
destinationToken: route.destinationToken,
|
|
43
|
+
provider: { id: 'relay', name: 'Relay' },
|
|
44
|
+
recipient: route.recipient,
|
|
45
|
+
refundAddress: `0x${'42'.repeat(20)}`,
|
|
46
|
+
sourceChain: route.sourceChain,
|
|
47
|
+
sourceToken: route.sourceToken,
|
|
48
|
+
subsidize: false,
|
|
49
|
+
},
|
|
50
|
+
})
|
|
51
|
+
const server = await TestRelay.createServer((_request, response) => {
|
|
52
|
+
response.writeHead(200, { 'content-type': 'application/json' })
|
|
53
|
+
response.end(JSON.stringify({ requests: null }))
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
try {
|
|
57
|
+
const tracker = Reconciliation.createTracker({
|
|
58
|
+
db,
|
|
59
|
+
dispatch: async () => undefined,
|
|
60
|
+
now: () => new Date('2126-09-01T22:31:45.000Z'),
|
|
61
|
+
providers: [Relay.relay({ apiKey: 'relay-api-key', baseUrl: server.url })],
|
|
62
|
+
verifyTransfers: Evidence.createVerifier({ db }),
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
const result = await tracker.reconcile({
|
|
66
|
+
addressId: address.id,
|
|
67
|
+
trigger: 'webhook',
|
|
68
|
+
type: 'routes:deposit-address:reconcile',
|
|
69
|
+
})
|
|
70
|
+
const stored = await RoutesDepositAddresses.get(db, address.id)
|
|
71
|
+
|
|
72
|
+
expect({
|
|
73
|
+
nextPollAt: stored?.nextPollAt,
|
|
74
|
+
pollFailureCount: stored?.pollFailureCount,
|
|
75
|
+
pollLeaseUntil: stored?.pollLeaseUntil,
|
|
76
|
+
result,
|
|
77
|
+
}).toMatchInlineSnapshot(`
|
|
78
|
+
{
|
|
79
|
+
"nextPollAt": "2126-09-01T22:32:45.000Z",
|
|
80
|
+
"pollFailureCount": 1,
|
|
81
|
+
"pollLeaseUntil": null,
|
|
82
|
+
"result": {
|
|
83
|
+
"type": "provider_unavailable",
|
|
84
|
+
},
|
|
85
|
+
}
|
|
86
|
+
`)
|
|
87
|
+
} finally {
|
|
88
|
+
await server.closeAsync()
|
|
89
|
+
}
|
|
90
|
+
})
|
|
91
|
+
|
|
26
92
|
test('keeps Relay success pending without destination evidence', async () => {
|
|
27
|
-
const route =
|
|
93
|
+
const route = TestRoutes.transferSnapshot()
|
|
28
94
|
const depositAddress = `0x${'44'.repeat(20)}`
|
|
95
|
+
await db.kysely
|
|
96
|
+
.deleteFrom('routes_deposit_addresses')
|
|
97
|
+
.where('providerId', '=', 'relay')
|
|
98
|
+
.where('address', '=', depositAddress)
|
|
99
|
+
.execute()
|
|
100
|
+
const newerSourceTransactionHash = `0x${'bb'.repeat(32)}`
|
|
29
101
|
const sourceTransactionHash = `0x${'aa'.repeat(32)}`
|
|
30
102
|
const providerTransactionHash = `0x${'cc'.repeat(32)}`
|
|
31
103
|
const address = await DepositAddress.create(db, {
|
|
32
|
-
apiKeyId: 'key_reconciliation',
|
|
33
104
|
deliveryStrategy: 'provider',
|
|
34
105
|
environment: 'production',
|
|
35
106
|
now: new Date('2026-01-01T00:00:00.000Z'),
|
|
@@ -58,22 +129,37 @@ describe('createTracker', () => {
|
|
|
58
129
|
})
|
|
59
130
|
const server = await TestRelay.createServer(async (request, response) => {
|
|
60
131
|
if (request.method === 'GET') {
|
|
132
|
+
const requestId = new URL(request.url!, 'http://localhost').searchParams.get('id')
|
|
133
|
+
const requests = [
|
|
134
|
+
{
|
|
135
|
+
createdAt: '2026-01-01T00:02:00.000Z',
|
|
136
|
+
data: {
|
|
137
|
+
inTxs: [{ txHash: providerTransactionHash }],
|
|
138
|
+
outTxs: [],
|
|
139
|
+
},
|
|
140
|
+
depositAddress: { depositTxHash: newerSourceTransactionHash },
|
|
141
|
+
id: 'relay-newer-request',
|
|
142
|
+
status: 'success',
|
|
143
|
+
updatedAt: '2026-01-01T00:03:00.000Z',
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
createdAt: '2026-01-01T00:01:00.000Z',
|
|
147
|
+
data: {
|
|
148
|
+
inTxs: [{ txHash: providerTransactionHash }],
|
|
149
|
+
outTxs: [],
|
|
150
|
+
},
|
|
151
|
+
depositAddress: { depositTxHash: sourceTransactionHash },
|
|
152
|
+
id: 'relay-child-request',
|
|
153
|
+
status: 'success',
|
|
154
|
+
updatedAt: '2026-01-01T00:02:00.000Z',
|
|
155
|
+
},
|
|
156
|
+
]
|
|
61
157
|
response.writeHead(200, { 'content-type': 'application/json' })
|
|
62
158
|
response.end(
|
|
63
159
|
JSON.stringify({
|
|
64
|
-
requests:
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
data: {
|
|
68
|
-
inTxs: [{ txHash: providerTransactionHash }],
|
|
69
|
-
outTxs: [],
|
|
70
|
-
},
|
|
71
|
-
depositAddress: { depositTxHash: sourceTransactionHash },
|
|
72
|
-
id: 'relay-child-request',
|
|
73
|
-
status: 'success',
|
|
74
|
-
updatedAt: '2026-01-01T00:02:00.000Z',
|
|
75
|
-
},
|
|
76
|
-
],
|
|
160
|
+
requests: requestId
|
|
161
|
+
? requests.filter((candidate) => candidate.id === requestId)
|
|
162
|
+
: requests,
|
|
77
163
|
}),
|
|
78
164
|
)
|
|
79
165
|
return
|
|
@@ -93,7 +179,7 @@ describe('createTracker', () => {
|
|
|
93
179
|
: {
|
|
94
180
|
blockNumber: '0x80',
|
|
95
181
|
logs: [
|
|
96
|
-
hash === sourceTransactionHash
|
|
182
|
+
hash === sourceTransactionHash || hash === newerSourceTransactionHash
|
|
97
183
|
? transferLog({
|
|
98
184
|
amount: 1_000_000n,
|
|
99
185
|
recipient: depositAddress,
|
|
@@ -114,7 +200,7 @@ describe('createTracker', () => {
|
|
|
114
200
|
})
|
|
115
201
|
|
|
116
202
|
try {
|
|
117
|
-
await
|
|
203
|
+
await RoutesCatalog.publish(db, {
|
|
118
204
|
chainTokens: [],
|
|
119
205
|
chains: [
|
|
120
206
|
{
|
|
@@ -138,6 +224,7 @@ describe('createTracker', () => {
|
|
|
138
224
|
tokens: [],
|
|
139
225
|
})
|
|
140
226
|
const messages: Provider.Webhook.receive.Dispatchable[] = []
|
|
227
|
+
const intervals: Observability.LifecycleInterval[] = []
|
|
141
228
|
const provider = Relay.relay({ apiKey: 'relay-api-key', baseUrl: server.url })
|
|
142
229
|
const tracker = Reconciliation.createTracker({
|
|
143
230
|
db,
|
|
@@ -147,6 +234,9 @@ describe('createTracker', () => {
|
|
|
147
234
|
metrics,
|
|
148
235
|
now: () => new Date('2027-01-01T00:00:00.000Z'),
|
|
149
236
|
providers: [provider],
|
|
237
|
+
recordLifecycleInterval: async (interval) => {
|
|
238
|
+
intervals.push(interval)
|
|
239
|
+
},
|
|
150
240
|
verifyTransfers: Evidence.createVerifier({
|
|
151
241
|
db,
|
|
152
242
|
}),
|
|
@@ -161,21 +251,34 @@ describe('createTracker', () => {
|
|
|
161
251
|
type: message.type,
|
|
162
252
|
}
|
|
163
253
|
const reconciliation = await tracker.reconcile(queuedBeforeAttribution)
|
|
254
|
+
expect(intervals).toEqual([
|
|
255
|
+
{
|
|
256
|
+
endedAt: '2026-01-01T00:01:00.000Z',
|
|
257
|
+
routesEnvironment: 'production',
|
|
258
|
+
method: 'deposit_address',
|
|
259
|
+
provider: 'relay',
|
|
260
|
+
resourceId: address.id,
|
|
261
|
+
stage: 'source_routes',
|
|
262
|
+
startedAt: '2026-01-01T00:00:00.000Z',
|
|
263
|
+
},
|
|
264
|
+
])
|
|
164
265
|
const duplicate = await tracker.reconcile(queuedBeforeAttribution)
|
|
165
|
-
|
|
266
|
+
expect(intervals).toHaveLength(1)
|
|
267
|
+
const [record] = await RoutesDeposits.listBySourceTransaction(db, {
|
|
166
268
|
depositAddressId: address.id,
|
|
167
269
|
sourceTransactionHash,
|
|
168
270
|
})
|
|
169
|
-
const observation = await
|
|
271
|
+
const observation = await RoutesDepositRequestObservations.get(db, {
|
|
170
272
|
depositAddressId: address.id,
|
|
171
273
|
providerRequestId: 'relay-child-request',
|
|
172
274
|
})
|
|
173
|
-
const storedAddress = await
|
|
275
|
+
const storedAddress = await RoutesDepositAddresses.get(db, address.id)
|
|
174
276
|
|
|
175
277
|
expect({
|
|
176
|
-
counts,
|
|
278
|
+
counts: counts.filter(([name]) => name !== 'routes_provider_operation_count'),
|
|
177
279
|
duplicate,
|
|
178
280
|
observation,
|
|
281
|
+
providerOperations: providerOperationCounts(counts),
|
|
179
282
|
reconciliation,
|
|
180
283
|
record,
|
|
181
284
|
storedAddress,
|
|
@@ -187,6 +290,7 @@ describe('createTracker', () => {
|
|
|
187
290
|
depositAddressId: expect.any(String),
|
|
188
291
|
id: expect.any(String),
|
|
189
292
|
snapshot: { depositAddressId: expect.any(String) },
|
|
293
|
+
statusUpdatedAt: expect.any(String),
|
|
190
294
|
updatedAt: expect.any(String),
|
|
191
295
|
},
|
|
192
296
|
observation: { depositAddressId: expect.any(String) },
|
|
@@ -194,13 +298,14 @@ describe('createTracker', () => {
|
|
|
194
298
|
id: expect.any(String),
|
|
195
299
|
providerOutputToken: expect.any(Object),
|
|
196
300
|
snapshot: expect.any(Object),
|
|
301
|
+
statusUpdatedAt: expect.any(String),
|
|
197
302
|
},
|
|
198
303
|
},
|
|
199
304
|
`
|
|
200
305
|
{
|
|
201
306
|
"counts": [
|
|
202
307
|
[
|
|
203
|
-
"
|
|
308
|
+
"routes_deposit_reconciliation_count",
|
|
204
309
|
1,
|
|
205
310
|
{
|
|
206
311
|
"outcome": "enqueued",
|
|
@@ -209,15 +314,67 @@ describe('createTracker', () => {
|
|
|
209
314
|
},
|
|
210
315
|
],
|
|
211
316
|
[
|
|
212
|
-
"
|
|
317
|
+
"routes_resource_transition_count",
|
|
318
|
+
1,
|
|
319
|
+
{
|
|
320
|
+
"from_status": "none",
|
|
321
|
+
"method": "deposit_address",
|
|
322
|
+
"provider": "relay",
|
|
323
|
+
"reason": "none",
|
|
324
|
+
"resource": "deposit",
|
|
325
|
+
"routes_environment": "production",
|
|
326
|
+
"to_status": "detected",
|
|
327
|
+
},
|
|
328
|
+
],
|
|
329
|
+
[
|
|
330
|
+
"routes_resource_transition_count",
|
|
331
|
+
1,
|
|
332
|
+
{
|
|
333
|
+
"from_status": "detected",
|
|
334
|
+
"method": "deposit_address",
|
|
335
|
+
"provider": "relay",
|
|
336
|
+
"reason": "none",
|
|
337
|
+
"resource": "deposit",
|
|
338
|
+
"routes_environment": "production",
|
|
339
|
+
"to_status": "bridging",
|
|
340
|
+
},
|
|
341
|
+
],
|
|
342
|
+
[
|
|
343
|
+
"routes_resource_transition_count",
|
|
344
|
+
1,
|
|
345
|
+
{
|
|
346
|
+
"from_status": "none",
|
|
347
|
+
"method": "deposit_address",
|
|
348
|
+
"provider": "relay",
|
|
349
|
+
"reason": "none",
|
|
350
|
+
"resource": "deposit",
|
|
351
|
+
"routes_environment": "production",
|
|
352
|
+
"to_status": "detected",
|
|
353
|
+
},
|
|
354
|
+
],
|
|
355
|
+
[
|
|
356
|
+
"routes_resource_transition_count",
|
|
213
357
|
1,
|
|
358
|
+
{
|
|
359
|
+
"from_status": "detected",
|
|
360
|
+
"method": "deposit_address",
|
|
361
|
+
"provider": "relay",
|
|
362
|
+
"reason": "none",
|
|
363
|
+
"resource": "deposit",
|
|
364
|
+
"routes_environment": "production",
|
|
365
|
+
"to_status": "bridging",
|
|
366
|
+
},
|
|
367
|
+
],
|
|
368
|
+
[
|
|
369
|
+
"routes_deposit_detection_count",
|
|
370
|
+
2,
|
|
214
371
|
{
|
|
215
372
|
"provider": "relay",
|
|
216
373
|
"trigger": "poll",
|
|
217
374
|
},
|
|
218
375
|
],
|
|
219
376
|
[
|
|
220
|
-
"
|
|
377
|
+
"routes_deposit_reconciliation_count",
|
|
221
378
|
1,
|
|
222
379
|
{
|
|
223
380
|
"outcome": "follow_up_enqueued",
|
|
@@ -226,7 +383,7 @@ describe('createTracker', () => {
|
|
|
226
383
|
},
|
|
227
384
|
],
|
|
228
385
|
[
|
|
229
|
-
"
|
|
386
|
+
"routes_deposit_reconciliation_count",
|
|
230
387
|
1,
|
|
231
388
|
{
|
|
232
389
|
"outcome": "completed",
|
|
@@ -244,10 +401,13 @@ describe('createTracker', () => {
|
|
|
244
401
|
"providerRequestId": "relay-child-request",
|
|
245
402
|
"webhookReceivedAt": null,
|
|
246
403
|
},
|
|
404
|
+
"providerOperations": {
|
|
405
|
+
"relay:listDepositAddressRequests:success": 1,
|
|
406
|
+
},
|
|
247
407
|
"reconciliation": {
|
|
248
|
-
"created":
|
|
408
|
+
"created": 2,
|
|
249
409
|
"type": "completed",
|
|
250
|
-
"updated":
|
|
410
|
+
"updated": 2,
|
|
251
411
|
},
|
|
252
412
|
"record": {
|
|
253
413
|
"createdAt": Any<String>,
|
|
@@ -258,6 +418,7 @@ describe('createTracker', () => {
|
|
|
258
418
|
"orgId": "org_reconciliation",
|
|
259
419
|
"pollObservedAt": "2027-01-01T00:00:00.000Z",
|
|
260
420
|
"projectId": null,
|
|
421
|
+
"providerDeliveredAt": null,
|
|
261
422
|
"providerOutputAmount": null,
|
|
262
423
|
"providerOutputToken": {
|
|
263
424
|
"address": "0x20c000000000000000000000b9537d11c60e8b50",
|
|
@@ -274,6 +435,7 @@ describe('createTracker', () => {
|
|
|
274
435
|
"relay-child-request",
|
|
275
436
|
],
|
|
276
437
|
"providerState": null,
|
|
438
|
+
"providerSubsidy": null,
|
|
277
439
|
"providerTransactionHashes": [],
|
|
278
440
|
"providerTransferIndex": 0,
|
|
279
441
|
"retryState": null,
|
|
@@ -336,7 +498,9 @@ describe('createTracker', () => {
|
|
|
336
498
|
"sourceTransferIndex": 0,
|
|
337
499
|
"status": "bridging",
|
|
338
500
|
"statusReason": null,
|
|
501
|
+
"statusUpdatedAt": Any<String>,
|
|
339
502
|
"subsidyAmount": null,
|
|
503
|
+
"subsidyMeterReportedAt": null,
|
|
340
504
|
"tempoGasPaid": null,
|
|
341
505
|
"updatedAt": Any<String>,
|
|
342
506
|
"version": 3,
|
|
@@ -344,8 +508,8 @@ describe('createTracker', () => {
|
|
|
344
508
|
},
|
|
345
509
|
"storedAddress": {
|
|
346
510
|
"address": "0x4444444444444444444444444444444444444444",
|
|
347
|
-
"apiKeyId": "key_reconciliation",
|
|
348
511
|
"createdAt": "2026-01-01T00:00:00.000Z",
|
|
512
|
+
"creatorUserId": null,
|
|
349
513
|
"deliveryStrategy": "provider",
|
|
350
514
|
"destinationTokenKey": "eip155:4217/erc20:0x20c000000000000000000000b9537d11c60e8b50",
|
|
351
515
|
"environment": "production",
|
|
@@ -363,12 +527,13 @@ describe('createTracker', () => {
|
|
|
363
527
|
"providerState": {
|
|
364
528
|
"reconciliation": {
|
|
365
529
|
"pendingRequestIds": [
|
|
530
|
+
"relay-newer-request",
|
|
366
531
|
"relay-child-request",
|
|
367
532
|
],
|
|
368
533
|
"requestIds": [
|
|
369
|
-
"relay-
|
|
534
|
+
"relay-newer-request",
|
|
370
535
|
],
|
|
371
|
-
"updatedAt": "2026-01-01T00:
|
|
536
|
+
"updatedAt": "2026-01-01T00:03:00.000Z",
|
|
372
537
|
},
|
|
373
538
|
},
|
|
374
539
|
"recipient": "0x1111111111111111111111111111111111111111",
|
|
@@ -377,6 +542,7 @@ describe('createTracker', () => {
|
|
|
377
542
|
"sourceChainId": "eip155:8453",
|
|
378
543
|
"sourceTokenKey": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
|
|
379
544
|
"status": "active",
|
|
545
|
+
"statusUpdatedAt": Any<String>,
|
|
380
546
|
"subsidize": false,
|
|
381
547
|
"updatedAt": "2026-01-01T00:00:00.000Z",
|
|
382
548
|
"version": 1,
|
|
@@ -394,12 +560,11 @@ describe('createTracker', () => {
|
|
|
394
560
|
})
|
|
395
561
|
|
|
396
562
|
test('completes an unsubsidized deposit at its verified provider output', async () => {
|
|
397
|
-
const route =
|
|
563
|
+
const route = TestRoutes.transferSnapshot()
|
|
398
564
|
const depositAddress = `0x${'45'.repeat(20)}`
|
|
399
565
|
const destinationTransactionHash = `0x${'cd'.repeat(32)}`
|
|
400
566
|
const sourceTransactionHash = `0x${'ab'.repeat(32)}`
|
|
401
567
|
const address = await DepositAddress.create(db, {
|
|
402
|
-
apiKeyId: 'key_unsubsidized_reconciliation',
|
|
403
568
|
deliveryStrategy: 'provider',
|
|
404
569
|
environment: 'production',
|
|
405
570
|
now: new Date('2026-01-06T00:00:00.000Z'),
|
|
@@ -446,7 +611,7 @@ describe('createTracker', () => {
|
|
|
446
611
|
})
|
|
447
612
|
|
|
448
613
|
try {
|
|
449
|
-
await
|
|
614
|
+
await RoutesCatalog.publish(db, {
|
|
450
615
|
chainTokens: [],
|
|
451
616
|
chains: [
|
|
452
617
|
{
|
|
@@ -483,7 +648,7 @@ describe('createTracker', () => {
|
|
|
483
648
|
trigger: 'manual',
|
|
484
649
|
verifyTransfers: Evidence.createVerifier({ db }),
|
|
485
650
|
})
|
|
486
|
-
const [record] = await
|
|
651
|
+
const [record] = await RoutesDeposits.listBySourceTransaction(db, {
|
|
487
652
|
depositAddressId: address.id,
|
|
488
653
|
sourceTransactionHash,
|
|
489
654
|
})
|
|
@@ -494,7 +659,9 @@ describe('createTracker', () => {
|
|
|
494
659
|
createdAt: expect.any(String),
|
|
495
660
|
depositAddressId: expect.any(String),
|
|
496
661
|
id: expect.any(String),
|
|
662
|
+
providerDeliveredAt: expect.any(String),
|
|
497
663
|
snapshot: { depositAddressId: expect.any(String) },
|
|
664
|
+
statusUpdatedAt: expect.any(String),
|
|
498
665
|
updatedAt: expect.any(String),
|
|
499
666
|
},
|
|
500
667
|
},
|
|
@@ -509,6 +676,7 @@ describe('createTracker', () => {
|
|
|
509
676
|
"orgId": "org_unsubsidized_reconciliation",
|
|
510
677
|
"pollObservedAt": null,
|
|
511
678
|
"projectId": null,
|
|
679
|
+
"providerDeliveredAt": Any<String>,
|
|
512
680
|
"providerOutputAmount": {
|
|
513
681
|
"baseUnits": "950000",
|
|
514
682
|
"currency": "USD",
|
|
@@ -530,6 +698,7 @@ describe('createTracker', () => {
|
|
|
530
698
|
"unsubsidized-request",
|
|
531
699
|
],
|
|
532
700
|
"providerState": null,
|
|
701
|
+
"providerSubsidy": null,
|
|
533
702
|
"providerTransactionHashes": [
|
|
534
703
|
"0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd",
|
|
535
704
|
],
|
|
@@ -608,7 +777,9 @@ describe('createTracker', () => {
|
|
|
608
777
|
"sourceTransferIndex": 0,
|
|
609
778
|
"status": "completed",
|
|
610
779
|
"statusReason": null,
|
|
780
|
+
"statusUpdatedAt": Any<String>,
|
|
611
781
|
"subsidyAmount": null,
|
|
782
|
+
"subsidyMeterReportedAt": null,
|
|
612
783
|
"tempoGasPaid": null,
|
|
613
784
|
"updatedAt": Any<String>,
|
|
614
785
|
"version": 3,
|
|
@@ -627,8 +798,290 @@ describe('createTracker', () => {
|
|
|
627
798
|
}
|
|
628
799
|
})
|
|
629
800
|
|
|
801
|
+
test('applies live subsidy policy and billing to new top-ups', async () => {
|
|
802
|
+
const route = TestRoutes.transferSnapshot()
|
|
803
|
+
const scenarios = [
|
|
804
|
+
{
|
|
805
|
+
billing: 'missing',
|
|
806
|
+
delivered: 950_000n,
|
|
807
|
+
maxAmount: null,
|
|
808
|
+
name: 'policy disabled',
|
|
809
|
+
},
|
|
810
|
+
{
|
|
811
|
+
billing: 'missing',
|
|
812
|
+
delivered: 950_000n,
|
|
813
|
+
maxAmount: '1',
|
|
814
|
+
name: 'billing required',
|
|
815
|
+
},
|
|
816
|
+
{
|
|
817
|
+
billing: 'past_due',
|
|
818
|
+
delivered: 950_000n,
|
|
819
|
+
maxAmount: '1',
|
|
820
|
+
name: 'billing past due',
|
|
821
|
+
},
|
|
822
|
+
{
|
|
823
|
+
billing: 'active',
|
|
824
|
+
delivered: 950_000n,
|
|
825
|
+
maxAmount: '0.049999',
|
|
826
|
+
name: 'limit exceeded',
|
|
827
|
+
},
|
|
828
|
+
{
|
|
829
|
+
billing: 'missing',
|
|
830
|
+
delivered: 1_000_000n,
|
|
831
|
+
maxAmount: null,
|
|
832
|
+
name: 'provider delivered in full',
|
|
833
|
+
},
|
|
834
|
+
] as const
|
|
835
|
+
const sourceTransactionHashes = new Set(
|
|
836
|
+
scenarios.map((_, index) => `0x${(index + 81).toString(16).repeat(32)}`),
|
|
837
|
+
)
|
|
838
|
+
const sourceRecipients = new Map<string, string>()
|
|
839
|
+
const destinationAmounts = new Map(
|
|
840
|
+
scenarios.map((scenario, index) => [
|
|
841
|
+
`0x${(index + 97).toString(16).repeat(32)}`,
|
|
842
|
+
scenario.delivered,
|
|
843
|
+
]),
|
|
844
|
+
)
|
|
845
|
+
const server = await TestRelay.createServer(async (request, response) => {
|
|
846
|
+
const chunks: Uint8Array[] = []
|
|
847
|
+
for await (const chunk of request) chunks.push(chunk)
|
|
848
|
+
const body = JSON.parse(NodeBuffer.Buffer.concat(chunks).toString()) as {
|
|
849
|
+
id: number
|
|
850
|
+
method: string
|
|
851
|
+
params?: readonly string[] | undefined
|
|
852
|
+
}
|
|
853
|
+
const hash = body.params?.[0]
|
|
854
|
+
const source = hash !== undefined && sourceTransactionHashes.has(hash)
|
|
855
|
+
const amount = source ? 1_000_000n : destinationAmounts.get(hash ?? '')
|
|
856
|
+
const result =
|
|
857
|
+
body.method === 'eth_blockNumber'
|
|
858
|
+
? '0x100'
|
|
859
|
+
: {
|
|
860
|
+
blockNumber: '0x80',
|
|
861
|
+
logs: [
|
|
862
|
+
transferLog({
|
|
863
|
+
amount: amount ?? 0n,
|
|
864
|
+
recipient: source ? (sourceRecipients.get(hash ?? '') ?? '') : route.recipient,
|
|
865
|
+
sender: `0x${'71'.repeat(20)}`,
|
|
866
|
+
token: source ? route.sourceToken.address : route.destinationToken.address,
|
|
867
|
+
}),
|
|
868
|
+
],
|
|
869
|
+
status: '0x1',
|
|
870
|
+
}
|
|
871
|
+
response.writeHead(200, { 'content-type': 'application/json' })
|
|
872
|
+
response.end(JSON.stringify({ id: body.id, jsonrpc: '2.0', result }))
|
|
873
|
+
})
|
|
874
|
+
|
|
875
|
+
try {
|
|
876
|
+
await RoutesCatalog.publish(db, {
|
|
877
|
+
chainTokens: [],
|
|
878
|
+
chains: [
|
|
879
|
+
{
|
|
880
|
+
aliases: [],
|
|
881
|
+
id: route.destinationChain.id as Chain.Id,
|
|
882
|
+
name: route.destinationChain.name,
|
|
883
|
+
parentChainId: null,
|
|
884
|
+
rpcUrls: [server.url],
|
|
885
|
+
slug: 'destination-subsidy-policy',
|
|
886
|
+
},
|
|
887
|
+
{
|
|
888
|
+
aliases: [],
|
|
889
|
+
id: route.sourceChain.id as Chain.Id,
|
|
890
|
+
name: route.sourceChain.name,
|
|
891
|
+
parentChainId: null,
|
|
892
|
+
rpcUrls: [server.url],
|
|
893
|
+
slug: 'source-subsidy-policy',
|
|
894
|
+
},
|
|
895
|
+
],
|
|
896
|
+
routes: [],
|
|
897
|
+
tokens: [],
|
|
898
|
+
})
|
|
899
|
+
const counts: Parameters<Metrics.Metrics['count']>[] = []
|
|
900
|
+
const metrics = Metrics.from({
|
|
901
|
+
count(...parameters) {
|
|
902
|
+
counts.push(parameters)
|
|
903
|
+
},
|
|
904
|
+
flush() {},
|
|
905
|
+
gauge() {},
|
|
906
|
+
histogram() {},
|
|
907
|
+
})
|
|
908
|
+
const records = []
|
|
909
|
+
for (const [index, scenario] of scenarios.entries()) {
|
|
910
|
+
const orgId = `org_subsidy_policy_${index}`
|
|
911
|
+
await Organizations.create(db, { id: orgId, name: scenario.name })
|
|
912
|
+
if (scenario.maxAmount !== null)
|
|
913
|
+
await RoutesSubsidies.upsertOrganization(db, {
|
|
914
|
+
frequency: 'tx',
|
|
915
|
+
maxAmount: scenario.maxAmount,
|
|
916
|
+
orgId,
|
|
917
|
+
})
|
|
918
|
+
if (scenario.billing !== 'missing') {
|
|
919
|
+
await StripeCustomers.create(db, {
|
|
920
|
+
orgId,
|
|
921
|
+
stripeCustomerId: `cus_subsidy_policy_${index}`,
|
|
922
|
+
})
|
|
923
|
+
await StripeCustomers.setStatus(db, orgId, scenario.billing)
|
|
924
|
+
}
|
|
925
|
+
const depositAddress = `0x${(index + 113).toString(16).repeat(20)}`
|
|
926
|
+
const address = await DepositAddress.create(db, {
|
|
927
|
+
deliveryStrategy: 'provider',
|
|
928
|
+
environment: 'production',
|
|
929
|
+
orgId,
|
|
930
|
+
providerOutputToken: route.destinationToken,
|
|
931
|
+
snapshot: {
|
|
932
|
+
address: depositAddress,
|
|
933
|
+
destinationChain: route.destinationChain,
|
|
934
|
+
destinationToken: route.destinationToken,
|
|
935
|
+
provider: { id: 'local', name: 'Local' },
|
|
936
|
+
recipient: route.recipient,
|
|
937
|
+
refundAddress: `0x${(index + 121).toString(16).repeat(20)}`,
|
|
938
|
+
sourceChain: route.sourceChain,
|
|
939
|
+
sourceToken: route.sourceToken,
|
|
940
|
+
subsidize: true,
|
|
941
|
+
},
|
|
942
|
+
})
|
|
943
|
+
const sourceTransactionHash = [...sourceTransactionHashes][index]!
|
|
944
|
+
sourceRecipients.set(sourceTransactionHash, depositAddress)
|
|
945
|
+
const destinationTransactionHash = [...destinationAmounts.keys()][index]!
|
|
946
|
+
const result = await Reconciliation.reconcileRequest(db, {
|
|
947
|
+
address,
|
|
948
|
+
metrics,
|
|
949
|
+
request: {
|
|
950
|
+
createdAt: '2026-01-06T00:01:00.000Z',
|
|
951
|
+
destinationTransactionHashes: [destinationTransactionHash],
|
|
952
|
+
id: `subsidy-policy-request-${index}`,
|
|
953
|
+
refundTransactionHashes: [],
|
|
954
|
+
sourceTransactionHashes: [sourceTransactionHash],
|
|
955
|
+
...(scenario.name === 'provider delivered in full'
|
|
956
|
+
? {
|
|
957
|
+
subsidy: {
|
|
958
|
+
amount: {
|
|
959
|
+
baseUnits: '23838',
|
|
960
|
+
currency: 'USD',
|
|
961
|
+
decimals: 6,
|
|
962
|
+
formatted: '0.023838',
|
|
963
|
+
},
|
|
964
|
+
provider: 'relay',
|
|
965
|
+
token: route.sourceToken,
|
|
966
|
+
},
|
|
967
|
+
}
|
|
968
|
+
: {}),
|
|
969
|
+
status: 'success',
|
|
970
|
+
updatedAt: '2026-01-06T00:02:00.000Z',
|
|
971
|
+
},
|
|
972
|
+
trigger: 'manual',
|
|
973
|
+
verifyTransfers: Evidence.createVerifier({ db }),
|
|
974
|
+
})
|
|
975
|
+
const [record] = await RoutesDeposits.listBySourceTransaction(db, {
|
|
976
|
+
depositAddressId: address.id,
|
|
977
|
+
sourceTransactionHash,
|
|
978
|
+
})
|
|
979
|
+
records.push({
|
|
980
|
+
name: scenario.name,
|
|
981
|
+
status: record?.status,
|
|
982
|
+
statusReason: record?.statusReason,
|
|
983
|
+
subsidies: record ? RoutesDeposits.subsidies(record) : [],
|
|
984
|
+
subsidyAmount: record?.subsidyAmount?.baseUnits ?? null,
|
|
985
|
+
terminal: result.terminal,
|
|
986
|
+
})
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
expect({
|
|
990
|
+
outcomes: counts
|
|
991
|
+
.filter(([name]) => name === 'routes_deposit_subsidy_count')
|
|
992
|
+
.map(([, , tags]) => tags?.['outcome']),
|
|
993
|
+
records,
|
|
994
|
+
}).toMatchInlineSnapshot(`
|
|
995
|
+
{
|
|
996
|
+
"outcomes": [
|
|
997
|
+
"routes_subsidy_not_enabled",
|
|
998
|
+
"billing_required",
|
|
999
|
+
"billing_past_due",
|
|
1000
|
+
"routes_subsidy_limit_exceeded",
|
|
1001
|
+
],
|
|
1002
|
+
"records": [
|
|
1003
|
+
{
|
|
1004
|
+
"name": "policy disabled",
|
|
1005
|
+
"status": "action-required",
|
|
1006
|
+
"statusReason": {
|
|
1007
|
+
"code": "routes_subsidy_not_enabled",
|
|
1008
|
+
"message": "Routes subsidies are not enabled for this organization.",
|
|
1009
|
+
},
|
|
1010
|
+
"subsidies": [],
|
|
1011
|
+
"subsidyAmount": null,
|
|
1012
|
+
"terminal": false,
|
|
1013
|
+
},
|
|
1014
|
+
{
|
|
1015
|
+
"name": "billing required",
|
|
1016
|
+
"status": "action-required",
|
|
1017
|
+
"statusReason": {
|
|
1018
|
+
"code": "billing_required",
|
|
1019
|
+
"message": "Billing required.",
|
|
1020
|
+
},
|
|
1021
|
+
"subsidies": [],
|
|
1022
|
+
"subsidyAmount": null,
|
|
1023
|
+
"terminal": false,
|
|
1024
|
+
},
|
|
1025
|
+
{
|
|
1026
|
+
"name": "billing past due",
|
|
1027
|
+
"status": "action-required",
|
|
1028
|
+
"statusReason": {
|
|
1029
|
+
"code": "billing_past_due",
|
|
1030
|
+
"message": "Billing past due.",
|
|
1031
|
+
},
|
|
1032
|
+
"subsidies": [],
|
|
1033
|
+
"subsidyAmount": null,
|
|
1034
|
+
"terminal": false,
|
|
1035
|
+
},
|
|
1036
|
+
{
|
|
1037
|
+
"name": "limit exceeded",
|
|
1038
|
+
"status": "action-required",
|
|
1039
|
+
"statusReason": {
|
|
1040
|
+
"code": "routes_subsidy_limit_exceeded",
|
|
1041
|
+
"message": "The required subsidy exceeds the per-transaction limit.",
|
|
1042
|
+
},
|
|
1043
|
+
"subsidies": [],
|
|
1044
|
+
"subsidyAmount": null,
|
|
1045
|
+
"terminal": false,
|
|
1046
|
+
},
|
|
1047
|
+
{
|
|
1048
|
+
"name": "provider delivered in full",
|
|
1049
|
+
"status": "completed",
|
|
1050
|
+
"statusReason": null,
|
|
1051
|
+
"subsidies": [
|
|
1052
|
+
{
|
|
1053
|
+
"amount": {
|
|
1054
|
+
"baseUnits": "23838",
|
|
1055
|
+
"currency": "USD",
|
|
1056
|
+
"decimals": 6,
|
|
1057
|
+
"formatted": "0.023838",
|
|
1058
|
+
},
|
|
1059
|
+
"provider": "relay",
|
|
1060
|
+
"token": {
|
|
1061
|
+
"address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
|
|
1062
|
+
"currency": "USD",
|
|
1063
|
+
"decimals": 6,
|
|
1064
|
+
"name": "USD Coin",
|
|
1065
|
+
"standard": "ERC-20",
|
|
1066
|
+
"symbol": "USDC",
|
|
1067
|
+
"tokenKey": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
|
|
1068
|
+
"verified": true,
|
|
1069
|
+
},
|
|
1070
|
+
},
|
|
1071
|
+
],
|
|
1072
|
+
"subsidyAmount": null,
|
|
1073
|
+
"terminal": true,
|
|
1074
|
+
},
|
|
1075
|
+
],
|
|
1076
|
+
}
|
|
1077
|
+
`)
|
|
1078
|
+
} finally {
|
|
1079
|
+
await server.closeAsync()
|
|
1080
|
+
}
|
|
1081
|
+
})
|
|
1082
|
+
|
|
630
1083
|
test('verifies Relay refunds on the source chain before completing recovery', async () => {
|
|
631
|
-
const route =
|
|
1084
|
+
const route = TestRoutes.transferSnapshot()
|
|
632
1085
|
const depositAddress = `0x${'48'.repeat(20)}`
|
|
633
1086
|
const firstRefundTransactionHash = `0x${'ce'.repeat(32)}`
|
|
634
1087
|
const refundAddress = `0x${'49'.repeat(20)}`
|
|
@@ -636,7 +1089,6 @@ describe('createTracker', () => {
|
|
|
636
1089
|
const settlementTransactionHash = `0x${'cf'.repeat(32)}`
|
|
637
1090
|
const sourceTransactionHash = `0x${'ac'.repeat(32)}`
|
|
638
1091
|
const address = await DepositAddress.create(db, {
|
|
639
|
-
apiKeyId: 'key_refund_reconciliation',
|
|
640
1092
|
deliveryStrategy: 'provider',
|
|
641
1093
|
environment: 'production',
|
|
642
1094
|
now: new Date('2026-01-07T00:00:00.000Z'),
|
|
@@ -738,7 +1190,7 @@ describe('createTracker', () => {
|
|
|
738
1190
|
})
|
|
739
1191
|
|
|
740
1192
|
try {
|
|
741
|
-
await
|
|
1193
|
+
await RoutesCatalog.publish(db, {
|
|
742
1194
|
chainTokens: [],
|
|
743
1195
|
chains: [
|
|
744
1196
|
{
|
|
@@ -778,7 +1230,7 @@ describe('createTracker', () => {
|
|
|
778
1230
|
request,
|
|
779
1231
|
verifyTransfers,
|
|
780
1232
|
})
|
|
781
|
-
const [firstRecord] = await
|
|
1233
|
+
const [firstRecord] = await RoutesDeposits.listBySourceTransaction(db, {
|
|
782
1234
|
depositAddressId: address.id,
|
|
783
1235
|
sourceTransactionHash,
|
|
784
1236
|
})
|
|
@@ -797,13 +1249,13 @@ describe('createTracker', () => {
|
|
|
797
1249
|
request,
|
|
798
1250
|
verifyTransfers,
|
|
799
1251
|
})
|
|
800
|
-
const [record] = await
|
|
1252
|
+
const [record] = await RoutesDeposits.listBySourceTransaction(db, {
|
|
801
1253
|
depositAddressId: address.id,
|
|
802
1254
|
sourceTransactionHash,
|
|
803
1255
|
})
|
|
804
|
-
if (!firstRecord || !record) throw new Error('Expected reconciled
|
|
1256
|
+
if (!firstRecord || !record) throw new Error('Expected reconciled route deposits.')
|
|
805
1257
|
|
|
806
|
-
expect(depositUpdateVersions).toEqual([2,
|
|
1258
|
+
expect(depositUpdateVersions).toEqual([2, 3, 4])
|
|
807
1259
|
|
|
808
1260
|
expect({
|
|
809
1261
|
counts,
|
|
@@ -820,6 +1272,7 @@ describe('createTracker', () => {
|
|
|
820
1272
|
depositAddressId: expect.any(String),
|
|
821
1273
|
id: expect.any(String),
|
|
822
1274
|
snapshot: { depositAddressId: expect.any(String) },
|
|
1275
|
+
statusUpdatedAt: expect.any(String),
|
|
823
1276
|
updatedAt: expect.any(String),
|
|
824
1277
|
},
|
|
825
1278
|
record: {
|
|
@@ -827,6 +1280,7 @@ describe('createTracker', () => {
|
|
|
827
1280
|
depositAddressId: expect.any(String),
|
|
828
1281
|
id: expect.any(String),
|
|
829
1282
|
snapshot: { depositAddressId: expect.any(String) },
|
|
1283
|
+
statusUpdatedAt: expect.any(String),
|
|
830
1284
|
updatedAt: expect.any(String),
|
|
831
1285
|
},
|
|
832
1286
|
},
|
|
@@ -834,7 +1288,46 @@ describe('createTracker', () => {
|
|
|
834
1288
|
{
|
|
835
1289
|
"counts": [
|
|
836
1290
|
[
|
|
837
|
-
"
|
|
1291
|
+
"routes_resource_transition_count",
|
|
1292
|
+
1,
|
|
1293
|
+
{
|
|
1294
|
+
"from_status": "none",
|
|
1295
|
+
"method": "deposit_address",
|
|
1296
|
+
"provider": "relay",
|
|
1297
|
+
"reason": "none",
|
|
1298
|
+
"resource": "deposit",
|
|
1299
|
+
"routes_environment": "production",
|
|
1300
|
+
"to_status": "detected",
|
|
1301
|
+
},
|
|
1302
|
+
],
|
|
1303
|
+
[
|
|
1304
|
+
"routes_resource_transition_count",
|
|
1305
|
+
1,
|
|
1306
|
+
{
|
|
1307
|
+
"from_status": "detected",
|
|
1308
|
+
"method": "deposit_address",
|
|
1309
|
+
"provider": "relay",
|
|
1310
|
+
"reason": "none",
|
|
1311
|
+
"resource": "deposit",
|
|
1312
|
+
"routes_environment": "production",
|
|
1313
|
+
"to_status": "bridging",
|
|
1314
|
+
},
|
|
1315
|
+
],
|
|
1316
|
+
[
|
|
1317
|
+
"routes_resource_transition_count",
|
|
1318
|
+
1,
|
|
1319
|
+
{
|
|
1320
|
+
"from_status": "bridging",
|
|
1321
|
+
"method": "deposit_address",
|
|
1322
|
+
"provider": "relay",
|
|
1323
|
+
"reason": "none",
|
|
1324
|
+
"resource": "deposit",
|
|
1325
|
+
"routes_environment": "production",
|
|
1326
|
+
"to_status": "refunding",
|
|
1327
|
+
},
|
|
1328
|
+
],
|
|
1329
|
+
[
|
|
1330
|
+
"routes_deposit_refund_count",
|
|
838
1331
|
1,
|
|
839
1332
|
{
|
|
840
1333
|
"outcome": "pending",
|
|
@@ -842,7 +1335,20 @@ describe('createTracker', () => {
|
|
|
842
1335
|
},
|
|
843
1336
|
],
|
|
844
1337
|
[
|
|
845
|
-
"
|
|
1338
|
+
"routes_resource_transition_count",
|
|
1339
|
+
1,
|
|
1340
|
+
{
|
|
1341
|
+
"from_status": "refunding",
|
|
1342
|
+
"method": "deposit_address",
|
|
1343
|
+
"provider": "relay",
|
|
1344
|
+
"reason": "none",
|
|
1345
|
+
"resource": "deposit",
|
|
1346
|
+
"routes_environment": "production",
|
|
1347
|
+
"to_status": "refunded",
|
|
1348
|
+
},
|
|
1349
|
+
],
|
|
1350
|
+
[
|
|
1351
|
+
"routes_deposit_refund_count",
|
|
846
1352
|
1,
|
|
847
1353
|
{
|
|
848
1354
|
"outcome": "verified",
|
|
@@ -870,6 +1376,7 @@ describe('createTracker', () => {
|
|
|
870
1376
|
"orgId": "org_refund_reconciliation",
|
|
871
1377
|
"pollObservedAt": null,
|
|
872
1378
|
"projectId": null,
|
|
1379
|
+
"providerDeliveredAt": null,
|
|
873
1380
|
"providerOutputAmount": null,
|
|
874
1381
|
"providerOutputToken": {
|
|
875
1382
|
"address": "0x20c000000000000000000000b9537d11c60e8b50",
|
|
@@ -886,6 +1393,7 @@ describe('createTracker', () => {
|
|
|
886
1393
|
"relay-refund-request",
|
|
887
1394
|
],
|
|
888
1395
|
"providerState": null,
|
|
1396
|
+
"providerSubsidy": null,
|
|
889
1397
|
"providerTransactionHashes": [
|
|
890
1398
|
"0xcececececececececececececececececececececececececececececececece",
|
|
891
1399
|
"0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd",
|
|
@@ -951,7 +1459,9 @@ describe('createTracker', () => {
|
|
|
951
1459
|
"sourceTransferIndex": 0,
|
|
952
1460
|
"status": "refunding",
|
|
953
1461
|
"statusReason": null,
|
|
1462
|
+
"statusUpdatedAt": Any<String>,
|
|
954
1463
|
"subsidyAmount": null,
|
|
1464
|
+
"subsidyMeterReportedAt": null,
|
|
955
1465
|
"tempoGasPaid": null,
|
|
956
1466
|
"updatedAt": Any<String>,
|
|
957
1467
|
"version": 3,
|
|
@@ -966,6 +1476,7 @@ describe('createTracker', () => {
|
|
|
966
1476
|
"orgId": "org_refund_reconciliation",
|
|
967
1477
|
"pollObservedAt": null,
|
|
968
1478
|
"projectId": null,
|
|
1479
|
+
"providerDeliveredAt": null,
|
|
969
1480
|
"providerOutputAmount": null,
|
|
970
1481
|
"providerOutputToken": {
|
|
971
1482
|
"address": "0x20c000000000000000000000b9537d11c60e8b50",
|
|
@@ -982,6 +1493,7 @@ describe('createTracker', () => {
|
|
|
982
1493
|
"relay-refund-request",
|
|
983
1494
|
],
|
|
984
1495
|
"providerState": null,
|
|
1496
|
+
"providerSubsidy": null,
|
|
985
1497
|
"providerTransactionHashes": [
|
|
986
1498
|
"0xcececececececececececececececececececececececececececececececece",
|
|
987
1499
|
"0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd",
|
|
@@ -1057,10 +1569,12 @@ describe('createTracker', () => {
|
|
|
1057
1569
|
"sourceTransferIndex": 0,
|
|
1058
1570
|
"status": "refunded",
|
|
1059
1571
|
"statusReason": null,
|
|
1572
|
+
"statusUpdatedAt": Any<String>,
|
|
1060
1573
|
"subsidyAmount": null,
|
|
1574
|
+
"subsidyMeterReportedAt": null,
|
|
1061
1575
|
"tempoGasPaid": null,
|
|
1062
1576
|
"updatedAt": Any<String>,
|
|
1063
|
-
"version":
|
|
1577
|
+
"version": 4,
|
|
1064
1578
|
"webhookReceivedAt": null,
|
|
1065
1579
|
},
|
|
1066
1580
|
"request": {
|
|
@@ -1094,13 +1608,12 @@ describe('createTracker', () => {
|
|
|
1094
1608
|
})
|
|
1095
1609
|
|
|
1096
1610
|
test('preserves refund allocations when retrying a partially committed request', async () => {
|
|
1097
|
-
const route =
|
|
1611
|
+
const route = TestRoutes.transferSnapshot()
|
|
1098
1612
|
const depositAddress = `0x${'50'.repeat(20)}`
|
|
1099
1613
|
const refundAddress = `0x${'51'.repeat(20)}`
|
|
1100
1614
|
const refundTransactionHash = `0x${'d0'.repeat(32)}`
|
|
1101
1615
|
const sourceTransactionHash = `0x${'b0'.repeat(32)}`
|
|
1102
1616
|
const address = await DepositAddress.create(db, {
|
|
1103
|
-
apiKeyId: 'key_refund_retry',
|
|
1104
1617
|
deliveryStrategy: 'provider',
|
|
1105
1618
|
environment: 'production',
|
|
1106
1619
|
now: new Date('2026-01-09T00:00:00.000Z'),
|
|
@@ -1119,7 +1632,7 @@ describe('createTracker', () => {
|
|
|
1119
1632
|
},
|
|
1120
1633
|
})
|
|
1121
1634
|
const first = await Deposit.create(db, {
|
|
1122
|
-
id: '
|
|
1635
|
+
id: 'rdp_refund_retry_0',
|
|
1123
1636
|
now: new Date('2026-01-09T00:01:00.000Z'),
|
|
1124
1637
|
providerRequestId: 'relay-refund-retry-request',
|
|
1125
1638
|
providerTransferIndex: 0,
|
|
@@ -1144,7 +1657,7 @@ describe('createTracker', () => {
|
|
|
1144
1657
|
sourceTransferIndex: 0,
|
|
1145
1658
|
})
|
|
1146
1659
|
await Deposit.create(db, {
|
|
1147
|
-
id: '
|
|
1660
|
+
id: 'rdp_refund_retry_1',
|
|
1148
1661
|
now: new Date('2026-01-09T00:01:01.000Z'),
|
|
1149
1662
|
providerRequestId: 'relay-refund-retry-request',
|
|
1150
1663
|
providerTransferIndex: 1,
|
|
@@ -1242,7 +1755,7 @@ describe('createTracker', () => {
|
|
|
1242
1755
|
})
|
|
1243
1756
|
|
|
1244
1757
|
try {
|
|
1245
|
-
await
|
|
1758
|
+
await RoutesCatalog.publish(db, {
|
|
1246
1759
|
chainTokens: [],
|
|
1247
1760
|
chains: [
|
|
1248
1761
|
{
|
|
@@ -1279,7 +1792,7 @@ describe('createTracker', () => {
|
|
|
1279
1792
|
verifyTransfers: Evidence.createVerifier({ db }),
|
|
1280
1793
|
})
|
|
1281
1794
|
const records = (
|
|
1282
|
-
await
|
|
1795
|
+
await RoutesDeposits.listBySourceTransaction(db, {
|
|
1283
1796
|
depositAddressId: address.id,
|
|
1284
1797
|
sourceTransactionHash,
|
|
1285
1798
|
})
|
|
@@ -1314,7 +1827,7 @@ describe('createTracker', () => {
|
|
|
1314
1827
|
"tokenKey": "eip155:4217/erc20:0x20c000000000000000000000b9537d11c60e8b50",
|
|
1315
1828
|
"verified": true,
|
|
1316
1829
|
},
|
|
1317
|
-
"id": "
|
|
1830
|
+
"id": "rdp_refund_retry_0",
|
|
1318
1831
|
"provider": {
|
|
1319
1832
|
"id": "relay",
|
|
1320
1833
|
"name": "Relay",
|
|
@@ -1378,7 +1891,7 @@ describe('createTracker', () => {
|
|
|
1378
1891
|
"tokenKey": "eip155:4217/erc20:0x20c000000000000000000000b9537d11c60e8b50",
|
|
1379
1892
|
"verified": true,
|
|
1380
1893
|
},
|
|
1381
|
-
"id": "
|
|
1894
|
+
"id": "rdp_refund_retry_1",
|
|
1382
1895
|
"provider": {
|
|
1383
1896
|
"id": "relay",
|
|
1384
1897
|
"name": "Relay",
|
|
@@ -1439,12 +1952,11 @@ describe('createTracker', () => {
|
|
|
1439
1952
|
})
|
|
1440
1953
|
|
|
1441
1954
|
test('reconciles destination evidence reported with a Relay failure', async () => {
|
|
1442
|
-
const route =
|
|
1955
|
+
const route = TestRoutes.transferSnapshot()
|
|
1443
1956
|
const depositAddress = `0x${'56'.repeat(20)}`
|
|
1444
1957
|
const destinationTransactionHash = `0x${'d1'.repeat(32)}`
|
|
1445
1958
|
const sourceTransactionHash = `0x${'b1'.repeat(32)}`
|
|
1446
1959
|
const address = await DepositAddress.create(db, {
|
|
1447
|
-
apiKeyId: 'key_failure_delivery',
|
|
1448
1960
|
deliveryStrategy: 'provider',
|
|
1449
1961
|
environment: 'production',
|
|
1450
1962
|
now: new Date('2026-01-10T00:00:00.000Z'),
|
|
@@ -1504,7 +2016,7 @@ describe('createTracker', () => {
|
|
|
1504
2016
|
})
|
|
1505
2017
|
|
|
1506
2018
|
try {
|
|
1507
|
-
await
|
|
2019
|
+
await RoutesCatalog.publish(db, {
|
|
1508
2020
|
chainTokens: [],
|
|
1509
2021
|
chains: [
|
|
1510
2022
|
{
|
|
@@ -1540,7 +2052,7 @@ describe('createTracker', () => {
|
|
|
1540
2052
|
},
|
|
1541
2053
|
verifyTransfers: Evidence.createVerifier({ db }),
|
|
1542
2054
|
})
|
|
1543
|
-
const [record] = await
|
|
2055
|
+
const [record] = await RoutesDeposits.listBySourceTransaction(db, {
|
|
1544
2056
|
depositAddressId: address.id,
|
|
1545
2057
|
sourceTransactionHash,
|
|
1546
2058
|
})
|
|
@@ -1643,12 +2155,11 @@ describe('createTracker', () => {
|
|
|
1643
2155
|
})
|
|
1644
2156
|
|
|
1645
2157
|
test('keeps Relay failures with unverified destination transactions pending for recovery', async () => {
|
|
1646
|
-
const route =
|
|
2158
|
+
const route = TestRoutes.transferSnapshot()
|
|
1647
2159
|
const depositAddress = `0x${'4d'.repeat(20)}`
|
|
1648
2160
|
const sourceTransactionHash = `0x${'ad'.repeat(32)}`
|
|
1649
2161
|
const unrelatedDestinationTransactionHash = `0x${'d2'.repeat(32)}`
|
|
1650
2162
|
const address = await DepositAddress.create(db, {
|
|
1651
|
-
apiKeyId: 'key_failed_reconciliation',
|
|
1652
2163
|
deliveryStrategy: 'provider',
|
|
1653
2164
|
environment: 'production',
|
|
1654
2165
|
now: new Date('2026-01-08T00:00:00.000Z'),
|
|
@@ -1702,7 +2213,7 @@ describe('createTracker', () => {
|
|
|
1702
2213
|
})
|
|
1703
2214
|
|
|
1704
2215
|
try {
|
|
1705
|
-
await
|
|
2216
|
+
await RoutesCatalog.publish(db, {
|
|
1706
2217
|
chainTokens: [],
|
|
1707
2218
|
chains: [
|
|
1708
2219
|
{
|
|
@@ -1739,7 +2250,7 @@ describe('createTracker', () => {
|
|
|
1739
2250
|
},
|
|
1740
2251
|
verifyTransfers: Evidence.createVerifier({ db }),
|
|
1741
2252
|
})
|
|
1742
|
-
const [record] = await
|
|
2253
|
+
const [record] = await RoutesDeposits.listBySourceTransaction(db, {
|
|
1743
2254
|
depositAddressId: address.id,
|
|
1744
2255
|
sourceTransactionHash,
|
|
1745
2256
|
})
|
|
@@ -1751,6 +2262,7 @@ describe('createTracker', () => {
|
|
|
1751
2262
|
depositAddressId: expect.any(String),
|
|
1752
2263
|
id: expect.any(String),
|
|
1753
2264
|
snapshot: { depositAddressId: expect.any(String) },
|
|
2265
|
+
statusUpdatedAt: expect.any(String),
|
|
1754
2266
|
updatedAt: expect.any(String),
|
|
1755
2267
|
},
|
|
1756
2268
|
},
|
|
@@ -1758,7 +2270,46 @@ describe('createTracker', () => {
|
|
|
1758
2270
|
{
|
|
1759
2271
|
"counts": [
|
|
1760
2272
|
[
|
|
1761
|
-
"
|
|
2273
|
+
"routes_resource_transition_count",
|
|
2274
|
+
1,
|
|
2275
|
+
{
|
|
2276
|
+
"from_status": "none",
|
|
2277
|
+
"method": "deposit_address",
|
|
2278
|
+
"provider": "relay",
|
|
2279
|
+
"reason": "none",
|
|
2280
|
+
"resource": "deposit",
|
|
2281
|
+
"routes_environment": "production",
|
|
2282
|
+
"to_status": "detected",
|
|
2283
|
+
},
|
|
2284
|
+
],
|
|
2285
|
+
[
|
|
2286
|
+
"routes_resource_transition_count",
|
|
2287
|
+
1,
|
|
2288
|
+
{
|
|
2289
|
+
"from_status": "detected",
|
|
2290
|
+
"method": "deposit_address",
|
|
2291
|
+
"provider": "relay",
|
|
2292
|
+
"reason": "none",
|
|
2293
|
+
"resource": "deposit",
|
|
2294
|
+
"routes_environment": "production",
|
|
2295
|
+
"to_status": "bridging",
|
|
2296
|
+
},
|
|
2297
|
+
],
|
|
2298
|
+
[
|
|
2299
|
+
"routes_resource_transition_count",
|
|
2300
|
+
1,
|
|
2301
|
+
{
|
|
2302
|
+
"from_status": "bridging",
|
|
2303
|
+
"method": "deposit_address",
|
|
2304
|
+
"provider": "relay",
|
|
2305
|
+
"reason": "none",
|
|
2306
|
+
"resource": "deposit",
|
|
2307
|
+
"routes_environment": "production",
|
|
2308
|
+
"to_status": "refunding",
|
|
2309
|
+
},
|
|
2310
|
+
],
|
|
2311
|
+
[
|
|
2312
|
+
"routes_deposit_refund_count",
|
|
1762
2313
|
1,
|
|
1763
2314
|
{
|
|
1764
2315
|
"outcome": "provider_failed",
|
|
@@ -1775,6 +2326,7 @@ describe('createTracker', () => {
|
|
|
1775
2326
|
"orgId": "org_failed_reconciliation",
|
|
1776
2327
|
"pollObservedAt": null,
|
|
1777
2328
|
"projectId": null,
|
|
2329
|
+
"providerDeliveredAt": null,
|
|
1778
2330
|
"providerOutputAmount": null,
|
|
1779
2331
|
"providerOutputToken": {
|
|
1780
2332
|
"address": "0x20c000000000000000000000b9537d11c60e8b50",
|
|
@@ -1791,6 +2343,7 @@ describe('createTracker', () => {
|
|
|
1791
2343
|
"relay-failed-request",
|
|
1792
2344
|
],
|
|
1793
2345
|
"providerState": null,
|
|
2346
|
+
"providerSubsidy": null,
|
|
1794
2347
|
"providerTransactionHashes": [],
|
|
1795
2348
|
"providerTransferIndex": 0,
|
|
1796
2349
|
"retryState": null,
|
|
@@ -1852,7 +2405,9 @@ describe('createTracker', () => {
|
|
|
1852
2405
|
"sourceTransferIndex": 0,
|
|
1853
2406
|
"status": "refunding",
|
|
1854
2407
|
"statusReason": null,
|
|
2408
|
+
"statusUpdatedAt": Any<String>,
|
|
1855
2409
|
"subsidyAmount": null,
|
|
2410
|
+
"subsidyMeterReportedAt": null,
|
|
1856
2411
|
"tempoGasPaid": null,
|
|
1857
2412
|
"updatedAt": Any<String>,
|
|
1858
2413
|
"version": 3,
|
|
@@ -1873,11 +2428,10 @@ describe('createTracker', () => {
|
|
|
1873
2428
|
})
|
|
1874
2429
|
|
|
1875
2430
|
test('persists a detected deposit before source verification succeeds', async () => {
|
|
1876
|
-
const route =
|
|
2431
|
+
const route = TestRoutes.transferSnapshot()
|
|
1877
2432
|
const depositAddress = `0x${'20'.repeat(20)}`
|
|
1878
2433
|
const sourceTransactionHash = `0x${'21'.repeat(32)}`
|
|
1879
2434
|
const address = await DepositAddress.create(db, {
|
|
1880
|
-
apiKeyId: 'key_observed_reconciliation',
|
|
1881
2435
|
deliveryStrategy: 'provider',
|
|
1882
2436
|
environment: 'production',
|
|
1883
2437
|
now: new Date('2026-01-04T00:00:00.000Z'),
|
|
@@ -1928,7 +2482,7 @@ describe('createTracker', () => {
|
|
|
1928
2482
|
})
|
|
1929
2483
|
|
|
1930
2484
|
try {
|
|
1931
|
-
await
|
|
2485
|
+
await RoutesCatalog.publish(db, {
|
|
1932
2486
|
chainTokens: [],
|
|
1933
2487
|
chains: [
|
|
1934
2488
|
{
|
|
@@ -1968,14 +2522,14 @@ describe('createTracker', () => {
|
|
|
1968
2522
|
await tracker
|
|
1969
2523
|
.reconcile({
|
|
1970
2524
|
addressId: address.id,
|
|
1971
|
-
type: '
|
|
2525
|
+
type: 'routes:deposit-address:reconcile',
|
|
1972
2526
|
})
|
|
1973
2527
|
.then(
|
|
1974
2528
|
() => false,
|
|
1975
2529
|
() => true,
|
|
1976
2530
|
),
|
|
1977
2531
|
)
|
|
1978
|
-
const records = await
|
|
2532
|
+
const records = await RoutesDeposits.listByAddress(
|
|
1979
2533
|
db,
|
|
1980
2534
|
{ environment: 'production', orgId: 'org_observed_reconciliation' },
|
|
1981
2535
|
address.id,
|
|
@@ -2061,12 +2615,11 @@ describe('createTracker', () => {
|
|
|
2061
2615
|
})
|
|
2062
2616
|
|
|
2063
2617
|
test('rechecks pending Relay requests by id until delivery is verified', async () => {
|
|
2064
|
-
const route =
|
|
2618
|
+
const route = TestRoutes.transferSnapshot()
|
|
2065
2619
|
const depositAddress = `0x${'88'.repeat(20)}`
|
|
2066
2620
|
const sourceTransactionHash = `0x${'cc'.repeat(32)}`
|
|
2067
2621
|
const destinationTransactionHash = `0x${'dd'.repeat(32)}`
|
|
2068
2622
|
const address = await DepositAddress.create(db, {
|
|
2069
|
-
apiKeyId: 'key_pending_reconciliation',
|
|
2070
2623
|
deliveryStrategy: 'provider',
|
|
2071
2624
|
environment: 'production',
|
|
2072
2625
|
now: new Date('2026-01-02T00:00:00.000Z'),
|
|
@@ -2173,7 +2726,7 @@ describe('createTracker', () => {
|
|
|
2173
2726
|
})
|
|
2174
2727
|
|
|
2175
2728
|
try {
|
|
2176
|
-
await
|
|
2729
|
+
await RoutesCatalog.publish(db, {
|
|
2177
2730
|
chainTokens: [],
|
|
2178
2731
|
chains: [
|
|
2179
2732
|
{
|
|
@@ -2217,7 +2770,7 @@ describe('createTracker', () => {
|
|
|
2217
2770
|
addressId: address.id,
|
|
2218
2771
|
requestId: 'relay-pending-request',
|
|
2219
2772
|
trigger: 'webhook',
|
|
2220
|
-
type: '
|
|
2773
|
+
type: 'routes:deposit-address:reconcile',
|
|
2221
2774
|
webhookTiming: {
|
|
2222
2775
|
enqueuedAt: '2026-01-02T00:03:07.000Z',
|
|
2223
2776
|
providerStatus: 'pending',
|
|
@@ -2233,10 +2786,13 @@ describe('createTracker', () => {
|
|
|
2233
2786
|
const [firstFollowUp] = dispatches
|
|
2234
2787
|
if (!firstFollowUp) throw new Error('Expected a provider follow-up message.')
|
|
2235
2788
|
indexed = true
|
|
2236
|
-
const pendingFollowUp = await tracker.reconcile(
|
|
2789
|
+
const pendingFollowUp = await tracker.reconcile({
|
|
2790
|
+
...firstFollowUp[0],
|
|
2791
|
+
followUp: { attempt: 6, kind: 'provider' },
|
|
2792
|
+
})
|
|
2237
2793
|
const exhausted = await tracker.reconcile({
|
|
2238
2794
|
...firstFollowUp[0],
|
|
2239
|
-
followUp: { attempt:
|
|
2795
|
+
followUp: { attempt: 23, kind: 'provider' },
|
|
2240
2796
|
})
|
|
2241
2797
|
const [, secondFollowUp] = dispatches
|
|
2242
2798
|
if (!secondFollowUp) throw new Error('Expected a second provider follow-up message.')
|
|
@@ -2249,7 +2805,7 @@ describe('createTracker', () => {
|
|
|
2249
2805
|
const replay = await tracker.reconcile({
|
|
2250
2806
|
addressId: address.id,
|
|
2251
2807
|
trigger: 'webhook',
|
|
2252
|
-
type: '
|
|
2808
|
+
type: 'routes:deposit-address:reconcile',
|
|
2253
2809
|
})
|
|
2254
2810
|
includeAddressRequest = false
|
|
2255
2811
|
returnOlderDirect = true
|
|
@@ -2257,22 +2813,33 @@ describe('createTracker', () => {
|
|
|
2257
2813
|
addressId: address.id,
|
|
2258
2814
|
requestId: 'relay-pending-request',
|
|
2259
2815
|
trigger: 'webhook',
|
|
2260
|
-
type: '
|
|
2816
|
+
type: 'routes:deposit-address:reconcile',
|
|
2261
2817
|
})
|
|
2262
|
-
const [record] = await
|
|
2818
|
+
const [record] = await RoutesDeposits.listBySourceTransaction(db, {
|
|
2263
2819
|
depositAddressId: address.id,
|
|
2264
2820
|
sourceTransactionHash,
|
|
2265
2821
|
})
|
|
2266
|
-
const storedAddress = await
|
|
2822
|
+
const storedAddress = await RoutesDepositAddresses.get(db, address.id)
|
|
2823
|
+
const lifecycleDurations = histograms
|
|
2824
|
+
.filter(([name]) => name === 'routes_lifecycle_duration_ms')
|
|
2825
|
+
.map(([, duration]) => duration)
|
|
2826
|
+
expect(lifecycleDurations.every((duration) => duration >= 0)).toBe(true)
|
|
2267
2827
|
|
|
2268
2828
|
expect({
|
|
2269
2829
|
completed,
|
|
2270
|
-
counts,
|
|
2830
|
+
counts: counts.filter(([name]) => name !== 'routes_provider_operation_count'),
|
|
2271
2831
|
dispatches,
|
|
2272
2832
|
exhausted,
|
|
2273
|
-
histograms
|
|
2833
|
+
histograms: histograms
|
|
2834
|
+
.filter(([name]) => name !== 'routes_provider_operation_duration_ms')
|
|
2835
|
+
.map(([name, duration, tags]) => [
|
|
2836
|
+
name,
|
|
2837
|
+
name === 'routes_lifecycle_duration_ms' ? '<duration>' : duration,
|
|
2838
|
+
tags,
|
|
2839
|
+
]),
|
|
2274
2840
|
pending,
|
|
2275
2841
|
pendingFollowUp,
|
|
2842
|
+
providerOperations: providerOperationCounts(counts),
|
|
2276
2843
|
record,
|
|
2277
2844
|
replay,
|
|
2278
2845
|
requestTargets,
|
|
@@ -2288,13 +2855,16 @@ describe('createTracker', () => {
|
|
|
2288
2855
|
createdAt: expect.any(String),
|
|
2289
2856
|
depositAddressId: expect.any(String),
|
|
2290
2857
|
id: expect.any(String),
|
|
2858
|
+
providerDeliveredAt: expect.any(String),
|
|
2291
2859
|
snapshot: { depositAddressId: expect.any(String) },
|
|
2860
|
+
statusUpdatedAt: expect.any(String),
|
|
2292
2861
|
updatedAt: expect.any(String),
|
|
2293
2862
|
},
|
|
2294
2863
|
storedAddress: {
|
|
2295
2864
|
id: expect.any(String),
|
|
2296
2865
|
providerOutputToken: expect.any(Object),
|
|
2297
2866
|
snapshot: expect.any(Object),
|
|
2867
|
+
statusUpdatedAt: expect.any(String),
|
|
2298
2868
|
},
|
|
2299
2869
|
},
|
|
2300
2870
|
`
|
|
@@ -2306,7 +2876,7 @@ describe('createTracker', () => {
|
|
|
2306
2876
|
},
|
|
2307
2877
|
"counts": [
|
|
2308
2878
|
[
|
|
2309
|
-
"
|
|
2879
|
+
"routes_deposit_reconciliation_count",
|
|
2310
2880
|
1,
|
|
2311
2881
|
{
|
|
2312
2882
|
"outcome": "follow_up_enqueue_failed",
|
|
@@ -2315,7 +2885,7 @@ describe('createTracker', () => {
|
|
|
2315
2885
|
},
|
|
2316
2886
|
],
|
|
2317
2887
|
[
|
|
2318
|
-
"
|
|
2888
|
+
"routes_deposit_reconciliation_count",
|
|
2319
2889
|
1,
|
|
2320
2890
|
{
|
|
2321
2891
|
"outcome": "failed",
|
|
@@ -2324,7 +2894,7 @@ describe('createTracker', () => {
|
|
|
2324
2894
|
},
|
|
2325
2895
|
],
|
|
2326
2896
|
[
|
|
2327
|
-
"
|
|
2897
|
+
"routes_deposit_reconciliation_count",
|
|
2328
2898
|
1,
|
|
2329
2899
|
{
|
|
2330
2900
|
"outcome": "follow_up_enqueued",
|
|
@@ -2333,7 +2903,7 @@ describe('createTracker', () => {
|
|
|
2333
2903
|
},
|
|
2334
2904
|
],
|
|
2335
2905
|
[
|
|
2336
|
-
"
|
|
2906
|
+
"routes_deposit_reconciliation_count",
|
|
2337
2907
|
1,
|
|
2338
2908
|
{
|
|
2339
2909
|
"outcome": "completed",
|
|
@@ -2342,7 +2912,33 @@ describe('createTracker', () => {
|
|
|
2342
2912
|
},
|
|
2343
2913
|
],
|
|
2344
2914
|
[
|
|
2345
|
-
"
|
|
2915
|
+
"routes_resource_transition_count",
|
|
2916
|
+
1,
|
|
2917
|
+
{
|
|
2918
|
+
"from_status": "none",
|
|
2919
|
+
"method": "deposit_address",
|
|
2920
|
+
"provider": "relay",
|
|
2921
|
+
"reason": "none",
|
|
2922
|
+
"resource": "deposit",
|
|
2923
|
+
"routes_environment": "production",
|
|
2924
|
+
"to_status": "detected",
|
|
2925
|
+
},
|
|
2926
|
+
],
|
|
2927
|
+
[
|
|
2928
|
+
"routes_resource_transition_count",
|
|
2929
|
+
1,
|
|
2930
|
+
{
|
|
2931
|
+
"from_status": "detected",
|
|
2932
|
+
"method": "deposit_address",
|
|
2933
|
+
"provider": "relay",
|
|
2934
|
+
"reason": "none",
|
|
2935
|
+
"resource": "deposit",
|
|
2936
|
+
"routes_environment": "production",
|
|
2937
|
+
"to_status": "bridging",
|
|
2938
|
+
},
|
|
2939
|
+
],
|
|
2940
|
+
[
|
|
2941
|
+
"routes_deposit_detection_count",
|
|
2346
2942
|
1,
|
|
2347
2943
|
{
|
|
2348
2944
|
"provider": "relay",
|
|
@@ -2350,7 +2946,7 @@ describe('createTracker', () => {
|
|
|
2350
2946
|
},
|
|
2351
2947
|
],
|
|
2352
2948
|
[
|
|
2353
|
-
"
|
|
2949
|
+
"routes_deposit_reconciliation_count",
|
|
2354
2950
|
1,
|
|
2355
2951
|
{
|
|
2356
2952
|
"outcome": "follow_up_enqueued",
|
|
@@ -2359,7 +2955,7 @@ describe('createTracker', () => {
|
|
|
2359
2955
|
},
|
|
2360
2956
|
],
|
|
2361
2957
|
[
|
|
2362
|
-
"
|
|
2958
|
+
"routes_deposit_reconciliation_count",
|
|
2363
2959
|
1,
|
|
2364
2960
|
{
|
|
2365
2961
|
"outcome": "completed",
|
|
@@ -2368,7 +2964,7 @@ describe('createTracker', () => {
|
|
|
2368
2964
|
},
|
|
2369
2965
|
],
|
|
2370
2966
|
[
|
|
2371
|
-
"
|
|
2967
|
+
"routes_deposit_reconciliation_count",
|
|
2372
2968
|
1,
|
|
2373
2969
|
{
|
|
2374
2970
|
"outcome": "follow_up_exhausted",
|
|
@@ -2377,7 +2973,7 @@ describe('createTracker', () => {
|
|
|
2377
2973
|
},
|
|
2378
2974
|
],
|
|
2379
2975
|
[
|
|
2380
|
-
"
|
|
2976
|
+
"routes_deposit_reconciliation_count",
|
|
2381
2977
|
1,
|
|
2382
2978
|
{
|
|
2383
2979
|
"outcome": "completed",
|
|
@@ -2386,7 +2982,20 @@ describe('createTracker', () => {
|
|
|
2386
2982
|
},
|
|
2387
2983
|
],
|
|
2388
2984
|
[
|
|
2389
|
-
"
|
|
2985
|
+
"routes_resource_transition_count",
|
|
2986
|
+
1,
|
|
2987
|
+
{
|
|
2988
|
+
"from_status": "bridging",
|
|
2989
|
+
"method": "deposit_address",
|
|
2990
|
+
"provider": "relay",
|
|
2991
|
+
"reason": "none",
|
|
2992
|
+
"resource": "deposit",
|
|
2993
|
+
"routes_environment": "production",
|
|
2994
|
+
"to_status": "completed",
|
|
2995
|
+
},
|
|
2996
|
+
],
|
|
2997
|
+
[
|
|
2998
|
+
"routes_deposit_reconciliation_count",
|
|
2390
2999
|
1,
|
|
2391
3000
|
{
|
|
2392
3001
|
"outcome": "completed",
|
|
@@ -2395,7 +3004,7 @@ describe('createTracker', () => {
|
|
|
2395
3004
|
},
|
|
2396
3005
|
],
|
|
2397
3006
|
[
|
|
2398
|
-
"
|
|
3007
|
+
"routes_deposit_reconciliation_count",
|
|
2399
3008
|
1,
|
|
2400
3009
|
{
|
|
2401
3010
|
"outcome": "completed",
|
|
@@ -2404,7 +3013,7 @@ describe('createTracker', () => {
|
|
|
2404
3013
|
},
|
|
2405
3014
|
],
|
|
2406
3015
|
[
|
|
2407
|
-
"
|
|
3016
|
+
"routes_deposit_reconciliation_count",
|
|
2408
3017
|
1,
|
|
2409
3018
|
{
|
|
2410
3019
|
"outcome": "completed",
|
|
@@ -2423,7 +3032,7 @@ describe('createTracker', () => {
|
|
|
2423
3032
|
},
|
|
2424
3033
|
"requestId": "relay-pending-request",
|
|
2425
3034
|
"trigger": "webhook",
|
|
2426
|
-
"type": "
|
|
3035
|
+
"type": "routes:deposit-address:reconcile",
|
|
2427
3036
|
"webhookTiming": {
|
|
2428
3037
|
"enqueuedAt": "2026-01-02T00:03:07.000Z",
|
|
2429
3038
|
"providerStatus": "pending",
|
|
@@ -2440,12 +3049,12 @@ describe('createTracker', () => {
|
|
|
2440
3049
|
{
|
|
2441
3050
|
"addressId": Any<String>,
|
|
2442
3051
|
"followUp": {
|
|
2443
|
-
"attempt":
|
|
3052
|
+
"attempt": 7,
|
|
2444
3053
|
"kind": "provider",
|
|
2445
3054
|
},
|
|
2446
3055
|
"requestId": "relay-pending-request",
|
|
2447
3056
|
"trigger": "webhook",
|
|
2448
|
-
"type": "
|
|
3057
|
+
"type": "routes:deposit-address:reconcile",
|
|
2449
3058
|
"webhookTiming": {
|
|
2450
3059
|
"enqueuedAt": "2026-01-02T00:03:07.000Z",
|
|
2451
3060
|
"providerStatus": "pending",
|
|
@@ -2462,11 +3071,11 @@ describe('createTracker', () => {
|
|
|
2462
3071
|
"exhausted": {
|
|
2463
3072
|
"created": 0,
|
|
2464
3073
|
"type": "completed",
|
|
2465
|
-
"updated":
|
|
3074
|
+
"updated": 0,
|
|
2466
3075
|
},
|
|
2467
3076
|
"histograms": [
|
|
2468
3077
|
[
|
|
2469
|
-
"
|
|
3078
|
+
"routes_deposit_reconciliation_duration_ms",
|
|
2470
3079
|
0,
|
|
2471
3080
|
{
|
|
2472
3081
|
"provider": "relay",
|
|
@@ -2474,7 +3083,7 @@ describe('createTracker', () => {
|
|
|
2474
3083
|
},
|
|
2475
3084
|
],
|
|
2476
3085
|
[
|
|
2477
|
-
"
|
|
3086
|
+
"routes_deposit_reconciliation_duration_ms",
|
|
2478
3087
|
0,
|
|
2479
3088
|
{
|
|
2480
3089
|
"provider": "relay",
|
|
@@ -2482,7 +3091,7 @@ describe('createTracker', () => {
|
|
|
2482
3091
|
},
|
|
2483
3092
|
],
|
|
2484
3093
|
[
|
|
2485
|
-
"
|
|
3094
|
+
"routes_deposit_reconciliation_duration_ms",
|
|
2486
3095
|
0,
|
|
2487
3096
|
{
|
|
2488
3097
|
"provider": "relay",
|
|
@@ -2490,7 +3099,43 @@ describe('createTracker', () => {
|
|
|
2490
3099
|
},
|
|
2491
3100
|
],
|
|
2492
3101
|
[
|
|
2493
|
-
"
|
|
3102
|
+
"routes_lifecycle_duration_ms",
|
|
3103
|
+
"<duration>",
|
|
3104
|
+
{
|
|
3105
|
+
"flow": "deposit_address",
|
|
3106
|
+
"outcome": "success",
|
|
3107
|
+
"provider": "relay",
|
|
3108
|
+
"routes_environment": "production",
|
|
3109
|
+
"segment": "detected_to_provider_delivery",
|
|
3110
|
+
},
|
|
3111
|
+
],
|
|
3112
|
+
[
|
|
3113
|
+
"routes_customer_value_loss_bps",
|
|
3114
|
+
0,
|
|
3115
|
+
{
|
|
3116
|
+
"destination_chain": "eip155:4217",
|
|
3117
|
+
"destination_token": "eip155:4217/erc20:0x20c000000000000000000000b9537d11c60e8b50",
|
|
3118
|
+
"method": "deposit_address",
|
|
3119
|
+
"provider": "relay",
|
|
3120
|
+
"routes_environment": "production",
|
|
3121
|
+
"source_chain": "eip155:8453",
|
|
3122
|
+
"source_token": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
|
|
3123
|
+
"stage": "executed",
|
|
3124
|
+
},
|
|
3125
|
+
],
|
|
3126
|
+
[
|
|
3127
|
+
"routes_lifecycle_duration_ms",
|
|
3128
|
+
"<duration>",
|
|
3129
|
+
{
|
|
3130
|
+
"flow": "deposit_address",
|
|
3131
|
+
"outcome": "success",
|
|
3132
|
+
"provider": "relay",
|
|
3133
|
+
"routes_environment": "production",
|
|
3134
|
+
"segment": "detected_to_completed",
|
|
3135
|
+
},
|
|
3136
|
+
],
|
|
3137
|
+
[
|
|
3138
|
+
"routes_deposit_webhook_latency_ms",
|
|
2494
3139
|
5000,
|
|
2495
3140
|
{
|
|
2496
3141
|
"provider": "relay",
|
|
@@ -2499,7 +3144,7 @@ describe('createTracker', () => {
|
|
|
2499
3144
|
},
|
|
2500
3145
|
],
|
|
2501
3146
|
[
|
|
2502
|
-
"
|
|
3147
|
+
"routes_deposit_webhook_latency_ms",
|
|
2503
3148
|
1000,
|
|
2504
3149
|
{
|
|
2505
3150
|
"provider": "relay",
|
|
@@ -2508,7 +3153,7 @@ describe('createTracker', () => {
|
|
|
2508
3153
|
},
|
|
2509
3154
|
],
|
|
2510
3155
|
[
|
|
2511
|
-
"
|
|
3156
|
+
"routes_deposit_webhook_latency_ms",
|
|
2512
3157
|
1000,
|
|
2513
3158
|
{
|
|
2514
3159
|
"provider": "relay",
|
|
@@ -2517,7 +3162,7 @@ describe('createTracker', () => {
|
|
|
2517
3162
|
},
|
|
2518
3163
|
],
|
|
2519
3164
|
[
|
|
2520
|
-
"
|
|
3165
|
+
"routes_deposit_webhook_latency_ms",
|
|
2521
3166
|
8000,
|
|
2522
3167
|
{
|
|
2523
3168
|
"provider": "relay",
|
|
@@ -2526,7 +3171,7 @@ describe('createTracker', () => {
|
|
|
2526
3171
|
},
|
|
2527
3172
|
],
|
|
2528
3173
|
[
|
|
2529
|
-
"
|
|
3174
|
+
"routes_deposit_webhook_latency_ms",
|
|
2530
3175
|
15000,
|
|
2531
3176
|
{
|
|
2532
3177
|
"provider": "relay",
|
|
@@ -2535,7 +3180,7 @@ describe('createTracker', () => {
|
|
|
2535
3180
|
},
|
|
2536
3181
|
],
|
|
2537
3182
|
[
|
|
2538
|
-
"
|
|
3183
|
+
"routes_deposit_reconciliation_duration_ms",
|
|
2539
3184
|
0,
|
|
2540
3185
|
{
|
|
2541
3186
|
"provider": "relay",
|
|
@@ -2543,7 +3188,7 @@ describe('createTracker', () => {
|
|
|
2543
3188
|
},
|
|
2544
3189
|
],
|
|
2545
3190
|
[
|
|
2546
|
-
"
|
|
3191
|
+
"routes_deposit_reconciliation_duration_ms",
|
|
2547
3192
|
0,
|
|
2548
3193
|
{
|
|
2549
3194
|
"provider": "relay",
|
|
@@ -2551,7 +3196,7 @@ describe('createTracker', () => {
|
|
|
2551
3196
|
},
|
|
2552
3197
|
],
|
|
2553
3198
|
[
|
|
2554
|
-
"
|
|
3199
|
+
"routes_deposit_reconciliation_duration_ms",
|
|
2555
3200
|
0,
|
|
2556
3201
|
{
|
|
2557
3202
|
"provider": "relay",
|
|
@@ -2569,6 +3214,9 @@ describe('createTracker', () => {
|
|
|
2569
3214
|
"type": "completed",
|
|
2570
3215
|
"updated": 1,
|
|
2571
3216
|
},
|
|
3217
|
+
"providerOperations": {
|
|
3218
|
+
"relay:listDepositAddressRequests:success": 11,
|
|
3219
|
+
},
|
|
2572
3220
|
"record": {
|
|
2573
3221
|
"createdAt": Any<String>,
|
|
2574
3222
|
"depositAddressId": Any<String>,
|
|
@@ -2578,6 +3226,7 @@ describe('createTracker', () => {
|
|
|
2578
3226
|
"orgId": "org_pending_reconciliation",
|
|
2579
3227
|
"pollObservedAt": null,
|
|
2580
3228
|
"projectId": null,
|
|
3229
|
+
"providerDeliveredAt": Any<String>,
|
|
2581
3230
|
"providerOutputAmount": {
|
|
2582
3231
|
"baseUnits": "1000000",
|
|
2583
3232
|
"currency": "USD",
|
|
@@ -2599,6 +3248,7 @@ describe('createTracker', () => {
|
|
|
2599
3248
|
"relay-pending-request",
|
|
2600
3249
|
],
|
|
2601
3250
|
"providerState": null,
|
|
3251
|
+
"providerSubsidy": null,
|
|
2602
3252
|
"providerTransactionHashes": [
|
|
2603
3253
|
"0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
|
|
2604
3254
|
],
|
|
@@ -2677,10 +3327,12 @@ describe('createTracker', () => {
|
|
|
2677
3327
|
"sourceTransferIndex": 0,
|
|
2678
3328
|
"status": "completed",
|
|
2679
3329
|
"statusReason": null,
|
|
3330
|
+
"statusUpdatedAt": Any<String>,
|
|
2680
3331
|
"subsidyAmount": null,
|
|
3332
|
+
"subsidyMeterReportedAt": null,
|
|
2681
3333
|
"tempoGasPaid": null,
|
|
2682
3334
|
"updatedAt": Any<String>,
|
|
2683
|
-
"version":
|
|
3335
|
+
"version": 4,
|
|
2684
3336
|
"webhookReceivedAt": null,
|
|
2685
3337
|
},
|
|
2686
3338
|
"replay": {
|
|
@@ -2703,8 +3355,8 @@ describe('createTracker', () => {
|
|
|
2703
3355
|
],
|
|
2704
3356
|
"storedAddress": {
|
|
2705
3357
|
"address": "0x8888888888888888888888888888888888888888",
|
|
2706
|
-
"apiKeyId": "key_pending_reconciliation",
|
|
2707
3358
|
"createdAt": "2026-01-02T00:00:00.000Z",
|
|
3359
|
+
"creatorUserId": null,
|
|
2708
3360
|
"deliveryStrategy": "provider",
|
|
2709
3361
|
"destinationTokenKey": "eip155:4217/erc20:0x20c000000000000000000000b9537d11c60e8b50",
|
|
2710
3362
|
"environment": "production",
|
|
@@ -2743,6 +3395,7 @@ describe('createTracker', () => {
|
|
|
2743
3395
|
"sourceChainId": "eip155:8453",
|
|
2744
3396
|
"sourceTokenKey": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
|
|
2745
3397
|
"status": "active",
|
|
3398
|
+
"statusUpdatedAt": Any<String>,
|
|
2746
3399
|
"subsidize": false,
|
|
2747
3400
|
"updatedAt": "2026-01-02T00:00:00.000Z",
|
|
2748
3401
|
"version": 1,
|
|
@@ -2760,20 +3413,25 @@ describe('createTracker', () => {
|
|
|
2760
3413
|
}
|
|
2761
3414
|
})
|
|
2762
3415
|
|
|
2763
|
-
test('
|
|
2764
|
-
const route =
|
|
3416
|
+
test('backfills late Relay subsidy after chain-detected delivery', async () => {
|
|
3417
|
+
const route = TestRoutes.transferSnapshot()
|
|
2765
3418
|
const ambiguousOrderId = `0x${'3d'.repeat(32)}`
|
|
2766
3419
|
const ambiguousSweepTransactionHash = `0x${'3e'.repeat(32)}`
|
|
2767
3420
|
const depositAddress = `0x${'31'.repeat(20)}`
|
|
2768
3421
|
const depository = `0x${'32'.repeat(20)}`
|
|
2769
3422
|
const destinationTransactionHash = `0x${'33'.repeat(32)}`
|
|
2770
3423
|
const orderId = `0x${'34'.repeat(32)}`
|
|
3424
|
+
const previousSourceTransactionHash = `0x${'39'.repeat(32)}`
|
|
2771
3425
|
const refundAddress = `0x${'38'.repeat(20)}`
|
|
2772
3426
|
const solver = `0x${'35'.repeat(20)}`
|
|
2773
3427
|
const sourceSweepTransactionHash = `0x${'36'.repeat(32)}`
|
|
2774
3428
|
const sourceTransactionHash = `0x${'37'.repeat(32)}`
|
|
3429
|
+
const sponsorPayment = {
|
|
3430
|
+
address: route.sourceToken.address,
|
|
3431
|
+
amount: '23838',
|
|
3432
|
+
chainId: Number(route.sourceChain.id.slice('eip155:'.length)),
|
|
3433
|
+
}
|
|
2775
3434
|
const address = await DepositAddress.create(db, {
|
|
2776
|
-
apiKeyId: 'key_delivery_observation',
|
|
2777
3435
|
deliveryStrategy: 'provider',
|
|
2778
3436
|
environment: 'production',
|
|
2779
3437
|
now: new Date('2026-01-04T00:00:00.000Z'),
|
|
@@ -2804,17 +3462,36 @@ describe('createTracker', () => {
|
|
|
2804
3462
|
const rpcMethods: string[] = []
|
|
2805
3463
|
let ambiguous = true
|
|
2806
3464
|
let correlateDestination = false
|
|
3465
|
+
let delayIndexedRequest = false
|
|
2807
3466
|
let delivered = false
|
|
2808
3467
|
let indexed = false
|
|
3468
|
+
let indexedDelivery = false
|
|
3469
|
+
let requestsUnavailable = false
|
|
3470
|
+
let sponsorPaymentAvailable = true
|
|
2809
3471
|
const server = await TestRelay.createServer(async (request, response) => {
|
|
2810
3472
|
if (request.method === 'GET') {
|
|
2811
3473
|
const url = new URL(request.url ?? '/', server.url)
|
|
3474
|
+
const hideIndexedRequest = indexed && delayIndexedRequest
|
|
3475
|
+
delayIndexedRequest = false
|
|
3476
|
+
const indexedVisible = indexed && !hideIndexedRequest
|
|
3477
|
+
if (url.pathname !== '/chains' && requestsUnavailable) {
|
|
3478
|
+
response.writeHead(503, { 'content-type': 'application/json' })
|
|
3479
|
+
response.end(JSON.stringify({ message: 'temporarily unavailable' }))
|
|
3480
|
+
return
|
|
3481
|
+
}
|
|
2812
3482
|
response.writeHead(200, { 'content-type': 'application/json' })
|
|
2813
3483
|
response.end(
|
|
2814
3484
|
JSON.stringify(
|
|
2815
3485
|
url.pathname === '/chains'
|
|
2816
3486
|
? {
|
|
2817
3487
|
chains: [
|
|
3488
|
+
{
|
|
3489
|
+
id: 792703809,
|
|
3490
|
+
protocol: {
|
|
3491
|
+
v2: { depository: '99vQwtBwYtrqqD9YSXbdum3KBdxPAVxYTaQ3cfnJSrN2' },
|
|
3492
|
+
},
|
|
3493
|
+
solverAddresses: ['F7p3dFrjRTbtRp8FRF6qHLomXbKRBzpvBLjtQcfcgmNe'],
|
|
3494
|
+
},
|
|
2818
3495
|
{
|
|
2819
3496
|
id: Number(route.sourceChain.id.slice('eip155:'.length)),
|
|
2820
3497
|
protocol: { v2: { depository } },
|
|
@@ -2827,16 +3504,30 @@ describe('createTracker', () => {
|
|
|
2827
3504
|
],
|
|
2828
3505
|
}
|
|
2829
3506
|
: {
|
|
2830
|
-
|
|
3507
|
+
...(indexedVisible && !url.searchParams.has('continuation')
|
|
3508
|
+
? { continuation: 'next' }
|
|
3509
|
+
: {}),
|
|
3510
|
+
requests: indexedVisible
|
|
2831
3511
|
? [
|
|
2832
3512
|
{
|
|
2833
3513
|
createdAt: '2026-01-04T00:01:00.000Z',
|
|
2834
|
-
data: {
|
|
2835
|
-
|
|
3514
|
+
data: {
|
|
3515
|
+
...(sponsorPaymentAvailable
|
|
3516
|
+
? { feeSponsorship: { actual: { sponsorPayment } } }
|
|
3517
|
+
: {}),
|
|
3518
|
+
outTxs: indexedDelivery ? [{ txHash: destinationTransactionHash }] : [],
|
|
3519
|
+
},
|
|
3520
|
+
depositAddress: {
|
|
3521
|
+
depositTxHash: indexedDelivery
|
|
3522
|
+
? previousSourceTransactionHash
|
|
3523
|
+
: sourceTransactionHash,
|
|
3524
|
+
},
|
|
2836
3525
|
id: 'relay-observed-request',
|
|
2837
3526
|
protocol: {
|
|
2838
3527
|
deposit: { origin: { depositor: refundAddress, depository } },
|
|
2839
|
-
orderId
|
|
3528
|
+
orderId: url.searchParams.has('continuation')
|
|
3529
|
+
? orderId
|
|
3530
|
+
: ambiguousOrderId,
|
|
2840
3531
|
solver: { address: solver },
|
|
2841
3532
|
},
|
|
2842
3533
|
status: 'pending',
|
|
@@ -2979,7 +3670,7 @@ describe('createTracker', () => {
|
|
|
2979
3670
|
})
|
|
2980
3671
|
|
|
2981
3672
|
try {
|
|
2982
|
-
await
|
|
3673
|
+
await RoutesCatalog.publish(db, {
|
|
2983
3674
|
chainTokens: [],
|
|
2984
3675
|
chains: [
|
|
2985
3676
|
{
|
|
@@ -3025,6 +3716,7 @@ describe('createTracker', () => {
|
|
|
3025
3716
|
)
|
|
3026
3717
|
ambiguous = false
|
|
3027
3718
|
delivered = true
|
|
3719
|
+
requestsUnavailable = true
|
|
3028
3720
|
const uncorrelatedObservation = await provider.observeDepositAddressRequest(
|
|
3029
3721
|
{
|
|
3030
3722
|
address: depositAddress,
|
|
@@ -3038,6 +3730,25 @@ describe('createTracker', () => {
|
|
|
3038
3730
|
},
|
|
3039
3731
|
new AbortController().signal,
|
|
3040
3732
|
)
|
|
3733
|
+
requestsUnavailable = false
|
|
3734
|
+
indexed = true
|
|
3735
|
+
indexedDelivery = true
|
|
3736
|
+
const indexedObservation = await provider.observeDepositAddressRequest(
|
|
3737
|
+
{
|
|
3738
|
+
address: depositAddress,
|
|
3739
|
+
destinationChain: route.destinationChain,
|
|
3740
|
+
destinationToken: route.destinationToken,
|
|
3741
|
+
recipient: route.recipient,
|
|
3742
|
+
refundAddress,
|
|
3743
|
+
source: { amount: '1000000', transactionHash: sourceTransactionHash },
|
|
3744
|
+
sourceChain: route.sourceChain,
|
|
3745
|
+
sourceToken: route.sourceToken,
|
|
3746
|
+
},
|
|
3747
|
+
new AbortController().signal,
|
|
3748
|
+
)
|
|
3749
|
+
sponsorPaymentAvailable = false
|
|
3750
|
+
indexed = false
|
|
3751
|
+
indexedDelivery = false
|
|
3041
3752
|
correlateDestination = true
|
|
3042
3753
|
delivered = false
|
|
3043
3754
|
const observed = await SourceObservation.observe(db, {
|
|
@@ -3065,34 +3776,73 @@ describe('createTracker', () => {
|
|
|
3065
3776
|
const pending = await tracker.reconcile({
|
|
3066
3777
|
addressId: address.id,
|
|
3067
3778
|
trigger: 'chain',
|
|
3068
|
-
type: '
|
|
3779
|
+
type: 'routes:deposit-address:reconcile',
|
|
3069
3780
|
})
|
|
3070
|
-
|
|
3781
|
+
let deliveryFollowUp = dispatches.at(-1)
|
|
3071
3782
|
if (!deliveryFollowUp) throw new Error('Expected a delivery follow-up message.')
|
|
3072
|
-
|
|
3783
|
+
const dispatchCount = dispatches.length
|
|
3784
|
+
await tracker.reconcile({
|
|
3785
|
+
...deliveryFollowUp[0],
|
|
3786
|
+
followUp: { attempt: 5, kind: 'delivery' },
|
|
3787
|
+
})
|
|
3788
|
+
deliveryFollowUp = dispatches[dispatchCount]
|
|
3789
|
+
if (!deliveryFollowUp) throw new Error('Expected another delivery follow-up message.')
|
|
3790
|
+
delayIndexedRequest = true
|
|
3791
|
+
indexed = true
|
|
3792
|
+
indexedDelivery = true
|
|
3073
3793
|
const completed = await tracker.reconcile(deliveryFollowUp[0])
|
|
3074
|
-
const completedRecord = await
|
|
3075
|
-
const
|
|
3794
|
+
const completedRecord = await RoutesDeposits.get(db, observed.record.id)
|
|
3795
|
+
const providerFollowUp = dispatches.find(([message]) => message.followUp?.kind === 'provider')
|
|
3076
3796
|
if (!providerFollowUp) throw new Error('Expected a provider follow-up message.')
|
|
3797
|
+
expect(providerFollowUp[1]).toStrictEqual({ delaySeconds: 5 })
|
|
3798
|
+
delayIndexedRequest = true
|
|
3077
3799
|
indexed = true
|
|
3078
|
-
|
|
3079
|
-
|
|
3800
|
+
indexedDelivery = true
|
|
3801
|
+
sponsorPaymentAvailable = true
|
|
3802
|
+
const backfilled = await tracker.reconcile(providerFollowUp[0])
|
|
3803
|
+
const backfilledRecord = await RoutesDeposits.get(db, observed.record.id)
|
|
3804
|
+
const repeatedFollowUp = dispatches.at(-1)
|
|
3805
|
+
if (!repeatedFollowUp) throw new Error('Expected another provider follow-up message.')
|
|
3806
|
+
delayIndexedRequest = true
|
|
3807
|
+
const repeated = await tracker.reconcile(repeatedFollowUp[0])
|
|
3808
|
+
const [record] = await RoutesDeposits.listBySourceTransaction(db, {
|
|
3080
3809
|
depositAddressId: address.id,
|
|
3081
3810
|
sourceTransactionHash,
|
|
3082
3811
|
})
|
|
3812
|
+
const records = await RoutesDeposits.listByAddress(
|
|
3813
|
+
db,
|
|
3814
|
+
{ environment: 'production', orgId: 'org_delivery_observation' },
|
|
3815
|
+
address.id,
|
|
3816
|
+
{ limit: 10 },
|
|
3817
|
+
)
|
|
3083
3818
|
|
|
3084
3819
|
expect({
|
|
3085
3820
|
ambiguousObservation,
|
|
3086
|
-
|
|
3821
|
+
backfill: {
|
|
3822
|
+
after: {
|
|
3823
|
+
providerSubsidy: backfilledRecord?.providerSubsidy,
|
|
3824
|
+
status: backfilledRecord?.status,
|
|
3825
|
+
version: backfilledRecord?.version,
|
|
3826
|
+
},
|
|
3827
|
+
before: {
|
|
3828
|
+
providerSubsidy: completedRecord?.providerSubsidy,
|
|
3829
|
+
status: completedRecord?.status,
|
|
3830
|
+
version: completedRecord?.version,
|
|
3831
|
+
},
|
|
3832
|
+
recordCount: records.length,
|
|
3833
|
+
},
|
|
3834
|
+
backfilled,
|
|
3087
3835
|
completed,
|
|
3088
|
-
|
|
3089
|
-
counts,
|
|
3836
|
+
counts: counts.filter(([name]) => name !== 'routes_provider_operation_count'),
|
|
3090
3837
|
dispatches: dispatches.map(([message, dispatchOptions]) => [
|
|
3091
3838
|
{ ...message, addressId: '<address-id>' },
|
|
3092
3839
|
dispatchOptions,
|
|
3093
3840
|
]),
|
|
3841
|
+
indexedObservation,
|
|
3094
3842
|
pending,
|
|
3843
|
+
providerOperations: providerOperationCounts(counts),
|
|
3095
3844
|
record,
|
|
3845
|
+
repeated,
|
|
3096
3846
|
rpcMethods,
|
|
3097
3847
|
sourceObservation: observed.type,
|
|
3098
3848
|
uncorrelatedObservation,
|
|
@@ -3102,14 +3852,9 @@ describe('createTracker', () => {
|
|
|
3102
3852
|
createdAt: expect.any(String),
|
|
3103
3853
|
depositAddressId: expect.any(String),
|
|
3104
3854
|
id: expect.any(String),
|
|
3855
|
+
providerDeliveredAt: expect.any(String),
|
|
3105
3856
|
snapshot: { depositAddressId: expect.any(String) },
|
|
3106
|
-
|
|
3107
|
-
},
|
|
3108
|
-
completedRecord: {
|
|
3109
|
-
createdAt: expect.any(String),
|
|
3110
|
-
depositAddressId: expect.any(String),
|
|
3111
|
-
id: expect.any(String),
|
|
3112
|
-
snapshot: { depositAddressId: expect.any(String) },
|
|
3857
|
+
statusUpdatedAt: expect.any(String),
|
|
3113
3858
|
updatedAt: expect.any(String),
|
|
3114
3859
|
},
|
|
3115
3860
|
},
|
|
@@ -3118,7 +3863,38 @@ describe('createTracker', () => {
|
|
|
3118
3863
|
"ambiguousObservation": {
|
|
3119
3864
|
"type": "pending",
|
|
3120
3865
|
},
|
|
3121
|
-
"
|
|
3866
|
+
"backfill": {
|
|
3867
|
+
"after": {
|
|
3868
|
+
"providerSubsidy": {
|
|
3869
|
+
"amount": {
|
|
3870
|
+
"baseUnits": "23838",
|
|
3871
|
+
"currency": "USD",
|
|
3872
|
+
"decimals": 6,
|
|
3873
|
+
"formatted": "0.023838",
|
|
3874
|
+
},
|
|
3875
|
+
"provider": "relay",
|
|
3876
|
+
"token": {
|
|
3877
|
+
"address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
|
|
3878
|
+
"currency": "USD",
|
|
3879
|
+
"decimals": 6,
|
|
3880
|
+
"name": "USD Coin",
|
|
3881
|
+
"standard": "ERC-20",
|
|
3882
|
+
"symbol": "USDC",
|
|
3883
|
+
"tokenKey": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
|
|
3884
|
+
"verified": true,
|
|
3885
|
+
},
|
|
3886
|
+
},
|
|
3887
|
+
"status": "completed",
|
|
3888
|
+
"version": 4,
|
|
3889
|
+
},
|
|
3890
|
+
"before": {
|
|
3891
|
+
"providerSubsidy": null,
|
|
3892
|
+
"status": "completed",
|
|
3893
|
+
"version": 3,
|
|
3894
|
+
},
|
|
3895
|
+
"recordCount": 1,
|
|
3896
|
+
},
|
|
3897
|
+
"backfilled": {
|
|
3122
3898
|
"created": 0,
|
|
3123
3899
|
"type": "completed",
|
|
3124
3900
|
"updated": 1,
|
|
@@ -3128,132 +3904,95 @@ describe('createTracker', () => {
|
|
|
3128
3904
|
"type": "completed",
|
|
3129
3905
|
"updated": 1,
|
|
3130
3906
|
},
|
|
3131
|
-
"
|
|
3132
|
-
|
|
3133
|
-
|
|
3134
|
-
|
|
3135
|
-
|
|
3136
|
-
|
|
3137
|
-
|
|
3138
|
-
"pollObservedAt": null,
|
|
3139
|
-
"projectId": null,
|
|
3140
|
-
"providerOutputAmount": {
|
|
3141
|
-
"baseUnits": "1000000",
|
|
3142
|
-
"currency": "USD",
|
|
3143
|
-
"decimals": 6,
|
|
3144
|
-
"formatted": "1",
|
|
3145
|
-
},
|
|
3146
|
-
"providerOutputToken": {
|
|
3147
|
-
"address": "0x20c000000000000000000000b9537d11c60e8b50",
|
|
3148
|
-
"currency": "USD",
|
|
3149
|
-
"decimals": 6,
|
|
3150
|
-
"name": "Bridged USDC (Stargate)",
|
|
3151
|
-
"standard": "TIP-20",
|
|
3152
|
-
"symbol": "USDC.e",
|
|
3153
|
-
"tokenKey": "eip155:4217/erc20:0x20c000000000000000000000b9537d11c60e8b50",
|
|
3154
|
-
"verified": true,
|
|
3155
|
-
},
|
|
3156
|
-
"providerRequestId": null,
|
|
3157
|
-
"providerRequestIds": [],
|
|
3158
|
-
"providerState": {
|
|
3159
|
-
"relay": {
|
|
3160
|
-
"destinationObservedAt": "2026-01-04T00:03:00.000Z",
|
|
3161
|
-
"orderId": "0x3434343434343434343434343434343434343434343434343434343434343434",
|
|
3162
|
-
"sourceDepository": "0x3232323232323232323232323232323232323232",
|
|
3163
|
-
"sourceObservedAt": "2026-01-04T00:03:00.000Z",
|
|
3164
|
-
"sourceSweepTransactionHash": "0x3636363636363636363636363636363636363636363636363636363636363636",
|
|
3907
|
+
"counts": [
|
|
3908
|
+
[
|
|
3909
|
+
"routes_deposit_delivery_observation_count",
|
|
3910
|
+
1,
|
|
3911
|
+
{
|
|
3912
|
+
"outcome": "pending",
|
|
3913
|
+
"provider": "relay",
|
|
3165
3914
|
},
|
|
3166
|
-
},
|
|
3167
|
-
"providerTransactionHashes": [
|
|
3168
|
-
"0x3636363636363636363636363636363636363636363636363636363636363636",
|
|
3169
|
-
"0x3333333333333333333333333333333333333333333333333333333333333333",
|
|
3170
3915
|
],
|
|
3171
|
-
|
|
3172
|
-
|
|
3173
|
-
|
|
3174
|
-
|
|
3175
|
-
|
|
3176
|
-
|
|
3177
|
-
|
|
3178
|
-
"
|
|
3179
|
-
"
|
|
3180
|
-
"
|
|
3181
|
-
"
|
|
3916
|
+
[
|
|
3917
|
+
"routes_resource_transition_count",
|
|
3918
|
+
1,
|
|
3919
|
+
{
|
|
3920
|
+
"from_status": "detected",
|
|
3921
|
+
"method": "deposit_address",
|
|
3922
|
+
"provider": "relay",
|
|
3923
|
+
"reason": "none",
|
|
3924
|
+
"resource": "deposit",
|
|
3925
|
+
"routes_environment": "production",
|
|
3926
|
+
"to_status": "bridging",
|
|
3182
3927
|
},
|
|
3183
|
-
|
|
3184
|
-
|
|
3185
|
-
|
|
3186
|
-
|
|
3187
|
-
|
|
3928
|
+
],
|
|
3929
|
+
[
|
|
3930
|
+
"routes_deposit_reconciliation_count",
|
|
3931
|
+
1,
|
|
3932
|
+
{
|
|
3933
|
+
"outcome": "follow_up_enqueued",
|
|
3934
|
+
"provider": "relay",
|
|
3935
|
+
"trigger": "chain",
|
|
3188
3936
|
},
|
|
3189
|
-
|
|
3190
|
-
|
|
3191
|
-
|
|
3192
|
-
|
|
3193
|
-
|
|
3194
|
-
"
|
|
3195
|
-
"
|
|
3196
|
-
"
|
|
3197
|
-
"verified": true,
|
|
3937
|
+
],
|
|
3938
|
+
[
|
|
3939
|
+
"routes_deposit_reconciliation_count",
|
|
3940
|
+
1,
|
|
3941
|
+
{
|
|
3942
|
+
"outcome": "completed",
|
|
3943
|
+
"provider": "relay",
|
|
3944
|
+
"trigger": "chain",
|
|
3198
3945
|
},
|
|
3199
|
-
|
|
3200
|
-
|
|
3201
|
-
|
|
3202
|
-
|
|
3203
|
-
|
|
3204
|
-
"
|
|
3946
|
+
],
|
|
3947
|
+
[
|
|
3948
|
+
"routes_deposit_delivery_observation_count",
|
|
3949
|
+
1,
|
|
3950
|
+
{
|
|
3951
|
+
"outcome": "pending",
|
|
3952
|
+
"provider": "relay",
|
|
3205
3953
|
},
|
|
3206
|
-
|
|
3207
|
-
|
|
3208
|
-
"
|
|
3209
|
-
|
|
3210
|
-
|
|
3211
|
-
"
|
|
3212
|
-
"
|
|
3213
|
-
"
|
|
3954
|
+
],
|
|
3955
|
+
[
|
|
3956
|
+
"routes_deposit_reconciliation_count",
|
|
3957
|
+
1,
|
|
3958
|
+
{
|
|
3959
|
+
"outcome": "follow_up_enqueued",
|
|
3960
|
+
"provider": "relay",
|
|
3961
|
+
"trigger": "chain",
|
|
3214
3962
|
},
|
|
3215
|
-
|
|
3216
|
-
|
|
3217
|
-
|
|
3218
|
-
|
|
3219
|
-
|
|
3963
|
+
],
|
|
3964
|
+
[
|
|
3965
|
+
"routes_deposit_reconciliation_count",
|
|
3966
|
+
1,
|
|
3967
|
+
{
|
|
3968
|
+
"outcome": "completed",
|
|
3969
|
+
"provider": "relay",
|
|
3970
|
+
"trigger": "chain",
|
|
3220
3971
|
},
|
|
3221
|
-
|
|
3222
|
-
|
|
3223
|
-
|
|
3224
|
-
|
|
3225
|
-
|
|
3226
|
-
"
|
|
3227
|
-
"
|
|
3228
|
-
"tokenKey": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
|
|
3229
|
-
"verified": true,
|
|
3972
|
+
],
|
|
3973
|
+
[
|
|
3974
|
+
"routes_deposit_delivery_observation_count",
|
|
3975
|
+
1,
|
|
3976
|
+
{
|
|
3977
|
+
"outcome": "verified",
|
|
3978
|
+
"provider": "relay",
|
|
3230
3979
|
},
|
|
3231
|
-
|
|
3232
|
-
"0x3737373737373737373737373737373737373737373737373737373737373737",
|
|
3233
|
-
],
|
|
3234
|
-
},
|
|
3235
|
-
"sourceChainId": "eip155:8453",
|
|
3236
|
-
"sourceTransactionHash": "0x3737373737373737373737373737373737373737373737373737373737373737",
|
|
3237
|
-
"sourceTransferIndex": 0,
|
|
3238
|
-
"status": "completed",
|
|
3239
|
-
"statusReason": null,
|
|
3240
|
-
"subsidyAmount": null,
|
|
3241
|
-
"tempoGasPaid": null,
|
|
3242
|
-
"updatedAt": Any<String>,
|
|
3243
|
-
"version": 3,
|
|
3244
|
-
"webhookReceivedAt": null,
|
|
3245
|
-
},
|
|
3246
|
-
"counts": [
|
|
3980
|
+
],
|
|
3247
3981
|
[
|
|
3248
|
-
"
|
|
3982
|
+
"routes_resource_transition_count",
|
|
3249
3983
|
1,
|
|
3250
3984
|
{
|
|
3251
|
-
"
|
|
3985
|
+
"from_status": "bridging",
|
|
3986
|
+
"method": "deposit_address",
|
|
3252
3987
|
"provider": "relay",
|
|
3988
|
+
"reason": "none",
|
|
3989
|
+
"resource": "deposit",
|
|
3990
|
+
"routes_environment": "production",
|
|
3991
|
+
"to_status": "completed",
|
|
3253
3992
|
},
|
|
3254
3993
|
],
|
|
3255
3994
|
[
|
|
3256
|
-
"
|
|
3995
|
+
"routes_deposit_reconciliation_count",
|
|
3257
3996
|
1,
|
|
3258
3997
|
{
|
|
3259
3998
|
"outcome": "follow_up_enqueued",
|
|
@@ -3262,7 +4001,7 @@ describe('createTracker', () => {
|
|
|
3262
4001
|
},
|
|
3263
4002
|
],
|
|
3264
4003
|
[
|
|
3265
|
-
"
|
|
4004
|
+
"routes_deposit_reconciliation_count",
|
|
3266
4005
|
1,
|
|
3267
4006
|
{
|
|
3268
4007
|
"outcome": "completed",
|
|
@@ -3271,7 +4010,7 @@ describe('createTracker', () => {
|
|
|
3271
4010
|
},
|
|
3272
4011
|
],
|
|
3273
4012
|
[
|
|
3274
|
-
"
|
|
4013
|
+
"routes_deposit_delivery_observation_count",
|
|
3275
4014
|
1,
|
|
3276
4015
|
{
|
|
3277
4016
|
"outcome": "verified",
|
|
@@ -3279,7 +4018,7 @@ describe('createTracker', () => {
|
|
|
3279
4018
|
},
|
|
3280
4019
|
],
|
|
3281
4020
|
[
|
|
3282
|
-
"
|
|
4021
|
+
"routes_deposit_reconciliation_count",
|
|
3283
4022
|
1,
|
|
3284
4023
|
{
|
|
3285
4024
|
"outcome": "follow_up_enqueued",
|
|
@@ -3288,7 +4027,7 @@ describe('createTracker', () => {
|
|
|
3288
4027
|
},
|
|
3289
4028
|
],
|
|
3290
4029
|
[
|
|
3291
|
-
"
|
|
4030
|
+
"routes_deposit_reconciliation_count",
|
|
3292
4031
|
1,
|
|
3293
4032
|
{
|
|
3294
4033
|
"outcome": "completed",
|
|
@@ -3297,7 +4036,16 @@ describe('createTracker', () => {
|
|
|
3297
4036
|
},
|
|
3298
4037
|
],
|
|
3299
4038
|
[
|
|
3300
|
-
"
|
|
4039
|
+
"routes_deposit_reconciliation_count",
|
|
4040
|
+
1,
|
|
4041
|
+
{
|
|
4042
|
+
"outcome": "follow_up_enqueued",
|
|
4043
|
+
"provider": "relay",
|
|
4044
|
+
"trigger": "chain",
|
|
4045
|
+
},
|
|
4046
|
+
],
|
|
4047
|
+
[
|
|
4048
|
+
"routes_deposit_reconciliation_count",
|
|
3301
4049
|
1,
|
|
3302
4050
|
{
|
|
3303
4051
|
"outcome": "completed",
|
|
@@ -3315,7 +4063,21 @@ describe('createTracker', () => {
|
|
|
3315
4063
|
"kind": "delivery",
|
|
3316
4064
|
},
|
|
3317
4065
|
"trigger": "chain",
|
|
3318
|
-
"type": "
|
|
4066
|
+
"type": "routes:deposit-address:reconcile",
|
|
4067
|
+
},
|
|
4068
|
+
{
|
|
4069
|
+
"delaySeconds": 1,
|
|
4070
|
+
},
|
|
4071
|
+
],
|
|
4072
|
+
[
|
|
4073
|
+
{
|
|
4074
|
+
"addressId": "<address-id>",
|
|
4075
|
+
"followUp": {
|
|
4076
|
+
"attempt": 6,
|
|
4077
|
+
"kind": "delivery",
|
|
4078
|
+
},
|
|
4079
|
+
"trigger": "chain",
|
|
4080
|
+
"type": "routes:deposit-address:reconcile",
|
|
3319
4081
|
},
|
|
3320
4082
|
{
|
|
3321
4083
|
"delaySeconds": 1,
|
|
@@ -3329,18 +4091,88 @@ describe('createTracker', () => {
|
|
|
3329
4091
|
"kind": "provider",
|
|
3330
4092
|
},
|
|
3331
4093
|
"trigger": "chain",
|
|
3332
|
-
"type": "
|
|
4094
|
+
"type": "routes:deposit-address:reconcile",
|
|
3333
4095
|
},
|
|
3334
4096
|
{
|
|
3335
|
-
"delaySeconds":
|
|
4097
|
+
"delaySeconds": 5,
|
|
4098
|
+
},
|
|
4099
|
+
],
|
|
4100
|
+
[
|
|
4101
|
+
{
|
|
4102
|
+
"addressId": "<address-id>",
|
|
4103
|
+
"followUp": {
|
|
4104
|
+
"attempt": 1,
|
|
4105
|
+
"kind": "provider",
|
|
4106
|
+
},
|
|
4107
|
+
"trigger": "chain",
|
|
4108
|
+
"type": "routes:deposit-address:reconcile",
|
|
4109
|
+
},
|
|
4110
|
+
{
|
|
4111
|
+
"delaySeconds": 5,
|
|
4112
|
+
},
|
|
4113
|
+
],
|
|
4114
|
+
[
|
|
4115
|
+
{
|
|
4116
|
+
"addressId": "<address-id>",
|
|
4117
|
+
"followUp": {
|
|
4118
|
+
"attempt": 2,
|
|
4119
|
+
"kind": "provider",
|
|
4120
|
+
},
|
|
4121
|
+
"trigger": "chain",
|
|
4122
|
+
"type": "routes:deposit-address:reconcile",
|
|
4123
|
+
},
|
|
4124
|
+
{
|
|
4125
|
+
"delaySeconds": 5,
|
|
3336
4126
|
},
|
|
3337
4127
|
],
|
|
3338
4128
|
],
|
|
4129
|
+
"indexedObservation": {
|
|
4130
|
+
"destinationTransactionHashes": [
|
|
4131
|
+
"0x3333333333333333333333333333333333333333333333333333333333333333",
|
|
4132
|
+
],
|
|
4133
|
+
"providerState": {
|
|
4134
|
+
"relay": {
|
|
4135
|
+
"destinationObservedAt": "2026-01-04T00:03:00.000Z",
|
|
4136
|
+
"orderId": "0x3434343434343434343434343434343434343434343434343434343434343434",
|
|
4137
|
+
"sourceDepository": "0x3232323232323232323232323232323232323232",
|
|
4138
|
+
"sourceObservedAt": "2026-01-04T00:03:00.000Z",
|
|
4139
|
+
"sourceSweepTransactionHash": "0x3636363636363636363636363636363636363636363636363636363636363636",
|
|
4140
|
+
},
|
|
4141
|
+
},
|
|
4142
|
+
"providerTransactionHashes": [
|
|
4143
|
+
"0x3636363636363636363636363636363636363636363636363636363636363636",
|
|
4144
|
+
"0x3333333333333333333333333333333333333333333333333333333333333333",
|
|
4145
|
+
],
|
|
4146
|
+
"subsidy": {
|
|
4147
|
+
"amount": {
|
|
4148
|
+
"baseUnits": "23838",
|
|
4149
|
+
"currency": "USD",
|
|
4150
|
+
"decimals": 6,
|
|
4151
|
+
"formatted": "0.023838",
|
|
4152
|
+
},
|
|
4153
|
+
"provider": "relay",
|
|
4154
|
+
"token": {
|
|
4155
|
+
"address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
|
|
4156
|
+
"currency": "USD",
|
|
4157
|
+
"decimals": 6,
|
|
4158
|
+
"name": "USD Coin",
|
|
4159
|
+
"standard": "ERC-20",
|
|
4160
|
+
"symbol": "USDC",
|
|
4161
|
+
"tokenKey": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
|
|
4162
|
+
"verified": true,
|
|
4163
|
+
},
|
|
4164
|
+
},
|
|
4165
|
+
"type": "verified",
|
|
4166
|
+
},
|
|
3339
4167
|
"pending": {
|
|
3340
4168
|
"created": 0,
|
|
3341
4169
|
"type": "completed",
|
|
3342
4170
|
"updated": 1,
|
|
3343
4171
|
},
|
|
4172
|
+
"providerOperations": {
|
|
4173
|
+
"relay:listDepositAddressRequests:success": 5,
|
|
4174
|
+
"relay:observeDepositAddressRequest:success": 4,
|
|
4175
|
+
},
|
|
3344
4176
|
"record": {
|
|
3345
4177
|
"createdAt": Any<String>,
|
|
3346
4178
|
"depositAddressId": Any<String>,
|
|
@@ -3350,6 +4182,7 @@ describe('createTracker', () => {
|
|
|
3350
4182
|
"orgId": "org_delivery_observation",
|
|
3351
4183
|
"pollObservedAt": null,
|
|
3352
4184
|
"projectId": null,
|
|
4185
|
+
"providerDeliveredAt": Any<String>,
|
|
3353
4186
|
"providerOutputAmount": {
|
|
3354
4187
|
"baseUnits": "1000000",
|
|
3355
4188
|
"currency": "USD",
|
|
@@ -3366,10 +4199,8 @@ describe('createTracker', () => {
|
|
|
3366
4199
|
"tokenKey": "eip155:4217/erc20:0x20c000000000000000000000b9537d11c60e8b50",
|
|
3367
4200
|
"verified": true,
|
|
3368
4201
|
},
|
|
3369
|
-
"providerRequestId":
|
|
3370
|
-
"providerRequestIds": [
|
|
3371
|
-
"relay-observed-request",
|
|
3372
|
-
],
|
|
4202
|
+
"providerRequestId": null,
|
|
4203
|
+
"providerRequestIds": [],
|
|
3373
4204
|
"providerState": {
|
|
3374
4205
|
"relay": {
|
|
3375
4206
|
"destinationObservedAt": "2026-01-04T00:03:00.000Z",
|
|
@@ -3379,6 +4210,25 @@ describe('createTracker', () => {
|
|
|
3379
4210
|
"sourceSweepTransactionHash": "0x3636363636363636363636363636363636363636363636363636363636363636",
|
|
3380
4211
|
},
|
|
3381
4212
|
},
|
|
4213
|
+
"providerSubsidy": {
|
|
4214
|
+
"amount": {
|
|
4215
|
+
"baseUnits": "23838",
|
|
4216
|
+
"currency": "USD",
|
|
4217
|
+
"decimals": 6,
|
|
4218
|
+
"formatted": "0.023838",
|
|
4219
|
+
},
|
|
4220
|
+
"provider": "relay",
|
|
4221
|
+
"token": {
|
|
4222
|
+
"address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
|
|
4223
|
+
"currency": "USD",
|
|
4224
|
+
"decimals": 6,
|
|
4225
|
+
"name": "USD Coin",
|
|
4226
|
+
"standard": "ERC-20",
|
|
4227
|
+
"symbol": "USDC",
|
|
4228
|
+
"tokenKey": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
|
|
4229
|
+
"verified": true,
|
|
4230
|
+
},
|
|
4231
|
+
},
|
|
3382
4232
|
"providerTransactionHashes": [
|
|
3383
4233
|
"0x3636363636363636363636363636363636363636363636363636363636363636",
|
|
3384
4234
|
"0x3333333333333333333333333333333333333333333333333333333333333333",
|
|
@@ -3458,12 +4308,19 @@ describe('createTracker', () => {
|
|
|
3458
4308
|
"sourceTransferIndex": 0,
|
|
3459
4309
|
"status": "completed",
|
|
3460
4310
|
"statusReason": null,
|
|
4311
|
+
"statusUpdatedAt": Any<String>,
|
|
3461
4312
|
"subsidyAmount": null,
|
|
4313
|
+
"subsidyMeterReportedAt": null,
|
|
3462
4314
|
"tempoGasPaid": null,
|
|
3463
4315
|
"updatedAt": Any<String>,
|
|
3464
4316
|
"version": 4,
|
|
3465
4317
|
"webhookReceivedAt": null,
|
|
3466
4318
|
},
|
|
4319
|
+
"repeated": {
|
|
4320
|
+
"created": 0,
|
|
4321
|
+
"type": "completed",
|
|
4322
|
+
"updated": 0,
|
|
4323
|
+
},
|
|
3467
4324
|
"rpcMethods": [
|
|
3468
4325
|
"eth_getTransactionReceipt",
|
|
3469
4326
|
"eth_blockNumber",
|
|
@@ -3479,6 +4336,10 @@ describe('createTracker', () => {
|
|
|
3479
4336
|
"eth_getTransactionByHash",
|
|
3480
4337
|
"eth_getTransactionReceipt",
|
|
3481
4338
|
"eth_blockNumber",
|
|
4339
|
+
"eth_getLogs",
|
|
4340
|
+
"eth_getTransactionByHash",
|
|
4341
|
+
"eth_getTransactionReceipt",
|
|
4342
|
+
"eth_blockNumber",
|
|
3482
4343
|
"eth_getTransactionReceipt",
|
|
3483
4344
|
"eth_blockNumber",
|
|
3484
4345
|
"eth_getLogs",
|
|
@@ -3489,7 +4350,12 @@ describe('createTracker', () => {
|
|
|
3489
4350
|
"eth_blockNumber",
|
|
3490
4351
|
"eth_blockNumber",
|
|
3491
4352
|
"eth_getLogs",
|
|
3492
|
-
"
|
|
4353
|
+
"eth_getTransactionReceipt",
|
|
4354
|
+
"eth_blockNumber",
|
|
4355
|
+
"eth_getTransactionReceipt",
|
|
4356
|
+
"eth_blockNumber",
|
|
4357
|
+
"eth_getTransactionReceipt",
|
|
4358
|
+
"eth_blockNumber",
|
|
3493
4359
|
"eth_getTransactionReceipt",
|
|
3494
4360
|
"eth_blockNumber",
|
|
3495
4361
|
"eth_getTransactionReceipt",
|
|
@@ -3519,10 +4385,9 @@ describe('createTracker', () => {
|
|
|
3519
4385
|
})
|
|
3520
4386
|
|
|
3521
4387
|
test('renews the address lease during a slow provider read', async () => {
|
|
3522
|
-
const route =
|
|
4388
|
+
const route = TestRoutes.transferSnapshot()
|
|
3523
4389
|
const depositAddress = `0x${'16'.repeat(20)}`
|
|
3524
4390
|
const address = await DepositAddress.create(db, {
|
|
3525
|
-
apiKeyId: 'key_lease_reconciliation',
|
|
3526
4391
|
deliveryStrategy: 'provider',
|
|
3527
4392
|
environment: 'production',
|
|
3528
4393
|
now: new Date('2026-01-04T00:00:00.000Z'),
|
|
@@ -3564,14 +4429,14 @@ describe('createTracker', () => {
|
|
|
3564
4429
|
const reconciliation = tracker.reconcile({
|
|
3565
4430
|
addressId: address.id,
|
|
3566
4431
|
trigger: 'webhook',
|
|
3567
|
-
type: '
|
|
4432
|
+
type: 'routes:deposit-address:reconcile',
|
|
3568
4433
|
})
|
|
3569
4434
|
await providerStarted.promise
|
|
3570
4435
|
await vi.advanceTimersByTimeAsync(60)
|
|
3571
|
-
const renewed = await
|
|
4436
|
+
const renewed = await RoutesDepositAddresses.get(db, address.id)
|
|
3572
4437
|
providerReleased.resolve()
|
|
3573
4438
|
const result = await reconciliation
|
|
3574
|
-
const completed = await
|
|
4439
|
+
const completed = await RoutesDepositAddresses.get(db, address.id)
|
|
3575
4440
|
|
|
3576
4441
|
expect({ completed, renewed, result }).toMatchInlineSnapshot(
|
|
3577
4442
|
{
|
|
@@ -3579,19 +4444,21 @@ describe('createTracker', () => {
|
|
|
3579
4444
|
id: expect.any(String),
|
|
3580
4445
|
providerOutputToken: expect.any(Object),
|
|
3581
4446
|
snapshot: expect.any(Object),
|
|
4447
|
+
statusUpdatedAt: expect.any(String),
|
|
3582
4448
|
},
|
|
3583
4449
|
renewed: {
|
|
3584
4450
|
id: expect.any(String),
|
|
3585
4451
|
providerOutputToken: expect.any(Object),
|
|
3586
4452
|
snapshot: expect.any(Object),
|
|
4453
|
+
statusUpdatedAt: expect.any(String),
|
|
3587
4454
|
},
|
|
3588
4455
|
},
|
|
3589
4456
|
`
|
|
3590
4457
|
{
|
|
3591
4458
|
"completed": {
|
|
3592
4459
|
"address": "0x1616161616161616161616161616161616161616",
|
|
3593
|
-
"apiKeyId": "key_lease_reconciliation",
|
|
3594
4460
|
"createdAt": "2026-01-04T00:00:00.000Z",
|
|
4461
|
+
"creatorUserId": null,
|
|
3595
4462
|
"deliveryStrategy": "provider",
|
|
3596
4463
|
"destinationTokenKey": "eip155:4217/erc20:0x20c000000000000000000000b9537d11c60e8b50",
|
|
3597
4464
|
"environment": "production",
|
|
@@ -3618,14 +4485,15 @@ describe('createTracker', () => {
|
|
|
3618
4485
|
"sourceChainId": "eip155:8453",
|
|
3619
4486
|
"sourceTokenKey": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
|
|
3620
4487
|
"status": "active",
|
|
4488
|
+
"statusUpdatedAt": Any<String>,
|
|
3621
4489
|
"subsidize": false,
|
|
3622
4490
|
"updatedAt": "2026-01-04T00:00:00.000Z",
|
|
3623
4491
|
"version": 1,
|
|
3624
4492
|
},
|
|
3625
4493
|
"renewed": {
|
|
3626
4494
|
"address": "0x1616161616161616161616161616161616161616",
|
|
3627
|
-
"apiKeyId": "key_lease_reconciliation",
|
|
3628
4495
|
"createdAt": "2026-01-04T00:00:00.000Z",
|
|
4496
|
+
"creatorUserId": null,
|
|
3629
4497
|
"deliveryStrategy": "provider",
|
|
3630
4498
|
"destinationTokenKey": "eip155:4217/erc20:0x20c000000000000000000000b9537d11c60e8b50",
|
|
3631
4499
|
"environment": "production",
|
|
@@ -3647,6 +4515,7 @@ describe('createTracker', () => {
|
|
|
3647
4515
|
"sourceChainId": "eip155:8453",
|
|
3648
4516
|
"sourceTokenKey": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
|
|
3649
4517
|
"status": "active",
|
|
4518
|
+
"statusUpdatedAt": Any<String>,
|
|
3650
4519
|
"subsidize": false,
|
|
3651
4520
|
"updatedAt": "2026-01-04T00:00:00.000Z",
|
|
3652
4521
|
"version": 1,
|
|
@@ -3667,13 +4536,12 @@ describe('createTracker', () => {
|
|
|
3667
4536
|
})
|
|
3668
4537
|
|
|
3669
4538
|
test('waits for every source transaction before allocating provider output', async () => {
|
|
3670
|
-
const route =
|
|
4539
|
+
const route = TestRoutes.transferSnapshot()
|
|
3671
4540
|
const depositAddress = `0x${'21'.repeat(20)}`
|
|
3672
4541
|
const firstSourceTransactionHash = `0x${'31'.repeat(32)}`
|
|
3673
4542
|
const secondSourceTransactionHash = `0x${'32'.repeat(32)}`
|
|
3674
4543
|
const destinationTransactionHash = `0x${'33'.repeat(32)}`
|
|
3675
4544
|
const address = await DepositAddress.create(db, {
|
|
3676
|
-
apiKeyId: 'key_source_evidence_reconciliation',
|
|
3677
4545
|
deliveryStrategy: 'provider',
|
|
3678
4546
|
environment: 'production',
|
|
3679
4547
|
now: new Date('2026-01-05T00:00:00.000Z'),
|
|
@@ -3724,7 +4592,7 @@ describe('createTracker', () => {
|
|
|
3724
4592
|
})
|
|
3725
4593
|
|
|
3726
4594
|
try {
|
|
3727
|
-
await
|
|
4595
|
+
await RoutesCatalog.publish(db, {
|
|
3728
4596
|
chainTokens: [],
|
|
3729
4597
|
chains: [
|
|
3730
4598
|
{
|
|
@@ -3761,7 +4629,7 @@ describe('createTracker', () => {
|
|
|
3761
4629
|
verifyTransfers: Evidence.createVerifier({ db }),
|
|
3762
4630
|
})
|
|
3763
4631
|
const records = (
|
|
3764
|
-
await
|
|
4632
|
+
await RoutesDeposits.listByAddress(
|
|
3765
4633
|
db,
|
|
3766
4634
|
{ environment: 'production', orgId: 'org_source_evidence_reconciliation' },
|
|
3767
4635
|
address.id,
|
|
@@ -3779,6 +4647,7 @@ describe('createTracker', () => {
|
|
|
3779
4647
|
depositAddressId: expect.any(String),
|
|
3780
4648
|
id: expect.any(String),
|
|
3781
4649
|
snapshot: { depositAddressId: expect.any(String) },
|
|
4650
|
+
statusUpdatedAt: expect.any(String),
|
|
3782
4651
|
updatedAt: expect.any(String),
|
|
3783
4652
|
},
|
|
3784
4653
|
{
|
|
@@ -3786,6 +4655,7 @@ describe('createTracker', () => {
|
|
|
3786
4655
|
depositAddressId: expect.any(String),
|
|
3787
4656
|
id: expect.any(String),
|
|
3788
4657
|
snapshot: { depositAddressId: expect.any(String) },
|
|
4658
|
+
statusUpdatedAt: expect.any(String),
|
|
3789
4659
|
updatedAt: expect.any(String),
|
|
3790
4660
|
},
|
|
3791
4661
|
],
|
|
@@ -3803,6 +4673,7 @@ describe('createTracker', () => {
|
|
|
3803
4673
|
"orgId": "org_source_evidence_reconciliation",
|
|
3804
4674
|
"pollObservedAt": null,
|
|
3805
4675
|
"projectId": null,
|
|
4676
|
+
"providerDeliveredAt": null,
|
|
3806
4677
|
"providerOutputAmount": null,
|
|
3807
4678
|
"providerOutputToken": {
|
|
3808
4679
|
"address": "0x20c000000000000000000000b9537d11c60e8b50",
|
|
@@ -3819,6 +4690,7 @@ describe('createTracker', () => {
|
|
|
3819
4690
|
"source-evidence-request",
|
|
3820
4691
|
],
|
|
3821
4692
|
"providerState": null,
|
|
4693
|
+
"providerSubsidy": null,
|
|
3822
4694
|
"providerTransactionHashes": [],
|
|
3823
4695
|
"providerTransferIndex": 0,
|
|
3824
4696
|
"retryState": null,
|
|
@@ -3880,7 +4752,9 @@ describe('createTracker', () => {
|
|
|
3880
4752
|
"sourceTransferIndex": 0,
|
|
3881
4753
|
"status": "bridging",
|
|
3882
4754
|
"statusReason": null,
|
|
4755
|
+
"statusUpdatedAt": Any<String>,
|
|
3883
4756
|
"subsidyAmount": null,
|
|
4757
|
+
"subsidyMeterReportedAt": null,
|
|
3884
4758
|
"tempoGasPaid": null,
|
|
3885
4759
|
"updatedAt": Any<String>,
|
|
3886
4760
|
"version": 2,
|
|
@@ -3895,6 +4769,7 @@ describe('createTracker', () => {
|
|
|
3895
4769
|
"orgId": "org_source_evidence_reconciliation",
|
|
3896
4770
|
"pollObservedAt": null,
|
|
3897
4771
|
"projectId": null,
|
|
4772
|
+
"providerDeliveredAt": null,
|
|
3898
4773
|
"providerOutputAmount": null,
|
|
3899
4774
|
"providerOutputToken": {
|
|
3900
4775
|
"address": "0x20c000000000000000000000b9537d11c60e8b50",
|
|
@@ -3911,6 +4786,7 @@ describe('createTracker', () => {
|
|
|
3911
4786
|
"source-evidence-request",
|
|
3912
4787
|
],
|
|
3913
4788
|
"providerState": null,
|
|
4789
|
+
"providerSubsidy": null,
|
|
3914
4790
|
"providerTransactionHashes": [],
|
|
3915
4791
|
"providerTransferIndex": 0,
|
|
3916
4792
|
"retryState": null,
|
|
@@ -3965,7 +4841,9 @@ describe('createTracker', () => {
|
|
|
3965
4841
|
"sourceTransferIndex": null,
|
|
3966
4842
|
"status": "detected",
|
|
3967
4843
|
"statusReason": null,
|
|
4844
|
+
"statusUpdatedAt": Any<String>,
|
|
3968
4845
|
"subsidyAmount": null,
|
|
4846
|
+
"subsidyMeterReportedAt": null,
|
|
3969
4847
|
"tempoGasPaid": null,
|
|
3970
4848
|
"updatedAt": Any<String>,
|
|
3971
4849
|
"version": 1,
|
|
@@ -3986,13 +4864,12 @@ describe('createTracker', () => {
|
|
|
3986
4864
|
})
|
|
3987
4865
|
|
|
3988
4866
|
test('records multiple source transfers with finer precision independently', async () => {
|
|
3989
|
-
const route =
|
|
4867
|
+
const route = TestRoutes.transferSnapshot()
|
|
3990
4868
|
const sourceToken = { ...route.sourceToken, decimals: 18 }
|
|
3991
4869
|
const depositAddress = `0x${'12'.repeat(20)}`
|
|
3992
4870
|
const sourceTransactionHash = `0x${'ee'.repeat(32)}`
|
|
3993
4871
|
const destinationTransactionHash = `0x${'ff'.repeat(32)}`
|
|
3994
4872
|
const address = await DepositAddress.create(db, {
|
|
3995
|
-
apiKeyId: 'key_precision_reconciliation',
|
|
3996
4873
|
deliveryStrategy: 'provider',
|
|
3997
4874
|
environment: 'production',
|
|
3998
4875
|
now: new Date('2026-01-03T00:00:00.000Z'),
|
|
@@ -4020,6 +4897,15 @@ describe('createTracker', () => {
|
|
|
4020
4897
|
{
|
|
4021
4898
|
createdAt: '2026-01-03T00:01:00.000Z',
|
|
4022
4899
|
data: {
|
|
4900
|
+
feeSponsorship: {
|
|
4901
|
+
actual: {
|
|
4902
|
+
sponsorPayment: {
|
|
4903
|
+
address: sourceToken.address,
|
|
4904
|
+
amount: '23838',
|
|
4905
|
+
chainId: 8453,
|
|
4906
|
+
},
|
|
4907
|
+
},
|
|
4908
|
+
},
|
|
4023
4909
|
inTxs: [{ txHash: sourceTransactionHash }],
|
|
4024
4910
|
outTxs: [{ txHash: destinationTransactionHash }],
|
|
4025
4911
|
},
|
|
@@ -4081,7 +4967,7 @@ describe('createTracker', () => {
|
|
|
4081
4967
|
})
|
|
4082
4968
|
|
|
4083
4969
|
try {
|
|
4084
|
-
await
|
|
4970
|
+
await RoutesCatalog.publish(db, {
|
|
4085
4971
|
chainTokens: [],
|
|
4086
4972
|
chains: [
|
|
4087
4973
|
{
|
|
@@ -4115,10 +5001,10 @@ describe('createTracker', () => {
|
|
|
4115
5001
|
const result = await tracker.reconcile({
|
|
4116
5002
|
addressId: address.id,
|
|
4117
5003
|
trigger: 'webhook',
|
|
4118
|
-
type: '
|
|
5004
|
+
type: 'routes:deposit-address:reconcile',
|
|
4119
5005
|
})
|
|
4120
5006
|
const records = (
|
|
4121
|
-
await
|
|
5007
|
+
await RoutesDeposits.listByAddress(
|
|
4122
5008
|
db,
|
|
4123
5009
|
{ environment: 'production', orgId: 'org_precision_reconciliation' },
|
|
4124
5010
|
address.id,
|
|
@@ -4127,8 +5013,12 @@ describe('createTracker', () => {
|
|
|
4127
5013
|
).toSorted(
|
|
4128
5014
|
(left, right) => (right.sourceTransferIndex ?? -1) - (left.sourceTransferIndex ?? -1),
|
|
4129
5015
|
)
|
|
4130
|
-
const storedAddress = await
|
|
5016
|
+
const storedAddress = await RoutesDepositAddresses.get(db, address.id)
|
|
4131
5017
|
|
|
5018
|
+
expect(records.map((record) => record.providerSubsidy?.amount.baseUnits ?? null)).toEqual([
|
|
5019
|
+
null,
|
|
5020
|
+
'23838',
|
|
5021
|
+
])
|
|
4132
5022
|
expect({ records, result, storedAddress }).toMatchInlineSnapshot(
|
|
4133
5023
|
{
|
|
4134
5024
|
records: [
|
|
@@ -4136,14 +5026,18 @@ describe('createTracker', () => {
|
|
|
4136
5026
|
createdAt: expect.any(String),
|
|
4137
5027
|
depositAddressId: expect.any(String),
|
|
4138
5028
|
id: expect.any(String),
|
|
5029
|
+
providerDeliveredAt: expect.any(String),
|
|
4139
5030
|
snapshot: { depositAddressId: expect.any(String) },
|
|
5031
|
+
statusUpdatedAt: expect.any(String),
|
|
4140
5032
|
updatedAt: expect.any(String),
|
|
4141
5033
|
},
|
|
4142
5034
|
{
|
|
4143
5035
|
createdAt: expect.any(String),
|
|
4144
5036
|
depositAddressId: expect.any(String),
|
|
4145
5037
|
id: expect.any(String),
|
|
5038
|
+
providerDeliveredAt: expect.any(String),
|
|
4146
5039
|
snapshot: { depositAddressId: expect.any(String) },
|
|
5040
|
+
statusUpdatedAt: expect.any(String),
|
|
4147
5041
|
updatedAt: expect.any(String),
|
|
4148
5042
|
},
|
|
4149
5043
|
],
|
|
@@ -4151,6 +5045,7 @@ describe('createTracker', () => {
|
|
|
4151
5045
|
id: expect.any(String),
|
|
4152
5046
|
providerOutputToken: expect.any(Object),
|
|
4153
5047
|
snapshot: expect.any(Object),
|
|
5048
|
+
statusUpdatedAt: expect.any(String),
|
|
4154
5049
|
},
|
|
4155
5050
|
},
|
|
4156
5051
|
`
|
|
@@ -4165,6 +5060,7 @@ describe('createTracker', () => {
|
|
|
4165
5060
|
"orgId": "org_precision_reconciliation",
|
|
4166
5061
|
"pollObservedAt": null,
|
|
4167
5062
|
"projectId": null,
|
|
5063
|
+
"providerDeliveredAt": Any<String>,
|
|
4168
5064
|
"providerOutputAmount": {
|
|
4169
5065
|
"baseUnits": "2000000",
|
|
4170
5066
|
"currency": "USD",
|
|
@@ -4186,6 +5082,7 @@ describe('createTracker', () => {
|
|
|
4186
5082
|
"relay-multiple-transfer-request",
|
|
4187
5083
|
],
|
|
4188
5084
|
"providerState": null,
|
|
5085
|
+
"providerSubsidy": null,
|
|
4189
5086
|
"providerTransactionHashes": [
|
|
4190
5087
|
"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
|
|
4191
5088
|
],
|
|
@@ -4264,7 +5161,9 @@ describe('createTracker', () => {
|
|
|
4264
5161
|
"sourceTransferIndex": 1,
|
|
4265
5162
|
"status": "completed",
|
|
4266
5163
|
"statusReason": null,
|
|
5164
|
+
"statusUpdatedAt": Any<String>,
|
|
4267
5165
|
"subsidyAmount": null,
|
|
5166
|
+
"subsidyMeterReportedAt": null,
|
|
4268
5167
|
"tempoGasPaid": null,
|
|
4269
5168
|
"updatedAt": Any<String>,
|
|
4270
5169
|
"version": 3,
|
|
@@ -4279,6 +5178,7 @@ describe('createTracker', () => {
|
|
|
4279
5178
|
"orgId": "org_precision_reconciliation",
|
|
4280
5179
|
"pollObservedAt": null,
|
|
4281
5180
|
"projectId": null,
|
|
5181
|
+
"providerDeliveredAt": Any<String>,
|
|
4282
5182
|
"providerOutputAmount": {
|
|
4283
5183
|
"baseUnits": "1000000",
|
|
4284
5184
|
"currency": "USD",
|
|
@@ -4300,6 +5200,25 @@ describe('createTracker', () => {
|
|
|
4300
5200
|
"relay-multiple-transfer-request",
|
|
4301
5201
|
],
|
|
4302
5202
|
"providerState": null,
|
|
5203
|
+
"providerSubsidy": {
|
|
5204
|
+
"amount": {
|
|
5205
|
+
"baseUnits": "23838",
|
|
5206
|
+
"currency": "USD",
|
|
5207
|
+
"decimals": 18,
|
|
5208
|
+
"formatted": "0.000000000000023838",
|
|
5209
|
+
},
|
|
5210
|
+
"provider": "relay",
|
|
5211
|
+
"token": {
|
|
5212
|
+
"address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
|
|
5213
|
+
"currency": "USD",
|
|
5214
|
+
"decimals": 18,
|
|
5215
|
+
"name": "USD Coin",
|
|
5216
|
+
"standard": "ERC-20",
|
|
5217
|
+
"symbol": "USDC",
|
|
5218
|
+
"tokenKey": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
|
|
5219
|
+
"verified": true,
|
|
5220
|
+
},
|
|
5221
|
+
},
|
|
4303
5222
|
"providerTransactionHashes": [
|
|
4304
5223
|
"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
|
|
4305
5224
|
],
|
|
@@ -4378,7 +5297,9 @@ describe('createTracker', () => {
|
|
|
4378
5297
|
"sourceTransferIndex": 0,
|
|
4379
5298
|
"status": "completed",
|
|
4380
5299
|
"statusReason": null,
|
|
5300
|
+
"statusUpdatedAt": Any<String>,
|
|
4381
5301
|
"subsidyAmount": null,
|
|
5302
|
+
"subsidyMeterReportedAt": null,
|
|
4382
5303
|
"tempoGasPaid": null,
|
|
4383
5304
|
"updatedAt": Any<String>,
|
|
4384
5305
|
"version": 3,
|
|
@@ -4392,8 +5313,8 @@ describe('createTracker', () => {
|
|
|
4392
5313
|
},
|
|
4393
5314
|
"storedAddress": {
|
|
4394
5315
|
"address": "0x1212121212121212121212121212121212121212",
|
|
4395
|
-
"apiKeyId": "key_precision_reconciliation",
|
|
4396
5316
|
"createdAt": "2026-01-03T00:00:00.000Z",
|
|
5317
|
+
"creatorUserId": null,
|
|
4397
5318
|
"deliveryStrategy": "provider",
|
|
4398
5319
|
"destinationTokenKey": "eip155:4217/erc20:0x20c000000000000000000000b9537d11c60e8b50",
|
|
4399
5320
|
"environment": "production",
|
|
@@ -4425,6 +5346,7 @@ describe('createTracker', () => {
|
|
|
4425
5346
|
"sourceChainId": "eip155:8453",
|
|
4426
5347
|
"sourceTokenKey": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
|
|
4427
5348
|
"status": "active",
|
|
5349
|
+
"statusUpdatedAt": Any<String>,
|
|
4428
5350
|
"subsidize": false,
|
|
4429
5351
|
"updatedAt": "2026-01-03T00:00:00.000Z",
|
|
4430
5352
|
"version": 1,
|
|
@@ -4438,6 +5360,18 @@ describe('createTracker', () => {
|
|
|
4438
5360
|
})
|
|
4439
5361
|
})
|
|
4440
5362
|
|
|
5363
|
+
function providerOperationCounts(events: readonly Parameters<Metrics.Metrics['count']>[]) {
|
|
5364
|
+
const counts = new Map<string, number>()
|
|
5365
|
+
for (const [name, value, tags] of events) {
|
|
5366
|
+
if (name !== 'routes_provider_operation_count') continue
|
|
5367
|
+
const key = [tags?.['provider'], tags?.['operation'], tags?.['outcome'], tags?.['failure']]
|
|
5368
|
+
.filter(Boolean)
|
|
5369
|
+
.join(':')
|
|
5370
|
+
counts.set(key, (counts.get(key) ?? 0) + value)
|
|
5371
|
+
}
|
|
5372
|
+
return Object.fromEntries([...counts].sort(([a], [b]) => a.localeCompare(b)))
|
|
5373
|
+
}
|
|
5374
|
+
|
|
4441
5375
|
function transferLog(options: transferLog.Options) {
|
|
4442
5376
|
return {
|
|
4443
5377
|
address: options.token,
|