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
@@ -55,7 +55,7 @@ const mpp = {
55
55
  getClient: () => Tempo.client,
56
56
  recipient: Tempo.accounts[2].address,
57
57
  },
58
- } satisfies NonNullable<TestApp.create.Options['mpp']>
58
+ } satisfies NonNullable<Exclude<NonNullable<TestApp.create.Options['auth']>, false>['mpp']>
59
59
 
60
60
  describe('MPP session management', () => {
61
61
  test('keeps generated POST routes private', async () => {
@@ -72,7 +72,7 @@ describe('MPP session management', () => {
72
72
 
73
73
  test('matches GET scopes for static, parameterized, and hidden resources', async () => {
74
74
  const rateLimitStore = Store.memory()
75
- const app = TestApp.create({ mpp, rateLimit: { store: rateLimitStore } })
75
+ const app = TestApp.create({ auth: { mpp }, rateLimit: { store: rateLimitStore } })
76
76
  await exhaustPublicQuota(rateLimitStore)
77
77
 
78
78
  for (const resource of [
@@ -106,7 +106,11 @@ describe('MPP session management', () => {
106
106
 
107
107
  test('preserves the mounted base path in session scope', async () => {
108
108
  const rateLimitStore = Store.memory()
109
- const app = TestApp.create({ mpp, path: '/api', rateLimit: { store: rateLimitStore } })
109
+ const app = TestApp.create({
110
+ auth: { mpp },
111
+ path: '/api',
112
+ rateLimit: { store: rateLimitStore },
113
+ })
110
114
  await exhaustPublicQuota(rateLimitStore)
111
115
 
112
116
  const resource = new URL(
@@ -129,12 +133,12 @@ describe('MPP session management', () => {
129
133
  test('honors endpoint MPP overrides', async () => {
130
134
  const app = TestApp.create({
131
135
  auth: {
136
+ mpp,
132
137
  overrides: {
133
138
  'GET /v1/scopes': { mpp: true },
134
139
  'GET /v1/tokens/:token': { mpp: false },
135
140
  },
136
141
  },
137
- mpp,
138
142
  })
139
143
  const enabled = await app.request('/v1/scopes', { method: 'POST' })
140
144
  const disabled = await app.request(`/v1/tokens/${TestApp.token}`, { method: 'POST' })
@@ -151,13 +155,13 @@ describe('zone chain gate', () => {
151
155
  /** A consumer-supplied zone chain id (the API never derives these). */
152
156
  const zone = 421_700_001
153
157
  /** A second zone, isolating per-zone grants. */
154
- const zoneB = 421_700_002
158
+ const zoneB = 4_217_000_002
155
159
 
156
160
  function zoneOptions(chainId: number) {
157
- return {
161
+ return TestApp.zone({
158
162
  chainId,
159
- forwardRpcUrl: `https://${chainId}.rpc.test`,
160
- }
163
+ rpcUrl: `https://${chainId}.rpc.test`,
164
+ })
161
165
  }
162
166
 
163
167
  /** Zone reader: holds the per-zone scope for `zone` (only). */
@@ -168,6 +172,14 @@ describe('zone chain gate', () => {
168
172
  token: 'secret_zone',
169
173
  } satisfies TestApp.kvStore.Key
170
174
 
175
+ /** Zone writer: broadcasts signed transactions and reads data for `zone`. */
176
+ const zoneWriter = {
177
+ id: 'key_zone_writer',
178
+ orgId: 'org_test',
179
+ scopes: ['data:read', `zone:${zone}:write`],
180
+ token: 'secret_zone_writer',
181
+ } satisfies TestApp.kvStore.Key
182
+
171
183
  /** Full-access key: the wildcard covers every zone. */
172
184
  const admin = {
173
185
  id: 'key_admin',
@@ -187,7 +199,7 @@ describe('zone chain gate', () => {
187
199
  /** A deployment serving two zones. */
188
200
  function zoneApp() {
189
201
  return TestApp.create({
190
- auth: { keys: [admin, outsider, zoneReader] },
202
+ auth: { keys: [admin, outsider, zoneReader, zoneWriter] },
191
203
  zones: [zoneOptions(zone), zoneOptions(zoneB)],
192
204
  })
193
205
  }
@@ -249,6 +261,11 @@ describe('zone chain gate', () => {
249
261
  expect(response.status).toBe(200)
250
262
  })
251
263
 
264
+ test('a Zone write scope reads Zone data', async () => {
265
+ const response = await zoneApp().request(`/v1/tokenlist?chainId=${zone}`, as(zoneWriter))
266
+ expect(response.status).toBe(200)
267
+ })
268
+
252
269
  test('zone authorization applies to every data route', async () => {
253
270
  const app = TestApp.create({ auth: false, zones: [zoneOptions(zone)] })
254
271
  for (const path of [
@@ -370,6 +387,18 @@ describe('zone chain gate', () => {
370
387
  })
371
388
 
372
389
  test('public chains remain edge-cacheable on a Zone deployment', async () => {
390
+ const store = Store.memory()
391
+ const app = TestApp.create({ auth: false, cache: { store }, zones: [zoneOptions(zone)] })
392
+ const path = '/v1/funding/chains'
393
+
394
+ const first = await app.request(path)
395
+ const second = await app.request(path)
396
+ expect(first.status).toBe(200)
397
+ expect(second.status).toBe(200)
398
+ expect(second.headers.get('cache-control')).toContain('public')
399
+ })
400
+
401
+ test('serves anonymous token lists from the edge cache on public chains', async () => {
373
402
  const store = Store.memory()
374
403
  const app = TestApp.create({ auth: false, cache: { store }, zones: [zoneOptions(zone)] })
375
404
  const path = `/v1/tokenlist?chainId=${Viem.chainId.testnet}`
@@ -11,15 +11,18 @@ import * as Path from '../../internal/Path.js'
11
11
  import * as Response from '../../internal/Response.js'
12
12
  import * as Schema from '../../internal/Schema.js'
13
13
  import * as Tidx from '../../internal/Tidx.js'
14
+ import * as Timing from '../../internal/Timing.js'
14
15
  import * as Viem from '../../internal/Viem.js'
15
16
  import * as Scope from '../../Scope.js'
16
17
  import * as Metadata from '../metadata.js'
18
+
17
19
  import type * as FxOracle from './FxOracle.js'
18
20
 
19
21
  import { transactions as transactionActivities } from './routes/activities.js'
20
22
  import { addresses } from './routes/addresses.js'
21
23
  import { blocks, blocksByTimestampCompat } from './routes/blocks.js'
22
24
  import { coingecko } from './routes/coingecko.js'
25
+ import { earn } from './routes/earn.js'
23
26
  import { exchanges } from './routes/exchanges.js'
24
27
  import { feeAmm } from './routes/fee-amm.js'
25
28
  import { funding } from './routes/funding.js'
@@ -32,10 +35,11 @@ import { transactions } from './routes/transactions.js'
32
35
  import { transfers } from './routes/transfers.js'
33
36
  import { verifiedTokens } from './routes/verified-tokens.js'
34
37
  import { schema as webhookSchema, webhooks } from './routes/webhooks.js'
38
+ import { zones } from './routes/zones.js'
35
39
 
36
40
  /**
37
- * The chain-data route group extends app context with TIDX, assets, zones,
38
- * verified tokens, and webhooks, and exposes indexed and RPC-backed reads.
41
+ * The chain-data route group extends app context with TIDX, assets, verified
42
+ * tokens, and webhooks, and exposes indexed and RPC-backed reads.
39
43
  *
40
44
  * ```ts
41
45
  * App.create(options).route('/', data())
@@ -43,6 +47,8 @@ import { schema as webhookSchema, webhooks } from './routes/webhooks.js'
43
47
  */
44
48
  export function data(options: data.Options = {}) {
45
49
  const { assets, tidx } = options
50
+ const configuredChainIds =
51
+ typeof tidx === 'function' ? [] : Viem.configuredChainIds(tidx?.baseUrl)
46
52
  const webhook =
47
53
  options.webhook === false
48
54
  ? undefined
@@ -50,11 +56,17 @@ export function data(options: data.Options = {}) {
50
56
  supportedChainIds: [Viem.chainId.mainnet, Viem.chainId.testnet],
51
57
  })
52
58
 
53
- // Zone endpoints are explicit trust boundaries; the API never derives them.
54
- const zones = new Map((options.zones ?? []).map((zone) => [zone.chainId, zone]))
55
59
  const dataRouteHandlers = new Set<unknown>()
56
60
 
57
61
  const getTidx = Tidx.createGetClient({ tidx })
62
+ const earn_routes = earn({ fx: options.fx })
63
+ const indexer_routes = indexer()
64
+ const indexerRouteHandlers = new Set(indexer_routes.routes.map((route) => route.handler))
65
+ const rpcOnlyRouteHandlers = new Set(
66
+ earn_routes.routes
67
+ .filter((route) => route.path === '/v1/earn/vaults/:vaultId/positions/:address')
68
+ .map((route) => route.handler),
69
+ )
58
70
 
59
71
  const app = new Hono<App.Environment>()
60
72
  // Publish the chain-data context vars for this group's handlers. Runs after
@@ -65,16 +77,26 @@ export function data(options: data.Options = {}) {
65
77
  const supportedChainIds = new Set<number>([
66
78
  ...c.get('supportedChainIds'),
67
79
  ...Object.keys(Tidx.url).map(Number),
68
- ...zones.keys(),
80
+ ...configuredChainIds,
69
81
  ])
70
82
  c.set('getAsset', createGetAsset({ assets, basePath: c.get('basePath'), origin: new URL(c.req.url).origin })) // prettier-ignore
71
83
  c.set('getClient', (chainId) => getClient(chainId ?? c.get('chainId')))
72
- c.set('getTidx', (chainId) => getTidx(chainId ?? c.get('chainId'), Auth.getPrincipal(c)))
84
+ c.set('getTidx', (chainId) => {
85
+ const resolved = chainId ?? c.get('chainId')
86
+ const client = getTidx(resolved, {
87
+ principal: Auth.getPrincipal(c),
88
+ zone: c.get('zones').get(resolved),
89
+ })
90
+ return Tidx.observe(client, {
91
+ record: (failure) =>
92
+ c.set('providerFailure', failure ? { ...failure, chainId: resolved } : undefined),
93
+ time: (fn) => Timing.time(c, 'tidx', fn),
94
+ })
95
+ })
73
96
  c.set('supportedChainIds', supportedChainIds)
74
97
  c.set('tidx', tidx)
75
98
  c.set('verifiedTokens', options.verifiedTokens === false ? undefined : (options.verifiedTokens ?? {})) // prettier-ignore
76
99
  c.set('webhook', webhook)
77
- c.set('zones', zones)
78
100
  await next()
79
101
  })
80
102
  // Resolve one chain for every data route before auth and handlers use it.
@@ -85,6 +107,8 @@ export function data(options: data.Options = {}) {
85
107
  c,
86
108
  defaultChainId,
87
109
  handlers: dataRouteHandlers,
110
+ indexerHandlers: indexerRouteHandlers,
111
+ rpcOnlyHandlers: rpcOnlyRouteHandlers,
88
112
  })
89
113
  if (!selection.matched) return next()
90
114
  if (selection.conflict || selection.invalid)
@@ -93,19 +117,39 @@ export function data(options: data.Options = {}) {
93
117
  message: selection.conflict ? 'Conflicting chain ids' : 'Invalid chain id',
94
118
  status: 400,
95
119
  })
96
- if (!supportedChainIds.has(selection.chainId))
97
- return Response.unsupportedChainId(c, selection.chainId, supportedChainIds)
120
+ const principal = Auth.getPrincipal(c)
121
+ const rpc_config = c.get('rpc')
122
+ const tidx_config = c.get('tidx')
123
+ const zones = c.get('zones')
124
+ // Raw passthroughs and RPC-only reads need only RPC; composed data routes
125
+ // require both upstreams to avoid falling through to unrelated defaults.
126
+ const narrowedChainIds = new Set(
127
+ [...supportedChainIds].filter((chainId) => {
128
+ const context = { chainId, principal, zone: zones.get(chainId) }
129
+ const hasRpc = Viem.resolveRpc(rpc_config, context).url !== undefined
130
+ const hasTidx = Tidx.resolve(tidx_config, context).baseUrl !== undefined
131
+ if (selection.rpc || selection.rpcOnly) return hasRpc
132
+ if (selection.indexer) return hasTidx
133
+ return hasRpc && hasTidx
134
+ }),
135
+ )
136
+ c.set('supportedChainIds', narrowedChainIds)
137
+ if (!narrowedChainIds.has(selection.chainId))
138
+ return Response.unsupportedChainId(c, selection.chainId, narrowedChainIds)
98
139
  c.set('chainId', selection.chainId)
99
140
  return next()
100
141
  })
101
142
  // Zone data requires an issued scope. Raw RPC may instead forward the
102
143
  // caller's Zone token to the node that enforces account scoping.
103
144
  .use('*', async (c, next) => {
145
+ const zones = c.get('zones')
104
146
  if (zones.size === 0) return next()
105
147
  const selection = resolveChainSelector({
106
148
  c,
107
149
  defaultChainId: c.get('chainId'),
108
150
  handlers: dataRouteHandlers,
151
+ indexerHandlers: indexerRouteHandlers,
152
+ rpcOnlyHandlers: rpcOnlyRouteHandlers,
109
153
  })
110
154
  if (!selection.matched) return next()
111
155
  const chainId = c.get('chainId')
@@ -116,13 +160,14 @@ export function data(options: data.Options = {}) {
116
160
  const allowed =
117
161
  scopes?.includes(Scope.wildcard) ||
118
162
  scopes?.includes(`zone:${chainId}:read`) ||
163
+ scopes?.includes(`zone:${chainId}:write`) ||
119
164
  (selection.rpc && Boolean(c.req.header(ZoneRpcAuthentication.headerName)?.trim()))
120
165
  if (!allowed)
121
166
  return Response.error(c, {
122
167
  code: 'api_key_forbidden',
123
168
  message: selection.rpc
124
- ? `Chain id ${chainId} is a zone. Use an API key granting \`zone:${chainId}:read\`, or pass a Zone token via \`X-Authorization-Token\`.`
125
- : `Chain id ${chainId} is a zone. Use an API key granting \`zone:${chainId}:read\`.`,
169
+ ? `Chain id ${chainId} is a zone. Use an API key granting \`zone:${chainId}:read\` or \`zone:${chainId}:write\`, or pass a Zone token via \`X-Authorization-Token\`.`
170
+ : `Chain id ${chainId} is a zone. Use an API key granting \`zone:${chainId}:read\` or \`zone:${chainId}:write\`.`,
126
171
  status: 403,
127
172
  })
128
173
 
@@ -143,6 +188,8 @@ export function data(options: data.Options = {}) {
143
188
  c,
144
189
  defaultChainId: c.get('chainId'),
145
190
  handlers: dataRouteHandlers,
191
+ indexerHandlers: indexerRouteHandlers,
192
+ rpcOnlyHandlers: rpcOnlyRouteHandlers,
146
193
  })
147
194
  if (!selection.matched || !Viem.isMainnet(c.get('chainId'))) return next()
148
195
 
@@ -167,10 +214,11 @@ export function data(options: data.Options = {}) {
167
214
  })
168
215
  .route('/', addresses({ fx: options.fx }))
169
216
  .route('/', blocks())
217
+ .route('/', earn_routes)
170
218
  .route('/', exchanges({ fx: options.fx }))
171
219
  .route('/', feeAmm())
172
- .route('/', funding(options.funding))
173
- .route('/', indexer())
220
+ .route('/', funding())
221
+ .route('/', indexer_routes)
174
222
  .route('/', receipts({ fx: options.fx }))
175
223
  .route('/', tokenlist())
176
224
  .route('/', tokens())
@@ -179,6 +227,7 @@ export function data(options: data.Options = {}) {
179
227
  .route('/', transfers({ fx: options.fx }))
180
228
  .route('/', verifiedTokens())
181
229
  .route('/', webhooks({ enabled: options.webhook !== false }))
230
+ .route('/', zones())
182
231
  .route('/', rpc())
183
232
  .route('/', coingecko())
184
233
  .route('/', blocksByTimestampCompat())
@@ -187,22 +236,24 @@ export function data(options: data.Options = {}) {
187
236
  c,
188
237
  defaultChainId: c.get('chainId'),
189
238
  handlers: dataRouteHandlers,
239
+ indexerHandlers: indexerRouteHandlers,
240
+ rpcOnlyHandlers: rpcOnlyRouteHandlers,
190
241
  })
191
242
  return (
192
243
  selection.matched &&
193
244
  !selection.conflict &&
194
245
  !selection.invalid &&
195
- !zones.has(selection.chainId)
246
+ !c.get('zones').has(selection.chainId)
196
247
  )
197
248
  }
198
249
  for (const route of app.routes) {
199
250
  if (route.method === 'ALL') continue
200
251
  dataRouteHandlers.add(route.handler)
201
- if (zones.size > 0) EdgeCache.setEligibility(route.handler, edgeCacheEligible)
252
+ EdgeCache.setEligibility(route.handler, edgeCacheEligible)
202
253
  }
203
254
  return Metadata.attach(app, {
204
255
  ...openapi,
205
- supportedChainIds: [...Object.keys(Tidx.url).map(Number), ...zones.keys()],
256
+ supportedChainIds: [...Object.keys(Tidx.url).map(Number), ...configuredChainIds],
206
257
  })
207
258
  }
208
259
 
@@ -211,8 +262,6 @@ export declare namespace data {
211
262
  type Options = {
212
263
  /** Static API asset store for the current runtime (e.g. `Assets.cloudflareR2(...)`). Omit to skip static assets — token logo URIs go unresolved. */
213
264
  assets?: Assets.Assets | undefined
214
- /** Funding quote provider configuration. */
215
- funding?: funding.Options | undefined
216
265
  /** FX configuration for the valuation endpoint. */
217
266
  fx?: Fx | undefined
218
267
  /** TIDX query client options. */
@@ -221,11 +270,6 @@ export declare namespace data {
221
270
  verifiedTokens?: VerifiedTokens | false | undefined
222
271
  /** Webhook feature configuration. Enabled by default (rows live in `db`); pass `false` to disable, leaving `/webhooks` mounted but returning `404` and hidden from the OpenAPI document. */
223
272
  webhook?: Webhook | false | undefined
224
- /**
225
- * Zone chains served by this deployment. REST and TIDX require a
226
- * `zone:<chainId>:read` scope; raw RPC may forward a Zone token instead.
227
- */
228
- zones?: readonly Zone[] | undefined
229
273
  }
230
274
 
231
275
  /** FX configuration for the valuation endpoint. */
@@ -234,14 +278,6 @@ export declare namespace data {
234
278
  oracle?: FxOracle.Oracle | undefined
235
279
  }
236
280
 
237
- /** One zone chain served by this deployment. */
238
- type Zone = {
239
- /** Zone chain id. Consumer-supplied literal; the API never derives zone chain ids. */
240
- chainId: number
241
- /** Zone RPC used when forwarding a caller-supplied Zone token. */
242
- forwardRpcUrl: string
243
- }
244
-
245
281
  /** Verified-token feature configuration. */
246
282
  type VerifiedTokens = {
247
283
  /**
@@ -260,13 +296,19 @@ function resolveChainSelector(options: {
260
296
  c: Context<App.Environment>
261
297
  defaultChainId: Viem.ChainId
262
298
  handlers: ReadonlySet<unknown>
299
+ indexerHandlers: ReadonlySet<unknown>
300
+ rpcOnlyHandlers: ReadonlySet<unknown>
263
301
  }) {
264
302
  let matched = false
265
303
  let path: string | undefined
266
304
  let rpc = false
305
+ let rpcOnly = false
306
+ let indexer = false
267
307
  for (const route of matchedRoutes(options.c)) {
268
308
  if (!options.handlers.has(route.handler)) continue
269
309
  matched = true
310
+ if (options.indexerHandlers.has(route.handler)) indexer = true
311
+ if (options.rpcOnlyHandlers.has(route.handler)) rpcOnly = true
270
312
  const selector = pathChainSelector(route.path, options.c.req.path)
271
313
  if (selector.name === undefined) continue
272
314
  path = selector.value
@@ -278,9 +320,11 @@ function resolveChainSelector(options: {
278
320
  return {
279
321
  chainId: options.defaultChainId,
280
322
  conflict: false,
323
+ indexer: false,
281
324
  invalid: false,
282
325
  matched: false,
283
326
  rpc: false,
327
+ rpcOnly: false,
284
328
  }
285
329
 
286
330
  const search = new URL(options.c.req.url).searchParams
@@ -294,9 +338,11 @@ function resolveChainSelector(options: {
294
338
  return {
295
339
  chainId: chainIds[0] ?? options.defaultChainId,
296
340
  conflict: chainIds.length > 1,
341
+ indexer,
297
342
  invalid: parsed.some((result) => !result.success),
298
343
  matched: true,
299
344
  rpc,
345
+ rpcOnly,
300
346
  }
301
347
  }
302
348
 
@@ -326,14 +372,19 @@ const openapi = {
326
372
  { name: 'Activities', description: 'A readable feed of what an account did onchain.' },
327
373
  { name: 'Balances', description: 'How much of each token an account holds.' },
328
374
  { name: 'Blocks', description: 'The ordered batches of transactions making up the chain.' },
375
+ { name: 'Earn', description: 'Vaults that earn yield from assets deposited on Tempo.' },
329
376
  { name: 'Exchange', description: "Tempo's built-in stablecoin exchange: pairs, swaps, orders, prices." }, // prettier-ignore
330
377
  { name: 'Fee AMM', description: 'Pools that convert stablecoins to pay fees.' },
331
- { name: 'Funding', description: 'Live quotes and supported inputs for funding Tempo.' },
378
+ {
379
+ name: 'Funding',
380
+ description: 'Quote, transfer, and deposit management for funding Tempo from other chains.',
381
+ },
332
382
  { name: 'Tokens', description: 'TIP-20 token details, supply, and holders.' },
333
383
  { name: 'Transactions', description: 'Transactions submitted to Tempo, and their receipts.' },
334
384
  { name: 'Transfers', description: 'Token movements from executing transactions.' },
335
385
  { name: 'Verified Tokens', description: 'A curated, trusted list of TIP-20 tokens.' },
336
386
  { name: 'Webhooks', description: 'Get signed callbacks when onchain events happen.' },
387
+ { name: 'Zones', description: 'Private chain operations anchored to Tempo.' },
337
388
  { name: 'Indexer', description: "Run read-only SQL queries against Tempo's indexed data." },
338
389
  { name: 'RPC', description: 'Direct access to the chain over Ethereum JSON-RPC. Not part of the stable API contract; best-effort support only. No compatibility, latency, availability, or data-freshness guarantees. Breaking changes may happen with limited notice.' }, // prettier-ignore
339
390
  { name: 'CoinGecko', description: "Exchange data in CoinGecko's GeckoTerminal format." },
@@ -345,6 +396,7 @@ const openapi = {
345
396
  'Activities',
346
397
  'Balances',
347
398
  'Blocks',
399
+ 'Earn',
348
400
  'Exchange',
349
401
  'Fee AMM',
350
402
  'Funding',
@@ -353,6 +405,7 @@ const openapi = {
353
405
  'Transfers',
354
406
  'Verified Tokens',
355
407
  'Webhooks',
408
+ 'Zones',
356
409
  'Indexer',
357
410
  'RPC',
358
411
  'MCP',
@@ -415,7 +468,7 @@ function webhooksBlock() {
415
468
  function createGetAsset(options: createGetAsset.Options): App.GetAsset {
416
469
  const { assets, basePath, origin } = options
417
470
  if (!assets) return () => undefined
418
- return async (chainId, path) => {
471
+ const getAsset: App.GetAsset = async (chainId, path) => {
419
472
  const pathname = Path.join(basePath, 'assets', String(chainId), path)
420
473
  // `path` may be absolute (`Path.join` returns a leading slash); strip it so
421
474
  // the key is `:chainId/:path`, not `:chainId//:path`.
@@ -429,6 +482,16 @@ function createGetAsset(options: createGetAsset.Options): App.GetAsset {
429
482
  uri: new URL(pathname, origin).toString(),
430
483
  }
431
484
  }
485
+ const list = assets.list
486
+ if (list)
487
+ getAsset.list = async (chainId, path) => {
488
+ const prefix = `${chainId}/${path.replace(/^\/+/, '')}`
489
+ return (await list(prefix)).map((key) => ({
490
+ key,
491
+ uri: new URL(Path.join(basePath, 'assets', key), origin).toString(),
492
+ }))
493
+ }
494
+ return getAsset
432
495
  }
433
496
 
434
497
  declare namespace createGetAsset {
@@ -4,7 +4,7 @@ import * as Ttl from '../../internal/Ttl.js'
4
4
 
5
5
  /** A pluggable fiat FX rate oracle consumed by the valuation endpoint. */
6
6
  export type Oracle = {
7
- /** Oracle identifier, surfaced as the valuation's `pricing.source` (e.g. `ecb`). */
7
+ /** Oracle identifier, surfaced as valuation rate provenance (e.g. `ecb`). */
8
8
  name: string
9
9
  /** Fetches the oracle's current rate set. */
10
10
  rates: () => Promise<RateSet>
@@ -1,4 +1,3 @@
1
1
  export { data } from './App.js'
2
- export * as FundingQuoteProviders from './FundingQuoteProviders.js'
3
2
  export * as FxOracle from './FxOracle.js'
4
3
  export * as Sponsorships from '../relay/Sponsorships.js'
@@ -1,13 +1,18 @@
1
+ /** @module-tag localnet */
2
+
1
3
  import { Address, Hex, Value as core_Value } from 'ox'
2
4
  import { FxOracle } from 'tapimo/apps'
3
- import { encodeAbiParameters, encodeEventTopics } from 'viem'
4
- import { Abis } from 'viem/tempo'
5
+ import { createClient, encodeAbiParameters, encodeEventTopics, http } from 'viem'
6
+ import { sendTransactionSync } from 'viem/actions'
7
+ import { Abis, Actions, Addresses } from 'viem/tempo'
5
8
 
6
9
  import * as TestApp from '../../../../test/App.js'
7
10
  import * as Runtime from '../../../../test/runtime.js'
11
+ import * as Tempo from '../../../../test/Tempo.js'
8
12
  import * as Cursor from '../../../internal/Cursor.js'
9
13
  import * as Store from '../../../internal/Store.js'
10
14
  import * as Activities from './activities.js'
15
+ import * as Transactions from './transactions.js'
11
16
 
12
17
  // Deterministic EUR-based rate set so conversion math is exact in assertions.
13
18
  const fixed = FxOracle.from({
@@ -297,7 +302,7 @@ describe('GET /addresses/:address/activities', () => {
297
302
  const hash = runtime.fixtures!.faucetTransactionHashes[0]!
298
303
 
299
304
  const response = await client.v1.transactions[':transactionHash'].activities.$get(
300
- { param: { transactionHash: hash }, query: { denomination: 'AUD' } },
305
+ { param: { transactionHash: hash }, query: { 'valuation.currency': 'AUD' } },
301
306
  TestApp.auth,
302
307
  )
303
308
  const body = await TestApp.json(response, Activities.schema.getTransactionActivities.Response)
@@ -314,7 +319,7 @@ describe('GET /addresses/:address/activities', () => {
314
319
  amount: core_Value.format((BigInt(amount.baseUnits) * 16n) / 10n, 6),
315
320
  currency: 'AUD',
316
321
  })
317
- expect(body.meta?.pricing).toMatchInlineSnapshot(`
322
+ expect(body.meta?.valuation).toMatchInlineSnapshot(`
318
323
  {
319
324
  "asOf": "2026-01-01T00:00:00.000Z",
320
325
  "basis": "nominal",
@@ -330,15 +335,86 @@ describe('GET /addresses/:address/activities', () => {
330
335
 
331
336
  test('paginates with an opaque cursor', async () => {
332
337
  const first = await activities(accounts.keychain, { limit: '5' })
338
+ expect(first.nextCursor).toBeTypeOf('string')
333
339
  if (!first.nextCursor) return
334
340
  const response = await request(accounts.keychain, { limit: '5', cursor: first.nextCursor })
335
341
  expect(response.headers.get('cache-control')).toMatchInlineSnapshot(
336
342
  `"private, max-age=60, stale-while-revalidate=300"`,
337
343
  )
338
344
  const second = await TestApp.json(response, Activities.schema.getAddressActivities.Response)
339
- expect(Array.isArray(second.data)).toBe(true)
345
+ const firstHashes = new Set(
346
+ first.data.flatMap((entry) =>
347
+ entry.type === 'group'
348
+ ? entry.data.items.map((item) => item.transactionHash)
349
+ : [entry.transactionHash],
350
+ ),
351
+ )
352
+ const secondHashes = second.data.flatMap((entry) =>
353
+ entry.type === 'group'
354
+ ? entry.data.items.map((item) => item.transactionHash)
355
+ : [entry.transactionHash],
356
+ )
357
+ expect(secondHashes.every((hash) => !firstHashes.has(hash))).toBe(true)
340
358
  })
341
359
 
360
+ test.skipIf(runtime.mode !== 'localnet')(
361
+ 'keeps older activity behind a high-log transaction',
362
+ async () => {
363
+ const account = Tempo.accounts[3]
364
+ const wallet = createClient({
365
+ account,
366
+ chain: Tempo.chain,
367
+ transport: http(Tempo.rpcUrl),
368
+ })
369
+ await Actions.faucet.fundSync(Tempo.client, { account, timeout: 60_000 })
370
+ const approval_result = await Actions.token.approveSync(wallet, {
371
+ amount: 1n,
372
+ spender: Addresses.stablecoinDex,
373
+ token: Addresses.pathUsd,
374
+ })
375
+ const approval = 'receipt' in approval_result ? approval_result.receipt : approval_result
376
+ const highLog = await sendTransactionSync(wallet, {
377
+ account,
378
+ calls: Array.from({ length: 25 }, (_, index) =>
379
+ Actions.token.approve.call(wallet, {
380
+ amount: BigInt(index + 2),
381
+ spender: Addresses.stablecoinDex,
382
+ token: Addresses.pathUsd,
383
+ }),
384
+ ),
385
+ })
386
+ // The legacy `limit * 4` joined-row window stopped inside this transaction
387
+ // and never exposed the older approval to the activity paginator.
388
+ expect(highLog.logs.length).toBeGreaterThan(20)
389
+
390
+ const pending = new Set(
391
+ [approval.transactionHash, highLog.transactionHash].map((hash) => hash.toLowerCase()),
392
+ )
393
+ const deadline = Date.now() + 60_000
394
+ while (Date.now() < deadline && pending.size > 0) {
395
+ const response = await client.v1.transactions.$get(
396
+ { query: { limit: '200', sender: account.address } },
397
+ { headers: { 'cache-control': 'no-store', ...TestApp.auth.headers } },
398
+ )
399
+ if (response.status === 200) {
400
+ const body = await TestApp.json(response, Transactions.schema.getTransactions.Response)
401
+ for (const transaction of body.data) pending.delete(transaction.hash.toLowerCase())
402
+ }
403
+ if (pending.size > 0) await new Promise((resolve) => setTimeout(resolve, 250))
404
+ }
405
+ expect(pending).toEqual(new Set())
406
+
407
+ const body = await activities(account.address, { limit: '5' })
408
+ expect(
409
+ body.data.some(
410
+ (entry) =>
411
+ entry.type === 'approval' && entry.transactionHash === approval.transactionHash,
412
+ ),
413
+ ).toBe(true)
414
+ },
415
+ 120_000,
416
+ )
417
+
342
418
  test('validates denominations on empty feeds', async () => {
343
419
  const client = TestApp.client({ fx: { oracle: fixed } })
344
420
  const cursor = Cursor.encode([0, 0])
@@ -353,7 +429,7 @@ describe('GET /addresses/:address/activities', () => {
353
429
  const response = await client.v1.addresses[':address'].activities.$get(
354
430
  {
355
431
  param: { address: accounts.keychain },
356
- query: { cursor, denomination: 'JPY', limit: '5' },
432
+ query: { cursor, limit: '5', 'valuation.currency': 'JPY' },
357
433
  },
358
434
  TestApp.auth,
359
435
  )