tapimo 0.2.0 → 0.4.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 (362) hide show
  1. package/README.md +36 -8
  2. package/dist/ApiKey.d.ts +1 -0
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +5 -2
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +28 -1
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +34 -1
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +7532 -4850
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +11 -3
  13. package/dist/App.js.map +1 -1
  14. package/dist/Scope.d.ts +11 -2
  15. package/dist/Scope.d.ts.map +1 -1
  16. package/dist/Scope.js +14 -3
  17. package/dist/Scope.js.map +1 -1
  18. package/dist/admin/App.d.ts +63 -53
  19. package/dist/admin/App.d.ts.map +1 -1
  20. package/dist/admin/apps/api-keys.d.ts +7 -0
  21. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  22. package/dist/admin/apps/scopes.d.ts +8 -0
  23. package/dist/admin/apps/scopes.d.ts.map +1 -1
  24. package/dist/admin/apps/scopes.js +3 -0
  25. package/dist/admin/apps/scopes.js.map +1 -1
  26. package/dist/admin/apps/verified-tokens.d.ts +57 -57
  27. package/dist/admin/ui.generated.d.ts +1 -1
  28. package/dist/admin/ui.generated.js +13 -13
  29. package/dist/admin/ui.generated.js.map +1 -1
  30. package/dist/analytics/Analytics.d.ts +151 -0
  31. package/dist/analytics/Analytics.d.ts.map +1 -0
  32. package/dist/analytics/Analytics.js +212 -0
  33. package/dist/analytics/Analytics.js.map +1 -0
  34. package/dist/analytics/tables/requestEvents.d.ts +215 -0
  35. package/dist/analytics/tables/requestEvents.d.ts.map +1 -0
  36. package/dist/analytics/tables/requestEvents.js +264 -0
  37. package/dist/analytics/tables/requestEvents.js.map +1 -0
  38. package/dist/apps/data/App.d.ts +1049 -624
  39. package/dist/apps/data/App.d.ts.map +1 -1
  40. package/dist/apps/data/App.js +36 -0
  41. package/dist/apps/data/App.js.map +1 -1
  42. package/dist/apps/data/FundingRouteProviders.d.ts +54 -0
  43. package/dist/apps/data/FundingRouteProviders.d.ts.map +1 -0
  44. package/dist/apps/data/FundingRouteProviders.js +355 -0
  45. package/dist/apps/data/FundingRouteProviders.js.map +1 -0
  46. package/dist/apps/data/index.d.ts +1 -0
  47. package/dist/apps/data/index.d.ts.map +1 -1
  48. package/dist/apps/data/index.js +1 -0
  49. package/dist/apps/data/index.js.map +1 -1
  50. package/dist/apps/data/routes/balances.d.ts +45 -45
  51. package/dist/apps/data/routes/coingecko.d.ts +176 -176
  52. package/dist/apps/data/routes/exchanges.d.ts +455 -455
  53. package/dist/apps/data/routes/fee-amm.d.ts +101 -101
  54. package/dist/apps/data/routes/funding.d.ts +843 -0
  55. package/dist/apps/data/routes/funding.d.ts.map +1 -0
  56. package/dist/apps/data/routes/funding.js +443 -0
  57. package/dist/apps/data/routes/funding.js.map +1 -0
  58. package/dist/apps/data/routes/indexer.d.ts +5 -5
  59. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  60. package/dist/apps/data/routes/receipts.js +2 -8
  61. package/dist/apps/data/routes/receipts.js.map +1 -1
  62. package/dist/apps/data/routes/rpc.d.ts +29 -36
  63. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  64. package/dist/apps/data/routes/rpc.js +29 -1
  65. package/dist/apps/data/routes/rpc.js.map +1 -1
  66. package/dist/apps/data/routes/tokenlist.d.ts +36 -36
  67. package/dist/apps/data/routes/transfers.d.ts +56 -56
  68. package/dist/apps/data/routes/verified-tokens.d.ts +36 -36
  69. package/dist/apps/data/routes/webhooks.d.ts +45 -45
  70. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  71. package/dist/apps/data/routes/webhooks.js +8 -8
  72. package/dist/apps/data/routes/webhooks.js.map +1 -1
  73. package/dist/apps/docs/App.d.ts +5 -3
  74. package/dist/apps/docs/App.d.ts.map +1 -1
  75. package/dist/apps/docs/App.js +28 -96
  76. package/dist/apps/docs/App.js.map +1 -1
  77. package/dist/apps/docs/reference.d.ts +21 -0
  78. package/dist/apps/docs/reference.d.ts.map +1 -0
  79. package/dist/apps/docs/reference.js +112 -0
  80. package/dist/apps/docs/reference.js.map +1 -0
  81. package/dist/apps/index.d.ts +3 -2
  82. package/dist/apps/index.d.ts.map +1 -1
  83. package/dist/apps/index.js +3 -2
  84. package/dist/apps/index.js.map +1 -1
  85. package/dist/apps/{platform → management}/App.d.ts +3015 -738
  86. package/dist/apps/management/App.d.ts.map +1 -0
  87. package/dist/apps/{platform → management}/App.js +20 -10
  88. package/dist/apps/management/App.js.map +1 -0
  89. package/dist/apps/management/Billing.d.ts +279 -0
  90. package/dist/apps/management/Billing.d.ts.map +1 -0
  91. package/dist/apps/management/Billing.js +477 -0
  92. package/dist/apps/management/Billing.js.map +1 -0
  93. package/dist/apps/management/index.d.ts +3 -0
  94. package/dist/apps/management/index.d.ts.map +1 -0
  95. package/dist/apps/management/index.js +3 -0
  96. package/dist/apps/management/index.js.map +1 -0
  97. package/dist/apps/{platform → management}/routes/api-keys.d.ts +341 -49
  98. package/dist/apps/management/routes/api-keys.d.ts.map +1 -0
  99. package/dist/apps/{platform → management}/routes/api-keys.js +116 -14
  100. package/dist/apps/management/routes/api-keys.js.map +1 -0
  101. package/dist/apps/management/routes/billing.d.ts +1520 -0
  102. package/dist/apps/management/routes/billing.d.ts.map +1 -0
  103. package/dist/apps/management/routes/billing.js +795 -0
  104. package/dist/apps/management/routes/billing.js.map +1 -0
  105. package/dist/apps/{platform → management}/routes/invitations.d.ts +202 -84
  106. package/dist/apps/management/routes/invitations.d.ts.map +1 -0
  107. package/dist/apps/{platform → management}/routes/invitations.js +59 -1
  108. package/dist/apps/management/routes/invitations.js.map +1 -0
  109. package/dist/apps/{platform → management}/routes/me.d.ts +17 -17
  110. package/dist/apps/management/routes/me.d.ts.map +1 -0
  111. package/dist/apps/management/routes/me.js.map +1 -0
  112. package/dist/apps/management/routes/members.d.ts.map +1 -0
  113. package/dist/apps/management/routes/members.js.map +1 -0
  114. package/dist/apps/{platform → management}/routes/orgs.d.ts +50 -36
  115. package/dist/apps/management/routes/orgs.d.ts.map +1 -0
  116. package/dist/apps/{platform → management}/routes/orgs.js +14 -3
  117. package/dist/apps/management/routes/orgs.js.map +1 -0
  118. package/dist/apps/{platform → management}/routes/projects.d.ts +97 -97
  119. package/dist/apps/{platform → management}/routes/projects.d.ts.map +1 -1
  120. package/dist/apps/management/routes/projects.js.map +1 -0
  121. package/dist/apps/management/routes/scopes.d.ts +107 -0
  122. package/dist/apps/management/routes/scopes.d.ts.map +1 -0
  123. package/dist/apps/management/routes/scopes.js +66 -0
  124. package/dist/apps/management/routes/scopes.js.map +1 -0
  125. package/dist/apps/management/routes/usage.d.ts +588 -0
  126. package/dist/apps/management/routes/usage.d.ts.map +1 -0
  127. package/dist/apps/management/routes/usage.js +391 -0
  128. package/dist/apps/management/routes/usage.js.map +1 -0
  129. package/dist/apps/mcp.d.ts +76 -0
  130. package/dist/apps/mcp.d.ts.map +1 -0
  131. package/dist/apps/mcp.js +188 -0
  132. package/dist/apps/mcp.js.map +1 -0
  133. package/dist/apps/relay/App.d.ts +4 -1
  134. package/dist/apps/relay/App.d.ts.map +1 -1
  135. package/dist/apps/relay/App.js +118 -10
  136. package/dist/apps/relay/App.js.map +1 -1
  137. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  138. package/dist/apps/relay/Sponsorships.js +2 -1
  139. package/dist/apps/relay/Sponsorships.js.map +1 -1
  140. package/dist/cli/Cli.d.ts +8 -1
  141. package/dist/cli/Cli.d.ts.map +1 -1
  142. package/dist/cli/Cli.js +11 -3
  143. package/dist/cli/Cli.js.map +1 -1
  144. package/dist/cli/commands/admin.d.ts +4 -0
  145. package/dist/cli/commands/admin.d.ts.map +1 -1
  146. package/dist/cli/commands/admin.js +80 -1
  147. package/dist/cli/commands/admin.js.map +1 -1
  148. package/dist/db/Db.d.ts +7 -0
  149. package/dist/db/Db.d.ts.map +1 -1
  150. package/dist/db/Db.js +126 -0
  151. package/dist/db/Db.js.map +1 -1
  152. package/dist/db/Schema.d.ts +79 -0
  153. package/dist/db/Schema.d.ts.map +1 -1
  154. package/dist/db/Schema.js +88 -2
  155. package/dist/db/Schema.js.map +1 -1
  156. package/dist/db/tables/billingSettings.d.ts +55 -0
  157. package/dist/db/tables/billingSettings.d.ts.map +1 -0
  158. package/dist/db/tables/billingSettings.js +70 -0
  159. package/dist/db/tables/billingSettings.js.map +1 -0
  160. package/dist/db/tables/invitations.js +2 -2
  161. package/dist/db/tables/invitations.js.map +1 -1
  162. package/dist/db/tables/organizations.d.ts +6 -2
  163. package/dist/db/tables/organizations.d.ts.map +1 -1
  164. package/dist/db/tables/organizations.js +10 -4
  165. package/dist/db/tables/organizations.js.map +1 -1
  166. package/dist/db/tables/projects.js +2 -2
  167. package/dist/db/tables/projects.js.map +1 -1
  168. package/dist/db/tables/requestUsage.d.ts +121 -0
  169. package/dist/db/tables/requestUsage.d.ts.map +1 -0
  170. package/dist/db/tables/requestUsage.js +150 -0
  171. package/dist/db/tables/requestUsage.js.map +1 -0
  172. package/dist/db/tables/sponsoredTransactions.d.ts +119 -0
  173. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  174. package/dist/db/tables/sponsoredTransactions.js +155 -2
  175. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  176. package/dist/db/tables/stripeCustomers.d.ts +81 -0
  177. package/dist/db/tables/stripeCustomers.d.ts.map +1 -0
  178. package/dist/db/tables/stripeCustomers.js +120 -0
  179. package/dist/db/tables/stripeCustomers.js.map +1 -0
  180. package/dist/db/tables/users.js +2 -2
  181. package/dist/db/tables/users.js.map +1 -1
  182. package/dist/handlers/internal/sponsorship.d.ts +5 -2
  183. package/dist/handlers/internal/sponsorship.d.ts.map +1 -1
  184. package/dist/handlers/internal/sponsorship.js +19 -5
  185. package/dist/handlers/internal/sponsorship.js.map +1 -1
  186. package/dist/handlers/internal/utils.d.ts +10 -3
  187. package/dist/handlers/internal/utils.d.ts.map +1 -1
  188. package/dist/handlers/internal/utils.js +14 -6
  189. package/dist/handlers/internal/utils.js.map +1 -1
  190. package/dist/index.d.ts +1 -0
  191. package/dist/index.d.ts.map +1 -1
  192. package/dist/index.js +1 -0
  193. package/dist/index.js.map +1 -1
  194. package/dist/internal/Auth.d.ts +18 -4
  195. package/dist/internal/Auth.d.ts.map +1 -1
  196. package/dist/internal/Auth.js +149 -77
  197. package/dist/internal/Auth.js.map +1 -1
  198. package/dist/internal/Cache.d.ts.map +1 -1
  199. package/dist/internal/Cache.js +4 -1
  200. package/dist/internal/Cache.js.map +1 -1
  201. package/dist/internal/EdgeCache.d.ts +10 -0
  202. package/dist/internal/EdgeCache.d.ts.map +1 -1
  203. package/dist/internal/EdgeCache.js +39 -8
  204. package/dist/internal/EdgeCache.js.map +1 -1
  205. package/dist/internal/Fees.d.ts +27 -0
  206. package/dist/internal/Fees.d.ts.map +1 -0
  207. package/dist/internal/Fees.js +48 -0
  208. package/dist/internal/Fees.js.map +1 -0
  209. package/dist/internal/FundingRoutes.d.ts +915 -0
  210. package/dist/internal/FundingRoutes.d.ts.map +1 -0
  211. package/dist/internal/FundingRoutes.js +625 -0
  212. package/dist/internal/FundingRoutes.js.map +1 -0
  213. package/dist/internal/Id.d.ts +15 -0
  214. package/dist/internal/Id.d.ts.map +1 -0
  215. package/dist/internal/Id.js +22 -0
  216. package/dist/internal/Id.js.map +1 -0
  217. package/dist/internal/Log.d.ts +2 -0
  218. package/dist/internal/Log.d.ts.map +1 -1
  219. package/dist/internal/Log.js +3 -0
  220. package/dist/internal/Log.js.map +1 -1
  221. package/dist/internal/OpenApi.d.ts +10 -1
  222. package/dist/internal/OpenApi.d.ts.map +1 -1
  223. package/dist/internal/OpenApi.js +8 -1
  224. package/dist/internal/OpenApi.js.map +1 -1
  225. package/dist/internal/RateLimit.d.ts +25 -0
  226. package/dist/internal/RateLimit.d.ts.map +1 -1
  227. package/dist/internal/RateLimit.js +51 -0
  228. package/dist/internal/RateLimit.js.map +1 -1
  229. package/dist/internal/Response.d.ts +1 -1
  230. package/dist/internal/Response.d.ts.map +1 -1
  231. package/dist/internal/Schema.d.ts +8 -0
  232. package/dist/internal/Schema.d.ts.map +1 -1
  233. package/dist/internal/Schema.js +7 -0
  234. package/dist/internal/Schema.js.map +1 -1
  235. package/dist/internal/Webhooks.d.ts.map +1 -1
  236. package/dist/internal/Webhooks.js +3 -3
  237. package/dist/internal/Webhooks.js.map +1 -1
  238. package/package.json +8 -7
  239. package/src/ApiKey.ts +9 -2
  240. package/src/ApiKeys.test.ts +51 -0
  241. package/src/ApiKeys.ts +50 -1
  242. package/src/App.test.ts +33 -86718
  243. package/src/App.ts +26 -8
  244. package/src/Client.test-d.ts +353 -2
  245. package/src/Scope.ts +16 -3
  246. package/src/admin/apps/scopes.test.ts +6 -0
  247. package/src/admin/apps/scopes.ts +3 -0
  248. package/src/admin/ui/src/components/Page.tsx +2 -3
  249. package/src/admin/ui/src/routes/__root.tsx +2 -2
  250. package/src/admin/ui/src/routes/api-keys.tsx +2 -2
  251. package/src/admin/ui.generated.ts +13 -13
  252. package/src/analytics/Analytics.test.ts +527 -0
  253. package/src/analytics/Analytics.ts +318 -0
  254. package/src/analytics/tables/requestEvents.ts +523 -0
  255. package/src/apps/composition.test.ts +26 -13
  256. package/src/apps/data/App.test.ts +72 -0
  257. package/src/apps/data/App.ts +37 -0
  258. package/src/apps/data/FundingRouteProviders.test.ts +281 -0
  259. package/src/apps/data/FundingRouteProviders.ts +459 -0
  260. package/src/apps/data/index.ts +1 -0
  261. package/src/apps/data/routes/funding.test.ts +314 -0
  262. package/src/apps/data/routes/funding.ts +698 -0
  263. package/src/apps/data/routes/receipts.ts +2 -9
  264. package/src/apps/data/routes/rpc.test.ts +78 -2
  265. package/src/apps/data/routes/rpc.ts +31 -1
  266. package/src/apps/data/routes/webhooks.test.ts +1 -1
  267. package/src/apps/data/routes/webhooks.ts +11 -8
  268. package/src/apps/docs/App.ts +30 -101
  269. package/src/apps/docs/reference.ts +132 -0
  270. package/src/apps/index.ts +3 -2
  271. package/src/apps/{platform → management}/App.ts +56 -17
  272. package/src/apps/management/Billing.test.ts +530 -0
  273. package/src/apps/management/Billing.ts +682 -0
  274. package/src/apps/management/index.ts +2 -0
  275. package/src/apps/{platform → management}/routes/api-keys.test.ts +172 -9
  276. package/src/apps/{platform → management}/routes/api-keys.ts +137 -21
  277. package/src/apps/management/routes/billing.test.ts +1100 -0
  278. package/src/apps/management/routes/billing.ts +966 -0
  279. package/src/apps/{platform → management}/routes/invitations.test.ts +55 -7
  280. package/src/apps/{platform → management}/routes/invitations.ts +69 -1
  281. package/src/apps/management/routes/me.test.ts +351 -0
  282. package/src/apps/{platform → management}/routes/orgs.ts +26 -4
  283. package/src/apps/management/routes/scopes.test.ts +29 -0
  284. package/src/apps/management/routes/scopes.ts +85 -0
  285. package/src/apps/management/routes/usage.test.ts +422 -0
  286. package/src/apps/management/routes/usage.ts +527 -0
  287. package/src/apps/mcp.test.ts +206 -0
  288. package/src/apps/mcp.ts +250 -0
  289. package/src/apps/relay/App.test.ts +457 -8
  290. package/src/apps/relay/App.ts +120 -12
  291. package/src/apps/relay/Sponsorships.test.ts +1 -1
  292. package/src/apps/relay/Sponsorships.ts +2 -1
  293. package/src/cli/Cli.test.ts +25 -2
  294. package/src/cli/Cli.ts +17 -2
  295. package/src/cli/commands/admin.test.ts +83 -0
  296. package/src/cli/commands/admin.ts +89 -1
  297. package/src/db/Db.ts +137 -0
  298. package/src/db/Schema.ts +104 -2
  299. package/src/db/tables/billingSettings.test.ts +87 -0
  300. package/src/db/tables/billingSettings.ts +108 -0
  301. package/src/db/tables/invitations.ts +2 -2
  302. package/src/db/tables/organizations.test.ts +1 -1
  303. package/src/db/tables/organizations.ts +15 -5
  304. package/src/db/tables/projects.ts +2 -2
  305. package/src/db/tables/requestUsage.ts +231 -0
  306. package/src/db/tables/sponsoredTransactions.test.ts +108 -1
  307. package/src/db/tables/sponsoredTransactions.ts +230 -2
  308. package/src/db/tables/stripeCustomers.test.ts +109 -0
  309. package/src/db/tables/stripeCustomers.ts +162 -0
  310. package/src/db/tables/users.ts +2 -2
  311. package/src/handlers/internal/sponsorship.ts +34 -7
  312. package/src/handlers/internal/utils.ts +19 -7
  313. package/src/index.ts +1 -0
  314. package/src/internal/Auth.test.ts +175 -25
  315. package/src/internal/Auth.ts +176 -87
  316. package/src/internal/Cache.ts +5 -1
  317. package/src/internal/EdgeCache.test.ts +27 -4
  318. package/src/internal/EdgeCache.ts +47 -9
  319. package/src/internal/Fees.test.ts +32 -0
  320. package/src/internal/Fees.ts +51 -0
  321. package/src/internal/FundingRoutes.test.ts +213 -0
  322. package/src/internal/FundingRoutes.ts +898 -0
  323. package/src/internal/Id.test.ts +17 -0
  324. package/src/internal/Id.ts +24 -0
  325. package/src/internal/Log.test.ts +1 -0
  326. package/src/internal/Log.ts +5 -0
  327. package/src/internal/OpenApi.ts +12 -1
  328. package/src/internal/RateLimit.test.ts +84 -0
  329. package/src/internal/RateLimit.ts +70 -0
  330. package/src/internal/Response.ts +1 -1
  331. package/src/internal/Schema.ts +8 -0
  332. package/src/internal/Webhooks.test.ts +3 -3
  333. package/src/internal/Webhooks.ts +3 -3
  334. package/dist/apps/platform/App.d.ts.map +0 -1
  335. package/dist/apps/platform/App.js.map +0 -1
  336. package/dist/apps/platform/index.d.ts +0 -2
  337. package/dist/apps/platform/index.d.ts.map +0 -1
  338. package/dist/apps/platform/index.js +0 -2
  339. package/dist/apps/platform/index.js.map +0 -1
  340. package/dist/apps/platform/routes/api-keys.d.ts.map +0 -1
  341. package/dist/apps/platform/routes/api-keys.js.map +0 -1
  342. package/dist/apps/platform/routes/invitations.d.ts.map +0 -1
  343. package/dist/apps/platform/routes/invitations.js.map +0 -1
  344. package/dist/apps/platform/routes/me.d.ts.map +0 -1
  345. package/dist/apps/platform/routes/me.js.map +0 -1
  346. package/dist/apps/platform/routes/members.d.ts.map +0 -1
  347. package/dist/apps/platform/routes/members.js.map +0 -1
  348. package/dist/apps/platform/routes/orgs.d.ts.map +0 -1
  349. package/dist/apps/platform/routes/orgs.js.map +0 -1
  350. package/dist/apps/platform/routes/projects.js.map +0 -1
  351. package/src/apps/platform/index.ts +0 -1
  352. package/src/apps/platform/routes/me.test.ts +0 -121
  353. /package/dist/apps/{platform → management}/routes/me.js +0 -0
  354. /package/dist/apps/{platform → management}/routes/members.d.ts +0 -0
  355. /package/dist/apps/{platform → management}/routes/members.js +0 -0
  356. /package/dist/apps/{platform → management}/routes/projects.js +0 -0
  357. /package/src/apps/{platform → management}/routes/me.ts +0 -0
  358. /package/src/apps/{platform → management}/routes/members.test.ts +0 -0
  359. /package/src/apps/{platform → management}/routes/members.ts +0 -0
  360. /package/src/apps/{platform → management}/routes/orgs.test.ts +0 -0
  361. /package/src/apps/{platform → management}/routes/projects.test.ts +0 -0
  362. /package/src/apps/{platform → management}/routes/projects.ts +0 -0
@@ -0,0 +1,51 @@
1
+ import { Hex } from 'ox'
2
+
3
+ // Tempo gas prices (`maxFeePerGas`, `effectiveGasPrice`, block base fee) are
4
+ // denominated in attodollars (10^-18 USD) per gas, while fee-token balances
5
+ // use 6 decimals (microdollars, 10^-6 USD). The charged fee is
6
+ // `ceil(gas × gasPrice / 10^12)`, mirroring `calc_gas_balance_spending` in
7
+ // tempoxyz/tempo.
8
+
9
+ /** Attodollar exponent gas prices use (10^-18 USD per gas), fixed by the fee spec. */
10
+ const attoDecimals = 18
11
+
12
+ /** Fee-token decimals: TIP-20 fixes 6 (1 token unit = 1 microdollar). */
13
+ export const tokenDecimals = 6
14
+
15
+ /** Scaling between attodollar gas math and fee-token units, derived from the exponents. */
16
+ export const scalingFactor = 10n ** BigInt(attoDecimals - tokenDecimals)
17
+
18
+ /**
19
+ * Fee in fee-token base units for a gas amount priced in attodollars per gas
20
+ * (ceiling division). Works for actual fees (`gasUsed × effectiveGasPrice`)
21
+ * and signed caps (`gas × maxFeePerGas`) alike.
22
+ *
23
+ * @param gas - Gas amount.
24
+ * @param gasPrice - Price in attodollars per gas.
25
+ * @returns The fee in fee-token base units.
26
+ */
27
+ export function fromGas(gas: bigint, gasPrice: bigint): bigint {
28
+ return (gas * gasPrice + scalingFactor - 1n) / scalingFactor
29
+ }
30
+
31
+ /**
32
+ * Signed fee cap of a candidate transaction in fee-token base units:
33
+ * `gas × maxFeePerGas` (attodollars) scaled through {@link fromGas}. Undefined
34
+ * when either field is missing or unparseable, so callers can fail closed.
35
+ *
36
+ * @param request - Transaction-shaped fee fields.
37
+ * @returns The cap in base units, or undefined.
38
+ */
39
+ export function maxOf(request: { gas?: unknown; maxFeePerGas?: unknown }): bigint | undefined {
40
+ const gas = toBigInt(request.gas)
41
+ const maxFeePerGas = toBigInt(request.maxFeePerGas)
42
+ if (gas === undefined || maxFeePerGas === undefined) return undefined
43
+ return fromGas(gas, maxFeePerGas)
44
+ }
45
+
46
+ /** Fee fields arrive as bigints (raw envelopes) or hex quantities (fills). */
47
+ function toBigInt(value: unknown): bigint | undefined {
48
+ if (typeof value === 'bigint') return value
49
+ if (typeof value === 'string' && Hex.validate(value)) return Hex.toBigInt(value)
50
+ return undefined
51
+ }
@@ -0,0 +1,213 @@
1
+ import * as FundingRoutes from './FundingRoutes.js'
2
+
3
+ const baseUsdcRequest = {
4
+ limit: 10,
5
+ provider: 'across',
6
+ sourceAmount: '1000000',
7
+ sourceAmountUnits: 'baseUnits',
8
+ sourceChain: 'base',
9
+ sourceToken: 'USDC',
10
+ } as const
11
+
12
+ describe('listRoutes', () => {
13
+ test('enriches static candidates with adapter quote probes', async () => {
14
+ let seen: FundingRoutes.QuoteProbeInput | undefined
15
+ const routes = await FundingRoutes.listRoutes({
16
+ ...baseUsdcRequest,
17
+ adapters: {
18
+ across: {
19
+ async probeQuote(input, signal) {
20
+ seen = input
21
+ expect(signal.aborted).toBe(false)
22
+ expect(input.cache.bypass).toBe(false)
23
+ expect(input.destinationChain.id).toBe('eip155:4217')
24
+ expect(input.destinationToken.symbol).toBe('USDC.e')
25
+ expect(input.include).toEqual([])
26
+ expect(input.request.sourceChain).toBe('base')
27
+ return {
28
+ expiresAt: '2026-01-01T00:00:30Z',
29
+ limits: {
30
+ instantSourceAmount: '1000000000',
31
+ maxSourceAmount: '100000000000',
32
+ minSourceAmount: '500000',
33
+ },
34
+ minimumOutputAmount: '980000',
35
+ outputAmount: '990000',
36
+ outputAmountFormatted: '0.99',
37
+ quality: {
38
+ availableVolumeUsd: '1000.00',
39
+ estimatedSeconds: 4,
40
+ feeBps: 12,
41
+ historicalVolumeUsd24h: '100000.00',
42
+ instantVolumeUsd: '1000.00',
43
+ liquiditySource: 'providerQuote',
44
+ score: 91,
45
+ sourceDetail: 'providerEndpoint',
46
+ tier: 'liquid',
47
+ },
48
+ sampledAt: '2026-01-01T00:00:00Z',
49
+ status: 'available',
50
+ }
51
+ },
52
+ },
53
+ },
54
+ })
55
+
56
+ expect(seen?.route.id).toBe('base-usdc-tempo-usdce-across')
57
+ expect(seen?.sourceAmount.amount).toBe('1000000')
58
+ expect(seen?.sourceChain.id).toBe('eip155:8453')
59
+ expect(seen?.sourceToken.symbol).toBe('USDC')
60
+ expect(routes).toHaveLength(1)
61
+ expect(routes[0]).toMatchObject({
62
+ errorCode: null,
63
+ id: 'base-usdc-tempo-usdce-across',
64
+ quality: {
65
+ availableVolumeUsd: '1000.00',
66
+ estimatedSeconds: 4,
67
+ feeBps: 12,
68
+ historicalVolumeUsd24h: '100000.00',
69
+ instantVolumeUsd: '1000.00',
70
+ liquiditySource: 'providerQuote',
71
+ score: 91,
72
+ sourceDetail: 'providerEndpoint',
73
+ tier: 'liquid',
74
+ },
75
+ quote: {
76
+ expiresAt: '2026-01-01T00:00:30Z',
77
+ inputAmount: '1000000',
78
+ limits: {
79
+ instantSourceAmount: '1000000000',
80
+ maxSourceAmount: '100000000000',
81
+ minSourceAmount: '500000',
82
+ },
83
+ minimumOutputAmount: '980000',
84
+ outputAmount: '990000',
85
+ outputAmountFormatted: '0.99',
86
+ sampledAt: '2026-01-01T00:00:00Z',
87
+ },
88
+ status: 'available',
89
+ })
90
+ })
91
+
92
+ test('leaves candidates static when their provider has no adapter', async () => {
93
+ let calls = 0
94
+ const routes = await FundingRoutes.listRoutes({
95
+ ...baseUsdcRequest,
96
+ adapters: {
97
+ relay: {
98
+ async probeQuote() {
99
+ calls += 1
100
+ throw new Error('unexpected call')
101
+ },
102
+ },
103
+ },
104
+ })
105
+
106
+ expect(calls).toBe(0)
107
+ expect(routes[0]).toMatchObject({
108
+ quality: {
109
+ liquiditySource: 'staticInventory',
110
+ sourceDetail: null,
111
+ tier: 'unknown',
112
+ },
113
+ quote: null,
114
+ status: 'unknown',
115
+ })
116
+ })
117
+
118
+ test('marks candidates as errors when an adapter throws', async () => {
119
+ const routes = await FundingRoutes.listRoutes({
120
+ ...baseUsdcRequest,
121
+ adapters: {
122
+ across: {
123
+ async probeQuote() {
124
+ throw new Error('upstream unavailable')
125
+ },
126
+ },
127
+ },
128
+ })
129
+
130
+ expect(routes[0]).toMatchObject({
131
+ errorCode: 'provider_error',
132
+ quality: {
133
+ liquiditySource: 'providerError',
134
+ sourceDetail: null,
135
+ tier: 'error',
136
+ },
137
+ quote: null,
138
+ status: 'error',
139
+ })
140
+ })
141
+
142
+ test('aborts slow adapters and marks candidates as timed-out errors', async () => {
143
+ let aborted = false
144
+ const routes = await FundingRoutes.listRoutes({
145
+ ...baseUsdcRequest,
146
+ adapterTimeoutMs: 1,
147
+ adapters: {
148
+ across: {
149
+ probeQuote(_input, signal) {
150
+ signal.addEventListener('abort', () => {
151
+ aborted = true
152
+ })
153
+ return new Promise<FundingRoutes.QuoteProbeResult>(() => {})
154
+ },
155
+ },
156
+ },
157
+ })
158
+
159
+ expect(aborted).toBe(true)
160
+ expect(routes[0]).toMatchObject({
161
+ errorCode: 'provider_timeout',
162
+ quality: {
163
+ liquiditySource: 'providerError',
164
+ sourceDetail: null,
165
+ tier: 'error',
166
+ },
167
+ quote: null,
168
+ status: 'error',
169
+ })
170
+ })
171
+
172
+ test('passes include and cache policy through to adapters', async () => {
173
+ let seen: FundingRoutes.QuoteProbeInput | undefined
174
+ const routes = await FundingRoutes.listRoutes({
175
+ ...baseUsdcRequest,
176
+ adapters: {
177
+ across: {
178
+ async probeQuote(input) {
179
+ seen = input
180
+ return {
181
+ errorCode: 'provider_unavailable',
182
+ sampledAt: '2026-01-01T00:00:00Z',
183
+ status: 'error',
184
+ }
185
+ },
186
+ },
187
+ },
188
+ cache: { bypass: true },
189
+ include: ['quotes'],
190
+ })
191
+
192
+ expect(seen?.cache.bypass).toBe(true)
193
+ expect(seen?.include).toEqual(['quotes'])
194
+ expect(seen?.request.include).toEqual(['quotes'])
195
+ expect(routes[0]).toMatchObject({
196
+ errorCode: 'provider_unavailable',
197
+ quote: null,
198
+ status: 'error',
199
+ })
200
+ })
201
+ })
202
+
203
+ describe('parseInclude', () => {
204
+ test('parses comma-separated include values', () => {
205
+ expect(FundingRoutes.parseInclude('quotes,quotes')).toEqual(['quotes'])
206
+ })
207
+
208
+ test('rejects unsupported include values', () => {
209
+ expect(() => FundingRoutes.parseInclude('quotes,debug')).toThrow(
210
+ FundingRoutes.UnsupportedIncludeError,
211
+ )
212
+ })
213
+ })