tapimo 0.5.3 → 0.7.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 (376) hide show
  1. package/dist/App.d.ts +15830 -7220
  2. package/dist/App.d.ts.map +1 -1
  3. package/dist/App.js +9 -1
  4. package/dist/App.js.map +1 -1
  5. package/dist/Scope.d.ts +4 -0
  6. package/dist/Scope.d.ts.map +1 -1
  7. package/dist/Scope.js +5 -0
  8. package/dist/Scope.js.map +1 -1
  9. package/dist/admin/App.d.ts +1011 -412
  10. package/dist/admin/App.d.ts.map +1 -1
  11. package/dist/admin/App.js +4 -0
  12. package/dist/admin/App.js.map +1 -1
  13. package/dist/admin/apps/api-keys.d.ts +2 -1
  14. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  15. package/dist/admin/apps/early-access.d.ts +148 -0
  16. package/dist/admin/apps/early-access.d.ts.map +1 -0
  17. package/dist/admin/apps/early-access.js +133 -0
  18. package/dist/admin/apps/early-access.js.map +1 -0
  19. package/dist/admin/apps/organizations.d.ts +124 -1
  20. package/dist/admin/apps/organizations.d.ts.map +1 -1
  21. package/dist/admin/apps/organizations.js +97 -6
  22. package/dist/admin/apps/organizations.js.map +1 -1
  23. package/dist/admin/apps/verified-tokens.d.ts +526 -1
  24. package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
  25. package/dist/admin/apps/verified-tokens.js +214 -1
  26. package/dist/admin/apps/verified-tokens.js.map +1 -1
  27. package/dist/admin/ui.generated.d.ts +1 -1
  28. package/dist/admin/ui.generated.d.ts.map +1 -1
  29. package/dist/admin/ui.generated.js +95 -75
  30. package/dist/admin/ui.generated.js.map +1 -1
  31. package/dist/analytics/Analytics.d.ts.map +1 -1
  32. package/dist/analytics/Analytics.js +20 -0
  33. package/dist/analytics/Analytics.js.map +1 -1
  34. package/dist/analytics/tables/requestEvents.d.ts +18 -0
  35. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  36. package/dist/analytics/tables/requestEvents.js +36 -7
  37. package/dist/analytics/tables/requestEvents.js.map +1 -1
  38. package/dist/apps/data/App.d.ts +6260 -4924
  39. package/dist/apps/data/App.d.ts.map +1 -1
  40. package/dist/apps/data/App.js +11 -6
  41. package/dist/apps/data/App.js.map +1 -1
  42. package/dist/apps/data/FundingQuoteProviders.d.ts +34 -1
  43. package/dist/apps/data/FundingQuoteProviders.d.ts.map +1 -1
  44. package/dist/apps/data/FundingQuoteProviders.js +194 -16
  45. package/dist/apps/data/FundingQuoteProviders.js.map +1 -1
  46. package/dist/apps/data/FxOracle.d.ts +71 -0
  47. package/dist/apps/data/FxOracle.d.ts.map +1 -0
  48. package/dist/apps/data/FxOracle.js +97 -0
  49. package/dist/apps/data/FxOracle.js.map +1 -0
  50. package/dist/apps/data/index.d.ts +1 -0
  51. package/dist/apps/data/index.d.ts.map +1 -1
  52. package/dist/apps/data/index.js +1 -0
  53. package/dist/apps/data/index.js.map +1 -1
  54. package/dist/apps/data/routes/activities.d.ts +3599 -1382
  55. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  56. package/dist/apps/data/routes/activities.js +250 -88
  57. package/dist/apps/data/routes/activities.js.map +1 -1
  58. package/dist/apps/data/routes/addresses.d.ts +872 -251
  59. package/dist/apps/data/routes/addresses.d.ts.map +1 -1
  60. package/dist/apps/data/routes/addresses.js +11 -9
  61. package/dist/apps/data/routes/addresses.js.map +1 -1
  62. package/dist/apps/data/routes/balances.d.ts +77 -26
  63. package/dist/apps/data/routes/balances.d.ts.map +1 -1
  64. package/dist/apps/data/routes/balances.js +88 -45
  65. package/dist/apps/data/routes/balances.js.map +1 -1
  66. package/dist/apps/data/routes/blocks.d.ts +39 -39
  67. package/dist/apps/data/routes/coingecko.d.ts +54 -54
  68. package/dist/apps/data/routes/exchanges.d.ts +856 -105
  69. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  70. package/dist/apps/data/routes/exchanges.js +518 -76
  71. package/dist/apps/data/routes/exchanges.js.map +1 -1
  72. package/dist/apps/data/routes/fee-amm.d.ts +81 -67
  73. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  74. package/dist/apps/data/routes/fee-amm.js +76 -91
  75. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  76. package/dist/apps/data/routes/funding.d.ts +80 -36
  77. package/dist/apps/data/routes/funding.d.ts.map +1 -1
  78. package/dist/apps/data/routes/funding.js +65 -31
  79. package/dist/apps/data/routes/funding.js.map +1 -1
  80. package/dist/apps/data/routes/receipts.d.ts +392 -315
  81. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  82. package/dist/apps/data/routes/receipts.js +152 -77
  83. package/dist/apps/data/routes/receipts.js.map +1 -1
  84. package/dist/apps/data/routes/tokens.d.ts +167 -174
  85. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  86. package/dist/apps/data/routes/tokens.js +15 -13
  87. package/dist/apps/data/routes/tokens.js.map +1 -1
  88. package/dist/apps/data/routes/transactions.d.ts +277 -536
  89. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  90. package/dist/apps/data/routes/transactions.js +96 -77
  91. package/dist/apps/data/routes/transactions.js.map +1 -1
  92. package/dist/apps/data/routes/transfers.d.ts +157 -81
  93. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  94. package/dist/apps/data/routes/transfers.js +272 -130
  95. package/dist/apps/data/routes/transfers.js.map +1 -1
  96. package/dist/apps/data/routes/valuation.d.ts +307 -0
  97. package/dist/apps/data/routes/valuation.d.ts.map +1 -0
  98. package/dist/apps/data/routes/valuation.js +292 -0
  99. package/dist/apps/data/routes/valuation.js.map +1 -0
  100. package/dist/apps/data/routes/verified-tokens.d.ts +36 -36
  101. package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -1
  102. package/dist/apps/data/routes/verified-tokens.js +7 -5
  103. package/dist/apps/data/routes/verified-tokens.js.map +1 -1
  104. package/dist/apps/data/routes/webhooks.d.ts +103 -123
  105. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  106. package/dist/apps/data/routes/webhooks.js +124 -25
  107. package/dist/apps/data/routes/webhooks.js.map +1 -1
  108. package/dist/apps/index.d.ts +2 -1
  109. package/dist/apps/index.d.ts.map +1 -1
  110. package/dist/apps/index.js +2 -1
  111. package/dist/apps/index.js.map +1 -1
  112. package/dist/apps/management/App.d.ts +8554 -1692
  113. package/dist/apps/management/App.d.ts.map +1 -1
  114. package/dist/apps/management/App.js +12 -1
  115. package/dist/apps/management/App.js.map +1 -1
  116. package/dist/apps/management/routes/api-keys.d.ts +7 -0
  117. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  118. package/dist/apps/management/routes/api-keys.js +17 -3
  119. package/dist/apps/management/routes/api-keys.js.map +1 -1
  120. package/dist/apps/management/routes/billing.d.ts +157 -162
  121. package/dist/apps/management/routes/billing.d.ts.map +1 -1
  122. package/dist/apps/management/routes/billing.js +31 -23
  123. package/dist/apps/management/routes/billing.js.map +1 -1
  124. package/dist/apps/management/routes/faucet.d.ts +232 -0
  125. package/dist/apps/management/routes/faucet.d.ts.map +1 -0
  126. package/dist/apps/management/routes/faucet.js +154 -0
  127. package/dist/apps/management/routes/faucet.js.map +1 -0
  128. package/dist/apps/management/routes/invitations.d.ts +60 -60
  129. package/dist/apps/management/routes/invite-links.d.ts +49 -20
  130. package/dist/apps/management/routes/invite-links.d.ts.map +1 -1
  131. package/dist/apps/management/routes/invite-links.js +26 -1
  132. package/dist/apps/management/routes/invite-links.js.map +1 -1
  133. package/dist/apps/management/routes/me.d.ts +6 -6
  134. package/dist/apps/management/routes/members.d.ts +6 -6
  135. package/dist/apps/management/routes/orgs.d.ts +42 -42
  136. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  137. package/dist/apps/management/routes/orgs.js +5 -0
  138. package/dist/apps/management/routes/orgs.js.map +1 -1
  139. package/dist/apps/management/routes/projects.d.ts +44 -44
  140. package/dist/apps/management/routes/usage.d.ts +3 -0
  141. package/dist/apps/management/routes/usage.d.ts.map +1 -1
  142. package/dist/apps/management/routes/usage.js +4 -0
  143. package/dist/apps/management/routes/usage.js.map +1 -1
  144. package/dist/apps/management/routes/verified-token-requests.d.ts +697 -0
  145. package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -0
  146. package/dist/apps/management/routes/verified-token-requests.js +271 -0
  147. package/dist/apps/management/routes/verified-token-requests.js.map +1 -0
  148. package/dist/apps/management/routes/webhooks.d.ts +6977 -0
  149. package/dist/apps/management/routes/webhooks.d.ts.map +1 -0
  150. package/dist/apps/management/routes/webhooks.js +573 -0
  151. package/dist/apps/management/routes/webhooks.js.map +1 -0
  152. package/dist/apps/mpp/App.d.ts +363 -0
  153. package/dist/apps/mpp/App.d.ts.map +1 -0
  154. package/dist/apps/mpp/App.js +72 -0
  155. package/dist/apps/mpp/App.js.map +1 -0
  156. package/dist/apps/mpp/Mpp.d.ts +178 -0
  157. package/dist/apps/mpp/Mpp.d.ts.map +1 -0
  158. package/dist/apps/mpp/Mpp.js +183 -0
  159. package/dist/apps/mpp/Mpp.js.map +1 -0
  160. package/dist/apps/mpp/index.d.ts +3 -0
  161. package/dist/apps/mpp/index.d.ts.map +1 -0
  162. package/dist/apps/mpp/index.js +3 -0
  163. package/dist/apps/mpp/index.js.map +1 -0
  164. package/dist/apps/relay/App.d.ts.map +1 -1
  165. package/dist/apps/relay/App.js +56 -9
  166. package/dist/apps/relay/App.js.map +1 -1
  167. package/dist/db/Db.d.ts +6 -0
  168. package/dist/db/Db.d.ts.map +1 -1
  169. package/dist/db/Db.js +110 -0
  170. package/dist/db/Db.js.map +1 -1
  171. package/dist/db/Schema.d.ts +53 -0
  172. package/dist/db/Schema.d.ts.map +1 -1
  173. package/dist/db/Schema.js +56 -0
  174. package/dist/db/Schema.js.map +1 -1
  175. package/dist/db/tables/earlyAccess.d.ts +50 -0
  176. package/dist/db/tables/earlyAccess.d.ts.map +1 -0
  177. package/dist/db/tables/earlyAccess.js +63 -0
  178. package/dist/db/tables/earlyAccess.js.map +1 -0
  179. package/dist/db/tables/enabledBillingSources.d.ts +73 -0
  180. package/dist/db/tables/enabledBillingSources.d.ts.map +1 -0
  181. package/dist/db/tables/enabledBillingSources.js +69 -0
  182. package/dist/db/tables/enabledBillingSources.js.map +1 -0
  183. package/dist/db/tables/invitations.d.ts.map +1 -1
  184. package/dist/db/tables/invitations.js +3 -0
  185. package/dist/db/tables/invitations.js.map +1 -1
  186. package/dist/db/tables/inviteLinks.d.ts +10 -2
  187. package/dist/db/tables/inviteLinks.d.ts.map +1 -1
  188. package/dist/db/tables/inviteLinks.js +10 -1
  189. package/dist/db/tables/inviteLinks.js.map +1 -1
  190. package/dist/db/tables/organizations.d.ts +5 -2
  191. package/dist/db/tables/organizations.d.ts.map +1 -1
  192. package/dist/db/tables/organizations.js +13 -2
  193. package/dist/db/tables/organizations.js.map +1 -1
  194. package/dist/db/tables/sponsoredTransactions.d.ts +2 -0
  195. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  196. package/dist/db/tables/sponsoredTransactions.js +2 -0
  197. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  198. package/dist/db/tables/verifiedTokenRequests.d.ts +94 -0
  199. package/dist/db/tables/verifiedTokenRequests.d.ts.map +1 -0
  200. package/dist/db/tables/verifiedTokenRequests.js +120 -0
  201. package/dist/db/tables/verifiedTokenRequests.js.map +1 -0
  202. package/dist/db/tables/webhookSubscriptions.d.ts +14 -0
  203. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  204. package/dist/db/tables/webhookSubscriptions.js +16 -0
  205. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  206. package/dist/handlers/internal/utils.d.ts +1 -16
  207. package/dist/handlers/internal/utils.d.ts.map +1 -1
  208. package/dist/handlers/internal/utils.js +17 -6
  209. package/dist/handlers/internal/utils.js.map +1 -1
  210. package/dist/handlers/relay.d.ts.map +1 -1
  211. package/dist/handlers/relay.js +37 -5
  212. package/dist/handlers/relay.js.map +1 -1
  213. package/dist/internal/Auth.d.ts +11 -2
  214. package/dist/internal/Auth.d.ts.map +1 -1
  215. package/dist/internal/Auth.js +14 -47
  216. package/dist/internal/Auth.js.map +1 -1
  217. package/dist/internal/FundingQuotes.d.ts +147 -47
  218. package/dist/internal/FundingQuotes.d.ts.map +1 -1
  219. package/dist/internal/FundingQuotes.js +119 -33
  220. package/dist/internal/FundingQuotes.js.map +1 -1
  221. package/dist/internal/Log.d.ts +37 -5
  222. package/dist/internal/Log.d.ts.map +1 -1
  223. package/dist/internal/Log.js +52 -3
  224. package/dist/internal/Log.js.map +1 -1
  225. package/dist/internal/MetricSink.d.ts.map +1 -1
  226. package/dist/internal/MetricSink.js +24 -0
  227. package/dist/internal/MetricSink.js.map +1 -1
  228. package/dist/internal/OpenApi.d.ts +2 -2
  229. package/dist/internal/OpenApi.d.ts.map +1 -1
  230. package/dist/internal/OpenApi.js +3 -0
  231. package/dist/internal/OpenApi.js.map +1 -1
  232. package/dist/internal/Response.d.ts +2 -2
  233. package/dist/internal/Response.d.ts.map +1 -1
  234. package/dist/internal/Response.js +12 -4
  235. package/dist/internal/Response.js.map +1 -1
  236. package/dist/internal/Schema.d.ts +14 -5
  237. package/dist/internal/Schema.d.ts.map +1 -1
  238. package/dist/internal/Schema.js +23 -5
  239. package/dist/internal/Schema.js.map +1 -1
  240. package/dist/internal/Value.d.ts +18 -0
  241. package/dist/internal/Value.d.ts.map +1 -1
  242. package/dist/internal/Value.js +11 -1
  243. package/dist/internal/Value.js.map +1 -1
  244. package/dist/internal/VerifiedTokens.d.ts.map +1 -1
  245. package/dist/internal/VerifiedTokens.js +10 -1
  246. package/dist/internal/VerifiedTokens.js.map +1 -1
  247. package/dist/internal/Webhooks.d.ts +24 -3
  248. package/dist/internal/Webhooks.d.ts.map +1 -1
  249. package/dist/internal/Webhooks.js +34 -8
  250. package/dist/internal/Webhooks.js.map +1 -1
  251. package/package.json +7 -2
  252. package/src/App.test.ts +9 -4
  253. package/src/App.ts +23 -3
  254. package/src/Client.test-d.ts +733 -20
  255. package/src/Scope.ts +5 -0
  256. package/src/admin/App.test.ts +4 -0
  257. package/src/admin/App.ts +4 -0
  258. package/src/admin/apps/early-access.test.ts +125 -0
  259. package/src/admin/apps/early-access.ts +176 -0
  260. package/src/admin/apps/organizations.test.ts +86 -2
  261. package/src/admin/apps/organizations.ts +155 -31
  262. package/src/admin/apps/scopes.test.ts +5 -0
  263. package/src/admin/apps/verified-tokens.test.ts +201 -0
  264. package/src/admin/apps/verified-tokens.ts +532 -286
  265. package/src/admin/ui/plugin.ts +2 -1
  266. package/src/admin/ui/src/lib/early-access.ts +63 -0
  267. package/src/admin/ui/src/lib/organizations.test.ts +81 -1
  268. package/src/admin/ui/src/lib/organizations.ts +92 -0
  269. package/src/admin/ui/src/lib/verified-tokens.ts +79 -0
  270. package/src/admin/ui/src/routeTree.gen.ts +33 -2
  271. package/src/admin/ui/src/routes/__root.tsx +2 -1
  272. package/src/admin/ui/src/routes/api-keys.tsx +1 -1
  273. package/src/admin/ui/src/routes/early-access.tsx +162 -0
  274. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +103 -0
  275. package/src/admin/ui/src/routes/verified-tokens.tsx +230 -19
  276. package/src/admin/ui.generated.ts +95 -94
  277. package/src/analytics/Analytics.test.ts +83 -0
  278. package/src/analytics/Analytics.ts +20 -0
  279. package/src/analytics/tables/requestEvents.ts +60 -7
  280. package/src/apps/composition.test.ts +11 -2
  281. package/src/apps/data/App.test.ts +1 -1
  282. package/src/apps/data/App.ts +22 -14
  283. package/src/apps/data/FundingQuoteProviders.test.ts +297 -4
  284. package/src/apps/data/FundingQuoteProviders.ts +255 -29
  285. package/src/apps/data/FxOracle.test.ts +118 -0
  286. package/src/apps/data/FxOracle.ts +153 -0
  287. package/src/apps/data/index.ts +1 -0
  288. package/src/apps/data/routes/activities.test.ts +177 -3
  289. package/src/apps/data/routes/activities.ts +441 -132
  290. package/src/apps/data/routes/addresses.ts +19 -9
  291. package/src/apps/data/routes/balances.test.ts +148 -11
  292. package/src/apps/data/routes/balances.ts +140 -51
  293. package/src/apps/data/routes/exchanges.test.ts +544 -9
  294. package/src/apps/data/routes/exchanges.ts +690 -103
  295. package/src/apps/data/routes/fee-amm.test.ts +47 -23
  296. package/src/apps/data/routes/fee-amm.ts +98 -119
  297. package/src/apps/data/routes/funding.test.ts +113 -8
  298. package/src/apps/data/routes/funding.ts +77 -51
  299. package/src/apps/data/routes/receipts.test.ts +129 -23
  300. package/src/apps/data/routes/receipts.ts +205 -100
  301. package/src/apps/data/routes/tokens.test.ts +43 -0
  302. package/src/apps/data/routes/tokens.ts +28 -13
  303. package/src/apps/data/routes/transactions.test.ts +72 -19
  304. package/src/apps/data/routes/transactions.ts +162 -92
  305. package/src/apps/data/routes/transfers.test.ts +341 -31
  306. package/src/apps/data/routes/transfers.ts +358 -158
  307. package/src/apps/data/routes/valuation.test.ts +437 -0
  308. package/src/apps/data/routes/valuation.ts +423 -0
  309. package/src/apps/data/routes/verified-tokens.ts +14 -2
  310. package/src/apps/data/routes/webhooks.test.ts +56 -8
  311. package/src/apps/data/routes/webhooks.ts +144 -27
  312. package/src/apps/index.ts +2 -1
  313. package/src/apps/management/App.ts +13 -0
  314. package/src/apps/management/routes/api-keys.test.ts +14 -0
  315. package/src/apps/management/routes/api-keys.ts +27 -3
  316. package/src/apps/management/routes/billing.test.ts +152 -20
  317. package/src/apps/management/routes/billing.ts +34 -18
  318. package/src/apps/management/routes/faucet.test.ts +87 -0
  319. package/src/apps/management/routes/faucet.ts +201 -0
  320. package/src/apps/management/routes/invite-links.test.ts +117 -0
  321. package/src/apps/management/routes/invite-links.ts +43 -1
  322. package/src/apps/management/routes/me.test.ts +9 -99
  323. package/src/apps/management/routes/orgs.test.ts +45 -2
  324. package/src/apps/management/routes/orgs.ts +6 -0
  325. package/src/apps/management/routes/scopes.test.ts +1 -0
  326. package/src/apps/management/routes/usage.test.ts +6 -0
  327. package/src/apps/management/routes/usage.ts +7 -0
  328. package/src/apps/management/routes/verified-token-requests.test.ts +377 -0
  329. package/src/apps/management/routes/verified-token-requests.ts +397 -0
  330. package/src/apps/management/routes/webhooks.test.ts +426 -0
  331. package/src/apps/management/routes/webhooks.ts +672 -0
  332. package/src/apps/mpp/App.ts +86 -0
  333. package/src/apps/mpp/Mpp.test.ts +193 -0
  334. package/src/apps/mpp/Mpp.ts +353 -0
  335. package/src/apps/mpp/index.ts +2 -0
  336. package/src/apps/mpp/internal/Adapter.ts +11 -0
  337. package/src/apps/mpp/internal/Error.ts +9 -0
  338. package/src/apps/mpp/internal/Idempotency.ts +7 -0
  339. package/src/apps/mpp/internal/Screening.ts +10 -0
  340. package/src/apps/relay/App.test.ts +88 -6
  341. package/src/apps/relay/App.ts +61 -9
  342. package/src/db/Db.test.ts +19 -0
  343. package/src/db/Db.ts +125 -0
  344. package/src/db/Schema.ts +68 -0
  345. package/src/db/tables/earlyAccess.ts +86 -0
  346. package/src/db/tables/enabledBillingSources.test.ts +303 -0
  347. package/src/db/tables/enabledBillingSources.ts +118 -0
  348. package/src/db/tables/invitations.ts +3 -0
  349. package/src/db/tables/inviteLinks.ts +22 -3
  350. package/src/db/tables/organizations.test.ts +103 -0
  351. package/src/db/tables/organizations.ts +18 -2
  352. package/src/db/tables/sponsoredTransactions.ts +4 -0
  353. package/src/db/tables/verifiedTokenRequests.test.ts +200 -0
  354. package/src/db/tables/verifiedTokenRequests.ts +182 -0
  355. package/src/db/tables/webhookSubscriptions.ts +31 -0
  356. package/src/handlers/internal/utils.ts +22 -6
  357. package/src/handlers/relay.errors.test.ts +153 -0
  358. package/src/handlers/relay.ts +42 -7
  359. package/src/internal/Auth.test.ts +3 -3
  360. package/src/internal/Auth.ts +15 -47
  361. package/src/internal/FundingQuotes.test.ts +161 -6
  362. package/src/internal/FundingQuotes.ts +141 -39
  363. package/src/internal/Log.test-d.ts +21 -0
  364. package/src/internal/Log.test.ts +141 -0
  365. package/src/internal/Log.ts +93 -6
  366. package/src/internal/MetricSink.test.ts +215 -0
  367. package/src/internal/MetricSink.ts +24 -0
  368. package/src/internal/OpenApi.ts +3 -0
  369. package/src/internal/Response.test.ts +28 -0
  370. package/src/internal/Response.ts +12 -4
  371. package/src/internal/Schema.ts +50 -5
  372. package/src/internal/Value.test.ts +20 -0
  373. package/src/internal/Value.ts +24 -1
  374. package/src/internal/VerifiedTokens.ts +9 -1
  375. package/src/internal/Webhooks.test.ts +140 -0
  376. package/src/internal/Webhooks.ts +53 -9
@@ -1 +1 @@
1
- {"version":3,"file":"addresses.d.ts","sourceRoot":"","sources":["../../../../src/apps/data/routes/addresses.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,GAAG,MAAM,iBAAiB,CAAA;AAI3C;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAIxB"}
1
+ {"version":3,"file":"addresses.d.ts","sourceRoot":"","sources":["../../../../src/apps/data/routes/addresses.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,GAAG,MAAM,iBAAiB,CAAA;AAG3C,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,SAAS,CAAC,OAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAKxD;AAED,MAAM,CAAC,OAAO,WAAW,SAAS,CAAC;IACjC,qDAAqD;IACrD,KAAK,OAAO,GAAG;QACb,mDAAmD;QACnD,EAAE,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,EAAE,GAAG,SAAS,CAAA;KACxC,CAAA;CACF"}
@@ -1,22 +1,24 @@
1
1
  import { Hono } from 'hono';
2
2
  import * as Activities from './activities.js';
3
3
  import * as Balances from './balances.js';
4
+ import * as Valuation from './valuation.js';
4
5
  /**
5
6
  * Composes the `/v1/addresses/:address/*` route surface from the
6
7
  * address-scoped sub-routers exported by each resource module. The handlers,
7
8
  * schemas, and paths live with the resource they describe (activities,
8
- * balances); this composer only aggregates them so docs grouping stays by tag
9
- * while URLs stay nested under the parent resource.
9
+ * balances, valuation); this composer only aggregates them so docs grouping
10
+ * stays by tag while URLs stay nested under the parent resource.
10
11
  *
11
12
  * Only subject-relative resources live here — rows that cannot be interpreted
12
- * without the path address (activity classification, held-token balances).
13
- * Plain filtered views of canonical collections are reached via search params
14
- * instead (`GET /transactions?address=…`, `GET /transfers?address=…`,
15
- * `GET /transactions/receipts?address=…`).
13
+ * without the path address (activity classification, held-token balances,
14
+ * holdings valuation). Plain filtered views of canonical collections are
15
+ * reached via search params instead (`GET /transactions?address=…`,
16
+ * `GET /transfers?address=…`, `GET /transactions/receipts?address=…`).
16
17
  */
17
- export function addresses() {
18
+ export function addresses(options = {}) {
18
19
  return new Hono()
19
- .route('/', Activities.addresses())
20
- .route('/', Balances.addresses());
20
+ .route('/', Activities.addresses({ fx: options.fx }))
21
+ .route('/', Balances.addresses({ fx: options.fx }))
22
+ .route('/', Valuation.addresses({ fx: options.fx }));
21
23
  }
22
24
  //# sourceMappingURL=addresses.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"addresses.js","sourceRoot":"","sources":["../../../../src/apps/data/routes/addresses.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AAEzC;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,IAAI,EAAmB;SAC/B,KAAK,CAAC,GAAG,EAAE,UAAU,CAAC,SAAS,EAAE,CAAC;SAClC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAA;AACrC,CAAC"}
1
+ {"version":3,"file":"addresses.js","sourceRoot":"","sources":["../../../../src/apps/data/routes/addresses.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,SAAS,CAAC,OAAO,GAAsB,EAAE;IACvD,OAAO,IAAI,IAAI,EAAmB;SAC/B,KAAK,CAAC,GAAG,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;SACpD,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;SAClD,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;AACxD,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import * as z from 'zod/mini';
2
2
  import type * as App from '../../../App.js';
3
3
  import * as Response from '../../../internal/Response.js';
4
+ import * as Valuation from './valuation.js';
4
5
  /** Zod schemas owned by the balance handlers. */
5
6
  export declare namespace schema {
6
7
  /** Schemas for the getAddressBalances operation. */
@@ -17,6 +18,7 @@ export declare namespace schema {
17
18
  }>, z.ZodMiniTransform<4217 | 42431, "mainnet" | "testnet">>, z.ZodMiniNumber<unknown>]>, z.ZodMiniNumber<number>>>;
18
19
  currency: z.ZodMiniOptional<z.ZodMiniString<string>>;
19
20
  cursor: z.ZodMiniOptional<z.ZodMiniString<string>>;
21
+ denomination: z.ZodMiniOptional<z.ZodMiniPipe<z.ZodMiniString<string>, z.ZodMiniTransform<string, string>>>;
20
22
  feeEligible: z.ZodMiniOptional<z.ZodMiniPipe<z.ZodMiniEnum<{
21
23
  false: "false";
22
24
  true: "true";
@@ -31,17 +33,14 @@ export declare namespace schema {
31
33
  true: "true";
32
34
  }>, z.ZodMiniTransform<boolean, "false" | "true">>>;
33
35
  }, z.core.$strict>;
34
- /**
35
- * A TIP-20 token balance held by an address: the held `amount` in the
36
- * token's base unit, its `formatted` value, and the trimmed `token`
37
- * reference inlined per row. Rows whose token metadata cannot be resolved
38
- * are omitted.
39
- */
36
+ /** A TIP-20 balance with raw and formatted amounts. Unresolvable token metadata omits the row. */
40
37
  const Balance: z.ZodMiniObject<{
41
38
  amount: z.ZodMiniString<string>;
39
+ currency: z.ZodMiniString<string>;
40
+ decimals: z.ZodMiniNumber<number>;
41
+ feeEligible: z.ZodMiniOptional<z.ZodMiniBoolean<boolean>>;
42
42
  formatted: z.ZodMiniString<string>;
43
43
  id: z.ZodMiniString<string>;
44
- feeEligible: z.ZodMiniOptional<z.ZodMiniBoolean<boolean>>;
45
44
  token: z.ZodMiniObject<{
46
45
  address: z.ZodMiniPipe<z.ZodMiniTemplateLiteral<`0x${string}`>, z.ZodMiniTransform<`0x${string}`, `0x${string}`>>;
47
46
  currency: z.ZodMiniString<string>;
@@ -52,14 +51,30 @@ export declare namespace schema {
52
51
  symbol: z.ZodMiniString<string>;
53
52
  verified: z.ZodMiniBoolean<boolean>;
54
53
  }, z.core.$strip>;
54
+ valuation: z.ZodMiniNullable<z.ZodMiniObject<{
55
+ amount: z.ZodMiniString<string>;
56
+ currency: z.ZodMiniString<string>;
57
+ }, z.core.$strip>>;
58
+ }, z.core.$strip>;
59
+ /** Page-level resources: opt-in counts plus valuation rate provenance. */
60
+ const Meta: z.ZodMiniObject<{
61
+ pricing: z.ZodMiniOptional<z.ZodMiniObject<{
62
+ asOf: z.ZodMiniISODateTime;
63
+ basis: z.ZodMiniLiteral<"nominal">;
64
+ source: z.ZodMiniString<string>;
65
+ }, z.core.$strip>>;
66
+ totalCount: z.ZodMiniOptional<z.ZodMiniNumber<number>>;
67
+ totalCountCapped: z.ZodMiniOptional<z.ZodMiniBoolean<boolean>>;
55
68
  }, z.core.$strip>;
56
69
  /** Page of TIP-20 token balances held by an address, ordered by amount descending. */
57
70
  const Response: z.ZodMiniObject<{
58
71
  data: z.ZodMiniArray<z.ZodMiniObject<{
59
72
  amount: z.ZodMiniString<string>;
73
+ currency: z.ZodMiniString<string>;
74
+ decimals: z.ZodMiniNumber<number>;
75
+ feeEligible: z.ZodMiniOptional<z.ZodMiniBoolean<boolean>>;
60
76
  formatted: z.ZodMiniString<string>;
61
77
  id: z.ZodMiniString<string>;
62
- feeEligible: z.ZodMiniOptional<z.ZodMiniBoolean<boolean>>;
63
78
  token: z.ZodMiniObject<{
64
79
  address: z.ZodMiniPipe<z.ZodMiniTemplateLiteral<`0x${string}`>, z.ZodMiniTransform<`0x${string}`, `0x${string}`>>;
65
80
  currency: z.ZodMiniString<string>;
@@ -70,10 +85,19 @@ export declare namespace schema {
70
85
  symbol: z.ZodMiniString<string>;
71
86
  verified: z.ZodMiniBoolean<boolean>;
72
87
  }, z.core.$strip>;
88
+ valuation: z.ZodMiniNullable<z.ZodMiniObject<{
89
+ amount: z.ZodMiniString<string>;
90
+ currency: z.ZodMiniString<string>;
91
+ }, z.core.$strip>>;
73
92
  }, z.core.$strip>>;
74
93
  meta: z.ZodMiniOptional<z.ZodMiniObject<{
75
- totalCountCapped: z.ZodMiniBoolean<boolean>;
76
- totalCount: z.ZodMiniNumber<number>;
94
+ pricing: z.ZodMiniOptional<z.ZodMiniObject<{
95
+ asOf: z.ZodMiniISODateTime;
96
+ basis: z.ZodMiniLiteral<"nominal">;
97
+ source: z.ZodMiniString<string>;
98
+ }, z.core.$strip>>;
99
+ totalCount: z.ZodMiniOptional<z.ZodMiniNumber<number>>;
100
+ totalCountCapped: z.ZodMiniOptional<z.ZodMiniBoolean<boolean>>;
77
101
  }, z.core.$strip>>;
78
102
  nextCursor: z.ZodMiniNullable<z.ZodMiniString<string>>;
79
103
  }, z.core.$strip>;
@@ -83,7 +107,7 @@ export declare namespace schema {
83
107
  * Creates address-scoped balance handlers, mounted under the `/addresses`
84
108
  * composer. Exposes `GET /:address/balances`, the held-balance page.
85
109
  */
86
- export declare function addresses(): import("hono/hono-base").HonoBase<App.Environment, {
110
+ export declare function addresses(options?: addresses.Options): import("hono/hono-base").HonoBase<App.Environment, {
87
111
  "/v1/addresses/:address/balances": {
88
112
  $get: {
89
113
  output: null;
@@ -98,6 +122,7 @@ export declare function addresses(): import("hono/hono-base").HonoBase<App.Envir
98
122
  chainId?: string | string[];
99
123
  currency?: string | string[];
100
124
  cursor?: string | string[];
125
+ denomination?: string | string[];
101
126
  feeEligible?: string | string[];
102
127
  include?: string | string[];
103
128
  limit?: string | string[];
@@ -108,14 +133,14 @@ export declare function addresses(): import("hono/hono-base").HonoBase<App.Envir
108
133
  } | {
109
134
  output: {
110
135
  error: {
111
- code: "upstream_error";
136
+ code: "api_key_malformed";
112
137
  details?: readonly Response.error.Detail[] | undefined;
113
138
  message: string;
114
139
  };
115
140
  requestId: string;
116
141
  };
117
142
  outputFormat: "json";
118
- status: 502;
143
+ status: 400;
119
144
  input: {
120
145
  param: {
121
146
  address: `0x${string}`;
@@ -125,6 +150,7 @@ export declare function addresses(): import("hono/hono-base").HonoBase<App.Envir
125
150
  chainId?: string | string[];
126
151
  currency?: string | string[];
127
152
  cursor?: string | string[];
153
+ denomination?: string | string[];
128
154
  feeEligible?: string | string[];
129
155
  include?: string | string[];
130
156
  limit?: string | string[];
@@ -135,14 +161,14 @@ export declare function addresses(): import("hono/hono-base").HonoBase<App.Envir
135
161
  } | {
136
162
  output: {
137
163
  error: {
138
- code: "api_key_malformed";
164
+ code: "api_key_invalid" | "api_key_missing";
139
165
  details?: readonly Response.error.Detail[] | undefined;
140
166
  message: string;
141
167
  };
142
168
  requestId: string;
143
169
  };
144
170
  outputFormat: "json";
145
- status: 400;
171
+ status: 401;
146
172
  input: {
147
173
  param: {
148
174
  address: `0x${string}`;
@@ -152,6 +178,7 @@ export declare function addresses(): import("hono/hono-base").HonoBase<App.Envir
152
178
  chainId?: string | string[];
153
179
  currency?: string | string[];
154
180
  cursor?: string | string[];
181
+ denomination?: string | string[];
155
182
  feeEligible?: string | string[];
156
183
  include?: string | string[];
157
184
  limit?: string | string[];
@@ -162,14 +189,14 @@ export declare function addresses(): import("hono/hono-base").HonoBase<App.Envir
162
189
  } | {
163
190
  output: {
164
191
  error: {
165
- code: "api_key_invalid" | "api_key_missing";
192
+ code: "api_key_forbidden";
166
193
  details?: readonly Response.error.Detail[] | undefined;
167
194
  message: string;
168
195
  };
169
196
  requestId: string;
170
197
  };
171
198
  outputFormat: "json";
172
- status: 401;
199
+ status: 403;
173
200
  input: {
174
201
  param: {
175
202
  address: `0x${string}`;
@@ -179,6 +206,7 @@ export declare function addresses(): import("hono/hono-base").HonoBase<App.Envir
179
206
  chainId?: string | string[];
180
207
  currency?: string | string[];
181
208
  cursor?: string | string[];
209
+ denomination?: string | string[];
182
210
  feeEligible?: string | string[];
183
211
  include?: string | string[];
184
212
  limit?: string | string[];
@@ -189,14 +217,14 @@ export declare function addresses(): import("hono/hono-base").HonoBase<App.Envir
189
217
  } | {
190
218
  output: {
191
219
  error: {
192
- code: "api_key_forbidden";
220
+ code: "payment_required" | "rate_limit_exceeded";
193
221
  details?: readonly Response.error.Detail[] | undefined;
194
222
  message: string;
195
223
  };
196
224
  requestId: string;
197
225
  };
198
226
  outputFormat: "json";
199
- status: 403;
227
+ status: 429;
200
228
  input: {
201
229
  param: {
202
230
  address: `0x${string}`;
@@ -206,6 +234,7 @@ export declare function addresses(): import("hono/hono-base").HonoBase<App.Envir
206
234
  chainId?: string | string[];
207
235
  currency?: string | string[];
208
236
  cursor?: string | string[];
237
+ denomination?: string | string[];
209
238
  feeEligible?: string | string[];
210
239
  include?: string | string[];
211
240
  limit?: string | string[];
@@ -216,14 +245,14 @@ export declare function addresses(): import("hono/hono-base").HonoBase<App.Envir
216
245
  } | {
217
246
  output: {
218
247
  error: {
219
- code: "payment_required" | "rate_limit_exceeded";
248
+ code: "query_invalid";
220
249
  details?: readonly Response.error.Detail[] | undefined;
221
250
  message: string;
222
251
  };
223
252
  requestId: string;
224
253
  };
225
254
  outputFormat: "json";
226
- status: 429;
255
+ status: 400;
227
256
  input: {
228
257
  param: {
229
258
  address: `0x${string}`;
@@ -233,6 +262,7 @@ export declare function addresses(): import("hono/hono-base").HonoBase<App.Envir
233
262
  chainId?: string | string[];
234
263
  currency?: string | string[];
235
264
  cursor?: string | string[];
265
+ denomination?: string | string[];
236
266
  feeEligible?: string | string[];
237
267
  include?: string | string[];
238
268
  limit?: string | string[];
@@ -243,14 +273,14 @@ export declare function addresses(): import("hono/hono-base").HonoBase<App.Envir
243
273
  } | {
244
274
  output: {
245
275
  error: {
246
- code: "query_invalid";
276
+ code: "upstream_error";
247
277
  details?: readonly Response.error.Detail[] | undefined;
248
278
  message: string;
249
279
  };
250
280
  requestId: string;
251
281
  };
252
282
  outputFormat: "json";
253
- status: 400;
283
+ status: 502;
254
284
  input: {
255
285
  param: {
256
286
  address: `0x${string}`;
@@ -260,6 +290,7 @@ export declare function addresses(): import("hono/hono-base").HonoBase<App.Envir
260
290
  chainId?: string | string[];
261
291
  currency?: string | string[];
262
292
  cursor?: string | string[];
293
+ denomination?: string | string[];
263
294
  feeEligible?: string | string[];
264
295
  include?: string | string[];
265
296
  limit?: string | string[];
@@ -287,6 +318,7 @@ export declare function addresses(): import("hono/hono-base").HonoBase<App.Envir
287
318
  chainId?: string | string[];
288
319
  currency?: string | string[];
289
320
  cursor?: string | string[];
321
+ denomination?: string | string[];
290
322
  feeEligible?: string | string[];
291
323
  include?: string | string[];
292
324
  limit?: string | string[];
@@ -298,9 +330,11 @@ export declare function addresses(): import("hono/hono-base").HonoBase<App.Envir
298
330
  output: {
299
331
  data: {
300
332
  amount: string;
333
+ currency: string;
334
+ decimals: number;
335
+ feeEligible?: boolean | undefined;
301
336
  formatted: string;
302
337
  id: string;
303
- feeEligible?: boolean | undefined;
304
338
  token: {
305
339
  address: `0x${string}`;
306
340
  currency: string;
@@ -311,10 +345,19 @@ export declare function addresses(): import("hono/hono-base").HonoBase<App.Envir
311
345
  symbol: string;
312
346
  verified: boolean;
313
347
  };
348
+ valuation: {
349
+ amount: string;
350
+ currency: string;
351
+ } | null;
314
352
  }[];
315
353
  meta?: {
316
- totalCountCapped: boolean;
317
- totalCount: number;
354
+ pricing?: {
355
+ asOf: string;
356
+ basis: "nominal";
357
+ source: string;
358
+ } | undefined;
359
+ totalCount?: number | undefined;
360
+ totalCountCapped?: boolean | undefined;
318
361
  } | undefined;
319
362
  nextCursor: string | null;
320
363
  };
@@ -329,6 +372,7 @@ export declare function addresses(): import("hono/hono-base").HonoBase<App.Envir
329
372
  chainId?: string | string[];
330
373
  currency?: string | string[];
331
374
  cursor?: string | string[];
375
+ denomination?: string | string[];
332
376
  feeEligible?: string | string[];
333
377
  include?: string | string[];
334
378
  limit?: string | string[];
@@ -339,4 +383,11 @@ export declare function addresses(): import("hono/hono-base").HonoBase<App.Envir
339
383
  };
340
384
  };
341
385
  }, "/", "/v1/addresses/:address/balances">;
386
+ export declare namespace addresses {
387
+ /** Options for the address-scoped balance handlers. */
388
+ type Options = {
389
+ /** FX configuration backing per-row valuation. */
390
+ fx?: Valuation.addresses.Fx | undefined;
391
+ };
392
+ }
342
393
  //# sourceMappingURL=balances.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"balances.d.ts","sourceRoot":"","sources":["../../../../src/apps/data/routes/balances.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAA;AAE7B,OAAO,KAAK,KAAK,GAAG,MAAM,iBAAiB,CAAA;AAK3C,OAAO,KAAK,QAAQ,MAAM,+BAA+B,CAAA;AAazD,iDAAiD;AACjD,yBAAiB,MAAM,CAAC;IACtB,oDAAoD;IACpD,UAAiB,kBAAkB,CAAC;QAClC,oDAAoD;QAC7C,MAAM,MAAM;;yBAM6D,CAAA;QAEhF,qDAAqD;QAC9C,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;0BAyCf,CAAA;QAEH;;;;;WAKG;QACI,MAAM,OAAO;;;;;;;;;;;;;;;yBA0CnB,CAAA;QAED,sFAAsF;QAC/E,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;yBAUwD,CAAA;KAC9E;CACF;AAED;;;GAGG;AACH,wBAAgB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CAqFxB"}
1
+ {"version":3,"file":"balances.d.ts","sourceRoot":"","sources":["../../../../src/apps/data/routes/balances.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAA;AAE7B,OAAO,KAAK,KAAK,GAAG,MAAM,iBAAiB,CAAA;AAK3C,OAAO,KAAK,QAAQ,MAAM,+BAA+B,CAAA;AAOzD,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAQ3C,iDAAiD;AACjD,yBAAiB,MAAM,CAAC;IACtB,oDAAoD;IACpD,UAAiB,kBAAkB,CAAC;QAClC,oDAAoD;QAC7C,MAAM,MAAM;;yBAM6D,CAAA;QAEhF,qDAAqD;QAC9C,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;0BA0Cf,CAAA;QAEH,kGAAkG;QAC3F,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;yBAoEnB,CAAA;QAED,0EAA0E;QACnE,MAAM,IAAI;;;;;;;;yBAasD,CAAA;QAEvE,sFAAsF;QAC/E,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAUwD,CAAA;KAC9E;CACF;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,SAAS,CAAC,OAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CA0FxD;AAED,MAAM,CAAC,OAAO,WAAW,SAAS,CAAC;IACjC,uDAAuD;IACvD,KAAK,OAAO,GAAG;QACb,kDAAkD;QAClD,EAAE,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,EAAE,GAAG,SAAS,CAAA;KACxC,CAAA;CACF"}
@@ -10,8 +10,10 @@ import * as Response from '../../../internal/Response.js';
10
10
  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
+ import * as FxOracle from '../FxOracle.js';
13
14
  import * as FeeAmm from './fee-amm.js';
14
15
  import * as Tokens from './tokens.js';
16
+ import * as Valuation from './valuation.js';
15
17
  // TIP-20 tokens are minted by the TIP-20 factory and live at deterministic
16
18
  // `0x20c0…`-prefixed addresses (e.g. pathUSD `0x20c0…0000`). The indexer's
17
19
  // balance sources include every Transfer-emitting contract, so discovery
@@ -40,6 +42,7 @@ export var schema;
40
42
  'snapshot does not store currency for unverified tokens. ' +
41
43
  'Unknown currency strings are accepted but match no rows.')),
42
44
  cursor: Schema.Cursor,
45
+ denomination: Schema.Denomination,
43
46
  feeEligible: z
44
47
  .optional(Schema.booleanQuery())
45
48
  .check(z.describe('When `true`, include only tokens eligible to pay transaction fees on Tempo: ' +
@@ -54,22 +57,17 @@ export var schema;
54
57
  .check(z.describe('When `true`, include only tokens from Tempo’s curated verified token list.'), z.meta({ examples: [true] })),
55
58
  })
56
59
  .check(...Schema.pageChecks(), z.describe('Query parameters for listing an account’s token balances.'));
57
- /**
58
- * A TIP-20 token balance held by an address: the held `amount` in the
59
- * token's base unit, its `formatted` value, and the trimmed `token`
60
- * reference inlined per row. Rows whose token metadata cannot be resolved
61
- * are omitted.
62
- */
60
+ /** A TIP-20 balance with raw and formatted amounts. Unresolvable token metadata omits the row. */
63
61
  getAddressBalances.Balance = Schema.describe(z.object({
64
62
  amount: z
65
63
  .string()
66
64
  .check(z.regex(/^\d+$/), z.describe('A non-negative whole number, given as a decimal string so very large token amounts keep full precision. Expressed in the smallest unit of the token.'), z.meta({ examples: ['1500000'] })),
67
- formatted: z
68
- .string()
69
- .check(z.describe('The same balance in human-readable decimal form, using the token’s `decimals`.'), z.meta({ examples: ['1.5'] })),
70
- id: z
65
+ currency: z
71
66
  .string()
72
- .check(z.describe('A stable resource ID for this balance, equal to the token contract address.'), z.meta({ examples: ['0x20c0000000000000000000008f5425160ebe5525'] })),
67
+ .check(z.describe('The currency label for this balance, such as `USD` for a USD-denominated token.'), z.meta({ examples: ['USD'] })),
68
+ decimals: z
69
+ .number()
70
+ .check(z.int(), z.nonnegative(), z.describe('The number of decimal places used to convert this balance between base units and human-readable form.'), z.meta({ examples: [6] })),
73
71
  feeEligible: z
74
72
  .optional(z.boolean())
75
73
  .check(z.describe('Whether this token can be used to pay transaction fees on Tempo: `true` when ' +
@@ -77,8 +75,29 @@ export var schema;
77
75
  '(`pathUSD`). Lets you identify fee-payable holdings without a separate ' +
78
76
  '`/fee-amm/pools` query. Omitted (best-effort) when the fee-token lookup ' +
79
77
  'is unavailable.'), z.meta({ examples: [true] })),
78
+ formatted: z
79
+ .string()
80
+ .check(z.describe('The same balance in human-readable decimal form, using this balance’s `decimals`.'), z.meta({ examples: ['1.5'] })),
81
+ id: z
82
+ .string()
83
+ .check(z.describe('A stable resource ID for this balance, equal to the token contract address.'), z.meta({ examples: ['0x20c0000000000000000000008f5425160ebe5525'] })),
80
84
  token: Tokens.schema.Token,
85
+ valuation: z
86
+ .nullable(Valuation.schema.Value)
87
+ .check(z.describe('The holding’s nominal value in the requested `denomination`, or `null` when the ' +
88
+ 'token is unverified, its display currency has no rate, or rates were unavailable.')),
81
89
  }), 'One TIP-20 token balance held by this account, with both raw and human-readable amounts.');
90
+ /** Page-level resources: opt-in counts plus valuation rate provenance. */
91
+ getAddressBalances.Meta = z
92
+ .object({
93
+ pricing: z
94
+ .optional(Valuation.schema.Pricing)
95
+ .check(z.describe('Rate provenance for row valuations. Present when conversion rates were ' +
96
+ 'consulted; absent when every value was identity-valued or rates were unavailable.')),
97
+ totalCount: z.optional(Schema.TotalCount),
98
+ totalCountCapped: z.optional(Schema.TotalCountCapped),
99
+ })
100
+ .check(z.describe('Page-level resources attached to this response.'));
82
101
  /** Page of TIP-20 token balances held by an address, ordered by amount descending. */
83
102
  getAddressBalances.Response = z
84
103
  .object({
@@ -86,8 +105,8 @@ export var schema;
86
105
  .array(getAddressBalances.Balance)
87
106
  .check(z.describe('The balances in this page, ordered from largest to smallest amount.')),
88
107
  meta: z
89
- .optional(Schema.CountMeta)
90
- .check(z.describe('Page-level resources you requested with `include`.')),
108
+ .optional(getAddressBalances.Meta)
109
+ .check(z.describe('Page-level resources: opt-in counts and valuation rate provenance.')),
91
110
  nextCursor: Schema.NextCursor,
92
111
  })
93
112
  .check(z.describe('A page of TIP-20 token balances held by this account.'));
@@ -97,7 +116,8 @@ export var schema;
97
116
  * Creates address-scoped balance handlers, mounted under the `/addresses`
98
117
  * composer. Exposes `GET /:address/balances`, the held-balance page.
99
118
  */
100
- export function addresses() {
119
+ export function addresses(options = {}) {
120
+ const oracle = options.fx?.oracle ?? FxOracle.ecb();
101
121
  return new Hono().get('/v1/addresses/:address/balances', Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }), OpenApi.validate('param', schema.getAddressBalances.Params, {
102
122
  code: 'address_invalid',
103
123
  message: 'Invalid account address',
@@ -105,10 +125,10 @@ export function addresses() {
105
125
  code: 'query_invalid',
106
126
  message: 'Invalid query parameters',
107
127
  }), OpenApi.describeRoute({
108
- description: 'Lists how much of each TIP-20 token an account holds, ordered from largest to smallest balance. Amounts are returned in raw base units and human-readable form.',
128
+ description: 'Lists how much of each TIP-20 token an account holds, ordered from largest to smallest balance. Amounts are returned in raw base units and human-readable form, and each verified holding carries its nominal value in the requested denomination.',
109
129
  operationId: 'getAddressBalances',
110
130
  responses: OpenApi.responses({
111
- errors: { 502: 'The upstream indexer could not serve this request.' },
131
+ errors: { 502: 'Could not read balance or token data from an upstream service.' },
112
132
  success: {
113
133
  description: 'A page of token balances for this account.',
114
134
  schema: schema.getAddressBalances.Response,
@@ -158,25 +178,31 @@ export function addresses() {
158
178
  chainId,
159
179
  currency: query.currency,
160
180
  cursor: query.cursor,
181
+ denomination: query.denomination ?? 'USD',
161
182
  feeEligible,
162
183
  feeTokens,
163
184
  includeTotalCount: query.include.includes('totalCount'),
164
185
  limit: query.limit,
186
+ oracle,
165
187
  page: query.page,
166
188
  verified,
167
189
  });
168
190
  return c.json(Response.validated(schema.getAddressBalances.Response, balances), 200);
169
191
  }
170
192
  catch (cause) {
193
+ if (cause instanceof Valuation.UnsupportedDenominationError)
194
+ return Response.error(c, { code: 'query_invalid', message: cause.message, status: 400 });
171
195
  return Response.upstream(c, cause);
172
196
  }
173
197
  });
174
198
  }
175
199
  async function getAddressBalances(c, options) {
176
- const { address, chainId, currency, feeEligible, feeTokens, includeTotalCount, limit, verified } = options;
200
+ const { address, chainId, currency, denomination, feeEligible, feeTokens, includeTotalCount, limit, oracle, verified, } = options;
177
201
  const tidx = c.get('getTidx')(chainId);
178
202
  const cursor = options.cursor ? Cursor.decode(options.cursor, ['uint', 'address']) : undefined;
179
203
  const offset = options.page !== undefined && options.page > 1 ? (options.page - 1) * limit : 0;
204
+ // Validate the requested denomination independently of the current page.
205
+ await Valuation.ratesFor(c, { currencies: [], denomination, oracle });
180
206
  // Build the optional `token IN (…)` restriction before hitting TIDX. The
181
207
  // verified/`currency` filter and the `feeEligible` filter each contribute a set
182
208
  // of allowed addresses (`currency` matched case-insensitively so callers can
@@ -259,51 +285,66 @@ async function getAddressBalances(c, options) {
259
285
  : {}),
260
286
  nextCursor: page.nextCursor,
261
287
  };
262
- // Resolve token metadata for each balance. The endpoint's contract is a
263
- // balance with its `token` reference inlined per row (and `formatted` needs
264
- // the token `decimals`), so a row whose metadata cannot be resolved is
265
- // dropped rather than returned with placeholders. Because the TIDX filter
266
- // already restricts to TIP-20 (`0x20c0…`) tokens, resolution should succeed
267
- // for nearly every row in practice.
268
- //
269
- // The verified `snapshot` fetched above is reused across the page instead of
270
- // re-resolved per row. `createdAt` is not part of this endpoint's response,
271
- // so it is never fetched here.
272
- const resolved = await Timing.time(c, 'tokens', () => Promise.all(page.rows.map((holding) => Tokens.resolveToken(c, {
273
- address: holding.address,
274
- chainId,
275
- snapshot,
276
- })
277
- .then((metadata) => ({ amount: holding.amount, metadata }))
278
- .catch(() => ({ amount: holding.amount, metadata: undefined })))));
288
+ const rates = await Valuation.ratesFor(c, {
289
+ currencies: page.rows.flatMap((row) => {
290
+ const held = snapshot.byAddress.get(row.address.toLowerCase())?.currency;
291
+ return held === undefined ? [] : [held];
292
+ }),
293
+ denomination,
294
+ oracle,
295
+ });
296
+ // Balance tokens retain their logo and verification metadata by default.
297
+ const resolved = await Timing.time(c, 'tokens', () => Promise.all(page.rows.map(async (holding) => {
298
+ try {
299
+ const token = Schema.Address.parse(holding.address.toLowerCase());
300
+ const [logoUri, metadata] = await Promise.all([
301
+ Timing.time(c, 'token_logo', () => Tokens.getTokenLogo(c, { address: token, chainId })).catch(() => undefined),
302
+ Timing.time(c, 'token_metadata', () => Tokens.getTokenMetadata(c, { address: token, chainId })),
303
+ ]);
304
+ return { amount: holding.amount, logoUri, metadata, token };
305
+ }
306
+ catch {
307
+ return undefined;
308
+ }
309
+ })));
279
310
  const data = [];
280
311
  for (const entry of resolved) {
281
- if (!entry.metadata)
312
+ if (!entry)
282
313
  continue;
283
314
  data.push({
284
315
  amount: entry.amount,
285
- formatted: core_Value.format(BigInt(entry.amount), entry.metadata.decimals),
286
- id: entry.metadata.address,
316
+ currency: entry.metadata.currency,
317
+ decimals: entry.metadata.decimals,
287
318
  // Best-effort: omit `feeEligible` entirely when the fee-token set was
288
319
  // unavailable, rather than reporting a misleading `false`.
289
- ...(feeTokens ? { feeEligible: feeTokens.has(entry.metadata.address.toLowerCase()) } : {}),
320
+ ...(feeTokens ? { feeEligible: feeTokens.has(entry.token.toLowerCase()) } : {}),
321
+ formatted: core_Value.format(BigInt(entry.amount), entry.metadata.decimals),
322
+ id: entry.token,
290
323
  token: {
291
- address: entry.metadata.address,
324
+ address: entry.token,
292
325
  currency: entry.metadata.currency,
293
326
  decimals: entry.metadata.decimals,
294
- id: entry.metadata.id,
295
- logoUri: entry.metadata.logoUri,
327
+ id: entry.token,
328
+ logoUri: entry.logoUri ?? snapshot.byAddress.get(entry.token)?.logoUri ?? entry.metadata.logoUri,
296
329
  name: entry.metadata.name,
297
330
  symbol: entry.metadata.symbol,
298
- verified: entry.metadata.verified,
331
+ verified: snapshot.byAddress.has(entry.token),
299
332
  },
333
+ valuation: Valuation.valuationFor({
334
+ amount: BigInt(entry.amount),
335
+ denomination,
336
+ rates,
337
+ token: snapshot.byAddress.get(entry.token),
338
+ }),
300
339
  });
301
340
  }
341
+ const meta = {
342
+ ...(rates ? { pricing: Valuation.pricing(rates, oracle) } : {}),
343
+ ...(includeTotalCount ? { totalCount: corrected.length, totalCountCapped: false } : {}),
344
+ };
302
345
  return {
303
346
  data,
304
- ...(includeTotalCount
305
- ? { meta: { totalCount: corrected.length, totalCountCapped: false } }
306
- : {}),
347
+ ...(Object.keys(meta).length > 0 ? { meta } : {}),
307
348
  nextCursor: page.nextCursor,
308
349
  };
309
350
  }
@@ -320,6 +361,8 @@ function allowedTokens(options) {
320
361
  const { currency, feeEligible, feeTokens, snapshot, verified } = options;
321
362
  let allowed;
322
363
  if (verified) {
364
+ if (!snapshot)
365
+ throw new Error('Unable to resolve verified token metadata');
323
366
  const matching = currency
324
367
  ? (snapshot.byCurrency.get(currency.toLowerCase()) ?? [])
325
368
  : snapshot.list;