tapimo 0.7.1 → 0.8.0
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/README.md +10 -7
- package/dist/ApiKey.d.ts +3 -0
- package/dist/ApiKey.d.ts.map +1 -1
- package/dist/ApiKey.js +10 -0
- package/dist/ApiKey.js.map +1 -1
- package/dist/ApiKeys.d.ts +29 -8
- package/dist/ApiKeys.d.ts.map +1 -1
- package/dist/ApiKeys.js +24 -5
- package/dist/ApiKeys.js.map +1 -1
- package/dist/App.d.ts +20680 -15487
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +250 -129
- 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 +667 -76
- 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 +107 -11
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +145 -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/organizations.d.ts +2 -0
- package/dist/admin/apps/organizations.d.ts.map +1 -1
- package/dist/admin/apps/verified-tokens.d.ts +74 -74
- 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 +4 -0
- package/dist/analytics/Analytics.d.ts.map +1 -1
- package/dist/analytics/Analytics.js +21 -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 +5666 -3934
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/App.js +90 -22
- 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 +56 -56
- 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 +65 -65
- package/dist/apps/data/routes/balances.d.ts +14 -14
- package/dist/apps/data/routes/balances.js +5 -5
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/blocks.d.ts +39 -39
- package/dist/apps/data/routes/coingecko.d.ts +54 -54
- 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 +2574 -0
- package/dist/apps/data/routes/earn.d.ts.map +1 -0
- package/dist/apps/data/routes/earn.js +1574 -0
- package/dist/apps/data/routes/earn.js.map +1 -0
- package/dist/apps/data/routes/exchanges.d.ts +1626 -719
- 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/indexer.d.ts +35 -35
- package/dist/apps/data/routes/indexer.d.ts.map +1 -1
- package/dist/apps/data/routes/indexer.js +23 -3
- package/dist/apps/data/routes/indexer.js.map +1 -1
- package/dist/apps/data/routes/receipts.d.ts +33 -33
- 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 +6 -6
- package/dist/apps/data/routes/rpc.d.ts.map +1 -1
- package/dist/apps/data/routes/rpc.js +214 -22
- package/dist/apps/data/routes/rpc.js.map +1 -1
- package/dist/apps/data/routes/tokenlist.d.ts +1 -1
- 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 +115 -87
- 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 +54 -54
- 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/verified-tokens.d.ts +36 -36
- package/dist/apps/data/routes/webhooks.d.ts +370 -368
- 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/funding/Access.d.ts +16 -0
- package/dist/apps/funding/Access.d.ts.map +1 -0
- package/dist/apps/funding/Access.js +22 -0
- package/dist/apps/funding/Access.js.map +1 -0
- package/dist/apps/funding/App.d.ts +3183 -0
- package/dist/apps/funding/App.d.ts.map +1 -0
- package/dist/apps/funding/App.js +46 -0
- package/dist/apps/funding/App.js.map +1 -0
- package/dist/apps/funding/Inventory.d.ts +5 -0
- package/dist/apps/funding/Inventory.d.ts.map +1 -0
- package/dist/apps/funding/Inventory.js +25 -0
- package/dist/apps/funding/Inventory.js.map +1 -0
- package/dist/apps/funding/ProviderAttempts.d.ts +5 -0
- package/dist/apps/funding/ProviderAttempts.d.ts.map +1 -0
- package/dist/apps/funding/ProviderAttempts.js +24 -0
- package/dist/apps/funding/ProviderAttempts.js.map +1 -0
- package/dist/apps/funding/index.d.ts +2 -0
- package/dist/apps/funding/index.d.ts.map +1 -0
- package/dist/apps/funding/index.js +2 -0
- package/dist/apps/funding/index.js.map +1 -0
- package/dist/apps/funding/routes/chains.d.ts +169 -0
- package/dist/apps/funding/routes/chains.d.ts.map +1 -0
- package/dist/apps/funding/routes/chains.js +80 -0
- package/dist/apps/funding/routes/chains.js.map +1 -0
- package/dist/apps/funding/routes/deposit-addresses.d.ts +2388 -0
- package/dist/apps/funding/routes/deposit-addresses.d.ts.map +1 -0
- package/dist/apps/funding/routes/deposit-addresses.js +860 -0
- package/dist/apps/funding/routes/deposit-addresses.js.map +1 -0
- package/dist/apps/funding/routes/providers.d.ts +91 -0
- package/dist/apps/funding/routes/providers.d.ts.map +1 -0
- package/dist/apps/funding/routes/providers.js +56 -0
- package/dist/apps/funding/routes/providers.js.map +1 -0
- package/dist/apps/{data/routes/funding.d.ts → funding/routes/quotes.d.ts} +26 -396
- package/dist/apps/funding/routes/quotes.d.ts.map +1 -0
- package/dist/apps/funding/routes/quotes.js +188 -0
- package/dist/apps/funding/routes/quotes.js.map +1 -0
- package/dist/apps/funding/routes/transfers.d.ts +1999 -0
- package/dist/apps/funding/routes/transfers.d.ts.map +1 -0
- package/dist/apps/funding/routes/transfers.js +614 -0
- package/dist/apps/funding/routes/transfers.js.map +1 -0
- package/dist/apps/index.d.ts +3 -1
- package/dist/apps/index.d.ts.map +1 -1
- package/dist/apps/index.js +3 -1
- package/dist/apps/index.js.map +1 -1
- package/dist/apps/management/App.d.ts +839 -574
- package/dist/apps/management/App.d.ts.map +1 -1
- 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 +296 -19
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +77 -9
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +119 -119
- package/dist/apps/management/routes/faucet.d.ts +35 -35
- package/dist/apps/management/routes/invitations.d.ts +17 -17
- 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 +38 -38
- package/dist/apps/management/routes/me.d.ts +6 -6
- package/dist/apps/management/routes/members.d.ts +69 -69
- package/dist/apps/management/routes/orgs.d.ts +16 -16
- 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 +19 -19
- package/dist/apps/management/routes/scopes.d.ts +1 -1
- package/dist/apps/management/routes/scopes.js +2 -2
- package/dist/apps/management/routes/scopes.js.map +1 -1
- package/dist/apps/management/routes/usage.d.ts +72 -72
- package/dist/apps/management/routes/verified-token-requests.d.ts +18 -18
- package/dist/apps/management/routes/webhooks.d.ts +122 -122
- 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/mcp.d.ts +2 -3
- package/dist/apps/mcp.d.ts.map +1 -1
- package/dist/apps/mcp.js +16 -14
- package/dist/apps/mcp.js.map +1 -1
- package/dist/apps/metadata.d.ts +4 -0
- package/dist/apps/metadata.d.ts.map +1 -1
- package/dist/apps/metadata.js +10 -0
- package/dist/apps/metadata.js.map +1 -1
- package/dist/apps/mpp/App.d.ts +57 -58
- 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/cloudflare.d.ts +50 -0
- package/dist/cloudflare.d.ts.map +1 -1
- package/dist/cloudflare.js +178 -0
- package/dist/cloudflare.js.map +1 -1
- package/dist/db/Db.d.ts +22 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +379 -0
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +933 -1
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +289 -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 +172 -0
- package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
- package/dist/db/tables/fundingDepositAddresses.js +218 -0
- package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
- package/dist/db/tables/fundingDepositRequestObservations.d.ts +45 -0
- package/dist/db/tables/fundingDepositRequestObservations.d.ts.map +1 -0
- package/dist/db/tables/fundingDepositRequestObservations.js +46 -0
- package/dist/db/tables/fundingDepositRequestObservations.js.map +1 -0
- package/dist/db/tables/fundingDeposits.d.ts +171 -0
- package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
- package/dist/db/tables/fundingDeposits.js +182 -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 +37 -11
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +75 -16
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +17 -11
- 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 +10 -3
- package/dist/internal/EdgeCache.d.ts.map +1 -1
- package/dist/internal/EdgeCache.js +43 -11
- 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/IpAllowlist.d.ts +15 -0
- package/dist/internal/IpAllowlist.d.ts.map +1 -0
- package/dist/internal/IpAllowlist.js +27 -0
- package/dist/internal/IpAllowlist.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 +2 -2
- package/dist/internal/OpenApi.d.ts.map +1 -1
- package/dist/internal/OpenApi.js +4 -1
- 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 +49 -24
- package/dist/internal/Tidx.d.ts.map +1 -1
- package/dist/internal/Tidx.js +90 -12
- package/dist/internal/Tidx.js.map +1 -1
- package/dist/internal/Viem.d.ts +90 -65
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Viem.js +90 -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 +408 -0
- package/dist/internal/funding/Deposit.d.ts.map +1 -0
- package/dist/internal/funding/Deposit.js +318 -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 +48 -0
- package/dist/internal/funding/Evidence.d.ts.map +1 -0
- package/dist/internal/funding/Evidence.js +315 -0
- package/dist/internal/funding/Evidence.js.map +1 -0
- package/dist/internal/funding/Provider.d.ts +1288 -0
- package/dist/internal/funding/Provider.d.ts.map +1 -0
- package/dist/internal/funding/Provider.js +1086 -0
- package/dist/internal/funding/Provider.js.map +1 -0
- package/dist/internal/funding/Reconciliation.d.ts +127 -0
- package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
- package/dist/internal/funding/Reconciliation.js +885 -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/SourceObservation.d.ts +108 -0
- package/dist/internal/funding/SourceObservation.d.ts.map +1 -0
- package/dist/internal/funding/SourceObservation.js +143 -0
- package/dist/internal/funding/SourceObservation.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 +14 -0
- package/dist/internal/funding/index.d.ts.map +1 -0
- package/dist/internal/funding/index.js +14 -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 +88 -0
- package/dist/internal/funding/providers/relay.d.ts.map +1 -0
- package/dist/internal/funding/providers/relay.js +871 -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 +10 -5
- package/src/ApiKey.test.ts +35 -0
- package/src/ApiKey.ts +27 -0
- package/src/ApiKeys.test.ts +40 -7
- package/src/ApiKeys.ts +46 -10
- package/src/App.test.ts +108 -15
- package/src/App.ts +296 -138
- package/src/Assets.ts +29 -4
- package/src/Client.test-d.ts +809 -37
- 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 +190 -22
- package/src/admin/apps/api-keys.ts +170 -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 +24 -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 +184 -3
- package/src/apps/data/App.test.ts +28 -23
- package/src/apps/data/App.ts +95 -36
- 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 +1391 -0
- package/src/apps/data/routes/earn.ts +2188 -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/indexer.test.ts +43 -34
- package/src/apps/data/routes/indexer.ts +21 -3
- 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 +245 -25
- package/src/apps/data/routes/tokenlist.ts +72 -19
- package/src/apps/data/routes/tokens.test.ts +6 -8
- 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/funding/Access.ts +26 -0
- package/src/apps/funding/App.test.ts +78 -0
- package/src/apps/funding/App.ts +63 -0
- package/src/apps/funding/Inventory.ts +30 -0
- package/src/apps/funding/ProviderAttempts.ts +26 -0
- package/src/apps/funding/index.ts +1 -0
- package/src/apps/funding/routes/chains.test.ts +78 -0
- package/src/apps/funding/routes/chains.ts +101 -0
- package/src/apps/funding/routes/deposit-addresses.test.ts +1628 -0
- package/src/apps/funding/routes/deposit-addresses.ts +1015 -0
- package/src/apps/funding/routes/providers.test.ts +165 -0
- package/src/apps/funding/routes/providers.ts +73 -0
- package/src/apps/funding/routes/quotes.test.ts +511 -0
- package/src/apps/funding/routes/quotes.ts +205 -0
- package/src/apps/funding/routes/transfers.test.ts +1255 -0
- package/src/apps/funding/routes/transfers.ts +704 -0
- package/src/apps/index.ts +3 -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 +103 -3
- package/src/apps/management/routes/api-keys.ts +98 -10
- 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/mcp.test.ts +17 -2
- package/src/apps/mcp.ts +18 -13
- package/src/apps/metadata.ts +12 -0
- 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 +128 -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/cloudflare.ts +279 -0
- package/src/db/Db.ts +501 -0
- package/src/db/Schema.ts +349 -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 +404 -0
- package/src/db/tables/fundingDepositRequestObservations.test.ts +106 -0
- package/src/db/tables/fundingDepositRequestObservations.ts +99 -0
- package/src/db/tables/fundingDeposits.test.ts +399 -0
- package/src/db/tables/fundingDeposits.ts +373 -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 +225 -5
- package/src/internal/Auth.ts +109 -20
- package/src/internal/Cache.test.ts +37 -3
- package/src/internal/Cache.ts +14 -10
- 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 +26 -7
- package/src/internal/EdgeCache.ts +48 -9
- 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/IpAllowlist.test.ts +52 -0
- package/src/internal/IpAllowlist.ts +39 -0
- package/src/internal/Log.test-d.ts +41 -8
- package/src/internal/Log.test.ts +196 -9
- 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 +4 -1
- 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 +240 -18
- package/src/internal/Tidx.ts +129 -33
- package/src/internal/VerifiedTokens.test.ts +15 -0
- package/src/internal/Viem.test.ts +198 -17
- package/src/internal/Viem.ts +127 -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 +522 -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 +425 -0
- package/src/internal/funding/Provider.test.ts +1328 -0
- package/src/internal/funding/Provider.ts +1911 -0
- package/src/internal/funding/Reconciliation.local.test.ts +511 -0
- package/src/internal/funding/Reconciliation.test.ts +3037 -0
- package/src/internal/funding/Reconciliation.ts +1202 -0
- package/src/internal/funding/Route.test.ts +66 -0
- package/src/internal/funding/Route.ts +29 -0
- package/src/internal/funding/SourceObservation.test.ts +301 -0
- package/src/internal/funding/SourceObservation.ts +267 -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 +21 -0
- package/src/internal/funding/index.ts +13 -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 +564 -0
- package/src/internal/funding/providers/relay.ts +1060 -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/apps/data/routes/funding.d.ts.map +0 -1
- package/dist/apps/data/routes/funding.js +0 -410
- package/dist/apps/data/routes/funding.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/apps/data/routes/funding.test.ts +0 -503
- package/src/apps/data/routes/funding.ts +0 -604
- package/src/internal/FundingQuotes.test.ts +0 -456
- package/src/internal/FundingQuotes.ts +0 -944
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import type { Selectable } from 'kysely'
|
|
2
|
+
|
|
3
|
+
import type * as Db from '../Db.js'
|
|
4
|
+
import type * as db_Schema from '../Schema.js'
|
|
5
|
+
|
|
6
|
+
/** Columns of the `funding_idempotency_requests` table. */
|
|
7
|
+
export type Table = db_Schema.FundingIdempotencyRequest
|
|
8
|
+
/** A stored idempotency claim. */
|
|
9
|
+
export type Record = Selectable<Table>
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Claims `(apiKeyId, keyHash)` for one creation attempt. A live claim rejects
|
|
13
|
+
* mismatches, blocks pending work, resumes checkpoints, or replays completion.
|
|
14
|
+
*/
|
|
15
|
+
export async function claim(db: Db.Db, input: claim.Input): Promise<claim.Result> {
|
|
16
|
+
const now = new Date()
|
|
17
|
+
const record: Record = {
|
|
18
|
+
apiKeyId: input.apiKeyId,
|
|
19
|
+
createdAt: now.toISOString(),
|
|
20
|
+
expiresAt: new Date(now.getTime() + input.ttlMs).toISOString(),
|
|
21
|
+
keyHash: input.keyHash,
|
|
22
|
+
requestHash: input.requestHash,
|
|
23
|
+
response: null,
|
|
24
|
+
status: 'pending',
|
|
25
|
+
transferId: null,
|
|
26
|
+
}
|
|
27
|
+
const inserted = await db.kysely
|
|
28
|
+
.insertInto('funding_idempotency_requests')
|
|
29
|
+
.values(record)
|
|
30
|
+
.onConflict((oc) => oc.columns(['apiKeyId', 'keyHash']).doNothing())
|
|
31
|
+
.returningAll()
|
|
32
|
+
.executeTakeFirst()
|
|
33
|
+
if (inserted) return { createdAt: inserted.createdAt, type: 'claimed' }
|
|
34
|
+
|
|
35
|
+
// Reclaim an expired row in place; the guard keeps two callers from both
|
|
36
|
+
// reclaiming (only one UPDATE matches the still-expired predicate).
|
|
37
|
+
const reclaimed = await db.kysely
|
|
38
|
+
.updateTable('funding_idempotency_requests')
|
|
39
|
+
.set(record)
|
|
40
|
+
.where('apiKeyId', '=', input.apiKeyId)
|
|
41
|
+
.where('keyHash', '=', input.keyHash)
|
|
42
|
+
.where('expiresAt', '<=', now.toISOString())
|
|
43
|
+
.returningAll()
|
|
44
|
+
.executeTakeFirst()
|
|
45
|
+
if (reclaimed) return { createdAt: reclaimed.createdAt, type: 'claimed' }
|
|
46
|
+
|
|
47
|
+
const existing = await db.kysely
|
|
48
|
+
.selectFrom('funding_idempotency_requests')
|
|
49
|
+
.selectAll()
|
|
50
|
+
.where('apiKeyId', '=', input.apiKeyId)
|
|
51
|
+
.where('keyHash', '=', input.keyHash)
|
|
52
|
+
.executeTakeFirst()
|
|
53
|
+
// The row vanished between the insert and the read (released claim); retry.
|
|
54
|
+
if (!existing) return claim(db, input)
|
|
55
|
+
if (existing.requestHash !== input.requestHash) return { type: 'mismatch' }
|
|
56
|
+
if (existing.status === 'pending') return { type: 'pending' }
|
|
57
|
+
if (existing.status === 'provisioned')
|
|
58
|
+
return {
|
|
59
|
+
createdAt: existing.createdAt,
|
|
60
|
+
response: existing.response ?? '',
|
|
61
|
+
type: 'resume',
|
|
62
|
+
}
|
|
63
|
+
return { response: existing.response ?? '', type: 'replay' }
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export declare namespace claim {
|
|
67
|
+
/** Claim identity and retention. */
|
|
68
|
+
type Input = {
|
|
69
|
+
/** API key id (`key_…`) the claim is scoped to. */
|
|
70
|
+
apiKeyId: string
|
|
71
|
+
/** SHA-256 of the caller Idempotency-Key. */
|
|
72
|
+
keyHash: string
|
|
73
|
+
/** SHA-256 fingerprint of the canonical validated request. */
|
|
74
|
+
requestHash: string
|
|
75
|
+
/** Lease duration for the pending execution, in milliseconds. */
|
|
76
|
+
ttlMs: number
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Outcome of a claim attempt. */
|
|
80
|
+
type Result =
|
|
81
|
+
| { createdAt: string; type: 'claimed' }
|
|
82
|
+
| { type: 'mismatch' }
|
|
83
|
+
| { type: 'pending' }
|
|
84
|
+
| { response: string; type: 'replay' }
|
|
85
|
+
| { createdAt: string; response: string; type: 'resume' }
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Stores a provider result before committing its API resource and replay response. */
|
|
89
|
+
export function checkpoint(db: Db.Db, input: checkpoint.Input): Promise<Record | undefined> {
|
|
90
|
+
const now = new Date()
|
|
91
|
+
return db.kysely
|
|
92
|
+
.updateTable('funding_idempotency_requests')
|
|
93
|
+
.set({
|
|
94
|
+
expiresAt: new Date(now.getTime() + input.replayTtlMs).toISOString(),
|
|
95
|
+
response: input.response,
|
|
96
|
+
status: 'provisioned',
|
|
97
|
+
})
|
|
98
|
+
.where('apiKeyId', '=', input.apiKeyId)
|
|
99
|
+
.where('createdAt', '=', input.createdAt)
|
|
100
|
+
.where('keyHash', '=', input.keyHash)
|
|
101
|
+
.where('status', '=', 'pending')
|
|
102
|
+
.returningAll()
|
|
103
|
+
.executeTakeFirst()
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export declare namespace checkpoint {
|
|
107
|
+
/** Provider result and owned claim required for durable recovery. */
|
|
108
|
+
type Input = {
|
|
109
|
+
/** API key id (`key_…`) the claim is scoped to. */
|
|
110
|
+
apiKeyId: string
|
|
111
|
+
/** Creation time returned by the successful claim. */
|
|
112
|
+
createdAt: string
|
|
113
|
+
/** SHA-256 of the caller Idempotency-Key. */
|
|
114
|
+
keyHash: string
|
|
115
|
+
/** Recovery checkpoint retention in milliseconds. */
|
|
116
|
+
replayTtlMs: number
|
|
117
|
+
/** Serialized provider result required to resume resource creation. */
|
|
118
|
+
response: string
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** Completes an owned pending or provisioned claim with its replay response. */
|
|
123
|
+
export function complete(db: Db.Db, input: complete.Input): Promise<Record | undefined> {
|
|
124
|
+
const now = new Date()
|
|
125
|
+
return db.kysely
|
|
126
|
+
.updateTable('funding_idempotency_requests')
|
|
127
|
+
.set({
|
|
128
|
+
expiresAt: new Date(now.getTime() + input.replayTtlMs).toISOString(),
|
|
129
|
+
response: input.response,
|
|
130
|
+
status: 'completed',
|
|
131
|
+
transferId: input.transferId ?? null,
|
|
132
|
+
})
|
|
133
|
+
.where('apiKeyId', '=', input.apiKeyId)
|
|
134
|
+
.where('createdAt', '=', input.createdAt)
|
|
135
|
+
.where('keyHash', '=', input.keyHash)
|
|
136
|
+
.where('status', 'in', ['pending', 'provisioned'])
|
|
137
|
+
.returningAll()
|
|
138
|
+
.executeTakeFirst()
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export declare namespace complete {
|
|
142
|
+
/** Completion fields. */
|
|
143
|
+
type Input = {
|
|
144
|
+
/** API key id (`key_…`) the claim is scoped to. */
|
|
145
|
+
apiKeyId: string
|
|
146
|
+
/** Creation time returned by the successful claim. */
|
|
147
|
+
createdAt: string
|
|
148
|
+
/** SHA-256 of the caller Idempotency-Key. */
|
|
149
|
+
keyHash: string
|
|
150
|
+
/** Successful-response replay retention from completion, in milliseconds. */
|
|
151
|
+
replayTtlMs: number
|
|
152
|
+
/** Serialized success response replayed for the retention window. */
|
|
153
|
+
response: string
|
|
154
|
+
/** Transfer id (`ftr_…`) when the request created a funding transfer. */
|
|
155
|
+
transferId?: string | undefined
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** Releases a pending claim after a retryable failure. */
|
|
160
|
+
export async function release(db: Db.Db, input: release.Input): Promise<void> {
|
|
161
|
+
await db.kysely
|
|
162
|
+
.deleteFrom('funding_idempotency_requests')
|
|
163
|
+
.where('apiKeyId', '=', input.apiKeyId)
|
|
164
|
+
.where('createdAt', '=', input.createdAt)
|
|
165
|
+
.where('keyHash', '=', input.keyHash)
|
|
166
|
+
.where('status', '=', 'pending')
|
|
167
|
+
.execute()
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export declare namespace release {
|
|
171
|
+
/** Pending claim identity. */
|
|
172
|
+
type Input = {
|
|
173
|
+
/** API key id (`key_…`) the claim is scoped to. */
|
|
174
|
+
apiKeyId: string
|
|
175
|
+
/** Creation time returned by the successful claim. */
|
|
176
|
+
createdAt: string
|
|
177
|
+
/** SHA-256 of the caller Idempotency-Key. */
|
|
178
|
+
keyHash: string
|
|
179
|
+
}
|
|
180
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Selectable } from 'kysely'
|
|
2
|
+
|
|
3
|
+
import type * as Db from '../Db.js'
|
|
4
|
+
import type * as db_Schema from '../Schema.js'
|
|
5
|
+
|
|
6
|
+
/** Columns of the `funding_transfer_events` table. */
|
|
7
|
+
export type Table = db_Schema.FundingTransferEvent
|
|
8
|
+
/** One immutable public snapshot at a material version. */
|
|
9
|
+
export type Record = Selectable<Table>
|
|
10
|
+
|
|
11
|
+
/** Inserts an event row. Callers commit it with its transfer row in one transaction. */
|
|
12
|
+
export function insert(db: Db.Db, record: Record): Promise<Record> {
|
|
13
|
+
return db.kysely
|
|
14
|
+
.insertInto('funding_transfer_events')
|
|
15
|
+
.values(record)
|
|
16
|
+
.returningAll()
|
|
17
|
+
.executeTakeFirstOrThrow()
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Lists a transfer's events, oldest version first. */
|
|
21
|
+
export function listByTransfer(db: Db.Db, transferId: string): Promise<Record[]> {
|
|
22
|
+
return db.kysely
|
|
23
|
+
.selectFrom('funding_transfer_events')
|
|
24
|
+
.selectAll()
|
|
25
|
+
.where('transferId', '=', transferId)
|
|
26
|
+
.orderBy('version', 'asc')
|
|
27
|
+
.execute()
|
|
28
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import * as TestApp from '../../../test/App.js'
|
|
2
|
+
import * as TestFunding from '../../../test/Funding.js'
|
|
3
|
+
import * as Transfer from '../../internal/funding/Transfer.js'
|
|
4
|
+
import * as FundingTransferTransactions from './fundingTransferTransactions.js'
|
|
5
|
+
|
|
6
|
+
const db = TestApp.database()
|
|
7
|
+
|
|
8
|
+
function createTransfer(id: string) {
|
|
9
|
+
return Transfer.create(db, {
|
|
10
|
+
apiKeyId: 'key_test',
|
|
11
|
+
environment: 'production',
|
|
12
|
+
id,
|
|
13
|
+
orgId: 'org_test',
|
|
14
|
+
snapshot: TestFunding.transferSnapshot(),
|
|
15
|
+
})
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
describe('insert', () => {
|
|
19
|
+
test('canonicalizes EVM hashes before enforcing source uniqueness', async () => {
|
|
20
|
+
const first = await createTransfer('ftr_evm_first')
|
|
21
|
+
const second = await createTransfer('ftr_evm_second')
|
|
22
|
+
const transactionRef = `0x${'aB'.repeat(32)}`
|
|
23
|
+
|
|
24
|
+
const inserted = await FundingTransferTransactions.insert(db, {
|
|
25
|
+
chainId: 'eip155:8453',
|
|
26
|
+
createdAt: '2026-01-01T00:00:01.000Z',
|
|
27
|
+
role: 'source',
|
|
28
|
+
transactionRef,
|
|
29
|
+
transferId: first.id,
|
|
30
|
+
})
|
|
31
|
+
expect(inserted?.transactionRef).toBe(transactionRef.toLowerCase())
|
|
32
|
+
|
|
33
|
+
await expect(
|
|
34
|
+
FundingTransferTransactions.insert(db, {
|
|
35
|
+
chainId: 'eip155:8453',
|
|
36
|
+
createdAt: '2026-01-01T00:00:02.000Z',
|
|
37
|
+
role: 'source',
|
|
38
|
+
transactionRef: transactionRef.toUpperCase(),
|
|
39
|
+
transferId: second.id,
|
|
40
|
+
}),
|
|
41
|
+
).rejects.toMatchObject({ constraint: 'funding_transfer_transactions_source_unique' })
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
test('preserves case-sensitive non-EVM transaction references', async () => {
|
|
45
|
+
const first = await createTransfer('ftr_solana_first')
|
|
46
|
+
const second = await createTransfer('ftr_solana_second')
|
|
47
|
+
const transactionRef = 'A'.repeat(87)
|
|
48
|
+
|
|
49
|
+
const uppercase = await FundingTransferTransactions.insert(db, {
|
|
50
|
+
chainId: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',
|
|
51
|
+
createdAt: '2026-01-01T00:00:01.000Z',
|
|
52
|
+
role: 'source',
|
|
53
|
+
transactionRef,
|
|
54
|
+
transferId: first.id,
|
|
55
|
+
})
|
|
56
|
+
const lowercase = await FundingTransferTransactions.insert(db, {
|
|
57
|
+
chainId: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',
|
|
58
|
+
createdAt: '2026-01-01T00:00:02.000Z',
|
|
59
|
+
role: 'source',
|
|
60
|
+
transactionRef: transactionRef.toLowerCase(),
|
|
61
|
+
transferId: second.id,
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
expect([uppercase?.transactionRef, lowercase?.transactionRef]).toEqual([
|
|
65
|
+
transactionRef,
|
|
66
|
+
transactionRef.toLowerCase(),
|
|
67
|
+
])
|
|
68
|
+
})
|
|
69
|
+
})
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { Selectable } from 'kysely'
|
|
2
|
+
|
|
3
|
+
import type * as Db from '../Db.js'
|
|
4
|
+
import type * as db_Schema from '../Schema.js'
|
|
5
|
+
|
|
6
|
+
/** Columns of the `funding_transfer_transactions` table. */
|
|
7
|
+
export type Table = db_Schema.FundingTransferTransaction
|
|
8
|
+
/** One verified transaction reference on a transfer. */
|
|
9
|
+
export type Record = Selectable<Table>
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Inserts a transaction reference, lowercasing EVM hashes while preserving
|
|
13
|
+
* other references. Repeats return `undefined`; conflicting source ownership throws.
|
|
14
|
+
*/
|
|
15
|
+
export function insert(db: Db.Db, record: Record): Promise<Record | undefined> {
|
|
16
|
+
return db.kysely
|
|
17
|
+
.insertInto('funding_transfer_transactions')
|
|
18
|
+
.values({
|
|
19
|
+
...record,
|
|
20
|
+
transactionRef: record.chainId.startsWith('eip155:')
|
|
21
|
+
? record.transactionRef.toLowerCase()
|
|
22
|
+
: record.transactionRef,
|
|
23
|
+
})
|
|
24
|
+
.onConflict((oc) => oc.columns(['transferId', 'role', 'transactionRef']).doNothing())
|
|
25
|
+
.returningAll()
|
|
26
|
+
.executeTakeFirst()
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Lists a transfer's transaction references, oldest first. */
|
|
30
|
+
export function listByTransfer(db: Db.Db, transferId: string): Promise<Record[]> {
|
|
31
|
+
return db.kysely
|
|
32
|
+
.selectFrom('funding_transfer_transactions')
|
|
33
|
+
.selectAll()
|
|
34
|
+
.where('transferId', '=', transferId)
|
|
35
|
+
.orderBy('createdAt', 'asc')
|
|
36
|
+
.execute()
|
|
37
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import * as Transfer from '../../internal/funding/Transfer.js'
|
|
2
|
+
import * as TestApp from '../../../test/App.js'
|
|
3
|
+
import * as TestFunding from '../../../test/Funding.js'
|
|
4
|
+
import * as FundingTransfers from './fundingTransfers.js'
|
|
5
|
+
|
|
6
|
+
const db = TestApp.database()
|
|
7
|
+
|
|
8
|
+
const owner = { environment: 'production', orgId: 'org_list' } as const
|
|
9
|
+
|
|
10
|
+
let counter = 0
|
|
11
|
+
function seed(input: Partial<Transfer.create.Input> = {}) {
|
|
12
|
+
// Distinct create times keep ids strictly ordered for paging assertions.
|
|
13
|
+
return Transfer.create(db, {
|
|
14
|
+
apiKeyId: 'key_test',
|
|
15
|
+
environment: 'production',
|
|
16
|
+
id: Transfer.generateId(new Date(Date.UTC(2026, 0, 1, 0, 0, counter++))),
|
|
17
|
+
orgId: owner.orgId,
|
|
18
|
+
snapshot: TestFunding.transferSnapshot(),
|
|
19
|
+
...input,
|
|
20
|
+
})
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
describe('list', () => {
|
|
24
|
+
test('pages newest-first by id with owner isolation', async () => {
|
|
25
|
+
const first = await seed()
|
|
26
|
+
const second = await seed({ projectId: 'prj_a' })
|
|
27
|
+
const third = await seed()
|
|
28
|
+
await seed({ orgId: 'org_other' })
|
|
29
|
+
await seed({ environment: 'sandbox' })
|
|
30
|
+
|
|
31
|
+
const page = await FundingTransfers.list(db, owner, { limit: 3 })
|
|
32
|
+
expect(page.map((row) => row.id)).toEqual([third.id, second.id, first.id])
|
|
33
|
+
|
|
34
|
+
const rest = await FundingTransfers.list(db, owner, { cursor: third.id, limit: 3 })
|
|
35
|
+
expect(rest.map((row) => row.id)).toEqual([second.id, first.id])
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
test('narrows project-attributed owners to their project', async () => {
|
|
39
|
+
const rows = await FundingTransfers.list(db, { ...owner, projectId: 'prj_a' }, { limit: 10 })
|
|
40
|
+
expect(rows.every((row) => row.projectId === 'prj_a')).toBe(true)
|
|
41
|
+
expect(rows.length).toBeGreaterThan(0)
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
test('filters by status', async () => {
|
|
45
|
+
const record = await seed()
|
|
46
|
+
await Transfer.transition(db, { expectedVersion: 1, id: record.id, status: 'expired' })
|
|
47
|
+
const rows = await FundingTransfers.list(db, owner, { limit: 10, status: 'expired' })
|
|
48
|
+
expect(rows.map((row) => row.id)).toEqual([record.id])
|
|
49
|
+
})
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
describe('count', () => {
|
|
53
|
+
test('shares the list filter and stops at the cap', async () => {
|
|
54
|
+
const total = await FundingTransfers.count(db, owner, { cap: 100 })
|
|
55
|
+
expect(total).toBeGreaterThanOrEqual(3)
|
|
56
|
+
expect(await FundingTransfers.count(db, owner, { cap: 2 })).toBe(3)
|
|
57
|
+
expect(await FundingTransfers.count(db, { ...owner, orgId: 'org_none' }, { cap: 100 })).toBe(0)
|
|
58
|
+
})
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
describe('getOwned', () => {
|
|
62
|
+
test('returns owned rows and hides foreign ones', async () => {
|
|
63
|
+
const record = await seed()
|
|
64
|
+
expect((await FundingTransfers.getOwned(db, owner, record.id))?.id).toBe(record.id)
|
|
65
|
+
expect(
|
|
66
|
+
await FundingTransfers.getOwned(db, { ...owner, orgId: 'org_other' }, record.id),
|
|
67
|
+
).toBeUndefined()
|
|
68
|
+
expect(
|
|
69
|
+
await FundingTransfers.getOwned(db, { ...owner, projectId: 'prj_a' }, record.id),
|
|
70
|
+
).toBeUndefined()
|
|
71
|
+
})
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
describe('update', () => {
|
|
75
|
+
test('applies only against the expected version', async () => {
|
|
76
|
+
const record = await seed()
|
|
77
|
+
const options = {
|
|
78
|
+
expectedVersion: 1,
|
|
79
|
+
id: record.id,
|
|
80
|
+
snapshot: record.snapshot,
|
|
81
|
+
status: 'processing',
|
|
82
|
+
statusReason: null,
|
|
83
|
+
updatedAt: '2026-01-01T00:10:00.000Z',
|
|
84
|
+
version: 2,
|
|
85
|
+
} as const
|
|
86
|
+
expect((await FundingTransfers.update(db, options))?.version).toBe(2)
|
|
87
|
+
expect(await FundingTransfers.update(db, options)).toBeUndefined()
|
|
88
|
+
})
|
|
89
|
+
})
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import type { Selectable } from 'kysely'
|
|
2
|
+
|
|
3
|
+
import type * as Db from '../Db.js'
|
|
4
|
+
import type * as db_Schema from '../Schema.js'
|
|
5
|
+
|
|
6
|
+
/** Columns of the `funding_transfers` table. */
|
|
7
|
+
export type Table = db_Schema.FundingTransfer
|
|
8
|
+
/** A stored funding transfer. */
|
|
9
|
+
export type Record = Selectable<Table>
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Ownership filter derived from the API-key principal, never from the
|
|
13
|
+
* request. A `projectId` narrows reads to that project; organization-attributed
|
|
14
|
+
* keys omit it and see every project in their organization and environment.
|
|
15
|
+
*/
|
|
16
|
+
export type Owner = {
|
|
17
|
+
/** Key environment. */
|
|
18
|
+
environment: Record['environment']
|
|
19
|
+
/** Owning organization id (`org_…`). */
|
|
20
|
+
orgId: string
|
|
21
|
+
/** Attributed project id, for project-attributed keys. */
|
|
22
|
+
projectId?: string | undefined
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Inserts a transfer row. Callers commit the matching event in the same transaction. */
|
|
26
|
+
export function insert(db: Db.Db, record: Record): Promise<Record> {
|
|
27
|
+
return db.kysely
|
|
28
|
+
.insertInto('funding_transfers')
|
|
29
|
+
.values(record)
|
|
30
|
+
.returningAll()
|
|
31
|
+
.executeTakeFirstOrThrow()
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Gets a transfer by id without ownership scoping (domain and reconciler use). */
|
|
35
|
+
export function get(db: Db.Db, id: string): Promise<Record | undefined> {
|
|
36
|
+
return db.kysely
|
|
37
|
+
.selectFrom('funding_transfers')
|
|
38
|
+
.selectAll()
|
|
39
|
+
.where('id', '=', id)
|
|
40
|
+
.executeTakeFirst()
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Gets an owner-visible transfer by id; `undefined` for absent or foreign rows. */
|
|
44
|
+
export function getOwned(db: Db.Db, owner: Owner, id: string): Promise<Record | undefined> {
|
|
45
|
+
let query = db.kysely
|
|
46
|
+
.selectFrom('funding_transfers')
|
|
47
|
+
.selectAll()
|
|
48
|
+
.where('id', '=', id)
|
|
49
|
+
.where('orgId', '=', owner.orgId)
|
|
50
|
+
.where('environment', '=', owner.environment)
|
|
51
|
+
if (owner.projectId !== undefined) query = query.where('projectId', '=', owner.projectId)
|
|
52
|
+
return query.executeTakeFirst()
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Lists an owner's transfers newest-first. Ids embed a timestamp, so lexical
|
|
57
|
+
* key order is chronological and the cursor is the last returned id.
|
|
58
|
+
*/
|
|
59
|
+
export function list(db: Db.Db, owner: Owner, options: list.Options): Promise<Record[]> {
|
|
60
|
+
let query = db.kysely
|
|
61
|
+
.selectFrom('funding_transfers')
|
|
62
|
+
.selectAll()
|
|
63
|
+
.where('orgId', '=', owner.orgId)
|
|
64
|
+
.where('environment', '=', owner.environment)
|
|
65
|
+
if (owner.projectId !== undefined) query = query.where('projectId', '=', owner.projectId)
|
|
66
|
+
if (options.status !== undefined) query = query.where('status', '=', options.status)
|
|
67
|
+
if (options.cursor !== undefined) query = query.where('id', '<', options.cursor)
|
|
68
|
+
return query.orderBy('id', 'desc').limit(options.limit).execute()
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export declare namespace list {
|
|
72
|
+
/** Paging and filter options. */
|
|
73
|
+
type Options = {
|
|
74
|
+
/** Exclusive lower bound: the last id of the previous page. */
|
|
75
|
+
cursor?: string | undefined
|
|
76
|
+
/** Maximum rows to return (fetch one extra to detect a further page). */
|
|
77
|
+
limit: number
|
|
78
|
+
/** Restricts to one lifecycle status. */
|
|
79
|
+
status?: Record['status'] | undefined
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Counts an owner's transfers through a capped subquery sharing the list
|
|
85
|
+
* filter, so the count cannot scan unboundedly. A result above `cap` means
|
|
86
|
+
* the true count was truncated.
|
|
87
|
+
*/
|
|
88
|
+
export async function count(db: Db.Db, owner: Owner, options: count.Options): Promise<number> {
|
|
89
|
+
const row = await db.kysely
|
|
90
|
+
.selectFrom((eb) => {
|
|
91
|
+
let query = eb
|
|
92
|
+
.selectFrom('funding_transfers')
|
|
93
|
+
.select('id')
|
|
94
|
+
.where('orgId', '=', owner.orgId)
|
|
95
|
+
.where('environment', '=', owner.environment)
|
|
96
|
+
if (owner.projectId !== undefined) query = query.where('projectId', '=', owner.projectId)
|
|
97
|
+
if (options.status !== undefined) query = query.where('status', '=', options.status)
|
|
98
|
+
return query.limit(options.cap + 1).as('page')
|
|
99
|
+
})
|
|
100
|
+
.select(({ fn }) => fn.countAll<string>().as('count'))
|
|
101
|
+
.executeTakeFirstOrThrow()
|
|
102
|
+
return Number(row.count)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export declare namespace count {
|
|
106
|
+
/** Count options sharing the list filter. */
|
|
107
|
+
type Options = {
|
|
108
|
+
/** Row ceiling; a result above it signals a truncated count. */
|
|
109
|
+
cap: number
|
|
110
|
+
/** Restricts to one lifecycle status. */
|
|
111
|
+
status?: Record['status'] | undefined
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Applies a version-guarded update; `undefined` when the row moved past
|
|
117
|
+
* `expectedVersion` (or vanished) so the caller retries against fresh state.
|
|
118
|
+
*/
|
|
119
|
+
export function update(db: Db.Db, options: update.Options): Promise<Record | undefined> {
|
|
120
|
+
return db.kysely
|
|
121
|
+
.updateTable('funding_transfers')
|
|
122
|
+
.set({
|
|
123
|
+
snapshot: options.snapshot,
|
|
124
|
+
status: options.status,
|
|
125
|
+
statusReason: options.statusReason,
|
|
126
|
+
updatedAt: options.updatedAt,
|
|
127
|
+
version: options.version,
|
|
128
|
+
})
|
|
129
|
+
.where('id', '=', options.id)
|
|
130
|
+
.where('version', '=', options.expectedVersion)
|
|
131
|
+
.returningAll()
|
|
132
|
+
.executeTakeFirst()
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export declare namespace update {
|
|
136
|
+
/** Guarded update fields. */
|
|
137
|
+
type Options = {
|
|
138
|
+
/** The version the update was computed against. */
|
|
139
|
+
expectedVersion: number
|
|
140
|
+
/** Transfer id (`ftr_…`). */
|
|
141
|
+
id: string
|
|
142
|
+
/** Replacement public snapshot. */
|
|
143
|
+
snapshot: Record['snapshot']
|
|
144
|
+
/** New lifecycle status. */
|
|
145
|
+
status: Record['status']
|
|
146
|
+
/** Customer-safe reason, or null to clear. */
|
|
147
|
+
statusReason: Record['statusReason']
|
|
148
|
+
/** Mutation timestamp (ISO 8601). */
|
|
149
|
+
updatedAt: string
|
|
150
|
+
/** The incremented version. */
|
|
151
|
+
version: number
|
|
152
|
+
}
|
|
153
|
+
}
|
|
@@ -186,6 +186,22 @@ export function get(db: Db.Db, id: string): Promise<Record | undefined> {
|
|
|
186
186
|
return db.kysely.selectFrom('organizations').selectAll().where('id', '=', id).executeTakeFirst()
|
|
187
187
|
}
|
|
188
188
|
|
|
189
|
+
/**
|
|
190
|
+
* Reads organizations by id for operational attribution displays.
|
|
191
|
+
*
|
|
192
|
+
* @param db - The database.
|
|
193
|
+
* @param ids - Organization ids to read.
|
|
194
|
+
* @returns Matching organization records.
|
|
195
|
+
*/
|
|
196
|
+
export function listByIds(db: Db.Db, ids: readonly string[]): Promise<Record[]> {
|
|
197
|
+
if (ids.length === 0) return Promise.resolve([])
|
|
198
|
+
return db.kysely
|
|
199
|
+
.selectFrom('organizations')
|
|
200
|
+
.selectAll()
|
|
201
|
+
.where('id', 'in', [...ids])
|
|
202
|
+
.execute()
|
|
203
|
+
}
|
|
204
|
+
|
|
189
205
|
/**
|
|
190
206
|
* Reads an organization with current member and project counts.
|
|
191
207
|
*
|
|
@@ -65,6 +65,22 @@ export function get(db: Db.Db, id: string): Promise<Record | undefined> {
|
|
|
65
65
|
return db.kysely.selectFrom('projects').selectAll().where('id', '=', id).executeTakeFirst()
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
+
/**
|
|
69
|
+
* Reads projects by id for operational attribution displays.
|
|
70
|
+
*
|
|
71
|
+
* @param db - The database.
|
|
72
|
+
* @param ids - Project ids to read.
|
|
73
|
+
* @returns Matching project records.
|
|
74
|
+
*/
|
|
75
|
+
export function listByIds(db: Db.Db, ids: readonly string[]): Promise<Record[]> {
|
|
76
|
+
if (ids.length === 0) return Promise.resolve([])
|
|
77
|
+
return db.kysely
|
|
78
|
+
.selectFrom('projects')
|
|
79
|
+
.selectAll()
|
|
80
|
+
.where('id', 'in', [...ids])
|
|
81
|
+
.execute()
|
|
82
|
+
}
|
|
83
|
+
|
|
68
84
|
/**
|
|
69
85
|
* Lists an organization's projects, newest first.
|
|
70
86
|
*
|
|
@@ -43,6 +43,12 @@ export type Bucket = db_Schema.RequestUsageBucket
|
|
|
43
43
|
/** A stored request-count meter event. */
|
|
44
44
|
export type MeterEvent = db_Schema.RequestUsageMeterEvent
|
|
45
45
|
|
|
46
|
+
/** Aggregate state for pending meter events in one billing environment. */
|
|
47
|
+
export type PendingStatus = {
|
|
48
|
+
count: number
|
|
49
|
+
oldestAttemptedAt: string | undefined
|
|
50
|
+
}
|
|
51
|
+
|
|
46
52
|
/** Identifies one hourly bucket for an org in an environment. */
|
|
47
53
|
export type BucketKey = {
|
|
48
54
|
/** UTC hour start (ISO 8601). */
|
|
@@ -91,6 +97,23 @@ export async function listPending(db: Db.Db, environment: Environment): Promise<
|
|
|
91
97
|
return rows.map(toMeterEvent)
|
|
92
98
|
}
|
|
93
99
|
|
|
100
|
+
/**
|
|
101
|
+
* Reads the number and age anchor of meter events still awaiting Stripe.
|
|
102
|
+
*
|
|
103
|
+
* @param db - The database.
|
|
104
|
+
* @param environment - The billing environment to inspect.
|
|
105
|
+
* @returns The pending-event count and oldest first attempt.
|
|
106
|
+
*/
|
|
107
|
+
export async function getPendingStatus(db: Db.Db, environment: Environment): Promise<PendingStatus> {
|
|
108
|
+
const row = await db.kysely
|
|
109
|
+
.selectFrom('request_usage_meter_events')
|
|
110
|
+
.select((eb) => [eb.fn.countAll().as('count'), eb.fn.min('firstAttemptedAt').as('oldest')])
|
|
111
|
+
.where('environment', '=', environment)
|
|
112
|
+
.where('state', '=', 'pending')
|
|
113
|
+
.executeTakeFirstOrThrow()
|
|
114
|
+
return { count: Number(row.count), oldestAttemptedAt: row.oldest ?? undefined }
|
|
115
|
+
}
|
|
116
|
+
|
|
94
117
|
/**
|
|
95
118
|
* Inserts a frozen `pending` meter event, claiming a delta. Idempotent on the
|
|
96
119
|
* deterministic `identifier`: a re-seal after a crash resolves to the existing
|
|
@@ -62,6 +62,17 @@ describe('upsert', () => {
|
|
|
62
62
|
await db.close()
|
|
63
63
|
})
|
|
64
64
|
|
|
65
|
+
test('behavior: records organization-level sponsorship without a project', async () => {
|
|
66
|
+
const db = create()
|
|
67
|
+
await db.migrate()
|
|
68
|
+
const { projectId: _, ...organization } = input
|
|
69
|
+
const record = await SponsoredTransactions.upsert(db, organization)
|
|
70
|
+
|
|
71
|
+
expect(record.orgId).toMatchInlineSnapshot(`"org_1"`)
|
|
72
|
+
expect(record.projectId).toBeNull()
|
|
73
|
+
await db.close()
|
|
74
|
+
})
|
|
75
|
+
|
|
65
76
|
test('behavior: preserves an explicit fee token', async () => {
|
|
66
77
|
const db = create()
|
|
67
78
|
await db.migrate()
|
|
@@ -40,7 +40,7 @@ export async function upsert(db: Db.Db, input: upsert.Input): Promise<Record> {
|
|
|
40
40
|
id: Id.generate('stx'),
|
|
41
41
|
meterReportedAt: null,
|
|
42
42
|
orgId: input.orgId,
|
|
43
|
-
projectId: input.projectId,
|
|
43
|
+
projectId: input.projectId ?? null,
|
|
44
44
|
signPayload: input.signPayload,
|
|
45
45
|
status: 'pending',
|
|
46
46
|
transaction: input.transaction,
|
|
@@ -95,8 +95,8 @@ export declare namespace upsert {
|
|
|
95
95
|
feeToken?: string | undefined
|
|
96
96
|
/** Organization id (`org_…`) the spend attributes to. */
|
|
97
97
|
orgId: string
|
|
98
|
-
/** Project id (`prj_…`) the spend attributes to. */
|
|
99
|
-
projectId
|
|
98
|
+
/** Project id (`prj_…`) the spend attributes to; omit for organization-level spend. */
|
|
99
|
+
projectId?: string | undefined
|
|
100
100
|
/** Fee-payer sign payload — a stable identity for the sponsored envelope. */
|
|
101
101
|
signPayload: string
|
|
102
102
|
/** Serialized sponsored transaction, kept for observability beyond log retention. */
|