tapimo 0.19.0 → 0.20.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 (494) hide show
  1. package/README.md +13 -5
  2. package/dist/ApiKey.d.ts +2 -2
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +2 -2
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +85 -11
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +218 -56
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +12543 -13912
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +4 -5
  13. package/dist/App.js.map +1 -1
  14. package/dist/Scope.d.ts +12 -20
  15. package/dist/Scope.d.ts.map +1 -1
  16. package/dist/Scope.js +20 -36
  17. package/dist/Scope.js.map +1 -1
  18. package/dist/admin/App.d.ts +871 -828
  19. package/dist/admin/App.d.ts.map +1 -1
  20. package/dist/admin/App.js +14 -26
  21. package/dist/admin/App.js.map +1 -1
  22. package/dist/admin/apps/api-keys.d.ts +93 -186
  23. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.js +3 -5
  25. package/dist/admin/apps/api-keys.js.map +1 -1
  26. package/dist/admin/apps/audit-logs.d.ts +18 -18
  27. package/dist/admin/apps/audit-logs.js +1 -1
  28. package/dist/admin/apps/audit-logs.js.map +1 -1
  29. package/dist/admin/apps/earn-vaults.d.ts +27 -27
  30. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  31. package/dist/admin/apps/earn-vaults.js +11 -5
  32. package/dist/admin/apps/earn-vaults.js.map +1 -1
  33. package/dist/admin/apps/organizations.d.ts +17 -17
  34. package/dist/admin/apps/prop-amms.d.ts +4 -4
  35. package/dist/admin/apps/routes-support.js +1 -38
  36. package/dist/admin/apps/routes-support.js.map +1 -1
  37. package/dist/admin/apps/routes.d.ts +153 -153
  38. package/dist/admin/apps/sentinel.d.ts +4 -4
  39. package/dist/admin/apps/verified-tokens.d.ts +24 -24
  40. package/dist/admin/apps/zone-delegation-requests.d.ts +332 -0
  41. package/dist/admin/apps/zone-delegation-requests.d.ts.map +1 -0
  42. package/dist/admin/apps/zone-delegation-requests.js +200 -0
  43. package/dist/admin/apps/zone-delegation-requests.js.map +1 -0
  44. package/dist/admin/apps/zone-delegations.d.ts +512 -52
  45. package/dist/admin/apps/zone-delegations.d.ts.map +1 -1
  46. package/dist/admin/apps/zone-delegations.js +134 -44
  47. package/dist/admin/apps/zone-delegations.js.map +1 -1
  48. package/dist/admin/index.d.ts +1 -1
  49. package/dist/admin/index.d.ts.map +1 -1
  50. package/dist/admin/index.js +1 -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 +341 -397
  55. package/dist/admin/ui.generated.js.map +1 -1
  56. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  57. package/dist/analytics/tables/requestEvents.js +4 -2
  58. package/dist/analytics/tables/requestEvents.js.map +1 -1
  59. package/dist/apps/data/App.d.ts +11932 -13214
  60. package/dist/apps/data/App.d.ts.map +1 -1
  61. package/dist/apps/data/App.js +32 -13
  62. package/dist/apps/data/App.js.map +1 -1
  63. package/dist/apps/data/ZoneSelection.d.ts +1 -1
  64. package/dist/apps/data/ZoneSelection.d.ts.map +1 -1
  65. package/dist/apps/data/ZoneSelection.js +2 -2
  66. package/dist/apps/data/ZoneSelection.js.map +1 -1
  67. package/dist/apps/data/routes/activities.d.ts +60 -27
  68. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  69. package/dist/apps/data/routes/activities.js +91 -16
  70. package/dist/apps/data/routes/activities.js.map +1 -1
  71. package/dist/apps/data/routes/addresses.d.ts +893 -875
  72. package/dist/apps/data/routes/addresses.d.ts.map +1 -1
  73. package/dist/apps/data/routes/balances.d.ts +36 -36
  74. package/dist/apps/data/routes/balances.d.ts.map +1 -1
  75. package/dist/apps/data/routes/balances.js +3 -1
  76. package/dist/apps/data/routes/balances.js.map +1 -1
  77. package/dist/apps/data/routes/blocks.d.ts +40 -40
  78. package/dist/apps/data/routes/blocks.d.ts.map +1 -1
  79. package/dist/apps/data/routes/blocks.js +3 -7
  80. package/dist/apps/data/routes/blocks.js.map +1 -1
  81. package/dist/apps/data/routes/coingecko.d.ts +236 -236
  82. package/dist/apps/data/routes/earn-transactions.d.ts +14 -14
  83. package/dist/apps/data/routes/earn.d.ts +261 -1445
  84. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  85. package/dist/apps/data/routes/earn.js +64 -490
  86. package/dist/apps/data/routes/earn.js.map +1 -1
  87. package/dist/apps/data/routes/exchanges.d.ts +144 -144
  88. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  89. package/dist/apps/data/routes/exchanges.js +5 -15
  90. package/dist/apps/data/routes/exchanges.js.map +1 -1
  91. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  92. package/dist/apps/data/routes/fee-amm.js +3 -9
  93. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  94. package/dist/apps/data/routes/indexer.d.ts +13 -13
  95. package/dist/apps/data/routes/receipts.d.ts +53 -53
  96. package/dist/apps/data/routes/receipts.js +1 -1
  97. package/dist/apps/data/routes/receipts.js.map +1 -1
  98. package/dist/apps/data/routes/rpc.d.ts +52 -0
  99. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  100. package/dist/apps/data/routes/rpc.js +19 -18
  101. package/dist/apps/data/routes/rpc.js.map +1 -1
  102. package/dist/apps/data/routes/tokenlist.d.ts +14 -14
  103. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  104. package/dist/apps/data/routes/tokenlist.js +1 -3
  105. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  106. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  107. package/dist/apps/data/routes/tokens.js +7 -5
  108. package/dist/apps/data/routes/tokens.js.map +1 -1
  109. package/dist/apps/data/routes/transactions.d.ts +281 -281
  110. package/dist/apps/data/routes/transactions.js +3 -3
  111. package/dist/apps/data/routes/transactions.js.map +1 -1
  112. package/dist/apps/data/routes/transfers.d.ts +12 -12
  113. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  114. package/dist/apps/data/routes/transfers.js +1 -3
  115. package/dist/apps/data/routes/transfers.js.map +1 -1
  116. package/dist/apps/data/routes/valuation.d.ts +30 -30
  117. package/dist/apps/data/routes/valuation.d.ts.map +1 -1
  118. package/dist/apps/data/routes/valuation.js +1 -3
  119. package/dist/apps/data/routes/valuation.js.map +1 -1
  120. package/dist/apps/data/routes/verified-tokens.d.ts +86 -86
  121. package/dist/apps/data/routes/webhooks.d.ts +102 -102
  122. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  123. package/dist/apps/data/routes/webhooks.js +9 -23
  124. package/dist/apps/data/routes/webhooks.js.map +1 -1
  125. package/dist/apps/data/routes/zone-deposits.d.ts +16 -16
  126. package/dist/apps/data/routes/zone-withdrawals.d.ts +31 -31
  127. package/dist/apps/data/routes/zones.d.ts +28 -28
  128. package/dist/apps/management/App.d.ts +18 -102
  129. package/dist/apps/management/App.d.ts.map +1 -1
  130. package/dist/apps/management/App.js +1 -1
  131. package/dist/apps/management/App.js.map +1 -1
  132. package/dist/apps/management/routes/api-keys.d.ts +253 -339
  133. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  134. package/dist/apps/management/routes/api-keys.js +25 -11
  135. package/dist/apps/management/routes/api-keys.js.map +1 -1
  136. package/dist/apps/management/routes/billing.d.ts +92 -92
  137. package/dist/apps/management/routes/billing.d.ts.map +1 -1
  138. package/dist/apps/management/routes/billing.js +5 -13
  139. package/dist/apps/management/routes/billing.js.map +1 -1
  140. package/dist/apps/management/routes/cli.d.ts.map +1 -1
  141. package/dist/apps/management/routes/cli.js +3 -9
  142. package/dist/apps/management/routes/cli.js.map +1 -1
  143. package/dist/apps/management/routes/faucet.d.ts +16 -16
  144. package/dist/apps/management/routes/fee-payer-usage.d.ts +38 -38
  145. package/dist/apps/management/routes/fee-payer-usage.d.ts.map +1 -1
  146. package/dist/apps/management/routes/fee-payer-usage.js +2 -4
  147. package/dist/apps/management/routes/fee-payer-usage.js.map +1 -1
  148. package/dist/apps/management/routes/invitations.d.ts +52 -52
  149. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  150. package/dist/apps/management/routes/invitations.js +4 -12
  151. package/dist/apps/management/routes/invitations.js.map +1 -1
  152. package/dist/apps/management/routes/invite-links.d.ts.map +1 -1
  153. package/dist/apps/management/routes/invite-links.js +6 -14
  154. package/dist/apps/management/routes/invite-links.js.map +1 -1
  155. package/dist/apps/management/routes/me.d.ts +6 -6
  156. package/dist/apps/management/routes/me.d.ts.map +1 -1
  157. package/dist/apps/management/routes/me.js +3 -7
  158. package/dist/apps/management/routes/me.js.map +1 -1
  159. package/dist/apps/management/routes/members.d.ts +84 -84
  160. package/dist/apps/management/routes/members.d.ts.map +1 -1
  161. package/dist/apps/management/routes/members.js +2 -4
  162. package/dist/apps/management/routes/members.js.map +1 -1
  163. package/dist/apps/management/routes/orgs.d.ts +44 -44
  164. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  165. package/dist/apps/management/routes/orgs.js +2 -6
  166. package/dist/apps/management/routes/orgs.js.map +1 -1
  167. package/dist/apps/management/routes/projects.d.ts.map +1 -1
  168. package/dist/apps/management/routes/projects.js +2 -6
  169. package/dist/apps/management/routes/projects.js.map +1 -1
  170. package/dist/apps/management/routes/route-usage.d.ts +34 -34
  171. package/dist/apps/management/routes/route-usage.d.ts.map +1 -1
  172. package/dist/apps/management/routes/route-usage.js +2 -4
  173. package/dist/apps/management/routes/route-usage.js.map +1 -1
  174. package/dist/apps/management/routes/routes-access-requests.d.ts +120 -91
  175. package/dist/apps/management/routes/routes-access-requests.d.ts.map +1 -1
  176. package/dist/apps/management/routes/routes-access-requests.js +49 -9
  177. package/dist/apps/management/routes/routes-access-requests.js.map +1 -1
  178. package/dist/apps/management/routes/usage.d.ts.map +1 -1
  179. package/dist/apps/management/routes/usage.js +8 -16
  180. package/dist/apps/management/routes/usage.js.map +1 -1
  181. package/dist/apps/management/routes/verified-token-requests.d.ts +39 -39
  182. package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
  183. package/dist/apps/management/routes/verified-token-requests.js +3 -7
  184. package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
  185. package/dist/apps/management/routes/webhooks.d.ts +2089 -2089
  186. package/dist/apps/management/routes/zone-delegations.d.ts +14 -17
  187. package/dist/apps/management/routes/zone-delegations.d.ts.map +1 -1
  188. package/dist/apps/management/routes/zone-delegations.js +1 -6
  189. package/dist/apps/management/routes/zone-delegations.js.map +1 -1
  190. package/dist/apps/mpp/App.d.ts +44 -44
  191. package/dist/apps/mpp/App.js +3 -3
  192. package/dist/apps/mpp/App.js.map +1 -1
  193. package/dist/apps/mpp/internal/Adapter.js +1 -1
  194. package/dist/apps/mpp/internal/Adapter.js.map +1 -1
  195. package/dist/apps/mpp/internal/Error.d.ts.map +1 -1
  196. package/dist/apps/mpp/internal/Error.js +1 -0
  197. package/dist/apps/mpp/internal/Error.js.map +1 -1
  198. package/dist/apps/mpp/internal/Policy.d.ts +5 -1
  199. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
  200. package/dist/apps/mpp/internal/Policy.js +35 -13
  201. package/dist/apps/mpp/internal/Policy.js.map +1 -1
  202. package/dist/apps/relay/App.d.ts +2 -2
  203. package/dist/apps/relay/App.d.ts.map +1 -1
  204. package/dist/apps/relay/App.js +25 -16
  205. package/dist/apps/relay/App.js.map +1 -1
  206. package/dist/apps/routes/App.d.ts +311 -311
  207. package/dist/apps/routes/routes/deposit-addresses.d.ts +1099 -1099
  208. package/dist/apps/routes/routes/list.d.ts +74 -74
  209. package/dist/apps/routes/routes/transfers.d.ts +94 -94
  210. package/dist/cli/ApiKeys.d.ts +19 -26
  211. package/dist/cli/ApiKeys.d.ts.map +1 -1
  212. package/dist/db/Db.d.ts +3 -3
  213. package/dist/db/Db.d.ts.map +1 -1
  214. package/dist/db/Db.js +27 -0
  215. package/dist/db/Db.js.map +1 -1
  216. package/dist/db/Schema.d.ts +28 -62
  217. package/dist/db/Schema.d.ts.map +1 -1
  218. package/dist/db/Schema.js +18 -18
  219. package/dist/db/Schema.js.map +1 -1
  220. package/dist/db/tables/rewardRuns.d.ts +21 -0
  221. package/dist/db/tables/rewardRuns.d.ts.map +1 -1
  222. package/dist/db/tables/rewardRuns.js +19 -0
  223. package/dist/db/tables/rewardRuns.js.map +1 -1
  224. package/dist/db/tables/routesAccessRequests.d.ts +13 -0
  225. package/dist/db/tables/routesAccessRequests.d.ts.map +1 -1
  226. package/dist/db/tables/routesAccessRequests.js +12 -0
  227. package/dist/db/tables/routesAccessRequests.js.map +1 -1
  228. package/dist/db/tables/zoneDelegationRequests.d.ts +165 -0
  229. package/dist/db/tables/zoneDelegationRequests.d.ts.map +1 -0
  230. package/dist/db/tables/{zoneKeyRequests.js → zoneDelegationRequests.js} +43 -42
  231. package/dist/db/tables/zoneDelegationRequests.js.map +1 -0
  232. package/dist/db/tables/zoneDelegations.d.ts +11 -5
  233. package/dist/db/tables/zoneDelegations.d.ts.map +1 -1
  234. package/dist/db/tables/zoneDelegations.js +21 -3
  235. package/dist/db/tables/zoneDelegations.js.map +1 -1
  236. package/dist/handlers/internal/accounts.d.ts +7 -0
  237. package/dist/handlers/internal/accounts.d.ts.map +1 -0
  238. package/dist/handlers/internal/{multisig.js → accounts.js} +10 -10
  239. package/dist/handlers/internal/{multisig.js.map → accounts.js.map} +1 -1
  240. package/dist/handlers/internal/sponsorship.js +17 -17
  241. package/dist/handlers/internal/sponsorship.js.map +1 -1
  242. package/dist/handlers/relay.d.ts +6 -6
  243. package/dist/handlers/relay.d.ts.map +1 -1
  244. package/dist/handlers/relay.js +15 -15
  245. package/dist/handlers/relay.js.map +1 -1
  246. package/dist/internal/Auth.d.ts.map +1 -1
  247. package/dist/internal/Auth.js +4 -8
  248. package/dist/internal/Auth.js.map +1 -1
  249. package/dist/internal/EarnRates.d.ts.map +1 -1
  250. package/dist/internal/EarnRates.js +1 -3
  251. package/dist/internal/EarnRates.js.map +1 -1
  252. package/dist/internal/EarnVaults.js +2 -2
  253. package/dist/internal/Log.d.ts +2 -4
  254. package/dist/internal/Log.d.ts.map +1 -1
  255. package/dist/internal/Log.js +0 -3
  256. package/dist/internal/Log.js.map +1 -1
  257. package/dist/internal/Response.d.ts +1 -1
  258. package/dist/internal/Response.d.ts.map +1 -1
  259. package/dist/internal/Response.js +0 -3
  260. package/dist/internal/Response.js.map +1 -1
  261. package/dist/internal/Schema.d.ts +11 -0
  262. package/dist/internal/Schema.d.ts.map +1 -1
  263. package/dist/internal/Schema.js +24 -1
  264. package/dist/internal/Schema.js.map +1 -1
  265. package/dist/internal/ZoneAccess.d.ts +70 -35
  266. package/dist/internal/ZoneAccess.d.ts.map +1 -1
  267. package/dist/internal/ZoneAccess.js +312 -131
  268. package/dist/internal/ZoneAccess.js.map +1 -1
  269. package/dist/internal/ZoneDelegation.d.ts +7 -19
  270. package/dist/internal/ZoneDelegation.d.ts.map +1 -1
  271. package/dist/internal/ZoneDelegation.js +8 -29
  272. package/dist/internal/ZoneDelegation.js.map +1 -1
  273. package/dist/internal/{ZoneKeyApproval.d.ts → ZoneDelegationApproval.d.ts} +3 -5
  274. package/dist/internal/ZoneDelegationApproval.d.ts.map +1 -0
  275. package/dist/internal/ZoneDelegationApproval.js +16 -0
  276. package/dist/internal/ZoneDelegationApproval.js.map +1 -0
  277. package/dist/internal/ZoneKeyRewrite.d.ts +98 -0
  278. package/dist/internal/ZoneKeyRewrite.d.ts.map +1 -0
  279. package/dist/internal/ZoneKeyRewrite.js +151 -0
  280. package/dist/internal/ZoneKeyRewrite.js.map +1 -0
  281. package/dist/internal/rewards/Campaigns.d.ts +2 -0
  282. package/dist/internal/rewards/Campaigns.d.ts.map +1 -1
  283. package/dist/internal/rewards/Campaigns.js.map +1 -1
  284. package/dist/internal/rewards/Distributions.d.ts.map +1 -1
  285. package/dist/internal/rewards/Distributions.js +2 -6
  286. package/dist/internal/rewards/Distributions.js.map +1 -1
  287. package/dist/internal/rewards/Monitor.d.ts +4 -1
  288. package/dist/internal/rewards/Monitor.d.ts.map +1 -1
  289. package/dist/internal/rewards/Monitor.js +19 -2
  290. package/dist/internal/rewards/Monitor.js.map +1 -1
  291. package/dist/internal/rewards/Runner.d.ts.map +1 -1
  292. package/dist/internal/rewards/Runner.js +9 -1
  293. package/dist/internal/rewards/Runner.js.map +1 -1
  294. package/dist/internal/routes/Action.d.ts.map +1 -1
  295. package/dist/internal/routes/Action.js +2 -3
  296. package/dist/internal/routes/Action.js.map +1 -1
  297. package/dist/internal/routes/Deposit.d.ts.map +1 -1
  298. package/dist/internal/routes/Deposit.js +2 -6
  299. package/dist/internal/routes/Deposit.js.map +1 -1
  300. package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
  301. package/dist/internal/routes/DepositAddress.js +4 -10
  302. package/dist/internal/routes/DepositAddress.js.map +1 -1
  303. package/dist/internal/routes/Policy.d.ts.map +1 -1
  304. package/dist/internal/routes/Policy.js +2 -1
  305. package/dist/internal/routes/Policy.js.map +1 -1
  306. package/dist/internal/routes/Provider.js +8 -8
  307. package/dist/internal/routes/Provider.js.map +1 -1
  308. package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
  309. package/dist/internal/routes/Reconciliation.js +3 -2
  310. package/dist/internal/routes/Reconciliation.js.map +1 -1
  311. package/dist/internal/routes/Transfer.d.ts.map +1 -1
  312. package/dist/internal/routes/Transfer.js +4 -12
  313. package/dist/internal/routes/Transfer.js.map +1 -1
  314. package/dist/internal/routes/UniversalDepositAddress.d.ts.map +1 -1
  315. package/dist/internal/routes/UniversalDepositAddress.js +3 -6
  316. package/dist/internal/routes/UniversalDepositAddress.js.map +1 -1
  317. package/dist/internal/routes/providers/SquidOrder.d.ts.map +1 -1
  318. package/dist/internal/routes/providers/SquidOrder.js +3 -2
  319. package/dist/internal/routes/providers/SquidOrder.js.map +1 -1
  320. package/dist/internal/routes/providers/relay.d.ts.map +1 -1
  321. package/dist/internal/routes/providers/relay.js +4 -3
  322. package/dist/internal/routes/providers/relay.js.map +1 -1
  323. package/package.json +20 -5
  324. package/src/ApiKey.ts +2 -2
  325. package/src/ApiKeys.test.ts +284 -51
  326. package/src/ApiKeys.ts +297 -64
  327. package/src/App.ts +4 -5
  328. package/src/Client.test-d.ts +33 -126
  329. package/src/Scope.test.ts +26 -45
  330. package/src/Scope.ts +24 -37
  331. package/src/admin/App.test.ts +51 -4
  332. package/src/admin/App.ts +25 -33
  333. package/src/admin/Mcp.test.ts +2 -1
  334. package/src/admin/apps/api-keys.test.ts +90 -20
  335. package/src/admin/apps/api-keys.ts +5 -8
  336. package/src/admin/apps/audit-logs.ts +1 -1
  337. package/src/admin/apps/earn-vaults.test.ts +19 -19
  338. package/src/admin/apps/earn-vaults.ts +11 -5
  339. package/src/admin/apps/routes-support.test.ts +254 -3
  340. package/src/admin/apps/routes-support.ts +1 -44
  341. package/src/admin/apps/scopes.test.ts +3 -3
  342. package/src/admin/apps/zone-delegation-requests.test.ts +246 -0
  343. package/src/admin/apps/zone-delegation-requests.ts +240 -0
  344. package/src/admin/apps/zone-delegations.test.ts +218 -58
  345. package/src/admin/apps/zone-delegations.ts +146 -46
  346. package/src/admin/index.ts +1 -1
  347. package/src/admin/ui/src/components/ApiKeyForm.tsx +4 -3
  348. package/src/admin/ui/src/lib/config.ts +3 -3
  349. package/src/admin/ui/src/lib/query-client.ts +1 -1
  350. package/src/admin/ui/src/lib/review-queues.ts +10 -10
  351. package/src/admin/ui/src/lib/routes-setup.test.ts +1 -2
  352. package/src/admin/ui/src/lib/routes-setup.ts +3 -5
  353. package/src/admin/ui/src/lib/scopes.test.ts +3 -6
  354. package/src/admin/ui/src/lib/scopes.ts +2 -9
  355. package/src/admin/ui/src/lib/{zone-key-requests.ts → zone-delegation-requests.ts} +27 -31
  356. package/src/admin/ui/src/routeTree.gen.ts +17 -17
  357. package/src/admin/ui/src/routes/__root.tsx +1 -1
  358. package/src/admin/ui/src/routes/api-keys.tsx +2 -15
  359. package/src/admin/ui/src/routes/audit-logs.tsx +2 -2
  360. package/src/admin/ui/src/routes/index.tsx +11 -11
  361. package/src/admin/ui/src/routes/organizations.tsx +3 -1
  362. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +3 -1
  363. package/src/admin/ui/src/routes/organizations_.$orgId_.setup.tsx +1 -3
  364. package/src/admin/ui/src/routes/{zone-key-requests.tsx → zone-delegation-requests.tsx} +228 -172
  365. package/src/admin/ui/vite.config.ts +14 -1
  366. package/src/admin/ui.generated.ts +412 -583
  367. package/src/analytics/tables/requestEvents.test.ts +13 -3
  368. package/src/analytics/tables/requestEvents.ts +4 -3
  369. package/src/apps/data/App.test.ts +72 -35
  370. package/src/apps/data/App.ts +29 -13
  371. package/src/apps/data/ZoneSelection.test.ts +53 -70
  372. package/src/apps/data/ZoneSelection.ts +2 -2
  373. package/src/apps/data/routes/activities.test.ts +140 -6
  374. package/src/apps/data/routes/activities.ts +124 -18
  375. package/src/apps/data/routes/balances.ts +5 -1
  376. package/src/apps/data/routes/blocks.ts +9 -13
  377. package/src/apps/data/routes/earn-transactions.local.test.ts +6 -1
  378. package/src/apps/data/routes/earn-transactions.test.ts +7 -3
  379. package/src/apps/data/routes/earn.bench.ts +0 -14
  380. package/src/apps/data/routes/earn.discovery.test.ts +4 -39
  381. package/src/apps/data/routes/earn.local.test.ts +27 -34
  382. package/src/apps/data/routes/earn.test.ts +172 -490
  383. package/src/apps/data/routes/earn.ts +103 -652
  384. package/src/apps/data/routes/exchanges.ts +20 -30
  385. package/src/apps/data/routes/fee-amm.ts +12 -18
  386. package/src/apps/data/routes/indexer.test.ts +14 -12
  387. package/src/apps/data/routes/receipts.ts +1 -1
  388. package/src/apps/data/routes/rpc.test.ts +23 -18
  389. package/src/apps/data/routes/rpc.ts +21 -21
  390. package/src/apps/data/routes/rpc.zone.test.ts +60 -6
  391. package/src/apps/data/routes/tokenlist.ts +4 -6
  392. package/src/apps/data/routes/tokens.test.ts +20 -0
  393. package/src/apps/data/routes/tokens.ts +10 -5
  394. package/src/apps/data/routes/transactions.ts +3 -3
  395. package/src/apps/data/routes/transfers.ts +4 -6
  396. package/src/apps/data/routes/valuation.test.ts +2 -4
  397. package/src/apps/data/routes/valuation.ts +4 -6
  398. package/src/apps/data/routes/webhooks.test.ts +1 -5
  399. package/src/apps/data/routes/webhooks.ts +30 -44
  400. package/src/apps/data/routes/zones.test.ts +35 -19
  401. package/src/apps/management/App.ts +3 -1
  402. package/src/apps/management/routes/api-keys.test.ts +112 -22
  403. package/src/apps/management/routes/api-keys.ts +30 -15
  404. package/src/apps/management/routes/billing.ts +17 -25
  405. package/src/apps/management/routes/cli.ts +12 -18
  406. package/src/apps/management/routes/fee-payer-usage.ts +5 -4
  407. package/src/apps/management/routes/invitations.ts +16 -21
  408. package/src/apps/management/routes/invite-links.ts +18 -26
  409. package/src/apps/management/routes/me.ts +9 -13
  410. package/src/apps/management/routes/members.ts +5 -7
  411. package/src/apps/management/routes/orgs.ts +8 -12
  412. package/src/apps/management/routes/projects.ts +8 -12
  413. package/src/apps/management/routes/route-usage.ts +5 -4
  414. package/src/apps/management/routes/routes-access-requests.test.ts +64 -2
  415. package/src/apps/management/routes/routes-access-requests.ts +99 -15
  416. package/src/apps/management/routes/scopes.test.ts +3 -3
  417. package/src/apps/management/routes/usage.ts +20 -28
  418. package/src/apps/management/routes/verified-token-requests.ts +9 -13
  419. package/src/apps/management/routes/zone-delegations.test.ts +3 -5
  420. package/src/apps/management/routes/zone-delegations.ts +4 -9
  421. package/src/apps/mpp/App.ts +3 -3
  422. package/src/apps/mpp/Mpp.zone.test.ts +49 -18
  423. package/src/apps/mpp/internal/Adapter.ts +1 -1
  424. package/src/apps/mpp/internal/Error.test.ts +3 -0
  425. package/src/apps/mpp/internal/Error.ts +1 -0
  426. package/src/apps/mpp/internal/Policy.test.ts +9 -8
  427. package/src/apps/mpp/internal/Policy.ts +37 -14
  428. package/src/apps/relay/App.sandbox.test.ts +15 -14
  429. package/src/apps/relay/App.test.ts +120 -61
  430. package/src/apps/relay/App.ts +28 -18
  431. package/src/apps/relay/App.zone-billing.test.ts +9 -4
  432. package/src/apps/routes/App.test.ts +21 -22
  433. package/src/db/Db.ts +34 -3
  434. package/src/db/Schema.ts +26 -26
  435. package/src/db/tables/rewardRuns.ts +39 -0
  436. package/src/db/tables/routesAccessRequests.test.ts +65 -0
  437. package/src/db/tables/routesAccessRequests.ts +25 -0
  438. package/src/db/tables/{zoneKeyRequests.test.ts → zoneDelegationRequests.test.ts} +36 -77
  439. package/src/db/tables/{zoneKeyRequests.ts → zoneDelegationRequests.ts} +69 -52
  440. package/src/db/tables/zoneDelegations.test.ts +5 -6
  441. package/src/db/tables/zoneDelegations.ts +25 -8
  442. package/src/handlers/internal/{multisig.store.test.ts → accounts.store.test.ts} +16 -16
  443. package/src/handlers/internal/{multisig.test.ts → accounts.test.ts} +85 -82
  444. package/src/handlers/internal/{multisig.ts → accounts.ts} +9 -9
  445. package/src/handlers/internal/sponsorship.ts +20 -20
  446. package/src/handlers/relay.test.ts +48 -46
  447. package/src/handlers/relay.ts +26 -26
  448. package/src/internal/Auth.test.ts +6 -2
  449. package/src/internal/Auth.ts +4 -10
  450. package/src/internal/EarnRates.ts +4 -6
  451. package/src/internal/EarnVaults.ts +2 -2
  452. package/src/internal/Log.test-d.ts +1 -0
  453. package/src/internal/Log.test.ts +4 -6
  454. package/src/internal/Log.ts +2 -6
  455. package/src/internal/Response.ts +0 -3
  456. package/src/internal/Schema.test.ts +42 -0
  457. package/src/internal/Schema.ts +36 -1
  458. package/src/internal/ZoneAccess.test.ts +515 -312
  459. package/src/internal/ZoneAccess.ts +410 -158
  460. package/src/internal/ZoneDelegation.test.ts +1 -41
  461. package/src/internal/ZoneDelegation.ts +10 -48
  462. package/src/internal/ZoneDelegationApproval.test.ts +22 -0
  463. package/src/internal/{ZoneKeyApproval.ts → ZoneDelegationApproval.ts} +4 -11
  464. package/src/internal/ZoneKeyRewrite.ts +231 -0
  465. package/src/internal/rewards/Campaigns.ts +2 -0
  466. package/src/internal/rewards/Distributions.ts +8 -12
  467. package/src/internal/rewards/Monitor.test.ts +64 -0
  468. package/src/internal/rewards/Monitor.ts +27 -4
  469. package/src/internal/rewards/Runner.ts +9 -1
  470. package/src/internal/routes/Action.ts +5 -6
  471. package/src/internal/routes/Deposit.ts +8 -12
  472. package/src/internal/routes/DepositAddress.ts +13 -19
  473. package/src/internal/routes/Policy.ts +2 -1
  474. package/src/internal/routes/Provider.ts +8 -8
  475. package/src/internal/routes/Reconciliation.ts +3 -2
  476. package/src/internal/routes/Transfer.ts +16 -24
  477. package/src/internal/routes/UniversalDepositAddress.ts +9 -12
  478. package/src/internal/routes/providers/SquidOrder.ts +3 -2
  479. package/src/internal/routes/providers/relay.ts +4 -3
  480. package/dist/admin/apps/zone-key-requests.d.ts +0 -406
  481. package/dist/admin/apps/zone-key-requests.d.ts.map +0 -1
  482. package/dist/admin/apps/zone-key-requests.js +0 -183
  483. package/dist/admin/apps/zone-key-requests.js.map +0 -1
  484. package/dist/db/tables/zoneKeyRequests.d.ts +0 -289
  485. package/dist/db/tables/zoneKeyRequests.d.ts.map +0 -1
  486. package/dist/db/tables/zoneKeyRequests.js.map +0 -1
  487. package/dist/handlers/internal/multisig.d.ts +0 -7
  488. package/dist/handlers/internal/multisig.d.ts.map +0 -1
  489. package/dist/internal/ZoneKeyApproval.d.ts.map +0 -1
  490. package/dist/internal/ZoneKeyApproval.js +0 -21
  491. package/dist/internal/ZoneKeyApproval.js.map +0 -1
  492. package/src/admin/apps/zone-key-requests.test.ts +0 -272
  493. package/src/admin/apps/zone-key-requests.ts +0 -231
  494. package/src/internal/ZoneKeyApproval.test.ts +0 -46
@@ -1,4 +1,5 @@
1
1
  import { Hono } from 'hono';
2
+ import { HTTPException } from 'hono/http-exception';
2
3
  import { Value as core_Value } from 'ox';
3
4
  import { Abis } from 'viem/tempo';
4
5
  import { BaseError, ContractFunctionExecutionError, ContractFunctionRevertedError, ContractFunctionZeroDataError, isAddress, parseAbi, parseUnits, ResourceNotFoundRpcError, zeroAddress, } from 'viem';
@@ -66,6 +67,8 @@ const scanLimit = 50;
66
67
  // Concurrent metadata reads in one macrotask collapse into one deployless
67
68
  // multicall; an await between small chunks keeps each call under the RPC limit.
68
69
  const tokenReadChunkSize = 20;
70
+ // Bumped when the public vault shape changes, so no older cached body is served.
71
+ const vaultCacheName = 'tempo-api:earn-vaults:v7';
69
72
  const tempoStateAddress = '0x1c00000000000000000000000000000000000000';
70
73
  const tempoStateAbi = parseAbi(['function tempoBlockNumber() view returns (uint64)']);
71
74
  const zonePortalAbi = parseAbi(['function lastSyncedTempoBlockNumber() view returns (uint64)']);
@@ -106,17 +109,13 @@ export var schema;
106
109
  registerRewardEligibility.Association = z
107
110
  .strictObject({
108
111
  chainId: Schema.ChainId,
109
- firstRegisteredAt: z.iso
110
- .datetime()
111
- .check(z.describe('When the association was first registered.'), z.meta({ examples: ['2026-08-25T20:00:00.000Z'] })),
112
+ firstRegisteredAt: Schema.dateTime().check(z.describe('When the association was first registered.'), z.meta({ examples: ['2026-08-25T20:00:00.000Z'] })),
112
113
  id: z.string().check(z.describe('Stable reward eligibility association identifier.'), z.meta({
113
114
  examples: [
114
115
  '0x59d27987bc7cc1521bba5f688a170c65840cbf43-0x8117e0ba6239b9695f780deb010f72a2fa4bdfb6',
115
116
  ],
116
117
  })),
117
- latestRegisteredAt: z.iso
118
- .datetime()
119
- .check(z.describe('When the association was most recently registered.'), z.meta({ examples: ['2026-08-25T20:00:00.000Z'] })),
118
+ latestRegisteredAt: Schema.dateTime().check(z.describe('When the association was most recently registered.'), z.meta({ examples: ['2026-08-25T20:00:00.000Z'] })),
120
119
  registrationOrder: z
121
120
  .string()
122
121
  .check(z.regex(/^\d+$/), z.describe('Monotonic registration order.'), z.meta({ examples: ['42'] })),
@@ -303,18 +302,17 @@ export var schema;
303
302
  capabilities: z
304
303
  .optional(EarnVaults.schema.Discovery.shape.capabilities)
305
304
  .check(z.describe('Vault capabilities, when requested.')),
306
- description: z
307
- .nullable(z.string())
308
- .check(z.describe('Curated vault description, or null when the vault is not verified.'), z.meta({ examples: ['deelUSD deposited into the canonical Tempo Earn deployment.'] })),
309
305
  engine,
310
- id: Schema.Address.check(z.describe('Stable vault id, equal to the lowercase vault address.'), z.meta({ examples: ['0x4f94590b636f5878bce585e82379de81e1ec174f'] })),
306
+ id: Schema.Address.check(z.describe('Stable vault id, equal to the lowercase vault address.'), z.meta({ examples: ['0xb20ba39ccf522d69b7a21e3f369be5de73a2c694'] })),
311
307
  instantLiquidity: EarnVaults.schema.Discovery.shape.instantLiquidity.check(z.describe('Assets the venue would release right now, capped at the vault backing, in asset base units. Null when the engine interface cannot report a reliable number.')),
312
308
  instantLiquidityValue: z
313
309
  .optional(z.nullable(value))
314
310
  .check(z.describe('Instant liquidity valued in USD, when requested via `include=tvl`, or null when liquidity is unavailable or the asset has no priced display currency.')),
311
+ // Kept as an empty string for clients that require the field; registry labels name
312
+ // customers, so only the admin app serves them.
315
313
  label: z
316
314
  .string()
317
- .check(z.describe('Vault display label.'), z.meta({ examples: ['deelUSD Earn'] })),
315
+ .check(z.describe('Always empty; curated labels are not public.'), z.meta({ examples: [''] })),
318
316
  sharePrice: z
319
317
  .nullable(value)
320
318
  .check(z.describe('Assets returned for one whole earn share, in the asset display currency, or null when the engine cannot quote an exit.')),
@@ -331,14 +329,11 @@ export var schema;
331
329
  },
332
330
  ],
333
331
  })),
334
- slug: z
335
- .nullable(z.string())
336
- .check(z.describe('Curated URL slug, or null when the vault is not verified.'), z.meta({ examples: ['deelusd-earn'] })),
337
332
  state: EarnVaults.schema.Discovery.shape.state,
338
333
  tvl: z
339
334
  .optional(z.nullable(value))
340
335
  .check(z.describe('Total assets valued in USD, when requested via `include=tvl`, or null when the asset has no priced display currency.')),
341
- vaultAddress: Schema.Address.check(z.describe('Earn vault contract address.'), z.meta({ examples: ['0x4f94590b636f5878bce585e82379de81e1ec174f'] })),
336
+ vaultAddress: Schema.Address.check(z.describe('Earn vault contract address.'), z.meta({ examples: ['0xb20ba39ccf522d69b7a21e3f369be5de73a2c694'] })),
342
337
  verified: z
343
338
  .boolean()
344
339
  .check(z.describe('Whether this vault is in the curated earn registry.'), z.meta({ examples: [true] })),
@@ -362,8 +357,22 @@ export var schema;
362
357
  });
363
358
  /** One compatible Earn vault resolved from current chain state. */
364
359
  schema.Vault = OpenApi.component(Schema.describe(vault, 'A compatible earn vault resolved from chain state.'), 'EarnVault');
360
+ // Registry labels name customers, so only the admin app serves them.
361
+ const curatedVault = z.extend(vault, {
362
+ description: z
363
+ .nullable(z.string())
364
+ .check(z.describe('Curated vault description, or null when the vault is not verified.'), z.meta({ examples: ['pathUSD deposited into the canonical Tempo Earn deployment.'] })),
365
+ label: z
366
+ .string()
367
+ .check(z.describe('Vault display label.'), z.meta({ examples: ['Sentora pathUSD (Earn)'] })),
368
+ slug: z
369
+ .nullable(z.string())
370
+ .check(z.describe('Curated URL slug, or null when the vault is not verified.'), z.meta({ examples: ['sentora-pathusd-earn'] })),
371
+ });
372
+ /** One Earn vault with its curated registry label, slug, and description. */
373
+ schema.CuratedVault = Schema.describe(curatedVault, 'A compatible earn vault with its curated registry fields.');
365
374
  /** One registry-curated Earn vault. */
366
- schema.VerifiedVault = OpenApi.component(Schema.describe(z.extend(vault, {
375
+ schema.VerifiedVault = OpenApi.component(Schema.describe(z.extend(curatedVault, {
367
376
  engine: z.extend(engine, { type: engineType }),
368
377
  slug: z
369
378
  .string()
@@ -452,7 +461,7 @@ export var schema;
452
461
  assetAmount: value.check(z.describe('Current asset value of the held shares, including fees, in `valueToken` units.')),
453
462
  assetToken: Tokens.schema.Token.check(z.describe('Asset accepted by the vault.')),
454
463
  chainId: Schema.ChainId.check(z.describe('Chain containing the held shares.'), z.meta({ examples: [42431] })),
455
- id: Schema.Address.check(z.describe('Stable resource ID for this position, equal to the vault address.'), z.meta({ examples: ['0x4f94590b636f5878bce585e82379de81e1ec174f'] })),
464
+ id: Schema.Address.check(z.describe('Stable resource ID for this position, equal to the vault address.'), z.meta({ examples: ['0xb20ba39ccf522d69b7a21e3f369be5de73a2c694'] })),
456
465
  lifetimeCashFlows: z
457
466
  .optional(lifetimeCashFlows)
458
467
  .check(z.describe('Lifetime deposits and completed withdrawals, when requested.')),
@@ -463,7 +472,7 @@ export var schema;
463
472
  .check(z.describe('The position’s nominal value when `valuation.currency` is requested, or `null` when ' +
464
473
  'the asset token is unverified, its display currency has no rate, or rates were unavailable.')),
465
474
  valueToken: Tokens.schema.Token.check(z.describe('Parent-chain asset denominating `assetAmount`.')),
466
- vaultAddress: Schema.Address.check(z.describe('Earn vault contract address holding this position.'), z.meta({ examples: ['0x4f94590b636f5878bce585e82379de81e1ec174f'] })),
475
+ vaultAddress: Schema.Address.check(z.describe('Earn vault contract address holding this position.'), z.meta({ examples: ['0xb20ba39ccf522d69b7a21e3f369be5de73a2c694'] })),
467
476
  verified: z
468
477
  .boolean()
469
478
  .check(z.describe('Whether the vault is in the curated earn registry.'), z.meta({ examples: [true] })),
@@ -479,15 +488,11 @@ export var schema;
479
488
  .enum(['7d', '30d', 'active', 'custom', 'lifetime'])
480
489
  .check(z.describe('Earnings period: trailing 7 or 30 days, shares still held, explicit timestamps, or lifetime history.'), z.meta({ examples: ['lifetime'] }));
481
490
  const earningsWindow = z.extend(earningsBase, {
482
- end: z.iso
483
- .datetime()
484
- .check(z.describe('UTC ending boundary. Includes activity through the latest indexed block at or before this timestamp.'), z.meta({ examples: ['2026-09-18T00:00:00.000Z'] })),
491
+ end: Schema.dateTime().check(z.describe('UTC ending boundary. Includes activity through the latest indexed block at or before this timestamp.'), z.meta({ examples: ['2026-09-18T00:00:00.000Z'] })),
485
492
  period: z
486
493
  .enum(['7d', '30d', 'custom'])
487
494
  .check(z.describe('Rolling or explicitly bounded earnings window.'), z.meta({ examples: ['7d'] })),
488
- start: z.iso
489
- .datetime()
490
- .check(z.describe('UTC opening boundary. Excludes activity through the latest indexed block at or before this timestamp.'), z.meta({ examples: ['2026-09-11T00:00:00.000Z'] })),
495
+ start: Schema.dateTime().check(z.describe('UTC opening boundary. Excludes activity through the latest indexed block at or before this timestamp.'), z.meta({ examples: ['2026-09-11T00:00:00.000Z'] })),
491
496
  });
492
497
  const earnings = z.union([
493
498
  z.extend(earningsBase, {
@@ -571,47 +576,12 @@ export var schema;
571
576
  include: includeQuery,
572
577
  limit: Schema.Limit,
573
578
  });
574
- const collectionQuery = z
575
- .extend(collectionFilters, { 'apy.window': EarnRates.schema.Window })
576
- .check(z.describe('Query parameters for listing earn vaults.'));
577
579
  const vaultSelector = z.strictObject({
578
580
  chainId: Schema.ChainIdQuery,
579
581
  include: includeQuery,
580
582
  });
581
- /** Schemas for the getEarnVaults operation. */
582
- let getEarnVaults;
583
- (function (getEarnVaults) {
584
- /** Query parameters for all compatible deployed Earn vaults. */
585
- getEarnVaults.Query = collectionQuery;
586
- /** Paginated list of compatible deployed Earn vaults. */
587
- getEarnVaults.Response = OpenApi.component(z
588
- .strictObject({
589
- data: z
590
- .array(schema.Vault)
591
- .check(z.describe('Compatible deployed earn vaults in deployment order.')),
592
- meta: z.optional(meta),
593
- nextCursor: Schema.NextCursor,
594
- })
595
- .check(z.describe('A page of compatible deployed earn vaults.')), 'EarnVaultList');
596
- })(getEarnVaults = schema.getEarnVaults || (schema.getEarnVaults = {}));
597
- /** Schemas for the getVerifiedEarnVaults operation. */
598
- let getVerifiedEarnVaults;
599
- (function (getVerifiedEarnVaults) {
600
- /** Collection query without rates or valuation, for surfaces that cannot measure them. */
601
- getVerifiedEarnVaults.BaseQuery = Schema.describe(z.extend(collectionFilters, { include: baseIncludeQuery }), 'Query parameters for listing earn vaults.');
602
- /** Query parameters for registry-curated Earn vaults. */
603
- getVerifiedEarnVaults.Query = collectionQuery;
604
- /** Paginated list of registry-curated Earn vaults. */
605
- getVerifiedEarnVaults.Response = OpenApi.component(z
606
- .strictObject({
607
- data: z
608
- .array(schema.VerifiedVault)
609
- .check(z.describe('Registry-curated earn vaults ordered by vault address.')),
610
- meta: z.optional(meta),
611
- nextCursor: Schema.NextCursor,
612
- })
613
- .check(z.describe('A page of registry-curated earn vaults.')), 'VerifiedEarnVaultList');
614
- })(getVerifiedEarnVaults = schema.getVerifiedEarnVaults || (schema.getVerifiedEarnVaults = {}));
583
+ /** Collection filters without rates or valuation, for surfaces that cannot measure them. */
584
+ schema.VaultCollectionQuery = Schema.describe(z.extend(collectionFilters, { include: baseIncludeQuery }), 'Query parameters for listing earn vaults.');
615
585
  /** Schemas for the getEarnAddressPositions operation. */
616
586
  let getEarnAddressPositions;
617
587
  (function (getEarnAddressPositions) {
@@ -676,7 +646,7 @@ export var schema;
676
646
  /** Schemas for the getEarnVaultSharePrices operation. */
677
647
  let getEarnVaultSharePrices;
678
648
  (function (getEarnVaultSharePrices) {
679
- const timestamp = z.iso.datetime({ offset: true });
649
+ const timestamp = Schema.dateTime({ offset: true });
680
650
  /** Path parameters identifying one Earn vault. */
681
651
  getEarnVaultSharePrices.Params = z
682
652
  .strictObject({
@@ -704,9 +674,7 @@ export var schema;
704
674
  const Point = z
705
675
  .strictObject({
706
676
  sharePrice: value.check(z.describe('Assets returned for one whole Earn share at the observation block.')),
707
- timestamp: z.iso
708
- .datetime()
709
- .check(z.describe('Requested daily observation timestamp.'), z.meta({ examples: ['2026-07-01T00:00:00.000Z'] })),
677
+ timestamp: Schema.dateTime().check(z.describe('Requested daily observation timestamp.'), z.meta({ examples: ['2026-07-01T00:00:00.000Z'] })),
710
678
  })
711
679
  .check(z.describe('One historical Earn vault share price.'));
712
680
  /** Daily share prices for one Earn vault. */
@@ -733,12 +701,12 @@ export var schema;
733
701
  /** Schemas for the getEarnVaultPosition operation. */
734
702
  let getEarnVaultPosition;
735
703
  (function (getEarnVaultPosition) {
736
- const asOf = z.iso.datetime({ offset: true });
704
+ const asOf = Schema.dateTime({ offset: true });
737
705
  /** Path parameters identifying the Earn vault and account. */
738
706
  getEarnVaultPosition.Params = z
739
707
  .strictObject({
740
708
  address: Schema.Address.check(z.describe('Account whose earn position to read.')),
741
- vaultId: Schema.address('0x4f94590b636f5878bce585e82379de81e1ec174f').check(z.describe('Earn vault contract address.')),
709
+ vaultId: Schema.address('0xb20ba39ccf522d69b7a21e3f369be5de73a2c694').check(z.describe('Earn vault contract address.')),
742
710
  })
743
711
  .check(z.describe('Path parameters identifying an earn vault position.'));
744
712
  /** Query parameters selecting the chain containing the vault. */
@@ -756,9 +724,7 @@ export var schema;
756
724
  number: z
757
725
  .number()
758
726
  .check(z.int(), z.nonnegative(), z.describe('Indexed observation block.'), z.meta({ examples: [31039238] })),
759
- timestamp: z.iso
760
- .datetime()
761
- .check(z.describe('Timestamp of the indexed observation block.'), z.meta({ examples: ['2026-07-21T09:00:00.000Z'] })),
727
+ timestamp: Schema.dateTime().check(z.describe('Timestamp of the indexed observation block.'), z.meta({ examples: ['2026-07-21T09:00:00.000Z'] })),
762
728
  })
763
729
  .check(z.describe('Indexed block used for a historical Earn position observation.'));
764
730
  /** Current or historical asset and Earn-share state for one account in one vault. */
@@ -826,11 +792,11 @@ export var schema;
826
792
  .strictObject({
827
793
  chainId: Schema.ChainIdQuery,
828
794
  end: z
829
- .optional(z.iso.datetime({ offset: true }))
795
+ .optional(Schema.dateTime({ offset: true }))
830
796
  .check(z.describe('Required with period=custom. Inclusive ISO 8601 ending timestamp; indexed history must cover this time.'), z.meta({ examples: ['2026-09-18T00:00:00.000Z'] })),
831
797
  period: z._default(earningsPeriod, 'lifetime'),
832
798
  start: z
833
- .optional(z.iso.datetime({ offset: true }))
799
+ .optional(Schema.dateTime({ offset: true }))
834
800
  .check(z.describe('Required with period=custom. Exclusive ISO 8601 opening timestamp, earlier than end.'), z.meta({ examples: ['2026-09-11T00:00:00.000Z'] })),
835
801
  })
836
802
  .check(z.refine((value) => value.period === 'custom'
@@ -957,121 +923,6 @@ export function earn(options = {}) {
957
923
  nextCursor: page.nextCursor,
958
924
  vaultAddress: query.vaultAddress,
959
925
  }), 200);
960
- })
961
- .get('/v1/earn/vaults', Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }), OpenApi.validate('query', schema.getEarnVaults.Query, {
962
- code: 'query_invalid',
963
- message: 'Invalid query parameters',
964
- }), OpenApi.describeRoute({
965
- description: 'Lists compatible earn vaults discovered from deployment events and resolved from current chain state.',
966
- operationId: 'getEarnVaults',
967
- responses: OpenApi.responses({
968
- errors: {
969
- 400: {
970
- codes: ['chain_id_invalid', 'chain_id_unsupported', 'query_invalid'],
971
- },
972
- 502: 'Could not read earn deployment or vault data.',
973
- },
974
- success: {
975
- description: 'A page of compatible deployed earn vaults.',
976
- schema: schema.getEarnVaults.Response,
977
- },
978
- }),
979
- summary: 'List vaults',
980
- tags: ['Earn'],
981
- }),
982
- // Live state and rate enrichment are embedded, so every vault read caches
983
- // as current-state rather than slow-changing metadata.
984
- Cache.response({
985
- cacheControl: Cache.policies.state,
986
- key: (c) => vaultCacheKey(c, schema.getEarnVaults.Query),
987
- name: 'tempo-api:earn-vaults:v5',
988
- }), async (c) => {
989
- if (Auth.narrowAccess)
990
- return Auth.paidAccessError(c);
991
- if (OpenApi.narrowValidation)
992
- return Response.error(c, {
993
- code: 'chain_id_invalid',
994
- message: 'Invalid chain id',
995
- status: 400,
996
- });
997
- if (OpenApi.narrowValidation)
998
- return Response.error(c, {
999
- code: 'chain_id_unsupported',
1000
- message: 'Unsupported chain id',
1001
- status: 400,
1002
- });
1003
- if (OpenApi.narrowValidation)
1004
- return OpenApi.validationError(c, {
1005
- code: 'query_invalid',
1006
- message: 'Invalid query parameters',
1007
- });
1008
- const query = c.req.valid('query');
1009
- try {
1010
- const chainId = query.chainId ?? c.get('chainId');
1011
- const data = await listVaults(c, { ...query, chainId, oracle });
1012
- return c.json(Response.validated(schema.getEarnVaults.Response, data), 200);
1013
- }
1014
- catch (cause) {
1015
- return Response.upstream(c, cause);
1016
- }
1017
- })
1018
- .get('/v1/earn/vaults/verified', Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }), OpenApi.validate('query', schema.getVerifiedEarnVaults.Query, {
1019
- code: 'query_invalid',
1020
- message: 'Invalid query parameters',
1021
- }), OpenApi.describeRoute({
1022
- description: 'Lists registry-curated earn vaults after resolving their current onchain configuration.',
1023
- operationId: 'getVerifiedEarnVaults',
1024
- responses: OpenApi.responses({
1025
- errors: {
1026
- 400: {
1027
- codes: ['chain_id_invalid', 'chain_id_unsupported', 'query_invalid'],
1028
- },
1029
- 502: 'Could not read curated earn registry or vault data.',
1030
- },
1031
- success: {
1032
- description: 'A page of registry-curated earn vaults.',
1033
- schema: schema.getVerifiedEarnVaults.Response,
1034
- },
1035
- }),
1036
- summary: 'List verified vaults',
1037
- tags: ['Earn'],
1038
- }), Cache.response({
1039
- cacheControl: Cache.policies.state,
1040
- key: (c) => vaultCacheKey(c, schema.getVerifiedEarnVaults.Query),
1041
- name: 'tempo-api:earn-vaults:v4',
1042
- }), async (c) => {
1043
- if (Auth.narrowAccess)
1044
- return Auth.paidAccessError(c);
1045
- if (OpenApi.narrowValidation)
1046
- return Response.error(c, {
1047
- code: 'chain_id_invalid',
1048
- message: 'Invalid chain id',
1049
- status: 400,
1050
- });
1051
- if (OpenApi.narrowValidation)
1052
- return Response.error(c, {
1053
- code: 'chain_id_unsupported',
1054
- message: 'Unsupported chain id',
1055
- status: 400,
1056
- });
1057
- if (OpenApi.narrowValidation)
1058
- return OpenApi.validationError(c, {
1059
- code: 'query_invalid',
1060
- message: 'Invalid query parameters',
1061
- });
1062
- const query = c.req.valid('query');
1063
- try {
1064
- const chainId = query.chainId ?? c.get('chainId');
1065
- const data = await listVerifiedVaults(c, {
1066
- ...query,
1067
- chainId,
1068
- oracle,
1069
- });
1070
- return c.json(Response.validated(schema.getVerifiedEarnVaults.Response, data), 200);
1071
- }
1072
- catch (cause) {
1073
- return Response.upstream(c, cause);
1074
- }
1075
926
  })
1076
927
  .get('/v1/earn/addresses/:address/positions', Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }), OpenApi.validate('param', schema.getEarnAddressPositions.Params, {
1077
928
  code: 'positions_invalid',
@@ -1570,8 +1421,13 @@ export function earn(options = {}) {
1570
1421
  tags: ['Earn'],
1571
1422
  }), Cache.response({
1572
1423
  cacheControl: Cache.policies.state,
1573
- key: (c) => vaultCacheKey(c, schema.getEarnVault.Query),
1574
- name: 'tempo-api:earn-vaults:v4',
1424
+ key: (c) => {
1425
+ const url = new URL(vaultCacheKey(c, schema.getEarnVault.Query));
1426
+ // The outer edge cache uses this URL, not the inner cache namespace.
1427
+ url.searchParams.set('cache', vaultCacheName);
1428
+ return url.toString();
1429
+ },
1430
+ name: vaultCacheName,
1575
1431
  }), async (c) => {
1576
1432
  if (Auth.narrowAccess)
1577
1433
  return Auth.paidAccessError(c);
@@ -1617,6 +1473,9 @@ export function earn(options = {}) {
1617
1473
  message: 'Earn vault not found',
1618
1474
  status: 404,
1619
1475
  });
1476
+ // A Zone access refusal (`ZoneAccess.visible`) is no upstream failure; it keeps its own status and code.
1477
+ if (cause instanceof HTTPException)
1478
+ throw cause;
1620
1479
  return Response.upstream(c, cause);
1621
1480
  }
1622
1481
  });
@@ -2420,211 +2279,6 @@ async function getActiveCostBasis(tidx, options) {
2420
2279
  }
2421
2280
  return calculateActiveCostBasis({ actions, shareBalance: options.shareBalance });
2422
2281
  }
2423
- /** Lists compatible deployed Earn vaults. */
2424
- export async function listVaults(c, options) {
2425
- const db = Db.get(c.get('dbCached'));
2426
- const [records, snapshot] = await Promise.all([
2427
- core_EarnVaults.list(db, { chainId: options.chainId }),
2428
- VerifiedTokens.snapshot(c, options.chainId),
2429
- ]);
2430
- const include = vaultInclude(options);
2431
- const apyByVault = new Map();
2432
- const registry = new Map(records.map((record) => [record.vaultAddress.toLowerCase(), record]));
2433
- const decoded = options.cursor ? Cursor.decode(options.cursor, ['int', 'int']) : undefined;
2434
- let position = decoded
2435
- ? [Number(decoded[0]), Number(decoded[1])]
2436
- : undefined;
2437
- let hasMore = false;
2438
- let scanned = 0;
2439
- const matches = [];
2440
- while (matches.length <= options.limit && scanned < maxScannedDeployments) {
2441
- const page = await queryDeployments(c, {
2442
- asset: options.asset,
2443
- chainId: options.chainId,
2444
- cursor: position,
2445
- limit: discoveryBatchLimit({
2446
- filtered: options.capability.length > 0 || options['engine.type'] !== undefined,
2447
- limit: options.limit,
2448
- matches: matches.length,
2449
- remaining: maxScannedDeployments - scanned,
2450
- }),
2451
- });
2452
- hasMore = page.hasMore;
2453
- if (page.items.length === 0) {
2454
- hasMore = false;
2455
- break;
2456
- }
2457
- scanned += page.items.length;
2458
- const apyVaults = apyByVault.size === 0 &&
2459
- include.includes('apy') &&
2460
- options.capability.length === 0 &&
2461
- options['engine.type'] === undefined
2462
- ? page.items
2463
- .slice(0, options.limit - matches.length)
2464
- .map(({ vaultAddress }) => vaultAddress)
2465
- : [];
2466
- // Rate boundaries and historical quotes depend only on candidate addresses,
2467
- // so the unfiltered page can resolve them alongside live vault discovery.
2468
- const [discovered, prefetchedApy] = await Promise.all([
2469
- Promise.all(page.items.map(async (item) => {
2470
- const record = registry.get(item.vaultAddress.toLowerCase());
2471
- try {
2472
- const discovered = await resolveVaultDiscovery(c, {
2473
- chainId: options.chainId,
2474
- include: discoveryInclude(options),
2475
- vaultAddress: item.vaultAddress,
2476
- });
2477
- const { discovery, zoneRoutes } = await resolveVaultRoutes(c, {
2478
- capability: options.capability,
2479
- discovery: discovered,
2480
- include,
2481
- record,
2482
- });
2483
- return { discovery, position: item.position, record, zoneRoutes };
2484
- }
2485
- catch (cause) {
2486
- if (!record && isIncompatible(cause))
2487
- return undefined;
2488
- throw cause;
2489
- }
2490
- })),
2491
- apyVaults.length > 0
2492
- ? resolvePageApy(c, {
2493
- chainId: options.chainId,
2494
- include,
2495
- vaults: apyVaults,
2496
- window: options['apy.window'],
2497
- })
2498
- : undefined,
2499
- ]);
2500
- for (const [vault, apy] of prefetchedApy ?? [])
2501
- apyByVault.set(vault, apy);
2502
- for (const match of discovered) {
2503
- if (!match || !matchesVaultFilters(match.discovery, options))
2504
- continue;
2505
- matches.push(match);
2506
- }
2507
- position = page.items.at(-1).position;
2508
- if (!hasMore)
2509
- break;
2510
- }
2511
- const page = matches.slice(0, options.limit);
2512
- const discoveries = page.map(({ discovery }) => discovery);
2513
- const missingApyVaults = include.includes('apy')
2514
- ? discoveries.flatMap(({ vaultAddress }) => apyByVault.has(vaultAddress.toLowerCase()) ? [] : [vaultAddress])
2515
- : [];
2516
- const [missingApy, rates, rewards, tokens] = await Promise.all([
2517
- missingApyVaults.length > 0
2518
- ? resolvePageApy(c, {
2519
- chainId: options.chainId,
2520
- include,
2521
- vaults: missingApyVaults,
2522
- window: options['apy.window'],
2523
- })
2524
- : undefined,
2525
- resolvePageRates(c, { discoveries, include, oracle: options.oracle, snapshot }),
2526
- resolvePageRewards(c, {
2527
- chainId: options.chainId,
2528
- include,
2529
- vaults: discoveries.map(({ vaultAddress }) => vaultAddress),
2530
- }),
2531
- resolvePageTokens(c, { chainId: options.chainId, discoveries, include, snapshot }),
2532
- ]);
2533
- for (const [vault, apy] of missingApy ?? [])
2534
- apyByVault.set(vault, apy);
2535
- const apy = include.includes('apy') ? apyByVault : undefined;
2536
- const data = await Promise.all(page.map((match) => resolveVault(c, {
2537
- ...match,
2538
- apy,
2539
- include,
2540
- rates,
2541
- rewards: rewards?.get(match.discovery.vaultAddress),
2542
- snapshot,
2543
- tokens,
2544
- })));
2545
- const last = matches[options.limit - 1];
2546
- const nextPosition = matches.length > options.limit ? last?.position : hasMore ? position : undefined;
2547
- return {
2548
- data,
2549
- ...(rates ? { meta: { valuation: Valuation.pricing(rates, options.oracle) } } : {}),
2550
- nextCursor: nextPosition ? Cursor.encode(nextPosition) : null,
2551
- };
2552
- }
2553
- /** Lists registry-curated Earn vaults. */
2554
- export async function listVerifiedVaults(c, options) {
2555
- const db = Db.get(c.get('dbCached'));
2556
- const [records, snapshot] = await Promise.all([
2557
- core_EarnVaults.list(db, { chainId: options.chainId }),
2558
- VerifiedTokens.snapshot(c, options.chainId),
2559
- ]);
2560
- const decoded = options.cursor ? Cursor.decode(options.cursor, ['address']) : undefined;
2561
- const cursor = decoded?.[0]?.toString().toLowerCase();
2562
- const candidates = records.filter((record) => !cursor || record.vaultAddress.toLowerCase() > cursor);
2563
- const include = vaultInclude(options);
2564
- const matches = [];
2565
- let offset = 0;
2566
- while (offset < candidates.length && matches.length <= options.limit) {
2567
- const batchSize = discoveryBatchLimit({
2568
- filtered: options.capability.length > 0 || options['engine.type'] !== undefined,
2569
- limit: options.limit,
2570
- matches: matches.length,
2571
- remaining: candidates.length - offset,
2572
- });
2573
- const batch = candidates.slice(offset, offset + batchSize);
2574
- offset += batch.length;
2575
- const discovered = await Promise.all(batch.map(async (record) => {
2576
- const discovered = await resolveVaultDiscovery(c, {
2577
- chainId: options.chainId,
2578
- include: discoveryInclude(options),
2579
- vaultAddress: Schema.Address.parse(record.vaultAddress.toLowerCase()),
2580
- });
2581
- const { discovery, zoneRoutes } = await resolveVaultRoutes(c, {
2582
- capability: options.capability,
2583
- discovery: discovered,
2584
- include,
2585
- record,
2586
- });
2587
- return { discovery, record, zoneRoutes };
2588
- }));
2589
- for (const match of discovered) {
2590
- if (!matchesVaultFilters(match.discovery, options))
2591
- continue;
2592
- matches.push(match);
2593
- }
2594
- }
2595
- const page = matches.slice(0, options.limit);
2596
- const discoveries = page.map(({ discovery }) => discovery);
2597
- const [apy, rates, rewards, tokens] = await Promise.all([
2598
- resolvePageApy(c, {
2599
- chainId: options.chainId,
2600
- include,
2601
- vaults: discoveries.map(({ vaultAddress }) => vaultAddress),
2602
- window: options['apy.window'],
2603
- }),
2604
- resolvePageRates(c, { discoveries, include, oracle: options.oracle, snapshot }),
2605
- resolvePageRewards(c, {
2606
- chainId: options.chainId,
2607
- include,
2608
- vaults: discoveries.map(({ vaultAddress }) => vaultAddress),
2609
- }),
2610
- resolvePageTokens(c, { chainId: options.chainId, discoveries, include, snapshot }),
2611
- ]);
2612
- const data = await Promise.all(page.map(async (match) => Response.validated(schema.VerifiedVault, await resolveVault(c, {
2613
- ...match,
2614
- apy,
2615
- include,
2616
- rates,
2617
- rewards: rewards?.get(match.discovery.vaultAddress),
2618
- snapshot,
2619
- tokens,
2620
- }))));
2621
- const last = matches[options.limit - 1];
2622
- return {
2623
- data,
2624
- ...(rates ? { meta: { valuation: Valuation.pricing(rates, options.oracle) } } : {}),
2625
- nextCursor: matches.length > options.limit && last ? Cursor.encode([last.record.vaultAddress]) : null,
2626
- };
2627
- }
2628
2282
  /** Reads daily historical share prices for one Earn vault. */
2629
2283
  export async function getVaultSharePrices(c, options) {
2630
2284
  const prices = await Timing.time(c, 'earn_share_prices', () => EarnSharePrices.resolve({
@@ -3513,7 +3167,7 @@ export async function getVault(c, options) {
3513
3167
  try {
3514
3168
  const discovered = await resolveVaultDiscovery(c, {
3515
3169
  chainId: options.chainId,
3516
- include: discoveryInclude({ capability: [], include: options.include }),
3170
+ include: discoveryInclude({ include: options.include }),
3517
3171
  vaultAddress: options.vaultAddress,
3518
3172
  });
3519
3173
  const include = vaultInclude(options);
@@ -3584,9 +3238,7 @@ export function vaultCacheKey(c, query) {
3584
3238
  return url.toString();
3585
3239
  }
3586
3240
  function discoveryInclude(options) {
3587
- const includeCapabilities = options.include.includes('capabilities') ||
3588
- options.include.includes('zone') ||
3589
- options.capability.length > 0;
3241
+ const includeCapabilities = options.include.includes('capabilities') || options.include.includes('zone');
3590
3242
  return [
3591
3243
  ...(options.include.includes('access') ? ['access'] : []),
3592
3244
  ...(includeCapabilities ? ['capabilities'] : []),
@@ -3621,9 +3273,13 @@ async function resolveVaultRoutes(c, options) {
3621
3273
  const needsCapabilities = options.include.includes('capabilities') ||
3622
3274
  options.capability.includes('privateRouting') ||
3623
3275
  options.capability.includes('routerSwaps');
3624
- const visibleRoutes = record.zones.filter((route) => ZoneAccess.check(c, { chainId: route.chainId, verb: 'read' }).allowed);
3625
- // Capabilities describe the vault; API-key scopes limit only the route metadata.
3626
- const routes = needsCapabilities ? record.zones : includesRoutes ? visibleRoutes : [];
3276
+ await ZoneAccess.ensure(c);
3277
+ // Capabilities describe the vault; API-key scopes limit only the route metadata, checked only when requested.
3278
+ const routes = needsCapabilities
3279
+ ? record.zones
3280
+ : includesRoutes
3281
+ ? record.zones.filter((route) => ZoneAccess.visible(c, { chainId: route.chainId }))
3282
+ : [];
3627
3283
  if (routes.length === 0)
3628
3284
  return { discovery, zoneRoutes: [] };
3629
3285
  const resolved = await EarnVaults.resolveZoneRoutes({
@@ -3640,7 +3296,7 @@ async function resolveVaultRoutes(c, options) {
3640
3296
  ? { ...discovery, capabilities: EarnVaults.addZoneRouteCapabilities(capabilities) }
3641
3297
  : discovery,
3642
3298
  zoneRoutes: includesRoutes
3643
- ? resolved.filter((route) => ZoneAccess.check(c, { chainId: route.chainId, verb: 'read' }).allowed)
3299
+ ? resolved.filter((route) => ZoneAccess.visible(c, { chainId: route.chainId }))
3644
3300
  : [],
3645
3301
  };
3646
3302
  }
@@ -3778,25 +3434,6 @@ function resolvePageApy(c, options) {
3778
3434
  window: options.window,
3779
3435
  }));
3780
3436
  }
3781
- function resolvePageRewards(c, options) {
3782
- if (!options.include.includes('apy'))
3783
- return undefined;
3784
- return Timing.time(c, 'earn_rewards_apy', () => RewardRead.resolveCollection({
3785
- chainId: options.chainId,
3786
- db: c.get('dbCached'),
3787
- vaults: options.vaults,
3788
- }).catch(() => {
3789
- Cache.setPolicy(c, Cache.policies.noStore);
3790
- const failure = {
3791
- chainId: options.chainId,
3792
- failure: 'unknown',
3793
- id: 'earn-rewards',
3794
- operation: 'listVaultRewards',
3795
- };
3796
- c.set('providerFailures', [...(c.get('providerFailures') ?? []), failure]);
3797
- return new Map();
3798
- }));
3799
- }
3800
3437
  function resolveVaultRewards(c, options) {
3801
3438
  if (!options.include.includes('apy'))
3802
3439
  return undefined;
@@ -3853,7 +3490,11 @@ async function resolvePageTokens(c, options) {
3853
3490
  }
3854
3491
  async function resolveVault(c, options) {
3855
3492
  const { discovery, record } = options;
3856
- const zones = [...c.get('zones').values()].filter((zone) => ZoneAccess.check(c, { chainId: zone.id, verb: 'read' }).allowed);
3493
+ await ZoneAccess.ensure(c);
3494
+ // Only `include=zone` reads Zones, so other reads never fail on an unreadable delegation.
3495
+ const zones = options.include.includes('zone')
3496
+ ? [...c.get('zones').values()].filter((zone) => ZoneAccess.visible(c, { chainId: zone.id }))
3497
+ : [];
3857
3498
  const valued = options.include.includes('tvl')
3858
3499
  ? Valuation.valuationFor({
3859
3500
  amount: BigInt(discovery.state.totalAssets),
@@ -3939,7 +3580,6 @@ export function serializeVault(options) {
3939
3580
  ...(options.include.includes('apy') ? { apy } : {}),
3940
3581
  assetToken: options.assetToken,
3941
3582
  ...(options.include.includes('capabilities') ? { capabilities: discovery.capabilities } : {}),
3942
- description: record?.description ?? null,
3943
3583
  engine: {
3944
3584
  address: discovery.engine.address.toLowerCase(),
3945
3585
  type: discovery.engine.type,
@@ -3950,7 +3590,7 @@ export function serializeVault(options) {
3950
3590
  ...(options.include.includes('tvl')
3951
3591
  ? { instantLiquidityValue: options.instantLiquidityValue }
3952
3592
  : {}),
3953
- label: record?.label ?? options.shareToken.name,
3593
+ label: '',
3954
3594
  sharePrice: discovery.sharePrice === null
3955
3595
  ? null
3956
3596
  : {
@@ -3960,7 +3600,6 @@ export function serializeVault(options) {
3960
3600
  formatted: core_Value.format(BigInt(discovery.sharePrice), options.assetToken.decimals),
3961
3601
  },
3962
3602
  shareToken: options.shareToken,
3963
- slug: record?.slug ?? null,
3964
3603
  state: discovery.state,
3965
3604
  ...(options.include.includes('tvl') ? { tvl: options.tvl } : {}),
3966
3605
  vaultAddress,
@@ -4019,71 +3658,6 @@ function getToken(tokens, address) {
4019
3658
  throw new Error(`Token metadata was not resolved for ${address}.`);
4020
3659
  return Response.validated(Tokens.schema.Token, token);
4021
3660
  }
4022
- async function queryDeployments(c, options) {
4023
- const factories = deploymentFactories[options.chainId] ?? [];
4024
- if (factories.length === 0)
4025
- return { hasMore: false, items: [] };
4026
- const filters = [];
4027
- if (options.asset)
4028
- filters.push(`lower(asset) = '${options.asset.toLowerCase()}'`);
4029
- if (options.cursor)
4030
- filters.push(Cursor.keyset([
4031
- {
4032
- literal: Cursor.literal(options.cursor[0], 'int'),
4033
- name: 'block_num',
4034
- order: 'desc',
4035
- },
4036
- {
4037
- literal: Cursor.literal(options.cursor[1], 'int'),
4038
- name: 'log_idx',
4039
- order: 'desc',
4040
- },
4041
- ]));
4042
- // Authenticate emitters before deduplication so a forged newer event cannot
4043
- // replace a factory deployment or suppress it through outer filters.
4044
- const result = await c
4045
- .get('getTidx')(options.chainId)
4046
- .fetch({
4047
- chainId: options.chainId,
4048
- engine: 'clickhouse',
4049
- query: `
4050
- SELECT "earnVault", asset, block_num, log_idx
4051
- FROM (
4052
- SELECT
4053
- "earnVault",
4054
- asset,
4055
- block_num,
4056
- log_idx
4057
- FROM EarnStackDeployed
4058
- WHERE address IN (${factories.map((address) => `'${address}'`).join(', ')})
4059
- ORDER BY block_num DESC, log_idx DESC
4060
- LIMIT 1 BY lower("earnVault")
4061
- )
4062
- ${filters.length > 0 ? `WHERE ${filters.join(' AND ')}` : ''}
4063
- ORDER BY block_num DESC, log_idx DESC
4064
- LIMIT ${options.limit + 1}
4065
- `,
4066
- signatures: [deployedSignature],
4067
- });
4068
- const rows = result.rows;
4069
- const items = rows.slice(0, options.limit).map((row) => {
4070
- const vaultAddress = Schema.Address.safeParse(Value.toText(row['earnVault']));
4071
- const asset = Schema.Address.safeParse(Value.toText(row['asset']));
4072
- const blockNumber = Value.toNumber(row['block_num']);
4073
- const logIndex = Value.toNumber(row['log_idx']);
4074
- if (!vaultAddress.success ||
4075
- !asset.success ||
4076
- blockNumber === undefined ||
4077
- logIndex === undefined)
4078
- throw new Error('TIDX returned an invalid Earn deployment row.');
4079
- return {
4080
- asset: asset.data,
4081
- position: [blockNumber, logIndex],
4082
- vaultAddress: vaultAddress.data,
4083
- };
4084
- });
4085
- return { hasMore: rows.length > options.limit, items };
4086
- }
4087
3661
  /** Tests live vault state against the shared collection filters. */
4088
3662
  export function matchesVaultFilters(discovery, options) {
4089
3663
  if (options.asset && discovery.assetToken.address.toLowerCase() !== options.asset.toLowerCase())