tapimo 0.14.0 → 0.15.1

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 (1160) hide show
  1. package/README.md +7 -4
  2. package/dist/ApiKey.js +1 -1
  3. package/dist/ApiKey.js.map +1 -1
  4. package/dist/ApiKeys.d.ts +95 -14
  5. package/dist/ApiKeys.d.ts.map +1 -1
  6. package/dist/ApiKeys.js +360 -49
  7. package/dist/ApiKeys.js.map +1 -1
  8. package/dist/App.d.ts +12466 -10374
  9. package/dist/App.d.ts.map +1 -1
  10. package/dist/App.js +300 -22
  11. package/dist/App.js.map +1 -1
  12. package/dist/Assets.d.ts.map +1 -1
  13. package/dist/Assets.js +2 -1
  14. package/dist/Assets.js.map +1 -1
  15. package/dist/Handler.d.ts +0 -1
  16. package/dist/Handler.d.ts.map +1 -1
  17. package/dist/Handler.js +0 -1
  18. package/dist/Handler.js.map +1 -1
  19. package/dist/Scope.d.ts +13 -5
  20. package/dist/Scope.d.ts.map +1 -1
  21. package/dist/Scope.js +16 -5
  22. package/dist/Scope.js.map +1 -1
  23. package/dist/Webhooks.js +1 -1
  24. package/dist/Webhooks.js.map +1 -1
  25. package/dist/admin/App.d.ts +3057 -546
  26. package/dist/admin/App.d.ts.map +1 -1
  27. package/dist/admin/App.js +26 -5
  28. package/dist/admin/App.js.map +1 -1
  29. package/dist/admin/apps/api-keys.d.ts +179 -27
  30. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  31. package/dist/admin/apps/api-keys.js +95 -43
  32. package/dist/admin/apps/api-keys.js.map +1 -1
  33. package/dist/admin/apps/earn-vaults.d.ts +1398 -0
  34. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  35. package/dist/admin/apps/earn-vaults.js +463 -7
  36. package/dist/admin/apps/earn-vaults.js.map +1 -1
  37. package/dist/admin/apps/organizations.d.ts +267 -15
  38. package/dist/admin/apps/organizations.d.ts.map +1 -1
  39. package/dist/admin/apps/organizations.js +241 -25
  40. package/dist/admin/apps/organizations.js.map +1 -1
  41. package/dist/admin/apps/routes-support.d.ts +95 -0
  42. package/dist/admin/apps/routes-support.d.ts.map +1 -0
  43. package/dist/admin/apps/routes-support.js +151 -0
  44. package/dist/admin/apps/routes-support.js.map +1 -0
  45. package/dist/admin/apps/routes.d.ts +2764 -0
  46. package/dist/admin/apps/routes.d.ts.map +1 -0
  47. package/dist/admin/apps/routes.js +728 -0
  48. package/dist/admin/apps/routes.js.map +1 -0
  49. package/dist/admin/apps/subsidies.d.ts +501 -0
  50. package/dist/admin/apps/subsidies.d.ts.map +1 -0
  51. package/dist/admin/apps/subsidies.js +384 -0
  52. package/dist/admin/apps/subsidies.js.map +1 -0
  53. package/dist/admin/apps/verified-tokens.d.ts +166 -160
  54. package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
  55. package/dist/admin/apps/verified-tokens.js +27 -7
  56. package/dist/admin/apps/verified-tokens.js.map +1 -1
  57. package/dist/admin/ui.generated.d.ts +1 -1
  58. package/dist/admin/ui.generated.d.ts.map +1 -1
  59. package/dist/admin/ui.generated.js +201 -149
  60. package/dist/admin/ui.generated.js.map +1 -1
  61. package/dist/analytics/Analytics.d.ts +5 -2
  62. package/dist/analytics/Analytics.d.ts.map +1 -1
  63. package/dist/analytics/Analytics.js +31 -1
  64. package/dist/analytics/Analytics.js.map +1 -1
  65. package/dist/analytics/tables/requestEvents.d.ts +2 -1
  66. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  67. package/dist/analytics/tables/requestEvents.js +10 -1
  68. package/dist/analytics/tables/requestEvents.js.map +1 -1
  69. package/dist/analytics/tables/routesLifecycleIntervals.d.ts +72 -0
  70. package/dist/analytics/tables/routesLifecycleIntervals.d.ts.map +1 -0
  71. package/dist/analytics/tables/routesLifecycleIntervals.js +56 -0
  72. package/dist/analytics/tables/routesLifecycleIntervals.js.map +1 -0
  73. package/dist/apps/Zones.d.ts +21 -12526
  74. package/dist/apps/Zones.d.ts.map +1 -1
  75. package/dist/apps/Zones.js +37 -5
  76. package/dist/apps/Zones.js.map +1 -1
  77. package/dist/apps/data/App.d.ts +3971 -2595
  78. package/dist/apps/data/App.d.ts.map +1 -1
  79. package/dist/apps/data/App.js +76 -21
  80. package/dist/apps/data/App.js.map +1 -1
  81. package/dist/apps/data/routes/activities.d.ts +629 -299
  82. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  83. package/dist/apps/data/routes/activities.js +495 -190
  84. package/dist/apps/data/routes/activities.js.map +1 -1
  85. package/dist/apps/data/routes/addresses.d.ts +72 -0
  86. package/dist/apps/data/routes/addresses.d.ts.map +1 -1
  87. package/dist/apps/data/routes/blocks.d.ts +116 -116
  88. package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
  89. package/dist/apps/data/routes/coingecko.js +47 -21
  90. package/dist/apps/data/routes/coingecko.js.map +1 -1
  91. package/dist/apps/data/routes/earn.d.ts +1450 -337
  92. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  93. package/dist/apps/data/routes/earn.js +1226 -144
  94. package/dist/apps/data/routes/earn.js.map +1 -1
  95. package/dist/apps/data/routes/fee-amm.d.ts +113 -108
  96. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  97. package/dist/apps/data/routes/fee-amm.js +41 -21
  98. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  99. package/dist/apps/data/routes/indexer.d.ts +142 -17
  100. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  101. package/dist/apps/data/routes/indexer.js +83 -27
  102. package/dist/apps/data/routes/indexer.js.map +1 -1
  103. package/dist/apps/data/routes/receipts.d.ts +235 -235
  104. package/dist/apps/data/routes/rpc.d.ts +507 -33
  105. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  106. package/dist/apps/data/routes/rpc.js +309 -165
  107. package/dist/apps/data/routes/rpc.js.map +1 -1
  108. package/dist/apps/data/routes/tokenlist.d.ts +47 -15
  109. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  110. package/dist/apps/data/routes/tokenlist.js +68 -11
  111. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  112. package/dist/apps/data/routes/tokens.d.ts +2 -0
  113. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  114. package/dist/apps/data/routes/tokens.js +26 -14
  115. package/dist/apps/data/routes/tokens.js.map +1 -1
  116. package/dist/apps/data/routes/transfers.d.ts +93 -77
  117. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  118. package/dist/apps/data/routes/transfers.js +9 -7
  119. package/dist/apps/data/routes/transfers.js.map +1 -1
  120. package/dist/apps/data/routes/valuation.d.ts +32 -32
  121. package/dist/apps/data/routes/verified-tokens.d.ts +88 -88
  122. package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -1
  123. package/dist/apps/data/routes/verified-tokens.js +64 -20
  124. package/dist/apps/data/routes/verified-tokens.js.map +1 -1
  125. package/dist/apps/data/routes/webhooks.d.ts +614 -177
  126. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  127. package/dist/apps/data/routes/webhooks.js +308 -205
  128. package/dist/apps/data/routes/webhooks.js.map +1 -1
  129. package/dist/apps/data/routes/zones.d.ts +31 -31
  130. package/dist/apps/data/routes/zones.d.ts.map +1 -1
  131. package/dist/apps/data/routes/zones.js +20 -12
  132. package/dist/apps/data/routes/zones.js.map +1 -1
  133. package/dist/apps/docs/reference.js +2 -2
  134. package/dist/apps/docs/reference.js.map +1 -1
  135. package/dist/apps/index.d.ts +1 -1
  136. package/dist/apps/index.d.ts.map +1 -1
  137. package/dist/apps/index.js +1 -1
  138. package/dist/apps/index.js.map +1 -1
  139. package/dist/apps/management/App.d.ts +3780 -3402
  140. package/dist/apps/management/App.d.ts.map +1 -1
  141. package/dist/apps/management/App.js +5 -14
  142. package/dist/apps/management/App.js.map +1 -1
  143. package/dist/apps/management/Billing.d.ts +48 -7
  144. package/dist/apps/management/Billing.d.ts.map +1 -1
  145. package/dist/apps/management/Billing.js +204 -25
  146. package/dist/apps/management/Billing.js.map +1 -1
  147. package/dist/apps/management/routes/api-keys.d.ts +317 -215
  148. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  149. package/dist/apps/management/routes/api-keys.js +43 -15
  150. package/dist/apps/management/routes/api-keys.js.map +1 -1
  151. package/dist/apps/management/routes/billing.d.ts +290 -4
  152. package/dist/apps/management/routes/billing.d.ts.map +1 -1
  153. package/dist/apps/management/routes/billing.js +274 -49
  154. package/dist/apps/management/routes/billing.js.map +1 -1
  155. package/dist/apps/management/routes/faucet.d.ts +6 -6
  156. package/dist/apps/management/routes/faucet.js +1 -1
  157. package/dist/apps/management/routes/faucet.js.map +1 -1
  158. package/dist/apps/management/routes/invitations.d.ts +213 -138
  159. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  160. package/dist/apps/management/routes/invitations.js +117 -13
  161. package/dist/apps/management/routes/invitations.js.map +1 -1
  162. package/dist/apps/management/routes/invite-links.d.ts +166 -166
  163. package/dist/apps/management/routes/me.d.ts.map +1 -1
  164. package/dist/apps/management/routes/me.js +6 -2
  165. package/dist/apps/management/routes/me.js.map +1 -1
  166. package/dist/apps/management/routes/members.d.ts +30 -30
  167. package/dist/apps/management/routes/orgs.d.ts +103 -87
  168. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  169. package/dist/apps/management/routes/orgs.js +52 -12
  170. package/dist/apps/management/routes/orgs.js.map +1 -1
  171. package/dist/apps/management/routes/projects.d.ts +125 -125
  172. package/dist/apps/management/routes/projects.d.ts.map +1 -1
  173. package/dist/apps/management/routes/projects.js +6 -1
  174. package/dist/apps/management/routes/projects.js.map +1 -1
  175. package/dist/apps/management/routes/scopes.d.ts.map +1 -1
  176. package/dist/apps/management/routes/scopes.js +4 -1
  177. package/dist/apps/management/routes/scopes.js.map +1 -1
  178. package/dist/apps/management/routes/usage.d.ts +24 -24
  179. package/dist/apps/management/routes/usage.js +21 -4
  180. package/dist/apps/management/routes/usage.js.map +1 -1
  181. package/dist/apps/management/routes/verified-token-requests.d.ts +95 -95
  182. package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
  183. package/dist/apps/management/routes/verified-token-requests.js +7 -9
  184. package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
  185. package/dist/apps/management/routes/webhooks.d.ts +682 -616
  186. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  187. package/dist/apps/management/routes/webhooks.js +58 -12
  188. package/dist/apps/management/routes/webhooks.js.map +1 -1
  189. package/dist/apps/mcp.d.ts +1 -1
  190. package/dist/apps/mcp.d.ts.map +1 -1
  191. package/dist/apps/mcp.js +23 -10
  192. package/dist/apps/mcp.js.map +1 -1
  193. package/dist/apps/mpp/App.d.ts +44 -44
  194. package/dist/apps/mpp/App.d.ts.map +1 -1
  195. package/dist/apps/mpp/App.js +35 -7
  196. package/dist/apps/mpp/App.js.map +1 -1
  197. package/dist/apps/mpp/internal/Adapter.d.ts +2 -0
  198. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -1
  199. package/dist/apps/mpp/internal/Adapter.js +30 -1
  200. package/dist/apps/mpp/internal/Adapter.js.map +1 -1
  201. package/dist/apps/mpp/internal/Policy.d.ts +22 -4
  202. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
  203. package/dist/apps/mpp/internal/Policy.js +24 -6
  204. package/dist/apps/mpp/internal/Policy.js.map +1 -1
  205. package/dist/apps/mpp/internal/Sponsorship.d.ts +3 -0
  206. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
  207. package/dist/apps/mpp/internal/Sponsorship.js +6 -3
  208. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
  209. package/dist/apps/relay/App.d.ts +2 -0
  210. package/dist/apps/relay/App.d.ts.map +1 -1
  211. package/dist/apps/relay/App.js +134 -75
  212. package/dist/apps/relay/App.js.map +1 -1
  213. package/dist/apps/relay/Sponsorships.d.ts +5 -3
  214. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  215. package/dist/apps/relay/Sponsorships.js +209 -28
  216. package/dist/apps/relay/Sponsorships.js.map +1 -1
  217. package/dist/apps/{funding → routes}/Access.d.ts +4 -4
  218. package/dist/apps/routes/Access.d.ts.map +1 -0
  219. package/dist/apps/{funding → routes}/Access.js +4 -4
  220. package/dist/apps/routes/Access.js.map +1 -0
  221. package/dist/apps/{funding → routes}/App.d.ts +418 -124
  222. package/dist/apps/{funding → routes}/App.d.ts.map +1 -1
  223. package/dist/apps/{funding → routes}/App.js +16 -16
  224. package/dist/apps/routes/App.js.map +1 -0
  225. package/dist/apps/routes/Inventory.d.ts.map +1 -0
  226. package/dist/apps/{funding → routes}/Inventory.js +2 -2
  227. package/dist/apps/routes/Inventory.js.map +1 -0
  228. package/dist/apps/routes/index.d.ts +2 -0
  229. package/dist/apps/routes/index.d.ts.map +1 -0
  230. package/dist/apps/routes/index.js +2 -0
  231. package/dist/apps/routes/index.js.map +1 -0
  232. package/dist/apps/{funding → routes}/routes/chains.d.ts +32 -32
  233. package/dist/apps/routes/routes/chains.d.ts.map +1 -0
  234. package/dist/apps/{funding → routes}/routes/chains.js +25 -25
  235. package/dist/apps/routes/routes/chains.js.map +1 -0
  236. package/dist/apps/{funding → routes}/routes/deposit-addresses.d.ts +107 -43
  237. package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -0
  238. package/dist/apps/{funding → routes}/routes/deposit-addresses.js +497 -222
  239. package/dist/apps/routes/routes/deposit-addresses.js.map +1 -0
  240. package/dist/apps/{funding → routes}/routes/providers.d.ts +8 -8
  241. package/dist/apps/routes/routes/providers.d.ts.map +1 -0
  242. package/dist/apps/routes/routes/providers.js +57 -0
  243. package/dist/apps/routes/routes/providers.js.map +1 -0
  244. package/dist/apps/{funding → routes}/routes/quotes.d.ts +106 -103
  245. package/dist/apps/routes/routes/quotes.d.ts.map +1 -0
  246. package/dist/apps/{funding → routes}/routes/quotes.js +55 -38
  247. package/dist/apps/routes/routes/quotes.js.map +1 -0
  248. package/dist/apps/{funding → routes}/routes/transfers.d.ts +733 -428
  249. package/dist/apps/routes/routes/transfers.d.ts.map +1 -0
  250. package/dist/apps/routes/routes/transfers.js +1140 -0
  251. package/dist/apps/routes/routes/transfers.js.map +1 -0
  252. package/dist/cli/Cli.d.ts +30 -0
  253. package/dist/cli/Cli.d.ts.map +1 -1
  254. package/dist/cli/commands/admin.d.ts +36 -0
  255. package/dist/cli/commands/admin.d.ts.map +1 -1
  256. package/dist/cli/commands/admin.js +273 -0
  257. package/dist/cli/commands/admin.js.map +1 -1
  258. package/dist/cloudflare.d.ts +16 -14
  259. package/dist/cloudflare.d.ts.map +1 -1
  260. package/dist/cloudflare.js +26 -21
  261. package/dist/cloudflare.js.map +1 -1
  262. package/dist/db/Db.d.ts +63 -21
  263. package/dist/db/Db.d.ts.map +1 -1
  264. package/dist/db/Db.js +1035 -15
  265. package/dist/db/Db.js.map +1 -1
  266. package/dist/db/Schema.d.ts +780 -133
  267. package/dist/db/Schema.d.ts.map +1 -1
  268. package/dist/db/Schema.js +575 -162
  269. package/dist/db/Schema.js.map +1 -1
  270. package/dist/db/tables/apiKeyAdmissionBootstraps.d.ts +4 -0
  271. package/dist/db/tables/apiKeyAdmissionBootstraps.d.ts.map +1 -0
  272. package/dist/db/tables/apiKeyAdmissionBootstraps.js +2 -0
  273. package/dist/db/tables/apiKeyAdmissionBootstraps.js.map +1 -0
  274. package/dist/db/tables/apiKeyAdmissions.d.ts +73 -0
  275. package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -0
  276. package/dist/db/tables/apiKeyAdmissions.js +142 -0
  277. package/dist/db/tables/apiKeyAdmissions.js.map +1 -0
  278. package/dist/db/tables/apiKeyOwnerAdmissions.d.ts +4 -0
  279. package/dist/db/tables/apiKeyOwnerAdmissions.d.ts.map +1 -0
  280. package/dist/db/tables/apiKeyOwnerAdmissions.js +2 -0
  281. package/dist/db/tables/apiKeyOwnerAdmissions.js.map +1 -0
  282. package/dist/db/tables/apiKeyOwnerTombstones.d.ts +20 -0
  283. package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -0
  284. package/dist/db/tables/apiKeyOwnerTombstones.js +57 -0
  285. package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -0
  286. package/dist/db/tables/apiKeyRevocations.d.ts +21 -0
  287. package/dist/db/tables/apiKeyRevocations.d.ts.map +1 -0
  288. package/dist/db/tables/apiKeyRevocations.js +98 -0
  289. package/dist/db/tables/apiKeyRevocations.js.map +1 -0
  290. package/dist/db/tables/authAccounts.d.ts +47 -0
  291. package/dist/db/tables/authAccounts.d.ts.map +1 -0
  292. package/dist/db/tables/authAccounts.js +72 -0
  293. package/dist/db/tables/authAccounts.js.map +1 -0
  294. package/dist/db/tables/authSessions.d.ts +12 -0
  295. package/dist/db/tables/authSessions.d.ts.map +1 -0
  296. package/dist/db/tables/authSessions.js +2 -0
  297. package/dist/db/tables/authSessions.js.map +1 -0
  298. package/dist/db/tables/authVerifications.d.ts +12 -0
  299. package/dist/db/tables/authVerifications.d.ts.map +1 -0
  300. package/dist/db/tables/authVerifications.js +2 -0
  301. package/dist/db/tables/authVerifications.js.map +1 -0
  302. package/dist/db/tables/invitations.d.ts +17 -1
  303. package/dist/db/tables/invitations.d.ts.map +1 -1
  304. package/dist/db/tables/invitations.js +123 -43
  305. package/dist/db/tables/invitations.js.map +1 -1
  306. package/dist/db/tables/memberships.d.ts +8 -0
  307. package/dist/db/tables/memberships.d.ts.map +1 -1
  308. package/dist/db/tables/memberships.js +51 -2
  309. package/dist/db/tables/memberships.js.map +1 -1
  310. package/dist/db/tables/organizations.d.ts +32 -10
  311. package/dist/db/tables/organizations.d.ts.map +1 -1
  312. package/dist/db/tables/organizations.js +110 -49
  313. package/dist/db/tables/organizations.js.map +1 -1
  314. package/dist/db/tables/projects.d.ts +2 -0
  315. package/dist/db/tables/projects.d.ts.map +1 -1
  316. package/dist/db/tables/projects.js +12 -3
  317. package/dist/db/tables/projects.js.map +1 -1
  318. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  319. package/dist/db/tables/requestUsage.js.map +1 -1
  320. package/dist/db/tables/rewardAccounts.d.ts +86 -0
  321. package/dist/db/tables/rewardAccounts.d.ts.map +1 -0
  322. package/dist/db/tables/rewardAccounts.js +88 -0
  323. package/dist/db/tables/rewardAccounts.js.map +1 -0
  324. package/dist/db/tables/rewardCampaignDistributors.d.ts +36 -0
  325. package/dist/db/tables/rewardCampaignDistributors.d.ts.map +1 -0
  326. package/dist/db/tables/rewardCampaignDistributors.js +30 -0
  327. package/dist/db/tables/rewardCampaignDistributors.js.map +1 -0
  328. package/dist/db/tables/rewardCampaigns.d.ts +171 -0
  329. package/dist/db/tables/rewardCampaigns.d.ts.map +1 -0
  330. package/dist/db/tables/rewardCampaigns.js +392 -0
  331. package/dist/db/tables/rewardCampaigns.js.map +1 -0
  332. package/dist/db/tables/rewardCredits.d.ts +53 -0
  333. package/dist/db/tables/rewardCredits.d.ts.map +1 -0
  334. package/dist/db/tables/rewardCredits.js +63 -0
  335. package/dist/db/tables/rewardCredits.js.map +1 -0
  336. package/dist/db/tables/rewardEligibilityAssociations.d.ts +61 -0
  337. package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -0
  338. package/dist/db/tables/rewardEligibilityAssociations.js +103 -0
  339. package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -0
  340. package/dist/db/tables/rewardRuns.d.ts +188 -0
  341. package/dist/db/tables/rewardRuns.d.ts.map +1 -0
  342. package/dist/db/tables/rewardRuns.js +278 -0
  343. package/dist/db/tables/rewardRuns.js.map +1 -0
  344. package/dist/db/tables/rewardTransactionAttempts.d.ts +100 -0
  345. package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -0
  346. package/dist/db/tables/rewardTransactionAttempts.js +163 -0
  347. package/dist/db/tables/rewardTransactionAttempts.js.map +1 -0
  348. package/dist/db/tables/routesCatalog.d.ts +58 -0
  349. package/dist/db/tables/routesCatalog.d.ts.map +1 -0
  350. package/dist/db/tables/{fundingCatalog.js → routesCatalog.js} +19 -19
  351. package/dist/db/tables/routesCatalog.js.map +1 -0
  352. package/dist/db/tables/routesDepositAddresses.d.ts +476 -0
  353. package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -0
  354. package/dist/db/tables/routesDepositAddresses.js +587 -0
  355. package/dist/db/tables/routesDepositAddresses.js.map +1 -0
  356. package/dist/db/tables/{fundingDepositRequestObservations.d.ts → routesDepositRequestObservations.d.ts} +6 -6
  357. package/dist/db/tables/routesDepositRequestObservations.d.ts.map +1 -0
  358. package/dist/db/tables/{fundingDepositRequestObservations.js → routesDepositRequestObservations.js} +6 -6
  359. package/dist/db/tables/routesDepositRequestObservations.js.map +1 -0
  360. package/dist/db/tables/{fundingDeposits.d.ts → routesDeposits.d.ts} +210 -22
  361. package/dist/db/tables/routesDeposits.d.ts.map +1 -0
  362. package/dist/db/tables/routesDeposits.js +576 -0
  363. package/dist/db/tables/routesDeposits.js.map +1 -0
  364. package/dist/db/tables/routesIdempotency.d.ts +166 -0
  365. package/dist/db/tables/routesIdempotency.d.ts.map +1 -0
  366. package/dist/db/tables/routesIdempotency.js +330 -0
  367. package/dist/db/tables/routesIdempotency.js.map +1 -0
  368. package/dist/db/tables/routesSubsidies.d.ts +27 -0
  369. package/dist/db/tables/routesSubsidies.d.ts.map +1 -0
  370. package/dist/db/tables/routesSubsidies.js +45 -0
  371. package/dist/db/tables/routesSubsidies.js.map +1 -0
  372. package/dist/db/tables/{fundingTransferEvents.d.ts → routesTransferEvents.d.ts} +3 -3
  373. package/dist/db/tables/routesTransferEvents.d.ts.map +1 -0
  374. package/dist/db/tables/{fundingTransferEvents.js → routesTransferEvents.js} +3 -3
  375. package/dist/db/tables/routesTransferEvents.js.map +1 -0
  376. package/dist/db/tables/routesTransferSubsidies.d.ts +19 -0
  377. package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -0
  378. package/dist/db/tables/routesTransferSubsidies.js +17 -0
  379. package/dist/db/tables/routesTransferSubsidies.js.map +1 -0
  380. package/dist/db/tables/routesTransferSubsidyNonces.d.ts +51 -0
  381. package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -0
  382. package/dist/db/tables/routesTransferSubsidyNonces.js +82 -0
  383. package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -0
  384. package/dist/db/tables/routesTransferTransactions.d.ts +77 -0
  385. package/dist/db/tables/routesTransferTransactions.d.ts.map +1 -0
  386. package/dist/db/tables/{fundingTransferTransactions.js → routesTransferTransactions.js} +31 -13
  387. package/dist/db/tables/routesTransferTransactions.js.map +1 -0
  388. package/dist/db/tables/routesTransfers.d.ts +319 -0
  389. package/dist/db/tables/routesTransfers.d.ts.map +1 -0
  390. package/dist/db/tables/routesTransfers.js +372 -0
  391. package/dist/db/tables/routesTransfers.js.map +1 -0
  392. package/dist/db/tables/sponsoredTransactions.d.ts +75 -20
  393. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  394. package/dist/db/tables/sponsoredTransactions.js +124 -54
  395. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  396. package/dist/db/tables/sponsorshipAttributions.d.ts +69 -0
  397. package/dist/db/tables/sponsorshipAttributions.d.ts.map +1 -0
  398. package/dist/db/tables/sponsorshipAttributions.js +77 -0
  399. package/dist/db/tables/sponsorshipAttributions.js.map +1 -0
  400. package/dist/db/tables/sponsorshipReconciliationCursors.d.ts +22 -0
  401. package/dist/db/tables/sponsorshipReconciliationCursors.d.ts.map +1 -0
  402. package/dist/db/tables/sponsorshipReconciliationCursors.js +45 -0
  403. package/dist/db/tables/sponsorshipReconciliationCursors.js.map +1 -0
  404. package/dist/db/tables/stripeCustomers.d.ts +11 -0
  405. package/dist/db/tables/stripeCustomers.d.ts.map +1 -1
  406. package/dist/db/tables/stripeCustomers.js +13 -0
  407. package/dist/db/tables/stripeCustomers.js.map +1 -1
  408. package/dist/db/tables/users.d.ts +17 -1
  409. package/dist/db/tables/users.d.ts.map +1 -1
  410. package/dist/db/tables/users.js +47 -2
  411. package/dist/db/tables/users.js.map +1 -1
  412. package/dist/db/tables/verifiedTokenRequests.d.ts +21 -4
  413. package/dist/db/tables/verifiedTokenRequests.d.ts.map +1 -1
  414. package/dist/db/tables/verifiedTokenRequests.js +65 -44
  415. package/dist/db/tables/verifiedTokenRequests.js.map +1 -1
  416. package/dist/db/tables/webhookQueueEvents.d.ts.map +1 -1
  417. package/dist/db/tables/webhookQueueEvents.js +5 -1
  418. package/dist/db/tables/webhookQueueEvents.js.map +1 -1
  419. package/dist/db/tables/webhookSubscriptions.d.ts +19 -11
  420. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  421. package/dist/db/tables/webhookSubscriptions.js +45 -13
  422. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  423. package/dist/handlers/internal/executionError.d.ts +2 -2
  424. package/dist/handlers/internal/executionError.d.ts.map +1 -1
  425. package/dist/handlers/internal/executionError.js +1 -2
  426. package/dist/handlers/internal/executionError.js.map +1 -1
  427. package/dist/handlers/internal/multisig.d.ts +4 -232
  428. package/dist/handlers/internal/multisig.d.ts.map +1 -1
  429. package/dist/handlers/internal/multisig.js +11 -537
  430. package/dist/handlers/internal/multisig.js.map +1 -1
  431. package/dist/handlers/internal/sponsorship.d.ts +19 -8
  432. package/dist/handlers/internal/sponsorship.d.ts.map +1 -1
  433. package/dist/handlers/internal/sponsorship.js +13 -9
  434. package/dist/handlers/internal/sponsorship.js.map +1 -1
  435. package/dist/handlers/relay.d.ts +9 -12
  436. package/dist/handlers/relay.d.ts.map +1 -1
  437. package/dist/handlers/relay.js +81 -85
  438. package/dist/handlers/relay.js.map +1 -1
  439. package/dist/index.d.ts +0 -17
  440. package/dist/index.d.ts.map +1 -1
  441. package/dist/index.js +0 -17
  442. package/dist/index.js.map +1 -1
  443. package/dist/internal/AssetResponse.d.ts +12 -0
  444. package/dist/internal/AssetResponse.d.ts.map +1 -0
  445. package/dist/internal/AssetResponse.js +21 -0
  446. package/dist/internal/AssetResponse.js.map +1 -0
  447. package/dist/internal/Auth.d.ts +64 -12
  448. package/dist/internal/Auth.d.ts.map +1 -1
  449. package/dist/internal/Auth.js +631 -180
  450. package/dist/internal/Auth.js.map +1 -1
  451. package/dist/internal/BetterAuth.d.ts +1488 -0
  452. package/dist/internal/BetterAuth.d.ts.map +1 -0
  453. package/dist/internal/BetterAuth.js +253 -0
  454. package/dist/internal/BetterAuth.js.map +1 -0
  455. package/dist/internal/Cache.d.ts +2 -0
  456. package/dist/internal/Cache.d.ts.map +1 -1
  457. package/dist/internal/Cache.js +2 -0
  458. package/dist/internal/Cache.js.map +1 -1
  459. package/dist/internal/EarnRates.d.ts +26 -3
  460. package/dist/internal/EarnRates.d.ts.map +1 -1
  461. package/dist/internal/EarnRates.js +84 -19
  462. package/dist/internal/EarnRates.js.map +1 -1
  463. package/dist/internal/EarnSharePrices.d.ts +120 -0
  464. package/dist/internal/EarnSharePrices.d.ts.map +1 -0
  465. package/dist/internal/EarnSharePrices.js +179 -0
  466. package/dist/internal/EarnSharePrices.js.map +1 -0
  467. package/dist/internal/EarnVaults.d.ts +4 -0
  468. package/dist/internal/EarnVaults.d.ts.map +1 -1
  469. package/dist/internal/EarnVaults.js +27 -10
  470. package/dist/internal/EarnVaults.js.map +1 -1
  471. package/dist/internal/Email.d.ts +37 -0
  472. package/dist/internal/Email.d.ts.map +1 -0
  473. package/dist/internal/Email.js +16 -0
  474. package/dist/internal/Email.js.map +1 -0
  475. package/dist/internal/Log.d.ts +32 -28
  476. package/dist/internal/Log.d.ts.map +1 -1
  477. package/dist/internal/Log.js +18 -11
  478. package/dist/internal/Log.js.map +1 -1
  479. package/dist/internal/MetricSink.d.ts +3 -0
  480. package/dist/internal/MetricSink.d.ts.map +1 -1
  481. package/dist/internal/MetricSink.js +67 -8
  482. package/dist/internal/MetricSink.js.map +1 -1
  483. package/dist/internal/Mpp.d.ts.map +1 -1
  484. package/dist/internal/Mpp.js +20 -25
  485. package/dist/internal/Mpp.js.map +1 -1
  486. package/dist/internal/OpenApi.d.ts +26 -3
  487. package/dist/internal/OpenApi.d.ts.map +1 -1
  488. package/dist/internal/OpenApi.js +25 -10
  489. package/dist/internal/OpenApi.js.map +1 -1
  490. package/dist/internal/Provider.d.ts +1 -1
  491. package/dist/internal/Provider.d.ts.map +1 -1
  492. package/dist/internal/RateLimit.d.ts.map +1 -1
  493. package/dist/internal/RateLimit.js +13 -1
  494. package/dist/internal/RateLimit.js.map +1 -1
  495. package/dist/internal/Store.d.ts +16 -0
  496. package/dist/internal/Store.d.ts.map +1 -1
  497. package/dist/internal/Store.js +59 -8
  498. package/dist/internal/Store.js.map +1 -1
  499. package/dist/internal/Tidx.d.ts +9 -2
  500. package/dist/internal/Tidx.d.ts.map +1 -1
  501. package/dist/internal/Tidx.js +78 -11
  502. package/dist/internal/Tidx.js.map +1 -1
  503. package/dist/internal/Timing.d.ts +26 -0
  504. package/dist/internal/Timing.d.ts.map +1 -1
  505. package/dist/internal/Timing.js +63 -5
  506. package/dist/internal/Timing.js.map +1 -1
  507. package/dist/internal/VercelOidc.d.ts +94 -0
  508. package/dist/internal/VercelOidc.d.ts.map +1 -0
  509. package/dist/internal/VercelOidc.js +128 -0
  510. package/dist/internal/VercelOidc.js.map +1 -0
  511. package/dist/internal/VerifiedTokens.d.ts +2 -8
  512. package/dist/internal/VerifiedTokens.d.ts.map +1 -1
  513. package/dist/internal/VerifiedTokens.js +24 -24
  514. package/dist/internal/VerifiedTokens.js.map +1 -1
  515. package/dist/internal/Viem.d.ts +30 -2067
  516. package/dist/internal/Viem.d.ts.map +1 -1
  517. package/dist/internal/Viem.js +167 -17
  518. package/dist/internal/Viem.js.map +1 -1
  519. package/dist/internal/Webhooks.d.ts +12 -4
  520. package/dist/internal/Webhooks.d.ts.map +1 -1
  521. package/dist/internal/Webhooks.js +9 -3
  522. package/dist/internal/Webhooks.js.map +1 -1
  523. package/dist/internal/ZoneRpc.d.ts +7 -0
  524. package/dist/internal/ZoneRpc.d.ts.map +1 -0
  525. package/dist/internal/ZoneRpc.js +49 -0
  526. package/dist/internal/ZoneRpc.js.map +1 -0
  527. package/dist/internal/index.d.ts +3 -1
  528. package/dist/internal/index.d.ts.map +1 -1
  529. package/dist/internal/index.js +3 -1
  530. package/dist/internal/index.js.map +1 -1
  531. package/dist/internal/rewards/Audit.d.ts +88 -0
  532. package/dist/internal/rewards/Audit.d.ts.map +1 -0
  533. package/dist/internal/rewards/Audit.js +134 -0
  534. package/dist/internal/rewards/Audit.js.map +1 -0
  535. package/dist/internal/rewards/Campaigns.d.ts +572 -0
  536. package/dist/internal/rewards/Campaigns.d.ts.map +1 -0
  537. package/dist/internal/rewards/Campaigns.js +531 -0
  538. package/dist/internal/rewards/Campaigns.js.map +1 -0
  539. package/dist/internal/rewards/Credits.d.ts +76 -0
  540. package/dist/internal/rewards/Credits.d.ts.map +1 -0
  541. package/dist/internal/rewards/Credits.js +95 -0
  542. package/dist/internal/rewards/Credits.js.map +1 -0
  543. package/dist/internal/rewards/Events.d.ts +100 -0
  544. package/dist/internal/rewards/Events.d.ts.map +1 -0
  545. package/dist/internal/rewards/Events.js +340 -0
  546. package/dist/internal/rewards/Events.js.map +1 -0
  547. package/dist/internal/rewards/Projection.d.ts +237 -0
  548. package/dist/internal/rewards/Projection.d.ts.map +1 -0
  549. package/dist/internal/rewards/Projection.js +616 -0
  550. package/dist/internal/rewards/Projection.js.map +1 -0
  551. package/dist/internal/rewards/Rates.d.ts +44 -0
  552. package/dist/internal/rewards/Rates.d.ts.map +1 -0
  553. package/dist/internal/rewards/Rates.js +60 -0
  554. package/dist/internal/rewards/Rates.js.map +1 -0
  555. package/dist/internal/rewards/Read.d.ts +158 -0
  556. package/dist/internal/rewards/Read.d.ts.map +1 -0
  557. package/dist/internal/rewards/Read.js +292 -0
  558. package/dist/internal/rewards/Read.js.map +1 -0
  559. package/dist/internal/rewards/Runner.d.ts +164 -0
  560. package/dist/internal/rewards/Runner.d.ts.map +1 -0
  561. package/dist/internal/rewards/Runner.js +1778 -0
  562. package/dist/internal/rewards/Runner.js.map +1 -0
  563. package/dist/internal/rewards/Signer.d.ts +224 -0
  564. package/dist/internal/rewards/Signer.d.ts.map +1 -0
  565. package/dist/internal/rewards/Signer.js +135 -0
  566. package/dist/internal/rewards/Signer.js.map +1 -0
  567. package/dist/internal/rewards/index.d.ts +15 -0
  568. package/dist/internal/rewards/index.d.ts.map +1 -0
  569. package/dist/internal/rewards/index.js +15 -0
  570. package/dist/internal/rewards/index.js.map +1 -0
  571. package/dist/internal/{funding → routes}/Action.d.ts +12 -1
  572. package/dist/internal/routes/Action.d.ts.map +1 -0
  573. package/dist/internal/{funding → routes}/Action.js +17 -9
  574. package/dist/internal/routes/Action.js.map +1 -0
  575. package/dist/internal/{funding → routes}/Catalog.d.ts +20 -20
  576. package/dist/internal/routes/Catalog.d.ts.map +1 -0
  577. package/dist/internal/{funding → routes}/Catalog.js +29 -29
  578. package/dist/internal/routes/Catalog.js.map +1 -0
  579. package/dist/internal/{funding → routes}/Chain.d.ts +10 -10
  580. package/dist/internal/routes/Chain.d.ts.map +1 -0
  581. package/dist/internal/{funding → routes}/Chain.js +3 -3
  582. package/dist/internal/routes/Chain.js.map +1 -0
  583. package/dist/internal/{funding → routes}/Deposit.d.ts +45 -23
  584. package/dist/internal/routes/Deposit.d.ts.map +1 -0
  585. package/dist/internal/{funding → routes}/Deposit.js +60 -27
  586. package/dist/internal/routes/Deposit.js.map +1 -0
  587. package/dist/internal/{funding → routes}/DepositAddress.d.ts +56 -27
  588. package/dist/internal/routes/DepositAddress.d.ts.map +1 -0
  589. package/dist/internal/{funding → routes}/DepositAddress.js +95 -33
  590. package/dist/internal/routes/DepositAddress.js.map +1 -0
  591. package/dist/internal/{funding → routes}/DepositWebhook.d.ts +4 -4
  592. package/dist/internal/routes/DepositWebhook.d.ts.map +1 -0
  593. package/dist/internal/{funding → routes}/DepositWebhook.js +4 -4
  594. package/dist/internal/routes/DepositWebhook.js.map +1 -0
  595. package/dist/internal/routes/Economics.d.ts +25 -0
  596. package/dist/internal/routes/Economics.d.ts.map +1 -0
  597. package/dist/internal/routes/Economics.js +28 -0
  598. package/dist/internal/routes/Economics.js.map +1 -0
  599. package/dist/internal/{funding → routes}/Evidence.d.ts +3 -3
  600. package/dist/internal/routes/Evidence.d.ts.map +1 -0
  601. package/dist/internal/{funding → routes}/Evidence.js +7 -7
  602. package/dist/internal/routes/Evidence.js.map +1 -0
  603. package/dist/internal/routes/Observability.d.ts +154 -0
  604. package/dist/internal/routes/Observability.d.ts.map +1 -0
  605. package/dist/internal/routes/Observability.js +389 -0
  606. package/dist/internal/routes/Observability.js.map +1 -0
  607. package/dist/internal/{funding → routes}/Provider.d.ts +311 -105
  608. package/dist/internal/routes/Provider.d.ts.map +1 -0
  609. package/dist/internal/{funding → routes}/Provider.js +229 -98
  610. package/dist/internal/routes/Provider.js.map +1 -0
  611. package/dist/internal/{funding → routes}/Reconciliation.d.ts +11 -6
  612. package/dist/internal/routes/Reconciliation.d.ts.map +1 -0
  613. package/dist/internal/{funding → routes}/Reconciliation.js +408 -158
  614. package/dist/internal/routes/Reconciliation.js.map +1 -0
  615. package/dist/internal/routes/Route.d.ts +21 -0
  616. package/dist/internal/routes/Route.d.ts.map +1 -0
  617. package/dist/internal/{funding → routes}/Route.js +1 -1
  618. package/dist/internal/routes/Route.js.map +1 -0
  619. package/dist/internal/{funding → routes}/SourceObservation.d.ts +6 -6
  620. package/dist/internal/routes/SourceObservation.d.ts.map +1 -0
  621. package/dist/internal/{funding → routes}/SourceObservation.js +8 -8
  622. package/dist/internal/routes/SourceObservation.js.map +1 -0
  623. package/dist/internal/{funding → routes}/Subsidy.d.ts +48 -3
  624. package/dist/internal/routes/Subsidy.d.ts.map +1 -0
  625. package/dist/internal/{funding → routes}/Subsidy.js +43 -3
  626. package/dist/internal/routes/Subsidy.js.map +1 -0
  627. package/dist/internal/{funding → routes}/Token.d.ts +4 -4
  628. package/dist/internal/routes/Token.d.ts.map +1 -0
  629. package/dist/internal/{funding → routes}/Token.js +3 -3
  630. package/dist/internal/routes/Token.js.map +1 -0
  631. package/dist/internal/{funding → routes}/Transfer.d.ts +241 -46
  632. package/dist/internal/routes/Transfer.d.ts.map +1 -0
  633. package/dist/internal/routes/Transfer.js +728 -0
  634. package/dist/internal/routes/Transfer.js.map +1 -0
  635. package/dist/internal/{funding → routes}/TransferReconciliation.d.ts +13 -10
  636. package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -0
  637. package/dist/internal/routes/TransferReconciliation.js +422 -0
  638. package/dist/internal/routes/TransferReconciliation.js.map +1 -0
  639. package/dist/internal/routes/TransferSubsidy.d.ts +201 -0
  640. package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -0
  641. package/dist/internal/routes/TransferSubsidy.js +256 -0
  642. package/dist/internal/routes/TransferSubsidy.js.map +1 -0
  643. package/dist/internal/{funding → routes}/TransferWebhook.d.ts +5 -5
  644. package/dist/internal/routes/TransferWebhook.d.ts.map +1 -0
  645. package/dist/internal/{funding → routes}/TransferWebhook.js +3 -3
  646. package/dist/internal/routes/TransferWebhook.js.map +1 -0
  647. package/dist/internal/{funding → routes}/index.d.ts +2 -0
  648. package/dist/internal/routes/index.d.ts.map +1 -0
  649. package/dist/internal/{funding → routes}/index.js +2 -0
  650. package/dist/internal/routes/index.js.map +1 -0
  651. package/dist/internal/{funding → routes}/providers/across.d.ts +4 -4
  652. package/dist/internal/routes/providers/across.d.ts.map +1 -0
  653. package/dist/internal/{funding → routes}/providers/across.js +13 -13
  654. package/dist/internal/routes/providers/across.js.map +1 -0
  655. package/dist/internal/{funding → routes}/providers/relay.d.ts +21 -12
  656. package/dist/internal/routes/providers/relay.d.ts.map +1 -0
  657. package/dist/internal/{funding → routes}/providers/relay.js +194 -110
  658. package/dist/internal/routes/providers/relay.js.map +1 -0
  659. package/dist/internal/{funding → routes}/providers/rhino.d.ts +4 -4
  660. package/dist/internal/routes/providers/rhino.d.ts.map +1 -0
  661. package/dist/internal/{funding → routes}/providers/rhino.js +10 -10
  662. package/dist/internal/routes/providers/rhino.js.map +1 -0
  663. package/dist/internal/{funding → routes}/providers/squid.d.ts +4 -4
  664. package/dist/internal/routes/providers/squid.d.ts.map +1 -0
  665. package/dist/internal/{funding → routes}/providers/squid.js +14 -14
  666. package/dist/internal/routes/providers/squid.js.map +1 -0
  667. package/dist/internal/{funding → routes}/providers/stargate.d.ts +46 -18
  668. package/dist/internal/routes/providers/stargate.d.ts.map +1 -0
  669. package/dist/internal/routes/providers/stargate.js +898 -0
  670. package/dist/internal/routes/providers/stargate.js.map +1 -0
  671. package/dist/internal/{funding → routes}/providers/symbiosis.d.ts +4 -4
  672. package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -0
  673. package/dist/internal/{funding → routes}/providers/symbiosis.js +30 -20
  674. package/dist/internal/routes/providers/symbiosis.js.map +1 -0
  675. package/dist/internal/webhookDestinations/slack.js +12 -12
  676. package/dist/internal/webhookDestinations/slack.js.map +1 -1
  677. package/dist/providers/index.d.ts +12 -12
  678. package/dist/providers/index.d.ts.map +1 -1
  679. package/dist/providers/index.js +12 -12
  680. package/dist/providers/index.js.map +1 -1
  681. package/dist/server.d.ts +19 -0
  682. package/dist/server.d.ts.map +1 -0
  683. package/dist/server.js +19 -0
  684. package/dist/server.js.map +1 -0
  685. package/package.json +15 -4
  686. package/src/ApiKey.ts +1 -1
  687. package/src/ApiKeys.test.ts +1033 -3
  688. package/src/ApiKeys.ts +489 -48
  689. package/src/App.test-d.ts +1 -1
  690. package/src/App.test.ts +216 -25
  691. package/src/App.ts +334 -31
  692. package/src/Assets.test.ts +2 -2
  693. package/src/Assets.ts +3 -1
  694. package/src/Auth.test-d.ts +1 -1
  695. package/src/Client.test-d.ts +539 -110
  696. package/src/Handler.ts +0 -1
  697. package/src/OpenApi.contract.test.ts +195 -0
  698. package/src/Scope.ts +17 -5
  699. package/src/Webhooks.ts +1 -1
  700. package/src/admin/App.test.ts +30 -2
  701. package/src/admin/App.ts +42 -6
  702. package/src/admin/apps/api-keys.test.ts +267 -5
  703. package/src/admin/apps/api-keys.ts +100 -50
  704. package/src/admin/apps/earn-vaults.test.ts +158 -0
  705. package/src/admin/apps/earn-vaults.ts +679 -6
  706. package/src/admin/apps/organizations.test.ts +306 -17
  707. package/src/admin/apps/organizations.ts +299 -24
  708. package/src/admin/apps/routes-support.test.ts +200 -0
  709. package/src/admin/apps/routes-support.ts +201 -0
  710. package/src/admin/apps/routes.test.ts +450 -0
  711. package/src/admin/apps/routes.ts +896 -0
  712. package/src/admin/apps/scopes.test.ts +15 -5
  713. package/src/admin/apps/subsidies.test.ts +306 -0
  714. package/src/admin/apps/subsidies.ts +457 -0
  715. package/src/admin/apps/verified-tokens.test.ts +40 -3
  716. package/src/admin/apps/verified-tokens.ts +33 -7
  717. package/src/admin/ui/plugin.ts +1 -2
  718. package/src/admin/ui/src/components/RewardCampaignForm.tsx +1009 -0
  719. package/src/admin/ui/src/lib/config.ts +11 -2
  720. package/src/admin/ui/src/lib/earn-vaults.ts +2 -2
  721. package/src/admin/ui/src/lib/organizations.test.ts +83 -50
  722. package/src/admin/ui/src/lib/organizations.ts +106 -25
  723. package/src/admin/ui/src/lib/query-client.ts +1 -1
  724. package/src/admin/ui/src/lib/reward-campaigns.ts +136 -0
  725. package/src/admin/ui/src/lib/routes.test.ts +88 -0
  726. package/src/admin/ui/src/lib/routes.ts +304 -0
  727. package/src/admin/ui/src/lib/subsidies.ts +75 -0
  728. package/src/admin/ui/src/lib/verified-tokens.ts +24 -9
  729. package/src/admin/ui/src/routeTree.gen.ts +63 -0
  730. package/src/admin/ui/src/routes/__root.tsx +13 -2
  731. package/src/admin/ui/src/routes/api-keys.tsx +196 -84
  732. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +105 -70
  733. package/src/admin/ui/src/routes/organizations.tsx +34 -4
  734. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +239 -23
  735. package/src/admin/ui/src/routes/routes.tsx +1615 -0
  736. package/src/admin/ui/src/routes/routes_.support.tsx +248 -0
  737. package/src/admin/ui/src/routes/subsidies.tsx +799 -0
  738. package/src/admin/ui/src/routes/verified-tokens.tsx +64 -20
  739. package/src/admin/ui.generated.ts +202 -188
  740. package/src/analytics/Analytics.test.ts +108 -18
  741. package/src/analytics/Analytics.ts +38 -6
  742. package/src/analytics/tables/requestEvents.test.ts +100 -0
  743. package/src/analytics/tables/requestEvents.ts +10 -1
  744. package/src/analytics/tables/routesLifecycleIntervals.ts +140 -0
  745. package/src/apps/Zones.test.ts +15 -0
  746. package/src/apps/Zones.ts +52 -5
  747. package/src/apps/composition.test.ts +68 -60
  748. package/src/apps/data/App.test.ts +180 -2
  749. package/src/apps/data/App.ts +88 -28
  750. package/src/apps/data/routes/activities.test.ts +419 -7
  751. package/src/apps/data/routes/activities.ts +683 -216
  752. package/src/apps/data/routes/balances.test.ts +2 -2
  753. package/src/apps/data/routes/blocks.test.ts +46 -1
  754. package/src/apps/data/routes/coingecko.test.ts +419 -1
  755. package/src/apps/data/routes/coingecko.ts +309 -253
  756. package/src/apps/data/routes/earn.discovery.test.ts +274 -0
  757. package/src/apps/data/routes/earn.test.ts +1294 -17
  758. package/src/apps/data/routes/earn.ts +1838 -321
  759. package/src/apps/data/routes/exchanges.test.ts +12 -15
  760. package/src/apps/data/routes/fee-amm.test.ts +243 -0
  761. package/src/apps/data/routes/fee-amm.ts +201 -162
  762. package/src/apps/data/routes/indexer.test.ts +389 -0
  763. package/src/apps/data/routes/indexer.ts +165 -69
  764. package/src/apps/data/routes/receipts.test.ts +1 -1
  765. package/src/apps/data/routes/rpc.test.ts +384 -8
  766. package/src/apps/data/routes/rpc.ts +452 -227
  767. package/src/apps/data/routes/rpc.zone.test.ts +340 -0
  768. package/src/apps/data/routes/tokenlist.test.ts +285 -0
  769. package/src/apps/data/routes/tokenlist.ts +173 -88
  770. package/src/apps/data/routes/tokens.test.ts +93 -3
  771. package/src/apps/data/routes/tokens.ts +39 -23
  772. package/src/apps/data/routes/transactions.test.ts +1 -1
  773. package/src/apps/data/routes/transfers.test.ts +56 -24
  774. package/src/apps/data/routes/transfers.ts +19 -8
  775. package/src/apps/data/routes/valuation.test.ts +1 -1
  776. package/src/apps/data/routes/verified-tokens.test.ts +345 -0
  777. package/src/apps/data/routes/verified-tokens.ts +99 -29
  778. package/src/apps/data/routes/webhooks.scan.test.ts +29 -0
  779. package/src/apps/data/routes/webhooks.test.ts +651 -83
  780. package/src/apps/data/routes/webhooks.ts +1113 -868
  781. package/src/apps/data/routes/zones.test.ts +148 -71
  782. package/src/apps/data/routes/zones.ts +71 -55
  783. package/src/apps/docs/reference.ts +2 -2
  784. package/src/apps/index.ts +1 -1
  785. package/src/apps/management/App.ts +9 -51
  786. package/src/apps/management/Billing.test.ts +375 -14
  787. package/src/apps/management/Billing.ts +265 -29
  788. package/src/apps/management/routes/api-keys.test.ts +269 -7
  789. package/src/apps/management/routes/api-keys.ts +61 -20
  790. package/src/apps/management/routes/billing.test.ts +477 -15
  791. package/src/apps/management/routes/billing.ts +377 -50
  792. package/src/apps/management/routes/faucet.test.ts +1 -1
  793. package/src/apps/management/routes/faucet.ts +1 -1
  794. package/src/apps/management/routes/invitations.test.ts +270 -3
  795. package/src/apps/management/routes/invitations.ts +185 -15
  796. package/src/apps/management/routes/invoicePreview.test.ts +549 -0
  797. package/src/apps/management/routes/me.test.ts +246 -5
  798. package/src/apps/management/routes/me.ts +7 -2
  799. package/src/apps/management/routes/members.test.ts +108 -0
  800. package/src/apps/management/routes/orgs.test.ts +191 -3
  801. package/src/apps/management/routes/orgs.ts +58 -11
  802. package/src/apps/management/routes/projects.test.ts +33 -3
  803. package/src/apps/management/routes/projects.ts +6 -1
  804. package/src/apps/management/routes/scopes.test.ts +30 -2
  805. package/src/apps/management/routes/scopes.ts +4 -1
  806. package/src/apps/management/routes/usage.test.ts +32 -0
  807. package/src/apps/management/routes/usage.ts +22 -4
  808. package/src/apps/management/routes/verified-token-requests.test.ts +16 -2
  809. package/src/apps/management/routes/verified-token-requests.ts +7 -10
  810. package/src/apps/management/routes/webhooks.test.ts +49 -26
  811. package/src/apps/management/routes/webhooks.ts +78 -22
  812. package/src/apps/mcp.test.ts +113 -30
  813. package/src/apps/mcp.ts +22 -10
  814. package/src/apps/mpp/App.ts +37 -7
  815. package/src/apps/mpp/Mpp.test.ts +49 -8
  816. package/src/apps/mpp/Mpp.zone.test.ts +219 -0
  817. package/src/apps/mpp/internal/Adapter.ts +34 -0
  818. package/src/apps/mpp/internal/Policy.test.ts +86 -31
  819. package/src/apps/mpp/internal/Policy.ts +49 -7
  820. package/src/apps/mpp/internal/Sponsorship.test.ts +207 -0
  821. package/src/apps/mpp/internal/Sponsorship.ts +9 -3
  822. package/src/apps/relay/App.test.ts +839 -64
  823. package/src/apps/relay/App.ts +148 -81
  824. package/src/apps/relay/App.zone-billing.test.ts +257 -0
  825. package/src/apps/relay/Sponsorships.test.ts +67 -4
  826. package/src/apps/relay/Sponsorships.ts +233 -32
  827. package/src/apps/relay/Sponsorships.zone.test.ts +102 -0
  828. package/src/apps/{funding → routes}/Access.ts +6 -6
  829. package/src/apps/routes/App.test.ts +165 -0
  830. package/src/apps/routes/App.ts +96 -0
  831. package/src/apps/{funding → routes}/Inventory.ts +2 -2
  832. package/src/apps/routes/index.ts +1 -0
  833. package/src/apps/{funding → routes}/routes/chains.test.ts +66 -66
  834. package/src/apps/{funding → routes}/routes/chains.ts +23 -23
  835. package/src/apps/{funding → routes}/routes/deposit-addresses.test.ts +1358 -458
  836. package/src/apps/{funding → routes}/routes/deposit-addresses.ts +566 -246
  837. package/src/apps/{funding → routes}/routes/providers.test.ts +27 -33
  838. package/src/apps/{funding → routes}/routes/providers.ts +23 -23
  839. package/src/apps/{funding → routes}/routes/quotes.test.ts +298 -41
  840. package/src/apps/{funding → routes}/routes/quotes.ts +57 -40
  841. package/src/apps/{funding → routes}/routes/transfers.test.ts +1100 -353
  842. package/src/apps/routes/routes/transfers.ts +1332 -0
  843. package/src/cli/Cli.test.ts +1 -1
  844. package/src/cli/commands/admin.test.ts +748 -1
  845. package/src/cli/commands/admin.ts +278 -0
  846. package/src/cloudflare.ts +52 -47
  847. package/src/db/Db.test.ts +245 -2
  848. package/src/db/Db.ts +1485 -34
  849. package/src/db/Schema.ts +729 -228
  850. package/src/db/tables/apiKeyAdmissionBootstraps.ts +4 -0
  851. package/src/db/tables/apiKeyAdmissions.ts +218 -0
  852. package/src/db/tables/apiKeyOwnerAdmissions.ts +4 -0
  853. package/src/db/tables/apiKeyOwnerTombstones.ts +81 -0
  854. package/src/db/tables/apiKeyRevocations.test.ts +74 -0
  855. package/src/db/tables/apiKeyRevocations.ts +121 -0
  856. package/src/db/tables/authAccounts.ts +105 -0
  857. package/src/db/tables/authSessions.ts +13 -0
  858. package/src/db/tables/authVerifications.ts +13 -0
  859. package/src/db/tables/invitations.ts +142 -45
  860. package/src/db/tables/memberships.ts +79 -3
  861. package/src/db/tables/organizations.test.ts +690 -13
  862. package/src/db/tables/organizations.ts +139 -55
  863. package/src/db/tables/projects.test.ts +16 -0
  864. package/src/db/tables/projects.ts +13 -3
  865. package/src/db/tables/requestUsage.ts +4 -1
  866. package/src/db/tables/rewardAccounts.ts +178 -0
  867. package/src/db/tables/rewardCampaignDistributors.ts +68 -0
  868. package/src/db/tables/rewardCampaigns.test.ts +1388 -0
  869. package/src/db/tables/rewardCampaigns.ts +647 -0
  870. package/src/db/tables/rewardCredits.ts +110 -0
  871. package/src/db/tables/rewardEligibilityAssociations.test.ts +271 -0
  872. package/src/db/tables/rewardEligibilityAssociations.ts +184 -0
  873. package/src/db/tables/rewardRuns.ts +514 -0
  874. package/src/db/tables/rewardTransactionAttempts.ts +272 -0
  875. package/src/db/tables/routesCatalog.test.ts +185 -0
  876. package/src/db/tables/routesCatalog.ts +163 -0
  877. package/src/db/tables/routesDepositAddresses.test.ts +1048 -0
  878. package/src/db/tables/routesDepositAddresses.ts +1008 -0
  879. package/src/db/tables/{fundingDepositRequestObservations.test.ts → routesDepositRequestObservations.test.ts} +13 -14
  880. package/src/db/tables/{fundingDepositRequestObservations.ts → routesDepositRequestObservations.ts} +10 -10
  881. package/src/db/tables/{fundingDeposits.test.ts → routesDeposits.test.ts} +388 -46
  882. package/src/db/tables/routesDeposits.ts +1062 -0
  883. package/src/db/tables/routesIdempotency.test.ts +796 -0
  884. package/src/db/tables/routesIdempotency.ts +496 -0
  885. package/src/db/tables/routesSubsidies.test.ts +120 -0
  886. package/src/db/tables/routesSubsidies.ts +71 -0
  887. package/src/db/tables/{fundingTransferEvents.ts → routesTransferEvents.ts} +4 -4
  888. package/src/db/tables/routesTransferSubsidies.ts +38 -0
  889. package/src/db/tables/routesTransferSubsidyNonces.ts +124 -0
  890. package/src/db/tables/routesTransferTransactions.test.ts +195 -0
  891. package/src/db/tables/{fundingTransferTransactions.ts → routesTransferTransactions.ts} +63 -18
  892. package/src/db/tables/routesTransfers.test.ts +338 -0
  893. package/src/db/tables/routesTransfers.ts +662 -0
  894. package/src/db/tables/sponsoredTransactions.test.ts +269 -45
  895. package/src/db/tables/sponsoredTransactions.ts +225 -65
  896. package/src/db/tables/sponsorshipAttributions.test.ts +160 -0
  897. package/src/db/tables/sponsorshipAttributions.ts +168 -0
  898. package/src/db/tables/sponsorshipReconciliationCursors.test.ts +115 -0
  899. package/src/db/tables/sponsorshipReconciliationCursors.ts +67 -0
  900. package/src/db/tables/stripeCustomers.test.ts +85 -0
  901. package/src/db/tables/stripeCustomers.ts +24 -0
  902. package/src/db/tables/users.test.ts +129 -0
  903. package/src/db/tables/users.ts +49 -3
  904. package/src/db/tables/verifiedTokenRequests.test.ts +39 -20
  905. package/src/db/tables/verifiedTokenRequests.ts +80 -44
  906. package/src/db/tables/webhookQueueEvents.ts +8 -1
  907. package/src/db/tables/webhookSubscriptions.ts +95 -20
  908. package/src/handlers/internal/executionError.ts +3 -4
  909. package/src/handlers/internal/multisig.ts +13 -816
  910. package/src/handlers/internal/sponsorship.ts +26 -10
  911. package/src/handlers/relay.test-d.ts +9 -1
  912. package/src/handlers/relay.test.ts +823 -3
  913. package/src/handlers/relay.ts +127 -107
  914. package/src/index.test-d.ts +7 -0
  915. package/src/index.ts +0 -17
  916. package/src/internal/AssetResponse.ts +26 -0
  917. package/src/internal/Auth.test.ts +1656 -9
  918. package/src/internal/Auth.ts +880 -244
  919. package/src/internal/BetterAuth.test.ts +242 -0
  920. package/src/internal/BetterAuth.ts +349 -0
  921. package/src/internal/Cache.ts +2 -0
  922. package/src/internal/EarnRates.test.ts +17 -0
  923. package/src/internal/EarnRates.ts +124 -31
  924. package/src/internal/EarnSharePrices.test.ts +182 -0
  925. package/src/internal/EarnSharePrices.ts +313 -0
  926. package/src/internal/EarnVaults.test.ts +21 -0
  927. package/src/internal/EarnVaults.ts +33 -11
  928. package/src/internal/Email.ts +54 -0
  929. package/src/internal/Idempotency.test.ts +2 -2
  930. package/src/internal/Log.test-d.ts +8 -7
  931. package/src/internal/Log.test.ts +114 -16
  932. package/src/internal/Log.ts +53 -40
  933. package/src/internal/MetricSink.test.ts +313 -26
  934. package/src/internal/MetricSink.ts +73 -8
  935. package/src/internal/Mpp.test.ts +31 -0
  936. package/src/internal/Mpp.ts +21 -24
  937. package/src/internal/OpenApi.ts +45 -12
  938. package/src/internal/Provider.test.ts +1 -1
  939. package/src/internal/Provider.ts +1 -1
  940. package/src/internal/RateLimit.test.ts +21 -3
  941. package/src/internal/RateLimit.ts +12 -1
  942. package/src/internal/Store.test-d.ts +1 -1
  943. package/src/internal/Store.test.ts +151 -8
  944. package/src/internal/Store.ts +76 -9
  945. package/src/internal/Tidx.test.ts +59 -8
  946. package/src/internal/Tidx.ts +86 -14
  947. package/src/internal/Timing.test.ts +77 -0
  948. package/src/internal/Timing.ts +83 -6
  949. package/src/internal/VercelOidc.test.ts +188 -0
  950. package/src/internal/VercelOidc.ts +193 -0
  951. package/src/internal/VerifiedTokens.test.ts +60 -6
  952. package/src/internal/VerifiedTokens.ts +21 -24
  953. package/src/internal/Viem.batch.test.ts +80 -0
  954. package/src/internal/Viem.test.ts +201 -2
  955. package/src/internal/Viem.ts +221 -25
  956. package/src/internal/Webhooks.test.ts +85 -6
  957. package/src/internal/Webhooks.ts +22 -4
  958. package/src/internal/ZoneRpc.ts +50 -0
  959. package/src/internal/exchange/Provider.test.ts +2 -2
  960. package/src/internal/index.test.ts +3 -1
  961. package/src/internal/index.ts +3 -1
  962. package/src/internal/rewards/Audit.ts +231 -0
  963. package/src/internal/rewards/Campaigns.test.ts +1234 -0
  964. package/src/internal/rewards/Campaigns.ts +1205 -0
  965. package/src/internal/rewards/Credits.ts +165 -0
  966. package/src/internal/rewards/Events.local.test.ts +113 -0
  967. package/src/internal/rewards/Events.test.ts +152 -0
  968. package/src/internal/rewards/Events.ts +468 -0
  969. package/src/internal/rewards/Projection.test.ts +681 -0
  970. package/src/internal/rewards/Projection.ts +987 -0
  971. package/src/internal/rewards/Rates.test.ts +171 -0
  972. package/src/internal/rewards/Rates.ts +110 -0
  973. package/src/internal/rewards/Read.test.ts +501 -0
  974. package/src/internal/rewards/Read.ts +476 -0
  975. package/src/internal/rewards/Runner.checkpoint.test.ts +80 -0
  976. package/src/internal/rewards/Runner.states.test.ts +188 -0
  977. package/src/internal/rewards/Runner.test.ts +90 -0
  978. package/src/internal/rewards/Runner.ts +2229 -0
  979. package/src/internal/rewards/Signer.test.ts +79 -0
  980. package/src/internal/rewards/Signer.ts +180 -0
  981. package/src/internal/rewards/index.ts +14 -0
  982. package/src/internal/{funding → routes}/Action.test.ts +63 -14
  983. package/src/internal/{funding → routes}/Action.ts +35 -8
  984. package/src/internal/{funding → routes}/Catalog.test.ts +3 -3
  985. package/src/internal/{funding → routes}/Catalog.ts +39 -39
  986. package/src/internal/{funding → routes}/Chain.test.ts +1 -1
  987. package/src/internal/{funding → routes}/Chain.ts +11 -11
  988. package/src/internal/{funding → routes}/Deposit.test.ts +1 -1
  989. package/src/internal/{funding → routes}/Deposit.ts +93 -45
  990. package/src/internal/{funding → routes}/DepositAddress.test.ts +11 -3
  991. package/src/internal/{funding → routes}/DepositAddress.ts +132 -53
  992. package/src/internal/{funding → routes}/DepositWebhook.test.ts +61 -18
  993. package/src/internal/{funding → routes}/DepositWebhook.ts +9 -9
  994. package/src/internal/routes/Economics.test.ts +42 -0
  995. package/src/internal/routes/Economics.ts +47 -0
  996. package/src/internal/{funding → routes}/Evidence.test.ts +6 -6
  997. package/src/internal/{funding → routes}/Evidence.ts +9 -9
  998. package/src/internal/routes/Observability.test.ts +636 -0
  999. package/src/internal/routes/Observability.ts +668 -0
  1000. package/src/internal/{funding → routes}/Provider.test.ts +489 -153
  1001. package/src/internal/{funding → routes}/Provider.ts +489 -186
  1002. package/src/internal/{funding → routes}/Reconciliation.local.test.ts +84 -12
  1003. package/src/internal/{funding → routes}/Reconciliation.test.ts +1213 -279
  1004. package/src/internal/{funding → routes}/Reconciliation.ts +501 -203
  1005. package/src/internal/routes/Reconciliation.unattributed.test.ts +250 -0
  1006. package/src/internal/{funding → routes}/Route.ts +7 -7
  1007. package/src/internal/{funding → routes}/SourceObservation.test.ts +13 -14
  1008. package/src/internal/{funding → routes}/SourceObservation.ts +13 -13
  1009. package/src/internal/{funding → routes}/Subsidy.local.test.ts +7 -7
  1010. package/src/internal/routes/Subsidy.test.ts +169 -0
  1011. package/src/internal/{funding → routes}/Subsidy.ts +86 -6
  1012. package/src/internal/{funding → routes}/Token.test.ts +1 -1
  1013. package/src/internal/{funding → routes}/Token.ts +5 -5
  1014. package/src/internal/routes/Transfer.test.ts +1199 -0
  1015. package/src/internal/routes/Transfer.ts +1206 -0
  1016. package/src/internal/routes/TransferReconciliation.test.ts +731 -0
  1017. package/src/internal/routes/TransferReconciliation.ts +527 -0
  1018. package/src/internal/routes/TransferSubsidy.test.ts +172 -0
  1019. package/src/internal/routes/TransferSubsidy.ts +447 -0
  1020. package/src/internal/{funding → routes}/TransferWebhook.test.ts +13 -13
  1021. package/src/internal/{funding → routes}/TransferWebhook.ts +7 -7
  1022. package/src/internal/{funding → routes}/index.test.ts +5 -3
  1023. package/src/internal/{funding → routes}/index.ts +2 -0
  1024. package/src/internal/{funding → routes}/providers/across.ts +16 -16
  1025. package/src/internal/{funding → routes}/providers/index.test.ts +157 -44
  1026. package/src/internal/{funding → routes}/providers/relay.test.ts +224 -32
  1027. package/src/internal/{funding → routes}/providers/relay.ts +228 -121
  1028. package/src/internal/{funding → routes}/providers/rhino.ts +16 -16
  1029. package/src/internal/{funding → routes}/providers/squid.ts +17 -17
  1030. package/src/internal/routes/providers/stargate.test.ts +728 -0
  1031. package/src/internal/routes/providers/stargate.ts +1276 -0
  1032. package/src/internal/{funding → routes}/providers/symbiosis.ts +64 -24
  1033. package/src/internal/webhookDestinations/slack.ts +10 -10
  1034. package/src/providers/index.ts +13 -13
  1035. package/src/server.ts +18 -0
  1036. package/dist/apps/funding/Access.d.ts.map +0 -1
  1037. package/dist/apps/funding/Access.js.map +0 -1
  1038. package/dist/apps/funding/App.js.map +0 -1
  1039. package/dist/apps/funding/Inventory.d.ts.map +0 -1
  1040. package/dist/apps/funding/Inventory.js.map +0 -1
  1041. package/dist/apps/funding/ProviderAttempts.d.ts +0 -5
  1042. package/dist/apps/funding/ProviderAttempts.d.ts.map +0 -1
  1043. package/dist/apps/funding/ProviderAttempts.js +0 -24
  1044. package/dist/apps/funding/ProviderAttempts.js.map +0 -1
  1045. package/dist/apps/funding/index.d.ts +0 -2
  1046. package/dist/apps/funding/index.d.ts.map +0 -1
  1047. package/dist/apps/funding/index.js +0 -2
  1048. package/dist/apps/funding/index.js.map +0 -1
  1049. package/dist/apps/funding/routes/chains.d.ts.map +0 -1
  1050. package/dist/apps/funding/routes/chains.js.map +0 -1
  1051. package/dist/apps/funding/routes/deposit-addresses.d.ts.map +0 -1
  1052. package/dist/apps/funding/routes/deposit-addresses.js.map +0 -1
  1053. package/dist/apps/funding/routes/providers.d.ts.map +0 -1
  1054. package/dist/apps/funding/routes/providers.js +0 -57
  1055. package/dist/apps/funding/routes/providers.js.map +0 -1
  1056. package/dist/apps/funding/routes/quotes.d.ts.map +0 -1
  1057. package/dist/apps/funding/routes/quotes.js.map +0 -1
  1058. package/dist/apps/funding/routes/transfers.d.ts.map +0 -1
  1059. package/dist/apps/funding/routes/transfers.js +0 -828
  1060. package/dist/apps/funding/routes/transfers.js.map +0 -1
  1061. package/dist/db/tables/fundingCatalog.d.ts +0 -58
  1062. package/dist/db/tables/fundingCatalog.d.ts.map +0 -1
  1063. package/dist/db/tables/fundingCatalog.js.map +0 -1
  1064. package/dist/db/tables/fundingDepositAddresses.d.ts +0 -192
  1065. package/dist/db/tables/fundingDepositAddresses.d.ts.map +0 -1
  1066. package/dist/db/tables/fundingDepositAddresses.js +0 -235
  1067. package/dist/db/tables/fundingDepositAddresses.js.map +0 -1
  1068. package/dist/db/tables/fundingDepositRequestObservations.d.ts.map +0 -1
  1069. package/dist/db/tables/fundingDepositRequestObservations.js.map +0 -1
  1070. package/dist/db/tables/fundingDeposits.d.ts.map +0 -1
  1071. package/dist/db/tables/fundingDeposits.js +0 -295
  1072. package/dist/db/tables/fundingDeposits.js.map +0 -1
  1073. package/dist/db/tables/fundingIdempotency.d.ts +0 -91
  1074. package/dist/db/tables/fundingIdempotency.d.ts.map +0 -1
  1075. package/dist/db/tables/fundingIdempotency.js +0 -103
  1076. package/dist/db/tables/fundingIdempotency.js.map +0 -1
  1077. package/dist/db/tables/fundingTransferEvents.d.ts.map +0 -1
  1078. package/dist/db/tables/fundingTransferEvents.js.map +0 -1
  1079. package/dist/db/tables/fundingTransferTransactions.d.ts +0 -53
  1080. package/dist/db/tables/fundingTransferTransactions.d.ts.map +0 -1
  1081. package/dist/db/tables/fundingTransferTransactions.js.map +0 -1
  1082. package/dist/db/tables/fundingTransfers.d.ts +0 -99
  1083. package/dist/db/tables/fundingTransfers.d.ts.map +0 -1
  1084. package/dist/db/tables/fundingTransfers.js +0 -110
  1085. package/dist/db/tables/fundingTransfers.js.map +0 -1
  1086. package/dist/internal/funding/Action.d.ts.map +0 -1
  1087. package/dist/internal/funding/Action.js.map +0 -1
  1088. package/dist/internal/funding/Catalog.d.ts.map +0 -1
  1089. package/dist/internal/funding/Catalog.js.map +0 -1
  1090. package/dist/internal/funding/Chain.d.ts.map +0 -1
  1091. package/dist/internal/funding/Chain.js.map +0 -1
  1092. package/dist/internal/funding/Deposit.d.ts.map +0 -1
  1093. package/dist/internal/funding/Deposit.js.map +0 -1
  1094. package/dist/internal/funding/DepositAddress.d.ts.map +0 -1
  1095. package/dist/internal/funding/DepositAddress.js.map +0 -1
  1096. package/dist/internal/funding/DepositWebhook.d.ts.map +0 -1
  1097. package/dist/internal/funding/DepositWebhook.js.map +0 -1
  1098. package/dist/internal/funding/Evidence.d.ts.map +0 -1
  1099. package/dist/internal/funding/Evidence.js.map +0 -1
  1100. package/dist/internal/funding/Provider.d.ts.map +0 -1
  1101. package/dist/internal/funding/Provider.js.map +0 -1
  1102. package/dist/internal/funding/Reconciliation.d.ts.map +0 -1
  1103. package/dist/internal/funding/Reconciliation.js.map +0 -1
  1104. package/dist/internal/funding/Route.d.ts +0 -21
  1105. package/dist/internal/funding/Route.d.ts.map +0 -1
  1106. package/dist/internal/funding/Route.js.map +0 -1
  1107. package/dist/internal/funding/SourceObservation.d.ts.map +0 -1
  1108. package/dist/internal/funding/SourceObservation.js.map +0 -1
  1109. package/dist/internal/funding/Subsidy.d.ts.map +0 -1
  1110. package/dist/internal/funding/Subsidy.js.map +0 -1
  1111. package/dist/internal/funding/Token.d.ts.map +0 -1
  1112. package/dist/internal/funding/Token.js.map +0 -1
  1113. package/dist/internal/funding/Transfer.d.ts.map +0 -1
  1114. package/dist/internal/funding/Transfer.js +0 -462
  1115. package/dist/internal/funding/Transfer.js.map +0 -1
  1116. package/dist/internal/funding/TransferReconciliation.d.ts.map +0 -1
  1117. package/dist/internal/funding/TransferReconciliation.js +0 -192
  1118. package/dist/internal/funding/TransferReconciliation.js.map +0 -1
  1119. package/dist/internal/funding/TransferWebhook.d.ts.map +0 -1
  1120. package/dist/internal/funding/TransferWebhook.js.map +0 -1
  1121. package/dist/internal/funding/index.d.ts.map +0 -1
  1122. package/dist/internal/funding/index.js.map +0 -1
  1123. package/dist/internal/funding/providers/across.d.ts.map +0 -1
  1124. package/dist/internal/funding/providers/across.js.map +0 -1
  1125. package/dist/internal/funding/providers/relay.d.ts.map +0 -1
  1126. package/dist/internal/funding/providers/relay.js.map +0 -1
  1127. package/dist/internal/funding/providers/rhino.d.ts.map +0 -1
  1128. package/dist/internal/funding/providers/rhino.js.map +0 -1
  1129. package/dist/internal/funding/providers/squid.d.ts.map +0 -1
  1130. package/dist/internal/funding/providers/squid.js.map +0 -1
  1131. package/dist/internal/funding/providers/stargate.d.ts.map +0 -1
  1132. package/dist/internal/funding/providers/stargate.js +0 -579
  1133. package/dist/internal/funding/providers/stargate.js.map +0 -1
  1134. package/dist/internal/funding/providers/symbiosis.d.ts.map +0 -1
  1135. package/dist/internal/funding/providers/symbiosis.js.map +0 -1
  1136. package/src/apps/funding/App.test.ts +0 -78
  1137. package/src/apps/funding/App.ts +0 -88
  1138. package/src/apps/funding/ProviderAttempts.ts +0 -26
  1139. package/src/apps/funding/index.ts +0 -1
  1140. package/src/apps/funding/routes/transfers.ts +0 -987
  1141. package/src/db/tables/fundingCatalog.test.ts +0 -122
  1142. package/src/db/tables/fundingCatalog.ts +0 -163
  1143. package/src/db/tables/fundingDepositAddresses.test.ts +0 -608
  1144. package/src/db/tables/fundingDepositAddresses.ts +0 -443
  1145. package/src/db/tables/fundingDeposits.ts +0 -572
  1146. package/src/db/tables/fundingIdempotency.test.ts +0 -182
  1147. package/src/db/tables/fundingIdempotency.ts +0 -180
  1148. package/src/db/tables/fundingTransferTransactions.test.ts +0 -112
  1149. package/src/db/tables/fundingTransfers.test.ts +0 -115
  1150. package/src/db/tables/fundingTransfers.ts +0 -189
  1151. package/src/handlers/internal/multisig.test.ts +0 -818
  1152. package/src/internal/funding/Subsidy.test.ts +0 -75
  1153. package/src/internal/funding/Transfer.test.ts +0 -524
  1154. package/src/internal/funding/Transfer.ts +0 -762
  1155. package/src/internal/funding/TransferReconciliation.test.ts +0 -147
  1156. package/src/internal/funding/TransferReconciliation.ts +0 -264
  1157. package/src/internal/funding/providers/stargate.test.ts +0 -328
  1158. package/src/internal/funding/providers/stargate.ts +0 -856
  1159. /package/dist/apps/{funding → routes}/Inventory.d.ts +0 -0
  1160. /package/src/internal/{funding → routes}/Route.test.ts +0 -0
@@ -1,5 +1,3 @@
1
- // TODO(tidx-v1): Restore `queryOutbound` from commit `de87725` after TIDX v1 ships. Remove the receipt-side merge and bounded follow-up lookup.
2
-
3
1
  import { Hono, type Context } from 'hono'
4
2
  import { Address, Hex } from 'ox'
5
3
  import { type Log, parseEventLogs, zeroAddress } from 'viem'
@@ -1500,6 +1498,16 @@ export namespace schema {
1500
1498
  'ActivityItem',
1501
1499
  )
1502
1500
 
1501
+ /** Public activity types accepted by the address feed's `type` filter. */
1502
+ export const ActivityType = z
1503
+ .enum(
1504
+ items.map((item) => item.shape.type.def.values[0]) as unknown as readonly [
1505
+ z.output<typeof Item>['type'],
1506
+ ...z.output<typeof Item>['type'][],
1507
+ ],
1508
+ )
1509
+ .check(z.describe('A classified activity type.'))
1510
+
1503
1511
  /** A folded access-key group: consecutive same-signer items on one UTC day. */
1504
1512
  export const Group = z
1505
1513
  .object({
@@ -1568,6 +1576,25 @@ export namespace schema {
1568
1576
  'Comma-separated activity options. `zones` combines the selected parent chain with every readable Zone.',
1569
1577
  )
1570
1578
 
1579
+ /** Parses comma-separated activity types with OR semantics. */
1580
+ export const typeQuery = Schema.includeQuery(
1581
+ ActivityType,
1582
+ 'Only include these activity types, such as `transfer,swap`. Multiple values use OR semantics.',
1583
+ )
1584
+
1585
+ const RawAmountBound = z
1586
+ .optional(Schema.DecimalString)
1587
+ .check(z.describe("A token quantity in the token's smallest unit."))
1588
+
1589
+ const ValuationAmountBound = z
1590
+ .optional(z.string().check(z.regex(/^\d+(\.\d{1,6})?$/)))
1591
+ .check(
1592
+ z.describe(
1593
+ 'A non-negative decimal amount in `valuation.currency`, with up to six decimal places.',
1594
+ ),
1595
+ z.meta({ examples: ['1'] }),
1596
+ )
1597
+
1571
1598
  /** Schemas for the getAddressActivities operation. */
1572
1599
  export namespace getAddressActivities {
1573
1600
  /** Path parameters for address activity requests. */
@@ -1582,6 +1609,16 @@ export namespace schema {
1582
1609
  /** Query parameters for address activity requests. */
1583
1610
  export const Query = z
1584
1611
  .strictObject({
1612
+ 'amount.from': RawAmountBound.check(
1613
+ z.describe(
1614
+ 'Only include activities with at least one token amount greater than or equal to this base-unit quantity.',
1615
+ ),
1616
+ ),
1617
+ 'amount.to': RawAmountBound.check(
1618
+ z.describe(
1619
+ 'Only include activities with at least one token amount less than or equal to this base-unit quantity.',
1620
+ ),
1621
+ ),
1585
1622
  chainId: Schema.ChainIdQuery,
1586
1623
  cursor: Schema.Cursor,
1587
1624
  // Folding is opt-in: by default every item is returned at the root.
@@ -1605,9 +1642,65 @@ export namespace schema {
1605
1642
  ),
1606
1643
  z.meta({ examples: [true] }),
1607
1644
  ),
1645
+ recipient: z
1646
+ .optional(Schema.Address)
1647
+ .check(z.describe('Only include activities sent to this recipient address.')),
1648
+ sender: z
1649
+ .optional(Schema.Address)
1650
+ .check(z.describe('Only include activities sent from this sender address.')),
1651
+ token: z
1652
+ .optional(Schema.TokenAddress)
1653
+ .check(
1654
+ z.describe(
1655
+ 'Only include activities with a source, destination, or refund token for this TIP-20 contract.',
1656
+ ),
1657
+ ),
1658
+ type: typeQuery,
1659
+ 'valuation.amount.from': ValuationAmountBound.check(
1660
+ z.describe(
1661
+ 'Only include activities with at least one valued amount greater than or equal to this amount. Requires `valuation.currency`.',
1662
+ ),
1663
+ ),
1664
+ 'valuation.amount.to': ValuationAmountBound.check(
1665
+ z.describe(
1666
+ 'Only include activities with at least one valued amount less than or equal to this amount. Requires `valuation.currency`.',
1667
+ ),
1668
+ ),
1608
1669
  'valuation.currency': Schema.Denomination,
1609
1670
  })
1610
1671
  .check(
1672
+ z.refine(
1673
+ (query) => {
1674
+ const from = parseRawAmount(query['amount.from'])
1675
+ const to = parseRawAmount(query['amount.to'])
1676
+ return from === undefined || to === undefined || from <= to
1677
+ },
1678
+ {
1679
+ error: '`amount.from` must be less than or equal to `amount.to`.',
1680
+ path: ['amount.from'],
1681
+ },
1682
+ ),
1683
+ z.refine(
1684
+ (query) =>
1685
+ (query['valuation.amount.from'] === undefined &&
1686
+ query['valuation.amount.to'] === undefined) ||
1687
+ query['valuation.currency'] !== undefined,
1688
+ {
1689
+ error: '`valuation.currency` is required when filtering by valuation amount.',
1690
+ path: ['valuation.currency'],
1691
+ },
1692
+ ),
1693
+ z.refine(
1694
+ (query) =>
1695
+ query['valuation.amount.from'] === undefined ||
1696
+ query['valuation.amount.to'] === undefined ||
1697
+ parseValuationAmount(query['valuation.amount.from']) <=
1698
+ parseValuationAmount(query['valuation.amount.to']),
1699
+ {
1700
+ error: '`valuation.amount.from` must be less than or equal to `valuation.amount.to`.',
1701
+ path: ['valuation.amount.from'],
1702
+ },
1703
+ ),
1611
1704
  z.describe(
1612
1705
  'Query parameters for the address activity request. This feed uses cursor pagination only because activity classification can fold a variable number of rows into each entry, so positional `page` pagination would not be stable.',
1613
1706
  ),
@@ -1714,7 +1807,7 @@ type UnenrichedData<data> = {
1714
1807
  }
1715
1808
 
1716
1809
  /** A classified item whose token stubs have not been enriched with structured amounts. */
1717
- type UnenrichedItem = {
1810
+ export type UnenrichedItem = {
1718
1811
  [type in Item['type']]: Omit<Extract<Item, { type: type }>, 'data'> & {
1719
1812
  data: UnenrichedData<Extract<Item, { type: type }>['data']>
1720
1813
  }
@@ -1891,9 +1984,6 @@ const closeRequestedSelector = '0xf5a36fc00a96cbb9cf1f8f59299165e1d8ffffe94396d8
1891
1984
  // access-key publicKey, i.e. the real signer.
1892
1985
  const accessKeySpendSelector = '0xe0815e3aaadddf4dd75bde97fc060f0c38afe18e87a169be86a3f5c28247f192'
1893
1986
 
1894
- /** TIP-20 / ERC-20 `Transfer` event signature for the decoded CTE. */
1895
- const transferSignature = 'event Transfer(address indexed from, address indexed to, uint256 value)'
1896
-
1897
1987
  // Standard ERC-4626 vault events, absent from the merged `viem/tempo` ABI.
1898
1988
  // Decoding them lets external vault deposits/withdrawals classify instead of
1899
1989
  // falling through to the share-token mint/burn legs.
@@ -1921,18 +2011,13 @@ const erc4626Events = [
1921
2011
  },
1922
2012
  ] as const
1923
2013
 
1924
- // TIP-20 payment-channel reserve precompile. Not exported by `viem/tempo`
1925
- // `Addresses`, so the known address is pinned here: channel events
1926
- // (`ChannelOpened`/`Settled`/`TopUp`/`ChannelClosed`) are emitted here, and
1927
- // their paired TIP-20 `Transfer` legs use it as the funding counterparty, which
1928
- // is how `channel-funded`/`channel-settled`/`channel-closed` recover the token.
1929
- const tip20ChannelReserve = '0x4d50500000000000000000000000000000000000' as Address.Address
2014
+ const tip20ChannelReserve = Addresses.tip20ChannelReserve
1930
2015
 
1931
2016
  // Tempo system addresses other than the DEX are never swap-route
1932
2017
  // counterparties; a newly shipped precompile joins the exclusion automatically.
1933
2018
  const nonRouteSystemAddresses = new Set(
1934
- [...Object.values(Addresses), tip20ChannelReserve]
1935
- .filter((value) => value !== Addresses.stablecoinDex)
2019
+ Object.values(Addresses)
2020
+ .filter((value) => typeof value === 'string' && value !== Addresses.stablecoinDex)
1936
2021
  .map((value) => value.toLowerCase()),
1937
2022
  )
1938
2023
 
@@ -1942,6 +2027,8 @@ const minGroupEntries = 5
1942
2027
  /** Largest number of items folded into a single access-key group. */
1943
2028
  const maxGroupSize = 50
1944
2029
 
2030
+ const maxTokenAmount = 2n ** 256n - 1n
2031
+
1945
2032
  /** Token-bearing keys on an item's `data` payload, walked for enrichment. */
1946
2033
  const tokenKeys = ['destinationToken', 'refund', 'sourceToken'] as const
1947
2034
 
@@ -1951,6 +2038,111 @@ const amountKeyByTokenKey = {
1951
2038
  sourceToken: 'sourceAmount',
1952
2039
  } as const
1953
2040
 
2041
+ function parseRawAmount(value: string | undefined): bigint | undefined {
2042
+ return value !== undefined && /^\d+$/.test(value) ? BigInt(value) : undefined
2043
+ }
2044
+
2045
+ /** Converts a decimal valuation amount to the API's fixed six-decimal scale. */
2046
+ function parseValuationAmount(value: string): bigint {
2047
+ const [whole, fraction = ''] = value.split('.')
2048
+ return BigInt(whole!) * 1_000_000n + BigInt(fraction.padEnd(6, '0'))
2049
+ }
2050
+
2051
+ /** Inclusive token amount bounds in raw base units. */
2052
+ export type RawAmountBounds = {
2053
+ /** Smallest matching amount. */
2054
+ from?: bigint | undefined
2055
+ /** Largest matching amount. */
2056
+ to?: bigint | undefined
2057
+ }
2058
+
2059
+ /** Exact activity predicates evaluated against classified token movements. */
2060
+ export type ActivityFilter = {
2061
+ /** Inclusive raw base-unit range for one token leg. */
2062
+ amount?: RawAmountBounds | undefined
2063
+ /** Required recipient on the classified activity. */
2064
+ recipient?: Address.Address | undefined
2065
+ /** Required sender on the classified activity. */
2066
+ sender?: Address.Address | undefined
2067
+ /** Required source, destination, or refund token on the same leg as the amount range. */
2068
+ token?: Address.Address | undefined
2069
+ }
2070
+
2071
+ /** Returns whether an activity satisfies its participant and same-leg token predicates. */
2072
+ function matchesActivityFilter(item: UnenrichedItem, filter: ActivityFilter): boolean {
2073
+ const data = item.data as Record<string, unknown> &
2074
+ Partial<Record<(typeof tokenKeys)[number], UnenrichedToken>>
2075
+ const recipient = data['recipient']
2076
+ if (
2077
+ filter.recipient !== undefined &&
2078
+ (typeof recipient !== 'string' ||
2079
+ !Address.isEqual(recipient as Address.Address, filter.recipient))
2080
+ )
2081
+ return false
2082
+ const sender = data['sender']
2083
+ if (
2084
+ filter.sender !== undefined &&
2085
+ (typeof sender !== 'string' || !Address.isEqual(sender as Address.Address, filter.sender))
2086
+ )
2087
+ return false
2088
+
2089
+ const amount = filter.amount
2090
+ if (amount === undefined && filter.token === undefined) return true
2091
+ for (const key of tokenKeys) {
2092
+ const token = data[key]
2093
+ if (!token) continue
2094
+ if (filter.token !== undefined && !Address.isEqual(token.address, filter.token)) continue
2095
+ const value = BigInt(token.amount)
2096
+ if (amount?.from !== undefined && value < amount.from) continue
2097
+ if (amount?.to !== undefined && value > amount.to) continue
2098
+ return true
2099
+ }
2100
+ return false
2101
+ }
2102
+
2103
+ /** Applies exact participant and same-leg token predicates after classification. */
2104
+ export function filterActivities<item extends UnenrichedItem>(
2105
+ options: filterActivities.Options<item>,
2106
+ ): item[] {
2107
+ const { filter, items } = options
2108
+ return items.filter((item) => matchesActivityFilter(item, filter))
2109
+ }
2110
+
2111
+ export declare namespace filterActivities {
2112
+ /** Inputs for exact classified activity refinement. */
2113
+ type Options<item extends UnenrichedItem> = {
2114
+ /** Exact participant and token-leg predicates. */
2115
+ filter: ActivityFilter
2116
+ /** Classified activity items to refine. */
2117
+ items: readonly item[]
2118
+ }
2119
+ }
2120
+
2121
+ /** Returns whether any valued token leg in an activity falls within the requested range. */
2122
+ function matchesValuationAmount(item: Item, bounds: matchesValuationAmount.Bounds): boolean {
2123
+ if (bounds.from === undefined && bounds.to === undefined) return true
2124
+ const data = item.data as Record<string, unknown>
2125
+ for (const key of Object.values(amountKeyByTokenKey)) {
2126
+ const amount = data[key]
2127
+ if (!amount || typeof amount !== 'object' || !('valuation' in amount)) continue
2128
+ const valuation = amount.valuation
2129
+ if (!valuation || typeof valuation !== 'object' || !('amount' in valuation)) continue
2130
+ if (typeof valuation.amount !== 'string') continue
2131
+ const value = parseValuationAmount(valuation.amount)
2132
+ if (bounds.from !== undefined && value < bounds.from) continue
2133
+ if (bounds.to !== undefined && value > bounds.to) continue
2134
+ return true
2135
+ }
2136
+ return false
2137
+ }
2138
+
2139
+ declare namespace matchesValuationAmount {
2140
+ type Bounds = {
2141
+ from?: bigint | undefined
2142
+ to?: bigint | undefined
2143
+ }
2144
+ }
2145
+
1954
2146
  /** The base fields ({@link schema.base}) every activity item carries. */
1955
2147
  type Base = {
1956
2148
  id: string
@@ -2011,10 +2203,23 @@ export type Provider = {
2011
2203
  fetchRows(options: {
2012
2204
  address: Address.Address
2013
2205
  cursor?: string | undefined
2206
+ /** Sound indexed predicates that may reduce the candidate set before classification. */
2207
+ filter?: CandidateFilter | undefined
2014
2208
  limit: number
2015
2209
  }): Promise<{ rows: Row[] }>
2016
2210
  }
2017
2211
 
2212
+ /** A reusable two-stage filter: sound indexed candidate narrowing plus exact classified refinement. */
2213
+ type QueryFilter<item extends UnenrichedItem = UnenrichedItem> = {
2214
+ /** Predicates the provider can apply without excluding a possible classified match. */
2215
+ candidate?: CandidateFilter | undefined
2216
+ /** Exact API semantics evaluated after transaction-level classification. */
2217
+ refine?: ((items: readonly item[]) => Promise<item[]> | item[]) | undefined
2218
+ }
2219
+
2220
+ /** Sound predicates an activity provider can apply before classification. */
2221
+ export type CandidateFilter = ActivityFilter
2222
+
2018
2223
  /** Internal group of rows that share a transaction hash. */
2019
2224
  type TxGroup = {
2020
2225
  blockNum: number
@@ -2105,20 +2310,77 @@ export function addresses(options: addresses.Options = {}) {
2105
2310
 
2106
2311
  try {
2107
2312
  const chainId = query.chainId ?? c.get('chainId')
2313
+ const amountBounds = {
2314
+ from: parseRawAmount(query['amount.from']),
2315
+ to: parseRawAmount(query['amount.to']),
2316
+ }
2317
+ const valuationBounds = {
2318
+ from:
2319
+ query['valuation.amount.from'] === undefined
2320
+ ? undefined
2321
+ : parseValuationAmount(query['valuation.amount.from']),
2322
+ to:
2323
+ query['valuation.amount.to'] === undefined
2324
+ ? undefined
2325
+ : parseValuationAmount(query['valuation.amount.to']),
2326
+ }
2327
+ const filterByValuation =
2328
+ valuationBounds.from !== undefined || valuationBounds.to !== undefined
2329
+ const activityFilter = {
2330
+ ...(amountBounds.from !== undefined || amountBounds.to !== undefined
2331
+ ? { amount: amountBounds }
2332
+ : {}),
2333
+ ...(query.recipient ? { recipient: query.recipient } : {}),
2334
+ ...(query.sender ? { sender: query.sender } : {}),
2335
+ ...(query.token ? { token: query.token } : {}),
2336
+ }
2337
+ const candidate = Object.keys(activityFilter).length > 0 ? activityFilter : undefined
2338
+ const types = new Set(query.type)
2339
+ const refine = types.size > 0 || candidate ? <item extends UnenrichedItem>(items: readonly item[]) => filterActivities({ filter: activityFilter, items: items.filter((item) => types.size === 0 || types.has(item.type)) }) : undefined // prettier-ignore
2108
2340
  const listed = await Timing.time(c, 'address_activities', async () => {
2109
2341
  if (!query.include.includes('zones')) {
2110
2342
  const result = await Store.memoize(
2111
2343
  (signal) =>
2112
- list(tidx({ chainId, signal, tidx: c.get('getTidx')(chainId) }), {
2113
- address: address as Hex.Hex,
2114
- cursor: query.cursor,
2115
- group: query.group,
2116
- limit: query.limit,
2117
- logs: query.logs,
2118
- store: c.get('store'),
2119
- }),
2344
+ list(
2345
+ tidx({
2346
+ chainId,
2347
+ signal,
2348
+ tidx: c.get('getTidx')(chainId),
2349
+ time: (name, fn) => Timing.sum(c, name, fn),
2350
+ }),
2351
+ {
2352
+ address: address as Hex.Hex,
2353
+ cursor: query.cursor,
2354
+ ...(refine || filterByValuation || candidate
2355
+ ? {
2356
+ filter: {
2357
+ candidate,
2358
+ refine: async (items: readonly UnenrichedItem[]) => {
2359
+ const filtered = refine ? refine(items) : [...items]
2360
+ if (!filterByValuation) return filtered
2361
+ const enriched = await enrichTokens(c, {
2362
+ chainId,
2363
+ denomination: query['valuation.currency'],
2364
+ include: query.include,
2365
+ items: filtered,
2366
+ oracle,
2367
+ })
2368
+ return filtered.filter((_, index) =>
2369
+ matchesValuationAmount(enriched.items[index]!, valuationBounds),
2370
+ )
2371
+ },
2372
+ },
2373
+ }
2374
+ : {}),
2375
+ group: query.group,
2376
+ limit: query.limit,
2377
+ logs: query.logs,
2378
+ store: c.get('store'),
2379
+ time: (name, fn) => Timing.sum(c, name, fn),
2380
+ },
2381
+ ),
2120
2382
  {
2121
- key: `activities:v1:${chainId}:${address.toLowerCase()}:${query.group ?? false}:${query.logs ?? false}:${query.cursor ?? 'head'}:${query.limit}`,
2383
+ key: `activities:v4:${chainId}:${address.toLowerCase()}:${query.type.join(',')}:${query['amount.from'] ?? ''}:${query['amount.to'] ?? ''}:${query.recipient ?? ''}:${query.sender ?? ''}:${query.token ?? ''}:${query['valuation.amount.from'] ?? ''}:${query['valuation.amount.to'] ?? ''}:${query['valuation.currency'] ?? ''}:${query.group ?? false}:${query.logs ?? false}:${query.cursor ?? 'head'}:${query.limit}`,
2122
2384
  store: c.get('store'),
2123
2385
  ttl: Ttl.seconds(15),
2124
2386
  },
@@ -2134,6 +2396,26 @@ export function addresses(options: addresses.Options = {}) {
2134
2396
  listChains({
2135
2397
  address: address as Hex.Hex,
2136
2398
  cursor: query.cursor,
2399
+ ...(refine || filterByValuation || candidate
2400
+ ? {
2401
+ filter: {
2402
+ candidate,
2403
+ refine: async (items: readonly listChains.Item[]) => {
2404
+ const filtered = refine ? refine(items) : [...items]
2405
+ if (!filterByValuation) return filtered
2406
+ const enriched = await enrichChainTokens(c, {
2407
+ denomination: query['valuation.currency'],
2408
+ include: query.include,
2409
+ items: filtered,
2410
+ oracle,
2411
+ })
2412
+ return filtered.filter((_, index) =>
2413
+ matchesValuationAmount(enriched.items[index]!, valuationBounds),
2414
+ )
2415
+ },
2416
+ },
2417
+ }
2418
+ : {}),
2137
2419
  group: query.group,
2138
2420
  limit: query.limit,
2139
2421
  logs: query.logs,
@@ -2143,12 +2425,14 @@ export function addresses(options: addresses.Options = {}) {
2143
2425
  chainId,
2144
2426
  signal,
2145
2427
  tidx: c.get('getTidx')(chainId),
2428
+ time: (name, fn) => Timing.sum(c, name, fn),
2146
2429
  }),
2147
2430
  })),
2148
2431
  store: c.get('store'),
2432
+ time: (name, fn) => Timing.sum(c, name, fn),
2149
2433
  }),
2150
2434
  {
2151
- key: `activities:zones:v2:${chainIds.join(',')}:${address.toLowerCase()}:${query.group ?? false}:${query.logs ?? false}:${query.cursor ?? 'head'}:${query.limit}`,
2435
+ key: `activities:zones:v5:${chainIds.join(',')}:${address.toLowerCase()}:${query.type.join(',')}:${query['amount.from'] ?? ''}:${query['amount.to'] ?? ''}:${query.recipient ?? ''}:${query.sender ?? ''}:${query.token ?? ''}:${query['valuation.amount.from'] ?? ''}:${query['valuation.amount.to'] ?? ''}:${query['valuation.currency'] ?? ''}:${query.group ?? false}:${query.logs ?? false}:${query.cursor ?? 'head'}:${query.limit}`,
2152
2436
  store: c.get('store'),
2153
2437
  ttl: Ttl.seconds(15),
2154
2438
  },
@@ -2570,6 +2854,19 @@ type TransactionActivityOptions = getTransactionActivities.Options & {
2570
2854
  ) => Promise<value>
2571
2855
  }
2572
2856
 
2857
+ type AddressActivityTimingName =
2858
+ | 'address_activity_classify'
2859
+ | 'address_activity_mpp'
2860
+ | 'address_activity_outbound'
2861
+ | 'address_activity_transfers'
2862
+
2863
+ type AddressActivityTime = <value>(
2864
+ name: AddressActivityTimingName,
2865
+ fn: () => Promise<value> | value,
2866
+ ) => Promise<value>
2867
+
2868
+ const noAddressActivityTiming: AddressActivityTime = async (_name, fn) => fn()
2869
+
2573
2870
  /**
2574
2871
  * Lists classified activity for an address by running the shared pipeline
2575
2872
  * (`groupByTx` → `classifyGroup` → `enrichItem`) over rows from a
@@ -2578,11 +2875,14 @@ type TransactionActivityOptions = getTransactionActivities.Options & {
2578
2875
  */
2579
2876
  export async function list(provider: Provider, options: list.Options): Promise<list.ReturnType> {
2580
2877
  const { address, cursor, group = false, limit = 20, logs = false } = options
2878
+ const time = options.time ?? noAddressActivityTiming
2581
2879
  const viewer = address.toLowerCase() as Address.Address
2582
2880
 
2583
2881
  // Best-effort MPP service directory: a fetch failure yields an empty map, so
2584
2882
  // enrichment never blocks the feed.
2585
- const fingerprintMap_promise = Mpp.fingerprintMap({ store: options.store }).catch(() => ({}))
2883
+ const fingerprintMap_promise = time('address_activity_mpp', () =>
2884
+ Mpp.fingerprintMap({ store: options.store }),
2885
+ ).catch(() => ({}))
2586
2886
 
2587
2887
  let currentCursor: string | undefined = cursor
2588
2888
  const allItems: UnenrichedItem[] = []
@@ -2594,7 +2894,12 @@ export async function list(provider: Provider, options: list.Options): Promise<l
2594
2894
  // measured against grouped entries (folding can collapse a page to very few),
2595
2895
  // otherwise against the raw item count.
2596
2896
  for (let attempt = 0; attempt < 3; attempt++) {
2597
- const { rows } = await provider.fetchRows({ address: viewer, cursor: currentCursor, limit })
2897
+ const { rows } = await provider.fetchRows({
2898
+ address: viewer,
2899
+ cursor: currentCursor,
2900
+ ...(options.filter?.candidate ? { filter: options.filter.candidate } : {}),
2901
+ limit,
2902
+ })
2598
2903
  const grouped = groupByTx(rows)
2599
2904
 
2600
2905
  const txGroups = grouped.slice(0, limit + 1)
@@ -2604,11 +2909,14 @@ export async function list(provider: Provider, options: list.Options): Promise<l
2604
2909
  const fingerprintMap = await fingerprintMap_promise
2605
2910
  if (page.length === 0) break
2606
2911
 
2607
- allItems.push(
2608
- ...page.flatMap((txGroup) =>
2912
+ const classified = await time('address_activity_classify', () =>
2913
+ page.flatMap((txGroup) =>
2609
2914
  classifyGroup(txGroup, viewer, fingerprintMap, logs).map(withTitle),
2610
2915
  ),
2611
2916
  )
2917
+ allItems.push(
2918
+ ...(options.filter?.refine ? await options.filter.refine(classified) : classified),
2919
+ )
2612
2920
  lastGroup = page[page.length - 1]
2613
2921
 
2614
2922
  const enough = group
@@ -2634,6 +2942,8 @@ export declare namespace list {
2634
2942
  address: Address.Address
2635
2943
  /** Opaque cursor from a previous page; omit for the head page. */
2636
2944
  cursor?: string | undefined
2945
+ /** Indexed candidate narrowing and exact classified refinement. */
2946
+ filter?: QueryFilter | undefined
2637
2947
  /** Whether the caller will fold items into access-key groups (tunes the page-fill target). */
2638
2948
  group?: boolean | undefined
2639
2949
  /** Attach each item's full transaction `events` capture (decoded + raw logs). */
@@ -2642,6 +2952,8 @@ export declare namespace list {
2642
2952
  limit?: number | undefined
2643
2953
  /** Cache store for the MPP fingerprint-directory lookup. */
2644
2954
  store: Store.Store
2955
+ /** Request-scoped timing hook for address activity work. */
2956
+ time?: AddressActivityTime | undefined
2645
2957
  }
2646
2958
  /** Result of {@link list}. */
2647
2959
  type ReturnType = {
@@ -2670,11 +2982,14 @@ type ChainPageState = {
2670
2982
  export async function listChains(options: listChains.Options): Promise<listChains.ReturnType> {
2671
2983
  const { address, cursor, limit = 20, logs = false, providers, store } = options
2672
2984
  const group = options.group ?? false
2985
+ const time = options.time ?? noAddressActivityTiming
2673
2986
  const orderedProviders = [...providers].sort((a, b) => a.chainId - b.chainId)
2674
2987
  const chainIds = orderedProviders.map(({ chainId }) => chainId)
2675
2988
  const cursors = decodeChainCursor(cursor, chainIds)
2676
2989
  const viewer = address.toLowerCase() as Address.Address
2677
- const fingerprintMap_promise = Mpp.fingerprintMap({ store }).catch(() => ({}))
2990
+ const fingerprintMap_promise = time('address_activity_mpp', () =>
2991
+ Mpp.fingerprintMap({ store }),
2992
+ ).catch(() => ({}))
2678
2993
  const states: ChainPageState[] = orderedProviders.map(({ chainId, provider }) => ({
2679
2994
  chainId,
2680
2995
  exhausted: false,
@@ -2691,6 +3006,7 @@ export async function listChains(options: listChains.Options): Promise<listChain
2691
3006
  const { rows } = await state.provider.fetchRows({
2692
3007
  address: viewer,
2693
3008
  cursor: cursors.get(state.chainId),
3009
+ ...(options.filter?.candidate ? { filter: options.filter.candidate } : {}),
2694
3010
  limit,
2695
3011
  })
2696
3012
  const groups = groupByTx(rows).slice(0, limit + 1)
@@ -2712,16 +3028,23 @@ export async function listChains(options: listChains.Options): Promise<listChain
2712
3028
  const fingerprintMap = await fingerprintMap_promise
2713
3029
  if (page.length === 0) break
2714
3030
 
2715
- for (const { state, txGroup } of page) {
2716
- state.groups.splice(state.groups.indexOf(txGroup), 1)
2717
- cursors.set(state.chainId, state.provider.cursorForGroup(txGroup))
2718
- allItems.push(
2719
- ...classifyGroup(txGroup, viewer, fingerprintMap, logs).map((item) => ({
2720
- ...withTitle(item),
2721
- chainId: state.chainId,
2722
- })),
2723
- )
2724
- }
3031
+ const classified = await time('address_activity_classify', () => {
3032
+ const items: listChains.Item[] = []
3033
+ for (const { state, txGroup } of page) {
3034
+ state.groups.splice(state.groups.indexOf(txGroup), 1)
3035
+ cursors.set(state.chainId, state.provider.cursorForGroup(txGroup))
3036
+ items.push(
3037
+ ...classifyGroup(txGroup, viewer, fingerprintMap, logs).map((item) => ({
3038
+ ...withTitle(item),
3039
+ chainId: state.chainId,
3040
+ })),
3041
+ )
3042
+ }
3043
+ return items
3044
+ })
3045
+ allItems.push(
3046
+ ...(options.filter?.refine ? await options.filter.refine(classified) : classified),
3047
+ )
2725
3048
 
2726
3049
  hasMore = states.some((state) => !state.exhausted || state.groups.length > 0)
2727
3050
  const enough = group
@@ -2738,6 +3061,7 @@ export async function listChains(options: listChains.Options): Promise<listChain
2738
3061
  const { rows } = await state.provider.fetchRows({
2739
3062
  address: viewer,
2740
3063
  cursor: cursors.get(state.chainId),
3064
+ ...(options.filter?.candidate ? { filter: options.filter.candidate } : {}),
2741
3065
  limit: 1,
2742
3066
  })
2743
3067
  const group = groupByTx(rows)[0]
@@ -2774,6 +3098,8 @@ export declare namespace listChains {
2774
3098
  address: Address.Address
2775
3099
  /** Opaque multi-chain cursor from a previous page. */
2776
3100
  cursor?: string | undefined
3101
+ /** Indexed candidate narrowing and exact classified refinement. */
3102
+ filter?: QueryFilter<Item> | undefined
2777
3103
  /** Whether the caller will fold access-key items. */
2778
3104
  group?: boolean | undefined
2779
3105
  /** Target number of transaction groups per page. */
@@ -2784,6 +3110,8 @@ export declare namespace listChains {
2784
3110
  providers: readonly ChainProvider[]
2785
3111
  /** Cache store for the MPP fingerprint-directory lookup. */
2786
3112
  store: Store.Store
3113
+ /** Request-scoped timing hook for address activity work. */
3114
+ time?: AddressActivityTime | undefined
2787
3115
  }
2788
3116
 
2789
3117
  /** Multi-chain classified page before token enrichment. */
@@ -2820,16 +3148,13 @@ function encodeChainCursor(cursors: ReadonlyMap<number, string>, chainIds: reado
2820
3148
  }
2821
3149
 
2822
3150
  /**
2823
- * Creates a TIDX-backed {@link Provider} that runs three sub-queries in
2824
- * parallel and merges them:
2825
- * - Q1 (outbound): page receipts where the address is `from` or `fee_payer`,
2826
- * then fetch the selected transactions' logs with a bounded lookup.
2827
- * - Q2 (inbound): decoded `Transfer` events to the address.
2828
- * - Q3 (outbound transfers): decoded `Transfer` events from the address
2829
- * (catches access-key-signed sends where `tx.from` differs from the address).
3151
+ * Creates a TIDX-backed {@link Provider} that runs two sub-queries in parallel:
3152
+ * one joins bounded outbound transactions to their logs, and one reads inbound
3153
+ * and outbound `Transfer` logs.
2830
3154
  */
2831
3155
  export function tidx(deps: tidx.Deps): Provider {
2832
3156
  const { chainId, signal, tidx: tidxClient } = deps
3157
+ const time = deps.time ?? noAddressActivityTiming
2833
3158
 
2834
3159
  const fetch: Tidx.Client['fetch'] = (options) => {
2835
3160
  const requestSignal =
@@ -2851,187 +3176,310 @@ export function tidx(deps: tidx.Deps): Provider {
2851
3176
  return { blockNum: decoded[0] as number, txIdx: decoded[1] as number }
2852
3177
  }
2853
3178
 
2854
- /**
2855
- * Q1 pages outbound receipts, then fetches their logs by bounded block range
2856
- * and transaction hash. The cursor preserves block and transaction index order.
2857
- */
3179
+ /** Q1 joins bounded outbound transactions to their logs. */
2858
3180
  async function queryOutbound(options: {
2859
3181
  address: Address.Address
2860
3182
  cursor: { blockNum: number; txIdx: number } | undefined
2861
3183
  limit: number
2862
3184
  }): Promise<Row[]> {
2863
3185
  const { address, cursor, limit } = options
2864
- const keyset = cursor
3186
+ const receiptKeyset = cursor
2865
3187
  ? `AND block_num <= ${cursor.blockNum} AND (block_num < ${cursor.blockNum} OR tx_idx < ${cursor.txIdx})`
2866
3188
  : ''
2867
3189
  const queryLimit = limit + 1
2868
- const fetchReceipts = (side: 'fee_payer' | 'from') =>
3190
+ const txKeyset = cursor
3191
+ ? `AND block_num <= ${cursor.blockNum} AND (block_num < ${cursor.blockNum} OR idx < ${cursor.txIdx})`
3192
+ : ''
3193
+ const result = await time('address_activity_outbound', () =>
2869
3194
  fetch({
2870
3195
  chainId,
2871
3196
  // Raw-table query (no signature-decoded CTE), so the inline SQL is cast
2872
3197
  // to `string`.
2873
3198
  query: `
2874
- SELECT tx_hash, block_num, block_timestamp, tx_idx, "from", fee_payer
2875
- FROM receipts
2876
- WHERE "${side}" = '${address}' ${keyset}
2877
- ORDER BY block_num DESC, tx_idx DESC
2878
- LIMIT ${queryLimit}
3199
+ WITH outbound_candidates AS (
3200
+ (SELECT hash AS tx_hash, block_num, block_timestamp, idx AS tx_idx, "from", fee_payer
3201
+ FROM txs
3202
+ WHERE "from" = '${address}' ${txKeyset}
3203
+ ORDER BY block_num DESC, idx DESC
3204
+ LIMIT ${queryLimit})
3205
+ UNION
3206
+ (SELECT tx_hash, block_num, block_timestamp, tx_idx, "from", fee_payer
3207
+ FROM receipts
3208
+ WHERE fee_payer = '${address}' ${receiptKeyset}
3209
+ ORDER BY block_num DESC, tx_idx DESC
3210
+ LIMIT ${queryLimit})
3211
+ ), outbound AS (
3212
+ SELECT tx_hash, block_num, block_timestamp, tx_idx, "from", fee_payer
3213
+ FROM outbound_candidates
3214
+ ORDER BY block_num DESC, tx_idx DESC
3215
+ LIMIT ${queryLimit}
3216
+ )
3217
+ SELECT outbound.tx_hash, outbound.block_num, outbound.block_timestamp,
3218
+ outbound.tx_idx, outbound."from", outbound.fee_payer, logs.log_idx,
3219
+ logs.address, logs.selector, logs.topic1, logs.topic2, logs.topic3, logs.data
3220
+ FROM outbound
3221
+ INNER JOIN logs
3222
+ ON logs.tx_hash = outbound.tx_hash AND logs.block_num = outbound.block_num
3223
+ ORDER BY outbound.block_num DESC, outbound.tx_idx DESC, logs.log_idx ASC
2879
3224
  ` as string,
2880
- })
2881
-
2882
- // Fetching `limit + 1` from each side is sufficient to form the newest
2883
- // `limit + 1` transactions after the two ordered sets are merged.
2884
- const [paid, sent] = await Promise.all([fetchReceipts('fee_payer'), fetchReceipts('from')])
2885
- const seen = new Set<string>()
2886
- const receipts = [...paid.rows, ...sent.rows]
2887
- .map((r) => ({
2888
- blockNum: Number(Value.toNumber(r['block_num'])),
2889
- blockTimestamp: Number(Value.toNumber(r['block_timestamp'])),
2890
- feePayer: lowerOrNull(r['fee_payer']),
2891
- txHash: lowerHash(r['tx_hash']),
2892
- txIdx: Number(Value.toNumber(r['tx_idx'])),
2893
- txSender: lowerOrNull(r['from']),
2894
- }))
2895
- .filter((receipt) => {
2896
- if (seen.has(receipt.txHash)) return false
2897
- seen.add(receipt.txHash)
2898
- return true
2899
- })
2900
- .sort((a, b) => {
2901
- if (a.blockNum !== b.blockNum) return b.blockNum - a.blockNum
2902
- return b.txIdx - a.txIdx
2903
- })
2904
- .slice(0, queryLimit)
2905
- if (receipts.length === 0) return []
2906
-
2907
- const blocks = receipts.map((receipt) => receipt.blockNum)
2908
- const receiptByHash = new Map(receipts.map((receipt) => [receipt.txHash, receipt]))
2909
- const txHashes = receipts.map((receipt) => `'${receipt.txHash}'`).join(', ')
2910
-
2911
- // `logs` is not keyed by transaction hash, so pair the bounded hash list
2912
- // with the selected receipts' block range to avoid a full archive scan.
2913
- const logs = await fetch({
2914
- chainId,
2915
- // Raw-table query (no signature-decoded CTE), so the inline SQL is cast
2916
- // to `string`.
2917
- query: `
2918
- SELECT tx_hash, block_num, tx_idx, log_idx, address, selector, topic1, topic2, topic3, data
2919
- FROM logs
2920
- WHERE block_num BETWEEN ${Math.min(...blocks)} AND ${Math.max(...blocks)}
2921
- AND tx_hash IN (${txHashes})
2922
- ORDER BY block_num DESC, tx_idx DESC, log_idx ASC
2923
- ` as string,
2924
- })
3225
+ }),
3226
+ )
2925
3227
 
2926
- const rows = logs.rows.flatMap((r) => {
2927
- const receipt = receiptByHash.get(lowerHash(r['tx_hash']))
2928
- if (!receipt) return []
2929
- return [
2930
- {
2931
- blockNum: receipt.blockNum,
2932
- blockTimestamp: receipt.blockTimestamp,
2933
- data: Value.toText(r['data']) ?? null,
2934
- feePayer: receipt.feePayer,
2935
- logAddress: lower(r['address']),
2936
- logIdx: Number(Value.toNumber(r['log_idx'])),
2937
- selector: Value.toText(r['selector']) ?? null,
2938
- source: 'q1' as const,
2939
- topic1: Value.toText(r['topic1']) ?? null,
2940
- topic2: Value.toText(r['topic2']) ?? null,
2941
- topic3: Value.toText(r['topic3']) ?? null,
2942
- txHash: receipt.txHash,
2943
- txIdx: receipt.txIdx,
2944
- txSender: receipt.txSender,
2945
- },
2946
- ]
2947
- })
2948
- return mergeAndSort(rows, [], [])
3228
+ return result.rows.map((r) => ({
3229
+ blockNum: Number(Value.toNumber(r['block_num'])),
3230
+ blockTimestamp: Number(Value.toNumber(r['block_timestamp'])),
3231
+ data: Value.toText(r['data']) ?? null,
3232
+ feePayer: lowerOrNull(r['fee_payer']),
3233
+ logAddress: lower(r['address']),
3234
+ logIdx: Number(Value.toNumber(r['log_idx'])),
3235
+ selector: Value.toText(r['selector']) ?? null,
3236
+ source: 'q1' as const,
3237
+ topic1: Value.toText(r['topic1']) ?? null,
3238
+ topic2: Value.toText(r['topic2']) ?? null,
3239
+ topic3: Value.toText(r['topic3']) ?? null,
3240
+ txHash: lowerHash(r['tx_hash']),
3241
+ txIdx: Number(Value.toNumber(r['tx_idx'])),
3242
+ txSender: lowerOrNull(r['from']),
3243
+ }))
2949
3244
  }
2950
3245
 
2951
- /** Q2/Q3: decoded `Transfer` events on one side of the address. */
3246
+ /** Q2 reads inbound and outbound `Transfer` logs in one request. */
2952
3247
  async function queryTransfers(options: {
2953
3248
  address: Address.Address
2954
3249
  cursor: { blockNum: number; txIdx: number } | undefined
3250
+ filter: CandidateFilter | undefined
2955
3251
  limit: number
2956
- side: 'inbound' | 'outbound'
2957
3252
  }): Promise<Row[]> {
2958
- const { address, cursor, limit, side } = options
2959
- const where =
2960
- side === 'inbound'
2961
- ? `"to" = '${address}' AND "from" != '${address}'`
2962
- : `"from" = '${address}' AND "to" != '${address}'`
2963
- const keyset = cursor ? `AND block_num < ${cursor.blockNum}` : ''
2964
- const query = (blockKey?: string) => `
2965
- SELECT "from", "to", address, value, tx_hash, block_num, block_timestamp, log_idx, tx_idx
2966
- FROM Transfer
2967
- WHERE ${where} ${keyset}
2968
- ${blockKey ? `ORDER BY ${blockKey} DESC, tx_idx DESC` : ''}
2969
- LIMIT ${blockKey ? limit * 4 : Schema.countCap}
2970
- `
2971
- const result = await (async () => {
3253
+ const { address, cursor, filter, limit } = options
3254
+ const keyset = cursor
3255
+ ? `AND (block_num < ${cursor.blockNum} OR (block_num = ${cursor.blockNum} AND tx_idx < ${cursor.txIdx}))`
3256
+ : ''
3257
+ const amount = filter?.amount
3258
+ const participantPredicates = [
3259
+ ...(filter?.recipient !== undefined ? [`"to" = '${filter.recipient}'`] : []),
3260
+ ...(filter?.sender !== undefined ? [`"from" = '${filter.sender}'`] : []),
3261
+ ]
3262
+ const materializedPredicate = [
3263
+ ...participantPredicates,
3264
+ ...(filter?.token !== undefined ? [`token = '${filter.token}'`] : []),
3265
+ ...(amount?.from !== undefined
3266
+ ? amount.from > maxTokenAmount
3267
+ ? ['0']
3268
+ : [`toUInt256(amount) >= toUInt256('${amount.from}')`]
3269
+ : []),
3270
+ ...(amount?.to !== undefined && amount.to < maxTokenAmount
3271
+ ? [`toUInt256(amount) <= toUInt256('${amount.to}')`]
3272
+ : []),
3273
+ ]
3274
+ .map((predicate) => `AND ${predicate}`)
3275
+ .join(' ')
3276
+ const decodedPredicate = [
3277
+ ...participantPredicates,
3278
+ ...(filter?.token !== undefined ? [`address = '${filter.token}'`] : []),
3279
+ ...(amount?.from !== undefined
3280
+ ? amount.from > maxTokenAmount
3281
+ ? ['0']
3282
+ : [`value >= ${amount.from}`]
3283
+ : []),
3284
+ ...(amount?.to !== undefined && amount.to < maxTokenAmount ? [`value <= ${amount.to}`] : []),
3285
+ ]
3286
+ .map((predicate) => `AND ${predicate}`)
3287
+ .join(' ')
3288
+ const queryLimit = limit + 1
3289
+ const result = await time('address_activity_transfers', async () => {
2972
3290
  try {
2973
3291
  return await fetch({
2974
3292
  chainId,
2975
- query: query('block_num'),
2976
- signatures: [transferSignature],
3293
+ engine: 'clickhouse',
3294
+ // Bound transaction candidates first, then return every matching row
3295
+ // for each selected transaction so the group cursor cannot split one.
3296
+ query: `
3297
+ WITH transfer_candidates AS (
3298
+ (SELECT DISTINCT tx_hash, block_num, tx_idx
3299
+ FROM token_transfers
3300
+ WHERE "to" = '${address}' AND "from" != '${address}' ${materializedPredicate} ${keyset}
3301
+ ORDER BY block_num DESC, tx_idx DESC
3302
+ LIMIT ${queryLimit})
3303
+ UNION DISTINCT
3304
+ (SELECT DISTINCT tx_hash, block_num, tx_idx
3305
+ FROM token_transfers
3306
+ WHERE "from" = '${address}' AND "to" != '${address}' ${materializedPredicate} ${keyset}
3307
+ ORDER BY block_num DESC, tx_idx DESC
3308
+ LIMIT ${queryLimit})
3309
+ ), selected_transactions AS (
3310
+ SELECT tx_hash, block_num, tx_idx
3311
+ FROM transfer_candidates
3312
+ ORDER BY block_num DESC, tx_idx DESC
3313
+ LIMIT ${queryLimit}
3314
+ )
3315
+ SELECT DISTINCT indexed.token AS address,
3316
+ toString(toUInt256(indexed.amount)) AS amount, indexed.tx_hash, indexed.block_num,
3317
+ toUnixTimestamp(indexed.block_timestamp) AS block_timestamp_unix,
3318
+ indexed.log_idx, indexed.tx_idx, indexed."from", indexed."to"
3319
+ FROM token_transfers AS indexed
3320
+ INNER JOIN selected_transactions AS selected
3321
+ ON selected.tx_hash = indexed.tx_hash AND selected.block_num = indexed.block_num
3322
+ AND selected.tx_idx = indexed.tx_idx
3323
+ WHERE (indexed."to" = '${address}' AND indexed."from" != '${address}')
3324
+ OR (indexed."from" = '${address}' AND indexed."to" != '${address}')
3325
+ ORDER BY indexed.block_num DESC, indexed.tx_idx DESC, indexed.log_idx DESC
3326
+ ` as string,
2977
3327
  })
2978
3328
  } catch (error) {
2979
- if (!Tidx.isDeterministicError(error)) throw error
2980
- try {
2981
- // The expression blocks a mis-selected block-ordered top-N walk.
2982
- return await fetch({
2983
- chainId,
2984
- query: query('block_num + 0'),
2985
- signatures: [transferSignature],
2986
- })
2987
- } catch (fallbackError) {
2988
- if (!Tidx.isDeterministicError(fallbackError)) throw fallbackError
2989
- const result = await fetch({
2990
- chainId,
2991
- query: query(),
2992
- signatures: [transferSignature],
2993
- })
2994
- // An unordered sample cannot safely produce an activity cursor.
2995
- if (result.rows.length >= Schema.countCap) throw fallbackError
2996
- return result
3329
+ // Older indexers reject materialized address scans. Retain the decoded
3330
+ // Transfer source so activity feeds remain available on those chains.
3331
+ if (!Tidx.isQueryRejection(error)) throw error
3332
+ const predicates = [
3333
+ `"to" = '${address}' AND "from" != '${address}'`,
3334
+ `"from" = '${address}' AND "to" != '${address}'`,
3335
+ ]
3336
+ const fetchDecoded = async (predicate: string, queryLimit: number) => {
3337
+ const where = `WHERE ${predicate} ${decodedPredicate}`
3338
+ try {
3339
+ return await fetch({
3340
+ chainId,
3341
+ query: `
3342
+ SELECT DISTINCT tx_hash, block_num, tx_idx
3343
+ FROM Transfer
3344
+ ${where}
3345
+ ORDER BY block_num DESC, tx_idx DESC
3346
+ LIMIT ${queryLimit}
3347
+ ` as string,
3348
+ signatures: [Transfers.signature],
3349
+ })
3350
+ } catch (error) {
3351
+ // Match the transfer feed's bounded fallback when sparse decoded
3352
+ // top-N queries are rejected by an older indexer.
3353
+ if (!Tidx.isDeterministicError(error)) throw error
3354
+ const sample = await fetch({
3355
+ chainId,
3356
+ query: `
3357
+ SELECT DISTINCT tx_hash, block_num, tx_idx
3358
+ FROM Transfer
3359
+ ${where}
3360
+ LIMIT ${Schema.countCap}
3361
+ ` as string,
3362
+ signatures: [Transfers.signature],
3363
+ })
3364
+ // An unordered sample is safe only when complete. At the cap,
3365
+ // preserve the rejection rather than issue a cursor that can skip rows.
3366
+ if (sample.rows.length >= Schema.countCap) throw error
3367
+ return {
3368
+ rows: sample.rows
3369
+ .sort(
3370
+ (a, b) =>
3371
+ Number(b['block_num']) - Number(a['block_num']) ||
3372
+ Number(b['tx_idx']) - Number(a['tx_idx']),
3373
+ )
3374
+ .slice(0, queryLimit),
3375
+ }
3376
+ }
2997
3377
  }
3378
+ const rows = await Promise.all(
3379
+ predicates.map(async (predicate) => {
3380
+ const sameBlock = cursor
3381
+ ? `AND block_num = ${cursor.blockNum} AND tx_idx < ${cursor.txIdx}`
3382
+ : ''
3383
+ const first = await fetchDecoded(`${predicate} ${sameBlock}`, queryLimit)
3384
+ if (!cursor || first.rows.length >= queryLimit) return first.rows
3385
+
3386
+ const older = await fetchDecoded(
3387
+ `${predicate} AND block_num < ${cursor.blockNum}`,
3388
+ queryLimit - first.rows.length,
3389
+ )
3390
+ return [...first.rows, ...older.rows]
3391
+ }),
3392
+ )
3393
+ const candidates = rows
3394
+ .flat()
3395
+ .sort(
3396
+ (a, b) =>
3397
+ Number(b['block_num']) - Number(a['block_num']) ||
3398
+ Number(b['tx_idx']) - Number(a['tx_idx']),
3399
+ )
3400
+ const hashes = [...new Set(candidates.map((row) => lowerHash(row['tx_hash'])))].slice(
3401
+ 0,
3402
+ queryLimit,
3403
+ )
3404
+ if (hashes.length === 0) return { rows: [] }
3405
+
3406
+ // Candidate limits count transactions. Hydrate all viewer transfers,
3407
+ // including rows outside candidate filters, before classification.
3408
+ const transfers = await fetch({
3409
+ chainId,
3410
+ query: `
3411
+ SELECT address, value AS amount, tx_hash, block_num, block_timestamp,
3412
+ log_idx, tx_idx, "from", "to"
3413
+ FROM Transfer
3414
+ WHERE tx_hash IN (${hashes.map((hash) => `'${hash}'`).join(', ')})
3415
+ AND (("to" = '${address}' AND "from" != '${address}')
3416
+ OR ("from" = '${address}' AND "to" != '${address}'))
3417
+ LIMIT ${Schema.countCap}
3418
+ ` as string,
3419
+ signatures: [Transfers.signature],
3420
+ })
3421
+ // TIDX caps results even without a SQL limit. Never publish a page
3422
+ // whose selected transactions might have been truncated by that cap.
3423
+ if (transfers.rows.length >= Schema.countCap) throw error
3424
+ return transfers
2998
3425
  }
2999
- })()
3000
- const rows = result.rows.map((r) => ({
3001
- blockNum: Number(Value.toNumber(r['block_num'])),
3002
- blockTimestamp: Number(Value.toNumber(r['block_timestamp'])),
3003
- data: null,
3004
- feePayer: null,
3005
- logAddress: lower(r['address']),
3006
- logIdx: Number(Value.toNumber(r['log_idx'])),
3007
- selector: null,
3008
- source: 'q2' as const,
3009
- topic1: null,
3010
- topic2: null,
3011
- topic3: null,
3012
- transferAmount: BigInt(Value.toIntegerString(r['value']) ?? '0'),
3013
- transferFrom: lower(r['from']),
3014
- transferTo: lower(r['to']),
3015
- transferToken: lower(r['address']),
3016
- txHash: lowerHash(r['tx_hash']),
3017
- txIdx: Number(Value.toNumber(r['tx_idx'])),
3018
- txSender: null,
3019
- }))
3020
- return mergeAndSort([], rows, []).slice(0, limit * 4)
3426
+ })
3427
+ const rows = result.rows.flatMap((r) => {
3428
+ const transferAmount = Value.toIntegerString(r['amount'])
3429
+ const transferFrom = lowerOrNull(r['from'])
3430
+ const transferTo = lowerOrNull(r['to'])
3431
+ const blockTimestamp = (() => {
3432
+ const value = r['block_timestamp_unix'] ?? r['block_timestamp']
3433
+ const numeric = Value.toNumber(value)
3434
+ if (numeric !== undefined && Number.isFinite(numeric)) return numeric
3435
+ const timestamp = Value.toIsoDateTime(value)
3436
+ return timestamp === undefined ? undefined : Date.parse(timestamp) / 1_000
3437
+ })()
3438
+ if (
3439
+ transferAmount === undefined ||
3440
+ !transferFrom ||
3441
+ !transferTo ||
3442
+ blockTimestamp === undefined ||
3443
+ !Number.isFinite(blockTimestamp)
3444
+ )
3445
+ return []
3446
+ return [
3447
+ {
3448
+ blockNum: Number(Value.toNumber(r['block_num'])),
3449
+ blockTimestamp,
3450
+ data: null,
3451
+ feePayer: null,
3452
+ logAddress: lower(r['address']),
3453
+ logIdx: Number(Value.toNumber(r['log_idx'])),
3454
+ selector: null,
3455
+ source: 'q2' as const,
3456
+ topic1: null,
3457
+ topic2: null,
3458
+ topic3: null,
3459
+ transferAmount: BigInt(transferAmount),
3460
+ transferFrom,
3461
+ transferTo,
3462
+ transferToken: lower(r['address']),
3463
+ txHash: lowerHash(r['tx_hash']),
3464
+ txIdx: Number(Value.toNumber(r['tx_idx'])),
3465
+ txSender: null,
3466
+ },
3467
+ ]
3468
+ })
3469
+ return mergeAndSort([], rows, [])
3021
3470
  }
3022
3471
 
3023
3472
  return {
3024
3473
  cursorForGroup(group) {
3025
3474
  return Cursor.encode([group.blockNum, group.txIdx])
3026
3475
  },
3027
- async fetchRows({ address, cursor, limit }) {
3476
+ async fetchRows({ address, cursor, filter, limit }) {
3028
3477
  const parsed = cursor ? parseCursor(cursor) : undefined
3029
- const [q1, q2, q3] = await Promise.all([
3478
+ const [q1, q2] = await Promise.all([
3030
3479
  queryOutbound({ address, cursor: parsed, limit }),
3031
- queryTransfers({ address, cursor: parsed, limit, side: 'inbound' }),
3032
- queryTransfers({ address, cursor: parsed, limit, side: 'outbound' }),
3480
+ queryTransfers({ address, cursor: parsed, filter, limit }),
3033
3481
  ])
3034
- return { rows: mergeAndSort(q1, q2, q3) }
3482
+ return { rows: mergeAndSort(q1, q2, []) }
3035
3483
  },
3036
3484
  }
3037
3485
  }
@@ -3045,6 +3493,8 @@ export declare namespace tidx {
3045
3493
  signal?: AbortSignal | undefined
3046
3494
  /** TIDX query client. */
3047
3495
  tidx: Tidx.Client
3496
+ /** Request-scoped timing hook for the provider's logical queries. */
3497
+ time?: AddressActivityTime | undefined
3048
3498
  }
3049
3499
  }
3050
3500
 
@@ -3476,7 +3926,7 @@ function classifyFromLogsCore(
3476
3926
  if (nested) claim(nested)
3477
3927
  else takeEvent((e) => e.eventName === 'Deposited' && Address.isEqual(e.address, vault))
3478
3928
  claimVaultLegs(vault, [args.inputAmount, args.vaultAssets, args.earnShares])
3479
- // The funding leg pays the router (the emitting contract), not the vault.
3929
+ // The routes leg pays the router (the emitting contract), not the vault.
3480
3930
  claimVaultLegs(event.address as Address.Address, [args.inputAmount])
3481
3931
  return { ...itemBase(event.logIndex), data, type: 'private-assets-deposited' }
3482
3932
  })
@@ -4359,7 +4809,7 @@ function classifyFromLogsCore(
4359
4809
  })
4360
4810
 
4361
4811
  // Reward pool funded: the funded token is the emitting contract itself;
4362
- // claim the funding transfer.
4812
+ // claim the route transfer.
4363
4813
  recognize(named('RewardDistributed'), (event) => {
4364
4814
  const args = event.args as { amount: bigint; funder: Address.Address }
4365
4815
  takeTransfer(
@@ -5136,7 +5586,7 @@ function decodeRows(rows: readonly Row[]) {
5136
5586
  // logs per log and can yield `args: undefined`; normalize so `in`-guards
5137
5587
  // never throw.
5138
5588
  return parseEventLogs({
5139
- abi: [...Abis.abis, ...Abis.earnRouter, ...Abis.earnVault, ...erc4626Events],
5589
+ abi: [...Abis.core, ...Abis.earnRouter, ...Abis.earnVault, ...erc4626Events],
5140
5590
  logs,
5141
5591
  strict: false,
5142
5592
  }).map((event) => ({ ...event, args: event.args ?? {} }))
@@ -5242,19 +5692,26 @@ function getActivityTokenMetadata(
5242
5692
  ): Promise<Omit<ResolvedToken, 'verified'>> {
5243
5693
  const { address, chainId } = options
5244
5694
  if (address.startsWith(tip20AddressPrefix))
5245
- return Tokens.getTokenMetadata(c, { address, chainId })
5695
+ return Tokens.getTokenMetadata(c, {
5696
+ address,
5697
+ chainId,
5698
+ timeOrigin: (fn) => Timing.sum(c, 'activity_token_metadata_origin', fn),
5699
+ })
5246
5700
 
5247
5701
  return Store.memoize(
5248
- async () => {
5249
- const metadata = await viem_Token.getMetadata(c.get('getClient')(chainId), { token: address })
5250
- // ERC-20 has no currency field; its symbol is the amount's unit label.
5251
- return {
5252
- currency: metadata.symbol,
5253
- decimals: metadata.decimals,
5254
- name: metadata.name,
5255
- symbol: metadata.symbol,
5256
- }
5257
- },
5702
+ () =>
5703
+ Timing.sum(c, 'activity_token_metadata_origin', async () => {
5704
+ const metadata = await viem_Token.getMetadata(c.get('getClient')(chainId), {
5705
+ token: address,
5706
+ })
5707
+ // ERC-20 has no currency field; its symbol is the amount's unit label.
5708
+ return {
5709
+ currency: metadata.symbol,
5710
+ decimals: metadata.decimals,
5711
+ name: metadata.name,
5712
+ symbol: metadata.symbol,
5713
+ }
5714
+ }),
5258
5715
  { key: `token:erc20:v1:${chainId}:${address}:metadata`, store: c.get('store'), ttl: Ttl.minutes(1) }, // prettier-ignore
5259
5716
  )
5260
5717
  }
@@ -5278,21 +5735,31 @@ async function enrichTokens(
5278
5735
  for (const item of items) collectTokens(item, addresses)
5279
5736
  const includeLogoUri = include.includes('token.logoUri')
5280
5737
  const includeVerified = include.includes('token.verified')
5738
+ const tokenAddresses = [...addresses]
5281
5739
  const resolved_promise =
5282
- addresses.size > 0
5283
- ? Timing.time(c, 'tokens', () =>
5284
- Promise.all(
5285
- [...addresses].map(async (address) => {
5286
- const [logoUri, metadata] = await Promise.all([
5287
- includeLogoUri
5288
- ? Tokens.getTokenLogo(c, { address, chainId }).catch(() => undefined)
5289
- : undefined,
5290
- getActivityTokenMetadata(c, { address, chainId }),
5291
- ])
5292
- return { address: address.toLowerCase(), logoUri, metadata }
5293
- }),
5294
- ),
5295
- )
5740
+ tokenAddresses.length > 0
5741
+ ? Timing.time(c, 'tokens', async () => {
5742
+ const metadata_promise = Timing.sum(c, 'activity_token_metadata', () =>
5743
+ Promise.all(
5744
+ tokenAddresses.map((address) => getActivityTokenMetadata(c, { address, chainId })),
5745
+ ),
5746
+ )
5747
+ const logoUris_promise = includeLogoUri
5748
+ ? Timing.sum(c, 'activity_token_logos', () =>
5749
+ Promise.all(
5750
+ tokenAddresses.map((address) =>
5751
+ Tokens.getTokenLogo(c, { address, chainId }).catch(() => undefined),
5752
+ ),
5753
+ ),
5754
+ )
5755
+ : Promise.resolve(tokenAddresses.map(() => undefined))
5756
+ const [metadata, logoUris] = await Promise.all([metadata_promise, logoUris_promise])
5757
+ return tokenAddresses.map((address, index) => ({
5758
+ address: address.toLowerCase(),
5759
+ logoUri: logoUris[index],
5760
+ metadata: metadata[index]!,
5761
+ }))
5762
+ })
5296
5763
  : undefined
5297
5764
  // Curated data is needed only for requested valuation or token fields.
5298
5765
  const snapshot_promise =