tapimo 0.7.1 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ApiKeys.d.ts +24 -7
- package/dist/ApiKeys.d.ts.map +1 -1
- package/dist/ApiKeys.js +17 -5
- package/dist/ApiKeys.js.map +1 -1
- package/dist/App.d.ts +12104 -7861
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +191 -128
- package/dist/App.js.map +1 -1
- package/dist/Assets.d.ts +10 -0
- package/dist/Assets.d.ts.map +1 -1
- package/dist/Assets.js +17 -4
- package/dist/Assets.js.map +1 -1
- package/dist/Scope.d.ts +19 -8
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +25 -9
- package/dist/Scope.js.map +1 -1
- package/dist/Webhooks.d.ts +1 -1
- package/dist/admin/App.d.ts +601 -20
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/App.js +12 -2
- package/dist/admin/App.js.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +94 -11
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +141 -32
- package/dist/admin/apps/api-keys.js.map +1 -1
- package/dist/admin/apps/earn-vaults.d.ts +1069 -0
- package/dist/admin/apps/earn-vaults.d.ts.map +1 -0
- package/dist/admin/apps/earn-vaults.js +409 -0
- package/dist/admin/apps/earn-vaults.js.map +1 -0
- package/dist/admin/apps/verified-tokens.d.ts +166 -166
- package/dist/admin/ui.generated.d.ts +1 -1
- package/dist/admin/ui.generated.d.ts.map +1 -1
- package/dist/admin/ui.generated.js +99 -43
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/analytics/Analytics.d.ts +2 -0
- package/dist/analytics/Analytics.d.ts.map +1 -1
- package/dist/analytics/Analytics.js +18 -2
- package/dist/analytics/Analytics.js.map +1 -1
- package/dist/analytics/tables/requestEvents.d.ts +22 -1
- package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
- package/dist/analytics/tables/requestEvents.js +59 -39
- package/dist/analytics/tables/requestEvents.js.map +1 -1
- package/dist/apps/Zones.d.ts +8335 -0
- package/dist/apps/Zones.d.ts.map +1 -0
- package/dist/apps/Zones.js +38 -0
- package/dist/apps/Zones.js.map +1 -0
- package/dist/apps/data/App.d.ts +12125 -7913
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/App.js +91 -19
- package/dist/apps/data/App.js.map +1 -1
- package/dist/apps/data/FxOracle.d.ts +1 -1
- package/dist/apps/data/FxOracle.d.ts.map +1 -1
- package/dist/apps/data/index.d.ts +0 -1
- package/dist/apps/data/index.d.ts.map +1 -1
- package/dist/apps/data/index.js +0 -1
- package/dist/apps/data/index.js.map +1 -1
- package/dist/apps/data/routes/activities.d.ts +32 -32
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +130 -65
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +312 -312
- package/dist/apps/data/routes/balances.d.ts +18 -18
- package/dist/apps/data/routes/balances.js +5 -5
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/coingecko.d.ts +176 -176
- package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
- package/dist/apps/data/routes/coingecko.js +62 -35
- package/dist/apps/data/routes/coingecko.js.map +1 -1
- package/dist/apps/data/routes/earn.d.ts +2144 -0
- package/dist/apps/data/routes/earn.d.ts.map +1 -0
- package/dist/apps/data/routes/earn.js +947 -0
- package/dist/apps/data/routes/earn.js.map +1 -0
- package/dist/apps/data/routes/exchanges.d.ts +1625 -718
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +656 -193
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts +108 -108
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +59 -8
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/funding.d.ts +4092 -387
- package/dist/apps/data/routes/funding.d.ts.map +1 -1
- package/dist/apps/data/routes/funding.js +1403 -256
- package/dist/apps/data/routes/funding.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +30 -30
- package/dist/apps/data/routes/indexer.d.ts.map +1 -1
- package/dist/apps/data/routes/indexer.js +19 -2
- package/dist/apps/data/routes/indexer.js.map +1 -1
- package/dist/apps/data/routes/receipts.d.ts +263 -263
- package/dist/apps/data/routes/receipts.d.ts.map +1 -1
- package/dist/apps/data/routes/receipts.js +11 -11
- package/dist/apps/data/routes/receipts.js.map +1 -1
- package/dist/apps/data/routes/rpc.d.ts +5 -5
- package/dist/apps/data/routes/rpc.d.ts.map +1 -1
- package/dist/apps/data/routes/rpc.js +211 -22
- package/dist/apps/data/routes/rpc.js.map +1 -1
- package/dist/apps/data/routes/tokenlist.d.ts +36 -36
- package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
- package/dist/apps/data/routes/tokenlist.js +39 -8
- package/dist/apps/data/routes/tokenlist.js.map +1 -1
- package/dist/apps/data/routes/tokens.d.ts +114 -86
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +194 -91
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +53 -53
- package/dist/apps/data/routes/transactions.d.ts.map +1 -1
- package/dist/apps/data/routes/transactions.js +78 -39
- package/dist/apps/data/routes/transactions.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +76 -27
- package/dist/apps/data/routes/transfers.d.ts.map +1 -1
- package/dist/apps/data/routes/transfers.js +165 -67
- package/dist/apps/data/routes/transfers.js.map +1 -1
- package/dist/apps/data/routes/valuation.d.ts +42 -42
- package/dist/apps/data/routes/valuation.js +2 -2
- package/dist/apps/data/routes/valuation.js.map +1 -1
- package/dist/apps/data/routes/webhooks.d.ts +369 -367
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +161 -59
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +281 -0
- package/dist/apps/data/routes/zones.d.ts.map +1 -0
- package/dist/apps/data/routes/zones.js +252 -0
- package/dist/apps/data/routes/zones.js.map +1 -0
- package/dist/apps/docs/reference.js +6 -5
- package/dist/apps/docs/reference.js.map +1 -1
- package/dist/apps/index.d.ts +2 -1
- package/dist/apps/index.d.ts.map +1 -1
- package/dist/apps/index.js +2 -1
- package/dist/apps/index.js.map +1 -1
- package/dist/apps/management/App.d.ts +670 -670
- package/dist/apps/management/Billing.d.ts +8 -0
- package/dist/apps/management/Billing.d.ts.map +1 -1
- package/dist/apps/management/Billing.js +12 -0
- package/dist/apps/management/Billing.js.map +1 -1
- package/dist/apps/management/Error.d.ts +12 -0
- package/dist/apps/management/Error.d.ts.map +1 -0
- package/dist/apps/management/Error.js +10 -0
- package/dist/apps/management/Error.js.map +1 -0
- package/dist/apps/management/routes/api-keys.d.ts +5 -5
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +2 -8
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +119 -119
- package/dist/apps/management/routes/faucet.d.ts +2 -2
- package/dist/apps/management/routes/invitations.d.ts +62 -62
- package/dist/apps/management/routes/invitations.d.ts.map +1 -1
- package/dist/apps/management/routes/invitations.js +4 -10
- package/dist/apps/management/routes/invitations.js.map +1 -1
- package/dist/apps/management/routes/invite-links.d.ts +30 -30
- package/dist/apps/management/routes/me.d.ts +6 -6
- package/dist/apps/management/routes/members.d.ts +2 -2
- package/dist/apps/management/routes/orgs.d.ts +48 -48
- package/dist/apps/management/routes/orgs.d.ts.map +1 -1
- package/dist/apps/management/routes/orgs.js +2 -8
- package/dist/apps/management/routes/orgs.js.map +1 -1
- package/dist/apps/management/routes/projects.d.ts +9 -9
- package/dist/apps/management/routes/scopes.js +2 -2
- package/dist/apps/management/routes/scopes.js.map +1 -1
- package/dist/apps/management/routes/verified-token-requests.d.ts +36 -36
- package/dist/apps/management/routes/webhooks.d.ts +50 -50
- package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/management/routes/webhooks.js +15 -3
- package/dist/apps/management/routes/webhooks.js.map +1 -1
- package/dist/apps/mpp/App.d.ts +55 -56
- package/dist/apps/mpp/App.d.ts.map +1 -1
- package/dist/apps/mpp/App.js +192 -27
- package/dist/apps/mpp/App.js.map +1 -1
- package/dist/apps/mpp/Mpp.d.ts +0 -20
- package/dist/apps/mpp/Mpp.d.ts.map +1 -1
- package/dist/apps/mpp/Mpp.js +0 -24
- package/dist/apps/mpp/Mpp.js.map +1 -1
- package/dist/apps/mpp/internal/Adapter.d.ts +40 -0
- package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Adapter.js +66 -0
- package/dist/apps/mpp/internal/Adapter.js.map +1 -0
- package/dist/apps/mpp/internal/Error.d.ts +4 -0
- package/dist/apps/mpp/internal/Error.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Error.js +41 -0
- package/dist/apps/mpp/internal/Error.js.map +1 -0
- package/dist/apps/mpp/internal/Idempotency.d.ts +33 -0
- package/dist/apps/mpp/internal/Idempotency.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Idempotency.js +28 -0
- package/dist/apps/mpp/internal/Idempotency.js.map +1 -0
- package/dist/apps/mpp/internal/Policy.d.ts +46 -0
- package/dist/apps/mpp/internal/Policy.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Policy.js +57 -0
- package/dist/apps/mpp/internal/Policy.js.map +1 -0
- package/dist/apps/mpp/internal/ScreenManager.d.ts +27 -0
- package/dist/apps/mpp/internal/ScreenManager.d.ts.map +1 -0
- package/dist/apps/mpp/internal/ScreenManager.js +18 -0
- package/dist/apps/mpp/internal/ScreenManager.js.map +1 -0
- package/dist/apps/mpp/internal/Screening.d.ts +35 -0
- package/dist/apps/mpp/internal/Screening.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Screening.js +20 -0
- package/dist/apps/mpp/internal/Screening.js.map +1 -0
- package/dist/apps/mpp/internal/Sponsorship.d.ts +36 -0
- package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Sponsorship.js +103 -0
- package/dist/apps/mpp/internal/Sponsorship.js.map +1 -0
- package/dist/apps/mpp/internal/Utils.d.ts +7 -0
- package/dist/apps/mpp/internal/Utils.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Utils.js +24 -0
- package/dist/apps/mpp/internal/Utils.js.map +1 -0
- package/dist/apps/relay/App.js +183 -23
- package/dist/apps/relay/App.js.map +1 -1
- package/dist/apps/relay/Sponsorships.d.ts +4 -0
- package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
- package/dist/apps/relay/Sponsorships.js +15 -6
- package/dist/apps/relay/Sponsorships.js.map +1 -1
- package/dist/db/Db.d.ts +20 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +342 -0
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +921 -1
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +269 -1
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/earnVaults.d.ts +68 -0
- package/dist/db/tables/earnVaults.d.ts.map +1 -0
- package/dist/db/tables/earnVaults.js +72 -0
- package/dist/db/tables/earnVaults.js.map +1 -0
- package/dist/db/tables/fundingCatalog.d.ts +56 -0
- package/dist/db/tables/fundingCatalog.d.ts.map +1 -0
- package/dist/db/tables/fundingCatalog.js +85 -0
- package/dist/db/tables/fundingCatalog.js.map +1 -0
- package/dist/db/tables/fundingDepositAddresses.d.ts +159 -0
- package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
- package/dist/db/tables/fundingDepositAddresses.js +206 -0
- package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
- package/dist/db/tables/fundingDeposits.d.ts +115 -0
- package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
- package/dist/db/tables/fundingDeposits.js +100 -0
- package/dist/db/tables/fundingDeposits.js.map +1 -0
- package/dist/db/tables/fundingIdempotency.d.ts +91 -0
- package/dist/db/tables/fundingIdempotency.d.ts.map +1 -0
- package/dist/db/tables/fundingIdempotency.js +103 -0
- package/dist/db/tables/fundingIdempotency.js.map +1 -0
- package/dist/db/tables/fundingTransferEvents.d.ts +12 -0
- package/dist/db/tables/fundingTransferEvents.d.ts.map +1 -0
- package/dist/db/tables/fundingTransferEvents.js +18 -0
- package/dist/db/tables/fundingTransferEvents.js.map +1 -0
- package/dist/db/tables/fundingTransferTransactions.d.ts +15 -0
- package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -0
- package/dist/db/tables/fundingTransferTransactions.js +27 -0
- package/dist/db/tables/fundingTransferTransactions.js.map +1 -0
- package/dist/db/tables/fundingTransfers.d.ts +82 -0
- package/dist/db/tables/fundingTransfers.d.ts.map +1 -0
- package/dist/db/tables/fundingTransfers.js +89 -0
- package/dist/db/tables/fundingTransfers.js.map +1 -0
- package/dist/db/tables/organizations.d.ts +8 -0
- package/dist/db/tables/organizations.d.ts.map +1 -1
- package/dist/db/tables/organizations.js +16 -0
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/projects.d.ts +8 -0
- package/dist/db/tables/projects.d.ts.map +1 -1
- package/dist/db/tables/projects.js +16 -0
- package/dist/db/tables/projects.js.map +1 -1
- package/dist/db/tables/requestUsage.d.ts +13 -0
- package/dist/db/tables/requestUsage.d.ts.map +1 -1
- package/dist/db/tables/requestUsage.js +16 -0
- package/dist/db/tables/requestUsage.js.map +1 -1
- package/dist/db/tables/sponsoredTransactions.d.ts +2 -2
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +1 -1
- package/dist/db/tables/sponsoredTransactions.js.map +1 -1
- package/dist/db/tables/users.d.ts +8 -0
- package/dist/db/tables/users.d.ts.map +1 -1
- package/dist/db/tables/users.js +16 -0
- package/dist/db/tables/users.js.map +1 -1
- package/dist/db/tables/verifiedTokens.d.ts +14 -7
- package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
- package/dist/db/tables/verifiedTokens.js +9 -7
- package/dist/db/tables/verifiedTokens.js.map +1 -1
- package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
- package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
- package/dist/db/tables/webhookSubscriptions.js +24 -3
- package/dist/db/tables/webhookSubscriptions.js.map +1 -1
- package/dist/handlers/relay.js +108 -108
- package/dist/handlers/relay.js.map +1 -1
- package/dist/internal/Auth.d.ts +26 -0
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +35 -2
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +16 -10
- package/dist/internal/Cache.js.map +1 -1
- package/dist/internal/Cursor.js +1 -1
- package/dist/internal/Cursor.js.map +1 -1
- package/dist/internal/EarnRates.d.ts +89 -0
- package/dist/internal/EarnRates.d.ts.map +1 -0
- package/dist/internal/EarnRates.js +266 -0
- package/dist/internal/EarnRates.js.map +1 -0
- package/dist/internal/EarnVaults.d.ts +171 -0
- package/dist/internal/EarnVaults.d.ts.map +1 -0
- package/dist/internal/EarnVaults.js +547 -0
- package/dist/internal/EarnVaults.js.map +1 -0
- package/dist/internal/EdgeCache.d.ts +8 -1
- package/dist/internal/EdgeCache.d.ts.map +1 -1
- package/dist/internal/EdgeCache.js +33 -7
- package/dist/internal/EdgeCache.js.map +1 -1
- package/dist/internal/Id.d.ts +11 -0
- package/dist/internal/Id.d.ts.map +1 -1
- package/dist/internal/Id.js +13 -0
- package/dist/internal/Id.js.map +1 -1
- package/dist/internal/Idempotency.d.ts +83 -0
- package/dist/internal/Idempotency.d.ts.map +1 -0
- package/dist/internal/Idempotency.js +113 -0
- package/dist/internal/Idempotency.js.map +1 -0
- package/dist/internal/Log.d.ts +64 -9
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +29 -7
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/MetricSink.d.ts.map +1 -1
- package/dist/internal/MetricSink.js +47 -1
- package/dist/internal/MetricSink.js.map +1 -1
- package/dist/internal/OpenApi.d.ts +1 -1
- package/dist/internal/OpenApi.d.ts.map +1 -1
- package/dist/internal/OpenApi.js +3 -0
- package/dist/internal/OpenApi.js.map +1 -1
- package/dist/internal/Provider.d.ts +14 -0
- package/dist/internal/Provider.d.ts.map +1 -0
- package/dist/internal/Provider.js +5 -0
- package/dist/internal/Provider.js.map +1 -0
- package/dist/internal/Schema.d.ts +6 -1
- package/dist/internal/Schema.d.ts.map +1 -1
- package/dist/internal/Schema.js +20 -11
- package/dist/internal/Schema.js.map +1 -1
- package/dist/internal/Store.d.ts +6 -0
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +35 -0
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/Tidx.d.ts +43 -24
- package/dist/internal/Tidx.d.ts.map +1 -1
- package/dist/internal/Tidx.js +79 -11
- package/dist/internal/Tidx.js.map +1 -1
- package/dist/internal/Viem.d.ts +82 -65
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Viem.js +83 -12
- package/dist/internal/Viem.js.map +1 -1
- package/dist/internal/WebhookDestination.d.ts.map +1 -1
- package/dist/internal/WebhookDestination.js +34 -28
- package/dist/internal/WebhookDestination.js.map +1 -1
- package/dist/internal/Webhooks.d.ts +9 -0
- package/dist/internal/Webhooks.d.ts.map +1 -1
- package/dist/internal/Webhooks.js +15 -10
- package/dist/internal/Webhooks.js.map +1 -1
- package/dist/internal/exchange/Provider.d.ts +219 -0
- package/dist/internal/exchange/Provider.d.ts.map +1 -0
- package/dist/internal/exchange/Provider.js +117 -0
- package/dist/internal/exchange/Provider.js.map +1 -0
- package/dist/internal/exchange/index.d.ts +2 -0
- package/dist/internal/exchange/index.d.ts.map +1 -0
- package/dist/internal/exchange/index.js +2 -0
- package/dist/internal/exchange/index.js.map +1 -0
- package/dist/internal/exchange/providers/uniswap.d.ts +57 -0
- package/dist/internal/exchange/providers/uniswap.d.ts.map +1 -0
- package/dist/internal/exchange/providers/uniswap.js +553 -0
- package/dist/internal/exchange/providers/uniswap.js.map +1 -0
- package/dist/internal/funding/Action.d.ts +55 -0
- package/dist/internal/funding/Action.d.ts.map +1 -0
- package/dist/internal/funding/Action.js +74 -0
- package/dist/internal/funding/Action.js.map +1 -0
- package/dist/internal/funding/Catalog.d.ts +107 -0
- package/dist/internal/funding/Catalog.d.ts.map +1 -0
- package/dist/internal/funding/Catalog.js +270 -0
- package/dist/internal/funding/Catalog.js.map +1 -0
- package/dist/internal/funding/Chain.d.ts +76 -0
- package/dist/internal/funding/Chain.d.ts.map +1 -0
- package/dist/internal/funding/Chain.js +38 -0
- package/dist/internal/funding/Chain.js.map +1 -0
- package/dist/internal/funding/Deposit.d.ts +366 -0
- package/dist/internal/funding/Deposit.d.ts.map +1 -0
- package/dist/internal/funding/Deposit.js +286 -0
- package/dist/internal/funding/Deposit.js.map +1 -0
- package/dist/internal/funding/DepositAddress.d.ts +345 -0
- package/dist/internal/funding/DepositAddress.d.ts.map +1 -0
- package/dist/internal/funding/DepositAddress.js +189 -0
- package/dist/internal/funding/DepositAddress.js.map +1 -0
- package/dist/internal/funding/Evidence.d.ts +52 -0
- package/dist/internal/funding/Evidence.d.ts.map +1 -0
- package/dist/internal/funding/Evidence.js +314 -0
- package/dist/internal/funding/Evidence.js.map +1 -0
- package/dist/internal/funding/Provider.d.ts +1186 -0
- package/dist/internal/funding/Provider.d.ts.map +1 -0
- package/dist/internal/funding/Provider.js +1081 -0
- package/dist/internal/funding/Provider.js.map +1 -0
- package/dist/internal/funding/Reconciliation.d.ts +113 -0
- package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
- package/dist/internal/funding/Reconciliation.js +676 -0
- package/dist/internal/funding/Reconciliation.js.map +1 -0
- package/dist/internal/funding/Route.d.ts +21 -0
- package/dist/internal/funding/Route.d.ts.map +1 -0
- package/dist/internal/funding/Route.js +5 -0
- package/dist/internal/funding/Route.js.map +1 -0
- package/dist/internal/funding/Subsidy.d.ts +113 -0
- package/dist/internal/funding/Subsidy.d.ts.map +1 -0
- package/dist/internal/funding/Subsidy.js +138 -0
- package/dist/internal/funding/Subsidy.js.map +1 -0
- package/dist/internal/funding/Token.d.ts +41 -0
- package/dist/internal/funding/Token.d.ts.map +1 -0
- package/dist/internal/funding/Token.js +22 -0
- package/dist/internal/funding/Token.js.map +1 -0
- package/dist/internal/funding/Transfer.d.ts +643 -0
- package/dist/internal/funding/Transfer.d.ts.map +1 -0
- package/dist/internal/funding/Transfer.js +332 -0
- package/dist/internal/funding/Transfer.js.map +1 -0
- package/dist/internal/funding/index.d.ts +13 -0
- package/dist/internal/funding/index.d.ts.map +1 -0
- package/dist/internal/funding/index.js +13 -0
- package/dist/internal/funding/index.js.map +1 -0
- package/dist/internal/funding/providers/across.d.ts +21 -0
- package/dist/internal/funding/providers/across.d.ts.map +1 -0
- package/dist/internal/funding/providers/across.js +117 -0
- package/dist/internal/funding/providers/across.js.map +1 -0
- package/dist/internal/funding/providers/relay.d.ts +46 -0
- package/dist/internal/funding/providers/relay.d.ts.map +1 -0
- package/dist/internal/funding/providers/relay.js +464 -0
- package/dist/internal/funding/providers/relay.js.map +1 -0
- package/dist/internal/funding/providers/rhino.d.ts +15 -0
- package/dist/internal/funding/providers/rhino.d.ts.map +1 -0
- package/dist/internal/funding/providers/rhino.js +116 -0
- package/dist/internal/funding/providers/rhino.js.map +1 -0
- package/dist/internal/funding/providers/squid.d.ts +19 -0
- package/dist/internal/funding/providers/squid.d.ts.map +1 -0
- package/dist/internal/funding/providers/squid.js +120 -0
- package/dist/internal/funding/providers/squid.js.map +1 -0
- package/dist/internal/funding/providers/symbiosis.d.ts +20 -0
- package/dist/internal/funding/providers/symbiosis.d.ts.map +1 -0
- package/dist/internal/funding/providers/symbiosis.js +176 -0
- package/dist/internal/funding/providers/symbiosis.js.map +1 -0
- package/dist/internal/index.d.ts +5 -1
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +5 -1
- package/dist/internal/index.js.map +1 -1
- package/dist/internal/webhookDestinations/url.js +61 -57
- package/dist/internal/webhookDestinations/url.js.map +1 -1
- package/dist/providers/index.d.ts +43 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +19 -0
- package/dist/providers/index.js.map +1 -0
- package/package.json +9 -4
- package/src/ApiKeys.test.ts +11 -7
- package/src/ApiKeys.ts +37 -9
- package/src/App.test.ts +85 -10
- package/src/App.ts +224 -137
- package/src/Assets.ts +29 -4
- package/src/Client.test-d.ts +650 -30
- package/src/Scope.test.ts +19 -0
- package/src/Scope.ts +28 -11
- package/src/Webhooks.test.ts +25 -0
- package/src/Webhooks.ts +1 -1
- package/src/admin/App.test.ts +9 -2
- package/src/admin/App.ts +32 -9
- package/src/admin/apps/api-keys.test.ts +167 -23
- package/src/admin/apps/api-keys.ts +166 -28
- package/src/admin/apps/earn-vaults.test.ts +338 -0
- package/src/admin/apps/earn-vaults.ts +572 -0
- package/src/admin/apps/scopes.test.ts +16 -1
- package/src/admin/ui/plugin.ts +2 -2
- package/src/admin/ui/src/components/EarnVaultForm.tsx +137 -0
- package/src/admin/ui/src/components/MobileProfile.tsx +2 -2
- package/src/admin/ui/src/components/Page.tsx +1 -1
- package/src/admin/ui/src/components/ThemeToggle.tsx +1 -1
- package/src/admin/ui/src/lib/api-keys.ts +37 -7
- package/src/admin/ui/src/lib/client.ts +1 -1
- package/src/admin/ui/src/lib/config.ts +1 -1
- package/src/admin/ui/src/lib/early-access.ts +8 -9
- package/src/admin/ui/src/lib/earn-vaults.ts +207 -0
- package/src/admin/ui/src/lib/format.ts +13 -0
- package/src/admin/ui/src/lib/organizations.test.ts +14 -4
- package/src/admin/ui/src/lib/organizations.ts +7 -1
- package/src/admin/ui/src/lib/response.ts +22 -0
- package/src/admin/ui/src/lib/scopes.test.ts +19 -11
- package/src/admin/ui/src/lib/scopes.ts +28 -7
- package/src/admin/ui/src/lib/verified-tokens.ts +10 -9
- package/src/admin/ui/src/routeTree.gen.ts +70 -7
- package/src/admin/ui/src/router.tsx +2 -2
- package/src/admin/ui/src/routes/__root.tsx +9 -8
- package/src/admin/ui/src/routes/api-keys.tsx +475 -64
- package/src/admin/ui/src/routes/early-access.tsx +5 -12
- package/src/admin/ui/src/routes/earn.vaults.tsx +348 -0
- package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +154 -0
- package/src/admin/ui/src/routes/earn.vaults_.new.tsx +190 -0
- package/src/admin/ui/src/routes/organizations.tsx +4 -7
- package/src/admin/ui/src/routes/organizations_.$orgId.tsx +56 -54
- package/src/admin/ui/src/routes/verified-tokens.tsx +4 -4
- package/src/admin/ui/vite.config.ts +4 -1
- package/src/admin/ui.generated.ts +113 -43
- package/src/analytics/Analytics.test.ts +69 -10
- package/src/analytics/Analytics.ts +20 -1
- package/src/analytics/tables/requestEvents.ts +79 -37
- package/src/apps/Zones.test.ts +33 -0
- package/src/apps/Zones.ts +40 -0
- package/src/apps/composition.test.ts +84 -1
- package/src/apps/data/App.test.ts +28 -11
- package/src/apps/data/App.ts +96 -33
- package/src/apps/data/FxOracle.ts +1 -1
- package/src/apps/data/index.ts +0 -1
- package/src/apps/data/routes/activities.test.ts +82 -6
- package/src/apps/data/routes/activities.ts +131 -71
- package/src/apps/data/routes/balances.test.ts +50 -37
- package/src/apps/data/routes/balances.ts +5 -5
- package/src/apps/data/routes/blocks.test.ts +2 -0
- package/src/apps/data/routes/coingecko.test.ts +22 -0
- package/src/apps/data/routes/coingecko.ts +84 -48
- package/src/apps/data/routes/earn.test.ts +1108 -0
- package/src/apps/data/routes/earn.ts +1391 -0
- package/src/apps/data/routes/exchanges.test.ts +82 -33
- package/src/apps/data/routes/exchanges.ts +842 -227
- package/src/apps/data/routes/fee-amm.test.ts +4 -6
- package/src/apps/data/routes/fee-amm.ts +69 -12
- package/src/apps/data/routes/funding.test.ts +2712 -221
- package/src/apps/data/routes/funding.ts +1604 -387
- package/src/apps/data/routes/indexer.test.ts +43 -34
- package/src/apps/data/routes/indexer.ts +19 -2
- package/src/apps/data/routes/receipts.test.ts +5 -3
- package/src/apps/data/routes/receipts.ts +13 -11
- package/src/apps/data/routes/rpc.test.ts +446 -28
- package/src/apps/data/routes/rpc.ts +243 -25
- package/src/apps/data/routes/tokenlist.ts +72 -19
- package/src/apps/data/routes/tokens.ts +258 -86
- package/src/apps/data/routes/transactions.test.ts +2 -0
- package/src/apps/data/routes/transactions.ts +77 -42
- package/src/apps/data/routes/transfers.test.ts +166 -4
- package/src/apps/data/routes/transfers.ts +216 -78
- package/src/apps/data/routes/valuation.test.ts +62 -9
- package/src/apps/data/routes/valuation.ts +2 -2
- package/src/apps/data/routes/webhooks.test.ts +386 -43
- package/src/apps/data/routes/webhooks.ts +172 -71
- package/src/apps/data/routes/zones.test.ts +473 -0
- package/src/apps/data/routes/zones.ts +338 -0
- package/src/apps/docs/reference.ts +8 -6
- package/src/apps/index.ts +2 -1
- package/src/apps/management/Billing.test.ts +29 -0
- package/src/apps/management/Billing.ts +23 -0
- package/src/apps/management/Error.ts +12 -0
- package/src/apps/management/routes/api-keys.test.ts +5 -3
- package/src/apps/management/routes/api-keys.ts +2 -9
- package/src/apps/management/routes/invitations.ts +4 -11
- package/src/apps/management/routes/orgs.ts +2 -9
- package/src/apps/management/routes/scopes.test.ts +7 -2
- package/src/apps/management/routes/scopes.ts +2 -2
- package/src/apps/management/routes/webhooks.test.ts +6 -1
- package/src/apps/management/routes/webhooks.ts +15 -3
- package/src/apps/mpp/App.ts +276 -29
- package/src/apps/mpp/Mpp.test.ts +631 -26
- package/src/apps/mpp/Mpp.ts +0 -42
- package/src/apps/mpp/internal/Adapter.ts +108 -3
- package/src/apps/mpp/internal/Error.test.ts +33 -0
- package/src/apps/mpp/internal/Error.ts +44 -6
- package/src/apps/mpp/internal/Idempotency.test.ts +213 -0
- package/src/apps/mpp/internal/Idempotency.ts +59 -5
- package/src/apps/mpp/internal/Policy.test.ts +122 -0
- package/src/apps/mpp/internal/Policy.ts +98 -0
- package/src/apps/mpp/internal/ScreenManager.test.ts +68 -0
- package/src/apps/mpp/internal/ScreenManager.ts +41 -0
- package/src/apps/mpp/internal/Screening.ts +40 -3
- package/src/apps/mpp/internal/Sponsorship.ts +144 -0
- package/src/apps/mpp/internal/Utils.ts +30 -0
- package/src/apps/relay/App.test.ts +493 -62
- package/src/apps/relay/App.ts +233 -23
- package/src/apps/relay/Sponsorships.test.ts +49 -0
- package/src/apps/relay/Sponsorships.ts +18 -6
- package/src/db/Db.ts +439 -0
- package/src/db/Schema.ts +325 -2
- package/src/db/tables/earnVaults.test.ts +185 -0
- package/src/db/tables/earnVaults.ts +151 -0
- package/src/db/tables/fundingCatalog.test.ts +108 -0
- package/src/db/tables/fundingCatalog.ts +157 -0
- package/src/db/tables/fundingDepositAddresses.test.ts +580 -0
- package/src/db/tables/fundingDepositAddresses.ts +376 -0
- package/src/db/tables/fundingDeposits.test.ts +261 -0
- package/src/db/tables/fundingDeposits.ts +229 -0
- package/src/db/tables/fundingIdempotency.test.ts +182 -0
- package/src/db/tables/fundingIdempotency.ts +180 -0
- package/src/db/tables/fundingTransferEvents.ts +28 -0
- package/src/db/tables/fundingTransferTransactions.test.ts +69 -0
- package/src/db/tables/fundingTransferTransactions.ts +37 -0
- package/src/db/tables/fundingTransfers.test.ts +89 -0
- package/src/db/tables/fundingTransfers.ts +153 -0
- package/src/db/tables/organizations.ts +16 -0
- package/src/db/tables/projects.ts +16 -0
- package/src/db/tables/requestUsage.ts +23 -0
- package/src/db/tables/sponsoredTransactions.test.ts +11 -0
- package/src/db/tables/sponsoredTransactions.ts +3 -3
- package/src/db/tables/users.ts +16 -0
- package/src/db/tables/verifiedTokens.ts +19 -14
- package/src/db/tables/webhookSubscriptions.ts +58 -3
- package/src/handlers/relay.test.ts +2 -0
- package/src/handlers/relay.ts +95 -99
- package/src/internal/Auth.test.ts +48 -0
- package/src/internal/Auth.ts +61 -2
- package/src/internal/Cache.ts +13 -9
- package/src/internal/Cursor.test.ts +2 -2
- package/src/internal/Cursor.ts +1 -1
- package/src/internal/EarnRates.test.ts +125 -0
- package/src/internal/EarnRates.ts +409 -0
- package/src/internal/EarnVaults.test.ts +195 -0
- package/src/internal/EarnVaults.ts +876 -0
- package/src/internal/EdgeCache.test.ts +19 -0
- package/src/internal/EdgeCache.ts +35 -5
- package/src/internal/Id.ts +14 -0
- package/src/internal/Idempotency.test.ts +109 -0
- package/src/internal/Idempotency.ts +237 -0
- package/src/internal/Log.test-d.ts +41 -8
- package/src/internal/Log.test.ts +189 -8
- package/src/internal/Log.ts +124 -17
- package/src/internal/MetricSink.test.ts +244 -4
- package/src/internal/MetricSink.ts +51 -1
- package/src/internal/OpenApi.ts +3 -0
- package/src/internal/Provider.test.ts +17 -0
- package/src/internal/Provider.ts +17 -0
- package/src/internal/Schema.ts +27 -17
- package/src/internal/Store.test.ts +25 -0
- package/src/internal/Store.ts +46 -0
- package/src/internal/Tidx.local.test.ts +78 -3
- package/src/internal/Tidx.test.ts +212 -18
- package/src/internal/Tidx.ts +112 -32
- package/src/internal/VerifiedTokens.test.ts +15 -0
- package/src/internal/Viem.test.ts +170 -17
- package/src/internal/Viem.ts +111 -28
- package/src/internal/WebhookDestination.ts +25 -23
- package/src/internal/Webhooks.test.ts +59 -0
- package/src/internal/Webhooks.ts +34 -10
- package/src/internal/exchange/Provider.test.ts +216 -0
- package/src/internal/exchange/Provider.ts +326 -0
- package/src/internal/exchange/index.test.ts +6 -0
- package/src/internal/exchange/index.ts +1 -0
- package/src/internal/exchange/providers/uniswap.test.ts +122 -0
- package/src/internal/exchange/providers/uniswap.ts +682 -0
- package/src/internal/funding/Action.test.ts +138 -0
- package/src/internal/funding/Action.ts +117 -0
- package/src/internal/funding/Catalog.test.ts +311 -0
- package/src/internal/funding/Catalog.ts +347 -0
- package/src/internal/funding/Chain.test.ts +79 -0
- package/src/internal/funding/Chain.ts +120 -0
- package/src/internal/funding/Deposit.test.ts +26 -0
- package/src/internal/funding/Deposit.ts +453 -0
- package/src/internal/funding/DepositAddress.test.ts +18 -0
- package/src/internal/funding/DepositAddress.ts +312 -0
- package/src/internal/funding/Evidence.test.ts +297 -0
- package/src/internal/funding/Evidence.ts +430 -0
- package/src/internal/funding/Provider.test.ts +1328 -0
- package/src/internal/funding/Provider.ts +1796 -0
- package/src/internal/funding/Reconciliation.local.test.ts +504 -0
- package/src/internal/funding/Reconciliation.test.ts +2020 -0
- package/src/internal/funding/Reconciliation.ts +930 -0
- package/src/internal/funding/Route.test.ts +66 -0
- package/src/internal/funding/Route.ts +29 -0
- package/src/internal/funding/Subsidy.local.test.ts +152 -0
- package/src/internal/funding/Subsidy.test.ts +75 -0
- package/src/internal/funding/Subsidy.ts +260 -0
- package/src/internal/funding/Token.test.ts +47 -0
- package/src/internal/funding/Token.ts +59 -0
- package/src/internal/funding/Transfer.test.ts +369 -0
- package/src/internal/funding/Transfer.ts +522 -0
- package/src/internal/funding/index.test.ts +20 -0
- package/src/internal/funding/index.ts +12 -0
- package/src/internal/funding/providers/across.ts +149 -0
- package/src/{apps/data/FundingQuoteProviders.test.ts → internal/funding/providers/index.test.ts} +178 -157
- package/src/internal/funding/providers/relay.test.ts +474 -0
- package/src/internal/funding/providers/relay.ts +559 -0
- package/src/internal/funding/providers/rhino.ts +139 -0
- package/src/internal/funding/providers/squid.ts +151 -0
- package/src/internal/funding/providers/symbiosis.ts +221 -0
- package/src/internal/index.test.ts +5 -1
- package/src/internal/index.ts +5 -1
- package/src/internal/webhookDestinations/url.ts +49 -45
- package/src/providers/index.test.ts +14 -0
- package/src/providers/index.ts +54 -0
- package/dist/apps/data/FundingQuoteProviders.d.ts +0 -174
- package/dist/apps/data/FundingQuoteProviders.d.ts.map +0 -1
- package/dist/apps/data/FundingQuoteProviders.js +0 -775
- package/dist/apps/data/FundingQuoteProviders.js.map +0 -1
- package/dist/internal/FundingQuotes.d.ts +0 -864
- package/dist/internal/FundingQuotes.d.ts.map +0 -1
- package/dist/internal/FundingQuotes.js +0 -672
- package/dist/internal/FundingQuotes.js.map +0 -1
- package/src/apps/data/FundingQuoteProviders.ts +0 -1043
- package/src/internal/FundingQuotes.test.ts +0 -456
- package/src/internal/FundingQuotes.ts +0 -944
|
@@ -0,0 +1,876 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ContractFunctionExecutionError,
|
|
3
|
+
ContractFunctionRevertedError,
|
|
4
|
+
ContractFunctionZeroDataError,
|
|
5
|
+
isAddressEqual,
|
|
6
|
+
parseAbi,
|
|
7
|
+
} from 'viem'
|
|
8
|
+
import type { Address, Chain } from 'viem'
|
|
9
|
+
import { Abis, Addresses } from 'viem/tempo'
|
|
10
|
+
import * as z from 'zod/mini'
|
|
11
|
+
|
|
12
|
+
import * as Schema from './Schema.js'
|
|
13
|
+
import * as Viem from './Viem.js'
|
|
14
|
+
|
|
15
|
+
/** Zod schemas owned by the Earn vault resolver. */
|
|
16
|
+
export namespace schema {
|
|
17
|
+
const access = z
|
|
18
|
+
.strictObject({
|
|
19
|
+
status: z
|
|
20
|
+
.enum(['allowlisted', 'open'])
|
|
21
|
+
.check(z.describe('Vault share-token access status.'), z.meta({ examples: ['open'] })),
|
|
22
|
+
})
|
|
23
|
+
.check(z.describe('Vault share-token access.'))
|
|
24
|
+
|
|
25
|
+
const capabilities = z
|
|
26
|
+
.strictObject({
|
|
27
|
+
asyncRedeem: z
|
|
28
|
+
.boolean()
|
|
29
|
+
.check(
|
|
30
|
+
z.describe('Whether queued redemptions are supported.'),
|
|
31
|
+
z.meta({ examples: [false] }),
|
|
32
|
+
),
|
|
33
|
+
boundedRedeem: z
|
|
34
|
+
.boolean()
|
|
35
|
+
.check(
|
|
36
|
+
z.describe('Whether redemption accepts a minimum asset bound.'),
|
|
37
|
+
z.meta({ examples: [true] }),
|
|
38
|
+
),
|
|
39
|
+
deposit: z
|
|
40
|
+
.boolean()
|
|
41
|
+
.check(z.describe('Whether asset deposits are supported.'), z.meta({ examples: [true] })),
|
|
42
|
+
exactWithdraw: z
|
|
43
|
+
.boolean()
|
|
44
|
+
.check(
|
|
45
|
+
z.describe('Whether exact asset withdrawals are supported.'),
|
|
46
|
+
z.meta({ examples: [true] }),
|
|
47
|
+
),
|
|
48
|
+
inKindDeposit: z
|
|
49
|
+
.boolean()
|
|
50
|
+
.check(
|
|
51
|
+
z.describe('Whether venue-share deposits are supported.'),
|
|
52
|
+
z.meta({ examples: [true] }),
|
|
53
|
+
),
|
|
54
|
+
privateRouting: z
|
|
55
|
+
.boolean()
|
|
56
|
+
.check(z.describe('Whether private routing is supported.'), z.meta({ examples: [false] })),
|
|
57
|
+
redeem: z
|
|
58
|
+
.boolean()
|
|
59
|
+
.check(
|
|
60
|
+
z.describe('Whether immediate redemptions are supported.'),
|
|
61
|
+
z.meta({ examples: [true] }),
|
|
62
|
+
),
|
|
63
|
+
routerSwaps: z
|
|
64
|
+
.boolean()
|
|
65
|
+
.check(
|
|
66
|
+
z.describe('Whether router token swaps are supported.'),
|
|
67
|
+
z.meta({ examples: [false] }),
|
|
68
|
+
),
|
|
69
|
+
})
|
|
70
|
+
.check(z.describe('Actions supported by an Earn vault.'))
|
|
71
|
+
|
|
72
|
+
const engineType = z
|
|
73
|
+
.nullable(z.enum(['erc4626', 'veda']))
|
|
74
|
+
.check(
|
|
75
|
+
z.describe('Engine type inferred from supported actions.'),
|
|
76
|
+
z.meta({ examples: ['erc4626'] }),
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
const state = z
|
|
80
|
+
.strictObject({
|
|
81
|
+
depositsPaused: z
|
|
82
|
+
.boolean()
|
|
83
|
+
.check(z.describe('Whether new deposits are paused.'), z.meta({ examples: [false] })),
|
|
84
|
+
engineShares: Schema.DecimalString.check(
|
|
85
|
+
z.describe('Venue shares held for the vault.'),
|
|
86
|
+
z.meta({ examples: ['1000000'] }),
|
|
87
|
+
),
|
|
88
|
+
feesActive: z
|
|
89
|
+
.boolean()
|
|
90
|
+
.check(
|
|
91
|
+
z.describe('Whether fees are configured and not emergency-disabled.'),
|
|
92
|
+
z.meta({ examples: [true] }),
|
|
93
|
+
),
|
|
94
|
+
isAccountingAligned: z
|
|
95
|
+
.boolean()
|
|
96
|
+
.check(
|
|
97
|
+
z.describe('Whether Earn share supply matches its asset backing.'),
|
|
98
|
+
z.meta({ examples: [true] }),
|
|
99
|
+
),
|
|
100
|
+
openRedeemRequestCount: z
|
|
101
|
+
.number()
|
|
102
|
+
.check(
|
|
103
|
+
z.int(),
|
|
104
|
+
z.nonnegative(),
|
|
105
|
+
z.describe('Queued redemptions still awaiting settlement.'),
|
|
106
|
+
z.meta({ examples: [0] }),
|
|
107
|
+
),
|
|
108
|
+
totalAssets: Schema.DecimalString.check(
|
|
109
|
+
z.describe('Asset value of the active backing.'),
|
|
110
|
+
z.meta({ examples: ['1000000'] }),
|
|
111
|
+
),
|
|
112
|
+
totalEarnShares: Schema.DecimalString.check(
|
|
113
|
+
z.describe('Active Earn share supply.'),
|
|
114
|
+
z.meta({ examples: ['1000000'] }),
|
|
115
|
+
),
|
|
116
|
+
})
|
|
117
|
+
.check(z.describe('Live vault accounting state.'))
|
|
118
|
+
|
|
119
|
+
const metadata = z
|
|
120
|
+
.strictObject({
|
|
121
|
+
address: Schema.Address.check(
|
|
122
|
+
z.describe('Token contract address.'),
|
|
123
|
+
z.meta({ examples: ['0x20c000000000000000000000ff04042ee92fd449'] }),
|
|
124
|
+
),
|
|
125
|
+
currency: z
|
|
126
|
+
.string()
|
|
127
|
+
.check(z.describe('Token display currency.'), z.meta({ examples: ['USD'] })),
|
|
128
|
+
decimals: z
|
|
129
|
+
.number()
|
|
130
|
+
.check(
|
|
131
|
+
z.int(),
|
|
132
|
+
z.nonnegative(),
|
|
133
|
+
z.maximum(255),
|
|
134
|
+
z.describe('Token decimal precision.'),
|
|
135
|
+
z.meta({ examples: [6] }),
|
|
136
|
+
),
|
|
137
|
+
name: z
|
|
138
|
+
.string()
|
|
139
|
+
.check(
|
|
140
|
+
z.minLength(1),
|
|
141
|
+
z.describe('Token name.'),
|
|
142
|
+
z.meta({ examples: ['Bridge Test PATHUSD'] }),
|
|
143
|
+
),
|
|
144
|
+
symbol: z
|
|
145
|
+
.string()
|
|
146
|
+
.check(z.minLength(1), z.describe('Token symbol.'), z.meta({ examples: ['btPATHUSD'] })),
|
|
147
|
+
})
|
|
148
|
+
.check(z.describe('Token address and metadata resolved onchain.'))
|
|
149
|
+
|
|
150
|
+
/** Schema selecting one onchain Earn vault. */
|
|
151
|
+
export const ResolveInput = z
|
|
152
|
+
.strictObject({
|
|
153
|
+
chainId: Schema.ChainId.check(
|
|
154
|
+
z.describe('Tempo chain id containing the vault.'),
|
|
155
|
+
z.meta({ examples: [42431] }),
|
|
156
|
+
),
|
|
157
|
+
vaultAddress: Schema.Address.check(
|
|
158
|
+
z.describe('Earn vault contract address.'),
|
|
159
|
+
z.meta({ examples: ['0xf4ae63687d6753a78e7f551d2eda1d0d31a5ea3a'] }),
|
|
160
|
+
),
|
|
161
|
+
})
|
|
162
|
+
.check(z.describe('Onchain identity of an Earn vault.'))
|
|
163
|
+
|
|
164
|
+
/** Schema for live state resolved from one Earn vault. */
|
|
165
|
+
export const Discovery = z
|
|
166
|
+
.strictObject({
|
|
167
|
+
access: z.optional(access).check(z.describe('Vault share-token access, when requested.')),
|
|
168
|
+
assetToken: metadata,
|
|
169
|
+
capabilities: z
|
|
170
|
+
.optional(capabilities)
|
|
171
|
+
.check(z.describe('Actions supported by the vault, when requested.')),
|
|
172
|
+
chainId: Schema.ChainId.check(
|
|
173
|
+
z.describe('Tempo chain id containing the vault.'),
|
|
174
|
+
z.meta({ examples: [42431] }),
|
|
175
|
+
),
|
|
176
|
+
engine: z
|
|
177
|
+
.strictObject({
|
|
178
|
+
address: Schema.Address.check(
|
|
179
|
+
z.describe('Current vault engine address.'),
|
|
180
|
+
z.meta({ examples: ['0xd85fc943333a6cd7c0e3391acd54fc4e572f0baf'] }),
|
|
181
|
+
),
|
|
182
|
+
type: engineType,
|
|
183
|
+
venue: z
|
|
184
|
+
.nullable(
|
|
185
|
+
Schema.Address.check(
|
|
186
|
+
z.describe('Yield venue bound to the engine.'),
|
|
187
|
+
z.meta({ examples: ['0xa8b4f0e69cd4b0e56b676343f02acd8c3b355322'] }),
|
|
188
|
+
),
|
|
189
|
+
)
|
|
190
|
+
.check(z.describe('Yield venue, or null when the engine does not expose one.')),
|
|
191
|
+
})
|
|
192
|
+
.check(z.describe('Current vault engine.')),
|
|
193
|
+
instantLiquidity: z
|
|
194
|
+
.nullable(
|
|
195
|
+
Schema.DecimalString.check(
|
|
196
|
+
z.describe('Assets the venue would release right now, in asset base units.'),
|
|
197
|
+
z.meta({ examples: ['1000000'] }),
|
|
198
|
+
),
|
|
199
|
+
)
|
|
200
|
+
.check(
|
|
201
|
+
z.describe(
|
|
202
|
+
'Synchronously redeemable assets, or null when the engine cannot report a reliable number.',
|
|
203
|
+
),
|
|
204
|
+
),
|
|
205
|
+
sharePrice: z
|
|
206
|
+
.nullable(
|
|
207
|
+
Schema.DecimalString.check(
|
|
208
|
+
z.describe('Assets returned for one whole Earn share, in asset base units.'),
|
|
209
|
+
z.meta({ examples: ['1000000'] }),
|
|
210
|
+
),
|
|
211
|
+
)
|
|
212
|
+
.check(
|
|
213
|
+
z.describe('Assets per whole Earn share, or null when the engine cannot quote an exit.'),
|
|
214
|
+
),
|
|
215
|
+
shareToken: metadata,
|
|
216
|
+
state,
|
|
217
|
+
vaultAddress: Schema.Address.check(
|
|
218
|
+
z.describe('Earn vault contract address.'),
|
|
219
|
+
z.meta({ examples: ['0xf4ae63687d6753a78e7f551d2eda1d0d31a5ea3a'] }),
|
|
220
|
+
),
|
|
221
|
+
})
|
|
222
|
+
.check(z.describe('Live state resolved from an Earn vault.'))
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/** Live state resolved from an Earn vault. */
|
|
226
|
+
export type Discovery = z.output<typeof schema.Discovery>
|
|
227
|
+
|
|
228
|
+
/** Onchain identity of an Earn vault. */
|
|
229
|
+
export type ResolveInput = z.output<typeof schema.ResolveInput>
|
|
230
|
+
|
|
231
|
+
/** Stable code describing an onchain verification issue. */
|
|
232
|
+
export type VerificationIssueCode =
|
|
233
|
+
| 'chain-mismatch'
|
|
234
|
+
| 'engine-asset-mismatch'
|
|
235
|
+
| 'policy-unsupported'
|
|
236
|
+
| 'read-failed'
|
|
237
|
+
|
|
238
|
+
/** One onchain verification issue. */
|
|
239
|
+
export type VerificationIssue = {
|
|
240
|
+
/** Observed value, when available. */
|
|
241
|
+
actual?: string | undefined
|
|
242
|
+
/** Stable machine-readable issue code. */
|
|
243
|
+
code: VerificationIssueCode
|
|
244
|
+
/** Expected value, when available. */
|
|
245
|
+
expected?: string | undefined
|
|
246
|
+
/** Human-readable issue detail. */
|
|
247
|
+
message: string
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/** Token and vault state observed during verification. */
|
|
251
|
+
export type VerificationSnapshot = {
|
|
252
|
+
/** Asset token observed onchain. */
|
|
253
|
+
assetToken?: Discovery['assetToken'] | undefined
|
|
254
|
+
/** Whether vault supply matches its engine backing. */
|
|
255
|
+
isSynced?: boolean | undefined
|
|
256
|
+
/** Share token observed onchain. */
|
|
257
|
+
shareToken?: Discovery['shareToken'] | undefined
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
type VerificationMismatch = {
|
|
261
|
+
/** Issues found while reading the deployment. */
|
|
262
|
+
issues: readonly VerificationIssue[]
|
|
263
|
+
/** Token and vault state observed during verification. */
|
|
264
|
+
snapshot: VerificationSnapshot
|
|
265
|
+
/** Indicates that onchain state is incompatible. */
|
|
266
|
+
status: 'mismatch'
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
type VerificationUnavailable = {
|
|
270
|
+
/** Issue that prevented verification. */
|
|
271
|
+
issues: readonly VerificationIssue[]
|
|
272
|
+
/** Indicates that verification could not complete. */
|
|
273
|
+
status: 'unavailable'
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
type VerificationFailure = VerificationMismatch | VerificationUnavailable
|
|
277
|
+
|
|
278
|
+
type Client = Pick<Viem.getClient.ReturnType, 'earn' | 'getChainId' | 'getCode' | 'readContract'>
|
|
279
|
+
|
|
280
|
+
type EngineCapabilities = {
|
|
281
|
+
asyncRedeem: boolean
|
|
282
|
+
exactWithdraw: boolean
|
|
283
|
+
inKindDeposit: boolean
|
|
284
|
+
syncRedeem: boolean
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
type VaultBindings = {
|
|
288
|
+
asset: Address
|
|
289
|
+
capabilities: EngineCapabilities
|
|
290
|
+
depositsPaused: boolean
|
|
291
|
+
engine: Address
|
|
292
|
+
engineShares: bigint
|
|
293
|
+
feesActive: boolean
|
|
294
|
+
isSynced: boolean
|
|
295
|
+
openRedeemRequestCount: bigint
|
|
296
|
+
shareSupply: bigint
|
|
297
|
+
shareToken: Address
|
|
298
|
+
totalAssets: bigint
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
type RouterCapabilities = {
|
|
302
|
+
deposit: boolean
|
|
303
|
+
redeem: boolean
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
type TokenMetadata = Omit<Discovery['assetToken'], 'address'>
|
|
307
|
+
|
|
308
|
+
const engineBindingsAbi = parseAbi(['function vault() view returns (address)'])
|
|
309
|
+
|
|
310
|
+
const venueLiquidityAbi = parseAbi(['function maxWithdraw(address owner) view returns (uint256)'])
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Shares quoted to derive a share price. `previewRedeem` is linear in shares, so
|
|
314
|
+
* a large quote rescales to one whole share without base-unit quantization.
|
|
315
|
+
*/
|
|
316
|
+
const quotedShares = 10n ** 18n
|
|
317
|
+
|
|
318
|
+
const accessFlights = new WeakMap<Client, Map<bigint, Promise<NonNullable<Discovery['access']>>>>()
|
|
319
|
+
const chainIds = new WeakMap<Client, Promise<number | undefined>>()
|
|
320
|
+
const fullInclude = ['access', 'capabilities'] as const
|
|
321
|
+
const tokenMetadataFlights = new WeakMap<Client, Map<Address, Promise<TokenMetadata>>>()
|
|
322
|
+
const transferPolicyIdFlights = new WeakMap<Client, Map<Address, Promise<bigint>>>()
|
|
323
|
+
|
|
324
|
+
/** Resolves one Earn vault from its onchain identity. */
|
|
325
|
+
export function resolve(options: resolve.ProjectedOptions): Promise<Discovery>
|
|
326
|
+
/** Resolves every optional Earn vault field. */
|
|
327
|
+
export function resolve(options: resolve.Options): Promise<resolve.CompleteDiscovery>
|
|
328
|
+
export async function resolve(
|
|
329
|
+
options: resolve.Options | resolve.ProjectedOptions,
|
|
330
|
+
): Promise<Discovery> {
|
|
331
|
+
const input = parseInput(options.input)
|
|
332
|
+
const include = 'include' in options ? options.include : fullInclude
|
|
333
|
+
const zones = options.zones.filter((zone) => zone.sourceId === input.chainId)
|
|
334
|
+
return resolveOnchain(options.getClient(input.chainId), { include, input, zones })
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
export declare namespace resolve {
|
|
338
|
+
/** Fully resolved Earn vault state. */
|
|
339
|
+
type CompleteDiscovery = Discovery & {
|
|
340
|
+
/** Vault share-token access. */
|
|
341
|
+
access: NonNullable<Discovery['access']>
|
|
342
|
+
/** Actions supported by the vault. */
|
|
343
|
+
capabilities: NonNullable<Discovery['capabilities']>
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/** Optional onchain fields to resolve. */
|
|
347
|
+
type Include = 'access' | 'capabilities'
|
|
348
|
+
|
|
349
|
+
/** Options for resolving one Earn vault. */
|
|
350
|
+
type Options = {
|
|
351
|
+
/** Resolves the onchain client used to read the vault. */
|
|
352
|
+
getClient: Viem.GetClient
|
|
353
|
+
/** Chain and vault identity to resolve. */
|
|
354
|
+
input: unknown
|
|
355
|
+
/** Private zones available to Earn routers. */
|
|
356
|
+
zones: readonly Chain[]
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/** Options for resolving selected optional fields. */
|
|
360
|
+
type ProjectedOptions = Options & {
|
|
361
|
+
/** Optional onchain fields to resolve. */
|
|
362
|
+
include: readonly Include[]
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/** Infers the supported engine type from its capability fingerprint. */
|
|
367
|
+
export function classifyEngineType(
|
|
368
|
+
options: classifyEngineType.Options,
|
|
369
|
+
): classifyEngineType.ReturnType {
|
|
370
|
+
if (options.inKindDeposit && !options.asyncRedeem) return 'erc4626'
|
|
371
|
+
if (options.asyncRedeem && !options.inKindDeposit) return 'veda'
|
|
372
|
+
return null
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
export declare namespace classifyEngineType {
|
|
376
|
+
/** Capability fingerprint used to classify an engine. */
|
|
377
|
+
type Options = {
|
|
378
|
+
/** Whether queued redemptions are supported. */
|
|
379
|
+
asyncRedeem: boolean
|
|
380
|
+
/** Whether venue-share deposits are supported. */
|
|
381
|
+
inKindDeposit: boolean
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/** Supported engine type, or null for an unknown fingerprint. */
|
|
385
|
+
type ReturnType = 'erc4626' | 'veda' | null
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
async function resolveOnchain(client: Client, options: resolveOnchain.Options): Promise<Discovery> {
|
|
389
|
+
const { include, input, zones } = options
|
|
390
|
+
const includeAccess = include.includes('access')
|
|
391
|
+
const includeCapabilities = include.includes('capabilities')
|
|
392
|
+
const actualChainId = await getChainId(client)
|
|
393
|
+
if (actualChainId === undefined) throw new VerificationError(unavailable())
|
|
394
|
+
if (actualChainId !== input.chainId)
|
|
395
|
+
throw new VerificationError({
|
|
396
|
+
issues: [
|
|
397
|
+
{
|
|
398
|
+
actual: String(actualChainId),
|
|
399
|
+
code: 'chain-mismatch',
|
|
400
|
+
expected: String(input.chainId),
|
|
401
|
+
message: `Expected chain ${input.chainId}, received ${actualChainId}.`,
|
|
402
|
+
},
|
|
403
|
+
],
|
|
404
|
+
status: 'unavailable',
|
|
405
|
+
})
|
|
406
|
+
|
|
407
|
+
const vault = await readVaultBindings(client, input.vaultAddress).catch(async (error) => {
|
|
408
|
+
if (isMissingContractError(error) && !(await client.getCode({ address: input.vaultAddress })))
|
|
409
|
+
throw new NotFoundError(
|
|
410
|
+
`Earn vault ${input.vaultAddress} was not found on chain ${input.chainId}.`,
|
|
411
|
+
)
|
|
412
|
+
throw error
|
|
413
|
+
})
|
|
414
|
+
const engineType = classifyEngineType(vault.capabilities)
|
|
415
|
+
const engineBindings = readEngineBindings(client, { engine: vault.engine })
|
|
416
|
+
const [access, asset, bindings, withdrawable, routerCapabilities, shareQuote, shareToken] =
|
|
417
|
+
await Promise.all([
|
|
418
|
+
includeAccess
|
|
419
|
+
? readTransferPolicyId(client, vault.shareToken).then((transferPolicyId) =>
|
|
420
|
+
readAccess(client, transferPolicyId),
|
|
421
|
+
)
|
|
422
|
+
: undefined,
|
|
423
|
+
readTokenMetadata(client, vault.asset),
|
|
424
|
+
engineBindings,
|
|
425
|
+
// Instant liquidity is the venue's own withdrawal limit, so it waits on the
|
|
426
|
+
// engine's venue binding. Only an ERC-4626 venue can expose one.
|
|
427
|
+
engineBindings.then(({ venue }) =>
|
|
428
|
+
engineType === 'erc4626' && venue
|
|
429
|
+
? readVenueLiquidity(client, { owner: vault.engine, venue })
|
|
430
|
+
: undefined,
|
|
431
|
+
),
|
|
432
|
+
includeCapabilities
|
|
433
|
+
? readRouterCapabilities(client, { chainId: input.chainId, zones })
|
|
434
|
+
: Promise.resolve({ deposit: false, redeem: false }),
|
|
435
|
+
readShareQuote(client, {
|
|
436
|
+
syncRedeem: vault.capabilities.syncRedeem,
|
|
437
|
+
vaultAddress: input.vaultAddress,
|
|
438
|
+
}),
|
|
439
|
+
readTokenMetadata(client, vault.shareToken),
|
|
440
|
+
])
|
|
441
|
+
const { asset: engineAsset, venue } = bindings
|
|
442
|
+
const assetToken = {
|
|
443
|
+
address: vault.asset,
|
|
444
|
+
currency: asset.currency,
|
|
445
|
+
decimals: asset.decimals,
|
|
446
|
+
name: asset.name,
|
|
447
|
+
symbol: asset.symbol,
|
|
448
|
+
}
|
|
449
|
+
const shareToken_ = {
|
|
450
|
+
address: vault.shareToken,
|
|
451
|
+
currency: shareToken.currency,
|
|
452
|
+
decimals: shareToken.decimals,
|
|
453
|
+
name: shareToken.name,
|
|
454
|
+
symbol: shareToken.symbol,
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
const issues: VerificationIssue[] = []
|
|
458
|
+
compareAddress(
|
|
459
|
+
issues,
|
|
460
|
+
'engine-asset-mismatch',
|
|
461
|
+
'Engine asset does not match the vault asset.',
|
|
462
|
+
vault.asset,
|
|
463
|
+
engineAsset,
|
|
464
|
+
)
|
|
465
|
+
if (issues.length > 0)
|
|
466
|
+
throw new VerificationError({
|
|
467
|
+
issues,
|
|
468
|
+
snapshot: {
|
|
469
|
+
assetToken: parseTokenMetadata(assetToken),
|
|
470
|
+
isSynced: vault.isSynced,
|
|
471
|
+
shareToken: parseTokenMetadata(shareToken_),
|
|
472
|
+
},
|
|
473
|
+
status: 'mismatch',
|
|
474
|
+
})
|
|
475
|
+
|
|
476
|
+
const capabilities = (() => {
|
|
477
|
+
if (!includeCapabilities) return undefined
|
|
478
|
+
const privateRouting = routerCapabilities.deposit && routerCapabilities.redeem
|
|
479
|
+
return {
|
|
480
|
+
asyncRedeem: vault.capabilities.asyncRedeem,
|
|
481
|
+
boundedRedeem: vault.capabilities.syncRedeem,
|
|
482
|
+
deposit: true,
|
|
483
|
+
exactWithdraw: vault.capabilities.exactWithdraw,
|
|
484
|
+
inKindDeposit: vault.capabilities.inKindDeposit,
|
|
485
|
+
privateRouting,
|
|
486
|
+
redeem: vault.capabilities.syncRedeem,
|
|
487
|
+
routerSwaps: privateRouting,
|
|
488
|
+
}
|
|
489
|
+
})()
|
|
490
|
+
return parseDiscovery({
|
|
491
|
+
...(access ? { access } : {}),
|
|
492
|
+
assetToken,
|
|
493
|
+
...(capabilities ? { capabilities } : {}),
|
|
494
|
+
chainId: input.chainId,
|
|
495
|
+
engine: {
|
|
496
|
+
address: vault.engine,
|
|
497
|
+
type: engineType,
|
|
498
|
+
venue,
|
|
499
|
+
},
|
|
500
|
+
// The vault can never hand out more than its active backing, whatever the
|
|
501
|
+
// venue would release.
|
|
502
|
+
instantLiquidity:
|
|
503
|
+
withdrawable === undefined
|
|
504
|
+
? null
|
|
505
|
+
: (withdrawable < vault.totalAssets ? withdrawable : vault.totalAssets).toString(),
|
|
506
|
+
sharePrice:
|
|
507
|
+
shareQuote === undefined
|
|
508
|
+
? null
|
|
509
|
+
: ((shareQuote * 10n ** BigInt(shareToken.decimals)) / quotedShares).toString(),
|
|
510
|
+
shareToken: shareToken_,
|
|
511
|
+
state: {
|
|
512
|
+
depositsPaused: vault.depositsPaused,
|
|
513
|
+
engineShares: vault.engineShares.toString(),
|
|
514
|
+
feesActive: vault.feesActive,
|
|
515
|
+
isAccountingAligned: vault.isSynced,
|
|
516
|
+
openRedeemRequestCount: Number(vault.openRedeemRequestCount),
|
|
517
|
+
totalAssets: vault.totalAssets.toString(),
|
|
518
|
+
totalEarnShares: vault.shareSupply.toString(),
|
|
519
|
+
},
|
|
520
|
+
vaultAddress: input.vaultAddress,
|
|
521
|
+
})
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
declare namespace resolveOnchain {
|
|
525
|
+
type Options = {
|
|
526
|
+
include: readonly resolve.Include[]
|
|
527
|
+
input: ResolveInput
|
|
528
|
+
zones: readonly Chain[]
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
function parseInput(value: unknown): ResolveInput {
|
|
533
|
+
const result = schema.ResolveInput.safeParse(value)
|
|
534
|
+
if (!result.success) throw invalid(result.error)
|
|
535
|
+
return result.data
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
function parseDiscovery(value: unknown): Discovery {
|
|
539
|
+
const result = schema.Discovery.safeParse(value)
|
|
540
|
+
if (!result.success) throw invalid(result.error)
|
|
541
|
+
return result.data
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
function parseTokenMetadata(
|
|
545
|
+
value: Pick<Discovery['assetToken'], 'address' | 'currency' | 'decimals' | 'name' | 'symbol'>,
|
|
546
|
+
): Discovery['assetToken'] {
|
|
547
|
+
const result = schema.Discovery.shape.assetToken.safeParse(value)
|
|
548
|
+
if (!result.success) throw invalid(result.error)
|
|
549
|
+
return result.data
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
function invalid(error: z.core.$ZodError): InvalidRegistryError {
|
|
553
|
+
const issue = error.issues[0]
|
|
554
|
+
const path = issue?.path.length ? `${issue.path.join('.')}: ` : ''
|
|
555
|
+
return new InvalidRegistryError(`${path}${issue?.message ?? 'invalid input'}`)
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
async function getChainId(client: Client): Promise<number | undefined> {
|
|
559
|
+
const existing = chainIds.get(client)
|
|
560
|
+
if (existing) return existing
|
|
561
|
+
|
|
562
|
+
const pending = client.getChainId().catch(() => {
|
|
563
|
+
chainIds.delete(client)
|
|
564
|
+
return undefined
|
|
565
|
+
})
|
|
566
|
+
chainIds.set(client, pending)
|
|
567
|
+
return pending
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
async function readAccess(
|
|
571
|
+
client: Client,
|
|
572
|
+
transferPolicyId: bigint | undefined,
|
|
573
|
+
): Promise<NonNullable<Discovery['access']>> {
|
|
574
|
+
if (transferPolicyId === 1n) return { status: 'open' }
|
|
575
|
+
if (transferPolicyId === undefined || transferPolicyId <= 2n)
|
|
576
|
+
throw new VerificationError({
|
|
577
|
+
issues: [
|
|
578
|
+
{
|
|
579
|
+
actual: transferPolicyId?.toString(),
|
|
580
|
+
code: 'policy-unsupported',
|
|
581
|
+
message: 'Share token does not use an open or compound transfer policy.',
|
|
582
|
+
},
|
|
583
|
+
],
|
|
584
|
+
snapshot: {},
|
|
585
|
+
status: 'mismatch',
|
|
586
|
+
})
|
|
587
|
+
|
|
588
|
+
const flights = flightsFor(accessFlights, client)
|
|
589
|
+
const existing = flights.get(transferPolicyId)
|
|
590
|
+
if (existing) return existing
|
|
591
|
+
const pending = (async () => {
|
|
592
|
+
const [senderPolicyId, recipientPolicyId, mintRecipientPolicyId] = await client.readContract({
|
|
593
|
+
abi: Abis.tip403Registry,
|
|
594
|
+
address: Addresses.tip403Registry,
|
|
595
|
+
args: [transferPolicyId],
|
|
596
|
+
functionName: 'compoundPolicyData',
|
|
597
|
+
})
|
|
598
|
+
if (
|
|
599
|
+
senderPolicyId === 0n ||
|
|
600
|
+
recipientPolicyId === 0n ||
|
|
601
|
+
mintRecipientPolicyId === 0n ||
|
|
602
|
+
senderPolicyId !== 1n ||
|
|
603
|
+
recipientPolicyId !== mintRecipientPolicyId
|
|
604
|
+
)
|
|
605
|
+
throw new VerificationError({
|
|
606
|
+
issues: [
|
|
607
|
+
{
|
|
608
|
+
actual: transferPolicyId.toString(),
|
|
609
|
+
code: 'policy-unsupported',
|
|
610
|
+
message: 'Share token does not use a supported exit-safe compound policy.',
|
|
611
|
+
},
|
|
612
|
+
],
|
|
613
|
+
snapshot: {},
|
|
614
|
+
status: 'mismatch',
|
|
615
|
+
})
|
|
616
|
+
|
|
617
|
+
return { status: 'allowlisted' as const }
|
|
618
|
+
})()
|
|
619
|
+
flights.set(transferPolicyId, pending)
|
|
620
|
+
try {
|
|
621
|
+
return await pending
|
|
622
|
+
} finally {
|
|
623
|
+
flights.delete(transferPolicyId)
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
async function readVaultBindings(client: Client, vaultAddress: Address): Promise<VaultBindings> {
|
|
628
|
+
const vault = await client.earn.getVault({ vault: vaultAddress })
|
|
629
|
+
return {
|
|
630
|
+
asset: vault.assetToken,
|
|
631
|
+
capabilities: vault.capabilities,
|
|
632
|
+
depositsPaused: vault.depositsPaused,
|
|
633
|
+
engine: vault.engine.address,
|
|
634
|
+
engineShares: vault.engineShares,
|
|
635
|
+
feesActive: vault.feesActive,
|
|
636
|
+
isSynced: vault.isSynced,
|
|
637
|
+
openRedeemRequestCount: vault.pendingRedeemCount,
|
|
638
|
+
shareSupply: vault.shareSupply,
|
|
639
|
+
shareToken: vault.shareToken,
|
|
640
|
+
totalAssets: vault.engine.totalAssets,
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
/**
|
|
645
|
+
* Assets the venue would let the engine withdraw right now, so an illiquid,
|
|
646
|
+
* paused, or gated venue reports less than the engine's position is worth. There
|
|
647
|
+
* is no fallback: valuing the position instead would restate `totalAssets` and
|
|
648
|
+
* claim liquidity the venue never offered.
|
|
649
|
+
*/
|
|
650
|
+
function readVenueLiquidity(
|
|
651
|
+
client: Client,
|
|
652
|
+
options: readVenueLiquidity.Options,
|
|
653
|
+
): Promise<bigint | undefined> {
|
|
654
|
+
return client
|
|
655
|
+
.readContract({
|
|
656
|
+
abi: venueLiquidityAbi,
|
|
657
|
+
address: options.venue,
|
|
658
|
+
args: [options.owner],
|
|
659
|
+
functionName: 'maxWithdraw',
|
|
660
|
+
})
|
|
661
|
+
.catch((error) => {
|
|
662
|
+
// A venue that reports no withdrawal limit reports no instant liquidity.
|
|
663
|
+
if (error instanceof ContractFunctionExecutionError) return undefined
|
|
664
|
+
throw error
|
|
665
|
+
})
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
declare namespace readVenueLiquidity {
|
|
669
|
+
type Options = {
|
|
670
|
+
/** Account whose withdrawal limit is read, always the engine. */
|
|
671
|
+
owner: Address
|
|
672
|
+
/** Venue the engine holds its position in. */
|
|
673
|
+
venue: Address
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
/**
|
|
678
|
+
* Assets returned for {@link quotedShares} Earn shares. The vault's
|
|
679
|
+
* `previewRedeem` reverts unless the engine advertises synchronous redemption,
|
|
680
|
+
* and the venue may refuse to value an exit at all.
|
|
681
|
+
*/
|
|
682
|
+
function readShareQuote(
|
|
683
|
+
client: Client,
|
|
684
|
+
options: readShareQuote.Options,
|
|
685
|
+
): Promise<bigint | undefined> {
|
|
686
|
+
if (!options.syncRedeem) return Promise.resolve(undefined)
|
|
687
|
+
return client.earn
|
|
688
|
+
.getRedeemQuote({ shareAmount: quotedShares, vault: options.vaultAddress })
|
|
689
|
+
.catch((error) => {
|
|
690
|
+
if (error instanceof ContractFunctionExecutionError) return undefined
|
|
691
|
+
throw error
|
|
692
|
+
})
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
declare namespace readShareQuote {
|
|
696
|
+
type Options = {
|
|
697
|
+
/** Whether the engine advertises synchronous redemption. */
|
|
698
|
+
syncRedeem: boolean
|
|
699
|
+
/** Earn vault quoted against. */
|
|
700
|
+
vaultAddress: Address
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
async function readEngineBindings(client: Client, options: readEngineBindings.Options) {
|
|
705
|
+
const [asset, venue] = await Promise.all([
|
|
706
|
+
client.readContract({
|
|
707
|
+
abi: Abis.earnEngine,
|
|
708
|
+
address: options.engine,
|
|
709
|
+
functionName: 'asset',
|
|
710
|
+
}),
|
|
711
|
+
client
|
|
712
|
+
.readContract({
|
|
713
|
+
abi: engineBindingsAbi,
|
|
714
|
+
address: options.engine,
|
|
715
|
+
functionName: 'vault',
|
|
716
|
+
})
|
|
717
|
+
.catch((error) => {
|
|
718
|
+
// Venue is concrete-engine metadata, not part of IEarnEngine.
|
|
719
|
+
if (isMissingOptionalFunctionError(error)) return null
|
|
720
|
+
throw error
|
|
721
|
+
}),
|
|
722
|
+
])
|
|
723
|
+
return { asset, venue }
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
declare namespace readEngineBindings {
|
|
727
|
+
type Options = {
|
|
728
|
+
engine: Address
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
async function readRouterCapabilities(
|
|
733
|
+
client: Client,
|
|
734
|
+
options: readRouterCapabilities.Options,
|
|
735
|
+
): Promise<RouterCapabilities> {
|
|
736
|
+
const routers = new Map<string, Address>()
|
|
737
|
+
for (const zone of options.zones) {
|
|
738
|
+
if (zone.sourceId !== options.chainId) continue
|
|
739
|
+
const router = zone.contracts?.['earnRouter']
|
|
740
|
+
if (router && 'address' in router) routers.set(router.address.toLowerCase(), router.address)
|
|
741
|
+
}
|
|
742
|
+
if (routers.size === 0) return { deposit: false, redeem: false }
|
|
743
|
+
if (routers.size > 1)
|
|
744
|
+
throw new InvalidRegistryError('Multiple Earn routers are configured for this chain.')
|
|
745
|
+
const router = routers.values().next().value!
|
|
746
|
+
const [deposit, redeem] = await Promise.all([
|
|
747
|
+
client.readContract({
|
|
748
|
+
abi: Abis.earnRouter,
|
|
749
|
+
address: router,
|
|
750
|
+
args: [0],
|
|
751
|
+
functionName: 'supportsFlow',
|
|
752
|
+
}),
|
|
753
|
+
client.readContract({
|
|
754
|
+
abi: Abis.earnRouter,
|
|
755
|
+
address: router,
|
|
756
|
+
args: [1],
|
|
757
|
+
functionName: 'supportsFlow',
|
|
758
|
+
}),
|
|
759
|
+
])
|
|
760
|
+
return { deposit, redeem }
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
declare namespace readRouterCapabilities {
|
|
764
|
+
type Options = {
|
|
765
|
+
chainId: number
|
|
766
|
+
zones: readonly Chain[]
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
async function readTransferPolicyId(client: Client, address: Address): Promise<bigint> {
|
|
771
|
+
const flights = flightsFor(transferPolicyIdFlights, client)
|
|
772
|
+
const existing = flights.get(address)
|
|
773
|
+
if (existing) return existing
|
|
774
|
+
const pending = client.readContract({
|
|
775
|
+
abi: Abis.tip20,
|
|
776
|
+
address,
|
|
777
|
+
functionName: 'transferPolicyId',
|
|
778
|
+
})
|
|
779
|
+
flights.set(address, pending)
|
|
780
|
+
try {
|
|
781
|
+
return await pending
|
|
782
|
+
} finally {
|
|
783
|
+
flights.delete(address)
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
async function readTokenMetadata(client: Client, address: Address): Promise<TokenMetadata> {
|
|
788
|
+
const flights = flightsFor(tokenMetadataFlights, client)
|
|
789
|
+
const existing = flights.get(address)
|
|
790
|
+
if (existing) return existing
|
|
791
|
+
const pending = Promise.all([
|
|
792
|
+
client.readContract({ abi: Abis.tip20, address, functionName: 'currency' }),
|
|
793
|
+
client.readContract({ abi: Abis.tip20, address, functionName: 'decimals' }),
|
|
794
|
+
client.readContract({ abi: Abis.tip20, address, functionName: 'name' }),
|
|
795
|
+
client.readContract({ abi: Abis.tip20, address, functionName: 'symbol' }),
|
|
796
|
+
]).then(([currency, decimals, name, symbol]) => ({ currency, decimals, name, symbol }))
|
|
797
|
+
flights.set(address, pending)
|
|
798
|
+
try {
|
|
799
|
+
return await pending
|
|
800
|
+
} finally {
|
|
801
|
+
flights.delete(address)
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
function isMissingContractError(error: unknown): boolean {
|
|
806
|
+
return (
|
|
807
|
+
error instanceof ContractFunctionExecutionError &&
|
|
808
|
+
error.cause instanceof ContractFunctionZeroDataError
|
|
809
|
+
)
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
function isMissingOptionalFunctionError(error: unknown): boolean {
|
|
813
|
+
if (!(error instanceof ContractFunctionExecutionError)) return false
|
|
814
|
+
if (error.cause instanceof ContractFunctionZeroDataError) return true
|
|
815
|
+
return (
|
|
816
|
+
error.cause instanceof ContractFunctionRevertedError &&
|
|
817
|
+
(!error.cause.raw || error.cause.raw === '0x') &&
|
|
818
|
+
(!error.cause.reason || error.cause.reason === 'execution reverted')
|
|
819
|
+
)
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
function flightsFor<key, value>(
|
|
823
|
+
registry: WeakMap<Client, Map<key, Promise<value>>>,
|
|
824
|
+
client: Client,
|
|
825
|
+
): Map<key, Promise<value>> {
|
|
826
|
+
const existing = registry.get(client)
|
|
827
|
+
if (existing) return existing
|
|
828
|
+
const flights = new Map<key, Promise<value>>()
|
|
829
|
+
registry.set(client, flights)
|
|
830
|
+
return flights
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
function compareAddress(
|
|
834
|
+
issues: VerificationIssue[],
|
|
835
|
+
code: VerificationIssueCode,
|
|
836
|
+
message: string,
|
|
837
|
+
expected: Address,
|
|
838
|
+
actual: Address,
|
|
839
|
+
): void {
|
|
840
|
+
if (!isAddressEqual(actual, expected)) issues.push({ actual, code, expected, message })
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
function unavailable(): VerificationUnavailable {
|
|
844
|
+
return {
|
|
845
|
+
issues: [
|
|
846
|
+
{
|
|
847
|
+
code: 'read-failed',
|
|
848
|
+
message: 'Onchain verification reads are temporarily unavailable.',
|
|
849
|
+
},
|
|
850
|
+
],
|
|
851
|
+
status: 'unavailable',
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
/** Thrown when an Earn resolver value fails schema validation. */
|
|
856
|
+
export class InvalidRegistryError extends Error {
|
|
857
|
+
override name = 'EarnVaults.InvalidRegistryError'
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
/** Thrown when a requested Earn vault does not exist. */
|
|
861
|
+
export class NotFoundError extends Error {
|
|
862
|
+
override name = 'EarnVaults.NotFoundError'
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
/** Thrown when onchain verification rejects an Earn vault. */
|
|
866
|
+
export class VerificationError extends Error {
|
|
867
|
+
/** Failed verification result. */
|
|
868
|
+
result: VerificationFailure
|
|
869
|
+
|
|
870
|
+
constructor(result: VerificationFailure) {
|
|
871
|
+
super(`Earn vault verification failed: ${result.issues.map((issue) => issue.code).join(', ')}.`)
|
|
872
|
+
this.result = result
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
override name = 'EarnVaults.VerificationError'
|
|
876
|
+
}
|