tapimo 0.1.0 → 0.3.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 (520) hide show
  1. package/README.md +57 -16
  2. package/dist/ApiKey.d.ts +4 -1
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +6 -2
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +98 -3
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +150 -1
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +7917 -2315
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +141 -329
  13. package/dist/App.js.map +1 -1
  14. package/dist/Scope.d.ts +20 -4
  15. package/dist/Scope.d.ts.map +1 -1
  16. package/dist/Scope.js +23 -4
  17. package/dist/Scope.js.map +1 -1
  18. package/dist/Webhooks.d.ts +2 -2
  19. package/dist/Webhooks.d.ts.map +1 -1
  20. package/dist/Webhooks.js +2 -2
  21. package/dist/Webhooks.js.map +1 -1
  22. package/dist/admin/App.d.ts +203 -120
  23. package/dist/admin/App.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.d.ts +111 -6
  25. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  26. package/dist/admin/apps/api-keys.js +67 -0
  27. package/dist/admin/apps/api-keys.js.map +1 -1
  28. package/dist/admin/apps/scopes.d.ts +12 -1
  29. package/dist/admin/apps/scopes.d.ts.map +1 -1
  30. package/dist/admin/apps/scopes.js +3 -0
  31. package/dist/admin/apps/scopes.js.map +1 -1
  32. package/dist/admin/apps/verified-tokens.d.ts +116 -116
  33. package/dist/admin/apps/verified-tokens.js +1 -1
  34. package/dist/admin/apps/verified-tokens.js.map +1 -1
  35. package/dist/admin/ui.generated.d.ts +1 -1
  36. package/dist/admin/ui.generated.js +13 -13
  37. package/dist/admin/ui.generated.js.map +1 -1
  38. package/dist/analytics/Analytics.d.ts +151 -0
  39. package/dist/analytics/Analytics.d.ts.map +1 -0
  40. package/dist/analytics/Analytics.js +212 -0
  41. package/dist/analytics/Analytics.js.map +1 -0
  42. package/dist/analytics/tables/requestEvents.d.ts +215 -0
  43. package/dist/analytics/tables/requestEvents.d.ts.map +1 -0
  44. package/dist/analytics/tables/requestEvents.js +264 -0
  45. package/dist/analytics/tables/requestEvents.js.map +1 -0
  46. package/dist/apps/data/App.d.ts +19576 -0
  47. package/dist/apps/data/App.d.ts.map +1 -0
  48. package/dist/apps/data/App.js +272 -0
  49. package/dist/apps/data/App.js.map +1 -0
  50. package/dist/apps/data/index.d.ts +3 -0
  51. package/dist/apps/data/index.d.ts.map +1 -0
  52. package/dist/apps/data/index.js +3 -0
  53. package/dist/apps/data/index.js.map +1 -0
  54. package/dist/apps/{activities.d.ts → data/routes/activities.d.ts} +32 -32
  55. package/dist/apps/{activities.d.ts.map → data/routes/activities.d.ts.map} +1 -1
  56. package/dist/apps/{activities.js → data/routes/activities.js} +13 -13
  57. package/dist/apps/data/routes/activities.js.map +1 -0
  58. package/dist/apps/{addresses.d.ts → data/routes/addresses.d.ts} +22 -22
  59. package/dist/apps/{addresses.d.ts.map → data/routes/addresses.d.ts.map} +1 -1
  60. package/dist/apps/{addresses.js → data/routes/addresses.js} +5 -5
  61. package/dist/apps/data/routes/addresses.js.map +1 -0
  62. package/dist/apps/{balances.d.ts → data/routes/balances.d.ts} +4 -4
  63. package/dist/apps/data/routes/balances.d.ts.map +1 -0
  64. package/dist/apps/{balances.js → data/routes/balances.js} +42 -11
  65. package/dist/apps/data/routes/balances.js.map +1 -0
  66. package/dist/apps/{blocks.d.ts → data/routes/blocks.d.ts} +47 -47
  67. package/dist/apps/data/routes/blocks.d.ts.map +1 -0
  68. package/dist/apps/{blocks.js → data/routes/blocks.js} +13 -13
  69. package/dist/apps/data/routes/blocks.js.map +1 -0
  70. package/dist/apps/{coingecko.d.ts → data/routes/coingecko.d.ts} +8 -8
  71. package/dist/apps/data/routes/coingecko.d.ts.map +1 -0
  72. package/dist/apps/{coingecko.js → data/routes/coingecko.js} +13 -13
  73. package/dist/apps/data/routes/coingecko.js.map +1 -0
  74. package/dist/apps/{exchanges.d.ts → data/routes/exchanges.d.ts} +108 -108
  75. package/dist/apps/data/routes/exchanges.d.ts.map +1 -0
  76. package/dist/apps/{exchanges.js → data/routes/exchanges.js} +19 -19
  77. package/dist/apps/data/routes/exchanges.js.map +1 -0
  78. package/dist/apps/{fee-amm.d.ts → data/routes/fee-amm.d.ts} +39 -39
  79. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -0
  80. package/dist/apps/{fee-amm.js → data/routes/fee-amm.js} +17 -17
  81. package/dist/apps/data/routes/fee-amm.js.map +1 -0
  82. package/dist/apps/data/routes/funding.d.ts +765 -0
  83. package/dist/apps/data/routes/funding.d.ts.map +1 -0
  84. package/dist/apps/data/routes/funding.js +383 -0
  85. package/dist/apps/data/routes/funding.js.map +1 -0
  86. package/dist/apps/{indexer.d.ts → data/routes/indexer.d.ts} +4 -4
  87. package/dist/apps/data/routes/indexer.d.ts.map +1 -0
  88. package/dist/apps/{indexer.js → data/routes/indexer.js} +13 -9
  89. package/dist/apps/data/routes/indexer.js.map +1 -0
  90. package/dist/apps/{receipts.d.ts → data/routes/receipts.d.ts} +49 -49
  91. package/dist/apps/data/routes/receipts.d.ts.map +1 -0
  92. package/dist/apps/{receipts.js → data/routes/receipts.js} +14 -20
  93. package/dist/apps/data/routes/receipts.js.map +1 -0
  94. package/dist/apps/{rpc.d.ts → data/routes/rpc.d.ts} +33 -40
  95. package/dist/apps/data/routes/rpc.d.ts.map +1 -0
  96. package/dist/apps/{rpc.js → data/routes/rpc.js} +35 -7
  97. package/dist/apps/data/routes/rpc.js.map +1 -0
  98. package/dist/apps/{tokenlist.d.ts → data/routes/tokenlist.d.ts} +40 -40
  99. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -0
  100. package/dist/apps/{tokenlist.js → data/routes/tokenlist.js} +8 -8
  101. package/dist/apps/data/routes/tokenlist.js.map +1 -0
  102. package/dist/apps/{tokens.d.ts → data/routes/tokens.d.ts} +468 -468
  103. package/dist/apps/data/routes/tokens.d.ts.map +1 -0
  104. package/dist/apps/{tokens.js → data/routes/tokens.js} +19 -19
  105. package/dist/apps/data/routes/tokens.js.map +1 -0
  106. package/dist/apps/{transactions.d.ts → data/routes/transactions.d.ts} +304 -304
  107. package/dist/apps/data/routes/transactions.d.ts.map +1 -0
  108. package/dist/apps/{transactions.js → data/routes/transactions.js} +13 -13
  109. package/dist/apps/data/routes/transactions.js.map +1 -0
  110. package/dist/apps/{transfers.d.ts → data/routes/transfers.d.ts} +62 -62
  111. package/dist/apps/data/routes/transfers.d.ts.map +1 -0
  112. package/dist/apps/{transfers.js → data/routes/transfers.js} +13 -13
  113. package/dist/apps/data/routes/transfers.js.map +1 -0
  114. package/dist/apps/{verified-tokens.d.ts → data/routes/verified-tokens.d.ts} +6 -6
  115. package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -0
  116. package/dist/apps/{verified-tokens.js → data/routes/verified-tokens.js} +9 -9
  117. package/dist/apps/data/routes/verified-tokens.js.map +1 -0
  118. package/dist/apps/{webhooks.d.ts → data/routes/webhooks.d.ts} +17 -17
  119. package/dist/apps/{webhooks.d.ts.map → data/routes/webhooks.d.ts.map} +1 -1
  120. package/dist/apps/{webhooks.js → data/routes/webhooks.js} +38 -34
  121. package/dist/apps/data/routes/webhooks.js.map +1 -0
  122. package/dist/apps/docs/App.d.ts +29 -0
  123. package/dist/apps/docs/App.d.ts.map +1 -0
  124. package/dist/apps/docs/App.js +54 -0
  125. package/dist/apps/docs/App.js.map +1 -0
  126. package/dist/{internal/OpenApi.fonts.d.ts → apps/docs/fonts.d.ts} +1 -1
  127. package/dist/apps/docs/fonts.d.ts.map +1 -0
  128. package/dist/{internal/OpenApi.fonts.js → apps/docs/fonts.js} +1 -1
  129. package/dist/apps/docs/fonts.js.map +1 -0
  130. package/dist/apps/docs/index.d.ts +2 -0
  131. package/dist/apps/docs/index.d.ts.map +1 -0
  132. package/dist/apps/docs/index.js +2 -0
  133. package/dist/apps/docs/index.js.map +1 -0
  134. package/dist/{internal/OpenApi.logo.d.ts → apps/docs/logo.d.ts} +1 -1
  135. package/dist/apps/docs/logo.d.ts.map +1 -0
  136. package/dist/{internal/OpenApi.logo.js → apps/docs/logo.js} +1 -1
  137. package/dist/apps/docs/logo.js.map +1 -0
  138. package/dist/apps/docs/reference.d.ts +21 -0
  139. package/dist/apps/docs/reference.d.ts.map +1 -0
  140. package/dist/apps/docs/reference.js +112 -0
  141. package/dist/apps/docs/reference.js.map +1 -0
  142. package/dist/apps/index.d.ts +5 -0
  143. package/dist/apps/index.d.ts.map +1 -0
  144. package/dist/apps/index.js +5 -0
  145. package/dist/apps/index.js.map +1 -0
  146. package/dist/apps/mcp.d.ts +76 -0
  147. package/dist/apps/mcp.d.ts.map +1 -0
  148. package/dist/apps/mcp.js +188 -0
  149. package/dist/apps/mcp.js.map +1 -0
  150. package/dist/apps/metadata.d.ts +7 -0
  151. package/dist/apps/metadata.d.ts.map +1 -0
  152. package/dist/apps/metadata.js +15 -0
  153. package/dist/apps/metadata.js.map +1 -0
  154. package/dist/apps/platform/App.d.ts +5262 -0
  155. package/dist/apps/platform/App.d.ts.map +1 -0
  156. package/dist/apps/platform/App.js +84 -0
  157. package/dist/apps/platform/App.js.map +1 -0
  158. package/dist/apps/platform/Billing.d.ts +279 -0
  159. package/dist/apps/platform/Billing.d.ts.map +1 -0
  160. package/dist/apps/platform/Billing.js +477 -0
  161. package/dist/apps/platform/Billing.js.map +1 -0
  162. package/dist/apps/platform/index.d.ts +3 -0
  163. package/dist/apps/platform/index.d.ts.map +1 -0
  164. package/dist/apps/platform/index.js +3 -0
  165. package/dist/apps/platform/index.js.map +1 -0
  166. package/dist/apps/platform/routes/api-keys.d.ts +973 -0
  167. package/dist/apps/platform/routes/api-keys.d.ts.map +1 -0
  168. package/dist/apps/platform/routes/api-keys.js +430 -0
  169. package/dist/apps/platform/routes/api-keys.js.map +1 -0
  170. package/dist/apps/platform/routes/billing.d.ts +1520 -0
  171. package/dist/apps/platform/routes/billing.d.ts.map +1 -0
  172. package/dist/apps/platform/routes/billing.js +795 -0
  173. package/dist/apps/platform/routes/billing.js.map +1 -0
  174. package/dist/apps/platform/routes/invitations.d.ts +851 -0
  175. package/dist/apps/platform/routes/invitations.d.ts.map +1 -0
  176. package/dist/apps/platform/routes/invitations.js +471 -0
  177. package/dist/apps/platform/routes/invitations.js.map +1 -0
  178. package/dist/apps/platform/routes/me.d.ts +95 -0
  179. package/dist/apps/platform/routes/me.d.ts.map +1 -0
  180. package/dist/apps/platform/routes/me.js +81 -0
  181. package/dist/apps/platform/routes/me.js.map +1 -0
  182. package/dist/apps/platform/routes/members.d.ts +554 -0
  183. package/dist/apps/platform/routes/members.d.ts.map +1 -0
  184. package/dist/apps/platform/routes/members.js +251 -0
  185. package/dist/apps/platform/routes/members.js.map +1 -0
  186. package/dist/apps/platform/routes/orgs.d.ts +596 -0
  187. package/dist/apps/platform/routes/orgs.d.ts.map +1 -0
  188. package/dist/apps/platform/routes/orgs.js +276 -0
  189. package/dist/apps/platform/routes/orgs.js.map +1 -0
  190. package/dist/apps/platform/routes/projects.d.ts +740 -0
  191. package/dist/apps/platform/routes/projects.d.ts.map +1 -0
  192. package/dist/apps/platform/routes/projects.js +286 -0
  193. package/dist/apps/platform/routes/projects.js.map +1 -0
  194. package/dist/apps/platform/routes/scopes.d.ts +107 -0
  195. package/dist/apps/platform/routes/scopes.d.ts.map +1 -0
  196. package/dist/apps/platform/routes/scopes.js +66 -0
  197. package/dist/apps/platform/routes/scopes.js.map +1 -0
  198. package/dist/apps/platform/routes/usage.d.ts +588 -0
  199. package/dist/apps/platform/routes/usage.d.ts.map +1 -0
  200. package/dist/apps/platform/routes/usage.js +391 -0
  201. package/dist/apps/platform/routes/usage.js.map +1 -0
  202. package/dist/apps/relay/App.d.ts +44 -0
  203. package/dist/apps/relay/App.d.ts.map +1 -0
  204. package/dist/apps/relay/App.js +211 -0
  205. package/dist/apps/relay/App.js.map +1 -0
  206. package/dist/apps/relay/Sponsorships.d.ts +107 -0
  207. package/dist/apps/relay/Sponsorships.d.ts.map +1 -0
  208. package/dist/apps/relay/Sponsorships.js +194 -0
  209. package/dist/apps/relay/Sponsorships.js.map +1 -0
  210. package/dist/apps/relay/index.d.ts +3 -0
  211. package/dist/apps/relay/index.d.ts.map +1 -0
  212. package/dist/apps/relay/index.js +3 -0
  213. package/dist/apps/relay/index.js.map +1 -0
  214. package/dist/cli/Cli.d.ts +9 -2
  215. package/dist/cli/Cli.d.ts.map +1 -1
  216. package/dist/cli/Cli.js +12 -4
  217. package/dist/cli/Cli.js.map +1 -1
  218. package/dist/cli/commands/admin.d.ts +5 -1
  219. package/dist/cli/commands/admin.d.ts.map +1 -1
  220. package/dist/cli/commands/admin.js +82 -3
  221. package/dist/cli/commands/admin.js.map +1 -1
  222. package/dist/db/Db.d.ts +17 -0
  223. package/dist/db/Db.d.ts.map +1 -1
  224. package/dist/db/Db.js +254 -0
  225. package/dist/db/Db.js.map +1 -1
  226. package/dist/db/Schema.d.ts +159 -0
  227. package/dist/db/Schema.d.ts.map +1 -1
  228. package/dist/db/Schema.js +187 -2
  229. package/dist/db/Schema.js.map +1 -1
  230. package/dist/db/tables/billingSettings.d.ts +55 -0
  231. package/dist/db/tables/billingSettings.d.ts.map +1 -0
  232. package/dist/db/tables/billingSettings.js +70 -0
  233. package/dist/db/tables/billingSettings.js.map +1 -0
  234. package/dist/db/tables/invitations.d.ts +84 -0
  235. package/dist/db/tables/invitations.d.ts.map +1 -0
  236. package/dist/db/tables/invitations.js +165 -0
  237. package/dist/db/tables/invitations.js.map +1 -0
  238. package/dist/db/tables/memberships.d.ts +108 -0
  239. package/dist/db/tables/memberships.d.ts.map +1 -0
  240. package/dist/db/tables/memberships.js +153 -0
  241. package/dist/db/tables/memberships.js.map +1 -0
  242. package/dist/db/tables/organizations.d.ts +48 -0
  243. package/dist/db/tables/organizations.d.ts.map +1 -1
  244. package/dist/db/tables/organizations.js +97 -2
  245. package/dist/db/tables/organizations.js.map +1 -1
  246. package/dist/db/tables/projects.d.ts +65 -0
  247. package/dist/db/tables/projects.d.ts.map +1 -0
  248. package/dist/db/tables/projects.js +75 -0
  249. package/dist/db/tables/projects.js.map +1 -0
  250. package/dist/db/tables/requestUsage.d.ts +121 -0
  251. package/dist/db/tables/requestUsage.d.ts.map +1 -0
  252. package/dist/db/tables/requestUsage.js +150 -0
  253. package/dist/db/tables/requestUsage.js.map +1 -0
  254. package/dist/db/tables/sponsoredTransactions.d.ts +239 -0
  255. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -0
  256. package/dist/db/tables/sponsoredTransactions.js +314 -0
  257. package/dist/db/tables/sponsoredTransactions.js.map +1 -0
  258. package/dist/db/tables/stripeCustomers.d.ts +81 -0
  259. package/dist/db/tables/stripeCustomers.d.ts.map +1 -0
  260. package/dist/db/tables/stripeCustomers.js +120 -0
  261. package/dist/db/tables/stripeCustomers.js.map +1 -0
  262. package/dist/db/tables/users.d.ts +48 -0
  263. package/dist/db/tables/users.d.ts.map +1 -0
  264. package/dist/db/tables/users.js +65 -0
  265. package/dist/db/tables/users.js.map +1 -0
  266. package/dist/handlers/internal/executionError.d.ts.map +1 -1
  267. package/dist/handlers/internal/executionError.js +2 -0
  268. package/dist/handlers/internal/executionError.js.map +1 -1
  269. package/dist/handlers/internal/multisig.d.ts +2 -6
  270. package/dist/handlers/internal/multisig.d.ts.map +1 -1
  271. package/dist/handlers/internal/multisig.js +11 -36
  272. package/dist/handlers/internal/multisig.js.map +1 -1
  273. package/dist/handlers/internal/sponsorship.d.ts +35 -2
  274. package/dist/handlers/internal/sponsorship.d.ts.map +1 -1
  275. package/dist/handlers/internal/sponsorship.js +53 -14
  276. package/dist/handlers/internal/sponsorship.js.map +1 -1
  277. package/dist/handlers/internal/utils.d.ts +10 -3
  278. package/dist/handlers/internal/utils.d.ts.map +1 -1
  279. package/dist/handlers/internal/utils.js +14 -6
  280. package/dist/handlers/internal/utils.js.map +1 -1
  281. package/dist/handlers/relay.d.ts +6 -2
  282. package/dist/handlers/relay.d.ts.map +1 -1
  283. package/dist/handlers/relay.js +16 -2
  284. package/dist/handlers/relay.js.map +1 -1
  285. package/dist/index.d.ts +1 -0
  286. package/dist/index.d.ts.map +1 -1
  287. package/dist/index.js +1 -0
  288. package/dist/index.js.map +1 -1
  289. package/dist/internal/Auth.d.ts +222 -6
  290. package/dist/internal/Auth.d.ts.map +1 -1
  291. package/dist/internal/Auth.js +625 -74
  292. package/dist/internal/Auth.js.map +1 -1
  293. package/dist/internal/Cache.d.ts.map +1 -1
  294. package/dist/internal/Cache.js +4 -1
  295. package/dist/internal/Cache.js.map +1 -1
  296. package/dist/internal/EdgeCache.d.ts +10 -0
  297. package/dist/internal/EdgeCache.d.ts.map +1 -1
  298. package/dist/internal/EdgeCache.js +39 -8
  299. package/dist/internal/EdgeCache.js.map +1 -1
  300. package/dist/internal/Fees.d.ts +27 -0
  301. package/dist/internal/Fees.d.ts.map +1 -0
  302. package/dist/internal/Fees.js +48 -0
  303. package/dist/internal/Fees.js.map +1 -0
  304. package/dist/internal/FundingRoutes.d.ts +183 -0
  305. package/dist/internal/FundingRoutes.d.ts.map +1 -0
  306. package/dist/internal/FundingRoutes.js +490 -0
  307. package/dist/internal/FundingRoutes.js.map +1 -0
  308. package/dist/internal/Id.d.ts +15 -0
  309. package/dist/internal/Id.d.ts.map +1 -0
  310. package/dist/internal/Id.js +22 -0
  311. package/dist/internal/Id.js.map +1 -0
  312. package/dist/internal/Log.d.ts +9 -3
  313. package/dist/internal/Log.d.ts.map +1 -1
  314. package/dist/internal/Log.js +7 -0
  315. package/dist/internal/Log.js.map +1 -1
  316. package/dist/internal/OpenApi.d.ts +10 -20
  317. package/dist/internal/OpenApi.d.ts.map +1 -1
  318. package/dist/internal/OpenApi.js +8 -58
  319. package/dist/internal/OpenApi.js.map +1 -1
  320. package/dist/internal/RateLimit.d.ts +25 -0
  321. package/dist/internal/RateLimit.d.ts.map +1 -1
  322. package/dist/internal/RateLimit.js +51 -0
  323. package/dist/internal/RateLimit.js.map +1 -1
  324. package/dist/internal/Response.d.ts +1 -1
  325. package/dist/internal/Response.d.ts.map +1 -1
  326. package/dist/internal/Schema.d.ts +8 -0
  327. package/dist/internal/Schema.d.ts.map +1 -1
  328. package/dist/internal/Schema.js +7 -0
  329. package/dist/internal/Schema.js.map +1 -1
  330. package/dist/internal/Store.d.ts +7 -1
  331. package/dist/internal/Store.d.ts.map +1 -1
  332. package/dist/internal/Store.js +16 -2
  333. package/dist/internal/Store.js.map +1 -1
  334. package/dist/internal/Viem.d.ts +84 -0
  335. package/dist/internal/Viem.d.ts.map +1 -1
  336. package/dist/internal/Webhooks.d.ts +1 -1
  337. package/dist/internal/Webhooks.d.ts.map +1 -1
  338. package/dist/internal/Webhooks.js +3 -3
  339. package/dist/internal/Webhooks.js.map +1 -1
  340. package/package.json +33 -6
  341. package/src/ApiKey.ts +10 -2
  342. package/src/ApiKeys.test.ts +155 -1
  343. package/src/ApiKeys.ts +203 -1
  344. package/src/App.test.ts +64 -75741
  345. package/src/App.ts +218 -420
  346. package/src/Client.test-d.ts +657 -15
  347. package/src/Scope.ts +26 -4
  348. package/src/Webhooks.ts +2 -2
  349. package/src/admin/apps/api-keys.test.ts +51 -0
  350. package/src/admin/apps/api-keys.ts +84 -0
  351. package/src/admin/apps/scopes.test.ts +11 -1
  352. package/src/admin/apps/scopes.ts +3 -0
  353. package/src/admin/apps/verified-tokens.ts +1 -1
  354. package/src/admin/ui/src/components/Page.tsx +2 -3
  355. package/src/admin/ui/src/routes/__root.tsx +2 -2
  356. package/src/admin/ui/src/routes/api-keys.tsx +2 -2
  357. package/src/admin/ui.generated.ts +13 -13
  358. package/src/analytics/Analytics.test.ts +527 -0
  359. package/src/analytics/Analytics.ts +318 -0
  360. package/src/analytics/tables/requestEvents.ts +523 -0
  361. package/src/apps/composition.test.ts +66 -0
  362. package/src/apps/data/App.test.ts +72 -0
  363. package/src/apps/data/App.ts +330 -0
  364. package/src/apps/data/index.ts +2 -0
  365. package/src/apps/{activities.test.ts → data/routes/activities.test.ts} +3 -3
  366. package/src/apps/{activities.ts → data/routes/activities.ts} +15 -15
  367. package/src/apps/{addresses.ts → data/routes/addresses.ts} +6 -6
  368. package/src/apps/{balances.test.ts → data/routes/balances.test.ts} +2 -2
  369. package/src/apps/{balances.ts → data/routes/balances.ts} +46 -12
  370. package/src/apps/{blocks.test.ts → data/routes/blocks.test.ts} +3 -3
  371. package/src/apps/{blocks.ts → data/routes/blocks.ts} +14 -14
  372. package/src/apps/{coingecko.test.ts → data/routes/coingecko.test.ts} +2 -2
  373. package/src/apps/{coingecko.ts → data/routes/coingecko.ts} +14 -14
  374. package/src/apps/{exchanges.test.ts → data/routes/exchanges.test.ts} +1 -1
  375. package/src/apps/{exchanges.ts → data/routes/exchanges.ts} +20 -20
  376. package/src/apps/{fee-amm.test.ts → data/routes/fee-amm.test.ts} +3 -3
  377. package/src/apps/{fee-amm.ts → data/routes/fee-amm.ts} +18 -18
  378. package/src/apps/data/routes/funding.test.ts +214 -0
  379. package/src/apps/data/routes/funding.ts +584 -0
  380. package/src/apps/{indexer.test.ts → data/routes/indexer.test.ts} +26 -5
  381. package/src/apps/{indexer.ts → data/routes/indexer.ts} +13 -10
  382. package/src/apps/{receipts.test.ts → data/routes/receipts.test.ts} +3 -3
  383. package/src/apps/{receipts.ts → data/routes/receipts.ts} +15 -22
  384. package/src/apps/{rpc.test.ts → data/routes/rpc.test.ts} +122 -7
  385. package/src/apps/{rpc.ts → data/routes/rpc.ts} +38 -8
  386. package/src/apps/{tokenlist.test.ts → data/routes/tokenlist.test.ts} +3 -3
  387. package/src/apps/{tokenlist.ts → data/routes/tokenlist.ts} +9 -9
  388. package/src/apps/{tokens.test.ts → data/routes/tokens.test.ts} +2 -2
  389. package/src/apps/{tokens.ts → data/routes/tokens.ts} +20 -20
  390. package/src/apps/{transactions.test.ts → data/routes/transactions.test.ts} +3 -3
  391. package/src/apps/{transactions.ts → data/routes/transactions.ts} +15 -15
  392. package/src/apps/{transfers.test.ts → data/routes/transfers.test.ts} +2 -2
  393. package/src/apps/{transfers.ts → data/routes/transfers.ts} +15 -15
  394. package/src/apps/{verified-tokens.test.ts → data/routes/verified-tokens.test.ts} +3 -3
  395. package/src/apps/{verified-tokens.ts → data/routes/verified-tokens.ts} +10 -10
  396. package/src/apps/{webhooks.test.ts → data/routes/webhooks.test.ts} +7 -7
  397. package/src/apps/{webhooks.ts → data/routes/webhooks.ts} +50 -43
  398. package/src/apps/docs/App.ts +65 -0
  399. package/src/apps/docs/index.ts +1 -0
  400. package/src/apps/docs/reference.ts +132 -0
  401. package/src/apps/index.ts +4 -0
  402. package/src/apps/mcp.test.ts +206 -0
  403. package/src/apps/mcp.ts +250 -0
  404. package/src/apps/metadata.ts +23 -0
  405. package/src/apps/platform/App.ts +169 -0
  406. package/src/apps/platform/Billing.test.ts +530 -0
  407. package/src/apps/platform/Billing.ts +682 -0
  408. package/src/apps/platform/index.ts +2 -0
  409. package/src/apps/platform/routes/api-keys.test.ts +493 -0
  410. package/src/apps/platform/routes/api-keys.ts +543 -0
  411. package/src/apps/platform/routes/billing.test.ts +1100 -0
  412. package/src/apps/platform/routes/billing.ts +966 -0
  413. package/src/apps/platform/routes/invitations.test.ts +409 -0
  414. package/src/apps/platform/routes/invitations.ts +587 -0
  415. package/src/apps/platform/routes/me.test.ts +351 -0
  416. package/src/apps/platform/routes/me.ts +106 -0
  417. package/src/apps/platform/routes/members.test.ts +195 -0
  418. package/src/apps/platform/routes/members.ts +313 -0
  419. package/src/apps/platform/routes/orgs.test.ts +313 -0
  420. package/src/apps/platform/routes/orgs.ts +365 -0
  421. package/src/apps/platform/routes/projects.test.ts +181 -0
  422. package/src/apps/platform/routes/projects.ts +367 -0
  423. package/src/apps/platform/routes/scopes.test.ts +29 -0
  424. package/src/apps/platform/routes/scopes.ts +85 -0
  425. package/src/apps/platform/routes/usage.test.ts +422 -0
  426. package/src/apps/platform/routes/usage.ts +527 -0
  427. package/src/apps/relay/App.test.ts +933 -0
  428. package/src/apps/relay/App.ts +236 -0
  429. package/src/apps/relay/Sponsorships.test.ts +375 -0
  430. package/src/apps/relay/Sponsorships.ts +306 -0
  431. package/src/apps/relay/index.ts +2 -0
  432. package/src/cli/Cli.test.ts +25 -2
  433. package/src/cli/Cli.ts +18 -3
  434. package/src/cli/commands/admin.test.ts +83 -0
  435. package/src/cli/commands/admin.ts +91 -3
  436. package/src/db/Db.ts +296 -0
  437. package/src/db/Schema.ts +241 -2
  438. package/src/db/tables/billingSettings.test.ts +87 -0
  439. package/src/db/tables/billingSettings.ts +108 -0
  440. package/src/db/tables/invitations.ts +198 -0
  441. package/src/db/tables/memberships.ts +208 -0
  442. package/src/db/tables/organizations.test.ts +38 -2
  443. package/src/db/tables/organizations.ts +117 -2
  444. package/src/db/tables/projects.ts +107 -0
  445. package/src/db/tables/requestUsage.ts +231 -0
  446. package/src/db/tables/sponsoredTransactions.test.ts +325 -0
  447. package/src/db/tables/sponsoredTransactions.ts +464 -0
  448. package/src/db/tables/stripeCustomers.test.ts +109 -0
  449. package/src/db/tables/stripeCustomers.ts +162 -0
  450. package/src/db/tables/users.ts +85 -0
  451. package/src/handlers/internal/executionError.ts +2 -0
  452. package/src/handlers/internal/multisig.test.ts +84 -10
  453. package/src/handlers/internal/multisig.ts +15 -50
  454. package/src/handlers/internal/sponsorship.ts +106 -20
  455. package/src/handlers/internal/utils.ts +19 -7
  456. package/src/handlers/{internal/relay.localnet.test.ts → relay.test.ts} +2 -2
  457. package/src/handlers/relay.ts +23 -5
  458. package/src/index.ts +1 -0
  459. package/src/internal/Auth.test.ts +491 -25
  460. package/src/internal/Auth.ts +839 -84
  461. package/src/internal/Cache.ts +5 -1
  462. package/src/internal/Cursor.test.ts +3 -2
  463. package/src/internal/EdgeCache.test.ts +27 -4
  464. package/src/internal/EdgeCache.ts +47 -9
  465. package/src/internal/Fees.test.ts +32 -0
  466. package/src/internal/Fees.ts +51 -0
  467. package/src/internal/FundingRoutes.ts +583 -0
  468. package/src/internal/Id.test.ts +17 -0
  469. package/src/internal/Id.ts +24 -0
  470. package/src/internal/Log.test.ts +2 -1
  471. package/src/internal/Log.ts +16 -3
  472. package/src/internal/MetricSink.ts +1 -1
  473. package/src/internal/OpenApi.ts +12 -60
  474. package/src/internal/RateLimit.test.ts +84 -0
  475. package/src/internal/RateLimit.ts +70 -0
  476. package/src/internal/Response.ts +1 -1
  477. package/src/internal/Schema.ts +8 -0
  478. package/src/internal/Store.test.ts +52 -0
  479. package/src/internal/Store.ts +24 -5
  480. package/src/internal/Tidx.local.test.ts +1 -1
  481. package/src/internal/VerifiedTokens.test.ts +1 -1
  482. package/src/internal/WebhookDestination.test.ts +1 -1
  483. package/src/internal/Webhooks.test.ts +7 -7
  484. package/src/internal/Webhooks.ts +4 -4
  485. package/dist/apps/activities.js.map +0 -1
  486. package/dist/apps/addresses.js.map +0 -1
  487. package/dist/apps/balances.d.ts.map +0 -1
  488. package/dist/apps/balances.js.map +0 -1
  489. package/dist/apps/blocks.d.ts.map +0 -1
  490. package/dist/apps/blocks.js.map +0 -1
  491. package/dist/apps/coingecko.d.ts.map +0 -1
  492. package/dist/apps/coingecko.js.map +0 -1
  493. package/dist/apps/exchanges.d.ts.map +0 -1
  494. package/dist/apps/exchanges.js.map +0 -1
  495. package/dist/apps/fee-amm.d.ts.map +0 -1
  496. package/dist/apps/fee-amm.js.map +0 -1
  497. package/dist/apps/indexer.d.ts.map +0 -1
  498. package/dist/apps/indexer.js.map +0 -1
  499. package/dist/apps/receipts.d.ts.map +0 -1
  500. package/dist/apps/receipts.js.map +0 -1
  501. package/dist/apps/rpc.d.ts.map +0 -1
  502. package/dist/apps/rpc.js.map +0 -1
  503. package/dist/apps/tokenlist.d.ts.map +0 -1
  504. package/dist/apps/tokenlist.js.map +0 -1
  505. package/dist/apps/tokens.d.ts.map +0 -1
  506. package/dist/apps/tokens.js.map +0 -1
  507. package/dist/apps/transactions.d.ts.map +0 -1
  508. package/dist/apps/transactions.js.map +0 -1
  509. package/dist/apps/transfers.d.ts.map +0 -1
  510. package/dist/apps/transfers.js.map +0 -1
  511. package/dist/apps/verified-tokens.d.ts.map +0 -1
  512. package/dist/apps/verified-tokens.js.map +0 -1
  513. package/dist/apps/webhooks.js.map +0 -1
  514. package/dist/internal/OpenApi.fonts.d.ts.map +0 -1
  515. package/dist/internal/OpenApi.fonts.js.map +0 -1
  516. package/dist/internal/OpenApi.logo.d.ts.map +0 -1
  517. package/dist/internal/OpenApi.logo.js.map +0 -1
  518. package/src/handlers/internal/multisig.localnet.test.ts +0 -146
  519. /package/src/{internal/OpenApi.fonts.ts → apps/docs/fonts.ts} +0 -0
  520. /package/src/{internal/OpenApi.logo.ts → apps/docs/logo.ts} +0 -0
@@ -0,0 +1,330 @@
1
+ import { Hono } from 'hono'
2
+ import * as z from 'zod/mini'
3
+
4
+ import type * as Assets from '../../Assets.js'
5
+ import type * as App from '../../App.js'
6
+ import * as Metadata from '../metadata.js'
7
+ import * as Auth from '../../internal/Auth.js'
8
+ import * as Path from '../../internal/Path.js'
9
+ import * as Response from '../../internal/Response.js'
10
+ import * as Schema from '../../internal/Schema.js'
11
+ import * as Tidx from '../../internal/Tidx.js'
12
+ import * as Viem from '../../internal/Viem.js'
13
+
14
+ import { transactions as transactionActivities } from './routes/activities.js'
15
+ import { addresses } from './routes/addresses.js'
16
+ import { blocks, blocksByTimestampCompat } from './routes/blocks.js'
17
+ import { coingecko } from './routes/coingecko.js'
18
+ import { exchanges } from './routes/exchanges.js'
19
+ import { feeAmm } from './routes/fee-amm.js'
20
+ import { funding } from './routes/funding.js'
21
+ import { indexer } from './routes/indexer.js'
22
+ import { receipts } from './routes/receipts.js'
23
+ import { rpc } from './routes/rpc.js'
24
+ import { tokenlist } from './routes/tokenlist.js'
25
+ import { tokens } from './routes/tokens.js'
26
+ import { transactions } from './routes/transactions.js'
27
+ import { transfers } from './routes/transfers.js'
28
+ import { verifiedTokens } from './routes/verified-tokens.js'
29
+ import { schema as webhookSchema, webhooks } from './routes/webhooks.js'
30
+
31
+ /**
32
+ * The chain-data route group: read endpoints over blocks, transactions, tokens,
33
+ * the exchange/fee-AMM, and the RPC/indexer passthroughs. It owns all chain
34
+ * configuration and publishes the chain clients on request context.
35
+ *
36
+ * ```ts
37
+ * App.create(options).route('/', data())
38
+ * ```
39
+ */
40
+ export function data(options: data.Options = {}) {
41
+ const { assets, defaultChainId = Viem.defaultChainId, rpc: rpc_option, tidx } = options
42
+
43
+ // The chain ids this deployment serves (built-in public chains plus
44
+ // `defaultChainId` and any explicit `supportedChainIds`). Published on context
45
+ // so handlers with a path `chainId` can guard it too.
46
+ const supportedChainIds = new Set<number>([
47
+ ...Object.keys(Viem.url).map(Number),
48
+ ...Object.keys(Tidx.url).map(Number),
49
+ defaultChainId,
50
+ ...(options.supportedChainIds ?? []),
51
+ ])
52
+
53
+ // Memoize one viem client per resolved upstream (stateless HTTP transports).
54
+ // Keying on the resolved output (`url`+`basicAuth`+`chainId`), not the
55
+ // principal, bounds cardinality by the number of distinct upstreams.
56
+ const clients = new Map<string, ReturnType<typeof Viem.getClient>>()
57
+ const getClient = (chainId = defaultChainId, principal: Auth.Principal | null = null) => {
58
+ const { url, basicAuth } = Viem.resolve(rpc_option, { chainId, principal })
59
+ const cacheKey = `${url}|${basicAuth ?? ''}|${chainId}`
60
+ const existing = clients.get(cacheKey)
61
+ if (existing) return existing
62
+ const client = Viem.getClient({ chainId, principal, rpc: rpc_option })
63
+ clients.set(cacheKey, client)
64
+ return client
65
+ }
66
+
67
+ // Memoize TIDX clients per `chainId` so the base URL resolver runs once per
68
+ // chain instead of on every request.
69
+ const getTidx = Tidx.createGetClient({ defaultChainId, tidx })
70
+
71
+ const app = new Hono<App.Environment>()
72
+ // Publish the chain-data context vars for this group's handlers. Runs after
73
+ // `App.create`'s middleware, so `getClient`/`getTidx` can key on the
74
+ // resolved principal and `getAsset` can read `basePath` off context.
75
+ .use('*', async (c, next) => {
76
+ c.set('chainId', defaultChainId)
77
+ c.set('getAsset', createGetAsset({ assets, basePath: c.get('basePath'), origin: new URL(c.req.url).origin })) // prettier-ignore
78
+ c.set('getClient', (chainId) => getClient(chainId, Auth.getPrincipal(c)))
79
+ c.set('getTidx', (chainId) => getTidx(chainId, Auth.getPrincipal(c)))
80
+ c.set('rpc', rpc_option)
81
+ c.set('supportedChainIds', supportedChainIds)
82
+ c.set('tidx', tidx)
83
+ c.set('verifiedTokens', options.verifiedTokens === false ? undefined : (options.verifiedTokens ?? {})) // prettier-ignore
84
+ c.set('webhook', options.webhook === false ? undefined : (options.webhook ?? {}))
85
+ await next()
86
+ })
87
+ // Reject a well-formed but unsupported `chainId` before it reaches an
88
+ // upstream, which would otherwise return an opaque `upstream_error`.
89
+ .use('*', async (c, next) => {
90
+ const raw = c.req.query('chainId') ?? c.req.query('chain_id')
91
+ if (raw === undefined) return next()
92
+ // Only reject a well-formed-but-unsupported chain here; malformed values
93
+ // (e.g. `abc`, `0`) fall through to the route's own query validation.
94
+ const parsed = Schema.ChainId.safeParse(raw)
95
+ if (!parsed.success || supportedChainIds.has(parsed.data)) return next()
96
+ return Response.unsupportedChainId(c, parsed.data, supportedChainIds)
97
+ })
98
+ // Sandbox keys are testnet-only. A chain-scoped data route defaults to
99
+ // mainnet, so a sandbox key that omits `chainId` (or targets mainnet) is
100
+ // refused with a clear message telling the caller to pass a testnet
101
+ // `chainId`. The relay resolves its chain from the request body, not the
102
+ // query, so it is skipped and enforces the rule in its sponsor validation.
103
+ .use('*', async (c, next) => {
104
+ const relay = Path.join(c.get('basePath') ?? '', 'rpc/relay')
105
+ if (c.req.path === relay || c.req.path.startsWith(`${relay}/`)) return next()
106
+
107
+ const principal = Auth.getPrincipal(c)
108
+ if (principal?.type !== 'api_key' || principal.environment !== 'sandbox') return next()
109
+
110
+ const raw = c.req.query('chainId') ?? c.req.query('chain_id')
111
+ // Absent falls back to the group default (mainnet); a malformed value
112
+ // stays with the route's own validator rather than the sandbox message.
113
+ const chainId = (() => {
114
+ if (raw === undefined) return defaultChainId
115
+ const parsed = Schema.ChainId.safeParse(raw)
116
+ return parsed.success ? parsed.data : undefined
117
+ })()
118
+ if (chainId === undefined || !Viem.isMainnet(chainId)) return next()
119
+
120
+ return Response.error(c, {
121
+ code: 'api_key_forbidden',
122
+ message: 'Sandbox API keys only support testnet. Pass a testnet `chainId`.',
123
+ status: 403,
124
+ })
125
+ })
126
+ // Serve static API assets (e.g. verified-token icons) from the configured
127
+ // store; a no-op fall-through when no store is configured (logo URIs simply
128
+ // go unresolved).
129
+ .use('/assets/*', async (c, next) => {
130
+ if (!assets) return next()
131
+ const key = stripAssetPath(c.req.path, c.get('basePath')).replace(/^\/+/, '')
132
+ const asset = key ? await assets.get(key) : undefined
133
+ if (!asset) return next()
134
+ return c.body(asset.body, 200, {
135
+ 'Cache-Control': 'public, max-age=86400',
136
+ 'Content-Type': asset.contentType,
137
+ })
138
+ })
139
+ .route('/', addresses())
140
+ .route('/', blocks())
141
+ .route('/', exchanges())
142
+ .route('/', feeAmm())
143
+ .route('/', funding())
144
+ .route('/', indexer())
145
+ .route('/', receipts())
146
+ .route('/', tokenlist())
147
+ .route('/', tokens())
148
+ .route('/', transactions())
149
+ .route('/', transactionActivities())
150
+ .route('/', transfers())
151
+ .route('/', verifiedTokens())
152
+ .route('/', webhooks({ enabled: options.webhook !== false }))
153
+ .route('/', rpc())
154
+ .route('/', coingecko())
155
+ .route('/', blocksByTimestampCompat())
156
+ return Metadata.attach(app, openapi)
157
+ }
158
+
159
+ export declare namespace data {
160
+ /** Options for the data route group. */
161
+ type Options = {
162
+ /** Static API asset store for the current runtime (e.g. `Assets.cloudflareR2(...)`). Omit to skip static assets — token logo URIs go unresolved. */
163
+ assets?: Assets.Assets | undefined
164
+ /** Default Tempo chain id for requests that omit `chainId`. */
165
+ defaultChainId?: Viem.ChainId | undefined
166
+ /** Tempo RPC options: a static config, or a per-request resolver that routes by request principal to a separate (e.g. public, no-auth) RPC. */
167
+ rpc?: Viem.getClient.Rpc | undefined
168
+ /** Extra chain ids this deployment serves, beyond the built-in public chains and `defaultChainId`. A `chainId` outside this set is rejected with a 400. */
169
+ supportedChainIds?: readonly number[] | undefined
170
+ /** TIDX query client options. */
171
+ tidx?: Tidx.getClient.Tidx | undefined
172
+ /** Verified-token feature configuration. Enabled by default (token rows live in `db`; empty until published); pass `false` to always serve an empty verified list. */
173
+ verifiedTokens?: VerifiedTokens | false | undefined
174
+ /** Webhook feature configuration. Enabled by default (rows live in `db`); pass `false` to disable, leaving `/webhooks` mounted but returning `404` and hidden from the OpenAPI document. */
175
+ webhook?: Webhook | false | undefined
176
+ }
177
+
178
+ /** Verified-token feature configuration. */
179
+ type VerifiedTokens = {
180
+ /**
181
+ * Per-isolate soft-refresh window (ms). Lookups serve from the in-memory
182
+ * snapshot within it; after it, the next lookup re-checks the head version
183
+ * and recompiles only on change. Defaults to 10_000.
184
+ */
185
+ refreshMs?: number | undefined
186
+ }
187
+
188
+ /** Webhook feature configuration. */
189
+ type Webhook = {
190
+ /**
191
+ * Maximum active subscriptions per owner; creation is rejected with
192
+ * `403 limit_exceeded` once reached. Defaults to 100, bounding the spam/SSRF
193
+ * and delivery-cost surface per owner.
194
+ */
195
+ maxPerOwner?: number | undefined
196
+ }
197
+ }
198
+
199
+ /**
200
+ * The OpenAPI metadata this group owns: its operation tags and the outbound
201
+ * `webhooks` block. Tagged onto the {@link data} instance so `App.create`
202
+ * collects it; the webhooks block emits only when webhook routes are mounted.
203
+ */
204
+ const openapi = {
205
+ tags: [
206
+ { name: 'Activities', description: 'A readable feed of what an account did onchain.' },
207
+ { name: 'Balances', description: 'How much of each token an account holds.' },
208
+ { name: 'Blocks', description: 'The ordered batches of transactions making up the chain.' },
209
+ { name: 'Exchange', description: "Tempo's built-in stablecoin exchange: pairs, swaps, orders, prices." }, // prettier-ignore
210
+ { name: 'Fee AMM', description: 'Pools that convert stablecoins to pay fees.' },
211
+ { name: 'Funding', description: 'Routes and inventory for moving stablecoins into Tempo.' },
212
+ { name: 'Providers', description: 'Provider metadata, capabilities, and integration status.' },
213
+ { name: 'Tokens', description: 'TIP-20 token details, supply, and holders.' },
214
+ { name: 'Transactions', description: 'Transactions submitted to Tempo, and their receipts.' },
215
+ { name: 'Transfers', description: 'Token movements from executing transactions.' },
216
+ { name: 'Verified Tokens', description: 'A curated, trusted list of TIP-20 tokens.' },
217
+ { name: 'Webhooks', description: 'Get signed callbacks when onchain events happen.' },
218
+ { name: 'Indexer', description: "Run read-only SQL queries against Tempo's indexed data." },
219
+ { name: 'RPC', description: 'Direct access to the chain over Ethereum JSON-RPC. Not part of the stable API contract; best-effort support only. No compatibility, latency, availability, or data-freshness guarantees. Breaking changes may happen with limited notice.' }, // prettier-ignore
220
+ { name: 'CoinGecko', description: "Exchange data in CoinGecko's GeckoTerminal format." },
221
+ ],
222
+ 'x-tagGroups': [
223
+ {
224
+ name: 'Data API',
225
+ tags: [
226
+ 'Activities',
227
+ 'Balances',
228
+ 'Blocks',
229
+ 'Exchange',
230
+ 'Fee AMM',
231
+ 'Funding',
232
+ 'Providers',
233
+ 'Tokens',
234
+ 'Transactions',
235
+ 'Transfers',
236
+ 'Verified Tokens',
237
+ 'Webhooks',
238
+ 'Indexer',
239
+ 'RPC',
240
+ 'MCP',
241
+ 'CoinGecko',
242
+ ],
243
+ },
244
+ ],
245
+ webhooks: webhooksBlock,
246
+ } satisfies App.create.Metadata
247
+
248
+ // Builds the outbound-delivery `webhooks` block. `io: 'output'` documents the
249
+ // serialized shape; `unrepresentable: 'any'` emits `{}` for payload transforms
250
+ // (e.g. lazy fee-token metadata) that have no JSON-Schema form.
251
+ function webhooksBlock() {
252
+ const envelope = z.toJSONSchema(webhookSchema.Envelope, {
253
+ io: 'output',
254
+ target: 'draft-2020-12',
255
+ unrepresentable: 'any',
256
+ })
257
+ delete envelope.$schema
258
+ const header = (name: string, description: string) => ({
259
+ description,
260
+ in: 'header' as const,
261
+ name,
262
+ required: true,
263
+ schema: { type: 'string' as const },
264
+ })
265
+ return {
266
+ event: {
267
+ post: {
268
+ description:
269
+ 'When an event you subscribed to happens, Tempo sends this signed message to your webhook URL as an HTTP POST (the same shape is used by `POST /webhooks/:id/ping` so you can test your endpoint). Always verify the `tempo-signature` header before trusting the body, then reply with any 2xx status to confirm you received it. If your endpoint returns a non-2xx status, times out, or redirects, Tempo retries with increasing delays; an endpoint that keeps failing is eventually disabled.',
270
+ parameters: [
271
+ header(
272
+ 'tempo-signature',
273
+ 'Signature proving the message really came from Tempo. An HMAC-SHA256 of the body using your webhook secret, formatted `t=<unix>,v1=<hex>`. Verify this before trusting the payload.',
274
+ ),
275
+ header(
276
+ 'tempo-event-id',
277
+ 'A unique, stable id for this event (`evt_…`). The same event may be delivered more than once, so use this id to skip duplicates.',
278
+ ),
279
+ header('tempo-event-type', 'What happened: `token:transfer`, `transaction:included`, `log:emitted`, `block:created`, or `ping`.'), // prettier-ignore
280
+ ],
281
+ requestBody: {
282
+ content: { 'application/json': { schema: envelope } },
283
+ required: true,
284
+ },
285
+ responses: { '2xx': { description: 'Delivery acknowledged.' } },
286
+ summary: 'Webhook event delivery',
287
+ tags: ['Webhooks'],
288
+ },
289
+ },
290
+ }
291
+ }
292
+
293
+ // Builds the per-request static-asset resolver. The store is keyed by
294
+ // `:chainId/:path` (decoupled from the public `/assets/:chainId` URL) and
295
+ // returns absolute URLs against the request origin. Without a store, every
296
+ // lookup misses and callers fall back to undefined logo URIs.
297
+ function createGetAsset(options: createGetAsset.Options): App.GetAsset {
298
+ const { assets, basePath, origin } = options
299
+ if (!assets) return () => undefined
300
+ return async (chainId, path) => {
301
+ const pathname = Path.join(basePath, 'assets', String(chainId), path)
302
+ // `path` may be absolute (`Path.join` returns a leading slash); strip it so
303
+ // the key is `:chainId/:path`, not `:chainId//:path`.
304
+ const key = `${chainId}/${path.replace(/^\/+/, '')}`
305
+ const asset = await assets.get(key)
306
+ if (!asset) return undefined
307
+ return {
308
+ response: new globalThis.Response(asset.body, {
309
+ headers: { 'Content-Type': asset.contentType },
310
+ }),
311
+ uri: new URL(pathname, origin).toString(),
312
+ }
313
+ }
314
+ }
315
+
316
+ declare namespace createGetAsset {
317
+ type Options = {
318
+ assets?: Assets.Assets | undefined
319
+ basePath: string
320
+ origin: string
321
+ }
322
+ }
323
+
324
+ // Strips the (possibly base-path-prefixed) `/assets/` segment so the remainder
325
+ // is the store key path.
326
+ function stripAssetPath(path: string, basePath: string) {
327
+ for (const prefix of [`${Path.join(basePath, 'assets')}/`, '/assets/'])
328
+ if (path.startsWith(prefix)) return `/${path.slice(prefix.length)}`
329
+ return path
330
+ }
@@ -0,0 +1,2 @@
1
+ export { data } from './App.js'
2
+ export * as Sponsorships from '../relay/Sponsorships.js'
@@ -2,9 +2,9 @@ import { Address, Hex } from 'ox'
2
2
  import { encodeAbiParameters, encodeEventTopics } from 'viem'
3
3
  import { Abis } from 'viem/tempo'
4
4
 
5
- import * as TestApp from '../../test/App.js'
6
- import * as Runtime from '../../test/runtime.js'
7
- import * as Store from '../internal/Store.js'
5
+ import * as TestApp from '../../../../test/App.js'
6
+ import * as Runtime from '../../../../test/runtime.js'
7
+ import * as Store from '../../../internal/Store.js'
8
8
  import * as Activities from './activities.js'
9
9
 
10
10
  /**
@@ -4,19 +4,19 @@ import { type Log, parseEventLogs, zeroAddress } from 'viem'
4
4
  import { Abis, Addresses } from 'viem/tempo'
5
5
  import * as z from 'zod/mini'
6
6
 
7
- import type * as App from '../App.js'
8
- import * as Auth from '../internal/Auth.js'
9
- import * as Cache from '../internal/Cache.js'
10
- import * as Cursor from '../internal/Cursor.js'
11
- import * as Mpp from '../internal/Mpp.js'
12
- import * as OpenApi from '../internal/OpenApi.js'
13
- import * as Response from '../internal/Response.js'
14
- import * as Schema from '../internal/Schema.js'
15
- import * as Store from '../internal/Store.js'
16
- import type * as Tidx from '../internal/Tidx.js'
17
- import * as Timing from '../internal/Timing.js'
18
- import * as Ttl from '../internal/Ttl.js'
19
- import * as Value from '../internal/Value.js'
7
+ import type * as App from '../../../App.js'
8
+ import * as Auth from '../../../internal/Auth.js'
9
+ import * as Cache from '../../../internal/Cache.js'
10
+ import * as Cursor from '../../../internal/Cursor.js'
11
+ import * as Mpp from '../../../internal/Mpp.js'
12
+ import * as OpenApi from '../../../internal/OpenApi.js'
13
+ import * as Response from '../../../internal/Response.js'
14
+ import * as Schema from '../../../internal/Schema.js'
15
+ import * as Store from '../../../internal/Store.js'
16
+ import type * as Tidx from '../../../internal/Tidx.js'
17
+ import * as Timing from '../../../internal/Timing.js'
18
+ import * as Ttl from '../../../internal/Ttl.js'
19
+ import * as Value from '../../../internal/Value.js'
20
20
  import * as Tokens from './tokens.js'
21
21
  import * as Transfers from './transfers.js'
22
22
 
@@ -1667,7 +1667,7 @@ type TxGroup = {
1667
1667
  */
1668
1668
  export function addresses() {
1669
1669
  return new Hono<App.Environment>().get(
1670
- '/:address/activities',
1670
+ '/v1/addresses/:address/activities',
1671
1671
  Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
1672
1672
  OpenApi.validate('param', schema.getAddressActivities.Params, {
1673
1673
  code: 'address_invalid',
@@ -1775,7 +1775,7 @@ export function addresses() {
1775
1775
  */
1776
1776
  export function transactions() {
1777
1777
  return new Hono<App.Environment>().get(
1778
- '/:transactionHash/activities',
1778
+ '/v1/transactions/:transactionHash/activities',
1779
1779
  Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
1780
1780
  OpenApi.validate('param', schema.getTransactionActivities.Params, {
1781
1781
  code: 'transaction_invalid',
@@ -1,15 +1,15 @@
1
1
  import { Hono } from 'hono'
2
2
 
3
- import type * as App from '../App.js'
3
+ import type * as App from '../../../App.js'
4
4
  import * as Activities from './activities.js'
5
5
  import * as Balances from './balances.js'
6
6
 
7
7
  /**
8
- * Composes the `/addresses/:address/*` route surface from the address-scoped
9
- * sub-routers exported by each resource module. The handlers and schemas live
10
- * with the resource they describe (activities, balances); this composer only
11
- * owns the `/addresses` mount path so docs grouping stays by tag while URLs
12
- * stay nested under the parent resource.
8
+ * Composes the `/v1/addresses/:address/*` route surface from the
9
+ * address-scoped sub-routers exported by each resource module. The handlers,
10
+ * schemas, and paths live with the resource they describe (activities,
11
+ * balances); this composer only aggregates them so docs grouping stays by tag
12
+ * while URLs stay nested under the parent resource.
13
13
  *
14
14
  * Only subject-relative resources live here — rows that cannot be interpreted
15
15
  * without the path address (activity classification, held-token balances).
@@ -1,8 +1,8 @@
1
1
  import { Schema } from 'tapimo'
2
2
  import { Value as core_Value } from 'ox'
3
3
 
4
- import * as TestApp from '../../test/App.js'
5
- import * as Runtime from '../../test/runtime.js'
4
+ import * as TestApp from '../../../../test/App.js'
5
+ import * as Runtime from '../../../../test/runtime.js'
6
6
  import * as Balances from './balances.js'
7
7
  import * as Tokens from './tokens.js'
8
8
 
@@ -1,17 +1,18 @@
1
1
  import { Hono, type Context } from 'hono'
2
2
  import { Hex, Value as core_Value } from 'ox'
3
+ import { Actions } from 'viem/tempo'
3
4
  import * as z from 'zod/mini'
4
5
 
5
- import type * as App from '../App.js'
6
- import * as Auth from '../internal/Auth.js'
7
- import * as Cache from '../internal/Cache.js'
8
- import * as Cursor from '../internal/Cursor.js'
9
- import * as OpenApi from '../internal/OpenApi.js'
10
- import * as Response from '../internal/Response.js'
11
- import * as Schema from '../internal/Schema.js'
12
- import * as Timing from '../internal/Timing.js'
13
- import * as Value from '../internal/Value.js'
14
- import * as VerifiedTokens from '../internal/VerifiedTokens.js'
6
+ import type * as App from '../../../App.js'
7
+ import * as Auth from '../../../internal/Auth.js'
8
+ import * as Cache from '../../../internal/Cache.js'
9
+ import * as Cursor from '../../../internal/Cursor.js'
10
+ import * as OpenApi from '../../../internal/OpenApi.js'
11
+ import * as Response from '../../../internal/Response.js'
12
+ import * as Schema from '../../../internal/Schema.js'
13
+ import * as Timing from '../../../internal/Timing.js'
14
+ import * as Value from '../../../internal/Value.js'
15
+ import * as VerifiedTokens from '../../../internal/VerifiedTokens.js'
15
16
  import * as FeeAmm from './fee-amm.js'
16
17
  import * as Tokens from './tokens.js'
17
18
 
@@ -150,7 +151,7 @@ export namespace schema {
150
151
  */
151
152
  export function addresses() {
152
153
  return new Hono<App.Environment>().get(
153
- '/:address/balances',
154
+ '/v1/addresses/:address/balances',
154
155
  Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
155
156
  OpenApi.validate('param', schema.getAddressBalances.Params, {
156
157
  code: 'address_invalid',
@@ -353,6 +354,39 @@ async function getAddressBalances(
353
354
 
354
355
  if (holdings.data.length === 0) return { data: [], nextCursor: holdings.nextCursor }
355
356
 
357
+ const client = c.get('getClient')(chainId)
358
+ // TODO: remove once https://github.com/tempoxyz/tidx/commit/2f37b44172d381fd00234ef23f79ed1e1d69c470 deployed.
359
+ const corrected = await Timing.time(c, 'balances_rpc', async () => {
360
+ const results = await client
361
+ .multicall({
362
+ allowFailure: true,
363
+ contracts: holdings.data.map((holding) =>
364
+ Actions.token.getBalance.call(client, { account: address, token: holding.address }),
365
+ ),
366
+ })
367
+ .catch(() => undefined)
368
+
369
+ const rows: { address: Hex.Hex; amount: string }[] = []
370
+ for (const [index, holding] of holdings.data.entries()) {
371
+ const result = results?.[index]
372
+ if (!result || result.status !== 'success' || typeof result.result !== 'bigint') {
373
+ rows.push(holding)
374
+ continue
375
+ }
376
+ if (result.result === 0n) continue
377
+ rows.push({ address: holding.address, amount: result.result.toString() })
378
+ }
379
+
380
+ rows.sort((a, b) => {
381
+ const delta = BigInt(b.amount) - BigInt(a.amount)
382
+ if (delta !== 0n) return delta > 0n ? 1 : -1
383
+ return a.address < b.address ? -1 : a.address > b.address ? 1 : 0
384
+ })
385
+ return rows
386
+ })
387
+
388
+ if (corrected.length === 0) return { data: [], nextCursor: holdings.nextCursor }
389
+
356
390
  // Resolve token metadata for each balance. The endpoint's contract is a
357
391
  // balance with its `token` reference inlined per row (and `formatted` needs
358
392
  // the token `decimals`), so a row whose metadata cannot be resolved is
@@ -365,7 +399,7 @@ async function getAddressBalances(
365
399
  // so it is never fetched here.
366
400
  const resolved = await Timing.time(c, 'tokens', () =>
367
401
  Promise.all(
368
- holdings.data.map((holding) =>
402
+ corrected.map((holding) =>
369
403
  Tokens.resolveToken(c, {
370
404
  address: holding.address,
371
405
  chainId,
@@ -2,9 +2,9 @@ import { Schema } from 'tapimo'
2
2
  import { Hex } from 'ox'
3
3
  import { zeroHash } from 'viem'
4
4
 
5
- import * as TestApp from '../../test/App.js'
6
- import * as Runtime from '../../test/runtime.js'
7
- import * as Viem from '../../test/Viem.js'
5
+ import * as TestApp from '../../../../test/App.js'
6
+ import * as Runtime from '../../../../test/runtime.js'
7
+ import * as Viem from '../../../../test/Viem.js'
8
8
  import * as Blocks from './blocks.js'
9
9
  import * as Transactions from './transactions.js'
10
10
 
@@ -2,17 +2,17 @@ import { Hono, type Context, type MiddlewareHandler } from 'hono'
2
2
  import { Hex } from 'ox'
3
3
  import * as z from 'zod/mini'
4
4
 
5
- import type * as App from '../App.js'
6
- import * as Auth from '../internal/Auth.js'
7
- import * as Cache from '../internal/Cache.js'
8
- import * as Cursor from '../internal/Cursor.js'
9
- import * as OpenApi from '../internal/OpenApi.js'
10
- import * as Response from '../internal/Response.js'
11
- import * as Schema from '../internal/Schema.js'
12
- import * as Store from '../internal/Store.js'
13
- import * as Timing from '../internal/Timing.js'
14
- import * as Ttl from '../internal/Ttl.js'
15
- import * as Value from '../internal/Value.js'
5
+ import type * as App from '../../../App.js'
6
+ import * as Auth from '../../../internal/Auth.js'
7
+ import * as Cache from '../../../internal/Cache.js'
8
+ import * as Cursor from '../../../internal/Cursor.js'
9
+ import * as OpenApi from '../../../internal/OpenApi.js'
10
+ import * as Response from '../../../internal/Response.js'
11
+ import * as Schema from '../../../internal/Schema.js'
12
+ import * as Store from '../../../internal/Store.js'
13
+ import * as Timing from '../../../internal/Timing.js'
14
+ import * as Ttl from '../../../internal/Ttl.js'
15
+ import * as Value from '../../../internal/Value.js'
16
16
 
17
17
  /** Example block number surfaced in OpenAPI docs. */
18
18
  const exampleBlockNumber = '1000000'
@@ -382,7 +382,7 @@ export function blocks() {
382
382
 
383
383
  return new Hono<App.Environment>()
384
384
  .get(
385
- '/',
385
+ '/v1/blocks',
386
386
  Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
387
387
  OpenApi.validate('query', schema.getBlocks.Query, {
388
388
  code: 'query_invalid',
@@ -425,7 +425,7 @@ export function blocks() {
425
425
  },
426
426
  )
427
427
  .get(
428
- '/:block',
428
+ '/v1/blocks/:block',
429
429
  Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
430
430
  OpenApi.validate('param', schema.getBlock.Params, {
431
431
  code: 'block_invalid',
@@ -590,7 +590,7 @@ export function blocks() {
590
590
  */
591
591
  export function blocksByTimestampCompat() {
592
592
  return new Hono<App.Environment>().get(
593
- '/:chainId/blocks/by-timestamp',
593
+ '/chains/:chainId/blocks/by-timestamp',
594
594
  Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
595
595
  OpenApi.validate('param', schema.getBlockByTimestamp.Params, {
596
596
  code: 'chain_id_invalid',
@@ -1,7 +1,7 @@
1
1
  import { Address, Hash } from 'ox'
2
2
 
3
- import * as TestApp from '../../test/App.js'
4
- import * as Runtime from '../../test/runtime.js'
3
+ import * as TestApp from '../../../../test/App.js'
4
+ import * as Runtime from '../../../../test/runtime.js'
5
5
  import * as Coingecko from './coingecko.js'
6
6
 
7
7
  // The adapter addresses the chain positionally, mirroring the legacy `/gecko`