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
@@ -21,7 +21,7 @@ import * as Receipts from './receipts.js'
21
21
  import * as Transactions from './transactions.js'
22
22
  import * as Transfers from './transfers.js'
23
23
 
24
- /** Default cap on active subscriptions per owner, overridable via `webhook.maxPerOwner`. */
24
+ /** Default cap on live subscriptions per owner, overridable via `webhook.maxPerOwner`. */
25
25
  const defaultMaxPerOwner = 100
26
26
 
27
27
  /**
@@ -1317,10 +1317,13 @@ export function webhooks(options: webhooks.Options = {}) {
1317
1317
  responses: OpenApi.responses({
1318
1318
  errors: {
1319
1319
  400: {
1320
- codes: ['chain_id_unsupported'],
1321
- description: 'Webhook subscriptions do not support Zone chains.',
1320
+ codes: ['body_invalid', 'chain_id_unsupported', 'filters_invalid', 'url_invalid'],
1321
+ description: 'The request, destination, filters, or chain are invalid.',
1322
+ },
1323
+ 403: {
1324
+ codes: ['limit_exceeded'],
1325
+ description: 'You have reached the webhook subscription limit.',
1322
1326
  },
1323
- 403: 'You have reached the webhook subscription limit.',
1324
1327
  },
1325
1328
  success: {
1326
1329
  description:
@@ -1347,12 +1350,9 @@ export function webhooks(options: webhooks.Options = {}) {
1347
1350
 
1348
1351
  const body = c.req.valid('json')
1349
1352
  const chainId = body.chainId ?? c.get('chainId')
1350
- if (c.get('zones').has(chainId))
1351
- return Response.error(c, {
1352
- code: 'chain_id_unsupported',
1353
- message: 'Webhook subscriptions do not support Zone chains.',
1354
- status: 400,
1355
- })
1353
+ const supportedChainIds = new Set(webhook.supportedChainIds)
1354
+ if (!supportedChainIds.has(chainId))
1355
+ return Response.unsupportedChainId(c, chainId, supportedChainIds)
1356
1356
 
1357
1357
  try {
1358
1358
  const subscription = await Webhooks.createSubscription(
@@ -1373,7 +1373,7 @@ export function webhooks(options: webhooks.Options = {}) {
1373
1373
  200,
1374
1374
  )
1375
1375
  } catch (cause) {
1376
- return mutationError(c, cause)
1376
+ return createMutationError(c, cause)
1377
1377
  }
1378
1378
  },
1379
1379
  )
@@ -1747,6 +1747,16 @@ export function webhooks(options: webhooks.Options = {}) {
1747
1747
  operationId: 'updateWebhook',
1748
1748
  responses: OpenApi.responses({
1749
1749
  errors: {
1750
+ 400: {
1751
+ codes: [
1752
+ 'body_invalid',
1753
+ 'destination_transition_invalid',
1754
+ 'filters_invalid',
1755
+ 'param_invalid',
1756
+ 'url_invalid',
1757
+ ],
1758
+ description: 'The update, destination, or filters are invalid.',
1759
+ },
1750
1760
  404: {
1751
1761
  description: 'No webhook subscription was found for that ID.',
1752
1762
  codes: ['webhook_not_found'],
@@ -1798,7 +1808,7 @@ export function webhooks(options: webhooks.Options = {}) {
1798
1808
  200,
1799
1809
  )
1800
1810
  } catch (cause) {
1801
- return mutationError(c, cause)
1811
+ return updateMutationError(c, cause)
1802
1812
  }
1803
1813
  },
1804
1814
  )
@@ -1987,13 +1997,14 @@ export async function poll(options: poll.Options): Promise<poll.Result> {
1987
1997
  let accepted: readonly [number, number] | undefined
1988
1998
  let failed = false
1989
1999
  for (const item of page.items) {
1990
- // Enrich `token:transfer` rows with best-effort token metadata so
1991
- // downstream destinations (Slack human amounts, richer `url`/`betterstack`
1992
- // payloads) can render `amount` in token units. Non-fatal on failure.
2000
+ // Token metadata is best-effort for webhooks: transfers use it for display,
2001
+ // while transactions expose fee-token references without blocking delivery.
1993
2002
  const data =
1994
2003
  eventType === 'token:transfer'
1995
2004
  ? await withTokenMetadata(item.data, { cache: cache_metadata, chainId, client })
1996
- : item.data
2005
+ : eventType === 'transaction:included'
2006
+ ? await withFeeTokenMetadata(item.data, { cache: cache_metadata, chainId, client })
2007
+ : item.data
1997
2008
  const envelope = Webhooks.buildEnvelope({
1998
2009
  blockNumber: item.cursor[0],
1999
2010
  createdAt: now(),
@@ -2106,27 +2117,45 @@ async function withTokenMetadata(
2106
2117
  const address = (data as Record<string, unknown>)['address']
2107
2118
  if (typeof address !== 'string') return data
2108
2119
  const token = await resolveTokenMetadata(address, deps)
2109
- return token ? { ...(data as Record<string, unknown>), token } : data
2120
+ return token
2121
+ ? {
2122
+ ...(data as Record<string, unknown>),
2123
+ token: { decimals: token.decimals, symbol: token.symbol },
2124
+ }
2125
+ : data
2126
+ }
2127
+
2128
+ /** Core RPC metadata needed by a humanized token reference. */
2129
+ type TokenMetadata = {
2130
+ currency: string
2131
+ decimals: number
2132
+ name: string
2133
+ symbol: string
2110
2134
  }
2111
2135
 
2112
2136
  /**
2113
- * Resolves a token's `{ symbol, decimals }` via `token.getMetadata`, memoized per
2137
+ * Resolves core token metadata via `token.getMetadata`, memoized per
2114
2138
  * `(chainId, address)` with a short TTL so a busy transfer stream shares one RPC
2115
- * lookup per token. Returns `undefined` on any failure metadata is a rendering
2139
+ * lookup per token. Returns `undefined` on any failure; metadata is a rendering
2116
2140
  * nicety, never a delivery blocker.
2117
2141
  */
2118
2142
  async function resolveTokenMetadata(
2119
2143
  address: string,
2120
2144
  deps: { cache: Store.Store; chainId: number; client: Viem.getClient.ReturnType },
2121
- ): Promise<{ decimals: number; symbol: string } | undefined> {
2145
+ ): Promise<TokenMetadata | undefined> {
2122
2146
  try {
2123
2147
  return await Store.memoize(
2124
2148
  async () => {
2125
2149
  const meta = await deps.client.token.getMetadata({ token: address as `0x${string}` })
2126
- return { decimals: meta.decimals, symbol: meta.symbol }
2150
+ return {
2151
+ currency: meta.currency,
2152
+ decimals: meta.decimals,
2153
+ name: meta.name,
2154
+ symbol: meta.symbol,
2155
+ }
2127
2156
  },
2128
2157
  {
2129
- key: `webhook:token-meta:v1:${deps.chainId}:${address}`,
2158
+ key: `webhook:token-meta:v2:${deps.chainId}:${address}`,
2130
2159
  store: deps.cache,
2131
2160
  ttl: Ttl.minutes(5),
2132
2161
  },
@@ -2137,6 +2166,69 @@ async function resolveTokenMetadata(
2137
2166
  }
2138
2167
  }
2139
2168
 
2169
+ /** Returns the address from an unenriched or enriched fee-token value. */
2170
+ function feeTokenAddress(value: unknown) {
2171
+ if (typeof value === 'string') return value
2172
+ if (typeof value !== 'object' || value === null) return undefined
2173
+ const address = (value as Record<string, unknown>)['address']
2174
+ return typeof address === 'string' ? address : undefined
2175
+ }
2176
+
2177
+ /** Replaces an address-valued fee token with its resolved reference, or omits it on failure. */
2178
+ function withResolvedFeeToken(data: Record<string, unknown>, metadata: Map<string, TokenMetadata>) {
2179
+ const address = feeTokenAddress(data['feeToken'])
2180
+ if (!address) return data
2181
+ const result = { ...data }
2182
+ delete result['feeToken']
2183
+ const token = metadata.get(address.toLowerCase())
2184
+ if (token) result['feeToken'] = { address, ...token }
2185
+ return result
2186
+ }
2187
+
2188
+ /** Adds best-effort fee-token references to a transaction and its embedded receipt. */
2189
+ async function withFeeTokenMetadata(
2190
+ data: unknown,
2191
+ deps: {
2192
+ cache: Store.Store
2193
+ chainId: number
2194
+ client: Viem.getClient.ReturnType
2195
+ },
2196
+ ): Promise<unknown> {
2197
+ if (typeof data !== 'object' || data === null) return data
2198
+ const transaction = data as Record<string, unknown>
2199
+ const meta = transaction['meta']
2200
+ const receipt =
2201
+ typeof meta === 'object' && meta !== null
2202
+ ? (meta as Record<string, unknown>)['receipt']
2203
+ : undefined
2204
+ const addresses = new Set<string>()
2205
+ const transactionAddress = feeTokenAddress(transaction['feeToken'])
2206
+ if (transactionAddress) addresses.add(transactionAddress.toLowerCase())
2207
+ if (typeof receipt === 'object' && receipt !== null) {
2208
+ const receiptAddress = feeTokenAddress((receipt as Record<string, unknown>)['feeToken'])
2209
+ if (receiptAddress) addresses.add(receiptAddress.toLowerCase())
2210
+ }
2211
+ if (addresses.size === 0) return data
2212
+
2213
+ const resolved = await Promise.all(
2214
+ [...addresses].map(
2215
+ async (address) => [address, await resolveTokenMetadata(address, deps)] as const,
2216
+ ),
2217
+ )
2218
+ const metadata = new Map(
2219
+ resolved.filter((entry): entry is readonly [string, TokenMetadata] => entry[1] !== undefined),
2220
+ )
2221
+ const result = withResolvedFeeToken(transaction, metadata)
2222
+ if (typeof receipt !== 'object' || receipt === null) return result
2223
+ return {
2224
+ ...result,
2225
+ meta: {
2226
+ ...(meta as Record<string, unknown>),
2227
+ receipt: withResolvedFeeToken(receipt as Record<string, unknown>, metadata),
2228
+ },
2229
+ }
2230
+ }
2231
+
2140
2232
  /** Returns the live RPC head block number for the chain. */
2141
2233
  export async function getRpcHead(client: Viem.getClient.ReturnType): Promise<number> {
2142
2234
  return Number(await client.getBlockNumber())
@@ -2883,8 +2975,8 @@ const txFields = {
2883
2975
  * Scans included transactions over the confirmed window. Each block is fetched
2884
2976
  * with full transactions via `eth_getBlockByNumber(n, true)`; receipts are
2885
2977
  * fetched lazily (only when a `status`/`gasUsed`/`feePayer` filter needs them).
2886
- * The delivered payload reuses `Transactions.humanizeTransaction`, so it is
2887
- * byte-identical to the read endpoint.
2978
+ * The delivered payload starts from `Transactions.humanizeTransaction`; the
2979
+ * poller then resolves its fee-token references.
2888
2980
  */
2889
2981
  async function scanTxs(options: {
2890
2982
  cache: ChainCache
@@ -2921,13 +3013,19 @@ async function scanTxs(options: {
2921
3013
  if (!matchesTx(tx, f, includeCalls, receipt, timestamp, n)) continue
2922
3014
  const parsed = Transactions.schema.Rpc.Transaction.safeParse(tx)
2923
3015
  if (!parsed.success) continue
2924
- let data = Transactions.humanizeTransaction(parsed.data)
3016
+ let data: Record<string, unknown> = Transactions.humanizeTransaction(parsed.data)
2925
3017
  // Embed the humanized receipt under `meta.receipt`, matching the read
2926
3018
  // endpoint's `include=receipt` shape so `data` stays a valid envelope.
2927
3019
  if (includeReceipt && receipt) {
2928
3020
  const r = Receipts.schema.Rpc.Receipt.safeParse(receipt)
2929
3021
  if (r.success)
2930
- data = { ...data, meta: { ...data.meta, receipt: Receipts.humanizeReceipt(r.data) } }
3022
+ data = {
3023
+ ...data,
3024
+ meta: {
3025
+ ...(data['meta'] as Record<string, unknown>),
3026
+ receipt: Receipts.humanizeReceipt(r.data),
3027
+ },
3028
+ }
2931
3029
  }
2932
3030
  items.push({ cursor: [n, index], data })
2933
3031
  }
@@ -3040,7 +3138,7 @@ function redactDestination(destination: WebhookDestination.Destination) {
3040
3138
  return destination
3041
3139
  }
3042
3140
 
3043
- function mutationError(c: Context<App.Environment>, cause: unknown) {
3141
+ function createMutationError(c: Context<App.Environment>, cause: unknown) {
3044
3142
  if (cause instanceof Webhooks.InvalidUrlError)
3045
3143
  return Response.error(c, { code: 'url_invalid', message: cause.message, status: 400 })
3046
3144
  if (cause instanceof Webhooks.InvalidFilterError)
@@ -3055,6 +3153,25 @@ function mutationError(c: Context<App.Environment>, cause: unknown) {
3055
3153
  return Response.upstream(c, cause)
3056
3154
  }
3057
3155
 
3156
+ function updateMutationError(c: Context<App.Environment>, cause: unknown) {
3157
+ if (cause instanceof Webhooks.InvalidDestinationTransitionError)
3158
+ return Response.error(c, {
3159
+ code: 'destination_transition_invalid',
3160
+ message: cause.message,
3161
+ status: 400,
3162
+ })
3163
+ if (cause instanceof Webhooks.InvalidUrlError)
3164
+ return Response.error(c, { code: 'url_invalid', message: cause.message, status: 400 })
3165
+ if (cause instanceof Webhooks.InvalidFilterError)
3166
+ return Response.error(c, {
3167
+ code: 'filters_invalid',
3168
+ details: cause.details,
3169
+ message: cause.message,
3170
+ status: 400,
3171
+ })
3172
+ return Response.upstream(c, cause)
3173
+ }
3174
+
3058
3175
  function notFound(c: Context<App.Environment>) {
3059
3176
  return Response.error(c, {
3060
3177
  code: 'webhook_not_found',
package/src/apps/index.ts CHANGED
@@ -1,4 +1,5 @@
1
- export { data, FundingQuoteProviders } from './data/index.js'
1
+ export { data, FundingQuoteProviders, FxOracle } from './data/index.js'
2
2
  export { management } from './management/index.js'
3
3
  export { mcp } from './mcp.js'
4
+ export { mpp } from './mpp/index.js'
4
5
  export { relay } from './relay/index.js'
@@ -6,6 +6,7 @@ import * as Metadata from '../metadata.js'
6
6
 
7
7
  import { apiKeys } from './routes/api-keys.js'
8
8
  import { billing } from './routes/billing.js'
9
+ import { faucet } from './routes/faucet.js'
9
10
  import { invitations } from './routes/invitations.js'
10
11
  import { inviteLinks } from './routes/invite-links.js'
11
12
  import { me } from './routes/me.js'
@@ -14,6 +15,8 @@ import { orgs } from './routes/orgs.js'
14
15
  import { projects } from './routes/projects.js'
15
16
  import { scopes } from './routes/scopes.js'
16
17
  import { usage } from './routes/usage.js'
18
+ import { verifiedTokenRequests } from './routes/verified-token-requests.js'
19
+ import { webhooks } from './routes/webhooks.js'
17
20
 
18
21
  /**
19
22
  * Minimal transactional email sender. Cloudflare deployments wrap the Email
@@ -105,6 +108,7 @@ export function management(options: management.Options = {}) {
105
108
  })
106
109
  .route('/', apiKeys({ enabled: options.apiKeys !== false }))
107
110
  .route('/', billing())
111
+ .route('/', faucet())
108
112
  .route('/', invitations())
109
113
  .route('/', inviteLinks())
110
114
  .route('/', me())
@@ -113,6 +117,8 @@ export function management(options: management.Options = {}) {
113
117
  .route('/', projects())
114
118
  .route('/', scopes())
115
119
  .route('/', usage())
120
+ .route('/', verifiedTokenRequests())
121
+ .route('/', webhooks({ webhook: options.webhook === false ? undefined : options.webhook }))
116
122
  return Metadata.attach(app, openapi)
117
123
  }
118
124
 
@@ -125,6 +131,8 @@ export declare namespace management {
125
131
  billing?: Billing | undefined
126
132
  /** Transactional email sender for management emails (e.g. invitations); omit to disable dispatch — notified flows still work in-product. */
127
133
  email?: Email | undefined
134
+ /** Webhook capability shared with the data group and host poller; omit or pass false to disable management. */
135
+ webhook?: App.Webhook | false | undefined
128
136
  }
129
137
  }
130
138
 
@@ -145,6 +153,7 @@ const openapi = {
145
153
  tags: [
146
154
  { name: 'API Keys', description: 'Credentials for accessing the Tempo API.' },
147
155
  { name: 'Billing', description: 'Organization billing backed by Stripe.' },
156
+ { name: 'Faucet', description: 'Test token funding for Tempo testnet accounts.' },
148
157
  { name: 'Invitations', description: 'Pending organization invitations.' },
149
158
  { name: 'Invite Links', description: 'Reusable organization invite links.' },
150
159
  { name: 'Members', description: 'Organization team membership.' },
@@ -152,6 +161,8 @@ const openapi = {
152
161
  { name: 'Projects', description: 'Application workspaces within an organization.' },
153
162
  { name: 'Usage', description: 'Request and sponsorship usage for organizations.' },
154
163
  { name: 'Users', description: 'Users on the Tempo Platform.' },
164
+ { name: 'Verified Token Requests', description: 'Organization requests to add tokens to the curated verified list.' }, // prettier-ignore
165
+ { name: 'Webhooks', description: 'Organization webhook subscriptions.' },
155
166
  ],
156
167
  'x-tagGroups': [
157
168
  {
@@ -167,6 +178,8 @@ const openapi = {
167
178
  'Projects',
168
179
  'Usage',
169
180
  'Users',
181
+ 'Verified Token Requests',
182
+ 'Webhooks',
170
183
  ],
171
184
  },
172
185
  ],
@@ -671,3 +671,17 @@ describe('keys', () => {
671
671
  expect(response.status).toBe(403)
672
672
  })
673
673
  })
674
+
675
+ describe('early access', () => {
676
+ test('does not require an early-access grant', async () => {
677
+ const app = createApp()
678
+ const cookie = await session(app)
679
+ const { org, project } = await fixture(app, cookie)
680
+
681
+ const minted = await app.request(
682
+ `/v1/orgs/${org.id}/projects/${project.id}/api-keys`,
683
+ json('POST', cookie, { scopes: ['data:read'] }),
684
+ )
685
+ expect(minted.status).toBe(200)
686
+ })
687
+ })
@@ -1,6 +1,8 @@
1
1
  import { type Context, Hono } from 'hono'
2
2
  import * as z from 'zod/mini'
3
3
 
4
+ import * as Analytics from '../../../analytics/Analytics.js'
5
+ import * as RequestEvents from '../../../analytics/tables/requestEvents.js'
4
6
  import * as ApiKeys from '../../../ApiKeys.js'
5
7
  import type * as App from '../../../App.js'
6
8
  import * as Db from '../../../db/Db.js'
@@ -43,6 +45,12 @@ export namespace schema {
43
45
  z.describe('Opaque key id (`key_…`).'),
44
46
  z.meta({ examples: ['key_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
45
47
  ),
48
+ lastUsedAt: z
49
+ .optional(z.string())
50
+ .check(
51
+ z.describe('When the key last authenticated a request (ISO 8601).'),
52
+ z.meta({ examples: ['2026-07-21T12:34:56.000Z'] }),
53
+ ),
46
54
  name: z
47
55
  .optional(z.string())
48
56
  .check(z.describe('Human-readable key name.'), z.meta({ examples: ['CI'] })),
@@ -374,7 +382,7 @@ export function apiKeys(options: apiKeys.Options = {}) {
374
382
  })
375
383
  return c.json(
376
384
  Response.validated(schema.listApiKeys.Response, {
377
- data: records.map(serializeKey),
385
+ data: await serializeKeys(c, records),
378
386
  }),
379
387
  200,
380
388
  )
@@ -435,7 +443,7 @@ export function apiKeys(options: apiKeys.Options = {}) {
435
443
  })
436
444
  return c.json(
437
445
  Response.validated(schema.listOrgApiKeys.Response, {
438
- data: records.map(serializeKey),
446
+ data: await serializeKeys(c, records),
439
447
  }),
440
448
  200,
441
449
  )
@@ -505,14 +513,30 @@ export declare namespace apiKeys {
505
513
  }
506
514
  }
507
515
 
516
+ /** Enriches key records with their latest authenticated request timestamp. */
517
+ async function serializeKeys(c: Context<App.Environment>, records: readonly ApiKeys.Record[]) {
518
+ const source = c.get('analytics')
519
+ if (!source || records.length === 0) return records.map((record) => serializeKey(record))
520
+ const lastUsedAt = new Map(
521
+ (
522
+ await RequestEvents.readLastUsedAt(
523
+ Analytics.get(source),
524
+ records.map(({ id }) => id),
525
+ )
526
+ ).map((usage) => [usage.apiKeyId, usage.lastUsedAt]),
527
+ )
528
+ return records.map((record) => serializeKey(record, lastUsedAt.get(record.id)))
529
+ }
530
+
508
531
  /** Projects a persisted record onto the management key shape (no rate limits, no token). */
509
- function serializeKey(record: ApiKeys.Record) {
532
+ function serializeKey(record: ApiKeys.Record, lastUsedAt?: string) {
510
533
  return {
511
534
  createdAt: record.createdAt,
512
535
  ...(record.createdBy === undefined ? {} : { createdBy: record.createdBy }),
513
536
  environment: record.environment,
514
537
  ...(record.expiresAt === undefined ? {} : { expiresAt: record.expiresAt }),
515
538
  id: record.id,
539
+ ...(lastUsedAt === undefined ? {} : { lastUsedAt }),
516
540
  ...(record.name === undefined ? {} : { name: record.name }),
517
541
  orgId: record.orgId,
518
542
  ...(record.projectId === undefined ? {} : { projectId: record.projectId }),