tapimo 0.7.0 → 0.7.2

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 (689) hide show
  1. package/dist/ApiKeys.d.ts +24 -7
  2. package/dist/ApiKeys.d.ts.map +1 -1
  3. package/dist/ApiKeys.js +17 -5
  4. package/dist/ApiKeys.js.map +1 -1
  5. package/dist/App.d.ts +12104 -7861
  6. package/dist/App.d.ts.map +1 -1
  7. package/dist/App.js +191 -128
  8. package/dist/App.js.map +1 -1
  9. package/dist/Assets.d.ts +10 -0
  10. package/dist/Assets.d.ts.map +1 -1
  11. package/dist/Assets.js +17 -4
  12. package/dist/Assets.js.map +1 -1
  13. package/dist/Scope.d.ts +19 -8
  14. package/dist/Scope.d.ts.map +1 -1
  15. package/dist/Scope.js +25 -9
  16. package/dist/Scope.js.map +1 -1
  17. package/dist/Webhooks.d.ts +1 -1
  18. package/dist/admin/App.d.ts +601 -20
  19. package/dist/admin/App.d.ts.map +1 -1
  20. package/dist/admin/App.js +12 -2
  21. package/dist/admin/App.js.map +1 -1
  22. package/dist/admin/apps/api-keys.d.ts +94 -11
  23. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.js +141 -32
  25. package/dist/admin/apps/api-keys.js.map +1 -1
  26. package/dist/admin/apps/earn-vaults.d.ts +1069 -0
  27. package/dist/admin/apps/earn-vaults.d.ts.map +1 -0
  28. package/dist/admin/apps/earn-vaults.js +409 -0
  29. package/dist/admin/apps/earn-vaults.js.map +1 -0
  30. package/dist/admin/apps/verified-tokens.d.ts +166 -166
  31. package/dist/admin/ui.generated.d.ts +1 -1
  32. package/dist/admin/ui.generated.d.ts.map +1 -1
  33. package/dist/admin/ui.generated.js +151 -95
  34. package/dist/admin/ui.generated.js.map +1 -1
  35. package/dist/analytics/Analytics.d.ts +2 -0
  36. package/dist/analytics/Analytics.d.ts.map +1 -1
  37. package/dist/analytics/Analytics.js +18 -2
  38. package/dist/analytics/Analytics.js.map +1 -1
  39. package/dist/analytics/tables/requestEvents.d.ts +22 -1
  40. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  41. package/dist/analytics/tables/requestEvents.js +59 -39
  42. package/dist/analytics/tables/requestEvents.js.map +1 -1
  43. package/dist/apps/Zones.d.ts +8335 -0
  44. package/dist/apps/Zones.d.ts.map +1 -0
  45. package/dist/apps/Zones.js +38 -0
  46. package/dist/apps/Zones.js.map +1 -0
  47. package/dist/apps/data/App.d.ts +14377 -10165
  48. package/dist/apps/data/App.d.ts.map +1 -1
  49. package/dist/apps/data/App.js +91 -19
  50. package/dist/apps/data/App.js.map +1 -1
  51. package/dist/apps/data/FxOracle.d.ts +1 -1
  52. package/dist/apps/data/FxOracle.d.ts.map +1 -1
  53. package/dist/apps/data/index.d.ts +0 -1
  54. package/dist/apps/data/index.d.ts.map +1 -1
  55. package/dist/apps/data/index.js +0 -1
  56. package/dist/apps/data/index.js.map +1 -1
  57. package/dist/apps/data/routes/activities.d.ts +32 -32
  58. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  59. package/dist/apps/data/routes/activities.js +130 -65
  60. package/dist/apps/data/routes/activities.js.map +1 -1
  61. package/dist/apps/data/routes/addresses.d.ts +312 -312
  62. package/dist/apps/data/routes/balances.d.ts +18 -18
  63. package/dist/apps/data/routes/balances.js +5 -5
  64. package/dist/apps/data/routes/balances.js.map +1 -1
  65. package/dist/apps/data/routes/coingecko.d.ts +176 -176
  66. package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
  67. package/dist/apps/data/routes/coingecko.js +62 -35
  68. package/dist/apps/data/routes/coingecko.js.map +1 -1
  69. package/dist/apps/data/routes/earn.d.ts +2144 -0
  70. package/dist/apps/data/routes/earn.d.ts.map +1 -0
  71. package/dist/apps/data/routes/earn.js +947 -0
  72. package/dist/apps/data/routes/earn.js.map +1 -0
  73. package/dist/apps/data/routes/exchanges.d.ts +1231 -324
  74. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  75. package/dist/apps/data/routes/exchanges.js +656 -193
  76. package/dist/apps/data/routes/exchanges.js.map +1 -1
  77. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  78. package/dist/apps/data/routes/fee-amm.js +59 -8
  79. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  80. package/dist/apps/data/routes/funding.d.ts +4092 -387
  81. package/dist/apps/data/routes/funding.d.ts.map +1 -1
  82. package/dist/apps/data/routes/funding.js +1403 -256
  83. package/dist/apps/data/routes/funding.js.map +1 -1
  84. package/dist/apps/data/routes/indexer.d.ts +5 -5
  85. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  86. package/dist/apps/data/routes/indexer.js +19 -2
  87. package/dist/apps/data/routes/indexer.js.map +1 -1
  88. package/dist/apps/data/routes/receipts.d.ts +265 -265
  89. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  90. package/dist/apps/data/routes/receipts.js +11 -11
  91. package/dist/apps/data/routes/receipts.js.map +1 -1
  92. package/dist/apps/data/routes/rpc.d.ts +5 -5
  93. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  94. package/dist/apps/data/routes/rpc.js +211 -22
  95. package/dist/apps/data/routes/rpc.js.map +1 -1
  96. package/dist/apps/data/routes/tokenlist.d.ts +36 -36
  97. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  98. package/dist/apps/data/routes/tokenlist.js +49 -9
  99. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  100. package/dist/apps/data/routes/tokens.d.ts +116 -88
  101. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  102. package/dist/apps/data/routes/tokens.js +198 -91
  103. package/dist/apps/data/routes/tokens.js.map +1 -1
  104. package/dist/apps/data/routes/transactions.d.ts +55 -55
  105. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  106. package/dist/apps/data/routes/transactions.js +78 -39
  107. package/dist/apps/data/routes/transactions.js.map +1 -1
  108. package/dist/apps/data/routes/transfers.d.ts +78 -29
  109. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  110. package/dist/apps/data/routes/transfers.js +165 -67
  111. package/dist/apps/data/routes/transfers.js.map +1 -1
  112. package/dist/apps/data/routes/valuation.d.ts +10 -10
  113. package/dist/apps/data/routes/valuation.js +2 -2
  114. package/dist/apps/data/routes/valuation.js.map +1 -1
  115. package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -1
  116. package/dist/apps/data/routes/verified-tokens.js +34 -9
  117. package/dist/apps/data/routes/verified-tokens.js.map +1 -1
  118. package/dist/apps/data/routes/webhooks.d.ts +5 -3
  119. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  120. package/dist/apps/data/routes/webhooks.js +175 -65
  121. package/dist/apps/data/routes/webhooks.js.map +1 -1
  122. package/dist/apps/data/routes/zones.d.ts +281 -0
  123. package/dist/apps/data/routes/zones.d.ts.map +1 -0
  124. package/dist/apps/data/routes/zones.js +252 -0
  125. package/dist/apps/data/routes/zones.js.map +1 -0
  126. package/dist/apps/docs/reference.js +6 -5
  127. package/dist/apps/docs/reference.js.map +1 -1
  128. package/dist/apps/index.d.ts +2 -1
  129. package/dist/apps/index.d.ts.map +1 -1
  130. package/dist/apps/index.js +2 -1
  131. package/dist/apps/index.js.map +1 -1
  132. package/dist/apps/management/App.d.ts +670 -670
  133. package/dist/apps/management/Billing.d.ts +8 -0
  134. package/dist/apps/management/Billing.d.ts.map +1 -1
  135. package/dist/apps/management/Billing.js +12 -0
  136. package/dist/apps/management/Billing.js.map +1 -1
  137. package/dist/apps/management/Error.d.ts +12 -0
  138. package/dist/apps/management/Error.d.ts.map +1 -0
  139. package/dist/apps/management/Error.js +10 -0
  140. package/dist/apps/management/Error.js.map +1 -0
  141. package/dist/apps/management/routes/api-keys.d.ts +5 -5
  142. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  143. package/dist/apps/management/routes/api-keys.js +2 -8
  144. package/dist/apps/management/routes/api-keys.js.map +1 -1
  145. package/dist/apps/management/routes/billing.d.ts +119 -119
  146. package/dist/apps/management/routes/faucet.d.ts +35 -35
  147. package/dist/apps/management/routes/invitations.d.ts +62 -62
  148. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  149. package/dist/apps/management/routes/invitations.js +4 -10
  150. package/dist/apps/management/routes/invitations.js.map +1 -1
  151. package/dist/apps/management/routes/invite-links.d.ts +30 -30
  152. package/dist/apps/management/routes/me.d.ts +6 -6
  153. package/dist/apps/management/routes/members.d.ts +78 -78
  154. package/dist/apps/management/routes/orgs.d.ts +48 -48
  155. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  156. package/dist/apps/management/routes/orgs.js +2 -8
  157. package/dist/apps/management/routes/orgs.js.map +1 -1
  158. package/dist/apps/management/routes/projects.d.ts +9 -9
  159. package/dist/apps/management/routes/scopes.js +2 -2
  160. package/dist/apps/management/routes/scopes.js.map +1 -1
  161. package/dist/apps/management/routes/usage.d.ts +80 -80
  162. package/dist/apps/management/routes/verified-token-requests.d.ts +36 -36
  163. package/dist/apps/management/routes/webhooks.d.ts +50 -50
  164. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  165. package/dist/apps/management/routes/webhooks.js +15 -3
  166. package/dist/apps/management/routes/webhooks.js.map +1 -1
  167. package/dist/apps/mpp/App.d.ts +55 -56
  168. package/dist/apps/mpp/App.d.ts.map +1 -1
  169. package/dist/apps/mpp/App.js +192 -27
  170. package/dist/apps/mpp/App.js.map +1 -1
  171. package/dist/apps/mpp/Mpp.d.ts +0 -20
  172. package/dist/apps/mpp/Mpp.d.ts.map +1 -1
  173. package/dist/apps/mpp/Mpp.js +0 -24
  174. package/dist/apps/mpp/Mpp.js.map +1 -1
  175. package/dist/apps/mpp/internal/Adapter.d.ts +40 -0
  176. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -0
  177. package/dist/apps/mpp/internal/Adapter.js +66 -0
  178. package/dist/apps/mpp/internal/Adapter.js.map +1 -0
  179. package/dist/apps/mpp/internal/Error.d.ts +4 -0
  180. package/dist/apps/mpp/internal/Error.d.ts.map +1 -0
  181. package/dist/apps/mpp/internal/Error.js +41 -0
  182. package/dist/apps/mpp/internal/Error.js.map +1 -0
  183. package/dist/apps/mpp/internal/Idempotency.d.ts +33 -0
  184. package/dist/apps/mpp/internal/Idempotency.d.ts.map +1 -0
  185. package/dist/apps/mpp/internal/Idempotency.js +28 -0
  186. package/dist/apps/mpp/internal/Idempotency.js.map +1 -0
  187. package/dist/apps/mpp/internal/Policy.d.ts +46 -0
  188. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -0
  189. package/dist/apps/mpp/internal/Policy.js +57 -0
  190. package/dist/apps/mpp/internal/Policy.js.map +1 -0
  191. package/dist/apps/mpp/internal/ScreenManager.d.ts +27 -0
  192. package/dist/apps/mpp/internal/ScreenManager.d.ts.map +1 -0
  193. package/dist/apps/mpp/internal/ScreenManager.js +18 -0
  194. package/dist/apps/mpp/internal/ScreenManager.js.map +1 -0
  195. package/dist/apps/mpp/internal/Screening.d.ts +35 -0
  196. package/dist/apps/mpp/internal/Screening.d.ts.map +1 -0
  197. package/dist/apps/mpp/internal/Screening.js +20 -0
  198. package/dist/apps/mpp/internal/Screening.js.map +1 -0
  199. package/dist/apps/mpp/internal/Sponsorship.d.ts +36 -0
  200. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -0
  201. package/dist/apps/mpp/internal/Sponsorship.js +103 -0
  202. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -0
  203. package/dist/apps/mpp/internal/Utils.d.ts +7 -0
  204. package/dist/apps/mpp/internal/Utils.d.ts.map +1 -0
  205. package/dist/apps/mpp/internal/Utils.js +24 -0
  206. package/dist/apps/mpp/internal/Utils.js.map +1 -0
  207. package/dist/apps/relay/App.js +184 -24
  208. package/dist/apps/relay/App.js.map +1 -1
  209. package/dist/apps/relay/Sponsorships.d.ts +4 -0
  210. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  211. package/dist/apps/relay/Sponsorships.js +16 -7
  212. package/dist/apps/relay/Sponsorships.js.map +1 -1
  213. package/dist/db/Db.d.ts +20 -0
  214. package/dist/db/Db.d.ts.map +1 -1
  215. package/dist/db/Db.js +342 -0
  216. package/dist/db/Db.js.map +1 -1
  217. package/dist/db/Schema.d.ts +921 -1
  218. package/dist/db/Schema.d.ts.map +1 -1
  219. package/dist/db/Schema.js +269 -1
  220. package/dist/db/Schema.js.map +1 -1
  221. package/dist/db/tables/earnVaults.d.ts +68 -0
  222. package/dist/db/tables/earnVaults.d.ts.map +1 -0
  223. package/dist/db/tables/earnVaults.js +72 -0
  224. package/dist/db/tables/earnVaults.js.map +1 -0
  225. package/dist/db/tables/fundingCatalog.d.ts +56 -0
  226. package/dist/db/tables/fundingCatalog.d.ts.map +1 -0
  227. package/dist/db/tables/fundingCatalog.js +85 -0
  228. package/dist/db/tables/fundingCatalog.js.map +1 -0
  229. package/dist/db/tables/fundingDepositAddresses.d.ts +159 -0
  230. package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
  231. package/dist/db/tables/fundingDepositAddresses.js +206 -0
  232. package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
  233. package/dist/db/tables/fundingDeposits.d.ts +115 -0
  234. package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
  235. package/dist/db/tables/fundingDeposits.js +100 -0
  236. package/dist/db/tables/fundingDeposits.js.map +1 -0
  237. package/dist/db/tables/fundingIdempotency.d.ts +91 -0
  238. package/dist/db/tables/fundingIdempotency.d.ts.map +1 -0
  239. package/dist/db/tables/fundingIdempotency.js +103 -0
  240. package/dist/db/tables/fundingIdempotency.js.map +1 -0
  241. package/dist/db/tables/fundingTransferEvents.d.ts +12 -0
  242. package/dist/db/tables/fundingTransferEvents.d.ts.map +1 -0
  243. package/dist/db/tables/fundingTransferEvents.js +18 -0
  244. package/dist/db/tables/fundingTransferEvents.js.map +1 -0
  245. package/dist/db/tables/fundingTransferTransactions.d.ts +15 -0
  246. package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -0
  247. package/dist/db/tables/fundingTransferTransactions.js +27 -0
  248. package/dist/db/tables/fundingTransferTransactions.js.map +1 -0
  249. package/dist/db/tables/fundingTransfers.d.ts +82 -0
  250. package/dist/db/tables/fundingTransfers.d.ts.map +1 -0
  251. package/dist/db/tables/fundingTransfers.js +89 -0
  252. package/dist/db/tables/fundingTransfers.js.map +1 -0
  253. package/dist/db/tables/organizations.d.ts +8 -0
  254. package/dist/db/tables/organizations.d.ts.map +1 -1
  255. package/dist/db/tables/organizations.js +35 -0
  256. package/dist/db/tables/organizations.js.map +1 -1
  257. package/dist/db/tables/projects.d.ts +8 -0
  258. package/dist/db/tables/projects.d.ts.map +1 -1
  259. package/dist/db/tables/projects.js +16 -0
  260. package/dist/db/tables/projects.js.map +1 -1
  261. package/dist/db/tables/requestUsage.d.ts +13 -0
  262. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  263. package/dist/db/tables/requestUsage.js +16 -0
  264. package/dist/db/tables/requestUsage.js.map +1 -1
  265. package/dist/db/tables/sponsoredTransactions.d.ts +4 -2
  266. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  267. package/dist/db/tables/sponsoredTransactions.js +14 -4
  268. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  269. package/dist/db/tables/users.d.ts +8 -0
  270. package/dist/db/tables/users.d.ts.map +1 -1
  271. package/dist/db/tables/users.js +16 -0
  272. package/dist/db/tables/users.js.map +1 -1
  273. package/dist/db/tables/verifiedTokens.d.ts +14 -7
  274. package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
  275. package/dist/db/tables/verifiedTokens.js +9 -7
  276. package/dist/db/tables/verifiedTokens.js.map +1 -1
  277. package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
  278. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  279. package/dist/db/tables/webhookSubscriptions.js +24 -3
  280. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  281. package/dist/handlers/relay.js +108 -108
  282. package/dist/handlers/relay.js.map +1 -1
  283. package/dist/internal/Auth.d.ts +26 -0
  284. package/dist/internal/Auth.d.ts.map +1 -1
  285. package/dist/internal/Auth.js +35 -2
  286. package/dist/internal/Auth.js.map +1 -1
  287. package/dist/internal/Cache.d.ts.map +1 -1
  288. package/dist/internal/Cache.js +16 -10
  289. package/dist/internal/Cache.js.map +1 -1
  290. package/dist/internal/Cursor.js +1 -1
  291. package/dist/internal/Cursor.js.map +1 -1
  292. package/dist/internal/EarnRates.d.ts +89 -0
  293. package/dist/internal/EarnRates.d.ts.map +1 -0
  294. package/dist/internal/EarnRates.js +266 -0
  295. package/dist/internal/EarnRates.js.map +1 -0
  296. package/dist/internal/EarnVaults.d.ts +171 -0
  297. package/dist/internal/EarnVaults.d.ts.map +1 -0
  298. package/dist/internal/EarnVaults.js +547 -0
  299. package/dist/internal/EarnVaults.js.map +1 -0
  300. package/dist/internal/EdgeCache.d.ts +9 -2
  301. package/dist/internal/EdgeCache.d.ts.map +1 -1
  302. package/dist/internal/EdgeCache.js +36 -9
  303. package/dist/internal/EdgeCache.js.map +1 -1
  304. package/dist/internal/Id.d.ts +11 -0
  305. package/dist/internal/Id.d.ts.map +1 -1
  306. package/dist/internal/Id.js +13 -0
  307. package/dist/internal/Id.js.map +1 -1
  308. package/dist/internal/Idempotency.d.ts +83 -0
  309. package/dist/internal/Idempotency.d.ts.map +1 -0
  310. package/dist/internal/Idempotency.js +113 -0
  311. package/dist/internal/Idempotency.js.map +1 -0
  312. package/dist/internal/Log.d.ts +64 -9
  313. package/dist/internal/Log.d.ts.map +1 -1
  314. package/dist/internal/Log.js +29 -7
  315. package/dist/internal/Log.js.map +1 -1
  316. package/dist/internal/MetricSink.d.ts.map +1 -1
  317. package/dist/internal/MetricSink.js +47 -1
  318. package/dist/internal/MetricSink.js.map +1 -1
  319. package/dist/internal/OpenApi.d.ts +1 -1
  320. package/dist/internal/OpenApi.d.ts.map +1 -1
  321. package/dist/internal/OpenApi.js +3 -0
  322. package/dist/internal/OpenApi.js.map +1 -1
  323. package/dist/internal/Provider.d.ts +14 -0
  324. package/dist/internal/Provider.d.ts.map +1 -0
  325. package/dist/internal/Provider.js +5 -0
  326. package/dist/internal/Provider.js.map +1 -0
  327. package/dist/internal/Schema.d.ts +8 -3
  328. package/dist/internal/Schema.d.ts.map +1 -1
  329. package/dist/internal/Schema.js +24 -13
  330. package/dist/internal/Schema.js.map +1 -1
  331. package/dist/internal/Store.d.ts +6 -0
  332. package/dist/internal/Store.d.ts.map +1 -1
  333. package/dist/internal/Store.js +35 -0
  334. package/dist/internal/Store.js.map +1 -1
  335. package/dist/internal/Tidx.d.ts +43 -24
  336. package/dist/internal/Tidx.d.ts.map +1 -1
  337. package/dist/internal/Tidx.js +79 -11
  338. package/dist/internal/Tidx.js.map +1 -1
  339. package/dist/internal/Viem.d.ts +82 -65
  340. package/dist/internal/Viem.d.ts.map +1 -1
  341. package/dist/internal/Viem.js +83 -12
  342. package/dist/internal/Viem.js.map +1 -1
  343. package/dist/internal/WebhookDestination.d.ts.map +1 -1
  344. package/dist/internal/WebhookDestination.js +34 -28
  345. package/dist/internal/WebhookDestination.js.map +1 -1
  346. package/dist/internal/Webhooks.d.ts +9 -0
  347. package/dist/internal/Webhooks.d.ts.map +1 -1
  348. package/dist/internal/Webhooks.js +15 -10
  349. package/dist/internal/Webhooks.js.map +1 -1
  350. package/dist/internal/exchange/Provider.d.ts +219 -0
  351. package/dist/internal/exchange/Provider.d.ts.map +1 -0
  352. package/dist/internal/exchange/Provider.js +117 -0
  353. package/dist/internal/exchange/Provider.js.map +1 -0
  354. package/dist/internal/exchange/index.d.ts +2 -0
  355. package/dist/internal/exchange/index.d.ts.map +1 -0
  356. package/dist/internal/exchange/index.js +2 -0
  357. package/dist/internal/exchange/index.js.map +1 -0
  358. package/dist/internal/exchange/providers/uniswap.d.ts +57 -0
  359. package/dist/internal/exchange/providers/uniswap.d.ts.map +1 -0
  360. package/dist/internal/exchange/providers/uniswap.js +553 -0
  361. package/dist/internal/exchange/providers/uniswap.js.map +1 -0
  362. package/dist/internal/funding/Action.d.ts +55 -0
  363. package/dist/internal/funding/Action.d.ts.map +1 -0
  364. package/dist/internal/funding/Action.js +74 -0
  365. package/dist/internal/funding/Action.js.map +1 -0
  366. package/dist/internal/funding/Catalog.d.ts +107 -0
  367. package/dist/internal/funding/Catalog.d.ts.map +1 -0
  368. package/dist/internal/funding/Catalog.js +270 -0
  369. package/dist/internal/funding/Catalog.js.map +1 -0
  370. package/dist/internal/funding/Chain.d.ts +76 -0
  371. package/dist/internal/funding/Chain.d.ts.map +1 -0
  372. package/dist/internal/funding/Chain.js +38 -0
  373. package/dist/internal/funding/Chain.js.map +1 -0
  374. package/dist/internal/funding/Deposit.d.ts +366 -0
  375. package/dist/internal/funding/Deposit.d.ts.map +1 -0
  376. package/dist/internal/funding/Deposit.js +286 -0
  377. package/dist/internal/funding/Deposit.js.map +1 -0
  378. package/dist/internal/funding/DepositAddress.d.ts +345 -0
  379. package/dist/internal/funding/DepositAddress.d.ts.map +1 -0
  380. package/dist/internal/funding/DepositAddress.js +189 -0
  381. package/dist/internal/funding/DepositAddress.js.map +1 -0
  382. package/dist/internal/funding/Evidence.d.ts +52 -0
  383. package/dist/internal/funding/Evidence.d.ts.map +1 -0
  384. package/dist/internal/funding/Evidence.js +314 -0
  385. package/dist/internal/funding/Evidence.js.map +1 -0
  386. package/dist/internal/funding/Provider.d.ts +1186 -0
  387. package/dist/internal/funding/Provider.d.ts.map +1 -0
  388. package/dist/internal/funding/Provider.js +1081 -0
  389. package/dist/internal/funding/Provider.js.map +1 -0
  390. package/dist/internal/funding/Reconciliation.d.ts +113 -0
  391. package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
  392. package/dist/internal/funding/Reconciliation.js +676 -0
  393. package/dist/internal/funding/Reconciliation.js.map +1 -0
  394. package/dist/internal/funding/Route.d.ts +21 -0
  395. package/dist/internal/funding/Route.d.ts.map +1 -0
  396. package/dist/internal/funding/Route.js +5 -0
  397. package/dist/internal/funding/Route.js.map +1 -0
  398. package/dist/internal/funding/Subsidy.d.ts +113 -0
  399. package/dist/internal/funding/Subsidy.d.ts.map +1 -0
  400. package/dist/internal/funding/Subsidy.js +138 -0
  401. package/dist/internal/funding/Subsidy.js.map +1 -0
  402. package/dist/internal/funding/Token.d.ts +41 -0
  403. package/dist/internal/funding/Token.d.ts.map +1 -0
  404. package/dist/internal/funding/Token.js +22 -0
  405. package/dist/internal/funding/Token.js.map +1 -0
  406. package/dist/internal/funding/Transfer.d.ts +643 -0
  407. package/dist/internal/funding/Transfer.d.ts.map +1 -0
  408. package/dist/internal/funding/Transfer.js +332 -0
  409. package/dist/internal/funding/Transfer.js.map +1 -0
  410. package/dist/internal/funding/index.d.ts +13 -0
  411. package/dist/internal/funding/index.d.ts.map +1 -0
  412. package/dist/internal/funding/index.js +13 -0
  413. package/dist/internal/funding/index.js.map +1 -0
  414. package/dist/internal/funding/providers/across.d.ts +21 -0
  415. package/dist/internal/funding/providers/across.d.ts.map +1 -0
  416. package/dist/internal/funding/providers/across.js +117 -0
  417. package/dist/internal/funding/providers/across.js.map +1 -0
  418. package/dist/internal/funding/providers/relay.d.ts +46 -0
  419. package/dist/internal/funding/providers/relay.d.ts.map +1 -0
  420. package/dist/internal/funding/providers/relay.js +464 -0
  421. package/dist/internal/funding/providers/relay.js.map +1 -0
  422. package/dist/internal/funding/providers/rhino.d.ts +15 -0
  423. package/dist/internal/funding/providers/rhino.d.ts.map +1 -0
  424. package/dist/internal/funding/providers/rhino.js +116 -0
  425. package/dist/internal/funding/providers/rhino.js.map +1 -0
  426. package/dist/internal/funding/providers/squid.d.ts +19 -0
  427. package/dist/internal/funding/providers/squid.d.ts.map +1 -0
  428. package/dist/internal/funding/providers/squid.js +120 -0
  429. package/dist/internal/funding/providers/squid.js.map +1 -0
  430. package/dist/internal/funding/providers/symbiosis.d.ts +20 -0
  431. package/dist/internal/funding/providers/symbiosis.d.ts.map +1 -0
  432. package/dist/internal/funding/providers/symbiosis.js +176 -0
  433. package/dist/internal/funding/providers/symbiosis.js.map +1 -0
  434. package/dist/internal/index.d.ts +5 -1
  435. package/dist/internal/index.d.ts.map +1 -1
  436. package/dist/internal/index.js +5 -1
  437. package/dist/internal/index.js.map +1 -1
  438. package/dist/internal/webhookDestinations/url.js +61 -57
  439. package/dist/internal/webhookDestinations/url.js.map +1 -1
  440. package/dist/providers/index.d.ts +43 -0
  441. package/dist/providers/index.d.ts.map +1 -0
  442. package/dist/providers/index.js +19 -0
  443. package/dist/providers/index.js.map +1 -0
  444. package/package.json +9 -4
  445. package/src/ApiKeys.test.ts +11 -7
  446. package/src/ApiKeys.ts +37 -9
  447. package/src/App.test.ts +85 -10
  448. package/src/App.ts +224 -137
  449. package/src/Assets.ts +29 -4
  450. package/src/Client.test-d.ts +650 -30
  451. package/src/Scope.test.ts +19 -0
  452. package/src/Scope.ts +28 -11
  453. package/src/Webhooks.test.ts +25 -0
  454. package/src/Webhooks.ts +1 -1
  455. package/src/admin/App.test.ts +9 -2
  456. package/src/admin/App.ts +32 -9
  457. package/src/admin/apps/api-keys.test.ts +167 -23
  458. package/src/admin/apps/api-keys.ts +166 -28
  459. package/src/admin/apps/earn-vaults.test.ts +338 -0
  460. package/src/admin/apps/earn-vaults.ts +572 -0
  461. package/src/admin/apps/scopes.test.ts +16 -1
  462. package/src/admin/ui/plugin.ts +2 -2
  463. package/src/admin/ui/src/components/EarnVaultForm.tsx +137 -0
  464. package/src/admin/ui/src/components/MobileProfile.tsx +2 -2
  465. package/src/admin/ui/src/components/Page.tsx +1 -1
  466. package/src/admin/ui/src/components/ThemeToggle.tsx +1 -1
  467. package/src/admin/ui/src/lib/api-keys.ts +37 -7
  468. package/src/admin/ui/src/lib/client.ts +1 -1
  469. package/src/admin/ui/src/lib/config.ts +1 -1
  470. package/src/admin/ui/src/lib/early-access.ts +8 -9
  471. package/src/admin/ui/src/lib/earn-vaults.ts +207 -0
  472. package/src/admin/ui/src/lib/format.ts +13 -0
  473. package/src/admin/ui/src/lib/organizations.test.ts +14 -4
  474. package/src/admin/ui/src/lib/organizations.ts +7 -1
  475. package/src/admin/ui/src/lib/response.ts +22 -0
  476. package/src/admin/ui/src/lib/scopes.test.ts +19 -11
  477. package/src/admin/ui/src/lib/scopes.ts +28 -7
  478. package/src/admin/ui/src/lib/verified-tokens.ts +10 -9
  479. package/src/admin/ui/src/routeTree.gen.ts +70 -7
  480. package/src/admin/ui/src/router.tsx +2 -2
  481. package/src/admin/ui/src/routes/__root.tsx +9 -8
  482. package/src/admin/ui/src/routes/api-keys.tsx +475 -64
  483. package/src/admin/ui/src/routes/early-access.tsx +5 -12
  484. package/src/admin/ui/src/routes/earn.vaults.tsx +348 -0
  485. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +154 -0
  486. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +190 -0
  487. package/src/admin/ui/src/routes/organizations.tsx +4 -7
  488. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +56 -54
  489. package/src/admin/ui/src/routes/verified-tokens.tsx +4 -4
  490. package/src/admin/ui/vite.config.ts +4 -1
  491. package/src/admin/ui.generated.ts +189 -95
  492. package/src/analytics/Analytics.test.ts +69 -10
  493. package/src/analytics/Analytics.ts +20 -1
  494. package/src/analytics/tables/requestEvents.ts +79 -37
  495. package/src/apps/Zones.test.ts +33 -0
  496. package/src/apps/Zones.ts +40 -0
  497. package/src/apps/composition.test.ts +84 -1
  498. package/src/apps/data/App.test.ts +38 -9
  499. package/src/apps/data/App.ts +96 -33
  500. package/src/apps/data/FxOracle.ts +1 -1
  501. package/src/apps/data/index.ts +0 -1
  502. package/src/apps/data/routes/activities.test.ts +82 -6
  503. package/src/apps/data/routes/activities.ts +131 -71
  504. package/src/apps/data/routes/balances.test.ts +50 -37
  505. package/src/apps/data/routes/balances.ts +5 -5
  506. package/src/apps/data/routes/blocks.test.ts +2 -0
  507. package/src/apps/data/routes/coingecko.test.ts +22 -0
  508. package/src/apps/data/routes/coingecko.ts +84 -48
  509. package/src/apps/data/routes/earn.test.ts +1108 -0
  510. package/src/apps/data/routes/earn.ts +1391 -0
  511. package/src/apps/data/routes/exchanges.test.ts +82 -33
  512. package/src/apps/data/routes/exchanges.ts +842 -227
  513. package/src/apps/data/routes/fee-amm.test.ts +4 -6
  514. package/src/apps/data/routes/fee-amm.ts +69 -12
  515. package/src/apps/data/routes/funding.test.ts +2712 -221
  516. package/src/apps/data/routes/funding.ts +1604 -387
  517. package/src/apps/data/routes/indexer.test.ts +43 -34
  518. package/src/apps/data/routes/indexer.ts +19 -2
  519. package/src/apps/data/routes/receipts.test.ts +5 -3
  520. package/src/apps/data/routes/receipts.ts +13 -11
  521. package/src/apps/data/routes/rpc.test.ts +446 -28
  522. package/src/apps/data/routes/rpc.ts +243 -25
  523. package/src/apps/data/routes/tokenlist.test.ts +15 -0
  524. package/src/apps/data/routes/tokenlist.ts +88 -22
  525. package/src/apps/data/routes/tokens.ts +262 -86
  526. package/src/apps/data/routes/transactions.test.ts +2 -0
  527. package/src/apps/data/routes/transactions.ts +77 -42
  528. package/src/apps/data/routes/transfers.test.ts +166 -4
  529. package/src/apps/data/routes/transfers.ts +216 -78
  530. package/src/apps/data/routes/valuation.test.ts +62 -9
  531. package/src/apps/data/routes/valuation.ts +2 -2
  532. package/src/apps/data/routes/verified-tokens.test.ts +51 -0
  533. package/src/apps/data/routes/verified-tokens.ts +52 -15
  534. package/src/apps/data/routes/webhooks.test.ts +432 -33
  535. package/src/apps/data/routes/webhooks.ts +189 -79
  536. package/src/apps/data/routes/zones.test.ts +473 -0
  537. package/src/apps/data/routes/zones.ts +338 -0
  538. package/src/apps/docs/reference.ts +8 -6
  539. package/src/apps/index.ts +2 -1
  540. package/src/apps/management/Billing.test.ts +29 -0
  541. package/src/apps/management/Billing.ts +23 -0
  542. package/src/apps/management/Error.ts +12 -0
  543. package/src/apps/management/routes/api-keys.test.ts +5 -3
  544. package/src/apps/management/routes/api-keys.ts +2 -9
  545. package/src/apps/management/routes/invitations.ts +4 -11
  546. package/src/apps/management/routes/orgs.ts +2 -9
  547. package/src/apps/management/routes/scopes.test.ts +7 -2
  548. package/src/apps/management/routes/scopes.ts +2 -2
  549. package/src/apps/management/routes/webhooks.test.ts +6 -1
  550. package/src/apps/management/routes/webhooks.ts +15 -3
  551. package/src/apps/mpp/App.ts +276 -29
  552. package/src/apps/mpp/Mpp.test.ts +631 -26
  553. package/src/apps/mpp/Mpp.ts +0 -42
  554. package/src/apps/mpp/internal/Adapter.ts +108 -3
  555. package/src/apps/mpp/internal/Error.test.ts +33 -0
  556. package/src/apps/mpp/internal/Error.ts +44 -6
  557. package/src/apps/mpp/internal/Idempotency.test.ts +213 -0
  558. package/src/apps/mpp/internal/Idempotency.ts +59 -5
  559. package/src/apps/mpp/internal/Policy.test.ts +122 -0
  560. package/src/apps/mpp/internal/Policy.ts +98 -0
  561. package/src/apps/mpp/internal/ScreenManager.test.ts +68 -0
  562. package/src/apps/mpp/internal/ScreenManager.ts +41 -0
  563. package/src/apps/mpp/internal/Screening.ts +40 -3
  564. package/src/apps/mpp/internal/Sponsorship.ts +144 -0
  565. package/src/apps/mpp/internal/Utils.ts +30 -0
  566. package/src/apps/relay/App.test.ts +495 -64
  567. package/src/apps/relay/App.ts +234 -24
  568. package/src/apps/relay/Sponsorships.test.ts +51 -0
  569. package/src/apps/relay/Sponsorships.ts +19 -7
  570. package/src/db/Db.ts +439 -0
  571. package/src/db/Schema.ts +325 -2
  572. package/src/db/tables/earnVaults.test.ts +185 -0
  573. package/src/db/tables/earnVaults.ts +151 -0
  574. package/src/db/tables/fundingCatalog.test.ts +108 -0
  575. package/src/db/tables/fundingCatalog.ts +157 -0
  576. package/src/db/tables/fundingDepositAddresses.test.ts +580 -0
  577. package/src/db/tables/fundingDepositAddresses.ts +376 -0
  578. package/src/db/tables/fundingDeposits.test.ts +261 -0
  579. package/src/db/tables/fundingDeposits.ts +229 -0
  580. package/src/db/tables/fundingIdempotency.test.ts +182 -0
  581. package/src/db/tables/fundingIdempotency.ts +180 -0
  582. package/src/db/tables/fundingTransferEvents.ts +28 -0
  583. package/src/db/tables/fundingTransferTransactions.test.ts +69 -0
  584. package/src/db/tables/fundingTransferTransactions.ts +37 -0
  585. package/src/db/tables/fundingTransfers.test.ts +89 -0
  586. package/src/db/tables/fundingTransfers.ts +153 -0
  587. package/src/db/tables/organizations.test.ts +88 -0
  588. package/src/db/tables/organizations.ts +42 -1
  589. package/src/db/tables/projects.ts +16 -0
  590. package/src/db/tables/requestUsage.ts +23 -0
  591. package/src/db/tables/sponsoredTransactions.test.ts +52 -2
  592. package/src/db/tables/sponsoredTransactions.ts +18 -6
  593. package/src/db/tables/users.ts +16 -0
  594. package/src/db/tables/verifiedTokens.ts +19 -14
  595. package/src/db/tables/webhookSubscriptions.ts +58 -3
  596. package/src/handlers/relay.test.ts +2 -0
  597. package/src/handlers/relay.ts +95 -99
  598. package/src/internal/Auth.test.ts +48 -0
  599. package/src/internal/Auth.ts +61 -2
  600. package/src/internal/Cache.ts +13 -9
  601. package/src/internal/Cursor.test.ts +2 -2
  602. package/src/internal/Cursor.ts +1 -1
  603. package/src/internal/EarnRates.test.ts +125 -0
  604. package/src/internal/EarnRates.ts +409 -0
  605. package/src/internal/EarnVaults.test.ts +195 -0
  606. package/src/internal/EarnVaults.ts +876 -0
  607. package/src/internal/EdgeCache.test.ts +37 -5
  608. package/src/internal/EdgeCache.ts +39 -7
  609. package/src/internal/Id.ts +14 -0
  610. package/src/internal/Idempotency.test.ts +109 -0
  611. package/src/internal/Idempotency.ts +237 -0
  612. package/src/internal/Log.test-d.ts +41 -8
  613. package/src/internal/Log.test.ts +189 -8
  614. package/src/internal/Log.ts +124 -17
  615. package/src/internal/MetricSink.test.ts +244 -4
  616. package/src/internal/MetricSink.ts +51 -1
  617. package/src/internal/OpenApi.ts +3 -0
  618. package/src/internal/Provider.test.ts +17 -0
  619. package/src/internal/Provider.ts +17 -0
  620. package/src/internal/Schema.test.ts +13 -0
  621. package/src/internal/Schema.ts +41 -24
  622. package/src/internal/Store.test.ts +25 -0
  623. package/src/internal/Store.ts +46 -0
  624. package/src/internal/Tidx.local.test.ts +78 -3
  625. package/src/internal/Tidx.test.ts +212 -18
  626. package/src/internal/Tidx.ts +112 -32
  627. package/src/internal/VerifiedTokens.test.ts +15 -0
  628. package/src/internal/Viem.test.ts +170 -17
  629. package/src/internal/Viem.ts +111 -28
  630. package/src/internal/WebhookDestination.ts +25 -23
  631. package/src/internal/Webhooks.test.ts +59 -0
  632. package/src/internal/Webhooks.ts +34 -10
  633. package/src/internal/exchange/Provider.test.ts +216 -0
  634. package/src/internal/exchange/Provider.ts +326 -0
  635. package/src/internal/exchange/index.test.ts +6 -0
  636. package/src/internal/exchange/index.ts +1 -0
  637. package/src/internal/exchange/providers/uniswap.test.ts +122 -0
  638. package/src/internal/exchange/providers/uniswap.ts +682 -0
  639. package/src/internal/funding/Action.test.ts +138 -0
  640. package/src/internal/funding/Action.ts +117 -0
  641. package/src/internal/funding/Catalog.test.ts +311 -0
  642. package/src/internal/funding/Catalog.ts +347 -0
  643. package/src/internal/funding/Chain.test.ts +79 -0
  644. package/src/internal/funding/Chain.ts +120 -0
  645. package/src/internal/funding/Deposit.test.ts +26 -0
  646. package/src/internal/funding/Deposit.ts +453 -0
  647. package/src/internal/funding/DepositAddress.test.ts +18 -0
  648. package/src/internal/funding/DepositAddress.ts +312 -0
  649. package/src/internal/funding/Evidence.test.ts +297 -0
  650. package/src/internal/funding/Evidence.ts +430 -0
  651. package/src/internal/funding/Provider.test.ts +1328 -0
  652. package/src/internal/funding/Provider.ts +1796 -0
  653. package/src/internal/funding/Reconciliation.local.test.ts +504 -0
  654. package/src/internal/funding/Reconciliation.test.ts +2020 -0
  655. package/src/internal/funding/Reconciliation.ts +930 -0
  656. package/src/internal/funding/Route.test.ts +66 -0
  657. package/src/internal/funding/Route.ts +29 -0
  658. package/src/internal/funding/Subsidy.local.test.ts +152 -0
  659. package/src/internal/funding/Subsidy.test.ts +75 -0
  660. package/src/internal/funding/Subsidy.ts +260 -0
  661. package/src/internal/funding/Token.test.ts +47 -0
  662. package/src/internal/funding/Token.ts +59 -0
  663. package/src/internal/funding/Transfer.test.ts +369 -0
  664. package/src/internal/funding/Transfer.ts +522 -0
  665. package/src/internal/funding/index.test.ts +20 -0
  666. package/src/internal/funding/index.ts +12 -0
  667. package/src/internal/funding/providers/across.ts +149 -0
  668. package/src/{apps/data/FundingQuoteProviders.test.ts → internal/funding/providers/index.test.ts} +178 -157
  669. package/src/internal/funding/providers/relay.test.ts +474 -0
  670. package/src/internal/funding/providers/relay.ts +559 -0
  671. package/src/internal/funding/providers/rhino.ts +139 -0
  672. package/src/internal/funding/providers/squid.ts +151 -0
  673. package/src/internal/funding/providers/symbiosis.ts +221 -0
  674. package/src/internal/index.test.ts +5 -1
  675. package/src/internal/index.ts +5 -1
  676. package/src/internal/webhookDestinations/url.ts +49 -45
  677. package/src/providers/index.test.ts +14 -0
  678. package/src/providers/index.ts +54 -0
  679. package/dist/apps/data/FundingQuoteProviders.d.ts +0 -174
  680. package/dist/apps/data/FundingQuoteProviders.d.ts.map +0 -1
  681. package/dist/apps/data/FundingQuoteProviders.js +0 -775
  682. package/dist/apps/data/FundingQuoteProviders.js.map +0 -1
  683. package/dist/internal/FundingQuotes.d.ts +0 -864
  684. package/dist/internal/FundingQuotes.d.ts.map +0 -1
  685. package/dist/internal/FundingQuotes.js +0 -672
  686. package/dist/internal/FundingQuotes.js.map +0 -1
  687. package/src/apps/data/FundingQuoteProviders.ts +0 -1043
  688. package/src/internal/FundingQuotes.test.ts +0 -456
  689. package/src/internal/FundingQuotes.ts +0 -944
@@ -3,7 +3,9 @@ import { ZoneRpcAuthentication } from 'ox/tempo'
3
3
  import * as z from 'zod/mini'
4
4
 
5
5
  import type * as App from '../../../App.js'
6
+ import * as Scope from '../../../Scope.js'
6
7
  import * as Auth from '../../../internal/Auth.js'
8
+ import * as Log from '../../../internal/Log.js'
7
9
  import * as OpenApi from '../../../internal/OpenApi.js'
8
10
  import * as Response from '../../../internal/Response.js'
9
11
  import * as Schema from '../../../internal/Schema.js'
@@ -66,11 +68,24 @@ const zoneReadMethods = new Set([
66
68
  'net_version',
67
69
  'web3_clientVersion',
68
70
  'web3_sha3',
71
+ 'zone_getEncryptionKey',
72
+ 'zone_getZoneInfo',
69
73
  ])
70
74
 
75
+ // Zone write scopes broadcast caller-signed transactions only. Node-managed
76
+ // accounts, signing, faucet, admin, and debug methods remain inaccessible.
77
+ const zoneWriteMethods = new Set(['eth_sendRawTransaction', 'eth_sendRawTransactionSync'])
78
+
79
+ const maxRpcInspectionBytes = 64 * 1_024
80
+
71
81
  /** Never reached; carries typed passthrough response variants into Hono client inference. */
72
82
  const narrowPassthrough = false as boolean
73
83
 
84
+ type RpcInspection = {
85
+ body: ReadableStream<Uint8Array<ArrayBuffer>> | null
86
+ result: { empty: boolean; ok: false } | { ok: true; value: unknown } | undefined
87
+ }
88
+
74
89
  /** Zod schemas owned by the raw RPC passthrough. */
75
90
  export namespace schema {
76
91
  /** JSON-RPC request identifier. */
@@ -118,17 +133,20 @@ export namespace schema {
118
133
  error: z
119
134
  .optional(Error)
120
135
  .check(z.describe('JSON-RPC error object returned when a method fails.')),
121
- id: z
122
- .optional(Id)
123
- .check(
124
- z.describe('Client-supplied JSON-RPC request id used to match responses to requests.'),
125
- ),
136
+ id: Id.check(
137
+ z.describe('Client-supplied JSON-RPC request id used to match responses to requests.'),
138
+ ),
126
139
  jsonrpc: z.literal('2.0').check(z.describe('JSON-RPC protocol version; Tempo uses `2.0`.')),
127
140
  result: z
128
141
  .optional(z.unknown())
129
142
  .check(z.describe('Result returned by the upstream RPC method.')),
130
143
  })
131
- .check(z.describe('One JSON-RPC response returned by Tempo.'))
144
+ .check(
145
+ z.refine((response) => (response.error === undefined) !== (response.result === undefined), {
146
+ error: 'A JSON-RPC response must contain exactly one of result or error.',
147
+ }),
148
+ z.describe('One JSON-RPC response returned by Tempo.'),
149
+ )
132
150
 
133
151
  /** JSON-RPC request or batch request payload. */
134
152
  export const RequestBody = z
@@ -137,7 +155,7 @@ export namespace schema {
137
155
 
138
156
  /** JSON-RPC response or batch response payload. */
139
157
  export const ResponseBody = z
140
- .union([Response, z.array(Response)])
158
+ .union([Response, z.array(Response).check(z.minLength(1))])
141
159
  .check(z.describe('A single JSON-RPC response or an array of responses for batch calls.'))
142
160
  }
143
161
 
@@ -148,7 +166,7 @@ export function rpc() {
148
166
  Auth.policy({ apiKey: { scopes: ['data:read'] }, public: true }),
149
167
  OpenApi.describeRoute({
150
168
  description:
151
- 'Sends a single or batch Ethereum JSON-RPC request directly to Tempo. Use `/rpc/testnet`, `/rpc/mainnet`, or `/rpc/:chain` to choose a chain. Zone-scoped API keys may call read-only methods. A Zone token in `X-Authorization-Token` is forwarded to the authenticated Zone RPC. This passthrough is not part of the stable API contract and is supported on a best-effort basis only. It has no compatibility, latency, availability, or data-freshness guarantees, and breaking changes may happen with limited notice.',
169
+ 'Sends a single or batch Ethereum JSON-RPC request directly to Tempo. Use `/rpc/testnet`, `/rpc/mainnet`, or `/rpc/:chain` to choose a chain. Zone read scopes permit read-only methods; Zone write scopes also permit signed transaction broadcasts. A Zone token in `X-Authorization-Token` is forwarded to the authenticated Zone RPC. This passthrough is not part of the stable API contract and is supported on a best-effort basis only. It has no compatibility, latency, availability, or data-freshness guarantees, and breaking changes may happen with limited notice.',
152
170
  operationId: 'rpcRequest',
153
171
  parameters: [
154
172
  {
@@ -214,17 +232,33 @@ export function rpc() {
214
232
  message: 'Missing API key',
215
233
  status: 401,
216
234
  })
217
- if (zone && !zoneToken && !isZoneReadRequest(body))
218
- return Response.error(c, {
219
- code: 'api_key_forbidden',
220
- message:
221
- 'Zone API keys may only call read-only RPC methods. Pass a Zone token via `X-Authorization-Token` for other methods.',
222
- status: 403,
223
- })
235
+ if (zone && !zoneToken) {
236
+ const requests = Array.isArray(body) ? body : [body]
237
+ const allowed =
238
+ requests.length > 0 &&
239
+ requests.every(
240
+ (request) =>
241
+ isZoneReadMethod(request) ||
242
+ (isZoneWriteMethod(request) && hasZoneWriteScope(c, chainId)),
243
+ )
244
+ if (!allowed)
245
+ return Response.error(c, {
246
+ code: 'api_key_forbidden',
247
+ message:
248
+ 'Zone API keys may call read-only RPC methods. A matching Zone write scope also permits signed transaction broadcasts; pass a Zone token for other methods.',
249
+ status: 403,
250
+ })
251
+ }
224
252
 
225
253
  if (narrowPassthrough)
226
- return c.json(Response.validated(schema.ResponseBody, { jsonrpc: '2.0' }), 200)
227
- return passthrough(c, chainId)
254
+ return c.json(
255
+ Response.validated(schema.ResponseBody, { id: null, jsonrpc: '2.0', result: null }),
256
+ 200,
257
+ )
258
+ const notificationOnly = inspectBody
259
+ ? isNotificationOnly(body)
260
+ : await inspectNotificationOnly(c.req.raw)
261
+ return passthrough(c, chainId, { notificationOnly })
228
262
  },
229
263
  )
230
264
  }
@@ -251,9 +285,55 @@ function isPublicMethod(request: unknown): boolean {
251
285
  return typeof method === 'string' && method.startsWith('eth_')
252
286
  }
253
287
 
254
- function isZoneReadRequest(body: unknown): boolean {
255
- const requests = Array.isArray(body) ? body : [body]
256
- return requests.length > 0 && requests.every((request) => isZoneReadMethod(request))
288
+ function isNotificationOnly(body: unknown): boolean {
289
+ const parsed = schema.RequestBody.safeParse(body)
290
+ if (!parsed.success) return false
291
+ const requests = Array.isArray(parsed.data) ? parsed.data : [parsed.data]
292
+ return requests.length > 0 && requests.every((request) => request.id === undefined)
293
+ }
294
+
295
+ async function inspectNotificationOnly(request: Request): Promise<boolean> {
296
+ const contentLength = Number(request.headers.get('content-length'))
297
+ if (Number.isFinite(contentLength) && contentLength > maxRpcInspectionBytes) return false
298
+ const body = request.clone().body
299
+ if (!body) return false
300
+
301
+ const reader = body.getReader()
302
+ const chunks: Uint8Array<ArrayBuffer>[] = []
303
+ let size = 0
304
+ let complete = false
305
+ while (size <= maxRpcInspectionBytes) {
306
+ const read = await reader.read()
307
+ if (read.done) {
308
+ complete = true
309
+ break
310
+ }
311
+ chunks.push(read.value)
312
+ size += read.value.byteLength
313
+ }
314
+ if (!complete || size > maxRpcInspectionBytes) {
315
+ void reader.cancel()
316
+ return false
317
+ }
318
+
319
+ const bytes = new Uint8Array(size)
320
+ let offset = 0
321
+ for (const chunk of chunks) {
322
+ bytes.set(chunk, offset)
323
+ offset += chunk.byteLength
324
+ }
325
+ try {
326
+ return isNotificationOnly(JSON.parse(new TextDecoder().decode(bytes)) as unknown)
327
+ } catch {
328
+ return false
329
+ }
330
+ }
331
+
332
+ function hasZoneWriteScope(c: Context<App.Environment>, chainId: number): boolean {
333
+ const principal = Auth.getPrincipal(c)
334
+ if (principal?.type !== 'api_key') return false
335
+ const scopes = principal.apiKey.scopes
336
+ return scopes.includes(Scope.wildcard) || scopes.includes(`zone:${chainId}:write`)
257
337
  }
258
338
 
259
339
  function isZoneReadMethod(request: unknown): boolean {
@@ -262,19 +342,36 @@ function isZoneReadMethod(request: unknown): boolean {
262
342
  return typeof method === 'string' && zoneReadMethods.has(method)
263
343
  }
264
344
 
345
+ function isZoneWriteMethod(request: unknown): boolean {
346
+ if (!request || typeof request !== 'object') return false
347
+ const method = (request as Record<string, unknown>)['method']
348
+ return typeof method === 'string' && zoneWriteMethods.has(method)
349
+ }
350
+
265
351
  async function passthrough(
266
352
  c: Context<App.Environment>,
267
353
  chainId: z.output<typeof Schema.ChainId>,
354
+ options: passthrough.Options,
268
355
  ): Promise<globalThis.Response & TypedResponse<never, never, never>> {
356
+ // Keep caller-selected values out of metric dimensions even if an upstream
357
+ // resolver accepts a chain the deployment did not declare.
358
+ const alertChainId = c.get('supportedChainIds').has(chainId) ? chainId : 0
269
359
  const zone = c.get('zones').get(chainId)
270
360
  const zoneToken = getZoneToken(c)
271
- const rpc = zone && zoneToken ? { url: () => zone.forwardRpcUrl } : c.get('rpc')
361
+ const rpc = c.get('rpc')
272
362
  const principal = Auth.getPrincipal(c)
273
363
  const upstream_rpc =
274
364
  !zone && principal?.type === 'public' && typeof rpc !== 'function' ? undefined : rpc
275
365
  // Anonymous callers use the built-in public RPC unless a resolver chooses a
276
366
  // different public upstream.
277
- const { basicAuth, url } = Viem.resolve(upstream_rpc, { chainId, principal })
367
+ const {
368
+ basicAuth,
369
+ bearerAuth,
370
+ publicZoneUrl,
371
+ url: resolvedUrl,
372
+ } = Viem.resolveRpc(upstream_rpc, { chainId, principal, zone })
373
+ const usePublicZoneUrl = Boolean(zone && zoneToken)
374
+ const url = usePublicZoneUrl ? publicZoneUrl : resolvedUrl
278
375
  // The chain id is syntactically valid but this deployment has no RPC upstream
279
376
  // configured for it (no `rpc` config and no built-in default).
280
377
  if (!url)
@@ -288,7 +385,9 @@ async function passthrough(
288
385
  const headers = new Headers()
289
386
  for (const [name, value] of c.req.raw.headers)
290
387
  if (!strippedHeaders.has(name.toLowerCase())) headers.set(name, value)
291
- if (basicAuth) headers.set('authorization', `Basic ${btoa(basicAuth)}`)
388
+ // Public Zone endpoints authenticate with the caller's token, never internal RPC credentials.
389
+ if (!usePublicZoneUrl && basicAuth) headers.set('authorization', `Basic ${btoa(basicAuth)}`)
390
+ else if (!usePublicZoneUrl && bearerAuth) headers.set('authorization', `Bearer ${bearerAuth}`)
292
391
  if (zone && zoneToken) headers.set(ZoneRpcAuthentication.headerName, zoneToken)
293
392
 
294
393
  // `duplex` is required when streaming a request body, but is not yet in
@@ -306,18 +405,137 @@ async function passthrough(
306
405
 
307
406
  try {
308
407
  const response = await fetch(new Request(upstream, init))
408
+ let body = response.body
409
+
410
+ if (!response.ok) {
411
+ // Malformed requests and public Zone authentication failures are caused
412
+ // by caller input, not by the RPC provider.
413
+ if (!isCallerRpcFailure(response.status, usePublicZoneUrl))
414
+ c.set('providerFailure', rpcProviderFailure(response, alertChainId))
415
+ } else if (response.status === 200) {
416
+ const inspection = await inspectRpcResponse(response)
417
+ body = inspection.body
418
+ if (inspection.result?.ok === false && !(inspection.result.empty && options.notificationOnly))
419
+ c.set('providerFailure', {
420
+ chainId: alertChainId,
421
+ failure: 'payload',
422
+ id: 'rpc',
423
+ operation: 'request',
424
+ })
425
+ else if (inspection.result?.ok) {
426
+ const parsed = schema.ResponseBody.safeParse(inspection.result.value)
427
+ if (!parsed.success)
428
+ c.set('providerFailure', {
429
+ chainId: alertChainId,
430
+ failure: 'payload',
431
+ id: 'rpc',
432
+ operation: 'request',
433
+ })
434
+ else {
435
+ const rpc = Log.rpcErrors(parsed.data)
436
+ if (rpc) c.set('rpcResponse', rpc)
437
+ }
438
+ }
439
+ }
309
440
 
310
441
  // Stream the upstream response back verbatim so JSON-RPC bodies, status
311
442
  // codes, and headers survive exactly as clients expect.
312
- return c.newResponse(response.body, response) as globalThis.Response &
313
- TypedResponse<never, never, never>
443
+ return c.newResponse(body, response) as globalThis.Response & TypedResponse<never, never, never>
314
444
  } catch (cause) {
315
445
  // Timeouts and network failures become the standard 502 envelope instead
316
446
  // of an unhandled 500.
447
+ c.set('providerFailure', rpcProviderFailure(cause, alertChainId))
317
448
  return Response.upstream(c, cause) as never
318
449
  }
319
450
  }
320
451
 
452
+ function isCallerRpcFailure(status: number, usePublicZoneUrl: boolean) {
453
+ return (
454
+ status === 400 ||
455
+ status === 413 ||
456
+ status === 415 ||
457
+ status === 422 ||
458
+ (usePublicZoneUrl && (status === 401 || status === 403))
459
+ )
460
+ }
461
+
462
+ declare namespace passthrough {
463
+ /** Request facts needed to classify the upstream response. */
464
+ type Options = {
465
+ /** Whether every valid request in the payload omits an id. */
466
+ notificationOnly: boolean
467
+ }
468
+ }
469
+
470
+ async function inspectRpcResponse(response: globalThis.Response): Promise<RpcInspection> {
471
+ const contentLength = Number(response.headers.get('content-length'))
472
+ if (Number.isFinite(contentLength) && contentLength > maxRpcInspectionBytes)
473
+ return { body: response.body, result: undefined }
474
+ if (!response.body) return { body: null, result: { empty: true, ok: false } }
475
+
476
+ const reader = response.body.getReader()
477
+ const chunks: Uint8Array<ArrayBuffer>[] = []
478
+ let size = 0
479
+ let complete = false
480
+ while (size <= maxRpcInspectionBytes) {
481
+ const read = await reader.read()
482
+ if (read.done) {
483
+ complete = true
484
+ break
485
+ }
486
+ chunks.push(read.value)
487
+ size += read.value.byteLength
488
+ }
489
+
490
+ let index = 0
491
+ const body = new ReadableStream<Uint8Array<ArrayBuffer>>({
492
+ cancel: (reason) => reader.cancel(reason),
493
+ async pull(controller) {
494
+ const chunk = chunks[index]
495
+ if (chunk) {
496
+ index += 1
497
+ controller.enqueue(chunk)
498
+ return
499
+ }
500
+ const read = await reader.read()
501
+ if (read.done) controller.close()
502
+ else controller.enqueue(read.value)
503
+ },
504
+ })
505
+ if (!complete || size > maxRpcInspectionBytes) return { body, result: undefined }
506
+
507
+ const bytes = new Uint8Array(size)
508
+ let offset = 0
509
+ for (const chunk of chunks) {
510
+ bytes.set(chunk, offset)
511
+ offset += chunk.byteLength
512
+ }
513
+ const result = (() => {
514
+ try {
515
+ return { ok: true as const, value: JSON.parse(new TextDecoder().decode(bytes)) as unknown }
516
+ } catch {
517
+ return { empty: size === 0, ok: false as const }
518
+ }
519
+ })()
520
+ return { body, result }
521
+ }
522
+
523
+ function rpcProviderFailure(cause: unknown, chainId: number): Log.ProviderFailure {
524
+ const base = { chainId, id: 'rpc', operation: 'request' } as const
525
+ if (
526
+ cause instanceof DOMException &&
527
+ (cause.name === 'AbortError' || cause.name === 'TimeoutError')
528
+ )
529
+ return { ...base, failure: 'timeout' }
530
+ if (cause instanceof globalThis.Response) {
531
+ if (cause.status === 408) return { ...base, failure: 'timeout', status: cause.status }
532
+ if (cause.status === 429) return { ...base, failure: 'rate_limit', status: cause.status }
533
+ return { ...base, failure: 'http', status: cause.status }
534
+ }
535
+ if (cause instanceof TypeError) return { ...base, failure: 'network' }
536
+ return { ...base, failure: 'unknown' }
537
+ }
538
+
321
539
  function resolveChainId(c: Context<App.Environment>) {
322
540
  const parameter = c.req.param('chain')
323
541
  if (parameter === undefined) return c.get('chainId')
@@ -75,4 +75,19 @@ describe('GET /tokenlist', () => {
75
75
  expect(body.tokens).toEqual([])
76
76
  expect(body.version.patch).toBe(0)
77
77
  })
78
+
79
+ test('refreshes cached reads after a snapshot publish', async () => {
80
+ const db = TestApp.database()
81
+ await VerifiedTokens.replace(db, chainId, seedList)
82
+ const client = TestApp.client({ auth: { keys: [reader] }, db })
83
+
84
+ await client.v1.tokenlist.$get({ query: {} }, as(reader))
85
+ await VerifiedTokens.replace(db, chainId, seedList.slice(1))
86
+
87
+ const response = await client.v1.tokenlist.$get({ query: {} }, as(reader))
88
+ const body = await TestApp.json(response, Tokenlist.schema.getTokenList.Response)
89
+ expect(body.tokens.map((token) => token.address)).toEqual(
90
+ seedList.slice(1).map((token) => token.address),
91
+ )
92
+ })
78
93
  })
@@ -1,12 +1,14 @@
1
- import { Hono } from 'hono'
1
+ import { Hono, type Context } from 'hono'
2
2
  import * as z from 'zod/mini'
3
3
 
4
4
  import type * as App from '../../../App.js'
5
5
  import * as Auth from '../../../internal/Auth.js'
6
6
  import * as Cache from '../../../internal/Cache.js'
7
+ import * as EdgeCache from '../../../internal/EdgeCache.js'
7
8
  import * as OpenApi from '../../../internal/OpenApi.js'
8
9
  import * as Response from '../../../internal/Response.js'
9
10
  import * as Schema from '../../../internal/Schema.js'
11
+ import * as Timing from '../../../internal/Timing.js'
10
12
  import * as VerifiedTokens from '../../../internal/VerifiedTokens.js'
11
13
  import * as Viem from '../../../internal/Viem.js'
12
14
  import { getTokenLogo } from './tokens.js'
@@ -159,11 +161,24 @@ export function tokenlist() {
159
161
  summary: 'Get token list',
160
162
  tags: ['Verified Tokens'],
161
163
  }),
162
- Cache.response<App.Environment>({
163
- cacheControl: Cache.policies.stable,
164
- name: 'tempo-api:tokenlist:v1',
165
- key: (c) => Cache.urlKey(c, schema.getTokenList.Query),
166
- }),
164
+ // Anonymous callers accept the route's five-minute freshness window.
165
+ // Credentialed reads keep snapshot-version invalidation.
166
+ EdgeCache.setEligibility(
167
+ Cache.response<App.Environment>({
168
+ cacheControl: Cache.policies.stable,
169
+ name: 'tempo-api:tokenlist:v1',
170
+ key: async (c) => {
171
+ const base = Cache.urlKey(c, schema.getTokenList.Query)
172
+ const query = schema.getTokenList.Query.parse(
173
+ Object.fromEntries(new URL(c.req.url).searchParams),
174
+ )
175
+ const chainId = query.chainId ?? c.get('chainId')
176
+ const { version } = await VerifiedTokens.snapshot(c, chainId)
177
+ return `${base}:v:${version}`
178
+ },
179
+ }),
180
+ anonymousEdgeCache,
181
+ ),
167
182
  async (c) => {
168
183
  if (Auth.narrowAccess) return Auth.paidAccessError(c)
169
184
  if (OpenApi.narrowValidation)
@@ -176,22 +191,18 @@ export function tokenlist() {
176
191
  const chainId = query.chainId ?? c.get('chainId')
177
192
  try {
178
193
  const snapshot = await VerifiedTokens.snapshot(c, chainId)
179
- const tokens = await Promise.all(
180
- snapshot.list.map(async (token) => {
181
- // Prefer the curated icon asset (served by the API), falling back to
182
- // the verified entry's stored `logoUri`. Most verified tokens carry
183
- // no stored `logoUri` — their logo lives in the asset store.
184
- const logoURI = (await getTokenLogo(c, { address: token.address, chainId })) ?? token.logoUri // prettier-ignore
185
- return {
186
- chainId,
187
- address: token.address,
188
- name: token.name,
189
- symbol: token.symbol,
190
- decimals: token.decimals,
191
- ...(logoURI === undefined ? {} : { logoURI }),
192
- }
193
- }),
194
- )
194
+ const logos = await getTokenLogos(c, { chainId, tokens: snapshot.list })
195
+ const tokens = snapshot.list.map((token) => {
196
+ const logoURI = logos.get(token.address) ?? token.logoUri
197
+ return {
198
+ chainId,
199
+ address: token.address,
200
+ name: token.name,
201
+ symbol: token.symbol,
202
+ decimals: token.decimals,
203
+ ...(logoURI === undefined ? {} : { logoURI }),
204
+ }
205
+ })
195
206
  const list = {
196
207
  name: Viem.chains.find((chain) => chain.id === chainId)?.name ?? `Tempo ${chainId}`,
197
208
  timestamp: snapshot.updatedAt,
@@ -205,3 +216,58 @@ export function tokenlist() {
205
216
  },
206
217
  )
207
218
  }
219
+
220
+ function anonymousEdgeCache(c: Context<App.Environment>) {
221
+ return (
222
+ !c.req.header('authorization') &&
223
+ !c.req.header('cookie') &&
224
+ !c.req.header('tempo-api-key') &&
225
+ !c.req.header('x-api-key')
226
+ )
227
+ }
228
+
229
+ async function getTokenLogos(
230
+ c: Context<App.Environment>,
231
+ options: getTokenLogos.Options,
232
+ ): Promise<ReadonlyMap<string, string>> {
233
+ return Timing.time(c, 'token_logos', async () => {
234
+ const getAsset = c.get('getAsset')
235
+ const listAssets = getAsset.list
236
+ if (!listAssets) {
237
+ const entries = await Promise.all(
238
+ options.tokens.map(
239
+ async (token) =>
240
+ [
241
+ token.address,
242
+ await getTokenLogo(c, { address: token.address, chainId: options.chainId }).catch(
243
+ () => undefined,
244
+ ),
245
+ ] as const,
246
+ ),
247
+ )
248
+ const logos = new Map<string, string>()
249
+ for (const [address, uri] of entries) if (uri) logos.set(address, uri)
250
+ return logos
251
+ }
252
+
253
+ // Logos are optional metadata; an asset-store outage must not hide the
254
+ // verified token list itself. Snapshot logo URIs remain available below.
255
+ const assets = await listAssets(options.chainId, 'icons/').catch(() => [])
256
+ const uris = new Map(assets.map((asset) => [asset.key, asset.uri]))
257
+ return new Map(
258
+ options.tokens.flatMap((token) => {
259
+ const uri = uris.get(`${options.chainId}/icons/${token.address}`)
260
+ return uri ? [[token.address, uri] as const] : []
261
+ }),
262
+ )
263
+ })
264
+ }
265
+
266
+ declare namespace getTokenLogos {
267
+ type Options = {
268
+ /** Tempo chain containing the token assets. */
269
+ chainId: number
270
+ /** Verified tokens whose curated logo locations should be resolved. */
271
+ tokens: readonly Pick<VerifiedTokens.Token, 'address'>[]
272
+ }
273
+ }