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,98 @@
|
|
|
1
|
+
import type { LocalAccount } from 'viem/accounts'
|
|
2
|
+
|
|
3
|
+
import type * as Auth from '../../../internal/Auth.js'
|
|
4
|
+
import type * as Db from '../../../db/Db.js'
|
|
5
|
+
import * as Viem from '../../../internal/Viem.js'
|
|
6
|
+
import * as Billing from '../../management/Billing.js'
|
|
7
|
+
import type * as Mpp from '../Mpp.js'
|
|
8
|
+
|
|
9
|
+
/** Resolves the chain declared by a Tempo charge challenge. */
|
|
10
|
+
export function chainId(input: Mpp.RelayInput): number | undefined {
|
|
11
|
+
const request = input.challenge.request
|
|
12
|
+
const details = record(request['methodDetails'])
|
|
13
|
+
return number(details?.['chainId']) ?? number(request['chainId'])
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** Whether a Tempo charge credential requests platform fee sponsorship. */
|
|
17
|
+
export function requiresFeePayer(input: Mpp.RelayInput) {
|
|
18
|
+
const request = input.challenge.request
|
|
19
|
+
return record(request['methodDetails'])?.['feePayer'] === true && request['feePayer'] !== false
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Refuses credentials outside the chains served by this API deployment. */
|
|
23
|
+
export function assertSupportedChain(options: assertSupportedChain.Options) {
|
|
24
|
+
const { chainId, supportedChainIds } = options
|
|
25
|
+
if (!supportedChainIds.has(chainId)) throw new UnsupportedChainError(chainId)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export declare namespace assertSupportedChain {
|
|
29
|
+
/** Chain-selection inputs. */
|
|
30
|
+
type Options = {
|
|
31
|
+
/** Resolved credential chain. */
|
|
32
|
+
chainId: number
|
|
33
|
+
/** Chains served by this API deployment. */
|
|
34
|
+
supportedChainIds: ReadonlySet<number>
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Authorizes managed fee sponsorship for one broadcast request. */
|
|
39
|
+
export async function authorizeFeePayer(
|
|
40
|
+
options: authorizeFeePayer.Options,
|
|
41
|
+
): Promise<LocalAccount | undefined> {
|
|
42
|
+
const { chainId, db, feePayer, input, principal } = options
|
|
43
|
+
if (!feePayer || !requiresFeePayer(input)) return feePayer
|
|
44
|
+
if (principal?.type !== 'api_key')
|
|
45
|
+
throw new PolicyDeniedError('Fee sponsorship requires an API key.')
|
|
46
|
+
if (!Viem.isMainnet(chainId)) return feePayer
|
|
47
|
+
if (principal.environment !== 'production')
|
|
48
|
+
throw new PolicyDeniedError('Mainnet fee sponsorship requires a production API key.')
|
|
49
|
+
|
|
50
|
+
const status = await Billing.status(db, principal.orgId)
|
|
51
|
+
if (status !== 'active')
|
|
52
|
+
throw new PolicyDeniedError(
|
|
53
|
+
status === 'past_due'
|
|
54
|
+
? 'Billing is past due.'
|
|
55
|
+
: 'Active billing is required for mainnet fee sponsorship.',
|
|
56
|
+
)
|
|
57
|
+
return feePayer
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export declare namespace authorizeFeePayer {
|
|
61
|
+
/** Dependencies used to authorize managed fee sponsorship. */
|
|
62
|
+
type Options = {
|
|
63
|
+
/** Credential chain. */
|
|
64
|
+
chainId: number
|
|
65
|
+
/** Primary database for authoritative billing enforcement. */
|
|
66
|
+
db: Db.Db
|
|
67
|
+
/** Managed fee-payer account, when configured. */
|
|
68
|
+
feePayer?: LocalAccount | undefined
|
|
69
|
+
/** MPP credential being broadcast. */
|
|
70
|
+
input: Mpp.RelayInput
|
|
71
|
+
/** Authenticated request principal. */
|
|
72
|
+
principal?: Auth.Principal | undefined
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function record(value: unknown): Record<string, unknown> | undefined {
|
|
77
|
+
return value && typeof value === 'object' && !Array.isArray(value)
|
|
78
|
+
? (value as Record<string, unknown>)
|
|
79
|
+
: undefined
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function number(value: unknown): number | undefined {
|
|
83
|
+
return typeof value === 'number' && Number.isSafeInteger(value) ? value : undefined
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Raised when an MPP credential selects a chain this deployment does not serve. */
|
|
87
|
+
export class UnsupportedChainError extends Error {
|
|
88
|
+
override name = 'Mpp.Policy.UnsupportedChainError'
|
|
89
|
+
|
|
90
|
+
constructor(chainId: number) {
|
|
91
|
+
super(`Unsupported chain id ${chainId}.`)
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Raised when a caller is not eligible for managed fee sponsorship. */
|
|
96
|
+
export class PolicyDeniedError extends Error {
|
|
97
|
+
override name = 'Mpp.Policy.PolicyDeniedError'
|
|
98
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import * as Store from '../../../internal/Store.js'
|
|
2
|
+
import * as ScreenManager from './ScreenManager.js'
|
|
3
|
+
|
|
4
|
+
describe('create', () => {
|
|
5
|
+
test('screens participants concurrently and reuses cached results', async () => {
|
|
6
|
+
const calls: string[] = []
|
|
7
|
+
let active = 0
|
|
8
|
+
let maxActive = 0
|
|
9
|
+
const manager = ScreenManager.create({
|
|
10
|
+
chainId: 4217,
|
|
11
|
+
provider: {
|
|
12
|
+
async screen({ address }) {
|
|
13
|
+
active++
|
|
14
|
+
maxActive = Math.max(maxActive, active)
|
|
15
|
+
calls.push(address)
|
|
16
|
+
await Promise.resolve()
|
|
17
|
+
active--
|
|
18
|
+
return { allowed: true }
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
store: Store.memory(),
|
|
22
|
+
})
|
|
23
|
+
const addresses = [`0x${'aa'.repeat(20)}`, `0x${'bb'.repeat(20)}`]
|
|
24
|
+
|
|
25
|
+
await manager.screen(addresses)
|
|
26
|
+
await manager.screen(addresses)
|
|
27
|
+
|
|
28
|
+
expect(calls).toEqual(addresses)
|
|
29
|
+
expect(maxActive).toBe(2)
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
test('rejects a payment when any participant fails screening', async () => {
|
|
33
|
+
const manager = ScreenManager.create({
|
|
34
|
+
chainId: 4217,
|
|
35
|
+
provider: {
|
|
36
|
+
async screen() {
|
|
37
|
+
return { allowed: false }
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
store: Store.memory(),
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
await expect(manager.screen([`0x${'aa'.repeat(20)}`])).rejects.toThrow(
|
|
44
|
+
ScreenManager.RejectedError,
|
|
45
|
+
)
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
test('uses the configured cache lifetime', async () => {
|
|
49
|
+
let calls = 0
|
|
50
|
+
const manager = ScreenManager.create({
|
|
51
|
+
chainId: 4217,
|
|
52
|
+
provider: {
|
|
53
|
+
async screen() {
|
|
54
|
+
calls++
|
|
55
|
+
return { allowed: true }
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
store: Store.memory(),
|
|
59
|
+
ttl: 0,
|
|
60
|
+
})
|
|
61
|
+
const addresses = [`0x${'aa'.repeat(20)}`]
|
|
62
|
+
|
|
63
|
+
await manager.screen(addresses)
|
|
64
|
+
await manager.screen(addresses)
|
|
65
|
+
|
|
66
|
+
expect(calls).toBe(2)
|
|
67
|
+
})
|
|
68
|
+
})
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as Store from '../../../internal/Store.js'
|
|
2
|
+
import * as Screening from './Screening.js'
|
|
3
|
+
|
|
4
|
+
/** Coordinates concurrent cached screening before credential processing. */
|
|
5
|
+
export type Manager = {
|
|
6
|
+
/** Rejects when any payment participant fails screening. */
|
|
7
|
+
screen(addresses: readonly string[]): Promise<void>
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/** Creates a cached address-screening manager. */
|
|
11
|
+
export function create(options: create.Options): Manager {
|
|
12
|
+
const { chainId, provider = Screening.allowAll, store, ttl = Screening.defaultTtl } = options
|
|
13
|
+
|
|
14
|
+
return {
|
|
15
|
+
async screen(addresses) {
|
|
16
|
+
const results = await Promise.all(
|
|
17
|
+
addresses.map((address) => Screening.screen({ address, chainId, provider, store, ttl })),
|
|
18
|
+
)
|
|
19
|
+
if (results.some((result) => !result.allowed)) throw new RejectedError()
|
|
20
|
+
},
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export declare namespace create {
|
|
25
|
+
/** Dependencies for cached address screening. */
|
|
26
|
+
type Options = {
|
|
27
|
+
/** Tempo chain that owns the screened addresses. */
|
|
28
|
+
chainId: number
|
|
29
|
+
/** Address-screening provider. */
|
|
30
|
+
provider?: Screening.Provider | undefined
|
|
31
|
+
/** Cache used for screening results. */
|
|
32
|
+
store: Store.Store
|
|
33
|
+
/** Cache duration. @default `Ttl.days(1)` */
|
|
34
|
+
ttl?: number | undefined
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Indicates that an address-screening provider rejected a participant. */
|
|
39
|
+
export class RejectedError extends Error {
|
|
40
|
+
override name = 'Mpp.ScreenManager.RejectedError'
|
|
41
|
+
}
|
|
@@ -1,10 +1,47 @@
|
|
|
1
|
-
|
|
1
|
+
import * as Store from '../../../internal/Store.js'
|
|
2
|
+
import * as Ttl from '../../../internal/Ttl.js'
|
|
3
|
+
|
|
4
|
+
/** Address-screening result. */
|
|
2
5
|
export type Result = { allowed: boolean }
|
|
3
6
|
|
|
4
|
-
/**
|
|
7
|
+
/** Address-screening provider. */
|
|
5
8
|
export type Provider = {
|
|
6
9
|
/** Screens one normalized account address on a Tempo chain. */
|
|
7
10
|
screen(options: { address: string; chainId: number }): Promise<Result>
|
|
8
11
|
}
|
|
9
12
|
|
|
10
|
-
|
|
13
|
+
/** Allows every address while the external screening provider is unconfigured. */
|
|
14
|
+
export const allowAll: Provider = {
|
|
15
|
+
async screen() {
|
|
16
|
+
return { allowed: true }
|
|
17
|
+
},
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Screens one address, caching the provider result by chain and normalized address. */
|
|
21
|
+
export async function screen(options: screen.Options): Promise<Result> {
|
|
22
|
+
const { address, chainId, provider, store, ttl = defaultTtl } = options
|
|
23
|
+
return Store.memoize(() => provider.screen({ address, chainId }), {
|
|
24
|
+
key: `mpp:screen:v1:${chainId}:${address.toLowerCase()}`,
|
|
25
|
+
store,
|
|
26
|
+
ttl,
|
|
27
|
+
})
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export declare namespace screen {
|
|
31
|
+
/** Dependencies used to screen an address. */
|
|
32
|
+
type Options = {
|
|
33
|
+
/** Normalized account address. */
|
|
34
|
+
address: string
|
|
35
|
+
/** Tempo chain identifier. */
|
|
36
|
+
chainId: number
|
|
37
|
+
/** Address-screening provider. */
|
|
38
|
+
provider: Provider
|
|
39
|
+
/** Cache used for provider results. */
|
|
40
|
+
store: Store.Store
|
|
41
|
+
/** Cache duration. @default `Ttl.days(1)` */
|
|
42
|
+
ttl?: number | undefined
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Default address-screening cache lifetime (24 hours). */
|
|
47
|
+
export const defaultTtl = Ttl.days(1)
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { Hash } from 'ox'
|
|
2
|
+
import { TxEnvelopeTempo } from 'ox/tempo'
|
|
3
|
+
import type { LocalAccount } from 'viem/accounts'
|
|
4
|
+
import { TokenId, Transaction } from 'viem/tempo'
|
|
5
|
+
|
|
6
|
+
import type * as Auth from '../../../internal/Auth.js'
|
|
7
|
+
import * as BillingSettings from '../../../db/tables/billingSettings.js'
|
|
8
|
+
import type * as Db from '../../../db/Db.js'
|
|
9
|
+
import * as SponsoredTransactions from '../../../db/tables/sponsoredTransactions.js'
|
|
10
|
+
import * as Fees from '../../../internal/Fees.js'
|
|
11
|
+
import * as VerifiedTokens from '../../../internal/VerifiedTokens.js'
|
|
12
|
+
import * as Viem from '../../../internal/Viem.js'
|
|
13
|
+
import * as Billing from '../../management/Billing.js'
|
|
14
|
+
import * as Policy from './Policy.js'
|
|
15
|
+
|
|
16
|
+
/** Wraps a managed fee payer to record its signed transaction before broadcast. */
|
|
17
|
+
export function decorate(options: decorate.Options): LocalAccount {
|
|
18
|
+
const { account, onSigned } = options
|
|
19
|
+
const signTransaction = account.signTransaction.bind(account)
|
|
20
|
+
|
|
21
|
+
return new Proxy(account, {
|
|
22
|
+
get(target, property, receiver) {
|
|
23
|
+
if (property !== 'signTransaction') return Reflect.get(target, property, receiver)
|
|
24
|
+
return async (...parameters: Parameters<LocalAccount['signTransaction']>) => {
|
|
25
|
+
const serializedTransaction = await signTransaction(...parameters)
|
|
26
|
+
await onSigned({ serializedTransaction })
|
|
27
|
+
return serializedTransaction
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
}) as LocalAccount
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export declare namespace decorate {
|
|
34
|
+
/** Dependencies used to record one MPP-sponsored transaction. */
|
|
35
|
+
type Options = {
|
|
36
|
+
/** Account that MPPX uses to add the fee-payer signature. */
|
|
37
|
+
account: LocalAccount
|
|
38
|
+
/** Records the signed transaction before it can reach the network. */
|
|
39
|
+
onSigned: (options: { serializedTransaction: `0x${string}` }) => Promise<void>
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
type SponsoredTransaction = {
|
|
44
|
+
chainId?: unknown
|
|
45
|
+
feeToken?: unknown
|
|
46
|
+
from?: `0x${string}` | undefined
|
|
47
|
+
gas?: unknown
|
|
48
|
+
maxFeePerGas?: unknown
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Records a sponsorship and atomically enforces its billing limits. */
|
|
52
|
+
export async function record(options: record.Options): Promise<void> {
|
|
53
|
+
const { db, dbCached, principal, serializedTransaction, txFeeLimit } = options
|
|
54
|
+
const transaction = Transaction.deserialize(serializedTransaction) as SponsoredTransaction
|
|
55
|
+
if (!transaction.from)
|
|
56
|
+
throw new Policy.PolicyDeniedError('Fee-sponsored transaction must declare a sender.')
|
|
57
|
+
if (typeof transaction.chainId !== 'number')
|
|
58
|
+
throw new Policy.PolicyDeniedError('Fee-sponsored transaction must declare a chain id.')
|
|
59
|
+
const chainId = transaction.chainId
|
|
60
|
+
const feeMax = Fees.maxOf(transaction)
|
|
61
|
+
if (feeMax === undefined)
|
|
62
|
+
throw new Policy.PolicyDeniedError('Fee-sponsored transaction must declare a fee limit.')
|
|
63
|
+
|
|
64
|
+
const feeToken = (() => {
|
|
65
|
+
try {
|
|
66
|
+
return transaction.feeToken === undefined
|
|
67
|
+
? undefined
|
|
68
|
+
: TokenId.toAddress(transaction.feeToken as never)
|
|
69
|
+
} catch {
|
|
70
|
+
throw new Policy.PolicyDeniedError('Fee-sponsored transaction uses an invalid fee token.')
|
|
71
|
+
}
|
|
72
|
+
})()
|
|
73
|
+
const mainnet = Viem.isMainnet(chainId)
|
|
74
|
+
const settings = mainnet ? await BillingSettings.get(db, principal.orgId) : undefined
|
|
75
|
+
|
|
76
|
+
let currency: string | undefined
|
|
77
|
+
if (mainnet) {
|
|
78
|
+
const verified = feeToken
|
|
79
|
+
? (await VerifiedTokens.read(dbCached, chainId))?.byAddress.get(feeToken.toLowerCase())
|
|
80
|
+
: undefined
|
|
81
|
+
if (
|
|
82
|
+
!verified ||
|
|
83
|
+
verified.currency.toLowerCase() !== 'usd' ||
|
|
84
|
+
verified.decimals !== Fees.tokenDecimals
|
|
85
|
+
)
|
|
86
|
+
throw new Policy.PolicyDeniedError('Fee-sponsored transaction uses an unsupported fee token.')
|
|
87
|
+
currency = verified.currency.toLowerCase()
|
|
88
|
+
|
|
89
|
+
const cap = (() => {
|
|
90
|
+
if (settings?.txFeeLimit == null) return txFeeLimit
|
|
91
|
+
const org = Billing.toBaseUnits(settings.txFeeLimit)
|
|
92
|
+
return org < txFeeLimit ? org : txFeeLimit
|
|
93
|
+
})()
|
|
94
|
+
if (feeMax > cap) throw new Policy.PolicyDeniedError('Transaction fee limit exceeded.')
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const envelope = TxEnvelopeTempo.deserialize(serializedTransaction as TxEnvelopeTempo.Serialized)
|
|
98
|
+
const signPayload = TxEnvelopeTempo.getFeePayerSignPayload(envelope, { sender: transaction.from })
|
|
99
|
+
const input = {
|
|
100
|
+
apiKeyId: principal.id,
|
|
101
|
+
billable: mainnet && principal.environment === 'production',
|
|
102
|
+
chainId,
|
|
103
|
+
...(currency ? { currency } : {}),
|
|
104
|
+
environment: principal.environment,
|
|
105
|
+
feeMax: feeMax.toString(),
|
|
106
|
+
...(feeToken ? { feeToken } : {}),
|
|
107
|
+
orgId: principal.orgId,
|
|
108
|
+
...(principal.projectId === undefined ? {} : { projectId: principal.projectId }),
|
|
109
|
+
signPayload,
|
|
110
|
+
transaction: serializedTransaction,
|
|
111
|
+
transactionHash: Hash.keccak256(serializedTransaction),
|
|
112
|
+
}
|
|
113
|
+
if (settings?.spendLimit == null) {
|
|
114
|
+
await SponsoredTransactions.upsert(db, input)
|
|
115
|
+
return
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
await SponsoredTransactions.reserve(db, input, {
|
|
119
|
+
chainIds: [Viem.chainId.mainnet],
|
|
120
|
+
max: Billing.toBaseUnits(settings.spendLimit),
|
|
121
|
+
since: Billing.periodStart(settings.period),
|
|
122
|
+
})
|
|
123
|
+
} catch (cause) {
|
|
124
|
+
if (cause instanceof SponsoredTransactions.PeriodSpendLimitError)
|
|
125
|
+
throw new Policy.PolicyDeniedError('Spend limit exceeded.')
|
|
126
|
+
throw cause
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export declare namespace record {
|
|
131
|
+
/** Dependencies used to persist one MPP sponsorship. */
|
|
132
|
+
type Options = {
|
|
133
|
+
/** Primary database for billing enforcement and sponsorship state. */
|
|
134
|
+
db: Db.Db
|
|
135
|
+
/** Cached database used for verified-token reads. */
|
|
136
|
+
dbCached: Db.Db
|
|
137
|
+
/** API key that requested sponsorship. */
|
|
138
|
+
principal: Extract<Auth.Principal, { type: 'api_key' }>
|
|
139
|
+
/** Final fee-payer-signed transaction, before broadcast. */
|
|
140
|
+
serializedTransaction: `0x${string}`
|
|
141
|
+
/** Platform per-transaction cap in fee-token base units. */
|
|
142
|
+
txFeeLimit: bigint
|
|
143
|
+
}
|
|
144
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as Mppx from 'mppx'
|
|
2
|
+
|
|
3
|
+
import * as Store from '../../../internal/Store.js'
|
|
4
|
+
|
|
5
|
+
/** Returns the normalized Tempo sender and recipients in a validated credential. */
|
|
6
|
+
export function addresses(result: Awaited<ReturnType<typeof Mppx.Method.validateCredential>>) {
|
|
7
|
+
const details = result.details as {
|
|
8
|
+
sender?: string
|
|
9
|
+
transfers?: readonly { recipient: string }[]
|
|
10
|
+
}
|
|
11
|
+
return [details.sender, ...(details.transfers?.map(({ recipient }) => recipient) ?? [])]
|
|
12
|
+
.filter((address): address is string => address !== undefined)
|
|
13
|
+
.map((address) => address.toLowerCase())
|
|
14
|
+
.filter((address, index, values) => values.indexOf(address) === index)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Adapts Tempo API durable state to MPPX's atomic Cloudflare store contract. */
|
|
18
|
+
export function mppxStore(state: Store.State): Mppx.Store.AtomicStore {
|
|
19
|
+
return Mppx.Store.cloudflare({
|
|
20
|
+
delete: (key) => state.delete(key),
|
|
21
|
+
get: (key) => state.get(key),
|
|
22
|
+
put: (key, value) => state.put(key, value),
|
|
23
|
+
update: (key, change) =>
|
|
24
|
+
Store.change(state, key, (current) => {
|
|
25
|
+
const next = change(current)
|
|
26
|
+
// MPPX's Cloudflare adapter represents a missing value with JSON null.
|
|
27
|
+
return next.op === 'delete' ? { ...next, op: 'set', value: 'null' as const } : next
|
|
28
|
+
}),
|
|
29
|
+
})
|
|
30
|
+
}
|