tapimo 0.12.0 → 0.13.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.
Files changed (257) hide show
  1. package/dist/App.d.ts +5561 -5026
  2. package/dist/App.d.ts.map +1 -1
  3. package/dist/App.js +38 -3
  4. package/dist/App.js.map +1 -1
  5. package/dist/Scope.d.ts +2 -0
  6. package/dist/Scope.d.ts.map +1 -1
  7. package/dist/Scope.js +17 -0
  8. package/dist/Scope.js.map +1 -1
  9. package/dist/admin/App.d.ts +123 -74
  10. package/dist/admin/App.d.ts.map +1 -1
  11. package/dist/admin/apps/api-keys.d.ts +80 -0
  12. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  13. package/dist/admin/apps/api-keys.js +54 -0
  14. package/dist/admin/apps/api-keys.js.map +1 -1
  15. package/dist/admin/apps/earn-vaults.d.ts +15 -15
  16. package/dist/admin/apps/earn-vaults.js +1 -1
  17. package/dist/admin/apps/verified-tokens.d.ts +81 -81
  18. package/dist/admin/ui.generated.d.ts +1 -1
  19. package/dist/admin/ui.generated.d.ts.map +1 -1
  20. package/dist/admin/ui.generated.js +151 -151
  21. package/dist/admin/ui.generated.js.map +1 -1
  22. package/dist/apps/Zones.d.ts +16 -16
  23. package/dist/apps/Zones.js +4 -4
  24. package/dist/apps/data/App.js +18 -18
  25. package/dist/apps/data/App.js.map +1 -1
  26. package/dist/apps/data/ZoneSelection.d.ts +8 -8
  27. package/dist/apps/data/ZoneSelection.d.ts.map +1 -1
  28. package/dist/apps/data/ZoneSelection.js +1 -1
  29. package/dist/apps/data/ZoneSelection.js.map +1 -1
  30. package/dist/apps/data/routes/activities.d.ts +588 -584
  31. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  32. package/dist/apps/data/routes/activities.js +1561 -1239
  33. package/dist/apps/data/routes/activities.js.map +1 -1
  34. package/dist/apps/data/routes/balances.d.ts +26 -26
  35. package/dist/apps/data/routes/balances.d.ts.map +1 -1
  36. package/dist/apps/data/routes/balances.js +43 -16
  37. package/dist/apps/data/routes/balances.js.map +1 -1
  38. package/dist/apps/data/routes/blocks.d.ts +44 -44
  39. package/dist/apps/data/routes/blocks.d.ts.map +1 -1
  40. package/dist/apps/data/routes/blocks.js +21 -11
  41. package/dist/apps/data/routes/blocks.js.map +1 -1
  42. package/dist/apps/data/routes/coingecko.d.ts +3 -3
  43. package/dist/apps/data/routes/earn.d.ts +18 -18
  44. package/dist/apps/data/routes/earn.js +13 -13
  45. package/dist/apps/data/routes/exchanges.d.ts +145 -145
  46. package/dist/apps/data/routes/fee-amm.d.ts +2 -2
  47. package/dist/apps/data/routes/receipts.d.ts +155 -55
  48. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  49. package/dist/apps/data/routes/receipts.js +28 -10
  50. package/dist/apps/data/routes/receipts.js.map +1 -1
  51. package/dist/apps/data/routes/tokenlist.d.ts +13 -13
  52. package/dist/apps/data/routes/tokens.d.ts +98 -98
  53. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  54. package/dist/apps/data/routes/tokens.js +51 -20
  55. package/dist/apps/data/routes/tokens.js.map +1 -1
  56. package/dist/apps/data/routes/transactions.d.ts +7 -2
  57. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  58. package/dist/apps/data/routes/transactions.js +37 -17
  59. package/dist/apps/data/routes/transactions.js.map +1 -1
  60. package/dist/apps/data/routes/transfers.d.ts +1 -1
  61. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  62. package/dist/apps/data/routes/transfers.js +18 -12
  63. package/dist/apps/data/routes/transfers.js.map +1 -1
  64. package/dist/apps/data/routes/valuation.d.ts +1 -1
  65. package/dist/apps/data/routes/valuation.d.ts.map +1 -1
  66. package/dist/apps/data/routes/valuation.js +12 -7
  67. package/dist/apps/data/routes/valuation.js.map +1 -1
  68. package/dist/apps/data/routes/verified-tokens.d.ts +3 -3
  69. package/dist/apps/data/routes/webhooks.d.ts +11 -11
  70. package/dist/apps/data/routes/zones.d.ts +14 -14
  71. package/dist/apps/data/routes/zones.js +1 -1
  72. package/dist/apps/funding/App.d.ts +11 -0
  73. package/dist/apps/funding/App.d.ts.map +1 -1
  74. package/dist/apps/funding/routes/deposit-addresses.d.ts.map +1 -1
  75. package/dist/apps/funding/routes/deposit-addresses.js +16 -11
  76. package/dist/apps/funding/routes/deposit-addresses.js.map +1 -1
  77. package/dist/apps/funding/routes/transfers.d.ts +60 -48
  78. package/dist/apps/funding/routes/transfers.d.ts.map +1 -1
  79. package/dist/apps/funding/routes/transfers.js +27 -19
  80. package/dist/apps/funding/routes/transfers.js.map +1 -1
  81. package/dist/apps/management/App.d.ts +4487 -3963
  82. package/dist/apps/management/App.d.ts.map +1 -1
  83. package/dist/apps/management/routes/api-keys.d.ts +710 -159
  84. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  85. package/dist/apps/management/routes/api-keys.js +236 -4
  86. package/dist/apps/management/routes/api-keys.js.map +1 -1
  87. package/dist/apps/management/routes/faucet.d.ts +6 -6
  88. package/dist/apps/management/routes/invite-links.d.ts +42 -42
  89. package/dist/apps/management/routes/members.d.ts +30 -30
  90. package/dist/apps/management/routes/projects.d.ts +40 -40
  91. package/dist/apps/management/routes/usage.d.ts +24 -24
  92. package/dist/apps/management/routes/verified-token-requests.d.ts +1 -1
  93. package/dist/apps/management/routes/webhooks.d.ts +55 -55
  94. package/dist/db/Db.d.ts.map +1 -1
  95. package/dist/db/Db.js +12 -1
  96. package/dist/db/Db.js.map +1 -1
  97. package/dist/db/Schema.d.ts +3 -2
  98. package/dist/db/Schema.d.ts.map +1 -1
  99. package/dist/db/Schema.js +5 -2
  100. package/dist/db/Schema.js.map +1 -1
  101. package/dist/db/tables/fundingCatalog.d.ts +4 -2
  102. package/dist/db/tables/fundingCatalog.d.ts.map +1 -1
  103. package/dist/db/tables/fundingCatalog.js +5 -1
  104. package/dist/db/tables/fundingCatalog.js.map +1 -1
  105. package/dist/handlers/internal/utils.d.ts.map +1 -1
  106. package/dist/handlers/internal/utils.js +9 -0
  107. package/dist/handlers/internal/utils.js.map +1 -1
  108. package/dist/internal/Auth.d.ts +3 -1
  109. package/dist/internal/Auth.d.ts.map +1 -1
  110. package/dist/internal/Auth.js +6 -3
  111. package/dist/internal/Auth.js.map +1 -1
  112. package/dist/internal/EarnVaults.d.ts +3 -3
  113. package/dist/internal/EarnVaults.js +3 -3
  114. package/dist/internal/Fetch.d.ts +23 -0
  115. package/dist/internal/Fetch.d.ts.map +1 -0
  116. package/dist/internal/Fetch.js +26 -0
  117. package/dist/internal/Fetch.js.map +1 -0
  118. package/dist/internal/Log.d.ts +3 -1
  119. package/dist/internal/Log.d.ts.map +1 -1
  120. package/dist/internal/Log.js +16 -3
  121. package/dist/internal/Log.js.map +1 -1
  122. package/dist/internal/OpenApi.d.ts +5 -3
  123. package/dist/internal/OpenApi.d.ts.map +1 -1
  124. package/dist/internal/OpenApi.js +13 -3
  125. package/dist/internal/OpenApi.js.map +1 -1
  126. package/dist/internal/Response.d.ts +1 -1
  127. package/dist/internal/Response.d.ts.map +1 -1
  128. package/dist/internal/Schema.d.ts +6 -3
  129. package/dist/internal/Schema.d.ts.map +1 -1
  130. package/dist/internal/Schema.js +8 -2
  131. package/dist/internal/Schema.js.map +1 -1
  132. package/dist/internal/Store.d.ts +16 -3
  133. package/dist/internal/Store.d.ts.map +1 -1
  134. package/dist/internal/Store.js +82 -16
  135. package/dist/internal/Store.js.map +1 -1
  136. package/dist/internal/Tidx.d.ts.map +1 -1
  137. package/dist/internal/Tidx.js +7 -2
  138. package/dist/internal/Tidx.js.map +1 -1
  139. package/dist/internal/Timeout.d.ts +36 -0
  140. package/dist/internal/Timeout.d.ts.map +1 -0
  141. package/dist/internal/Timeout.js +37 -0
  142. package/dist/internal/Timeout.js.map +1 -0
  143. package/dist/internal/Timing.d.ts +9 -0
  144. package/dist/internal/Timing.d.ts.map +1 -1
  145. package/dist/internal/Timing.js +7 -0
  146. package/dist/internal/Timing.js.map +1 -1
  147. package/dist/internal/WebhookDestination.d.ts.map +1 -1
  148. package/dist/internal/WebhookDestination.js +3 -0
  149. package/dist/internal/WebhookDestination.js.map +1 -1
  150. package/dist/internal/funding/Action.d.ts +9 -0
  151. package/dist/internal/funding/Action.d.ts.map +1 -1
  152. package/dist/internal/funding/Action.js +16 -8
  153. package/dist/internal/funding/Action.js.map +1 -1
  154. package/dist/internal/funding/Catalog.d.ts +9 -2
  155. package/dist/internal/funding/Catalog.d.ts.map +1 -1
  156. package/dist/internal/funding/Catalog.js +19 -8
  157. package/dist/internal/funding/Catalog.js.map +1 -1
  158. package/dist/internal/funding/Provider.d.ts +68 -13
  159. package/dist/internal/funding/Provider.d.ts.map +1 -1
  160. package/dist/internal/funding/Provider.js +29 -8
  161. package/dist/internal/funding/Provider.js.map +1 -1
  162. package/dist/internal/funding/Transfer.d.ts +13 -12
  163. package/dist/internal/funding/Transfer.d.ts.map +1 -1
  164. package/dist/internal/funding/Transfer.js +23 -21
  165. package/dist/internal/funding/Transfer.js.map +1 -1
  166. package/dist/internal/funding/providers/stargate.d.ts +28 -9
  167. package/dist/internal/funding/providers/stargate.d.ts.map +1 -1
  168. package/dist/internal/funding/providers/stargate.js +251 -117
  169. package/dist/internal/funding/providers/stargate.js.map +1 -1
  170. package/dist/internal/index.d.ts +1 -0
  171. package/dist/internal/index.d.ts.map +1 -1
  172. package/dist/internal/index.js +1 -0
  173. package/dist/internal/index.js.map +1 -1
  174. package/package.json +2 -2
  175. package/src/App.test.ts +100 -0
  176. package/src/App.ts +42 -3
  177. package/src/Client.test-d.ts +46 -0
  178. package/src/Scope.test.ts +20 -0
  179. package/src/Scope.ts +16 -0
  180. package/src/admin/apps/api-keys.test.ts +75 -0
  181. package/src/admin/apps/api-keys.ts +64 -0
  182. package/src/admin/apps/earn-vaults.test.ts +1 -1
  183. package/src/admin/apps/earn-vaults.ts +1 -1
  184. package/src/admin/ui/src/lib/api-keys.ts +19 -0
  185. package/src/admin/ui/src/routes/api-keys.tsx +89 -2
  186. package/src/admin/ui.generated.ts +189 -151
  187. package/src/apps/Zones.test.ts +4 -4
  188. package/src/apps/Zones.ts +4 -4
  189. package/src/apps/composition.test.ts +1 -1
  190. package/src/apps/data/App.test.ts +41 -0
  191. package/src/apps/data/App.ts +18 -18
  192. package/src/apps/data/ZoneSelection.test.ts +2 -2
  193. package/src/apps/data/ZoneSelection.ts +8 -8
  194. package/src/apps/data/routes/activities.test.ts +1526 -12
  195. package/src/apps/data/routes/activities.ts +1774 -1356
  196. package/src/apps/data/routes/balances.ts +133 -97
  197. package/src/apps/data/routes/blocks.test.ts +533 -0
  198. package/src/apps/data/routes/blocks.ts +35 -16
  199. package/src/apps/data/routes/earn.test.ts +4 -2
  200. package/src/apps/data/routes/earn.ts +13 -13
  201. package/src/apps/data/routes/earn.zone-access.test.ts +6 -6
  202. package/src/apps/data/routes/receipts.ts +47 -16
  203. package/src/apps/data/routes/tokens.test.ts +578 -0
  204. package/src/apps/data/routes/tokens.ts +283 -225
  205. package/src/apps/data/routes/transactions.ts +68 -29
  206. package/src/apps/data/routes/transfers.test.ts +421 -0
  207. package/src/apps/data/routes/transfers.ts +45 -27
  208. package/src/apps/data/routes/valuation.ts +94 -78
  209. package/src/apps/data/routes/zones.test.ts +2 -2
  210. package/src/apps/data/routes/zones.ts +1 -1
  211. package/src/apps/funding/routes/deposit-addresses.test.ts +25 -3
  212. package/src/apps/funding/routes/deposit-addresses.ts +17 -12
  213. package/src/apps/funding/routes/quotes.test.ts +5 -9
  214. package/src/apps/funding/routes/transfers.test.ts +395 -8
  215. package/src/apps/funding/routes/transfers.ts +76 -59
  216. package/src/apps/management/routes/api-keys.test.ts +220 -0
  217. package/src/apps/management/routes/api-keys.ts +280 -3
  218. package/src/db/Db.ts +13 -1
  219. package/src/db/Schema.ts +5 -2
  220. package/src/db/tables/earnVaults.test.ts +9 -9
  221. package/src/db/tables/fundingCatalog.test.ts +16 -2
  222. package/src/db/tables/fundingCatalog.ts +9 -3
  223. package/src/handlers/internal/utils.test.ts +53 -0
  224. package/src/handlers/internal/utils.ts +15 -0
  225. package/src/internal/Auth.ts +12 -4
  226. package/src/internal/EarnVaults.capabilities.test.ts +2 -2
  227. package/src/internal/EarnVaults.test.ts +1 -1
  228. package/src/internal/EarnVaults.ts +3 -3
  229. package/src/internal/Fetch.test.ts +46 -0
  230. package/src/internal/Fetch.ts +56 -0
  231. package/src/internal/Log.test.ts +21 -0
  232. package/src/internal/Log.ts +20 -5
  233. package/src/internal/OpenApi.ts +14 -4
  234. package/src/internal/Response.ts +1 -1
  235. package/src/internal/Schema.test.ts +2 -0
  236. package/src/internal/Schema.ts +12 -2
  237. package/src/internal/Store.test.ts +178 -0
  238. package/src/internal/Store.ts +104 -18
  239. package/src/internal/Tidx.test.ts +2 -1
  240. package/src/internal/Tidx.ts +7 -2
  241. package/src/internal/Timeout.test.ts +35 -0
  242. package/src/internal/Timeout.ts +73 -0
  243. package/src/internal/Timing.ts +16 -0
  244. package/src/internal/WebhookDestination.ts +3 -0
  245. package/src/internal/funding/Action.test.ts +41 -1
  246. package/src/internal/funding/Action.ts +69 -41
  247. package/src/internal/funding/Catalog.test.ts +34 -0
  248. package/src/internal/funding/Catalog.ts +28 -11
  249. package/src/internal/funding/Provider.test.ts +73 -0
  250. package/src/internal/funding/Provider.ts +82 -28
  251. package/src/internal/funding/Transfer.ts +133 -110
  252. package/src/internal/funding/providers/index.test.ts +4 -167
  253. package/src/internal/funding/providers/relay.test.ts +2 -2
  254. package/src/internal/funding/providers/stargate.test.ts +163 -0
  255. package/src/internal/funding/providers/stargate.ts +359 -134
  256. package/src/internal/index.test.ts +1 -0
  257. package/src/internal/index.ts +1 -0
@@ -70,6 +70,8 @@ export namespace schema {
70
70
  z.describe('One EIP-2930 access-list entry that predeclares an account and storage slots.'),
71
71
  )
72
72
 
73
+ const rpcAccessListItem = OpenApi.component(AccessListItem, 'RpcTransactionAccessListItem')
74
+
73
75
  // TODO(ox/zod): replace with the zod schema for the RPC `Call` in `ox/tempo`'s
74
76
  // `TxEnvelopeTempo`/`Transaction` types once ox ships a `zod` entrypoint.
75
77
  /** One call within a Tempo account-abstraction transaction (RPC format). */
@@ -100,6 +102,8 @@ export namespace schema {
100
102
  })
101
103
  .check(z.describe('One operation inside a Tempo account-abstraction transaction.'))
102
104
 
105
+ const rpcCall = OpenApi.component(Call, 'RpcTransactionCall')
106
+
103
107
  // TODO(ox/zod): replace with the zod schema for `ox/tempo`'s
104
108
  // `SignatureEnvelope.Rpc` (the secp256k1 / p256 / webAuthn / keychain union)
105
109
  // once ox ships a `zod` entrypoint.
@@ -122,6 +126,11 @@ export namespace schema {
122
126
  })
123
127
  .check(z.describe('The signature envelope exactly as returned by JSON-RPC.'))
124
128
 
129
+ const rpcSignatureEnvelope = OpenApi.component(
130
+ SignatureEnvelope,
131
+ 'RpcTransactionSignatureEnvelope',
132
+ )
133
+
125
134
  /** The verbatim JSON-RPC payloads, surfaced under each resource's `rpc` field. */
126
135
  export namespace Rpc {
127
136
  // TODO(ox/zod): replace with the zod schema for `ox/tempo`'s
@@ -135,7 +144,7 @@ export namespace schema {
135
144
  z.describe('Tempo account-abstraction authorizations attached to the transaction.'),
136
145
  ),
137
146
  accessList: z
138
- .optional(z.array(AccessListItem))
147
+ .optional(z.array(rpcAccessListItem))
139
148
  .check(
140
149
  z.describe(
141
150
  'EIP-2930 access list that predeclares accounts and storage slots for the transaction.',
@@ -165,7 +174,7 @@ export namespace schema {
165
174
  calls: z
166
175
  .optional(
167
176
  z.union([
168
- z.array(Call).check(
177
+ z.array(rpcCall).check(
169
178
  z.meta({
170
179
  examples: [[{ data: '0xdeadbeef', input: '0xdeadbeef', to: null, value: '0x0' }]],
171
180
  }),
@@ -193,9 +202,9 @@ export namespace schema {
193
202
  z.meta({ examples: ['0xbe058e1c4df8a4366a387bf595b284246a93039e'] }),
194
203
  ),
195
204
  feePayerSignature: z
196
- .nullish(SignatureEnvelope)
205
+ .nullish(rpcSignatureEnvelope)
197
206
  .check(
198
- z.describe('Signature from the account that paid the transaction fee.'),
207
+ z.describe('A signature envelope exactly as returned by JSON-RPC.'),
199
208
  z.meta({ examples: [{ type: 'secp256k1' }] }),
200
209
  ),
201
210
  feeToken: z
@@ -255,8 +264,8 @@ export namespace schema {
255
264
  .optional(Schema.Quantity)
256
265
  .check(z.describe('The `s` value from the transaction ECDSA signature.')),
257
266
  signature: z
258
- .optional(SignatureEnvelope)
259
- .check(z.describe('Signature from the sender authorizing this transaction.')),
267
+ .optional(rpcSignatureEnvelope)
268
+ .check(z.describe('A signature envelope exactly as returned by JSON-RPC.')),
260
269
  to: z
261
270
  .nullish(Schema.Address)
262
271
  .check(
@@ -294,15 +303,17 @@ export namespace schema {
294
303
  .check(z.describe('The transaction exactly as returned by JSON-RPC.'))
295
304
  }
296
305
 
306
+ const rpcTransaction = OpenApi.component(Rpc.Transaction, 'RpcTransaction')
307
+
297
308
  /** Transaction metadata with the raw RPC transaction and optional receipt. */
298
309
  export const TransactionMeta = z
299
310
  .object({
300
311
  receipt: z
301
- .optional(z.lazy(() => Receipts.schema.Receipt))
312
+ .optional(z.lazy(() => Receipts.schema.TransactionReceipt))
302
313
  .check(
303
314
  z.describe('The transaction outcome included only when you request `include=receipt`.'),
304
315
  ),
305
- rpc: Rpc.Transaction.check(z.describe('The original JSON-RPC transaction payload.')),
316
+ rpc: rpcTransaction.check(z.describe('The original JSON-RPC transaction payload.')),
306
317
  })
307
318
  .check(
308
319
  z.describe(
@@ -310,13 +321,18 @@ export namespace schema {
310
321
  ),
311
322
  )
312
323
 
324
+ const transactionMeta = OpenApi.component(TransactionMeta, 'TransactionMeta')
325
+
313
326
  /** Decoded transaction `type`; the raw `0x…` byte stays under `rpc.type`. */
314
- export const TransactionType = z
315
- .enum(['legacy', 'eip2930', 'eip1559', 'eip4844', 'eip7702', 'tempo', 'unknown'])
316
- .check(
317
- z.describe('Human-readable transaction type decoded from the raw JSON-RPC `type` byte.'),
318
- z.meta({ examples: ['eip1559'] }),
319
- )
327
+ export const TransactionType = OpenApi.component(
328
+ z
329
+ .enum(['legacy', 'eip2930', 'eip1559', 'eip4844', 'eip7702', 'tempo', 'unknown'])
330
+ .check(
331
+ z.describe('Human-readable transaction type decoded from the raw JSON-RPC `type` byte.'),
332
+ z.meta({ examples: ['eip1559'] }),
333
+ ),
334
+ 'TransactionType',
335
+ )
320
336
 
321
337
  /** One humanized call within a Tempo account-abstraction transaction. */
322
338
  export const HumanCall = z
@@ -333,6 +349,8 @@ export namespace schema {
333
349
  })
334
350
  .check(z.describe('One decoded call inside a Tempo account-abstraction transaction.'))
335
351
 
352
+ const transactionCall = OpenApi.component(HumanCall, 'TransactionCall')
353
+
336
354
  /**
337
355
  * A humanized transaction: decoded `type`, decimal-string amounts, ISO 8601
338
356
  * timestamps, and plain-number block fields. The verbatim JSON-RPC transaction
@@ -352,7 +370,7 @@ export namespace schema {
352
370
  z.meta({ examples: [23456789] }),
353
371
  ),
354
372
  calls: z
355
- .optional(z.array(HumanCall))
373
+ .optional(z.array(transactionCall))
356
374
  .check(
357
375
  z.describe('Decoded calls for Tempo account-abstraction transactions.'),
358
376
  z.meta({ examples: [[{ data: '0xdeadbeef', to: null }]] }),
@@ -405,7 +423,7 @@ export namespace schema {
405
423
  maxPriorityFeePerGas: z
406
424
  .optional(Schema.DecimalString)
407
425
  .check(z.describe('Maximum priority fee per gas for EIP-1559-style transactions.')),
408
- meta: TransactionMeta.check(
426
+ meta: transactionMeta.check(
409
427
  z.describe('The original JSON-RPC payload plus any resources requested with `include`.'),
410
428
  ),
411
429
  nonce: z
@@ -467,6 +485,8 @@ export namespace schema {
467
485
  ),
468
486
  )
469
487
 
488
+ const transaction = OpenApi.component(Transaction, 'Transaction')
489
+
470
490
  /** Schemas for the getTransaction operation. */
471
491
  export namespace getTransaction {
472
492
  /** Path parameters for transaction requests. */
@@ -505,7 +525,7 @@ export namespace schema {
505
525
  .check(z.describe('Query parameters for looking up a transaction.'))
506
526
 
507
527
  /** A humanized transaction, with the verbatim JSON-RPC payload under `rpc`. */
508
- export const Response = Transaction
528
+ export const Response = transaction
509
529
  }
510
530
 
511
531
  /** Schemas for the getTransactions (list) operation. */
@@ -567,23 +587,31 @@ export namespace schema {
567
587
  })
568
588
  .check(...Schema.pageChecks(), z.describe('Query parameters for listing transactions.'))
569
589
 
590
+ /** Response metadata requested through `include`, such as capped counts. */
591
+ export const Meta = OpenApi.component(Schema.CountMeta, 'TransactionListMeta')
592
+
570
593
  /**
571
594
  * Page of transactions. Each item reuses the humanized transaction returned
572
595
  * by `GET /transactions/:transactionHash`, so the list and detail endpoints
573
596
  * expose one identical shape. Indexed list rows omit fields the indexer does
574
597
  * not store (signatures, access list), reflected in their `rpc` payload.
575
598
  */
576
- export const Response = z
577
- .object({
578
- data: z.array(getTransaction.Response).check(z.describe('Transactions on this page.')),
579
- meta: z
580
- .optional(Schema.CountMeta)
581
- .check(
582
- z.describe('Response-level metadata requested with `include`, such as `totalCount`.'),
583
- ),
584
- nextCursor: Schema.NextCursor,
585
- })
586
- .check(z.describe('A page of transactions ordered by block number and transaction position.'))
599
+ export const Response = OpenApi.component(
600
+ z
601
+ .object({
602
+ data: z.array(getTransaction.Response).check(z.describe('Transactions on this page.')),
603
+ meta: z
604
+ .optional(Meta)
605
+ .check(
606
+ z.describe('Response-level metadata requested with `include`, such as `totalCount`.'),
607
+ ),
608
+ nextCursor: Schema.NextCursor,
609
+ })
610
+ .check(
611
+ z.describe('A page of transactions ordered by block number and transaction position.'),
612
+ ),
613
+ 'TransactionList',
614
+ )
587
615
  }
588
616
  }
589
617
  /** Creates transaction handlers. */
@@ -601,7 +629,10 @@ export function transactions() {
601
629
  'List transactions across Tempo, with filters for addresses, blocks, timestamps, fees, and status.',
602
630
  operationId: 'getTransactions',
603
631
  responses: OpenApi.responses({
604
- errors: { 502: 'Could not read transaction or token data from an upstream service.' },
632
+ errors: {
633
+ 400: { codes: ['chain_id_invalid', 'chain_id_unsupported', 'query_invalid'] },
634
+ 502: 'Could not read transaction or token data from an upstream service.',
635
+ },
605
636
  success: {
606
637
  description: 'A page of transactions.',
607
638
  schema: schema.getTransactions.Response,
@@ -707,6 +738,14 @@ export function transactions() {
707
738
  operationId: 'getTransaction',
708
739
  responses: OpenApi.responses({
709
740
  errors: {
741
+ 400: {
742
+ codes: [
743
+ 'chain_id_invalid',
744
+ 'chain_id_unsupported',
745
+ 'query_invalid',
746
+ 'transaction_invalid',
747
+ ],
748
+ },
710
749
  404: {
711
750
  description: 'No transaction was found for that hash.',
712
751
  codes: ['transaction_not_found'],
@@ -21,6 +21,427 @@ const fixed = FxOracle.from({
21
21
  }),
22
22
  })
23
23
 
24
+ describe('OpenAPI', () => {
25
+ test('publishes generator-ready transfer, activity, and valuation contracts', async () => {
26
+ const app = TestApp.create({ auth: false })
27
+ const spec = await (await app.request('/openapi.json')).json()
28
+ const operations = {
29
+ addressActivities: spec.paths['/v1/addresses/{address}/activities'].get,
30
+ addressValuation: spec.paths['/v1/addresses/{address}/valuation'].get,
31
+ transactionActivities: spec.paths['/v1/transactions/{transactionHash}/activities'].get,
32
+ transfers: spec.paths['/v1/transfers'].get,
33
+ }
34
+ const summarizeError = (
35
+ response: (typeof operations)[keyof typeof operations]['responses'][number],
36
+ ) => {
37
+ const schema = response.$ref ?? response.content?.['application/json']?.schema
38
+ if (!schema || typeof schema === 'string' || !('$ref' in schema)) return schema
39
+ const name = schema.$ref.split('/').at(-1)!
40
+ return {
41
+ codes: spec.components.schemas[name].properties.error.properties.code.enum,
42
+ schema,
43
+ }
44
+ }
45
+ const summarize = (operation: (typeof operations)[keyof typeof operations]) => ({
46
+ errors: Object.fromEntries(
47
+ [400, 401, 403, 404, 409, 429, 500, 502]
48
+ .filter((status) => operation.responses[status])
49
+ .map((status) => [status, summarizeError(operation.responses[status])]),
50
+ ),
51
+ operationId: operation.operationId,
52
+ response: operation.responses[200].content['application/json'].schema,
53
+ })
54
+ type ActivityVariant = { $ref?: string }
55
+ const activityVariants = spec.components.schemas.ActivityItem.anyOf as ActivityVariant[]
56
+ const firstActivityVariant = activityVariants[0]!.$ref!.split('/').at(-1)!
57
+
58
+ expect({
59
+ components: [
60
+ 'ActivityEntry',
61
+ 'ActivityEvent',
62
+ 'ActivityGroup',
63
+ 'ActivityItem',
64
+ 'ActivityMeta',
65
+ 'ActivityToken',
66
+ 'ActivityTransfer',
67
+ 'ActivityValuedAmount',
68
+ 'AddressActivityList',
69
+ 'AddressValuation',
70
+ 'TokenTransfer',
71
+ 'TokenTransferList',
72
+ 'TokenTransferListMeta',
73
+ 'TokenTransferToken',
74
+ 'TransactionActivityList',
75
+ 'ValuationPricing',
76
+ 'ValuationValue',
77
+ 'ValuedTokenAmount',
78
+ ].filter((name) => spec.components.schemas[name]),
79
+ descriptions: {
80
+ activityValuedAmount: spec.components.schemas.ActivityValuedAmount.description,
81
+ valuedTokenAmount: spec.components.schemas.ValuedTokenAmount.description,
82
+ },
83
+ formats: {
84
+ activityTransfer: spec.components.schemas.ActivityTransfer.properties.timestamp.format,
85
+ pricing: spec.components.schemas.ValuationPricing.properties.asOf.format,
86
+ transfer: spec.components.schemas.TokenTransfer.properties.timestamp.format,
87
+ },
88
+ models: {
89
+ activityEntry: spec.components.schemas.ActivityEntry.anyOf,
90
+ activityGroupItems:
91
+ spec.components.schemas.ActivityGroup.properties.data.properties.items.items,
92
+ activityItemEvents: spec.components.schemas[firstActivityVariant].properties.events.items,
93
+ activityItemVariants: {
94
+ count: activityVariants.length,
95
+ first: activityVariants[0],
96
+ last: activityVariants.at(-1),
97
+ referenced: activityVariants.every((variant) => variant.$ref),
98
+ stableName:
99
+ spec.components.schemas.ActivityItemSharesRedemptionRequested.properties.type.const,
100
+ },
101
+ activityList: spec.components.schemas.AddressActivityList.properties.data.items,
102
+ activityListMeta: spec.components.schemas.AddressActivityList.properties.meta,
103
+ activityTransferSourceAmount:
104
+ spec.components.schemas.ActivityTransfer.properties.sourceAmount,
105
+ activityTransferSourceToken:
106
+ spec.components.schemas.ActivityTransfer.properties.sourceToken,
107
+ transactionActivityList:
108
+ spec.components.schemas.TransactionActivityList.properties.data.items,
109
+ transferDestinationAmount:
110
+ spec.components.schemas.TokenTransfer.properties.destinationAmount,
111
+ transferDestinationToken: spec.components.schemas.TokenTransfer.properties.destinationToken,
112
+ transferList: spec.components.schemas.TokenTransferList.properties.data.items,
113
+ transferListMeta: spec.components.schemas.TokenTransferList.properties.meta,
114
+ transferSourceAmount: spec.components.schemas.TokenTransfer.properties.sourceAmount,
115
+ transferSourceToken: spec.components.schemas.TokenTransfer.properties.sourceToken,
116
+ valuationPricing: spec.components.schemas.AddressValuation.properties.pricing,
117
+ },
118
+ operations: Object.fromEntries(
119
+ Object.entries(operations).map(([name, operation]) => [name, summarize(operation)]),
120
+ ),
121
+ }).toMatchInlineSnapshot(`
122
+ {
123
+ "components": [
124
+ "ActivityEntry",
125
+ "ActivityEvent",
126
+ "ActivityGroup",
127
+ "ActivityItem",
128
+ "ActivityMeta",
129
+ "ActivityToken",
130
+ "ActivityTransfer",
131
+ "ActivityValuedAmount",
132
+ "AddressActivityList",
133
+ "AddressValuation",
134
+ "TokenTransfer",
135
+ "TokenTransferList",
136
+ "TokenTransferListMeta",
137
+ "TokenTransferToken",
138
+ "TransactionActivityList",
139
+ "ValuationPricing",
140
+ "ValuationValue",
141
+ "ValuedTokenAmount",
142
+ ],
143
+ "descriptions": {
144
+ "activityValuedAmount": "A token amount carrying its nominal value in the requested denomination.",
145
+ "valuedTokenAmount": "A token amount carrying its nominal value in the requested denomination.",
146
+ },
147
+ "formats": {
148
+ "activityTransfer": "date-time",
149
+ "pricing": "date-time",
150
+ "transfer": "date-time",
151
+ },
152
+ "models": {
153
+ "activityEntry": [
154
+ {
155
+ "$ref": "#/components/schemas/ActivityItem",
156
+ },
157
+ {
158
+ "$ref": "#/components/schemas/ActivityGroup",
159
+ },
160
+ ],
161
+ "activityGroupItems": {
162
+ "$ref": "#/components/schemas/ActivityItem",
163
+ },
164
+ "activityItemEvents": {
165
+ "$ref": "#/components/schemas/ActivityEvent",
166
+ },
167
+ "activityItemVariants": {
168
+ "count": 65,
169
+ "first": {
170
+ "$ref": "#/components/schemas/ActivityItemAssetsDeposited",
171
+ },
172
+ "last": {
173
+ "$ref": "#/components/schemas/ActivityItemUnknown",
174
+ },
175
+ "referenced": true,
176
+ "stableName": "shares-redemption-requested",
177
+ },
178
+ "activityList": {
179
+ "$ref": "#/components/schemas/ActivityEntry",
180
+ },
181
+ "activityListMeta": {
182
+ "$ref": "#/components/schemas/ActivityMeta",
183
+ },
184
+ "activityTransferSourceAmount": {
185
+ "$ref": "#/components/schemas/ActivityValuedAmount",
186
+ },
187
+ "activityTransferSourceToken": {
188
+ "$ref": "#/components/schemas/ActivityToken",
189
+ },
190
+ "transactionActivityList": {
191
+ "$ref": "#/components/schemas/ActivityItem",
192
+ },
193
+ "transferDestinationAmount": {
194
+ "$ref": "#/components/schemas/ValuedTokenAmount",
195
+ },
196
+ "transferDestinationToken": {
197
+ "$ref": "#/components/schemas/TokenTransferToken",
198
+ },
199
+ "transferList": {
200
+ "$ref": "#/components/schemas/TokenTransfer",
201
+ },
202
+ "transferListMeta": {
203
+ "$ref": "#/components/schemas/TokenTransferListMeta",
204
+ },
205
+ "transferSourceAmount": {
206
+ "$ref": "#/components/schemas/ValuedTokenAmount",
207
+ },
208
+ "transferSourceToken": {
209
+ "$ref": "#/components/schemas/TokenTransferToken",
210
+ },
211
+ "valuationPricing": {
212
+ "anyOf": [
213
+ {
214
+ "$ref": "#/components/schemas/ValuationPricing",
215
+ },
216
+ {
217
+ "type": "null",
218
+ },
219
+ ],
220
+ "description": "Rate provenance, or \`null\` when every valued holding was already denominated in \`currency\`.",
221
+ },
222
+ },
223
+ "operations": {
224
+ "addressActivities": {
225
+ "errors": {
226
+ "400": {
227
+ "codes": [
228
+ "address_invalid",
229
+ "api_key_malformed",
230
+ "chain_id_invalid",
231
+ "chain_id_unsupported",
232
+ "query_invalid",
233
+ ],
234
+ "schema": {
235
+ "$ref": "#/components/schemas/AddressInvalidOrApiKeyMalformedOrChainIdInvalidOrChainIdUnsupportedOrQueryInvalidError",
236
+ },
237
+ },
238
+ "401": {
239
+ "codes": [
240
+ "api_key_invalid",
241
+ "api_key_missing",
242
+ "unauthorized",
243
+ ],
244
+ "schema": {
245
+ "$ref": "#/components/schemas/AuthenticationError",
246
+ },
247
+ },
248
+ "403": {
249
+ "codes": [
250
+ "api_key_forbidden",
251
+ "api_key_ip_forbidden",
252
+ "forbidden",
253
+ ],
254
+ "schema": {
255
+ "$ref": "#/components/schemas/ForbiddenError",
256
+ },
257
+ },
258
+ "429": "#/components/responses/RateLimited",
259
+ "500": "#/components/responses/InternalError",
260
+ "502": {
261
+ "codes": [
262
+ "upstream_error",
263
+ ],
264
+ "schema": {
265
+ "$ref": "#/components/schemas/UpstreamError",
266
+ },
267
+ },
268
+ },
269
+ "operationId": "getAddressActivities",
270
+ "response": {
271
+ "$ref": "#/components/schemas/AddressActivityList",
272
+ },
273
+ },
274
+ "addressValuation": {
275
+ "errors": {
276
+ "400": {
277
+ "codes": [
278
+ "address_invalid",
279
+ "api_key_malformed",
280
+ "chain_id_invalid",
281
+ "chain_id_unsupported",
282
+ "query_invalid",
283
+ ],
284
+ "schema": {
285
+ "$ref": "#/components/schemas/AddressInvalidOrApiKeyMalformedOrChainIdInvalidOrChainIdUnsupportedOrQueryInvalidError",
286
+ },
287
+ },
288
+ "401": {
289
+ "codes": [
290
+ "api_key_invalid",
291
+ "api_key_missing",
292
+ "unauthorized",
293
+ ],
294
+ "schema": {
295
+ "$ref": "#/components/schemas/AuthenticationError",
296
+ },
297
+ },
298
+ "403": {
299
+ "codes": [
300
+ "api_key_forbidden",
301
+ "api_key_ip_forbidden",
302
+ "forbidden",
303
+ ],
304
+ "schema": {
305
+ "$ref": "#/components/schemas/ForbiddenError",
306
+ },
307
+ },
308
+ "429": "#/components/responses/RateLimited",
309
+ "500": "#/components/responses/InternalError",
310
+ "502": {
311
+ "codes": [
312
+ "upstream_error",
313
+ ],
314
+ "schema": {
315
+ "$ref": "#/components/schemas/UpstreamError",
316
+ },
317
+ },
318
+ },
319
+ "operationId": "getAddressValuation",
320
+ "response": {
321
+ "$ref": "#/components/schemas/AddressValuation",
322
+ },
323
+ },
324
+ "transactionActivities": {
325
+ "errors": {
326
+ "400": {
327
+ "codes": [
328
+ "api_key_malformed",
329
+ "chain_id_invalid",
330
+ "chain_id_unsupported",
331
+ "query_invalid",
332
+ "transaction_invalid",
333
+ ],
334
+ "schema": {
335
+ "$ref": "#/components/schemas/ApiKeyMalformedOrChainIdInvalidOrChainIdUnsupportedOrQueryInvalidOrTransactionInvalidError",
336
+ },
337
+ },
338
+ "401": {
339
+ "codes": [
340
+ "api_key_invalid",
341
+ "api_key_missing",
342
+ "unauthorized",
343
+ ],
344
+ "schema": {
345
+ "$ref": "#/components/schemas/AuthenticationError",
346
+ },
347
+ },
348
+ "403": {
349
+ "codes": [
350
+ "api_key_forbidden",
351
+ "api_key_ip_forbidden",
352
+ "forbidden",
353
+ ],
354
+ "schema": {
355
+ "$ref": "#/components/schemas/ForbiddenError",
356
+ },
357
+ },
358
+ "404": {
359
+ "codes": [
360
+ "transaction_not_found",
361
+ ],
362
+ "schema": {
363
+ "$ref": "#/components/schemas/TransactionNotFoundError",
364
+ },
365
+ },
366
+ "409": {
367
+ "codes": [
368
+ "transaction_ambiguous",
369
+ ],
370
+ "schema": {
371
+ "$ref": "#/components/schemas/TransactionAmbiguousError",
372
+ },
373
+ },
374
+ "429": "#/components/responses/RateLimited",
375
+ "500": "#/components/responses/InternalError",
376
+ "502": {
377
+ "codes": [
378
+ "upstream_error",
379
+ ],
380
+ "schema": {
381
+ "$ref": "#/components/schemas/UpstreamError",
382
+ },
383
+ },
384
+ },
385
+ "operationId": "getTransactionActivities",
386
+ "response": {
387
+ "$ref": "#/components/schemas/TransactionActivityList",
388
+ },
389
+ },
390
+ "transfers": {
391
+ "errors": {
392
+ "400": {
393
+ "codes": [
394
+ "api_key_malformed",
395
+ "chain_id_invalid",
396
+ "chain_id_unsupported",
397
+ "query_invalid",
398
+ ],
399
+ "schema": {
400
+ "$ref": "#/components/schemas/ApiKeyMalformedOrChainIdInvalidOrChainIdUnsupportedOrQueryInvalidError",
401
+ },
402
+ },
403
+ "401": {
404
+ "codes": [
405
+ "api_key_invalid",
406
+ "api_key_missing",
407
+ "unauthorized",
408
+ ],
409
+ "schema": {
410
+ "$ref": "#/components/schemas/AuthenticationError",
411
+ },
412
+ },
413
+ "403": {
414
+ "codes": [
415
+ "api_key_forbidden",
416
+ "api_key_ip_forbidden",
417
+ "forbidden",
418
+ ],
419
+ "schema": {
420
+ "$ref": "#/components/schemas/ForbiddenError",
421
+ },
422
+ },
423
+ "429": "#/components/responses/RateLimited",
424
+ "500": "#/components/responses/InternalError",
425
+ "502": {
426
+ "codes": [
427
+ "upstream_error",
428
+ ],
429
+ "schema": {
430
+ "$ref": "#/components/schemas/UpstreamError",
431
+ },
432
+ },
433
+ },
434
+ "operationId": "getTransfers",
435
+ "response": {
436
+ "$ref": "#/components/schemas/TokenTransferList",
437
+ },
438
+ },
439
+ },
440
+ }
441
+ `)
442
+ })
443
+ })
444
+
24
445
  describe('GET /transfers', () => {
25
446
  test('parses granular token includes', () => {
26
447
  expect(