tapimo 0.10.2 → 0.12.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 (386) hide show
  1. package/dist/App.d.ts +4896 -2166
  2. package/dist/App.d.ts.map +1 -1
  3. package/dist/App.js +2 -2
  4. package/dist/App.js.map +1 -1
  5. package/dist/Assets.d.ts +15 -0
  6. package/dist/Assets.d.ts.map +1 -1
  7. package/dist/Assets.js +7 -0
  8. package/dist/Assets.js.map +1 -1
  9. package/dist/Webhooks.d.ts +0 -75
  10. package/dist/Webhooks.d.ts.map +1 -1
  11. package/dist/Webhooks.js +1 -143
  12. package/dist/Webhooks.js.map +1 -1
  13. package/dist/admin/App.d.ts +127 -78
  14. package/dist/admin/App.d.ts.map +1 -1
  15. package/dist/admin/apps/earn-vaults.d.ts +115 -1
  16. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  17. package/dist/admin/apps/earn-vaults.js +59 -6
  18. package/dist/admin/apps/earn-vaults.js.map +1 -1
  19. package/dist/admin/apps/organizations.d.ts +3 -3
  20. package/dist/admin/apps/organizations.d.ts.map +1 -1
  21. package/dist/admin/apps/organizations.js +4 -2
  22. package/dist/admin/apps/organizations.js.map +1 -1
  23. package/dist/admin/apps/verified-tokens.d.ts +83 -83
  24. package/dist/admin/ui.generated.d.ts +1 -1
  25. package/dist/admin/ui.generated.d.ts.map +1 -1
  26. package/dist/admin/ui.generated.js +151 -151
  27. package/dist/admin/ui.generated.js.map +1 -1
  28. package/dist/apps/data/App.d.ts +5924 -4310
  29. package/dist/apps/data/App.d.ts.map +1 -1
  30. package/dist/apps/data/App.js +61 -9
  31. package/dist/apps/data/App.js.map +1 -1
  32. package/dist/apps/data/ZoneSelection.d.ts +62 -0
  33. package/dist/apps/data/ZoneSelection.d.ts.map +1 -0
  34. package/dist/apps/data/ZoneSelection.js +44 -0
  35. package/dist/apps/data/ZoneSelection.js.map +1 -0
  36. package/dist/apps/data/routes/activities.d.ts +2368 -5
  37. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  38. package/dist/apps/data/routes/activities.js +423 -114
  39. package/dist/apps/data/routes/activities.js.map +1 -1
  40. package/dist/apps/data/routes/addresses.d.ts +131 -0
  41. package/dist/apps/data/routes/addresses.d.ts.map +1 -1
  42. package/dist/apps/data/routes/balances.d.ts +25 -25
  43. package/dist/apps/data/routes/balances.js +1 -1
  44. package/dist/apps/data/routes/balances.js.map +1 -1
  45. package/dist/apps/data/routes/blocks.d.ts +1 -1
  46. package/dist/apps/data/routes/blocks.js +1 -1
  47. package/dist/apps/data/routes/blocks.js.map +1 -1
  48. package/dist/apps/data/routes/earn.d.ts +135 -10
  49. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  50. package/dist/apps/data/routes/earn.js +157 -25
  51. package/dist/apps/data/routes/earn.js.map +1 -1
  52. package/dist/apps/data/routes/exchanges.d.ts +829 -123
  53. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  54. package/dist/apps/data/routes/exchanges.js +16 -13
  55. package/dist/apps/data/routes/exchanges.js.map +1 -1
  56. package/dist/apps/data/routes/fee-amm.d.ts +26 -26
  57. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  58. package/dist/apps/data/routes/fee-amm.js +9 -11
  59. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  60. package/dist/apps/data/routes/receipts.d.ts +54 -54
  61. package/dist/apps/data/routes/receipts.js +1 -1
  62. package/dist/apps/data/routes/receipts.js.map +1 -1
  63. package/dist/apps/data/routes/rpc.js +24 -10
  64. package/dist/apps/data/routes/rpc.js.map +1 -1
  65. package/dist/apps/data/routes/tokenlist.d.ts +12 -12
  66. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  67. package/dist/apps/data/routes/tokenlist.js +16 -15
  68. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  69. package/dist/apps/data/routes/tokens.d.ts +17 -3
  70. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  71. package/dist/apps/data/routes/tokens.js +34 -15
  72. package/dist/apps/data/routes/tokens.js.map +1 -1
  73. package/dist/apps/data/routes/transactions.d.ts +1 -1
  74. package/dist/apps/data/routes/transactions.js +1 -1
  75. package/dist/apps/data/routes/transactions.js.map +1 -1
  76. package/dist/apps/data/routes/transfers.d.ts +13 -13
  77. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  78. package/dist/apps/data/routes/transfers.js +7 -9
  79. package/dist/apps/data/routes/transfers.js.map +1 -1
  80. package/dist/apps/data/routes/valuation.d.ts +21 -21
  81. package/dist/apps/data/routes/verified-tokens.d.ts +5 -5
  82. package/dist/apps/data/routes/webhooks.d.ts +1011 -151
  83. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  84. package/dist/apps/data/routes/webhooks.js +126 -739
  85. package/dist/apps/data/routes/webhooks.js.map +1 -1
  86. package/dist/apps/data/routes/zones.d.ts +15 -15
  87. package/dist/apps/funding/App.d.ts +27 -27
  88. package/dist/apps/funding/routes/chains.d.ts.map +1 -1
  89. package/dist/apps/funding/routes/chains.js +5 -4
  90. package/dist/apps/funding/routes/chains.js.map +1 -1
  91. package/dist/apps/funding/routes/deposit-addresses.d.ts +18 -18
  92. package/dist/apps/funding/routes/deposit-addresses.d.ts.map +1 -1
  93. package/dist/apps/funding/routes/deposit-addresses.js +8 -8
  94. package/dist/apps/funding/routes/deposit-addresses.js.map +1 -1
  95. package/dist/apps/funding/routes/providers.d.ts.map +1 -1
  96. package/dist/apps/funding/routes/providers.js +3 -2
  97. package/dist/apps/funding/routes/providers.js.map +1 -1
  98. package/dist/apps/funding/routes/quotes.d.ts.map +1 -1
  99. package/dist/apps/funding/routes/quotes.js +2 -2
  100. package/dist/apps/funding/routes/quotes.js.map +1 -1
  101. package/dist/apps/funding/routes/transfers.d.ts +33 -33
  102. package/dist/apps/management/App.d.ts +1433 -322
  103. package/dist/apps/management/App.d.ts.map +1 -1
  104. package/dist/apps/management/Billing.d.ts.map +1 -1
  105. package/dist/apps/management/Billing.js +19 -6
  106. package/dist/apps/management/Billing.js.map +1 -1
  107. package/dist/apps/management/routes/api-keys.d.ts +154 -94
  108. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  109. package/dist/apps/management/routes/api-keys.js +76 -30
  110. package/dist/apps/management/routes/api-keys.js.map +1 -1
  111. package/dist/apps/management/routes/billing.d.ts +103 -30
  112. package/dist/apps/management/routes/billing.d.ts.map +1 -1
  113. package/dist/apps/management/routes/billing.js +91 -32
  114. package/dist/apps/management/routes/billing.js.map +1 -1
  115. package/dist/apps/management/routes/faucet.d.ts +12 -12
  116. package/dist/apps/management/routes/faucet.d.ts.map +1 -1
  117. package/dist/apps/management/routes/faucet.js +23 -12
  118. package/dist/apps/management/routes/faucet.js.map +1 -1
  119. package/dist/apps/management/routes/invitations.d.ts +46 -13
  120. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  121. package/dist/apps/management/routes/invitations.js +79 -29
  122. package/dist/apps/management/routes/invitations.js.map +1 -1
  123. package/dist/apps/management/routes/invite-links.d.ts +128 -83
  124. package/dist/apps/management/routes/invite-links.d.ts.map +1 -1
  125. package/dist/apps/management/routes/invite-links.js +100 -41
  126. package/dist/apps/management/routes/invite-links.js.map +1 -1
  127. package/dist/apps/management/routes/me.d.ts +5 -5
  128. package/dist/apps/management/routes/me.d.ts.map +1 -1
  129. package/dist/apps/management/routes/me.js +14 -10
  130. package/dist/apps/management/routes/me.js.map +1 -1
  131. package/dist/apps/management/routes/members.d.ts +68 -47
  132. package/dist/apps/management/routes/members.d.ts.map +1 -1
  133. package/dist/apps/management/routes/members.js +37 -18
  134. package/dist/apps/management/routes/members.js.map +1 -1
  135. package/dist/apps/management/routes/orgs.d.ts +48 -8
  136. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  137. package/dist/apps/management/routes/orgs.js +48 -19
  138. package/dist/apps/management/routes/orgs.js.map +1 -1
  139. package/dist/apps/management/routes/projects.d.ts +130 -68
  140. package/dist/apps/management/routes/projects.d.ts.map +1 -1
  141. package/dist/apps/management/routes/projects.js +72 -21
  142. package/dist/apps/management/routes/projects.js.map +1 -1
  143. package/dist/apps/management/routes/scopes.d.ts.map +1 -1
  144. package/dist/apps/management/routes/scopes.js +8 -5
  145. package/dist/apps/management/routes/scopes.js.map +1 -1
  146. package/dist/apps/management/routes/usage.d.ts +38 -38
  147. package/dist/apps/management/routes/usage.d.ts.map +1 -1
  148. package/dist/apps/management/routes/usage.js +41 -31
  149. package/dist/apps/management/routes/usage.js.map +1 -1
  150. package/dist/apps/management/routes/verified-token-requests.d.ts +34 -6
  151. package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
  152. package/dist/apps/management/routes/verified-token-requests.js +36 -17
  153. package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
  154. package/dist/apps/management/routes/webhooks.d.ts +1186 -197
  155. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  156. package/dist/apps/management/routes/webhooks.js +106 -38
  157. package/dist/apps/management/routes/webhooks.js.map +1 -1
  158. package/dist/apps/mpp/internal/Adapter.d.ts +1 -1
  159. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -1
  160. package/dist/apps/mpp/internal/Adapter.js +12 -0
  161. package/dist/apps/mpp/internal/Adapter.js.map +1 -1
  162. package/dist/db/Db.d.ts +2 -0
  163. package/dist/db/Db.d.ts.map +1 -1
  164. package/dist/db/Db.js +61 -0
  165. package/dist/db/Db.js.map +1 -1
  166. package/dist/db/Schema.d.ts +30 -2
  167. package/dist/db/Schema.d.ts.map +1 -1
  168. package/dist/db/Schema.js +28 -3
  169. package/dist/db/Schema.js.map +1 -1
  170. package/dist/db/tables/earnVaults.d.ts +5 -1
  171. package/dist/db/tables/earnVaults.d.ts.map +1 -1
  172. package/dist/db/tables/earnVaults.js +5 -0
  173. package/dist/db/tables/earnVaults.js.map +1 -1
  174. package/dist/db/tables/webhookDeliveries.d.ts.map +1 -1
  175. package/dist/db/tables/webhookDeliveries.js +10 -0
  176. package/dist/db/tables/webhookDeliveries.js.map +1 -1
  177. package/dist/db/tables/webhookQueueCompletions.d.ts +15 -0
  178. package/dist/db/tables/webhookQueueCompletions.d.ts.map +1 -0
  179. package/dist/db/tables/webhookQueueCompletions.js +32 -0
  180. package/dist/db/tables/webhookQueueCompletions.js.map +1 -0
  181. package/dist/db/tables/webhookQueueEvents.d.ts +16 -20
  182. package/dist/db/tables/webhookQueueEvents.d.ts.map +1 -1
  183. package/dist/db/tables/webhookQueueEvents.js +68 -43
  184. package/dist/db/tables/webhookQueueEvents.js.map +1 -1
  185. package/dist/db/tables/webhookSubscriptions.d.ts +47 -72
  186. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  187. package/dist/db/tables/webhookSubscriptions.js +92 -105
  188. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  189. package/dist/internal/Auth.d.ts +8 -1
  190. package/dist/internal/Auth.d.ts.map +1 -1
  191. package/dist/internal/Auth.js +13 -3
  192. package/dist/internal/Auth.js.map +1 -1
  193. package/dist/internal/Cache.d.ts.map +1 -1
  194. package/dist/internal/Cache.js +11 -7
  195. package/dist/internal/Cache.js.map +1 -1
  196. package/dist/internal/EarnVaults.d.ts +41 -2
  197. package/dist/internal/EarnVaults.d.ts.map +1 -1
  198. package/dist/internal/EarnVaults.js +167 -0
  199. package/dist/internal/EarnVaults.js.map +1 -1
  200. package/dist/internal/MetricSink.d.ts +35 -125
  201. package/dist/internal/MetricSink.d.ts.map +1 -1
  202. package/dist/internal/MetricSink.js +50 -121
  203. package/dist/internal/MetricSink.js.map +1 -1
  204. package/dist/internal/OpenApi.d.ts +26 -22
  205. package/dist/internal/OpenApi.d.ts.map +1 -1
  206. package/dist/internal/OpenApi.js +128 -39
  207. package/dist/internal/OpenApi.js.map +1 -1
  208. package/dist/internal/Response.d.ts +13 -8
  209. package/dist/internal/Response.d.ts.map +1 -1
  210. package/dist/internal/Response.js +16 -5
  211. package/dist/internal/Response.js.map +1 -1
  212. package/dist/internal/Schema.d.ts +8 -8
  213. package/dist/internal/Schema.d.ts.map +1 -1
  214. package/dist/internal/Schema.js +10 -9
  215. package/dist/internal/Schema.js.map +1 -1
  216. package/dist/internal/Store.d.ts +15 -6
  217. package/dist/internal/Store.d.ts.map +1 -1
  218. package/dist/internal/Store.js +45 -15
  219. package/dist/internal/Store.js.map +1 -1
  220. package/dist/internal/Tidx.d.ts +2 -0
  221. package/dist/internal/Tidx.d.ts.map +1 -1
  222. package/dist/internal/Tidx.js +16 -4
  223. package/dist/internal/Tidx.js.map +1 -1
  224. package/dist/internal/WebhookTransfer.d.ts +1 -55
  225. package/dist/internal/WebhookTransfer.d.ts.map +1 -1
  226. package/dist/internal/WebhookTransfer.js +1 -239
  227. package/dist/internal/WebhookTransfer.js.map +1 -1
  228. package/dist/internal/Webhooks.d.ts +112 -56
  229. package/dist/internal/Webhooks.d.ts.map +1 -1
  230. package/dist/internal/Webhooks.js +124 -93
  231. package/dist/internal/Webhooks.js.map +1 -1
  232. package/dist/internal/funding/Deposit.d.ts +2 -2
  233. package/dist/internal/funding/Deposit.d.ts.map +1 -1
  234. package/dist/internal/funding/Deposit.js +9 -8
  235. package/dist/internal/funding/Deposit.js.map +1 -1
  236. package/dist/internal/funding/DepositAddress.d.ts +4 -4
  237. package/dist/internal/funding/DepositAddress.d.ts.map +1 -1
  238. package/dist/internal/funding/DepositAddress.js +9 -8
  239. package/dist/internal/funding/DepositAddress.js.map +1 -1
  240. package/dist/internal/funding/DepositWebhook.d.ts +25 -0
  241. package/dist/internal/funding/DepositWebhook.d.ts.map +1 -0
  242. package/dist/internal/funding/DepositWebhook.js +74 -0
  243. package/dist/internal/funding/DepositWebhook.js.map +1 -0
  244. package/dist/internal/funding/Provider.d.ts.map +1 -1
  245. package/dist/internal/funding/Provider.js +13 -12
  246. package/dist/internal/funding/Provider.js.map +1 -1
  247. package/dist/internal/funding/Reconciliation.d.ts +6 -0
  248. package/dist/internal/funding/Reconciliation.d.ts.map +1 -1
  249. package/dist/internal/funding/Reconciliation.js +42 -10
  250. package/dist/internal/funding/Reconciliation.js.map +1 -1
  251. package/dist/internal/funding/index.d.ts +1 -0
  252. package/dist/internal/funding/index.d.ts.map +1 -1
  253. package/dist/internal/funding/index.js +1 -0
  254. package/dist/internal/funding/index.js.map +1 -1
  255. package/dist/internal/funding/providers/stargate.d.ts +19 -0
  256. package/dist/internal/funding/providers/stargate.d.ts.map +1 -0
  257. package/dist/internal/funding/providers/stargate.js +143 -0
  258. package/dist/internal/funding/providers/stargate.js.map +1 -0
  259. package/dist/internal/webhookDestinations/slack.d.ts.map +1 -1
  260. package/dist/internal/webhookDestinations/slack.js +16 -0
  261. package/dist/internal/webhookDestinations/slack.js.map +1 -1
  262. package/dist/providers/index.d.ts +7 -0
  263. package/dist/providers/index.d.ts.map +1 -1
  264. package/dist/providers/index.js +3 -0
  265. package/dist/providers/index.js.map +1 -1
  266. package/package.json +2 -2
  267. package/src/App.test.ts +48 -0
  268. package/src/App.ts +7 -2
  269. package/src/Assets.test.ts +18 -0
  270. package/src/Assets.ts +22 -0
  271. package/src/Client.test-d.ts +287 -17
  272. package/src/Webhooks.ts +1 -220
  273. package/src/admin/apps/earn-vaults.test.ts +143 -0
  274. package/src/admin/apps/earn-vaults.ts +83 -6
  275. package/src/admin/apps/organizations.ts +6 -2
  276. package/src/admin/ui/src/routes/api-keys.tsx +36 -0
  277. package/src/admin/ui.generated.ts +151 -189
  278. package/src/apps/data/App.test.ts +31 -0
  279. package/src/apps/data/App.ts +64 -10
  280. package/src/apps/data/ZoneSelection.test.ts +196 -0
  281. package/src/apps/data/ZoneSelection.ts +108 -0
  282. package/src/apps/data/routes/activities.test.ts +435 -12
  283. package/src/apps/data/routes/activities.ts +562 -125
  284. package/src/apps/data/routes/balances.ts +1 -1
  285. package/src/apps/data/routes/blocks.ts +1 -1
  286. package/src/apps/data/routes/earn.test.ts +183 -23
  287. package/src/apps/data/routes/earn.ts +225 -29
  288. package/src/apps/data/routes/earn.zone-access.test.ts +46 -0
  289. package/src/apps/data/routes/exchanges.test.ts +31 -1
  290. package/src/apps/data/routes/exchanges.ts +19 -15
  291. package/src/apps/data/routes/fee-amm.ts +18 -11
  292. package/src/apps/data/routes/receipts.ts +1 -1
  293. package/src/apps/data/routes/rpc.test.ts +75 -0
  294. package/src/apps/data/routes/rpc.ts +23 -9
  295. package/src/apps/data/routes/tokenlist.ts +21 -18
  296. package/src/apps/data/routes/tokens.test.ts +29 -0
  297. package/src/apps/data/routes/tokens.ts +38 -15
  298. package/src/apps/data/routes/transactions.ts +1 -1
  299. package/src/apps/data/routes/transfers.test.ts +3 -3
  300. package/src/apps/data/routes/transfers.ts +12 -9
  301. package/src/apps/data/routes/webhooks.test.ts +179 -1497
  302. package/src/apps/data/routes/webhooks.ts +156 -976
  303. package/src/apps/data/routes/zones.test.ts +19 -13
  304. package/src/apps/funding/routes/chains.test.ts +211 -7
  305. package/src/apps/funding/routes/chains.ts +19 -12
  306. package/src/apps/funding/routes/deposit-addresses.test.ts +394 -0
  307. package/src/apps/funding/routes/deposit-addresses.ts +84 -72
  308. package/src/apps/funding/routes/providers.ts +9 -5
  309. package/src/apps/funding/routes/quotes.test.ts +46 -0
  310. package/src/apps/funding/routes/quotes.ts +8 -5
  311. package/src/apps/funding/routes/transfers.test.ts +35 -32
  312. package/src/apps/management/Billing.test.ts +26 -0
  313. package/src/apps/management/Billing.ts +24 -7
  314. package/src/apps/management/routes/api-keys.test.ts +178 -0
  315. package/src/apps/management/routes/api-keys.ts +203 -144
  316. package/src/apps/management/routes/billing.test.ts +209 -0
  317. package/src/apps/management/routes/billing.ts +254 -177
  318. package/src/apps/management/routes/faucet.test.ts +39 -0
  319. package/src/apps/management/routes/faucet.ts +75 -41
  320. package/src/apps/management/routes/invitations.test.ts +216 -0
  321. package/src/apps/management/routes/invitations.ts +186 -109
  322. package/src/apps/management/routes/invite-links.test.ts +263 -1
  323. package/src/apps/management/routes/invite-links.ts +295 -214
  324. package/src/apps/management/routes/me.test.ts +49 -0
  325. package/src/apps/management/routes/me.ts +42 -32
  326. package/src/apps/management/routes/members.test.ts +124 -1
  327. package/src/apps/management/routes/members.ts +81 -51
  328. package/src/apps/management/routes/orgs.test.ts +176 -0
  329. package/src/apps/management/routes/orgs.ts +101 -59
  330. package/src/apps/management/routes/projects.test.ts +183 -0
  331. package/src/apps/management/routes/projects.ts +124 -60
  332. package/src/apps/management/routes/scopes.test.ts +44 -0
  333. package/src/apps/management/routes/scopes.ts +37 -28
  334. package/src/apps/management/routes/usage.test.ts +92 -0
  335. package/src/apps/management/routes/usage.ts +186 -151
  336. package/src/apps/management/routes/verified-token-requests.test.ts +114 -0
  337. package/src/apps/management/routes/verified-token-requests.ts +166 -133
  338. package/src/apps/management/routes/webhooks.test.ts +313 -1
  339. package/src/apps/management/routes/webhooks.ts +220 -71
  340. package/src/apps/mpp/internal/Adapter.ts +13 -1
  341. package/src/db/Db.test.ts +42 -5
  342. package/src/db/Db.ts +85 -0
  343. package/src/db/Schema.ts +41 -3
  344. package/src/db/tables/earnVaults.test.ts +22 -0
  345. package/src/db/tables/earnVaults.ts +11 -1
  346. package/src/db/tables/organizations.test.ts +5 -2
  347. package/src/db/tables/webhookDeliveries.ts +13 -0
  348. package/src/db/tables/webhookQueueCompletions.ts +55 -0
  349. package/src/db/tables/webhookQueueEvents.ts +97 -57
  350. package/src/db/tables/webhookSubscriptions.ts +134 -144
  351. package/src/internal/Auth.ts +23 -5
  352. package/src/internal/Cache.ts +14 -7
  353. package/src/internal/EarnVaults.capabilities.test.ts +33 -0
  354. package/src/internal/EarnVaults.test.ts +79 -0
  355. package/src/internal/EarnVaults.ts +277 -0
  356. package/src/internal/MetricSink.test.ts +41 -373
  357. package/src/internal/MetricSink.ts +92 -273
  358. package/src/internal/OpenApi.ts +165 -49
  359. package/src/internal/Response.test.ts +95 -0
  360. package/src/internal/Response.ts +40 -2
  361. package/src/internal/Schema.test.ts +34 -0
  362. package/src/internal/Schema.ts +20 -9
  363. package/src/internal/Store.test.ts +186 -0
  364. package/src/internal/Store.ts +57 -17
  365. package/src/internal/Tidx.test.ts +19 -0
  366. package/src/internal/Tidx.ts +16 -4
  367. package/src/internal/WebhookTransfer.ts +1 -351
  368. package/src/internal/Webhooks.test.ts +222 -145
  369. package/src/internal/Webhooks.ts +234 -135
  370. package/src/internal/funding/Deposit.ts +71 -64
  371. package/src/internal/funding/DepositAddress.ts +50 -43
  372. package/src/internal/funding/DepositWebhook.test.ts +131 -0
  373. package/src/internal/funding/DepositWebhook.ts +101 -0
  374. package/src/internal/funding/Provider.ts +164 -142
  375. package/src/internal/funding/Reconciliation.test.ts +14 -0
  376. package/src/internal/funding/Reconciliation.ts +161 -86
  377. package/src/internal/funding/index.test.ts +1 -0
  378. package/src/internal/funding/index.ts +1 -0
  379. package/src/internal/funding/providers/index.test.ts +185 -0
  380. package/src/internal/funding/providers/stargate.ts +184 -0
  381. package/src/internal/webhookDestinations/slack.ts +15 -0
  382. package/src/providers/index.test.ts +1 -0
  383. package/src/providers/index.ts +9 -0
  384. package/src/Webhooks.bench.ts +0 -714
  385. package/src/Webhooks.memory.bench.ts +0 -250
  386. package/src/Webhooks.test.ts +0 -146
@@ -62,32 +62,39 @@ export namespace schema {
62
62
  */
63
63
  export const PoolToken = Schema.describe(
64
64
  z.object({
65
- address: Schema.TokenAddress.check(
65
+ address: Schema.tokenAddress(Tokens.tokenExample.address).check(
66
66
  z.describe('TIP-20 token contract address used by this fee pool.'),
67
67
  ),
68
68
  currency: z
69
69
  .optional(z.string())
70
70
  .check(
71
71
  z.describe('Display currency for the token, when available.'),
72
- z.meta({ examples: ['USD'] }),
72
+ z.meta({ examples: [Tokens.tokenExample.currency] }),
73
73
  ),
74
74
  decimals: z
75
75
  .optional(z.number().check(z.int(), z.nonnegative()))
76
- .check(z.describe('Number of decimal places the token uses.'), z.meta({ examples: [6] })),
76
+ .check(
77
+ z.describe('Number of decimal places the token uses.'),
78
+ z.meta({ examples: [Tokens.tokenExample.decimals] }),
79
+ ),
77
80
  logoUri: z.optional(z.string()).check(
78
- z.describe('URL for the token logo SVG, when available.'),
81
+ z.describe('URL for the token logo image, when available.'),
79
82
  z.meta({
80
- examples: [
81
- 'https://api.tempo.xyz/data/4217/icons/0x20c0000000000000000000008f5425160ebe5525.svg',
82
- ],
83
+ examples: [Tokens.tokenExample.logoUri],
83
84
  }),
84
85
  ),
85
86
  name: z
86
87
  .optional(z.string())
87
- .check(z.describe('Human-readable token name.'), z.meta({ examples: ['USD Coin'] })),
88
+ .check(
89
+ z.describe('Human-readable token name.'),
90
+ z.meta({ examples: [Tokens.tokenExample.name] }),
91
+ ),
88
92
  symbol: z
89
93
  .optional(z.string())
90
- .check(z.describe('Short token ticker symbol.'), z.meta({ examples: ['USDC'] })),
94
+ .check(
95
+ z.describe('Short token ticker symbol.'),
96
+ z.meta({ examples: [Tokens.tokenExample.symbol] }),
97
+ ),
91
98
  verified: z
92
99
  .optional(z.boolean())
93
100
  .check(
@@ -403,7 +410,7 @@ export function feeAmm() {
403
410
  200,
404
411
  )
405
412
  } catch (cause) {
406
- return Response.upstream(c, cause)
413
+ return Response.upstream(c, cause, { page: query.page })
407
414
  }
408
415
  },
409
416
  )
@@ -498,7 +505,7 @@ export function feeAmm() {
498
505
  200,
499
506
  )
500
507
  } catch (cause) {
501
- return Response.upstream(c, cause)
508
+ return Response.upstream(c, cause, { page: query.page })
502
509
  }
503
510
  },
504
511
  )
@@ -594,7 +594,7 @@ export function receipts(options: receipts.Options = {}) {
594
594
  } catch (cause) {
595
595
  if (cause instanceof Valuation.UnsupportedDenominationError)
596
596
  return Response.error(c, { code: 'query_invalid', message: cause.message, status: 400 })
597
- return Response.upstream(c, cause)
597
+ return Response.upstream(c, cause, { page: query.page })
598
598
  }
599
599
  },
600
600
  )
@@ -286,6 +286,81 @@ describe('POST /rpc', () => {
286
286
  },
287
287
  )
288
288
 
289
+ test('keeps RPC method-filter responses out of upstream alerts', async () => {
290
+ const entries: Log.Entry[] = []
291
+ const body = {
292
+ error: { code: -32_601, message: 'method not allowed: tempo_sponsor' },
293
+ id: null,
294
+ jsonrpc: '2.0',
295
+ }
296
+ const server = await Relay.createServer(
297
+ RequestListener.fromFetchHandler(() => Response.json(body, { status: 403 })),
298
+ )
299
+
300
+ try {
301
+ const app = TestApp.create({
302
+ auth: false,
303
+ logger: (entry) => void entries.push(entry),
304
+ rpc: { url: server.url },
305
+ })
306
+ const response = await app.fetch(
307
+ new Request('http://tempo-api.test/rpc', {
308
+ body: JSON.stringify({ id: 1, jsonrpc: '2.0', method: 'tempo_sponsor' }),
309
+ method: 'POST',
310
+ }),
311
+ )
312
+
313
+ expect(response.status).toBe(403)
314
+ expect(await response.json()).toEqual(body)
315
+ expect(entries[0]?.provider).toBeUndefined()
316
+ } finally {
317
+ await server.closeAsync()
318
+ }
319
+ })
320
+
321
+ test('attributes RPC authorization responses to the upstream', async () => {
322
+ const entries: Log.Entry[] = []
323
+ const server = await Relay.createServer(
324
+ RequestListener.fromFetchHandler(() =>
325
+ Response.json(
326
+ {
327
+ error: { code: -32_001, message: 'unauthorized: invalid credentials' },
328
+ id: null,
329
+ jsonrpc: '2.0',
330
+ },
331
+ { status: 403 },
332
+ ),
333
+ ),
334
+ )
335
+
336
+ try {
337
+ const app = TestApp.create({
338
+ auth: false,
339
+ logger: (entry) => void entries.push(entry),
340
+ rpc: { url: server.url },
341
+ })
342
+ const response = await app.fetch(
343
+ new Request('http://tempo-api.test/rpc', {
344
+ body: JSON.stringify({ id: 1, jsonrpc: '2.0', method: 'eth_chainId' }),
345
+ method: 'POST',
346
+ }),
347
+ )
348
+
349
+ expect(response.status).toBe(403)
350
+ expect(entries[0]).toMatchObject({
351
+ provider: {
352
+ chainId: runtime.chainId,
353
+ failure: 'http',
354
+ id: 'rpc',
355
+ operation: 'request',
356
+ status: 403,
357
+ },
358
+ })
359
+ } finally {
360
+ await server.closeAsync()
361
+ }
362
+ })
363
+
289
364
  test('attributes RPC transport failures to the upstream', async () => {
290
365
  const entries: Log.Entry[] = []
291
366
  const server = await Relay.createServer(
@@ -411,14 +411,14 @@ async function passthrough(
411
411
 
412
412
  try {
413
413
  const response = await fetch(new Request(upstream, init))
414
- let body = response.body
414
+ // Malformed requests and public Zone authentication failures are caused
415
+ // by caller input, not by the RPC provider.
416
+ if (!response.ok && !(await isCallerRpcFailure(response, usePublicZoneUrl)))
417
+ c.set('providerFailure', rpcProviderFailure(response, alertChainId))
415
418
 
416
- if (!response.ok) {
417
- // Malformed requests and public Zone authentication failures are caused
418
- // by caller input, not by the RPC provider.
419
- if (!isCallerRpcFailure(response.status, usePublicZoneUrl))
420
- c.set('providerFailure', rpcProviderFailure(response, alertChainId))
421
- } else if (response.status === 200) {
419
+ // `Response.clone()` replaces the body stream, so capture it after classifying errors.
420
+ let body = response.body
421
+ if (response.status === 200) {
422
422
  const inspection = await inspectRpcResponse(response)
423
423
  body = inspection.body
424
424
  if (inspection.result?.ok === false && !(inspection.result.empty && options.notificationOnly))
@@ -455,14 +455,28 @@ async function passthrough(
455
455
  }
456
456
  }
457
457
 
458
- function isCallerRpcFailure(status: number, usePublicZoneUrl: boolean) {
459
- return (
458
+ async function isCallerRpcFailure(response: globalThis.Response, usePublicZoneUrl: boolean) {
459
+ const { status } = response
460
+ if (
460
461
  status === 400 ||
461
462
  status === 413 ||
462
463
  status === 415 ||
463
464
  status === 422 ||
464
465
  (usePublicZoneUrl && (status === 401 || status === 403))
465
466
  )
467
+ return true
468
+ if (status !== 403) return false
469
+
470
+ // Orchestra returns HTTP 403 with JSON-RPC -32601 when its method filter
471
+ // rejects caller input. Other 403s, including RPC auth failures, stay upstream failures.
472
+ const body = await response
473
+ .clone()
474
+ .json()
475
+ .catch(() => undefined)
476
+ const parsed = schema.ResponseBody.safeParse(body)
477
+ if (!parsed.success) return false
478
+ const responses = Array.isArray(parsed.data) ? parsed.data : [parsed.data]
479
+ return responses.every((response) => response.error?.code === -32_601)
466
480
  }
467
481
 
468
482
  declare namespace passthrough {
@@ -11,7 +11,7 @@ import * as Schema from '../../../internal/Schema.js'
11
11
  import * as Timing from '../../../internal/Timing.js'
12
12
  import * as VerifiedTokens from '../../../internal/VerifiedTokens.js'
13
13
  import * as Viem from '../../../internal/Viem.js'
14
- import { getTokenLogo } from './tokens.js'
14
+ import * as Tokens from './tokens.js'
15
15
 
16
16
  /** Zod schemas owned by the tokenlist resource. */
17
17
  export namespace schema {
@@ -26,15 +26,20 @@ export namespace schema {
26
26
  z.describe('The Tempo chain ID where this token lives.'),
27
27
  z.meta({ examples: [4217] }),
28
28
  ),
29
- address: Schema.Address.check(z.describe('The TIP-20 token contract address on Tempo.')),
29
+ address: Schema.tokenAddress(Tokens.tokenExample.address).check(
30
+ z.describe('The TIP-20 token contract address on Tempo.'),
31
+ ),
30
32
  name: z
31
33
  .string()
32
- .check(z.describe('The token’s human-readable name.'), z.meta({ examples: ['USD Coin'] })),
34
+ .check(
35
+ z.describe('The token’s human-readable name.'),
36
+ z.meta({ examples: [Tokens.tokenExample.name] }),
37
+ ),
33
38
  symbol: z
34
39
  .string()
35
40
  .check(
36
41
  z.describe('The short ticker symbol wallets and apps show for this token.'),
37
- z.meta({ examples: ['USDC'] }),
42
+ z.meta({ examples: [Tokens.tokenExample.symbol] }),
38
43
  ),
39
44
  decimals: z
40
45
  .number()
@@ -45,14 +50,12 @@ export namespace schema {
45
50
  z.describe(
46
51
  'The number of decimal places the token uses; Tempo stablecoins typically use 6.',
47
52
  ),
48
- z.meta({ examples: [6] }),
53
+ z.meta({ examples: [Tokens.tokenExample.decimals] }),
49
54
  ),
50
55
  logoURI: z.optional(z.string()).check(
51
56
  z.describe('The curated HTTPS URL for this token’s logo image, when one is set.'),
52
57
  z.meta({
53
- examples: [
54
- 'https://api.tempo.xyz/data/4217/icons/0x20c0000000000000000000008f5425160ebe5525.svg',
55
- ],
58
+ examples: [Tokens.tokenExample.logoUri],
56
59
  }),
57
60
  ),
58
61
  })
@@ -145,13 +148,12 @@ export function tokenlist() {
145
148
  version: { major: 1, minor: 0, patch: 2 },
146
149
  tokens: [
147
150
  {
148
- chainId: 4217,
149
- address: '0x20c0000000000000000000000000000000000000',
150
- name: 'pathUSD',
151
- symbol: 'pathUSD',
152
- decimals: 6,
153
- logoURI:
154
- 'https://api.tempo.xyz/assets/4217/tokens/0x20c0000000000000000000000000000000000000/logo',
151
+ address: Tokens.tokenExample.address,
152
+ chainId: Tokens.tokenExampleChainId,
153
+ decimals: Tokens.tokenExample.decimals,
154
+ logoURI: Tokens.tokenExample.logoUri,
155
+ name: Tokens.tokenExample.name,
156
+ symbol: Tokens.tokenExample.symbol,
155
157
  },
156
158
  ],
157
159
  },
@@ -239,9 +241,10 @@ async function getTokenLogos(
239
241
  async (token) =>
240
242
  [
241
243
  token.address,
242
- await getTokenLogo(c, { address: token.address, chainId: options.chainId }).catch(
243
- () => undefined,
244
- ),
244
+ await Tokens.getTokenLogo(c, {
245
+ address: token.address,
246
+ chainId: options.chainId,
247
+ }).catch(() => undefined),
245
248
  ] as const,
246
249
  ),
247
250
  )
@@ -18,6 +18,35 @@ function app(options: TestApp.create.Options = {}) {
18
18
 
19
19
  const verifiedTokenCount = 6
20
20
 
21
+ describe('OpenAPI', () => {
22
+ test('uses coherent token responses and canonical asset URLs', async () => {
23
+ const application = TestApp.create({ auth: false })
24
+ const spec = (await (await application.request('/openapi.json')).json()) as {
25
+ paths: Record<
26
+ string,
27
+ {
28
+ get?: {
29
+ operationId?: string
30
+ responses?: Record<string, { content?: { 'application/json'?: { example?: unknown } } }>
31
+ }
32
+ }
33
+ >
34
+ }
35
+
36
+ for (const operationId of ['getToken', 'getTokenBySymbol']) {
37
+ const operation = Object.values(spec.paths).find(
38
+ (path) => path.get?.operationId === operationId,
39
+ )
40
+ expect(operation?.get?.responses?.['200']?.content?.['application/json']?.example).toEqual(
41
+ Tokens.tokenExample,
42
+ )
43
+ }
44
+
45
+ const assetUrls = JSON.stringify(spec).match(/https:\/\/api\.tempo\.xyz\/assets\/[^"\\]+/g)
46
+ expect(new Set(assetUrls)).toEqual(new Set([Tokens.tokenExample.logoUri]))
47
+ })
48
+ })
49
+
21
50
  describe('GET /tokens', () => {
22
51
  test.runIf(runtime.mode === 'testnet')(
23
52
  'serves a bounded positional page via `page` (indexed mode)',
@@ -4,6 +4,7 @@ import { type Address, ContractFunctionExecutionError } from 'viem'
4
4
  import { Abis } from 'viem/tempo'
5
5
  import * as z from 'zod/mini'
6
6
 
7
+ import * as Assets from '../../../Assets.js'
7
8
  import type * as App from '../../../App.js'
8
9
  import * as Auth from '../../../internal/Auth.js'
9
10
  import * as Cache from '../../../internal/Cache.js'
@@ -20,6 +21,26 @@ import * as Value from '../../../internal/Value.js'
20
21
  import * as VerifiedTokens from '../../../internal/VerifiedTokens.js'
21
22
  import * as Transactions from './transactions.js'
22
23
 
24
+ /** Mainnet chain id used by the coherent token OpenAPI example. */
25
+ export const tokenExampleChainId = 4217
26
+
27
+ /** Coherent mainnet token metadata used by generated OpenAPI examples. */
28
+ export const tokenExample = {
29
+ address: '0x20c000000000000000000000b9537d11c60e8b50',
30
+ currency: 'USD',
31
+ decimals: 6,
32
+ id: '0x20c000000000000000000000b9537d11c60e8b50',
33
+ logoUri: Assets.url({
34
+ chainId: tokenExampleChainId,
35
+ origin: 'https://api.tempo.xyz',
36
+ path: 'icons/0x20c000000000000000000000b9537d11c60e8b50',
37
+ }),
38
+ name: 'Bridged USDC (Stargate)',
39
+ symbol: 'USDC.e',
40
+ totalSupply: '10850791186630',
41
+ verified: true,
42
+ } as const
43
+
23
44
  const tokenCreatedSignature =
24
45
  'event TokenCreated(address indexed token, string name, string symbol, string currency, address quoteToken, address admin, bytes32 salt)'
25
46
 
@@ -53,7 +74,9 @@ export namespace schema {
53
74
  /** Path parameters for token metadata requests. */
54
75
  export const Params = z
55
76
  .object({
56
- token: Schema.TokenAddress.check(z.describe('The TIP-20 token contract address on Tempo.')),
77
+ token: Schema.tokenAddress(tokenExample.address).check(
78
+ z.describe('The TIP-20 token contract address on Tempo.'),
79
+ ),
57
80
  })
58
81
  .check(z.describe('Path parameters for looking up one token’s metadata.'))
59
82
 
@@ -86,7 +109,7 @@ export namespace schema {
86
109
  /** TIP-20 token metadata returned by token endpoints. */
87
110
  export const Response = Schema.describe(
88
111
  z.object({
89
- address: Schema.TokenAddress.check(
112
+ address: Schema.tokenAddress(tokenExample.address).check(
90
113
  z.describe('The TIP-20 token contract address on Tempo.'),
91
114
  ),
92
115
  admin: z
@@ -103,7 +126,7 @@ export namespace schema {
103
126
  z.describe(
104
127
  'The currency label for this token, such as `USD` for USD-denominated stablecoins.',
105
128
  ),
106
- z.meta({ examples: ['USD'] }),
129
+ z.meta({ examples: [tokenExample.currency] }),
107
130
  ),
108
131
  createdAt: z
109
132
  .optional(z.iso.datetime())
@@ -122,7 +145,7 @@ export namespace schema {
122
145
  z.describe(
123
146
  'The number of decimal places the token uses; Tempo stablecoins typically use 6.',
124
147
  ),
125
- z.meta({ examples: [6] }),
148
+ z.meta({ examples: [tokenExample.decimals] }),
126
149
  ),
127
150
  holderCount: z
128
151
  .optional(z.number().check(z.int(), z.nonnegative()))
@@ -136,21 +159,19 @@ export namespace schema {
136
159
  .string()
137
160
  .check(
138
161
  z.describe('A stable resource ID for this token, equal to its contract address.'),
139
- z.meta({ examples: ['0x20c0000000000000000000008f5425160ebe5525'] }),
162
+ z.meta({ examples: [tokenExample.id] }),
140
163
  ),
141
164
  logoUri: z.optional(z.string()).check(
142
165
  z.describe('A URL for the token’s logo image, when one is available.'),
143
166
  z.meta({
144
- examples: [
145
- 'https://api.tempo.xyz/data/4217/icons/0x20c0000000000000000000008f5425160ebe5525.svg',
146
- ],
167
+ examples: [tokenExample.logoUri],
147
168
  }),
148
169
  ),
149
170
  name: z
150
171
  .string()
151
172
  .check(
152
173
  z.describe('The token’s human-readable name.'),
153
- z.meta({ examples: ['USD Coin'] }),
174
+ z.meta({ examples: [tokenExample.name] }),
154
175
  ),
155
176
  quoteToken: z
156
177
  .optional(Schema.Address)
@@ -164,7 +185,7 @@ export namespace schema {
164
185
  .string()
165
186
  .check(
166
187
  z.describe('The short ticker symbol wallets and apps show for this token.'),
167
- z.meta({ examples: ['USDC'] }),
188
+ z.meta({ examples: [tokenExample.symbol] }),
168
189
  ),
169
190
  totalSupply: z
170
191
  .optional(z.string().check(z.regex(/^\d+$/)))
@@ -172,7 +193,7 @@ export namespace schema {
172
193
  z.describe(
173
194
  'The token’s total supply as a decimal string in the smallest unit, so large values keep full precision.',
174
195
  ),
175
- z.meta({ examples: ['1000000000000'] }),
196
+ z.meta({ examples: [tokenExample.totalSupply] }),
176
197
  ),
177
198
  transferStats: z
178
199
  .optional(
@@ -213,7 +234,7 @@ export namespace schema {
213
234
  .boolean()
214
235
  .check(
215
236
  z.describe('Whether this token is in Tempo’s curated verified token list.'),
216
- z.meta({ examples: [true] }),
237
+ z.meta({ examples: [tokenExample.verified] }),
217
238
  ),
218
239
  }),
219
240
  'Token metadata for a TIP-20 token, including name, symbol, decimals, supply, and optional indexed details.',
@@ -624,7 +645,7 @@ export function tokens() {
624
645
  200,
625
646
  )
626
647
  } catch (cause) {
627
- return Response.upstream(c, cause)
648
+ return Response.upstream(c, cause, { page: query.page })
628
649
  }
629
650
  },
630
651
  )
@@ -653,6 +674,7 @@ export function tokens() {
653
674
  },
654
675
  success: {
655
676
  description: 'Metadata for one TIP-20 token.',
677
+ example: tokenExample,
656
678
  schema: schema.getToken.Response,
657
679
  },
658
680
  }),
@@ -725,6 +747,7 @@ export function tokens() {
725
747
  },
726
748
  success: {
727
749
  description: 'Metadata for one TIP-20 token.',
750
+ example: tokenExample,
728
751
  schema: schema.getToken.Response,
729
752
  },
730
753
  }),
@@ -932,7 +955,7 @@ export function tokens() {
932
955
  200,
933
956
  )
934
957
  } catch (cause) {
935
- return Response.upstream(c, cause)
958
+ return Response.upstream(c, cause, { page: query.page })
936
959
  }
937
960
  },
938
961
  )
@@ -1051,7 +1074,7 @@ export function tokens() {
1051
1074
  200,
1052
1075
  )
1053
1076
  } catch (cause) {
1054
- return Response.upstream(c, cause)
1077
+ return Response.upstream(c, cause, { page: query.page })
1055
1078
  }
1056
1079
  },
1057
1080
  )
@@ -687,7 +687,7 @@ export function transactions() {
687
687
  200,
688
688
  )
689
689
  } catch (cause) {
690
- return Response.upstream(c, cause)
690
+ return Response.upstream(c, cause, { page: query.page })
691
691
  }
692
692
  },
693
693
  )
@@ -1058,16 +1058,16 @@ describe('GET /transfers', () => {
1058
1058
  expect(empty.data).toEqual([])
1059
1059
  })
1060
1060
 
1061
- test('keeps the largest positional window within the indexer row limit', async () => {
1061
+ test('accepts the largest positional window', async () => {
1062
1062
  const client = TestApp.client()
1063
1063
  const response = await client.v1.transfers.$get(
1064
- { query: { limit: '200', order: 'desc', page: '50' } },
1064
+ { query: { limit: '50', order: 'desc', page: '10' } },
1065
1065
  TestApp.auth,
1066
1066
  )
1067
1067
  const page = await TestApp.json(response, Transfers.schema.getTransfers.Response)
1068
1068
 
1069
1069
  expect(response.status).toBe(200)
1070
- expect(page.data.length).toBeLessThanOrEqual(200)
1070
+ expect(page.data.length).toBeLessThanOrEqual(50)
1071
1071
  })
1072
1072
  })
1073
1073
 
@@ -69,14 +69,16 @@ export namespace schema {
69
69
  /** A transfer token reference with RPC metadata. Inlined to avoid the `transfers`/`tokens` module cycle. */
70
70
  export const SourceToken = z
71
71
  .object({
72
- address: Schema.TokenAddress.check(z.describe('The TIP-20 token contract address on Tempo.')),
72
+ address: Schema.tokenAddress(Tokens.tokenExample.address).check(
73
+ z.describe('The TIP-20 token contract address on Tempo.'),
74
+ ),
73
75
  currency: z
74
76
  .string()
75
77
  .check(
76
78
  z.describe(
77
79
  'The currency label for this token, such as `USD` for USD-denominated stablecoins.',
78
80
  ),
79
- z.meta({ examples: ['USD'] }),
81
+ z.meta({ examples: [Tokens.tokenExample.currency] }),
80
82
  ),
81
83
  decimals: z
82
84
  .number()
@@ -85,24 +87,25 @@ export namespace schema {
85
87
  z.describe(
86
88
  'The number of decimal places the token uses; Tempo stablecoins typically use 6.',
87
89
  ),
88
- z.meta({ examples: [6] }),
90
+ z.meta({ examples: [Tokens.tokenExample.decimals] }),
89
91
  ),
90
92
  logoUri: z.optional(z.string()).check(
91
93
  z.describe('A URL for the token’s logo image, returned with `include=token.logoUri`.'),
92
94
  z.meta({
93
- examples: [
94
- 'https://api.tempo.xyz/data/4217/icons/0x20c0000000000000000000008f5425160ebe5525.svg',
95
- ],
95
+ examples: [Tokens.tokenExample.logoUri],
96
96
  }),
97
97
  ),
98
98
  name: z
99
99
  .string()
100
- .check(z.describe('The token’s human-readable name.'), z.meta({ examples: ['USD Coin'] })),
100
+ .check(
101
+ z.describe('The token’s human-readable name.'),
102
+ z.meta({ examples: [Tokens.tokenExample.name] }),
103
+ ),
101
104
  symbol: z
102
105
  .string()
103
106
  .check(
104
107
  z.describe('The short ticker symbol wallets and apps show for this token.'),
105
- z.meta({ examples: ['USDC'] }),
108
+ z.meta({ examples: [Tokens.tokenExample.symbol] }),
106
109
  ),
107
110
  verified: z
108
111
  .optional(z.boolean())
@@ -659,7 +662,7 @@ export function transfers(options: transfers.Options = {}) {
659
662
  } catch (cause) {
660
663
  if (cause instanceof Valuation.UnsupportedDenominationError)
661
664
  return Response.error(c, { code: 'query_invalid', message: cause.message, status: 400 })
662
- return Response.upstream(c, cause)
665
+ return Response.upstream(c, cause, { page: options.page })
663
666
  }
664
667
  },
665
668
  )