tapimo 0.7.0 → 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 +151 -95
- 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 +14377 -10165
- 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 +1231 -324
- 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.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 +5 -5
- 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 +265 -265
- 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 +49 -9
- package/dist/apps/data/routes/tokenlist.js.map +1 -1
- package/dist/apps/data/routes/tokens.d.ts +116 -88
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +198 -91
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +55 -55
- 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 +78 -29
- 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 +10 -10
- package/dist/apps/data/routes/valuation.js +2 -2
- package/dist/apps/data/routes/valuation.js.map +1 -1
- package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/verified-tokens.js +34 -9
- package/dist/apps/data/routes/verified-tokens.js.map +1 -1
- package/dist/apps/data/routes/webhooks.d.ts +5 -3
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +175 -65
- 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 +35 -35
- 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 +78 -78
- 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/usage.d.ts +80 -80
- 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 +184 -24
- 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 +16 -7
- 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 +35 -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 +4 -2
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +14 -4
- 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 +9 -2
- package/dist/internal/EdgeCache.d.ts.map +1 -1
- package/dist/internal/EdgeCache.js +36 -9
- 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 +8 -3
- package/dist/internal/Schema.d.ts.map +1 -1
- package/dist/internal/Schema.js +24 -13
- 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 +189 -95
- 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 +38 -9
- 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.test.ts +15 -0
- package/src/apps/data/routes/tokenlist.ts +88 -22
- package/src/apps/data/routes/tokens.ts +262 -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/verified-tokens.test.ts +51 -0
- package/src/apps/data/routes/verified-tokens.ts +52 -15
- package/src/apps/data/routes/webhooks.test.ts +432 -33
- package/src/apps/data/routes/webhooks.ts +189 -79
- 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 +495 -64
- package/src/apps/relay/App.ts +234 -24
- package/src/apps/relay/Sponsorships.test.ts +51 -0
- package/src/apps/relay/Sponsorships.ts +19 -7
- 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.test.ts +88 -0
- package/src/db/tables/organizations.ts +42 -1
- package/src/db/tables/projects.ts +16 -0
- package/src/db/tables/requestUsage.ts +23 -0
- package/src/db/tables/sponsoredTransactions.test.ts +52 -2
- package/src/db/tables/sponsoredTransactions.ts +18 -6
- 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 +37 -5
- package/src/internal/EdgeCache.ts +39 -7
- 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.test.ts +13 -0
- package/src/internal/Schema.ts +41 -24
- 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,338 @@
|
|
|
1
|
+
import { Hono } from 'hono'
|
|
2
|
+
import { AbiEvent, AbiFunction, type Hex } from 'ox'
|
|
3
|
+
import * as z from 'zod/mini'
|
|
4
|
+
|
|
5
|
+
import type * as App from '../../../App.js'
|
|
6
|
+
import * as Auth from '../../../internal/Auth.js'
|
|
7
|
+
import * as Cache from '../../../internal/Cache.js'
|
|
8
|
+
import * as OpenApi from '../../../internal/OpenApi.js'
|
|
9
|
+
import * as Response from '../../../internal/Response.js'
|
|
10
|
+
import * as Schema from '../../../internal/Schema.js'
|
|
11
|
+
import * as Timing from '../../../internal/Timing.js'
|
|
12
|
+
import * as Value from '../../../internal/Value.js'
|
|
13
|
+
|
|
14
|
+
const exampleSenderTag = '0x61fc42a734cb44acef497ea0bed612c691195623244136e0739e1929569e2487'
|
|
15
|
+
const exampleTransactionHash = '0x515801d7f9a5ac705e793e85904c9c69b3f1694b465cc8fb6ba3f0298dc82665'
|
|
16
|
+
const exampleWithdrawalId = `${exampleTransactionHash}-4`
|
|
17
|
+
|
|
18
|
+
const withdrawalProcessedEvent = AbiEvent.from(
|
|
19
|
+
'event WithdrawalProcessed(address indexed to, bytes32 indexed senderTag, address token, uint128 amount, bool callbackSuccess)',
|
|
20
|
+
)
|
|
21
|
+
const withdrawalProcessedSelector = AbiEvent.getSelector(withdrawalProcessedEvent)
|
|
22
|
+
const lastSyncedTempoBlockNumberFunction = AbiFunction.from(
|
|
23
|
+
'function lastSyncedTempoBlockNumber() view returns (uint64)',
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
/** Zod schemas owned by Zone handlers. */
|
|
27
|
+
export namespace schema {
|
|
28
|
+
/** Schemas for the listZoneWithdrawals operation. */
|
|
29
|
+
export namespace listZoneWithdrawals {
|
|
30
|
+
/** Path parameters for a Zone withdrawal list request. */
|
|
31
|
+
export const Params = z
|
|
32
|
+
.object({
|
|
33
|
+
senderTag: Schema.hash(exampleSenderTag).check(
|
|
34
|
+
z.describe(
|
|
35
|
+
'The 32-byte correlation tag shared by withdrawals from one sender in one Zone transaction.',
|
|
36
|
+
),
|
|
37
|
+
),
|
|
38
|
+
})
|
|
39
|
+
.check(z.describe('Path parameters used to correlate Zone withdrawals.'))
|
|
40
|
+
|
|
41
|
+
/** Query parameters for a Zone withdrawal list request. */
|
|
42
|
+
export const Query = z
|
|
43
|
+
.strictObject({
|
|
44
|
+
chainId: Schema.ChainId.check(
|
|
45
|
+
z.describe('The chain id of the Zone where the withdrawal originated.'),
|
|
46
|
+
z.meta({ examples: [421_700_001] }),
|
|
47
|
+
),
|
|
48
|
+
})
|
|
49
|
+
.check(z.describe('Query parameters used to select the originating Zone.'))
|
|
50
|
+
|
|
51
|
+
/** Indexed Zone withdrawal after parent-chain processing. */
|
|
52
|
+
export const Withdrawal = z
|
|
53
|
+
.object({
|
|
54
|
+
blockNumber: z
|
|
55
|
+
.number()
|
|
56
|
+
.check(
|
|
57
|
+
z.int(),
|
|
58
|
+
z.nonnegative(),
|
|
59
|
+
z.describe('Parent-chain block containing the withdrawal processing event.'),
|
|
60
|
+
z.meta({ examples: [123] }),
|
|
61
|
+
),
|
|
62
|
+
id: z
|
|
63
|
+
.string()
|
|
64
|
+
.check(
|
|
65
|
+
z.describe(
|
|
66
|
+
'Stable withdrawal id built from the parent transaction hash and log index (`${transactionHash}-${logIndex}`).',
|
|
67
|
+
),
|
|
68
|
+
z.meta({ examples: [exampleWithdrawalId] }),
|
|
69
|
+
),
|
|
70
|
+
logIndex: z
|
|
71
|
+
.number()
|
|
72
|
+
.check(
|
|
73
|
+
z.int(),
|
|
74
|
+
z.nonnegative(),
|
|
75
|
+
z.describe('Event position within the parent-chain block.'),
|
|
76
|
+
z.meta({ examples: [4] }),
|
|
77
|
+
),
|
|
78
|
+
status: z
|
|
79
|
+
.enum(['failed', 'completed'])
|
|
80
|
+
.check(
|
|
81
|
+
z.describe('Whether parent-chain delivery or processing failed or completed.'),
|
|
82
|
+
z.meta({ examples: ['failed', 'completed'] }),
|
|
83
|
+
),
|
|
84
|
+
transactionHash: Schema.hash(exampleTransactionHash).check(
|
|
85
|
+
z.describe('Parent-chain transaction that processed the withdrawal.'),
|
|
86
|
+
),
|
|
87
|
+
zoneStatus: z
|
|
88
|
+
.enum(['pending', 'completed'])
|
|
89
|
+
.check(
|
|
90
|
+
z.describe(
|
|
91
|
+
'Completed once the Zone has proven it imported the parent-chain `blockNumber` containing this withdrawal.',
|
|
92
|
+
),
|
|
93
|
+
z.meta({ examples: ['pending', 'completed'] }),
|
|
94
|
+
),
|
|
95
|
+
})
|
|
96
|
+
.check(z.describe('A Zone withdrawal processed on its parent chain.'))
|
|
97
|
+
|
|
98
|
+
/** Non-paginated list of indexed Zone withdrawal outcomes. */
|
|
99
|
+
export const Response = Schema.describe(
|
|
100
|
+
z.object({
|
|
101
|
+
data: z
|
|
102
|
+
.array(Withdrawal)
|
|
103
|
+
.check(
|
|
104
|
+
z.describe(
|
|
105
|
+
'Indexed parent-chain withdrawal outcomes sharing the sender tag. The list may grow while matching withdrawals are processed.',
|
|
106
|
+
),
|
|
107
|
+
),
|
|
108
|
+
}),
|
|
109
|
+
'A non-paginated list of parent-chain withdrawal outcomes correlated by sender tag.',
|
|
110
|
+
)
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** Creates Zone handlers. */
|
|
115
|
+
export function zones() {
|
|
116
|
+
return new Hono<App.Environment>().get(
|
|
117
|
+
'/v1/zones/withdrawals/:senderTag',
|
|
118
|
+
Auth.policy({ apiKey: { scopes: ['data:read'] } }),
|
|
119
|
+
OpenApi.validate('param', schema.listZoneWithdrawals.Params, {
|
|
120
|
+
code: 'sender_tag_invalid',
|
|
121
|
+
message: 'Invalid sender tag',
|
|
122
|
+
}),
|
|
123
|
+
OpenApi.validate('query', schema.listZoneWithdrawals.Query, {
|
|
124
|
+
code: 'query_invalid',
|
|
125
|
+
message: 'Invalid query parameters',
|
|
126
|
+
}),
|
|
127
|
+
OpenApi.describeRoute({
|
|
128
|
+
description:
|
|
129
|
+
'Lists L1 withdrawal outcomes by Zone sender tag. L1 success requires every `status` completed; Zone success also requires every `zoneStatus` completed. Empty lists remain pending.',
|
|
130
|
+
operationId: 'listZoneWithdrawals',
|
|
131
|
+
responses: OpenApi.responses({
|
|
132
|
+
errors: {
|
|
133
|
+
400: {
|
|
134
|
+
codes: [
|
|
135
|
+
'api_key_malformed',
|
|
136
|
+
'chain_id_invalid',
|
|
137
|
+
'chain_id_unsupported',
|
|
138
|
+
'query_invalid',
|
|
139
|
+
'sender_tag_invalid',
|
|
140
|
+
],
|
|
141
|
+
},
|
|
142
|
+
403: 'The API key does not grant read access to the originating Zone.',
|
|
143
|
+
502: 'The parent-chain indexer or RPC returned unavailable or malformed data.',
|
|
144
|
+
},
|
|
145
|
+
success: {
|
|
146
|
+
description: 'Indexed parent-chain withdrawal outcomes correlated by sender tag.',
|
|
147
|
+
examples: {
|
|
148
|
+
empty: {
|
|
149
|
+
summary: 'Not indexed',
|
|
150
|
+
value: { data: [] },
|
|
151
|
+
},
|
|
152
|
+
processed: {
|
|
153
|
+
summary: 'Processed',
|
|
154
|
+
value: {
|
|
155
|
+
data: [
|
|
156
|
+
{
|
|
157
|
+
blockNumber: 123,
|
|
158
|
+
id: exampleWithdrawalId,
|
|
159
|
+
logIndex: 4,
|
|
160
|
+
status: 'completed',
|
|
161
|
+
transactionHash: exampleTransactionHash,
|
|
162
|
+
zoneStatus: 'pending',
|
|
163
|
+
},
|
|
164
|
+
],
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
schema: schema.listZoneWithdrawals.Response,
|
|
169
|
+
},
|
|
170
|
+
}),
|
|
171
|
+
summary: 'List Zone withdrawals',
|
|
172
|
+
tags: ['Zones'],
|
|
173
|
+
}),
|
|
174
|
+
Cache.response<App.Environment>({
|
|
175
|
+
cacheControl: Cache.policies.noStore,
|
|
176
|
+
name: 'tempo-api:zone-withdrawals:v1',
|
|
177
|
+
key: (c) => {
|
|
178
|
+
const principal = Auth.getPrincipal(c)
|
|
179
|
+
return `${principal?.type ?? 'unknown'}:${principal?.id ?? 'unknown'}:${Cache.urlKey(c, schema.listZoneWithdrawals.Query)}`
|
|
180
|
+
},
|
|
181
|
+
}),
|
|
182
|
+
async (c) => {
|
|
183
|
+
if (Auth.narrowAccess) return Auth.accessError(c)
|
|
184
|
+
if (OpenApi.narrowValidation)
|
|
185
|
+
return OpenApi.validationError(c, {
|
|
186
|
+
code: 'sender_tag_invalid',
|
|
187
|
+
message: 'Invalid sender tag',
|
|
188
|
+
})
|
|
189
|
+
if (OpenApi.narrowValidation)
|
|
190
|
+
return OpenApi.validationError(c, {
|
|
191
|
+
code: 'query_invalid',
|
|
192
|
+
message: 'Invalid query parameters',
|
|
193
|
+
})
|
|
194
|
+
if (OpenApi.narrowValidation)
|
|
195
|
+
return OpenApi.validationError(c, {
|
|
196
|
+
code: 'chain_id_invalid',
|
|
197
|
+
message: 'Invalid chain id',
|
|
198
|
+
})
|
|
199
|
+
|
|
200
|
+
const { senderTag } = c.req.valid('param')
|
|
201
|
+
const { chainId } = c.req.valid('query')
|
|
202
|
+
const zone = c.get('zones').get(chainId)
|
|
203
|
+
if (!zone) return Response.unsupportedChainId(c, chainId, c.get('zones').keys())
|
|
204
|
+
|
|
205
|
+
try {
|
|
206
|
+
const parentChainId = Schema.ChainId.parse(zone.sourceId)
|
|
207
|
+
const portalContract = zone.contracts?.['portal']
|
|
208
|
+
const portal = Schema.Address.parse(
|
|
209
|
+
portalContract && 'address' in portalContract
|
|
210
|
+
? portalContract.address
|
|
211
|
+
: portalContract?.[parentChainId]?.address,
|
|
212
|
+
)
|
|
213
|
+
const tidx = c.get('getTidx')(parentChainId)
|
|
214
|
+
const result = await Timing.time(c, 'zone_withdrawal', () =>
|
|
215
|
+
tidx.fetch({
|
|
216
|
+
chainId: parentChainId,
|
|
217
|
+
engine: 'clickhouse',
|
|
218
|
+
// Dynamic raw-log query, constrained to schema-validated hex literals.
|
|
219
|
+
// FINAL collapses replayed physical rows before returning distinct events.
|
|
220
|
+
query: `
|
|
221
|
+
SELECT block_num, log_idx, tx_hash, address, selector, topic1, topic2, data
|
|
222
|
+
FROM logs FINAL
|
|
223
|
+
WHERE address = '${portal}'
|
|
224
|
+
AND selector = '${withdrawalProcessedSelector}'
|
|
225
|
+
AND topic2 = '${senderTag}'
|
|
226
|
+
ORDER BY block_num ASC, log_idx ASC
|
|
227
|
+
` as string,
|
|
228
|
+
}),
|
|
229
|
+
)
|
|
230
|
+
if (result.rows.length === 0)
|
|
231
|
+
return c.json(Response.validated(schema.listZoneWithdrawals.Response, { data: [] }), 200)
|
|
232
|
+
|
|
233
|
+
// TODO: Use `zone_getZoneInfo` once Zone RPC versions stabilize.
|
|
234
|
+
const tempoBlockNumber = await Timing.time(c, 'zone_status', () =>
|
|
235
|
+
c
|
|
236
|
+
.get('getClient')(parentChainId)
|
|
237
|
+
.readContract({
|
|
238
|
+
abi: [lastSyncedTempoBlockNumberFunction],
|
|
239
|
+
address: portal,
|
|
240
|
+
functionName: 'lastSyncedTempoBlockNumber',
|
|
241
|
+
}),
|
|
242
|
+
)
|
|
243
|
+
const data = resolveWithdrawalProcessed({
|
|
244
|
+
portal,
|
|
245
|
+
rows: result.rows,
|
|
246
|
+
senderTag,
|
|
247
|
+
tempoBlockNumber,
|
|
248
|
+
})
|
|
249
|
+
return c.json(Response.validated(schema.listZoneWithdrawals.Response, data), 200)
|
|
250
|
+
} catch (cause) {
|
|
251
|
+
return Response.upstream(c, cause)
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
)
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Resolves indexed `WithdrawalProcessed` rows into public withdrawal outcomes
|
|
259
|
+
* and rejects malformed upstream data.
|
|
260
|
+
*/
|
|
261
|
+
export function resolveWithdrawalProcessed(
|
|
262
|
+
options: resolveWithdrawalProcessed.Options,
|
|
263
|
+
): z.output<typeof schema.listZoneWithdrawals.Response> {
|
|
264
|
+
const { portal, rows, senderTag, tempoBlockNumber } = options
|
|
265
|
+
return {
|
|
266
|
+
data: rows.map((row) => {
|
|
267
|
+
const address = Schema.Address.safeParse(row['address'])
|
|
268
|
+
const blockNumber = Value.toNumber(row['block_num'])
|
|
269
|
+
const data = Schema.Hex.safeParse(row['data'])
|
|
270
|
+
const logIndex = Value.toNumber(row['log_idx'])
|
|
271
|
+
const selector = Schema.Hash.safeParse(row['selector'])
|
|
272
|
+
const topic1 = Schema.Hash.safeParse(row['topic1'])
|
|
273
|
+
const topic2 = Schema.Hash.safeParse(row['topic2'])
|
|
274
|
+
const transactionHash = Schema.Hash.safeParse(row['tx_hash'])
|
|
275
|
+
if (
|
|
276
|
+
!address.success ||
|
|
277
|
+
address.data !== portal ||
|
|
278
|
+
blockNumber === undefined ||
|
|
279
|
+
!Number.isSafeInteger(blockNumber) ||
|
|
280
|
+
blockNumber < 0 ||
|
|
281
|
+
!data.success ||
|
|
282
|
+
logIndex === undefined ||
|
|
283
|
+
!Number.isSafeInteger(logIndex) ||
|
|
284
|
+
logIndex < 0 ||
|
|
285
|
+
!selector.success ||
|
|
286
|
+
selector.data !== withdrawalProcessedSelector ||
|
|
287
|
+
!topic1.success ||
|
|
288
|
+
!topic2.success ||
|
|
289
|
+
topic2.data !== senderTag ||
|
|
290
|
+
!transactionHash.success
|
|
291
|
+
)
|
|
292
|
+
throw new Error('Upstream returned a malformed WithdrawalProcessed event')
|
|
293
|
+
|
|
294
|
+
const decoded = (() => {
|
|
295
|
+
try {
|
|
296
|
+
return AbiEvent.decode(withdrawalProcessedEvent, {
|
|
297
|
+
data: data.data,
|
|
298
|
+
topics: [selector.data, topic1.data, topic2.data],
|
|
299
|
+
})
|
|
300
|
+
} catch {
|
|
301
|
+
return undefined
|
|
302
|
+
}
|
|
303
|
+
})()
|
|
304
|
+
if (
|
|
305
|
+
!decoded ||
|
|
306
|
+
!Schema.Address.safeParse(decoded.to).success ||
|
|
307
|
+
decoded.senderTag.toLowerCase() !== senderTag ||
|
|
308
|
+
!Schema.Address.safeParse(decoded.token).success ||
|
|
309
|
+
typeof decoded.amount !== 'bigint' ||
|
|
310
|
+
typeof decoded.callbackSuccess !== 'boolean'
|
|
311
|
+
)
|
|
312
|
+
throw new Error('Upstream returned a malformed WithdrawalProcessed event')
|
|
313
|
+
|
|
314
|
+
return {
|
|
315
|
+
blockNumber,
|
|
316
|
+
id: `${transactionHash.data}-${logIndex}`,
|
|
317
|
+
logIndex,
|
|
318
|
+
status: decoded.callbackSuccess ? 'completed' : 'failed',
|
|
319
|
+
transactionHash: transactionHash.data,
|
|
320
|
+
zoneStatus: tempoBlockNumber >= BigInt(blockNumber) ? 'completed' : 'pending',
|
|
321
|
+
}
|
|
322
|
+
}),
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
export declare namespace resolveWithdrawalProcessed {
|
|
327
|
+
/** Inputs for resolving indexed Zone withdrawal processing rows. */
|
|
328
|
+
type Options = {
|
|
329
|
+
/** Configured ZonePortal address on the parent Tempo chain. */
|
|
330
|
+
portal: z.output<typeof Schema.Address>
|
|
331
|
+
/** Matching raw TIDX log rows ordered by parent-chain position. */
|
|
332
|
+
rows: readonly Record<string, unknown>[]
|
|
333
|
+
/** Sender tag supplied by the caller. */
|
|
334
|
+
senderTag: Hex.Hex
|
|
335
|
+
/** Latest parent-chain block the originating Zone proved it imported. */
|
|
336
|
+
tempoBlockNumber: bigint
|
|
337
|
+
}
|
|
338
|
+
}
|
|
@@ -113,7 +113,7 @@ function inlineOpenrpc<spec extends { paths: Record<string, unknown> }>(spec: sp
|
|
|
113
113
|
const paths: Record<string, unknown> = {}
|
|
114
114
|
for (const [pathname, item] of Object.entries(spec.paths)) {
|
|
115
115
|
let next = item
|
|
116
|
-
if (
|
|
116
|
+
if (item && typeof item === 'object' && !Array.isArray(item))
|
|
117
117
|
for (const [method, op] of Object.entries(item))
|
|
118
118
|
if (isRpcOperation(op)) next = { ...item, [method]: { ...op, 'x-openrpc': openrpcSpec } }
|
|
119
119
|
paths[pathname] = next
|
|
@@ -124,9 +124,11 @@ function inlineOpenrpc<spec extends { paths: Record<string, unknown> }>(spec: sp
|
|
|
124
124
|
// The JSON-RPC passthrough's operation id, set by its route definition and
|
|
125
125
|
// targeted by `App.create`'s `applyOpenrpcLink`.
|
|
126
126
|
function isRpcOperation(op: unknown): op is Record<string, unknown> {
|
|
127
|
-
return
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
127
|
+
return (
|
|
128
|
+
!!op &&
|
|
129
|
+
typeof op === 'object' &&
|
|
130
|
+
!Array.isArray(op) &&
|
|
131
|
+
'operationId' in op &&
|
|
132
|
+
op.operationId === 'rpcRequest'
|
|
133
|
+
)
|
|
132
134
|
}
|
package/src/apps/index.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
export { data,
|
|
1
|
+
export { data, FxOracle } from './data/index.js'
|
|
2
2
|
export { management } from './management/index.js'
|
|
3
3
|
export { mcp } from './mcp.js'
|
|
4
4
|
export { mpp } from './mpp/index.js'
|
|
5
5
|
export { relay } from './relay/index.js'
|
|
6
|
+
export * as Zones from './Zones.js'
|
|
@@ -576,4 +576,33 @@ describe('createRequestUsageReporter', () => {
|
|
|
576
576
|
expect((await RequestUsage.getBucket(db, { bucketStart, environment: 'production', orgId: 'org_1' }))?.reportedCount).toBe(6) // prettier-ignore
|
|
577
577
|
await db.close()
|
|
578
578
|
})
|
|
579
|
+
|
|
580
|
+
test('behavior: exposes the durable retry backlog for alerting', async () => {
|
|
581
|
+
const db = create()
|
|
582
|
+
await db.migrate()
|
|
583
|
+
await StripeCustomers.create(db, { orgId: 'org_1', stripeCustomerId: 'cus_1' })
|
|
584
|
+
await StripeCustomers.setStatus(db, 'org_1', 'active')
|
|
585
|
+
const { stripe } = stubStripe({
|
|
586
|
+
meterEvent() {
|
|
587
|
+
throw new Error('Stripe unavailable')
|
|
588
|
+
},
|
|
589
|
+
subscriptions: [{ items: ['feePayerSpend', 'apiRequests'], status: 'active' }],
|
|
590
|
+
})
|
|
591
|
+
const reporter = Billing.createRequestUsageReporter({
|
|
592
|
+
db,
|
|
593
|
+
now: () => Date.now(),
|
|
594
|
+
readCounts: async () => [{ bucketStart, count: 4, orgId: 'org_1' }],
|
|
595
|
+
stripe,
|
|
596
|
+
})
|
|
597
|
+
|
|
598
|
+
expect(await reporter.tick()).toStrictEqual({ failed: 1, reported: 0, skipped: 0 })
|
|
599
|
+
expect(await reporter.pending()).toEqual([
|
|
600
|
+
{
|
|
601
|
+
count: 1,
|
|
602
|
+
environment: 'production',
|
|
603
|
+
oldestPendingAgeSeconds: expect.any(Number),
|
|
604
|
+
},
|
|
605
|
+
])
|
|
606
|
+
await db.close()
|
|
607
|
+
})
|
|
579
608
|
})
|
|
@@ -444,6 +444,20 @@ export function createRequestUsageReporter(
|
|
|
444
444
|
...(sandboxStripe ? [{ client: sandboxStripe, environment: 'sandbox' as const }] : []),
|
|
445
445
|
]
|
|
446
446
|
return {
|
|
447
|
+
async pending() {
|
|
448
|
+
return Promise.all(
|
|
449
|
+
clients.map(async ({ environment }) => {
|
|
450
|
+
const status = await RequestUsage.getPendingStatus(Db.get(db), environment)
|
|
451
|
+
return {
|
|
452
|
+
count: status.count,
|
|
453
|
+
environment,
|
|
454
|
+
oldestPendingAgeSeconds: status.oldestAttemptedAt
|
|
455
|
+
? Math.max(0, Math.floor((now() - new Date(status.oldestAttemptedAt).getTime()) / 1_000))
|
|
456
|
+
: 0,
|
|
457
|
+
}
|
|
458
|
+
}),
|
|
459
|
+
)
|
|
460
|
+
},
|
|
447
461
|
async tick() {
|
|
448
462
|
const database = Db.get(db)
|
|
449
463
|
let failed = 0
|
|
@@ -583,9 +597,18 @@ export declare namespace createRequestUsageReporter {
|
|
|
583
597
|
|
|
584
598
|
/** A scheduled request-metering job. */
|
|
585
599
|
type Reporter = {
|
|
600
|
+
/** Reads the current retry backlog without sending meter events. */
|
|
601
|
+
pending(): Promise<readonly Pending[]>
|
|
586
602
|
/** Runs one reporting pass across production (and sandbox when configured). */
|
|
587
603
|
tick(): Promise<{ failed: number; reported: number; skipped: number }>
|
|
588
604
|
}
|
|
605
|
+
|
|
606
|
+
/** Current durable retry backlog for one billing environment. */
|
|
607
|
+
type Pending = {
|
|
608
|
+
count: number
|
|
609
|
+
environment: StripeCustomers.Record['environment']
|
|
610
|
+
oldestPendingAgeSeconds: number
|
|
611
|
+
}
|
|
589
612
|
}
|
|
590
613
|
|
|
591
614
|
/** Composite key for the in-tick blocked-bucket set. */
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Context } from 'hono'
|
|
2
|
+
|
|
3
|
+
import * as Response from '../../internal/Response.js'
|
|
4
|
+
|
|
5
|
+
/** Returns the standard error for operations that require a user session. */
|
|
6
|
+
export function sessionRequired(c: Context) {
|
|
7
|
+
return Response.error(c, {
|
|
8
|
+
code: 'forbidden',
|
|
9
|
+
message: 'Session required',
|
|
10
|
+
status: 403,
|
|
11
|
+
})
|
|
12
|
+
}
|
|
@@ -119,9 +119,11 @@ describe('keys', () => {
|
|
|
119
119
|
|
|
120
120
|
// Even the org owner cannot self-mint zone access: membership is
|
|
121
121
|
// controlled zone-side, so zone scopes are super-admin-issued.
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
122
|
+
for (const scope of ['zone:421700001:read', 'zone:421700001:write']) {
|
|
123
|
+
const denied = await app.request(base, json('POST', owner, { scopes: [scope] }))
|
|
124
|
+
expect(denied.status).toBe(403)
|
|
125
|
+
expect(await denied.json()).toMatchObject({ error: { code: 'scope_not_issuable' } })
|
|
126
|
+
}
|
|
125
127
|
})
|
|
126
128
|
|
|
127
129
|
test('restricts project management keys without delegating issuance', async () => {
|
|
@@ -12,6 +12,7 @@ import * as OpenApi from '../../../internal/OpenApi.js'
|
|
|
12
12
|
import * as Response from '../../../internal/Response.js'
|
|
13
13
|
import * as Schema from '../../../internal/Schema.js'
|
|
14
14
|
import * as Scope from '../../../Scope.js'
|
|
15
|
+
import * as ManagementError from '../Error.js'
|
|
15
16
|
|
|
16
17
|
/** Zod schemas owned by the API-keys resource. */
|
|
17
18
|
export namespace schema {
|
|
@@ -281,7 +282,7 @@ export function apiKeys(options: apiKeys.Options = {}) {
|
|
|
281
282
|
const kv = c.get('kv')
|
|
282
283
|
if (!kv) return notEnabled(c)
|
|
283
284
|
const createdBy = mintedBy(c)
|
|
284
|
-
if (!createdBy) return sessionRequired(c)
|
|
285
|
+
if (!createdBy) return ManagementError.sessionRequired(c)
|
|
285
286
|
|
|
286
287
|
const body = c.req.valid('json')
|
|
287
288
|
|
|
@@ -582,11 +583,3 @@ function notEnabled(c: Context<App.Environment>) {
|
|
|
582
583
|
status: 404,
|
|
583
584
|
})
|
|
584
585
|
}
|
|
585
|
-
|
|
586
|
-
function sessionRequired(c: Context<App.Environment>) {
|
|
587
|
-
return Response.error(c, {
|
|
588
|
-
code: 'forbidden',
|
|
589
|
-
message: 'Session required',
|
|
590
|
-
status: 403,
|
|
591
|
-
})
|
|
592
|
-
}
|
|
@@ -8,6 +8,7 @@ import * as Memberships from '../../../db/tables/memberships.js'
|
|
|
8
8
|
import * as OpenApi from '../../../internal/OpenApi.js'
|
|
9
9
|
import * as Response from '../../../internal/Response.js'
|
|
10
10
|
import * as Schema from '../../../internal/Schema.js'
|
|
11
|
+
import * as ManagementError from '../Error.js'
|
|
11
12
|
|
|
12
13
|
import type { Email, Environment } from '../App.js'
|
|
13
14
|
|
|
@@ -386,7 +387,7 @@ export function invitations() {
|
|
|
386
387
|
if (Auth.narrowAccess) return Auth.superAdminAccessError(c)
|
|
387
388
|
|
|
388
389
|
const principal = Auth.getPrincipal(c)
|
|
389
|
-
if (principal?.type !== 'session') return sessionRequired(c)
|
|
390
|
+
if (principal?.type !== 'session') return ManagementError.sessionRequired(c)
|
|
390
391
|
// Without a verified email there is nothing to match against.
|
|
391
392
|
if (!principal.email)
|
|
392
393
|
return c.json(Response.validated(schema.listMyInvitations.Response, { data: [] }), 200)
|
|
@@ -437,7 +438,7 @@ export function invitations() {
|
|
|
437
438
|
})
|
|
438
439
|
|
|
439
440
|
const principal = Auth.getPrincipal(c)
|
|
440
|
-
if (principal?.type !== 'session') return sessionRequired(c)
|
|
441
|
+
if (principal?.type !== 'session') return ManagementError.sessionRequired(c)
|
|
441
442
|
|
|
442
443
|
const { invitationId } = c.req.valid('param')
|
|
443
444
|
const db = Db.get(c.get('db'))
|
|
@@ -492,7 +493,7 @@ export function invitations() {
|
|
|
492
493
|
})
|
|
493
494
|
|
|
494
495
|
const principal = Auth.getPrincipal(c)
|
|
495
|
-
if (principal?.type !== 'session') return sessionRequired(c)
|
|
496
|
+
if (principal?.type !== 'session') return ManagementError.sessionRequired(c)
|
|
496
497
|
|
|
497
498
|
const { invitationId } = c.req.valid('param')
|
|
498
499
|
const db = Db.get(c.get('db'))
|
|
@@ -575,11 +576,3 @@ function invitationNotFound(c: Context<Environment>) {
|
|
|
575
576
|
status: 404,
|
|
576
577
|
})
|
|
577
578
|
}
|
|
578
|
-
|
|
579
|
-
function sessionRequired(c: Context<Environment>) {
|
|
580
|
-
return Response.error(c, {
|
|
581
|
-
code: 'forbidden',
|
|
582
|
-
message: 'Session required',
|
|
583
|
-
status: 403,
|
|
584
|
-
})
|
|
585
|
-
}
|
|
@@ -11,6 +11,7 @@ import * as OpenApi from '../../../internal/OpenApi.js'
|
|
|
11
11
|
import * as Organizations from '../../../db/tables/organizations.js'
|
|
12
12
|
import * as Response from '../../../internal/Response.js'
|
|
13
13
|
import * as Schema from '../../../internal/Schema.js'
|
|
14
|
+
import * as ManagementError from '../Error.js'
|
|
14
15
|
|
|
15
16
|
/** Zod schemas owned by the organizations resource. */
|
|
16
17
|
export namespace schema {
|
|
@@ -178,7 +179,7 @@ export function orgs() {
|
|
|
178
179
|
|
|
179
180
|
const principal = Auth.getPrincipal(c)
|
|
180
181
|
if (principal?.type !== 'session' && principal?.type !== 'super_admin')
|
|
181
|
-
return sessionRequired(c)
|
|
182
|
+
return ManagementError.sessionRequired(c)
|
|
182
183
|
|
|
183
184
|
const body = c.req.valid('json')
|
|
184
185
|
const db = Db.get(c.get('db'))
|
|
@@ -380,11 +381,3 @@ function organizationNotFound(c: Context<App.Environment>) {
|
|
|
380
381
|
status: 404,
|
|
381
382
|
})
|
|
382
383
|
}
|
|
383
|
-
|
|
384
|
-
function sessionRequired(c: Context<App.Environment>) {
|
|
385
|
-
return Response.error(c, {
|
|
386
|
-
code: 'forbidden',
|
|
387
|
-
message: 'Session required',
|
|
388
|
-
status: 403,
|
|
389
|
-
})
|
|
390
|
-
}
|
|
@@ -14,10 +14,14 @@ describe('scopes', () => {
|
|
|
14
14
|
expect(response.headers.get('cache-control')).toMatchInlineSnapshot(
|
|
15
15
|
`"private, max-age=300, stale-while-revalidate=3600"`,
|
|
16
16
|
)
|
|
17
|
-
expect(body.data).toEqual(
|
|
17
|
+
expect(body.data).toEqual(
|
|
18
|
+
[...Scope.catalog, Scope.zoneEntry, Scope.zoneWriteEntry].map((entry) => ({ ...entry })),
|
|
19
|
+
)
|
|
18
20
|
expect(body.data.map((entry) => entry.scope)).toMatchInlineSnapshot(`
|
|
19
21
|
[
|
|
20
22
|
"data:read",
|
|
23
|
+
"funding:read",
|
|
24
|
+
"funding:write",
|
|
21
25
|
"indexer:query",
|
|
22
26
|
"management:read",
|
|
23
27
|
"management:write",
|
|
@@ -27,6 +31,7 @@ describe('scopes', () => {
|
|
|
27
31
|
"webhooks:read",
|
|
28
32
|
"webhooks:write",
|
|
29
33
|
"zone:<chainId>:read",
|
|
34
|
+
"zone:<chainId>:write",
|
|
30
35
|
]
|
|
31
36
|
`)
|
|
32
37
|
})
|
|
@@ -42,6 +47,6 @@ describe('scopes', () => {
|
|
|
42
47
|
const body = await TestApp.json(response, Scopes.schema.getScopes.Response)
|
|
43
48
|
|
|
44
49
|
expect(response.status).toBe(200)
|
|
45
|
-
expect(body.data).toEqual([...Scope.catalog, Scope.zoneEntry, custom])
|
|
50
|
+
expect(body.data).toEqual([...Scope.catalog, Scope.zoneEntry, Scope.zoneWriteEntry, custom])
|
|
46
51
|
})
|
|
47
52
|
})
|
|
@@ -24,7 +24,7 @@ export namespace schema {
|
|
|
24
24
|
.string()
|
|
25
25
|
.check(
|
|
26
26
|
z.describe(
|
|
27
|
-
'Scope identifier used in API-key grants and route policies.
|
|
27
|
+
'Scope identifier used in API-key grants and route policies. Zone templates carry a concrete chain id and access level in grants.',
|
|
28
28
|
),
|
|
29
29
|
z.meta({ examples: ['data:read'] }),
|
|
30
30
|
),
|
|
@@ -66,7 +66,7 @@ export function scopes() {
|
|
|
66
66
|
}),
|
|
67
67
|
Cache.response<App.Environment>({
|
|
68
68
|
cacheControl: Cache.policies.stable,
|
|
69
|
-
name: 'tempo-api:scopes:
|
|
69
|
+
name: 'tempo-api:scopes:v5',
|
|
70
70
|
key: (c) => {
|
|
71
71
|
const url = new URL(c.req.url)
|
|
72
72
|
url.search = ''
|
|
@@ -2,6 +2,7 @@ import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'
|
|
|
2
2
|
|
|
3
3
|
import * as App from '../../../App.js'
|
|
4
4
|
import * as Memberships from '../../../db/tables/memberships.js'
|
|
5
|
+
import * as Cursor from '../../../internal/Cursor.js'
|
|
5
6
|
import * as core_Webhooks from '../../../internal/Webhooks.js'
|
|
6
7
|
import * as TestApp from '../../../../test/App.js'
|
|
7
8
|
import { management } from '../App.js'
|
|
@@ -47,7 +48,8 @@ async function organization(app: ReturnType<typeof createApp>, cookie: string) {
|
|
|
47
48
|
|
|
48
49
|
describe('webhooks', () => {
|
|
49
50
|
test('creates, lists, pauses, and deletes an organization webhook', async () => {
|
|
50
|
-
const
|
|
51
|
+
const db = TestApp.database()
|
|
52
|
+
const app = createApp({ db })
|
|
51
53
|
const cookie = await session(app)
|
|
52
54
|
const org = await organization(app, cookie)
|
|
53
55
|
const collection = `/v1/orgs/${org.id}/webhooks`
|
|
@@ -65,6 +67,9 @@ describe('webhooks', () => {
|
|
|
65
67
|
expect(createdResponse.status).toBe(200)
|
|
66
68
|
const created = await TestApp.json(createdResponse, Webhooks.schema.createWebhook.Response)
|
|
67
69
|
expect(created).toHaveProperty('secret', expect.stringMatching(/^whsec_/))
|
|
70
|
+
expect(Cursor.decode((await core_Webhooks.getCursor(db, created.id))!, ['int'])).toEqual([
|
|
71
|
+
expect.any(Number),
|
|
72
|
+
])
|
|
68
73
|
|
|
69
74
|
const listedResponse = await app.request(collection, { headers: { cookie } })
|
|
70
75
|
expect(listedResponse.status).toBe(200)
|