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
package/src/apps/mpp/Mpp.ts
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import type { Context, TypedResponse } from 'hono'
|
|
2
1
|
import * as z from 'zod/mini'
|
|
3
2
|
|
|
4
|
-
import type * as App from '../../App.js'
|
|
5
|
-
import * as Response from '../../internal/Response.js'
|
|
6
3
|
import * as Schema from '../../internal/Schema.js'
|
|
7
4
|
|
|
8
5
|
/** Stable MPP relay failure codes. */
|
|
@@ -92,12 +89,6 @@ export type BroadcastResponse =
|
|
|
92
89
|
| { receipt: Receipt; success: true }
|
|
93
90
|
| { error: RelayError; success: false }
|
|
94
91
|
|
|
95
|
-
/** Retryable response returned while relay settlement is disabled. */
|
|
96
|
-
export type Unavailable = {
|
|
97
|
-
error: { code: 'temporarily_unavailable'; message: 'MPP relay is not enabled yet.' }
|
|
98
|
-
success: false
|
|
99
|
-
}
|
|
100
|
-
|
|
101
92
|
function errorCode<const code extends RelayErrorCode>(value: code, description: string) {
|
|
102
93
|
return z.literal(value).check(z.describe(description), z.meta({ examples: [value] }))
|
|
103
94
|
}
|
|
@@ -317,37 +308,4 @@ export namespace schema {
|
|
|
317
308
|
]),
|
|
318
309
|
'The result of broadcasting an MPP credential.',
|
|
319
310
|
)
|
|
320
|
-
|
|
321
|
-
/** Temporary response returned while MPP relay settlement is disabled. */
|
|
322
|
-
export const Unavailable = Schema.describe(
|
|
323
|
-
z.object({
|
|
324
|
-
error: z.object({
|
|
325
|
-
code: z
|
|
326
|
-
.literal(relayErrorCode.temporarilyUnavailable)
|
|
327
|
-
.check(z.describe('The retryable relay failure code.')),
|
|
328
|
-
message: z
|
|
329
|
-
.literal('MPP relay is not enabled yet.')
|
|
330
|
-
.check(z.describe('The retryable relay failure message.')),
|
|
331
|
-
}),
|
|
332
|
-
success: z.literal(false).check(z.describe('Whether the relay processed the credential.')),
|
|
333
|
-
}),
|
|
334
|
-
'A retryable response returned while MPP relay settlement is disabled.',
|
|
335
|
-
)
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
/** Returns the relay-disabled response while retaining its published success contract. */
|
|
339
|
-
export function unavailable<success>(
|
|
340
|
-
c: Context<App.Environment>,
|
|
341
|
-
): TypedResponse<success, 200> | TypedResponse<Unavailable, 503> {
|
|
342
|
-
c.header('Retry-After', '60')
|
|
343
|
-
return c.json(
|
|
344
|
-
Response.validated(schema.Unavailable, {
|
|
345
|
-
error: {
|
|
346
|
-
code: relayErrorCode.temporarilyUnavailable,
|
|
347
|
-
message: 'MPP relay is not enabled yet.',
|
|
348
|
-
},
|
|
349
|
-
success: false,
|
|
350
|
-
}),
|
|
351
|
-
503,
|
|
352
|
-
)
|
|
353
311
|
}
|
|
@@ -1,6 +1,16 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as Mppx from 'mppx'
|
|
2
|
+
import { tempo } from 'mppx/server'
|
|
3
|
+
import type { LocalAccount } from 'viem/accounts'
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
import type * as Viem from '../../../internal/Viem.js'
|
|
6
|
+
import * as Store from '../../../internal/Store.js'
|
|
7
|
+
import * as Mpp from '../Mpp.js'
|
|
8
|
+
import * as MppError from './Error.js'
|
|
9
|
+
import * as Screening from './Screening.js'
|
|
10
|
+
import * as ScreenManager from './ScreenManager.js'
|
|
11
|
+
import * as Utils from './Utils.js'
|
|
12
|
+
|
|
13
|
+
/** MPPX lifecycle adapter. */
|
|
4
14
|
export type Adapter = {
|
|
5
15
|
/** Broadcasts a validated MPP credential. */
|
|
6
16
|
broadcast(input: Mpp.RelayInput): Promise<Mpp.BroadcastResponse>
|
|
@@ -8,4 +18,99 @@ export type Adapter = {
|
|
|
8
18
|
verify(input: Mpp.RelayInput): Promise<Mpp.VerifyResponse>
|
|
9
19
|
}
|
|
10
20
|
|
|
11
|
-
|
|
21
|
+
/** Creates an adapter for Tempo charge credentials. */
|
|
22
|
+
export function create(options: create.Options): Adapter {
|
|
23
|
+
const {
|
|
24
|
+
chainId,
|
|
25
|
+
feePayer,
|
|
26
|
+
getClient,
|
|
27
|
+
provider = Screening.allowAll,
|
|
28
|
+
reportUnknown,
|
|
29
|
+
screeningStore,
|
|
30
|
+
screeningTtl = Screening.defaultTtl,
|
|
31
|
+
state,
|
|
32
|
+
time = (_, fn) => fn(),
|
|
33
|
+
} = options
|
|
34
|
+
const screenManager = ScreenManager.create({
|
|
35
|
+
chainId,
|
|
36
|
+
provider,
|
|
37
|
+
store: screeningStore,
|
|
38
|
+
ttl: screeningTtl,
|
|
39
|
+
})
|
|
40
|
+
const methods = [
|
|
41
|
+
tempo.charge({
|
|
42
|
+
...(feePayer ? { feePayer } : {}),
|
|
43
|
+
getClient: ({ chainId: chainId_option }) =>
|
|
44
|
+
getClient(chainId_option as Viem.ChainId | undefined),
|
|
45
|
+
store: Utils.mppxStore(state),
|
|
46
|
+
}),
|
|
47
|
+
] as const
|
|
48
|
+
|
|
49
|
+
/** Validates and screens a credential, rejecting when either check fails. */
|
|
50
|
+
async function validateOrThrow(input: Mpp.RelayInput) {
|
|
51
|
+
const result = await time('mpp_validate', () =>
|
|
52
|
+
Mppx.Method.validateCredential(methods, Mppx.Credential.from(input)),
|
|
53
|
+
)
|
|
54
|
+
await time('mpp_screen', () => screenManager.screen(Utils.addresses(result)))
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function failure(cause: unknown, operation: 'broadcast' | 'verify') {
|
|
58
|
+
const error = MppError.map(cause)
|
|
59
|
+
if (error.code === Mpp.relayErrorCode.unknown) reportUnknown?.({ operation })
|
|
60
|
+
return { error, success: false } as const
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
async broadcast(input) {
|
|
65
|
+
try {
|
|
66
|
+
await validateOrThrow(input)
|
|
67
|
+
const result = await time('mpp_broadcast', () =>
|
|
68
|
+
Mppx.Method.broadcastCredential(methods, Mppx.Credential.from(input)),
|
|
69
|
+
)
|
|
70
|
+
return {
|
|
71
|
+
receipt: {
|
|
72
|
+
...(result.externalId ? { externalId: result.externalId } : {}),
|
|
73
|
+
method: result.method,
|
|
74
|
+
reference: result.reference,
|
|
75
|
+
timestamp: result.timestamp,
|
|
76
|
+
},
|
|
77
|
+
success: true,
|
|
78
|
+
}
|
|
79
|
+
} catch (cause) {
|
|
80
|
+
return failure(cause, 'broadcast')
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
async verify(input) {
|
|
84
|
+
try {
|
|
85
|
+
await validateOrThrow(input)
|
|
86
|
+
return { success: true }
|
|
87
|
+
} catch (cause) {
|
|
88
|
+
return failure(cause, 'verify')
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export declare namespace create {
|
|
95
|
+
/** Dependencies used to validate and broadcast Tempo credentials. */
|
|
96
|
+
type Options = {
|
|
97
|
+
/** Default Tempo chain for challenges that omit a chain id. */
|
|
98
|
+
chainId: number
|
|
99
|
+
/** Optional account used to sponsor Tempo pull transactions. */
|
|
100
|
+
feePayer?: LocalAccount | undefined
|
|
101
|
+
/** Resolves a Tempo client for each credential chain. */
|
|
102
|
+
getClient: Viem.GetClient
|
|
103
|
+
/** Address-screening provider. */
|
|
104
|
+
provider?: Screening.Provider | undefined
|
|
105
|
+
/** Reports an unexpected relay failure without passing through its cause. */
|
|
106
|
+
reportUnknown?: ((options: { operation: 'broadcast' | 'verify' }) => void) | undefined
|
|
107
|
+
/** Cache used for screening results. */
|
|
108
|
+
screeningStore: Store.Store
|
|
109
|
+
/** Screening-cache duration. @default `Ttl.days(1)` */
|
|
110
|
+
screeningTtl?: number | undefined
|
|
111
|
+
/** Durable state used for MPPX replay protection. */
|
|
112
|
+
state: Store.State
|
|
113
|
+
/** Measures a named relay operation. */
|
|
114
|
+
time?: (<value>(name: string, fn: () => Promise<value>) => Promise<value>) | undefined
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as Mppx from 'mppx'
|
|
2
|
+
|
|
3
|
+
import * as Mpp from '../Mpp.js'
|
|
4
|
+
import * as MppError from './Error.js'
|
|
5
|
+
import * as ScreenManager from './ScreenManager.js'
|
|
6
|
+
|
|
7
|
+
describe('map', () => {
|
|
8
|
+
test.each([
|
|
9
|
+
[new Mppx.Errors.PaymentMethodUnsupportedError(), Mpp.relayErrorCode.unsupported],
|
|
10
|
+
[new Mppx.Errors.PaymentExpiredError(), Mpp.relayErrorCode.expired],
|
|
11
|
+
[new Mppx.Errors.InsufficientBalanceError(), Mpp.relayErrorCode.insufficientFunds],
|
|
12
|
+
[new Mppx.Errors.PaymentInsufficientError(), Mpp.relayErrorCode.insufficientFunds],
|
|
13
|
+
[
|
|
14
|
+
new Mppx.Errors.InvalidChallengeError({ reason: 'already used' }),
|
|
15
|
+
Mpp.relayErrorCode.alreadyUsed,
|
|
16
|
+
],
|
|
17
|
+
[new Mppx.Errors.InvalidChallengeError(), Mpp.relayErrorCode.invalidPayment],
|
|
18
|
+
[new Mppx.Errors.InvalidPayloadError(), Mpp.relayErrorCode.invalidPayment],
|
|
19
|
+
[new Mppx.Errors.InvalidSignatureError(), Mpp.relayErrorCode.invalidPayment],
|
|
20
|
+
[new Mppx.Errors.MalformedCredentialError(), Mpp.relayErrorCode.invalidPayment],
|
|
21
|
+
[new Mppx.Errors.VerificationFailedError(), Mpp.relayErrorCode.invalidPayment],
|
|
22
|
+
[
|
|
23
|
+
new Mppx.Errors.VerificationFailedError({ reason: 'Transaction hash has already been used' }),
|
|
24
|
+
Mpp.relayErrorCode.alreadyUsed,
|
|
25
|
+
],
|
|
26
|
+
[new ScreenManager.RejectedError(), Mpp.relayErrorCode.screenRejected],
|
|
27
|
+
[new Error('Transaction simulation failed.'), Mpp.relayErrorCode.simulationFailed],
|
|
28
|
+
[new Error('Transaction broadcast failed.'), Mpp.relayErrorCode.broadcastFailed],
|
|
29
|
+
[new Error('Unexpected failure.'), Mpp.relayErrorCode.unknown],
|
|
30
|
+
] as const)('maps %s', (cause, code) => {
|
|
31
|
+
expect(MppError.map(cause)).toMatchObject({ code })
|
|
32
|
+
})
|
|
33
|
+
})
|
|
@@ -1,9 +1,47 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as Mppx from 'mppx'
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
import * as Mpp from '../Mpp.js'
|
|
4
|
+
import * as Policy from './Policy.js'
|
|
5
|
+
import * as ScreenManager from './ScreenManager.js'
|
|
6
|
+
|
|
7
|
+
/** Maps an MPPX failure to the public relay error contract. */
|
|
8
|
+
export function map(cause: unknown): Mpp.RelayError {
|
|
9
|
+
const message = cause instanceof Error ? cause.message : undefined
|
|
10
|
+
|
|
11
|
+
switch (true) {
|
|
12
|
+
case cause instanceof ScreenManager.RejectedError:
|
|
13
|
+
return error(Mpp.relayErrorCode.screenRejected, 'Address screening rejected the payment.')
|
|
14
|
+
case cause instanceof Policy.UnsupportedChainError:
|
|
15
|
+
case cause instanceof Mppx.Errors.PaymentMethodUnsupportedError:
|
|
16
|
+
return error(Mpp.relayErrorCode.unsupported, message)
|
|
17
|
+
case cause instanceof Policy.PolicyDeniedError:
|
|
18
|
+
return error(Mpp.relayErrorCode.policyDenied, message)
|
|
19
|
+
case cause instanceof Mppx.Errors.PaymentExpiredError:
|
|
20
|
+
return error(Mpp.relayErrorCode.expired, message)
|
|
21
|
+
case cause instanceof Mppx.Errors.InsufficientBalanceError:
|
|
22
|
+
case cause instanceof Mppx.Errors.PaymentInsufficientError:
|
|
23
|
+
return error(Mpp.relayErrorCode.insufficientFunds, message)
|
|
24
|
+
case cause instanceof Mppx.Errors.InvalidChallengeError:
|
|
25
|
+
case cause instanceof Mppx.Errors.VerificationFailedError:
|
|
26
|
+
return error(
|
|
27
|
+
/\balready (?:been )?used\b/i.test(message ?? '')
|
|
28
|
+
? Mpp.relayErrorCode.alreadyUsed
|
|
29
|
+
: Mpp.relayErrorCode.invalidPayment,
|
|
30
|
+
message,
|
|
31
|
+
)
|
|
32
|
+
case cause instanceof Mppx.Errors.InvalidPayloadError:
|
|
33
|
+
case cause instanceof Mppx.Errors.InvalidSignatureError:
|
|
34
|
+
case cause instanceof Mppx.Errors.MalformedCredentialError:
|
|
35
|
+
return error(Mpp.relayErrorCode.invalidPayment, message)
|
|
36
|
+
case message?.toLowerCase().includes('simulation'):
|
|
37
|
+
return error(Mpp.relayErrorCode.simulationFailed, message)
|
|
38
|
+
case message?.toLowerCase().includes('broadcast'):
|
|
39
|
+
return error(Mpp.relayErrorCode.broadcastFailed, message)
|
|
40
|
+
default:
|
|
41
|
+
return error(Mpp.relayErrorCode.unknown, message)
|
|
42
|
+
}
|
|
7
43
|
}
|
|
8
44
|
|
|
9
|
-
|
|
45
|
+
function error(code: Mpp.RelayErrorCode, message: string | undefined): Mpp.RelayError {
|
|
46
|
+
return message === undefined ? { code } : { code, message }
|
|
47
|
+
}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import * as Store from '../../../internal/Store.js'
|
|
2
|
+
import * as Ttl from '../../../internal/Ttl.js'
|
|
3
|
+
import * as Mpp from '../Mpp.js'
|
|
4
|
+
import * as Idempotency from './Idempotency.js'
|
|
5
|
+
|
|
6
|
+
const identity = {
|
|
7
|
+
apiKeyId: 'key_mpp',
|
|
8
|
+
idempotencyKey: 'mpp_broadcast_01j3j1k2l3m4n5p6q7r8s9t0u',
|
|
9
|
+
inputHash: `0x${'11'.repeat(32)}`,
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const credential = {
|
|
13
|
+
challenge: {
|
|
14
|
+
id: 'ch_01j3j1k2l3m4n5p6q7r8s9t0u',
|
|
15
|
+
intent: 'charge',
|
|
16
|
+
method: 'tempo',
|
|
17
|
+
realm: 'merchant.example',
|
|
18
|
+
request: { amount: '1', currency: 'USD' },
|
|
19
|
+
},
|
|
20
|
+
payload: { hash: `0x${'22'.repeat(32)}`, type: 'hash' },
|
|
21
|
+
} satisfies Mpp.RelayInput
|
|
22
|
+
|
|
23
|
+
describe('inputHash', () => {
|
|
24
|
+
test('binds semantic credential content instead of JSON property order', () => {
|
|
25
|
+
const reordered = {
|
|
26
|
+
payload: { hash: `0x${'22'.repeat(32)}`, type: 'hash' },
|
|
27
|
+
challenge: {
|
|
28
|
+
method: 'tempo',
|
|
29
|
+
realm: 'merchant.example',
|
|
30
|
+
request: { currency: 'USD', amount: '1' },
|
|
31
|
+
intent: 'charge',
|
|
32
|
+
id: 'ch_01j3j1k2l3m4n5p6q7r8s9t0u',
|
|
33
|
+
},
|
|
34
|
+
} satisfies Mpp.RelayInput
|
|
35
|
+
|
|
36
|
+
expect(Idempotency.inputHash(reordered)).toBe(Idempotency.inputHash(credential))
|
|
37
|
+
expect(
|
|
38
|
+
Idempotency.inputHash({
|
|
39
|
+
...credential,
|
|
40
|
+
challenge: { ...credential.challenge, id: 'ch_01j3j1k2l3m4n5p6q7r8s9t0v' },
|
|
41
|
+
}),
|
|
42
|
+
).not.toBe(Idempotency.inputHash(credential))
|
|
43
|
+
})
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
describe('claim', () => {
|
|
47
|
+
test('coordinates concurrent broadcasts and replays terminal results', async () => {
|
|
48
|
+
const state = Store.memory()
|
|
49
|
+
const claims = await Promise.all([
|
|
50
|
+
Idempotency.claim({ identity, state }),
|
|
51
|
+
Idempotency.claim({ identity, state }),
|
|
52
|
+
])
|
|
53
|
+
const claimed = claims.find((result) => result.type === 'claimed')
|
|
54
|
+
const pending = claims.find((result) => result.type === 'pending')
|
|
55
|
+
|
|
56
|
+
expect(claimed?.type).toBe('claimed')
|
|
57
|
+
expect(pending).toEqual({ type: 'pending' })
|
|
58
|
+
if (!claimed || claimed.type !== 'claimed') throw new Error('Expected a claimed challenge.')
|
|
59
|
+
|
|
60
|
+
const response = {
|
|
61
|
+
receipt: {
|
|
62
|
+
method: 'tempo',
|
|
63
|
+
reference: `0x${'22'.repeat(32)}`,
|
|
64
|
+
timestamp: '2026-07-20T18:30:00.000Z',
|
|
65
|
+
},
|
|
66
|
+
success: true,
|
|
67
|
+
} satisfies Mpp.BroadcastResponse
|
|
68
|
+
await Idempotency.complete({ identity, response, state, token: claimed.token })
|
|
69
|
+
|
|
70
|
+
await expect(Idempotency.claim({ identity, state })).resolves.toEqual({
|
|
71
|
+
response,
|
|
72
|
+
type: 'replay',
|
|
73
|
+
})
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
test('reclaims a pending request after its confirmation lease expires', async () => {
|
|
77
|
+
vi.useFakeTimers({ now: new Date('2026-07-22T00:00:00.000Z') })
|
|
78
|
+
try {
|
|
79
|
+
const state = Store.memory()
|
|
80
|
+
await Idempotency.claim({ identity, state })
|
|
81
|
+
vi.advanceTimersByTime(Ttl.seconds(5) + 1)
|
|
82
|
+
|
|
83
|
+
await expect(Idempotency.claim({ identity, state })).resolves.toEqual({ type: 'pending' })
|
|
84
|
+
|
|
85
|
+
vi.advanceTimersByTime(Ttl.minutes(1) - Ttl.seconds(5))
|
|
86
|
+
|
|
87
|
+
await expect(Idempotency.claim({ identity, state })).resolves.toMatchObject({
|
|
88
|
+
type: 'claimed',
|
|
89
|
+
})
|
|
90
|
+
} finally {
|
|
91
|
+
vi.useRealTimers()
|
|
92
|
+
}
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
test('retains a successful receipt beyond the MPP request', async () => {
|
|
96
|
+
vi.useFakeTimers({ now: new Date('2026-07-22T00:00:00.000Z') })
|
|
97
|
+
try {
|
|
98
|
+
const state = Store.memory()
|
|
99
|
+
const claim = await Idempotency.claim({ identity, state })
|
|
100
|
+
if (claim.type !== 'claimed') throw new Error('Expected an idempotency key claim.')
|
|
101
|
+
await Idempotency.complete({
|
|
102
|
+
identity,
|
|
103
|
+
response: {
|
|
104
|
+
receipt: {
|
|
105
|
+
method: 'tempo',
|
|
106
|
+
reference: `0x${'22'.repeat(32)}`,
|
|
107
|
+
timestamp: '2026-07-22T00:00:00.000Z',
|
|
108
|
+
},
|
|
109
|
+
success: true,
|
|
110
|
+
},
|
|
111
|
+
state,
|
|
112
|
+
token: claim.token,
|
|
113
|
+
})
|
|
114
|
+
vi.advanceTimersByTime(Ttl.seconds(5) + 1)
|
|
115
|
+
|
|
116
|
+
await expect(Idempotency.claim({ identity, state })).resolves.toMatchObject({
|
|
117
|
+
type: 'replay',
|
|
118
|
+
})
|
|
119
|
+
} finally {
|
|
120
|
+
vi.useRealTimers()
|
|
121
|
+
}
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
test('rejects a reused key for a different credential', async () => {
|
|
125
|
+
const state = Store.memory()
|
|
126
|
+
const claim = await Idempotency.claim({ identity, state })
|
|
127
|
+
if (claim.type !== 'claimed') throw new Error('Expected an idempotency key claim.')
|
|
128
|
+
await Idempotency.complete({
|
|
129
|
+
identity,
|
|
130
|
+
response: {
|
|
131
|
+
receipt: {
|
|
132
|
+
method: 'tempo',
|
|
133
|
+
reference: `0x${'22'.repeat(32)}`,
|
|
134
|
+
timestamp: '2026-07-22T00:00:00.000Z',
|
|
135
|
+
},
|
|
136
|
+
success: true,
|
|
137
|
+
},
|
|
138
|
+
state,
|
|
139
|
+
token: claim.token,
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
await expect(
|
|
143
|
+
Idempotency.claim({
|
|
144
|
+
identity: { ...identity, inputHash: `0x${'33'.repeat(32)}` },
|
|
145
|
+
state,
|
|
146
|
+
}),
|
|
147
|
+
).resolves.toEqual({ type: 'mismatch' })
|
|
148
|
+
})
|
|
149
|
+
|
|
150
|
+
test('does not replay a legacy receipt without an input hash', async () => {
|
|
151
|
+
const state = Store.memory()
|
|
152
|
+
const claim = await Idempotency.claim({ identity, state })
|
|
153
|
+
if (claim.type !== 'claimed') throw new Error('Expected an idempotency key claim.')
|
|
154
|
+
const key = (await state.list()).keys[0]?.name
|
|
155
|
+
if (!key) throw new Error('Expected an idempotency record.')
|
|
156
|
+
await state.put(
|
|
157
|
+
key,
|
|
158
|
+
JSON.stringify({
|
|
159
|
+
response: {
|
|
160
|
+
receipt: {
|
|
161
|
+
method: 'tempo',
|
|
162
|
+
reference: `0x${'22'.repeat(32)}`,
|
|
163
|
+
timestamp: '2026-07-22T00:00:00.000Z',
|
|
164
|
+
},
|
|
165
|
+
success: true,
|
|
166
|
+
},
|
|
167
|
+
type: 'complete',
|
|
168
|
+
}),
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
await expect(Idempotency.claim({ identity, state })).resolves.toEqual({ type: 'mismatch' })
|
|
172
|
+
})
|
|
173
|
+
|
|
174
|
+
test('rejects a different credential while the original request is pending', async () => {
|
|
175
|
+
const state = Store.memory()
|
|
176
|
+
const claim = await Idempotency.claim({ identity, state })
|
|
177
|
+
if (claim.type !== 'claimed') throw new Error('Expected an idempotency key claim.')
|
|
178
|
+
|
|
179
|
+
await expect(
|
|
180
|
+
Idempotency.claim({
|
|
181
|
+
identity: { ...identity, inputHash: `0x${'33'.repeat(32)}` },
|
|
182
|
+
state,
|
|
183
|
+
}),
|
|
184
|
+
).resolves.toEqual({ type: 'mismatch' })
|
|
185
|
+
await expect(Idempotency.claim({ identity, state })).resolves.toEqual({ type: 'pending' })
|
|
186
|
+
})
|
|
187
|
+
})
|
|
188
|
+
|
|
189
|
+
describe('release', () => {
|
|
190
|
+
test('permits a retry after a retryable failure', async () => {
|
|
191
|
+
const state = Store.memory()
|
|
192
|
+
const result = await Idempotency.claim({ identity, state })
|
|
193
|
+
if (result.type !== 'claimed') throw new Error('Expected a claimed challenge.')
|
|
194
|
+
|
|
195
|
+
await Idempotency.release({ identity, state, token: result.token })
|
|
196
|
+
|
|
197
|
+
await expect(Idempotency.claim({ identity, state })).resolves.toMatchObject({ type: 'claimed' })
|
|
198
|
+
})
|
|
199
|
+
|
|
200
|
+
test("does not release another credential's pending claim", async () => {
|
|
201
|
+
const state = Store.memory()
|
|
202
|
+
const claim = await Idempotency.claim({ identity, state })
|
|
203
|
+
if (claim.type !== 'claimed') throw new Error('Expected an idempotency key claim.')
|
|
204
|
+
|
|
205
|
+
await Idempotency.release({
|
|
206
|
+
identity: { ...identity, inputHash: `0x${'33'.repeat(32)}` },
|
|
207
|
+
state,
|
|
208
|
+
token: claim.token,
|
|
209
|
+
})
|
|
210
|
+
|
|
211
|
+
await expect(Idempotency.claim({ identity, state })).resolves.toEqual({ type: 'pending' })
|
|
212
|
+
})
|
|
213
|
+
})
|
|
@@ -1,7 +1,61 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import * as core_Idempotency from '../../../internal/Idempotency.js'
|
|
2
|
+
import * as Ttl from '../../../internal/Ttl.js'
|
|
3
|
+
import type * as Mpp from '../Mpp.js'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* API-level retry coordination for `POST /v1/mpp/broadcast`, backed by the
|
|
7
|
+
* shared coordinator in `internal/Idempotency.ts`.
|
|
8
|
+
*
|
|
9
|
+
* MPPX consumes payment proofs, preventing settlement replay. This module instead lets a caller recover a successful receipt after a transport timeout.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/** Identity for one caller-supplied idempotent broadcast request. */
|
|
13
|
+
export type Identity = core_Idempotency.Identity
|
|
14
|
+
|
|
15
|
+
const broadcast = core_Idempotency.create<Mpp.BroadcastResponse>({
|
|
16
|
+
namespace: 'mpp:relay:v1',
|
|
17
|
+
// Covers the confirmation wait after a credential has passed its
|
|
18
|
+
// five-second validity window.
|
|
19
|
+
pendingTtl: Ttl.minutes(1),
|
|
20
|
+
// Retains a successful settlement receipt for client recovery after
|
|
21
|
+
// transport failures.
|
|
22
|
+
receiptTtl: Ttl.days(1),
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
/** Returns a stable digest without retaining credential contents in durable state. */
|
|
26
|
+
export function inputHash(input: Mpp.RelayInput) {
|
|
27
|
+
return core_Idempotency.inputHash(input)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Claims a broadcast request or returns its current outcome. */
|
|
31
|
+
export function claim(options: claim.Options): Promise<claim.Result> {
|
|
32
|
+
return broadcast.claim(options)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export declare namespace claim {
|
|
36
|
+
/** Outcome from attempting to claim an idempotency key. */
|
|
37
|
+
type Result = core_Idempotency.claim.Result<Mpp.BroadcastResponse>
|
|
38
|
+
|
|
39
|
+
/** Dependencies for claiming one idempotency key. */
|
|
40
|
+
type Options = core_Idempotency.claim.Options
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Persists a successful response for an owned request claim. */
|
|
44
|
+
export function complete(options: complete.Options): Promise<void> {
|
|
45
|
+
return broadcast.complete(options)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export declare namespace complete {
|
|
49
|
+
/** Dependencies for persisting one terminal broadcast response. */
|
|
50
|
+
type Options = core_Idempotency.complete.Options<Mpp.BroadcastResponse>
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Releases an owned retryable request claim. */
|
|
54
|
+
export function release(options: release.Options): Promise<void> {
|
|
55
|
+
return broadcast.release(options)
|
|
5
56
|
}
|
|
6
57
|
|
|
7
|
-
|
|
58
|
+
export declare namespace release {
|
|
59
|
+
/** Dependencies for releasing one idempotency claim. */
|
|
60
|
+
type Options = core_Idempotency.release.Options
|
|
61
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { privateKeyToAccount } from 'viem/accounts'
|
|
2
|
+
|
|
3
|
+
import * as StripeCustomers from '../../../db/tables/stripeCustomers.js'
|
|
4
|
+
import * as TestApp from '../../../../test/App.js'
|
|
5
|
+
import * as Auth from '../../../internal/Auth.js'
|
|
6
|
+
import * as Mpp from '../Mpp.js'
|
|
7
|
+
import * as Policy from './Policy.js'
|
|
8
|
+
|
|
9
|
+
const feePayer = privateKeyToAccount(`0x${'11'.repeat(32)}`)
|
|
10
|
+
|
|
11
|
+
const input = {
|
|
12
|
+
challenge: {
|
|
13
|
+
id: 'ch_01j3j1k2l3m4n5p6q7r8s9t0u',
|
|
14
|
+
intent: 'charge',
|
|
15
|
+
method: 'tempo',
|
|
16
|
+
realm: 'merchant.example',
|
|
17
|
+
request: { chainId: 4217, methodDetails: { chainId: 42431, feePayer: true } },
|
|
18
|
+
},
|
|
19
|
+
payload: {},
|
|
20
|
+
} satisfies Mpp.RelayInput
|
|
21
|
+
|
|
22
|
+
const principal = {
|
|
23
|
+
apiKey: { environment: 'production', id: 'key_mpp', orgId: 'org_mpp', scopes: ['mpp:write'] },
|
|
24
|
+
environment: 'production',
|
|
25
|
+
id: 'key_mpp',
|
|
26
|
+
orgId: 'org_mpp',
|
|
27
|
+
projectId: 'prj_mpp',
|
|
28
|
+
type: 'api_key',
|
|
29
|
+
} satisfies Auth.Principal
|
|
30
|
+
const { projectId: _, ...principal_projectless } = principal
|
|
31
|
+
|
|
32
|
+
describe('chainId', () => {
|
|
33
|
+
test('uses the method-specific chain before the request fallback', () => {
|
|
34
|
+
expect(Policy.chainId(input)).toBe(42431)
|
|
35
|
+
})
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
describe('requiresFeePayer', () => {
|
|
39
|
+
test('requires both a fee-payer method detail and an enabled request', () => {
|
|
40
|
+
expect(Policy.requiresFeePayer(input)).toBe(true)
|
|
41
|
+
expect(
|
|
42
|
+
Policy.requiresFeePayer({
|
|
43
|
+
...input,
|
|
44
|
+
challenge: {
|
|
45
|
+
...input.challenge,
|
|
46
|
+
request: { methodDetails: { feePayer: true }, feePayer: false },
|
|
47
|
+
},
|
|
48
|
+
}),
|
|
49
|
+
).toBe(false)
|
|
50
|
+
})
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
describe('assertSupportedChain', () => {
|
|
54
|
+
test('rejects chains outside the deployment allowlist', () => {
|
|
55
|
+
expect(() =>
|
|
56
|
+
Policy.assertSupportedChain({ chainId: 1, supportedChainIds: new Set([4217]) }),
|
|
57
|
+
).toThrowErrorMatchingInlineSnapshot(
|
|
58
|
+
`[Mpp.Policy.UnsupportedChainError: Unsupported chain id 1.]`,
|
|
59
|
+
)
|
|
60
|
+
})
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
describe('authorizeFeePayer', () => {
|
|
64
|
+
test('allows organization attribution for sponsored credentials', async () => {
|
|
65
|
+
await expect(
|
|
66
|
+
Policy.authorizeFeePayer({
|
|
67
|
+
chainId: 42431,
|
|
68
|
+
db: TestApp.database(),
|
|
69
|
+
feePayer,
|
|
70
|
+
input,
|
|
71
|
+
principal: principal_projectless,
|
|
72
|
+
}),
|
|
73
|
+
).resolves.toBe(feePayer)
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
test('bills a projectless mainnet sponsored credential to its organization', async () => {
|
|
77
|
+
const db = TestApp.database()
|
|
78
|
+
|
|
79
|
+
await expect(
|
|
80
|
+
Policy.authorizeFeePayer({
|
|
81
|
+
chainId: 4217,
|
|
82
|
+
db,
|
|
83
|
+
feePayer,
|
|
84
|
+
input,
|
|
85
|
+
principal: principal_projectless,
|
|
86
|
+
}),
|
|
87
|
+
).rejects.toThrowErrorMatchingInlineSnapshot(
|
|
88
|
+
`[Mpp.Policy.PolicyDeniedError: Active billing is required for mainnet fee sponsorship.]`,
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
await StripeCustomers.create(db, {
|
|
92
|
+
orgId: principal_projectless.orgId,
|
|
93
|
+
stripeCustomerId: 'cus_mpp',
|
|
94
|
+
})
|
|
95
|
+
await StripeCustomers.setStatus(db, principal_projectless.orgId, 'active')
|
|
96
|
+
|
|
97
|
+
await expect(
|
|
98
|
+
Policy.authorizeFeePayer({
|
|
99
|
+
chainId: 4217,
|
|
100
|
+
db,
|
|
101
|
+
feePayer,
|
|
102
|
+
input,
|
|
103
|
+
principal: principal_projectless,
|
|
104
|
+
}),
|
|
105
|
+
).resolves.toBe(feePayer)
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
test('does not require billing when the credential pays its own fee', async () => {
|
|
109
|
+
await expect(
|
|
110
|
+
Policy.authorizeFeePayer({
|
|
111
|
+
chainId: 4217,
|
|
112
|
+
db: TestApp.database(),
|
|
113
|
+
feePayer,
|
|
114
|
+
input: {
|
|
115
|
+
...input,
|
|
116
|
+
challenge: { ...input.challenge, request: { methodDetails: { feePayer: false } } },
|
|
117
|
+
},
|
|
118
|
+
principal,
|
|
119
|
+
}),
|
|
120
|
+
).resolves.toBe(feePayer)
|
|
121
|
+
})
|
|
122
|
+
})
|