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,211 @@
1
+ import { Hono } from 'hono';
2
+ import { createMiddleware } from 'hono/factory';
3
+ import { RpcResponse } from 'ox';
4
+ import { Addresses, TokenId, Transaction } from 'viem/tempo';
5
+ import * as BillingSettings from '../../db/tables/billingSettings.js';
6
+ import * as Db from '../../db/Db.js';
7
+ import * as Fees from '../../internal/Fees.js';
8
+ import * as SponsoredTransactions from '../../db/tables/sponsoredTransactions.js';
9
+ import * as Billing from '../platform/Billing.js';
10
+ import * as Handler from '../../Handler.js';
11
+ import * as Auth from '../../internal/Auth.js';
12
+ import * as OpenApi from '../../internal/OpenApi.js';
13
+ import * as Path from '../../internal/Path.js';
14
+ import * as VerifiedTokens from '../../internal/VerifiedTokens.js';
15
+ import * as Viem from '../../internal/Viem.js';
16
+ import * as Scope from '../../Scope.js';
17
+ /**
18
+ * The relay route group: the wallet relay at `/rpc/relay`. Mount
19
+ * after `data()`, whose published chain clients and supported-chain set the
20
+ * middleware reads from request context.
21
+ *
22
+ * ```ts
23
+ * App.create(options).route('/', data()).route('/', relay())
24
+ * ```
25
+ */
26
+ export function relay(options = {}) {
27
+ const handler = middleware(options);
28
+ return new Hono()
29
+ .use('/rpc/relay', Auth.policy({ apiKey: { scopes: ['rpc-relay:read'] }, mpp: false, public: false }), OpenApi.describeRoute({ hide: true, summary: 'Relay RPC' }))
30
+ .use('/rpc/relay/*', Auth.policy({ apiKey: { scopes: ['rpc-relay:read'] }, mpp: false, public: false }), OpenApi.describeRoute({ hide: true, summary: 'Relay RPC' }))
31
+ .all('/rpc/relay', handler)
32
+ .all('/rpc/relay/:chainId', handler);
33
+ }
34
+ // The wallet relay middleware: proxies wallet JSON-RPC (fills, sponsored
35
+ // sends) with wallet-aware enrichment. Built per request from context rather
36
+ // than closed over group locals; relay traffic is low-QPS and the viem
37
+ // clients are memoized upstream, so per-request handler construction is cheap.
38
+ function middleware(options = {}) {
39
+ // Platform-wide per-transaction cap; org settings tighten it, never loosen.
40
+ const txFeeLimit = options.feePayer
41
+ ? Billing.toBaseUnits(options.feePayer.txFeeLimit ?? '1.00')
42
+ : 0n;
43
+ return createMiddleware(async (c) => {
44
+ const verifiedTokens = c.get('verifiedTokens');
45
+ const feePayer = (() => {
46
+ if (!options.feePayer)
47
+ return undefined;
48
+ const principal = Auth.getPrincipal(c);
49
+ const attribution = principal?.type === 'api_key' && principal.projectId !== undefined
50
+ ? {
51
+ apiKeyId: principal.id,
52
+ environment: principal.environment,
53
+ orgId: principal.orgId,
54
+ projectId: principal.projectId,
55
+ }
56
+ : undefined;
57
+ const sponsorable = attribution !== undefined &&
58
+ principal?.type === 'api_key' &&
59
+ (principal.apiKey.scopes.includes('rpc-relay:sponsor') ||
60
+ principal.apiKey.scopes.includes(Scope.wildcard));
61
+ // Lifted so validation and the sponsored-token default read one value.
62
+ const feeToken_sponsor = options.feePayer.feeToken ?? Addresses.pathUsd;
63
+ return {
64
+ ...options.feePayer,
65
+ feeToken: feeToken_sponsor,
66
+ validate: async (transaction) => {
67
+ // Allowlist the chains this deployment serves rather than denylisting
68
+ // only mainnet: the relay resolves chainId from the request body, so
69
+ // the query-string chain guard never sees it.
70
+ const id = Number(transaction.chainId);
71
+ if (!attribution || !sponsorable || !c.get('supportedChainIds').has(id))
72
+ return false;
73
+ if (!Viem.isMainnet(id))
74
+ return true;
75
+ // Mainnet is production-only: a sandbox key resolves chainId from the
76
+ // request body, so the auth-layer sandbox/mainnet guard never sees
77
+ // it. Refuse here, or sandbox spend would sponsor mainnet unbilled.
78
+ if (attribution.environment !== 'production')
79
+ return false;
80
+ // Enforcement reads hit the primary, never the cached replica: a
81
+ // stale `past_due`, a lowered limit, or another isolate's pending
82
+ // spend must not keep the gate open.
83
+ const db = Db.get(c.get('db'));
84
+ // Mainnet sponsorship requires an active billing source; deployments
85
+ // without billing configured have no rows, so mainnet stays closed.
86
+ // `past_due` gets its own reason: the caller must settle an invoice,
87
+ // not attach a card.
88
+ const billing = await Billing.status(db, attribution.orgId);
89
+ if (billing === 'past_due')
90
+ return 'billing_past_due';
91
+ if (billing !== 'active')
92
+ return 'billing_required';
93
+ const feeToken = (() => {
94
+ try {
95
+ return TokenId.toAddress(transaction.feeToken ?? feeToken_sponsor);
96
+ }
97
+ catch {
98
+ return undefined;
99
+ }
100
+ })();
101
+ const verified = feeToken
102
+ ? (await VerifiedTokens.read(Db.get(c.get('dbCached')), id))?.byAddress.get(feeToken.toLowerCase()) // prettier-ignore
103
+ : undefined;
104
+ if (!verified ||
105
+ verified.currency.toLowerCase() !== 'usd' ||
106
+ verified.decimals !== Fees.tokenDecimals)
107
+ // prettier-ignore
108
+ return 'fee_token_unsupported';
109
+ // Fail closed: a transaction whose signed cap cannot be computed
110
+ // cannot be bounded, so it never sponsors on mainnet.
111
+ const feeMax = Fees.maxOf(transaction);
112
+ if (feeMax === undefined)
113
+ return 'tx_fee_limit_exceeded';
114
+ const settings = await BillingSettings.get(db, attribution.orgId);
115
+ const cap = (() => {
116
+ if (settings?.txFeeLimit == null)
117
+ return txFeeLimit;
118
+ const org = Billing.toBaseUnits(settings.txFeeLimit);
119
+ return org < txFeeLimit ? org : txFeeLimit;
120
+ })();
121
+ if (feeMax > cap)
122
+ return 'tx_fee_limit_exceeded';
123
+ // The period spend limit is enforced atomically at recording time
124
+ // (`onSponsored` → `SponsoredTransactions.reserve`); a check here
125
+ // would be a check-then-act race a burst could slip through.
126
+ return true;
127
+ },
128
+ onSponsored: async (event) => {
129
+ if (!attribution)
130
+ return;
131
+ const mainnet = Viem.isMainnet(event.chainId);
132
+ // Defense in depth: `validate` already refuses non-production
133
+ // mainnet, so reaching here with that pair is a wiring bug.
134
+ if (mainnet && attribution.environment !== 'production')
135
+ throw new RpcResponse.InvalidParamsError({ message: 'Sponsorship rejected.' });
136
+ // The cap recomputes from canonical envelope bytes, mirroring the
137
+ // reconciliation convention; pending rows charge it to spend limits.
138
+ const feeMax = Fees.maxOf(Transaction.deserialize(event.transaction));
139
+ const db = Db.get(c.get('db'));
140
+ const feeToken = (() => {
141
+ try {
142
+ return event.feeToken !== undefined ? TokenId.toAddress(event.feeToken) : undefined;
143
+ }
144
+ catch {
145
+ return undefined;
146
+ }
147
+ })();
148
+ const currency = feeToken
149
+ ? (await VerifiedTokens.read(Db.get(c.get('dbCached')), event.chainId))?.byAddress
150
+ .get(feeToken.toLowerCase())
151
+ ?.currency.toLowerCase()
152
+ : undefined;
153
+ const input = {
154
+ apiKeyId: attribution.apiKeyId,
155
+ billable: attribution.environment === 'production',
156
+ chainId: event.chainId,
157
+ environment: attribution.environment,
158
+ orgId: attribution.orgId,
159
+ projectId: attribution.projectId,
160
+ signPayload: event.signPayload,
161
+ transaction: event.transaction,
162
+ ...(currency ? { currency } : {}),
163
+ ...(feeMax !== undefined ? { feeMax: feeMax.toString() } : {}),
164
+ ...(feeToken ? { feeToken } : {}),
165
+ ...(event.transactionHash ? { transactionHash: event.transactionHash } : {}),
166
+ };
167
+ // Re-read settings on the authoritative path: the limit may have
168
+ // changed since `validate`, and only mainnet spend is limited.
169
+ const settings = mainnet ? await BillingSettings.get(db, attribution.orgId) : undefined;
170
+ if (settings?.spendLimit == null)
171
+ return void (await SponsoredTransactions.upsert(db, input)); // prettier-ignore
172
+ try {
173
+ await SponsoredTransactions.reserve(db, input, {
174
+ chainIds: [Viem.chainId.mainnet],
175
+ max: Billing.toBaseUnits(settings.spendLimit),
176
+ since: Billing.periodStart(settings.period),
177
+ });
178
+ }
179
+ catch (error) {
180
+ if (error instanceof SponsoredTransactions.PeriodSpendLimitError)
181
+ throw new RpcResponse.InvalidParamsError({
182
+ data: { code: 'spend_limit_exceeded' },
183
+ message: 'Spend limit exceeded.',
184
+ });
185
+ throw error;
186
+ }
187
+ },
188
+ };
189
+ })();
190
+ // Dispatching a standalone Hono via `fetch(c.req.raw)` bypasses Hono's
191
+ // mount-path stripping, so its internal routes register at the request's
192
+ // full external path (`basePath` + `/rpc/relay`).
193
+ const handler = Handler.relay({
194
+ cache: c.get('store'),
195
+ features: 'all',
196
+ getClient: (chainId) => c.get('getClient')(chainId),
197
+ path: Path.join(c.get('basePath'), 'rpc/relay'),
198
+ ...(feePayer ? { feePayer } : {}),
199
+ ...(verifiedTokens
200
+ ? {
201
+ resolveTokens: async (chainId) => {
202
+ const snapshot = await VerifiedTokens.read(Db.get(c.get('dbCached')), chainId);
203
+ return snapshot?.list.map((token) => token.address) ?? [];
204
+ },
205
+ }
206
+ : {}),
207
+ });
208
+ return handler.fetch(c.req.raw);
209
+ });
210
+ }
211
+ //# sourceMappingURL=App.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../../../src/apps/relay/App.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ import { type Address, type Client } from 'viem';
2
+ import * as Db from '../../db/Db.js';
3
+ import * as Tidx from '../../internal/Tidx.js';
4
+ import * as Viem from '../../internal/Viem.js';
5
+ /**
6
+ * Runs one finalization pass over pending sponsored transactions: rows with a
7
+ * receipt finalize with the actual fee (`gasUsed × effectiveGasPrice`, in
8
+ * fee-token base units); rows still unmined past the pending TTL fail, as do
9
+ * hash-less fill intents the TTL outlives. Rows whose receipt lookup errors
10
+ * persist past the error TTL fail so they cannot monopolize every batch.
11
+ *
12
+ * @param db - The database holding `sponsored_transactions`.
13
+ * @param options - Finalization options.
14
+ * @returns Counters for the pass.
15
+ */
16
+ export declare function finalize(db: Db.Db, options: finalize.Options): Promise<finalize.Result>;
17
+ export declare namespace finalize {
18
+ /** Options for {@link finalize}. */
19
+ type Options = {
20
+ /** Maximum pending rows processed per pass. @default 100 */
21
+ batchSize?: number | undefined;
22
+ /** Client resolver keyed by the row's chain id. */
23
+ getClient: (chainId: number) => Client;
24
+ /** Clock; injectable for tests. */
25
+ now?: (() => Date) | undefined;
26
+ /** Age after which an unmined sponsorship fails. @default 1 hour */
27
+ pendingTtlMs?: number | undefined;
28
+ /** Age after which repeated receipt lookup errors fail a row. @default 24 hours */
29
+ receiptErrorTtlMs?: number | undefined;
30
+ };
31
+ /** Counters returned by one finalization pass. */
32
+ type Result = {
33
+ /** Rows marked failed (unmined past the pending TTL). */
34
+ failed: number;
35
+ /** Rows finalized with an actual fee. */
36
+ finalized: number;
37
+ /** Rows left pending (unmined, or receipt lookup errored within the error TTL). */
38
+ pending: number;
39
+ };
40
+ }
41
+ /**
42
+ * Runs one reconciliation pass over pending fill intents (rows with no
43
+ * transaction hash): fetches the fee payer's recent on-chain transactions
44
+ * from TIDX, recomputes each candidate's fee-payer sign payload, and fills
45
+ * matching intents' hashes so the receipt pass can finalize them. Query or
46
+ * candidate errors leave intents for the next pass.
47
+ *
48
+ * @param db - The database holding `sponsored_transactions`.
49
+ * @param options - Reconciliation options.
50
+ * @returns Counters for the pass.
51
+ */
52
+ export declare function reconcile(db: Db.Db, options: reconcile.Options): Promise<reconcile.Result>;
53
+ export declare namespace reconcile {
54
+ /** Options for {@link reconcile}. */
55
+ type Options = {
56
+ /** Maximum intents considered per pass. @default 100 */
57
+ batchSize?: number | undefined;
58
+ /** Maximum on-chain candidates fetched per chain per pass. @default 500 */
59
+ candidateCap?: number | undefined;
60
+ /** How long failed intents remain reconciliation candidates. @default 24 hours */
61
+ failedIntentTtlMs?: number | undefined;
62
+ /** Fee payer address whose on-chain transactions are candidates. */
63
+ feePayer: Address;
64
+ /** Client resolver keyed by the intent's chain id. */
65
+ getClient: (chainId: number) => Client;
66
+ /** TIDX client resolver keyed by the intent's chain id. */
67
+ getTidx: (chainId: number) => Tidx.Client;
68
+ /** Lookback slack before the oldest intent's creation. @default 2 minutes */
69
+ skewMs?: number | undefined;
70
+ };
71
+ /** Counters returned by one reconciliation pass. */
72
+ type Result = {
73
+ /** Intents matched to an on-chain transaction. */
74
+ matched: number;
75
+ /** On-chain candidates inspected. */
76
+ scanned: number;
77
+ };
78
+ }
79
+ /**
80
+ * Builds a scheduled sponsorship finalizer bound to a database and RPC config.
81
+ * A host runtime drives {@link createFinalizer.Finalizer.tick} on a timer (a
82
+ * Cloudflare `scheduled` cron handler, a self-host `setInterval`, …); each
83
+ * tick reconciles fill intents (when `feePayer` + `tidx` are configured) and
84
+ * runs one {@link finalize} pass, with memoized per-chain clients.
85
+ */
86
+ export declare function createFinalizer(options: createFinalizer.Options): createFinalizer.Finalizer;
87
+ export declare namespace createFinalizer {
88
+ /** Options for {@link createFinalizer}. */
89
+ type Options = Pick<finalize.Options, 'batchSize' | 'now' | 'pendingTtlMs'> & {
90
+ /** Database holding sponsorship rows, or a factory resolved per tick (Workers/Hyperdrive). */
91
+ db: Db.Source;
92
+ /** Default chain id for the TIDX client resolver. */
93
+ defaultChainId?: Viem.ChainId | undefined;
94
+ /** Fee payer address whose on-chain transactions reconcile fill intents; omit to skip reconciliation. */
95
+ feePayer?: Address | undefined;
96
+ /** RPC options for the receipt-lookup clients. */
97
+ rpc?: Viem.getClient.Rpc | undefined;
98
+ /** TIDX query client options for intent reconciliation; omit to skip reconciliation. */
99
+ tidx?: Tidx.getClient.Tidx | undefined;
100
+ };
101
+ /** A scheduled sponsorship finalizer. */
102
+ type Finalizer = {
103
+ /** Runs one reconcile + finalize pass. */
104
+ tick(): Promise<finalize.Result & reconcile.Result>;
105
+ };
106
+ }
107
+ //# sourceMappingURL=Sponsorships.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sponsorships.d.ts","sourceRoot":"","sources":["../../../src/apps/relay/Sponsorships.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,194 @@
1
+ import { TxEnvelopeTempo } from 'ox/tempo';
2
+ import { TransactionReceiptNotFoundError, } from 'viem';
3
+ import { getTransactionReceipt } from 'viem/actions';
4
+ import * as Db from '../../db/Db.js';
5
+ import * as Fees from '../../internal/Fees.js';
6
+ import * as SponsoredTransactions from '../../db/tables/sponsoredTransactions.js';
7
+ import * as Tidx from '../../internal/Tidx.js';
8
+ import * as Viem from '../../internal/Viem.js';
9
+ /**
10
+ * Runs one finalization pass over pending sponsored transactions: rows with a
11
+ * receipt finalize with the actual fee (`gasUsed × effectiveGasPrice`, in
12
+ * fee-token base units); rows still unmined past the pending TTL fail, as do
13
+ * hash-less fill intents the TTL outlives. Rows whose receipt lookup errors
14
+ * persist past the error TTL fail so they cannot monopolize every batch.
15
+ *
16
+ * @param db - The database holding `sponsored_transactions`.
17
+ * @param options - Finalization options.
18
+ * @returns Counters for the pass.
19
+ */
20
+ export async function finalize(db, options) {
21
+ const { batchSize = 100, getClient, now = () => new Date(), pendingTtlMs = 3_600_000, receiptErrorTtlMs = 86_400_000, } = options;
22
+ const rows = await SponsoredTransactions.listPending(db, { limit: batchSize });
23
+ const result = { failed: 0, finalized: 0, pending: 0 };
24
+ for (const row of rows) {
25
+ // Fill intents carry no hash until reconciliation matches them on-chain;
26
+ // here only the TTL can settle them.
27
+ if (row.transactionHash === null) {
28
+ if (Date.parse(row.createdAt) + pendingTtlMs <= now().getTime()) {
29
+ await SponsoredTransactions.fail(db, row.id, now().toISOString());
30
+ result.failed++;
31
+ }
32
+ else
33
+ result.pending++;
34
+ continue;
35
+ }
36
+ let receipt;
37
+ try {
38
+ receipt = await getTransactionReceipt(getClient(row.chainId), {
39
+ hash: row.transactionHash,
40
+ });
41
+ }
42
+ catch (error) {
43
+ // Unmined transactions surface as a typed not-found; let the TTL decide.
44
+ if (error instanceof TransactionReceiptNotFoundError)
45
+ receipt = null;
46
+ else {
47
+ if (Date.parse(row.createdAt) + receiptErrorTtlMs <= now().getTime()) {
48
+ await SponsoredTransactions.fail(db, row.id, now().toISOString());
49
+ result.failed++;
50
+ }
51
+ else
52
+ result.pending++;
53
+ continue;
54
+ }
55
+ }
56
+ if (receipt) {
57
+ // A reverted transaction still finalizes: the fee payer paid its fees.
58
+ const feeAmount = Fees.fromGas(receipt.gasUsed, receipt.effectiveGasPrice);
59
+ await SponsoredTransactions.finalize(db, row.id, {
60
+ feeAmount: feeAmount.toString(),
61
+ finalizedAt: now().toISOString(),
62
+ });
63
+ result.finalized++;
64
+ }
65
+ else if (Date.parse(row.createdAt) + pendingTtlMs <= now().getTime()) {
66
+ await SponsoredTransactions.fail(db, row.id, now().toISOString());
67
+ result.failed++;
68
+ }
69
+ else
70
+ result.pending++;
71
+ }
72
+ return result;
73
+ }
74
+ /**
75
+ * Runs one reconciliation pass over pending fill intents (rows with no
76
+ * transaction hash): fetches the fee payer's recent on-chain transactions
77
+ * from TIDX, recomputes each candidate's fee-payer sign payload, and fills
78
+ * matching intents' hashes so the receipt pass can finalize them. Query or
79
+ * candidate errors leave intents for the next pass.
80
+ *
81
+ * @param db - The database holding `sponsored_transactions`.
82
+ * @param options - Reconciliation options.
83
+ * @returns Counters for the pass.
84
+ */
85
+ export async function reconcile(db, options) {
86
+ const { batchSize = 100, candidateCap = 500, failedIntentTtlMs = 86_400_000, feePayer, getClient, getTidx, skewMs = 120_000, } = options;
87
+ const intents = await SponsoredTransactions.listIntents(db, {
88
+ failedSince: new Date(Date.now() - failedIntentTtlMs).toISOString(),
89
+ limit: batchSize,
90
+ });
91
+ const result = { matched: 0, scanned: 0 };
92
+ if (intents.length === 0)
93
+ return result;
94
+ const chains = new Map();
95
+ for (const intent of intents)
96
+ chains.set(intent.chainId, [...(chains.get(intent.chainId) ?? []), intent]); // prettier-ignore
97
+ for (const [chainId, rows] of chains) {
98
+ const bySignPayload = new Map(rows.map((row) => [row.signPayload, row]));
99
+ // The intent set bounds the scan window: no cursor state to persist.
100
+ const since = new Date(Math.min(...rows.map((row) => Date.parse(row.createdAt))) - skewMs).toISOString();
101
+ let candidates;
102
+ try {
103
+ // Dynamic filter values; the tidx client's query type wants literals.
104
+ const fetched = await getTidx(chainId).fetch({
105
+ chainId,
106
+ query: `SELECT hash, "from" FROM txs WHERE fee_payer = '${feePayer.toLowerCase()}' AND block_timestamp >= '${since}' ORDER BY block_timestamp ASC LIMIT ${candidateCap}`,
107
+ });
108
+ candidates = fetched.rows;
109
+ }
110
+ catch {
111
+ // Indexer outage must not fail intents; retry on the next pass.
112
+ continue;
113
+ }
114
+ for (const candidate of candidates) {
115
+ if (bySignPayload.size === 0)
116
+ break;
117
+ const hash = candidate['hash'];
118
+ const sender = candidate['from'];
119
+ if (!hash || !sender)
120
+ continue;
121
+ result.scanned++;
122
+ try {
123
+ const serialized = await getRawTransaction(getClient(chainId), hash);
124
+ if (!serialized?.startsWith(TxEnvelopeTempo.serializedType))
125
+ continue;
126
+ const signPayload = TxEnvelopeTempo.getFeePayerSignPayload(TxEnvelopeTempo.deserialize(serialized), { sender });
127
+ const intent = bySignPayload.get(signPayload);
128
+ if (!intent)
129
+ continue;
130
+ await SponsoredTransactions.assignTransactionHash(db, intent.id, hash);
131
+ bySignPayload.delete(signPayload);
132
+ result.matched++;
133
+ }
134
+ catch {
135
+ // Unresolvable candidate (lookup error, malformed envelope): skip it.
136
+ }
137
+ }
138
+ }
139
+ return result;
140
+ }
141
+ /**
142
+ * Fetches a mined transaction's canonical envelope bytes.
143
+ * `eth_getRawTransactionByHash` is a node extension absent from viem's typed
144
+ * RPC schema, hence the request-fn narrowing.
145
+ */
146
+ function getRawTransaction(client, hash) {
147
+ return client.request({ method: 'eth_getRawTransactionByHash', params: [hash] });
148
+ }
149
+ /**
150
+ * Builds a scheduled sponsorship finalizer bound to a database and RPC config.
151
+ * A host runtime drives {@link createFinalizer.Finalizer.tick} on a timer (a
152
+ * Cloudflare `scheduled` cron handler, a self-host `setInterval`, …); each
153
+ * tick reconciles fill intents (when `feePayer` + `tidx` are configured) and
154
+ * runs one {@link finalize} pass, with memoized per-chain clients.
155
+ */
156
+ export function createFinalizer(options) {
157
+ const clients = new Map();
158
+ const getClient = (chainId) => {
159
+ let client = clients.get(chainId);
160
+ if (!client) {
161
+ client = Viem.getClient({ chainId: chainId, rpc: options.rpc });
162
+ clients.set(chainId, client);
163
+ }
164
+ return client;
165
+ };
166
+ const getTidx = options.tidx
167
+ ? Tidx.createGetClient({ defaultChainId: options.defaultChainId, tidx: options.tidx })
168
+ : undefined;
169
+ const feePayer = options.feePayer;
170
+ return {
171
+ async tick() {
172
+ // Resolve per tick so Workers factories build a fresh Hyperdrive-pooled
173
+ // connection each run.
174
+ const db = Db.get(options.db);
175
+ // Reconcile first so freshly matched intents finalize in the same tick.
176
+ const reconciled = feePayer && getTidx
177
+ ? await reconcile(db, {
178
+ batchSize: options.batchSize,
179
+ feePayer,
180
+ getClient,
181
+ getTidx: (chainId) => getTidx(chainId),
182
+ })
183
+ : { matched: 0, scanned: 0 };
184
+ const finalized = await finalize(db, {
185
+ batchSize: options.batchSize,
186
+ getClient,
187
+ now: options.now,
188
+ pendingTtlMs: options.pendingTtlMs,
189
+ });
190
+ return { ...finalized, ...reconciled };
191
+ },
192
+ };
193
+ }
194
+ //# sourceMappingURL=Sponsorships.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sponsorships.js","sourceRoot":"","sources":["../../../src/apps/relay/Sponsorships.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { relay } from './App.js';
2
+ export * as Sponsorships from './Sponsorships.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/apps/relay/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAChC,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { relay } from './App.js';
2
+ export * as Sponsorships from './Sponsorships.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/apps/relay/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAChC,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA"}
package/dist/cli/Cli.d.ts CHANGED
@@ -1,12 +1,17 @@
1
1
  import { Cli as incur_Cli, Fetch, type Openapi } from 'incur';
2
+ import type { mcp } from '../apps/mcp.js';
2
3
  /**
3
- * Creates an incur CLI backed by a hosted Tempo API, plus the operator
4
- * commands (`<cli> admin …`).
4
+ * Creates an incur CLI backed by a hosted Tempo API, plus the super admin
5
+ * commands (`<cli> admin …`) and the remote Tempo docs tools (`<cli> docs …`).
5
6
  */
6
7
  export declare function from(url: string | URL, options?: from.Options): incur_Cli.Cli<{
7
8
  [x: `${string} ${string} ${string}`]: {
8
9
  args: {};
9
10
  options: {
11
+ clickhouseDatabase?: string | undefined;
12
+ clickhouseMigratePassword?: string | undefined;
13
+ clickhouseMigrateUser?: string | undefined;
14
+ clickhouseUrl?: string | undefined;
10
15
  databaseUrl?: string | undefined;
11
16
  dbSchema?: string | undefined;
12
17
  };
@@ -17,6 +22,8 @@ export declare namespace from {
17
22
  type Options = {
18
23
  /** CLI description. */
19
24
  description?: string | undefined;
25
+ /** Remote docs MCP source mounted as the `docs` command group, or `false` to omit it. @default 'https://mcp.tempo.xyz/mcp' */
26
+ docs?: mcp.Source | false | undefined;
20
27
  /** CLI name. */
21
28
  name?: string | undefined;
22
29
  /** OpenAPI document source. Relative paths resolve from the API URL. */
@@ -1 +1 @@
1
- {"version":3,"file":"Cli.d.ts","sourceRoot":"","sources":["../../src/cli/Cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,IAAI,SAAS,EAAE,KAAK,EAAE,KAAK,OAAO,EAAE,MAAM,OAAO,CAAA;AAI7D;;;GAGG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,OAAO,GAAE,IAAI,CAAC,OAAY;;;;;;;;oCAkBjE;AAED,MAAM,CAAC,OAAO,WAAW,IAAI,CAAC;IAC5B,8DAA8D;IAC9D,KAAK,OAAO,GAAG;QACb,uBAAuB;QACvB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAChC,gBAAgB;QAChB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB,wEAAwE;QACxE,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,GAAG,SAAS,CAAA;QAC3C,4EAA4E;QAC5E,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAA;QAC1C,4CAA4C;QAC5C,OAAO,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,OAAO,GAAG,SAAS,CAAA;QAC/C,mBAAmB;QACnB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC7B,CAAA;CACF"}
1
+ {"version":3,"file":"Cli.d.ts","sourceRoot":"","sources":["../../src/cli/Cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,IAAI,SAAS,EAAE,KAAK,EAAE,KAAK,OAAO,EAAE,MAAM,OAAO,CAAA;AAE7D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AAUzC;;;GAGG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,OAAO,GAAE,IAAI,CAAC,OAAY;;;;;;;;;;;;oCAuBjE;AAED,MAAM,CAAC,OAAO,WAAW,IAAI,CAAC;IAC5B,8DAA8D;IAC9D,KAAK,OAAO,GAAG;QACb,uBAAuB;QACvB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAChC,8HAA8H;QAC9H,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,KAAK,GAAG,SAAS,CAAA;QACrC,gBAAgB;QAChB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB,wEAAwE;QACxE,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,GAAG,SAAS,CAAA;QAC3C,4EAA4E;QAC5E,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAA;QAC1C,4CAA4C;QAC5C,OAAO,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,OAAO,GAAG,SAAS,CAAA;QAC/C,mBAAmB;QACnB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC7B,CAAA;CACF"}
package/dist/cli/Cli.js CHANGED
@@ -1,19 +1,27 @@
1
1
  import { Cli as incur_Cli, Fetch } from 'incur';
2
2
  import * as Admin from './commands/admin.js';
3
+ /** Tool patterns hidden from MCP clients: super admin, partner-shaped gecko mirrors, browser session flows. */
4
+ const excludedTools = ['admin_*', 'gecko_*', 'v1_auth_*'];
5
+ /** Usage guidance surfaced to MCP clients on initialize (`<cli> --mcp`). */
6
+ const instructions = 'Tools mirror the hosted Tempo API. Authenticated tools accept an `authorization` input (`Bearer <api key>`). List endpoints paginate via `cursor`/`nextCursor`. `docs_*` tools search the Tempo documentation.';
3
7
  /**
4
- * Creates an incur CLI backed by a hosted Tempo API, plus the operator
5
- * commands (`<cli> admin …`).
8
+ * Creates an incur CLI backed by a hosted Tempo API, plus the super admin
9
+ * commands (`<cli> admin …`) and the remote Tempo docs tools (`<cli> docs …`).
6
10
  */
7
11
  export function from(url, options = {}) {
8
- const { description = 'Tempo API CLI', name = 'tapimo', openapi = 'openapi.json', request, version = '0.0.0', } = options;
9
- return incur_Cli
12
+ const { description = 'Tempo API CLI', docs = 'https://mcp.tempo.xyz/mcp', name = 'tapimo', openapi = 'openapi.json', request, version = '0.0.0', } = options;
13
+ const cli = incur_Cli
10
14
  .create(name, {
11
15
  description,
12
16
  fetch: Fetch.fromRequest(url, request),
17
+ mcp: { instructions, tools: { exclude: excludedTools } },
13
18
  openapi,
14
19
  openapiConfig: options.openapiConfig ?? { mode: 'namespace' },
15
20
  version,
16
21
  })
17
22
  .command(Admin.admin);
23
+ if (docs !== false)
24
+ cli.command('docs', { description: 'Search the Tempo documentation.', mcp: docs });
25
+ return cli;
18
26
  }
19
27
  //# sourceMappingURL=Cli.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Cli.js","sourceRoot":"","sources":["../../src/cli/Cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,IAAI,SAAS,EAAE,KAAK,EAAgB,MAAM,OAAO,CAAA;AAE7D,OAAO,KAAK,KAAK,MAAM,qBAAqB,CAAA;AAE5C;;;GAGG;AACH,MAAM,UAAU,IAAI,CAAC,GAAiB,EAAE,OAAO,GAAiB,EAAE;IAChE,MAAM,EACJ,WAAW,GAAG,eAAe,EAC7B,IAAI,GAAG,QAAQ,EACf,OAAO,GAAG,cAAc,EACxB,OAAO,EACP,OAAO,GAAG,OAAO,GAClB,GAAG,OAAO,CAAA;IAEX,OAAO,SAAS;SACb,MAAM,CAAC,IAAI,EAAE;QACZ,WAAW;QACX,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC;QACtC,OAAO;QACP,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE;QAC7D,OAAO;KACR,CAAC;SACD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AACzB,CAAC"}
1
+ {"version":3,"file":"Cli.js","sourceRoot":"","sources":["../../src/cli/Cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,IAAI,SAAS,EAAE,KAAK,EAAgB,MAAM,OAAO,CAAA;AAG7D,OAAO,KAAK,KAAK,MAAM,qBAAqB,CAAA;AAE5C,+GAA+G;AAC/G,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAA;AAEzD,4EAA4E;AAC5E,MAAM,YAAY,GAChB,gNAAgN,CAAA;AAElN;;;GAGG;AACH,MAAM,UAAU,IAAI,CAAC,GAAiB,EAAE,OAAO,GAAiB,EAAE;IAChE,MAAM,EACJ,WAAW,GAAG,eAAe,EAC7B,IAAI,GAAG,2BAA2B,EAClC,IAAI,GAAG,QAAQ,EACf,OAAO,GAAG,cAAc,EACxB,OAAO,EACP,OAAO,GAAG,OAAO,GAClB,GAAG,OAAO,CAAA;IAEX,MAAM,GAAG,GAAG,SAAS;SAClB,MAAM,CAAC,IAAI,EAAE;QACZ,WAAW;QACX,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC;QACtC,GAAG,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE;QACxD,OAAO;QACP,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE;QAC7D,OAAO;KACR,CAAC;SACD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IACvB,IAAI,IAAI,KAAK,KAAK;QAChB,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,iCAAiC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAA;IACpF,OAAO,GAAG,CAAA;AACZ,CAAC"}