tapimo 0.7.1 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ApiKeys.d.ts +24 -7
- package/dist/ApiKeys.d.ts.map +1 -1
- package/dist/ApiKeys.js +17 -5
- package/dist/ApiKeys.js.map +1 -1
- package/dist/App.d.ts +12104 -7861
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +191 -128
- package/dist/App.js.map +1 -1
- package/dist/Assets.d.ts +10 -0
- package/dist/Assets.d.ts.map +1 -1
- package/dist/Assets.js +17 -4
- package/dist/Assets.js.map +1 -1
- package/dist/Scope.d.ts +19 -8
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +25 -9
- package/dist/Scope.js.map +1 -1
- package/dist/Webhooks.d.ts +1 -1
- package/dist/admin/App.d.ts +601 -20
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/App.js +12 -2
- package/dist/admin/App.js.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +94 -11
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +141 -32
- package/dist/admin/apps/api-keys.js.map +1 -1
- package/dist/admin/apps/earn-vaults.d.ts +1069 -0
- package/dist/admin/apps/earn-vaults.d.ts.map +1 -0
- package/dist/admin/apps/earn-vaults.js +409 -0
- package/dist/admin/apps/earn-vaults.js.map +1 -0
- package/dist/admin/apps/verified-tokens.d.ts +166 -166
- package/dist/admin/ui.generated.d.ts +1 -1
- package/dist/admin/ui.generated.d.ts.map +1 -1
- package/dist/admin/ui.generated.js +99 -43
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/analytics/Analytics.d.ts +2 -0
- package/dist/analytics/Analytics.d.ts.map +1 -1
- package/dist/analytics/Analytics.js +18 -2
- package/dist/analytics/Analytics.js.map +1 -1
- package/dist/analytics/tables/requestEvents.d.ts +22 -1
- package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
- package/dist/analytics/tables/requestEvents.js +59 -39
- package/dist/analytics/tables/requestEvents.js.map +1 -1
- package/dist/apps/Zones.d.ts +8335 -0
- package/dist/apps/Zones.d.ts.map +1 -0
- package/dist/apps/Zones.js +38 -0
- package/dist/apps/Zones.js.map +1 -0
- package/dist/apps/data/App.d.ts +12125 -7913
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/App.js +91 -19
- package/dist/apps/data/App.js.map +1 -1
- package/dist/apps/data/FxOracle.d.ts +1 -1
- package/dist/apps/data/FxOracle.d.ts.map +1 -1
- package/dist/apps/data/index.d.ts +0 -1
- package/dist/apps/data/index.d.ts.map +1 -1
- package/dist/apps/data/index.js +0 -1
- package/dist/apps/data/index.js.map +1 -1
- package/dist/apps/data/routes/activities.d.ts +32 -32
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +130 -65
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +312 -312
- package/dist/apps/data/routes/balances.d.ts +18 -18
- package/dist/apps/data/routes/balances.js +5 -5
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/coingecko.d.ts +176 -176
- package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
- package/dist/apps/data/routes/coingecko.js +62 -35
- package/dist/apps/data/routes/coingecko.js.map +1 -1
- package/dist/apps/data/routes/earn.d.ts +2144 -0
- package/dist/apps/data/routes/earn.d.ts.map +1 -0
- package/dist/apps/data/routes/earn.js +947 -0
- package/dist/apps/data/routes/earn.js.map +1 -0
- package/dist/apps/data/routes/exchanges.d.ts +1625 -718
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +656 -193
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts +108 -108
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +59 -8
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/funding.d.ts +4092 -387
- package/dist/apps/data/routes/funding.d.ts.map +1 -1
- package/dist/apps/data/routes/funding.js +1403 -256
- package/dist/apps/data/routes/funding.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +30 -30
- package/dist/apps/data/routes/indexer.d.ts.map +1 -1
- package/dist/apps/data/routes/indexer.js +19 -2
- package/dist/apps/data/routes/indexer.js.map +1 -1
- package/dist/apps/data/routes/receipts.d.ts +263 -263
- package/dist/apps/data/routes/receipts.d.ts.map +1 -1
- package/dist/apps/data/routes/receipts.js +11 -11
- package/dist/apps/data/routes/receipts.js.map +1 -1
- package/dist/apps/data/routes/rpc.d.ts +5 -5
- package/dist/apps/data/routes/rpc.d.ts.map +1 -1
- package/dist/apps/data/routes/rpc.js +211 -22
- package/dist/apps/data/routes/rpc.js.map +1 -1
- package/dist/apps/data/routes/tokenlist.d.ts +36 -36
- package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
- package/dist/apps/data/routes/tokenlist.js +39 -8
- package/dist/apps/data/routes/tokenlist.js.map +1 -1
- package/dist/apps/data/routes/tokens.d.ts +114 -86
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +194 -91
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +53 -53
- package/dist/apps/data/routes/transactions.d.ts.map +1 -1
- package/dist/apps/data/routes/transactions.js +78 -39
- package/dist/apps/data/routes/transactions.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +76 -27
- package/dist/apps/data/routes/transfers.d.ts.map +1 -1
- package/dist/apps/data/routes/transfers.js +165 -67
- package/dist/apps/data/routes/transfers.js.map +1 -1
- package/dist/apps/data/routes/valuation.d.ts +42 -42
- package/dist/apps/data/routes/valuation.js +2 -2
- package/dist/apps/data/routes/valuation.js.map +1 -1
- package/dist/apps/data/routes/webhooks.d.ts +369 -367
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +161 -59
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +281 -0
- package/dist/apps/data/routes/zones.d.ts.map +1 -0
- package/dist/apps/data/routes/zones.js +252 -0
- package/dist/apps/data/routes/zones.js.map +1 -0
- package/dist/apps/docs/reference.js +6 -5
- package/dist/apps/docs/reference.js.map +1 -1
- package/dist/apps/index.d.ts +2 -1
- package/dist/apps/index.d.ts.map +1 -1
- package/dist/apps/index.js +2 -1
- package/dist/apps/index.js.map +1 -1
- package/dist/apps/management/App.d.ts +670 -670
- package/dist/apps/management/Billing.d.ts +8 -0
- package/dist/apps/management/Billing.d.ts.map +1 -1
- package/dist/apps/management/Billing.js +12 -0
- package/dist/apps/management/Billing.js.map +1 -1
- package/dist/apps/management/Error.d.ts +12 -0
- package/dist/apps/management/Error.d.ts.map +1 -0
- package/dist/apps/management/Error.js +10 -0
- package/dist/apps/management/Error.js.map +1 -0
- package/dist/apps/management/routes/api-keys.d.ts +5 -5
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +2 -8
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +119 -119
- package/dist/apps/management/routes/faucet.d.ts +2 -2
- package/dist/apps/management/routes/invitations.d.ts +62 -62
- package/dist/apps/management/routes/invitations.d.ts.map +1 -1
- package/dist/apps/management/routes/invitations.js +4 -10
- package/dist/apps/management/routes/invitations.js.map +1 -1
- package/dist/apps/management/routes/invite-links.d.ts +30 -30
- package/dist/apps/management/routes/me.d.ts +6 -6
- package/dist/apps/management/routes/members.d.ts +2 -2
- package/dist/apps/management/routes/orgs.d.ts +48 -48
- package/dist/apps/management/routes/orgs.d.ts.map +1 -1
- package/dist/apps/management/routes/orgs.js +2 -8
- package/dist/apps/management/routes/orgs.js.map +1 -1
- package/dist/apps/management/routes/projects.d.ts +9 -9
- package/dist/apps/management/routes/scopes.js +2 -2
- package/dist/apps/management/routes/scopes.js.map +1 -1
- package/dist/apps/management/routes/verified-token-requests.d.ts +36 -36
- package/dist/apps/management/routes/webhooks.d.ts +50 -50
- package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/management/routes/webhooks.js +15 -3
- package/dist/apps/management/routes/webhooks.js.map +1 -1
- package/dist/apps/mpp/App.d.ts +55 -56
- package/dist/apps/mpp/App.d.ts.map +1 -1
- package/dist/apps/mpp/App.js +192 -27
- package/dist/apps/mpp/App.js.map +1 -1
- package/dist/apps/mpp/Mpp.d.ts +0 -20
- package/dist/apps/mpp/Mpp.d.ts.map +1 -1
- package/dist/apps/mpp/Mpp.js +0 -24
- package/dist/apps/mpp/Mpp.js.map +1 -1
- package/dist/apps/mpp/internal/Adapter.d.ts +40 -0
- package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Adapter.js +66 -0
- package/dist/apps/mpp/internal/Adapter.js.map +1 -0
- package/dist/apps/mpp/internal/Error.d.ts +4 -0
- package/dist/apps/mpp/internal/Error.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Error.js +41 -0
- package/dist/apps/mpp/internal/Error.js.map +1 -0
- package/dist/apps/mpp/internal/Idempotency.d.ts +33 -0
- package/dist/apps/mpp/internal/Idempotency.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Idempotency.js +28 -0
- package/dist/apps/mpp/internal/Idempotency.js.map +1 -0
- package/dist/apps/mpp/internal/Policy.d.ts +46 -0
- package/dist/apps/mpp/internal/Policy.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Policy.js +57 -0
- package/dist/apps/mpp/internal/Policy.js.map +1 -0
- package/dist/apps/mpp/internal/ScreenManager.d.ts +27 -0
- package/dist/apps/mpp/internal/ScreenManager.d.ts.map +1 -0
- package/dist/apps/mpp/internal/ScreenManager.js +18 -0
- package/dist/apps/mpp/internal/ScreenManager.js.map +1 -0
- package/dist/apps/mpp/internal/Screening.d.ts +35 -0
- package/dist/apps/mpp/internal/Screening.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Screening.js +20 -0
- package/dist/apps/mpp/internal/Screening.js.map +1 -0
- package/dist/apps/mpp/internal/Sponsorship.d.ts +36 -0
- package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Sponsorship.js +103 -0
- package/dist/apps/mpp/internal/Sponsorship.js.map +1 -0
- package/dist/apps/mpp/internal/Utils.d.ts +7 -0
- package/dist/apps/mpp/internal/Utils.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Utils.js +24 -0
- package/dist/apps/mpp/internal/Utils.js.map +1 -0
- package/dist/apps/relay/App.js +183 -23
- package/dist/apps/relay/App.js.map +1 -1
- package/dist/apps/relay/Sponsorships.d.ts +4 -0
- package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
- package/dist/apps/relay/Sponsorships.js +15 -6
- package/dist/apps/relay/Sponsorships.js.map +1 -1
- package/dist/db/Db.d.ts +20 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +342 -0
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +921 -1
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +269 -1
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/earnVaults.d.ts +68 -0
- package/dist/db/tables/earnVaults.d.ts.map +1 -0
- package/dist/db/tables/earnVaults.js +72 -0
- package/dist/db/tables/earnVaults.js.map +1 -0
- package/dist/db/tables/fundingCatalog.d.ts +56 -0
- package/dist/db/tables/fundingCatalog.d.ts.map +1 -0
- package/dist/db/tables/fundingCatalog.js +85 -0
- package/dist/db/tables/fundingCatalog.js.map +1 -0
- package/dist/db/tables/fundingDepositAddresses.d.ts +159 -0
- package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
- package/dist/db/tables/fundingDepositAddresses.js +206 -0
- package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
- package/dist/db/tables/fundingDeposits.d.ts +115 -0
- package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
- package/dist/db/tables/fundingDeposits.js +100 -0
- package/dist/db/tables/fundingDeposits.js.map +1 -0
- package/dist/db/tables/fundingIdempotency.d.ts +91 -0
- package/dist/db/tables/fundingIdempotency.d.ts.map +1 -0
- package/dist/db/tables/fundingIdempotency.js +103 -0
- package/dist/db/tables/fundingIdempotency.js.map +1 -0
- package/dist/db/tables/fundingTransferEvents.d.ts +12 -0
- package/dist/db/tables/fundingTransferEvents.d.ts.map +1 -0
- package/dist/db/tables/fundingTransferEvents.js +18 -0
- package/dist/db/tables/fundingTransferEvents.js.map +1 -0
- package/dist/db/tables/fundingTransferTransactions.d.ts +15 -0
- package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -0
- package/dist/db/tables/fundingTransferTransactions.js +27 -0
- package/dist/db/tables/fundingTransferTransactions.js.map +1 -0
- package/dist/db/tables/fundingTransfers.d.ts +82 -0
- package/dist/db/tables/fundingTransfers.d.ts.map +1 -0
- package/dist/db/tables/fundingTransfers.js +89 -0
- package/dist/db/tables/fundingTransfers.js.map +1 -0
- package/dist/db/tables/organizations.d.ts +8 -0
- package/dist/db/tables/organizations.d.ts.map +1 -1
- package/dist/db/tables/organizations.js +16 -0
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/projects.d.ts +8 -0
- package/dist/db/tables/projects.d.ts.map +1 -1
- package/dist/db/tables/projects.js +16 -0
- package/dist/db/tables/projects.js.map +1 -1
- package/dist/db/tables/requestUsage.d.ts +13 -0
- package/dist/db/tables/requestUsage.d.ts.map +1 -1
- package/dist/db/tables/requestUsage.js +16 -0
- package/dist/db/tables/requestUsage.js.map +1 -1
- package/dist/db/tables/sponsoredTransactions.d.ts +2 -2
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +1 -1
- package/dist/db/tables/sponsoredTransactions.js.map +1 -1
- package/dist/db/tables/users.d.ts +8 -0
- package/dist/db/tables/users.d.ts.map +1 -1
- package/dist/db/tables/users.js +16 -0
- package/dist/db/tables/users.js.map +1 -1
- package/dist/db/tables/verifiedTokens.d.ts +14 -7
- package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
- package/dist/db/tables/verifiedTokens.js +9 -7
- package/dist/db/tables/verifiedTokens.js.map +1 -1
- package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
- package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
- package/dist/db/tables/webhookSubscriptions.js +24 -3
- package/dist/db/tables/webhookSubscriptions.js.map +1 -1
- package/dist/handlers/relay.js +108 -108
- package/dist/handlers/relay.js.map +1 -1
- package/dist/internal/Auth.d.ts +26 -0
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +35 -2
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +16 -10
- package/dist/internal/Cache.js.map +1 -1
- package/dist/internal/Cursor.js +1 -1
- package/dist/internal/Cursor.js.map +1 -1
- package/dist/internal/EarnRates.d.ts +89 -0
- package/dist/internal/EarnRates.d.ts.map +1 -0
- package/dist/internal/EarnRates.js +266 -0
- package/dist/internal/EarnRates.js.map +1 -0
- package/dist/internal/EarnVaults.d.ts +171 -0
- package/dist/internal/EarnVaults.d.ts.map +1 -0
- package/dist/internal/EarnVaults.js +547 -0
- package/dist/internal/EarnVaults.js.map +1 -0
- package/dist/internal/EdgeCache.d.ts +8 -1
- package/dist/internal/EdgeCache.d.ts.map +1 -1
- package/dist/internal/EdgeCache.js +33 -7
- package/dist/internal/EdgeCache.js.map +1 -1
- package/dist/internal/Id.d.ts +11 -0
- package/dist/internal/Id.d.ts.map +1 -1
- package/dist/internal/Id.js +13 -0
- package/dist/internal/Id.js.map +1 -1
- package/dist/internal/Idempotency.d.ts +83 -0
- package/dist/internal/Idempotency.d.ts.map +1 -0
- package/dist/internal/Idempotency.js +113 -0
- package/dist/internal/Idempotency.js.map +1 -0
- package/dist/internal/Log.d.ts +64 -9
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +29 -7
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/MetricSink.d.ts.map +1 -1
- package/dist/internal/MetricSink.js +47 -1
- package/dist/internal/MetricSink.js.map +1 -1
- package/dist/internal/OpenApi.d.ts +1 -1
- package/dist/internal/OpenApi.d.ts.map +1 -1
- package/dist/internal/OpenApi.js +3 -0
- package/dist/internal/OpenApi.js.map +1 -1
- package/dist/internal/Provider.d.ts +14 -0
- package/dist/internal/Provider.d.ts.map +1 -0
- package/dist/internal/Provider.js +5 -0
- package/dist/internal/Provider.js.map +1 -0
- package/dist/internal/Schema.d.ts +6 -1
- package/dist/internal/Schema.d.ts.map +1 -1
- package/dist/internal/Schema.js +20 -11
- package/dist/internal/Schema.js.map +1 -1
- package/dist/internal/Store.d.ts +6 -0
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +35 -0
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/Tidx.d.ts +43 -24
- package/dist/internal/Tidx.d.ts.map +1 -1
- package/dist/internal/Tidx.js +79 -11
- package/dist/internal/Tidx.js.map +1 -1
- package/dist/internal/Viem.d.ts +82 -65
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Viem.js +83 -12
- package/dist/internal/Viem.js.map +1 -1
- package/dist/internal/WebhookDestination.d.ts.map +1 -1
- package/dist/internal/WebhookDestination.js +34 -28
- package/dist/internal/WebhookDestination.js.map +1 -1
- package/dist/internal/Webhooks.d.ts +9 -0
- package/dist/internal/Webhooks.d.ts.map +1 -1
- package/dist/internal/Webhooks.js +15 -10
- package/dist/internal/Webhooks.js.map +1 -1
- package/dist/internal/exchange/Provider.d.ts +219 -0
- package/dist/internal/exchange/Provider.d.ts.map +1 -0
- package/dist/internal/exchange/Provider.js +117 -0
- package/dist/internal/exchange/Provider.js.map +1 -0
- package/dist/internal/exchange/index.d.ts +2 -0
- package/dist/internal/exchange/index.d.ts.map +1 -0
- package/dist/internal/exchange/index.js +2 -0
- package/dist/internal/exchange/index.js.map +1 -0
- package/dist/internal/exchange/providers/uniswap.d.ts +57 -0
- package/dist/internal/exchange/providers/uniswap.d.ts.map +1 -0
- package/dist/internal/exchange/providers/uniswap.js +553 -0
- package/dist/internal/exchange/providers/uniswap.js.map +1 -0
- package/dist/internal/funding/Action.d.ts +55 -0
- package/dist/internal/funding/Action.d.ts.map +1 -0
- package/dist/internal/funding/Action.js +74 -0
- package/dist/internal/funding/Action.js.map +1 -0
- package/dist/internal/funding/Catalog.d.ts +107 -0
- package/dist/internal/funding/Catalog.d.ts.map +1 -0
- package/dist/internal/funding/Catalog.js +270 -0
- package/dist/internal/funding/Catalog.js.map +1 -0
- package/dist/internal/funding/Chain.d.ts +76 -0
- package/dist/internal/funding/Chain.d.ts.map +1 -0
- package/dist/internal/funding/Chain.js +38 -0
- package/dist/internal/funding/Chain.js.map +1 -0
- package/dist/internal/funding/Deposit.d.ts +366 -0
- package/dist/internal/funding/Deposit.d.ts.map +1 -0
- package/dist/internal/funding/Deposit.js +286 -0
- package/dist/internal/funding/Deposit.js.map +1 -0
- package/dist/internal/funding/DepositAddress.d.ts +345 -0
- package/dist/internal/funding/DepositAddress.d.ts.map +1 -0
- package/dist/internal/funding/DepositAddress.js +189 -0
- package/dist/internal/funding/DepositAddress.js.map +1 -0
- package/dist/internal/funding/Evidence.d.ts +52 -0
- package/dist/internal/funding/Evidence.d.ts.map +1 -0
- package/dist/internal/funding/Evidence.js +314 -0
- package/dist/internal/funding/Evidence.js.map +1 -0
- package/dist/internal/funding/Provider.d.ts +1186 -0
- package/dist/internal/funding/Provider.d.ts.map +1 -0
- package/dist/internal/funding/Provider.js +1081 -0
- package/dist/internal/funding/Provider.js.map +1 -0
- package/dist/internal/funding/Reconciliation.d.ts +113 -0
- package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
- package/dist/internal/funding/Reconciliation.js +676 -0
- package/dist/internal/funding/Reconciliation.js.map +1 -0
- package/dist/internal/funding/Route.d.ts +21 -0
- package/dist/internal/funding/Route.d.ts.map +1 -0
- package/dist/internal/funding/Route.js +5 -0
- package/dist/internal/funding/Route.js.map +1 -0
- package/dist/internal/funding/Subsidy.d.ts +113 -0
- package/dist/internal/funding/Subsidy.d.ts.map +1 -0
- package/dist/internal/funding/Subsidy.js +138 -0
- package/dist/internal/funding/Subsidy.js.map +1 -0
- package/dist/internal/funding/Token.d.ts +41 -0
- package/dist/internal/funding/Token.d.ts.map +1 -0
- package/dist/internal/funding/Token.js +22 -0
- package/dist/internal/funding/Token.js.map +1 -0
- package/dist/internal/funding/Transfer.d.ts +643 -0
- package/dist/internal/funding/Transfer.d.ts.map +1 -0
- package/dist/internal/funding/Transfer.js +332 -0
- package/dist/internal/funding/Transfer.js.map +1 -0
- package/dist/internal/funding/index.d.ts +13 -0
- package/dist/internal/funding/index.d.ts.map +1 -0
- package/dist/internal/funding/index.js +13 -0
- package/dist/internal/funding/index.js.map +1 -0
- package/dist/internal/funding/providers/across.d.ts +21 -0
- package/dist/internal/funding/providers/across.d.ts.map +1 -0
- package/dist/internal/funding/providers/across.js +117 -0
- package/dist/internal/funding/providers/across.js.map +1 -0
- package/dist/internal/funding/providers/relay.d.ts +46 -0
- package/dist/internal/funding/providers/relay.d.ts.map +1 -0
- package/dist/internal/funding/providers/relay.js +464 -0
- package/dist/internal/funding/providers/relay.js.map +1 -0
- package/dist/internal/funding/providers/rhino.d.ts +15 -0
- package/dist/internal/funding/providers/rhino.d.ts.map +1 -0
- package/dist/internal/funding/providers/rhino.js +116 -0
- package/dist/internal/funding/providers/rhino.js.map +1 -0
- package/dist/internal/funding/providers/squid.d.ts +19 -0
- package/dist/internal/funding/providers/squid.d.ts.map +1 -0
- package/dist/internal/funding/providers/squid.js +120 -0
- package/dist/internal/funding/providers/squid.js.map +1 -0
- package/dist/internal/funding/providers/symbiosis.d.ts +20 -0
- package/dist/internal/funding/providers/symbiosis.d.ts.map +1 -0
- package/dist/internal/funding/providers/symbiosis.js +176 -0
- package/dist/internal/funding/providers/symbiosis.js.map +1 -0
- package/dist/internal/index.d.ts +5 -1
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +5 -1
- package/dist/internal/index.js.map +1 -1
- package/dist/internal/webhookDestinations/url.js +61 -57
- package/dist/internal/webhookDestinations/url.js.map +1 -1
- package/dist/providers/index.d.ts +43 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +19 -0
- package/dist/providers/index.js.map +1 -0
- package/package.json +9 -4
- package/src/ApiKeys.test.ts +11 -7
- package/src/ApiKeys.ts +37 -9
- package/src/App.test.ts +85 -10
- package/src/App.ts +224 -137
- package/src/Assets.ts +29 -4
- package/src/Client.test-d.ts +650 -30
- package/src/Scope.test.ts +19 -0
- package/src/Scope.ts +28 -11
- package/src/Webhooks.test.ts +25 -0
- package/src/Webhooks.ts +1 -1
- package/src/admin/App.test.ts +9 -2
- package/src/admin/App.ts +32 -9
- package/src/admin/apps/api-keys.test.ts +167 -23
- package/src/admin/apps/api-keys.ts +166 -28
- package/src/admin/apps/earn-vaults.test.ts +338 -0
- package/src/admin/apps/earn-vaults.ts +572 -0
- package/src/admin/apps/scopes.test.ts +16 -1
- package/src/admin/ui/plugin.ts +2 -2
- package/src/admin/ui/src/components/EarnVaultForm.tsx +137 -0
- package/src/admin/ui/src/components/MobileProfile.tsx +2 -2
- package/src/admin/ui/src/components/Page.tsx +1 -1
- package/src/admin/ui/src/components/ThemeToggle.tsx +1 -1
- package/src/admin/ui/src/lib/api-keys.ts +37 -7
- package/src/admin/ui/src/lib/client.ts +1 -1
- package/src/admin/ui/src/lib/config.ts +1 -1
- package/src/admin/ui/src/lib/early-access.ts +8 -9
- package/src/admin/ui/src/lib/earn-vaults.ts +207 -0
- package/src/admin/ui/src/lib/format.ts +13 -0
- package/src/admin/ui/src/lib/organizations.test.ts +14 -4
- package/src/admin/ui/src/lib/organizations.ts +7 -1
- package/src/admin/ui/src/lib/response.ts +22 -0
- package/src/admin/ui/src/lib/scopes.test.ts +19 -11
- package/src/admin/ui/src/lib/scopes.ts +28 -7
- package/src/admin/ui/src/lib/verified-tokens.ts +10 -9
- package/src/admin/ui/src/routeTree.gen.ts +70 -7
- package/src/admin/ui/src/router.tsx +2 -2
- package/src/admin/ui/src/routes/__root.tsx +9 -8
- package/src/admin/ui/src/routes/api-keys.tsx +475 -64
- package/src/admin/ui/src/routes/early-access.tsx +5 -12
- package/src/admin/ui/src/routes/earn.vaults.tsx +348 -0
- package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +154 -0
- package/src/admin/ui/src/routes/earn.vaults_.new.tsx +190 -0
- package/src/admin/ui/src/routes/organizations.tsx +4 -7
- package/src/admin/ui/src/routes/organizations_.$orgId.tsx +56 -54
- package/src/admin/ui/src/routes/verified-tokens.tsx +4 -4
- package/src/admin/ui/vite.config.ts +4 -1
- package/src/admin/ui.generated.ts +113 -43
- package/src/analytics/Analytics.test.ts +69 -10
- package/src/analytics/Analytics.ts +20 -1
- package/src/analytics/tables/requestEvents.ts +79 -37
- package/src/apps/Zones.test.ts +33 -0
- package/src/apps/Zones.ts +40 -0
- package/src/apps/composition.test.ts +84 -1
- package/src/apps/data/App.test.ts +28 -11
- package/src/apps/data/App.ts +96 -33
- package/src/apps/data/FxOracle.ts +1 -1
- package/src/apps/data/index.ts +0 -1
- package/src/apps/data/routes/activities.test.ts +82 -6
- package/src/apps/data/routes/activities.ts +131 -71
- package/src/apps/data/routes/balances.test.ts +50 -37
- package/src/apps/data/routes/balances.ts +5 -5
- package/src/apps/data/routes/blocks.test.ts +2 -0
- package/src/apps/data/routes/coingecko.test.ts +22 -0
- package/src/apps/data/routes/coingecko.ts +84 -48
- package/src/apps/data/routes/earn.test.ts +1108 -0
- package/src/apps/data/routes/earn.ts +1391 -0
- package/src/apps/data/routes/exchanges.test.ts +82 -33
- package/src/apps/data/routes/exchanges.ts +842 -227
- package/src/apps/data/routes/fee-amm.test.ts +4 -6
- package/src/apps/data/routes/fee-amm.ts +69 -12
- package/src/apps/data/routes/funding.test.ts +2712 -221
- package/src/apps/data/routes/funding.ts +1604 -387
- package/src/apps/data/routes/indexer.test.ts +43 -34
- package/src/apps/data/routes/indexer.ts +19 -2
- package/src/apps/data/routes/receipts.test.ts +5 -3
- package/src/apps/data/routes/receipts.ts +13 -11
- package/src/apps/data/routes/rpc.test.ts +446 -28
- package/src/apps/data/routes/rpc.ts +243 -25
- package/src/apps/data/routes/tokenlist.ts +72 -19
- package/src/apps/data/routes/tokens.ts +258 -86
- package/src/apps/data/routes/transactions.test.ts +2 -0
- package/src/apps/data/routes/transactions.ts +77 -42
- package/src/apps/data/routes/transfers.test.ts +166 -4
- package/src/apps/data/routes/transfers.ts +216 -78
- package/src/apps/data/routes/valuation.test.ts +62 -9
- package/src/apps/data/routes/valuation.ts +2 -2
- package/src/apps/data/routes/webhooks.test.ts +386 -43
- package/src/apps/data/routes/webhooks.ts +172 -71
- package/src/apps/data/routes/zones.test.ts +473 -0
- package/src/apps/data/routes/zones.ts +338 -0
- package/src/apps/docs/reference.ts +8 -6
- package/src/apps/index.ts +2 -1
- package/src/apps/management/Billing.test.ts +29 -0
- package/src/apps/management/Billing.ts +23 -0
- package/src/apps/management/Error.ts +12 -0
- package/src/apps/management/routes/api-keys.test.ts +5 -3
- package/src/apps/management/routes/api-keys.ts +2 -9
- package/src/apps/management/routes/invitations.ts +4 -11
- package/src/apps/management/routes/orgs.ts +2 -9
- package/src/apps/management/routes/scopes.test.ts +7 -2
- package/src/apps/management/routes/scopes.ts +2 -2
- package/src/apps/management/routes/webhooks.test.ts +6 -1
- package/src/apps/management/routes/webhooks.ts +15 -3
- package/src/apps/mpp/App.ts +276 -29
- package/src/apps/mpp/Mpp.test.ts +631 -26
- package/src/apps/mpp/Mpp.ts +0 -42
- package/src/apps/mpp/internal/Adapter.ts +108 -3
- package/src/apps/mpp/internal/Error.test.ts +33 -0
- package/src/apps/mpp/internal/Error.ts +44 -6
- package/src/apps/mpp/internal/Idempotency.test.ts +213 -0
- package/src/apps/mpp/internal/Idempotency.ts +59 -5
- package/src/apps/mpp/internal/Policy.test.ts +122 -0
- package/src/apps/mpp/internal/Policy.ts +98 -0
- package/src/apps/mpp/internal/ScreenManager.test.ts +68 -0
- package/src/apps/mpp/internal/ScreenManager.ts +41 -0
- package/src/apps/mpp/internal/Screening.ts +40 -3
- package/src/apps/mpp/internal/Sponsorship.ts +144 -0
- package/src/apps/mpp/internal/Utils.ts +30 -0
- package/src/apps/relay/App.test.ts +493 -62
- package/src/apps/relay/App.ts +233 -23
- package/src/apps/relay/Sponsorships.test.ts +49 -0
- package/src/apps/relay/Sponsorships.ts +18 -6
- package/src/db/Db.ts +439 -0
- package/src/db/Schema.ts +325 -2
- package/src/db/tables/earnVaults.test.ts +185 -0
- package/src/db/tables/earnVaults.ts +151 -0
- package/src/db/tables/fundingCatalog.test.ts +108 -0
- package/src/db/tables/fundingCatalog.ts +157 -0
- package/src/db/tables/fundingDepositAddresses.test.ts +580 -0
- package/src/db/tables/fundingDepositAddresses.ts +376 -0
- package/src/db/tables/fundingDeposits.test.ts +261 -0
- package/src/db/tables/fundingDeposits.ts +229 -0
- package/src/db/tables/fundingIdempotency.test.ts +182 -0
- package/src/db/tables/fundingIdempotency.ts +180 -0
- package/src/db/tables/fundingTransferEvents.ts +28 -0
- package/src/db/tables/fundingTransferTransactions.test.ts +69 -0
- package/src/db/tables/fundingTransferTransactions.ts +37 -0
- package/src/db/tables/fundingTransfers.test.ts +89 -0
- package/src/db/tables/fundingTransfers.ts +153 -0
- package/src/db/tables/organizations.ts +16 -0
- package/src/db/tables/projects.ts +16 -0
- package/src/db/tables/requestUsage.ts +23 -0
- package/src/db/tables/sponsoredTransactions.test.ts +11 -0
- package/src/db/tables/sponsoredTransactions.ts +3 -3
- package/src/db/tables/users.ts +16 -0
- package/src/db/tables/verifiedTokens.ts +19 -14
- package/src/db/tables/webhookSubscriptions.ts +58 -3
- package/src/handlers/relay.test.ts +2 -0
- package/src/handlers/relay.ts +95 -99
- package/src/internal/Auth.test.ts +48 -0
- package/src/internal/Auth.ts +61 -2
- package/src/internal/Cache.ts +13 -9
- package/src/internal/Cursor.test.ts +2 -2
- package/src/internal/Cursor.ts +1 -1
- package/src/internal/EarnRates.test.ts +125 -0
- package/src/internal/EarnRates.ts +409 -0
- package/src/internal/EarnVaults.test.ts +195 -0
- package/src/internal/EarnVaults.ts +876 -0
- package/src/internal/EdgeCache.test.ts +19 -0
- package/src/internal/EdgeCache.ts +35 -5
- package/src/internal/Id.ts +14 -0
- package/src/internal/Idempotency.test.ts +109 -0
- package/src/internal/Idempotency.ts +237 -0
- package/src/internal/Log.test-d.ts +41 -8
- package/src/internal/Log.test.ts +189 -8
- package/src/internal/Log.ts +124 -17
- package/src/internal/MetricSink.test.ts +244 -4
- package/src/internal/MetricSink.ts +51 -1
- package/src/internal/OpenApi.ts +3 -0
- package/src/internal/Provider.test.ts +17 -0
- package/src/internal/Provider.ts +17 -0
- package/src/internal/Schema.ts +27 -17
- package/src/internal/Store.test.ts +25 -0
- package/src/internal/Store.ts +46 -0
- package/src/internal/Tidx.local.test.ts +78 -3
- package/src/internal/Tidx.test.ts +212 -18
- package/src/internal/Tidx.ts +112 -32
- package/src/internal/VerifiedTokens.test.ts +15 -0
- package/src/internal/Viem.test.ts +170 -17
- package/src/internal/Viem.ts +111 -28
- package/src/internal/WebhookDestination.ts +25 -23
- package/src/internal/Webhooks.test.ts +59 -0
- package/src/internal/Webhooks.ts +34 -10
- package/src/internal/exchange/Provider.test.ts +216 -0
- package/src/internal/exchange/Provider.ts +326 -0
- package/src/internal/exchange/index.test.ts +6 -0
- package/src/internal/exchange/index.ts +1 -0
- package/src/internal/exchange/providers/uniswap.test.ts +122 -0
- package/src/internal/exchange/providers/uniswap.ts +682 -0
- package/src/internal/funding/Action.test.ts +138 -0
- package/src/internal/funding/Action.ts +117 -0
- package/src/internal/funding/Catalog.test.ts +311 -0
- package/src/internal/funding/Catalog.ts +347 -0
- package/src/internal/funding/Chain.test.ts +79 -0
- package/src/internal/funding/Chain.ts +120 -0
- package/src/internal/funding/Deposit.test.ts +26 -0
- package/src/internal/funding/Deposit.ts +453 -0
- package/src/internal/funding/DepositAddress.test.ts +18 -0
- package/src/internal/funding/DepositAddress.ts +312 -0
- package/src/internal/funding/Evidence.test.ts +297 -0
- package/src/internal/funding/Evidence.ts +430 -0
- package/src/internal/funding/Provider.test.ts +1328 -0
- package/src/internal/funding/Provider.ts +1796 -0
- package/src/internal/funding/Reconciliation.local.test.ts +504 -0
- package/src/internal/funding/Reconciliation.test.ts +2020 -0
- package/src/internal/funding/Reconciliation.ts +930 -0
- package/src/internal/funding/Route.test.ts +66 -0
- package/src/internal/funding/Route.ts +29 -0
- package/src/internal/funding/Subsidy.local.test.ts +152 -0
- package/src/internal/funding/Subsidy.test.ts +75 -0
- package/src/internal/funding/Subsidy.ts +260 -0
- package/src/internal/funding/Token.test.ts +47 -0
- package/src/internal/funding/Token.ts +59 -0
- package/src/internal/funding/Transfer.test.ts +369 -0
- package/src/internal/funding/Transfer.ts +522 -0
- package/src/internal/funding/index.test.ts +20 -0
- package/src/internal/funding/index.ts +12 -0
- package/src/internal/funding/providers/across.ts +149 -0
- package/src/{apps/data/FundingQuoteProviders.test.ts → internal/funding/providers/index.test.ts} +178 -157
- package/src/internal/funding/providers/relay.test.ts +474 -0
- package/src/internal/funding/providers/relay.ts +559 -0
- package/src/internal/funding/providers/rhino.ts +139 -0
- package/src/internal/funding/providers/squid.ts +151 -0
- package/src/internal/funding/providers/symbiosis.ts +221 -0
- package/src/internal/index.test.ts +5 -1
- package/src/internal/index.ts +5 -1
- package/src/internal/webhookDestinations/url.ts +49 -45
- package/src/providers/index.test.ts +14 -0
- package/src/providers/index.ts +54 -0
- package/dist/apps/data/FundingQuoteProviders.d.ts +0 -174
- package/dist/apps/data/FundingQuoteProviders.d.ts.map +0 -1
- package/dist/apps/data/FundingQuoteProviders.js +0 -775
- package/dist/apps/data/FundingQuoteProviders.js.map +0 -1
- package/dist/internal/FundingQuotes.d.ts +0 -864
- package/dist/internal/FundingQuotes.d.ts.map +0 -1
- package/dist/internal/FundingQuotes.js +0 -672
- package/dist/internal/FundingQuotes.js.map +0 -1
- package/src/apps/data/FundingQuoteProviders.ts +0 -1043
- package/src/internal/FundingQuotes.test.ts +0 -456
- package/src/internal/FundingQuotes.ts +0 -944
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
import * as z from 'zod/mini'
|
|
2
|
+
|
|
3
|
+
import type * as Db from '../../db/Db.js'
|
|
4
|
+
import * as FundingTransferEvents from '../../db/tables/fundingTransferEvents.js'
|
|
5
|
+
import * as FundingTransfers from '../../db/tables/fundingTransfers.js'
|
|
6
|
+
import * as Id from '../Id.js'
|
|
7
|
+
import * as Schema from '../Schema.js'
|
|
8
|
+
import * as Action from './Action.js'
|
|
9
|
+
import * as Provider from './Provider.js'
|
|
10
|
+
|
|
11
|
+
/** Public funding transfer statuses, in the order documented by the API. */
|
|
12
|
+
export const statuses = [
|
|
13
|
+
'awaiting-source',
|
|
14
|
+
'processing',
|
|
15
|
+
'refunding',
|
|
16
|
+
'completed',
|
|
17
|
+
'refunded',
|
|
18
|
+
'action-required',
|
|
19
|
+
'expired',
|
|
20
|
+
] as const
|
|
21
|
+
|
|
22
|
+
/** Lifecycle status of a funding transfer. */
|
|
23
|
+
export type Status = (typeof statuses)[number]
|
|
24
|
+
|
|
25
|
+
/** Statuses that never change again after verified chain evidence. */
|
|
26
|
+
export const terminalStatuses = ['completed', 'expired', 'refunded'] as const satisfies readonly Status[] // prettier-ignore
|
|
27
|
+
|
|
28
|
+
/** Funding methods a caller can select at creation. */
|
|
29
|
+
export const methods = ['depositAddress', 'transaction'] as const
|
|
30
|
+
|
|
31
|
+
/** Funding method selected at creation. */
|
|
32
|
+
export type Method = (typeof methods)[number]
|
|
33
|
+
|
|
34
|
+
/** Amount modes a caller can select at creation. */
|
|
35
|
+
export const modes = ['exactDestination', 'exactSource'] as const
|
|
36
|
+
|
|
37
|
+
/** Amount mode selected at creation. */
|
|
38
|
+
export type Mode = (typeof modes)[number]
|
|
39
|
+
|
|
40
|
+
/** Customer-safe codes explaining an `action-required` or refund outcome. */
|
|
41
|
+
export const statusReasonCodes = [
|
|
42
|
+
'destination_amount_below_minimum',
|
|
43
|
+
'destination_recovered',
|
|
44
|
+
'manual_recovery_required',
|
|
45
|
+
'refund_failed',
|
|
46
|
+
'source_amount_above_maximum',
|
|
47
|
+
'source_amount_below_minimum',
|
|
48
|
+
'source_chain_mismatch',
|
|
49
|
+
'source_token_mismatch',
|
|
50
|
+
] as const
|
|
51
|
+
|
|
52
|
+
/** Stable customer-safe status reason code. */
|
|
53
|
+
export type StatusReasonCode = (typeof statusReasonCodes)[number]
|
|
54
|
+
|
|
55
|
+
// The public state chart has no exits from `action-required`, but late chain
|
|
56
|
+
// evidence or operator-triggered reconciliation may still resolve one, so
|
|
57
|
+
// evidence-driven exits stay allowed.
|
|
58
|
+
const transitions: Record<Status, readonly Status[]> = {
|
|
59
|
+
'action-required': ['completed', 'processing', 'refunded', 'refunding'],
|
|
60
|
+
'awaiting-source': ['action-required', 'expired', 'processing'],
|
|
61
|
+
completed: [],
|
|
62
|
+
expired: [],
|
|
63
|
+
processing: ['action-required', 'completed', 'refunding'],
|
|
64
|
+
refunded: [],
|
|
65
|
+
refunding: ['action-required', 'refunded'],
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Returns whether a status is terminal. */
|
|
69
|
+
export function isTerminal(status: Status): boolean {
|
|
70
|
+
return (terminalStatuses as readonly Status[]).includes(status)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** Returns whether the lifecycle allows moving from one status to another. */
|
|
74
|
+
export function canTransition(from: Status, to: Status): boolean {
|
|
75
|
+
return transitions[from].includes(to)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Generates a funding transfer id (`ftr_…`, lexically time-ordered). */
|
|
79
|
+
export function generateId(now: Date = new Date()): string {
|
|
80
|
+
return Id.generateSortable('ftr', now)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** Zod schemas owned by the funding transfer resource. */
|
|
84
|
+
export namespace schema {
|
|
85
|
+
/** Funding transfer lifecycle status. */
|
|
86
|
+
export const Status = z
|
|
87
|
+
.enum(statuses)
|
|
88
|
+
.check(
|
|
89
|
+
z.describe('Lifecycle status of the funding transfer.'),
|
|
90
|
+
z.meta({ examples: ['awaiting-source'] }),
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
/** Customer-safe explanation of a status that needs context. */
|
|
94
|
+
export const StatusReason = z
|
|
95
|
+
.object({
|
|
96
|
+
code: z
|
|
97
|
+
.enum(statusReasonCodes)
|
|
98
|
+
.check(
|
|
99
|
+
z.describe('Stable machine-readable reason code.'),
|
|
100
|
+
z.meta({ examples: ['destination_amount_below_minimum'] }),
|
|
101
|
+
),
|
|
102
|
+
message: z.string().check(
|
|
103
|
+
z.describe('Human-readable explanation of the reason.'),
|
|
104
|
+
z.meta({
|
|
105
|
+
examples: ['The verified destination amount did not satisfy the quoted minimum.'],
|
|
106
|
+
}),
|
|
107
|
+
),
|
|
108
|
+
})
|
|
109
|
+
.check(z.describe('Why the transfer is in its current status, when context is needed.'))
|
|
110
|
+
|
|
111
|
+
/** Funding method selected at creation. */
|
|
112
|
+
export const Method = z
|
|
113
|
+
.enum(methods)
|
|
114
|
+
.check(z.describe('How the caller funds the transfer.'), z.meta({ examples: ['transaction'] }))
|
|
115
|
+
|
|
116
|
+
/** Amount mode selected at creation. */
|
|
117
|
+
export const Mode = z
|
|
118
|
+
.enum(modes)
|
|
119
|
+
.check(
|
|
120
|
+
z.describe('Which side of the transfer the quoted amount fixes.'),
|
|
121
|
+
z.meta({ examples: ['exactSource'] }),
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
/** One fee applied to the transfer. */
|
|
125
|
+
export const Fee = z
|
|
126
|
+
.object({
|
|
127
|
+
amount: Schema.TokenAmount,
|
|
128
|
+
side: z
|
|
129
|
+
.enum(['destination', 'source'])
|
|
130
|
+
.check(
|
|
131
|
+
z.describe('Which side of the transfer the fee is taken from.'),
|
|
132
|
+
z.meta({ examples: ['destination'] }),
|
|
133
|
+
),
|
|
134
|
+
token: Provider.schema.TokenRef,
|
|
135
|
+
type: z
|
|
136
|
+
.enum(['provider'])
|
|
137
|
+
.check(z.describe('What the fee pays for.'), z.meta({ examples: ['provider'] })),
|
|
138
|
+
})
|
|
139
|
+
.check(z.describe('One fee applied to the transfer.'))
|
|
140
|
+
|
|
141
|
+
/** Freshness and validity window of the selected quote. */
|
|
142
|
+
export const Quote = z
|
|
143
|
+
.object({
|
|
144
|
+
expiresAt: z
|
|
145
|
+
.string()
|
|
146
|
+
.check(
|
|
147
|
+
z.describe('When the quoted terms stop being executable (ISO 8601).'),
|
|
148
|
+
z.meta({ examples: ['2026-07-30T04:01:00.000Z'] }),
|
|
149
|
+
),
|
|
150
|
+
sampledAt: z
|
|
151
|
+
.string()
|
|
152
|
+
.check(
|
|
153
|
+
z.describe('When the provider produced the quote (ISO 8601).'),
|
|
154
|
+
z.meta({ examples: ['2026-07-30T04:00:00.000Z'] }),
|
|
155
|
+
),
|
|
156
|
+
})
|
|
157
|
+
.check(z.describe('Freshness and validity window of the selected quote.'))
|
|
158
|
+
|
|
159
|
+
const hashesCheck = (description: string) => [
|
|
160
|
+
z.describe(description),
|
|
161
|
+
z.meta({ examples: [[`0x${'aa'.repeat(32)}`]] }),
|
|
162
|
+
]
|
|
163
|
+
|
|
164
|
+
const snapshotFields = {
|
|
165
|
+
destinationAmount: z.optional(Schema.TokenAmount),
|
|
166
|
+
destinationAmountMin: z.optional(Schema.TokenAmount),
|
|
167
|
+
destinationChain: Provider.schema.ChainRef,
|
|
168
|
+
destinationToken: Provider.schema.TokenRef,
|
|
169
|
+
destinationTransactionHashes: z.optional(
|
|
170
|
+
z.array(z.string()).check(...hashesCheck('Verified destination transaction references.')),
|
|
171
|
+
),
|
|
172
|
+
fees: z.array(Fee).check(z.describe('Fees applied to the transfer.')),
|
|
173
|
+
method: Method,
|
|
174
|
+
mode: Mode,
|
|
175
|
+
provider: Provider.schema.ProviderRef,
|
|
176
|
+
quote: Quote,
|
|
177
|
+
recipient: z
|
|
178
|
+
.string()
|
|
179
|
+
.check(
|
|
180
|
+
z.describe('Final beneficiary of the transfer.'),
|
|
181
|
+
z.meta({ examples: [`0x${'11'.repeat(20)}`] }),
|
|
182
|
+
),
|
|
183
|
+
refundAddress: z.optional(
|
|
184
|
+
z
|
|
185
|
+
.string()
|
|
186
|
+
.check(
|
|
187
|
+
z.describe('Source-chain refund recipient (deposit-address method).'),
|
|
188
|
+
z.meta({ examples: [`0x${'22'.repeat(20)}`] }),
|
|
189
|
+
),
|
|
190
|
+
),
|
|
191
|
+
refundAmount: z.optional(Schema.TokenAmount),
|
|
192
|
+
refundTransactionHashes: z.optional(
|
|
193
|
+
z.array(z.string()).check(...hashesCheck('Verified refund transaction references.')),
|
|
194
|
+
),
|
|
195
|
+
sender: z.optional(
|
|
196
|
+
z
|
|
197
|
+
.string()
|
|
198
|
+
.check(
|
|
199
|
+
z.describe('Source-chain account that signs the funding action (transaction method).'),
|
|
200
|
+
z.meta({ examples: [`0x${'22'.repeat(20)}`] }),
|
|
201
|
+
),
|
|
202
|
+
),
|
|
203
|
+
sourceAmount: Schema.TokenAmount,
|
|
204
|
+
sourceAmountMax: z.optional(Schema.TokenAmount),
|
|
205
|
+
sourceChain: Provider.schema.ChainRef,
|
|
206
|
+
sourceToken: Provider.schema.TokenRef,
|
|
207
|
+
sourceTransactionHashes: z.optional(
|
|
208
|
+
z.array(z.string()).check(...hashesCheck('Verified source transaction references.')),
|
|
209
|
+
),
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* The stored public snapshot: every transfer field except lifecycle columns
|
|
214
|
+
* (`id`, `status`, `statusReason`, `version`, `createdAt`, `updatedAt`),
|
|
215
|
+
* which live in typed columns and merge in at serialization.
|
|
216
|
+
*/
|
|
217
|
+
export const Snapshot = z
|
|
218
|
+
.object(snapshotFields)
|
|
219
|
+
.check(z.describe('Quote terms and reconciled public fields of a funding transfer.'))
|
|
220
|
+
|
|
221
|
+
const fundingTransferFields = {
|
|
222
|
+
createdAt: z
|
|
223
|
+
.string()
|
|
224
|
+
.check(
|
|
225
|
+
z.describe('When the transfer was created (ISO 8601).'),
|
|
226
|
+
z.meta({ examples: ['2026-07-30T04:00:00.000Z'] }),
|
|
227
|
+
),
|
|
228
|
+
destinationAmount: snapshotFields.destinationAmount,
|
|
229
|
+
destinationAmountMin: snapshotFields.destinationAmountMin,
|
|
230
|
+
destinationChain: snapshotFields.destinationChain,
|
|
231
|
+
destinationToken: snapshotFields.destinationToken,
|
|
232
|
+
destinationTransactionHashes: snapshotFields.destinationTransactionHashes,
|
|
233
|
+
fees: snapshotFields.fees,
|
|
234
|
+
id: z
|
|
235
|
+
.string()
|
|
236
|
+
.check(
|
|
237
|
+
z.describe('Funding transfer id (`ftr_…`, lexically time-ordered).'),
|
|
238
|
+
z.meta({ examples: ['ftr_001785729600000_2ZPE2gvateYEQ0dQslgvkhjx'] }),
|
|
239
|
+
),
|
|
240
|
+
method: snapshotFields.method,
|
|
241
|
+
mode: snapshotFields.mode,
|
|
242
|
+
provider: snapshotFields.provider,
|
|
243
|
+
quote: snapshotFields.quote,
|
|
244
|
+
recipient: snapshotFields.recipient,
|
|
245
|
+
refundAddress: snapshotFields.refundAddress,
|
|
246
|
+
refundAmount: snapshotFields.refundAmount,
|
|
247
|
+
refundTransactionHashes: snapshotFields.refundTransactionHashes,
|
|
248
|
+
sender: snapshotFields.sender,
|
|
249
|
+
sourceAmount: snapshotFields.sourceAmount,
|
|
250
|
+
sourceAmountMax: snapshotFields.sourceAmountMax,
|
|
251
|
+
sourceChain: snapshotFields.sourceChain,
|
|
252
|
+
sourceToken: snapshotFields.sourceToken,
|
|
253
|
+
sourceTransactionHashes: snapshotFields.sourceTransactionHashes,
|
|
254
|
+
status: Status,
|
|
255
|
+
statusReason: z.optional(StatusReason),
|
|
256
|
+
updatedAt: z
|
|
257
|
+
.string()
|
|
258
|
+
.check(
|
|
259
|
+
z.describe('When the transfer last materially changed (ISO 8601).'),
|
|
260
|
+
z.meta({ examples: ['2026-07-30T04:00:20.000Z'] }),
|
|
261
|
+
),
|
|
262
|
+
version: z
|
|
263
|
+
.number()
|
|
264
|
+
.check(
|
|
265
|
+
z.int(),
|
|
266
|
+
z.positive(),
|
|
267
|
+
z.describe('Monotonic revision that increments whenever the transfer materially changes.'),
|
|
268
|
+
z.meta({ examples: [1] }),
|
|
269
|
+
),
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/** A funding transfer as returned by reads. Reads never include `action`. */
|
|
273
|
+
export const FundingTransfer = z
|
|
274
|
+
.object(fundingTransferFields)
|
|
275
|
+
.check(z.describe('One durable funding transfer.'))
|
|
276
|
+
|
|
277
|
+
/** A created funding transfer: the read shape plus the executable action. */
|
|
278
|
+
export const CreatedFundingTransfer = z
|
|
279
|
+
.object({ action: Action.schema.Action, ...fundingTransferFields })
|
|
280
|
+
.check(z.describe('The created funding transfer, including its one-time executable action.'))
|
|
281
|
+
|
|
282
|
+
/** Request body accepted by funding transfer creation. */
|
|
283
|
+
export const CreateRequest = z
|
|
284
|
+
.strictObject({
|
|
285
|
+
amount: z
|
|
286
|
+
.string()
|
|
287
|
+
.check(
|
|
288
|
+
z.regex(/^[1-9]\d*$/),
|
|
289
|
+
z.describe('Amount in base units of the token the mode fixes.'),
|
|
290
|
+
z.meta({ examples: ['1000000'] }),
|
|
291
|
+
),
|
|
292
|
+
destinationToken: z
|
|
293
|
+
.string()
|
|
294
|
+
.check(
|
|
295
|
+
z.minLength(1),
|
|
296
|
+
z.describe('Tempo destination token symbol, contract address, or token key.'),
|
|
297
|
+
z.meta({ examples: ['pathusd'] }),
|
|
298
|
+
),
|
|
299
|
+
mode: Mode,
|
|
300
|
+
recipient: z
|
|
301
|
+
.string()
|
|
302
|
+
.check(
|
|
303
|
+
z.regex(/^0x[0-9a-fA-F]{40}$/),
|
|
304
|
+
z.describe('Final beneficiary of the transfer.'),
|
|
305
|
+
z.meta({ examples: [`0x${'11'.repeat(20)}`] }),
|
|
306
|
+
),
|
|
307
|
+
sender: z
|
|
308
|
+
.string()
|
|
309
|
+
.check(
|
|
310
|
+
z.regex(/^0x[0-9a-fA-F]{40}$/),
|
|
311
|
+
z.describe('Source-chain account that signs the funding action.'),
|
|
312
|
+
z.meta({ examples: [`0x${'22'.repeat(20)}`] }),
|
|
313
|
+
),
|
|
314
|
+
slippageBps: z.optional(
|
|
315
|
+
z
|
|
316
|
+
.number()
|
|
317
|
+
.check(
|
|
318
|
+
z.int(),
|
|
319
|
+
z.gte(0),
|
|
320
|
+
z.lte(10_000),
|
|
321
|
+
z.describe('Maximum acceptable slippage in basis points.'),
|
|
322
|
+
z.meta({ examples: [50] }),
|
|
323
|
+
),
|
|
324
|
+
),
|
|
325
|
+
sourceChain: z
|
|
326
|
+
.string()
|
|
327
|
+
.check(
|
|
328
|
+
z.describe('Source chain CAIP-2 id, slug, or alias.'),
|
|
329
|
+
z.meta({ examples: ['base', 'eip155:8453'] }),
|
|
330
|
+
),
|
|
331
|
+
sourceToken: z
|
|
332
|
+
.string()
|
|
333
|
+
.check(
|
|
334
|
+
z.minLength(1),
|
|
335
|
+
z.describe('Source token symbol, contract address, or token key.'),
|
|
336
|
+
z.meta({ examples: ['usdc'] }),
|
|
337
|
+
),
|
|
338
|
+
})
|
|
339
|
+
.check(z.describe('Funding transfer creation request.'))
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/** Stored public snapshot of a funding transfer (see {@link schema.Snapshot}). */
|
|
343
|
+
export type Snapshot = z.output<typeof schema.Snapshot>
|
|
344
|
+
|
|
345
|
+
/** Customer-safe status reason (see {@link schema.StatusReason}). */
|
|
346
|
+
export type StatusReason = z.output<typeof schema.StatusReason>
|
|
347
|
+
|
|
348
|
+
/** A funding transfer as returned by reads (see {@link schema.FundingTransfer}). */
|
|
349
|
+
export type Public = z.output<typeof schema.FundingTransfer>
|
|
350
|
+
|
|
351
|
+
/** A created funding transfer (see {@link schema.CreatedFundingTransfer}). */
|
|
352
|
+
export type Created = z.output<typeof schema.CreatedFundingTransfer>
|
|
353
|
+
|
|
354
|
+
/** A validated creation request (see {@link schema.CreateRequest}). */
|
|
355
|
+
export type CreateRequest = z.output<typeof schema.CreateRequest>
|
|
356
|
+
|
|
357
|
+
/** What an associated transaction reference evidences. */
|
|
358
|
+
export const transactionRoles = ['destination', 'refund', 'source'] as const
|
|
359
|
+
|
|
360
|
+
/** Role of a verified transaction reference on a transfer. */
|
|
361
|
+
export type TransactionRole = (typeof transactionRoles)[number]
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Creates a durable funding transfer: the row plus its version-1 event commit
|
|
365
|
+
* in one transaction, so every stored version has an immutable public record.
|
|
366
|
+
*/
|
|
367
|
+
export async function create(db: Db.Db, input: create.Input): Promise<FundingTransfers.Record> {
|
|
368
|
+
return db.transaction((tx) => createIn(tx, input))
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/**
|
|
372
|
+
* Creates the transfer row and its version-1 event inside the caller's
|
|
373
|
+
* transaction, for writes that must commit atomically with sibling state
|
|
374
|
+
* (idempotency completion).
|
|
375
|
+
*/
|
|
376
|
+
export async function createIn(tx: Db.Db, input: create.Input): Promise<FundingTransfers.Record> {
|
|
377
|
+
const now = new Date()
|
|
378
|
+
const snapshot = parseSnapshot(input.snapshot)
|
|
379
|
+
const record: FundingTransfers.Record = {
|
|
380
|
+
apiKeyId: input.apiKeyId,
|
|
381
|
+
createdAt: now.toISOString(),
|
|
382
|
+
environment: input.environment,
|
|
383
|
+
id: input.id ?? generateId(now),
|
|
384
|
+
method: snapshot.method,
|
|
385
|
+
mode: snapshot.mode,
|
|
386
|
+
orgId: input.orgId,
|
|
387
|
+
projectId: input.projectId ?? null,
|
|
388
|
+
providerId: snapshot.provider.id,
|
|
389
|
+
providerState: input.providerState ?? null,
|
|
390
|
+
quoteExpiresAt: snapshot.quote.expiresAt,
|
|
391
|
+
snapshot,
|
|
392
|
+
status: 'awaiting-source',
|
|
393
|
+
statusReason: null,
|
|
394
|
+
updatedAt: now.toISOString(),
|
|
395
|
+
version: 1,
|
|
396
|
+
}
|
|
397
|
+
const created = await FundingTransfers.insert(tx, record)
|
|
398
|
+
await FundingTransferEvents.insert(tx, {
|
|
399
|
+
createdAt: record.createdAt,
|
|
400
|
+
snapshot: toPublic(created),
|
|
401
|
+
status: created.status,
|
|
402
|
+
transferId: created.id,
|
|
403
|
+
version: created.version,
|
|
404
|
+
})
|
|
405
|
+
return created
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
export declare namespace create {
|
|
409
|
+
/** Fields required to create a funding transfer. */
|
|
410
|
+
type Input = {
|
|
411
|
+
/** API key that created the transfer. */
|
|
412
|
+
apiKeyId: string
|
|
413
|
+
/** Key environment the transfer belongs to. */
|
|
414
|
+
environment: 'production' | 'sandbox'
|
|
415
|
+
/** Transfer id override for deterministic tests. */
|
|
416
|
+
id?: string | undefined
|
|
417
|
+
/** Owning organization id (`org_…`). */
|
|
418
|
+
orgId: string
|
|
419
|
+
/** Attributed project id, when the creating key is project-attributed. */
|
|
420
|
+
projectId?: string | undefined
|
|
421
|
+
/** Private provider correlation retained for reconciliation. */
|
|
422
|
+
providerState?: Provider.prepareTransfer.Correlation | undefined
|
|
423
|
+
/** The public snapshot captured from the selected quote. */
|
|
424
|
+
snapshot: Snapshot
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* Applies a version-guarded material change: a status transition, a snapshot
|
|
430
|
+
* update, or both. The row update and its immutable event commit in one
|
|
431
|
+
* transaction; a stale `expectedVersion` or disallowed transition applies
|
|
432
|
+
* nothing, so concurrent observations cannot overwrite newer evidence.
|
|
433
|
+
*/
|
|
434
|
+
export async function transition(
|
|
435
|
+
db: Db.Db,
|
|
436
|
+
options: transition.Options,
|
|
437
|
+
): Promise<transition.Result> {
|
|
438
|
+
const now = new Date()
|
|
439
|
+
return db.transaction(async (tx) => {
|
|
440
|
+
const current = await FundingTransfers.get(tx, options.id)
|
|
441
|
+
if (!current) return { type: 'not_found' }
|
|
442
|
+
if (current.version !== options.expectedVersion) return { current, type: 'stale' }
|
|
443
|
+
const status = options.status ?? current.status
|
|
444
|
+
if (status !== current.status && !canTransition(current.status, status))
|
|
445
|
+
return { current, type: 'invalid' }
|
|
446
|
+
|
|
447
|
+
const updated = await FundingTransfers.update(tx, {
|
|
448
|
+
expectedVersion: options.expectedVersion,
|
|
449
|
+
id: options.id,
|
|
450
|
+
snapshot: options.snapshot === undefined ? current.snapshot : parseSnapshot(options.snapshot),
|
|
451
|
+
status,
|
|
452
|
+
statusReason:
|
|
453
|
+
options.statusReason ?? (status === current.status ? current.statusReason : null),
|
|
454
|
+
updatedAt: now.toISOString(),
|
|
455
|
+
version: current.version + 1,
|
|
456
|
+
})
|
|
457
|
+
if (!updated) {
|
|
458
|
+
const latest = await FundingTransfers.get(tx, options.id)
|
|
459
|
+
return latest ? { current: latest, type: 'stale' } : { type: 'not_found' }
|
|
460
|
+
}
|
|
461
|
+
await FundingTransferEvents.insert(tx, {
|
|
462
|
+
createdAt: updated.updatedAt,
|
|
463
|
+
snapshot: toPublic(updated),
|
|
464
|
+
status: updated.status,
|
|
465
|
+
transferId: updated.id,
|
|
466
|
+
version: updated.version,
|
|
467
|
+
})
|
|
468
|
+
return { record: updated, type: 'applied' }
|
|
469
|
+
})
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
export declare namespace transition {
|
|
473
|
+
/** Fields describing a material change to apply. */
|
|
474
|
+
type Options = {
|
|
475
|
+
/** The version the change was computed against. */
|
|
476
|
+
expectedVersion: number
|
|
477
|
+
/** Transfer id (`ftr_…`). */
|
|
478
|
+
id: string
|
|
479
|
+
/** Replacement public snapshot; omitted keeps the stored snapshot. */
|
|
480
|
+
snapshot?: Snapshot | undefined
|
|
481
|
+
/** New status; omitted keeps the current status (snapshot-only change). */
|
|
482
|
+
status?: Status | undefined
|
|
483
|
+
/** Customer-safe reason attached to the new status. */
|
|
484
|
+
statusReason?: StatusReason | undefined
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
/** Outcome of a guarded transition. */
|
|
488
|
+
type Result =
|
|
489
|
+
| { record: FundingTransfers.Record; type: 'applied' }
|
|
490
|
+
| { current: FundingTransfers.Record; type: 'invalid' }
|
|
491
|
+
| { current: FundingTransfers.Record; type: 'stale' }
|
|
492
|
+
| { type: 'not_found' }
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
/** Serializes a created row with its one-time executable action. */
|
|
496
|
+
export function toCreated(record: FundingTransfers.Record, action: Action.Action): Created {
|
|
497
|
+
return schema.CreatedFundingTransfer.parse({ action, ...toPublic(record) })
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/** Serializes a stored row to the public read shape. Never includes actions. */
|
|
501
|
+
export function toPublic(record: FundingTransfers.Record): Public {
|
|
502
|
+
return schema.FundingTransfer.parse({
|
|
503
|
+
...record.snapshot,
|
|
504
|
+
createdAt: record.createdAt,
|
|
505
|
+
id: record.id,
|
|
506
|
+
status: record.status,
|
|
507
|
+
...(record.statusReason === null ? {} : { statusReason: record.statusReason }),
|
|
508
|
+
updatedAt: record.updatedAt,
|
|
509
|
+
version: record.version,
|
|
510
|
+
})
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
function parseSnapshot(snapshot: Snapshot): Snapshot {
|
|
514
|
+
const parsed = schema.Snapshot.parse(snapshot)
|
|
515
|
+
return {
|
|
516
|
+
...parsed,
|
|
517
|
+
quote: {
|
|
518
|
+
...parsed.quote,
|
|
519
|
+
expiresAt: new Date(parsed.quote.expiresAt).toISOString(),
|
|
520
|
+
},
|
|
521
|
+
}
|
|
522
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as Funding from './index.js'
|
|
2
|
+
|
|
3
|
+
test('exports funding modules', () => {
|
|
4
|
+
expect(Object.keys(Funding)).toMatchInlineSnapshot(`
|
|
5
|
+
[
|
|
6
|
+
"Action",
|
|
7
|
+
"Chain",
|
|
8
|
+
"Catalog",
|
|
9
|
+
"Deposit",
|
|
10
|
+
"DepositAddress",
|
|
11
|
+
"Evidence",
|
|
12
|
+
"Provider",
|
|
13
|
+
"Reconciliation",
|
|
14
|
+
"Route",
|
|
15
|
+
"Subsidy",
|
|
16
|
+
"Token",
|
|
17
|
+
"Transfer",
|
|
18
|
+
]
|
|
19
|
+
`)
|
|
20
|
+
})
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * as Action from './Action.js'
|
|
2
|
+
export * as Chain from './Chain.js'
|
|
3
|
+
export * as Catalog from './Catalog.js'
|
|
4
|
+
export * as Deposit from './Deposit.js'
|
|
5
|
+
export * as DepositAddress from './DepositAddress.js'
|
|
6
|
+
export * as Evidence from './Evidence.js'
|
|
7
|
+
export * as Provider from './Provider.js'
|
|
8
|
+
export * as Reconciliation from './Reconciliation.js'
|
|
9
|
+
export * as Route from './Route.js'
|
|
10
|
+
export * as Subsidy from './Subsidy.js'
|
|
11
|
+
export * as Token from './Token.js'
|
|
12
|
+
export * as Transfer from './Transfer.js'
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { Address } from 'ox'
|
|
2
|
+
import * as z from 'zod/mini'
|
|
3
|
+
|
|
4
|
+
import * as FundingChain from '../Chain.js'
|
|
5
|
+
import * as FundingProvider from '../Provider.js'
|
|
6
|
+
|
|
7
|
+
const defaultBaseUrl = 'https://app.across.to/api'
|
|
8
|
+
const defaultFetch: FundingProvider.Fetch = (input, init) => globalThis.fetch(input, init)
|
|
9
|
+
|
|
10
|
+
namespace schema {
|
|
11
|
+
const IntegerString = z.string().check(z.regex(/^\d+$/))
|
|
12
|
+
|
|
13
|
+
const Token = z.object({
|
|
14
|
+
address: z.string(),
|
|
15
|
+
chainId: z.number().check(z.int(), z.nonnegative()),
|
|
16
|
+
decimals: z.number().check(z.int(), z.nonnegative()),
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
export const Quote = z.object({
|
|
20
|
+
amountType: z.literal('exactInput'),
|
|
21
|
+
expectedFillTime: z.number().check(z.int(), z.nonnegative()),
|
|
22
|
+
expectedOutputAmount: IntegerString,
|
|
23
|
+
inputAmount: IntegerString,
|
|
24
|
+
inputToken: Token,
|
|
25
|
+
minOutputAmount: IntegerString,
|
|
26
|
+
outputToken: Token,
|
|
27
|
+
quoteExpiryTimestamp: z.number().check(z.int(), z.nonnegative()),
|
|
28
|
+
})
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Creates an Across funding provider backed by `/swap/approval`. */
|
|
32
|
+
export function across(options: across.Options) {
|
|
33
|
+
if (options.apiKey.length === 0 || !/^0x[\da-fA-F]{4}$/.test(options.integratorId))
|
|
34
|
+
throw new FundingProvider.ProviderConfigurationError()
|
|
35
|
+
if (!Address.validate(options.userAddress, { strict: false }))
|
|
36
|
+
throw new FundingProvider.ProviderConfigurationError()
|
|
37
|
+
|
|
38
|
+
const endpoint = new URL(options.baseUrl ?? defaultBaseUrl)
|
|
39
|
+
endpoint.pathname = `${endpoint.pathname.replace(/\/+$/, '')}/swap/approval`
|
|
40
|
+
const fetch = options.fetch ?? defaultFetch
|
|
41
|
+
const now = options.now ?? (() => new Date())
|
|
42
|
+
|
|
43
|
+
return FundingProvider.from({
|
|
44
|
+
id: 'across',
|
|
45
|
+
name: 'Across',
|
|
46
|
+
async getQuote({ candidate, route }, signal) {
|
|
47
|
+
const destinationChainId = FundingChain.eip155Id(route.destination.chain)
|
|
48
|
+
const sourceChainId = FundingChain.eip155Id(route.source.chain)
|
|
49
|
+
const url = new URL(endpoint)
|
|
50
|
+
url.search = new URLSearchParams({
|
|
51
|
+
amount: candidate.sourceAmount.amount,
|
|
52
|
+
depositor: options.userAddress,
|
|
53
|
+
destinationChainId,
|
|
54
|
+
inputToken: candidate.sourceToken.address,
|
|
55
|
+
integratorId: options.integratorId,
|
|
56
|
+
originChainId: sourceChainId,
|
|
57
|
+
outputToken: candidate.destinationToken.address,
|
|
58
|
+
recipient: options.userAddress,
|
|
59
|
+
skipOriginTxEstimation: 'true',
|
|
60
|
+
strictTradeType: 'true',
|
|
61
|
+
tradeType: 'exactInput',
|
|
62
|
+
}).toString()
|
|
63
|
+
|
|
64
|
+
try {
|
|
65
|
+
const quote = await FundingProvider.requestJson(url, {
|
|
66
|
+
fetch,
|
|
67
|
+
headers: { Authorization: `Bearer ${options.apiKey}` },
|
|
68
|
+
signal,
|
|
69
|
+
})
|
|
70
|
+
const parsed = schema.Quote.safeParse(quote)
|
|
71
|
+
if (!parsed.success) throw new FundingProvider.ProviderPayloadError()
|
|
72
|
+
const response = parsed.data
|
|
73
|
+
const expiresAt = new Date(response.quoteExpiryTimestamp * 1_000)
|
|
74
|
+
const sampledAt = now()
|
|
75
|
+
if (
|
|
76
|
+
response.inputAmount !== candidate.sourceAmount.amount ||
|
|
77
|
+
!matchesToken(response.inputToken, sourceChainId, candidate.sourceToken) ||
|
|
78
|
+
!matchesToken(response.outputToken, destinationChainId, candidate.destinationToken) ||
|
|
79
|
+
BigInt(response.expectedOutputAmount) <= 0n ||
|
|
80
|
+
BigInt(response.minOutputAmount) <= 0n ||
|
|
81
|
+
BigInt(response.minOutputAmount) > BigInt(response.expectedOutputAmount) ||
|
|
82
|
+
Number.isNaN(expiresAt.getTime()) ||
|
|
83
|
+
response.quoteExpiryTimestamp * 1_000 <= sampledAt.getTime()
|
|
84
|
+
)
|
|
85
|
+
throw new FundingProvider.ProviderPayloadError()
|
|
86
|
+
|
|
87
|
+
return {
|
|
88
|
+
expiresAt: expiresAt.toISOString(),
|
|
89
|
+
destinationAmountMin: response.minOutputAmount,
|
|
90
|
+
destinationAmount: response.expectedOutputAmount,
|
|
91
|
+
quality: {
|
|
92
|
+
estimatedSeconds: response.expectedFillTime,
|
|
93
|
+
liquiditySource: 'providerQuote',
|
|
94
|
+
sourceDetail: 'across:swap-approval',
|
|
95
|
+
tier: 'liquid',
|
|
96
|
+
},
|
|
97
|
+
sampledAt: sampledAt.toISOString(),
|
|
98
|
+
status: 'available',
|
|
99
|
+
}
|
|
100
|
+
} catch (cause) {
|
|
101
|
+
const unavailable = FundingProvider.unavailable(cause, [
|
|
102
|
+
'AMOUNT_TOO_HIGH',
|
|
103
|
+
'AMOUNT_TOO_LOW',
|
|
104
|
+
'INSUFFICIENT_LIQUIDITY',
|
|
105
|
+
'NO_QUOTES',
|
|
106
|
+
'NO_ROUTE',
|
|
107
|
+
'UNSUPPORTED_ROUTE',
|
|
108
|
+
])
|
|
109
|
+
if (!unavailable) throw cause
|
|
110
|
+
return FundingProvider.unavailableResult({
|
|
111
|
+
detail: 'across:swap-approval',
|
|
112
|
+
message: unavailable,
|
|
113
|
+
now: now(),
|
|
114
|
+
source: 'providerQuote',
|
|
115
|
+
})
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
})
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export declare namespace across {
|
|
122
|
+
/** Across provider options. */
|
|
123
|
+
type Options = {
|
|
124
|
+
/** Across API key sent as a bearer token. */
|
|
125
|
+
apiKey: string
|
|
126
|
+
/** Override for tests or Across test environments. */
|
|
127
|
+
baseUrl?: string | undefined
|
|
128
|
+
/** Fetch implementation override for tests. */
|
|
129
|
+
fetch?: FundingProvider.Fetch | undefined
|
|
130
|
+
/** Across integrator id sent as the required query parameter. */
|
|
131
|
+
integratorId: string
|
|
132
|
+
/** Clock override for deterministic tests. */
|
|
133
|
+
now?: (() => Date) | undefined
|
|
134
|
+
/** Quote wallet address used as the Across depositor and recipient. */
|
|
135
|
+
userAddress: string
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function matchesToken(
|
|
140
|
+
token: z.output<typeof schema.Quote>['inputToken'],
|
|
141
|
+
chainId: string,
|
|
142
|
+
expected: FundingProvider.TokenRef,
|
|
143
|
+
) {
|
|
144
|
+
return (
|
|
145
|
+
token.address.toLowerCase() === expected.address.toLowerCase() &&
|
|
146
|
+
token.chainId === Number(chainId) &&
|
|
147
|
+
token.decimals === expected.decimals
|
|
148
|
+
)
|
|
149
|
+
}
|