tapimo 0.15.1 → 0.18.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 (709) hide show
  1. package/README.md +137 -0
  2. package/dist/ApiKey.d.ts +1 -0
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +4 -2
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +37 -11
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +163 -10
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +13085 -11974
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +46 -15
  13. package/dist/App.js.map +1 -1
  14. package/dist/Scope.d.ts +1 -1
  15. package/dist/Scope.d.ts.map +1 -1
  16. package/dist/Scope.js +1 -1
  17. package/dist/Scope.js.map +1 -1
  18. package/dist/admin/App.d.ts +893 -191
  19. package/dist/admin/App.d.ts.map +1 -1
  20. package/dist/admin/App.js +5 -1
  21. package/dist/admin/App.js.map +1 -1
  22. package/dist/admin/apps/api-keys.d.ts +70 -70
  23. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.js +8 -3
  25. package/dist/admin/apps/api-keys.js.map +1 -1
  26. package/dist/admin/apps/earn-vaults.d.ts +66 -27
  27. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  28. package/dist/admin/apps/earn-vaults.js +36 -7
  29. package/dist/admin/apps/earn-vaults.js.map +1 -1
  30. package/dist/admin/apps/organizations.d.ts +25 -25
  31. package/dist/admin/apps/organizations.d.ts.map +1 -1
  32. package/dist/admin/apps/organizations.js +5 -4
  33. package/dist/admin/apps/organizations.js.map +1 -1
  34. package/dist/admin/apps/route-policies.d.ts +632 -0
  35. package/dist/admin/apps/route-policies.d.ts.map +1 -0
  36. package/dist/admin/apps/route-policies.js +257 -0
  37. package/dist/admin/apps/route-policies.js.map +1 -0
  38. package/dist/admin/apps/routes-support.js +39 -3
  39. package/dist/admin/apps/routes-support.js.map +1 -1
  40. package/dist/admin/apps/routes.d.ts +529 -76
  41. package/dist/admin/apps/routes.d.ts.map +1 -1
  42. package/dist/admin/apps/routes.js +82 -1
  43. package/dist/admin/apps/routes.js.map +1 -1
  44. package/dist/admin/apps/verified-tokens.d.ts +157 -157
  45. package/dist/admin/index.d.ts +0 -1
  46. package/dist/admin/index.d.ts.map +1 -1
  47. package/dist/admin/index.js +0 -1
  48. package/dist/admin/index.js.map +1 -1
  49. package/dist/admin/ui.generated.d.ts +1 -1
  50. package/dist/admin/ui.generated.d.ts.map +1 -1
  51. package/dist/admin/ui.generated.js +205 -201
  52. package/dist/admin/ui.generated.js.map +1 -1
  53. package/dist/analytics/Analytics.d.ts.map +1 -1
  54. package/dist/analytics/Analytics.js +65 -1
  55. package/dist/analytics/Analytics.js.map +1 -1
  56. package/dist/analytics/tables/requestEvents.d.ts +1 -1
  57. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  58. package/dist/analytics/tables/requestEvents.js +58 -59
  59. package/dist/analytics/tables/requestEvents.js.map +1 -1
  60. package/dist/apps/data/App.d.ts +2709 -2670
  61. package/dist/apps/data/App.d.ts.map +1 -1
  62. package/dist/apps/data/routes/activities.d.ts +357 -357
  63. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  64. package/dist/apps/data/routes/activities.js +50 -0
  65. package/dist/apps/data/routes/activities.js.map +1 -1
  66. package/dist/apps/data/routes/addresses.d.ts +248 -248
  67. package/dist/apps/data/routes/balances.d.ts +22 -22
  68. package/dist/apps/data/routes/balances.d.ts.map +1 -1
  69. package/dist/apps/data/routes/balances.js +5 -7
  70. package/dist/apps/data/routes/balances.js.map +1 -1
  71. package/dist/apps/data/routes/blocks.d.ts +125 -125
  72. package/dist/apps/data/routes/coingecko.d.ts +54 -54
  73. package/dist/apps/data/routes/earn.d.ts +103 -12
  74. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  75. package/dist/apps/data/routes/earn.js +456 -220
  76. package/dist/apps/data/routes/earn.js.map +1 -1
  77. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  78. package/dist/apps/data/routes/exchanges.js +267 -97
  79. package/dist/apps/data/routes/exchanges.js.map +1 -1
  80. package/dist/apps/data/routes/fee-amm.d.ts +109 -127
  81. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  82. package/dist/apps/data/routes/fee-amm.js +83 -54
  83. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  84. package/dist/apps/data/routes/indexer.d.ts +43 -43
  85. package/dist/apps/data/routes/receipts.d.ts +235 -235
  86. package/dist/apps/data/routes/rpc.d.ts +30 -30
  87. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  88. package/dist/apps/data/routes/tokens.js +11 -6
  89. package/dist/apps/data/routes/tokens.js.map +1 -1
  90. package/dist/apps/data/routes/transactions.d.ts +2 -0
  91. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  92. package/dist/apps/data/routes/transactions.js +30 -22
  93. package/dist/apps/data/routes/transactions.js.map +1 -1
  94. package/dist/apps/data/routes/transfers.d.ts +77 -77
  95. package/dist/apps/data/routes/valuation.d.ts +32 -32
  96. package/dist/apps/data/routes/verified-tokens.d.ts +86 -86
  97. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  98. package/dist/apps/data/routes/webhooks.js +1 -1
  99. package/dist/apps/data/routes/webhooks.js.map +1 -1
  100. package/dist/apps/data/routes/zones.d.ts +31 -31
  101. package/dist/apps/management/App.d.ts +2909 -2064
  102. package/dist/apps/management/App.d.ts.map +1 -1
  103. package/dist/apps/management/App.js +2 -0
  104. package/dist/apps/management/App.js.map +1 -1
  105. package/dist/apps/management/Billing.d.ts +2 -4
  106. package/dist/apps/management/Billing.d.ts.map +1 -1
  107. package/dist/apps/management/Billing.js +65 -26
  108. package/dist/apps/management/Billing.js.map +1 -1
  109. package/dist/apps/management/routes/api-keys.d.ts +257 -245
  110. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  111. package/dist/apps/management/routes/api-keys.js +70 -11
  112. package/dist/apps/management/routes/api-keys.js.map +1 -1
  113. package/dist/apps/management/routes/billing.d.ts +84 -84
  114. package/dist/apps/management/routes/cli.d.ts +912 -0
  115. package/dist/apps/management/routes/cli.d.ts.map +1 -0
  116. package/dist/apps/management/routes/cli.js +416 -0
  117. package/dist/apps/management/routes/cli.js.map +1 -0
  118. package/dist/apps/management/routes/faucet.d.ts +8 -8
  119. package/dist/apps/management/routes/invitations.d.ts +138 -138
  120. package/dist/apps/management/routes/invite-links.d.ts +172 -172
  121. package/dist/apps/management/routes/members.d.ts +16 -16
  122. package/dist/apps/management/routes/orgs.d.ts +104 -104
  123. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  124. package/dist/apps/management/routes/orgs.js +8 -2
  125. package/dist/apps/management/routes/orgs.js.map +1 -1
  126. package/dist/apps/management/routes/projects.d.ts +125 -125
  127. package/dist/apps/management/routes/usage.d.ts +8 -8
  128. package/dist/apps/management/routes/verified-token-requests.d.ts +86 -86
  129. package/dist/apps/management/routes/webhooks.d.ts +485 -485
  130. package/dist/apps/mpp/App.d.ts +44 -44
  131. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
  132. package/dist/apps/mpp/internal/Policy.js +4 -2
  133. package/dist/apps/mpp/internal/Policy.js.map +1 -1
  134. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
  135. package/dist/apps/mpp/internal/Sponsorship.js +6 -4
  136. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
  137. package/dist/apps/relay/App.d.ts +8 -0
  138. package/dist/apps/relay/App.d.ts.map +1 -1
  139. package/dist/apps/relay/App.js +16 -4
  140. package/dist/apps/relay/App.js.map +1 -1
  141. package/dist/apps/relay/Sponsorships.d.ts +4 -6
  142. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  143. package/dist/apps/relay/Sponsorships.js +71 -60
  144. package/dist/apps/relay/Sponsorships.js.map +1 -1
  145. package/dist/apps/routes/Access.d.ts +53 -0
  146. package/dist/apps/routes/Access.d.ts.map +1 -1
  147. package/dist/apps/routes/Access.js +121 -0
  148. package/dist/apps/routes/Access.js.map +1 -1
  149. package/dist/apps/routes/App.d.ts +397 -158
  150. package/dist/apps/routes/App.d.ts.map +1 -1
  151. package/dist/apps/routes/App.js.map +1 -1
  152. package/dist/apps/routes/routes/chains.d.ts +25 -25
  153. package/dist/apps/routes/routes/deposit-addresses.d.ts +169 -61
  154. package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -1
  155. package/dist/apps/routes/routes/deposit-addresses.js +217 -32
  156. package/dist/apps/routes/routes/deposit-addresses.js.map +1 -1
  157. package/dist/apps/routes/routes/quotes.d.ts +171 -81
  158. package/dist/apps/routes/routes/quotes.d.ts.map +1 -1
  159. package/dist/apps/routes/routes/quotes.js +101 -27
  160. package/dist/apps/routes/routes/quotes.js.map +1 -1
  161. package/dist/apps/routes/routes/transfers.d.ts +532 -480
  162. package/dist/apps/routes/routes/transfers.d.ts.map +1 -1
  163. package/dist/apps/routes/routes/transfers.js +182 -37
  164. package/dist/apps/routes/routes/transfers.js.map +1 -1
  165. package/dist/cli/ApiKeys.d.ts +120 -0
  166. package/dist/cli/ApiKeys.d.ts.map +1 -0
  167. package/dist/cli/ApiKeys.js +138 -0
  168. package/dist/cli/ApiKeys.js.map +1 -0
  169. package/dist/cli/Cli.d.ts +92 -34
  170. package/dist/cli/Cli.d.ts.map +1 -1
  171. package/dist/cli/Cli.js +188 -11
  172. package/dist/cli/Cli.js.map +1 -1
  173. package/dist/cli/Credentials.d.ts +95 -0
  174. package/dist/cli/Credentials.d.ts.map +1 -0
  175. package/dist/cli/Credentials.js +110 -0
  176. package/dist/cli/Credentials.js.map +1 -0
  177. package/dist/cli/Spec.d.ts +59 -0
  178. package/dist/cli/Spec.d.ts.map +1 -0
  179. package/dist/cli/Spec.js +77 -0
  180. package/dist/cli/Spec.js.map +1 -0
  181. package/dist/cli/bin.js +5 -1
  182. package/dist/cli/bin.js.map +1 -1
  183. package/dist/cli/commands/admin.d.ts +5 -5
  184. package/dist/cli/commands/admin.d.ts.map +1 -1
  185. package/dist/cli/commands/auth.d.ts +73 -0
  186. package/dist/cli/commands/auth.d.ts.map +1 -0
  187. package/dist/cli/commands/auth.js +204 -0
  188. package/dist/cli/commands/auth.js.map +1 -0
  189. package/dist/cli/commands/keys.d.ts +17 -0
  190. package/dist/cli/commands/keys.d.ts.map +1 -0
  191. package/dist/cli/commands/keys.js +109 -0
  192. package/dist/cli/commands/keys.js.map +1 -0
  193. package/dist/cloudflare.d.ts +27 -2
  194. package/dist/cloudflare.d.ts.map +1 -1
  195. package/dist/cloudflare.js +144 -17
  196. package/dist/cloudflare.js.map +1 -1
  197. package/dist/db/Db.d.ts +23 -0
  198. package/dist/db/Db.d.ts.map +1 -1
  199. package/dist/db/Db.js +413 -1
  200. package/dist/db/Db.js.map +1 -1
  201. package/dist/db/Schema.d.ts +44 -1
  202. package/dist/db/Schema.d.ts.map +1 -1
  203. package/dist/db/Schema.js +56 -3
  204. package/dist/db/Schema.js.map +1 -1
  205. package/dist/db/tables/apiKeyAdmissions.d.ts +28 -2
  206. package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -1
  207. package/dist/db/tables/apiKeyAdmissions.js +65 -9
  208. package/dist/db/tables/apiKeyAdmissions.js.map +1 -1
  209. package/dist/db/tables/apiKeyOwnerTombstones.d.ts +2 -0
  210. package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -1
  211. package/dist/db/tables/apiKeyOwnerTombstones.js +2 -2
  212. package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -1
  213. package/dist/db/tables/authAccounts.d.ts.map +1 -1
  214. package/dist/db/tables/authAccounts.js +1 -0
  215. package/dist/db/tables/authAccounts.js.map +1 -1
  216. package/dist/db/tables/earnVaults.d.ts +5 -1
  217. package/dist/db/tables/earnVaults.d.ts.map +1 -1
  218. package/dist/db/tables/earnVaults.js +12 -1
  219. package/dist/db/tables/earnVaults.js.map +1 -1
  220. package/dist/db/tables/organizations.d.ts +4 -2
  221. package/dist/db/tables/organizations.d.ts.map +1 -1
  222. package/dist/db/tables/organizations.js +8 -34
  223. package/dist/db/tables/organizations.js.map +1 -1
  224. package/dist/db/tables/requestUsage.d.ts +5 -1
  225. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  226. package/dist/db/tables/requestUsage.js +10 -2
  227. package/dist/db/tables/requestUsage.js.map +1 -1
  228. package/dist/db/tables/rewardEligibilityAssociations.d.ts +13 -0
  229. package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -1
  230. package/dist/db/tables/rewardEligibilityAssociations.js +11 -0
  231. package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -1
  232. package/dist/db/tables/rewardRuns.d.ts.map +1 -1
  233. package/dist/db/tables/rewardRuns.js +4 -0
  234. package/dist/db/tables/rewardRuns.js.map +1 -1
  235. package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -1
  236. package/dist/db/tables/rewardTransactionAttempts.js +2 -0
  237. package/dist/db/tables/rewardTransactionAttempts.js.map +1 -1
  238. package/dist/db/tables/routesDepositAddresses.d.ts +29 -0
  239. package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -1
  240. package/dist/db/tables/routesDepositAddresses.js +84 -31
  241. package/dist/db/tables/routesDepositAddresses.js.map +1 -1
  242. package/dist/db/tables/routesDeposits.d.ts.map +1 -1
  243. package/dist/db/tables/routesDeposits.js +31 -21
  244. package/dist/db/tables/routesDeposits.js.map +1 -1
  245. package/dist/db/tables/routesIdempotency.d.ts.map +1 -1
  246. package/dist/db/tables/routesIdempotency.js +2 -0
  247. package/dist/db/tables/routesIdempotency.js.map +1 -1
  248. package/dist/db/tables/routesPolicies.d.ts +58 -0
  249. package/dist/db/tables/routesPolicies.d.ts.map +1 -0
  250. package/dist/db/tables/routesPolicies.js +198 -0
  251. package/dist/db/tables/routesPolicies.js.map +1 -0
  252. package/dist/db/tables/routesTransferSubsidies.d.ts +22 -0
  253. package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -1
  254. package/dist/db/tables/routesTransferSubsidies.js +41 -0
  255. package/dist/db/tables/routesTransferSubsidies.js.map +1 -1
  256. package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -1
  257. package/dist/db/tables/routesTransferSubsidyNonces.js +12 -4
  258. package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -1
  259. package/dist/db/tables/routesTransfers.d.ts +26 -1
  260. package/dist/db/tables/routesTransfers.d.ts.map +1 -1
  261. package/dist/db/tables/routesTransfers.js +36 -6
  262. package/dist/db/tables/routesTransfers.js.map +1 -1
  263. package/dist/db/tables/sponsoredTransactions.d.ts +45 -13
  264. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  265. package/dist/db/tables/sponsoredTransactions.js +144 -33
  266. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  267. package/dist/db/tables/users.d.ts +2 -0
  268. package/dist/db/tables/users.d.ts.map +1 -1
  269. package/dist/db/tables/users.js +11 -0
  270. package/dist/db/tables/users.js.map +1 -1
  271. package/dist/handlers/internal/multisig.d.ts +1 -1
  272. package/dist/handlers/internal/multisig.d.ts.map +1 -1
  273. package/dist/handlers/internal/multisig.js +3 -2
  274. package/dist/handlers/internal/multisig.js.map +1 -1
  275. package/dist/handlers/relay.d.ts +2 -0
  276. package/dist/handlers/relay.d.ts.map +1 -1
  277. package/dist/handlers/relay.js +34 -15
  278. package/dist/handlers/relay.js.map +1 -1
  279. package/dist/internal/Auth.d.ts +57 -6
  280. package/dist/internal/Auth.d.ts.map +1 -1
  281. package/dist/internal/Auth.js +182 -78
  282. package/dist/internal/Auth.js.map +1 -1
  283. package/dist/internal/BetterAuth.d.ts +22 -0
  284. package/dist/internal/BetterAuth.d.ts.map +1 -1
  285. package/dist/internal/BetterAuth.js +17 -14
  286. package/dist/internal/BetterAuth.js.map +1 -1
  287. package/dist/internal/Cache.d.ts +5 -0
  288. package/dist/internal/Cache.d.ts.map +1 -1
  289. package/dist/internal/Cache.js +3 -1
  290. package/dist/internal/Cache.js.map +1 -1
  291. package/dist/internal/CliAuth.d.ts +243 -0
  292. package/dist/internal/CliAuth.d.ts.map +1 -0
  293. package/dist/internal/CliAuth.js +249 -0
  294. package/dist/internal/CliAuth.js.map +1 -0
  295. package/dist/internal/EarnSharePrices.d.ts +1 -1
  296. package/dist/internal/EarnSharePrices.d.ts.map +1 -1
  297. package/dist/internal/EarnSharePrices.js +7 -3
  298. package/dist/internal/EarnSharePrices.js.map +1 -1
  299. package/dist/internal/EarnVaults.d.ts +47 -0
  300. package/dist/internal/EarnVaults.d.ts.map +1 -1
  301. package/dist/internal/EarnVaults.js +188 -4
  302. package/dist/internal/EarnVaults.js.map +1 -1
  303. package/dist/internal/EarnWithdrawals.d.ts +73 -0
  304. package/dist/internal/EarnWithdrawals.d.ts.map +1 -0
  305. package/dist/internal/EarnWithdrawals.js +189 -0
  306. package/dist/internal/EarnWithdrawals.js.map +1 -0
  307. package/dist/internal/ExecutionContext.d.ts +21 -0
  308. package/dist/internal/ExecutionContext.d.ts.map +1 -0
  309. package/dist/internal/ExecutionContext.js +16 -0
  310. package/dist/internal/ExecutionContext.js.map +1 -0
  311. package/dist/internal/Log.d.ts +7 -3
  312. package/dist/internal/Log.d.ts.map +1 -1
  313. package/dist/internal/Log.js +163 -130
  314. package/dist/internal/Log.js.map +1 -1
  315. package/dist/internal/MetricSink.d.ts.map +1 -1
  316. package/dist/internal/MetricSink.js +26 -1
  317. package/dist/internal/MetricSink.js.map +1 -1
  318. package/dist/internal/RateLimit.d.ts +67 -0
  319. package/dist/internal/RateLimit.d.ts.map +1 -1
  320. package/dist/internal/RateLimit.js +174 -27
  321. package/dist/internal/RateLimit.js.map +1 -1
  322. package/dist/internal/Store.d.ts +6 -0
  323. package/dist/internal/Store.d.ts.map +1 -1
  324. package/dist/internal/Store.js +4 -5
  325. package/dist/internal/Store.js.map +1 -1
  326. package/dist/internal/Timing.d.ts +6 -0
  327. package/dist/internal/Timing.d.ts.map +1 -1
  328. package/dist/internal/Timing.js +21 -1
  329. package/dist/internal/Timing.js.map +1 -1
  330. package/dist/internal/Tron.d.ts +124 -0
  331. package/dist/internal/Tron.d.ts.map +1 -0
  332. package/dist/internal/Tron.js +202 -0
  333. package/dist/internal/Tron.js.map +1 -0
  334. package/dist/internal/Viem.d.ts +4 -0
  335. package/dist/internal/Viem.d.ts.map +1 -1
  336. package/dist/internal/Viem.js +25 -6
  337. package/dist/internal/Viem.js.map +1 -1
  338. package/dist/internal/rewards/Read.d.ts +2 -2
  339. package/dist/internal/rewards/Read.d.ts.map +1 -1
  340. package/dist/internal/rewards/Read.js +11 -2
  341. package/dist/internal/rewards/Read.js.map +1 -1
  342. package/dist/internal/routes/Action.d.ts +27 -0
  343. package/dist/internal/routes/Action.d.ts.map +1 -1
  344. package/dist/internal/routes/Action.js +49 -1
  345. package/dist/internal/routes/Action.js.map +1 -1
  346. package/dist/internal/routes/Chain.d.ts +2 -0
  347. package/dist/internal/routes/Chain.d.ts.map +1 -1
  348. package/dist/internal/routes/Chain.js +4 -0
  349. package/dist/internal/routes/Chain.js.map +1 -1
  350. package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
  351. package/dist/internal/routes/DepositAddress.js +5 -0
  352. package/dist/internal/routes/DepositAddress.js.map +1 -1
  353. package/dist/internal/routes/Evidence.d.ts.map +1 -1
  354. package/dist/internal/routes/Evidence.js +6 -2
  355. package/dist/internal/routes/Evidence.js.map +1 -1
  356. package/dist/internal/routes/EvmTransferSettlement.d.ts +17 -0
  357. package/dist/internal/routes/EvmTransferSettlement.d.ts.map +1 -0
  358. package/dist/internal/routes/EvmTransferSettlement.js +196 -0
  359. package/dist/internal/routes/EvmTransferSettlement.js.map +1 -0
  360. package/dist/internal/routes/Policy.d.ts +161 -0
  361. package/dist/internal/routes/Policy.d.ts.map +1 -0
  362. package/dist/internal/routes/Policy.js +249 -0
  363. package/dist/internal/routes/Policy.js.map +1 -0
  364. package/dist/internal/routes/Provider.d.ts +66 -3
  365. package/dist/internal/routes/Provider.d.ts.map +1 -1
  366. package/dist/internal/routes/Provider.js +106 -27
  367. package/dist/internal/routes/Provider.js.map +1 -1
  368. package/dist/internal/routes/Quota.d.ts +57 -0
  369. package/dist/internal/routes/Quota.d.ts.map +1 -0
  370. package/dist/internal/routes/Quota.js +144 -0
  371. package/dist/internal/routes/Quota.js.map +1 -0
  372. package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
  373. package/dist/internal/routes/Reconciliation.js +163 -47
  374. package/dist/internal/routes/Reconciliation.js.map +1 -1
  375. package/dist/internal/routes/SolanaTransferSettlement.d.ts +12 -0
  376. package/dist/internal/routes/SolanaTransferSettlement.d.ts.map +1 -0
  377. package/dist/internal/routes/SolanaTransferSettlement.js +220 -0
  378. package/dist/internal/routes/SolanaTransferSettlement.js.map +1 -0
  379. package/dist/internal/routes/SolanaTransferSubsidy.d.ts +172 -0
  380. package/dist/internal/routes/SolanaTransferSubsidy.d.ts.map +1 -0
  381. package/dist/internal/routes/SolanaTransferSubsidy.js +564 -0
  382. package/dist/internal/routes/SolanaTransferSubsidy.js.map +1 -0
  383. package/dist/internal/routes/Subsidy.d.ts +2 -2
  384. package/dist/internal/routes/Subsidy.d.ts.map +1 -1
  385. package/dist/internal/routes/Subsidy.js +2 -2
  386. package/dist/internal/routes/Subsidy.js.map +1 -1
  387. package/dist/internal/routes/Transfer.d.ts +229 -1
  388. package/dist/internal/routes/Transfer.d.ts.map +1 -1
  389. package/dist/internal/routes/Transfer.js +644 -7
  390. package/dist/internal/routes/Transfer.js.map +1 -1
  391. package/dist/internal/routes/TransferReconciliation.d.ts +6 -0
  392. package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -1
  393. package/dist/internal/routes/TransferReconciliation.js +83 -159
  394. package/dist/internal/routes/TransferReconciliation.js.map +1 -1
  395. package/dist/internal/routes/TransferSettlement.d.ts +45 -0
  396. package/dist/internal/routes/TransferSettlement.d.ts.map +1 -0
  397. package/dist/internal/routes/TransferSettlement.js +2 -0
  398. package/dist/internal/routes/TransferSettlement.js.map +1 -0
  399. package/dist/internal/routes/TransferSubsidy.d.ts +23 -8
  400. package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -1
  401. package/dist/internal/routes/TransferSubsidy.js +64 -5
  402. package/dist/internal/routes/TransferSubsidy.js.map +1 -1
  403. package/dist/internal/routes/TronTransferSettlement.d.ts +12 -0
  404. package/dist/internal/routes/TronTransferSettlement.d.ts.map +1 -0
  405. package/dist/internal/routes/TronTransferSettlement.js +201 -0
  406. package/dist/internal/routes/TronTransferSettlement.js.map +1 -0
  407. package/dist/internal/routes/TronTransferSubsidy.d.ts +174 -0
  408. package/dist/internal/routes/TronTransferSubsidy.d.ts.map +1 -0
  409. package/dist/internal/routes/TronTransferSubsidy.js +439 -0
  410. package/dist/internal/routes/TronTransferSubsidy.js.map +1 -0
  411. package/dist/internal/routes/index.d.ts +3 -0
  412. package/dist/internal/routes/index.d.ts.map +1 -1
  413. package/dist/internal/routes/index.js +3 -0
  414. package/dist/internal/routes/index.js.map +1 -1
  415. package/dist/internal/routes/providers/across.d.ts +3 -0
  416. package/dist/internal/routes/providers/across.d.ts.map +1 -1
  417. package/dist/internal/routes/providers/across.js +11 -0
  418. package/dist/internal/routes/providers/across.js.map +1 -1
  419. package/dist/internal/routes/providers/legacyMesh.d.ts +29 -0
  420. package/dist/internal/routes/providers/legacyMesh.d.ts.map +1 -0
  421. package/dist/internal/routes/providers/legacyMesh.js +474 -0
  422. package/dist/internal/routes/providers/legacyMesh.js.map +1 -0
  423. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts +59 -0
  424. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts.map +1 -0
  425. package/dist/internal/routes/providers/legacyMeshDelivery.js +229 -0
  426. package/dist/internal/routes/providers/legacyMeshDelivery.js.map +1 -0
  427. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts +19 -0
  428. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts.map +1 -0
  429. package/dist/internal/routes/providers/legacyMeshOutbound.js +457 -0
  430. package/dist/internal/routes/providers/legacyMeshOutbound.js.map +1 -0
  431. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts +123 -0
  432. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts.map +1 -0
  433. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js +333 -0
  434. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js.map +1 -0
  435. package/dist/internal/routes/providers/propAmm.d.ts +70 -0
  436. package/dist/internal/routes/providers/propAmm.d.ts.map +1 -0
  437. package/dist/internal/routes/providers/propAmm.js +524 -0
  438. package/dist/internal/routes/providers/propAmm.js.map +1 -0
  439. package/dist/internal/routes/providers/relay.d.ts +3 -0
  440. package/dist/internal/routes/providers/relay.d.ts.map +1 -1
  441. package/dist/internal/routes/providers/relay.js +352 -41
  442. package/dist/internal/routes/providers/relay.js.map +1 -1
  443. package/dist/internal/routes/providers/rhino.d.ts +3 -0
  444. package/dist/internal/routes/providers/rhino.d.ts.map +1 -1
  445. package/dist/internal/routes/providers/rhino.js +11 -0
  446. package/dist/internal/routes/providers/rhino.js.map +1 -1
  447. package/dist/internal/routes/providers/squid.d.ts +3 -0
  448. package/dist/internal/routes/providers/squid.d.ts.map +1 -1
  449. package/dist/internal/routes/providers/squid.js +19 -0
  450. package/dist/internal/routes/providers/squid.js.map +1 -1
  451. package/dist/internal/routes/providers/stargate.d.ts.map +1 -1
  452. package/dist/internal/routes/providers/stargate.js +22 -9
  453. package/dist/internal/routes/providers/stargate.js.map +1 -1
  454. package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -1
  455. package/dist/internal/routes/providers/symbiosis.js +13 -17
  456. package/dist/internal/routes/providers/symbiosis.js.map +1 -1
  457. package/dist/providers/index.d.ts +14 -0
  458. package/dist/providers/index.d.ts.map +1 -1
  459. package/dist/providers/index.js +6 -0
  460. package/dist/providers/index.js.map +1 -1
  461. package/package.json +16 -6
  462. package/src/ApiKey.ts +7 -3
  463. package/src/ApiKeys.test.ts +652 -8
  464. package/src/ApiKeys.ts +191 -11
  465. package/src/App.test.ts +405 -18
  466. package/src/App.ts +51 -15
  467. package/src/Client.test-d.ts +157 -10
  468. package/src/Client.test.ts +4 -4
  469. package/src/Scope.ts +1 -2
  470. package/src/admin/App.ts +11 -5
  471. package/src/admin/apps/api-keys.test.ts +98 -2
  472. package/src/admin/apps/api-keys.ts +21 -12
  473. package/src/admin/apps/earn-vaults.test.ts +76 -7
  474. package/src/admin/apps/earn-vaults.ts +47 -8
  475. package/src/admin/apps/organizations.test.ts +147 -31
  476. package/src/admin/apps/organizations.ts +5 -4
  477. package/src/admin/apps/route-policies.test.ts +220 -0
  478. package/src/admin/apps/route-policies.ts +322 -0
  479. package/src/admin/apps/routes-support.test.ts +107 -2
  480. package/src/admin/apps/routes-support.ts +43 -3
  481. package/src/admin/apps/routes.test.ts +150 -0
  482. package/src/admin/apps/routes.ts +97 -1
  483. package/src/admin/apps/scopes.test.ts +1 -1
  484. package/src/admin/index.ts +0 -1
  485. package/src/admin/ui/plugin.ts +2 -1
  486. package/src/admin/ui/src/components/Dialog.tsx +1 -1
  487. package/src/admin/ui/src/components/EarnVaultForm.tsx +45 -0
  488. package/src/admin/ui/src/components/RoutePicker.tsx +79 -0
  489. package/src/admin/ui/src/lib/earn-vaults.ts +1 -1
  490. package/src/admin/ui/src/lib/route-policies.test.ts +452 -0
  491. package/src/admin/ui/src/lib/route-policies.ts +232 -0
  492. package/src/admin/ui/src/lib/routes.ts +34 -0
  493. package/src/admin/ui/src/routeTree.gen.ts +21 -0
  494. package/src/admin/ui/src/routes/api-keys.tsx +21 -2
  495. package/src/admin/ui/src/routes/early-access.tsx +1 -0
  496. package/src/admin/ui/src/routes/earn.vaults.tsx +1 -0
  497. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +22 -0
  498. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +10 -0
  499. package/src/admin/ui/src/routes/organizations.tsx +1 -0
  500. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +18 -3
  501. package/src/admin/ui/src/routes/route-policies.tsx +678 -0
  502. package/src/admin/ui/src/routes/routes.tsx +85 -2
  503. package/src/admin/ui/src/routes/routes_.support.tsx +6 -22
  504. package/src/admin/ui/src/routes/subsidies.tsx +1 -0
  505. package/src/admin/ui/src/routes/verified-tokens.tsx +1 -0
  506. package/src/admin/ui.generated.ts +258 -202
  507. package/src/analytics/Analytics.test.ts +4 -50
  508. package/src/analytics/Analytics.ts +65 -1
  509. package/src/analytics/tables/requestEvents.test.ts +402 -1
  510. package/src/analytics/tables/requestEvents.ts +62 -93
  511. package/src/apps/data/routes/activities.test.ts +315 -14
  512. package/src/apps/data/routes/activities.ts +60 -0
  513. package/src/apps/data/routes/balances.ts +5 -7
  514. package/src/apps/data/routes/earn.bench.ts +18 -0
  515. package/src/apps/data/routes/earn.local.test.ts +507 -0
  516. package/src/apps/data/routes/earn.test.ts +405 -127
  517. package/src/apps/data/routes/earn.ts +660 -270
  518. package/src/apps/data/routes/exchanges.bench.ts +3 -1
  519. package/src/apps/data/routes/exchanges.test.ts +166 -2
  520. package/src/apps/data/routes/exchanges.ts +308 -101
  521. package/src/apps/data/routes/fee-amm.test.ts +134 -2
  522. package/src/apps/data/routes/fee-amm.ts +122 -60
  523. package/src/apps/data/routes/receipts.test.ts +21 -18
  524. package/src/apps/data/routes/rpc.test.ts +2 -2
  525. package/src/apps/data/routes/tokens.provenance.test.ts +157 -0
  526. package/src/apps/data/routes/tokens.test.ts +4 -4
  527. package/src/apps/data/routes/tokens.ts +11 -6
  528. package/src/apps/data/routes/transactions.test.ts +29 -0
  529. package/src/apps/data/routes/transactions.ts +33 -22
  530. package/src/apps/data/routes/webhooks.test.ts +12 -3
  531. package/src/apps/data/routes/webhooks.ts +2 -1
  532. package/src/apps/management/App.ts +4 -0
  533. package/src/apps/management/Billing.test.ts +253 -27
  534. package/src/apps/management/Billing.ts +83 -29
  535. package/src/apps/management/routes/api-keys.test.ts +1 -1
  536. package/src/apps/management/routes/api-keys.ts +85 -11
  537. package/src/apps/management/routes/billing.test.ts +68 -4
  538. package/src/apps/management/routes/cli.test.ts +370 -0
  539. package/src/apps/management/routes/cli.ts +533 -0
  540. package/src/apps/management/routes/me.test.ts +14 -4
  541. package/src/apps/management/routes/orgs.test.ts +108 -4
  542. package/src/apps/management/routes/orgs.ts +7 -2
  543. package/src/apps/management/routes/usage.test.ts +2 -2
  544. package/src/apps/mpp/internal/Policy.test.ts +51 -4
  545. package/src/apps/mpp/internal/Policy.ts +6 -2
  546. package/src/apps/mpp/internal/Sponsorship.test.ts +29 -0
  547. package/src/apps/mpp/internal/Sponsorship.ts +6 -4
  548. package/src/apps/relay/App.test.ts +85 -1
  549. package/src/apps/relay/App.ts +28 -4
  550. package/src/apps/relay/Sponsorships.test.ts +97 -1
  551. package/src/apps/relay/Sponsorships.ts +77 -66
  552. package/src/apps/routes/Access.test.ts +319 -0
  553. package/src/apps/routes/Access.ts +147 -0
  554. package/src/apps/routes/App.ts +10 -0
  555. package/src/apps/routes/routes/chains.test.ts +3 -2
  556. package/src/apps/routes/routes/deposit-addresses.test.ts +978 -34
  557. package/src/apps/routes/routes/deposit-addresses.ts +243 -32
  558. package/src/apps/routes/routes/propAmm.local.test.ts +951 -0
  559. package/src/apps/routes/routes/quotes.test.ts +81 -8
  560. package/src/apps/routes/routes/quotes.ts +109 -27
  561. package/src/apps/routes/routes/transfers.test.ts +252 -15
  562. package/src/apps/routes/routes/transfers.ts +212 -33
  563. package/src/cli/ApiKeys.test.ts +265 -0
  564. package/src/cli/ApiKeys.ts +189 -0
  565. package/src/cli/Cli.test.ts +188 -0
  566. package/src/cli/Cli.ts +280 -12
  567. package/src/cli/Credentials.test.ts +122 -0
  568. package/src/cli/Credentials.ts +144 -0
  569. package/src/cli/Spec.test.ts +133 -0
  570. package/src/cli/Spec.ts +132 -0
  571. package/src/cli/bin.test.ts +49 -0
  572. package/src/cli/bin.ts +5 -1
  573. package/src/cli/commands/auth.test.ts +138 -0
  574. package/src/cli/commands/auth.ts +254 -0
  575. package/src/cli/commands/keys.test.ts +68 -0
  576. package/src/cli/commands/keys.ts +125 -0
  577. package/src/cloudflare.ts +184 -36
  578. package/src/db/Db.test.ts +877 -0
  579. package/src/db/Db.ts +498 -1
  580. package/src/db/Schema.ts +75 -4
  581. package/src/db/tables/apiKeyAdmissions.test.ts +57 -0
  582. package/src/db/tables/apiKeyAdmissions.ts +101 -11
  583. package/src/db/tables/apiKeyOwnerTombstones.ts +2 -2
  584. package/src/db/tables/authAccounts.test.ts +30 -0
  585. package/src/db/tables/authAccounts.ts +1 -0
  586. package/src/db/tables/earnVaults.test.ts +34 -0
  587. package/src/db/tables/earnVaults.ts +17 -2
  588. package/src/db/tables/organizations.test.ts +148 -84
  589. package/src/db/tables/organizations.ts +11 -43
  590. package/src/db/tables/requestUsage.ts +13 -2
  591. package/src/db/tables/rewardCampaigns.test.ts +163 -0
  592. package/src/db/tables/rewardEligibilityAssociations.test.ts +14 -0
  593. package/src/db/tables/rewardEligibilityAssociations.ts +24 -0
  594. package/src/db/tables/rewardRuns.ts +4 -0
  595. package/src/db/tables/rewardTransactionAttempts.ts +2 -0
  596. package/src/db/tables/routesDepositAddresses.test.ts +263 -0
  597. package/src/db/tables/routesDepositAddresses.ts +118 -34
  598. package/src/db/tables/routesDeposits.test.ts +66 -5
  599. package/src/db/tables/routesDeposits.ts +47 -26
  600. package/src/db/tables/routesIdempotency.test.ts +80 -0
  601. package/src/db/tables/routesIdempotency.ts +2 -0
  602. package/src/db/tables/routesPolicies.test.ts +143 -0
  603. package/src/db/tables/routesPolicies.ts +251 -0
  604. package/src/db/tables/routesTransferSubsidies.ts +64 -0
  605. package/src/db/tables/routesTransferSubsidyNonces.ts +16 -4
  606. package/src/db/tables/routesTransfers.test.ts +183 -2
  607. package/src/db/tables/routesTransfers.ts +65 -6
  608. package/src/db/tables/sponsoredTransactions.test.ts +351 -76
  609. package/src/db/tables/sponsoredTransactions.ts +182 -38
  610. package/src/db/tables/users.test.ts +51 -0
  611. package/src/db/tables/users.ts +12 -0
  612. package/src/handlers/internal/multisig.store.test.ts +120 -0
  613. package/src/handlers/internal/multisig.test.ts +389 -0
  614. package/src/handlers/internal/multisig.ts +13 -10
  615. package/src/handlers/relay.test.ts +259 -83
  616. package/src/handlers/relay.ts +36 -17
  617. package/src/internal/Auth.test.ts +291 -8
  618. package/src/internal/Auth.ts +227 -96
  619. package/src/internal/BetterAuth.test.ts +58 -22
  620. package/src/internal/BetterAuth.ts +23 -17
  621. package/src/internal/Cache.ts +3 -1
  622. package/src/internal/CliAuth.test.ts +279 -0
  623. package/src/internal/CliAuth.ts +319 -0
  624. package/src/internal/EarnSharePrices.test.ts +25 -0
  625. package/src/internal/EarnSharePrices.ts +9 -2
  626. package/src/internal/EarnVaults.test.ts +67 -0
  627. package/src/internal/EarnVaults.ts +299 -4
  628. package/src/internal/EarnWithdrawals.test.ts +315 -0
  629. package/src/internal/EarnWithdrawals.ts +266 -0
  630. package/src/internal/ExecutionContext.ts +31 -0
  631. package/src/internal/Log.test.ts +210 -0
  632. package/src/internal/Log.ts +180 -142
  633. package/src/internal/MetricSink.test.ts +190 -15
  634. package/src/internal/MetricSink.ts +27 -1
  635. package/src/internal/RateLimit.test.ts +144 -8
  636. package/src/internal/RateLimit.ts +254 -26
  637. package/src/internal/Store.ts +4 -5
  638. package/src/internal/Timing.test.ts +32 -0
  639. package/src/internal/Timing.ts +20 -1
  640. package/src/internal/Tron.test-d.ts +22 -0
  641. package/src/internal/Tron.test.ts +94 -0
  642. package/src/internal/Tron.ts +289 -0
  643. package/src/internal/Viem.rpc.test.ts +76 -0
  644. package/src/internal/Viem.ts +29 -6
  645. package/src/internal/rewards/Read.test.ts +109 -0
  646. package/src/internal/rewards/Read.ts +13 -4
  647. package/src/internal/routes/Action.test.ts +70 -0
  648. package/src/internal/routes/Action.ts +76 -1
  649. package/src/internal/routes/Chain.test.ts +18 -0
  650. package/src/internal/routes/Chain.ts +5 -0
  651. package/src/internal/routes/DepositAddress.ts +5 -0
  652. package/src/internal/routes/Evidence.test.ts +64 -0
  653. package/src/internal/routes/Evidence.ts +11 -3
  654. package/src/internal/routes/EvmTransferSettlement.ts +213 -0
  655. package/src/internal/routes/Policy.test.ts +316 -0
  656. package/src/internal/routes/Policy.ts +399 -0
  657. package/src/internal/routes/Provider.test.ts +103 -2
  658. package/src/internal/routes/Provider.ts +149 -27
  659. package/src/internal/routes/Quota.test.ts +149 -0
  660. package/src/internal/routes/Quota.ts +226 -0
  661. package/src/internal/routes/Reconciliation.local.test.ts +285 -0
  662. package/src/internal/routes/Reconciliation.test.ts +371 -13
  663. package/src/internal/routes/Reconciliation.ts +193 -42
  664. package/src/internal/routes/SolanaTransferSettlement.ts +232 -0
  665. package/src/internal/routes/SolanaTransferSubsidy.test.ts +471 -0
  666. package/src/internal/routes/SolanaTransferSubsidy.ts +760 -0
  667. package/src/internal/routes/SourceObservation.test.ts +221 -0
  668. package/src/internal/routes/Subsidy.local.test.ts +46 -0
  669. package/src/internal/routes/Subsidy.ts +4 -2
  670. package/src/internal/routes/Transfer.solana.test.ts +389 -0
  671. package/src/internal/routes/Transfer.test.ts +130 -1
  672. package/src/internal/routes/Transfer.tron.test.ts +172 -0
  673. package/src/internal/routes/Transfer.ts +866 -8
  674. package/src/internal/routes/TransferReconciliation.test.ts +26 -4
  675. package/src/internal/routes/TransferReconciliation.ts +91 -166
  676. package/src/internal/routes/TransferSettlement.ts +48 -0
  677. package/src/internal/routes/TransferSubsidy.local.test.ts +143 -0
  678. package/src/internal/routes/TransferSubsidy.test.ts +34 -4
  679. package/src/internal/routes/TransferSubsidy.ts +87 -12
  680. package/src/internal/routes/TronTransferSettlement.ts +212 -0
  681. package/src/internal/routes/TronTransferSubsidy.test.ts +109 -0
  682. package/src/internal/routes/TronTransferSubsidy.ts +619 -0
  683. package/src/internal/routes/index.test.ts +3 -0
  684. package/src/internal/routes/index.ts +3 -0
  685. package/src/internal/routes/providers/across.ts +13 -0
  686. package/src/internal/routes/providers/index.test.ts +141 -0
  687. package/src/internal/routes/providers/legacyMesh.test.ts +484 -0
  688. package/src/internal/routes/providers/legacyMesh.ts +633 -0
  689. package/src/internal/routes/providers/legacyMeshDelivery.test.ts +306 -0
  690. package/src/internal/routes/providers/legacyMeshDelivery.ts +320 -0
  691. package/src/internal/routes/providers/legacyMeshOutbound.test.ts +401 -0
  692. package/src/internal/routes/providers/legacyMeshOutbound.ts +566 -0
  693. package/src/internal/routes/providers/legacyMeshOutboundDelivery.ts +473 -0
  694. package/src/internal/routes/providers/propAmm.ts +640 -0
  695. package/src/internal/routes/providers/relay.test.ts +1263 -41
  696. package/src/internal/routes/providers/relay.ts +423 -38
  697. package/src/internal/routes/providers/rhino.ts +14 -1
  698. package/src/internal/routes/providers/squid.ts +21 -0
  699. package/src/internal/routes/providers/stargate.test.ts +105 -1
  700. package/src/internal/routes/providers/stargate.ts +22 -9
  701. package/src/internal/routes/providers/symbiosis.ts +13 -47
  702. package/src/providers/index.test.ts +2 -0
  703. package/src/providers/index.ts +18 -0
  704. package/dist/admin/Access.d.ts +0 -39
  705. package/dist/admin/Access.d.ts.map +0 -1
  706. package/dist/admin/Access.js +0 -73
  707. package/dist/admin/Access.js.map +0 -1
  708. package/src/admin/Access.test.ts +0 -130
  709. package/src/admin/Access.ts +0 -85
@@ -318,72 +318,60 @@ export async function readProjectUsage(
318
318
  analytics: Analytics.Analytics,
319
319
  options: ProjectUsageOptions,
320
320
  ): Promise<ProjectUsage> {
321
- const where = usageWhere(options)
322
- const average = `toFloat64(coalesce(round(avgOrNull(duration_ms), 1), 0))`
323
- const bucket = options.interval === 'day' ? 'toStartOfDay(timestamp)' : 'toStartOfHour(timestamp)'
324
- const [byKey, byRoute, byStatus, series, totals] = await Promise.all([
325
- analytics.query<KeyRow>(
326
- `
327
- SELECT
328
- key_id,
329
- count() AS requests,
330
- countIf(status >= 400 OR rpc_error_count > 0) AS errors,
331
- ${average} AS averageDurationMs
332
- FROM ${table}
333
- WHERE ${where} AND key_id IS NOT NULL
334
- GROUP BY key_id
335
- ORDER BY requests DESC, key_id ASC
336
- LIMIT 100
337
- `,
338
- ),
339
- analytics.query<RouteRow>(
340
- `
341
- SELECT
342
- route,
343
- count() AS requests,
344
- countIf(status >= 400 OR rpc_error_count > 0) AS errors,
345
- ${average} AS averageDurationMs
346
- FROM ${table}
347
- WHERE ${where}
348
- GROUP BY route
349
- ORDER BY requests DESC, route ASC
350
- LIMIT 100
351
- `,
352
- ),
353
- analytics.query<StatusRow>(
354
- `
355
- SELECT
356
- status,
357
- count() AS requests
358
- FROM ${table}
359
- WHERE ${where}
360
- GROUP BY status
361
- ORDER BY status ASC
362
- `,
363
- ),
364
- analytics.query<SeriesRow>(
365
- `
366
- SELECT
367
- formatDateTime(${bucket}, '%Y-%m-%dT%H:%i:%S.000Z', 'UTC') AS time,
368
- count() AS requests,
369
- countIf(status >= 400 OR rpc_error_count > 0) AS errors
321
+ // Separate attribution scans so ClickHouse can choose each tenant or key projection.
322
+ // Exclude earlier matches to preserve OR semantics when attribution terms overlap.
323
+ const source = (options.attributions.length ? options.attributions : [undefined])
324
+ .map((attribution, index) => {
325
+ const previous = options.attributions
326
+ .slice(0, index)
327
+ .map((term) => `(${attributionWhere(term, options)})`)
328
+ .join(' OR ')
329
+ return `
330
+ SELECT duration_ms, key_id, route, rpc_error_count, status, timestamp
370
331
  FROM ${table}
371
- WHERE ${where}
372
- GROUP BY ${bucket}
373
- ORDER BY ${bucket} ASC
374
- `,
375
- ),
376
- analytics.query<TotalsRow>(
332
+ WHERE ${usageWhere({ ...options, attributions: attribution ? [attribution] : [] })}
333
+ ${previous ? `AND NOT ifNull((${previous}), 0)` : ''}
377
334
  `
378
- SELECT
379
- count() AS requests,
380
- countIf(status >= 400 OR rpc_error_count > 0) AS errors,
381
- ${average} AS averageDurationMs
382
- FROM ${table}
383
- WHERE ${where}
384
- `,
385
- ),
386
- ])
335
+ })
336
+ .join(' UNION ALL ')
337
+ const average = `toFloat64(coalesce(round(avgOrNull(duration_ms), 1), 0))`
338
+ const bucket = options.interval === 'day' ? 'toStartOfDay(timestamp)' : 'toStartOfHour(timestamp)'
339
+ // Aggregate every breakdown together after merging the disjoint attribution scans.
340
+ const rows = await analytics.query<UsageRow>(`
341
+ SELECT
342
+ multiIf(
343
+ grouping(key_id) = 0, 'key',
344
+ grouping(route) = 0, 'route',
345
+ grouping(status) = 0, 'status',
346
+ grouping(${bucket}) = 0, 'series',
347
+ 'total'
348
+ ) AS kind,
349
+ key_id,
350
+ route,
351
+ status,
352
+ formatDateTime(${bucket}, '%Y-%m-%dT%H:%i:%S.000Z', 'UTC') AS time,
353
+ count() AS requests,
354
+ countIf(status >= 400 OR rpc_error_count > 0) AS errors,
355
+ ${average} AS averageDurationMs
356
+ FROM (${source})
357
+ GROUP BY GROUPING SETS ((key_id), (route), (status), (${bucket}), ())
358
+ HAVING kind != 'key' OR key_id IS NOT NULL
359
+ QUALIFY kind NOT IN ('key', 'route') OR row_number() OVER (
360
+ PARTITION BY kind ORDER BY requests DESC, key_id ASC, route ASC
361
+ ) <= 100
362
+ ORDER BY
363
+ kind ASC,
364
+ if(kind IN ('key', 'route'), requests, 0) DESC,
365
+ key_id ASC,
366
+ route ASC,
367
+ status ASC,
368
+ time ASC
369
+ `)
370
+ const byKey = rows.filter((row) => row.kind === 'key')
371
+ const byRoute = rows.filter((row) => row.kind === 'route')
372
+ const byStatus = rows.filter((row) => row.kind === 'status')
373
+ const series = rows.filter((row) => row.kind === 'series')
374
+ const totals = rows.find((row) => row.kind === 'total')
387
375
  return {
388
376
  byKey: byKey.map((row) => ({
389
377
  apiKeyId: String(row.key_id),
@@ -409,11 +397,11 @@ export async function readProjectUsage(
409
397
  time: String(row.time),
410
398
  })),
411
399
  to: options.to,
412
- totals: totals[0]
400
+ totals: totals
413
401
  ? {
414
- averageDurationMs: ClickHouseValue.number(totals[0].averageDurationMs),
415
- errors: ClickHouseValue.number(totals[0].errors),
416
- requests: ClickHouseValue.number(totals[0].requests),
402
+ averageDurationMs: ClickHouseValue.number(totals.averageDurationMs),
403
+ errors: ClickHouseValue.number(totals.errors),
404
+ requests: ClickHouseValue.number(totals.requests),
417
405
  }
418
406
  : { averageDurationMs: 0, errors: 0, requests: 0 },
419
407
  }
@@ -471,7 +459,7 @@ export type BillableCountsOptions = {
471
459
  * Reads deduped billable request counts grouped by `(org, UTC hour)` for the
472
460
  * request-metered billing reporter. Counts dedupe on `request_id` via
473
461
  * `uniqExact` (the queue → ClickHouse path can duplicate rows); production rows
474
- * exclude authentication and quota denials, while sandbox rows also require
462
+ * exclude authentication and quota denials and client cancellations, while sandbox rows also require
475
463
  * `billing_active = 1` at request time.
476
464
  *
477
465
  * @param analytics - The analytics store.
@@ -497,6 +485,7 @@ export async function readBillableCounts(
497
485
  AND coalesce(error_code, '') NOT IN (
498
486
  'api_key_forbidden',
499
487
  'api_key_ip_forbidden',
488
+ 'client_canceled',
500
489
  'forbidden',
501
490
  'payment_required',
502
491
  'rate_limit_exceeded'
@@ -524,13 +513,6 @@ type BillableCountRow = {
524
513
  /** Table name queries read from; the store scopes the database. */
525
514
  const table = 'request_events'
526
515
 
527
- type KeyRow = {
528
- averageDurationMs: number | string
529
- errors: number | string
530
- key_id: string
531
- requests: number | string
532
- }
533
-
534
516
  type LastUsedAtRow = {
535
517
  key_id: string
536
518
  lastUsedAt: string
@@ -541,28 +523,15 @@ type ErrorRow = {
541
523
  requests: number | string
542
524
  }
543
525
 
544
- type RouteRow = {
526
+ type UsageRow = {
545
527
  averageDurationMs: number | string
546
528
  errors: number | string
529
+ key_id: string | null
530
+ kind: 'key' | 'route' | 'series' | 'status' | 'total'
547
531
  requests: number | string
548
532
  route: string
549
- }
550
-
551
- type SeriesRow = {
552
- errors: number | string
553
- requests: number | string
554
- time: string
555
- }
556
-
557
- type StatusRow = {
558
- requests: number | string
559
533
  status: number | string
560
- }
561
-
562
- type TotalsRow = {
563
- averageDurationMs: number | string
564
- errors: number | string
565
- requests: number | string
534
+ time: string
566
535
  }
567
536
 
568
537
  /** Maps one request log entry to a stored row. */
@@ -3,7 +3,7 @@
3
3
  import { Address, Hex, Value as core_Value } from 'ox'
4
4
  import { FxOracle } from 'tapimo/apps'
5
5
  import { createClient, encodeAbiParameters, encodeEventTopics, http } from 'viem'
6
- import { getLogs, sendTransactionSync } from 'viem/actions'
6
+ import { getLogs, readContract, sendTransactionSync } from 'viem/actions'
7
7
  import { Abis, Actions, Addresses } from 'viem/tempo'
8
8
 
9
9
  import * as TestApp from '../../../../test/App.js'
@@ -391,20 +391,31 @@ describe('GET /addresses/:address/activities', () => {
391
391
  const wallet = Tempo.getClient({ account })
392
392
  await Actions.faucet.fundSync(Tempo.client, { account, timeout: 60_000 })
393
393
 
394
- // Burning needs the `issuer` role, so the account burns a token it owns.
395
- const { token } = await Actions.token.createSync(wallet, {
396
- currency: 'USD',
397
- name: 'Seeded Burn USD',
398
- symbol: 'SBUSD',
394
+ // Burning needs the `issuer` role, so the account burns a token it owns. One batch keeps
395
+ // every step on one node's state; the hosted RPC balances across nodes that can lag.
396
+ const salt = Hex.random(32)
397
+ const token = await readContract(wallet, {
398
+ abi: Abis.tip20Factory,
399
+ address: Addresses.tip20Factory,
400
+ args: [account.address, salt],
401
+ functionName: 'getTokenAddress',
399
402
  })
400
- await sendTransactionSync(wallet, {
403
+ const receipt = await sendTransactionSync(wallet, {
401
404
  account,
402
405
  calls: [
406
+ Actions.token.create.call(wallet, {
407
+ admin: account.address,
408
+ currency: 'USD',
409
+ name: 'Seeded Burn USD',
410
+ salt,
411
+ symbol: 'SBUSD',
412
+ }),
403
413
  Actions.token.grantRoles.call(wallet, { role: 'issuer', to: account.address, token }),
404
414
  Actions.token.mint.call(wallet, { amount: 1_000_000n, to: account.address, token }),
415
+ Actions.token.burn.call(wallet, { amount: 100_000n, token }),
405
416
  ],
417
+ throwOnReceiptRevert: true,
406
418
  })
407
- const { receipt } = await Actions.token.burnSync(wallet, { amount: 100_000n, token })
408
419
 
409
420
  const deadline = Date.now() + 90_000
410
421
  let burn: Activities.Entry | undefined
@@ -1637,7 +1648,7 @@ describe('Activities.list precompile classification', () => {
1637
1648
  logIdx: number
1638
1649
  }): Activities.Row {
1639
1650
  type Param = { indexed?: boolean; name?: string; type: string }
1640
- // Standard ERC-4626 events, mirrored from the classifier's decode ABI.
1651
+ // External vault events, mirrored from the classifier's decode ABI.
1641
1652
  const erc4626Events = [
1642
1653
  {
1643
1654
  inputs: [
@@ -1660,6 +1671,17 @@ describe('Activities.list precompile classification', () => {
1660
1671
  name: 'Withdraw',
1661
1672
  type: 'event',
1662
1673
  },
1674
+ {
1675
+ inputs: [
1676
+ { indexed: true, name: 'to', type: 'address' },
1677
+ { indexed: true, name: 'asset', type: 'address' },
1678
+ { indexed: false, name: 'amount', type: 'uint256' },
1679
+ { indexed: true, name: 'from', type: 'address' },
1680
+ { indexed: false, name: 'shares', type: 'uint256' },
1681
+ ],
1682
+ name: 'Exit',
1683
+ type: 'event',
1684
+ },
1663
1685
  ] as const
1664
1686
  const abi = [...Abis.core, ...Abis.earnRouter, ...Abis.earnVault, ...erc4626Events]
1665
1687
  const event = abi.find(
@@ -2660,6 +2682,63 @@ describe('Activities.list precompile classification', () => {
2660
2682
  expect(items.map((item) => item.type)).toEqual(['assets-withdrawn'])
2661
2683
  })
2662
2684
 
2685
+ test('folds a BoringVault payout into its wrapper redemption', async () => {
2686
+ const adapter = '0x9999999999999999999999999999999999999999' as Address.Address
2687
+ const asset = '0x4444444444444444444444444444444444444444' as Address.Address
2688
+ const boringVault = '0x6666666666666666666666666666666666666666' as Address.Address
2689
+ const merchant = '0x7777777777777777777777777777777777777777' as Address.Address
2690
+ const zero = '0x0000000000000000000000000000000000000000' as Address.Address
2691
+ const items = await classify([
2692
+ transferRow({ from: viewer, logIdx: 0, to: tokenA, token: tokenA, value: 100n }),
2693
+ transferRow({ from: tokenA, logIdx: 1, to: zero, token: tokenA, value: 100n }),
2694
+ transferRow({ from: adapter, logIdx: 2, to: zero, token: boringVault, value: 100n }),
2695
+ transferRow({ from: boringVault, logIdx: 3, to: viewer, token: asset, value: 100n }),
2696
+ logRow({
2697
+ address: boringVault,
2698
+ args: { amount: 100n, asset, from: adapter, shares: 100n, to: viewer },
2699
+ eventName: 'Exit',
2700
+ logIdx: 4,
2701
+ }),
2702
+ logRow({
2703
+ address: tokenA,
2704
+ args: { assets: 100n, caller: viewer, earnShares: 100n, receiver: viewer },
2705
+ eventName: 'Redeemed',
2706
+ logIdx: 5,
2707
+ }),
2708
+ transferRow({ from: merchant, logIdx: 6, to: viewer, token: asset, value: 5n }),
2709
+ ])
2710
+ expect(items.map((item) => item.type).sort()).toEqual([
2711
+ 'assets-withdrawn',
2712
+ 'shares-redeemed',
2713
+ 'transfer',
2714
+ ])
2715
+ const payment = items.find((item) => item.type === 'transfer')
2716
+ if (payment?.type !== 'transfer') return
2717
+ expect(payment.data.sender).toBe(merchant)
2718
+ })
2719
+
2720
+ test('keeps a same-sized BoringVault transfer beside an Exit', async () => {
2721
+ const adapter = '0x9999999999999999999999999999999999999999' as Address.Address
2722
+ const asset = '0x4444444444444444444444444444444444444444' as Address.Address
2723
+ const boringVault = '0x6666666666666666666666666666666666666666' as Address.Address
2724
+ const zero = '0x0000000000000000000000000000000000000000' as Address.Address
2725
+ const items = await classify([
2726
+ transferRow({ from: adapter, logIdx: 0, to: zero, token: boringVault, value: 100n }),
2727
+ transferRow({ from: boringVault, logIdx: 1, to: viewer, token: asset, value: 100n }),
2728
+ logRow({
2729
+ address: boringVault,
2730
+ args: { amount: 100n, asset, from: adapter, shares: 100n, to: viewer },
2731
+ eventName: 'Exit',
2732
+ logIdx: 2,
2733
+ }),
2734
+ transferRow({ from: viewer, logIdx: 3, to: boringVault, token: asset, value: 100n }),
2735
+ ])
2736
+ expect(items.map((item) => item.type).sort()).toEqual(['assets-withdrawn', 'transfer'])
2737
+ const payment = items.find((item) => item.type === 'transfer')
2738
+ if (payment?.type !== 'transfer') return
2739
+ expect(payment.data.recipient).toBe(boringVault)
2740
+ })
2741
+
2663
2742
  test('classifies a route delivery to a third party as a cross-token transfer', async () => {
2664
2743
  const router = '0xb92fe925dc43a0ecde6c8b1a2709c170ec4fff4f' as Address.Address
2665
2744
  const recipient = '0x7bc2d22a73706758505e222ed9d13a1a7f251490' as Address.Address
@@ -3409,7 +3488,7 @@ describe('Activities.list receipt replays', () => {
3409
3488
  }
3410
3489
 
3411
3490
  /** Maps a raw receipt log to a Q1 row, viewer as the transaction sender. */
3412
- function receiptRow(log: ReceiptLog): Activities.Row {
3491
+ function receiptRow(log: ReceiptLog, sender: Address.Address = viewer): Activities.Row {
3413
3492
  return {
3414
3493
  blockNum: 100,
3415
3494
  blockTimestamp: 1_700_000_000,
@@ -3424,16 +3503,16 @@ describe('Activities.list receipt replays', () => {
3424
3503
  topic3: log.topics[3] ?? null,
3425
3504
  txHash,
3426
3505
  txIdx: 0,
3427
- txSender: viewer,
3506
+ txSender: sender,
3428
3507
  }
3429
3508
  }
3430
3509
 
3431
- async function classify(logs: readonly ReceiptLog[]) {
3510
+ async function classify(logs: readonly ReceiptLog[], address: Address.Address = viewer) {
3432
3511
  const provider: Activities.Provider = {
3433
3512
  cursorForGroup: (group) => `${group.blockNum}:${group.txIdx}`,
3434
- fetchRows: async () => ({ rows: logs.map(receiptRow) }),
3513
+ fetchRows: async () => ({ rows: logs.map((log) => receiptRow(log, address)) }),
3435
3514
  }
3436
- const { items } = await Activities.list(provider, { address: viewer, store: store() })
3515
+ const { items } = await Activities.list(provider, { address, store: store() })
3437
3516
  return items
3438
3517
  }
3439
3518
 
@@ -3699,6 +3778,215 @@ describe('Activities.list receipt replays', () => {
3699
3778
  },
3700
3779
  ]
3701
3780
 
3781
+ const primeRedeemLogs = [
3782
+ {
3783
+ address: '0x20c00000000000000000000065439bf965b62982',
3784
+ data: '0x00000000000000000000000000000000000000000000000000000000028ef30b',
3785
+ logIdx: 0,
3786
+ topics: [
3787
+ '0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925',
3788
+ '0x000000000000000000000000a3b9eb50b9d1a3f584fbe1122a7bc82084eaae2f',
3789
+ '0x000000000000000000000000d857db134413a39ab23e2d8fa0b7960ef81cd41a',
3790
+ ],
3791
+ },
3792
+ {
3793
+ address: '0x20c00000000000000000000065439bf965b62982',
3794
+ data: '0x00000000000000000000000000000000000000000000000000000000028ef30b',
3795
+ logIdx: 1,
3796
+ topics: [
3797
+ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
3798
+ '0x000000000000000000000000a3b9eb50b9d1a3f584fbe1122a7bc82084eaae2f',
3799
+ '0x000000000000000000000000d857db134413a39ab23e2d8fa0b7960ef81cd41a',
3800
+ ],
3801
+ },
3802
+ {
3803
+ address: '0x20c00000000000000000000065439bf965b62982',
3804
+ data: '0x00000000000000000000000000000000000000000000000000000000028ef30b',
3805
+ logIdx: 2,
3806
+ topics: [
3807
+ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
3808
+ '0x000000000000000000000000d857db134413a39ab23e2d8fa0b7960ef81cd41a',
3809
+ '0x0000000000000000000000000000000000000000000000000000000000000000',
3810
+ ],
3811
+ },
3812
+ {
3813
+ address: '0x20c00000000000000000000065439bf965b62982',
3814
+ data: '0x00000000000000000000000000000000000000000000000000000000028ef30b',
3815
+ logIdx: 3,
3816
+ topics: [
3817
+ '0xcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5',
3818
+ '0x000000000000000000000000d857db134413a39ab23e2d8fa0b7960ef81cd41a',
3819
+ ],
3820
+ },
3821
+ {
3822
+ address: '0x7039a6bff996551285c6baa2256c2c7a36a39c82',
3823
+ data: '0x00000000000000000000000000000000000000000000000000000000000f4240',
3824
+ logIdx: 4,
3825
+ topics: ['0x388f446e9526fe5c9af20a5919b342370c8a7c0cb05245afe1e545658fa3cdba'],
3826
+ },
3827
+ {
3828
+ address: '0x20c00000000000000000000058d0b8b2cfdb358c',
3829
+ data: '0x0000000000000000000000000000000000000000000000000000000000000000',
3830
+ logIdx: 5,
3831
+ topics: [
3832
+ '0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925',
3833
+ '0x0000000000000000000000007ce20fa339cc1e5c79bd44888751cb37124873a6',
3834
+ '0x00000000000000000000000001ced4c2a58e947b2df3c2e0eb69829261fe6c4d',
3835
+ ],
3836
+ },
3837
+ {
3838
+ address: '0x20c00000000000000000000058d0b8b2cfdb358c',
3839
+ data: '0x000000000000000000000000000000000000000000000000000000000268e0bc',
3840
+ logIdx: 6,
3841
+ topics: [
3842
+ '0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925',
3843
+ '0x0000000000000000000000007ce20fa339cc1e5c79bd44888751cb37124873a6',
3844
+ '0x00000000000000000000000001ced4c2a58e947b2df3c2e0eb69829261fe6c4d',
3845
+ ],
3846
+ },
3847
+ {
3848
+ address: '0x20c00000000000000000000058d0b8b2cfdb358c',
3849
+ data: '0x000000000000000000000000000000000000000000000000000000000268e0bb',
3850
+ logIdx: 7,
3851
+ topics: [
3852
+ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
3853
+ '0x0000000000000000000000007ce20fa339cc1e5c79bd44888751cb37124873a6',
3854
+ '0x00000000000000000000000001ced4c2a58e947b2df3c2e0eb69829261fe6c4d',
3855
+ ],
3856
+ },
3857
+ {
3858
+ address: '0x20c00000000000000000000058d0b8b2cfdb358c',
3859
+ data: '0x000000000000000000000000000000000000000000000000000000000268e0bb',
3860
+ logIdx: 8,
3861
+ topics: [
3862
+ '0x57bc7354aa85aed339e000bccffabbc529466af35f0772c8f8ee1145927de7f0',
3863
+ '0x0000000000000000000000007ce20fa339cc1e5c79bd44888751cb37124873a6',
3864
+ '0x00000000000000000000000001ced4c2a58e947b2df3c2e0eb69829261fe6c4d',
3865
+ '0xdfaa8ba4a8fbc7a97b41cc5de776d6b2a2bf74fd6b716714f0afdd956ebf7fc1',
3866
+ ],
3867
+ },
3868
+ {
3869
+ address: '0x20c0000000000000000000000000000000000000',
3870
+ data: '0x00000000000000000000000000000000000000000000000000000000028ef30b',
3871
+ logIdx: 9,
3872
+ topics: [
3873
+ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
3874
+ '0x00000000000000000000000001ced4c2a58e947b2df3c2e0eb69829261fe6c4d',
3875
+ '0x0000000000000000000000007ce20fa339cc1e5c79bd44888751cb37124873a6',
3876
+ ],
3877
+ },
3878
+ {
3879
+ address: '0x20c0000000000000000000000000000000000000',
3880
+ data: '0x00000000000000000000000000000000000000000000000000000000028ef30b',
3881
+ logIdx: 10,
3882
+ topics: [
3883
+ '0x57bc7354aa85aed339e000bccffabbc529466af35f0772c8f8ee1145927de7f0',
3884
+ '0x00000000000000000000000001ced4c2a58e947b2df3c2e0eb69829261fe6c4d',
3885
+ '0x0000000000000000000000007ce20fa339cc1e5c79bd44888751cb37124873a6',
3886
+ '0xc0aeeda6a768d51d779ccf20e96db41dfad0fb6454300c5807f9cdbbd7a990b8',
3887
+ ],
3888
+ },
3889
+ {
3890
+ address: '0x01ced4c2a58e947b2df3c2e0eb69829261fe6c4d',
3891
+ data: '0x00000000000000000000000000000000000000000000000000000000020d51480000000000000000000000000000000000000000000000000000000000af2548',
3892
+ logIdx: 11,
3893
+ topics: [
3894
+ '0x68b6919cc2747efaadbd2bd1a5b1f54acdefbe8bf17ba6171e13901d98f5d725',
3895
+ '0x33e9a166f8d1af04f1aebfa08c9835ffafaa9970105b44ba381a57bea822cb22',
3896
+ ],
3897
+ },
3898
+ {
3899
+ address: '0x01ced4c2a58e947b2df3c2e0eb69829261fe6c4d',
3900
+ data: '0x99f0b5d68de2632c6212b237883c46ebc7ec7a4c3c39d5e3b5fe958ff2f71bb000000000000000000000000020c00000000000000000000058d0b8b2cfdb358c00000000000000000000000020c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000268e0bb00000000000000000000000000000000000000000000000000000000028ef30b0000000000000000000000000000000000000000000000000000000006540d00000000000000000000000000000000000000000000000000000000006abb50fe',
3901
+ logIdx: 12,
3902
+ topics: [
3903
+ '0xf05a3e016bfb4b6c18830f5c8c2920e373727b22308458b485c35ed0202fe6be',
3904
+ '0x0000000000000000000000007ce20fa339cc1e5c79bd44888751cb37124873a6',
3905
+ '0x0000000000000000000000007ce20fa339cc1e5c79bd44888751cb37124873a6',
3906
+ '0x70ca45b17a006092ed0c58b7ff1af8c01eb743d8b269eaab4982170147b085b2',
3907
+ ],
3908
+ },
3909
+ {
3910
+ address: '0x20c00000000000000000000058d0b8b2cfdb358c',
3911
+ data: '0x0000000000000000000000000000000000000000000000000000000000000000',
3912
+ logIdx: 13,
3913
+ topics: [
3914
+ '0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925',
3915
+ '0x0000000000000000000000007ce20fa339cc1e5c79bd44888751cb37124873a6',
3916
+ '0x00000000000000000000000001ced4c2a58e947b2df3c2e0eb69829261fe6c4d',
3917
+ ],
3918
+ },
3919
+ {
3920
+ address: '0x7ce20fa339cc1e5c79bd44888751cb37124873a6',
3921
+ data: '0x00000000000000000000000000000000000000000000000000000000028ef30b',
3922
+ logIdx: 14,
3923
+ topics: [
3924
+ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
3925
+ '0x0000000000000000000000009eb27b71f0f974e968385b32c1d122c9c7787851',
3926
+ '0x0000000000000000000000000000000000000000000000000000000000000000',
3927
+ ],
3928
+ },
3929
+ {
3930
+ address: '0x20c0000000000000000000000000000000000000',
3931
+ data: '0x00000000000000000000000000000000000000000000000000000000028ef30b',
3932
+ logIdx: 15,
3933
+ topics: [
3934
+ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
3935
+ '0x0000000000000000000000007ce20fa339cc1e5c79bd44888751cb37124873a6',
3936
+ '0x000000000000000000000000a3b9eb50b9d1a3f584fbe1122a7bc82084eaae2f',
3937
+ ],
3938
+ },
3939
+ {
3940
+ address: '0x7ce20fa339cc1e5c79bd44888751cb37124873a6',
3941
+ data: '0x00000000000000000000000000000000000000000000000000000000028ef30b00000000000000000000000000000000000000000000000000000000028ef30b',
3942
+ logIdx: 16,
3943
+ topics: [
3944
+ '0xe0c82280a1164680e0cf43be7db4c4c9f985423623ad7a544fb76c772bdc6043',
3945
+ '0x000000000000000000000000a3b9eb50b9d1a3f584fbe1122a7bc82084eaae2f',
3946
+ '0x00000000000000000000000020c0000000000000000000000000000000000000',
3947
+ '0x0000000000000000000000009eb27b71f0f974e968385b32c1d122c9c7787851',
3948
+ ],
3949
+ },
3950
+ {
3951
+ address: '0x1816432fa9620998d67815dc80bede941f841ba1',
3952
+ data: '0x00000000000000000000000000000000000000000000000000000000028ef30b',
3953
+ logIdx: 17,
3954
+ topics: [
3955
+ '0xdcc60b41ff1c604459e6aa4a7299817416b19fc586a392f111646e26597c4af9',
3956
+ '0x00000000000000000000000020c0000000000000000000000000000000000000',
3957
+ ],
3958
+ },
3959
+ {
3960
+ address: '0x9eb27b71f0f974e968385b32c1d122c9c7787851',
3961
+ data: '0x00000000000000000000000000000000000000000000000000000000028ef30b00000000000000000000000000000000000000000000000000000000028ef30b',
3962
+ logIdx: 18,
3963
+ topics: [
3964
+ '0xf3a670cd3af7d64b488926880889d08a8585a138ff455227af6737339a1ec262',
3965
+ '0x000000000000000000000000a3b9eb50b9d1a3f584fbe1122a7bc82084eaae2f',
3966
+ ],
3967
+ },
3968
+ {
3969
+ address: '0xd857db134413a39ab23e2d8fa0b7960ef81cd41a',
3970
+ data: '0x00000000000000000000000000000000000000000000000000000000028ef30b00000000000000000000000000000000000000000000000000000000028ef30b',
3971
+ logIdx: 19,
3972
+ topics: [
3973
+ '0x5cdf07ad0fc222442720b108e3ed4c4640f0fadc2ab2253e66f259a0fea83480',
3974
+ '0x000000000000000000000000a3b9eb50b9d1a3f584fbe1122a7bc82084eaae2f',
3975
+ '0x000000000000000000000000a3b9eb50b9d1a3f584fbe1122a7bc82084eaae2f',
3976
+ ],
3977
+ },
3978
+ {
3979
+ address: '0x20c0000000000000000000000000000000000000',
3980
+ data: '0x000000000000000000000000000000000000000000000000000000000000010e',
3981
+ logIdx: 20,
3982
+ topics: [
3983
+ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
3984
+ '0x00000000000000000000000058aa7ce42e1d13b2919e2ac7e006c4fbc171442c',
3985
+ '0x000000000000000000000000feec000000000000000000000000000000000000',
3986
+ ],
3987
+ },
3988
+ ]
3989
+
3702
3990
  test('classifies a router swap instead of a lonely approval', async () => {
3703
3991
  // 0xd8be4bfb370d4395c45fb587686b0bd83b01228871896926e92d66d15f25838b
3704
3992
  // (chain 4217): 1.105 USDC.e swapped to pathUSD through a route account.
@@ -3736,4 +4024,17 @@ describe('Activities.list receipt replays', () => {
3736
4024
  amount: '100000',
3737
4025
  })
3738
4026
  })
4027
+
4028
+ test('folds a PRIME redemption payout from its BoringVault', async () => {
4029
+ // 0x4cbe50ce4f59322ae65f65e392f6353aaf1e2a5350863d5d8aac491ecf3621ac
4030
+ // (chain 4217): the BoringVault pays 42.922763 pathUSD straight to the wallet.
4031
+ const wallet = '0xa3b9eb50b9d1a3f584fbe1122a7bc82084eaae2f' as Address.Address
4032
+ const items = await classify(primeRedeemLogs, wallet)
4033
+ expect(items.some((item) => item.type === 'transfer')).toBe(false)
4034
+ const withdrawal = items.find((item) => item.type === 'assets-withdrawn')
4035
+ if (withdrawal?.type !== 'assets-withdrawn') throw new Error('missing withdrawal')
4036
+ expect(withdrawal.data.vault).toBe('0x7ce20fa339cc1e5c79bd44888751cb37124873a6')
4037
+ expect(withdrawal.data.assets).toBe('42922763')
4038
+ expect(withdrawal.data.receiver).toBe(wallet)
4039
+ })
3739
4040
  })
@@ -1914,6 +1914,7 @@ const titleByEventName: Record<string, string> = {
1914
1914
  Deposited: 'Assets deposited',
1915
1915
  EarnDeposit: 'Private assets deposited',
1916
1916
  EarnRedeem: 'Private shares redeemed',
1917
+ Exit: 'Assets withdrawn',
1917
1918
  RedeemCancelled: 'Share redemption cancelled',
1918
1919
  RedeemFinalized: 'Share redemption finalized',
1919
1920
  RedeemRequested: 'Share redemption requested',
@@ -2009,6 +2010,18 @@ const erc4626Events = [
2009
2010
  name: 'Withdraw',
2010
2011
  type: 'event',
2011
2012
  },
2013
+ // Veda BoringVault's withdrawal, emitted in place of `Withdraw` (e.g. under Tempo Cash PRIME).
2014
+ {
2015
+ inputs: [
2016
+ { indexed: true, name: 'to', type: 'address' },
2017
+ { indexed: true, name: 'asset', type: 'address' },
2018
+ { indexed: false, name: 'amount', type: 'uint256' },
2019
+ { indexed: true, name: 'from', type: 'address' },
2020
+ { indexed: false, name: 'shares', type: 'uint256' },
2021
+ ],
2022
+ name: 'Exit',
2023
+ type: 'event',
2024
+ },
2012
2025
  ] as const
2013
2026
 
2014
2027
  const tip20ChannelReserve = Addresses.tip20ChannelReserve
@@ -4183,6 +4196,53 @@ function classifyFromLogsCore(
4183
4196
  return undefined
4184
4197
  })
4185
4198
 
4199
+ // BoringVault pays `to` directly; fold its payout like an ERC-4626 withdrawal.
4200
+ recognize(named('Exit'), (event) => {
4201
+ const args = event.args as {
4202
+ amount: bigint
4203
+ asset: Address.Address
4204
+ from: Address.Address
4205
+ shares: bigint
4206
+ to: Address.Address
4207
+ }
4208
+ const vault = event.address as Address.Address
4209
+ // Parse before claiming so a malformed event consumes nothing but itself.
4210
+ const data = {
4211
+ assets: args.amount.toString(),
4212
+ caller: lc(args.from),
4213
+ receiver: lc(args.to),
4214
+ sharesBurned: args.shares.toString(),
4215
+ signer,
4216
+ status: 'completed' as const,
4217
+ vault: lc(vault),
4218
+ }
4219
+ // Shares and payout are often equal, so pair only this Exit's own share burn
4220
+ // and `asset` payout to `to`, leaving same-sized vault transfers visible.
4221
+ const burn = takeTransfer((leg) => {
4222
+ const { amount, from, to } = transferArgs(leg)
4223
+ return (
4224
+ Address.isEqual(leg.address, vault) &&
4225
+ Address.isEqual(from, args.from) &&
4226
+ Address.isEqual(to, zeroAddress as Address.Address) &&
4227
+ amount === args.shares
4228
+ )
4229
+ })
4230
+ const payout = takeTransfer((leg) => {
4231
+ const { amount, from, to } = transferArgs(leg)
4232
+ return (
4233
+ Address.isEqual(leg.address, args.asset) &&
4234
+ Address.isEqual(from, vault) &&
4235
+ Address.isEqual(to, args.to) &&
4236
+ amount === args.amount
4237
+ )
4238
+ })
4239
+ const legs = [burn, payout].filter((leg) => leg !== undefined)
4240
+ const item = { ...itemBase(event.logIndex), data, type: 'assets-withdrawn' as const }
4241
+ if (viewerInvolved([args.from, args.to], legs)) return item
4242
+ suppressedVaultItems.push(item)
4243
+ return undefined
4244
+ })
4245
+
4186
4246
  recognize(named('Deposit'), (event) => {
4187
4247
  const args = event.args as {
4188
4248
  assets: bigint