tapimo 0.5.0 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/dist/App.d.ts +4854 -4829
  2. package/dist/App.d.ts.map +1 -1
  3. package/dist/App.js +20 -2
  4. package/dist/App.js.map +1 -1
  5. package/dist/Assets.js +3 -3
  6. package/dist/Assets.js.map +1 -1
  7. package/dist/Scope.d.ts.map +1 -1
  8. package/dist/Scope.js +1 -2
  9. package/dist/Scope.js.map +1 -1
  10. package/dist/Webhooks.d.ts +1 -1
  11. package/dist/Webhooks.d.ts.map +1 -1
  12. package/dist/Webhooks.js +5 -10
  13. package/dist/Webhooks.js.map +1 -1
  14. package/dist/admin/App.d.ts +6 -34
  15. package/dist/admin/App.d.ts.map +1 -1
  16. package/dist/admin/apps/api-keys.d.ts +3 -3
  17. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  18. package/dist/admin/apps/api-keys.js +4 -1
  19. package/dist/admin/apps/api-keys.js.map +1 -1
  20. package/dist/admin/apps/scopes.d.ts +6 -34
  21. package/dist/admin/apps/scopes.d.ts.map +1 -1
  22. package/dist/admin/apps/scopes.js +2 -2
  23. package/dist/admin/apps/scopes.js.map +1 -1
  24. package/dist/admin/apps/verified-tokens.d.ts +2 -2
  25. package/dist/admin/ui.generated.d.ts +1 -1
  26. package/dist/admin/ui.generated.js +33 -33
  27. package/dist/admin/ui.generated.js.map +1 -1
  28. package/dist/apps/data/App.d.ts +1398 -1405
  29. package/dist/apps/data/App.d.ts.map +1 -1
  30. package/dist/apps/data/App.js +25 -38
  31. package/dist/apps/data/App.js.map +1 -1
  32. package/dist/apps/data/FundingQuoteProviders.d.ts +108 -3
  33. package/dist/apps/data/FundingQuoteProviders.d.ts.map +1 -1
  34. package/dist/apps/data/FundingQuoteProviders.js +409 -2
  35. package/dist/apps/data/FundingQuoteProviders.js.map +1 -1
  36. package/dist/apps/data/routes/activities.d.ts +245 -245
  37. package/dist/apps/data/routes/blocks.d.ts +123 -123
  38. package/dist/apps/data/routes/funding.d.ts +236 -146
  39. package/dist/apps/data/routes/funding.d.ts.map +1 -1
  40. package/dist/apps/data/routes/funding.js +23 -12
  41. package/dist/apps/data/routes/funding.js.map +1 -1
  42. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  43. package/dist/apps/data/routes/indexer.js +9 -2
  44. package/dist/apps/data/routes/indexer.js.map +1 -1
  45. package/dist/apps/data/routes/rpc.d.ts +31 -31
  46. package/dist/apps/data/routes/tokenlist.d.ts +36 -36
  47. package/dist/apps/data/routes/transactions.d.ts +281 -281
  48. package/dist/apps/data/routes/transfers.d.ts +66 -73
  49. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  50. package/dist/apps/data/routes/transfers.js +21 -27
  51. package/dist/apps/data/routes/transfers.js.map +1 -1
  52. package/dist/apps/data/routes/verified-tokens.d.ts +86 -86
  53. package/dist/apps/data/routes/webhooks.d.ts +35 -35
  54. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  55. package/dist/apps/data/routes/webhooks.js +176 -42
  56. package/dist/apps/data/routes/webhooks.js.map +1 -1
  57. package/dist/apps/management/App.d.ts +520 -504
  58. package/dist/apps/management/App.d.ts.map +1 -1
  59. package/dist/apps/management/Billing.d.ts.map +1 -1
  60. package/dist/apps/management/Billing.js +5 -4
  61. package/dist/apps/management/Billing.js.map +1 -1
  62. package/dist/apps/management/routes/api-keys.d.ts +120 -120
  63. package/dist/apps/management/routes/billing.d.ts +211 -211
  64. package/dist/apps/management/routes/billing.d.ts.map +1 -1
  65. package/dist/apps/management/routes/billing.js +1 -1
  66. package/dist/apps/management/routes/billing.js.map +1 -1
  67. package/dist/apps/management/routes/invitations.d.ts +72 -72
  68. package/dist/apps/management/routes/invite-links.d.ts +159 -159
  69. package/dist/apps/management/routes/me.d.ts +17 -17
  70. package/dist/apps/management/routes/members.d.ts +80 -80
  71. package/dist/apps/management/routes/orgs.d.ts +59 -43
  72. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  73. package/dist/apps/management/routes/orgs.js +18 -1
  74. package/dist/apps/management/routes/orgs.js.map +1 -1
  75. package/dist/apps/management/routes/projects.d.ts +109 -109
  76. package/dist/apps/management/routes/scopes.d.ts +11 -11
  77. package/dist/apps/management/routes/usage.d.ts +79 -79
  78. package/dist/apps/mcp.js +2 -2
  79. package/dist/apps/mcp.js.map +1 -1
  80. package/dist/apps/relay/App.d.ts +2 -2
  81. package/dist/apps/relay/App.js +2 -2
  82. package/dist/apps/relay/Sponsorships.d.ts +3 -0
  83. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  84. package/dist/apps/relay/Sponsorships.js +15 -1
  85. package/dist/apps/relay/Sponsorships.js.map +1 -1
  86. package/dist/db/Db.d.ts.map +1 -1
  87. package/dist/db/Db.js +4 -0
  88. package/dist/db/Db.js.map +1 -1
  89. package/dist/db/Schema.js +1 -1
  90. package/dist/db/Schema.js.map +1 -1
  91. package/dist/db/tables/organizations.d.ts +6 -0
  92. package/dist/db/tables/organizations.d.ts.map +1 -1
  93. package/dist/db/tables/organizations.js +26 -0
  94. package/dist/db/tables/organizations.js.map +1 -1
  95. package/dist/db/tables/requestUsage.d.ts +2 -11
  96. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  97. package/dist/db/tables/requestUsage.js +1 -20
  98. package/dist/db/tables/requestUsage.js.map +1 -1
  99. package/dist/db/tables/sponsoredTransactions.d.ts +2 -1
  100. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  101. package/dist/db/tables/sponsoredTransactions.js +52 -10
  102. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  103. package/dist/internal/Auth.d.ts +4 -0
  104. package/dist/internal/Auth.d.ts.map +1 -1
  105. package/dist/internal/Auth.js +15 -8
  106. package/dist/internal/Auth.js.map +1 -1
  107. package/dist/internal/Cache.d.ts.map +1 -1
  108. package/dist/internal/Cache.js +9 -1
  109. package/dist/internal/Cache.js.map +1 -1
  110. package/dist/internal/EdgeCache.d.ts.map +1 -1
  111. package/dist/internal/EdgeCache.js +12 -3
  112. package/dist/internal/EdgeCache.js.map +1 -1
  113. package/dist/internal/FundingQuotes.d.ts +176 -56
  114. package/dist/internal/FundingQuotes.d.ts.map +1 -1
  115. package/dist/internal/FundingQuotes.js +100 -5
  116. package/dist/internal/FundingQuotes.js.map +1 -1
  117. package/dist/internal/Log.d.ts +18 -12
  118. package/dist/internal/Log.d.ts.map +1 -1
  119. package/dist/internal/Log.js +2 -0
  120. package/dist/internal/Log.js.map +1 -1
  121. package/dist/internal/RateLimit.d.ts +2 -0
  122. package/dist/internal/RateLimit.d.ts.map +1 -1
  123. package/dist/internal/RateLimit.js +4 -4
  124. package/dist/internal/RateLimit.js.map +1 -1
  125. package/dist/internal/Tidx.d.ts +9 -3
  126. package/dist/internal/Tidx.d.ts.map +1 -1
  127. package/dist/internal/Tidx.js +13 -7
  128. package/dist/internal/Tidx.js.map +1 -1
  129. package/dist/internal/Viem.d.ts +14 -1
  130. package/dist/internal/Viem.d.ts.map +1 -1
  131. package/dist/internal/Viem.js +19 -1
  132. package/dist/internal/Viem.js.map +1 -1
  133. package/package.json +7 -2
  134. package/src/ApiKeys.test.ts +2 -0
  135. package/src/App.test.ts +15 -4
  136. package/src/App.ts +31 -5
  137. package/src/Assets.ts +3 -3
  138. package/src/Client.test-d.ts +30 -3
  139. package/src/Scope.ts +4 -2
  140. package/src/Webhooks.ts +5 -10
  141. package/src/admin/apps/api-keys.test.ts +27 -0
  142. package/src/admin/apps/api-keys.ts +8 -1
  143. package/src/admin/apps/scopes.test.ts +7 -2
  144. package/src/admin/apps/scopes.ts +2 -2
  145. package/src/admin/ui/src/components/Dialog.tsx +8 -2
  146. package/src/admin/ui/src/lib/scopes.test.ts +19 -0
  147. package/src/admin/ui/src/lib/scopes.ts +12 -0
  148. package/src/admin/ui/src/routes/api-keys.tsx +128 -27
  149. package/src/admin/ui.generated.ts +33 -33
  150. package/src/apps/composition.test.ts +77 -0
  151. package/src/apps/data/App.ts +25 -45
  152. package/src/apps/data/FundingQuoteProviders.test.ts +615 -5
  153. package/src/apps/data/FundingQuoteProviders.ts +570 -4
  154. package/src/apps/data/routes/funding.test.ts +181 -7
  155. package/src/apps/data/routes/funding.ts +27 -12
  156. package/src/apps/data/routes/indexer.test.ts +82 -20
  157. package/src/apps/data/routes/indexer.ts +8 -2
  158. package/src/apps/data/routes/tokens.test.ts +54 -0
  159. package/src/apps/data/routes/transfers.test.ts +73 -1
  160. package/src/apps/data/routes/transfers.ts +24 -30
  161. package/src/apps/data/routes/webhooks.test.ts +203 -0
  162. package/src/apps/data/routes/webhooks.ts +191 -54
  163. package/src/apps/management/Billing.test.ts +52 -3
  164. package/src/apps/management/Billing.ts +5 -4
  165. package/src/apps/management/routes/billing.ts +6 -1
  166. package/src/apps/management/routes/orgs.ts +19 -1
  167. package/src/apps/mcp.test.ts +18 -0
  168. package/src/apps/mcp.ts +2 -2
  169. package/src/apps/relay/App.test.ts +6 -5
  170. package/src/apps/relay/App.ts +2 -2
  171. package/src/apps/relay/Sponsorships.test.ts +2 -2
  172. package/src/apps/relay/Sponsorships.ts +24 -1
  173. package/src/db/Db.test.ts +5 -5
  174. package/src/db/Db.ts +4 -0
  175. package/src/db/Schema.ts +1 -1
  176. package/src/db/tables/billingSettings.test.ts +2 -2
  177. package/src/db/tables/organizations.test.ts +32 -2
  178. package/src/db/tables/organizations.ts +28 -0
  179. package/src/db/tables/requestUsage.ts +3 -23
  180. package/src/db/tables/sponsoredTransactions.test.ts +60 -2
  181. package/src/db/tables/sponsoredTransactions.ts +67 -21
  182. package/src/db/tables/stripeCustomers.test.ts +2 -2
  183. package/src/internal/Auth.test.ts +63 -10
  184. package/src/internal/Auth.ts +21 -9
  185. package/src/internal/Cache.test.ts +19 -0
  186. package/src/internal/Cache.ts +13 -1
  187. package/src/internal/EdgeCache.test.ts +40 -0
  188. package/src/internal/EdgeCache.ts +11 -3
  189. package/src/internal/FundingQuotes.test.ts +130 -3
  190. package/src/internal/FundingQuotes.ts +113 -6
  191. package/src/internal/Log.ts +21 -14
  192. package/src/internal/RateLimit.test.ts +12 -0
  193. package/src/internal/RateLimit.ts +4 -4
  194. package/src/internal/Tidx.test.ts +48 -0
  195. package/src/internal/Tidx.ts +21 -7
  196. package/src/internal/Viem.test.ts +46 -0
  197. package/src/internal/Viem.ts +34 -1
@@ -25,6 +25,46 @@ async function paths(app: { request: (path: string) => Promise<Response> | Respo
25
25
  return Object.keys((await document(app)).paths)
26
26
  }
27
27
 
28
+ describe('App.create()', () => {
29
+ test('publishes shared chain context without data routes', async () => {
30
+ const rpc = { url: () => 'https://rpc.example' }
31
+ const group = new Hono<App.Environment>().get('/context', (c) => {
32
+ const client = c.get('getClient')()
33
+ return c.json({
34
+ chainId: c.get('chainId'),
35
+ clientChainId: client.chain.id,
36
+ memoized: client === c.get('getClient')(),
37
+ rpc: c.get('rpc') === rpc,
38
+ supportedChainIds: [...c.get('supportedChainIds')].sort((a, b) => a - b),
39
+ })
40
+ })
41
+ const app = App.create({
42
+ auth: false,
43
+ db: TestApp.database(),
44
+ defaultChainId: 1337,
45
+ rpc,
46
+ supportedChainIds: [999],
47
+ }).route('/', group)
48
+
49
+ const response = await app.request('/context')
50
+
51
+ expect(await response.json()).toMatchInlineSnapshot(`
52
+ {
53
+ "chainId": 1337,
54
+ "clientChainId": 1337,
55
+ "memoized": true,
56
+ "rpc": true,
57
+ "supportedChainIds": [
58
+ 999,
59
+ 1337,
60
+ 4217,
61
+ 42431,
62
+ ],
63
+ }
64
+ `)
65
+ })
66
+ })
67
+
28
68
  describe('App.from()', () => {
29
69
  test('contributes external route-group metadata', async () => {
30
70
  const group = new Hono().get(
@@ -110,6 +150,43 @@ describe('data()', () => {
110
150
  const orgs = await app.request('/v1/orgs')
111
151
  expect(orgs.status).toBe(404)
112
152
  })
153
+
154
+ test('inherits shared chain context', async () => {
155
+ const rpc = { url: () => 'https://rpc.example' }
156
+ const context = new Hono<App.Environment>().get('/context', (c) =>
157
+ c.json({
158
+ chainId: c.get('chainId'),
159
+ clientChainId: c.get('getClient')().chain.id,
160
+ rpc: c.get('rpc') === rpc,
161
+ supportedChainIds: [...c.get('supportedChainIds')].sort((a, b) => a - b),
162
+ }),
163
+ )
164
+ const app = App.create({
165
+ auth: false,
166
+ db: TestApp.database(),
167
+ defaultChainId: 333,
168
+ rpc,
169
+ supportedChainIds: [444],
170
+ })
171
+ .route('/', data())
172
+ .route('/', context)
173
+
174
+ const response = await app.request('/context')
175
+
176
+ expect(await response.json()).toMatchInlineSnapshot(`
177
+ {
178
+ "chainId": 333,
179
+ "clientChainId": 333,
180
+ "rpc": true,
181
+ "supportedChainIds": [
182
+ 333,
183
+ 444,
184
+ 4217,
185
+ 42431,
186
+ ],
187
+ }
188
+ `)
189
+ })
113
190
  })
114
191
 
115
192
  describe('relay()', () => {
@@ -33,59 +33,36 @@ import { verifiedTokens } from './routes/verified-tokens.js'
33
33
  import { schema as webhookSchema, webhooks } from './routes/webhooks.js'
34
34
 
35
35
  /**
36
- * The chain-data route group: read endpoints over blocks, transactions, tokens,
37
- * the exchange/fee-AMM, and the RPC/indexer passthroughs. It owns all chain
38
- * configuration and publishes the chain clients on request context.
36
+ * The chain-data route group extends app context with TIDX, assets, zones,
37
+ * verified tokens, and webhooks, and exposes indexed and RPC-backed reads.
39
38
  *
40
39
  * ```ts
41
40
  * App.create(options).route('/', data())
42
41
  * ```
43
42
  */
44
43
  export function data(options: data.Options = {}) {
45
- const { assets, defaultChainId = Viem.defaultChainId, rpc: rpc_option, tidx } = options
44
+ const { assets, tidx } = options
46
45
 
47
46
  // Zone endpoints are explicit trust boundaries; the API never derives them.
48
47
  const zones = new Map((options.zones ?? []).map((zone) => [zone.chainId, zone]))
49
48
  const dataRouteHandlers = new Set<unknown>()
50
49
 
51
- // The chain ids this deployment serves (built-in public chains plus
52
- // `defaultChainId` and any explicit `supportedChainIds`). Published on context
53
- // so handlers with a path `chainId` can guard it too.
54
- const supportedChainIds = new Set<number>([
55
- ...Object.keys(Viem.url).map(Number),
56
- ...Object.keys(Tidx.url).map(Number),
57
- defaultChainId,
58
- ...(options.supportedChainIds ?? []),
59
- ...zones.keys(),
60
- ])
61
-
62
- // Memoize one viem client per resolved upstream (stateless HTTP transports).
63
- // Keying on the resolved output (`url`+`basicAuth`+`chainId`), not the
64
- // principal, bounds cardinality by the number of distinct upstreams.
65
- const clients = new Map<string, ReturnType<typeof Viem.getClient>>()
66
- const getClient = (chainId = defaultChainId, principal: Auth.Principal | null = null) => {
67
- const { url, basicAuth } = Viem.resolve(rpc_option, { chainId, principal })
68
- const cacheKey = `${url}|${basicAuth ?? ''}|${chainId}`
69
- const existing = clients.get(cacheKey)
70
- if (existing) return existing
71
- const client = Viem.getClient({ chainId, principal, rpc: rpc_option })
72
- clients.set(cacheKey, client)
73
- return client
74
- }
75
-
76
- // Memoize TIDX clients per resolved upstream.
77
- const getTidx = Tidx.createGetClient({ defaultChainId, tidx })
50
+ const getTidx = Tidx.createGetClient({ tidx })
78
51
 
79
52
  const app = new Hono<App.Environment>()
80
53
  // Publish the chain-data context vars for this group's handlers. Runs after
81
54
  // `App.create`'s middleware, so `getClient`/`getTidx` can key on the
82
55
  // resolved principal and `getAsset` can read `basePath` off context.
83
56
  .use('*', async (c, next) => {
84
- c.set('chainId', defaultChainId)
57
+ const getClient = c.get('getClient')
58
+ const supportedChainIds = new Set<number>([
59
+ ...c.get('supportedChainIds'),
60
+ ...Object.keys(Tidx.url).map(Number),
61
+ ...zones.keys(),
62
+ ])
85
63
  c.set('getAsset', createGetAsset({ assets, basePath: c.get('basePath'), origin: new URL(c.req.url).origin })) // prettier-ignore
86
- c.set('getClient', (chainId) => getClient(chainId, Auth.getPrincipal(c)))
87
- c.set('getTidx', (chainId) => getTidx(chainId, Auth.getPrincipal(c)))
88
- c.set('rpc', rpc_option)
64
+ c.set('getClient', (chainId) => getClient(chainId ?? c.get('chainId')))
65
+ c.set('getTidx', (chainId) => getTidx(chainId ?? c.get('chainId'), Auth.getPrincipal(c)))
89
66
  c.set('supportedChainIds', supportedChainIds)
90
67
  c.set('tidx', tidx)
91
68
  c.set('verifiedTokens', options.verifiedTokens === false ? undefined : (options.verifiedTokens ?? {})) // prettier-ignore
@@ -95,6 +72,8 @@ export function data(options: data.Options = {}) {
95
72
  })
96
73
  // Resolve one chain for every data route before auth and handlers use it.
97
74
  .use('*', async (c, next) => {
75
+ const defaultChainId = c.get('chainId')
76
+ const supportedChainIds = c.get('supportedChainIds')
98
77
  const selection = resolveChainSelector({
99
78
  c,
100
79
  defaultChainId,
@@ -118,7 +97,7 @@ export function data(options: data.Options = {}) {
118
97
  if (zones.size === 0) return next()
119
98
  const selection = resolveChainSelector({
120
99
  c,
121
- defaultChainId,
100
+ defaultChainId: c.get('chainId'),
122
101
  handlers: dataRouteHandlers,
123
102
  })
124
103
  if (!selection.matched) return next()
@@ -155,7 +134,7 @@ export function data(options: data.Options = {}) {
155
134
 
156
135
  const selection = resolveChainSelector({
157
136
  c,
158
- defaultChainId,
137
+ defaultChainId: c.get('chainId'),
159
138
  handlers: dataRouteHandlers,
160
139
  })
161
140
  if (!selection.matched || !Viem.isMainnet(c.get('chainId'))) return next()
@@ -197,7 +176,11 @@ export function data(options: data.Options = {}) {
197
176
  .route('/', coingecko())
198
177
  .route('/', blocksByTimestampCompat())
199
178
  const edgeCacheEligible = (c: Context<App.Environment>) => {
200
- const selection = resolveChainSelector({ c, defaultChainId, handlers: dataRouteHandlers })
179
+ const selection = resolveChainSelector({
180
+ c,
181
+ defaultChainId: c.get('chainId'),
182
+ handlers: dataRouteHandlers,
183
+ })
201
184
  return (
202
185
  selection.matched &&
203
186
  !selection.conflict &&
@@ -210,7 +193,10 @@ export function data(options: data.Options = {}) {
210
193
  dataRouteHandlers.add(route.handler)
211
194
  if (zones.size > 0) EdgeCache.setEligibility(route.handler, edgeCacheEligible)
212
195
  }
213
- return Metadata.attach(app, openapi)
196
+ return Metadata.attach(app, {
197
+ ...openapi,
198
+ supportedChainIds: [...Object.keys(Tidx.url).map(Number), ...zones.keys()],
199
+ })
214
200
  }
215
201
 
216
202
  export declare namespace data {
@@ -218,14 +204,8 @@ export declare namespace data {
218
204
  type Options = {
219
205
  /** Static API asset store for the current runtime (e.g. `Assets.cloudflareR2(...)`). Omit to skip static assets — token logo URIs go unresolved. */
220
206
  assets?: Assets.Assets | undefined
221
- /** Default Tempo chain id for requests that omit `chainId`. */
222
- defaultChainId?: Viem.ChainId | undefined
223
207
  /** Funding quote provider configuration. */
224
208
  funding?: funding.Options | undefined
225
- /** Tempo RPC options: a static config, or a per-request resolver that routes by request principal to a separate (e.g. public, no-auth) RPC. */
226
- rpc?: Viem.getClient.Rpc | undefined
227
- /** Extra chain ids this deployment serves, beyond the built-in public chains and `defaultChainId`. A `chainId` outside this set is rejected with a 400. */
228
- supportedChainIds?: readonly number[] | undefined
229
209
  /** TIDX query client options. */
230
210
  tidx?: Tidx.getClient.Tidx | undefined
231
211
  /** Verified-token feature configuration. Enabled by default (token rows live in `db`; empty until published); pass `false` to always serve an empty verified list. */