tapimo 0.7.0 → 0.7.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 (689) hide show
  1. package/dist/ApiKeys.d.ts +24 -7
  2. package/dist/ApiKeys.d.ts.map +1 -1
  3. package/dist/ApiKeys.js +17 -5
  4. package/dist/ApiKeys.js.map +1 -1
  5. package/dist/App.d.ts +12104 -7861
  6. package/dist/App.d.ts.map +1 -1
  7. package/dist/App.js +191 -128
  8. package/dist/App.js.map +1 -1
  9. package/dist/Assets.d.ts +10 -0
  10. package/dist/Assets.d.ts.map +1 -1
  11. package/dist/Assets.js +17 -4
  12. package/dist/Assets.js.map +1 -1
  13. package/dist/Scope.d.ts +19 -8
  14. package/dist/Scope.d.ts.map +1 -1
  15. package/dist/Scope.js +25 -9
  16. package/dist/Scope.js.map +1 -1
  17. package/dist/Webhooks.d.ts +1 -1
  18. package/dist/admin/App.d.ts +601 -20
  19. package/dist/admin/App.d.ts.map +1 -1
  20. package/dist/admin/App.js +12 -2
  21. package/dist/admin/App.js.map +1 -1
  22. package/dist/admin/apps/api-keys.d.ts +94 -11
  23. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.js +141 -32
  25. package/dist/admin/apps/api-keys.js.map +1 -1
  26. package/dist/admin/apps/earn-vaults.d.ts +1069 -0
  27. package/dist/admin/apps/earn-vaults.d.ts.map +1 -0
  28. package/dist/admin/apps/earn-vaults.js +409 -0
  29. package/dist/admin/apps/earn-vaults.js.map +1 -0
  30. package/dist/admin/apps/verified-tokens.d.ts +166 -166
  31. package/dist/admin/ui.generated.d.ts +1 -1
  32. package/dist/admin/ui.generated.d.ts.map +1 -1
  33. package/dist/admin/ui.generated.js +151 -95
  34. package/dist/admin/ui.generated.js.map +1 -1
  35. package/dist/analytics/Analytics.d.ts +2 -0
  36. package/dist/analytics/Analytics.d.ts.map +1 -1
  37. package/dist/analytics/Analytics.js +18 -2
  38. package/dist/analytics/Analytics.js.map +1 -1
  39. package/dist/analytics/tables/requestEvents.d.ts +22 -1
  40. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  41. package/dist/analytics/tables/requestEvents.js +59 -39
  42. package/dist/analytics/tables/requestEvents.js.map +1 -1
  43. package/dist/apps/Zones.d.ts +8335 -0
  44. package/dist/apps/Zones.d.ts.map +1 -0
  45. package/dist/apps/Zones.js +38 -0
  46. package/dist/apps/Zones.js.map +1 -0
  47. package/dist/apps/data/App.d.ts +14377 -10165
  48. package/dist/apps/data/App.d.ts.map +1 -1
  49. package/dist/apps/data/App.js +91 -19
  50. package/dist/apps/data/App.js.map +1 -1
  51. package/dist/apps/data/FxOracle.d.ts +1 -1
  52. package/dist/apps/data/FxOracle.d.ts.map +1 -1
  53. package/dist/apps/data/index.d.ts +0 -1
  54. package/dist/apps/data/index.d.ts.map +1 -1
  55. package/dist/apps/data/index.js +0 -1
  56. package/dist/apps/data/index.js.map +1 -1
  57. package/dist/apps/data/routes/activities.d.ts +32 -32
  58. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  59. package/dist/apps/data/routes/activities.js +130 -65
  60. package/dist/apps/data/routes/activities.js.map +1 -1
  61. package/dist/apps/data/routes/addresses.d.ts +312 -312
  62. package/dist/apps/data/routes/balances.d.ts +18 -18
  63. package/dist/apps/data/routes/balances.js +5 -5
  64. package/dist/apps/data/routes/balances.js.map +1 -1
  65. package/dist/apps/data/routes/coingecko.d.ts +176 -176
  66. package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
  67. package/dist/apps/data/routes/coingecko.js +62 -35
  68. package/dist/apps/data/routes/coingecko.js.map +1 -1
  69. package/dist/apps/data/routes/earn.d.ts +2144 -0
  70. package/dist/apps/data/routes/earn.d.ts.map +1 -0
  71. package/dist/apps/data/routes/earn.js +947 -0
  72. package/dist/apps/data/routes/earn.js.map +1 -0
  73. package/dist/apps/data/routes/exchanges.d.ts +1231 -324
  74. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  75. package/dist/apps/data/routes/exchanges.js +656 -193
  76. package/dist/apps/data/routes/exchanges.js.map +1 -1
  77. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  78. package/dist/apps/data/routes/fee-amm.js +59 -8
  79. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  80. package/dist/apps/data/routes/funding.d.ts +4092 -387
  81. package/dist/apps/data/routes/funding.d.ts.map +1 -1
  82. package/dist/apps/data/routes/funding.js +1403 -256
  83. package/dist/apps/data/routes/funding.js.map +1 -1
  84. package/dist/apps/data/routes/indexer.d.ts +5 -5
  85. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  86. package/dist/apps/data/routes/indexer.js +19 -2
  87. package/dist/apps/data/routes/indexer.js.map +1 -1
  88. package/dist/apps/data/routes/receipts.d.ts +265 -265
  89. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  90. package/dist/apps/data/routes/receipts.js +11 -11
  91. package/dist/apps/data/routes/receipts.js.map +1 -1
  92. package/dist/apps/data/routes/rpc.d.ts +5 -5
  93. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  94. package/dist/apps/data/routes/rpc.js +211 -22
  95. package/dist/apps/data/routes/rpc.js.map +1 -1
  96. package/dist/apps/data/routes/tokenlist.d.ts +36 -36
  97. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  98. package/dist/apps/data/routes/tokenlist.js +49 -9
  99. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  100. package/dist/apps/data/routes/tokens.d.ts +116 -88
  101. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  102. package/dist/apps/data/routes/tokens.js +198 -91
  103. package/dist/apps/data/routes/tokens.js.map +1 -1
  104. package/dist/apps/data/routes/transactions.d.ts +55 -55
  105. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  106. package/dist/apps/data/routes/transactions.js +78 -39
  107. package/dist/apps/data/routes/transactions.js.map +1 -1
  108. package/dist/apps/data/routes/transfers.d.ts +78 -29
  109. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  110. package/dist/apps/data/routes/transfers.js +165 -67
  111. package/dist/apps/data/routes/transfers.js.map +1 -1
  112. package/dist/apps/data/routes/valuation.d.ts +10 -10
  113. package/dist/apps/data/routes/valuation.js +2 -2
  114. package/dist/apps/data/routes/valuation.js.map +1 -1
  115. package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -1
  116. package/dist/apps/data/routes/verified-tokens.js +34 -9
  117. package/dist/apps/data/routes/verified-tokens.js.map +1 -1
  118. package/dist/apps/data/routes/webhooks.d.ts +5 -3
  119. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  120. package/dist/apps/data/routes/webhooks.js +175 -65
  121. package/dist/apps/data/routes/webhooks.js.map +1 -1
  122. package/dist/apps/data/routes/zones.d.ts +281 -0
  123. package/dist/apps/data/routes/zones.d.ts.map +1 -0
  124. package/dist/apps/data/routes/zones.js +252 -0
  125. package/dist/apps/data/routes/zones.js.map +1 -0
  126. package/dist/apps/docs/reference.js +6 -5
  127. package/dist/apps/docs/reference.js.map +1 -1
  128. package/dist/apps/index.d.ts +2 -1
  129. package/dist/apps/index.d.ts.map +1 -1
  130. package/dist/apps/index.js +2 -1
  131. package/dist/apps/index.js.map +1 -1
  132. package/dist/apps/management/App.d.ts +670 -670
  133. package/dist/apps/management/Billing.d.ts +8 -0
  134. package/dist/apps/management/Billing.d.ts.map +1 -1
  135. package/dist/apps/management/Billing.js +12 -0
  136. package/dist/apps/management/Billing.js.map +1 -1
  137. package/dist/apps/management/Error.d.ts +12 -0
  138. package/dist/apps/management/Error.d.ts.map +1 -0
  139. package/dist/apps/management/Error.js +10 -0
  140. package/dist/apps/management/Error.js.map +1 -0
  141. package/dist/apps/management/routes/api-keys.d.ts +5 -5
  142. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  143. package/dist/apps/management/routes/api-keys.js +2 -8
  144. package/dist/apps/management/routes/api-keys.js.map +1 -1
  145. package/dist/apps/management/routes/billing.d.ts +119 -119
  146. package/dist/apps/management/routes/faucet.d.ts +35 -35
  147. package/dist/apps/management/routes/invitations.d.ts +62 -62
  148. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  149. package/dist/apps/management/routes/invitations.js +4 -10
  150. package/dist/apps/management/routes/invitations.js.map +1 -1
  151. package/dist/apps/management/routes/invite-links.d.ts +30 -30
  152. package/dist/apps/management/routes/me.d.ts +6 -6
  153. package/dist/apps/management/routes/members.d.ts +78 -78
  154. package/dist/apps/management/routes/orgs.d.ts +48 -48
  155. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  156. package/dist/apps/management/routes/orgs.js +2 -8
  157. package/dist/apps/management/routes/orgs.js.map +1 -1
  158. package/dist/apps/management/routes/projects.d.ts +9 -9
  159. package/dist/apps/management/routes/scopes.js +2 -2
  160. package/dist/apps/management/routes/scopes.js.map +1 -1
  161. package/dist/apps/management/routes/usage.d.ts +80 -80
  162. package/dist/apps/management/routes/verified-token-requests.d.ts +36 -36
  163. package/dist/apps/management/routes/webhooks.d.ts +50 -50
  164. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  165. package/dist/apps/management/routes/webhooks.js +15 -3
  166. package/dist/apps/management/routes/webhooks.js.map +1 -1
  167. package/dist/apps/mpp/App.d.ts +55 -56
  168. package/dist/apps/mpp/App.d.ts.map +1 -1
  169. package/dist/apps/mpp/App.js +192 -27
  170. package/dist/apps/mpp/App.js.map +1 -1
  171. package/dist/apps/mpp/Mpp.d.ts +0 -20
  172. package/dist/apps/mpp/Mpp.d.ts.map +1 -1
  173. package/dist/apps/mpp/Mpp.js +0 -24
  174. package/dist/apps/mpp/Mpp.js.map +1 -1
  175. package/dist/apps/mpp/internal/Adapter.d.ts +40 -0
  176. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -0
  177. package/dist/apps/mpp/internal/Adapter.js +66 -0
  178. package/dist/apps/mpp/internal/Adapter.js.map +1 -0
  179. package/dist/apps/mpp/internal/Error.d.ts +4 -0
  180. package/dist/apps/mpp/internal/Error.d.ts.map +1 -0
  181. package/dist/apps/mpp/internal/Error.js +41 -0
  182. package/dist/apps/mpp/internal/Error.js.map +1 -0
  183. package/dist/apps/mpp/internal/Idempotency.d.ts +33 -0
  184. package/dist/apps/mpp/internal/Idempotency.d.ts.map +1 -0
  185. package/dist/apps/mpp/internal/Idempotency.js +28 -0
  186. package/dist/apps/mpp/internal/Idempotency.js.map +1 -0
  187. package/dist/apps/mpp/internal/Policy.d.ts +46 -0
  188. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -0
  189. package/dist/apps/mpp/internal/Policy.js +57 -0
  190. package/dist/apps/mpp/internal/Policy.js.map +1 -0
  191. package/dist/apps/mpp/internal/ScreenManager.d.ts +27 -0
  192. package/dist/apps/mpp/internal/ScreenManager.d.ts.map +1 -0
  193. package/dist/apps/mpp/internal/ScreenManager.js +18 -0
  194. package/dist/apps/mpp/internal/ScreenManager.js.map +1 -0
  195. package/dist/apps/mpp/internal/Screening.d.ts +35 -0
  196. package/dist/apps/mpp/internal/Screening.d.ts.map +1 -0
  197. package/dist/apps/mpp/internal/Screening.js +20 -0
  198. package/dist/apps/mpp/internal/Screening.js.map +1 -0
  199. package/dist/apps/mpp/internal/Sponsorship.d.ts +36 -0
  200. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -0
  201. package/dist/apps/mpp/internal/Sponsorship.js +103 -0
  202. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -0
  203. package/dist/apps/mpp/internal/Utils.d.ts +7 -0
  204. package/dist/apps/mpp/internal/Utils.d.ts.map +1 -0
  205. package/dist/apps/mpp/internal/Utils.js +24 -0
  206. package/dist/apps/mpp/internal/Utils.js.map +1 -0
  207. package/dist/apps/relay/App.js +184 -24
  208. package/dist/apps/relay/App.js.map +1 -1
  209. package/dist/apps/relay/Sponsorships.d.ts +4 -0
  210. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  211. package/dist/apps/relay/Sponsorships.js +16 -7
  212. package/dist/apps/relay/Sponsorships.js.map +1 -1
  213. package/dist/db/Db.d.ts +20 -0
  214. package/dist/db/Db.d.ts.map +1 -1
  215. package/dist/db/Db.js +342 -0
  216. package/dist/db/Db.js.map +1 -1
  217. package/dist/db/Schema.d.ts +921 -1
  218. package/dist/db/Schema.d.ts.map +1 -1
  219. package/dist/db/Schema.js +269 -1
  220. package/dist/db/Schema.js.map +1 -1
  221. package/dist/db/tables/earnVaults.d.ts +68 -0
  222. package/dist/db/tables/earnVaults.d.ts.map +1 -0
  223. package/dist/db/tables/earnVaults.js +72 -0
  224. package/dist/db/tables/earnVaults.js.map +1 -0
  225. package/dist/db/tables/fundingCatalog.d.ts +56 -0
  226. package/dist/db/tables/fundingCatalog.d.ts.map +1 -0
  227. package/dist/db/tables/fundingCatalog.js +85 -0
  228. package/dist/db/tables/fundingCatalog.js.map +1 -0
  229. package/dist/db/tables/fundingDepositAddresses.d.ts +159 -0
  230. package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
  231. package/dist/db/tables/fundingDepositAddresses.js +206 -0
  232. package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
  233. package/dist/db/tables/fundingDeposits.d.ts +115 -0
  234. package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
  235. package/dist/db/tables/fundingDeposits.js +100 -0
  236. package/dist/db/tables/fundingDeposits.js.map +1 -0
  237. package/dist/db/tables/fundingIdempotency.d.ts +91 -0
  238. package/dist/db/tables/fundingIdempotency.d.ts.map +1 -0
  239. package/dist/db/tables/fundingIdempotency.js +103 -0
  240. package/dist/db/tables/fundingIdempotency.js.map +1 -0
  241. package/dist/db/tables/fundingTransferEvents.d.ts +12 -0
  242. package/dist/db/tables/fundingTransferEvents.d.ts.map +1 -0
  243. package/dist/db/tables/fundingTransferEvents.js +18 -0
  244. package/dist/db/tables/fundingTransferEvents.js.map +1 -0
  245. package/dist/db/tables/fundingTransferTransactions.d.ts +15 -0
  246. package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -0
  247. package/dist/db/tables/fundingTransferTransactions.js +27 -0
  248. package/dist/db/tables/fundingTransferTransactions.js.map +1 -0
  249. package/dist/db/tables/fundingTransfers.d.ts +82 -0
  250. package/dist/db/tables/fundingTransfers.d.ts.map +1 -0
  251. package/dist/db/tables/fundingTransfers.js +89 -0
  252. package/dist/db/tables/fundingTransfers.js.map +1 -0
  253. package/dist/db/tables/organizations.d.ts +8 -0
  254. package/dist/db/tables/organizations.d.ts.map +1 -1
  255. package/dist/db/tables/organizations.js +35 -0
  256. package/dist/db/tables/organizations.js.map +1 -1
  257. package/dist/db/tables/projects.d.ts +8 -0
  258. package/dist/db/tables/projects.d.ts.map +1 -1
  259. package/dist/db/tables/projects.js +16 -0
  260. package/dist/db/tables/projects.js.map +1 -1
  261. package/dist/db/tables/requestUsage.d.ts +13 -0
  262. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  263. package/dist/db/tables/requestUsage.js +16 -0
  264. package/dist/db/tables/requestUsage.js.map +1 -1
  265. package/dist/db/tables/sponsoredTransactions.d.ts +4 -2
  266. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  267. package/dist/db/tables/sponsoredTransactions.js +14 -4
  268. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  269. package/dist/db/tables/users.d.ts +8 -0
  270. package/dist/db/tables/users.d.ts.map +1 -1
  271. package/dist/db/tables/users.js +16 -0
  272. package/dist/db/tables/users.js.map +1 -1
  273. package/dist/db/tables/verifiedTokens.d.ts +14 -7
  274. package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
  275. package/dist/db/tables/verifiedTokens.js +9 -7
  276. package/dist/db/tables/verifiedTokens.js.map +1 -1
  277. package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
  278. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  279. package/dist/db/tables/webhookSubscriptions.js +24 -3
  280. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  281. package/dist/handlers/relay.js +108 -108
  282. package/dist/handlers/relay.js.map +1 -1
  283. package/dist/internal/Auth.d.ts +26 -0
  284. package/dist/internal/Auth.d.ts.map +1 -1
  285. package/dist/internal/Auth.js +35 -2
  286. package/dist/internal/Auth.js.map +1 -1
  287. package/dist/internal/Cache.d.ts.map +1 -1
  288. package/dist/internal/Cache.js +16 -10
  289. package/dist/internal/Cache.js.map +1 -1
  290. package/dist/internal/Cursor.js +1 -1
  291. package/dist/internal/Cursor.js.map +1 -1
  292. package/dist/internal/EarnRates.d.ts +89 -0
  293. package/dist/internal/EarnRates.d.ts.map +1 -0
  294. package/dist/internal/EarnRates.js +266 -0
  295. package/dist/internal/EarnRates.js.map +1 -0
  296. package/dist/internal/EarnVaults.d.ts +171 -0
  297. package/dist/internal/EarnVaults.d.ts.map +1 -0
  298. package/dist/internal/EarnVaults.js +547 -0
  299. package/dist/internal/EarnVaults.js.map +1 -0
  300. package/dist/internal/EdgeCache.d.ts +9 -2
  301. package/dist/internal/EdgeCache.d.ts.map +1 -1
  302. package/dist/internal/EdgeCache.js +36 -9
  303. package/dist/internal/EdgeCache.js.map +1 -1
  304. package/dist/internal/Id.d.ts +11 -0
  305. package/dist/internal/Id.d.ts.map +1 -1
  306. package/dist/internal/Id.js +13 -0
  307. package/dist/internal/Id.js.map +1 -1
  308. package/dist/internal/Idempotency.d.ts +83 -0
  309. package/dist/internal/Idempotency.d.ts.map +1 -0
  310. package/dist/internal/Idempotency.js +113 -0
  311. package/dist/internal/Idempotency.js.map +1 -0
  312. package/dist/internal/Log.d.ts +64 -9
  313. package/dist/internal/Log.d.ts.map +1 -1
  314. package/dist/internal/Log.js +29 -7
  315. package/dist/internal/Log.js.map +1 -1
  316. package/dist/internal/MetricSink.d.ts.map +1 -1
  317. package/dist/internal/MetricSink.js +47 -1
  318. package/dist/internal/MetricSink.js.map +1 -1
  319. package/dist/internal/OpenApi.d.ts +1 -1
  320. package/dist/internal/OpenApi.d.ts.map +1 -1
  321. package/dist/internal/OpenApi.js +3 -0
  322. package/dist/internal/OpenApi.js.map +1 -1
  323. package/dist/internal/Provider.d.ts +14 -0
  324. package/dist/internal/Provider.d.ts.map +1 -0
  325. package/dist/internal/Provider.js +5 -0
  326. package/dist/internal/Provider.js.map +1 -0
  327. package/dist/internal/Schema.d.ts +8 -3
  328. package/dist/internal/Schema.d.ts.map +1 -1
  329. package/dist/internal/Schema.js +24 -13
  330. package/dist/internal/Schema.js.map +1 -1
  331. package/dist/internal/Store.d.ts +6 -0
  332. package/dist/internal/Store.d.ts.map +1 -1
  333. package/dist/internal/Store.js +35 -0
  334. package/dist/internal/Store.js.map +1 -1
  335. package/dist/internal/Tidx.d.ts +43 -24
  336. package/dist/internal/Tidx.d.ts.map +1 -1
  337. package/dist/internal/Tidx.js +79 -11
  338. package/dist/internal/Tidx.js.map +1 -1
  339. package/dist/internal/Viem.d.ts +82 -65
  340. package/dist/internal/Viem.d.ts.map +1 -1
  341. package/dist/internal/Viem.js +83 -12
  342. package/dist/internal/Viem.js.map +1 -1
  343. package/dist/internal/WebhookDestination.d.ts.map +1 -1
  344. package/dist/internal/WebhookDestination.js +34 -28
  345. package/dist/internal/WebhookDestination.js.map +1 -1
  346. package/dist/internal/Webhooks.d.ts +9 -0
  347. package/dist/internal/Webhooks.d.ts.map +1 -1
  348. package/dist/internal/Webhooks.js +15 -10
  349. package/dist/internal/Webhooks.js.map +1 -1
  350. package/dist/internal/exchange/Provider.d.ts +219 -0
  351. package/dist/internal/exchange/Provider.d.ts.map +1 -0
  352. package/dist/internal/exchange/Provider.js +117 -0
  353. package/dist/internal/exchange/Provider.js.map +1 -0
  354. package/dist/internal/exchange/index.d.ts +2 -0
  355. package/dist/internal/exchange/index.d.ts.map +1 -0
  356. package/dist/internal/exchange/index.js +2 -0
  357. package/dist/internal/exchange/index.js.map +1 -0
  358. package/dist/internal/exchange/providers/uniswap.d.ts +57 -0
  359. package/dist/internal/exchange/providers/uniswap.d.ts.map +1 -0
  360. package/dist/internal/exchange/providers/uniswap.js +553 -0
  361. package/dist/internal/exchange/providers/uniswap.js.map +1 -0
  362. package/dist/internal/funding/Action.d.ts +55 -0
  363. package/dist/internal/funding/Action.d.ts.map +1 -0
  364. package/dist/internal/funding/Action.js +74 -0
  365. package/dist/internal/funding/Action.js.map +1 -0
  366. package/dist/internal/funding/Catalog.d.ts +107 -0
  367. package/dist/internal/funding/Catalog.d.ts.map +1 -0
  368. package/dist/internal/funding/Catalog.js +270 -0
  369. package/dist/internal/funding/Catalog.js.map +1 -0
  370. package/dist/internal/funding/Chain.d.ts +76 -0
  371. package/dist/internal/funding/Chain.d.ts.map +1 -0
  372. package/dist/internal/funding/Chain.js +38 -0
  373. package/dist/internal/funding/Chain.js.map +1 -0
  374. package/dist/internal/funding/Deposit.d.ts +366 -0
  375. package/dist/internal/funding/Deposit.d.ts.map +1 -0
  376. package/dist/internal/funding/Deposit.js +286 -0
  377. package/dist/internal/funding/Deposit.js.map +1 -0
  378. package/dist/internal/funding/DepositAddress.d.ts +345 -0
  379. package/dist/internal/funding/DepositAddress.d.ts.map +1 -0
  380. package/dist/internal/funding/DepositAddress.js +189 -0
  381. package/dist/internal/funding/DepositAddress.js.map +1 -0
  382. package/dist/internal/funding/Evidence.d.ts +52 -0
  383. package/dist/internal/funding/Evidence.d.ts.map +1 -0
  384. package/dist/internal/funding/Evidence.js +314 -0
  385. package/dist/internal/funding/Evidence.js.map +1 -0
  386. package/dist/internal/funding/Provider.d.ts +1186 -0
  387. package/dist/internal/funding/Provider.d.ts.map +1 -0
  388. package/dist/internal/funding/Provider.js +1081 -0
  389. package/dist/internal/funding/Provider.js.map +1 -0
  390. package/dist/internal/funding/Reconciliation.d.ts +113 -0
  391. package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
  392. package/dist/internal/funding/Reconciliation.js +676 -0
  393. package/dist/internal/funding/Reconciliation.js.map +1 -0
  394. package/dist/internal/funding/Route.d.ts +21 -0
  395. package/dist/internal/funding/Route.d.ts.map +1 -0
  396. package/dist/internal/funding/Route.js +5 -0
  397. package/dist/internal/funding/Route.js.map +1 -0
  398. package/dist/internal/funding/Subsidy.d.ts +113 -0
  399. package/dist/internal/funding/Subsidy.d.ts.map +1 -0
  400. package/dist/internal/funding/Subsidy.js +138 -0
  401. package/dist/internal/funding/Subsidy.js.map +1 -0
  402. package/dist/internal/funding/Token.d.ts +41 -0
  403. package/dist/internal/funding/Token.d.ts.map +1 -0
  404. package/dist/internal/funding/Token.js +22 -0
  405. package/dist/internal/funding/Token.js.map +1 -0
  406. package/dist/internal/funding/Transfer.d.ts +643 -0
  407. package/dist/internal/funding/Transfer.d.ts.map +1 -0
  408. package/dist/internal/funding/Transfer.js +332 -0
  409. package/dist/internal/funding/Transfer.js.map +1 -0
  410. package/dist/internal/funding/index.d.ts +13 -0
  411. package/dist/internal/funding/index.d.ts.map +1 -0
  412. package/dist/internal/funding/index.js +13 -0
  413. package/dist/internal/funding/index.js.map +1 -0
  414. package/dist/internal/funding/providers/across.d.ts +21 -0
  415. package/dist/internal/funding/providers/across.d.ts.map +1 -0
  416. package/dist/internal/funding/providers/across.js +117 -0
  417. package/dist/internal/funding/providers/across.js.map +1 -0
  418. package/dist/internal/funding/providers/relay.d.ts +46 -0
  419. package/dist/internal/funding/providers/relay.d.ts.map +1 -0
  420. package/dist/internal/funding/providers/relay.js +464 -0
  421. package/dist/internal/funding/providers/relay.js.map +1 -0
  422. package/dist/internal/funding/providers/rhino.d.ts +15 -0
  423. package/dist/internal/funding/providers/rhino.d.ts.map +1 -0
  424. package/dist/internal/funding/providers/rhino.js +116 -0
  425. package/dist/internal/funding/providers/rhino.js.map +1 -0
  426. package/dist/internal/funding/providers/squid.d.ts +19 -0
  427. package/dist/internal/funding/providers/squid.d.ts.map +1 -0
  428. package/dist/internal/funding/providers/squid.js +120 -0
  429. package/dist/internal/funding/providers/squid.js.map +1 -0
  430. package/dist/internal/funding/providers/symbiosis.d.ts +20 -0
  431. package/dist/internal/funding/providers/symbiosis.d.ts.map +1 -0
  432. package/dist/internal/funding/providers/symbiosis.js +176 -0
  433. package/dist/internal/funding/providers/symbiosis.js.map +1 -0
  434. package/dist/internal/index.d.ts +5 -1
  435. package/dist/internal/index.d.ts.map +1 -1
  436. package/dist/internal/index.js +5 -1
  437. package/dist/internal/index.js.map +1 -1
  438. package/dist/internal/webhookDestinations/url.js +61 -57
  439. package/dist/internal/webhookDestinations/url.js.map +1 -1
  440. package/dist/providers/index.d.ts +43 -0
  441. package/dist/providers/index.d.ts.map +1 -0
  442. package/dist/providers/index.js +19 -0
  443. package/dist/providers/index.js.map +1 -0
  444. package/package.json +9 -4
  445. package/src/ApiKeys.test.ts +11 -7
  446. package/src/ApiKeys.ts +37 -9
  447. package/src/App.test.ts +85 -10
  448. package/src/App.ts +224 -137
  449. package/src/Assets.ts +29 -4
  450. package/src/Client.test-d.ts +650 -30
  451. package/src/Scope.test.ts +19 -0
  452. package/src/Scope.ts +28 -11
  453. package/src/Webhooks.test.ts +25 -0
  454. package/src/Webhooks.ts +1 -1
  455. package/src/admin/App.test.ts +9 -2
  456. package/src/admin/App.ts +32 -9
  457. package/src/admin/apps/api-keys.test.ts +167 -23
  458. package/src/admin/apps/api-keys.ts +166 -28
  459. package/src/admin/apps/earn-vaults.test.ts +338 -0
  460. package/src/admin/apps/earn-vaults.ts +572 -0
  461. package/src/admin/apps/scopes.test.ts +16 -1
  462. package/src/admin/ui/plugin.ts +2 -2
  463. package/src/admin/ui/src/components/EarnVaultForm.tsx +137 -0
  464. package/src/admin/ui/src/components/MobileProfile.tsx +2 -2
  465. package/src/admin/ui/src/components/Page.tsx +1 -1
  466. package/src/admin/ui/src/components/ThemeToggle.tsx +1 -1
  467. package/src/admin/ui/src/lib/api-keys.ts +37 -7
  468. package/src/admin/ui/src/lib/client.ts +1 -1
  469. package/src/admin/ui/src/lib/config.ts +1 -1
  470. package/src/admin/ui/src/lib/early-access.ts +8 -9
  471. package/src/admin/ui/src/lib/earn-vaults.ts +207 -0
  472. package/src/admin/ui/src/lib/format.ts +13 -0
  473. package/src/admin/ui/src/lib/organizations.test.ts +14 -4
  474. package/src/admin/ui/src/lib/organizations.ts +7 -1
  475. package/src/admin/ui/src/lib/response.ts +22 -0
  476. package/src/admin/ui/src/lib/scopes.test.ts +19 -11
  477. package/src/admin/ui/src/lib/scopes.ts +28 -7
  478. package/src/admin/ui/src/lib/verified-tokens.ts +10 -9
  479. package/src/admin/ui/src/routeTree.gen.ts +70 -7
  480. package/src/admin/ui/src/router.tsx +2 -2
  481. package/src/admin/ui/src/routes/__root.tsx +9 -8
  482. package/src/admin/ui/src/routes/api-keys.tsx +475 -64
  483. package/src/admin/ui/src/routes/early-access.tsx +5 -12
  484. package/src/admin/ui/src/routes/earn.vaults.tsx +348 -0
  485. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +154 -0
  486. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +190 -0
  487. package/src/admin/ui/src/routes/organizations.tsx +4 -7
  488. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +56 -54
  489. package/src/admin/ui/src/routes/verified-tokens.tsx +4 -4
  490. package/src/admin/ui/vite.config.ts +4 -1
  491. package/src/admin/ui.generated.ts +189 -95
  492. package/src/analytics/Analytics.test.ts +69 -10
  493. package/src/analytics/Analytics.ts +20 -1
  494. package/src/analytics/tables/requestEvents.ts +79 -37
  495. package/src/apps/Zones.test.ts +33 -0
  496. package/src/apps/Zones.ts +40 -0
  497. package/src/apps/composition.test.ts +84 -1
  498. package/src/apps/data/App.test.ts +38 -9
  499. package/src/apps/data/App.ts +96 -33
  500. package/src/apps/data/FxOracle.ts +1 -1
  501. package/src/apps/data/index.ts +0 -1
  502. package/src/apps/data/routes/activities.test.ts +82 -6
  503. package/src/apps/data/routes/activities.ts +131 -71
  504. package/src/apps/data/routes/balances.test.ts +50 -37
  505. package/src/apps/data/routes/balances.ts +5 -5
  506. package/src/apps/data/routes/blocks.test.ts +2 -0
  507. package/src/apps/data/routes/coingecko.test.ts +22 -0
  508. package/src/apps/data/routes/coingecko.ts +84 -48
  509. package/src/apps/data/routes/earn.test.ts +1108 -0
  510. package/src/apps/data/routes/earn.ts +1391 -0
  511. package/src/apps/data/routes/exchanges.test.ts +82 -33
  512. package/src/apps/data/routes/exchanges.ts +842 -227
  513. package/src/apps/data/routes/fee-amm.test.ts +4 -6
  514. package/src/apps/data/routes/fee-amm.ts +69 -12
  515. package/src/apps/data/routes/funding.test.ts +2712 -221
  516. package/src/apps/data/routes/funding.ts +1604 -387
  517. package/src/apps/data/routes/indexer.test.ts +43 -34
  518. package/src/apps/data/routes/indexer.ts +19 -2
  519. package/src/apps/data/routes/receipts.test.ts +5 -3
  520. package/src/apps/data/routes/receipts.ts +13 -11
  521. package/src/apps/data/routes/rpc.test.ts +446 -28
  522. package/src/apps/data/routes/rpc.ts +243 -25
  523. package/src/apps/data/routes/tokenlist.test.ts +15 -0
  524. package/src/apps/data/routes/tokenlist.ts +88 -22
  525. package/src/apps/data/routes/tokens.ts +262 -86
  526. package/src/apps/data/routes/transactions.test.ts +2 -0
  527. package/src/apps/data/routes/transactions.ts +77 -42
  528. package/src/apps/data/routes/transfers.test.ts +166 -4
  529. package/src/apps/data/routes/transfers.ts +216 -78
  530. package/src/apps/data/routes/valuation.test.ts +62 -9
  531. package/src/apps/data/routes/valuation.ts +2 -2
  532. package/src/apps/data/routes/verified-tokens.test.ts +51 -0
  533. package/src/apps/data/routes/verified-tokens.ts +52 -15
  534. package/src/apps/data/routes/webhooks.test.ts +432 -33
  535. package/src/apps/data/routes/webhooks.ts +189 -79
  536. package/src/apps/data/routes/zones.test.ts +473 -0
  537. package/src/apps/data/routes/zones.ts +338 -0
  538. package/src/apps/docs/reference.ts +8 -6
  539. package/src/apps/index.ts +2 -1
  540. package/src/apps/management/Billing.test.ts +29 -0
  541. package/src/apps/management/Billing.ts +23 -0
  542. package/src/apps/management/Error.ts +12 -0
  543. package/src/apps/management/routes/api-keys.test.ts +5 -3
  544. package/src/apps/management/routes/api-keys.ts +2 -9
  545. package/src/apps/management/routes/invitations.ts +4 -11
  546. package/src/apps/management/routes/orgs.ts +2 -9
  547. package/src/apps/management/routes/scopes.test.ts +7 -2
  548. package/src/apps/management/routes/scopes.ts +2 -2
  549. package/src/apps/management/routes/webhooks.test.ts +6 -1
  550. package/src/apps/management/routes/webhooks.ts +15 -3
  551. package/src/apps/mpp/App.ts +276 -29
  552. package/src/apps/mpp/Mpp.test.ts +631 -26
  553. package/src/apps/mpp/Mpp.ts +0 -42
  554. package/src/apps/mpp/internal/Adapter.ts +108 -3
  555. package/src/apps/mpp/internal/Error.test.ts +33 -0
  556. package/src/apps/mpp/internal/Error.ts +44 -6
  557. package/src/apps/mpp/internal/Idempotency.test.ts +213 -0
  558. package/src/apps/mpp/internal/Idempotency.ts +59 -5
  559. package/src/apps/mpp/internal/Policy.test.ts +122 -0
  560. package/src/apps/mpp/internal/Policy.ts +98 -0
  561. package/src/apps/mpp/internal/ScreenManager.test.ts +68 -0
  562. package/src/apps/mpp/internal/ScreenManager.ts +41 -0
  563. package/src/apps/mpp/internal/Screening.ts +40 -3
  564. package/src/apps/mpp/internal/Sponsorship.ts +144 -0
  565. package/src/apps/mpp/internal/Utils.ts +30 -0
  566. package/src/apps/relay/App.test.ts +495 -64
  567. package/src/apps/relay/App.ts +234 -24
  568. package/src/apps/relay/Sponsorships.test.ts +51 -0
  569. package/src/apps/relay/Sponsorships.ts +19 -7
  570. package/src/db/Db.ts +439 -0
  571. package/src/db/Schema.ts +325 -2
  572. package/src/db/tables/earnVaults.test.ts +185 -0
  573. package/src/db/tables/earnVaults.ts +151 -0
  574. package/src/db/tables/fundingCatalog.test.ts +108 -0
  575. package/src/db/tables/fundingCatalog.ts +157 -0
  576. package/src/db/tables/fundingDepositAddresses.test.ts +580 -0
  577. package/src/db/tables/fundingDepositAddresses.ts +376 -0
  578. package/src/db/tables/fundingDeposits.test.ts +261 -0
  579. package/src/db/tables/fundingDeposits.ts +229 -0
  580. package/src/db/tables/fundingIdempotency.test.ts +182 -0
  581. package/src/db/tables/fundingIdempotency.ts +180 -0
  582. package/src/db/tables/fundingTransferEvents.ts +28 -0
  583. package/src/db/tables/fundingTransferTransactions.test.ts +69 -0
  584. package/src/db/tables/fundingTransferTransactions.ts +37 -0
  585. package/src/db/tables/fundingTransfers.test.ts +89 -0
  586. package/src/db/tables/fundingTransfers.ts +153 -0
  587. package/src/db/tables/organizations.test.ts +88 -0
  588. package/src/db/tables/organizations.ts +42 -1
  589. package/src/db/tables/projects.ts +16 -0
  590. package/src/db/tables/requestUsage.ts +23 -0
  591. package/src/db/tables/sponsoredTransactions.test.ts +52 -2
  592. package/src/db/tables/sponsoredTransactions.ts +18 -6
  593. package/src/db/tables/users.ts +16 -0
  594. package/src/db/tables/verifiedTokens.ts +19 -14
  595. package/src/db/tables/webhookSubscriptions.ts +58 -3
  596. package/src/handlers/relay.test.ts +2 -0
  597. package/src/handlers/relay.ts +95 -99
  598. package/src/internal/Auth.test.ts +48 -0
  599. package/src/internal/Auth.ts +61 -2
  600. package/src/internal/Cache.ts +13 -9
  601. package/src/internal/Cursor.test.ts +2 -2
  602. package/src/internal/Cursor.ts +1 -1
  603. package/src/internal/EarnRates.test.ts +125 -0
  604. package/src/internal/EarnRates.ts +409 -0
  605. package/src/internal/EarnVaults.test.ts +195 -0
  606. package/src/internal/EarnVaults.ts +876 -0
  607. package/src/internal/EdgeCache.test.ts +37 -5
  608. package/src/internal/EdgeCache.ts +39 -7
  609. package/src/internal/Id.ts +14 -0
  610. package/src/internal/Idempotency.test.ts +109 -0
  611. package/src/internal/Idempotency.ts +237 -0
  612. package/src/internal/Log.test-d.ts +41 -8
  613. package/src/internal/Log.test.ts +189 -8
  614. package/src/internal/Log.ts +124 -17
  615. package/src/internal/MetricSink.test.ts +244 -4
  616. package/src/internal/MetricSink.ts +51 -1
  617. package/src/internal/OpenApi.ts +3 -0
  618. package/src/internal/Provider.test.ts +17 -0
  619. package/src/internal/Provider.ts +17 -0
  620. package/src/internal/Schema.test.ts +13 -0
  621. package/src/internal/Schema.ts +41 -24
  622. package/src/internal/Store.test.ts +25 -0
  623. package/src/internal/Store.ts +46 -0
  624. package/src/internal/Tidx.local.test.ts +78 -3
  625. package/src/internal/Tidx.test.ts +212 -18
  626. package/src/internal/Tidx.ts +112 -32
  627. package/src/internal/VerifiedTokens.test.ts +15 -0
  628. package/src/internal/Viem.test.ts +170 -17
  629. package/src/internal/Viem.ts +111 -28
  630. package/src/internal/WebhookDestination.ts +25 -23
  631. package/src/internal/Webhooks.test.ts +59 -0
  632. package/src/internal/Webhooks.ts +34 -10
  633. package/src/internal/exchange/Provider.test.ts +216 -0
  634. package/src/internal/exchange/Provider.ts +326 -0
  635. package/src/internal/exchange/index.test.ts +6 -0
  636. package/src/internal/exchange/index.ts +1 -0
  637. package/src/internal/exchange/providers/uniswap.test.ts +122 -0
  638. package/src/internal/exchange/providers/uniswap.ts +682 -0
  639. package/src/internal/funding/Action.test.ts +138 -0
  640. package/src/internal/funding/Action.ts +117 -0
  641. package/src/internal/funding/Catalog.test.ts +311 -0
  642. package/src/internal/funding/Catalog.ts +347 -0
  643. package/src/internal/funding/Chain.test.ts +79 -0
  644. package/src/internal/funding/Chain.ts +120 -0
  645. package/src/internal/funding/Deposit.test.ts +26 -0
  646. package/src/internal/funding/Deposit.ts +453 -0
  647. package/src/internal/funding/DepositAddress.test.ts +18 -0
  648. package/src/internal/funding/DepositAddress.ts +312 -0
  649. package/src/internal/funding/Evidence.test.ts +297 -0
  650. package/src/internal/funding/Evidence.ts +430 -0
  651. package/src/internal/funding/Provider.test.ts +1328 -0
  652. package/src/internal/funding/Provider.ts +1796 -0
  653. package/src/internal/funding/Reconciliation.local.test.ts +504 -0
  654. package/src/internal/funding/Reconciliation.test.ts +2020 -0
  655. package/src/internal/funding/Reconciliation.ts +930 -0
  656. package/src/internal/funding/Route.test.ts +66 -0
  657. package/src/internal/funding/Route.ts +29 -0
  658. package/src/internal/funding/Subsidy.local.test.ts +152 -0
  659. package/src/internal/funding/Subsidy.test.ts +75 -0
  660. package/src/internal/funding/Subsidy.ts +260 -0
  661. package/src/internal/funding/Token.test.ts +47 -0
  662. package/src/internal/funding/Token.ts +59 -0
  663. package/src/internal/funding/Transfer.test.ts +369 -0
  664. package/src/internal/funding/Transfer.ts +522 -0
  665. package/src/internal/funding/index.test.ts +20 -0
  666. package/src/internal/funding/index.ts +12 -0
  667. package/src/internal/funding/providers/across.ts +149 -0
  668. package/src/{apps/data/FundingQuoteProviders.test.ts → internal/funding/providers/index.test.ts} +178 -157
  669. package/src/internal/funding/providers/relay.test.ts +474 -0
  670. package/src/internal/funding/providers/relay.ts +559 -0
  671. package/src/internal/funding/providers/rhino.ts +139 -0
  672. package/src/internal/funding/providers/squid.ts +151 -0
  673. package/src/internal/funding/providers/symbiosis.ts +221 -0
  674. package/src/internal/index.test.ts +5 -1
  675. package/src/internal/index.ts +5 -1
  676. package/src/internal/webhookDestinations/url.ts +49 -45
  677. package/src/providers/index.test.ts +14 -0
  678. package/src/providers/index.ts +54 -0
  679. package/dist/apps/data/FundingQuoteProviders.d.ts +0 -174
  680. package/dist/apps/data/FundingQuoteProviders.d.ts.map +0 -1
  681. package/dist/apps/data/FundingQuoteProviders.js +0 -775
  682. package/dist/apps/data/FundingQuoteProviders.js.map +0 -1
  683. package/dist/internal/FundingQuotes.d.ts +0 -864
  684. package/dist/internal/FundingQuotes.d.ts.map +0 -1
  685. package/dist/internal/FundingQuotes.js +0 -672
  686. package/dist/internal/FundingQuotes.js.map +0 -1
  687. package/src/apps/data/FundingQuoteProviders.ts +0 -1043
  688. package/src/internal/FundingQuotes.test.ts +0 -456
  689. package/src/internal/FundingQuotes.ts +0 -944
@@ -1,3 +1,5 @@
1
+ // TODO(tidx-v1): Restore `queryOutbound` from commit `de87725` after TIDX v1 ships. Remove the receipt-side merge and bounded follow-up lookup.
2
+
1
3
  import { Hono, type Context } from 'hono'
2
4
  import { Address, Hex } from 'ox'
3
5
  import { type Log, parseEventLogs, zeroAddress } from 'viem'
@@ -14,7 +16,7 @@ import * as OpenApi from '../../../internal/OpenApi.js'
14
16
  import * as Response from '../../../internal/Response.js'
15
17
  import * as Schema from '../../../internal/Schema.js'
16
18
  import * as Store from '../../../internal/Store.js'
17
- import type * as Tidx from '../../../internal/Tidx.js'
19
+ import * as Tidx from '../../../internal/Tidx.js'
18
20
  import * as Timing from '../../../internal/Timing.js'
19
21
  import * as Ttl from '../../../internal/Ttl.js'
20
22
  import * as Value from '../../../internal/Value.js'
@@ -54,7 +56,7 @@ export namespace schema {
54
56
  .optional(z.nullable(Valuation.schema.Value))
55
57
  .check(
56
58
  z.describe(
57
- 'The amount’s nominal value in the requested `denomination`. `null` when the token is ' +
59
+ 'The amount’s nominal value in the requested `valuation.currency`. `null` when the token is ' +
58
60
  'unverified, its display currency has no rate, or rates were unavailable.',
59
61
  ),
60
62
  ),
@@ -74,7 +76,7 @@ export namespace schema {
74
76
  /** Page-level resources: valuation rate provenance. */
75
77
  export const Meta = z
76
78
  .object({
77
- pricing: z
79
+ valuation: z
78
80
  .optional(Valuation.schema.Pricing)
79
81
  .check(
80
82
  z.describe(
@@ -1408,7 +1410,6 @@ export namespace schema {
1408
1410
  .strictObject({
1409
1411
  chainId: Schema.ChainIdQuery,
1410
1412
  cursor: Schema.Cursor,
1411
- denomination: Schema.Denomination,
1412
1413
  // Folding is opt-in: by default every item is returned at the root.
1413
1414
  group: z
1414
1415
  ._default(Schema.booleanQuery(), false)
@@ -1430,6 +1431,7 @@ export namespace schema {
1430
1431
  ),
1431
1432
  z.meta({ examples: [true] }),
1432
1433
  ),
1434
+ 'valuation.currency': Schema.Denomination,
1433
1435
  })
1434
1436
  .check(
1435
1437
  z.describe(
@@ -1471,7 +1473,6 @@ export namespace schema {
1471
1473
  export const Query = z
1472
1474
  .strictObject({
1473
1475
  chainId: Schema.ChainIdQuery,
1474
- denomination: Schema.Denomination,
1475
1476
  include: includeQuery,
1476
1477
  // Raw-log capture is opt-in: it can add a large `events` array to every
1477
1478
  // item, so the default response stays lean.
@@ -1483,6 +1484,7 @@ export namespace schema {
1483
1484
  ),
1484
1485
  z.meta({ examples: [true] }),
1485
1486
  ),
1487
+ 'valuation.currency': Schema.Denomination,
1486
1488
  })
1487
1489
  .check(z.describe('Query parameters for the transaction activity request.'))
1488
1490
 
@@ -1736,7 +1738,7 @@ function baseFor(options: {
1736
1738
  }
1737
1739
 
1738
1740
  /**
1739
- * A normalized provider row. Mirrors the TIDX `receipts ⋈ logs` join
1741
+ * A normalized provider row. Mirrors the bounded receipt/log lookups
1740
1742
  * (`source: 'q1'`, full log columns) and the decoded `Transfer` projection
1741
1743
  * (`source: 'q2'`, transfer columns), so the classification pipeline does not
1742
1744
  * care which query produced the row.
@@ -1789,8 +1791,8 @@ type TxGroup = {
1789
1791
  * Creates address-scoped activity handlers, mounted under the `/addresses`
1790
1792
  * composer. Exposes `GET /:address/activities`.
1791
1793
  *
1792
- * Runs the full activity classification pipeline: three TIDX sub-queries
1793
- * (outbound `receipts ⋈ logs`, inbound transfers, outbound transfers) merged
1794
+ * Runs the full activity classification pipeline: outbound receipt/log
1795
+ * lookups plus inbound and outbound transfer queries, merged
1794
1796
  * and decoded into typed items (`transfer`/`mint`/`burn`/`swap`/
1795
1797
  * `approval`/`session-closed`/`access-key-created`/`access-key-revoked`/
1796
1798
  * `token-created`/`burn-blocked`/`channel-opened`/`channel-funded`/
@@ -1882,7 +1884,7 @@ export function addresses(options: addresses.Options = {}) {
1882
1884
  // Build immutable token and structured amount copies from RPC metadata.
1883
1885
  const { items, rates } = await enrichTokens(c, {
1884
1886
  chainId,
1885
- denomination: query.denomination ?? 'USD',
1887
+ denomination: query['valuation.currency'] ?? 'USD',
1886
1888
  include: query.include,
1887
1889
  items: unenrichedItems,
1888
1890
  oracle,
@@ -1895,7 +1897,7 @@ export function addresses(options: addresses.Options = {}) {
1895
1897
  return c.json(
1896
1898
  Response.validated(schema.getAddressActivities.Response, {
1897
1899
  data,
1898
- ...(rates ? { meta: { pricing: Valuation.pricing(rates, oracle) } } : {}),
1900
+ ...(rates ? { meta: { valuation: Valuation.pricing(rates, oracle) } } : {}),
1899
1901
  nextCursor,
1900
1902
  }),
1901
1903
  200,
@@ -2016,7 +2018,7 @@ export function transactions(options: transactions.Options = {}) {
2016
2018
  // Build immutable token and structured amount copies from RPC metadata.
2017
2019
  const { items, rates } = await enrichTokens(c, {
2018
2020
  chainId,
2019
- denomination: query.denomination ?? 'USD',
2021
+ denomination: query['valuation.currency'] ?? 'USD',
2020
2022
  include: query.include,
2021
2023
  items: unenrichedItems,
2022
2024
  oracle,
@@ -2025,7 +2027,7 @@ export function transactions(options: transactions.Options = {}) {
2025
2027
  return c.json(
2026
2028
  Response.validated(schema.getTransactionActivities.Response, {
2027
2029
  data: items,
2028
- ...(rates ? { meta: { pricing: Valuation.pricing(rates, oracle) } } : {}),
2030
+ ...(rates ? { meta: { valuation: Valuation.pricing(rates, oracle) } } : {}),
2029
2031
  }),
2030
2032
  200,
2031
2033
  )
@@ -2217,8 +2219,8 @@ export declare namespace list {
2217
2219
  /**
2218
2220
  * Creates a TIDX-backed {@link Provider} that runs three sub-queries in
2219
2221
  * parallel and merges them:
2220
- * - Q1 (outbound): `receipts ⋈ logs` for txs where the address is `from` or
2221
- * `fee_payer`, yielding full log rows.
2222
+ * - Q1 (outbound): page receipts where the address is `from` or `fee_payer`,
2223
+ * then fetch the selected transactions' logs with a bounded lookup.
2222
2224
  * - Q2 (inbound): decoded `Transfer` events to the address.
2223
2225
  * - Q3 (outbound transfers): decoded `Transfer` events from the address
2224
2226
  * (catches access-key-signed sends where `tx.from` differs from the address).
@@ -2236,16 +2238,8 @@ export function tidx(deps: tidx.Deps): Provider {
2236
2238
  }
2237
2239
 
2238
2240
  /**
2239
- * Q1: every log of each transaction the address sent or paid the fee for,
2240
- * via a single `receipts logs` join filtered on `from OR fee_payer`.
2241
- *
2242
- * The cursor uses a two-predicate keyset (`block_num <= N` AND `(block_num <
2243
- * N OR tx_idx < M)`) rather than a plain `block_num < N`: the `<= N` upper
2244
- * bound lets the ClickHouse planner seek to the cursor block on the
2245
- * `(block_num, tx_idx)` primary key instead of scanning from the tip, which
2246
- * is what avoids planner 422s on busy addresses. Over-fetch `limit * 4`
2247
- * (never `OFFSET`) because one tx fans out into many log rows that
2248
- * `groupByTx` collapses back into a single group.
2241
+ * Q1 pages outbound receipts, then fetches their logs by bounded block range
2242
+ * and transaction hash. The cursor preserves block and transaction index order.
2249
2243
  */
2250
2244
  async function queryOutbound(options: {
2251
2245
  address: Address.Address
@@ -2254,50 +2248,90 @@ export function tidx(deps: tidx.Deps): Provider {
2254
2248
  }): Promise<Row[]> {
2255
2249
  const { address, cursor, limit } = options
2256
2250
  const keyset = cursor
2257
- ? `AND receipts.block_num <= ${cursor.blockNum} AND (receipts.block_num < ${cursor.blockNum} OR receipts.tx_idx < ${cursor.txIdx})`
2251
+ ? `AND block_num <= ${cursor.blockNum} AND (block_num < ${cursor.blockNum} OR tx_idx < ${cursor.txIdx})`
2258
2252
  : ''
2259
- // Raw-table join (no signature-decoded CTE), so inline SQL is cast to `string`.
2260
- const result = await tidxClient.fetch({
2253
+ const queryLimit = limit + 1
2254
+ const fetchReceipts = (side: 'fee_payer' | 'from') =>
2255
+ tidxClient.fetch({
2256
+ chainId,
2257
+ // Raw-table query (no signature-decoded CTE), so the inline SQL is cast
2258
+ // to `string`.
2259
+ query: `
2260
+ SELECT tx_hash, block_num, block_timestamp, tx_idx, "from", fee_payer
2261
+ FROM receipts
2262
+ WHERE "${side}" = '${address}' ${keyset}
2263
+ ORDER BY block_num DESC, tx_idx DESC
2264
+ LIMIT ${queryLimit}
2265
+ ` as string,
2266
+ })
2267
+
2268
+ // Fetching `limit + 1` from each side is sufficient to form the newest
2269
+ // `limit + 1` transactions after the two ordered sets are merged.
2270
+ const [paid, sent] = await Promise.all([fetchReceipts('fee_payer'), fetchReceipts('from')])
2271
+ const seen = new Set<string>()
2272
+ const receipts = [...paid.rows, ...sent.rows]
2273
+ .map((r) => ({
2274
+ blockNum: Number(Value.toNumber(r['block_num'])),
2275
+ blockTimestamp: Number(Value.toNumber(r['block_timestamp'])),
2276
+ feePayer: lowerOrNull(r['fee_payer']),
2277
+ txHash: lowerHash(r['tx_hash']),
2278
+ txIdx: Number(Value.toNumber(r['tx_idx'])),
2279
+ txSender: lowerOrNull(r['from']),
2280
+ }))
2281
+ .filter((receipt) => {
2282
+ if (seen.has(receipt.txHash)) return false
2283
+ seen.add(receipt.txHash)
2284
+ return true
2285
+ })
2286
+ .sort((a, b) => {
2287
+ if (a.blockNum !== b.blockNum) return b.blockNum - a.blockNum
2288
+ return b.txIdx - a.txIdx
2289
+ })
2290
+ .slice(0, queryLimit)
2291
+ if (receipts.length === 0) return []
2292
+
2293
+ const blocks = receipts.map((receipt) => receipt.blockNum)
2294
+ const receiptByHash = new Map(receipts.map((receipt) => [receipt.txHash, receipt]))
2295
+ const txHashes = receipts.map((receipt) => `'${receipt.txHash}'`).join(', ')
2296
+
2297
+ // `logs` is not keyed by transaction hash, so pair the bounded hash list
2298
+ // with the selected receipts' block range to avoid a full archive scan.
2299
+ const logs = await tidxClient.fetch({
2261
2300
  chainId,
2301
+ // Raw-table query (no signature-decoded CTE), so the inline SQL is cast
2302
+ // to `string`.
2262
2303
  query: `
2263
- SELECT
2264
- receipts.tx_hash AS tx_hash,
2265
- receipts.block_num AS block_num,
2266
- receipts.block_timestamp AS block_timestamp,
2267
- receipts.tx_idx AS tx_idx,
2268
- receipts."from" AS tx_sender,
2269
- receipts.fee_payer AS fee_payer,
2270
- logs.address AS log_address,
2271
- logs.selector AS selector,
2272
- logs.topic1 AS topic1,
2273
- logs.topic2 AS topic2,
2274
- logs.topic3 AS topic3,
2275
- logs.data AS data,
2276
- logs.log_idx AS log_idx
2277
- FROM receipts
2278
- INNER JOIN logs ON logs.tx_hash = receipts.tx_hash
2279
- WHERE (receipts."from" = '${address}' OR receipts.fee_payer = '${address}') ${keyset}
2280
- ORDER BY receipts.block_num DESC, receipts.tx_idx DESC
2281
- LIMIT ${limit * 4}
2304
+ SELECT tx_hash, block_num, tx_idx, log_idx, address, selector, topic1, topic2, topic3, data
2305
+ FROM logs
2306
+ WHERE block_num BETWEEN ${Math.min(...blocks)} AND ${Math.max(...blocks)}
2307
+ AND tx_hash IN (${txHashes})
2308
+ ORDER BY block_num DESC, tx_idx DESC, log_idx ASC
2282
2309
  ` as string,
2283
2310
  })
2284
2311
 
2285
- return result.rows.map((r) => ({
2286
- blockNum: Number(Value.toNumber(r['block_num'])),
2287
- blockTimestamp: Number(Value.toNumber(r['block_timestamp'])),
2288
- data: Value.toText(r['data']) ?? null,
2289
- feePayer: lowerOrNull(r['fee_payer']),
2290
- logAddress: lower(r['log_address']),
2291
- logIdx: Number(Value.toNumber(r['log_idx'])),
2292
- selector: Value.toText(r['selector']) ?? null,
2293
- source: 'q1' as const,
2294
- topic1: Value.toText(r['topic1']) ?? null,
2295
- topic2: Value.toText(r['topic2']) ?? null,
2296
- topic3: Value.toText(r['topic3']) ?? null,
2297
- txHash: lowerHash(r['tx_hash']),
2298
- txIdx: Number(Value.toNumber(r['tx_idx'])),
2299
- txSender: lowerOrNull(r['tx_sender']),
2300
- }))
2312
+ const rows = logs.rows.flatMap((r) => {
2313
+ const receipt = receiptByHash.get(lowerHash(r['tx_hash']))
2314
+ if (!receipt) return []
2315
+ return [
2316
+ {
2317
+ blockNum: receipt.blockNum,
2318
+ blockTimestamp: receipt.blockTimestamp,
2319
+ data: Value.toText(r['data']) ?? null,
2320
+ feePayer: receipt.feePayer,
2321
+ logAddress: lower(r['address']),
2322
+ logIdx: Number(Value.toNumber(r['log_idx'])),
2323
+ selector: Value.toText(r['selector']) ?? null,
2324
+ source: 'q1' as const,
2325
+ topic1: Value.toText(r['topic1']) ?? null,
2326
+ topic2: Value.toText(r['topic2']) ?? null,
2327
+ topic3: Value.toText(r['topic3']) ?? null,
2328
+ txHash: receipt.txHash,
2329
+ txIdx: receipt.txIdx,
2330
+ txSender: receipt.txSender,
2331
+ },
2332
+ ]
2333
+ })
2334
+ return mergeAndSort(rows, [], [])
2301
2335
  }
2302
2336
 
2303
2337
  /** Q2/Q3: decoded `Transfer` events on one side of the address. */
@@ -2313,18 +2347,43 @@ export function tidx(deps: tidx.Deps): Provider {
2313
2347
  ? `"to" = '${address}' AND "from" != '${address}'`
2314
2348
  : `"from" = '${address}' AND "to" != '${address}'`
2315
2349
  const keyset = cursor ? `AND block_num < ${cursor.blockNum}` : ''
2316
- const result = await tidxClient.fetch({
2317
- chainId,
2318
- query: `
2350
+ const query = (blockKey?: string) => `
2319
2351
  SELECT "from", "to", address, value, tx_hash, block_num, block_timestamp, log_idx, tx_idx
2320
2352
  FROM Transfer
2321
2353
  WHERE ${where} ${keyset}
2322
- ORDER BY block_num DESC, tx_idx DESC
2323
- LIMIT ${limit * 4}
2324
- `,
2325
- signatures: [transferSignature],
2326
- })
2327
- return result.rows.map((r) => ({
2354
+ ${blockKey ? `ORDER BY ${blockKey} DESC, tx_idx DESC` : ''}
2355
+ LIMIT ${blockKey ? limit * 4 : Schema.countCap}
2356
+ `
2357
+ const result = await (async () => {
2358
+ try {
2359
+ return await tidxClient.fetch({
2360
+ chainId,
2361
+ query: query('block_num'),
2362
+ signatures: [transferSignature],
2363
+ })
2364
+ } catch (error) {
2365
+ if (!Tidx.isDeterministicError(error)) throw error
2366
+ try {
2367
+ // The expression blocks a mis-selected block-ordered top-N walk.
2368
+ return await tidxClient.fetch({
2369
+ chainId,
2370
+ query: query('block_num + 0'),
2371
+ signatures: [transferSignature],
2372
+ })
2373
+ } catch (fallbackError) {
2374
+ if (!Tidx.isDeterministicError(fallbackError)) throw fallbackError
2375
+ const result = await tidxClient.fetch({
2376
+ chainId,
2377
+ query: query(),
2378
+ signatures: [transferSignature],
2379
+ })
2380
+ // An unordered sample cannot safely produce an activity cursor.
2381
+ if (result.rows.length >= Schema.countCap) throw fallbackError
2382
+ return result
2383
+ }
2384
+ }
2385
+ })()
2386
+ const rows = result.rows.map((r) => ({
2328
2387
  blockNum: Number(Value.toNumber(r['block_num'])),
2329
2388
  blockTimestamp: Number(Value.toNumber(r['block_timestamp'])),
2330
2389
  data: null,
@@ -2344,6 +2403,7 @@ export function tidx(deps: tidx.Deps): Provider {
2344
2403
  txIdx: Number(Value.toNumber(r['tx_idx'])),
2345
2404
  txSender: null,
2346
2405
  }))
2406
+ return mergeAndSort([], rows, []).slice(0, limit * 4)
2347
2407
  }
2348
2408
 
2349
2409
  return {
@@ -1,3 +1,5 @@
1
+ /** @module-tag localnet */
2
+
1
3
  import { Schema } from 'tapimo'
2
4
  import { FxOracle } from 'tapimo/apps'
3
5
  import { Value as core_Value } from 'ox'
@@ -5,9 +7,10 @@ import { Actions } from 'viem/tempo'
5
7
 
6
8
  import * as TestApp from '../../../../test/App.js'
7
9
  import * as Runtime from '../../../../test/runtime.js'
10
+ import * as Tempo from '../../../../test/Tempo.js'
8
11
  import * as TestViem from '../../../../test/Viem.js'
12
+ import * as Tidx from '../../../internal/Tidx.js'
9
13
  import * as Balances from './balances.js'
10
- import * as Tokens from './tokens.js'
11
14
 
12
15
  // Deterministic EUR-based rate set so conversion math is exact in assertions.
13
16
  const fixed = FxOracle.from({
@@ -31,19 +34,37 @@ function app(options: TestApp.create.Options = {}) {
31
34
  return TestApp.client({ db, ...options })
32
35
  }
33
36
 
34
- async function holderWithBalance(client: ReturnType<typeof app>) {
37
+ const holderWithBalance = (async () => {
35
38
  if (runtime.mode === 'localnet')
36
39
  return runtime.fixtures!.fundedAccounts[0]!.toLowerCase() as `0x${string}`
37
- const holdersResponse = await client.v1.tokens[':token'].holders.$get(
38
- { param: { token: TestApp.tokenWithHolders }, query: { limit: '5' } },
39
- TestApp.auth,
40
- )
41
- const holders = await TestApp.json(holdersResponse, Tokens.schema.getTokenHolders.Response)
42
- expect(holdersResponse.status).toBe(200)
43
- const holder = holders.data[0]?.address
44
- if (!holder) throw new Error('expected at least one holder')
45
- return holder
46
- }
40
+ const address = Tempo.accounts[1]!.address.toLowerCase() as `0x${string}`
41
+ const tidx = Tidx.getClient({
42
+ chainId: runtime.chainId,
43
+ tidx: { auth: process.env.TIDX_AUTH, baseUrl: runtime.tidxUrl },
44
+ })
45
+ const rpc = TestViem.getClient()
46
+ // Global setup funds this ephemeral account once. Wait for TIDX to index its
47
+ // faucet delta so discovery exercises a stable, low-activity holder.
48
+ for (let attempt = 0; attempt < 30; attempt++) {
49
+ const [balance, indexed] = await Promise.all([
50
+ Actions.token.getBalance(rpc, { account: address, token: TestApp.tokenWithHolders }),
51
+ tidx.fetch({
52
+ chainId: runtime.chainId,
53
+ engine: 'clickhouse',
54
+ // Raw-table query, so the inline SQL is cast to `string`.
55
+ query: `
56
+ SELECT token
57
+ FROM address_holder_deltas
58
+ WHERE holder = '${address}' AND token = '${TestApp.tokenWithHolders}'
59
+ LIMIT 1
60
+ ` as string,
61
+ }),
62
+ ])
63
+ if (balance.amount > 0n && indexed.rows.length > 0) return address
64
+ if (attempt < 29) await new Promise((resolve) => setTimeout(resolve, 500))
65
+ }
66
+ throw new Error('expected funded test account to reach TIDX')
67
+ })()
47
68
 
48
69
  describe('GET /addresses/:address/balances', () => {
49
70
  test('parses the total count include', () => {
@@ -63,7 +84,7 @@ describe('GET /addresses/:address/balances', () => {
63
84
 
64
85
  test('returns an amount-ranked balance page with per-row token references', async () => {
65
86
  const client = app()
66
- const holder = await holderWithBalance(client)
87
+ const holder = await holderWithBalance
67
88
  expect(holder).toMatch(/^0x[0-9a-f]{40}$/)
68
89
 
69
90
  const response = await client.v1.addresses[':address'].balances.$get(
@@ -147,7 +168,7 @@ describe('GET /addresses/:address/balances', () => {
147
168
 
148
169
  test('embeds an exact balance total on demand via include=totalCount', async () => {
149
170
  const client = app()
150
- const holder = await holderWithBalance(client)
171
+ const holder = await holderWithBalance
151
172
 
152
173
  const response = await client.v1.addresses[':address'].balances.$get(
153
174
  { param: { address: holder }, query: { include: 'totalCount', limit: '5' } },
@@ -204,7 +225,7 @@ describe('GET /addresses/:address/balances', () => {
204
225
 
205
226
  test('surfaces a 502 when RPC correction is unavailable', async () => {
206
227
  const client = app({ rpc: { url: () => 'http://127.0.0.1:1' } })
207
- const holder = await holderWithBalance(client)
228
+ const holder = await holderWithBalance
208
229
  const response = await client.v1.addresses[':address'].balances.$get(
209
230
  { param: { address: holder }, query: {} },
210
231
  TestApp.auth,
@@ -281,7 +302,7 @@ describe('GET /addresses/:address/balances', () => {
281
302
  ],
282
303
  })
283
304
  const client = app({ db: logoDb })
284
- const holder = await holderWithBalance(client)
305
+ const holder = await holderWithBalance
285
306
  expect(holder).toMatch(/^0x[0-9a-f]{40}$/)
286
307
 
287
308
  // The seeded holder is a holder of a verified token, so the verified
@@ -306,7 +327,7 @@ describe('GET /addresses/:address/balances', () => {
306
327
 
307
328
  test('narrows balances by currency and retains verification', async () => {
308
329
  const client = app()
309
- const holder = await holderWithBalance(client)
330
+ const holder = await holderWithBalance
310
331
  expect(holder).toMatch(/^0x[0-9a-f]{40}$/)
311
332
 
312
333
  const response = await client.v1.addresses[':address'].balances.$get(
@@ -322,11 +343,9 @@ describe('GET /addresses/:address/balances', () => {
322
343
  }
323
344
  })
324
345
 
325
- test('flags fee-usable holdings with feeEligible', async () => {
346
+ test('includes feeEligible on balance rows', async () => {
326
347
  const client = app()
327
- // `tokenWithHolders` is pathUSD, the protocol's default fee token, so its
328
- // holders hold a token that is always fee-usable.
329
- const holder = await holderWithBalance(client)
348
+ const holder = await holderWithBalance
330
349
 
331
350
  const response = await client.v1.addresses[':address'].balances.$get(
332
351
  { param: { address: holder }, query: { limit: '20' } },
@@ -336,20 +355,14 @@ describe('GET /addresses/:address/balances', () => {
336
355
  expect(response.status).toBe(200)
337
356
  expect(response.headers.get('server-timing')?.includes('fee_token_set;dur=')).toBe(true)
338
357
 
339
- // Every row carries the best-effort flag; the set resolves here, so it is a
340
- // boolean on each row (rather than omitted).
358
+ expect(body.data.length).toBeGreaterThan(0)
341
359
  for (const balance of body.data) expect(typeof balance.feeEligible).toBe('boolean')
342
-
343
- // The pathUSD holding (which the holder is guaranteed to hold) is flagged
344
- // fee-usable: pathUSD is the default fee token and has fee-AMM pools.
345
- const pathUsd = body.data.find((balance) => balance.token.address === TestApp.tokenWithHolders)
346
- expect(pathUsd?.feeEligible).toBe(true)
347
360
  })
348
361
 
349
362
  test('values each verified holding in the default denomination', async () => {
350
363
  await TestApp.verifiedSeed(db, runtime.chainId)
351
364
  const client = app()
352
- const holder = await holderWithBalance(client)
365
+ const holder = await holderWithBalance
353
366
 
354
367
  const response = await client.v1.addresses[':address'].balances.$get(
355
368
  { param: { address: holder }, query: { limit: '50' } },
@@ -368,11 +381,11 @@ describe('GET /addresses/:address/balances', () => {
368
381
  test('values holdings in a requested denomination', async () => {
369
382
  await TestApp.verifiedSeed(db, runtime.chainId)
370
383
  const client = app({ fx: { oracle: fixed } })
371
- const holder = await holderWithBalance(client)
384
+ const holder = await holderWithBalance
372
385
 
373
386
  // Denominations are case-insensitive.
374
387
  const response = await client.v1.addresses[':address'].balances.$get(
375
- { param: { address: holder }, query: { denomination: 'aud', limit: '50' } },
388
+ { param: { address: holder }, query: { limit: '50', 'valuation.currency': 'aud' } },
376
389
  TestApp.auth,
377
390
  )
378
391
  const body = await TestApp.json(response, Balances.schema.getAddressBalances.Response)
@@ -383,7 +396,7 @@ describe('GET /addresses/:address/balances', () => {
383
396
  const expected = core_Value.format((core_Value.from(pathUsd!.formatted, 6) * 16n) / 10n, 6)
384
397
  expect(pathUsd?.valuation).toEqual({ amount: expected, currency: 'AUD' })
385
398
  // Consulted rates surface their provenance response-wide.
386
- expect(body.meta?.pricing).toMatchInlineSnapshot(`
399
+ expect(body.meta?.valuation).toMatchInlineSnapshot(`
387
400
  {
388
401
  "asOf": "2026-01-01T00:00:00.000Z",
389
402
  "basis": "nominal",
@@ -395,10 +408,10 @@ describe('GET /addresses/:address/balances', () => {
395
408
  test('nulls valuations when rates are unavailable', async () => {
396
409
  await TestApp.verifiedSeed(db, runtime.chainId)
397
410
  const client = app({ fx: { oracle: FxOracle.ecb({ url: 'http://127.0.0.1:1' }) } })
398
- const holder = await holderWithBalance(client)
411
+ const holder = await holderWithBalance
399
412
 
400
413
  const response = await client.v1.addresses[':address'].balances.$get(
401
- { param: { address: holder }, query: { denomination: 'AUD', limit: '50' } },
414
+ { param: { address: holder }, query: { limit: '50', 'valuation.currency': 'AUD' } },
402
415
  TestApp.auth,
403
416
  )
404
417
  const body = await TestApp.json(response, Balances.schema.getAddressBalances.Response)
@@ -408,7 +421,7 @@ describe('GET /addresses/:address/balances', () => {
408
421
  expect(response.status).toBe(200)
409
422
  expect(body.data.length).toBeGreaterThan(0)
410
423
  for (const entry of body.data) expect(entry.valuation).toBeNull()
411
- expect(body.meta?.pricing).toBeUndefined()
424
+ expect(body.meta?.valuation).toBeUndefined()
412
425
  })
413
426
 
414
427
  test('rejects denominations the oracle does not price', async () => {
@@ -418,7 +431,7 @@ describe('GET /addresses/:address/balances', () => {
418
431
  const response = await client.v1.addresses[':address'].balances.$get(
419
432
  {
420
433
  param: { address: `0x${'11'.repeat(20)}` },
421
- query: { currency: 'JPY', denomination: 'JPY' },
434
+ query: { currency: 'JPY', 'valuation.currency': 'JPY' },
422
435
  },
423
436
  TestApp.auth,
424
437
  )
@@ -432,7 +445,7 @@ describe('GET /addresses/:address/balances', () => {
432
445
 
433
446
  test('restricts the page to fee tokens when feeEligible=true', async () => {
434
447
  const client = app()
435
- const holder = await holderWithBalance(client)
448
+ const holder = await holderWithBalance
436
449
 
437
450
  const response = await client.v1.addresses[':address'].balances.$get(
438
451
  {
@@ -52,7 +52,6 @@ export namespace schema {
52
52
  ),
53
53
  ),
54
54
  cursor: Schema.Cursor,
55
- denomination: Schema.Denomination,
56
55
  feeEligible: z
57
56
  .optional(Schema.booleanQuery())
58
57
  .check(
@@ -67,6 +66,7 @@ export namespace schema {
67
66
  include: Schema.totalCountInclude,
68
67
  limit: Schema.Limit,
69
68
  page: Schema.Page,
69
+ 'valuation.currency': Schema.Denomination,
70
70
  verified: z
71
71
  .optional(Schema.booleanQuery())
72
72
  .check(
@@ -144,7 +144,7 @@ export namespace schema {
144
144
  .nullable(Valuation.schema.Value)
145
145
  .check(
146
146
  z.describe(
147
- 'The holding’s nominal value in the requested `denomination`, or `null` when the ' +
147
+ 'The holding’s nominal value in the requested `valuation.currency`, or `null` when the ' +
148
148
  'token is unverified, its display currency has no rate, or rates were unavailable.',
149
149
  ),
150
150
  ),
@@ -155,7 +155,7 @@ export namespace schema {
155
155
  /** Page-level resources: opt-in counts plus valuation rate provenance. */
156
156
  export const Meta = z
157
157
  .object({
158
- pricing: z
158
+ valuation: z
159
159
  .optional(Valuation.schema.Pricing)
160
160
  .check(
161
161
  z.describe(
@@ -259,7 +259,7 @@ export function addresses(options: addresses.Options = {}) {
259
259
  chainId,
260
260
  currency: query.currency,
261
261
  cursor: query.cursor,
262
- denomination: query.denomination ?? 'USD',
262
+ denomination: query['valuation.currency'] ?? 'USD',
263
263
  feeEligible,
264
264
  feeTokens,
265
265
  includeTotalCount: query.include.includes('totalCount'),
@@ -468,7 +468,7 @@ async function getAddressBalances(
468
468
  }
469
469
 
470
470
  const meta = {
471
- ...(rates ? { pricing: Valuation.pricing(rates, oracle) } : {}),
471
+ ...(rates ? { valuation: Valuation.pricing(rates, oracle) } : {}),
472
472
  ...(includeTotalCount ? { totalCount: corrected.length, totalCountCapped: false } : {}),
473
473
  }
474
474
  return {
@@ -1,3 +1,5 @@
1
+ /** @module-tag localnet */
2
+
1
3
  import { Schema } from 'tapimo'
2
4
  import { Hex } from 'ox'
3
5
  import { zeroHash } from 'viem'
@@ -1,4 +1,5 @@
1
1
  import { Address, Hash } from 'ox'
2
+ import { Schema } from 'tapimo'
2
3
 
3
4
  import * as TestApp from '../../../../test/App.js'
4
5
  import * as Runtime from '../../../../test/runtime.js'
@@ -59,6 +60,20 @@ describe('GET /gecko/:chainId/assets/:address', () => {
59
60
  )
60
61
  expect(response.status).toBe(400)
61
62
  })
63
+
64
+ test('returns 404 for an address that is not a TIP-20 token', async () => {
65
+ const client = TestApp.client()
66
+ const response = await client.gecko[':chainId'].assets[':address'].$get(
67
+ // A syntactically valid address that is not a registered TIP-20: the
68
+ // metadata read reverts, which must surface as a `404`, not a `502`.
69
+ { param: { chainId, address: '0xc97613eb1c39b0b57267739b5400ab08f8c4c285' } },
70
+ TestApp.auth,
71
+ )
72
+ const body = await TestApp.json(response, Schema.ErrorResponse)
73
+
74
+ expect(response.status).toBe(404)
75
+ expect(body.error.code).toBe('not_found')
76
+ })
62
77
  })
63
78
 
64
79
  describe('GET /gecko/:chainId/pairs', () => {
@@ -66,6 +81,7 @@ describe('GET /gecko/:chainId/pairs', () => {
66
81
  const client = TestApp.client()
67
82
  const response = await client.gecko[':chainId'].pairs.$get({ param: { chainId } }, TestApp.auth)
68
83
  expect(response.status).toBe(200)
84
+ expect(response.headers.get('server-timing')?.includes('coingecko_metadata;dur=')).toBe(true)
69
85
  const body = await TestApp.json(response, Coingecko.schema.PairsResponse)
70
86
  expect(body.pairs.length).toBeGreaterThan(0)
71
87
  const pair = body.pairs[0]!
@@ -169,6 +185,12 @@ describe('GET /gecko/:chainId/events', () => {
169
185
  )
170
186
  expect(response.status).toBe(200)
171
187
  const body = await TestApp.json(response, Coingecko.schema.EventsResponse)
188
+ // The fan-out segments only emit once the window contains fills.
189
+ if (body.events.length > 0) {
190
+ const timing = response.headers.get('server-timing')
191
+ expect(timing?.includes('coingecko_pair_index;dur=')).toBe(true)
192
+ expect(timing?.includes('coingecko_metadata;dur=')).toBe(true)
193
+ }
172
194
  for (const event of body.events) {
173
195
  expect(event.eventType).toBe('swap')
174
196
  expect(Hash.validate(event.pairId)).toBe(true)