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
@@ -6,6 +6,7 @@ import * as ApiKeys from '../../ApiKeys.js'
6
6
  import * as core_Billing from '../../apps/management/Billing.js'
7
7
  import * as BillingSettings from '../../db/tables/billingSettings.js'
8
8
  import * as Db from '../../db/Db.js'
9
+ import * as EnabledBillingSources from '../../db/tables/enabledBillingSources.js'
9
10
  import * as Memberships from '../../db/tables/memberships.js'
10
11
  import * as Organizations from '../../db/tables/organizations.js'
11
12
  import * as Projects from '../../db/tables/projects.js'
@@ -26,6 +27,21 @@ export namespace schema {
26
27
  .string()
27
28
  .check(z.describe('An ISO 8601 timestamp.'), z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }))
28
29
 
30
+ const enabledBillingSources = z
31
+ .array(z.enum(EnabledBillingSources.sources))
32
+ .check(
33
+ z.describe('Billing-source types available for new setup.'),
34
+ z.meta({ examples: [['stripe', 'tempo']] }),
35
+ )
36
+
37
+ const organizationId = z
38
+ .string()
39
+ .check(
40
+ z.minLength(1),
41
+ z.describe('Stable organization id.'),
42
+ z.meta({ examples: ['org_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
43
+ )
44
+
29
45
  const Organization = Schema.describe(
30
46
  z.object({
31
47
  createdAt: timestamp,
@@ -118,13 +134,7 @@ export namespace schema {
118
134
  /** Path parameters identifying an organization. */
119
135
  export const Params = z
120
136
  .object({
121
- orgId: z
122
- .string()
123
- .check(
124
- z.minLength(1),
125
- z.describe('Stable organization id.'),
126
- z.meta({ examples: ['org_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
127
- ),
137
+ orgId: organizationId,
128
138
  })
129
139
  .check(z.describe('Path parameters for one organization.'))
130
140
 
@@ -252,29 +262,58 @@ export namespace schema {
252
262
  /** Detailed organization lookup response. */
253
263
  export const Response = Schema.describe(
254
264
  z.extend(listOrganizations.OrganizationSummary, {
255
- billing: z.object({ production: Billing, sandbox: Billing }).check(
256
- z.describe('Billing state split by environment.'),
257
- z.meta({
258
- examples: [
259
- {
260
- production: {
261
- settings: null,
262
- source: {
263
- status: 'active',
264
- stripeCustomerId: 'cus_abc123',
265
- updatedAt: '2026-01-01T00:00:00.000Z',
265
+ billing: z
266
+ .object({
267
+ enabledSources: enabledBillingSources,
268
+ production: Billing,
269
+ sandbox: Billing,
270
+ })
271
+ .check(
272
+ z.describe('Organization-wide availability and environment billing state.'),
273
+ z.meta({
274
+ examples: [
275
+ {
276
+ enabledSources: ['stripe', 'tempo'],
277
+ production: {
278
+ settings: null,
279
+ source: {
280
+ status: 'active',
281
+ stripeCustomerId: 'cus_abc123',
282
+ updatedAt: '2026-01-01T00:00:00.000Z',
283
+ },
266
284
  },
285
+ sandbox: { settings: null, source: null },
267
286
  },
268
- sandbox: { settings: null, source: null },
269
- },
270
- ],
271
- }),
272
- ),
287
+ ],
288
+ }),
289
+ ),
273
290
  }),
274
291
  'Detailed organization information for administrators.',
275
292
  )
276
293
  }
277
294
 
295
+ /** Schemas for the setBillingSource operation. */
296
+ export namespace setBillingSource {
297
+ /** Path parameters identifying an organization billing source. */
298
+ export const Params = z
299
+ .object({
300
+ orgId: organizationId,
301
+ source: z
302
+ .enum(EnabledBillingSources.sources)
303
+ .check(
304
+ z.describe('Billing-source type to enable or disable.'),
305
+ z.meta({ examples: ['stripe'] }),
306
+ ),
307
+ })
308
+ .check(z.describe('Path parameters for one organization billing source.'))
309
+
310
+ /** Current enabled billing sources. */
311
+ export const Response = Schema.describe(
312
+ z.object({ data: enabledBillingSources }),
313
+ 'Current enabled billing sources for the organization.',
314
+ )
315
+ }
316
+
278
317
  /** Schemas for the listOrganizationMembers operation. */
279
318
  export namespace listOrganizationMembers {
280
319
  /** Query parameters for paginating organization members. */
@@ -502,7 +541,7 @@ export namespace schema {
502
541
  }
503
542
  }
504
543
 
505
- /** Read-only organization lookup routes for administrators. */
544
+ /** Organization lookup and support routes for administrators. */
506
545
  export function organizations() {
507
546
  return new Hono<App.Environment>()
508
547
  .get(
@@ -576,17 +615,24 @@ export function organizations() {
576
615
  const organization = await Organizations.getSummary(db, orgId)
577
616
  if (!organization) return organizationNotFound(c)
578
617
 
579
- const [productionSettings, productionSource, sandboxSettings, sandboxSource] =
580
- await Promise.all([
581
- BillingSettings.get(db, orgId, 'production'),
582
- StripeCustomers.get(db, orgId, 'production'),
583
- BillingSettings.get(db, orgId, 'sandbox'),
584
- StripeCustomers.get(db, orgId, 'sandbox'),
585
- ])
618
+ const [
619
+ enabledSources,
620
+ productionSettings,
621
+ productionSource,
622
+ sandboxSettings,
623
+ sandboxSource,
624
+ ] = await Promise.all([
625
+ EnabledBillingSources.listByOrg(db, orgId),
626
+ BillingSettings.get(db, orgId, 'production'),
627
+ StripeCustomers.get(db, orgId, 'production'),
628
+ BillingSettings.get(db, orgId, 'sandbox'),
629
+ StripeCustomers.get(db, orgId, 'sandbox'),
630
+ ])
586
631
  return c.json(
587
632
  Response.validated(schema.getOrganization.Response, {
588
633
  ...organization,
589
634
  billing: {
635
+ enabledSources: enabledSources.map((record) => record.source),
590
636
  production: serializeBilling(productionSettings, productionSource),
591
637
  sandbox: serializeBilling(sandboxSettings, sandboxSource),
592
638
  },
@@ -598,6 +644,84 @@ export function organizations() {
598
644
  }
599
645
  },
600
646
  )
647
+ .put(
648
+ '/:orgId/billing-sources/:source',
649
+ OpenApi.validate('param', schema.setBillingSource.Params, {
650
+ code: 'param_invalid',
651
+ message: 'Invalid path parameters',
652
+ }),
653
+ OpenApi.describeRoute({
654
+ operationId: 'enableAdminOrganizationBillingSource',
655
+ responses: OpenApi.responses({
656
+ errors: { 404: 'Organization not found.' },
657
+ success: {
658
+ description: 'Current enabled billing sources.',
659
+ schema: schema.setBillingSource.Response,
660
+ },
661
+ }),
662
+ summary: 'Enable billing source',
663
+ tags: ['Organizations'],
664
+ }),
665
+ async (c) => {
666
+ const { orgId, source } = c.req.valid('param')
667
+ const db = Db.get(c.get('db'))
668
+ try {
669
+ if (!(await Organizations.get(db, orgId))) return organizationNotFound(c)
670
+ await EnabledBillingSources.add(db, {
671
+ createdBy: c.get('identity')!.email,
672
+ orgId,
673
+ source,
674
+ })
675
+ return c.json(
676
+ Response.validated(schema.setBillingSource.Response, {
677
+ data: (await EnabledBillingSources.listByOrg(db, orgId)).map(
678
+ (record) => record.source,
679
+ ),
680
+ }),
681
+ 200,
682
+ )
683
+ } catch (cause) {
684
+ return Response.upstream(c, cause)
685
+ }
686
+ },
687
+ )
688
+ .delete(
689
+ '/:orgId/billing-sources/:source',
690
+ OpenApi.validate('param', schema.setBillingSource.Params, {
691
+ code: 'param_invalid',
692
+ message: 'Invalid path parameters',
693
+ }),
694
+ OpenApi.describeRoute({
695
+ operationId: 'disableAdminOrganizationBillingSource',
696
+ responses: OpenApi.responses({
697
+ errors: { 404: 'Organization not found.' },
698
+ success: {
699
+ description: 'Current enabled billing sources.',
700
+ schema: schema.setBillingSource.Response,
701
+ },
702
+ }),
703
+ summary: 'Disable billing source',
704
+ tags: ['Organizations'],
705
+ }),
706
+ async (c) => {
707
+ const { orgId, source } = c.req.valid('param')
708
+ const db = Db.get(c.get('db'))
709
+ try {
710
+ if (!(await Organizations.get(db, orgId))) return organizationNotFound(c)
711
+ await EnabledBillingSources.remove(db, { orgId, source })
712
+ return c.json(
713
+ Response.validated(schema.setBillingSource.Response, {
714
+ data: (await EnabledBillingSources.listByOrg(db, orgId)).map(
715
+ (record) => record.source,
716
+ ),
717
+ }),
718
+ 200,
719
+ )
720
+ } catch (cause) {
721
+ return Response.upstream(c, cause)
722
+ }
723
+ },
724
+ )
601
725
  .get(
602
726
  '/:orgId/members',
603
727
  OpenApi.validate('param', schema.getOrganization.Params, {
@@ -34,6 +34,11 @@ describe('GET /scopes', () => {
34
34
  "scope": "management:write",
35
35
  "selfServe": true,
36
36
  },
37
+ {
38
+ "description": "Validate and broadcast MPP payment credentials through the Tempo relay.",
39
+ "scope": "mpp:write",
40
+ "selfServe": true,
41
+ },
37
42
  {
38
43
  "description": "Fill and submit transactions through the relay.",
39
44
  "scope": "rpc-relay:read",
@@ -1,5 +1,7 @@
1
1
  import * as TestAdmin from '../../../test/Admin.js'
2
2
  import * as TestApp from '../../../test/App.js'
3
+ import * as Organizations from '../../db/tables/organizations.js'
4
+ import * as VerifiedTokenRequests from '../../db/tables/verifiedTokenRequests.js'
3
5
  import * as Verified from './verified-tokens.js'
4
6
 
5
7
  /** A token used for write round-trips. */
@@ -338,6 +340,205 @@ describe('PUT /verified-tokens/:address/logo', () => {
338
340
  })
339
341
  })
340
342
 
343
+ /** A stored verification request seeded through the repo write boundary. */
344
+ const requestInput = {
345
+ address: '0x20c00000000000000000000000000000000000aa',
346
+ chainId: 42431,
347
+ currency: 'USD',
348
+ decimals: 6,
349
+ name: 'Requested USD',
350
+ orgId: 'org_1a2b3c4d5e6f7g8h9j0k1m2n',
351
+ requestedBy: 'usr_1a2b3c4d5e6f7g8h9j0k1m2n',
352
+ symbol: 'rUSD',
353
+ } as const
354
+
355
+ describe('GET /verified-tokens/requests', () => {
356
+ test('denied identity → 401', async () => {
357
+ const { client } = TestAdmin.setup({ identify: () => null })
358
+ const response = await client['verified-tokens'].requests.$get({ query: {} })
359
+ expect(response.status).toBe(401)
360
+ })
361
+
362
+ test('lists the queue by status with org names', async () => {
363
+ const { client, db } = TestAdmin.setup()
364
+ const org = await Organizations.create(db, { name: 'Acme' })
365
+ const pending = await VerifiedTokenRequests.create(db, {
366
+ ...requestInput,
367
+ logo: '<svg xmlns="http://www.w3.org/2000/svg"/>',
368
+ orgId: org.id,
369
+ })
370
+ const denied = await VerifiedTokenRequests.create(db, {
371
+ ...requestInput,
372
+ address: '0x20c00000000000000000000000000000000000bb',
373
+ symbol: 'rEUR',
374
+ })
375
+ await VerifiedTokenRequests.review(db, denied!.id, {
376
+ reviewedBy: 'admin@tempo.xyz',
377
+ status: 'denied',
378
+ })
379
+
380
+ const queue = await client['verified-tokens'].requests.$get({ query: {} })
381
+ expect(queue.status).toBe(200)
382
+ const queueBody = await TestApp.json(queue, Verified.schema.listVerifiedTokenRequests.Response)
383
+ expect(queueBody.data.map(({ id, orgName }) => ({ id, orgName }))).toEqual([
384
+ { id: pending!.id, orgName: 'Acme' },
385
+ ])
386
+ // The uploaded SVG surfaces to reviewers.
387
+ expect(queueBody.data[0]?.logo).toBe('<svg xmlns="http://www.w3.org/2000/svg"/>')
388
+
389
+ const reviewed = await client['verified-tokens'].requests.$get({ query: { status: 'denied' } })
390
+ const reviewedBody = await TestApp.json(reviewed, Verified.schema.listVerifiedTokenRequests.Response) // prettier-ignore
391
+ expect(reviewedBody.data.map(({ id }) => id)).toEqual([denied!.id])
392
+ })
393
+ })
394
+
395
+ describe('POST /verified-tokens/requests/:requestId/approve', () => {
396
+ test('publishes the token and stamps the review', async () => {
397
+ const { client, db } = TestAdmin.setup()
398
+ const org = await Organizations.create(db, { name: 'Acme' })
399
+ const request = await VerifiedTokenRequests.create(db, { ...requestInput, orgId: org.id })
400
+
401
+ const approved = await client['verified-tokens'].requests[':requestId'].approve.$post({
402
+ param: { requestId: request!.id },
403
+ })
404
+ expect(approved.status).toBe(200)
405
+ const body = await TestApp.json(approved, Verified.schema.reviewVerifiedTokenRequest.Response)
406
+ expect(body.data).toMatchObject({
407
+ orgName: 'Acme',
408
+ reviewedBy: TestAdmin.identity.email,
409
+ status: 'approved',
410
+ })
411
+ expect(Date.parse(body.data.reviewedAt!)).not.toBeNaN()
412
+
413
+ const listed = await client['verified-tokens'].$get({ query: { chainId } })
414
+ const listedBody = await TestApp.json(listed, Verified.schema.listVerifiedTokens.Response)
415
+ expect(listedBody.data.map(({ address }) => address)).toEqual([requestInput.address])
416
+
417
+ const repeat = await client['verified-tokens'].requests[':requestId'].approve.$post({
418
+ param: { requestId: request!.id },
419
+ })
420
+ expect(repeat.status).toBe(409)
421
+ const repeatBody = (await repeat.json()) as { error?: { code?: string } }
422
+ expect(repeatBody.error?.code).toBe('request_not_pending')
423
+ })
424
+
425
+ test('publishes an uploaded logo to the asset store', async () => {
426
+ const svg = '<svg xmlns="http://www.w3.org/2000/svg"/>'
427
+ const stored: { key: string; content: { body: ArrayBuffer; contentType: string } }[] = []
428
+ const { client, db } = TestAdmin.setup({
429
+ assets: {
430
+ get: async (key) => stored.find((entry) => entry.key === key)?.content,
431
+ put: async (key, content) => void stored.push({ content, key }),
432
+ },
433
+ })
434
+ const request = await VerifiedTokenRequests.create(db, { ...requestInput, logo: svg })
435
+
436
+ const approved = await client['verified-tokens'].requests[':requestId'].approve.$post({
437
+ param: { requestId: request!.id },
438
+ })
439
+ expect(approved.status).toBe(200)
440
+ expect(stored).toHaveLength(1)
441
+ expect(stored[0]?.key).toBe(`42431/icons/${requestInput.address}`)
442
+ expect(new TextDecoder().decode(stored[0]?.content.body)).toBe(svg)
443
+
444
+ const listed = await client['verified-tokens'].$get({ query: { chainId } })
445
+ const listedBody = await TestApp.json(listed, Verified.schema.listVerifiedTokens.Response)
446
+ expect(listedBody.data.map(({ address }) => address)).toEqual([requestInput.address])
447
+ })
448
+
449
+ test('rejects an uploaded logo without an asset writer, keeping the request pending', async () => {
450
+ const { client, db } = TestAdmin.setup()
451
+ const request = await VerifiedTokenRequests.create(db, {
452
+ ...requestInput,
453
+ logo: '<svg xmlns="http://www.w3.org/2000/svg"/>',
454
+ })
455
+
456
+ const approved = await client['verified-tokens'].requests[':requestId'].approve.$post({
457
+ param: { requestId: request!.id },
458
+ })
459
+ expect(approved.status).toBe(404)
460
+ const body = (await approved.json()) as { error?: { code?: string } }
461
+ expect(body.error?.code).toBe('assets_not_enabled')
462
+
463
+ const record = await VerifiedTokenRequests.get(db, request!.id)
464
+ expect(record?.status).toBe('pending')
465
+ })
466
+
467
+ test('converges when the token is already verified', async () => {
468
+ const { client, db } = TestAdmin.setup()
469
+ const request = await VerifiedTokenRequests.create(db, requestInput)
470
+ await client['verified-tokens'].$post({
471
+ json: { ...novel, address: requestInput.address, chainId: 42431, symbol: requestInput.symbol }, // prettier-ignore
472
+ })
473
+
474
+ const approved = await client['verified-tokens'].requests[':requestId'].approve.$post({
475
+ param: { requestId: request!.id },
476
+ })
477
+ expect(approved.status).toBe(200)
478
+ const body = await TestApp.json(approved, Verified.schema.reviewVerifiedTokenRequest.Response)
479
+ expect(body.data.status).toBe('approved')
480
+
481
+ // The pre-existing entry survives untouched; nothing was re-created.
482
+ const listed = await client['verified-tokens'].$get({ query: { chainId } })
483
+ const listedBody = await TestApp.json(listed, Verified.schema.listVerifiedTokens.Response)
484
+ expect(listedBody.data).toHaveLength(1)
485
+ })
486
+
487
+ test('rejects a symbol conflict and keeps the request pending', async () => {
488
+ const { client, db } = TestAdmin.setup()
489
+ // Same symbol already verified under a different address.
490
+ await client['verified-tokens'].$post({
491
+ json: { ...novel, chainId: 42431, symbol: requestInput.symbol },
492
+ })
493
+ const request = await VerifiedTokenRequests.create(db, requestInput)
494
+
495
+ const approved = await client['verified-tokens'].requests[':requestId'].approve.$post({
496
+ param: { requestId: request!.id },
497
+ })
498
+ expect(approved.status).toBe(409)
499
+ const body = (await approved.json()) as { error?: { code?: string } }
500
+ expect(body.error?.code).toBe('duplicate_symbol')
501
+
502
+ const record = await VerifiedTokenRequests.get(db, request!.id)
503
+ expect(record?.status).toBe('pending')
504
+ })
505
+ })
506
+
507
+ describe('POST /verified-tokens/requests/:requestId/deny', () => {
508
+ test('records the review note', async () => {
509
+ const { client, db } = TestAdmin.setup()
510
+ const request = await VerifiedTokenRequests.create(db, requestInput)
511
+
512
+ const denied = await client['verified-tokens'].requests[':requestId'].deny.$post({
513
+ json: { reviewNote: 'Logo unreachable.' },
514
+ param: { requestId: request!.id },
515
+ })
516
+ expect(denied.status).toBe(200)
517
+ const body = await TestApp.json(denied, Verified.schema.reviewVerifiedTokenRequest.Response)
518
+ expect(body.data).toMatchObject({
519
+ reviewNote: 'Logo unreachable.',
520
+ reviewedBy: TestAdmin.identity.email,
521
+ status: 'denied',
522
+ })
523
+
524
+ // Nothing was published.
525
+ const listed = await client['verified-tokens'].$get({ query: { chainId } })
526
+ const listedBody = await TestApp.json(listed, Verified.schema.listVerifiedTokens.Response)
527
+ expect(listedBody.data).toEqual([])
528
+ })
529
+
530
+ test('unknown request id → 404', async () => {
531
+ const { client } = TestAdmin.setup()
532
+ const response = await client['verified-tokens'].requests[':requestId'].deny.$post({
533
+ json: {},
534
+ param: { requestId: 'vtr_1a2b3c4d5e6f7g8h9j0k1m2n' },
535
+ })
536
+ expect(response.status).toBe(404)
537
+ const body = (await response.json()) as { error?: { code?: string } }
538
+ expect(body.error?.code).toBe('verified_token_request_not_found')
539
+ })
540
+ })
541
+
341
542
  describe('GET /verified-tokens/:address/logo', () => {
342
543
  const svg = '<svg xmlns="http://www.w3.org/2000/svg"/>'
343
544