tapimo 0.19.0 → 0.20.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 +13 -5
- package/dist/ApiKey.d.ts +2 -2
- package/dist/ApiKey.d.ts.map +1 -1
- package/dist/ApiKey.js +2 -2
- package/dist/ApiKey.js.map +1 -1
- package/dist/ApiKeys.d.ts +85 -11
- package/dist/ApiKeys.d.ts.map +1 -1
- package/dist/ApiKeys.js +218 -56
- package/dist/ApiKeys.js.map +1 -1
- package/dist/App.d.ts +12543 -13912
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +4 -5
- package/dist/App.js.map +1 -1
- package/dist/Scope.d.ts +12 -20
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +20 -36
- package/dist/Scope.js.map +1 -1
- package/dist/admin/App.d.ts +871 -828
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/App.js +14 -26
- package/dist/admin/App.js.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +93 -186
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +3 -5
- package/dist/admin/apps/api-keys.js.map +1 -1
- package/dist/admin/apps/audit-logs.d.ts +18 -18
- package/dist/admin/apps/audit-logs.js +1 -1
- package/dist/admin/apps/audit-logs.js.map +1 -1
- package/dist/admin/apps/earn-vaults.d.ts +27 -27
- package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
- package/dist/admin/apps/earn-vaults.js +11 -5
- package/dist/admin/apps/earn-vaults.js.map +1 -1
- package/dist/admin/apps/organizations.d.ts +17 -17
- package/dist/admin/apps/prop-amms.d.ts +4 -4
- package/dist/admin/apps/routes-support.js +1 -38
- package/dist/admin/apps/routes-support.js.map +1 -1
- package/dist/admin/apps/routes.d.ts +153 -153
- package/dist/admin/apps/sentinel.d.ts +4 -4
- package/dist/admin/apps/verified-tokens.d.ts +24 -24
- package/dist/admin/apps/zone-delegation-requests.d.ts +332 -0
- package/dist/admin/apps/zone-delegation-requests.d.ts.map +1 -0
- package/dist/admin/apps/zone-delegation-requests.js +200 -0
- package/dist/admin/apps/zone-delegation-requests.js.map +1 -0
- package/dist/admin/apps/zone-delegations.d.ts +512 -52
- package/dist/admin/apps/zone-delegations.d.ts.map +1 -1
- package/dist/admin/apps/zone-delegations.js +134 -44
- package/dist/admin/apps/zone-delegations.js.map +1 -1
- package/dist/admin/index.d.ts +1 -1
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.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 +341 -397
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
- package/dist/analytics/tables/requestEvents.js +4 -2
- package/dist/analytics/tables/requestEvents.js.map +1 -1
- package/dist/apps/data/App.d.ts +11932 -13214
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/App.js +32 -13
- package/dist/apps/data/App.js.map +1 -1
- package/dist/apps/data/ZoneSelection.d.ts +1 -1
- package/dist/apps/data/ZoneSelection.d.ts.map +1 -1
- package/dist/apps/data/ZoneSelection.js +2 -2
- package/dist/apps/data/ZoneSelection.js.map +1 -1
- package/dist/apps/data/routes/activities.d.ts +60 -27
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +91 -16
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +893 -875
- package/dist/apps/data/routes/addresses.d.ts.map +1 -1
- package/dist/apps/data/routes/balances.d.ts +36 -36
- package/dist/apps/data/routes/balances.d.ts.map +1 -1
- package/dist/apps/data/routes/balances.js +3 -1
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/blocks.d.ts +40 -40
- package/dist/apps/data/routes/blocks.d.ts.map +1 -1
- package/dist/apps/data/routes/blocks.js +3 -7
- package/dist/apps/data/routes/blocks.js.map +1 -1
- package/dist/apps/data/routes/coingecko.d.ts +236 -236
- package/dist/apps/data/routes/earn-transactions.d.ts +14 -14
- package/dist/apps/data/routes/earn.d.ts +261 -1445
- package/dist/apps/data/routes/earn.d.ts.map +1 -1
- package/dist/apps/data/routes/earn.js +64 -490
- package/dist/apps/data/routes/earn.js.map +1 -1
- package/dist/apps/data/routes/exchanges.d.ts +144 -144
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +5 -15
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +3 -9
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +13 -13
- package/dist/apps/data/routes/receipts.d.ts +53 -53
- package/dist/apps/data/routes/receipts.js +1 -1
- package/dist/apps/data/routes/receipts.js.map +1 -1
- package/dist/apps/data/routes/rpc.d.ts +52 -0
- package/dist/apps/data/routes/rpc.d.ts.map +1 -1
- package/dist/apps/data/routes/rpc.js +19 -18
- package/dist/apps/data/routes/rpc.js.map +1 -1
- package/dist/apps/data/routes/tokenlist.d.ts +14 -14
- package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
- package/dist/apps/data/routes/tokenlist.js +1 -3
- package/dist/apps/data/routes/tokenlist.js.map +1 -1
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +7 -5
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +281 -281
- package/dist/apps/data/routes/transactions.js +3 -3
- package/dist/apps/data/routes/transactions.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +12 -12
- package/dist/apps/data/routes/transfers.d.ts.map +1 -1
- package/dist/apps/data/routes/transfers.js +1 -3
- package/dist/apps/data/routes/transfers.js.map +1 -1
- package/dist/apps/data/routes/valuation.d.ts +30 -30
- package/dist/apps/data/routes/valuation.d.ts.map +1 -1
- package/dist/apps/data/routes/valuation.js +1 -3
- package/dist/apps/data/routes/valuation.js.map +1 -1
- package/dist/apps/data/routes/verified-tokens.d.ts +86 -86
- package/dist/apps/data/routes/webhooks.d.ts +102 -102
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +9 -23
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zone-deposits.d.ts +16 -16
- package/dist/apps/data/routes/zone-withdrawals.d.ts +31 -31
- package/dist/apps/data/routes/zones.d.ts +28 -28
- package/dist/apps/management/App.d.ts +18 -102
- package/dist/apps/management/App.d.ts.map +1 -1
- package/dist/apps/management/App.js +1 -1
- package/dist/apps/management/App.js.map +1 -1
- package/dist/apps/management/routes/api-keys.d.ts +253 -339
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +25 -11
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +92 -92
- package/dist/apps/management/routes/billing.d.ts.map +1 -1
- package/dist/apps/management/routes/billing.js +5 -13
- package/dist/apps/management/routes/billing.js.map +1 -1
- package/dist/apps/management/routes/cli.d.ts.map +1 -1
- package/dist/apps/management/routes/cli.js +3 -9
- package/dist/apps/management/routes/cli.js.map +1 -1
- package/dist/apps/management/routes/faucet.d.ts +16 -16
- package/dist/apps/management/routes/fee-payer-usage.d.ts +38 -38
- package/dist/apps/management/routes/fee-payer-usage.d.ts.map +1 -1
- package/dist/apps/management/routes/fee-payer-usage.js +2 -4
- package/dist/apps/management/routes/fee-payer-usage.js.map +1 -1
- package/dist/apps/management/routes/invitations.d.ts +52 -52
- package/dist/apps/management/routes/invitations.d.ts.map +1 -1
- package/dist/apps/management/routes/invitations.js +4 -12
- package/dist/apps/management/routes/invitations.js.map +1 -1
- package/dist/apps/management/routes/invite-links.d.ts.map +1 -1
- package/dist/apps/management/routes/invite-links.js +6 -14
- package/dist/apps/management/routes/invite-links.js.map +1 -1
- package/dist/apps/management/routes/me.d.ts +6 -6
- package/dist/apps/management/routes/me.d.ts.map +1 -1
- package/dist/apps/management/routes/me.js +3 -7
- package/dist/apps/management/routes/me.js.map +1 -1
- package/dist/apps/management/routes/members.d.ts +84 -84
- package/dist/apps/management/routes/members.d.ts.map +1 -1
- package/dist/apps/management/routes/members.js +2 -4
- package/dist/apps/management/routes/members.js.map +1 -1
- package/dist/apps/management/routes/orgs.d.ts +44 -44
- package/dist/apps/management/routes/orgs.d.ts.map +1 -1
- package/dist/apps/management/routes/orgs.js +2 -6
- package/dist/apps/management/routes/orgs.js.map +1 -1
- package/dist/apps/management/routes/projects.d.ts.map +1 -1
- package/dist/apps/management/routes/projects.js +2 -6
- package/dist/apps/management/routes/projects.js.map +1 -1
- package/dist/apps/management/routes/route-usage.d.ts +34 -34
- package/dist/apps/management/routes/route-usage.d.ts.map +1 -1
- package/dist/apps/management/routes/route-usage.js +2 -4
- package/dist/apps/management/routes/route-usage.js.map +1 -1
- package/dist/apps/management/routes/routes-access-requests.d.ts +120 -91
- package/dist/apps/management/routes/routes-access-requests.d.ts.map +1 -1
- package/dist/apps/management/routes/routes-access-requests.js +49 -9
- package/dist/apps/management/routes/routes-access-requests.js.map +1 -1
- package/dist/apps/management/routes/usage.d.ts.map +1 -1
- package/dist/apps/management/routes/usage.js +8 -16
- package/dist/apps/management/routes/usage.js.map +1 -1
- package/dist/apps/management/routes/verified-token-requests.d.ts +39 -39
- package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
- package/dist/apps/management/routes/verified-token-requests.js +3 -7
- package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
- package/dist/apps/management/routes/webhooks.d.ts +2089 -2089
- package/dist/apps/management/routes/zone-delegations.d.ts +14 -17
- package/dist/apps/management/routes/zone-delegations.d.ts.map +1 -1
- package/dist/apps/management/routes/zone-delegations.js +1 -6
- package/dist/apps/management/routes/zone-delegations.js.map +1 -1
- package/dist/apps/mpp/App.d.ts +44 -44
- package/dist/apps/mpp/App.js +3 -3
- package/dist/apps/mpp/App.js.map +1 -1
- package/dist/apps/mpp/internal/Adapter.js +1 -1
- package/dist/apps/mpp/internal/Adapter.js.map +1 -1
- package/dist/apps/mpp/internal/Error.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Error.js +1 -0
- package/dist/apps/mpp/internal/Error.js.map +1 -1
- package/dist/apps/mpp/internal/Policy.d.ts +5 -1
- package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Policy.js +35 -13
- package/dist/apps/mpp/internal/Policy.js.map +1 -1
- package/dist/apps/relay/App.d.ts +2 -2
- package/dist/apps/relay/App.d.ts.map +1 -1
- package/dist/apps/relay/App.js +25 -16
- package/dist/apps/relay/App.js.map +1 -1
- package/dist/apps/routes/App.d.ts +311 -311
- package/dist/apps/routes/routes/deposit-addresses.d.ts +1099 -1099
- package/dist/apps/routes/routes/list.d.ts +74 -74
- package/dist/apps/routes/routes/transfers.d.ts +94 -94
- package/dist/cli/ApiKeys.d.ts +19 -26
- package/dist/cli/ApiKeys.d.ts.map +1 -1
- package/dist/db/Db.d.ts +3 -3
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +27 -0
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +28 -62
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +18 -18
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/rewardRuns.d.ts +21 -0
- package/dist/db/tables/rewardRuns.d.ts.map +1 -1
- package/dist/db/tables/rewardRuns.js +19 -0
- package/dist/db/tables/rewardRuns.js.map +1 -1
- package/dist/db/tables/routesAccessRequests.d.ts +13 -0
- package/dist/db/tables/routesAccessRequests.d.ts.map +1 -1
- package/dist/db/tables/routesAccessRequests.js +12 -0
- package/dist/db/tables/routesAccessRequests.js.map +1 -1
- package/dist/db/tables/zoneDelegationRequests.d.ts +165 -0
- package/dist/db/tables/zoneDelegationRequests.d.ts.map +1 -0
- package/dist/db/tables/{zoneKeyRequests.js → zoneDelegationRequests.js} +43 -42
- package/dist/db/tables/zoneDelegationRequests.js.map +1 -0
- package/dist/db/tables/zoneDelegations.d.ts +11 -5
- package/dist/db/tables/zoneDelegations.d.ts.map +1 -1
- package/dist/db/tables/zoneDelegations.js +21 -3
- package/dist/db/tables/zoneDelegations.js.map +1 -1
- package/dist/handlers/internal/accounts.d.ts +7 -0
- package/dist/handlers/internal/accounts.d.ts.map +1 -0
- package/dist/handlers/internal/{multisig.js → accounts.js} +10 -10
- package/dist/handlers/internal/{multisig.js.map → accounts.js.map} +1 -1
- package/dist/handlers/internal/sponsorship.js +17 -17
- package/dist/handlers/internal/sponsorship.js.map +1 -1
- package/dist/handlers/relay.d.ts +6 -6
- package/dist/handlers/relay.d.ts.map +1 -1
- package/dist/handlers/relay.js +15 -15
- package/dist/handlers/relay.js.map +1 -1
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +4 -8
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/EarnRates.d.ts.map +1 -1
- package/dist/internal/EarnRates.js +1 -3
- package/dist/internal/EarnRates.js.map +1 -1
- package/dist/internal/EarnVaults.js +2 -2
- package/dist/internal/Log.d.ts +2 -4
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +0 -3
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/Response.d.ts +1 -1
- package/dist/internal/Response.d.ts.map +1 -1
- package/dist/internal/Response.js +0 -3
- package/dist/internal/Response.js.map +1 -1
- package/dist/internal/Schema.d.ts +11 -0
- package/dist/internal/Schema.d.ts.map +1 -1
- package/dist/internal/Schema.js +24 -1
- package/dist/internal/Schema.js.map +1 -1
- package/dist/internal/ZoneAccess.d.ts +70 -35
- package/dist/internal/ZoneAccess.d.ts.map +1 -1
- package/dist/internal/ZoneAccess.js +312 -131
- package/dist/internal/ZoneAccess.js.map +1 -1
- package/dist/internal/ZoneDelegation.d.ts +7 -19
- package/dist/internal/ZoneDelegation.d.ts.map +1 -1
- package/dist/internal/ZoneDelegation.js +8 -29
- package/dist/internal/ZoneDelegation.js.map +1 -1
- package/dist/internal/{ZoneKeyApproval.d.ts → ZoneDelegationApproval.d.ts} +3 -5
- package/dist/internal/ZoneDelegationApproval.d.ts.map +1 -0
- package/dist/internal/ZoneDelegationApproval.js +16 -0
- package/dist/internal/ZoneDelegationApproval.js.map +1 -0
- package/dist/internal/ZoneKeyRewrite.d.ts +98 -0
- package/dist/internal/ZoneKeyRewrite.d.ts.map +1 -0
- package/dist/internal/ZoneKeyRewrite.js +151 -0
- package/dist/internal/ZoneKeyRewrite.js.map +1 -0
- package/dist/internal/rewards/Campaigns.d.ts +2 -0
- package/dist/internal/rewards/Campaigns.d.ts.map +1 -1
- package/dist/internal/rewards/Campaigns.js.map +1 -1
- package/dist/internal/rewards/Distributions.d.ts.map +1 -1
- package/dist/internal/rewards/Distributions.js +2 -6
- package/dist/internal/rewards/Distributions.js.map +1 -1
- package/dist/internal/rewards/Monitor.d.ts +4 -1
- package/dist/internal/rewards/Monitor.d.ts.map +1 -1
- package/dist/internal/rewards/Monitor.js +19 -2
- package/dist/internal/rewards/Monitor.js.map +1 -1
- package/dist/internal/rewards/Runner.d.ts.map +1 -1
- package/dist/internal/rewards/Runner.js +9 -1
- package/dist/internal/rewards/Runner.js.map +1 -1
- package/dist/internal/routes/Action.d.ts.map +1 -1
- package/dist/internal/routes/Action.js +2 -3
- package/dist/internal/routes/Action.js.map +1 -1
- package/dist/internal/routes/Deposit.d.ts.map +1 -1
- package/dist/internal/routes/Deposit.js +2 -6
- package/dist/internal/routes/Deposit.js.map +1 -1
- package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
- package/dist/internal/routes/DepositAddress.js +4 -10
- package/dist/internal/routes/DepositAddress.js.map +1 -1
- package/dist/internal/routes/Policy.d.ts.map +1 -1
- package/dist/internal/routes/Policy.js +2 -1
- package/dist/internal/routes/Policy.js.map +1 -1
- package/dist/internal/routes/Provider.js +8 -8
- package/dist/internal/routes/Provider.js.map +1 -1
- package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
- package/dist/internal/routes/Reconciliation.js +3 -2
- package/dist/internal/routes/Reconciliation.js.map +1 -1
- package/dist/internal/routes/Transfer.d.ts.map +1 -1
- package/dist/internal/routes/Transfer.js +4 -12
- package/dist/internal/routes/Transfer.js.map +1 -1
- package/dist/internal/routes/UniversalDepositAddress.d.ts.map +1 -1
- package/dist/internal/routes/UniversalDepositAddress.js +3 -6
- package/dist/internal/routes/UniversalDepositAddress.js.map +1 -1
- package/dist/internal/routes/providers/SquidOrder.d.ts.map +1 -1
- package/dist/internal/routes/providers/SquidOrder.js +3 -2
- package/dist/internal/routes/providers/SquidOrder.js.map +1 -1
- package/dist/internal/routes/providers/relay.d.ts.map +1 -1
- package/dist/internal/routes/providers/relay.js +4 -3
- package/dist/internal/routes/providers/relay.js.map +1 -1
- package/package.json +20 -5
- package/src/ApiKey.ts +2 -2
- package/src/ApiKeys.test.ts +284 -51
- package/src/ApiKeys.ts +297 -64
- package/src/App.ts +4 -5
- package/src/Client.test-d.ts +33 -126
- package/src/Scope.test.ts +26 -45
- package/src/Scope.ts +24 -37
- package/src/admin/App.test.ts +51 -4
- package/src/admin/App.ts +25 -33
- package/src/admin/Mcp.test.ts +2 -1
- package/src/admin/apps/api-keys.test.ts +90 -20
- package/src/admin/apps/api-keys.ts +5 -8
- package/src/admin/apps/audit-logs.ts +1 -1
- package/src/admin/apps/earn-vaults.test.ts +19 -19
- package/src/admin/apps/earn-vaults.ts +11 -5
- package/src/admin/apps/routes-support.test.ts +254 -3
- package/src/admin/apps/routes-support.ts +1 -44
- package/src/admin/apps/scopes.test.ts +3 -3
- package/src/admin/apps/zone-delegation-requests.test.ts +246 -0
- package/src/admin/apps/zone-delegation-requests.ts +240 -0
- package/src/admin/apps/zone-delegations.test.ts +218 -58
- package/src/admin/apps/zone-delegations.ts +146 -46
- package/src/admin/index.ts +1 -1
- package/src/admin/ui/src/components/ApiKeyForm.tsx +4 -3
- package/src/admin/ui/src/lib/config.ts +3 -3
- package/src/admin/ui/src/lib/query-client.ts +1 -1
- package/src/admin/ui/src/lib/review-queues.ts +10 -10
- package/src/admin/ui/src/lib/routes-setup.test.ts +1 -2
- package/src/admin/ui/src/lib/routes-setup.ts +3 -5
- package/src/admin/ui/src/lib/scopes.test.ts +3 -6
- package/src/admin/ui/src/lib/scopes.ts +2 -9
- package/src/admin/ui/src/lib/{zone-key-requests.ts → zone-delegation-requests.ts} +27 -31
- package/src/admin/ui/src/routeTree.gen.ts +17 -17
- package/src/admin/ui/src/routes/__root.tsx +1 -1
- package/src/admin/ui/src/routes/api-keys.tsx +2 -15
- package/src/admin/ui/src/routes/audit-logs.tsx +2 -2
- package/src/admin/ui/src/routes/index.tsx +11 -11
- package/src/admin/ui/src/routes/organizations.tsx +3 -1
- package/src/admin/ui/src/routes/organizations_.$orgId.tsx +3 -1
- package/src/admin/ui/src/routes/organizations_.$orgId_.setup.tsx +1 -3
- package/src/admin/ui/src/routes/{zone-key-requests.tsx → zone-delegation-requests.tsx} +228 -172
- package/src/admin/ui/vite.config.ts +14 -1
- package/src/admin/ui.generated.ts +412 -583
- package/src/analytics/tables/requestEvents.test.ts +13 -3
- package/src/analytics/tables/requestEvents.ts +4 -3
- package/src/apps/data/App.test.ts +72 -35
- package/src/apps/data/App.ts +29 -13
- package/src/apps/data/ZoneSelection.test.ts +53 -70
- package/src/apps/data/ZoneSelection.ts +2 -2
- package/src/apps/data/routes/activities.test.ts +140 -6
- package/src/apps/data/routes/activities.ts +124 -18
- package/src/apps/data/routes/balances.ts +5 -1
- package/src/apps/data/routes/blocks.ts +9 -13
- package/src/apps/data/routes/earn-transactions.local.test.ts +6 -1
- package/src/apps/data/routes/earn-transactions.test.ts +7 -3
- package/src/apps/data/routes/earn.bench.ts +0 -14
- package/src/apps/data/routes/earn.discovery.test.ts +4 -39
- package/src/apps/data/routes/earn.local.test.ts +27 -34
- package/src/apps/data/routes/earn.test.ts +172 -490
- package/src/apps/data/routes/earn.ts +103 -652
- package/src/apps/data/routes/exchanges.ts +20 -30
- package/src/apps/data/routes/fee-amm.ts +12 -18
- package/src/apps/data/routes/indexer.test.ts +14 -12
- package/src/apps/data/routes/receipts.ts +1 -1
- package/src/apps/data/routes/rpc.test.ts +23 -18
- package/src/apps/data/routes/rpc.ts +21 -21
- package/src/apps/data/routes/rpc.zone.test.ts +60 -6
- package/src/apps/data/routes/tokenlist.ts +4 -6
- package/src/apps/data/routes/tokens.test.ts +20 -0
- package/src/apps/data/routes/tokens.ts +10 -5
- package/src/apps/data/routes/transactions.ts +3 -3
- package/src/apps/data/routes/transfers.ts +4 -6
- package/src/apps/data/routes/valuation.test.ts +2 -4
- package/src/apps/data/routes/valuation.ts +4 -6
- package/src/apps/data/routes/webhooks.test.ts +1 -5
- package/src/apps/data/routes/webhooks.ts +30 -44
- package/src/apps/data/routes/zones.test.ts +35 -19
- package/src/apps/management/App.ts +3 -1
- package/src/apps/management/routes/api-keys.test.ts +112 -22
- package/src/apps/management/routes/api-keys.ts +30 -15
- package/src/apps/management/routes/billing.ts +17 -25
- package/src/apps/management/routes/cli.ts +12 -18
- package/src/apps/management/routes/fee-payer-usage.ts +5 -4
- package/src/apps/management/routes/invitations.ts +16 -21
- package/src/apps/management/routes/invite-links.ts +18 -26
- package/src/apps/management/routes/me.ts +9 -13
- package/src/apps/management/routes/members.ts +5 -7
- package/src/apps/management/routes/orgs.ts +8 -12
- package/src/apps/management/routes/projects.ts +8 -12
- package/src/apps/management/routes/route-usage.ts +5 -4
- package/src/apps/management/routes/routes-access-requests.test.ts +64 -2
- package/src/apps/management/routes/routes-access-requests.ts +99 -15
- package/src/apps/management/routes/scopes.test.ts +3 -3
- package/src/apps/management/routes/usage.ts +20 -28
- package/src/apps/management/routes/verified-token-requests.ts +9 -13
- package/src/apps/management/routes/zone-delegations.test.ts +3 -5
- package/src/apps/management/routes/zone-delegations.ts +4 -9
- package/src/apps/mpp/App.ts +3 -3
- package/src/apps/mpp/Mpp.zone.test.ts +49 -18
- package/src/apps/mpp/internal/Adapter.ts +1 -1
- package/src/apps/mpp/internal/Error.test.ts +3 -0
- package/src/apps/mpp/internal/Error.ts +1 -0
- package/src/apps/mpp/internal/Policy.test.ts +9 -8
- package/src/apps/mpp/internal/Policy.ts +37 -14
- package/src/apps/relay/App.sandbox.test.ts +15 -14
- package/src/apps/relay/App.test.ts +120 -61
- package/src/apps/relay/App.ts +28 -18
- package/src/apps/relay/App.zone-billing.test.ts +9 -4
- package/src/apps/routes/App.test.ts +21 -22
- package/src/db/Db.ts +34 -3
- package/src/db/Schema.ts +26 -26
- package/src/db/tables/rewardRuns.ts +39 -0
- package/src/db/tables/routesAccessRequests.test.ts +65 -0
- package/src/db/tables/routesAccessRequests.ts +25 -0
- package/src/db/tables/{zoneKeyRequests.test.ts → zoneDelegationRequests.test.ts} +36 -77
- package/src/db/tables/{zoneKeyRequests.ts → zoneDelegationRequests.ts} +69 -52
- package/src/db/tables/zoneDelegations.test.ts +5 -6
- package/src/db/tables/zoneDelegations.ts +25 -8
- package/src/handlers/internal/{multisig.store.test.ts → accounts.store.test.ts} +16 -16
- package/src/handlers/internal/{multisig.test.ts → accounts.test.ts} +85 -82
- package/src/handlers/internal/{multisig.ts → accounts.ts} +9 -9
- package/src/handlers/internal/sponsorship.ts +20 -20
- package/src/handlers/relay.test.ts +48 -46
- package/src/handlers/relay.ts +26 -26
- package/src/internal/Auth.test.ts +6 -2
- package/src/internal/Auth.ts +4 -10
- package/src/internal/EarnRates.ts +4 -6
- package/src/internal/EarnVaults.ts +2 -2
- package/src/internal/Log.test-d.ts +1 -0
- package/src/internal/Log.test.ts +4 -6
- package/src/internal/Log.ts +2 -6
- package/src/internal/Response.ts +0 -3
- package/src/internal/Schema.test.ts +42 -0
- package/src/internal/Schema.ts +36 -1
- package/src/internal/ZoneAccess.test.ts +515 -312
- package/src/internal/ZoneAccess.ts +410 -158
- package/src/internal/ZoneDelegation.test.ts +1 -41
- package/src/internal/ZoneDelegation.ts +10 -48
- package/src/internal/ZoneDelegationApproval.test.ts +22 -0
- package/src/internal/{ZoneKeyApproval.ts → ZoneDelegationApproval.ts} +4 -11
- package/src/internal/ZoneKeyRewrite.ts +231 -0
- package/src/internal/rewards/Campaigns.ts +2 -0
- package/src/internal/rewards/Distributions.ts +8 -12
- package/src/internal/rewards/Monitor.test.ts +64 -0
- package/src/internal/rewards/Monitor.ts +27 -4
- package/src/internal/rewards/Runner.ts +9 -1
- package/src/internal/routes/Action.ts +5 -6
- package/src/internal/routes/Deposit.ts +8 -12
- package/src/internal/routes/DepositAddress.ts +13 -19
- package/src/internal/routes/Policy.ts +2 -1
- package/src/internal/routes/Provider.ts +8 -8
- package/src/internal/routes/Reconciliation.ts +3 -2
- package/src/internal/routes/Transfer.ts +16 -24
- package/src/internal/routes/UniversalDepositAddress.ts +9 -12
- package/src/internal/routes/providers/SquidOrder.ts +3 -2
- package/src/internal/routes/providers/relay.ts +4 -3
- package/dist/admin/apps/zone-key-requests.d.ts +0 -406
- package/dist/admin/apps/zone-key-requests.d.ts.map +0 -1
- package/dist/admin/apps/zone-key-requests.js +0 -183
- package/dist/admin/apps/zone-key-requests.js.map +0 -1
- package/dist/db/tables/zoneKeyRequests.d.ts +0 -289
- package/dist/db/tables/zoneKeyRequests.d.ts.map +0 -1
- package/dist/db/tables/zoneKeyRequests.js.map +0 -1
- package/dist/handlers/internal/multisig.d.ts +0 -7
- package/dist/handlers/internal/multisig.d.ts.map +0 -1
- package/dist/internal/ZoneKeyApproval.d.ts.map +0 -1
- package/dist/internal/ZoneKeyApproval.js +0 -21
- package/dist/internal/ZoneKeyApproval.js.map +0 -1
- package/src/admin/apps/zone-key-requests.test.ts +0 -272
- package/src/admin/apps/zone-key-requests.ts +0 -231
- package/src/internal/ZoneKeyApproval.test.ts +0 -46
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Hono } from 'hono';
|
|
2
|
+
import { HTTPException } from 'hono/http-exception';
|
|
2
3
|
import { Value as core_Value } from 'ox';
|
|
3
4
|
import { Abis } from 'viem/tempo';
|
|
4
5
|
import { BaseError, ContractFunctionExecutionError, ContractFunctionRevertedError, ContractFunctionZeroDataError, isAddress, parseAbi, parseUnits, ResourceNotFoundRpcError, zeroAddress, } from 'viem';
|
|
@@ -66,6 +67,8 @@ const scanLimit = 50;
|
|
|
66
67
|
// Concurrent metadata reads in one macrotask collapse into one deployless
|
|
67
68
|
// multicall; an await between small chunks keeps each call under the RPC limit.
|
|
68
69
|
const tokenReadChunkSize = 20;
|
|
70
|
+
// Bumped when the public vault shape changes, so no older cached body is served.
|
|
71
|
+
const vaultCacheName = 'tempo-api:earn-vaults:v7';
|
|
69
72
|
const tempoStateAddress = '0x1c00000000000000000000000000000000000000';
|
|
70
73
|
const tempoStateAbi = parseAbi(['function tempoBlockNumber() view returns (uint64)']);
|
|
71
74
|
const zonePortalAbi = parseAbi(['function lastSyncedTempoBlockNumber() view returns (uint64)']);
|
|
@@ -106,17 +109,13 @@ export var schema;
|
|
|
106
109
|
registerRewardEligibility.Association = z
|
|
107
110
|
.strictObject({
|
|
108
111
|
chainId: Schema.ChainId,
|
|
109
|
-
firstRegisteredAt: z.
|
|
110
|
-
.datetime()
|
|
111
|
-
.check(z.describe('When the association was first registered.'), z.meta({ examples: ['2026-08-25T20:00:00.000Z'] })),
|
|
112
|
+
firstRegisteredAt: Schema.dateTime().check(z.describe('When the association was first registered.'), z.meta({ examples: ['2026-08-25T20:00:00.000Z'] })),
|
|
112
113
|
id: z.string().check(z.describe('Stable reward eligibility association identifier.'), z.meta({
|
|
113
114
|
examples: [
|
|
114
115
|
'0x59d27987bc7cc1521bba5f688a170c65840cbf43-0x8117e0ba6239b9695f780deb010f72a2fa4bdfb6',
|
|
115
116
|
],
|
|
116
117
|
})),
|
|
117
|
-
latestRegisteredAt: z.
|
|
118
|
-
.datetime()
|
|
119
|
-
.check(z.describe('When the association was most recently registered.'), z.meta({ examples: ['2026-08-25T20:00:00.000Z'] })),
|
|
118
|
+
latestRegisteredAt: Schema.dateTime().check(z.describe('When the association was most recently registered.'), z.meta({ examples: ['2026-08-25T20:00:00.000Z'] })),
|
|
120
119
|
registrationOrder: z
|
|
121
120
|
.string()
|
|
122
121
|
.check(z.regex(/^\d+$/), z.describe('Monotonic registration order.'), z.meta({ examples: ['42'] })),
|
|
@@ -303,18 +302,17 @@ export var schema;
|
|
|
303
302
|
capabilities: z
|
|
304
303
|
.optional(EarnVaults.schema.Discovery.shape.capabilities)
|
|
305
304
|
.check(z.describe('Vault capabilities, when requested.')),
|
|
306
|
-
description: z
|
|
307
|
-
.nullable(z.string())
|
|
308
|
-
.check(z.describe('Curated vault description, or null when the vault is not verified.'), z.meta({ examples: ['deelUSD deposited into the canonical Tempo Earn deployment.'] })),
|
|
309
305
|
engine,
|
|
310
|
-
id: Schema.Address.check(z.describe('Stable vault id, equal to the lowercase vault address.'), z.meta({ examples: ['
|
|
306
|
+
id: Schema.Address.check(z.describe('Stable vault id, equal to the lowercase vault address.'), z.meta({ examples: ['0xb20ba39ccf522d69b7a21e3f369be5de73a2c694'] })),
|
|
311
307
|
instantLiquidity: EarnVaults.schema.Discovery.shape.instantLiquidity.check(z.describe('Assets the venue would release right now, capped at the vault backing, in asset base units. Null when the engine interface cannot report a reliable number.')),
|
|
312
308
|
instantLiquidityValue: z
|
|
313
309
|
.optional(z.nullable(value))
|
|
314
310
|
.check(z.describe('Instant liquidity valued in USD, when requested via `include=tvl`, or null when liquidity is unavailable or the asset has no priced display currency.')),
|
|
311
|
+
// Kept as an empty string for clients that require the field; registry labels name
|
|
312
|
+
// customers, so only the admin app serves them.
|
|
315
313
|
label: z
|
|
316
314
|
.string()
|
|
317
|
-
.check(z.describe('
|
|
315
|
+
.check(z.describe('Always empty; curated labels are not public.'), z.meta({ examples: [''] })),
|
|
318
316
|
sharePrice: z
|
|
319
317
|
.nullable(value)
|
|
320
318
|
.check(z.describe('Assets returned for one whole earn share, in the asset display currency, or null when the engine cannot quote an exit.')),
|
|
@@ -331,14 +329,11 @@ export var schema;
|
|
|
331
329
|
},
|
|
332
330
|
],
|
|
333
331
|
})),
|
|
334
|
-
slug: z
|
|
335
|
-
.nullable(z.string())
|
|
336
|
-
.check(z.describe('Curated URL slug, or null when the vault is not verified.'), z.meta({ examples: ['deelusd-earn'] })),
|
|
337
332
|
state: EarnVaults.schema.Discovery.shape.state,
|
|
338
333
|
tvl: z
|
|
339
334
|
.optional(z.nullable(value))
|
|
340
335
|
.check(z.describe('Total assets valued in USD, when requested via `include=tvl`, or null when the asset has no priced display currency.')),
|
|
341
|
-
vaultAddress: Schema.Address.check(z.describe('Earn vault contract address.'), z.meta({ examples: ['
|
|
336
|
+
vaultAddress: Schema.Address.check(z.describe('Earn vault contract address.'), z.meta({ examples: ['0xb20ba39ccf522d69b7a21e3f369be5de73a2c694'] })),
|
|
342
337
|
verified: z
|
|
343
338
|
.boolean()
|
|
344
339
|
.check(z.describe('Whether this vault is in the curated earn registry.'), z.meta({ examples: [true] })),
|
|
@@ -362,8 +357,22 @@ export var schema;
|
|
|
362
357
|
});
|
|
363
358
|
/** One compatible Earn vault resolved from current chain state. */
|
|
364
359
|
schema.Vault = OpenApi.component(Schema.describe(vault, 'A compatible earn vault resolved from chain state.'), 'EarnVault');
|
|
360
|
+
// Registry labels name customers, so only the admin app serves them.
|
|
361
|
+
const curatedVault = z.extend(vault, {
|
|
362
|
+
description: z
|
|
363
|
+
.nullable(z.string())
|
|
364
|
+
.check(z.describe('Curated vault description, or null when the vault is not verified.'), z.meta({ examples: ['pathUSD deposited into the canonical Tempo Earn deployment.'] })),
|
|
365
|
+
label: z
|
|
366
|
+
.string()
|
|
367
|
+
.check(z.describe('Vault display label.'), z.meta({ examples: ['Sentora pathUSD (Earn)'] })),
|
|
368
|
+
slug: z
|
|
369
|
+
.nullable(z.string())
|
|
370
|
+
.check(z.describe('Curated URL slug, or null when the vault is not verified.'), z.meta({ examples: ['sentora-pathusd-earn'] })),
|
|
371
|
+
});
|
|
372
|
+
/** One Earn vault with its curated registry label, slug, and description. */
|
|
373
|
+
schema.CuratedVault = Schema.describe(curatedVault, 'A compatible earn vault with its curated registry fields.');
|
|
365
374
|
/** One registry-curated Earn vault. */
|
|
366
|
-
schema.VerifiedVault = OpenApi.component(Schema.describe(z.extend(
|
|
375
|
+
schema.VerifiedVault = OpenApi.component(Schema.describe(z.extend(curatedVault, {
|
|
367
376
|
engine: z.extend(engine, { type: engineType }),
|
|
368
377
|
slug: z
|
|
369
378
|
.string()
|
|
@@ -452,7 +461,7 @@ export var schema;
|
|
|
452
461
|
assetAmount: value.check(z.describe('Current asset value of the held shares, including fees, in `valueToken` units.')),
|
|
453
462
|
assetToken: Tokens.schema.Token.check(z.describe('Asset accepted by the vault.')),
|
|
454
463
|
chainId: Schema.ChainId.check(z.describe('Chain containing the held shares.'), z.meta({ examples: [42431] })),
|
|
455
|
-
id: Schema.Address.check(z.describe('Stable resource ID for this position, equal to the vault address.'), z.meta({ examples: ['
|
|
464
|
+
id: Schema.Address.check(z.describe('Stable resource ID for this position, equal to the vault address.'), z.meta({ examples: ['0xb20ba39ccf522d69b7a21e3f369be5de73a2c694'] })),
|
|
456
465
|
lifetimeCashFlows: z
|
|
457
466
|
.optional(lifetimeCashFlows)
|
|
458
467
|
.check(z.describe('Lifetime deposits and completed withdrawals, when requested.')),
|
|
@@ -463,7 +472,7 @@ export var schema;
|
|
|
463
472
|
.check(z.describe('The position’s nominal value when `valuation.currency` is requested, or `null` when ' +
|
|
464
473
|
'the asset token is unverified, its display currency has no rate, or rates were unavailable.')),
|
|
465
474
|
valueToken: Tokens.schema.Token.check(z.describe('Parent-chain asset denominating `assetAmount`.')),
|
|
466
|
-
vaultAddress: Schema.Address.check(z.describe('Earn vault contract address holding this position.'), z.meta({ examples: ['
|
|
475
|
+
vaultAddress: Schema.Address.check(z.describe('Earn vault contract address holding this position.'), z.meta({ examples: ['0xb20ba39ccf522d69b7a21e3f369be5de73a2c694'] })),
|
|
467
476
|
verified: z
|
|
468
477
|
.boolean()
|
|
469
478
|
.check(z.describe('Whether the vault is in the curated earn registry.'), z.meta({ examples: [true] })),
|
|
@@ -479,15 +488,11 @@ export var schema;
|
|
|
479
488
|
.enum(['7d', '30d', 'active', 'custom', 'lifetime'])
|
|
480
489
|
.check(z.describe('Earnings period: trailing 7 or 30 days, shares still held, explicit timestamps, or lifetime history.'), z.meta({ examples: ['lifetime'] }));
|
|
481
490
|
const earningsWindow = z.extend(earningsBase, {
|
|
482
|
-
end: z.
|
|
483
|
-
.datetime()
|
|
484
|
-
.check(z.describe('UTC ending boundary. Includes activity through the latest indexed block at or before this timestamp.'), z.meta({ examples: ['2026-09-18T00:00:00.000Z'] })),
|
|
491
|
+
end: Schema.dateTime().check(z.describe('UTC ending boundary. Includes activity through the latest indexed block at or before this timestamp.'), z.meta({ examples: ['2026-09-18T00:00:00.000Z'] })),
|
|
485
492
|
period: z
|
|
486
493
|
.enum(['7d', '30d', 'custom'])
|
|
487
494
|
.check(z.describe('Rolling or explicitly bounded earnings window.'), z.meta({ examples: ['7d'] })),
|
|
488
|
-
start: z.
|
|
489
|
-
.datetime()
|
|
490
|
-
.check(z.describe('UTC opening boundary. Excludes activity through the latest indexed block at or before this timestamp.'), z.meta({ examples: ['2026-09-11T00:00:00.000Z'] })),
|
|
495
|
+
start: Schema.dateTime().check(z.describe('UTC opening boundary. Excludes activity through the latest indexed block at or before this timestamp.'), z.meta({ examples: ['2026-09-11T00:00:00.000Z'] })),
|
|
491
496
|
});
|
|
492
497
|
const earnings = z.union([
|
|
493
498
|
z.extend(earningsBase, {
|
|
@@ -571,47 +576,12 @@ export var schema;
|
|
|
571
576
|
include: includeQuery,
|
|
572
577
|
limit: Schema.Limit,
|
|
573
578
|
});
|
|
574
|
-
const collectionQuery = z
|
|
575
|
-
.extend(collectionFilters, { 'apy.window': EarnRates.schema.Window })
|
|
576
|
-
.check(z.describe('Query parameters for listing earn vaults.'));
|
|
577
579
|
const vaultSelector = z.strictObject({
|
|
578
580
|
chainId: Schema.ChainIdQuery,
|
|
579
581
|
include: includeQuery,
|
|
580
582
|
});
|
|
581
|
-
/**
|
|
582
|
-
|
|
583
|
-
(function (getEarnVaults) {
|
|
584
|
-
/** Query parameters for all compatible deployed Earn vaults. */
|
|
585
|
-
getEarnVaults.Query = collectionQuery;
|
|
586
|
-
/** Paginated list of compatible deployed Earn vaults. */
|
|
587
|
-
getEarnVaults.Response = OpenApi.component(z
|
|
588
|
-
.strictObject({
|
|
589
|
-
data: z
|
|
590
|
-
.array(schema.Vault)
|
|
591
|
-
.check(z.describe('Compatible deployed earn vaults in deployment order.')),
|
|
592
|
-
meta: z.optional(meta),
|
|
593
|
-
nextCursor: Schema.NextCursor,
|
|
594
|
-
})
|
|
595
|
-
.check(z.describe('A page of compatible deployed earn vaults.')), 'EarnVaultList');
|
|
596
|
-
})(getEarnVaults = schema.getEarnVaults || (schema.getEarnVaults = {}));
|
|
597
|
-
/** Schemas for the getVerifiedEarnVaults operation. */
|
|
598
|
-
let getVerifiedEarnVaults;
|
|
599
|
-
(function (getVerifiedEarnVaults) {
|
|
600
|
-
/** Collection query without rates or valuation, for surfaces that cannot measure them. */
|
|
601
|
-
getVerifiedEarnVaults.BaseQuery = Schema.describe(z.extend(collectionFilters, { include: baseIncludeQuery }), 'Query parameters for listing earn vaults.');
|
|
602
|
-
/** Query parameters for registry-curated Earn vaults. */
|
|
603
|
-
getVerifiedEarnVaults.Query = collectionQuery;
|
|
604
|
-
/** Paginated list of registry-curated Earn vaults. */
|
|
605
|
-
getVerifiedEarnVaults.Response = OpenApi.component(z
|
|
606
|
-
.strictObject({
|
|
607
|
-
data: z
|
|
608
|
-
.array(schema.VerifiedVault)
|
|
609
|
-
.check(z.describe('Registry-curated earn vaults ordered by vault address.')),
|
|
610
|
-
meta: z.optional(meta),
|
|
611
|
-
nextCursor: Schema.NextCursor,
|
|
612
|
-
})
|
|
613
|
-
.check(z.describe('A page of registry-curated earn vaults.')), 'VerifiedEarnVaultList');
|
|
614
|
-
})(getVerifiedEarnVaults = schema.getVerifiedEarnVaults || (schema.getVerifiedEarnVaults = {}));
|
|
583
|
+
/** Collection filters without rates or valuation, for surfaces that cannot measure them. */
|
|
584
|
+
schema.VaultCollectionQuery = Schema.describe(z.extend(collectionFilters, { include: baseIncludeQuery }), 'Query parameters for listing earn vaults.');
|
|
615
585
|
/** Schemas for the getEarnAddressPositions operation. */
|
|
616
586
|
let getEarnAddressPositions;
|
|
617
587
|
(function (getEarnAddressPositions) {
|
|
@@ -676,7 +646,7 @@ export var schema;
|
|
|
676
646
|
/** Schemas for the getEarnVaultSharePrices operation. */
|
|
677
647
|
let getEarnVaultSharePrices;
|
|
678
648
|
(function (getEarnVaultSharePrices) {
|
|
679
|
-
const timestamp =
|
|
649
|
+
const timestamp = Schema.dateTime({ offset: true });
|
|
680
650
|
/** Path parameters identifying one Earn vault. */
|
|
681
651
|
getEarnVaultSharePrices.Params = z
|
|
682
652
|
.strictObject({
|
|
@@ -704,9 +674,7 @@ export var schema;
|
|
|
704
674
|
const Point = z
|
|
705
675
|
.strictObject({
|
|
706
676
|
sharePrice: value.check(z.describe('Assets returned for one whole Earn share at the observation block.')),
|
|
707
|
-
timestamp: z.
|
|
708
|
-
.datetime()
|
|
709
|
-
.check(z.describe('Requested daily observation timestamp.'), z.meta({ examples: ['2026-07-01T00:00:00.000Z'] })),
|
|
677
|
+
timestamp: Schema.dateTime().check(z.describe('Requested daily observation timestamp.'), z.meta({ examples: ['2026-07-01T00:00:00.000Z'] })),
|
|
710
678
|
})
|
|
711
679
|
.check(z.describe('One historical Earn vault share price.'));
|
|
712
680
|
/** Daily share prices for one Earn vault. */
|
|
@@ -733,12 +701,12 @@ export var schema;
|
|
|
733
701
|
/** Schemas for the getEarnVaultPosition operation. */
|
|
734
702
|
let getEarnVaultPosition;
|
|
735
703
|
(function (getEarnVaultPosition) {
|
|
736
|
-
const asOf =
|
|
704
|
+
const asOf = Schema.dateTime({ offset: true });
|
|
737
705
|
/** Path parameters identifying the Earn vault and account. */
|
|
738
706
|
getEarnVaultPosition.Params = z
|
|
739
707
|
.strictObject({
|
|
740
708
|
address: Schema.Address.check(z.describe('Account whose earn position to read.')),
|
|
741
|
-
vaultId: Schema.address('
|
|
709
|
+
vaultId: Schema.address('0xb20ba39ccf522d69b7a21e3f369be5de73a2c694').check(z.describe('Earn vault contract address.')),
|
|
742
710
|
})
|
|
743
711
|
.check(z.describe('Path parameters identifying an earn vault position.'));
|
|
744
712
|
/** Query parameters selecting the chain containing the vault. */
|
|
@@ -756,9 +724,7 @@ export var schema;
|
|
|
756
724
|
number: z
|
|
757
725
|
.number()
|
|
758
726
|
.check(z.int(), z.nonnegative(), z.describe('Indexed observation block.'), z.meta({ examples: [31039238] })),
|
|
759
|
-
timestamp: z.
|
|
760
|
-
.datetime()
|
|
761
|
-
.check(z.describe('Timestamp of the indexed observation block.'), z.meta({ examples: ['2026-07-21T09:00:00.000Z'] })),
|
|
727
|
+
timestamp: Schema.dateTime().check(z.describe('Timestamp of the indexed observation block.'), z.meta({ examples: ['2026-07-21T09:00:00.000Z'] })),
|
|
762
728
|
})
|
|
763
729
|
.check(z.describe('Indexed block used for a historical Earn position observation.'));
|
|
764
730
|
/** Current or historical asset and Earn-share state for one account in one vault. */
|
|
@@ -826,11 +792,11 @@ export var schema;
|
|
|
826
792
|
.strictObject({
|
|
827
793
|
chainId: Schema.ChainIdQuery,
|
|
828
794
|
end: z
|
|
829
|
-
.optional(
|
|
795
|
+
.optional(Schema.dateTime({ offset: true }))
|
|
830
796
|
.check(z.describe('Required with period=custom. Inclusive ISO 8601 ending timestamp; indexed history must cover this time.'), z.meta({ examples: ['2026-09-18T00:00:00.000Z'] })),
|
|
831
797
|
period: z._default(earningsPeriod, 'lifetime'),
|
|
832
798
|
start: z
|
|
833
|
-
.optional(
|
|
799
|
+
.optional(Schema.dateTime({ offset: true }))
|
|
834
800
|
.check(z.describe('Required with period=custom. Exclusive ISO 8601 opening timestamp, earlier than end.'), z.meta({ examples: ['2026-09-11T00:00:00.000Z'] })),
|
|
835
801
|
})
|
|
836
802
|
.check(z.refine((value) => value.period === 'custom'
|
|
@@ -957,121 +923,6 @@ export function earn(options = {}) {
|
|
|
957
923
|
nextCursor: page.nextCursor,
|
|
958
924
|
vaultAddress: query.vaultAddress,
|
|
959
925
|
}), 200);
|
|
960
|
-
})
|
|
961
|
-
.get('/v1/earn/vaults', Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }), OpenApi.validate('query', schema.getEarnVaults.Query, {
|
|
962
|
-
code: 'query_invalid',
|
|
963
|
-
message: 'Invalid query parameters',
|
|
964
|
-
}), OpenApi.describeRoute({
|
|
965
|
-
description: 'Lists compatible earn vaults discovered from deployment events and resolved from current chain state.',
|
|
966
|
-
operationId: 'getEarnVaults',
|
|
967
|
-
responses: OpenApi.responses({
|
|
968
|
-
errors: {
|
|
969
|
-
400: {
|
|
970
|
-
codes: ['chain_id_invalid', 'chain_id_unsupported', 'query_invalid'],
|
|
971
|
-
},
|
|
972
|
-
502: 'Could not read earn deployment or vault data.',
|
|
973
|
-
},
|
|
974
|
-
success: {
|
|
975
|
-
description: 'A page of compatible deployed earn vaults.',
|
|
976
|
-
schema: schema.getEarnVaults.Response,
|
|
977
|
-
},
|
|
978
|
-
}),
|
|
979
|
-
summary: 'List vaults',
|
|
980
|
-
tags: ['Earn'],
|
|
981
|
-
}),
|
|
982
|
-
// Live state and rate enrichment are embedded, so every vault read caches
|
|
983
|
-
// as current-state rather than slow-changing metadata.
|
|
984
|
-
Cache.response({
|
|
985
|
-
cacheControl: Cache.policies.state,
|
|
986
|
-
key: (c) => vaultCacheKey(c, schema.getEarnVaults.Query),
|
|
987
|
-
name: 'tempo-api:earn-vaults:v5',
|
|
988
|
-
}), async (c) => {
|
|
989
|
-
if (Auth.narrowAccess)
|
|
990
|
-
return Auth.paidAccessError(c);
|
|
991
|
-
if (OpenApi.narrowValidation)
|
|
992
|
-
return Response.error(c, {
|
|
993
|
-
code: 'chain_id_invalid',
|
|
994
|
-
message: 'Invalid chain id',
|
|
995
|
-
status: 400,
|
|
996
|
-
});
|
|
997
|
-
if (OpenApi.narrowValidation)
|
|
998
|
-
return Response.error(c, {
|
|
999
|
-
code: 'chain_id_unsupported',
|
|
1000
|
-
message: 'Unsupported chain id',
|
|
1001
|
-
status: 400,
|
|
1002
|
-
});
|
|
1003
|
-
if (OpenApi.narrowValidation)
|
|
1004
|
-
return OpenApi.validationError(c, {
|
|
1005
|
-
code: 'query_invalid',
|
|
1006
|
-
message: 'Invalid query parameters',
|
|
1007
|
-
});
|
|
1008
|
-
const query = c.req.valid('query');
|
|
1009
|
-
try {
|
|
1010
|
-
const chainId = query.chainId ?? c.get('chainId');
|
|
1011
|
-
const data = await listVaults(c, { ...query, chainId, oracle });
|
|
1012
|
-
return c.json(Response.validated(schema.getEarnVaults.Response, data), 200);
|
|
1013
|
-
}
|
|
1014
|
-
catch (cause) {
|
|
1015
|
-
return Response.upstream(c, cause);
|
|
1016
|
-
}
|
|
1017
|
-
})
|
|
1018
|
-
.get('/v1/earn/vaults/verified', Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }), OpenApi.validate('query', schema.getVerifiedEarnVaults.Query, {
|
|
1019
|
-
code: 'query_invalid',
|
|
1020
|
-
message: 'Invalid query parameters',
|
|
1021
|
-
}), OpenApi.describeRoute({
|
|
1022
|
-
description: 'Lists registry-curated earn vaults after resolving their current onchain configuration.',
|
|
1023
|
-
operationId: 'getVerifiedEarnVaults',
|
|
1024
|
-
responses: OpenApi.responses({
|
|
1025
|
-
errors: {
|
|
1026
|
-
400: {
|
|
1027
|
-
codes: ['chain_id_invalid', 'chain_id_unsupported', 'query_invalid'],
|
|
1028
|
-
},
|
|
1029
|
-
502: 'Could not read curated earn registry or vault data.',
|
|
1030
|
-
},
|
|
1031
|
-
success: {
|
|
1032
|
-
description: 'A page of registry-curated earn vaults.',
|
|
1033
|
-
schema: schema.getVerifiedEarnVaults.Response,
|
|
1034
|
-
},
|
|
1035
|
-
}),
|
|
1036
|
-
summary: 'List verified vaults',
|
|
1037
|
-
tags: ['Earn'],
|
|
1038
|
-
}), Cache.response({
|
|
1039
|
-
cacheControl: Cache.policies.state,
|
|
1040
|
-
key: (c) => vaultCacheKey(c, schema.getVerifiedEarnVaults.Query),
|
|
1041
|
-
name: 'tempo-api:earn-vaults:v4',
|
|
1042
|
-
}), async (c) => {
|
|
1043
|
-
if (Auth.narrowAccess)
|
|
1044
|
-
return Auth.paidAccessError(c);
|
|
1045
|
-
if (OpenApi.narrowValidation)
|
|
1046
|
-
return Response.error(c, {
|
|
1047
|
-
code: 'chain_id_invalid',
|
|
1048
|
-
message: 'Invalid chain id',
|
|
1049
|
-
status: 400,
|
|
1050
|
-
});
|
|
1051
|
-
if (OpenApi.narrowValidation)
|
|
1052
|
-
return Response.error(c, {
|
|
1053
|
-
code: 'chain_id_unsupported',
|
|
1054
|
-
message: 'Unsupported chain id',
|
|
1055
|
-
status: 400,
|
|
1056
|
-
});
|
|
1057
|
-
if (OpenApi.narrowValidation)
|
|
1058
|
-
return OpenApi.validationError(c, {
|
|
1059
|
-
code: 'query_invalid',
|
|
1060
|
-
message: 'Invalid query parameters',
|
|
1061
|
-
});
|
|
1062
|
-
const query = c.req.valid('query');
|
|
1063
|
-
try {
|
|
1064
|
-
const chainId = query.chainId ?? c.get('chainId');
|
|
1065
|
-
const data = await listVerifiedVaults(c, {
|
|
1066
|
-
...query,
|
|
1067
|
-
chainId,
|
|
1068
|
-
oracle,
|
|
1069
|
-
});
|
|
1070
|
-
return c.json(Response.validated(schema.getVerifiedEarnVaults.Response, data), 200);
|
|
1071
|
-
}
|
|
1072
|
-
catch (cause) {
|
|
1073
|
-
return Response.upstream(c, cause);
|
|
1074
|
-
}
|
|
1075
926
|
})
|
|
1076
927
|
.get('/v1/earn/addresses/:address/positions', Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }), OpenApi.validate('param', schema.getEarnAddressPositions.Params, {
|
|
1077
928
|
code: 'positions_invalid',
|
|
@@ -1570,8 +1421,13 @@ export function earn(options = {}) {
|
|
|
1570
1421
|
tags: ['Earn'],
|
|
1571
1422
|
}), Cache.response({
|
|
1572
1423
|
cacheControl: Cache.policies.state,
|
|
1573
|
-
key: (c) =>
|
|
1574
|
-
|
|
1424
|
+
key: (c) => {
|
|
1425
|
+
const url = new URL(vaultCacheKey(c, schema.getEarnVault.Query));
|
|
1426
|
+
// The outer edge cache uses this URL, not the inner cache namespace.
|
|
1427
|
+
url.searchParams.set('cache', vaultCacheName);
|
|
1428
|
+
return url.toString();
|
|
1429
|
+
},
|
|
1430
|
+
name: vaultCacheName,
|
|
1575
1431
|
}), async (c) => {
|
|
1576
1432
|
if (Auth.narrowAccess)
|
|
1577
1433
|
return Auth.paidAccessError(c);
|
|
@@ -1617,6 +1473,9 @@ export function earn(options = {}) {
|
|
|
1617
1473
|
message: 'Earn vault not found',
|
|
1618
1474
|
status: 404,
|
|
1619
1475
|
});
|
|
1476
|
+
// A Zone access refusal (`ZoneAccess.visible`) is no upstream failure; it keeps its own status and code.
|
|
1477
|
+
if (cause instanceof HTTPException)
|
|
1478
|
+
throw cause;
|
|
1620
1479
|
return Response.upstream(c, cause);
|
|
1621
1480
|
}
|
|
1622
1481
|
});
|
|
@@ -2420,211 +2279,6 @@ async function getActiveCostBasis(tidx, options) {
|
|
|
2420
2279
|
}
|
|
2421
2280
|
return calculateActiveCostBasis({ actions, shareBalance: options.shareBalance });
|
|
2422
2281
|
}
|
|
2423
|
-
/** Lists compatible deployed Earn vaults. */
|
|
2424
|
-
export async function listVaults(c, options) {
|
|
2425
|
-
const db = Db.get(c.get('dbCached'));
|
|
2426
|
-
const [records, snapshot] = await Promise.all([
|
|
2427
|
-
core_EarnVaults.list(db, { chainId: options.chainId }),
|
|
2428
|
-
VerifiedTokens.snapshot(c, options.chainId),
|
|
2429
|
-
]);
|
|
2430
|
-
const include = vaultInclude(options);
|
|
2431
|
-
const apyByVault = new Map();
|
|
2432
|
-
const registry = new Map(records.map((record) => [record.vaultAddress.toLowerCase(), record]));
|
|
2433
|
-
const decoded = options.cursor ? Cursor.decode(options.cursor, ['int', 'int']) : undefined;
|
|
2434
|
-
let position = decoded
|
|
2435
|
-
? [Number(decoded[0]), Number(decoded[1])]
|
|
2436
|
-
: undefined;
|
|
2437
|
-
let hasMore = false;
|
|
2438
|
-
let scanned = 0;
|
|
2439
|
-
const matches = [];
|
|
2440
|
-
while (matches.length <= options.limit && scanned < maxScannedDeployments) {
|
|
2441
|
-
const page = await queryDeployments(c, {
|
|
2442
|
-
asset: options.asset,
|
|
2443
|
-
chainId: options.chainId,
|
|
2444
|
-
cursor: position,
|
|
2445
|
-
limit: discoveryBatchLimit({
|
|
2446
|
-
filtered: options.capability.length > 0 || options['engine.type'] !== undefined,
|
|
2447
|
-
limit: options.limit,
|
|
2448
|
-
matches: matches.length,
|
|
2449
|
-
remaining: maxScannedDeployments - scanned,
|
|
2450
|
-
}),
|
|
2451
|
-
});
|
|
2452
|
-
hasMore = page.hasMore;
|
|
2453
|
-
if (page.items.length === 0) {
|
|
2454
|
-
hasMore = false;
|
|
2455
|
-
break;
|
|
2456
|
-
}
|
|
2457
|
-
scanned += page.items.length;
|
|
2458
|
-
const apyVaults = apyByVault.size === 0 &&
|
|
2459
|
-
include.includes('apy') &&
|
|
2460
|
-
options.capability.length === 0 &&
|
|
2461
|
-
options['engine.type'] === undefined
|
|
2462
|
-
? page.items
|
|
2463
|
-
.slice(0, options.limit - matches.length)
|
|
2464
|
-
.map(({ vaultAddress }) => vaultAddress)
|
|
2465
|
-
: [];
|
|
2466
|
-
// Rate boundaries and historical quotes depend only on candidate addresses,
|
|
2467
|
-
// so the unfiltered page can resolve them alongside live vault discovery.
|
|
2468
|
-
const [discovered, prefetchedApy] = await Promise.all([
|
|
2469
|
-
Promise.all(page.items.map(async (item) => {
|
|
2470
|
-
const record = registry.get(item.vaultAddress.toLowerCase());
|
|
2471
|
-
try {
|
|
2472
|
-
const discovered = await resolveVaultDiscovery(c, {
|
|
2473
|
-
chainId: options.chainId,
|
|
2474
|
-
include: discoveryInclude(options),
|
|
2475
|
-
vaultAddress: item.vaultAddress,
|
|
2476
|
-
});
|
|
2477
|
-
const { discovery, zoneRoutes } = await resolveVaultRoutes(c, {
|
|
2478
|
-
capability: options.capability,
|
|
2479
|
-
discovery: discovered,
|
|
2480
|
-
include,
|
|
2481
|
-
record,
|
|
2482
|
-
});
|
|
2483
|
-
return { discovery, position: item.position, record, zoneRoutes };
|
|
2484
|
-
}
|
|
2485
|
-
catch (cause) {
|
|
2486
|
-
if (!record && isIncompatible(cause))
|
|
2487
|
-
return undefined;
|
|
2488
|
-
throw cause;
|
|
2489
|
-
}
|
|
2490
|
-
})),
|
|
2491
|
-
apyVaults.length > 0
|
|
2492
|
-
? resolvePageApy(c, {
|
|
2493
|
-
chainId: options.chainId,
|
|
2494
|
-
include,
|
|
2495
|
-
vaults: apyVaults,
|
|
2496
|
-
window: options['apy.window'],
|
|
2497
|
-
})
|
|
2498
|
-
: undefined,
|
|
2499
|
-
]);
|
|
2500
|
-
for (const [vault, apy] of prefetchedApy ?? [])
|
|
2501
|
-
apyByVault.set(vault, apy);
|
|
2502
|
-
for (const match of discovered) {
|
|
2503
|
-
if (!match || !matchesVaultFilters(match.discovery, options))
|
|
2504
|
-
continue;
|
|
2505
|
-
matches.push(match);
|
|
2506
|
-
}
|
|
2507
|
-
position = page.items.at(-1).position;
|
|
2508
|
-
if (!hasMore)
|
|
2509
|
-
break;
|
|
2510
|
-
}
|
|
2511
|
-
const page = matches.slice(0, options.limit);
|
|
2512
|
-
const discoveries = page.map(({ discovery }) => discovery);
|
|
2513
|
-
const missingApyVaults = include.includes('apy')
|
|
2514
|
-
? discoveries.flatMap(({ vaultAddress }) => apyByVault.has(vaultAddress.toLowerCase()) ? [] : [vaultAddress])
|
|
2515
|
-
: [];
|
|
2516
|
-
const [missingApy, rates, rewards, tokens] = await Promise.all([
|
|
2517
|
-
missingApyVaults.length > 0
|
|
2518
|
-
? resolvePageApy(c, {
|
|
2519
|
-
chainId: options.chainId,
|
|
2520
|
-
include,
|
|
2521
|
-
vaults: missingApyVaults,
|
|
2522
|
-
window: options['apy.window'],
|
|
2523
|
-
})
|
|
2524
|
-
: undefined,
|
|
2525
|
-
resolvePageRates(c, { discoveries, include, oracle: options.oracle, snapshot }),
|
|
2526
|
-
resolvePageRewards(c, {
|
|
2527
|
-
chainId: options.chainId,
|
|
2528
|
-
include,
|
|
2529
|
-
vaults: discoveries.map(({ vaultAddress }) => vaultAddress),
|
|
2530
|
-
}),
|
|
2531
|
-
resolvePageTokens(c, { chainId: options.chainId, discoveries, include, snapshot }),
|
|
2532
|
-
]);
|
|
2533
|
-
for (const [vault, apy] of missingApy ?? [])
|
|
2534
|
-
apyByVault.set(vault, apy);
|
|
2535
|
-
const apy = include.includes('apy') ? apyByVault : undefined;
|
|
2536
|
-
const data = await Promise.all(page.map((match) => resolveVault(c, {
|
|
2537
|
-
...match,
|
|
2538
|
-
apy,
|
|
2539
|
-
include,
|
|
2540
|
-
rates,
|
|
2541
|
-
rewards: rewards?.get(match.discovery.vaultAddress),
|
|
2542
|
-
snapshot,
|
|
2543
|
-
tokens,
|
|
2544
|
-
})));
|
|
2545
|
-
const last = matches[options.limit - 1];
|
|
2546
|
-
const nextPosition = matches.length > options.limit ? last?.position : hasMore ? position : undefined;
|
|
2547
|
-
return {
|
|
2548
|
-
data,
|
|
2549
|
-
...(rates ? { meta: { valuation: Valuation.pricing(rates, options.oracle) } } : {}),
|
|
2550
|
-
nextCursor: nextPosition ? Cursor.encode(nextPosition) : null,
|
|
2551
|
-
};
|
|
2552
|
-
}
|
|
2553
|
-
/** Lists registry-curated Earn vaults. */
|
|
2554
|
-
export async function listVerifiedVaults(c, options) {
|
|
2555
|
-
const db = Db.get(c.get('dbCached'));
|
|
2556
|
-
const [records, snapshot] = await Promise.all([
|
|
2557
|
-
core_EarnVaults.list(db, { chainId: options.chainId }),
|
|
2558
|
-
VerifiedTokens.snapshot(c, options.chainId),
|
|
2559
|
-
]);
|
|
2560
|
-
const decoded = options.cursor ? Cursor.decode(options.cursor, ['address']) : undefined;
|
|
2561
|
-
const cursor = decoded?.[0]?.toString().toLowerCase();
|
|
2562
|
-
const candidates = records.filter((record) => !cursor || record.vaultAddress.toLowerCase() > cursor);
|
|
2563
|
-
const include = vaultInclude(options);
|
|
2564
|
-
const matches = [];
|
|
2565
|
-
let offset = 0;
|
|
2566
|
-
while (offset < candidates.length && matches.length <= options.limit) {
|
|
2567
|
-
const batchSize = discoveryBatchLimit({
|
|
2568
|
-
filtered: options.capability.length > 0 || options['engine.type'] !== undefined,
|
|
2569
|
-
limit: options.limit,
|
|
2570
|
-
matches: matches.length,
|
|
2571
|
-
remaining: candidates.length - offset,
|
|
2572
|
-
});
|
|
2573
|
-
const batch = candidates.slice(offset, offset + batchSize);
|
|
2574
|
-
offset += batch.length;
|
|
2575
|
-
const discovered = await Promise.all(batch.map(async (record) => {
|
|
2576
|
-
const discovered = await resolveVaultDiscovery(c, {
|
|
2577
|
-
chainId: options.chainId,
|
|
2578
|
-
include: discoveryInclude(options),
|
|
2579
|
-
vaultAddress: Schema.Address.parse(record.vaultAddress.toLowerCase()),
|
|
2580
|
-
});
|
|
2581
|
-
const { discovery, zoneRoutes } = await resolveVaultRoutes(c, {
|
|
2582
|
-
capability: options.capability,
|
|
2583
|
-
discovery: discovered,
|
|
2584
|
-
include,
|
|
2585
|
-
record,
|
|
2586
|
-
});
|
|
2587
|
-
return { discovery, record, zoneRoutes };
|
|
2588
|
-
}));
|
|
2589
|
-
for (const match of discovered) {
|
|
2590
|
-
if (!matchesVaultFilters(match.discovery, options))
|
|
2591
|
-
continue;
|
|
2592
|
-
matches.push(match);
|
|
2593
|
-
}
|
|
2594
|
-
}
|
|
2595
|
-
const page = matches.slice(0, options.limit);
|
|
2596
|
-
const discoveries = page.map(({ discovery }) => discovery);
|
|
2597
|
-
const [apy, rates, rewards, tokens] = await Promise.all([
|
|
2598
|
-
resolvePageApy(c, {
|
|
2599
|
-
chainId: options.chainId,
|
|
2600
|
-
include,
|
|
2601
|
-
vaults: discoveries.map(({ vaultAddress }) => vaultAddress),
|
|
2602
|
-
window: options['apy.window'],
|
|
2603
|
-
}),
|
|
2604
|
-
resolvePageRates(c, { discoveries, include, oracle: options.oracle, snapshot }),
|
|
2605
|
-
resolvePageRewards(c, {
|
|
2606
|
-
chainId: options.chainId,
|
|
2607
|
-
include,
|
|
2608
|
-
vaults: discoveries.map(({ vaultAddress }) => vaultAddress),
|
|
2609
|
-
}),
|
|
2610
|
-
resolvePageTokens(c, { chainId: options.chainId, discoveries, include, snapshot }),
|
|
2611
|
-
]);
|
|
2612
|
-
const data = await Promise.all(page.map(async (match) => Response.validated(schema.VerifiedVault, await resolveVault(c, {
|
|
2613
|
-
...match,
|
|
2614
|
-
apy,
|
|
2615
|
-
include,
|
|
2616
|
-
rates,
|
|
2617
|
-
rewards: rewards?.get(match.discovery.vaultAddress),
|
|
2618
|
-
snapshot,
|
|
2619
|
-
tokens,
|
|
2620
|
-
}))));
|
|
2621
|
-
const last = matches[options.limit - 1];
|
|
2622
|
-
return {
|
|
2623
|
-
data,
|
|
2624
|
-
...(rates ? { meta: { valuation: Valuation.pricing(rates, options.oracle) } } : {}),
|
|
2625
|
-
nextCursor: matches.length > options.limit && last ? Cursor.encode([last.record.vaultAddress]) : null,
|
|
2626
|
-
};
|
|
2627
|
-
}
|
|
2628
2282
|
/** Reads daily historical share prices for one Earn vault. */
|
|
2629
2283
|
export async function getVaultSharePrices(c, options) {
|
|
2630
2284
|
const prices = await Timing.time(c, 'earn_share_prices', () => EarnSharePrices.resolve({
|
|
@@ -3513,7 +3167,7 @@ export async function getVault(c, options) {
|
|
|
3513
3167
|
try {
|
|
3514
3168
|
const discovered = await resolveVaultDiscovery(c, {
|
|
3515
3169
|
chainId: options.chainId,
|
|
3516
|
-
include: discoveryInclude({
|
|
3170
|
+
include: discoveryInclude({ include: options.include }),
|
|
3517
3171
|
vaultAddress: options.vaultAddress,
|
|
3518
3172
|
});
|
|
3519
3173
|
const include = vaultInclude(options);
|
|
@@ -3584,9 +3238,7 @@ export function vaultCacheKey(c, query) {
|
|
|
3584
3238
|
return url.toString();
|
|
3585
3239
|
}
|
|
3586
3240
|
function discoveryInclude(options) {
|
|
3587
|
-
const includeCapabilities = options.include.includes('capabilities') ||
|
|
3588
|
-
options.include.includes('zone') ||
|
|
3589
|
-
options.capability.length > 0;
|
|
3241
|
+
const includeCapabilities = options.include.includes('capabilities') || options.include.includes('zone');
|
|
3590
3242
|
return [
|
|
3591
3243
|
...(options.include.includes('access') ? ['access'] : []),
|
|
3592
3244
|
...(includeCapabilities ? ['capabilities'] : []),
|
|
@@ -3621,9 +3273,13 @@ async function resolveVaultRoutes(c, options) {
|
|
|
3621
3273
|
const needsCapabilities = options.include.includes('capabilities') ||
|
|
3622
3274
|
options.capability.includes('privateRouting') ||
|
|
3623
3275
|
options.capability.includes('routerSwaps');
|
|
3624
|
-
|
|
3625
|
-
// Capabilities describe the vault; API-key scopes limit only the route metadata.
|
|
3626
|
-
const routes = needsCapabilities
|
|
3276
|
+
await ZoneAccess.ensure(c);
|
|
3277
|
+
// Capabilities describe the vault; API-key scopes limit only the route metadata, checked only when requested.
|
|
3278
|
+
const routes = needsCapabilities
|
|
3279
|
+
? record.zones
|
|
3280
|
+
: includesRoutes
|
|
3281
|
+
? record.zones.filter((route) => ZoneAccess.visible(c, { chainId: route.chainId }))
|
|
3282
|
+
: [];
|
|
3627
3283
|
if (routes.length === 0)
|
|
3628
3284
|
return { discovery, zoneRoutes: [] };
|
|
3629
3285
|
const resolved = await EarnVaults.resolveZoneRoutes({
|
|
@@ -3640,7 +3296,7 @@ async function resolveVaultRoutes(c, options) {
|
|
|
3640
3296
|
? { ...discovery, capabilities: EarnVaults.addZoneRouteCapabilities(capabilities) }
|
|
3641
3297
|
: discovery,
|
|
3642
3298
|
zoneRoutes: includesRoutes
|
|
3643
|
-
? resolved.filter((route) => ZoneAccess.
|
|
3299
|
+
? resolved.filter((route) => ZoneAccess.visible(c, { chainId: route.chainId }))
|
|
3644
3300
|
: [],
|
|
3645
3301
|
};
|
|
3646
3302
|
}
|
|
@@ -3778,25 +3434,6 @@ function resolvePageApy(c, options) {
|
|
|
3778
3434
|
window: options.window,
|
|
3779
3435
|
}));
|
|
3780
3436
|
}
|
|
3781
|
-
function resolvePageRewards(c, options) {
|
|
3782
|
-
if (!options.include.includes('apy'))
|
|
3783
|
-
return undefined;
|
|
3784
|
-
return Timing.time(c, 'earn_rewards_apy', () => RewardRead.resolveCollection({
|
|
3785
|
-
chainId: options.chainId,
|
|
3786
|
-
db: c.get('dbCached'),
|
|
3787
|
-
vaults: options.vaults,
|
|
3788
|
-
}).catch(() => {
|
|
3789
|
-
Cache.setPolicy(c, Cache.policies.noStore);
|
|
3790
|
-
const failure = {
|
|
3791
|
-
chainId: options.chainId,
|
|
3792
|
-
failure: 'unknown',
|
|
3793
|
-
id: 'earn-rewards',
|
|
3794
|
-
operation: 'listVaultRewards',
|
|
3795
|
-
};
|
|
3796
|
-
c.set('providerFailures', [...(c.get('providerFailures') ?? []), failure]);
|
|
3797
|
-
return new Map();
|
|
3798
|
-
}));
|
|
3799
|
-
}
|
|
3800
3437
|
function resolveVaultRewards(c, options) {
|
|
3801
3438
|
if (!options.include.includes('apy'))
|
|
3802
3439
|
return undefined;
|
|
@@ -3853,7 +3490,11 @@ async function resolvePageTokens(c, options) {
|
|
|
3853
3490
|
}
|
|
3854
3491
|
async function resolveVault(c, options) {
|
|
3855
3492
|
const { discovery, record } = options;
|
|
3856
|
-
|
|
3493
|
+
await ZoneAccess.ensure(c);
|
|
3494
|
+
// Only `include=zone` reads Zones, so other reads never fail on an unreadable delegation.
|
|
3495
|
+
const zones = options.include.includes('zone')
|
|
3496
|
+
? [...c.get('zones').values()].filter((zone) => ZoneAccess.visible(c, { chainId: zone.id }))
|
|
3497
|
+
: [];
|
|
3857
3498
|
const valued = options.include.includes('tvl')
|
|
3858
3499
|
? Valuation.valuationFor({
|
|
3859
3500
|
amount: BigInt(discovery.state.totalAssets),
|
|
@@ -3939,7 +3580,6 @@ export function serializeVault(options) {
|
|
|
3939
3580
|
...(options.include.includes('apy') ? { apy } : {}),
|
|
3940
3581
|
assetToken: options.assetToken,
|
|
3941
3582
|
...(options.include.includes('capabilities') ? { capabilities: discovery.capabilities } : {}),
|
|
3942
|
-
description: record?.description ?? null,
|
|
3943
3583
|
engine: {
|
|
3944
3584
|
address: discovery.engine.address.toLowerCase(),
|
|
3945
3585
|
type: discovery.engine.type,
|
|
@@ -3950,7 +3590,7 @@ export function serializeVault(options) {
|
|
|
3950
3590
|
...(options.include.includes('tvl')
|
|
3951
3591
|
? { instantLiquidityValue: options.instantLiquidityValue }
|
|
3952
3592
|
: {}),
|
|
3953
|
-
label:
|
|
3593
|
+
label: '',
|
|
3954
3594
|
sharePrice: discovery.sharePrice === null
|
|
3955
3595
|
? null
|
|
3956
3596
|
: {
|
|
@@ -3960,7 +3600,6 @@ export function serializeVault(options) {
|
|
|
3960
3600
|
formatted: core_Value.format(BigInt(discovery.sharePrice), options.assetToken.decimals),
|
|
3961
3601
|
},
|
|
3962
3602
|
shareToken: options.shareToken,
|
|
3963
|
-
slug: record?.slug ?? null,
|
|
3964
3603
|
state: discovery.state,
|
|
3965
3604
|
...(options.include.includes('tvl') ? { tvl: options.tvl } : {}),
|
|
3966
3605
|
vaultAddress,
|
|
@@ -4019,71 +3658,6 @@ function getToken(tokens, address) {
|
|
|
4019
3658
|
throw new Error(`Token metadata was not resolved for ${address}.`);
|
|
4020
3659
|
return Response.validated(Tokens.schema.Token, token);
|
|
4021
3660
|
}
|
|
4022
|
-
async function queryDeployments(c, options) {
|
|
4023
|
-
const factories = deploymentFactories[options.chainId] ?? [];
|
|
4024
|
-
if (factories.length === 0)
|
|
4025
|
-
return { hasMore: false, items: [] };
|
|
4026
|
-
const filters = [];
|
|
4027
|
-
if (options.asset)
|
|
4028
|
-
filters.push(`lower(asset) = '${options.asset.toLowerCase()}'`);
|
|
4029
|
-
if (options.cursor)
|
|
4030
|
-
filters.push(Cursor.keyset([
|
|
4031
|
-
{
|
|
4032
|
-
literal: Cursor.literal(options.cursor[0], 'int'),
|
|
4033
|
-
name: 'block_num',
|
|
4034
|
-
order: 'desc',
|
|
4035
|
-
},
|
|
4036
|
-
{
|
|
4037
|
-
literal: Cursor.literal(options.cursor[1], 'int'),
|
|
4038
|
-
name: 'log_idx',
|
|
4039
|
-
order: 'desc',
|
|
4040
|
-
},
|
|
4041
|
-
]));
|
|
4042
|
-
// Authenticate emitters before deduplication so a forged newer event cannot
|
|
4043
|
-
// replace a factory deployment or suppress it through outer filters.
|
|
4044
|
-
const result = await c
|
|
4045
|
-
.get('getTidx')(options.chainId)
|
|
4046
|
-
.fetch({
|
|
4047
|
-
chainId: options.chainId,
|
|
4048
|
-
engine: 'clickhouse',
|
|
4049
|
-
query: `
|
|
4050
|
-
SELECT "earnVault", asset, block_num, log_idx
|
|
4051
|
-
FROM (
|
|
4052
|
-
SELECT
|
|
4053
|
-
"earnVault",
|
|
4054
|
-
asset,
|
|
4055
|
-
block_num,
|
|
4056
|
-
log_idx
|
|
4057
|
-
FROM EarnStackDeployed
|
|
4058
|
-
WHERE address IN (${factories.map((address) => `'${address}'`).join(', ')})
|
|
4059
|
-
ORDER BY block_num DESC, log_idx DESC
|
|
4060
|
-
LIMIT 1 BY lower("earnVault")
|
|
4061
|
-
)
|
|
4062
|
-
${filters.length > 0 ? `WHERE ${filters.join(' AND ')}` : ''}
|
|
4063
|
-
ORDER BY block_num DESC, log_idx DESC
|
|
4064
|
-
LIMIT ${options.limit + 1}
|
|
4065
|
-
`,
|
|
4066
|
-
signatures: [deployedSignature],
|
|
4067
|
-
});
|
|
4068
|
-
const rows = result.rows;
|
|
4069
|
-
const items = rows.slice(0, options.limit).map((row) => {
|
|
4070
|
-
const vaultAddress = Schema.Address.safeParse(Value.toText(row['earnVault']));
|
|
4071
|
-
const asset = Schema.Address.safeParse(Value.toText(row['asset']));
|
|
4072
|
-
const blockNumber = Value.toNumber(row['block_num']);
|
|
4073
|
-
const logIndex = Value.toNumber(row['log_idx']);
|
|
4074
|
-
if (!vaultAddress.success ||
|
|
4075
|
-
!asset.success ||
|
|
4076
|
-
blockNumber === undefined ||
|
|
4077
|
-
logIndex === undefined)
|
|
4078
|
-
throw new Error('TIDX returned an invalid Earn deployment row.');
|
|
4079
|
-
return {
|
|
4080
|
-
asset: asset.data,
|
|
4081
|
-
position: [blockNumber, logIndex],
|
|
4082
|
-
vaultAddress: vaultAddress.data,
|
|
4083
|
-
};
|
|
4084
|
-
});
|
|
4085
|
-
return { hasMore: rows.length > options.limit, items };
|
|
4086
|
-
}
|
|
4087
3661
|
/** Tests live vault state against the shared collection filters. */
|
|
4088
3662
|
export function matchesVaultFilters(discovery, options) {
|
|
4089
3663
|
if (options.asset && discovery.assetToken.address.toLowerCase() !== options.asset.toLowerCase())
|