tapimo 0.7.0 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ApiKeys.d.ts +24 -7
- package/dist/ApiKeys.d.ts.map +1 -1
- package/dist/ApiKeys.js +17 -5
- package/dist/ApiKeys.js.map +1 -1
- package/dist/App.d.ts +12104 -7861
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +191 -128
- package/dist/App.js.map +1 -1
- package/dist/Assets.d.ts +10 -0
- package/dist/Assets.d.ts.map +1 -1
- package/dist/Assets.js +17 -4
- package/dist/Assets.js.map +1 -1
- package/dist/Scope.d.ts +19 -8
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +25 -9
- package/dist/Scope.js.map +1 -1
- package/dist/Webhooks.d.ts +1 -1
- package/dist/admin/App.d.ts +601 -20
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/App.js +12 -2
- package/dist/admin/App.js.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +94 -11
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +141 -32
- package/dist/admin/apps/api-keys.js.map +1 -1
- package/dist/admin/apps/earn-vaults.d.ts +1069 -0
- package/dist/admin/apps/earn-vaults.d.ts.map +1 -0
- package/dist/admin/apps/earn-vaults.js +409 -0
- package/dist/admin/apps/earn-vaults.js.map +1 -0
- package/dist/admin/apps/verified-tokens.d.ts +166 -166
- package/dist/admin/ui.generated.d.ts +1 -1
- package/dist/admin/ui.generated.d.ts.map +1 -1
- package/dist/admin/ui.generated.js +151 -95
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/analytics/Analytics.d.ts +2 -0
- package/dist/analytics/Analytics.d.ts.map +1 -1
- package/dist/analytics/Analytics.js +18 -2
- package/dist/analytics/Analytics.js.map +1 -1
- package/dist/analytics/tables/requestEvents.d.ts +22 -1
- package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
- package/dist/analytics/tables/requestEvents.js +59 -39
- package/dist/analytics/tables/requestEvents.js.map +1 -1
- package/dist/apps/Zones.d.ts +8335 -0
- package/dist/apps/Zones.d.ts.map +1 -0
- package/dist/apps/Zones.js +38 -0
- package/dist/apps/Zones.js.map +1 -0
- package/dist/apps/data/App.d.ts +14377 -10165
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/App.js +91 -19
- package/dist/apps/data/App.js.map +1 -1
- package/dist/apps/data/FxOracle.d.ts +1 -1
- package/dist/apps/data/FxOracle.d.ts.map +1 -1
- package/dist/apps/data/index.d.ts +0 -1
- package/dist/apps/data/index.d.ts.map +1 -1
- package/dist/apps/data/index.js +0 -1
- package/dist/apps/data/index.js.map +1 -1
- package/dist/apps/data/routes/activities.d.ts +32 -32
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +130 -65
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +312 -312
- package/dist/apps/data/routes/balances.d.ts +18 -18
- package/dist/apps/data/routes/balances.js +5 -5
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/coingecko.d.ts +176 -176
- package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
- package/dist/apps/data/routes/coingecko.js +62 -35
- package/dist/apps/data/routes/coingecko.js.map +1 -1
- package/dist/apps/data/routes/earn.d.ts +2144 -0
- package/dist/apps/data/routes/earn.d.ts.map +1 -0
- package/dist/apps/data/routes/earn.js +947 -0
- package/dist/apps/data/routes/earn.js.map +1 -0
- package/dist/apps/data/routes/exchanges.d.ts +1231 -324
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +656 -193
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +59 -8
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/funding.d.ts +4092 -387
- package/dist/apps/data/routes/funding.d.ts.map +1 -1
- package/dist/apps/data/routes/funding.js +1403 -256
- package/dist/apps/data/routes/funding.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +5 -5
- package/dist/apps/data/routes/indexer.d.ts.map +1 -1
- package/dist/apps/data/routes/indexer.js +19 -2
- package/dist/apps/data/routes/indexer.js.map +1 -1
- package/dist/apps/data/routes/receipts.d.ts +265 -265
- package/dist/apps/data/routes/receipts.d.ts.map +1 -1
- package/dist/apps/data/routes/receipts.js +11 -11
- package/dist/apps/data/routes/receipts.js.map +1 -1
- package/dist/apps/data/routes/rpc.d.ts +5 -5
- package/dist/apps/data/routes/rpc.d.ts.map +1 -1
- package/dist/apps/data/routes/rpc.js +211 -22
- package/dist/apps/data/routes/rpc.js.map +1 -1
- package/dist/apps/data/routes/tokenlist.d.ts +36 -36
- package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
- package/dist/apps/data/routes/tokenlist.js +49 -9
- package/dist/apps/data/routes/tokenlist.js.map +1 -1
- package/dist/apps/data/routes/tokens.d.ts +116 -88
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +198 -91
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +55 -55
- package/dist/apps/data/routes/transactions.d.ts.map +1 -1
- package/dist/apps/data/routes/transactions.js +78 -39
- package/dist/apps/data/routes/transactions.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +78 -29
- package/dist/apps/data/routes/transfers.d.ts.map +1 -1
- package/dist/apps/data/routes/transfers.js +165 -67
- package/dist/apps/data/routes/transfers.js.map +1 -1
- package/dist/apps/data/routes/valuation.d.ts +10 -10
- package/dist/apps/data/routes/valuation.js +2 -2
- package/dist/apps/data/routes/valuation.js.map +1 -1
- package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/verified-tokens.js +34 -9
- package/dist/apps/data/routes/verified-tokens.js.map +1 -1
- package/dist/apps/data/routes/webhooks.d.ts +5 -3
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +175 -65
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +281 -0
- package/dist/apps/data/routes/zones.d.ts.map +1 -0
- package/dist/apps/data/routes/zones.js +252 -0
- package/dist/apps/data/routes/zones.js.map +1 -0
- package/dist/apps/docs/reference.js +6 -5
- package/dist/apps/docs/reference.js.map +1 -1
- package/dist/apps/index.d.ts +2 -1
- package/dist/apps/index.d.ts.map +1 -1
- package/dist/apps/index.js +2 -1
- package/dist/apps/index.js.map +1 -1
- package/dist/apps/management/App.d.ts +670 -670
- package/dist/apps/management/Billing.d.ts +8 -0
- package/dist/apps/management/Billing.d.ts.map +1 -1
- package/dist/apps/management/Billing.js +12 -0
- package/dist/apps/management/Billing.js.map +1 -1
- package/dist/apps/management/Error.d.ts +12 -0
- package/dist/apps/management/Error.d.ts.map +1 -0
- package/dist/apps/management/Error.js +10 -0
- package/dist/apps/management/Error.js.map +1 -0
- package/dist/apps/management/routes/api-keys.d.ts +5 -5
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +2 -8
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +119 -119
- package/dist/apps/management/routes/faucet.d.ts +35 -35
- package/dist/apps/management/routes/invitations.d.ts +62 -62
- package/dist/apps/management/routes/invitations.d.ts.map +1 -1
- package/dist/apps/management/routes/invitations.js +4 -10
- package/dist/apps/management/routes/invitations.js.map +1 -1
- package/dist/apps/management/routes/invite-links.d.ts +30 -30
- package/dist/apps/management/routes/me.d.ts +6 -6
- package/dist/apps/management/routes/members.d.ts +78 -78
- package/dist/apps/management/routes/orgs.d.ts +48 -48
- package/dist/apps/management/routes/orgs.d.ts.map +1 -1
- package/dist/apps/management/routes/orgs.js +2 -8
- package/dist/apps/management/routes/orgs.js.map +1 -1
- package/dist/apps/management/routes/projects.d.ts +9 -9
- package/dist/apps/management/routes/scopes.js +2 -2
- package/dist/apps/management/routes/scopes.js.map +1 -1
- package/dist/apps/management/routes/usage.d.ts +80 -80
- package/dist/apps/management/routes/verified-token-requests.d.ts +36 -36
- package/dist/apps/management/routes/webhooks.d.ts +50 -50
- package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/management/routes/webhooks.js +15 -3
- package/dist/apps/management/routes/webhooks.js.map +1 -1
- package/dist/apps/mpp/App.d.ts +55 -56
- package/dist/apps/mpp/App.d.ts.map +1 -1
- package/dist/apps/mpp/App.js +192 -27
- package/dist/apps/mpp/App.js.map +1 -1
- package/dist/apps/mpp/Mpp.d.ts +0 -20
- package/dist/apps/mpp/Mpp.d.ts.map +1 -1
- package/dist/apps/mpp/Mpp.js +0 -24
- package/dist/apps/mpp/Mpp.js.map +1 -1
- package/dist/apps/mpp/internal/Adapter.d.ts +40 -0
- package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Adapter.js +66 -0
- package/dist/apps/mpp/internal/Adapter.js.map +1 -0
- package/dist/apps/mpp/internal/Error.d.ts +4 -0
- package/dist/apps/mpp/internal/Error.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Error.js +41 -0
- package/dist/apps/mpp/internal/Error.js.map +1 -0
- package/dist/apps/mpp/internal/Idempotency.d.ts +33 -0
- package/dist/apps/mpp/internal/Idempotency.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Idempotency.js +28 -0
- package/dist/apps/mpp/internal/Idempotency.js.map +1 -0
- package/dist/apps/mpp/internal/Policy.d.ts +46 -0
- package/dist/apps/mpp/internal/Policy.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Policy.js +57 -0
- package/dist/apps/mpp/internal/Policy.js.map +1 -0
- package/dist/apps/mpp/internal/ScreenManager.d.ts +27 -0
- package/dist/apps/mpp/internal/ScreenManager.d.ts.map +1 -0
- package/dist/apps/mpp/internal/ScreenManager.js +18 -0
- package/dist/apps/mpp/internal/ScreenManager.js.map +1 -0
- package/dist/apps/mpp/internal/Screening.d.ts +35 -0
- package/dist/apps/mpp/internal/Screening.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Screening.js +20 -0
- package/dist/apps/mpp/internal/Screening.js.map +1 -0
- package/dist/apps/mpp/internal/Sponsorship.d.ts +36 -0
- package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Sponsorship.js +103 -0
- package/dist/apps/mpp/internal/Sponsorship.js.map +1 -0
- package/dist/apps/mpp/internal/Utils.d.ts +7 -0
- package/dist/apps/mpp/internal/Utils.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Utils.js +24 -0
- package/dist/apps/mpp/internal/Utils.js.map +1 -0
- package/dist/apps/relay/App.js +184 -24
- package/dist/apps/relay/App.js.map +1 -1
- package/dist/apps/relay/Sponsorships.d.ts +4 -0
- package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
- package/dist/apps/relay/Sponsorships.js +16 -7
- package/dist/apps/relay/Sponsorships.js.map +1 -1
- package/dist/db/Db.d.ts +20 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +342 -0
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +921 -1
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +269 -1
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/earnVaults.d.ts +68 -0
- package/dist/db/tables/earnVaults.d.ts.map +1 -0
- package/dist/db/tables/earnVaults.js +72 -0
- package/dist/db/tables/earnVaults.js.map +1 -0
- package/dist/db/tables/fundingCatalog.d.ts +56 -0
- package/dist/db/tables/fundingCatalog.d.ts.map +1 -0
- package/dist/db/tables/fundingCatalog.js +85 -0
- package/dist/db/tables/fundingCatalog.js.map +1 -0
- package/dist/db/tables/fundingDepositAddresses.d.ts +159 -0
- package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
- package/dist/db/tables/fundingDepositAddresses.js +206 -0
- package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
- package/dist/db/tables/fundingDeposits.d.ts +115 -0
- package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
- package/dist/db/tables/fundingDeposits.js +100 -0
- package/dist/db/tables/fundingDeposits.js.map +1 -0
- package/dist/db/tables/fundingIdempotency.d.ts +91 -0
- package/dist/db/tables/fundingIdempotency.d.ts.map +1 -0
- package/dist/db/tables/fundingIdempotency.js +103 -0
- package/dist/db/tables/fundingIdempotency.js.map +1 -0
- package/dist/db/tables/fundingTransferEvents.d.ts +12 -0
- package/dist/db/tables/fundingTransferEvents.d.ts.map +1 -0
- package/dist/db/tables/fundingTransferEvents.js +18 -0
- package/dist/db/tables/fundingTransferEvents.js.map +1 -0
- package/dist/db/tables/fundingTransferTransactions.d.ts +15 -0
- package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -0
- package/dist/db/tables/fundingTransferTransactions.js +27 -0
- package/dist/db/tables/fundingTransferTransactions.js.map +1 -0
- package/dist/db/tables/fundingTransfers.d.ts +82 -0
- package/dist/db/tables/fundingTransfers.d.ts.map +1 -0
- package/dist/db/tables/fundingTransfers.js +89 -0
- package/dist/db/tables/fundingTransfers.js.map +1 -0
- package/dist/db/tables/organizations.d.ts +8 -0
- package/dist/db/tables/organizations.d.ts.map +1 -1
- package/dist/db/tables/organizations.js +35 -0
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/projects.d.ts +8 -0
- package/dist/db/tables/projects.d.ts.map +1 -1
- package/dist/db/tables/projects.js +16 -0
- package/dist/db/tables/projects.js.map +1 -1
- package/dist/db/tables/requestUsage.d.ts +13 -0
- package/dist/db/tables/requestUsage.d.ts.map +1 -1
- package/dist/db/tables/requestUsage.js +16 -0
- package/dist/db/tables/requestUsage.js.map +1 -1
- package/dist/db/tables/sponsoredTransactions.d.ts +4 -2
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +14 -4
- package/dist/db/tables/sponsoredTransactions.js.map +1 -1
- package/dist/db/tables/users.d.ts +8 -0
- package/dist/db/tables/users.d.ts.map +1 -1
- package/dist/db/tables/users.js +16 -0
- package/dist/db/tables/users.js.map +1 -1
- package/dist/db/tables/verifiedTokens.d.ts +14 -7
- package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
- package/dist/db/tables/verifiedTokens.js +9 -7
- package/dist/db/tables/verifiedTokens.js.map +1 -1
- package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
- package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
- package/dist/db/tables/webhookSubscriptions.js +24 -3
- package/dist/db/tables/webhookSubscriptions.js.map +1 -1
- package/dist/handlers/relay.js +108 -108
- package/dist/handlers/relay.js.map +1 -1
- package/dist/internal/Auth.d.ts +26 -0
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +35 -2
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +16 -10
- package/dist/internal/Cache.js.map +1 -1
- package/dist/internal/Cursor.js +1 -1
- package/dist/internal/Cursor.js.map +1 -1
- package/dist/internal/EarnRates.d.ts +89 -0
- package/dist/internal/EarnRates.d.ts.map +1 -0
- package/dist/internal/EarnRates.js +266 -0
- package/dist/internal/EarnRates.js.map +1 -0
- package/dist/internal/EarnVaults.d.ts +171 -0
- package/dist/internal/EarnVaults.d.ts.map +1 -0
- package/dist/internal/EarnVaults.js +547 -0
- package/dist/internal/EarnVaults.js.map +1 -0
- package/dist/internal/EdgeCache.d.ts +9 -2
- package/dist/internal/EdgeCache.d.ts.map +1 -1
- package/dist/internal/EdgeCache.js +36 -9
- package/dist/internal/EdgeCache.js.map +1 -1
- package/dist/internal/Id.d.ts +11 -0
- package/dist/internal/Id.d.ts.map +1 -1
- package/dist/internal/Id.js +13 -0
- package/dist/internal/Id.js.map +1 -1
- package/dist/internal/Idempotency.d.ts +83 -0
- package/dist/internal/Idempotency.d.ts.map +1 -0
- package/dist/internal/Idempotency.js +113 -0
- package/dist/internal/Idempotency.js.map +1 -0
- package/dist/internal/Log.d.ts +64 -9
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +29 -7
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/MetricSink.d.ts.map +1 -1
- package/dist/internal/MetricSink.js +47 -1
- package/dist/internal/MetricSink.js.map +1 -1
- package/dist/internal/OpenApi.d.ts +1 -1
- package/dist/internal/OpenApi.d.ts.map +1 -1
- package/dist/internal/OpenApi.js +3 -0
- package/dist/internal/OpenApi.js.map +1 -1
- package/dist/internal/Provider.d.ts +14 -0
- package/dist/internal/Provider.d.ts.map +1 -0
- package/dist/internal/Provider.js +5 -0
- package/dist/internal/Provider.js.map +1 -0
- package/dist/internal/Schema.d.ts +8 -3
- package/dist/internal/Schema.d.ts.map +1 -1
- package/dist/internal/Schema.js +24 -13
- package/dist/internal/Schema.js.map +1 -1
- package/dist/internal/Store.d.ts +6 -0
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +35 -0
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/Tidx.d.ts +43 -24
- package/dist/internal/Tidx.d.ts.map +1 -1
- package/dist/internal/Tidx.js +79 -11
- package/dist/internal/Tidx.js.map +1 -1
- package/dist/internal/Viem.d.ts +82 -65
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Viem.js +83 -12
- package/dist/internal/Viem.js.map +1 -1
- package/dist/internal/WebhookDestination.d.ts.map +1 -1
- package/dist/internal/WebhookDestination.js +34 -28
- package/dist/internal/WebhookDestination.js.map +1 -1
- package/dist/internal/Webhooks.d.ts +9 -0
- package/dist/internal/Webhooks.d.ts.map +1 -1
- package/dist/internal/Webhooks.js +15 -10
- package/dist/internal/Webhooks.js.map +1 -1
- package/dist/internal/exchange/Provider.d.ts +219 -0
- package/dist/internal/exchange/Provider.d.ts.map +1 -0
- package/dist/internal/exchange/Provider.js +117 -0
- package/dist/internal/exchange/Provider.js.map +1 -0
- package/dist/internal/exchange/index.d.ts +2 -0
- package/dist/internal/exchange/index.d.ts.map +1 -0
- package/dist/internal/exchange/index.js +2 -0
- package/dist/internal/exchange/index.js.map +1 -0
- package/dist/internal/exchange/providers/uniswap.d.ts +57 -0
- package/dist/internal/exchange/providers/uniswap.d.ts.map +1 -0
- package/dist/internal/exchange/providers/uniswap.js +553 -0
- package/dist/internal/exchange/providers/uniswap.js.map +1 -0
- package/dist/internal/funding/Action.d.ts +55 -0
- package/dist/internal/funding/Action.d.ts.map +1 -0
- package/dist/internal/funding/Action.js +74 -0
- package/dist/internal/funding/Action.js.map +1 -0
- package/dist/internal/funding/Catalog.d.ts +107 -0
- package/dist/internal/funding/Catalog.d.ts.map +1 -0
- package/dist/internal/funding/Catalog.js +270 -0
- package/dist/internal/funding/Catalog.js.map +1 -0
- package/dist/internal/funding/Chain.d.ts +76 -0
- package/dist/internal/funding/Chain.d.ts.map +1 -0
- package/dist/internal/funding/Chain.js +38 -0
- package/dist/internal/funding/Chain.js.map +1 -0
- package/dist/internal/funding/Deposit.d.ts +366 -0
- package/dist/internal/funding/Deposit.d.ts.map +1 -0
- package/dist/internal/funding/Deposit.js +286 -0
- package/dist/internal/funding/Deposit.js.map +1 -0
- package/dist/internal/funding/DepositAddress.d.ts +345 -0
- package/dist/internal/funding/DepositAddress.d.ts.map +1 -0
- package/dist/internal/funding/DepositAddress.js +189 -0
- package/dist/internal/funding/DepositAddress.js.map +1 -0
- package/dist/internal/funding/Evidence.d.ts +52 -0
- package/dist/internal/funding/Evidence.d.ts.map +1 -0
- package/dist/internal/funding/Evidence.js +314 -0
- package/dist/internal/funding/Evidence.js.map +1 -0
- package/dist/internal/funding/Provider.d.ts +1186 -0
- package/dist/internal/funding/Provider.d.ts.map +1 -0
- package/dist/internal/funding/Provider.js +1081 -0
- package/dist/internal/funding/Provider.js.map +1 -0
- package/dist/internal/funding/Reconciliation.d.ts +113 -0
- package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
- package/dist/internal/funding/Reconciliation.js +676 -0
- package/dist/internal/funding/Reconciliation.js.map +1 -0
- package/dist/internal/funding/Route.d.ts +21 -0
- package/dist/internal/funding/Route.d.ts.map +1 -0
- package/dist/internal/funding/Route.js +5 -0
- package/dist/internal/funding/Route.js.map +1 -0
- package/dist/internal/funding/Subsidy.d.ts +113 -0
- package/dist/internal/funding/Subsidy.d.ts.map +1 -0
- package/dist/internal/funding/Subsidy.js +138 -0
- package/dist/internal/funding/Subsidy.js.map +1 -0
- package/dist/internal/funding/Token.d.ts +41 -0
- package/dist/internal/funding/Token.d.ts.map +1 -0
- package/dist/internal/funding/Token.js +22 -0
- package/dist/internal/funding/Token.js.map +1 -0
- package/dist/internal/funding/Transfer.d.ts +643 -0
- package/dist/internal/funding/Transfer.d.ts.map +1 -0
- package/dist/internal/funding/Transfer.js +332 -0
- package/dist/internal/funding/Transfer.js.map +1 -0
- package/dist/internal/funding/index.d.ts +13 -0
- package/dist/internal/funding/index.d.ts.map +1 -0
- package/dist/internal/funding/index.js +13 -0
- package/dist/internal/funding/index.js.map +1 -0
- package/dist/internal/funding/providers/across.d.ts +21 -0
- package/dist/internal/funding/providers/across.d.ts.map +1 -0
- package/dist/internal/funding/providers/across.js +117 -0
- package/dist/internal/funding/providers/across.js.map +1 -0
- package/dist/internal/funding/providers/relay.d.ts +46 -0
- package/dist/internal/funding/providers/relay.d.ts.map +1 -0
- package/dist/internal/funding/providers/relay.js +464 -0
- package/dist/internal/funding/providers/relay.js.map +1 -0
- package/dist/internal/funding/providers/rhino.d.ts +15 -0
- package/dist/internal/funding/providers/rhino.d.ts.map +1 -0
- package/dist/internal/funding/providers/rhino.js +116 -0
- package/dist/internal/funding/providers/rhino.js.map +1 -0
- package/dist/internal/funding/providers/squid.d.ts +19 -0
- package/dist/internal/funding/providers/squid.d.ts.map +1 -0
- package/dist/internal/funding/providers/squid.js +120 -0
- package/dist/internal/funding/providers/squid.js.map +1 -0
- package/dist/internal/funding/providers/symbiosis.d.ts +20 -0
- package/dist/internal/funding/providers/symbiosis.d.ts.map +1 -0
- package/dist/internal/funding/providers/symbiosis.js +176 -0
- package/dist/internal/funding/providers/symbiosis.js.map +1 -0
- package/dist/internal/index.d.ts +5 -1
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +5 -1
- package/dist/internal/index.js.map +1 -1
- package/dist/internal/webhookDestinations/url.js +61 -57
- package/dist/internal/webhookDestinations/url.js.map +1 -1
- package/dist/providers/index.d.ts +43 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +19 -0
- package/dist/providers/index.js.map +1 -0
- package/package.json +9 -4
- package/src/ApiKeys.test.ts +11 -7
- package/src/ApiKeys.ts +37 -9
- package/src/App.test.ts +85 -10
- package/src/App.ts +224 -137
- package/src/Assets.ts +29 -4
- package/src/Client.test-d.ts +650 -30
- package/src/Scope.test.ts +19 -0
- package/src/Scope.ts +28 -11
- package/src/Webhooks.test.ts +25 -0
- package/src/Webhooks.ts +1 -1
- package/src/admin/App.test.ts +9 -2
- package/src/admin/App.ts +32 -9
- package/src/admin/apps/api-keys.test.ts +167 -23
- package/src/admin/apps/api-keys.ts +166 -28
- package/src/admin/apps/earn-vaults.test.ts +338 -0
- package/src/admin/apps/earn-vaults.ts +572 -0
- package/src/admin/apps/scopes.test.ts +16 -1
- package/src/admin/ui/plugin.ts +2 -2
- package/src/admin/ui/src/components/EarnVaultForm.tsx +137 -0
- package/src/admin/ui/src/components/MobileProfile.tsx +2 -2
- package/src/admin/ui/src/components/Page.tsx +1 -1
- package/src/admin/ui/src/components/ThemeToggle.tsx +1 -1
- package/src/admin/ui/src/lib/api-keys.ts +37 -7
- package/src/admin/ui/src/lib/client.ts +1 -1
- package/src/admin/ui/src/lib/config.ts +1 -1
- package/src/admin/ui/src/lib/early-access.ts +8 -9
- package/src/admin/ui/src/lib/earn-vaults.ts +207 -0
- package/src/admin/ui/src/lib/format.ts +13 -0
- package/src/admin/ui/src/lib/organizations.test.ts +14 -4
- package/src/admin/ui/src/lib/organizations.ts +7 -1
- package/src/admin/ui/src/lib/response.ts +22 -0
- package/src/admin/ui/src/lib/scopes.test.ts +19 -11
- package/src/admin/ui/src/lib/scopes.ts +28 -7
- package/src/admin/ui/src/lib/verified-tokens.ts +10 -9
- package/src/admin/ui/src/routeTree.gen.ts +70 -7
- package/src/admin/ui/src/router.tsx +2 -2
- package/src/admin/ui/src/routes/__root.tsx +9 -8
- package/src/admin/ui/src/routes/api-keys.tsx +475 -64
- package/src/admin/ui/src/routes/early-access.tsx +5 -12
- package/src/admin/ui/src/routes/earn.vaults.tsx +348 -0
- package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +154 -0
- package/src/admin/ui/src/routes/earn.vaults_.new.tsx +190 -0
- package/src/admin/ui/src/routes/organizations.tsx +4 -7
- package/src/admin/ui/src/routes/organizations_.$orgId.tsx +56 -54
- package/src/admin/ui/src/routes/verified-tokens.tsx +4 -4
- package/src/admin/ui/vite.config.ts +4 -1
- package/src/admin/ui.generated.ts +189 -95
- package/src/analytics/Analytics.test.ts +69 -10
- package/src/analytics/Analytics.ts +20 -1
- package/src/analytics/tables/requestEvents.ts +79 -37
- package/src/apps/Zones.test.ts +33 -0
- package/src/apps/Zones.ts +40 -0
- package/src/apps/composition.test.ts +84 -1
- package/src/apps/data/App.test.ts +38 -9
- package/src/apps/data/App.ts +96 -33
- package/src/apps/data/FxOracle.ts +1 -1
- package/src/apps/data/index.ts +0 -1
- package/src/apps/data/routes/activities.test.ts +82 -6
- package/src/apps/data/routes/activities.ts +131 -71
- package/src/apps/data/routes/balances.test.ts +50 -37
- package/src/apps/data/routes/balances.ts +5 -5
- package/src/apps/data/routes/blocks.test.ts +2 -0
- package/src/apps/data/routes/coingecko.test.ts +22 -0
- package/src/apps/data/routes/coingecko.ts +84 -48
- package/src/apps/data/routes/earn.test.ts +1108 -0
- package/src/apps/data/routes/earn.ts +1391 -0
- package/src/apps/data/routes/exchanges.test.ts +82 -33
- package/src/apps/data/routes/exchanges.ts +842 -227
- package/src/apps/data/routes/fee-amm.test.ts +4 -6
- package/src/apps/data/routes/fee-amm.ts +69 -12
- package/src/apps/data/routes/funding.test.ts +2712 -221
- package/src/apps/data/routes/funding.ts +1604 -387
- package/src/apps/data/routes/indexer.test.ts +43 -34
- package/src/apps/data/routes/indexer.ts +19 -2
- package/src/apps/data/routes/receipts.test.ts +5 -3
- package/src/apps/data/routes/receipts.ts +13 -11
- package/src/apps/data/routes/rpc.test.ts +446 -28
- package/src/apps/data/routes/rpc.ts +243 -25
- package/src/apps/data/routes/tokenlist.test.ts +15 -0
- package/src/apps/data/routes/tokenlist.ts +88 -22
- package/src/apps/data/routes/tokens.ts +262 -86
- package/src/apps/data/routes/transactions.test.ts +2 -0
- package/src/apps/data/routes/transactions.ts +77 -42
- package/src/apps/data/routes/transfers.test.ts +166 -4
- package/src/apps/data/routes/transfers.ts +216 -78
- package/src/apps/data/routes/valuation.test.ts +62 -9
- package/src/apps/data/routes/valuation.ts +2 -2
- package/src/apps/data/routes/verified-tokens.test.ts +51 -0
- package/src/apps/data/routes/verified-tokens.ts +52 -15
- package/src/apps/data/routes/webhooks.test.ts +432 -33
- package/src/apps/data/routes/webhooks.ts +189 -79
- package/src/apps/data/routes/zones.test.ts +473 -0
- package/src/apps/data/routes/zones.ts +338 -0
- package/src/apps/docs/reference.ts +8 -6
- package/src/apps/index.ts +2 -1
- package/src/apps/management/Billing.test.ts +29 -0
- package/src/apps/management/Billing.ts +23 -0
- package/src/apps/management/Error.ts +12 -0
- package/src/apps/management/routes/api-keys.test.ts +5 -3
- package/src/apps/management/routes/api-keys.ts +2 -9
- package/src/apps/management/routes/invitations.ts +4 -11
- package/src/apps/management/routes/orgs.ts +2 -9
- package/src/apps/management/routes/scopes.test.ts +7 -2
- package/src/apps/management/routes/scopes.ts +2 -2
- package/src/apps/management/routes/webhooks.test.ts +6 -1
- package/src/apps/management/routes/webhooks.ts +15 -3
- package/src/apps/mpp/App.ts +276 -29
- package/src/apps/mpp/Mpp.test.ts +631 -26
- package/src/apps/mpp/Mpp.ts +0 -42
- package/src/apps/mpp/internal/Adapter.ts +108 -3
- package/src/apps/mpp/internal/Error.test.ts +33 -0
- package/src/apps/mpp/internal/Error.ts +44 -6
- package/src/apps/mpp/internal/Idempotency.test.ts +213 -0
- package/src/apps/mpp/internal/Idempotency.ts +59 -5
- package/src/apps/mpp/internal/Policy.test.ts +122 -0
- package/src/apps/mpp/internal/Policy.ts +98 -0
- package/src/apps/mpp/internal/ScreenManager.test.ts +68 -0
- package/src/apps/mpp/internal/ScreenManager.ts +41 -0
- package/src/apps/mpp/internal/Screening.ts +40 -3
- package/src/apps/mpp/internal/Sponsorship.ts +144 -0
- package/src/apps/mpp/internal/Utils.ts +30 -0
- package/src/apps/relay/App.test.ts +495 -64
- package/src/apps/relay/App.ts +234 -24
- package/src/apps/relay/Sponsorships.test.ts +51 -0
- package/src/apps/relay/Sponsorships.ts +19 -7
- package/src/db/Db.ts +439 -0
- package/src/db/Schema.ts +325 -2
- package/src/db/tables/earnVaults.test.ts +185 -0
- package/src/db/tables/earnVaults.ts +151 -0
- package/src/db/tables/fundingCatalog.test.ts +108 -0
- package/src/db/tables/fundingCatalog.ts +157 -0
- package/src/db/tables/fundingDepositAddresses.test.ts +580 -0
- package/src/db/tables/fundingDepositAddresses.ts +376 -0
- package/src/db/tables/fundingDeposits.test.ts +261 -0
- package/src/db/tables/fundingDeposits.ts +229 -0
- package/src/db/tables/fundingIdempotency.test.ts +182 -0
- package/src/db/tables/fundingIdempotency.ts +180 -0
- package/src/db/tables/fundingTransferEvents.ts +28 -0
- package/src/db/tables/fundingTransferTransactions.test.ts +69 -0
- package/src/db/tables/fundingTransferTransactions.ts +37 -0
- package/src/db/tables/fundingTransfers.test.ts +89 -0
- package/src/db/tables/fundingTransfers.ts +153 -0
- package/src/db/tables/organizations.test.ts +88 -0
- package/src/db/tables/organizations.ts +42 -1
- package/src/db/tables/projects.ts +16 -0
- package/src/db/tables/requestUsage.ts +23 -0
- package/src/db/tables/sponsoredTransactions.test.ts +52 -2
- package/src/db/tables/sponsoredTransactions.ts +18 -6
- package/src/db/tables/users.ts +16 -0
- package/src/db/tables/verifiedTokens.ts +19 -14
- package/src/db/tables/webhookSubscriptions.ts +58 -3
- package/src/handlers/relay.test.ts +2 -0
- package/src/handlers/relay.ts +95 -99
- package/src/internal/Auth.test.ts +48 -0
- package/src/internal/Auth.ts +61 -2
- package/src/internal/Cache.ts +13 -9
- package/src/internal/Cursor.test.ts +2 -2
- package/src/internal/Cursor.ts +1 -1
- package/src/internal/EarnRates.test.ts +125 -0
- package/src/internal/EarnRates.ts +409 -0
- package/src/internal/EarnVaults.test.ts +195 -0
- package/src/internal/EarnVaults.ts +876 -0
- package/src/internal/EdgeCache.test.ts +37 -5
- package/src/internal/EdgeCache.ts +39 -7
- package/src/internal/Id.ts +14 -0
- package/src/internal/Idempotency.test.ts +109 -0
- package/src/internal/Idempotency.ts +237 -0
- package/src/internal/Log.test-d.ts +41 -8
- package/src/internal/Log.test.ts +189 -8
- package/src/internal/Log.ts +124 -17
- package/src/internal/MetricSink.test.ts +244 -4
- package/src/internal/MetricSink.ts +51 -1
- package/src/internal/OpenApi.ts +3 -0
- package/src/internal/Provider.test.ts +17 -0
- package/src/internal/Provider.ts +17 -0
- package/src/internal/Schema.test.ts +13 -0
- package/src/internal/Schema.ts +41 -24
- package/src/internal/Store.test.ts +25 -0
- package/src/internal/Store.ts +46 -0
- package/src/internal/Tidx.local.test.ts +78 -3
- package/src/internal/Tidx.test.ts +212 -18
- package/src/internal/Tidx.ts +112 -32
- package/src/internal/VerifiedTokens.test.ts +15 -0
- package/src/internal/Viem.test.ts +170 -17
- package/src/internal/Viem.ts +111 -28
- package/src/internal/WebhookDestination.ts +25 -23
- package/src/internal/Webhooks.test.ts +59 -0
- package/src/internal/Webhooks.ts +34 -10
- package/src/internal/exchange/Provider.test.ts +216 -0
- package/src/internal/exchange/Provider.ts +326 -0
- package/src/internal/exchange/index.test.ts +6 -0
- package/src/internal/exchange/index.ts +1 -0
- package/src/internal/exchange/providers/uniswap.test.ts +122 -0
- package/src/internal/exchange/providers/uniswap.ts +682 -0
- package/src/internal/funding/Action.test.ts +138 -0
- package/src/internal/funding/Action.ts +117 -0
- package/src/internal/funding/Catalog.test.ts +311 -0
- package/src/internal/funding/Catalog.ts +347 -0
- package/src/internal/funding/Chain.test.ts +79 -0
- package/src/internal/funding/Chain.ts +120 -0
- package/src/internal/funding/Deposit.test.ts +26 -0
- package/src/internal/funding/Deposit.ts +453 -0
- package/src/internal/funding/DepositAddress.test.ts +18 -0
- package/src/internal/funding/DepositAddress.ts +312 -0
- package/src/internal/funding/Evidence.test.ts +297 -0
- package/src/internal/funding/Evidence.ts +430 -0
- package/src/internal/funding/Provider.test.ts +1328 -0
- package/src/internal/funding/Provider.ts +1796 -0
- package/src/internal/funding/Reconciliation.local.test.ts +504 -0
- package/src/internal/funding/Reconciliation.test.ts +2020 -0
- package/src/internal/funding/Reconciliation.ts +930 -0
- package/src/internal/funding/Route.test.ts +66 -0
- package/src/internal/funding/Route.ts +29 -0
- package/src/internal/funding/Subsidy.local.test.ts +152 -0
- package/src/internal/funding/Subsidy.test.ts +75 -0
- package/src/internal/funding/Subsidy.ts +260 -0
- package/src/internal/funding/Token.test.ts +47 -0
- package/src/internal/funding/Token.ts +59 -0
- package/src/internal/funding/Transfer.test.ts +369 -0
- package/src/internal/funding/Transfer.ts +522 -0
- package/src/internal/funding/index.test.ts +20 -0
- package/src/internal/funding/index.ts +12 -0
- package/src/internal/funding/providers/across.ts +149 -0
- package/src/{apps/data/FundingQuoteProviders.test.ts → internal/funding/providers/index.test.ts} +178 -157
- package/src/internal/funding/providers/relay.test.ts +474 -0
- package/src/internal/funding/providers/relay.ts +559 -0
- package/src/internal/funding/providers/rhino.ts +139 -0
- package/src/internal/funding/providers/squid.ts +151 -0
- package/src/internal/funding/providers/symbiosis.ts +221 -0
- package/src/internal/index.test.ts +5 -1
- package/src/internal/index.ts +5 -1
- package/src/internal/webhookDestinations/url.ts +49 -45
- package/src/providers/index.test.ts +14 -0
- package/src/providers/index.ts +54 -0
- package/dist/apps/data/FundingQuoteProviders.d.ts +0 -174
- package/dist/apps/data/FundingQuoteProviders.d.ts.map +0 -1
- package/dist/apps/data/FundingQuoteProviders.js +0 -775
- package/dist/apps/data/FundingQuoteProviders.js.map +0 -1
- package/dist/internal/FundingQuotes.d.ts +0 -864
- package/dist/internal/FundingQuotes.d.ts.map +0 -1
- package/dist/internal/FundingQuotes.js +0 -672
- package/dist/internal/FundingQuotes.js.map +0 -1
- package/src/apps/data/FundingQuoteProviders.ts +0 -1043
- package/src/internal/FundingQuotes.test.ts +0 -456
- package/src/internal/FundingQuotes.ts +0 -944
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import * as Chain from './Chain.js'
|
|
2
|
+
import * as Route from './Route.js'
|
|
3
|
+
import * as Token from './Token.js'
|
|
4
|
+
|
|
5
|
+
const base = Chain.from({ id: 'eip155:8453', name: 'Base', slug: 'base' })
|
|
6
|
+
const ethereum = Chain.from({ id: 'eip155:1', name: 'Ethereum', slug: 'ethereum' })
|
|
7
|
+
const tempo = Chain.from({ id: 'eip155:4217', name: 'Tempo', slug: 'tempo' })
|
|
8
|
+
const usdc = Token.from({
|
|
9
|
+
chains: {
|
|
10
|
+
[base.id]: {
|
|
11
|
+
address: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',
|
|
12
|
+
decimals: 6,
|
|
13
|
+
standard: 'ERC-20',
|
|
14
|
+
},
|
|
15
|
+
[ethereum.id]: {
|
|
16
|
+
address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
|
|
17
|
+
decimals: 6,
|
|
18
|
+
standard: 'ERC-20',
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
currency: 'USD',
|
|
22
|
+
name: 'USD Coin',
|
|
23
|
+
slug: 'usdc',
|
|
24
|
+
symbol: 'USDC',
|
|
25
|
+
})
|
|
26
|
+
const usdce = Token.from({
|
|
27
|
+
chains: {
|
|
28
|
+
[tempo.id]: {
|
|
29
|
+
address: '0x20c000000000000000000000b9537d11c60e8b50',
|
|
30
|
+
decimals: 6,
|
|
31
|
+
standard: 'TIP-20',
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
currency: 'USD',
|
|
35
|
+
name: 'Bridged USDC (Stargate)',
|
|
36
|
+
slug: 'usdce',
|
|
37
|
+
symbol: 'USDC.e',
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
describe('from', () => {
|
|
41
|
+
test('expands source tokens into destination routes', () => {
|
|
42
|
+
expect(
|
|
43
|
+
Route.from({
|
|
44
|
+
destination: tempo({ tokens: [usdce] }),
|
|
45
|
+
sources: [ethereum({ tokens: [usdc] }), base({ tokens: [usdc] })],
|
|
46
|
+
}),
|
|
47
|
+
).toEqual([
|
|
48
|
+
{
|
|
49
|
+
destination: expect.objectContaining({
|
|
50
|
+
address: '0x20c000000000000000000000b9537d11c60e8b50',
|
|
51
|
+
}),
|
|
52
|
+
source: expect.objectContaining({
|
|
53
|
+
address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
|
|
54
|
+
}),
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
destination: expect.objectContaining({
|
|
58
|
+
address: '0x20c000000000000000000000b9537d11c60e8b50',
|
|
59
|
+
}),
|
|
60
|
+
source: expect.objectContaining({
|
|
61
|
+
address: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',
|
|
62
|
+
}),
|
|
63
|
+
},
|
|
64
|
+
])
|
|
65
|
+
})
|
|
66
|
+
})
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type * as Chain from './Chain.js'
|
|
2
|
+
import type * as Token from './Token.js'
|
|
3
|
+
|
|
4
|
+
/** A supported funding path between two chain-scoped tokens. */
|
|
5
|
+
export type Route = {
|
|
6
|
+
/** Token received on Tempo. */
|
|
7
|
+
destination: Token.Resolved
|
|
8
|
+
/** Token supplied by the caller. */
|
|
9
|
+
source: Token.Resolved
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** Creates funding routes from destination and source chain-token selections. */
|
|
13
|
+
export function from(options: from.Options): Route[] {
|
|
14
|
+
return options.sources.flatMap((source) =>
|
|
15
|
+
source.tokens.flatMap((token) =>
|
|
16
|
+
options.destination.tokens.map((destination) => ({ destination, source: token })),
|
|
17
|
+
),
|
|
18
|
+
)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export declare namespace from {
|
|
22
|
+
/** Funding route definition. */
|
|
23
|
+
type Options = {
|
|
24
|
+
/** Chain and tokens received on Tempo. */
|
|
25
|
+
destination: Chain.Selection
|
|
26
|
+
/** Chains and tokens accepted as funding inputs. */
|
|
27
|
+
sources: readonly Chain.Selection[]
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/** @module-tag localnet */
|
|
2
|
+
|
|
3
|
+
import { waitForTransactionReceipt } from 'viem/actions'
|
|
4
|
+
import { Actions, Addresses } from 'viem/tempo'
|
|
5
|
+
import { TxEnvelopeTempo } from 'ox/tempo'
|
|
6
|
+
|
|
7
|
+
import * as Runtime from '../../../test/runtime.js'
|
|
8
|
+
import * as TestTempo from '../../../test/Tempo.js'
|
|
9
|
+
import * as Subsidy from './Subsidy.js'
|
|
10
|
+
|
|
11
|
+
const account = TestTempo.accounts[6]!
|
|
12
|
+
const recipient = TestTempo.accounts[7]!
|
|
13
|
+
const runtime = Runtime.get()
|
|
14
|
+
const client = TestTempo.getClient()
|
|
15
|
+
const settler = Subsidy.create({
|
|
16
|
+
account,
|
|
17
|
+
getClient: TestTempo.readClient(),
|
|
18
|
+
policy: { maxAmount: '10' },
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
beforeAll(async () => {
|
|
22
|
+
await Actions.faucet.fundSync(client, { account, timeout: 60_000 })
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
describe.skipIf(runtime.mode !== 'localnet')('create', () => {
|
|
26
|
+
test('transfers a pathUSD subsidy through a persisted signed transaction', async () => {
|
|
27
|
+
const before = await Actions.token.getBalance(client, {
|
|
28
|
+
account: recipient.address,
|
|
29
|
+
decimals: 6,
|
|
30
|
+
token: Addresses.pathUsd,
|
|
31
|
+
})
|
|
32
|
+
const prepared = await settler.prepare({
|
|
33
|
+
amount: 100_000n,
|
|
34
|
+
depositId: 'fdp_local_pathusd',
|
|
35
|
+
recipient: recipient.address,
|
|
36
|
+
token: Addresses.pathUsd,
|
|
37
|
+
})
|
|
38
|
+
const envelope = TxEnvelopeTempo.deserialize(prepared.transaction as TxEnvelopeTempo.Serialized)
|
|
39
|
+
|
|
40
|
+
expect({
|
|
41
|
+
nonceKey: envelope.nonceKey,
|
|
42
|
+
validBefore: envelope.validBefore,
|
|
43
|
+
}).toMatchInlineSnapshot(`
|
|
44
|
+
{
|
|
45
|
+
"nonceKey": 30469680684220070457389426308647765119962481996559904707083080710737939923517n,
|
|
46
|
+
"validBefore": undefined,
|
|
47
|
+
}
|
|
48
|
+
`)
|
|
49
|
+
|
|
50
|
+
await settler.broadcast(prepared)
|
|
51
|
+
await waitForTransactionReceipt(client, { hash: prepared.hash })
|
|
52
|
+
await expect
|
|
53
|
+
.poll(async () => (await settler.status({ hash: prepared.hash })).type)
|
|
54
|
+
.toBe('success')
|
|
55
|
+
const [after, status] = await Promise.all([
|
|
56
|
+
Actions.token.getBalance(client, {
|
|
57
|
+
account: recipient.address,
|
|
58
|
+
decimals: 6,
|
|
59
|
+
token: Addresses.pathUsd,
|
|
60
|
+
}),
|
|
61
|
+
settler.status({ hash: prepared.hash }),
|
|
62
|
+
])
|
|
63
|
+
|
|
64
|
+
expect({ delivered: after.amount - before.amount, status }).toMatchInlineSnapshot(
|
|
65
|
+
{
|
|
66
|
+
status: { tempoGasPaid: expect.any(String) },
|
|
67
|
+
},
|
|
68
|
+
`
|
|
69
|
+
{
|
|
70
|
+
"delivered": 100000n,
|
|
71
|
+
"status": {
|
|
72
|
+
"tempoGasPaid": Any<String>,
|
|
73
|
+
"type": "success",
|
|
74
|
+
},
|
|
75
|
+
}
|
|
76
|
+
`,
|
|
77
|
+
)
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
test('buys the exact destination amount with pathUSD and transfers it atomically', async () => {
|
|
81
|
+
const destinationToken = runtime.fixtures?.crossTokenTransfer?.destinationToken
|
|
82
|
+
if (!destinationToken) throw new Error('Expected a seeded local DEX pair.')
|
|
83
|
+
const before = await Actions.token.getBalance(client, {
|
|
84
|
+
account: recipient.address,
|
|
85
|
+
decimals: 6,
|
|
86
|
+
token: destinationToken,
|
|
87
|
+
})
|
|
88
|
+
const prepared = await settler.prepare({
|
|
89
|
+
amount: 100_000n,
|
|
90
|
+
depositId: 'fdp_local_activity_usd',
|
|
91
|
+
recipient: recipient.address,
|
|
92
|
+
token: destinationToken,
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
await settler.broadcast(prepared)
|
|
96
|
+
await waitForTransactionReceipt(client, { hash: prepared.hash })
|
|
97
|
+
await expect
|
|
98
|
+
.poll(async () => (await settler.status({ hash: prepared.hash })).type)
|
|
99
|
+
.toBe('success')
|
|
100
|
+
const [after, status] = await Promise.all([
|
|
101
|
+
Actions.token.getBalance(client, {
|
|
102
|
+
account: recipient.address,
|
|
103
|
+
decimals: 6,
|
|
104
|
+
token: destinationToken,
|
|
105
|
+
}),
|
|
106
|
+
settler.status({ hash: prepared.hash }),
|
|
107
|
+
])
|
|
108
|
+
|
|
109
|
+
expect({ delivered: after.amount - before.amount, status }).toMatchInlineSnapshot(
|
|
110
|
+
{
|
|
111
|
+
status: { tempoGasPaid: expect.any(String) },
|
|
112
|
+
},
|
|
113
|
+
`
|
|
114
|
+
{
|
|
115
|
+
"delivered": 100000n,
|
|
116
|
+
"status": {
|
|
117
|
+
"tempoGasPaid": Any<String>,
|
|
118
|
+
"type": "success",
|
|
119
|
+
},
|
|
120
|
+
}
|
|
121
|
+
`,
|
|
122
|
+
)
|
|
123
|
+
})
|
|
124
|
+
|
|
125
|
+
test('reports unavailable native DEX liquidity', async () => {
|
|
126
|
+
const { token } = await Actions.token.createSync(TestTempo.getClient({ account }), {
|
|
127
|
+
currency: 'USD',
|
|
128
|
+
name: 'Unlisted USD',
|
|
129
|
+
symbol: 'UNLISTED',
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
await expect(
|
|
133
|
+
settler.prepare({
|
|
134
|
+
amount: 100_000n,
|
|
135
|
+
depositId: 'fdp_local_unlisted',
|
|
136
|
+
recipient: recipient.address,
|
|
137
|
+
token,
|
|
138
|
+
}),
|
|
139
|
+
).rejects.toThrowErrorMatchingInlineSnapshot(`[Funding.Subsidy.LiquidityUnavailableError]`)
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
test('reports unavailable pathUSD balance from transaction simulation', async () => {
|
|
143
|
+
await expect(
|
|
144
|
+
settler.prepare({
|
|
145
|
+
amount: 2n ** 120n,
|
|
146
|
+
depositId: 'fdp_local_insufficient_balance',
|
|
147
|
+
recipient: recipient.address,
|
|
148
|
+
token: Addresses.pathUsd,
|
|
149
|
+
}),
|
|
150
|
+
).rejects.toThrowErrorMatchingInlineSnapshot(`[Funding.Subsidy.BalanceUnavailableError]`)
|
|
151
|
+
})
|
|
152
|
+
})
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { privateKeyToAccount } from 'viem/accounts'
|
|
2
|
+
|
|
3
|
+
import * as TestFunding from '../../../test/Funding.js'
|
|
4
|
+
import * as Viem from '../Viem.js'
|
|
5
|
+
import * as Subsidy from './Subsidy.js'
|
|
6
|
+
|
|
7
|
+
const privateKey = `0x${'11'.repeat(32)}` as const
|
|
8
|
+
|
|
9
|
+
describe('supports', () => {
|
|
10
|
+
test('accepts only corresponding USD routes within the deposit limit', () => {
|
|
11
|
+
const route = TestFunding.transferSnapshot()
|
|
12
|
+
expect({
|
|
13
|
+
aboveLimit: Subsidy.supports(
|
|
14
|
+
{ maxAmount: '1' },
|
|
15
|
+
{
|
|
16
|
+
amount: '1000001',
|
|
17
|
+
destinationToken: route.destinationToken,
|
|
18
|
+
sourceToken: route.sourceToken,
|
|
19
|
+
},
|
|
20
|
+
),
|
|
21
|
+
invalidLimit: Subsidy.supports(
|
|
22
|
+
{ maxAmount: 'invalid' },
|
|
23
|
+
{
|
|
24
|
+
amount: '1000000',
|
|
25
|
+
destinationToken: route.destinationToken,
|
|
26
|
+
sourceToken: route.sourceToken,
|
|
27
|
+
},
|
|
28
|
+
),
|
|
29
|
+
withinLimit: Subsidy.supports(
|
|
30
|
+
{ maxAmount: '1' },
|
|
31
|
+
{
|
|
32
|
+
amount: '1000000',
|
|
33
|
+
destinationToken: route.destinationToken,
|
|
34
|
+
sourceToken: route.sourceToken,
|
|
35
|
+
},
|
|
36
|
+
),
|
|
37
|
+
wrongCurrency: Subsidy.supports(
|
|
38
|
+
{ maxAmount: '1' },
|
|
39
|
+
{
|
|
40
|
+
amount: '1000000',
|
|
41
|
+
destinationToken: { ...route.destinationToken, currency: 'EUR' },
|
|
42
|
+
sourceToken: route.sourceToken,
|
|
43
|
+
},
|
|
44
|
+
),
|
|
45
|
+
}).toMatchInlineSnapshot(`
|
|
46
|
+
{
|
|
47
|
+
"aboveLimit": false,
|
|
48
|
+
"invalidLimit": false,
|
|
49
|
+
"withinLimit": true,
|
|
50
|
+
"wrongCurrency": false,
|
|
51
|
+
}
|
|
52
|
+
`)
|
|
53
|
+
})
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
describe('create', () => {
|
|
57
|
+
test('exposes the dedicated account and policy without network access', () => {
|
|
58
|
+
const account = privateKeyToAccount(privateKey)
|
|
59
|
+
const policy = { maxAmount: '10' }
|
|
60
|
+
const settler = Subsidy.create({
|
|
61
|
+
account,
|
|
62
|
+
getClient: Viem.createGetClient(),
|
|
63
|
+
policy,
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
expect({ account: settler.account, policy: settler.policy }).toMatchInlineSnapshot(`
|
|
67
|
+
{
|
|
68
|
+
"account": "0x19E7E376E7C213B7E7e7e46cc70A5dD086DAff2A",
|
|
69
|
+
"policy": {
|
|
70
|
+
"maxAmount": "10",
|
|
71
|
+
},
|
|
72
|
+
}
|
|
73
|
+
`)
|
|
74
|
+
})
|
|
75
|
+
})
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { Address as core_Address, Hash, Hex, Value } from 'ox'
|
|
2
|
+
import {
|
|
3
|
+
type Address,
|
|
4
|
+
BaseError,
|
|
5
|
+
ContractFunctionRevertedError,
|
|
6
|
+
type LocalAccount,
|
|
7
|
+
TransactionReceiptNotFoundError,
|
|
8
|
+
} from 'viem'
|
|
9
|
+
import {
|
|
10
|
+
getTransactionReceipt,
|
|
11
|
+
prepareTransactionRequest,
|
|
12
|
+
sendRawTransaction,
|
|
13
|
+
signTransaction,
|
|
14
|
+
} from 'viem/actions'
|
|
15
|
+
import { Actions, Addresses } from 'viem/tempo'
|
|
16
|
+
|
|
17
|
+
import * as Fees from '../Fees.js'
|
|
18
|
+
import type * as Viem from '../Viem.js'
|
|
19
|
+
import type * as Provider from './Provider.js'
|
|
20
|
+
|
|
21
|
+
const slippageBps = 100n
|
|
22
|
+
const slippageDenominator = 10_000n
|
|
23
|
+
|
|
24
|
+
/** Maximum subsidized deposit value expressed as a decimal USD amount. */
|
|
25
|
+
export type Policy = {
|
|
26
|
+
/** Maximum source deposit value that Tempo will subsidize. */
|
|
27
|
+
maxAmount: string
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Returns whether one USD stablecoin deposit is within the subsidy policy. */
|
|
31
|
+
export function supports(policy: Policy, options: supports.Options): boolean {
|
|
32
|
+
if (
|
|
33
|
+
options.destinationToken.currency !== 'USD' ||
|
|
34
|
+
options.sourceToken.currency !== options.destinationToken.currency
|
|
35
|
+
)
|
|
36
|
+
return false
|
|
37
|
+
const maximum = (() => {
|
|
38
|
+
try {
|
|
39
|
+
return Value.from(policy.maxAmount, options.sourceToken.decimals)
|
|
40
|
+
} catch {
|
|
41
|
+
return 0n
|
|
42
|
+
}
|
|
43
|
+
})()
|
|
44
|
+
return maximum > 0n && BigInt(options.amount) <= maximum
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export declare namespace supports {
|
|
48
|
+
/** Route and source amount evaluated against a subsidy policy. */
|
|
49
|
+
type Options = {
|
|
50
|
+
/** Source amount in base units. */
|
|
51
|
+
amount: string
|
|
52
|
+
/** Token that the recipient receives on Tempo. */
|
|
53
|
+
destinationToken: Provider.TokenRef
|
|
54
|
+
/** Token deposited on the source chain. */
|
|
55
|
+
sourceToken: Provider.TokenRef
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Prepares and submits durable pathUSD-funded subsidy transactions. */
|
|
60
|
+
export type Settler = {
|
|
61
|
+
/** Tempo account that supplies pathUSD. */
|
|
62
|
+
account: Address
|
|
63
|
+
/** Broadcasts one previously persisted signed transaction. */
|
|
64
|
+
broadcast(parameters: Settler.broadcast.Parameters): Promise<void>
|
|
65
|
+
/** Maximum subsidized deposit policy enforced at creation and settlement. */
|
|
66
|
+
policy: Policy
|
|
67
|
+
/** Prepares one signed transaction without broadcasting it. */
|
|
68
|
+
prepare(parameters: Settler.prepare.Parameters): Promise<Settler.prepare.ReturnType>
|
|
69
|
+
/** Reads the receipt state of one persisted subsidy transaction. */
|
|
70
|
+
status(parameters: Settler.status.Parameters): Promise<Settler.status.ReturnType>
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** Contracts for subsidy settlement operations. */
|
|
74
|
+
export declare namespace Settler {
|
|
75
|
+
/** Contracts for broadcasting one signed subsidy transaction. */
|
|
76
|
+
namespace broadcast {
|
|
77
|
+
/** Persisted transaction passed to the broadcaster. */
|
|
78
|
+
type Parameters = {
|
|
79
|
+
/** Expected transaction hash. */
|
|
80
|
+
hash: Hex.Hex
|
|
81
|
+
/** Signed Tempo transaction bytes. */
|
|
82
|
+
transaction: Hex.Hex
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Contracts for preparing one subsidy transaction. */
|
|
87
|
+
namespace prepare {
|
|
88
|
+
/** Deposit deficit used to construct a subsidy transaction. */
|
|
89
|
+
type Parameters = {
|
|
90
|
+
/** Destination-token deficit in base units. */
|
|
91
|
+
amount: bigint
|
|
92
|
+
/** Deposit id hashed into the destination transfer memo. */
|
|
93
|
+
depositId: string
|
|
94
|
+
/** Tempo account that receives the subsidy. */
|
|
95
|
+
recipient: Address
|
|
96
|
+
/** Destination token address supplied by Tempo. */
|
|
97
|
+
token: Address
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** Signed transaction prepared for durable persistence. */
|
|
101
|
+
type ReturnType = {
|
|
102
|
+
/** Hash of the signed transaction. */
|
|
103
|
+
hash: Hex.Hex
|
|
104
|
+
/** Signed Tempo transaction bytes. */
|
|
105
|
+
transaction: Hex.Hex
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Contracts for reading subsidy transaction state. */
|
|
110
|
+
namespace status {
|
|
111
|
+
/** Persisted transaction inspected by receipt hash. */
|
|
112
|
+
type Parameters = {
|
|
113
|
+
/** Persisted transaction hash. */
|
|
114
|
+
hash: Hex.Hex
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** Receipt state used by reconciliation. */
|
|
118
|
+
type ReturnType =
|
|
119
|
+
| {
|
|
120
|
+
/** No verified receipt exists yet. */
|
|
121
|
+
type: 'pending'
|
|
122
|
+
}
|
|
123
|
+
| {
|
|
124
|
+
/** Tempo gas cost persisted for subsidy accounting, in fee-token base units. */
|
|
125
|
+
tempoGasPaid: string
|
|
126
|
+
/** Verified settlement execution result. */
|
|
127
|
+
type: 'reverted' | 'success'
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** Creates a subsidy settler backed by one dedicated pathUSD account. */
|
|
133
|
+
export function create(options: create.Options): Settler {
|
|
134
|
+
const client = options.getClient()
|
|
135
|
+
return {
|
|
136
|
+
account: options.account.address,
|
|
137
|
+
async broadcast(parameters) {
|
|
138
|
+
const hash = await sendRawTransaction(client, {
|
|
139
|
+
serializedTransaction: parameters.transaction,
|
|
140
|
+
})
|
|
141
|
+
if (!Hex.isEqual(hash, parameters.hash)) throw new TransactionHashMismatchError()
|
|
142
|
+
},
|
|
143
|
+
policy: options.policy,
|
|
144
|
+
async prepare(parameters) {
|
|
145
|
+
const destinationToken = parameters.token
|
|
146
|
+
const direct = core_Address.isEqual(destinationToken, Addresses.pathUsd)
|
|
147
|
+
const memo = Hash.keccak256(Hex.fromString(parameters.depositId))
|
|
148
|
+
const nonceKey = (BigInt(memo) >> 1n) + 1n
|
|
149
|
+
const maximumAmount = await (async () => {
|
|
150
|
+
if (direct) return parameters.amount
|
|
151
|
+
const quotedAmount = await Actions.dex
|
|
152
|
+
.getBuyQuote(client, {
|
|
153
|
+
amountOut: parameters.amount,
|
|
154
|
+
tokenIn: Addresses.pathUsd,
|
|
155
|
+
tokenOut: destinationToken,
|
|
156
|
+
})
|
|
157
|
+
.catch((cause) => {
|
|
158
|
+
if (hasRevert(cause, ['InsufficientLiquidity', 'PairDoesNotExist']))
|
|
159
|
+
throw new LiquidityUnavailableError()
|
|
160
|
+
throw cause
|
|
161
|
+
})
|
|
162
|
+
if (quotedAmount === 0n) throw new LiquidityUnavailableError()
|
|
163
|
+
return (
|
|
164
|
+
(quotedAmount * (slippageDenominator + slippageBps) + slippageDenominator - 1n) /
|
|
165
|
+
slippageDenominator
|
|
166
|
+
)
|
|
167
|
+
})()
|
|
168
|
+
const calls = direct
|
|
169
|
+
? [
|
|
170
|
+
Actions.token.transfer.call(client, {
|
|
171
|
+
amount: parameters.amount,
|
|
172
|
+
memo,
|
|
173
|
+
to: parameters.recipient,
|
|
174
|
+
token: destinationToken,
|
|
175
|
+
}),
|
|
176
|
+
]
|
|
177
|
+
: [
|
|
178
|
+
Actions.token.approve.call(client, {
|
|
179
|
+
amount: maximumAmount,
|
|
180
|
+
spender: Addresses.stablecoinDex,
|
|
181
|
+
token: Addresses.pathUsd,
|
|
182
|
+
}),
|
|
183
|
+
Actions.dex.buy.call({
|
|
184
|
+
amountOut: parameters.amount,
|
|
185
|
+
maxAmountIn: maximumAmount,
|
|
186
|
+
tokenIn: Addresses.pathUsd,
|
|
187
|
+
tokenOut: destinationToken,
|
|
188
|
+
}),
|
|
189
|
+
Actions.token.transfer.call(client, {
|
|
190
|
+
amount: parameters.amount,
|
|
191
|
+
memo,
|
|
192
|
+
to: parameters.recipient,
|
|
193
|
+
token: destinationToken,
|
|
194
|
+
}),
|
|
195
|
+
]
|
|
196
|
+
const request = await prepareTransactionRequest(client, {
|
|
197
|
+
account: options.account,
|
|
198
|
+
calls,
|
|
199
|
+
// A stable per-deposit nonce lets durable retries rebroadcast without paying twice.
|
|
200
|
+
nonceKey,
|
|
201
|
+
}).catch((cause) => {
|
|
202
|
+
if (hasRevert(cause, ['InsufficientBalance'])) throw new BalanceUnavailableError()
|
|
203
|
+
throw cause
|
|
204
|
+
})
|
|
205
|
+
const transaction = await signTransaction(client, {
|
|
206
|
+
...request,
|
|
207
|
+
account: options.account,
|
|
208
|
+
})
|
|
209
|
+
return { hash: Hash.keccak256(transaction), transaction }
|
|
210
|
+
},
|
|
211
|
+
async status(parameters) {
|
|
212
|
+
const receipt = await getTransactionReceipt(client, parameters).catch((cause) => {
|
|
213
|
+
if (cause instanceof TransactionReceiptNotFoundError) return undefined
|
|
214
|
+
throw cause
|
|
215
|
+
})
|
|
216
|
+
if (!receipt) return { type: 'pending' }
|
|
217
|
+
return {
|
|
218
|
+
tempoGasPaid: Fees.fromGas(receipt.gasUsed, receipt.effectiveGasPrice).toString(),
|
|
219
|
+
type: receipt.status === 'success' ? 'success' : 'reverted',
|
|
220
|
+
}
|
|
221
|
+
},
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export declare namespace create {
|
|
226
|
+
/** Dependencies and policy for one subsidy settler. */
|
|
227
|
+
type Options = {
|
|
228
|
+
/** Dedicated account that signs subsidies and holds pathUSD. */
|
|
229
|
+
account: LocalAccount
|
|
230
|
+
/** Trusted Tempo RPC client resolver. */
|
|
231
|
+
getClient: Viem.GetClient
|
|
232
|
+
/** Maximum subsidized deposit policy. */
|
|
233
|
+
policy: Policy
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
function hasRevert(cause: unknown, names: readonly string[]): boolean {
|
|
238
|
+
if (!(cause instanceof BaseError)) return false
|
|
239
|
+
const decoded = cause.walk(
|
|
240
|
+
(error) =>
|
|
241
|
+
error instanceof ContractFunctionRevertedError &&
|
|
242
|
+
Boolean(error.data?.errorName && names.includes(error.data.errorName)),
|
|
243
|
+
)
|
|
244
|
+
return Boolean(decoded) || names.some((name) => cause.details.includes(`${name}(`))
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/** The subsidy account lacks enough pathUSD. */
|
|
248
|
+
export class BalanceUnavailableError extends Error {
|
|
249
|
+
override name = 'Funding.Subsidy.BalanceUnavailableError'
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/** The Tempo DEX cannot quote the required destination amount. */
|
|
253
|
+
export class LiquidityUnavailableError extends Error {
|
|
254
|
+
override name = 'Funding.Subsidy.LiquidityUnavailableError'
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/** The RPC returned a hash that differs from the persisted transaction. */
|
|
258
|
+
export class TransactionHashMismatchError extends Error {
|
|
259
|
+
override name = 'Funding.Subsidy.TransactionHashMismatchError'
|
|
260
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import * as Chain from './Chain.js'
|
|
2
|
+
import * as Token from './Token.js'
|
|
3
|
+
|
|
4
|
+
const base = Chain.from({ id: 'eip155:8453', name: 'Base', slug: 'base' })
|
|
5
|
+
|
|
6
|
+
describe('from', () => {
|
|
7
|
+
test('creates a token with chain-specific metadata', () => {
|
|
8
|
+
const token = Token.from({
|
|
9
|
+
chains: {
|
|
10
|
+
[base.id]: {
|
|
11
|
+
address: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',
|
|
12
|
+
decimals: 6,
|
|
13
|
+
standard: 'ERC-20',
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
currency: 'USD',
|
|
17
|
+
name: 'USD Coin',
|
|
18
|
+
slug: 'usdc',
|
|
19
|
+
symbol: 'USDC',
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
const resolved = base({ tokens: [token] }).tokens[0]
|
|
23
|
+
expect(resolved).toMatchObject({
|
|
24
|
+
address: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',
|
|
25
|
+
decimals: 6,
|
|
26
|
+
standard: 'ERC-20',
|
|
27
|
+
symbol: 'USDC',
|
|
28
|
+
})
|
|
29
|
+
expect(resolved?.chain.id).toBe('eip155:8453')
|
|
30
|
+
})
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
describe('resolve', () => {
|
|
34
|
+
test('rejects a token that is unavailable on the chain', () => {
|
|
35
|
+
const token = Token.from({
|
|
36
|
+
chains: {},
|
|
37
|
+
currency: 'USD',
|
|
38
|
+
name: 'USD Coin',
|
|
39
|
+
slug: 'usdc',
|
|
40
|
+
symbol: 'USDC',
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
expect(() => base({ tokens: [token] })).toThrowErrorMatchingInlineSnapshot(
|
|
44
|
+
`[Funding.Token.MissingChainError]`,
|
|
45
|
+
)
|
|
46
|
+
})
|
|
47
|
+
})
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type * as Chain from './Chain.js'
|
|
2
|
+
|
|
3
|
+
/** A token accepted or returned by a funding provider. */
|
|
4
|
+
export type Token = {
|
|
5
|
+
/** Chain-specific token metadata keyed by CAIP-2 chain id. */
|
|
6
|
+
chains: Partial<Record<Chain.Id, ChainConfig>>
|
|
7
|
+
/** Monetary denomination represented by the token. */
|
|
8
|
+
currency: string
|
|
9
|
+
/** Human-readable token name. */
|
|
10
|
+
name: string
|
|
11
|
+
/** Stable token segment used in quote identifiers. */
|
|
12
|
+
slug: string
|
|
13
|
+
/** Short token ticker symbol. */
|
|
14
|
+
symbol: string
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Chain-specific token metadata. */
|
|
18
|
+
export type ChainConfig = {
|
|
19
|
+
/** Contract address, mint, or issuer address on the chain. */
|
|
20
|
+
address: string
|
|
21
|
+
/** Number of decimal places used by the token on the chain. */
|
|
22
|
+
decimals: number
|
|
23
|
+
/** Chain-specific token name override. */
|
|
24
|
+
name?: string | undefined
|
|
25
|
+
/** Token standard on the chain. */
|
|
26
|
+
standard: string
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** A token resolved to one funding chain. */
|
|
30
|
+
export type Resolved = Omit<Token, 'chains'> &
|
|
31
|
+
Omit<ChainConfig, 'name'> & {
|
|
32
|
+
/** Chain where the token exists. */
|
|
33
|
+
chain: Chain.Chain
|
|
34
|
+
/** Human-readable token name for this chain. */
|
|
35
|
+
name: string
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Creates a canonical funding token. */
|
|
39
|
+
export function from<const token extends Token>(options: token): token {
|
|
40
|
+
return options
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Resolves a funding token to its metadata on one chain. */
|
|
44
|
+
export function resolve(token: Token, chain: Chain.Chain): Resolved {
|
|
45
|
+
const config = token.chains[chain.id]
|
|
46
|
+
if (!config) throw new MissingChainError()
|
|
47
|
+
const { chains: _chains, ...metadata } = token
|
|
48
|
+
return {
|
|
49
|
+
...metadata,
|
|
50
|
+
...config,
|
|
51
|
+
chain,
|
|
52
|
+
name: config.name ?? token.name,
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Error thrown when a token is not configured for a selected chain. */
|
|
57
|
+
export class MissingChainError extends Error {
|
|
58
|
+
override name = 'Funding.Token.MissingChainError'
|
|
59
|
+
}
|