tapimo 0.15.0 → 0.18.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 (734) hide show
  1. package/README.md +137 -0
  2. package/dist/ApiKey.d.ts +1 -0
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +4 -2
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +37 -11
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +163 -10
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +13085 -11974
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +46 -15
  13. package/dist/App.js.map +1 -1
  14. package/dist/Scope.d.ts +1 -1
  15. package/dist/Scope.d.ts.map +1 -1
  16. package/dist/Scope.js +1 -1
  17. package/dist/Scope.js.map +1 -1
  18. package/dist/admin/App.d.ts +896 -191
  19. package/dist/admin/App.d.ts.map +1 -1
  20. package/dist/admin/App.js +5 -1
  21. package/dist/admin/App.js.map +1 -1
  22. package/dist/admin/apps/api-keys.d.ts +33 -33
  23. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.js +8 -3
  25. package/dist/admin/apps/api-keys.js.map +1 -1
  26. package/dist/admin/apps/earn-vaults.d.ts +66 -27
  27. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  28. package/dist/admin/apps/earn-vaults.js +36 -7
  29. package/dist/admin/apps/earn-vaults.js.map +1 -1
  30. package/dist/admin/apps/organizations.d.ts +25 -25
  31. package/dist/admin/apps/organizations.d.ts.map +1 -1
  32. package/dist/admin/apps/organizations.js +5 -4
  33. package/dist/admin/apps/organizations.js.map +1 -1
  34. package/dist/admin/apps/route-policies.d.ts +632 -0
  35. package/dist/admin/apps/route-policies.d.ts.map +1 -0
  36. package/dist/admin/apps/route-policies.js +257 -0
  37. package/dist/admin/apps/route-policies.js.map +1 -0
  38. package/dist/admin/apps/routes-support.js +39 -3
  39. package/dist/admin/apps/routes-support.js.map +1 -1
  40. package/dist/admin/apps/routes.d.ts +454 -1
  41. package/dist/admin/apps/routes.d.ts.map +1 -1
  42. package/dist/admin/apps/routes.js +82 -1
  43. package/dist/admin/apps/routes.js.map +1 -1
  44. package/dist/admin/apps/verified-tokens.d.ts +10 -4
  45. package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
  46. package/dist/admin/apps/verified-tokens.js +24 -4
  47. package/dist/admin/apps/verified-tokens.js.map +1 -1
  48. package/dist/admin/index.d.ts +0 -1
  49. package/dist/admin/index.d.ts.map +1 -1
  50. package/dist/admin/index.js +0 -1
  51. package/dist/admin/index.js.map +1 -1
  52. package/dist/admin/ui.generated.d.ts +1 -1
  53. package/dist/admin/ui.generated.d.ts.map +1 -1
  54. package/dist/admin/ui.generated.js +99 -103
  55. package/dist/admin/ui.generated.js.map +1 -1
  56. package/dist/analytics/Analytics.d.ts.map +1 -1
  57. package/dist/analytics/Analytics.js +65 -1
  58. package/dist/analytics/Analytics.js.map +1 -1
  59. package/dist/analytics/tables/requestEvents.d.ts +1 -1
  60. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  61. package/dist/analytics/tables/requestEvents.js +58 -59
  62. package/dist/analytics/tables/requestEvents.js.map +1 -1
  63. package/dist/apps/data/App.d.ts +2709 -2670
  64. package/dist/apps/data/App.d.ts.map +1 -1
  65. package/dist/apps/data/routes/activities.d.ts +5 -5
  66. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  67. package/dist/apps/data/routes/activities.js +50 -0
  68. package/dist/apps/data/routes/activities.js.map +1 -1
  69. package/dist/apps/data/routes/addresses.d.ts +248 -248
  70. package/dist/apps/data/routes/balances.d.ts +22 -22
  71. package/dist/apps/data/routes/balances.d.ts.map +1 -1
  72. package/dist/apps/data/routes/balances.js +5 -7
  73. package/dist/apps/data/routes/balances.js.map +1 -1
  74. package/dist/apps/data/routes/coingecko.d.ts +54 -54
  75. package/dist/apps/data/routes/earn.d.ts +103 -12
  76. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  77. package/dist/apps/data/routes/earn.js +456 -220
  78. package/dist/apps/data/routes/earn.js.map +1 -1
  79. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  80. package/dist/apps/data/routes/exchanges.js +267 -97
  81. package/dist/apps/data/routes/exchanges.js.map +1 -1
  82. package/dist/apps/data/routes/fee-amm.d.ts +1 -19
  83. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  84. package/dist/apps/data/routes/fee-amm.js +93 -56
  85. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  86. package/dist/apps/data/routes/indexer.d.ts +10 -10
  87. package/dist/apps/data/routes/rpc.d.ts +30 -30
  88. package/dist/apps/data/routes/rpc.js +45 -11
  89. package/dist/apps/data/routes/rpc.js.map +1 -1
  90. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  91. package/dist/apps/data/routes/tokens.js +11 -6
  92. package/dist/apps/data/routes/tokens.js.map +1 -1
  93. package/dist/apps/data/routes/transactions.d.ts +2 -0
  94. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  95. package/dist/apps/data/routes/transactions.js +30 -22
  96. package/dist/apps/data/routes/transactions.js.map +1 -1
  97. package/dist/apps/data/routes/transfers.d.ts +12 -12
  98. package/dist/apps/data/routes/valuation.d.ts +30 -30
  99. package/dist/apps/data/routes/verified-tokens.d.ts +5 -5
  100. package/dist/apps/data/routes/webhooks.d.ts +1 -1
  101. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  102. package/dist/apps/data/routes/webhooks.js +18 -11
  103. package/dist/apps/data/routes/webhooks.js.map +1 -1
  104. package/dist/apps/data/routes/zones.d.ts +3 -3
  105. package/dist/apps/management/App.d.ts +3043 -2198
  106. package/dist/apps/management/App.d.ts.map +1 -1
  107. package/dist/apps/management/App.js +2 -0
  108. package/dist/apps/management/App.js.map +1 -1
  109. package/dist/apps/management/Billing.d.ts +2 -4
  110. package/dist/apps/management/Billing.d.ts.map +1 -1
  111. package/dist/apps/management/Billing.js +65 -26
  112. package/dist/apps/management/Billing.js.map +1 -1
  113. package/dist/apps/management/routes/api-keys.d.ts +16 -4
  114. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  115. package/dist/apps/management/routes/api-keys.js +70 -11
  116. package/dist/apps/management/routes/api-keys.js.map +1 -1
  117. package/dist/apps/management/routes/billing.d.ts +84 -84
  118. package/dist/apps/management/routes/cli.d.ts +912 -0
  119. package/dist/apps/management/routes/cli.d.ts.map +1 -0
  120. package/dist/apps/management/routes/cli.js +416 -0
  121. package/dist/apps/management/routes/cli.js.map +1 -0
  122. package/dist/apps/management/routes/faucet.d.ts +8 -8
  123. package/dist/apps/management/routes/invitations.d.ts +24 -24
  124. package/dist/apps/management/routes/invite-links.d.ts +66 -66
  125. package/dist/apps/management/routes/members.d.ts +16 -16
  126. package/dist/apps/management/routes/orgs.d.ts +20 -20
  127. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  128. package/dist/apps/management/routes/orgs.js +8 -2
  129. package/dist/apps/management/routes/orgs.js.map +1 -1
  130. package/dist/apps/management/routes/projects.d.ts +76 -76
  131. package/dist/apps/management/routes/usage.d.ts +8 -8
  132. package/dist/apps/management/routes/verified-token-requests.d.ts +42 -42
  133. package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
  134. package/dist/apps/management/routes/verified-token-requests.js +7 -9
  135. package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
  136. package/dist/apps/management/routes/webhooks.d.ts +119 -119
  137. package/dist/apps/mcp.d.ts.map +1 -1
  138. package/dist/apps/mcp.js +16 -3
  139. package/dist/apps/mcp.js.map +1 -1
  140. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
  141. package/dist/apps/mpp/internal/Policy.js +4 -2
  142. package/dist/apps/mpp/internal/Policy.js.map +1 -1
  143. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
  144. package/dist/apps/mpp/internal/Sponsorship.js +6 -4
  145. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
  146. package/dist/apps/relay/App.d.ts +8 -0
  147. package/dist/apps/relay/App.d.ts.map +1 -1
  148. package/dist/apps/relay/App.js +16 -4
  149. package/dist/apps/relay/App.js.map +1 -1
  150. package/dist/apps/relay/Sponsorships.d.ts +4 -6
  151. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  152. package/dist/apps/relay/Sponsorships.js +71 -60
  153. package/dist/apps/relay/Sponsorships.js.map +1 -1
  154. package/dist/apps/routes/Access.d.ts +53 -0
  155. package/dist/apps/routes/Access.d.ts.map +1 -1
  156. package/dist/apps/routes/Access.js +121 -0
  157. package/dist/apps/routes/Access.js.map +1 -1
  158. package/dist/apps/routes/App.d.ts +397 -158
  159. package/dist/apps/routes/App.d.ts.map +1 -1
  160. package/dist/apps/routes/App.js.map +1 -1
  161. package/dist/apps/routes/routes/deposit-addresses.d.ts +169 -61
  162. package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -1
  163. package/dist/apps/routes/routes/deposit-addresses.js +217 -32
  164. package/dist/apps/routes/routes/deposit-addresses.js.map +1 -1
  165. package/dist/apps/routes/routes/quotes.d.ts +90 -0
  166. package/dist/apps/routes/routes/quotes.d.ts.map +1 -1
  167. package/dist/apps/routes/routes/quotes.js +101 -27
  168. package/dist/apps/routes/routes/quotes.js.map +1 -1
  169. package/dist/apps/routes/routes/transfers.d.ts +187 -135
  170. package/dist/apps/routes/routes/transfers.d.ts.map +1 -1
  171. package/dist/apps/routes/routes/transfers.js +182 -37
  172. package/dist/apps/routes/routes/transfers.js.map +1 -1
  173. package/dist/cli/ApiKeys.d.ts +120 -0
  174. package/dist/cli/ApiKeys.d.ts.map +1 -0
  175. package/dist/cli/ApiKeys.js +138 -0
  176. package/dist/cli/ApiKeys.js.map +1 -0
  177. package/dist/cli/Cli.d.ts +92 -34
  178. package/dist/cli/Cli.d.ts.map +1 -1
  179. package/dist/cli/Cli.js +188 -11
  180. package/dist/cli/Cli.js.map +1 -1
  181. package/dist/cli/Credentials.d.ts +95 -0
  182. package/dist/cli/Credentials.d.ts.map +1 -0
  183. package/dist/cli/Credentials.js +110 -0
  184. package/dist/cli/Credentials.js.map +1 -0
  185. package/dist/cli/Spec.d.ts +59 -0
  186. package/dist/cli/Spec.d.ts.map +1 -0
  187. package/dist/cli/Spec.js +77 -0
  188. package/dist/cli/Spec.js.map +1 -0
  189. package/dist/cli/bin.js +5 -1
  190. package/dist/cli/bin.js.map +1 -1
  191. package/dist/cli/commands/admin.d.ts +5 -5
  192. package/dist/cli/commands/admin.d.ts.map +1 -1
  193. package/dist/cli/commands/auth.d.ts +73 -0
  194. package/dist/cli/commands/auth.d.ts.map +1 -0
  195. package/dist/cli/commands/auth.js +204 -0
  196. package/dist/cli/commands/auth.js.map +1 -0
  197. package/dist/cli/commands/keys.d.ts +17 -0
  198. package/dist/cli/commands/keys.d.ts.map +1 -0
  199. package/dist/cli/commands/keys.js +109 -0
  200. package/dist/cli/commands/keys.js.map +1 -0
  201. package/dist/cloudflare.d.ts +27 -2
  202. package/dist/cloudflare.d.ts.map +1 -1
  203. package/dist/cloudflare.js +144 -17
  204. package/dist/cloudflare.js.map +1 -1
  205. package/dist/db/Db.d.ts +23 -0
  206. package/dist/db/Db.d.ts.map +1 -1
  207. package/dist/db/Db.js +418 -1
  208. package/dist/db/Db.js.map +1 -1
  209. package/dist/db/Schema.d.ts +44 -1
  210. package/dist/db/Schema.d.ts.map +1 -1
  211. package/dist/db/Schema.js +56 -3
  212. package/dist/db/Schema.js.map +1 -1
  213. package/dist/db/tables/apiKeyAdmissions.d.ts +28 -2
  214. package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -1
  215. package/dist/db/tables/apiKeyAdmissions.js +65 -9
  216. package/dist/db/tables/apiKeyAdmissions.js.map +1 -1
  217. package/dist/db/tables/apiKeyOwnerTombstones.d.ts +2 -0
  218. package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -1
  219. package/dist/db/tables/apiKeyOwnerTombstones.js +2 -2
  220. package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -1
  221. package/dist/db/tables/authAccounts.d.ts.map +1 -1
  222. package/dist/db/tables/authAccounts.js +1 -0
  223. package/dist/db/tables/authAccounts.js.map +1 -1
  224. package/dist/db/tables/earnVaults.d.ts +5 -1
  225. package/dist/db/tables/earnVaults.d.ts.map +1 -1
  226. package/dist/db/tables/earnVaults.js +12 -1
  227. package/dist/db/tables/earnVaults.js.map +1 -1
  228. package/dist/db/tables/organizations.d.ts +4 -2
  229. package/dist/db/tables/organizations.d.ts.map +1 -1
  230. package/dist/db/tables/organizations.js +8 -34
  231. package/dist/db/tables/organizations.js.map +1 -1
  232. package/dist/db/tables/requestUsage.d.ts +5 -1
  233. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  234. package/dist/db/tables/requestUsage.js +10 -2
  235. package/dist/db/tables/requestUsage.js.map +1 -1
  236. package/dist/db/tables/rewardEligibilityAssociations.d.ts +13 -0
  237. package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -1
  238. package/dist/db/tables/rewardEligibilityAssociations.js +11 -0
  239. package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -1
  240. package/dist/db/tables/rewardRuns.d.ts.map +1 -1
  241. package/dist/db/tables/rewardRuns.js +4 -0
  242. package/dist/db/tables/rewardRuns.js.map +1 -1
  243. package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -1
  244. package/dist/db/tables/rewardTransactionAttempts.js +2 -0
  245. package/dist/db/tables/rewardTransactionAttempts.js.map +1 -1
  246. package/dist/db/tables/routesDepositAddresses.d.ts +29 -0
  247. package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -1
  248. package/dist/db/tables/routesDepositAddresses.js +84 -31
  249. package/dist/db/tables/routesDepositAddresses.js.map +1 -1
  250. package/dist/db/tables/routesDeposits.d.ts.map +1 -1
  251. package/dist/db/tables/routesDeposits.js +31 -21
  252. package/dist/db/tables/routesDeposits.js.map +1 -1
  253. package/dist/db/tables/routesIdempotency.d.ts.map +1 -1
  254. package/dist/db/tables/routesIdempotency.js +2 -0
  255. package/dist/db/tables/routesIdempotency.js.map +1 -1
  256. package/dist/db/tables/routesPolicies.d.ts +58 -0
  257. package/dist/db/tables/routesPolicies.d.ts.map +1 -0
  258. package/dist/db/tables/routesPolicies.js +198 -0
  259. package/dist/db/tables/routesPolicies.js.map +1 -0
  260. package/dist/db/tables/routesTransferSubsidies.d.ts +22 -0
  261. package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -1
  262. package/dist/db/tables/routesTransferSubsidies.js +41 -0
  263. package/dist/db/tables/routesTransferSubsidies.js.map +1 -1
  264. package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -1
  265. package/dist/db/tables/routesTransferSubsidyNonces.js +12 -4
  266. package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -1
  267. package/dist/db/tables/routesTransfers.d.ts +26 -1
  268. package/dist/db/tables/routesTransfers.d.ts.map +1 -1
  269. package/dist/db/tables/routesTransfers.js +36 -6
  270. package/dist/db/tables/routesTransfers.js.map +1 -1
  271. package/dist/db/tables/sponsoredTransactions.d.ts +45 -13
  272. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  273. package/dist/db/tables/sponsoredTransactions.js +144 -33
  274. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  275. package/dist/db/tables/users.d.ts +2 -0
  276. package/dist/db/tables/users.d.ts.map +1 -1
  277. package/dist/db/tables/users.js +11 -0
  278. package/dist/db/tables/users.js.map +1 -1
  279. package/dist/db/tables/verifiedTokenRequests.d.ts +21 -4
  280. package/dist/db/tables/verifiedTokenRequests.d.ts.map +1 -1
  281. package/dist/db/tables/verifiedTokenRequests.js +65 -44
  282. package/dist/db/tables/verifiedTokenRequests.js.map +1 -1
  283. package/dist/handlers/internal/multisig.d.ts +1 -1
  284. package/dist/handlers/internal/multisig.d.ts.map +1 -1
  285. package/dist/handlers/internal/multisig.js +3 -2
  286. package/dist/handlers/internal/multisig.js.map +1 -1
  287. package/dist/handlers/relay.d.ts +2 -0
  288. package/dist/handlers/relay.d.ts.map +1 -1
  289. package/dist/handlers/relay.js +34 -15
  290. package/dist/handlers/relay.js.map +1 -1
  291. package/dist/internal/Auth.d.ts +73 -6
  292. package/dist/internal/Auth.d.ts.map +1 -1
  293. package/dist/internal/Auth.js +212 -85
  294. package/dist/internal/Auth.js.map +1 -1
  295. package/dist/internal/BetterAuth.d.ts +22 -0
  296. package/dist/internal/BetterAuth.d.ts.map +1 -1
  297. package/dist/internal/BetterAuth.js +17 -14
  298. package/dist/internal/BetterAuth.js.map +1 -1
  299. package/dist/internal/Cache.d.ts +5 -0
  300. package/dist/internal/Cache.d.ts.map +1 -1
  301. package/dist/internal/Cache.js +3 -1
  302. package/dist/internal/Cache.js.map +1 -1
  303. package/dist/internal/CliAuth.d.ts +243 -0
  304. package/dist/internal/CliAuth.d.ts.map +1 -0
  305. package/dist/internal/CliAuth.js +249 -0
  306. package/dist/internal/CliAuth.js.map +1 -0
  307. package/dist/internal/EarnSharePrices.d.ts +1 -1
  308. package/dist/internal/EarnSharePrices.d.ts.map +1 -1
  309. package/dist/internal/EarnSharePrices.js +7 -3
  310. package/dist/internal/EarnSharePrices.js.map +1 -1
  311. package/dist/internal/EarnVaults.d.ts +47 -0
  312. package/dist/internal/EarnVaults.d.ts.map +1 -1
  313. package/dist/internal/EarnVaults.js +188 -4
  314. package/dist/internal/EarnVaults.js.map +1 -1
  315. package/dist/internal/EarnWithdrawals.d.ts +73 -0
  316. package/dist/internal/EarnWithdrawals.d.ts.map +1 -0
  317. package/dist/internal/EarnWithdrawals.js +189 -0
  318. package/dist/internal/EarnWithdrawals.js.map +1 -0
  319. package/dist/internal/ExecutionContext.d.ts +21 -0
  320. package/dist/internal/ExecutionContext.d.ts.map +1 -0
  321. package/dist/internal/ExecutionContext.js +16 -0
  322. package/dist/internal/ExecutionContext.js.map +1 -0
  323. package/dist/internal/Log.d.ts +7 -3
  324. package/dist/internal/Log.d.ts.map +1 -1
  325. package/dist/internal/Log.js +163 -130
  326. package/dist/internal/Log.js.map +1 -1
  327. package/dist/internal/MetricSink.d.ts.map +1 -1
  328. package/dist/internal/MetricSink.js +26 -1
  329. package/dist/internal/MetricSink.js.map +1 -1
  330. package/dist/internal/RateLimit.d.ts +67 -0
  331. package/dist/internal/RateLimit.d.ts.map +1 -1
  332. package/dist/internal/RateLimit.js +174 -27
  333. package/dist/internal/RateLimit.js.map +1 -1
  334. package/dist/internal/Store.d.ts +6 -0
  335. package/dist/internal/Store.d.ts.map +1 -1
  336. package/dist/internal/Store.js +4 -5
  337. package/dist/internal/Store.js.map +1 -1
  338. package/dist/internal/Timing.d.ts +6 -0
  339. package/dist/internal/Timing.d.ts.map +1 -1
  340. package/dist/internal/Timing.js +21 -1
  341. package/dist/internal/Timing.js.map +1 -1
  342. package/dist/internal/Tron.d.ts +124 -0
  343. package/dist/internal/Tron.d.ts.map +1 -0
  344. package/dist/internal/Tron.js +202 -0
  345. package/dist/internal/Tron.js.map +1 -0
  346. package/dist/internal/Viem.d.ts +4 -0
  347. package/dist/internal/Viem.d.ts.map +1 -1
  348. package/dist/internal/Viem.js +25 -6
  349. package/dist/internal/Viem.js.map +1 -1
  350. package/dist/internal/rewards/Read.d.ts +2 -2
  351. package/dist/internal/rewards/Read.d.ts.map +1 -1
  352. package/dist/internal/rewards/Read.js +11 -2
  353. package/dist/internal/rewards/Read.js.map +1 -1
  354. package/dist/internal/routes/Action.d.ts +27 -0
  355. package/dist/internal/routes/Action.d.ts.map +1 -1
  356. package/dist/internal/routes/Action.js +49 -1
  357. package/dist/internal/routes/Action.js.map +1 -1
  358. package/dist/internal/routes/Chain.d.ts +2 -0
  359. package/dist/internal/routes/Chain.d.ts.map +1 -1
  360. package/dist/internal/routes/Chain.js +4 -0
  361. package/dist/internal/routes/Chain.js.map +1 -1
  362. package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
  363. package/dist/internal/routes/DepositAddress.js +5 -0
  364. package/dist/internal/routes/DepositAddress.js.map +1 -1
  365. package/dist/internal/routes/Evidence.d.ts.map +1 -1
  366. package/dist/internal/routes/Evidence.js +6 -2
  367. package/dist/internal/routes/Evidence.js.map +1 -1
  368. package/dist/internal/routes/EvmTransferSettlement.d.ts +17 -0
  369. package/dist/internal/routes/EvmTransferSettlement.d.ts.map +1 -0
  370. package/dist/internal/routes/EvmTransferSettlement.js +196 -0
  371. package/dist/internal/routes/EvmTransferSettlement.js.map +1 -0
  372. package/dist/internal/routes/Policy.d.ts +161 -0
  373. package/dist/internal/routes/Policy.d.ts.map +1 -0
  374. package/dist/internal/routes/Policy.js +249 -0
  375. package/dist/internal/routes/Policy.js.map +1 -0
  376. package/dist/internal/routes/Provider.d.ts +66 -3
  377. package/dist/internal/routes/Provider.d.ts.map +1 -1
  378. package/dist/internal/routes/Provider.js +106 -27
  379. package/dist/internal/routes/Provider.js.map +1 -1
  380. package/dist/internal/routes/Quota.d.ts +57 -0
  381. package/dist/internal/routes/Quota.d.ts.map +1 -0
  382. package/dist/internal/routes/Quota.js +144 -0
  383. package/dist/internal/routes/Quota.js.map +1 -0
  384. package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
  385. package/dist/internal/routes/Reconciliation.js +163 -47
  386. package/dist/internal/routes/Reconciliation.js.map +1 -1
  387. package/dist/internal/routes/SolanaTransferSettlement.d.ts +12 -0
  388. package/dist/internal/routes/SolanaTransferSettlement.d.ts.map +1 -0
  389. package/dist/internal/routes/SolanaTransferSettlement.js +220 -0
  390. package/dist/internal/routes/SolanaTransferSettlement.js.map +1 -0
  391. package/dist/internal/routes/SolanaTransferSubsidy.d.ts +172 -0
  392. package/dist/internal/routes/SolanaTransferSubsidy.d.ts.map +1 -0
  393. package/dist/internal/routes/SolanaTransferSubsidy.js +564 -0
  394. package/dist/internal/routes/SolanaTransferSubsidy.js.map +1 -0
  395. package/dist/internal/routes/Subsidy.d.ts +2 -2
  396. package/dist/internal/routes/Subsidy.d.ts.map +1 -1
  397. package/dist/internal/routes/Subsidy.js +2 -2
  398. package/dist/internal/routes/Subsidy.js.map +1 -1
  399. package/dist/internal/routes/Transfer.d.ts +229 -1
  400. package/dist/internal/routes/Transfer.d.ts.map +1 -1
  401. package/dist/internal/routes/Transfer.js +644 -7
  402. package/dist/internal/routes/Transfer.js.map +1 -1
  403. package/dist/internal/routes/TransferReconciliation.d.ts +6 -0
  404. package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -1
  405. package/dist/internal/routes/TransferReconciliation.js +83 -159
  406. package/dist/internal/routes/TransferReconciliation.js.map +1 -1
  407. package/dist/internal/routes/TransferSettlement.d.ts +45 -0
  408. package/dist/internal/routes/TransferSettlement.d.ts.map +1 -0
  409. package/dist/internal/routes/TransferSettlement.js +2 -0
  410. package/dist/internal/routes/TransferSettlement.js.map +1 -0
  411. package/dist/internal/routes/TransferSubsidy.d.ts +23 -8
  412. package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -1
  413. package/dist/internal/routes/TransferSubsidy.js +64 -5
  414. package/dist/internal/routes/TransferSubsidy.js.map +1 -1
  415. package/dist/internal/routes/TronTransferSettlement.d.ts +12 -0
  416. package/dist/internal/routes/TronTransferSettlement.d.ts.map +1 -0
  417. package/dist/internal/routes/TronTransferSettlement.js +201 -0
  418. package/dist/internal/routes/TronTransferSettlement.js.map +1 -0
  419. package/dist/internal/routes/TronTransferSubsidy.d.ts +174 -0
  420. package/dist/internal/routes/TronTransferSubsidy.d.ts.map +1 -0
  421. package/dist/internal/routes/TronTransferSubsidy.js +439 -0
  422. package/dist/internal/routes/TronTransferSubsidy.js.map +1 -0
  423. package/dist/internal/routes/index.d.ts +3 -0
  424. package/dist/internal/routes/index.d.ts.map +1 -1
  425. package/dist/internal/routes/index.js +3 -0
  426. package/dist/internal/routes/index.js.map +1 -1
  427. package/dist/internal/routes/providers/across.d.ts +3 -0
  428. package/dist/internal/routes/providers/across.d.ts.map +1 -1
  429. package/dist/internal/routes/providers/across.js +11 -0
  430. package/dist/internal/routes/providers/across.js.map +1 -1
  431. package/dist/internal/routes/providers/legacyMesh.d.ts +29 -0
  432. package/dist/internal/routes/providers/legacyMesh.d.ts.map +1 -0
  433. package/dist/internal/routes/providers/legacyMesh.js +474 -0
  434. package/dist/internal/routes/providers/legacyMesh.js.map +1 -0
  435. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts +59 -0
  436. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts.map +1 -0
  437. package/dist/internal/routes/providers/legacyMeshDelivery.js +229 -0
  438. package/dist/internal/routes/providers/legacyMeshDelivery.js.map +1 -0
  439. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts +19 -0
  440. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts.map +1 -0
  441. package/dist/internal/routes/providers/legacyMeshOutbound.js +457 -0
  442. package/dist/internal/routes/providers/legacyMeshOutbound.js.map +1 -0
  443. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts +123 -0
  444. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts.map +1 -0
  445. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js +333 -0
  446. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js.map +1 -0
  447. package/dist/internal/routes/providers/propAmm.d.ts +70 -0
  448. package/dist/internal/routes/providers/propAmm.d.ts.map +1 -0
  449. package/dist/internal/routes/providers/propAmm.js +524 -0
  450. package/dist/internal/routes/providers/propAmm.js.map +1 -0
  451. package/dist/internal/routes/providers/relay.d.ts +4 -1
  452. package/dist/internal/routes/providers/relay.d.ts.map +1 -1
  453. package/dist/internal/routes/providers/relay.js +353 -42
  454. package/dist/internal/routes/providers/relay.js.map +1 -1
  455. package/dist/internal/routes/providers/rhino.d.ts +3 -0
  456. package/dist/internal/routes/providers/rhino.d.ts.map +1 -1
  457. package/dist/internal/routes/providers/rhino.js +11 -0
  458. package/dist/internal/routes/providers/rhino.js.map +1 -1
  459. package/dist/internal/routes/providers/squid.d.ts +3 -0
  460. package/dist/internal/routes/providers/squid.d.ts.map +1 -1
  461. package/dist/internal/routes/providers/squid.js +19 -0
  462. package/dist/internal/routes/providers/squid.js.map +1 -1
  463. package/dist/internal/routes/providers/stargate.d.ts.map +1 -1
  464. package/dist/internal/routes/providers/stargate.js +22 -9
  465. package/dist/internal/routes/providers/stargate.js.map +1 -1
  466. package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -1
  467. package/dist/internal/routes/providers/symbiosis.js +13 -17
  468. package/dist/internal/routes/providers/symbiosis.js.map +1 -1
  469. package/dist/providers/index.d.ts +14 -0
  470. package/dist/providers/index.d.ts.map +1 -1
  471. package/dist/providers/index.js +6 -0
  472. package/dist/providers/index.js.map +1 -1
  473. package/package.json +16 -6
  474. package/src/ApiKey.ts +7 -3
  475. package/src/ApiKeys.test.ts +652 -8
  476. package/src/ApiKeys.ts +191 -11
  477. package/src/App.test.ts +405 -18
  478. package/src/App.ts +51 -15
  479. package/src/Client.test-d.ts +157 -10
  480. package/src/Client.test.ts +4 -4
  481. package/src/Scope.ts +1 -2
  482. package/src/admin/App.ts +11 -5
  483. package/src/admin/apps/api-keys.test.ts +98 -2
  484. package/src/admin/apps/api-keys.ts +21 -12
  485. package/src/admin/apps/earn-vaults.test.ts +76 -7
  486. package/src/admin/apps/earn-vaults.ts +47 -8
  487. package/src/admin/apps/organizations.test.ts +147 -31
  488. package/src/admin/apps/organizations.ts +5 -4
  489. package/src/admin/apps/route-policies.test.ts +220 -0
  490. package/src/admin/apps/route-policies.ts +322 -0
  491. package/src/admin/apps/routes-support.test.ts +107 -2
  492. package/src/admin/apps/routes-support.ts +43 -3
  493. package/src/admin/apps/routes.test.ts +150 -0
  494. package/src/admin/apps/routes.ts +97 -1
  495. package/src/admin/apps/scopes.test.ts +1 -1
  496. package/src/admin/apps/verified-tokens.test.ts +32 -0
  497. package/src/admin/apps/verified-tokens.ts +30 -4
  498. package/src/admin/index.ts +0 -1
  499. package/src/admin/ui/plugin.ts +2 -1
  500. package/src/admin/ui/src/components/Dialog.tsx +1 -1
  501. package/src/admin/ui/src/components/EarnVaultForm.tsx +45 -0
  502. package/src/admin/ui/src/components/RoutePicker.tsx +79 -0
  503. package/src/admin/ui/src/lib/earn-vaults.ts +1 -1
  504. package/src/admin/ui/src/lib/route-policies.test.ts +452 -0
  505. package/src/admin/ui/src/lib/route-policies.ts +232 -0
  506. package/src/admin/ui/src/lib/routes.ts +34 -0
  507. package/src/admin/ui/src/lib/verified-tokens.ts +24 -9
  508. package/src/admin/ui/src/routeTree.gen.ts +21 -0
  509. package/src/admin/ui/src/routes/__root.tsx +1 -1
  510. package/src/admin/ui/src/routes/api-keys.tsx +21 -2
  511. package/src/admin/ui/src/routes/early-access.tsx +1 -0
  512. package/src/admin/ui/src/routes/earn.vaults.tsx +1 -0
  513. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +22 -0
  514. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +10 -0
  515. package/src/admin/ui/src/routes/organizations.tsx +35 -4
  516. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +18 -3
  517. package/src/admin/ui/src/routes/route-policies.tsx +678 -0
  518. package/src/admin/ui/src/routes/routes.tsx +85 -2
  519. package/src/admin/ui/src/routes/routes_.support.tsx +6 -22
  520. package/src/admin/ui/src/routes/subsidies.tsx +1 -0
  521. package/src/admin/ui/src/routes/verified-tokens.tsx +65 -20
  522. package/src/admin/ui.generated.ts +99 -104
  523. package/src/analytics/Analytics.test.ts +4 -50
  524. package/src/analytics/Analytics.ts +65 -1
  525. package/src/analytics/tables/requestEvents.test.ts +402 -1
  526. package/src/analytics/tables/requestEvents.ts +62 -93
  527. package/src/apps/data/App.test.ts +26 -0
  528. package/src/apps/data/routes/activities.test.ts +315 -14
  529. package/src/apps/data/routes/activities.ts +60 -0
  530. package/src/apps/data/routes/balances.ts +5 -7
  531. package/src/apps/data/routes/earn.bench.ts +18 -0
  532. package/src/apps/data/routes/earn.local.test.ts +507 -0
  533. package/src/apps/data/routes/earn.test.ts +405 -127
  534. package/src/apps/data/routes/earn.ts +660 -270
  535. package/src/apps/data/routes/exchanges.bench.ts +3 -1
  536. package/src/apps/data/routes/exchanges.test.ts +166 -2
  537. package/src/apps/data/routes/exchanges.ts +308 -101
  538. package/src/apps/data/routes/fee-amm.test.ts +153 -2
  539. package/src/apps/data/routes/fee-amm.ts +132 -62
  540. package/src/apps/data/routes/receipts.test.ts +21 -18
  541. package/src/apps/data/routes/rpc.test.ts +34 -2
  542. package/src/apps/data/routes/rpc.ts +47 -10
  543. package/src/apps/data/routes/tokens.provenance.test.ts +157 -0
  544. package/src/apps/data/routes/tokens.test.ts +4 -4
  545. package/src/apps/data/routes/tokens.ts +11 -6
  546. package/src/apps/data/routes/transactions.test.ts +29 -0
  547. package/src/apps/data/routes/transactions.ts +33 -22
  548. package/src/apps/data/routes/webhooks.scan.test.ts +29 -0
  549. package/src/apps/data/routes/webhooks.test.ts +18 -3
  550. package/src/apps/data/routes/webhooks.ts +27 -13
  551. package/src/apps/management/App.ts +4 -0
  552. package/src/apps/management/Billing.test.ts +253 -27
  553. package/src/apps/management/Billing.ts +83 -29
  554. package/src/apps/management/routes/api-keys.test.ts +1 -1
  555. package/src/apps/management/routes/api-keys.ts +85 -11
  556. package/src/apps/management/routes/billing.test.ts +68 -4
  557. package/src/apps/management/routes/cli.test.ts +370 -0
  558. package/src/apps/management/routes/cli.ts +533 -0
  559. package/src/apps/management/routes/me.test.ts +14 -4
  560. package/src/apps/management/routes/orgs.test.ts +108 -4
  561. package/src/apps/management/routes/orgs.ts +7 -2
  562. package/src/apps/management/routes/usage.test.ts +2 -2
  563. package/src/apps/management/routes/verified-token-requests.test.ts +16 -2
  564. package/src/apps/management/routes/verified-token-requests.ts +7 -10
  565. package/src/apps/mcp.test.ts +108 -25
  566. package/src/apps/mcp.ts +15 -3
  567. package/src/apps/mpp/internal/Policy.test.ts +51 -4
  568. package/src/apps/mpp/internal/Policy.ts +6 -2
  569. package/src/apps/mpp/internal/Sponsorship.test.ts +29 -0
  570. package/src/apps/mpp/internal/Sponsorship.ts +6 -4
  571. package/src/apps/relay/App.test.ts +85 -1
  572. package/src/apps/relay/App.ts +28 -4
  573. package/src/apps/relay/Sponsorships.test.ts +97 -1
  574. package/src/apps/relay/Sponsorships.ts +77 -66
  575. package/src/apps/routes/Access.test.ts +319 -0
  576. package/src/apps/routes/Access.ts +147 -0
  577. package/src/apps/routes/App.ts +10 -0
  578. package/src/apps/routes/routes/chains.test.ts +3 -2
  579. package/src/apps/routes/routes/deposit-addresses.test.ts +978 -34
  580. package/src/apps/routes/routes/deposit-addresses.ts +243 -32
  581. package/src/apps/routes/routes/propAmm.local.test.ts +951 -0
  582. package/src/apps/routes/routes/quotes.test.ts +81 -8
  583. package/src/apps/routes/routes/quotes.ts +109 -27
  584. package/src/apps/routes/routes/transfers.test.ts +252 -15
  585. package/src/apps/routes/routes/transfers.ts +212 -33
  586. package/src/cli/ApiKeys.test.ts +265 -0
  587. package/src/cli/ApiKeys.ts +189 -0
  588. package/src/cli/Cli.test.ts +188 -0
  589. package/src/cli/Cli.ts +280 -12
  590. package/src/cli/Credentials.test.ts +122 -0
  591. package/src/cli/Credentials.ts +144 -0
  592. package/src/cli/Spec.test.ts +133 -0
  593. package/src/cli/Spec.ts +132 -0
  594. package/src/cli/bin.test.ts +49 -0
  595. package/src/cli/bin.ts +5 -1
  596. package/src/cli/commands/auth.test.ts +138 -0
  597. package/src/cli/commands/auth.ts +254 -0
  598. package/src/cli/commands/keys.test.ts +68 -0
  599. package/src/cli/commands/keys.ts +125 -0
  600. package/src/cloudflare.ts +184 -36
  601. package/src/db/Db.test.ts +877 -0
  602. package/src/db/Db.ts +507 -1
  603. package/src/db/Schema.ts +75 -4
  604. package/src/db/tables/apiKeyAdmissions.test.ts +57 -0
  605. package/src/db/tables/apiKeyAdmissions.ts +101 -11
  606. package/src/db/tables/apiKeyOwnerTombstones.ts +2 -2
  607. package/src/db/tables/authAccounts.test.ts +30 -0
  608. package/src/db/tables/authAccounts.ts +1 -0
  609. package/src/db/tables/earnVaults.test.ts +34 -0
  610. package/src/db/tables/earnVaults.ts +17 -2
  611. package/src/db/tables/organizations.test.ts +148 -84
  612. package/src/db/tables/organizations.ts +11 -43
  613. package/src/db/tables/requestUsage.ts +13 -2
  614. package/src/db/tables/rewardCampaigns.test.ts +163 -0
  615. package/src/db/tables/rewardEligibilityAssociations.test.ts +14 -0
  616. package/src/db/tables/rewardEligibilityAssociations.ts +24 -0
  617. package/src/db/tables/rewardRuns.ts +4 -0
  618. package/src/db/tables/rewardTransactionAttempts.ts +2 -0
  619. package/src/db/tables/routesDepositAddresses.test.ts +263 -0
  620. package/src/db/tables/routesDepositAddresses.ts +118 -34
  621. package/src/db/tables/routesDeposits.test.ts +133 -0
  622. package/src/db/tables/routesDeposits.ts +47 -26
  623. package/src/db/tables/routesIdempotency.test.ts +80 -0
  624. package/src/db/tables/routesIdempotency.ts +2 -0
  625. package/src/db/tables/routesPolicies.test.ts +143 -0
  626. package/src/db/tables/routesPolicies.ts +251 -0
  627. package/src/db/tables/routesTransferSubsidies.ts +64 -0
  628. package/src/db/tables/routesTransferSubsidyNonces.ts +16 -4
  629. package/src/db/tables/routesTransfers.test.ts +183 -2
  630. package/src/db/tables/routesTransfers.ts +65 -6
  631. package/src/db/tables/sponsoredTransactions.test.ts +351 -76
  632. package/src/db/tables/sponsoredTransactions.ts +182 -38
  633. package/src/db/tables/users.test.ts +51 -0
  634. package/src/db/tables/users.ts +12 -0
  635. package/src/db/tables/verifiedTokenRequests.test.ts +39 -20
  636. package/src/db/tables/verifiedTokenRequests.ts +80 -44
  637. package/src/handlers/internal/multisig.store.test.ts +120 -0
  638. package/src/handlers/internal/multisig.test.ts +389 -0
  639. package/src/handlers/internal/multisig.ts +13 -10
  640. package/src/handlers/relay.test.ts +259 -83
  641. package/src/handlers/relay.ts +36 -17
  642. package/src/internal/Auth.test.ts +383 -8
  643. package/src/internal/Auth.ts +272 -99
  644. package/src/internal/BetterAuth.test.ts +58 -22
  645. package/src/internal/BetterAuth.ts +23 -17
  646. package/src/internal/Cache.ts +3 -1
  647. package/src/internal/CliAuth.test.ts +279 -0
  648. package/src/internal/CliAuth.ts +319 -0
  649. package/src/internal/EarnSharePrices.test.ts +25 -0
  650. package/src/internal/EarnSharePrices.ts +9 -2
  651. package/src/internal/EarnVaults.test.ts +67 -0
  652. package/src/internal/EarnVaults.ts +299 -4
  653. package/src/internal/EarnWithdrawals.test.ts +315 -0
  654. package/src/internal/EarnWithdrawals.ts +266 -0
  655. package/src/internal/ExecutionContext.ts +31 -0
  656. package/src/internal/Log.test.ts +210 -0
  657. package/src/internal/Log.ts +180 -142
  658. package/src/internal/MetricSink.test.ts +190 -15
  659. package/src/internal/MetricSink.ts +27 -1
  660. package/src/internal/RateLimit.test.ts +144 -8
  661. package/src/internal/RateLimit.ts +254 -26
  662. package/src/internal/Store.ts +4 -5
  663. package/src/internal/Timing.test.ts +32 -0
  664. package/src/internal/Timing.ts +20 -1
  665. package/src/internal/Tron.test-d.ts +22 -0
  666. package/src/internal/Tron.test.ts +94 -0
  667. package/src/internal/Tron.ts +289 -0
  668. package/src/internal/Viem.rpc.test.ts +76 -0
  669. package/src/internal/Viem.ts +29 -6
  670. package/src/internal/rewards/Read.test.ts +109 -0
  671. package/src/internal/rewards/Read.ts +13 -4
  672. package/src/internal/routes/Action.test.ts +70 -0
  673. package/src/internal/routes/Action.ts +76 -1
  674. package/src/internal/routes/Chain.test.ts +18 -0
  675. package/src/internal/routes/Chain.ts +5 -0
  676. package/src/internal/routes/DepositAddress.ts +5 -0
  677. package/src/internal/routes/Evidence.test.ts +64 -0
  678. package/src/internal/routes/Evidence.ts +11 -3
  679. package/src/internal/routes/EvmTransferSettlement.ts +213 -0
  680. package/src/internal/routes/Policy.test.ts +316 -0
  681. package/src/internal/routes/Policy.ts +399 -0
  682. package/src/internal/routes/Provider.test.ts +103 -2
  683. package/src/internal/routes/Provider.ts +149 -27
  684. package/src/internal/routes/Quota.test.ts +149 -0
  685. package/src/internal/routes/Quota.ts +226 -0
  686. package/src/internal/routes/Reconciliation.local.test.ts +285 -0
  687. package/src/internal/routes/Reconciliation.test.ts +371 -13
  688. package/src/internal/routes/Reconciliation.ts +193 -42
  689. package/src/internal/routes/SolanaTransferSettlement.ts +232 -0
  690. package/src/internal/routes/SolanaTransferSubsidy.test.ts +471 -0
  691. package/src/internal/routes/SolanaTransferSubsidy.ts +760 -0
  692. package/src/internal/routes/SourceObservation.test.ts +221 -0
  693. package/src/internal/routes/Subsidy.local.test.ts +46 -0
  694. package/src/internal/routes/Subsidy.ts +4 -2
  695. package/src/internal/routes/Transfer.solana.test.ts +389 -0
  696. package/src/internal/routes/Transfer.test.ts +130 -1
  697. package/src/internal/routes/Transfer.tron.test.ts +172 -0
  698. package/src/internal/routes/Transfer.ts +866 -8
  699. package/src/internal/routes/TransferReconciliation.test.ts +26 -4
  700. package/src/internal/routes/TransferReconciliation.ts +91 -166
  701. package/src/internal/routes/TransferSettlement.ts +48 -0
  702. package/src/internal/routes/TransferSubsidy.local.test.ts +143 -0
  703. package/src/internal/routes/TransferSubsidy.test.ts +34 -4
  704. package/src/internal/routes/TransferSubsidy.ts +87 -12
  705. package/src/internal/routes/TronTransferSettlement.ts +212 -0
  706. package/src/internal/routes/TronTransferSubsidy.test.ts +109 -0
  707. package/src/internal/routes/TronTransferSubsidy.ts +619 -0
  708. package/src/internal/routes/index.test.ts +3 -0
  709. package/src/internal/routes/index.ts +3 -0
  710. package/src/internal/routes/providers/across.ts +13 -0
  711. package/src/internal/routes/providers/index.test.ts +141 -0
  712. package/src/internal/routes/providers/legacyMesh.test.ts +484 -0
  713. package/src/internal/routes/providers/legacyMesh.ts +633 -0
  714. package/src/internal/routes/providers/legacyMeshDelivery.test.ts +306 -0
  715. package/src/internal/routes/providers/legacyMeshDelivery.ts +320 -0
  716. package/src/internal/routes/providers/legacyMeshOutbound.test.ts +401 -0
  717. package/src/internal/routes/providers/legacyMeshOutbound.ts +566 -0
  718. package/src/internal/routes/providers/legacyMeshOutboundDelivery.ts +473 -0
  719. package/src/internal/routes/providers/propAmm.ts +640 -0
  720. package/src/internal/routes/providers/relay.test.ts +1299 -18
  721. package/src/internal/routes/providers/relay.ts +424 -39
  722. package/src/internal/routes/providers/rhino.ts +14 -1
  723. package/src/internal/routes/providers/squid.ts +21 -0
  724. package/src/internal/routes/providers/stargate.test.ts +105 -1
  725. package/src/internal/routes/providers/stargate.ts +22 -9
  726. package/src/internal/routes/providers/symbiosis.ts +13 -47
  727. package/src/providers/index.test.ts +2 -0
  728. package/src/providers/index.ts +18 -0
  729. package/dist/admin/Access.d.ts +0 -39
  730. package/dist/admin/Access.d.ts.map +0 -1
  731. package/dist/admin/Access.js +0 -73
  732. package/dist/admin/Access.js.map +0 -1
  733. package/src/admin/Access.test.ts +0 -130
  734. package/src/admin/Access.ts +0 -85
@@ -1,5 +1,6 @@
1
1
  import { Hono, type Context } from 'hono'
2
2
  import { AbiEvent, AbiParameters, Hash, type Hex } from 'ox'
3
+ import { zeroAddress } from 'viem'
3
4
  import { Abis, Addresses } from 'viem/tempo'
4
5
  import * as z from 'zod/mini'
5
6
 
@@ -7,6 +8,7 @@ import type * as App from '../../../App.js'
7
8
  import * as Auth from '../../../internal/Auth.js'
8
9
  import * as Cache from '../../../internal/Cache.js'
9
10
  import * as Cursor from '../../../internal/Cursor.js'
11
+ import type * as Log from '../../../internal/Log.js'
10
12
  import * as OpenApi from '../../../internal/OpenApi.js'
11
13
  import * as Response from '../../../internal/Response.js'
12
14
  import * as Schema from '../../../internal/Schema.js'
@@ -319,7 +321,15 @@ export function feeAmm() {
319
321
  return new Hono<App.Environment>()
320
322
  .get(
321
323
  '/v1/fee-amm/pools',
322
- Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }),
324
+ Auth.policy({
325
+ apiKey: {
326
+ bucket: 'fee-amm-pools',
327
+ rateLimit: { limit: 1, period: 'minute' },
328
+ scopes: ['data:read'],
329
+ },
330
+ mpp: { bucket: 'fee-amm-pools', rateLimit: { limit: 1, period: 'minute' } },
331
+ public: { bucket: 'fee-amm-pools', rateLimit: { limit: 1, period: 'minute' } },
332
+ }),
323
333
  OpenApi.validate('query', schema.getFeeAmmPools.Query, {
324
334
  code: 'query_invalid',
325
335
  message: 'Invalid query parameters',
@@ -344,7 +354,7 @@ export function feeAmm() {
344
354
  tags: ['Fee AMM'],
345
355
  }),
346
356
  Cache.response<App.Environment>({
347
- cacheControl: Cache.policies.state,
357
+ cacheControl: Cache.policies.noStore,
348
358
  name: 'tempo-api:fee-amm-pools:v2',
349
359
  key: (c) => Cache.urlKey(c, schema.getFeeAmmPools.Query),
350
360
  }),
@@ -687,35 +697,16 @@ declare namespace listPools {
687
697
  }
688
698
  }
689
699
 
690
- /**
691
- * The set of token addresses usable to pay transaction fees on a chain: the
692
- * curated verified tokens that have at least one Fee AMM pool (i.e. appear as a
693
- * `userToken` / topic2 in the FeeManager's `Mint` logs), plus the protocol
694
- * default fee token (`pathUSD`), which pays fees without needing a pool.
695
- * Addresses are lowercased to match the indexer's stored casing.
696
- *
697
- * The set is intentionally gated to the verified list rather than every pooled
698
- * token: anyone can mint a single-mint spam pool, so the raw set of pool
699
- * `userToken`s is unbounded (tens of thousands on busy chains) and those
700
- * liquidity-less pools can't actually settle fees. Restricting to verified
701
- * tokens keeps the set small (a handful of USD stablecoins), bounds the scan
702
- * (the `topic2 IN (…)` candidate list is the verified list), and matches the
703
- * tokens fees are realistically paid in.
704
- *
705
- * Memoized per chain and verified-snapshot version (the only inputs), so
706
- * callers — e.g. the address balances endpoint — can flag which holdings are
707
- * fee-usable without a second `/fee-amm/pools` query.
708
- */
700
+ /** Returns lowercased verified tokens currently usable for transaction fees. The protocol default (`pathUSD`) is always included. */
709
701
  export async function feeTokenSet(
710
702
  c: Context<App.Environment>,
711
703
  chainId: z.output<typeof Schema.ChainId>,
712
704
  ): Promise<Set<string>> {
713
705
  const store = c.get('store')
714
- const tidx = c.get('getTidx')(chainId)
715
706
  const snapshot = await VerifiedTokens.snapshot(c, chainId)
716
707
  // pathUSD is always fee-usable; the verified tokens are the only other
717
708
  // candidates we probe for a pool. With no verified candidates there is
718
- // nothing to query — pathUSD stands alone.
709
+ // nothing to query, so pathUSD stands alone.
719
710
  const candidates = snapshot.list.map((token) => token.address.toLowerCase())
720
711
  if (candidates.length === 0) return new Set([pathUsd])
721
712
 
@@ -725,36 +716,106 @@ export async function feeTokenSet(
725
716
  Store.memoize(
726
717
  async () => {
727
718
  const tokens = new Set<string>([pathUsd])
728
- // PostgreSQL's `topic2` index proves negative lookups without scanning
729
- // FeeManager history. Probe serially so an uncapped verified list
730
- // cannot fan out indexer load.
731
- for (const address of candidates) {
732
- const topic = padTopic(address as `0x${string}`)
733
- const result = await tidx.fetch({
734
- chainId,
735
- engine: 'postgres',
736
- query: `
737
- SELECT 1 AS present
738
- FROM logs
739
- WHERE address = '${feeManager}' AND selector IN ('${mintTopic}', '${legacyMintTopic}')
740
- AND topic2 = '${topic}'
741
- LIMIT 1
742
- ` as string,
719
+ const validatorTokens = await getValidatorTokens(c, { chainId })
720
+ // Verified candidates prevent permissionless spam pools from expanding
721
+ // the lookup. Small batches also bound RPC fan-out for Zone clients.
722
+ const probes = candidates
723
+ .filter((address) => {
724
+ if (!validatorTokens.includes(address)) return true
725
+ tokens.add(address)
726
+ return false
743
727
  })
744
- if (result.rows.length > 0) tokens.add(address)
728
+ .flatMap((userToken) =>
729
+ validatorTokens.map((validatorToken) => ({ userToken, validatorToken })),
730
+ )
731
+ const unresolved = new Map<string, unknown>()
732
+ for (let index = 0; index < probes.length; index += 8) {
733
+ const group = probes.slice(index, index + 8)
734
+ const results = await Promise.allSettled(
735
+ group.map(({ userToken, validatorToken }) =>
736
+ readPoolReserves(c, {
737
+ chainId,
738
+ userToken: userToken as z.output<typeof Schema.Address>,
739
+ validatorToken: validatorToken as z.output<typeof Schema.Address>,
740
+ }),
741
+ ),
742
+ )
743
+ for (const [offset, result] of results.entries()) {
744
+ const userToken = group[offset]!.userToken
745
+ if (result.status === 'rejected') {
746
+ unresolved.set(userToken, result.reason)
747
+ continue
748
+ }
749
+ if (BigInt(result.value.userToken) > 0n && BigInt(result.value.validatorToken) > 0n) {
750
+ tokens.add(userToken)
751
+ unresolved.delete(userToken)
752
+ }
753
+ }
745
754
  }
755
+ const failure = Array.from(unresolved).find(([address]) => !tokens.has(address))
756
+ if (failure) throw failure[1]
746
757
  return Array.from(tokens)
747
758
  },
748
759
  {
749
- key: `feeamm:v2:${chainId}:fee-token-set:v:${snapshot.version}`,
760
+ key: `feeamm:v3:${chainId}:fee-token-set:v:${snapshot.version}`,
750
761
  store,
751
- ttl: Ttl.minutes(5),
762
+ ttl: Ttl.seconds(30),
752
763
  },
753
764
  ),
754
- )
765
+ ).catch((cause) => {
766
+ const failure = {
767
+ chainId,
768
+ failure: 'unknown',
769
+ id: 'rpc',
770
+ operation: 'feeTokenSet',
771
+ } satisfies Log.ProviderFailure
772
+ c.set('providerFailures', [...(c.get('providerFailures') ?? []), failure])
773
+ throw cause
774
+ })
755
775
  return new Set(addresses)
756
776
  }
757
777
 
778
+ /** Resolves the distinct fee tokens preferred by active validators. */
779
+ async function getValidatorTokens(
780
+ c: Context<App.Environment>,
781
+ options: getValidatorTokens.Options,
782
+ ) {
783
+ const { chainId } = options
784
+ const client = c.get('getClient')(chainId)
785
+ const validators = await client.readContract({
786
+ abi: Abis.validatorConfig,
787
+ address: Addresses.validator,
788
+ functionName: 'getValidators',
789
+ })
790
+ const active = validators.filter((validator) => validator.active)
791
+ if (active.length === 0) return [pathUsd]
792
+ const preferred = await Promise.all(
793
+ active.map((validator) =>
794
+ client.readContract({
795
+ abi: Abis.feeManager,
796
+ address: Addresses.feeManager,
797
+ args: [validator.validatorAddress],
798
+ functionName: 'validatorTokens',
799
+ }),
800
+ ),
801
+ )
802
+ return Array.from(
803
+ new Set(
804
+ preferred.map((address) =>
805
+ address.toLowerCase() === zeroAddress ? pathUsd : address.toLowerCase(),
806
+ ),
807
+ ),
808
+ )
809
+ }
810
+
811
+ declare namespace getValidatorTokens {
812
+ /** Options for resolving active validators' preferred fee tokens. */
813
+ type Options = {
814
+ /** Chain whose validator preferences should be read. */
815
+ chainId: z.output<typeof Schema.ChainId>
816
+ }
817
+ }
818
+
758
819
  /**
759
820
  * Reads a pool's current on-chain reserves via `FeeManager.getPool`, memoized
760
821
  * briefly per pool. Reserves are best-effort decoration on the pool listing:
@@ -767,28 +828,37 @@ function getPoolReserves(
767
828
  options: getPoolReserves.Options,
768
829
  ): Promise<getPoolReserves.Reserves | null> {
769
830
  const { chainId, userToken, validatorToken } = options
770
- const client = c.get('getClient')(chainId)
771
831
  const store = c.get('store')
772
832
 
773
- return Store.memoize(
774
- async () => {
775
- const pool = await client.readContract({
776
- abi: Abis.feeAmm,
777
- address: Addresses.feeManager,
778
- args: [userToken, validatorToken],
779
- functionName: 'getPool',
780
- })
781
- return {
782
- userToken: pool.reserveUserToken.toString(),
783
- validatorToken: pool.reserveValidatorToken.toString(),
784
- }
785
- },
786
- {
787
- key: `feeamm:v1:${chainId}:pool:${userToken}:${validatorToken}:reserves`,
788
- store,
789
- ttl: Ttl.seconds(30),
790
- },
791
- ).catch(() => null)
833
+ return Store.memoize(() => readPoolReserves(c, { chainId, userToken, validatorToken }), {
834
+ key: `feeamm:v1:${chainId}:pool:${userToken}:${validatorToken}:reserves`,
835
+ store,
836
+ ttl: Ttl.seconds(30),
837
+ }).catch(() => null)
838
+ }
839
+
840
+ /** Reads a pool's current on-chain reserves and propagates RPC failures. */
841
+ async function readPoolReserves(
842
+ c: Context<App.Environment>,
843
+ options: readPoolReserves.Options,
844
+ ): Promise<getPoolReserves.Reserves> {
845
+ const { chainId, userToken, validatorToken } = options
846
+ const client = c.get('getClient')(chainId)
847
+ const pool = await client.readContract({
848
+ abi: Abis.feeAmm,
849
+ address: Addresses.feeManager,
850
+ args: [userToken, validatorToken],
851
+ functionName: 'getPool',
852
+ })
853
+ return {
854
+ userToken: pool.reserveUserToken.toString(),
855
+ validatorToken: pool.reserveValidatorToken.toString(),
856
+ }
857
+ }
858
+
859
+ declare namespace readPoolReserves {
860
+ /** Options for reading one fee pool. */
861
+ type Options = getPoolReserves.Options
792
862
  }
793
863
 
794
864
  declare namespace getPoolReserves {
@@ -346,18 +346,30 @@ async function findRecentTransactionHash() {
346
346
  }
347
347
 
348
348
  describe('GET /transactions/receipts?address=…', () => {
349
- test('returns receipts involving an address', async () => {
349
+ let account: string
350
+
351
+ beforeAll(async () => {
350
352
  const client = TestApp.client()
351
- // Seed a real sender from the global receipt feed.
352
- const seedResponse = await client.v1.transactions.receipts.$get(
353
- { query: { limit: '5' } },
354
- TestApp.auth,
353
+ // A replica can briefly return an empty head page. Require an indexed receipt before testing address filters.
354
+ account = await vi.waitFor(
355
+ async () => {
356
+ const response = await client.v1.transactions.receipts.$get(
357
+ { query: { limit: '5' } },
358
+ { headers: { ...TestApp.auth.headers, 'cache-control': 'no-store' } },
359
+ )
360
+ const body = await TestApp.json(response, Receipts.schema.getReceipts.Response)
361
+ expect(response.status).toBe(200)
362
+ expect(body.data.length).toBeGreaterThan(0)
363
+ const sender = body.data[0]!.sender
364
+ expect(sender).toMatch(/^0x[0-9a-f]{40}$/)
365
+ return sender
366
+ },
367
+ { interval: 1_000, timeout: 30_000 },
355
368
  )
356
- const seed = await TestApp.json(seedResponse, Receipts.schema.getReceipts.Response)
357
- expect(seedResponse.status).toBe(200)
358
- const account = seed.data[0]!.sender
359
- expect(account).toMatch(/^0x[0-9a-f]{40}$/)
369
+ })
360
370
 
371
+ test('returns receipts involving an address', async () => {
372
+ const client = TestApp.client()
361
373
  const baseResponse = await client.v1.transactions.receipts.$get(
362
374
  { query: { address: account, limit: '5' } },
363
375
  TestApp.auth,
@@ -390,15 +402,6 @@ describe('GET /transactions/receipts?address=…', () => {
390
402
 
391
403
  test('narrows receipts by execution status', async () => {
392
404
  const client = TestApp.client()
393
- const seedResponse = await client.v1.transactions.receipts.$get(
394
- { query: { limit: '5' } },
395
- TestApp.auth,
396
- )
397
- const seed = await TestApp.json(seedResponse, Receipts.schema.getReceipts.Response)
398
- expect(seedResponse.status).toBe(200)
399
- const account = seed.data[0]!.sender
400
- expect(account).toMatch(/^0x[0-9a-f]{40}$/)
401
-
402
405
  const response = await client.v1.transactions.receipts.$get(
403
406
  { query: { address: account, limit: '5', status: 'success' } },
404
407
  TestApp.auth,
@@ -144,6 +144,38 @@ describe('POST /rpc', () => {
144
144
  }
145
145
  })
146
146
 
147
+ test('rejects oversized anonymous requests before proxying upstream', async () => {
148
+ const requests: Request[] = []
149
+ const server = await Relay.createServer(
150
+ RequestListener.fromFetchHandler((request) => {
151
+ requests.push(request)
152
+ return Response.json({ id: 1, jsonrpc: '2.0', result: '0x1' })
153
+ }),
154
+ )
155
+
156
+ try {
157
+ const app = TestApp.create({ rpc: { url: server.url } })
158
+ const request = new Request('http://tempo-api.test/rpc', {
159
+ body: JSON.stringify({
160
+ id: 1,
161
+ jsonrpc: '2.0',
162
+ method: 'eth_call',
163
+ params: [`0x${'ab'.repeat(32_768)}`, 'latest'],
164
+ }),
165
+ method: 'POST',
166
+ })
167
+ expect(request.headers.get('content-length')).toBeNull()
168
+
169
+ const response = await app.fetch(request)
170
+
171
+ expect(response.status).toBe(413)
172
+ expect(await response.json()).toMatchObject({ error: { code: 'payload_too_large' } })
173
+ expect(requests).toHaveLength(0)
174
+ } finally {
175
+ await server.closeAsync()
176
+ }
177
+ })
178
+
147
179
  test('routes by principal: a resolver sees the request principal and routes accordingly', async () => {
148
180
  const fetch = mockRpc()
149
181
  // A resolver that routes API-key principals to the private upstream and
@@ -1198,7 +1230,7 @@ describe('POST /rpc', () => {
1198
1230
  {
1199
1231
  "error": {
1200
1232
  "code": "api_key_forbidden",
1201
- "message": "API key missing required scope",
1233
+ "message": "API key is missing required permissions: data:read. Use an API key with these scopes.",
1202
1234
  },
1203
1235
  }
1204
1236
  `)
@@ -1499,7 +1531,7 @@ describe('POST /rpc/relay', () => {
1499
1531
  {
1500
1532
  "error": {
1501
1533
  "code": "api_key_forbidden",
1502
- "message": "API key missing required scope",
1534
+ "message": "API key is missing required permissions: rpc-relay:read. Use an API key with these scopes.",
1503
1535
  },
1504
1536
  }
1505
1537
  `)
@@ -278,9 +278,8 @@ async function handleRpc(c: Context<App.Environment>) {
278
278
  const zoneToken = getZoneToken(c)
279
279
  const apiKeyRequired = requiresApiKey(c)
280
280
  const inspectBody = apiKeyRequired || Boolean(zone)
281
- const inspection = inspectBody ? await inspectRpcBody(c.req.raw) : undefined
281
+ const inspection = inspectBody ? await inspectRpcRequest(c.req.raw) : undefined
282
282
  if (inspection && inspection.result === undefined) {
283
- await inspection.body?.cancel()
284
283
  return Response.error(c, {
285
284
  code: 'payload_too_large',
286
285
  message: 'RPC requests requiring method inspection must not exceed 64 KiB.',
@@ -469,6 +468,38 @@ async function inspectNotificationOnly(request: Request): Promise<boolean> {
469
468
  }
470
469
  }
471
470
 
471
+ async function inspectRpcRequest(request: Request): Promise<RpcInspection> {
472
+ const contentLength = Number(request.headers.get('content-length'))
473
+ if (Number.isFinite(contentLength) && contentLength > maxRpcInspectionBytes) {
474
+ await request.body?.cancel()
475
+ return { body: null, result: undefined }
476
+ }
477
+ if (!request.body) return { body: null, result: { empty: true, ok: false } }
478
+
479
+ const reader = request.body.getReader()
480
+ const chunks: Uint8Array<ArrayBuffer>[] = []
481
+ let size = 0
482
+ while (size <= maxRpcInspectionBytes) {
483
+ const read = await reader.read()
484
+ if (read.done) break
485
+ size += read.value.byteLength
486
+ if (size > maxRpcInspectionBytes) {
487
+ await reader.cancel()
488
+ return { body: null, result: undefined }
489
+ }
490
+ chunks.push(read.value)
491
+ }
492
+
493
+ const bytes = joinChunks(chunks, size)
494
+ const body = new ReadableStream<Uint8Array<ArrayBuffer>>({
495
+ start(controller) {
496
+ controller.enqueue(bytes)
497
+ controller.close()
498
+ },
499
+ })
500
+ return { body, result: parseRpcBody(bytes) }
501
+ }
502
+
472
503
  function hasZoneWriteScope(c: Context<App.Environment>, chainId: number): boolean {
473
504
  const principal = Auth.getPrincipal(c)
474
505
  if (principal?.type !== 'api_key') return false
@@ -712,20 +743,26 @@ async function inspectRpcBody(response: Request | globalThis.Response): Promise<
712
743
  })
713
744
  if (!complete || size > maxRpcInspectionBytes) return { body, result: undefined }
714
745
 
746
+ const bytes = joinChunks(chunks, size)
747
+ return { body, result: parseRpcBody(bytes) }
748
+ }
749
+
750
+ function joinChunks(chunks: readonly Uint8Array<ArrayBuffer>[], size: number) {
715
751
  const bytes = new Uint8Array(size)
716
752
  let offset = 0
717
753
  for (const chunk of chunks) {
718
754
  bytes.set(chunk, offset)
719
755
  offset += chunk.byteLength
720
756
  }
721
- const result = (() => {
722
- try {
723
- return { ok: true as const, value: JSON.parse(new TextDecoder().decode(bytes)) as unknown }
724
- } catch {
725
- return { empty: size === 0, ok: false as const }
726
- }
727
- })()
728
- return { body, result }
757
+ return bytes
758
+ }
759
+
760
+ function parseRpcBody(bytes: Uint8Array<ArrayBuffer>): RpcInspection['result'] {
761
+ try {
762
+ return { ok: true, value: JSON.parse(new TextDecoder().decode(bytes)) as unknown }
763
+ } catch {
764
+ return { empty: bytes.byteLength === 0, ok: false }
765
+ }
729
766
  }
730
767
 
731
768
  function rpcProviderFailure(cause: unknown, chainId: number): Log.ProviderFailure {
@@ -0,0 +1,157 @@
1
+ import * as fs from 'node:fs'
2
+ import {
3
+ GenericContainer,
4
+ Network,
5
+ type StartedNetwork,
6
+ type StartedTestContainer,
7
+ Wait,
8
+ } from 'testcontainers'
9
+ import { encodeAbiParameters, encodeEventTopics, parseAbi, zeroAddress, zeroHash } from 'viem'
10
+
11
+ import * as TestApp from '../../../../test/App.js'
12
+ import * as Runtime from '../../../../test/runtime.js'
13
+ import * as Tokens from './tokens.js'
14
+
15
+ const abi = parseAbi([
16
+ 'event TokenCreated(address indexed token, string name, string symbol, string currency, address quoteToken, address admin, bytes32 salt)',
17
+ ])
18
+ const attacker = '0x1111111111111111111111111111111111111111'
19
+ const token = '0x20c0000000000000000000000000000000000001'
20
+
21
+ let url: string
22
+
23
+ describe.runIf(Runtime.get().mode === 'testnet')('Token provenance', () => {
24
+ let app: ReturnType<typeof TestApp.create>
25
+ let clickhouse: StartedTestContainer
26
+ let indexer: StartedTestContainer
27
+ let network: StartedNetwork
28
+ let postgres: StartedTestContainer
29
+
30
+ beforeAll(async () => {
31
+ const compose = fs.readFileSync(
32
+ new URL('../../../../docker-compose.yml', import.meta.url),
33
+ 'utf8',
34
+ )
35
+ const image = compose.match(/TEMPO_API_TIDX_IMAGE:-([^}]+)}/)?.[1]
36
+ const image_clickhouse = compose.match(/TEMPO_API_CLICKHOUSE_IMAGE:-([^}]+)}/)?.[1]
37
+ const image_postgres = compose.match(/TEMPO_API_POSTGRES_IMAGE:-([^}]+)}/)?.[1]
38
+ if (!image || !image_clickhouse || !image_postgres)
39
+ throw new Error('Missing pinned database images.')
40
+ network = await new Network().start()
41
+ postgres = await new GenericContainer(image_postgres)
42
+ .withEnvironment({ POSTGRES_PASSWORD: 'postgres' })
43
+ .withNetwork(network)
44
+ .withNetworkAliases('postgres')
45
+ .withExposedPorts(5432)
46
+ .withWaitStrategy(Wait.forLogMessage(/database system is ready to accept connections/, 2))
47
+ .start()
48
+ clickhouse = await new GenericContainer(image_clickhouse)
49
+ .withEnvironment({ CLICKHOUSE_PASSWORD: 'clickhouse', CLICKHOUSE_USER: 'clickhouse' })
50
+ .withNetwork(network)
51
+ .withNetworkAliases('clickhouse')
52
+ .withExposedPorts(8123)
53
+ .withWaitStrategy(Wait.forHttp('/ping', 8123))
54
+ .start()
55
+ url = `http://${clickhouse.getHost()}:${clickhouse.getMappedPort(8123)}`
56
+ indexer = await new GenericContainer(image)
57
+ .withPlatform('linux/amd64')
58
+ .withNetwork(network)
59
+ .withCopyContentToContainer([
60
+ {
61
+ content: `
62
+ [http]
63
+ enabled = true
64
+ port = 8080
65
+ bind = "0.0.0.0"
66
+ [prometheus]
67
+ enabled = false
68
+ [[chains]]
69
+ name = "token-provenance"
70
+ chain_id = 42431
71
+ rpc_url = "http://127.0.0.1:1"
72
+ pg_url = "postgres://postgres:postgres@postgres:5432/postgres"
73
+ backfill = false
74
+ [chains.clickhouse]
75
+ enabled = true
76
+ url = "http://clickhouse:8123"
77
+ user = "clickhouse"
78
+ password_env = "CLICKHOUSE_PASSWORD"
79
+ repair_derived_on_startup = false
80
+ `,
81
+ target: '/tmp/config.toml',
82
+ },
83
+ ])
84
+ .withEnvironment({ CLICKHOUSE_PASSWORD: 'clickhouse' })
85
+ .withCommand(['up', '--config', '/tmp/config.toml'])
86
+ .withExposedPorts(8080)
87
+ .withWaitStrategy(Wait.forListeningPorts())
88
+ .withStartupTimeout(120_000)
89
+ .start()
90
+ await vi.waitFor(
91
+ async () => {
92
+ const response = await query(
93
+ "SELECT count() FROM system.tables WHERE database = 'tidx_42431' AND name = 'logs'",
94
+ )
95
+ expect(response.trim()).toBe('1')
96
+ },
97
+ { timeout: 60_000 },
98
+ )
99
+ app = TestApp.create({
100
+ auth: false,
101
+ cache: { edge: false },
102
+ rpc: { url: 'http://127.0.0.1:1' },
103
+ tidx: { baseUrl: `http://${indexer.getHost()}:${indexer.getMappedPort(8080)}` },
104
+ })
105
+ })
106
+
107
+ afterAll(async () => {
108
+ await indexer?.stop()
109
+ await clickhouse?.stop()
110
+ await postgres?.stop()
111
+ await network?.stop()
112
+ })
113
+
114
+ test('excludes TokenCreated logs from non-factory emitters', async () => {
115
+ await insertForgedToken()
116
+
117
+ const response = await app.request('/v1/tokens?chainId=42431&limit=5')
118
+ expect(response.status, await response.clone().text()).toBe(200)
119
+ const body = await TestApp.json(response, Tokens.schema.getTokens.Response)
120
+ expect(body).toEqual({ data: [], nextCursor: null })
121
+ })
122
+ })
123
+
124
+ async function query(sql: string) {
125
+ const response = await fetch(url, {
126
+ body: sql,
127
+ headers: { Authorization: `Basic ${btoa('clickhouse:clickhouse')}` },
128
+ method: 'POST',
129
+ })
130
+ const body = await response.text()
131
+ if (!response.ok) throw new Error(body)
132
+ return body
133
+ }
134
+
135
+ async function insertForgedToken() {
136
+ const [selector, topic1] = encodeEventTopics({
137
+ abi,
138
+ args: { token },
139
+ eventName: 'TokenCreated',
140
+ })
141
+ if (typeof selector !== 'string' || typeof topic1 !== 'string')
142
+ throw new Error('Invalid TokenCreated event topics.')
143
+ const data = encodeAbiParameters(
144
+ [
145
+ { type: 'string' },
146
+ { type: 'string' },
147
+ { type: 'string' },
148
+ { type: 'address' },
149
+ { type: 'address' },
150
+ { type: 'bytes32' },
151
+ ],
152
+ ['Forged USD', 'FUSD', 'USD', zeroAddress, attacker, zeroHash],
153
+ )
154
+ await query(`INSERT INTO tidx_42431.logs
155
+ (block_num, block_timestamp, log_idx, tx_idx, tx_hash, address, selector, topic0, topic1, data)
156
+ VALUES (100, '2026-01-01 00:00:00', 0, 0, '${zeroHash}', '${attacker}', '${selector}', '${selector}', '${topic1}', '${data}')`)
157
+ }
@@ -19,7 +19,7 @@ function app(options: TestApp.create.Options = {}) {
19
19
  return TestApp.client({ db, ...options })
20
20
  }
21
21
 
22
- const verifiedTokenCount = 6
22
+ const verifiedTokenCount = 7
23
23
 
24
24
  describe('getTokenMetadata', () => {
25
25
  const address = '0x20c0000000000000000000000000000000000001'
@@ -914,14 +914,14 @@ describe('GET /tokens?verified=true', () => {
914
914
 
915
915
  test('paginates the verified list via limit + cursor', async () => {
916
916
  const client = app({ assetsPath: false })
917
- // Full list for comparison (6 verified tokens on the test chain).
917
+ // Full list for comparison (7 verified tokens on the test chain).
918
918
  const full = await TestApp.json(
919
919
  await client.v1.tokens.$get({ query: { verified: 'true' } }, TestApp.auth),
920
920
  Tokens.schema.getTokens.Response,
921
921
  )
922
922
 
923
923
  // First page: a bounded slice with a cursor to the next page (`minLimit` is
924
- // 5, and the test chain has 6 verified tokens, so a page of 5 leaves 1).
924
+ // 5, and the test chain has 7 verified tokens, so a page of 5 leaves 2).
925
925
  const first = await TestApp.json(
926
926
  await client.v1.tokens.$get({ query: { verified: 'true', limit: '5' } }, TestApp.auth),
927
927
  Tokens.schema.getTokens.Response,
@@ -937,7 +937,7 @@ describe('GET /tokens?verified=true', () => {
937
937
  ),
938
938
  Tokens.schema.getTokens.Response,
939
939
  )
940
- expect(second.data.length).toBe(1)
940
+ expect(second.data.length).toBe(verifiedTokenCount - 5)
941
941
  expect(second.nextCursor).toBeNull()
942
942
 
943
943
  // The two pages reconstruct the full list in order, with no overlap.