tapimo 0.4.4 → 0.5.1
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/App.d.ts +4701 -3416
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +24 -2
- package/dist/App.js.map +1 -1
- package/dist/Assets.js +3 -3
- package/dist/Assets.js.map +1 -1
- package/dist/Scope.d.ts +18 -1
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +23 -3
- package/dist/Scope.js.map +1 -1
- package/dist/Webhooks.d.ts +1 -1
- package/dist/Webhooks.d.ts.map +1 -1
- package/dist/Webhooks.js +5 -10
- package/dist/Webhooks.js.map +1 -1
- package/dist/admin/App.d.ts +6 -34
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +3 -3
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +4 -1
- package/dist/admin/apps/api-keys.js.map +1 -1
- package/dist/admin/apps/scopes.d.ts +6 -34
- package/dist/admin/apps/scopes.d.ts.map +1 -1
- package/dist/admin/apps/scopes.js +2 -2
- package/dist/admin/apps/scopes.js.map +1 -1
- package/dist/admin/apps/verified-tokens.d.ts +57 -57
- package/dist/admin/ui.generated.d.ts +1 -1
- package/dist/admin/ui.generated.js +33 -33
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/apps/data/App.d.ts +4574 -4277
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/App.js +155 -77
- package/dist/apps/data/App.js.map +1 -1
- package/dist/apps/data/FundingQuoteProviders.d.ts +109 -0
- package/dist/apps/data/FundingQuoteProviders.d.ts.map +1 -0
- package/dist/apps/data/FundingQuoteProviders.js +464 -0
- package/dist/apps/data/FundingQuoteProviders.js.map +1 -0
- package/dist/apps/data/index.d.ts +1 -1
- package/dist/apps/data/index.js +1 -1
- package/dist/apps/data/routes/activities.d.ts +26 -26
- package/dist/apps/data/routes/addresses.d.ts +38 -38
- package/dist/apps/data/routes/balances.d.ts +45 -45
- package/dist/apps/data/routes/balances.d.ts.map +1 -1
- package/dist/apps/data/routes/balances.js +67 -149
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/blocks.d.ts +2 -3
- package/dist/apps/data/routes/blocks.d.ts.map +1 -1
- package/dist/apps/data/routes/blocks.js +3 -5
- package/dist/apps/data/routes/blocks.js.map +1 -1
- package/dist/apps/data/routes/coingecko.d.ts +177 -176
- package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
- package/dist/apps/data/routes/coingecko.js +3 -8
- package/dist/apps/data/routes/coingecko.js.map +1 -1
- package/dist/apps/data/routes/funding.d.ts +131 -228
- package/dist/apps/data/routes/funding.d.ts.map +1 -1
- package/dist/apps/data/routes/funding.js +152 -219
- package/dist/apps/data/routes/funding.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +34 -34
- package/dist/apps/data/routes/indexer.d.ts.map +1 -1
- package/dist/apps/data/routes/indexer.js +9 -2
- package/dist/apps/data/routes/indexer.js.map +1 -1
- package/dist/apps/data/routes/receipts.d.ts +228 -228
- package/dist/apps/data/routes/rpc.d.ts.map +1 -1
- package/dist/apps/data/routes/rpc.js +86 -16
- package/dist/apps/data/routes/rpc.js.map +1 -1
- package/dist/apps/data/routes/tokenlist.d.ts +12 -12
- package/dist/apps/data/routes/verified-tokens.d.ts +5 -5
- package/dist/apps/data/routes/webhooks.d.ts +340 -0
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +13 -1
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/index.d.ts +1 -1
- package/dist/apps/index.js +1 -1
- package/dist/apps/management/App.d.ts +1833 -851
- package/dist/apps/management/App.d.ts.map +1 -1
- package/dist/apps/management/App.js +4 -0
- package/dist/apps/management/App.js.map +1 -1
- package/dist/apps/management/routes/api-keys.d.ts +41 -41
- package/dist/apps/management/routes/api-keys.js +2 -2
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +48 -48
- package/dist/apps/management/routes/invitations.d.ts +132 -132
- package/dist/apps/management/routes/invite-links.d.ts +1100 -0
- package/dist/apps/management/routes/invite-links.d.ts.map +1 -0
- package/dist/apps/management/routes/invite-links.js +411 -0
- package/dist/apps/management/routes/invite-links.js.map +1 -0
- package/dist/apps/management/routes/members.d.ts +41 -41
- package/dist/apps/management/routes/orgs.d.ts +92 -92
- package/dist/apps/management/routes/projects.d.ts +9 -9
- package/dist/apps/management/routes/scopes.d.ts.map +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 +24 -24
- package/dist/apps/mcp.js +2 -2
- package/dist/apps/mcp.js.map +1 -1
- package/dist/apps/relay/App.d.ts +2 -2
- package/dist/apps/relay/App.d.ts.map +1 -1
- package/dist/apps/relay/App.js +44 -6
- package/dist/apps/relay/App.js.map +1 -1
- package/dist/db/Db.d.ts +3 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +57 -0
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +31 -0
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +31 -0
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/inviteLinks.d.ts +42 -0
- package/dist/db/tables/inviteLinks.d.ts.map +1 -0
- package/dist/db/tables/inviteLinks.js +148 -0
- package/dist/db/tables/inviteLinks.js.map +1 -0
- package/dist/db/tables/organizations.d.ts.map +1 -1
- package/dist/db/tables/organizations.js +2 -0
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +6 -2
- package/dist/db/tables/sponsoredTransactions.js.map +1 -1
- package/dist/handlers/relay.d.ts.map +1 -1
- package/dist/handlers/relay.js +13 -3
- package/dist/handlers/relay.js.map +1 -1
- package/dist/internal/Auth.d.ts +9 -1
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +138 -10
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/EdgeCache.d.ts +3 -1
- package/dist/internal/EdgeCache.d.ts.map +1 -1
- package/dist/internal/EdgeCache.js +17 -2
- package/dist/internal/EdgeCache.js.map +1 -1
- package/dist/internal/{FundingRoutes.d.ts → FundingQuotes.d.ts} +240 -369
- package/dist/internal/FundingQuotes.d.ts.map +1 -0
- package/dist/internal/{FundingRoutes.js → FundingQuotes.js} +144 -183
- package/dist/internal/FundingQuotes.js.map +1 -0
- package/dist/internal/Log.d.ts +18 -12
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +2 -0
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/Tidx.d.ts +9 -3
- package/dist/internal/Tidx.d.ts.map +1 -1
- package/dist/internal/Tidx.js +13 -7
- package/dist/internal/Tidx.js.map +1 -1
- package/dist/internal/Viem.d.ts +17 -2
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Viem.js +30 -3
- package/dist/internal/Viem.js.map +1 -1
- package/dist/internal/index.d.ts +1 -1
- package/dist/internal/index.js +1 -1
- package/package.json +2 -2
- package/src/ApiKeys.test.ts +25 -0
- package/src/App.test-d.ts +2 -0
- package/src/App.test.ts +13 -2
- package/src/App.ts +37 -5
- package/src/Assets.ts +3 -3
- package/src/Client.test-d.ts +21 -11
- package/src/Scope.test.ts +1 -0
- package/src/Scope.ts +32 -4
- package/src/Webhooks.ts +5 -10
- package/src/admin/apps/api-keys.test.ts +27 -0
- package/src/admin/apps/api-keys.ts +8 -1
- package/src/admin/apps/scopes.test.ts +7 -2
- package/src/admin/apps/scopes.ts +2 -2
- package/src/admin/ui/src/components/Dialog.tsx +8 -2
- package/src/admin/ui/src/lib/scopes.test.ts +19 -0
- package/src/admin/ui/src/lib/scopes.ts +12 -0
- package/src/admin/ui/src/routes/api-keys.tsx +128 -27
- package/src/admin/ui.generated.ts +33 -33
- package/src/apps/composition.test.ts +77 -0
- package/src/apps/data/App.test.ts +354 -0
- package/src/apps/data/App.ts +178 -91
- package/src/apps/data/FundingQuoteProviders.test.ts +577 -0
- package/src/apps/data/FundingQuoteProviders.ts +633 -0
- package/src/apps/data/index.ts +1 -1
- package/src/apps/data/routes/balances.test.ts +64 -18
- package/src/apps/data/routes/balances.ts +76 -177
- package/src/apps/data/routes/blocks.ts +3 -5
- package/src/apps/data/routes/coingecko.ts +3 -8
- package/src/apps/data/routes/funding.test.ts +304 -192
- package/src/apps/data/routes/funding.ts +166 -286
- package/src/apps/data/routes/indexer.test.ts +173 -15
- package/src/apps/data/routes/indexer.ts +8 -2
- package/src/apps/data/routes/rpc.test.ts +219 -0
- package/src/apps/data/routes/rpc.ts +92 -17
- package/src/apps/data/routes/webhooks.test.ts +21 -0
- package/src/apps/data/routes/webhooks.ts +13 -1
- package/src/apps/index.ts +1 -1
- package/src/apps/management/App.ts +4 -0
- package/src/apps/management/Billing.test.ts +2 -2
- package/src/apps/management/routes/api-keys.test.ts +47 -3
- package/src/apps/management/routes/api-keys.ts +2 -2
- package/src/apps/management/routes/invite-links.test.ts +385 -0
- package/src/apps/management/routes/invite-links.ts +570 -0
- package/src/apps/management/routes/scopes.test.ts +3 -2
- package/src/apps/management/routes/scopes.ts +4 -2
- package/src/apps/mcp.test.ts +18 -0
- package/src/apps/mcp.ts +2 -2
- package/src/apps/relay/App.test.ts +328 -7
- package/src/apps/relay/App.ts +42 -6
- package/src/apps/relay/Sponsorships.test.ts +2 -2
- package/src/db/Db.test.ts +5 -5
- package/src/db/Db.ts +65 -0
- package/src/db/Schema.ts +39 -0
- package/src/db/tables/billingSettings.test.ts +2 -2
- package/src/db/tables/inviteLinks.ts +187 -0
- package/src/db/tables/organizations.test.ts +2 -2
- package/src/db/tables/organizations.ts +2 -0
- package/src/db/tables/sponsoredTransactions.test.ts +19 -2
- package/src/db/tables/sponsoredTransactions.ts +21 -14
- package/src/db/tables/stripeCustomers.test.ts +2 -2
- package/src/handlers/relay.ts +16 -4
- package/src/internal/Auth.test.ts +132 -22
- package/src/internal/Auth.ts +181 -14
- package/src/internal/EdgeCache.test.ts +24 -3
- package/src/internal/EdgeCache.ts +18 -2
- package/src/internal/FundingQuotes.test.ts +268 -0
- package/src/internal/{FundingRoutes.ts → FundingQuotes.ts} +216 -277
- package/src/internal/Log.ts +21 -14
- package/src/internal/Tidx.test.ts +48 -0
- package/src/internal/Tidx.ts +21 -7
- package/src/internal/Viem.test.ts +46 -0
- package/src/internal/Viem.ts +48 -6
- package/src/internal/index.test.ts +1 -1
- package/src/internal/index.ts +1 -1
- package/dist/apps/data/FundingRouteProviders.d.ts +0 -36
- package/dist/apps/data/FundingRouteProviders.d.ts.map +0 -1
- package/dist/apps/data/FundingRouteProviders.js +0 -245
- package/dist/apps/data/FundingRouteProviders.js.map +0 -1
- package/dist/internal/FundingRoutes.d.ts.map +0 -1
- package/dist/internal/FundingRoutes.js.map +0 -1
- package/src/apps/data/FundingRouteProviders.test.ts +0 -225
- package/src/apps/data/FundingRouteProviders.ts +0 -312
- package/src/internal/FundingRoutes.test.ts +0 -213
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"funding.d.ts","sourceRoot":"","sources":["../../../../src/apps/data/routes/funding.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAA;AAE7B,OAAO,KAAK,KAAK,GAAG,MAAM,iBAAiB,CAAA;AAG3C,OAAO,KAAK,aAAa,MAAM,oCAAoC,CAAA;AAEnE,OAAO,KAAK,QAAQ,MAAM,+BAA+B,CAAA;
|
|
1
|
+
{"version":3,"file":"funding.d.ts","sourceRoot":"","sources":["../../../../src/apps/data/routes/funding.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAA;AAE7B,OAAO,KAAK,KAAK,GAAG,MAAM,iBAAiB,CAAA;AAG3C,OAAO,KAAK,aAAa,MAAM,oCAAoC,CAAA;AAEnE,OAAO,KAAK,QAAQ,MAAM,+BAA+B,CAAA;AAIzD,oDAAoD;AACpD,yBAAiB,MAAM,CAAC;IACtB,6CAA6C;IACtC,MAAM,KAAK;;;;;;;;;;;;;;qBAiCjB,CAAA;IAED,6CAA6C;IACtC,MAAM,KAAK;;;;;;;;;qBA6CjB,CAAA;IAED,wDAAwD;IACjD,MAAM,WAAW;;;qBAevB,CAAA;IAED,oDAAoD;IAC7C,MAAM,WAAW;;;;;;;;;qBAsBvB,CAAA;IAED,+EAA+E;IACxE,MAAM,OAAO;;;;;;;;qBA4BnB,CAAA;IAED,2DAA2D;IACpD,MAAM,YAAY;;;;;;;qBAuCxB,CAAA;IAED,qCAAqC;IAC9B,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAkBxB,CAAA;IAED,4CAA4C;IACrC,MAAM,QAAQ;;;;;;;;;;;;;qBA2BpB,CAAA;IAED,qEAAqE;IAC9D,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;qBAK1B,CAAA;IAED,8CAA8C;IAC9C,UAAiB,YAAY,CAAC;QAC5B,gDAAgD;QACzC,MAAM,KAAK;;;;;;;;;;;;;;0BAoD0D,CAAA;QAE5E,uDAAuD;QAChD,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAKpB,CAAA;KACF;IAED,mDAAmD;IACnD,UAAiB,iBAAiB,CAAC;QACjC,4CAA4C;QACrC,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;yBAOpB,CAAA;KACF;IAED,+CAA+C;IAC/C,UAAiB,aAAa,CAAC;QAC7B,oDAAoD;QAC7C,MAAM,QAAQ;;;;;;;;;;;;;;;yBAKpB,CAAA;KACF;CACF;AA4CD,2EAA2E;AAC3E,wBAAgB,OAAO,CAAC,OAAO,GAAE,OAAO,CAAC,OAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCA4IpD;AAED,MAAM,CAAC,OAAO,WAAW,OAAO,CAAC;IAC/B,uCAAuC;IACvC,KAAK,OAAO,GAAG;QACb,qDAAqD;QACrD,QAAQ,CAAC,EAAE,aAAa,CAAC,gBAAgB,GAAG,SAAS,CAAA;QACrD,kDAAkD;QAClD,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KACtC,CAAA;CACF"}
|
|
@@ -2,21 +2,22 @@ import { Hono } from 'hono';
|
|
|
2
2
|
import * as z from 'zod/mini';
|
|
3
3
|
import * as Auth from '../../../internal/Auth.js';
|
|
4
4
|
import * as Cache from '../../../internal/Cache.js';
|
|
5
|
-
import * as
|
|
5
|
+
import * as FundingQuotes from '../../../internal/FundingQuotes.js';
|
|
6
6
|
import * as OpenApi from '../../../internal/OpenApi.js';
|
|
7
7
|
import * as Response from '../../../internal/Response.js';
|
|
8
8
|
import * as Schema from '../../../internal/Schema.js';
|
|
9
|
-
|
|
9
|
+
import * as FundingQuoteProviders from '../FundingQuoteProviders.js';
|
|
10
|
+
/** Zod schemas owned by funding quote resources. */
|
|
10
11
|
export var schema;
|
|
11
12
|
(function (schema) {
|
|
12
13
|
/** Source or destination chain reference. */
|
|
13
14
|
schema.Chain = Schema.describe(z.object({
|
|
14
15
|
addressFormat: z
|
|
15
|
-
.enum(['
|
|
16
|
+
.enum(['base58', 'base58check', 'evm'])
|
|
16
17
|
.check(z.describe('Address family used by accounts and token identifiers on this chain.'), z.meta({ examples: ['evm'] })),
|
|
17
18
|
id: z
|
|
18
19
|
.string()
|
|
19
|
-
.check(z.describe('Stable chain id
|
|
20
|
+
.check(z.describe('Stable chain id. Uses CAIP-2 where standardized and a Tempo-defined compatible id otherwise.'), z.meta({ examples: ['eip155:8453'] })),
|
|
20
21
|
kind: z
|
|
21
22
|
.enum(['evm', 'solana', 'tron'])
|
|
22
23
|
.check(z.describe('Chain execution family used for provider routing.'), z.meta({ examples: ['evm'] })),
|
|
@@ -25,8 +26,8 @@ export var schema;
|
|
|
25
26
|
.check(z.describe('Human-readable chain name.'), z.meta({ examples: ['Base'] })),
|
|
26
27
|
providerIds: z
|
|
27
28
|
.optional(z.record(z.string(), z.string()))
|
|
28
|
-
.check(z.describe('Provider-specific chain ids Tempo uses when
|
|
29
|
-
}), 'A normalized chain reference for funding
|
|
29
|
+
.check(z.describe('Provider-specific chain ids Tempo uses when requesting quotes.'), z.meta({ examples: [{ across: '8453', relay: '8453', rhino: 'BASE' }] })),
|
|
30
|
+
}), 'A normalized chain reference for funding quotes.');
|
|
30
31
|
/** Source or destination token reference. */
|
|
31
32
|
schema.Token = Schema.describe(z.object({
|
|
32
33
|
address: z
|
|
@@ -52,121 +53,84 @@ export var schema;
|
|
|
52
53
|
})),
|
|
53
54
|
verified: z
|
|
54
55
|
.boolean()
|
|
55
|
-
.check(z.describe('Whether Tempo recognizes this token in its funding
|
|
56
|
-
}), 'A normalized token reference for funding
|
|
57
|
-
/** Source amount echoed by a funding
|
|
56
|
+
.check(z.describe('Whether Tempo recognizes this token in its funding quote inventory.'), z.meta({ examples: [true] })),
|
|
57
|
+
}), 'A normalized token reference for funding quotes.');
|
|
58
|
+
/** Source amount echoed by a funding quote response. */
|
|
58
59
|
schema.TokenAmount = Schema.describe(z.object({
|
|
59
60
|
amount: Schema.DecimalString.check(z.describe("The requested source amount in the token's smallest unit.")),
|
|
60
61
|
formatted: z
|
|
61
62
|
.string()
|
|
62
63
|
.check(z.describe('The same amount in human-readable decimal form, using the source token’s `decimals`.'), z.meta({ examples: ['1'] })),
|
|
63
|
-
usd: z
|
|
64
|
-
.nullable(z.string())
|
|
65
|
-
.check(z.describe('USD estimate for the requested source amount, when available.'), z.meta({ examples: ['1.00'] })),
|
|
66
64
|
}), 'The requested source amount in provider-safe base units and display form.');
|
|
67
|
-
/** Provider summary embedded in a
|
|
65
|
+
/** Provider summary embedded in a funding quote. */
|
|
68
66
|
schema.ProviderRef = Schema.describe(z.object({
|
|
69
|
-
id: z
|
|
67
|
+
id: z
|
|
68
|
+
.enum(['across', 'relay', 'rhino'])
|
|
69
|
+
.check(z.describe('Stable provider id.'), z.meta({ examples: ['relay'] })),
|
|
70
70
|
kind: z
|
|
71
71
|
.string()
|
|
72
|
-
.check(z.describe('Provider category, such as
|
|
72
|
+
.check(z.describe('Provider category, such as a solver network or aggregator.'), z.meta({ examples: ['solverNetwork'] })),
|
|
73
73
|
name: z
|
|
74
74
|
.string()
|
|
75
75
|
.check(z.describe('Human-readable provider name.'), z.meta({ examples: ['Relay'] })),
|
|
76
76
|
requiresApiKey: z
|
|
77
77
|
.boolean()
|
|
78
|
-
.check(z.describe('Whether Tempo needs provider credentials to query or use this provider.'), z.meta({ examples: [
|
|
79
|
-
}), 'Provider metadata embedded in a
|
|
80
|
-
/**
|
|
78
|
+
.check(z.describe('Whether Tempo needs provider credentials to query or use this provider.'), z.meta({ examples: [false] })),
|
|
79
|
+
}), 'Provider metadata embedded in a funding quote.');
|
|
80
|
+
/** Quote quality signals exposed directly instead of implied by list order. */
|
|
81
81
|
schema.Quality = Schema.describe(z.object({
|
|
82
|
-
availableVolumeUsd: z
|
|
83
|
-
.nullable(z.string())
|
|
84
|
-
.check(z.describe('Available USD capacity, when available.'), z.meta({ examples: ['1114274.43'] })),
|
|
85
82
|
estimatedSeconds: z
|
|
86
|
-
.
|
|
83
|
+
.optional(z.number().check(z.int(), z.nonnegative()))
|
|
87
84
|
.check(z.describe('Estimated settlement time in seconds, when known.'), z.meta({ examples: [2] })),
|
|
88
|
-
feeBps: z
|
|
89
|
-
.nullable(z.number().check(z.int(), z.nonnegative()))
|
|
90
|
-
.check(z.describe('Estimated fee in basis points, when known.'), z.meta({ examples: [109] })),
|
|
91
|
-
historicalVolumeUsd24h: z
|
|
92
|
-
.nullable(z.string())
|
|
93
|
-
.check(z.describe('24h routed volume in USD, when available.'), z.meta({ examples: ['250000.00'] })),
|
|
94
|
-
instantVolumeUsd: z
|
|
95
|
-
.nullable(z.string())
|
|
96
|
-
.check(z.describe('Instant USD capacity, when available.'), z.meta({ examples: ['12453.94'] })),
|
|
97
85
|
liquiditySource: z
|
|
98
86
|
.string()
|
|
99
|
-
.check(z.describe('
|
|
100
|
-
score: z
|
|
101
|
-
.nullable(z.number().check(z.int(), z.gte(0), z.lte(100)))
|
|
102
|
-
.check(z.describe('Explainable route score from 0 to 100, when enough signals are available.'), z.meta({ examples: [91] })),
|
|
87
|
+
.check(z.describe('Provider source for the live quote quality signal.'), z.meta({ examples: ['providerQuote'] })),
|
|
103
88
|
sourceDetail: z
|
|
104
|
-
.
|
|
89
|
+
.optional(z.string())
|
|
105
90
|
.check(z.describe('Provider-specific source or endpoint detail for the quality signal.'), z.meta({ examples: ['providerEndpoint'] })),
|
|
106
91
|
tier: z
|
|
107
|
-
.enum(['liquid', 'thin'
|
|
108
|
-
.check(z.describe('Machine-readable
|
|
109
|
-
}), 'Machine-readable liquidity, fee, and source signals for a
|
|
110
|
-
/** Provider-derived
|
|
111
|
-
schema.
|
|
92
|
+
.enum(['liquid', 'thin'])
|
|
93
|
+
.check(z.describe('Machine-readable quality tier for a successful quote.'), z.meta({ examples: ['liquid'] })),
|
|
94
|
+
}), 'Machine-readable liquidity, fee, and source signals for a successful quote.');
|
|
95
|
+
/** Provider-derived output, limits, and freshness data. */
|
|
96
|
+
schema.QuoteDetails = Schema.describe(z.object({
|
|
112
97
|
expiresAt: z
|
|
113
|
-
.
|
|
114
|
-
.check(z.describe('
|
|
98
|
+
.optional(z.iso.datetime())
|
|
99
|
+
.check(z.describe('Timestamp after which the provider quote is no longer valid.'), z.meta({ examples: ['2026-01-01T00:01:00Z'] })),
|
|
115
100
|
inputAmount: Schema.DecimalString.check(z.describe('Source amount sent to the provider in base units.'), z.meta({ examples: ['1000000'] })),
|
|
116
|
-
limits: z
|
|
117
|
-
.nullable(z.object({
|
|
118
|
-
instantSourceAmount: z
|
|
119
|
-
.nullable(Schema.DecimalString)
|
|
120
|
-
.check(z.describe('Provider-reported instant source amount capacity.'), z.meta({ examples: ['12453940000'] })),
|
|
121
|
-
maxSourceAmount: z
|
|
122
|
-
.nullable(Schema.DecimalString)
|
|
123
|
-
.check(z.describe('Provider-reported maximum source amount.'), z.meta({ examples: ['1114274433200'] })),
|
|
124
|
-
minSourceAmount: z
|
|
125
|
-
.nullable(Schema.DecimalString)
|
|
126
|
-
.check(z.describe('Provider-reported minimum source amount.'), z.meta({ examples: ['500063'] })),
|
|
127
|
-
}))
|
|
128
|
-
.check(z.describe('Provider limits expressed in source base units.')),
|
|
129
101
|
minimumOutputAmount: z
|
|
130
|
-
.
|
|
102
|
+
.optional(Schema.DecimalString)
|
|
131
103
|
.check(z.describe('Slippage-adjusted minimum destination amount in base units.'), z.meta({ examples: ['988000'] })),
|
|
132
104
|
outputAmount: z
|
|
133
|
-
.
|
|
105
|
+
.string()
|
|
106
|
+
.check(z.regex(/^\d+$/))
|
|
134
107
|
.check(z.describe('Expected destination amount in base units.'), z.meta({ examples: ['989102'] })),
|
|
135
108
|
outputAmountFormatted: z
|
|
136
|
-
.
|
|
109
|
+
.string()
|
|
137
110
|
.check(z.describe('Expected destination amount rendered with destination token decimals.'), z.meta({ examples: ['0.989102'] })),
|
|
138
111
|
sampledAt: z.iso
|
|
139
112
|
.datetime()
|
|
140
|
-
.check(z.describe('Timestamp for the live quote
|
|
141
|
-
}), 'Provider-derived
|
|
142
|
-
/**
|
|
143
|
-
schema.
|
|
113
|
+
.check(z.describe('Timestamp for the live quote probe.'), z.meta({ examples: ['2026-01-01T00:00:00Z'] })),
|
|
114
|
+
}), 'Provider-derived output, limits, and freshness data for a funding quote.');
|
|
115
|
+
/** Successful live funding quote. */
|
|
116
|
+
schema.FundingQuote = Schema.describe(z.object({
|
|
144
117
|
destinationChain: schema.Chain.check(z.describe('Destination chain, always Tempo mainnet in V1.')),
|
|
145
|
-
destinationToken: schema.Token.check(z.describe('Tempo token expected from this
|
|
146
|
-
errorCode: z
|
|
147
|
-
.nullable(z.string())
|
|
148
|
-
.check(z.describe('Stable route error code, when status is `error`.'), z.meta({ examples: ['provider_timeout'] })),
|
|
118
|
+
destinationToken: schema.Token.check(z.describe('Tempo token expected from this quote.')),
|
|
149
119
|
id: z
|
|
150
120
|
.string()
|
|
151
|
-
.check(z.describe('Stable deterministic
|
|
121
|
+
.check(z.describe('Stable deterministic funding quote id.'), z.meta({ examples: ['base-usdc-tempo-usdce-relay'] })),
|
|
152
122
|
provider: schema.ProviderRef,
|
|
153
123
|
quality: schema.Quality,
|
|
154
|
-
quote:
|
|
155
|
-
.nullable(schema.RouteQuote)
|
|
156
|
-
.check(z.describe('Provider-derived quote data, when a live route probe succeeds.')),
|
|
124
|
+
quote: schema.QuoteDetails,
|
|
157
125
|
sourceAmount: schema.TokenAmount,
|
|
158
126
|
sourceChain: schema.Chain.check(z.describe('Chain where the caller currently holds funds.')),
|
|
159
127
|
sourceToken: schema.Token.check(z.describe('Token the caller currently holds.')),
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
.check(z.describe('Provider-specific route status for the requested amount.'), z.meta({ examples: ['unknown'] })),
|
|
163
|
-
}), 'One provider-specific funding route candidate.');
|
|
164
|
-
/** Generic provider catalog entry. */
|
|
128
|
+
}), 'One successful provider-specific funding quote.');
|
|
129
|
+
/** Funding quote provider catalog entry. */
|
|
165
130
|
schema.Provider = Schema.describe(z.object({
|
|
166
|
-
|
|
167
|
-
.
|
|
168
|
-
.check(z.describe('
|
|
169
|
-
id: z.string().check(z.describe('Stable provider id.'), z.meta({ examples: ['relay'] })),
|
|
131
|
+
id: z
|
|
132
|
+
.enum(['across', 'relay', 'rhino'])
|
|
133
|
+
.check(z.describe('Stable provider id.'), z.meta({ examples: ['relay'] })),
|
|
170
134
|
kind: z
|
|
171
135
|
.string()
|
|
172
136
|
.check(z.describe('Provider category.'), z.meta({ examples: ['solverNetwork'] })),
|
|
@@ -177,54 +141,44 @@ export var schema;
|
|
|
177
141
|
.boolean()
|
|
178
142
|
.check(z.describe('Whether Tempo needs provider credentials to query or use this provider.'), z.meta({ examples: [false] })),
|
|
179
143
|
status: z
|
|
180
|
-
.enum(['configured', '
|
|
181
|
-
.check(z.describe('`
|
|
182
|
-
}), 'One
|
|
144
|
+
.enum(['configured', 'unconfigured'])
|
|
145
|
+
.check(z.describe('`configured` means live quotes are enabled for this deployment. `unconfigured` means the provider is supported but unavailable here.'), z.meta({ examples: ['configured', 'unconfigured'] })),
|
|
146
|
+
}), 'One funding quote provider.');
|
|
183
147
|
/** Chain inventory entry returned by the funding chains endpoint. */
|
|
184
148
|
schema.ChainInventory = Schema.describe(z.extend(schema.Chain, {
|
|
185
149
|
tokens: z.array(schema.Token).check(z.describe('Stablecoins known on this source chain.')),
|
|
186
150
|
}), 'One source chain and its known stablecoin inventory.');
|
|
187
|
-
/** Schemas for the
|
|
188
|
-
let
|
|
189
|
-
(function (
|
|
190
|
-
/** Query parameters for funding
|
|
191
|
-
|
|
151
|
+
/** Schemas for the quoteFunding operation. */
|
|
152
|
+
let quoteFunding;
|
|
153
|
+
(function (quoteFunding) {
|
|
154
|
+
/** Query parameters for live funding quotes. */
|
|
155
|
+
quoteFunding.Query = z
|
|
192
156
|
.strictObject({
|
|
193
157
|
destinationToken: z
|
|
194
158
|
.optional(z.string())
|
|
195
159
|
.check(z.describe('Tempo destination token symbol, address, or token key. Defaults to USDC.e.'), z.meta({ examples: ['USDC.e'] })),
|
|
196
|
-
include: z
|
|
197
|
-
.optional(z.string())
|
|
198
|
-
.check(z.describe('Comma-separated response expansions. V1 accepts `quotes`.'), z.meta({ examples: ['quotes'] })),
|
|
199
|
-
limit: Schema.Limit,
|
|
200
160
|
provider: z
|
|
201
|
-
.optional(z.
|
|
202
|
-
.check(z.describe('Only
|
|
161
|
+
.optional(z.enum(['across', 'relay', 'rhino']))
|
|
162
|
+
.check(z.describe('Only request a quote from this provider. Supported ids are `across`, `relay`, and `rhino`; omit it to query every configured provider.'), z.meta({ examples: ['relay'] })),
|
|
203
163
|
sourceAmount: z
|
|
204
164
|
.string()
|
|
205
|
-
.check(z.
|
|
165
|
+
.check(z.regex(/^(?=.*[1-9])\d+(\.\d+)?$/), z.describe('Positive source token amount. Base units by default, so 1 USDC is `1000000`.'), z.meta({ examples: ['1000000'] })),
|
|
206
166
|
sourceAmountUnits: z
|
|
207
167
|
._default(z.enum(['baseUnits', 'decimal']), 'baseUnits')
|
|
208
168
|
.check(z.describe('Whether `sourceAmount` is base units or a human-readable decimal.'), z.meta({ examples: ['baseUnits', 'decimal'] })),
|
|
209
169
|
sourceChain: z
|
|
210
170
|
.string()
|
|
211
|
-
.check(z.minLength(1), z.describe('Source chain alias or
|
|
212
|
-
sourceToken: z
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
|
|
216
|
-
'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',
|
|
217
|
-
],
|
|
218
|
-
})),
|
|
171
|
+
.check(z.minLength(1), z.describe('Source chain alias or stable id, such as `base`, `solana`, or `eip155:8453`.'), z.meta({ examples: ['base', 'eip155:8453'] })),
|
|
172
|
+
sourceToken: z
|
|
173
|
+
.string()
|
|
174
|
+
.check(z.minLength(1), z.describe('Source token symbol, contract address, or Tempo token key. Lookup is scoped to `sourceChain`; non-EVM addresses are case-sensitive. An unknown token returns an empty list.'), z.meta({ examples: ['USDC', '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913'] })),
|
|
219
175
|
})
|
|
220
|
-
.check(z.describe('Query parameters for
|
|
221
|
-
/** Non-paginated list of funding
|
|
222
|
-
|
|
223
|
-
data: z
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
}), 'A non-paginated list of funding route candidates.');
|
|
227
|
-
})(listFundingRoutes = schema.listFundingRoutes || (schema.listFundingRoutes = {}));
|
|
176
|
+
.check(z.describe('Query parameters for live funding quotes into Tempo.'));
|
|
177
|
+
/** Non-paginated list of successful funding quotes. */
|
|
178
|
+
quoteFunding.Response = Schema.describe(z.object({
|
|
179
|
+
data: z.array(schema.FundingQuote).check(z.describe('Successful live funding quotes.')),
|
|
180
|
+
}), 'A non-paginated list of successful live funding quotes.');
|
|
181
|
+
})(quoteFunding = schema.quoteFunding || (schema.quoteFunding = {}));
|
|
228
182
|
/** Schemas for the listFundingChains operation. */
|
|
229
183
|
let listFundingChains;
|
|
230
184
|
(function (listFundingChains) {
|
|
@@ -232,100 +186,83 @@ export var schema;
|
|
|
232
186
|
listFundingChains.Response = Schema.describe(z.object({
|
|
233
187
|
data: z
|
|
234
188
|
.array(schema.ChainInventory)
|
|
235
|
-
.check(z.describe('Source chains and stablecoins
|
|
189
|
+
.check(z.describe('Source chains and stablecoins supported by funding quotes.')),
|
|
236
190
|
}), 'A non-paginated list of source chains and stablecoin inventory.');
|
|
237
191
|
})(listFundingChains = schema.listFundingChains || (schema.listFundingChains = {}));
|
|
238
192
|
/** Schemas for the listProviders operation. */
|
|
239
193
|
let listProviders;
|
|
240
194
|
(function (listProviders) {
|
|
241
|
-
/**
|
|
242
|
-
listProviders.Query = z
|
|
243
|
-
.strictObject({
|
|
244
|
-
capability: z
|
|
245
|
-
.optional(z.enum(['fundingRoutes']))
|
|
246
|
-
.check(z.describe('Optional provider capability filter.'), z.meta({ examples: ['fundingRoutes'] })),
|
|
247
|
-
})
|
|
248
|
-
.check(z.describe('Query parameters for listing providers.'));
|
|
249
|
-
/** Non-paginated generic provider catalog. */
|
|
195
|
+
/** Non-paginated funding quote provider catalog. */
|
|
250
196
|
listProviders.Response = Schema.describe(z.object({
|
|
251
|
-
data: z.array(schema.Provider).check(z.describe("Providers in Tempo's
|
|
252
|
-
}), 'A non-paginated list of providers.');
|
|
197
|
+
data: z.array(schema.Provider).check(z.describe("Providers in Tempo's funding quote catalog.")),
|
|
198
|
+
}), 'A non-paginated list of funding quote providers.');
|
|
253
199
|
})(listProviders = schema.listProviders || (schema.listProviders = {}));
|
|
254
200
|
})(schema || (schema = {}));
|
|
255
|
-
|
|
256
|
-
const
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
description: '`GET /v1/funding/routes?sourceChain=tron&sourceToken=TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t&sourceAmount=1000000&provider=bridge`',
|
|
287
|
-
summary: 'Tron USDT',
|
|
288
|
-
value: {
|
|
289
|
-
data: FundingRoutes.listStaticRoutes({
|
|
290
|
-
limit: 10,
|
|
291
|
-
provider: 'bridge',
|
|
292
|
-
sourceAmount: '1000000',
|
|
293
|
-
sourceAmountUnits: 'baseUnits',
|
|
294
|
-
sourceChain: 'tron',
|
|
295
|
-
sourceToken: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',
|
|
296
|
-
}),
|
|
297
|
-
},
|
|
298
|
-
},
|
|
299
|
-
};
|
|
201
|
+
const fundingQuoteResponseExample = (() => {
|
|
202
|
+
const [candidate] = FundingQuotes.listQuoteCandidates({
|
|
203
|
+
provider: 'relay',
|
|
204
|
+
sourceAmount: '1000000',
|
|
205
|
+
sourceAmountUnits: 'baseUnits',
|
|
206
|
+
sourceChain: 'base',
|
|
207
|
+
sourceToken: 'USDC',
|
|
208
|
+
});
|
|
209
|
+
if (!candidate)
|
|
210
|
+
throw new Error('Missing Relay funding quote example candidate');
|
|
211
|
+
return {
|
|
212
|
+
data: [
|
|
213
|
+
{
|
|
214
|
+
...candidate,
|
|
215
|
+
quality: {
|
|
216
|
+
estimatedSeconds: 1,
|
|
217
|
+
liquiditySource: 'providerQuote',
|
|
218
|
+
sourceDetail: 'relay:quote-v2',
|
|
219
|
+
tier: 'liquid',
|
|
220
|
+
},
|
|
221
|
+
quote: {
|
|
222
|
+
inputAmount: '1000000',
|
|
223
|
+
minimumOutputAmount: '939242',
|
|
224
|
+
outputAmount: '979295',
|
|
225
|
+
outputAmountFormatted: '0.979295',
|
|
226
|
+
sampledAt: '2026-01-01T00:00:00.000Z',
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
],
|
|
230
|
+
};
|
|
231
|
+
})();
|
|
300
232
|
const fundingChainsResponseExample = {
|
|
301
|
-
data:
|
|
233
|
+
data: FundingQuotes.listChains(),
|
|
302
234
|
};
|
|
303
235
|
const providersResponseExample = {
|
|
304
|
-
data:
|
|
236
|
+
data: FundingQuotes.listProviders().map((provider) => ({
|
|
237
|
+
...provider,
|
|
238
|
+
status: 'configured',
|
|
239
|
+
})),
|
|
305
240
|
};
|
|
306
|
-
/** Mounts funding
|
|
241
|
+
/** Mounts live funding quotes and their supporting inventory endpoints. */
|
|
307
242
|
export function funding(options = {}) {
|
|
308
243
|
return new Hono()
|
|
309
|
-
.get('/v1/funding/
|
|
244
|
+
.get('/v1/funding/quotes', Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }), OpenApi.validate('query', schema.quoteFunding.Query, {
|
|
310
245
|
code: 'query_invalid',
|
|
311
246
|
message: 'Invalid query parameters',
|
|
312
247
|
}), OpenApi.describeRoute({
|
|
313
|
-
description: '
|
|
314
|
-
operationId: '
|
|
248
|
+
description: 'Returns live quotes for funding Tempo with a stablecoin. Omit `provider` to query all configured providers. This endpoint does not execute a transfer.',
|
|
249
|
+
operationId: 'quoteFunding',
|
|
315
250
|
responses: OpenApi.responses({
|
|
316
|
-
errors: {
|
|
251
|
+
errors: {
|
|
252
|
+
400: { codes: ['query_invalid'] },
|
|
253
|
+
502: {
|
|
254
|
+
codes: ['upstream_error'],
|
|
255
|
+
description: 'No quote succeeded and at least one matching provider failed unexpectedly.',
|
|
256
|
+
},
|
|
257
|
+
},
|
|
317
258
|
success: {
|
|
318
|
-
description: '
|
|
319
|
-
|
|
320
|
-
schema: schema.
|
|
259
|
+
description: 'Live funding quotes. An empty list means no provider returned a quote.',
|
|
260
|
+
example: fundingQuoteResponseExample,
|
|
261
|
+
schema: schema.quoteFunding.Response,
|
|
321
262
|
},
|
|
322
263
|
}),
|
|
323
|
-
summary: '
|
|
264
|
+
summary: 'Get funding quotes',
|
|
324
265
|
tags: ['Funding'],
|
|
325
|
-
}), Cache.response({
|
|
326
|
-
cacheControl: Cache.policies.noStore,
|
|
327
|
-
name: 'tempo-api:funding-routes:v1',
|
|
328
|
-
key: (c) => Cache.urlKey(c, schema.listFundingRoutes.Query),
|
|
329
266
|
}), async (c) => {
|
|
330
267
|
if (Auth.narrowAccess)
|
|
331
268
|
return Auth.paidAccessError(c);
|
|
@@ -336,15 +273,13 @@ export function funding(options = {}) {
|
|
|
336
273
|
});
|
|
337
274
|
const query = c.req.valid('query');
|
|
338
275
|
try {
|
|
339
|
-
|
|
340
|
-
return c.json(Response.validated(schema.
|
|
341
|
-
data: await
|
|
276
|
+
c.header('Cache-Control', 'no-store');
|
|
277
|
+
return c.json(Response.validated(schema.quoteFunding.Response, {
|
|
278
|
+
data: await FundingQuotes.listQuotes({
|
|
342
279
|
adapters: options.adapters,
|
|
343
280
|
adapterTimeoutMs: options.adapterTimeoutMs,
|
|
344
281
|
cache: { bypass: cacheBypass(c.req.raw) },
|
|
345
282
|
destinationToken: query.destinationToken,
|
|
346
|
-
include,
|
|
347
|
-
limit: query.limit,
|
|
348
283
|
provider: query.provider,
|
|
349
284
|
sourceAmount: query.sourceAmount,
|
|
350
285
|
sourceAmountUnits: query.sourceAmountUnits,
|
|
@@ -357,15 +292,28 @@ export function funding(options = {}) {
|
|
|
357
292
|
const message = requestErrorMessage(cause);
|
|
358
293
|
if (message)
|
|
359
294
|
return Response.error(c, { code: 'query_invalid', message, status: 400 });
|
|
295
|
+
if (cause instanceof FundingQuotes.ProviderQuoteError) {
|
|
296
|
+
const failures = cause.failures.map(FundingQuoteProviders.providerFailure);
|
|
297
|
+
const failure = failures[0];
|
|
298
|
+
if (failure)
|
|
299
|
+
c.set('providerFailure', failure);
|
|
300
|
+
if (failures.length > 1)
|
|
301
|
+
c.set('providerFailures', failures);
|
|
302
|
+
return Response.error(c, {
|
|
303
|
+
code: 'upstream_error',
|
|
304
|
+
message: 'Quote providers could not complete the request.',
|
|
305
|
+
status: 502,
|
|
306
|
+
});
|
|
307
|
+
}
|
|
360
308
|
throw cause;
|
|
361
309
|
}
|
|
362
310
|
})
|
|
363
311
|
.get('/v1/funding/chains', Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }), OpenApi.describeRoute({
|
|
364
|
-
description: 'Lists source chains and stablecoins
|
|
312
|
+
description: 'Lists the source chains and stablecoins you can use when requesting a funding quote.',
|
|
365
313
|
operationId: 'listFundingChains',
|
|
366
314
|
responses: OpenApi.responses({
|
|
367
315
|
success: {
|
|
368
|
-
description: '
|
|
316
|
+
description: 'Supported source chains and stablecoins.',
|
|
369
317
|
example: fundingChainsResponseExample,
|
|
370
318
|
schema: schema.listFundingChains.Response,
|
|
371
319
|
},
|
|
@@ -380,57 +328,42 @@ export function funding(options = {}) {
|
|
|
380
328
|
if (Auth.narrowAccess)
|
|
381
329
|
return Auth.paidAccessError(c);
|
|
382
330
|
return c.json(Response.validated(schema.listFundingChains.Response, {
|
|
383
|
-
data:
|
|
331
|
+
data: FundingQuotes.listChains(),
|
|
384
332
|
}), 200);
|
|
385
333
|
})
|
|
386
|
-
.get('/v1/providers', Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }), OpenApi.
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
}), OpenApi.describeRoute({
|
|
390
|
-
description: 'Lists provider metadata, capability flags, auth requirements, and integration status across provider domains. `inventoryOnly` providers can appear in static route candidates; `planned` providers are visible for roadmap transparency and may not return candidates.',
|
|
391
|
-
operationId: 'listProviders',
|
|
334
|
+
.get('/v1/funding/providers', Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }), OpenApi.describeRoute({
|
|
335
|
+
description: 'Lists funding quote providers and whether live quoting is configured for this deployment.',
|
|
336
|
+
operationId: 'listFundingProviders',
|
|
392
337
|
responses: OpenApi.responses({
|
|
393
|
-
errors: { 400: { codes: ['query_invalid'] } },
|
|
394
338
|
success: {
|
|
395
|
-
description: '
|
|
339
|
+
description: 'Funding quote providers supported by Tempo.',
|
|
396
340
|
example: providersResponseExample,
|
|
397
341
|
schema: schema.listProviders.Response,
|
|
398
342
|
},
|
|
399
343
|
}),
|
|
400
|
-
summary: 'List providers',
|
|
401
|
-
tags: ['
|
|
344
|
+
summary: 'List funding providers',
|
|
345
|
+
tags: ['Funding'],
|
|
402
346
|
}), Cache.response({
|
|
403
347
|
cacheControl: Cache.policies.stable,
|
|
404
|
-
name: 'tempo-api:providers:v1',
|
|
405
|
-
key: (c) =>
|
|
348
|
+
name: 'tempo-api:funding-providers:v1',
|
|
349
|
+
key: (c) => c.req.url,
|
|
406
350
|
}), (c) => {
|
|
407
351
|
if (Auth.narrowAccess)
|
|
408
352
|
return Auth.paidAccessError(c);
|
|
409
|
-
if (OpenApi.narrowValidation)
|
|
410
|
-
return OpenApi.validationError(c, {
|
|
411
|
-
code: 'query_invalid',
|
|
412
|
-
message: 'Invalid query parameters',
|
|
413
|
-
});
|
|
414
|
-
const query = c.req.valid('query');
|
|
415
353
|
return c.json(Response.validated(schema.listProviders.Response, {
|
|
416
|
-
data:
|
|
417
|
-
adapters: options.adapters,
|
|
418
|
-
capability: query.capability,
|
|
419
|
-
}),
|
|
354
|
+
data: FundingQuotes.listProviders({ adapters: options.adapters }),
|
|
420
355
|
}), 200);
|
|
421
356
|
});
|
|
422
357
|
}
|
|
423
358
|
// Maps caller-input errors to a specific 400 message; anything else rethrows.
|
|
424
359
|
function requestErrorMessage(cause) {
|
|
425
|
-
if (cause instanceof
|
|
360
|
+
if (cause instanceof FundingQuotes.InvalidAmountError)
|
|
426
361
|
return 'Invalid `sourceAmount`.';
|
|
427
|
-
if (cause instanceof
|
|
428
|
-
return 'Unsupported `include`.';
|
|
429
|
-
if (cause instanceof FundingRoutes.UnsupportedDestinationTokenError)
|
|
362
|
+
if (cause instanceof FundingQuotes.UnsupportedDestinationTokenError)
|
|
430
363
|
return 'Unsupported `destinationToken`.';
|
|
431
|
-
if (cause instanceof
|
|
364
|
+
if (cause instanceof FundingQuotes.UnsupportedProviderError)
|
|
432
365
|
return 'Unsupported `provider`.';
|
|
433
|
-
if (cause instanceof
|
|
366
|
+
if (cause instanceof FundingQuotes.UnsupportedSourceChainError)
|
|
434
367
|
return 'Unsupported `sourceChain`.';
|
|
435
368
|
return undefined;
|
|
436
369
|
}
|