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,347 @@
|
|
|
1
|
+
import type { Context } from 'hono'
|
|
2
|
+
import * as z from 'zod/mini'
|
|
3
|
+
|
|
4
|
+
import type * as App from '../../App.js'
|
|
5
|
+
import * as Db from '../../db/Db.js'
|
|
6
|
+
import * as db_Schema from '../../db/Schema.js'
|
|
7
|
+
import * as core_Catalog from '../../db/tables/fundingCatalog.js'
|
|
8
|
+
import * as Timing from '../Timing.js'
|
|
9
|
+
import * as Chain from './Chain.js'
|
|
10
|
+
import * as Route from './Route.js'
|
|
11
|
+
import * as Token from './Token.js'
|
|
12
|
+
import * as Transfer from './Transfer.js'
|
|
13
|
+
|
|
14
|
+
const defaultRefreshMs = 10_000
|
|
15
|
+
const emptyUpdatedAt = '1970-01-01T00:00:00.000Z'
|
|
16
|
+
const emptyVersion = 'empty'
|
|
17
|
+
|
|
18
|
+
/** Funding catalog schemas. */
|
|
19
|
+
export namespace schema {
|
|
20
|
+
const ChainId = z
|
|
21
|
+
.string()
|
|
22
|
+
.check(
|
|
23
|
+
z.regex(/^(?:eip155:\d+|solana:[^:]+|tron:[^:]+)$/),
|
|
24
|
+
z.describe('CAIP-2 funding chain identifier.'),
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
const Chain = z.extend(db_Schema.FundingChain, {
|
|
28
|
+
id: ChainId,
|
|
29
|
+
parentChainId: z.nullable(ChainId),
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
const TransferCapability = z
|
|
33
|
+
.object({
|
|
34
|
+
modes: z
|
|
35
|
+
.readonly(z.array(z.enum(Transfer.modes)))
|
|
36
|
+
.check(z.minLength(1), z.describe('Amount modes enabled for funding transfers.')),
|
|
37
|
+
})
|
|
38
|
+
.check(z.describe('Funding transfer capability enabled on one provider route.'))
|
|
39
|
+
|
|
40
|
+
/** Funding capabilities enabled on one provider route. */
|
|
41
|
+
export const Capabilities = z
|
|
42
|
+
.object({
|
|
43
|
+
depositAddress: z
|
|
44
|
+
.optional(z.literal(true))
|
|
45
|
+
.check(z.describe('Deposit-address funding support enabled on the route.')),
|
|
46
|
+
transfer: z
|
|
47
|
+
.optional(TransferCapability)
|
|
48
|
+
.check(z.describe('Funding transfer support enabled on the route.')),
|
|
49
|
+
})
|
|
50
|
+
.check(
|
|
51
|
+
z.refine(
|
|
52
|
+
(capabilities) =>
|
|
53
|
+
capabilities.depositAddress !== undefined || capabilities.transfer !== undefined,
|
|
54
|
+
),
|
|
55
|
+
z.describe('Funding capabilities enabled on one provider route.'),
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
// Absent or null `capabilities` keeps a route quote-only, so transfer and
|
|
59
|
+
// deposit-address support enable through reviewed seed edits.
|
|
60
|
+
const Route = z.extend(db_Schema.FundingRoute, {
|
|
61
|
+
capabilities: z.optional(z.nullable(Capabilities)),
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
/** Complete funding catalog content accepted by the publish boundary. */
|
|
65
|
+
export const Data = z
|
|
66
|
+
.object({
|
|
67
|
+
chainTokens: z
|
|
68
|
+
.readonly(z.array(db_Schema.FundingChainToken))
|
|
69
|
+
.check(z.describe('Chain-scoped funding tokens.')),
|
|
70
|
+
chains: z.readonly(z.array(Chain)).check(z.describe('Funding chains.')),
|
|
71
|
+
routes: z.readonly(z.array(Route)).check(z.describe('Funding provider routes.')),
|
|
72
|
+
tokens: z.readonly(z.array(db_Schema.FundingToken)).check(z.describe('Funding tokens.')),
|
|
73
|
+
})
|
|
74
|
+
.check(z.describe('Complete funding catalog content.'))
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Funding capabilities enabled on one provider route. */
|
|
78
|
+
export type Capabilities = z.output<typeof schema.Capabilities>
|
|
79
|
+
|
|
80
|
+
/** One hydrated provider route in a funding catalog snapshot. */
|
|
81
|
+
export type ProviderRoute = {
|
|
82
|
+
/** Funding capabilities; absent means the route is quote-only. */
|
|
83
|
+
capabilities?: Capabilities | undefined
|
|
84
|
+
/** Funding provider that supports the route. */
|
|
85
|
+
providerId: string
|
|
86
|
+
/** Hydrated source-to-destination funding route. */
|
|
87
|
+
route: Route.Route
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Compiled and indexed funding catalog. */
|
|
91
|
+
export type Snapshot = {
|
|
92
|
+
/** Funding chains indexed by CAIP-2 id, slug, and alias. */
|
|
93
|
+
chainsByKey: ReadonlyMap<string, Chain.Chain>
|
|
94
|
+
/** Hydrated provider routes in stable catalog order. */
|
|
95
|
+
routes: readonly ProviderRoute[]
|
|
96
|
+
/** Hydrated routes grouped by provider id. */
|
|
97
|
+
routesByProvider: ReadonlyMap<string, readonly Route.Route[]>
|
|
98
|
+
/** Canonical funding tokens indexed by stable id. */
|
|
99
|
+
tokensById: ReadonlyMap<string, Token.Token>
|
|
100
|
+
/** ISO timestamp of the catalog's last publish. */
|
|
101
|
+
updatedAt: string
|
|
102
|
+
/** Opaque catalog version. */
|
|
103
|
+
version: string
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** Compiles stored funding catalog rows into a validated snapshot. */
|
|
107
|
+
export function compile(rows: core_Catalog.Rows): Snapshot {
|
|
108
|
+
const data = normalize({
|
|
109
|
+
chainTokens: rows.chainTokens,
|
|
110
|
+
chains: rows.chains,
|
|
111
|
+
routes: rows.routes,
|
|
112
|
+
tokens: rows.tokens,
|
|
113
|
+
})
|
|
114
|
+
if (!rows.catalog && hasContent(data))
|
|
115
|
+
throw new InvalidCatalogError('Catalog content exists without a version head.')
|
|
116
|
+
|
|
117
|
+
const chainIds = new Set(data.chains.map((chain) => chain.id))
|
|
118
|
+
const chainsById = new Map<string, Chain.Chain>()
|
|
119
|
+
const chainsByKey = new Map<string, Chain.Chain>()
|
|
120
|
+
for (const row of data.chains) {
|
|
121
|
+
if (row.parentChainId && !chainIds.has(row.parentChainId))
|
|
122
|
+
throw new InvalidCatalogError(`Unknown parent chain "${row.parentChainId}".`)
|
|
123
|
+
const chain = Chain.from({
|
|
124
|
+
aliases: row.aliases,
|
|
125
|
+
id: row.id as Chain.Id,
|
|
126
|
+
name: row.name,
|
|
127
|
+
...(row.parentChainId ? { parentChainId: row.parentChainId as Chain.Id } : {}),
|
|
128
|
+
rpcUrls: row.rpcUrls,
|
|
129
|
+
slug: row.slug,
|
|
130
|
+
})
|
|
131
|
+
if (chainsById.has(chain.id)) throw new InvalidCatalogError(`Duplicate chain "${chain.id}".`)
|
|
132
|
+
chainsById.set(chain.id, chain)
|
|
133
|
+
for (const key of [chain.id, chain.slug, ...chain.aliases]) {
|
|
134
|
+
const normalized = normalizeKey(key)
|
|
135
|
+
if (chainsByKey.has(normalized))
|
|
136
|
+
throw new InvalidCatalogError(`Duplicate chain key "${key}".`)
|
|
137
|
+
chainsByKey.set(normalized, chain)
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const configs = new Map<string, Partial<Record<Chain.Id, Token.ChainConfig>>>()
|
|
142
|
+
const placements = new Set<string>()
|
|
143
|
+
const tokenIds = new Set(data.tokens.map((token) => token.id))
|
|
144
|
+
for (const row of data.chainTokens) {
|
|
145
|
+
const chain = chainsById.get(row.chainId)
|
|
146
|
+
if (!chain) throw new InvalidCatalogError(`Unknown chain "${row.chainId}" for token placement.`)
|
|
147
|
+
if (!tokenIds.has(row.tokenId))
|
|
148
|
+
throw new InvalidCatalogError(`Unknown token "${row.tokenId}" for token placement.`)
|
|
149
|
+
const placement = placementKey(row.chainId, row.tokenId)
|
|
150
|
+
if (placements.has(placement))
|
|
151
|
+
throw new InvalidCatalogError(`Duplicate token placement "${placement}".`)
|
|
152
|
+
placements.add(placement)
|
|
153
|
+
const chains = configs.get(row.tokenId) ?? {}
|
|
154
|
+
chains[chain.id] = {
|
|
155
|
+
address: row.address,
|
|
156
|
+
decimals: row.decimals,
|
|
157
|
+
...(row.name ? { name: row.name } : {}),
|
|
158
|
+
standard: row.standard,
|
|
159
|
+
}
|
|
160
|
+
configs.set(row.tokenId, chains)
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const tokensById = new Map<string, Token.Token>()
|
|
164
|
+
for (const row of data.tokens) {
|
|
165
|
+
if (tokensById.has(row.id)) throw new InvalidCatalogError(`Duplicate token "${row.id}".`)
|
|
166
|
+
tokensById.set(
|
|
167
|
+
row.id,
|
|
168
|
+
Token.from({
|
|
169
|
+
chains: configs.get(row.id) ?? {},
|
|
170
|
+
currency: row.currency,
|
|
171
|
+
name: row.name,
|
|
172
|
+
slug: row.id,
|
|
173
|
+
symbol: row.symbol,
|
|
174
|
+
}),
|
|
175
|
+
)
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const routes: ProviderRoute[] = []
|
|
179
|
+
const routesByProvider = new Map<string, Route.Route[]>()
|
|
180
|
+
for (const row of data.routes) {
|
|
181
|
+
const route = {
|
|
182
|
+
destination: resolvePlacement(
|
|
183
|
+
chainsById,
|
|
184
|
+
tokensById,
|
|
185
|
+
row.destinationChainId,
|
|
186
|
+
row.destinationTokenId,
|
|
187
|
+
),
|
|
188
|
+
source: resolvePlacement(chainsById, tokensById, row.sourceChainId, row.sourceTokenId),
|
|
189
|
+
}
|
|
190
|
+
routes.push({
|
|
191
|
+
...(row.capabilities ? { capabilities: row.capabilities } : {}),
|
|
192
|
+
providerId: row.providerId,
|
|
193
|
+
route,
|
|
194
|
+
})
|
|
195
|
+
const providerRoutes = routesByProvider.get(row.providerId)
|
|
196
|
+
if (providerRoutes) providerRoutes.push(route)
|
|
197
|
+
else routesByProvider.set(row.providerId, [route])
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
return {
|
|
201
|
+
chainsByKey,
|
|
202
|
+
routes,
|
|
203
|
+
routesByProvider,
|
|
204
|
+
tokensById,
|
|
205
|
+
updatedAt: rows.catalog?.updatedAt ?? emptyUpdatedAt,
|
|
206
|
+
version: rows.catalog?.version ?? emptyVersion,
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/** Reads and compiles the current funding catalog from Postgres. */
|
|
211
|
+
export async function read(db: Db.Db): Promise<Snapshot> {
|
|
212
|
+
return compile(await core_Catalog.read(db))
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/** Publishes a complete funding catalog and primes the current isolate. */
|
|
216
|
+
export async function publish(db: Db.Db, input: publish.Input): Promise<Snapshot> {
|
|
217
|
+
const data = normalize(input)
|
|
218
|
+
compile({
|
|
219
|
+
catalog: { id: 'default', updatedAt: emptyUpdatedAt, version: 'validation' },
|
|
220
|
+
...data,
|
|
221
|
+
})
|
|
222
|
+
// Absent `capabilities` persists as null; both mean indicative-only.
|
|
223
|
+
await core_Catalog.publish(db, {
|
|
224
|
+
...data,
|
|
225
|
+
routes: data.routes.map((route) => ({ ...route, capabilities: route.capabilities ?? null })),
|
|
226
|
+
})
|
|
227
|
+
return prime(db, await read(db))
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
export declare namespace publish {
|
|
231
|
+
/** Complete funding catalog content. */
|
|
232
|
+
type Input = z.input<typeof schema.Data>
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/** Replaces the current isolate's compiled catalog snapshot. */
|
|
236
|
+
export function prime(source: Db.Source, snapshot: Snapshot): Snapshot {
|
|
237
|
+
cells.set(source, { checkedAt: Date.now(), snapshot })
|
|
238
|
+
return snapshot
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/** Returns the current funding catalog snapshot with soft background refresh. */
|
|
242
|
+
export function snapshot(c: Context<App.Environment>): Promise<Snapshot> {
|
|
243
|
+
return Timing.time(c, 'funding_catalog', async () => {
|
|
244
|
+
const source = c.get('dbCached')
|
|
245
|
+
const cell = cells.get(source)
|
|
246
|
+
if (cell && Date.now() - cell.checkedAt < defaultRefreshMs) return cell.snapshot
|
|
247
|
+
if (cell) {
|
|
248
|
+
const pending = refresh(c, source, cell)
|
|
249
|
+
try {
|
|
250
|
+
c.executionCtx.waitUntil(pending)
|
|
251
|
+
} catch {
|
|
252
|
+
void pending
|
|
253
|
+
}
|
|
254
|
+
return cell.snapshot
|
|
255
|
+
}
|
|
256
|
+
return refresh(c, source, undefined)
|
|
257
|
+
})
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
type Cell = {
|
|
261
|
+
checkedAt: number
|
|
262
|
+
snapshot: Snapshot
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
const cells = new WeakMap<Db.Source, Cell>()
|
|
266
|
+
const refreshing = new WeakMap<Db.Source, Promise<Snapshot>>()
|
|
267
|
+
|
|
268
|
+
function refresh(c: Context<App.Environment>, source: Db.Source, current: Cell | undefined) {
|
|
269
|
+
const existing = refreshing.get(source)
|
|
270
|
+
if (existing) return existing
|
|
271
|
+
const pending = (async () => {
|
|
272
|
+
try {
|
|
273
|
+
const db = Db.get(source)
|
|
274
|
+
if (current) {
|
|
275
|
+
const head = await Timing.time(c, 'funding_catalog_head', () => core_Catalog.head(db))
|
|
276
|
+
if (!head || head.version === current.snapshot.version) {
|
|
277
|
+
cells.set(source, { checkedAt: Date.now(), snapshot: current.snapshot })
|
|
278
|
+
return current.snapshot
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
const next = await read(db)
|
|
282
|
+
cells.set(source, { checkedAt: Date.now(), snapshot: next })
|
|
283
|
+
return next
|
|
284
|
+
} catch (error) {
|
|
285
|
+
if (!current) throw error
|
|
286
|
+
console.error('[funding-catalog] refresh failed; serving last good snapshot', error)
|
|
287
|
+
cells.set(source, { checkedAt: Date.now(), snapshot: current.snapshot })
|
|
288
|
+
return current.snapshot
|
|
289
|
+
} finally {
|
|
290
|
+
refreshing.delete(source)
|
|
291
|
+
}
|
|
292
|
+
})()
|
|
293
|
+
refreshing.set(source, pending)
|
|
294
|
+
return pending
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
function hasContent(data: z.output<typeof schema.Data>) {
|
|
298
|
+
return (
|
|
299
|
+
data.chains.length > 0 ||
|
|
300
|
+
data.tokens.length > 0 ||
|
|
301
|
+
data.chainTokens.length > 0 ||
|
|
302
|
+
data.routes.length > 0
|
|
303
|
+
)
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
function normalize(input: z.input<typeof schema.Data>): z.output<typeof schema.Data> {
|
|
307
|
+
const data = schema.Data.parse(input)
|
|
308
|
+
return {
|
|
309
|
+
...data,
|
|
310
|
+
chainTokens: data.chainTokens.map((token) => ({
|
|
311
|
+
...token,
|
|
312
|
+
address: token.chainId.startsWith('eip155:') ? token.address.toLowerCase() : token.address,
|
|
313
|
+
})),
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
function normalizeKey(key: string) {
|
|
318
|
+
return key.trim().toLowerCase()
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
function placementKey(chainId: string, tokenId: string) {
|
|
322
|
+
return `${chainId}:${tokenId}`
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
function resolvePlacement(
|
|
326
|
+
chains: ReadonlyMap<string, Chain.Chain>,
|
|
327
|
+
tokens: ReadonlyMap<string, Token.Token>,
|
|
328
|
+
chainId: string,
|
|
329
|
+
tokenId: string,
|
|
330
|
+
) {
|
|
331
|
+
const chain = chains.get(chainId)
|
|
332
|
+
if (!chain) throw new InvalidCatalogError(`Unknown route chain "${chainId}".`)
|
|
333
|
+
const token = tokens.get(tokenId)
|
|
334
|
+
if (!token) throw new InvalidCatalogError(`Unknown route token "${tokenId}".`)
|
|
335
|
+
try {
|
|
336
|
+
return Token.resolve(token, chain)
|
|
337
|
+
} catch {
|
|
338
|
+
throw new InvalidCatalogError(
|
|
339
|
+
`Unknown route token placement "${placementKey(chainId, tokenId)}".`,
|
|
340
|
+
)
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/** Error thrown when funding catalog references cannot be compiled. */
|
|
345
|
+
export class InvalidCatalogError extends Error {
|
|
346
|
+
override name = 'Funding.Catalog.InvalidCatalogError'
|
|
347
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import * as Chain from './Chain.js'
|
|
2
|
+
|
|
3
|
+
describe('from', () => {
|
|
4
|
+
test('derives EVM chain metadata from an EIP-155 id', () => {
|
|
5
|
+
const chain = Chain.from({
|
|
6
|
+
aliases: ['eth'],
|
|
7
|
+
id: 'eip155:1',
|
|
8
|
+
name: 'Ethereum',
|
|
9
|
+
slug: 'ethereum',
|
|
10
|
+
})
|
|
11
|
+
expect(metadata(chain)).toMatchInlineSnapshot(`
|
|
12
|
+
{
|
|
13
|
+
"addressFormat": "hex",
|
|
14
|
+
"aliases": [
|
|
15
|
+
"eth",
|
|
16
|
+
],
|
|
17
|
+
"id": "eip155:1",
|
|
18
|
+
"kind": "evm",
|
|
19
|
+
"name": "Ethereum",
|
|
20
|
+
"slug": "ethereum",
|
|
21
|
+
}
|
|
22
|
+
`)
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
test('derives non-EVM chain metadata from the CAIP-2 namespace', () => {
|
|
26
|
+
expect(
|
|
27
|
+
[
|
|
28
|
+
Chain.from({
|
|
29
|
+
id: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',
|
|
30
|
+
name: 'Solana',
|
|
31
|
+
slug: 'solana',
|
|
32
|
+
}),
|
|
33
|
+
Chain.from({
|
|
34
|
+
id: 'tron:0x2b6653dc',
|
|
35
|
+
name: 'Tron',
|
|
36
|
+
slug: 'tron',
|
|
37
|
+
}),
|
|
38
|
+
].map(metadata),
|
|
39
|
+
).toMatchInlineSnapshot(`
|
|
40
|
+
[
|
|
41
|
+
{
|
|
42
|
+
"addressFormat": "base58",
|
|
43
|
+
"aliases": [],
|
|
44
|
+
"id": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
|
|
45
|
+
"kind": "solana",
|
|
46
|
+
"name": "Solana",
|
|
47
|
+
"slug": "solana",
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"addressFormat": "base58check",
|
|
51
|
+
"aliases": [],
|
|
52
|
+
"id": "tron:0x2b6653dc",
|
|
53
|
+
"kind": "tron",
|
|
54
|
+
"name": "Tron",
|
|
55
|
+
"slug": "tron",
|
|
56
|
+
},
|
|
57
|
+
]
|
|
58
|
+
`)
|
|
59
|
+
})
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
describe('eip155Id', () => {
|
|
63
|
+
test('returns the numeric EIP-155 chain id', () => {
|
|
64
|
+
const chain = Chain.from({ id: 'eip155:8453', name: 'Base', slug: 'base' })
|
|
65
|
+
expect(Chain.eip155Id(chain)).toBe('8453')
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
test('rejects non-EIP-155 chains', () => {
|
|
69
|
+
const chain = Chain.from({ id: 'solana:mainnet', name: 'Solana', slug: 'solana' })
|
|
70
|
+
expect(() => Chain.eip155Id(chain)).toThrowErrorMatchingInlineSnapshot(
|
|
71
|
+
`[Funding.Chain.InvalidIdError]`,
|
|
72
|
+
)
|
|
73
|
+
})
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
function metadata(chain: Chain.Chain) {
|
|
77
|
+
const { addressFormat, aliases, id, kind, name, slug } = chain
|
|
78
|
+
return { addressFormat, aliases, id, kind, name, slug }
|
|
79
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import * as Token from './Token.js'
|
|
2
|
+
|
|
3
|
+
/** Canonical identifier for a funding chain. */
|
|
4
|
+
export type Id = `eip155:${number}` | `solana:${string}` | `tron:${string}`
|
|
5
|
+
|
|
6
|
+
/** Chain metadata for a funding token. */
|
|
7
|
+
export type Chain = Callable &
|
|
8
|
+
(
|
|
9
|
+
| (Base & {
|
|
10
|
+
/** Address encoding used by accounts and tokens on the chain. */
|
|
11
|
+
addressFormat: 'hex'
|
|
12
|
+
/** Chain execution family. */
|
|
13
|
+
kind: 'evm'
|
|
14
|
+
})
|
|
15
|
+
| (Base & {
|
|
16
|
+
/** Address encoding used by accounts and tokens on the chain. */
|
|
17
|
+
addressFormat: 'base58'
|
|
18
|
+
/** Chain execution family. */
|
|
19
|
+
kind: 'solana'
|
|
20
|
+
})
|
|
21
|
+
| (Base & {
|
|
22
|
+
/** Address encoding used by accounts and tokens on the chain. */
|
|
23
|
+
addressFormat: 'base58check'
|
|
24
|
+
/** Chain execution family. */
|
|
25
|
+
kind: 'tron'
|
|
26
|
+
})
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
type Callable = (options: Callable.Options) => Selection
|
|
30
|
+
|
|
31
|
+
declare namespace Callable {
|
|
32
|
+
/** Tokens selected for a funding route on this chain. */
|
|
33
|
+
type Options = {
|
|
34
|
+
/** Token definitions to resolve on the chain. */
|
|
35
|
+
tokens: readonly Token.Token[]
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Tokens resolved for one funding chain. */
|
|
40
|
+
export type Selection = {
|
|
41
|
+
/** Chain shared by every selected token. */
|
|
42
|
+
chain: Chain
|
|
43
|
+
/** Chain-scoped funding tokens. */
|
|
44
|
+
tokens: readonly Token.Resolved[]
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
type Base = {
|
|
48
|
+
/** Caller-facing aliases accepted for this chain. */
|
|
49
|
+
aliases: readonly string[]
|
|
50
|
+
/** CAIP-2 chain identifier. */
|
|
51
|
+
id: Id
|
|
52
|
+
/** Human-readable chain name. */
|
|
53
|
+
name: string
|
|
54
|
+
/** Parent chain identifier when this chain is a Zone. */
|
|
55
|
+
parentChainId?: Id | undefined
|
|
56
|
+
/** Public RPC endpoints used for funding-chain evidence. */
|
|
57
|
+
rpcUrls: readonly string[]
|
|
58
|
+
/** Stable chain segment used in quote identifiers. */
|
|
59
|
+
slug: string
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Creates funding chain metadata from a CAIP-2 identifier. */
|
|
63
|
+
export function from(options: from.Options): Chain {
|
|
64
|
+
const { aliases = [], id, name, parentChainId, rpcUrls = [], slug } = options
|
|
65
|
+
const base = { aliases, id, name, ...(parentChainId ? { parentChainId } : {}), rpcUrls, slug }
|
|
66
|
+
const metadata = (() => {
|
|
67
|
+
if (id.startsWith('eip155:')) return { ...base, addressFormat: 'hex', kind: 'evm' } as const
|
|
68
|
+
if (id.startsWith('solana:'))
|
|
69
|
+
return { ...base, addressFormat: 'base58', kind: 'solana' } as const
|
|
70
|
+
if (id.startsWith('tron:'))
|
|
71
|
+
return { ...base, addressFormat: 'base58check', kind: 'tron' } as const
|
|
72
|
+
throw new InvalidIdError()
|
|
73
|
+
})()
|
|
74
|
+
function select(parameters: Callable.Options): Selection {
|
|
75
|
+
const chain = select as Chain
|
|
76
|
+
return {
|
|
77
|
+
chain,
|
|
78
|
+
tokens: parameters.tokens.map((token) => Token.resolve(token, chain)),
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return Object.defineProperties(
|
|
82
|
+
select,
|
|
83
|
+
Object.fromEntries(
|
|
84
|
+
Object.entries(metadata).map(([key, value]) => [
|
|
85
|
+
key,
|
|
86
|
+
{ configurable: true, enumerable: true, value },
|
|
87
|
+
]),
|
|
88
|
+
),
|
|
89
|
+
) as Chain
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export declare namespace from {
|
|
93
|
+
/** Funding chain definition. */
|
|
94
|
+
type Options = {
|
|
95
|
+
/** Additional caller-facing aliases accepted for this chain. */
|
|
96
|
+
aliases?: readonly string[] | undefined
|
|
97
|
+
/** CAIP-2 chain identifier. */
|
|
98
|
+
id: Id
|
|
99
|
+
/** Human-readable chain name. */
|
|
100
|
+
name: string
|
|
101
|
+
/** Parent chain identifier when this chain is a Zone. */
|
|
102
|
+
parentChainId?: Id | undefined
|
|
103
|
+
/** Public RPC endpoints used for funding-chain evidence. */
|
|
104
|
+
rpcUrls?: readonly string[] | undefined
|
|
105
|
+
/** Stable chain segment used in quote identifiers. */
|
|
106
|
+
slug: string
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** Returns the numeric portion of an EIP-155 CAIP-2 chain identifier. */
|
|
111
|
+
export function eip155Id(chain: Chain): string {
|
|
112
|
+
const match = /^eip155:(\d+)$/.exec(chain.id)
|
|
113
|
+
if (!match?.[1]) throw new InvalidIdError()
|
|
114
|
+
return match[1]
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** Error thrown when a funding chain identifier is invalid for an operation. */
|
|
118
|
+
export class InvalidIdError extends Error {
|
|
119
|
+
override name = 'Funding.Chain.InvalidIdError'
|
|
120
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as Deposit from './Deposit.js'
|
|
2
|
+
|
|
3
|
+
describe('generateId', () => {
|
|
4
|
+
test('embeds the timestamp so lexical order is chronological', () => {
|
|
5
|
+
const earlier = Deposit.generateId(new Date('2026-01-01T00:00:00.000Z'))
|
|
6
|
+
const later = Deposit.generateId(new Date('2026-01-01T00:00:01.000Z'))
|
|
7
|
+
expect(earlier).toMatch(/^fdp_\d{15}_[0-9A-Za-z]{24}$/)
|
|
8
|
+
expect(earlier < later).toBe(true)
|
|
9
|
+
})
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
describe('isTerminal', () => {
|
|
13
|
+
test('recognizes only completed and refunded deposits', () => {
|
|
14
|
+
expect(Deposit.statuses.filter(Deposit.isTerminal)).toEqual(['completed', 'refunded'])
|
|
15
|
+
})
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
describe('canTransition', () => {
|
|
19
|
+
test('allows evidence-driven progress and prevents terminal exits', () => {
|
|
20
|
+
expect(Deposit.canTransition('detected', 'bridging')).toBe(true)
|
|
21
|
+
expect(Deposit.canTransition('bridging', 'settling')).toBe(true)
|
|
22
|
+
expect(Deposit.canTransition('settling', 'completed')).toBe(true)
|
|
23
|
+
expect(Deposit.canTransition('completed', 'refunding')).toBe(false)
|
|
24
|
+
expect(Deposit.canTransition('refunded', 'bridging')).toBe(false)
|
|
25
|
+
})
|
|
26
|
+
})
|