tapimo 0.13.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1143) 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 +21383 -18056
  9. package/dist/App.d.ts.map +1 -1
  10. package/dist/App.js +301 -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 +2 -2
  24. package/dist/Webhooks.js.map +1 -1
  25. package/dist/admin/App.d.ts +3936 -1337
  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 +159 -7
  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 +1446 -0
  34. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  35. package/dist/admin/apps/earn-vaults.js +465 -8
  36. package/dist/admin/apps/earn-vaults.js.map +1 -1
  37. package/dist/admin/apps/organizations.d.ts +344 -3
  38. package/dist/admin/apps/organizations.d.ts.map +1 -1
  39. package/dist/admin/apps/organizations.js +288 -10
  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 +16 -16
  54. package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
  55. package/dist/admin/apps/verified-tokens.js +3 -3
  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 +129 -69
  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 +40 -8
  76. package/dist/apps/Zones.js.map +1 -1
  77. package/dist/apps/data/App.d.ts +4310 -2548
  78. package/dist/apps/data/App.d.ts.map +1 -1
  79. package/dist/apps/data/App.js +86 -26
  80. package/dist/apps/data/App.js.map +1 -1
  81. package/dist/apps/data/routes/activities.d.ts +364 -34
  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 +94 -22
  86. package/dist/apps/data/routes/addresses.d.ts.map +1 -1
  87. package/dist/apps/data/routes/blocks.d.ts +37 -37
  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 +1641 -352
  92. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  93. package/dist/apps/data/routes/earn.js +1561 -120
  94. package/dist/apps/data/routes/earn.js.map +1 -1
  95. package/dist/apps/data/routes/exchanges.d.ts +15 -0
  96. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  97. package/dist/apps/data/routes/exchanges.js +180 -114
  98. package/dist/apps/data/routes/exchanges.js.map +1 -1
  99. package/dist/apps/data/routes/fee-amm.d.ts +5 -0
  100. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  101. package/dist/apps/data/routes/fee-amm.js +49 -38
  102. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  103. package/dist/apps/data/routes/indexer.d.ts +125 -0
  104. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  105. package/dist/apps/data/routes/indexer.js +83 -27
  106. package/dist/apps/data/routes/indexer.js.map +1 -1
  107. package/dist/apps/data/routes/rpc.d.ts +507 -33
  108. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  109. package/dist/apps/data/routes/rpc.js +266 -156
  110. package/dist/apps/data/routes/rpc.js.map +1 -1
  111. package/dist/apps/data/routes/tokenlist.d.ts +47 -15
  112. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  113. package/dist/apps/data/routes/tokenlist.js +68 -11
  114. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  115. package/dist/apps/data/routes/tokens.d.ts +95 -93
  116. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  117. package/dist/apps/data/routes/tokens.js +26 -14
  118. package/dist/apps/data/routes/tokens.js.map +1 -1
  119. package/dist/apps/data/routes/transfers.d.ts +16 -0
  120. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  121. package/dist/apps/data/routes/transfers.js +9 -7
  122. package/dist/apps/data/routes/transfers.js.map +1 -1
  123. package/dist/apps/data/routes/verified-tokens.d.ts +4 -4
  124. package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -1
  125. package/dist/apps/data/routes/verified-tokens.js +64 -20
  126. package/dist/apps/data/routes/verified-tokens.js.map +1 -1
  127. package/dist/apps/data/routes/webhooks.d.ts +1210 -70
  128. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  129. package/dist/apps/data/routes/webhooks.js +301 -163
  130. package/dist/apps/data/routes/webhooks.js.map +1 -1
  131. package/dist/apps/data/routes/zones.d.ts.map +1 -1
  132. package/dist/apps/data/routes/zones.js +20 -12
  133. package/dist/apps/data/routes/zones.js.map +1 -1
  134. package/dist/apps/docs/reference.js +2 -2
  135. package/dist/apps/docs/reference.js.map +1 -1
  136. package/dist/apps/index.d.ts +1 -1
  137. package/dist/apps/index.d.ts.map +1 -1
  138. package/dist/apps/index.js +1 -1
  139. package/dist/apps/index.js.map +1 -1
  140. package/dist/apps/management/App.d.ts +4119 -3297
  141. package/dist/apps/management/App.d.ts.map +1 -1
  142. package/dist/apps/management/App.js +5 -14
  143. package/dist/apps/management/App.js.map +1 -1
  144. package/dist/apps/management/Billing.d.ts +49 -8
  145. package/dist/apps/management/Billing.d.ts.map +1 -1
  146. package/dist/apps/management/Billing.js +221 -26
  147. package/dist/apps/management/Billing.js.map +1 -1
  148. package/dist/apps/management/routes/api-keys.d.ts +174 -72
  149. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  150. package/dist/apps/management/routes/api-keys.js +43 -15
  151. package/dist/apps/management/routes/api-keys.js.map +1 -1
  152. package/dist/apps/management/routes/billing.d.ts +364 -78
  153. package/dist/apps/management/routes/billing.d.ts.map +1 -1
  154. package/dist/apps/management/routes/billing.js +274 -49
  155. package/dist/apps/management/routes/billing.js.map +1 -1
  156. package/dist/apps/management/routes/faucet.d.ts +6 -6
  157. package/dist/apps/management/routes/faucet.js +1 -1
  158. package/dist/apps/management/routes/faucet.js.map +1 -1
  159. package/dist/apps/management/routes/invitations.d.ts +99 -24
  160. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  161. package/dist/apps/management/routes/invitations.js +117 -13
  162. package/dist/apps/management/routes/invitations.js.map +1 -1
  163. package/dist/apps/management/routes/invite-links.d.ts +42 -42
  164. package/dist/apps/management/routes/me.d.ts.map +1 -1
  165. package/dist/apps/management/routes/me.js +6 -2
  166. package/dist/apps/management/routes/me.js.map +1 -1
  167. package/dist/apps/management/routes/members.d.ts +16 -16
  168. package/dist/apps/management/routes/orgs.d.ts +36 -20
  169. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  170. package/dist/apps/management/routes/orgs.js +52 -12
  171. package/dist/apps/management/routes/orgs.js.map +1 -1
  172. package/dist/apps/management/routes/projects.d.ts +40 -40
  173. package/dist/apps/management/routes/projects.d.ts.map +1 -1
  174. package/dist/apps/management/routes/projects.js +6 -1
  175. package/dist/apps/management/routes/projects.js.map +1 -1
  176. package/dist/apps/management/routes/scopes.d.ts.map +1 -1
  177. package/dist/apps/management/routes/scopes.js +4 -1
  178. package/dist/apps/management/routes/scopes.js.map +1 -1
  179. package/dist/apps/management/routes/usage.d.ts +8 -8
  180. package/dist/apps/management/routes/usage.js +21 -4
  181. package/dist/apps/management/routes/usage.js.map +1 -1
  182. package/dist/apps/management/routes/verified-token-requests.d.ts +16 -16
  183. package/dist/apps/management/routes/webhooks.d.ts +931 -215
  184. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  185. package/dist/apps/management/routes/webhooks.js +71 -25
  186. package/dist/apps/management/routes/webhooks.js.map +1 -1
  187. package/dist/apps/mcp.d.ts +1 -1
  188. package/dist/apps/mcp.js +7 -7
  189. package/dist/apps/mcp.js.map +1 -1
  190. package/dist/apps/mpp/App.d.ts.map +1 -1
  191. package/dist/apps/mpp/App.js +35 -7
  192. package/dist/apps/mpp/App.js.map +1 -1
  193. package/dist/apps/mpp/internal/Adapter.d.ts +2 -0
  194. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -1
  195. package/dist/apps/mpp/internal/Adapter.js +30 -1
  196. package/dist/apps/mpp/internal/Adapter.js.map +1 -1
  197. package/dist/apps/mpp/internal/Policy.d.ts +22 -4
  198. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
  199. package/dist/apps/mpp/internal/Policy.js +24 -6
  200. package/dist/apps/mpp/internal/Policy.js.map +1 -1
  201. package/dist/apps/mpp/internal/Sponsorship.d.ts +3 -0
  202. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
  203. package/dist/apps/mpp/internal/Sponsorship.js +6 -3
  204. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
  205. package/dist/apps/relay/App.d.ts +2 -0
  206. package/dist/apps/relay/App.d.ts.map +1 -1
  207. package/dist/apps/relay/App.js +177 -26
  208. package/dist/apps/relay/App.js.map +1 -1
  209. package/dist/apps/relay/Sponsorships.d.ts +5 -3
  210. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  211. package/dist/apps/relay/Sponsorships.js +232 -25
  212. package/dist/apps/relay/Sponsorships.js.map +1 -1
  213. package/dist/apps/{funding → routes}/Access.d.ts +4 -4
  214. package/dist/apps/routes/Access.d.ts.map +1 -0
  215. package/dist/apps/{funding → routes}/Access.js +4 -4
  216. package/dist/apps/routes/Access.js.map +1 -0
  217. package/dist/apps/{funding → routes}/App.d.ts +841 -136
  218. package/dist/apps/{funding → routes}/App.d.ts.map +1 -1
  219. package/dist/apps/{funding → routes}/App.js +17 -17
  220. package/dist/apps/routes/App.js.map +1 -0
  221. package/dist/apps/routes/Inventory.d.ts.map +1 -0
  222. package/dist/apps/{funding → routes}/Inventory.js +2 -2
  223. package/dist/apps/routes/Inventory.js.map +1 -0
  224. package/dist/apps/routes/index.d.ts +2 -0
  225. package/dist/apps/routes/index.d.ts.map +1 -0
  226. package/dist/apps/routes/index.js +2 -0
  227. package/dist/apps/routes/index.js.map +1 -0
  228. package/dist/apps/{funding → routes}/routes/chains.d.ts +7 -7
  229. package/dist/apps/routes/routes/chains.d.ts.map +1 -0
  230. package/dist/apps/{funding → routes}/routes/chains.js +25 -25
  231. package/dist/apps/routes/routes/chains.js.map +1 -0
  232. package/dist/apps/{funding → routes}/routes/deposit-addresses.d.ts +123 -59
  233. package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -0
  234. package/dist/apps/{funding → routes}/routes/deposit-addresses.js +498 -223
  235. package/dist/apps/routes/routes/deposit-addresses.js.map +1 -0
  236. package/dist/apps/{funding → routes}/routes/providers.d.ts +8 -8
  237. package/dist/apps/routes/routes/providers.d.ts.map +1 -0
  238. package/dist/apps/routes/routes/providers.js +57 -0
  239. package/dist/apps/routes/routes/providers.js.map +1 -0
  240. package/dist/apps/{funding → routes}/routes/quotes.d.ts +19 -16
  241. package/dist/apps/routes/routes/quotes.d.ts.map +1 -0
  242. package/dist/apps/{funding → routes}/routes/quotes.js +55 -38
  243. package/dist/apps/routes/routes/quotes.js.map +1 -0
  244. package/dist/apps/{funding → routes}/routes/transfers.d.ts +957 -71
  245. package/dist/apps/routes/routes/transfers.d.ts.map +1 -0
  246. package/dist/apps/routes/routes/transfers.js +1140 -0
  247. package/dist/apps/routes/routes/transfers.js.map +1 -0
  248. package/dist/cli/Cli.d.ts +30 -0
  249. package/dist/cli/Cli.d.ts.map +1 -1
  250. package/dist/cli/commands/admin.d.ts +36 -0
  251. package/dist/cli/commands/admin.d.ts.map +1 -1
  252. package/dist/cli/commands/admin.js +273 -0
  253. package/dist/cli/commands/admin.js.map +1 -1
  254. package/dist/cloudflare.d.ts +16 -14
  255. package/dist/cloudflare.d.ts.map +1 -1
  256. package/dist/cloudflare.js +26 -21
  257. package/dist/cloudflare.js.map +1 -1
  258. package/dist/db/Db.d.ts +63 -21
  259. package/dist/db/Db.d.ts.map +1 -1
  260. package/dist/db/Db.js +1052 -15
  261. package/dist/db/Db.js.map +1 -1
  262. package/dist/db/Schema.d.ts +785 -133
  263. package/dist/db/Schema.d.ts.map +1 -1
  264. package/dist/db/Schema.js +590 -162
  265. package/dist/db/Schema.js.map +1 -1
  266. package/dist/db/tables/apiKeyAdmissionBootstraps.d.ts +4 -0
  267. package/dist/db/tables/apiKeyAdmissionBootstraps.d.ts.map +1 -0
  268. package/dist/db/tables/apiKeyAdmissionBootstraps.js +2 -0
  269. package/dist/db/tables/apiKeyAdmissionBootstraps.js.map +1 -0
  270. package/dist/db/tables/apiKeyAdmissions.d.ts +73 -0
  271. package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -0
  272. package/dist/db/tables/apiKeyAdmissions.js +142 -0
  273. package/dist/db/tables/apiKeyAdmissions.js.map +1 -0
  274. package/dist/db/tables/apiKeyOwnerAdmissions.d.ts +4 -0
  275. package/dist/db/tables/apiKeyOwnerAdmissions.d.ts.map +1 -0
  276. package/dist/db/tables/apiKeyOwnerAdmissions.js +2 -0
  277. package/dist/db/tables/apiKeyOwnerAdmissions.js.map +1 -0
  278. package/dist/db/tables/apiKeyOwnerTombstones.d.ts +20 -0
  279. package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -0
  280. package/dist/db/tables/apiKeyOwnerTombstones.js +57 -0
  281. package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -0
  282. package/dist/db/tables/apiKeyRevocations.d.ts +21 -0
  283. package/dist/db/tables/apiKeyRevocations.d.ts.map +1 -0
  284. package/dist/db/tables/apiKeyRevocations.js +98 -0
  285. package/dist/db/tables/apiKeyRevocations.js.map +1 -0
  286. package/dist/db/tables/authAccounts.d.ts +47 -0
  287. package/dist/db/tables/authAccounts.d.ts.map +1 -0
  288. package/dist/db/tables/authAccounts.js +72 -0
  289. package/dist/db/tables/authAccounts.js.map +1 -0
  290. package/dist/db/tables/authSessions.d.ts +12 -0
  291. package/dist/db/tables/authSessions.d.ts.map +1 -0
  292. package/dist/db/tables/authSessions.js +2 -0
  293. package/dist/db/tables/authSessions.js.map +1 -0
  294. package/dist/db/tables/authVerifications.d.ts +12 -0
  295. package/dist/db/tables/authVerifications.d.ts.map +1 -0
  296. package/dist/db/tables/authVerifications.js +2 -0
  297. package/dist/db/tables/authVerifications.js.map +1 -0
  298. package/dist/db/tables/invitations.d.ts +17 -1
  299. package/dist/db/tables/invitations.d.ts.map +1 -1
  300. package/dist/db/tables/invitations.js +123 -43
  301. package/dist/db/tables/invitations.js.map +1 -1
  302. package/dist/db/tables/memberships.d.ts +8 -0
  303. package/dist/db/tables/memberships.d.ts.map +1 -1
  304. package/dist/db/tables/memberships.js +51 -2
  305. package/dist/db/tables/memberships.js.map +1 -1
  306. package/dist/db/tables/organizations.d.ts +51 -5
  307. package/dist/db/tables/organizations.d.ts.map +1 -1
  308. package/dist/db/tables/organizations.js +135 -47
  309. package/dist/db/tables/organizations.js.map +1 -1
  310. package/dist/db/tables/projects.d.ts +27 -1
  311. package/dist/db/tables/projects.d.ts.map +1 -1
  312. package/dist/db/tables/projects.js +38 -3
  313. package/dist/db/tables/projects.js.map +1 -1
  314. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  315. package/dist/db/tables/requestUsage.js.map +1 -1
  316. package/dist/db/tables/rewardAccounts.d.ts +86 -0
  317. package/dist/db/tables/rewardAccounts.d.ts.map +1 -0
  318. package/dist/db/tables/rewardAccounts.js +88 -0
  319. package/dist/db/tables/rewardAccounts.js.map +1 -0
  320. package/dist/db/tables/rewardCampaignDistributors.d.ts +36 -0
  321. package/dist/db/tables/rewardCampaignDistributors.d.ts.map +1 -0
  322. package/dist/db/tables/rewardCampaignDistributors.js +30 -0
  323. package/dist/db/tables/rewardCampaignDistributors.js.map +1 -0
  324. package/dist/db/tables/rewardCampaigns.d.ts +171 -0
  325. package/dist/db/tables/rewardCampaigns.d.ts.map +1 -0
  326. package/dist/db/tables/rewardCampaigns.js +392 -0
  327. package/dist/db/tables/rewardCampaigns.js.map +1 -0
  328. package/dist/db/tables/rewardCredits.d.ts +53 -0
  329. package/dist/db/tables/rewardCredits.d.ts.map +1 -0
  330. package/dist/db/tables/rewardCredits.js +63 -0
  331. package/dist/db/tables/rewardCredits.js.map +1 -0
  332. package/dist/db/tables/rewardEligibilityAssociations.d.ts +61 -0
  333. package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -0
  334. package/dist/db/tables/rewardEligibilityAssociations.js +103 -0
  335. package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -0
  336. package/dist/db/tables/rewardRuns.d.ts +188 -0
  337. package/dist/db/tables/rewardRuns.d.ts.map +1 -0
  338. package/dist/db/tables/rewardRuns.js +278 -0
  339. package/dist/db/tables/rewardRuns.js.map +1 -0
  340. package/dist/db/tables/rewardTransactionAttempts.d.ts +100 -0
  341. package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -0
  342. package/dist/db/tables/rewardTransactionAttempts.js +163 -0
  343. package/dist/db/tables/rewardTransactionAttempts.js.map +1 -0
  344. package/dist/db/tables/routesCatalog.d.ts +58 -0
  345. package/dist/db/tables/routesCatalog.d.ts.map +1 -0
  346. package/dist/db/tables/{fundingCatalog.js → routesCatalog.js} +19 -19
  347. package/dist/db/tables/routesCatalog.js.map +1 -0
  348. package/dist/db/tables/routesDepositAddresses.d.ts +476 -0
  349. package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -0
  350. package/dist/db/tables/routesDepositAddresses.js +587 -0
  351. package/dist/db/tables/routesDepositAddresses.js.map +1 -0
  352. package/dist/db/tables/{fundingDepositRequestObservations.d.ts → routesDepositRequestObservations.d.ts} +6 -6
  353. package/dist/db/tables/routesDepositRequestObservations.d.ts.map +1 -0
  354. package/dist/db/tables/{fundingDepositRequestObservations.js → routesDepositRequestObservations.js} +6 -6
  355. package/dist/db/tables/routesDepositRequestObservations.js.map +1 -0
  356. package/dist/db/tables/{fundingDeposits.d.ts → routesDeposits.d.ts} +210 -22
  357. package/dist/db/tables/routesDeposits.d.ts.map +1 -0
  358. package/dist/db/tables/routesDeposits.js +576 -0
  359. package/dist/db/tables/routesDeposits.js.map +1 -0
  360. package/dist/db/tables/routesIdempotency.d.ts +166 -0
  361. package/dist/db/tables/routesIdempotency.d.ts.map +1 -0
  362. package/dist/db/tables/routesIdempotency.js +330 -0
  363. package/dist/db/tables/routesIdempotency.js.map +1 -0
  364. package/dist/db/tables/routesSubsidies.d.ts +27 -0
  365. package/dist/db/tables/routesSubsidies.d.ts.map +1 -0
  366. package/dist/db/tables/routesSubsidies.js +45 -0
  367. package/dist/db/tables/routesSubsidies.js.map +1 -0
  368. package/dist/db/tables/{fundingTransferEvents.d.ts → routesTransferEvents.d.ts} +3 -3
  369. package/dist/db/tables/routesTransferEvents.d.ts.map +1 -0
  370. package/dist/db/tables/{fundingTransferEvents.js → routesTransferEvents.js} +3 -3
  371. package/dist/db/tables/routesTransferEvents.js.map +1 -0
  372. package/dist/db/tables/routesTransferSubsidies.d.ts +19 -0
  373. package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -0
  374. package/dist/db/tables/routesTransferSubsidies.js +17 -0
  375. package/dist/db/tables/routesTransferSubsidies.js.map +1 -0
  376. package/dist/db/tables/routesTransferSubsidyNonces.d.ts +51 -0
  377. package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -0
  378. package/dist/db/tables/routesTransferSubsidyNonces.js +82 -0
  379. package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -0
  380. package/dist/db/tables/routesTransferTransactions.d.ts +77 -0
  381. package/dist/db/tables/routesTransferTransactions.d.ts.map +1 -0
  382. package/dist/db/tables/routesTransferTransactions.js +86 -0
  383. package/dist/db/tables/routesTransferTransactions.js.map +1 -0
  384. package/dist/db/tables/routesTransfers.d.ts +319 -0
  385. package/dist/db/tables/routesTransfers.d.ts.map +1 -0
  386. package/dist/db/tables/routesTransfers.js +372 -0
  387. package/dist/db/tables/routesTransfers.js.map +1 -0
  388. package/dist/db/tables/sponsoredTransactions.d.ts +112 -13
  389. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  390. package/dist/db/tables/sponsoredTransactions.js +241 -38
  391. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  392. package/dist/db/tables/sponsorshipAttributions.d.ts +69 -0
  393. package/dist/db/tables/sponsorshipAttributions.d.ts.map +1 -0
  394. package/dist/db/tables/sponsorshipAttributions.js +77 -0
  395. package/dist/db/tables/sponsorshipAttributions.js.map +1 -0
  396. package/dist/db/tables/sponsorshipReconciliationCursors.d.ts +22 -0
  397. package/dist/db/tables/sponsorshipReconciliationCursors.d.ts.map +1 -0
  398. package/dist/db/tables/sponsorshipReconciliationCursors.js +45 -0
  399. package/dist/db/tables/sponsorshipReconciliationCursors.js.map +1 -0
  400. package/dist/db/tables/stripeCustomers.d.ts +11 -0
  401. package/dist/db/tables/stripeCustomers.d.ts.map +1 -1
  402. package/dist/db/tables/stripeCustomers.js +13 -0
  403. package/dist/db/tables/stripeCustomers.js.map +1 -1
  404. package/dist/db/tables/users.d.ts +17 -1
  405. package/dist/db/tables/users.d.ts.map +1 -1
  406. package/dist/db/tables/users.js +47 -2
  407. package/dist/db/tables/users.js.map +1 -1
  408. package/dist/db/tables/webhookQueueEvents.d.ts.map +1 -1
  409. package/dist/db/tables/webhookQueueEvents.js +5 -1
  410. package/dist/db/tables/webhookQueueEvents.js.map +1 -1
  411. package/dist/db/tables/webhookSubscriptions.d.ts +22 -10
  412. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  413. package/dist/db/tables/webhookSubscriptions.js +50 -15
  414. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  415. package/dist/handlers/internal/executionError.d.ts +2 -2
  416. package/dist/handlers/internal/executionError.d.ts.map +1 -1
  417. package/dist/handlers/internal/executionError.js +1 -2
  418. package/dist/handlers/internal/executionError.js.map +1 -1
  419. package/dist/handlers/internal/multisig.d.ts +4 -232
  420. package/dist/handlers/internal/multisig.d.ts.map +1 -1
  421. package/dist/handlers/internal/multisig.js +11 -537
  422. package/dist/handlers/internal/multisig.js.map +1 -1
  423. package/dist/handlers/internal/sponsorship.d.ts +19 -8
  424. package/dist/handlers/internal/sponsorship.d.ts.map +1 -1
  425. package/dist/handlers/internal/sponsorship.js +13 -9
  426. package/dist/handlers/internal/sponsorship.js.map +1 -1
  427. package/dist/handlers/relay.d.ts +9 -12
  428. package/dist/handlers/relay.d.ts.map +1 -1
  429. package/dist/handlers/relay.js +81 -85
  430. package/dist/handlers/relay.js.map +1 -1
  431. package/dist/index.d.ts +0 -17
  432. package/dist/index.d.ts.map +1 -1
  433. package/dist/index.js +0 -17
  434. package/dist/index.js.map +1 -1
  435. package/dist/internal/AssetResponse.d.ts +12 -0
  436. package/dist/internal/AssetResponse.d.ts.map +1 -0
  437. package/dist/internal/AssetResponse.js +21 -0
  438. package/dist/internal/AssetResponse.js.map +1 -0
  439. package/dist/internal/Auth.d.ts +48 -12
  440. package/dist/internal/Auth.d.ts.map +1 -1
  441. package/dist/internal/Auth.js +603 -175
  442. package/dist/internal/Auth.js.map +1 -1
  443. package/dist/internal/BetterAuth.d.ts +1488 -0
  444. package/dist/internal/BetterAuth.d.ts.map +1 -0
  445. package/dist/internal/BetterAuth.js +253 -0
  446. package/dist/internal/BetterAuth.js.map +1 -0
  447. package/dist/internal/Cache.d.ts +2 -0
  448. package/dist/internal/Cache.d.ts.map +1 -1
  449. package/dist/internal/Cache.js +2 -0
  450. package/dist/internal/Cache.js.map +1 -1
  451. package/dist/internal/EarnRates.d.ts +26 -3
  452. package/dist/internal/EarnRates.d.ts.map +1 -1
  453. package/dist/internal/EarnRates.js +84 -19
  454. package/dist/internal/EarnRates.js.map +1 -1
  455. package/dist/internal/EarnSharePrices.d.ts +120 -0
  456. package/dist/internal/EarnSharePrices.d.ts.map +1 -0
  457. package/dist/internal/EarnSharePrices.js +179 -0
  458. package/dist/internal/EarnSharePrices.js.map +1 -0
  459. package/dist/internal/EarnVaults.d.ts +4 -0
  460. package/dist/internal/EarnVaults.d.ts.map +1 -1
  461. package/dist/internal/EarnVaults.js +31 -14
  462. package/dist/internal/EarnVaults.js.map +1 -1
  463. package/dist/internal/Email.d.ts +37 -0
  464. package/dist/internal/Email.d.ts.map +1 -0
  465. package/dist/internal/Email.js +16 -0
  466. package/dist/internal/Email.js.map +1 -0
  467. package/dist/internal/Log.d.ts +32 -28
  468. package/dist/internal/Log.d.ts.map +1 -1
  469. package/dist/internal/Log.js +18 -11
  470. package/dist/internal/Log.js.map +1 -1
  471. package/dist/internal/MetricSink.d.ts +3 -0
  472. package/dist/internal/MetricSink.d.ts.map +1 -1
  473. package/dist/internal/MetricSink.js +67 -8
  474. package/dist/internal/MetricSink.js.map +1 -1
  475. package/dist/internal/Mpp.d.ts.map +1 -1
  476. package/dist/internal/Mpp.js +20 -25
  477. package/dist/internal/Mpp.js.map +1 -1
  478. package/dist/internal/OpenApi.d.ts +26 -3
  479. package/dist/internal/OpenApi.d.ts.map +1 -1
  480. package/dist/internal/OpenApi.js +25 -10
  481. package/dist/internal/OpenApi.js.map +1 -1
  482. package/dist/internal/Provider.d.ts +1 -1
  483. package/dist/internal/Provider.d.ts.map +1 -1
  484. package/dist/internal/RateLimit.d.ts.map +1 -1
  485. package/dist/internal/RateLimit.js +13 -1
  486. package/dist/internal/RateLimit.js.map +1 -1
  487. package/dist/internal/Store.d.ts +16 -0
  488. package/dist/internal/Store.d.ts.map +1 -1
  489. package/dist/internal/Store.js +59 -8
  490. package/dist/internal/Store.js.map +1 -1
  491. package/dist/internal/Tidx.d.ts +9 -2
  492. package/dist/internal/Tidx.d.ts.map +1 -1
  493. package/dist/internal/Tidx.js +78 -11
  494. package/dist/internal/Tidx.js.map +1 -1
  495. package/dist/internal/Timing.d.ts +26 -0
  496. package/dist/internal/Timing.d.ts.map +1 -1
  497. package/dist/internal/Timing.js +63 -5
  498. package/dist/internal/Timing.js.map +1 -1
  499. package/dist/internal/VercelOidc.d.ts +94 -0
  500. package/dist/internal/VercelOidc.d.ts.map +1 -0
  501. package/dist/internal/VercelOidc.js +128 -0
  502. package/dist/internal/VercelOidc.js.map +1 -0
  503. package/dist/internal/VerifiedTokens.d.ts +2 -8
  504. package/dist/internal/VerifiedTokens.d.ts.map +1 -1
  505. package/dist/internal/VerifiedTokens.js +24 -24
  506. package/dist/internal/VerifiedTokens.js.map +1 -1
  507. package/dist/internal/Viem.d.ts +46 -2068
  508. package/dist/internal/Viem.d.ts.map +1 -1
  509. package/dist/internal/Viem.js +171 -11
  510. package/dist/internal/Viem.js.map +1 -1
  511. package/dist/internal/Webhooks.d.ts +12 -4
  512. package/dist/internal/Webhooks.d.ts.map +1 -1
  513. package/dist/internal/Webhooks.js +9 -3
  514. package/dist/internal/Webhooks.js.map +1 -1
  515. package/dist/internal/ZoneRpc.d.ts +7 -0
  516. package/dist/internal/ZoneRpc.d.ts.map +1 -0
  517. package/dist/internal/ZoneRpc.js +49 -0
  518. package/dist/internal/ZoneRpc.js.map +1 -0
  519. package/dist/internal/index.d.ts +3 -1
  520. package/dist/internal/index.d.ts.map +1 -1
  521. package/dist/internal/index.js +3 -1
  522. package/dist/internal/index.js.map +1 -1
  523. package/dist/internal/rewards/Audit.d.ts +88 -0
  524. package/dist/internal/rewards/Audit.d.ts.map +1 -0
  525. package/dist/internal/rewards/Audit.js +134 -0
  526. package/dist/internal/rewards/Audit.js.map +1 -0
  527. package/dist/internal/rewards/Campaigns.d.ts +572 -0
  528. package/dist/internal/rewards/Campaigns.d.ts.map +1 -0
  529. package/dist/internal/rewards/Campaigns.js +531 -0
  530. package/dist/internal/rewards/Campaigns.js.map +1 -0
  531. package/dist/internal/rewards/Credits.d.ts +76 -0
  532. package/dist/internal/rewards/Credits.d.ts.map +1 -0
  533. package/dist/internal/rewards/Credits.js +95 -0
  534. package/dist/internal/rewards/Credits.js.map +1 -0
  535. package/dist/internal/rewards/Events.d.ts +100 -0
  536. package/dist/internal/rewards/Events.d.ts.map +1 -0
  537. package/dist/internal/rewards/Events.js +340 -0
  538. package/dist/internal/rewards/Events.js.map +1 -0
  539. package/dist/internal/rewards/Projection.d.ts +237 -0
  540. package/dist/internal/rewards/Projection.d.ts.map +1 -0
  541. package/dist/internal/rewards/Projection.js +616 -0
  542. package/dist/internal/rewards/Projection.js.map +1 -0
  543. package/dist/internal/rewards/Rates.d.ts +44 -0
  544. package/dist/internal/rewards/Rates.d.ts.map +1 -0
  545. package/dist/internal/rewards/Rates.js +60 -0
  546. package/dist/internal/rewards/Rates.js.map +1 -0
  547. package/dist/internal/rewards/Read.d.ts +158 -0
  548. package/dist/internal/rewards/Read.d.ts.map +1 -0
  549. package/dist/internal/rewards/Read.js +292 -0
  550. package/dist/internal/rewards/Read.js.map +1 -0
  551. package/dist/internal/rewards/Runner.d.ts +164 -0
  552. package/dist/internal/rewards/Runner.d.ts.map +1 -0
  553. package/dist/internal/rewards/Runner.js +1778 -0
  554. package/dist/internal/rewards/Runner.js.map +1 -0
  555. package/dist/internal/rewards/Signer.d.ts +224 -0
  556. package/dist/internal/rewards/Signer.d.ts.map +1 -0
  557. package/dist/internal/rewards/Signer.js +135 -0
  558. package/dist/internal/rewards/Signer.js.map +1 -0
  559. package/dist/internal/rewards/index.d.ts +15 -0
  560. package/dist/internal/rewards/index.d.ts.map +1 -0
  561. package/dist/internal/rewards/index.js +15 -0
  562. package/dist/internal/rewards/index.js.map +1 -0
  563. package/dist/internal/{funding → routes}/Action.d.ts +12 -1
  564. package/dist/internal/routes/Action.d.ts.map +1 -0
  565. package/dist/internal/{funding → routes}/Action.js +17 -9
  566. package/dist/internal/routes/Action.js.map +1 -0
  567. package/dist/internal/{funding → routes}/Catalog.d.ts +20 -20
  568. package/dist/internal/routes/Catalog.d.ts.map +1 -0
  569. package/dist/internal/{funding → routes}/Catalog.js +29 -29
  570. package/dist/internal/routes/Catalog.js.map +1 -0
  571. package/dist/internal/{funding → routes}/Chain.d.ts +10 -10
  572. package/dist/internal/routes/Chain.d.ts.map +1 -0
  573. package/dist/internal/{funding → routes}/Chain.js +3 -3
  574. package/dist/internal/routes/Chain.js.map +1 -0
  575. package/dist/internal/{funding → routes}/Deposit.d.ts +45 -23
  576. package/dist/internal/routes/Deposit.d.ts.map +1 -0
  577. package/dist/internal/{funding → routes}/Deposit.js +60 -27
  578. package/dist/internal/routes/Deposit.js.map +1 -0
  579. package/dist/internal/{funding → routes}/DepositAddress.d.ts +56 -27
  580. package/dist/internal/routes/DepositAddress.d.ts.map +1 -0
  581. package/dist/internal/{funding → routes}/DepositAddress.js +95 -33
  582. package/dist/internal/routes/DepositAddress.js.map +1 -0
  583. package/dist/internal/{funding → routes}/DepositWebhook.d.ts +4 -4
  584. package/dist/internal/routes/DepositWebhook.d.ts.map +1 -0
  585. package/dist/internal/{funding → routes}/DepositWebhook.js +4 -3
  586. package/dist/internal/routes/DepositWebhook.js.map +1 -0
  587. package/dist/internal/routes/Economics.d.ts +25 -0
  588. package/dist/internal/routes/Economics.d.ts.map +1 -0
  589. package/dist/internal/routes/Economics.js +28 -0
  590. package/dist/internal/routes/Economics.js.map +1 -0
  591. package/dist/internal/{funding → routes}/Evidence.d.ts +3 -3
  592. package/dist/internal/routes/Evidence.d.ts.map +1 -0
  593. package/dist/internal/{funding → routes}/Evidence.js +9 -17
  594. package/dist/internal/routes/Evidence.js.map +1 -0
  595. package/dist/internal/routes/Observability.d.ts +154 -0
  596. package/dist/internal/routes/Observability.d.ts.map +1 -0
  597. package/dist/internal/routes/Observability.js +389 -0
  598. package/dist/internal/routes/Observability.js.map +1 -0
  599. package/dist/internal/{funding → routes}/Provider.d.ts +350 -104
  600. package/dist/internal/routes/Provider.d.ts.map +1 -0
  601. package/dist/internal/{funding → routes}/Provider.js +233 -97
  602. package/dist/internal/routes/Provider.js.map +1 -0
  603. package/dist/internal/{funding → routes}/Reconciliation.d.ts +11 -6
  604. package/dist/internal/routes/Reconciliation.d.ts.map +1 -0
  605. package/dist/internal/{funding → routes}/Reconciliation.js +408 -158
  606. package/dist/internal/routes/Reconciliation.js.map +1 -0
  607. package/dist/internal/routes/Route.d.ts +21 -0
  608. package/dist/internal/routes/Route.d.ts.map +1 -0
  609. package/dist/internal/{funding → routes}/Route.js +1 -1
  610. package/dist/internal/routes/Route.js.map +1 -0
  611. package/dist/internal/{funding → routes}/SourceObservation.d.ts +6 -6
  612. package/dist/internal/routes/SourceObservation.d.ts.map +1 -0
  613. package/dist/internal/{funding → routes}/SourceObservation.js +13 -15
  614. package/dist/internal/routes/SourceObservation.js.map +1 -0
  615. package/dist/internal/{funding → routes}/Subsidy.d.ts +48 -3
  616. package/dist/internal/routes/Subsidy.d.ts.map +1 -0
  617. package/dist/internal/{funding → routes}/Subsidy.js +43 -3
  618. package/dist/internal/routes/Subsidy.js.map +1 -0
  619. package/dist/internal/{funding → routes}/Token.d.ts +4 -4
  620. package/dist/internal/routes/Token.d.ts.map +1 -0
  621. package/dist/internal/{funding → routes}/Token.js +3 -3
  622. package/dist/internal/routes/Token.js.map +1 -0
  623. package/dist/internal/{funding → routes}/Transfer.d.ts +324 -34
  624. package/dist/internal/routes/Transfer.d.ts.map +1 -0
  625. package/dist/internal/routes/Transfer.js +728 -0
  626. package/dist/internal/routes/Transfer.js.map +1 -0
  627. package/dist/internal/routes/TransferReconciliation.d.ts +55 -0
  628. package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -0
  629. package/dist/internal/routes/TransferReconciliation.js +422 -0
  630. package/dist/internal/routes/TransferReconciliation.js.map +1 -0
  631. package/dist/internal/routes/TransferSubsidy.d.ts +201 -0
  632. package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -0
  633. package/dist/internal/routes/TransferSubsidy.js +256 -0
  634. package/dist/internal/routes/TransferSubsidy.js.map +1 -0
  635. package/dist/internal/routes/TransferWebhook.d.ts +21 -0
  636. package/dist/internal/routes/TransferWebhook.d.ts.map +1 -0
  637. package/dist/internal/routes/TransferWebhook.js +43 -0
  638. package/dist/internal/routes/TransferWebhook.js.map +1 -0
  639. package/dist/internal/{funding → routes}/index.d.ts +3 -0
  640. package/dist/internal/routes/index.d.ts.map +1 -0
  641. package/dist/internal/{funding → routes}/index.js +3 -0
  642. package/dist/internal/routes/index.js.map +1 -0
  643. package/dist/internal/{funding → routes}/providers/across.d.ts +4 -4
  644. package/dist/internal/routes/providers/across.d.ts.map +1 -0
  645. package/dist/internal/{funding → routes}/providers/across.js +13 -13
  646. package/dist/internal/routes/providers/across.js.map +1 -0
  647. package/dist/internal/{funding → routes}/providers/relay.d.ts +21 -12
  648. package/dist/internal/routes/providers/relay.d.ts.map +1 -0
  649. package/dist/internal/{funding → routes}/providers/relay.js +197 -122
  650. package/dist/internal/routes/providers/relay.js.map +1 -0
  651. package/dist/internal/{funding → routes}/providers/rhino.d.ts +4 -4
  652. package/dist/internal/routes/providers/rhino.d.ts.map +1 -0
  653. package/dist/internal/{funding → routes}/providers/rhino.js +10 -10
  654. package/dist/internal/routes/providers/rhino.js.map +1 -0
  655. package/dist/internal/{funding → routes}/providers/squid.d.ts +4 -4
  656. package/dist/internal/routes/providers/squid.d.ts.map +1 -0
  657. package/dist/internal/{funding → routes}/providers/squid.js +14 -14
  658. package/dist/internal/routes/providers/squid.js.map +1 -0
  659. package/dist/internal/routes/providers/stargate.d.ts +165 -0
  660. package/dist/internal/routes/providers/stargate.d.ts.map +1 -0
  661. package/dist/internal/routes/providers/stargate.js +898 -0
  662. package/dist/internal/routes/providers/stargate.js.map +1 -0
  663. package/dist/internal/{funding → routes}/providers/symbiosis.d.ts +4 -4
  664. package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -0
  665. package/dist/internal/{funding → routes}/providers/symbiosis.js +30 -20
  666. package/dist/internal/routes/providers/symbiosis.js.map +1 -0
  667. package/dist/internal/webhookDestinations/slack.d.ts.map +1 -1
  668. package/dist/internal/webhookDestinations/slack.js +22 -6
  669. package/dist/internal/webhookDestinations/slack.js.map +1 -1
  670. package/dist/providers/index.d.ts +12 -12
  671. package/dist/providers/index.d.ts.map +1 -1
  672. package/dist/providers/index.js +12 -12
  673. package/dist/providers/index.js.map +1 -1
  674. package/dist/server.d.ts +19 -0
  675. package/dist/server.d.ts.map +1 -0
  676. package/dist/server.js +19 -0
  677. package/dist/server.js.map +1 -0
  678. package/package.json +15 -4
  679. package/src/ApiKey.ts +1 -1
  680. package/src/ApiKeys.test.ts +1033 -3
  681. package/src/ApiKeys.ts +489 -48
  682. package/src/App.test-d.ts +1 -1
  683. package/src/App.test.ts +216 -25
  684. package/src/App.ts +335 -31
  685. package/src/Assets.test.ts +2 -2
  686. package/src/Assets.ts +3 -1
  687. package/src/Auth.test-d.ts +1 -1
  688. package/src/Client.test-d.ts +611 -101
  689. package/src/Handler.ts +0 -1
  690. package/src/OpenApi.contract.test.ts +195 -0
  691. package/src/Scope.ts +17 -5
  692. package/src/Webhooks.ts +2 -2
  693. package/src/admin/App.test.ts +30 -2
  694. package/src/admin/App.ts +42 -6
  695. package/src/admin/apps/api-keys.test.ts +267 -5
  696. package/src/admin/apps/api-keys.ts +100 -50
  697. package/src/admin/apps/earn-vaults.test.ts +158 -0
  698. package/src/admin/apps/earn-vaults.ts +681 -7
  699. package/src/admin/apps/organizations.test.ts +342 -1
  700. package/src/admin/apps/organizations.ts +368 -8
  701. package/src/admin/apps/routes-support.test.ts +200 -0
  702. package/src/admin/apps/routes-support.ts +201 -0
  703. package/src/admin/apps/routes.test.ts +450 -0
  704. package/src/admin/apps/routes.ts +896 -0
  705. package/src/admin/apps/scopes.test.ts +15 -5
  706. package/src/admin/apps/subsidies.test.ts +306 -0
  707. package/src/admin/apps/subsidies.ts +457 -0
  708. package/src/admin/apps/verified-tokens.test.ts +8 -3
  709. package/src/admin/apps/verified-tokens.ts +3 -3
  710. package/src/admin/ui/plugin.ts +1 -2
  711. package/src/admin/ui/src/components/RewardCampaignForm.tsx +1009 -0
  712. package/src/admin/ui/src/lib/config.ts +11 -2
  713. package/src/admin/ui/src/lib/earn-vaults.ts +2 -2
  714. package/src/admin/ui/src/lib/organizations.test.ts +147 -3
  715. package/src/admin/ui/src/lib/organizations.ts +136 -0
  716. package/src/admin/ui/src/lib/query-client.ts +1 -1
  717. package/src/admin/ui/src/lib/reward-campaigns.ts +136 -0
  718. package/src/admin/ui/src/lib/routes.test.ts +88 -0
  719. package/src/admin/ui/src/lib/routes.ts +304 -0
  720. package/src/admin/ui/src/lib/subsidies.ts +75 -0
  721. package/src/admin/ui/src/routeTree.gen.ts +63 -0
  722. package/src/admin/ui/src/routes/__root.tsx +12 -1
  723. package/src/admin/ui/src/routes/api-keys.tsx +196 -84
  724. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +105 -70
  725. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +334 -2
  726. package/src/admin/ui/src/routes/routes.tsx +1615 -0
  727. package/src/admin/ui/src/routes/routes_.support.tsx +248 -0
  728. package/src/admin/ui/src/routes/subsidies.tsx +799 -0
  729. package/src/admin/ui.generated.ts +144 -69
  730. package/src/analytics/Analytics.test.ts +108 -18
  731. package/src/analytics/Analytics.ts +38 -6
  732. package/src/analytics/tables/requestEvents.test.ts +100 -0
  733. package/src/analytics/tables/requestEvents.ts +10 -1
  734. package/src/analytics/tables/routesLifecycleIntervals.ts +140 -0
  735. package/src/apps/Zones.test.ts +18 -3
  736. package/src/apps/Zones.ts +55 -8
  737. package/src/apps/composition.test.ts +68 -59
  738. package/src/apps/data/App.test.ts +154 -2
  739. package/src/apps/data/App.ts +102 -33
  740. package/src/apps/data/routes/activities.test.ts +419 -7
  741. package/src/apps/data/routes/activities.ts +683 -216
  742. package/src/apps/data/routes/balances.test.ts +2 -2
  743. package/src/apps/data/routes/blocks.test.ts +46 -1
  744. package/src/apps/data/routes/coingecko.test.ts +419 -1
  745. package/src/apps/data/routes/coingecko.ts +309 -253
  746. package/src/apps/data/routes/earn.discovery.test.ts +274 -0
  747. package/src/apps/data/routes/earn.test.ts +1661 -29
  748. package/src/apps/data/routes/earn.ts +2314 -328
  749. package/src/apps/data/routes/exchanges.test.ts +752 -30
  750. package/src/apps/data/routes/exchanges.ts +954 -753
  751. package/src/apps/data/routes/fee-amm.test.ts +224 -0
  752. package/src/apps/data/routes/fee-amm.ts +208 -178
  753. package/src/apps/data/routes/indexer.test.ts +389 -0
  754. package/src/apps/data/routes/indexer.ts +165 -69
  755. package/src/apps/data/routes/receipts.test.ts +1 -1
  756. package/src/apps/data/routes/rpc.test.ts +352 -8
  757. package/src/apps/data/routes/rpc.ts +407 -219
  758. package/src/apps/data/routes/rpc.zone.test.ts +340 -0
  759. package/src/apps/data/routes/tokenlist.test.ts +285 -0
  760. package/src/apps/data/routes/tokenlist.ts +173 -88
  761. package/src/apps/data/routes/tokens.test.ts +93 -3
  762. package/src/apps/data/routes/tokens.ts +39 -23
  763. package/src/apps/data/routes/transactions.test.ts +1 -1
  764. package/src/apps/data/routes/transfers.test.ts +56 -24
  765. package/src/apps/data/routes/transfers.ts +19 -8
  766. package/src/apps/data/routes/valuation.test.ts +1 -1
  767. package/src/apps/data/routes/verified-tokens.test.ts +345 -0
  768. package/src/apps/data/routes/verified-tokens.ts +99 -29
  769. package/src/apps/data/routes/webhooks.test.ts +659 -81
  770. package/src/apps/data/routes/webhooks.ts +1104 -817
  771. package/src/apps/data/routes/zones.test.ts +148 -71
  772. package/src/apps/data/routes/zones.ts +71 -55
  773. package/src/apps/docs/reference.ts +2 -2
  774. package/src/apps/index.ts +1 -1
  775. package/src/apps/management/App.ts +9 -51
  776. package/src/apps/management/Billing.test.ts +375 -14
  777. package/src/apps/management/Billing.ts +283 -34
  778. package/src/apps/management/routes/api-keys.test.ts +269 -7
  779. package/src/apps/management/routes/api-keys.ts +61 -20
  780. package/src/apps/management/routes/billing.test.ts +477 -15
  781. package/src/apps/management/routes/billing.ts +377 -50
  782. package/src/apps/management/routes/faucet.test.ts +1 -1
  783. package/src/apps/management/routes/faucet.ts +1 -1
  784. package/src/apps/management/routes/invitations.test.ts +270 -3
  785. package/src/apps/management/routes/invitations.ts +185 -15
  786. package/src/apps/management/routes/invoicePreview.test.ts +549 -0
  787. package/src/apps/management/routes/me.test.ts +246 -5
  788. package/src/apps/management/routes/me.ts +7 -2
  789. package/src/apps/management/routes/members.test.ts +108 -0
  790. package/src/apps/management/routes/orgs.test.ts +191 -3
  791. package/src/apps/management/routes/orgs.ts +58 -11
  792. package/src/apps/management/routes/projects.test.ts +33 -3
  793. package/src/apps/management/routes/projects.ts +6 -1
  794. package/src/apps/management/routes/scopes.test.ts +30 -2
  795. package/src/apps/management/routes/scopes.ts +4 -1
  796. package/src/apps/management/routes/usage.test.ts +32 -0
  797. package/src/apps/management/routes/usage.ts +22 -4
  798. package/src/apps/management/routes/webhooks.test.ts +49 -26
  799. package/src/apps/management/routes/webhooks.ts +93 -38
  800. package/src/apps/mcp.test.ts +6 -6
  801. package/src/apps/mcp.ts +7 -7
  802. package/src/apps/mpp/App.ts +37 -7
  803. package/src/apps/mpp/Mpp.test.ts +49 -8
  804. package/src/apps/mpp/Mpp.zone.test.ts +219 -0
  805. package/src/apps/mpp/internal/Adapter.ts +34 -0
  806. package/src/apps/mpp/internal/Policy.test.ts +86 -31
  807. package/src/apps/mpp/internal/Policy.ts +49 -7
  808. package/src/apps/mpp/internal/Sponsorship.test.ts +207 -0
  809. package/src/apps/mpp/internal/Sponsorship.ts +9 -3
  810. package/src/apps/relay/App.test.ts +1024 -38
  811. package/src/apps/relay/App.ts +228 -32
  812. package/src/apps/relay/App.zone-billing.test.ts +257 -0
  813. package/src/apps/relay/Sponsorships.test.ts +67 -4
  814. package/src/apps/relay/Sponsorships.ts +253 -29
  815. package/src/apps/relay/Sponsorships.zone.test.ts +102 -0
  816. package/src/apps/{funding → routes}/Access.ts +6 -6
  817. package/src/apps/routes/App.test.ts +165 -0
  818. package/src/apps/routes/App.ts +96 -0
  819. package/src/apps/{funding → routes}/Inventory.ts +2 -2
  820. package/src/apps/routes/index.ts +1 -0
  821. package/src/apps/{funding → routes}/routes/chains.test.ts +66 -66
  822. package/src/apps/{funding → routes}/routes/chains.ts +23 -23
  823. package/src/apps/{funding → routes}/routes/deposit-addresses.test.ts +1362 -462
  824. package/src/apps/{funding → routes}/routes/deposit-addresses.ts +568 -248
  825. package/src/apps/{funding → routes}/routes/providers.test.ts +27 -33
  826. package/src/apps/{funding → routes}/routes/providers.ts +23 -23
  827. package/src/apps/{funding → routes}/routes/quotes.test.ts +298 -41
  828. package/src/apps/{funding → routes}/routes/quotes.ts +57 -40
  829. package/src/apps/routes/routes/transfers.test.ts +2876 -0
  830. package/src/apps/routes/routes/transfers.ts +1332 -0
  831. package/src/cli/Cli.test.ts +1 -1
  832. package/src/cli/commands/admin.test.ts +748 -1
  833. package/src/cli/commands/admin.ts +278 -0
  834. package/src/cloudflare.ts +52 -47
  835. package/src/db/Db.test.ts +245 -2
  836. package/src/db/Db.ts +1511 -34
  837. package/src/db/Schema.ts +744 -228
  838. package/src/db/tables/apiKeyAdmissionBootstraps.ts +4 -0
  839. package/src/db/tables/apiKeyAdmissions.ts +218 -0
  840. package/src/db/tables/apiKeyOwnerAdmissions.ts +4 -0
  841. package/src/db/tables/apiKeyOwnerTombstones.ts +81 -0
  842. package/src/db/tables/apiKeyRevocations.test.ts +74 -0
  843. package/src/db/tables/apiKeyRevocations.ts +121 -0
  844. package/src/db/tables/authAccounts.ts +105 -0
  845. package/src/db/tables/authSessions.ts +13 -0
  846. package/src/db/tables/authVerifications.ts +13 -0
  847. package/src/db/tables/invitations.ts +142 -45
  848. package/src/db/tables/memberships.ts +79 -3
  849. package/src/db/tables/organizations.test.ts +725 -7
  850. package/src/db/tables/organizations.ts +182 -49
  851. package/src/db/tables/projects.test.ts +71 -0
  852. package/src/db/tables/projects.ts +59 -4
  853. package/src/db/tables/requestUsage.ts +4 -1
  854. package/src/db/tables/rewardAccounts.ts +178 -0
  855. package/src/db/tables/rewardCampaignDistributors.ts +68 -0
  856. package/src/db/tables/rewardCampaigns.test.ts +1388 -0
  857. package/src/db/tables/rewardCampaigns.ts +647 -0
  858. package/src/db/tables/rewardCredits.ts +110 -0
  859. package/src/db/tables/rewardEligibilityAssociations.test.ts +271 -0
  860. package/src/db/tables/rewardEligibilityAssociations.ts +184 -0
  861. package/src/db/tables/rewardRuns.ts +514 -0
  862. package/src/db/tables/rewardTransactionAttempts.ts +272 -0
  863. package/src/db/tables/routesCatalog.test.ts +185 -0
  864. package/src/db/tables/routesCatalog.ts +163 -0
  865. package/src/db/tables/routesDepositAddresses.test.ts +1048 -0
  866. package/src/db/tables/routesDepositAddresses.ts +1008 -0
  867. package/src/db/tables/{fundingDepositRequestObservations.test.ts → routesDepositRequestObservations.test.ts} +13 -14
  868. package/src/db/tables/{fundingDepositRequestObservations.ts → routesDepositRequestObservations.ts} +10 -10
  869. package/src/db/tables/{fundingDeposits.test.ts → routesDeposits.test.ts} +316 -46
  870. package/src/db/tables/routesDeposits.ts +1062 -0
  871. package/src/db/tables/routesIdempotency.test.ts +796 -0
  872. package/src/db/tables/routesIdempotency.ts +496 -0
  873. package/src/db/tables/routesSubsidies.test.ts +120 -0
  874. package/src/db/tables/routesSubsidies.ts +71 -0
  875. package/src/db/tables/{fundingTransferEvents.ts → routesTransferEvents.ts} +4 -4
  876. package/src/db/tables/routesTransferSubsidies.ts +38 -0
  877. package/src/db/tables/routesTransferSubsidyNonces.ts +124 -0
  878. package/src/db/tables/routesTransferTransactions.test.ts +195 -0
  879. package/src/db/tables/routesTransferTransactions.ts +158 -0
  880. package/src/db/tables/routesTransfers.test.ts +338 -0
  881. package/src/db/tables/routesTransfers.ts +662 -0
  882. package/src/db/tables/sponsoredTransactions.test.ts +563 -1
  883. package/src/db/tables/sponsoredTransactions.ts +386 -42
  884. package/src/db/tables/sponsorshipAttributions.test.ts +160 -0
  885. package/src/db/tables/sponsorshipAttributions.ts +168 -0
  886. package/src/db/tables/sponsorshipReconciliationCursors.test.ts +115 -0
  887. package/src/db/tables/sponsorshipReconciliationCursors.ts +67 -0
  888. package/src/db/tables/stripeCustomers.test.ts +85 -0
  889. package/src/db/tables/stripeCustomers.ts +24 -0
  890. package/src/db/tables/users.test.ts +129 -0
  891. package/src/db/tables/users.ts +49 -3
  892. package/src/db/tables/webhookQueueEvents.ts +8 -1
  893. package/src/db/tables/webhookSubscriptions.ts +103 -21
  894. package/src/handlers/internal/executionError.ts +3 -4
  895. package/src/handlers/internal/multisig.ts +13 -816
  896. package/src/handlers/internal/sponsorship.ts +26 -10
  897. package/src/handlers/relay.test-d.ts +9 -1
  898. package/src/handlers/relay.test.ts +823 -3
  899. package/src/handlers/relay.ts +127 -107
  900. package/src/index.test-d.ts +7 -0
  901. package/src/index.ts +0 -17
  902. package/src/internal/AssetResponse.ts +26 -0
  903. package/src/internal/Auth.test.ts +1564 -9
  904. package/src/internal/Auth.ts +833 -239
  905. package/src/internal/BetterAuth.test.ts +242 -0
  906. package/src/internal/BetterAuth.ts +349 -0
  907. package/src/internal/Cache.ts +2 -0
  908. package/src/internal/EarnRates.test.ts +17 -0
  909. package/src/internal/EarnRates.ts +124 -31
  910. package/src/internal/EarnSharePrices.test.ts +182 -0
  911. package/src/internal/EarnSharePrices.ts +313 -0
  912. package/src/internal/EarnVaults.test.ts +21 -0
  913. package/src/internal/EarnVaults.ts +37 -15
  914. package/src/internal/Email.ts +54 -0
  915. package/src/internal/Idempotency.test.ts +2 -2
  916. package/src/internal/Log.test-d.ts +10 -7
  917. package/src/internal/Log.test.ts +114 -16
  918. package/src/internal/Log.ts +55 -40
  919. package/src/internal/MetricSink.test.ts +313 -26
  920. package/src/internal/MetricSink.ts +73 -8
  921. package/src/internal/Mpp.test.ts +31 -0
  922. package/src/internal/Mpp.ts +21 -24
  923. package/src/internal/OpenApi.ts +45 -12
  924. package/src/internal/Provider.test.ts +1 -1
  925. package/src/internal/Provider.ts +1 -1
  926. package/src/internal/RateLimit.test.ts +21 -3
  927. package/src/internal/RateLimit.ts +12 -1
  928. package/src/internal/Store.test-d.ts +1 -1
  929. package/src/internal/Store.test.ts +151 -8
  930. package/src/internal/Store.ts +76 -9
  931. package/src/internal/Tidx.test.ts +59 -8
  932. package/src/internal/Tidx.ts +86 -14
  933. package/src/internal/Timing.test.ts +77 -0
  934. package/src/internal/Timing.ts +83 -6
  935. package/src/internal/VercelOidc.test.ts +188 -0
  936. package/src/internal/VercelOidc.ts +193 -0
  937. package/src/internal/VerifiedTokens.test.ts +60 -6
  938. package/src/internal/VerifiedTokens.ts +21 -24
  939. package/src/internal/Viem.batch.test.ts +80 -0
  940. package/src/internal/Viem.test.ts +201 -2
  941. package/src/internal/Viem.ts +249 -17
  942. package/src/internal/Webhooks.test.ts +125 -1
  943. package/src/internal/Webhooks.ts +22 -4
  944. package/src/internal/ZoneRpc.ts +50 -0
  945. package/src/internal/exchange/Provider.test.ts +2 -2
  946. package/src/internal/index.test.ts +3 -1
  947. package/src/internal/index.ts +3 -1
  948. package/src/internal/rewards/Audit.ts +231 -0
  949. package/src/internal/rewards/Campaigns.test.ts +1234 -0
  950. package/src/internal/rewards/Campaigns.ts +1205 -0
  951. package/src/internal/rewards/Credits.ts +165 -0
  952. package/src/internal/rewards/Events.local.test.ts +113 -0
  953. package/src/internal/rewards/Events.test.ts +152 -0
  954. package/src/internal/rewards/Events.ts +468 -0
  955. package/src/internal/rewards/Projection.test.ts +681 -0
  956. package/src/internal/rewards/Projection.ts +987 -0
  957. package/src/internal/rewards/Rates.test.ts +171 -0
  958. package/src/internal/rewards/Rates.ts +110 -0
  959. package/src/internal/rewards/Read.test.ts +501 -0
  960. package/src/internal/rewards/Read.ts +476 -0
  961. package/src/internal/rewards/Runner.checkpoint.test.ts +80 -0
  962. package/src/internal/rewards/Runner.states.test.ts +188 -0
  963. package/src/internal/rewards/Runner.test.ts +90 -0
  964. package/src/internal/rewards/Runner.ts +2229 -0
  965. package/src/internal/rewards/Signer.test.ts +79 -0
  966. package/src/internal/rewards/Signer.ts +180 -0
  967. package/src/internal/rewards/index.ts +14 -0
  968. package/src/internal/{funding → routes}/Action.test.ts +63 -14
  969. package/src/internal/{funding → routes}/Action.ts +35 -8
  970. package/src/internal/{funding → routes}/Catalog.test.ts +3 -3
  971. package/src/internal/{funding → routes}/Catalog.ts +39 -39
  972. package/src/internal/{funding → routes}/Chain.test.ts +1 -1
  973. package/src/internal/{funding → routes}/Chain.ts +11 -11
  974. package/src/internal/{funding → routes}/Deposit.test.ts +1 -1
  975. package/src/internal/{funding → routes}/Deposit.ts +93 -45
  976. package/src/internal/{funding → routes}/DepositAddress.test.ts +11 -3
  977. package/src/internal/{funding → routes}/DepositAddress.ts +132 -53
  978. package/src/internal/{funding → routes}/DepositWebhook.test.ts +61 -18
  979. package/src/internal/{funding → routes}/DepositWebhook.ts +9 -8
  980. package/src/internal/routes/Economics.test.ts +42 -0
  981. package/src/internal/routes/Economics.ts +47 -0
  982. package/src/internal/{funding → routes}/Evidence.test.ts +6 -6
  983. package/src/internal/{funding → routes}/Evidence.ts +11 -22
  984. package/src/internal/routes/Observability.test.ts +636 -0
  985. package/src/internal/routes/Observability.ts +668 -0
  986. package/src/internal/{funding → routes}/Provider.test.ts +489 -153
  987. package/src/internal/{funding → routes}/Provider.ts +531 -185
  988. package/src/internal/{funding → routes}/Reconciliation.local.test.ts +84 -12
  989. package/src/internal/{funding → routes}/Reconciliation.test.ts +1213 -279
  990. package/src/internal/{funding → routes}/Reconciliation.ts +501 -203
  991. package/src/internal/routes/Reconciliation.unattributed.test.ts +250 -0
  992. package/src/internal/{funding → routes}/Route.ts +7 -7
  993. package/src/internal/{funding → routes}/SourceObservation.test.ts +13 -14
  994. package/src/internal/{funding → routes}/SourceObservation.ts +18 -22
  995. package/src/internal/{funding → routes}/Subsidy.local.test.ts +7 -7
  996. package/src/internal/routes/Subsidy.test.ts +169 -0
  997. package/src/internal/{funding → routes}/Subsidy.ts +86 -6
  998. package/src/internal/{funding → routes}/Token.test.ts +1 -1
  999. package/src/internal/{funding → routes}/Token.ts +5 -5
  1000. package/src/internal/routes/Transfer.test.ts +1199 -0
  1001. package/src/internal/routes/Transfer.ts +1206 -0
  1002. package/src/internal/routes/TransferReconciliation.test.ts +731 -0
  1003. package/src/internal/routes/TransferReconciliation.ts +527 -0
  1004. package/src/internal/routes/TransferSubsidy.test.ts +172 -0
  1005. package/src/internal/routes/TransferSubsidy.ts +447 -0
  1006. package/src/internal/routes/TransferWebhook.test.ts +128 -0
  1007. package/src/internal/routes/TransferWebhook.ts +67 -0
  1008. package/src/internal/{funding → routes}/index.test.ts +6 -3
  1009. package/src/internal/{funding → routes}/index.ts +3 -0
  1010. package/src/internal/{funding → routes}/providers/across.ts +16 -16
  1011. package/src/internal/{funding → routes}/providers/index.test.ts +157 -44
  1012. package/src/internal/{funding → routes}/providers/relay.test.ts +165 -32
  1013. package/src/internal/{funding → routes}/providers/relay.ts +231 -136
  1014. package/src/internal/{funding → routes}/providers/rhino.ts +16 -16
  1015. package/src/internal/{funding → routes}/providers/squid.ts +17 -17
  1016. package/src/internal/routes/providers/stargate.test.ts +728 -0
  1017. package/src/internal/routes/providers/stargate.ts +1276 -0
  1018. package/src/internal/{funding → routes}/providers/symbiosis.ts +64 -24
  1019. package/src/internal/webhookDestinations/slack.ts +20 -5
  1020. package/src/providers/index.ts +13 -13
  1021. package/src/server.ts +18 -0
  1022. package/dist/apps/funding/Access.d.ts.map +0 -1
  1023. package/dist/apps/funding/Access.js.map +0 -1
  1024. package/dist/apps/funding/App.js.map +0 -1
  1025. package/dist/apps/funding/Inventory.d.ts.map +0 -1
  1026. package/dist/apps/funding/Inventory.js.map +0 -1
  1027. package/dist/apps/funding/ProviderAttempts.d.ts +0 -5
  1028. package/dist/apps/funding/ProviderAttempts.d.ts.map +0 -1
  1029. package/dist/apps/funding/ProviderAttempts.js +0 -24
  1030. package/dist/apps/funding/ProviderAttempts.js.map +0 -1
  1031. package/dist/apps/funding/index.d.ts +0 -2
  1032. package/dist/apps/funding/index.d.ts.map +0 -1
  1033. package/dist/apps/funding/index.js +0 -2
  1034. package/dist/apps/funding/index.js.map +0 -1
  1035. package/dist/apps/funding/routes/chains.d.ts.map +0 -1
  1036. package/dist/apps/funding/routes/chains.js.map +0 -1
  1037. package/dist/apps/funding/routes/deposit-addresses.d.ts.map +0 -1
  1038. package/dist/apps/funding/routes/deposit-addresses.js.map +0 -1
  1039. package/dist/apps/funding/routes/providers.d.ts.map +0 -1
  1040. package/dist/apps/funding/routes/providers.js +0 -57
  1041. package/dist/apps/funding/routes/providers.js.map +0 -1
  1042. package/dist/apps/funding/routes/quotes.d.ts.map +0 -1
  1043. package/dist/apps/funding/routes/quotes.js.map +0 -1
  1044. package/dist/apps/funding/routes/transfers.d.ts.map +0 -1
  1045. package/dist/apps/funding/routes/transfers.js +0 -622
  1046. package/dist/apps/funding/routes/transfers.js.map +0 -1
  1047. package/dist/db/tables/fundingCatalog.d.ts +0 -58
  1048. package/dist/db/tables/fundingCatalog.d.ts.map +0 -1
  1049. package/dist/db/tables/fundingCatalog.js.map +0 -1
  1050. package/dist/db/tables/fundingDepositAddresses.d.ts +0 -192
  1051. package/dist/db/tables/fundingDepositAddresses.d.ts.map +0 -1
  1052. package/dist/db/tables/fundingDepositAddresses.js +0 -235
  1053. package/dist/db/tables/fundingDepositAddresses.js.map +0 -1
  1054. package/dist/db/tables/fundingDepositRequestObservations.d.ts.map +0 -1
  1055. package/dist/db/tables/fundingDepositRequestObservations.js.map +0 -1
  1056. package/dist/db/tables/fundingDeposits.d.ts.map +0 -1
  1057. package/dist/db/tables/fundingDeposits.js +0 -295
  1058. package/dist/db/tables/fundingDeposits.js.map +0 -1
  1059. package/dist/db/tables/fundingIdempotency.d.ts +0 -91
  1060. package/dist/db/tables/fundingIdempotency.d.ts.map +0 -1
  1061. package/dist/db/tables/fundingIdempotency.js +0 -103
  1062. package/dist/db/tables/fundingIdempotency.js.map +0 -1
  1063. package/dist/db/tables/fundingTransferEvents.d.ts.map +0 -1
  1064. package/dist/db/tables/fundingTransferEvents.js.map +0 -1
  1065. package/dist/db/tables/fundingTransferTransactions.d.ts +0 -15
  1066. package/dist/db/tables/fundingTransferTransactions.d.ts.map +0 -1
  1067. package/dist/db/tables/fundingTransferTransactions.js +0 -27
  1068. package/dist/db/tables/fundingTransferTransactions.js.map +0 -1
  1069. package/dist/db/tables/fundingTransfers.d.ts +0 -82
  1070. package/dist/db/tables/fundingTransfers.d.ts.map +0 -1
  1071. package/dist/db/tables/fundingTransfers.js +0 -89
  1072. package/dist/db/tables/fundingTransfers.js.map +0 -1
  1073. package/dist/internal/funding/Action.d.ts.map +0 -1
  1074. package/dist/internal/funding/Action.js.map +0 -1
  1075. package/dist/internal/funding/Catalog.d.ts.map +0 -1
  1076. package/dist/internal/funding/Catalog.js.map +0 -1
  1077. package/dist/internal/funding/Chain.d.ts.map +0 -1
  1078. package/dist/internal/funding/Chain.js.map +0 -1
  1079. package/dist/internal/funding/Deposit.d.ts.map +0 -1
  1080. package/dist/internal/funding/Deposit.js.map +0 -1
  1081. package/dist/internal/funding/DepositAddress.d.ts.map +0 -1
  1082. package/dist/internal/funding/DepositAddress.js.map +0 -1
  1083. package/dist/internal/funding/DepositWebhook.d.ts.map +0 -1
  1084. package/dist/internal/funding/DepositWebhook.js.map +0 -1
  1085. package/dist/internal/funding/Evidence.d.ts.map +0 -1
  1086. package/dist/internal/funding/Evidence.js.map +0 -1
  1087. package/dist/internal/funding/Provider.d.ts.map +0 -1
  1088. package/dist/internal/funding/Provider.js.map +0 -1
  1089. package/dist/internal/funding/Reconciliation.d.ts.map +0 -1
  1090. package/dist/internal/funding/Reconciliation.js.map +0 -1
  1091. package/dist/internal/funding/Route.d.ts +0 -21
  1092. package/dist/internal/funding/Route.d.ts.map +0 -1
  1093. package/dist/internal/funding/Route.js.map +0 -1
  1094. package/dist/internal/funding/SourceObservation.d.ts.map +0 -1
  1095. package/dist/internal/funding/SourceObservation.js.map +0 -1
  1096. package/dist/internal/funding/Subsidy.d.ts.map +0 -1
  1097. package/dist/internal/funding/Subsidy.js.map +0 -1
  1098. package/dist/internal/funding/Token.d.ts.map +0 -1
  1099. package/dist/internal/funding/Token.js.map +0 -1
  1100. package/dist/internal/funding/Transfer.d.ts.map +0 -1
  1101. package/dist/internal/funding/Transfer.js +0 -334
  1102. package/dist/internal/funding/Transfer.js.map +0 -1
  1103. package/dist/internal/funding/index.d.ts.map +0 -1
  1104. package/dist/internal/funding/index.js.map +0 -1
  1105. package/dist/internal/funding/providers/across.d.ts.map +0 -1
  1106. package/dist/internal/funding/providers/across.js.map +0 -1
  1107. package/dist/internal/funding/providers/relay.d.ts.map +0 -1
  1108. package/dist/internal/funding/providers/relay.js.map +0 -1
  1109. package/dist/internal/funding/providers/rhino.d.ts.map +0 -1
  1110. package/dist/internal/funding/providers/rhino.js.map +0 -1
  1111. package/dist/internal/funding/providers/squid.d.ts.map +0 -1
  1112. package/dist/internal/funding/providers/squid.js.map +0 -1
  1113. package/dist/internal/funding/providers/stargate.d.ts +0 -38
  1114. package/dist/internal/funding/providers/stargate.d.ts.map +0 -1
  1115. package/dist/internal/funding/providers/stargate.js +0 -277
  1116. package/dist/internal/funding/providers/stargate.js.map +0 -1
  1117. package/dist/internal/funding/providers/symbiosis.d.ts.map +0 -1
  1118. package/dist/internal/funding/providers/symbiosis.js.map +0 -1
  1119. package/src/apps/funding/App.test.ts +0 -78
  1120. package/src/apps/funding/App.ts +0 -78
  1121. package/src/apps/funding/ProviderAttempts.ts +0 -26
  1122. package/src/apps/funding/index.ts +0 -1
  1123. package/src/apps/funding/routes/transfers.test.ts +0 -1638
  1124. package/src/apps/funding/routes/transfers.ts +0 -721
  1125. package/src/db/tables/fundingCatalog.test.ts +0 -122
  1126. package/src/db/tables/fundingCatalog.ts +0 -163
  1127. package/src/db/tables/fundingDepositAddresses.test.ts +0 -608
  1128. package/src/db/tables/fundingDepositAddresses.ts +0 -443
  1129. package/src/db/tables/fundingDeposits.ts +0 -572
  1130. package/src/db/tables/fundingIdempotency.test.ts +0 -182
  1131. package/src/db/tables/fundingIdempotency.ts +0 -180
  1132. package/src/db/tables/fundingTransferTransactions.test.ts +0 -69
  1133. package/src/db/tables/fundingTransferTransactions.ts +0 -37
  1134. package/src/db/tables/fundingTransfers.test.ts +0 -89
  1135. package/src/db/tables/fundingTransfers.ts +0 -153
  1136. package/src/handlers/internal/multisig.test.ts +0 -818
  1137. package/src/internal/funding/Subsidy.test.ts +0 -75
  1138. package/src/internal/funding/Transfer.test.ts +0 -369
  1139. package/src/internal/funding/Transfer.ts +0 -545
  1140. package/src/internal/funding/providers/stargate.test.ts +0 -163
  1141. package/src/internal/funding/providers/stargate.ts +0 -409
  1142. /package/dist/apps/{funding → routes}/Inventory.d.ts +0 -0
  1143. /package/src/internal/{funding → routes}/Route.test.ts +0 -0
@@ -3,17 +3,21 @@ import * as NodeBuffer from 'node:buffer'
3
3
  import { AbiEvent, AbiFunction, AbiParameters, Address, Hex } from 'ox'
4
4
 
5
5
  import * as Metrics from '../../Metrics.js'
6
- import * as FundingCatalog from '../../db/tables/fundingCatalog.js'
7
- import * as FundingDepositAddresses from '../../db/tables/fundingDepositAddresses.js'
8
- import * as FundingDepositRequestObservations from '../../db/tables/fundingDepositRequestObservations.js'
9
- import * as FundingDeposits from '../../db/tables/fundingDeposits.js'
6
+ import * as Organizations from '../../db/tables/organizations.js'
7
+ import * as RoutesCatalog from '../../db/tables/routesCatalog.js'
8
+ import * as RoutesDepositAddresses from '../../db/tables/routesDepositAddresses.js'
9
+ import * as RoutesDepositRequestObservations from '../../db/tables/routesDepositRequestObservations.js'
10
+ import * as RoutesDeposits from '../../db/tables/routesDeposits.js'
11
+ import * as RoutesSubsidies from '../../db/tables/routesSubsidies.js'
12
+ import * as StripeCustomers from '../../db/tables/stripeCustomers.js'
10
13
  import * as TestApp from '../../../test/App.js'
11
- import * as TestFunding from '../../../test/Funding.js'
14
+ import * as TestRoutes from '../../../test/Routes.js'
12
15
  import * as TestRelay from '../../../test/Relay.js'
13
16
  import * as Chain from './Chain.js'
14
17
  import * as Deposit from './Deposit.js'
15
18
  import * as DepositAddress from './DepositAddress.js'
16
19
  import * as Evidence from './Evidence.js'
20
+ import * as Observability from './Observability.js'
17
21
  import * as Provider from './Provider.js'
18
22
  import * as Reconciliation from './Reconciliation.js'
19
23
  import * as Relay from './providers/relay.js'
@@ -23,13 +27,80 @@ const db = TestApp.database()
23
27
  const transferTopic = AbiEvent.getSelector('event Transfer(address,address,uint256)')
24
28
 
25
29
  describe('createTracker', () => {
30
+ test('schedules one poll after a provider payload failure', async () => {
31
+ const route = TestRoutes.transferSnapshot()
32
+ const address = await DepositAddress.create(db, {
33
+ deliveryStrategy: 'provider',
34
+ environment: 'production',
35
+ // Keep this failed record beyond the clocks used by later tick tests.
36
+ now: new Date('2126-09-01T22:30:00.000Z'),
37
+ orgId: 'org_provider_payload_failure',
38
+ providerOutputToken: route.destinationToken,
39
+ snapshot: {
40
+ address: `0x${'41'.repeat(20)}`,
41
+ destinationChain: route.destinationChain,
42
+ destinationToken: route.destinationToken,
43
+ provider: { id: 'relay', name: 'Relay' },
44
+ recipient: route.recipient,
45
+ refundAddress: `0x${'42'.repeat(20)}`,
46
+ sourceChain: route.sourceChain,
47
+ sourceToken: route.sourceToken,
48
+ subsidize: false,
49
+ },
50
+ })
51
+ const server = await TestRelay.createServer((_request, response) => {
52
+ response.writeHead(200, { 'content-type': 'application/json' })
53
+ response.end(JSON.stringify({ requests: null }))
54
+ })
55
+
56
+ try {
57
+ const tracker = Reconciliation.createTracker({
58
+ db,
59
+ dispatch: async () => undefined,
60
+ now: () => new Date('2126-09-01T22:31:45.000Z'),
61
+ providers: [Relay.relay({ apiKey: 'relay-api-key', baseUrl: server.url })],
62
+ verifyTransfers: Evidence.createVerifier({ db }),
63
+ })
64
+
65
+ const result = await tracker.reconcile({
66
+ addressId: address.id,
67
+ trigger: 'webhook',
68
+ type: 'routes:deposit-address:reconcile',
69
+ })
70
+ const stored = await RoutesDepositAddresses.get(db, address.id)
71
+
72
+ expect({
73
+ nextPollAt: stored?.nextPollAt,
74
+ pollFailureCount: stored?.pollFailureCount,
75
+ pollLeaseUntil: stored?.pollLeaseUntil,
76
+ result,
77
+ }).toMatchInlineSnapshot(`
78
+ {
79
+ "nextPollAt": "2126-09-01T22:32:45.000Z",
80
+ "pollFailureCount": 1,
81
+ "pollLeaseUntil": null,
82
+ "result": {
83
+ "type": "provider_unavailable",
84
+ },
85
+ }
86
+ `)
87
+ } finally {
88
+ await server.closeAsync()
89
+ }
90
+ })
91
+
26
92
  test('keeps Relay success pending without destination evidence', async () => {
27
- const route = TestFunding.transferSnapshot()
93
+ const route = TestRoutes.transferSnapshot()
28
94
  const depositAddress = `0x${'44'.repeat(20)}`
95
+ await db.kysely
96
+ .deleteFrom('routes_deposit_addresses')
97
+ .where('providerId', '=', 'relay')
98
+ .where('address', '=', depositAddress)
99
+ .execute()
100
+ const newerSourceTransactionHash = `0x${'bb'.repeat(32)}`
29
101
  const sourceTransactionHash = `0x${'aa'.repeat(32)}`
30
102
  const providerTransactionHash = `0x${'cc'.repeat(32)}`
31
103
  const address = await DepositAddress.create(db, {
32
- apiKeyId: 'key_reconciliation',
33
104
  deliveryStrategy: 'provider',
34
105
  environment: 'production',
35
106
  now: new Date('2026-01-01T00:00:00.000Z'),
@@ -58,22 +129,37 @@ describe('createTracker', () => {
58
129
  })
59
130
  const server = await TestRelay.createServer(async (request, response) => {
60
131
  if (request.method === 'GET') {
132
+ const requestId = new URL(request.url!, 'http://localhost').searchParams.get('id')
133
+ const requests = [
134
+ {
135
+ createdAt: '2026-01-01T00:02:00.000Z',
136
+ data: {
137
+ inTxs: [{ txHash: providerTransactionHash }],
138
+ outTxs: [],
139
+ },
140
+ depositAddress: { depositTxHash: newerSourceTransactionHash },
141
+ id: 'relay-newer-request',
142
+ status: 'success',
143
+ updatedAt: '2026-01-01T00:03:00.000Z',
144
+ },
145
+ {
146
+ createdAt: '2026-01-01T00:01:00.000Z',
147
+ data: {
148
+ inTxs: [{ txHash: providerTransactionHash }],
149
+ outTxs: [],
150
+ },
151
+ depositAddress: { depositTxHash: sourceTransactionHash },
152
+ id: 'relay-child-request',
153
+ status: 'success',
154
+ updatedAt: '2026-01-01T00:02:00.000Z',
155
+ },
156
+ ]
61
157
  response.writeHead(200, { 'content-type': 'application/json' })
62
158
  response.end(
63
159
  JSON.stringify({
64
- requests: [
65
- {
66
- createdAt: '2026-01-01T00:01:00.000Z',
67
- data: {
68
- inTxs: [{ txHash: providerTransactionHash }],
69
- outTxs: [],
70
- },
71
- depositAddress: { depositTxHash: sourceTransactionHash },
72
- id: 'relay-child-request',
73
- status: 'success',
74
- updatedAt: '2026-01-01T00:02:00.000Z',
75
- },
76
- ],
160
+ requests: requestId
161
+ ? requests.filter((candidate) => candidate.id === requestId)
162
+ : requests,
77
163
  }),
78
164
  )
79
165
  return
@@ -93,7 +179,7 @@ describe('createTracker', () => {
93
179
  : {
94
180
  blockNumber: '0x80',
95
181
  logs: [
96
- hash === sourceTransactionHash
182
+ hash === sourceTransactionHash || hash === newerSourceTransactionHash
97
183
  ? transferLog({
98
184
  amount: 1_000_000n,
99
185
  recipient: depositAddress,
@@ -114,7 +200,7 @@ describe('createTracker', () => {
114
200
  })
115
201
 
116
202
  try {
117
- await FundingCatalog.publish(db, {
203
+ await RoutesCatalog.publish(db, {
118
204
  chainTokens: [],
119
205
  chains: [
120
206
  {
@@ -138,6 +224,7 @@ describe('createTracker', () => {
138
224
  tokens: [],
139
225
  })
140
226
  const messages: Provider.Webhook.receive.Dispatchable[] = []
227
+ const intervals: Observability.LifecycleInterval[] = []
141
228
  const provider = Relay.relay({ apiKey: 'relay-api-key', baseUrl: server.url })
142
229
  const tracker = Reconciliation.createTracker({
143
230
  db,
@@ -147,6 +234,9 @@ describe('createTracker', () => {
147
234
  metrics,
148
235
  now: () => new Date('2027-01-01T00:00:00.000Z'),
149
236
  providers: [provider],
237
+ recordLifecycleInterval: async (interval) => {
238
+ intervals.push(interval)
239
+ },
150
240
  verifyTransfers: Evidence.createVerifier({
151
241
  db,
152
242
  }),
@@ -161,21 +251,34 @@ describe('createTracker', () => {
161
251
  type: message.type,
162
252
  }
163
253
  const reconciliation = await tracker.reconcile(queuedBeforeAttribution)
254
+ expect(intervals).toEqual([
255
+ {
256
+ endedAt: '2026-01-01T00:01:00.000Z',
257
+ routesEnvironment: 'production',
258
+ method: 'deposit_address',
259
+ provider: 'relay',
260
+ resourceId: address.id,
261
+ stage: 'source_routes',
262
+ startedAt: '2026-01-01T00:00:00.000Z',
263
+ },
264
+ ])
164
265
  const duplicate = await tracker.reconcile(queuedBeforeAttribution)
165
- const [record] = await FundingDeposits.listBySourceTransaction(db, {
266
+ expect(intervals).toHaveLength(1)
267
+ const [record] = await RoutesDeposits.listBySourceTransaction(db, {
166
268
  depositAddressId: address.id,
167
269
  sourceTransactionHash,
168
270
  })
169
- const observation = await FundingDepositRequestObservations.get(db, {
271
+ const observation = await RoutesDepositRequestObservations.get(db, {
170
272
  depositAddressId: address.id,
171
273
  providerRequestId: 'relay-child-request',
172
274
  })
173
- const storedAddress = await FundingDepositAddresses.get(db, address.id)
275
+ const storedAddress = await RoutesDepositAddresses.get(db, address.id)
174
276
 
175
277
  expect({
176
- counts,
278
+ counts: counts.filter(([name]) => name !== 'routes_provider_operation_count'),
177
279
  duplicate,
178
280
  observation,
281
+ providerOperations: providerOperationCounts(counts),
179
282
  reconciliation,
180
283
  record,
181
284
  storedAddress,
@@ -187,6 +290,7 @@ describe('createTracker', () => {
187
290
  depositAddressId: expect.any(String),
188
291
  id: expect.any(String),
189
292
  snapshot: { depositAddressId: expect.any(String) },
293
+ statusUpdatedAt: expect.any(String),
190
294
  updatedAt: expect.any(String),
191
295
  },
192
296
  observation: { depositAddressId: expect.any(String) },
@@ -194,13 +298,14 @@ describe('createTracker', () => {
194
298
  id: expect.any(String),
195
299
  providerOutputToken: expect.any(Object),
196
300
  snapshot: expect.any(Object),
301
+ statusUpdatedAt: expect.any(String),
197
302
  },
198
303
  },
199
304
  `
200
305
  {
201
306
  "counts": [
202
307
  [
203
- "funding_deposit_reconciliation_count",
308
+ "routes_deposit_reconciliation_count",
204
309
  1,
205
310
  {
206
311
  "outcome": "enqueued",
@@ -209,15 +314,67 @@ describe('createTracker', () => {
209
314
  },
210
315
  ],
211
316
  [
212
- "funding_deposit_detection_count",
317
+ "routes_resource_transition_count",
318
+ 1,
319
+ {
320
+ "from_status": "none",
321
+ "method": "deposit_address",
322
+ "provider": "relay",
323
+ "reason": "none",
324
+ "resource": "deposit",
325
+ "routes_environment": "production",
326
+ "to_status": "detected",
327
+ },
328
+ ],
329
+ [
330
+ "routes_resource_transition_count",
331
+ 1,
332
+ {
333
+ "from_status": "detected",
334
+ "method": "deposit_address",
335
+ "provider": "relay",
336
+ "reason": "none",
337
+ "resource": "deposit",
338
+ "routes_environment": "production",
339
+ "to_status": "bridging",
340
+ },
341
+ ],
342
+ [
343
+ "routes_resource_transition_count",
344
+ 1,
345
+ {
346
+ "from_status": "none",
347
+ "method": "deposit_address",
348
+ "provider": "relay",
349
+ "reason": "none",
350
+ "resource": "deposit",
351
+ "routes_environment": "production",
352
+ "to_status": "detected",
353
+ },
354
+ ],
355
+ [
356
+ "routes_resource_transition_count",
213
357
  1,
358
+ {
359
+ "from_status": "detected",
360
+ "method": "deposit_address",
361
+ "provider": "relay",
362
+ "reason": "none",
363
+ "resource": "deposit",
364
+ "routes_environment": "production",
365
+ "to_status": "bridging",
366
+ },
367
+ ],
368
+ [
369
+ "routes_deposit_detection_count",
370
+ 2,
214
371
  {
215
372
  "provider": "relay",
216
373
  "trigger": "poll",
217
374
  },
218
375
  ],
219
376
  [
220
- "funding_deposit_reconciliation_count",
377
+ "routes_deposit_reconciliation_count",
221
378
  1,
222
379
  {
223
380
  "outcome": "follow_up_enqueued",
@@ -226,7 +383,7 @@ describe('createTracker', () => {
226
383
  },
227
384
  ],
228
385
  [
229
- "funding_deposit_reconciliation_count",
386
+ "routes_deposit_reconciliation_count",
230
387
  1,
231
388
  {
232
389
  "outcome": "completed",
@@ -244,10 +401,13 @@ describe('createTracker', () => {
244
401
  "providerRequestId": "relay-child-request",
245
402
  "webhookReceivedAt": null,
246
403
  },
404
+ "providerOperations": {
405
+ "relay:listDepositAddressRequests:success": 1,
406
+ },
247
407
  "reconciliation": {
248
- "created": 1,
408
+ "created": 2,
249
409
  "type": "completed",
250
- "updated": 1,
410
+ "updated": 2,
251
411
  },
252
412
  "record": {
253
413
  "createdAt": Any<String>,
@@ -258,6 +418,7 @@ describe('createTracker', () => {
258
418
  "orgId": "org_reconciliation",
259
419
  "pollObservedAt": "2027-01-01T00:00:00.000Z",
260
420
  "projectId": null,
421
+ "providerDeliveredAt": null,
261
422
  "providerOutputAmount": null,
262
423
  "providerOutputToken": {
263
424
  "address": "0x20c000000000000000000000b9537d11c60e8b50",
@@ -274,6 +435,7 @@ describe('createTracker', () => {
274
435
  "relay-child-request",
275
436
  ],
276
437
  "providerState": null,
438
+ "providerSubsidy": null,
277
439
  "providerTransactionHashes": [],
278
440
  "providerTransferIndex": 0,
279
441
  "retryState": null,
@@ -336,7 +498,9 @@ describe('createTracker', () => {
336
498
  "sourceTransferIndex": 0,
337
499
  "status": "bridging",
338
500
  "statusReason": null,
501
+ "statusUpdatedAt": Any<String>,
339
502
  "subsidyAmount": null,
503
+ "subsidyMeterReportedAt": null,
340
504
  "tempoGasPaid": null,
341
505
  "updatedAt": Any<String>,
342
506
  "version": 3,
@@ -344,8 +508,8 @@ describe('createTracker', () => {
344
508
  },
345
509
  "storedAddress": {
346
510
  "address": "0x4444444444444444444444444444444444444444",
347
- "apiKeyId": "key_reconciliation",
348
511
  "createdAt": "2026-01-01T00:00:00.000Z",
512
+ "creatorUserId": null,
349
513
  "deliveryStrategy": "provider",
350
514
  "destinationTokenKey": "eip155:4217/erc20:0x20c000000000000000000000b9537d11c60e8b50",
351
515
  "environment": "production",
@@ -363,12 +527,13 @@ describe('createTracker', () => {
363
527
  "providerState": {
364
528
  "reconciliation": {
365
529
  "pendingRequestIds": [
530
+ "relay-newer-request",
366
531
  "relay-child-request",
367
532
  ],
368
533
  "requestIds": [
369
- "relay-child-request",
534
+ "relay-newer-request",
370
535
  ],
371
- "updatedAt": "2026-01-01T00:02:00.000Z",
536
+ "updatedAt": "2026-01-01T00:03:00.000Z",
372
537
  },
373
538
  },
374
539
  "recipient": "0x1111111111111111111111111111111111111111",
@@ -377,6 +542,7 @@ describe('createTracker', () => {
377
542
  "sourceChainId": "eip155:8453",
378
543
  "sourceTokenKey": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
379
544
  "status": "active",
545
+ "statusUpdatedAt": Any<String>,
380
546
  "subsidize": false,
381
547
  "updatedAt": "2026-01-01T00:00:00.000Z",
382
548
  "version": 1,
@@ -394,12 +560,11 @@ describe('createTracker', () => {
394
560
  })
395
561
 
396
562
  test('completes an unsubsidized deposit at its verified provider output', async () => {
397
- const route = TestFunding.transferSnapshot()
563
+ const route = TestRoutes.transferSnapshot()
398
564
  const depositAddress = `0x${'45'.repeat(20)}`
399
565
  const destinationTransactionHash = `0x${'cd'.repeat(32)}`
400
566
  const sourceTransactionHash = `0x${'ab'.repeat(32)}`
401
567
  const address = await DepositAddress.create(db, {
402
- apiKeyId: 'key_unsubsidized_reconciliation',
403
568
  deliveryStrategy: 'provider',
404
569
  environment: 'production',
405
570
  now: new Date('2026-01-06T00:00:00.000Z'),
@@ -446,7 +611,7 @@ describe('createTracker', () => {
446
611
  })
447
612
 
448
613
  try {
449
- await FundingCatalog.publish(db, {
614
+ await RoutesCatalog.publish(db, {
450
615
  chainTokens: [],
451
616
  chains: [
452
617
  {
@@ -483,7 +648,7 @@ describe('createTracker', () => {
483
648
  trigger: 'manual',
484
649
  verifyTransfers: Evidence.createVerifier({ db }),
485
650
  })
486
- const [record] = await FundingDeposits.listBySourceTransaction(db, {
651
+ const [record] = await RoutesDeposits.listBySourceTransaction(db, {
487
652
  depositAddressId: address.id,
488
653
  sourceTransactionHash,
489
654
  })
@@ -494,7 +659,9 @@ describe('createTracker', () => {
494
659
  createdAt: expect.any(String),
495
660
  depositAddressId: expect.any(String),
496
661
  id: expect.any(String),
662
+ providerDeliveredAt: expect.any(String),
497
663
  snapshot: { depositAddressId: expect.any(String) },
664
+ statusUpdatedAt: expect.any(String),
498
665
  updatedAt: expect.any(String),
499
666
  },
500
667
  },
@@ -509,6 +676,7 @@ describe('createTracker', () => {
509
676
  "orgId": "org_unsubsidized_reconciliation",
510
677
  "pollObservedAt": null,
511
678
  "projectId": null,
679
+ "providerDeliveredAt": Any<String>,
512
680
  "providerOutputAmount": {
513
681
  "baseUnits": "950000",
514
682
  "currency": "USD",
@@ -530,6 +698,7 @@ describe('createTracker', () => {
530
698
  "unsubsidized-request",
531
699
  ],
532
700
  "providerState": null,
701
+ "providerSubsidy": null,
533
702
  "providerTransactionHashes": [
534
703
  "0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd",
535
704
  ],
@@ -608,7 +777,9 @@ describe('createTracker', () => {
608
777
  "sourceTransferIndex": 0,
609
778
  "status": "completed",
610
779
  "statusReason": null,
780
+ "statusUpdatedAt": Any<String>,
611
781
  "subsidyAmount": null,
782
+ "subsidyMeterReportedAt": null,
612
783
  "tempoGasPaid": null,
613
784
  "updatedAt": Any<String>,
614
785
  "version": 3,
@@ -627,8 +798,290 @@ describe('createTracker', () => {
627
798
  }
628
799
  })
629
800
 
801
+ test('applies live subsidy policy and billing to new top-ups', async () => {
802
+ const route = TestRoutes.transferSnapshot()
803
+ const scenarios = [
804
+ {
805
+ billing: 'missing',
806
+ delivered: 950_000n,
807
+ maxAmount: null,
808
+ name: 'policy disabled',
809
+ },
810
+ {
811
+ billing: 'missing',
812
+ delivered: 950_000n,
813
+ maxAmount: '1',
814
+ name: 'billing required',
815
+ },
816
+ {
817
+ billing: 'past_due',
818
+ delivered: 950_000n,
819
+ maxAmount: '1',
820
+ name: 'billing past due',
821
+ },
822
+ {
823
+ billing: 'active',
824
+ delivered: 950_000n,
825
+ maxAmount: '0.049999',
826
+ name: 'limit exceeded',
827
+ },
828
+ {
829
+ billing: 'missing',
830
+ delivered: 1_000_000n,
831
+ maxAmount: null,
832
+ name: 'provider delivered in full',
833
+ },
834
+ ] as const
835
+ const sourceTransactionHashes = new Set(
836
+ scenarios.map((_, index) => `0x${(index + 81).toString(16).repeat(32)}`),
837
+ )
838
+ const sourceRecipients = new Map<string, string>()
839
+ const destinationAmounts = new Map(
840
+ scenarios.map((scenario, index) => [
841
+ `0x${(index + 97).toString(16).repeat(32)}`,
842
+ scenario.delivered,
843
+ ]),
844
+ )
845
+ const server = await TestRelay.createServer(async (request, response) => {
846
+ const chunks: Uint8Array[] = []
847
+ for await (const chunk of request) chunks.push(chunk)
848
+ const body = JSON.parse(NodeBuffer.Buffer.concat(chunks).toString()) as {
849
+ id: number
850
+ method: string
851
+ params?: readonly string[] | undefined
852
+ }
853
+ const hash = body.params?.[0]
854
+ const source = hash !== undefined && sourceTransactionHashes.has(hash)
855
+ const amount = source ? 1_000_000n : destinationAmounts.get(hash ?? '')
856
+ const result =
857
+ body.method === 'eth_blockNumber'
858
+ ? '0x100'
859
+ : {
860
+ blockNumber: '0x80',
861
+ logs: [
862
+ transferLog({
863
+ amount: amount ?? 0n,
864
+ recipient: source ? (sourceRecipients.get(hash ?? '') ?? '') : route.recipient,
865
+ sender: `0x${'71'.repeat(20)}`,
866
+ token: source ? route.sourceToken.address : route.destinationToken.address,
867
+ }),
868
+ ],
869
+ status: '0x1',
870
+ }
871
+ response.writeHead(200, { 'content-type': 'application/json' })
872
+ response.end(JSON.stringify({ id: body.id, jsonrpc: '2.0', result }))
873
+ })
874
+
875
+ try {
876
+ await RoutesCatalog.publish(db, {
877
+ chainTokens: [],
878
+ chains: [
879
+ {
880
+ aliases: [],
881
+ id: route.destinationChain.id as Chain.Id,
882
+ name: route.destinationChain.name,
883
+ parentChainId: null,
884
+ rpcUrls: [server.url],
885
+ slug: 'destination-subsidy-policy',
886
+ },
887
+ {
888
+ aliases: [],
889
+ id: route.sourceChain.id as Chain.Id,
890
+ name: route.sourceChain.name,
891
+ parentChainId: null,
892
+ rpcUrls: [server.url],
893
+ slug: 'source-subsidy-policy',
894
+ },
895
+ ],
896
+ routes: [],
897
+ tokens: [],
898
+ })
899
+ const counts: Parameters<Metrics.Metrics['count']>[] = []
900
+ const metrics = Metrics.from({
901
+ count(...parameters) {
902
+ counts.push(parameters)
903
+ },
904
+ flush() {},
905
+ gauge() {},
906
+ histogram() {},
907
+ })
908
+ const records = []
909
+ for (const [index, scenario] of scenarios.entries()) {
910
+ const orgId = `org_subsidy_policy_${index}`
911
+ await Organizations.create(db, { id: orgId, name: scenario.name })
912
+ if (scenario.maxAmount !== null)
913
+ await RoutesSubsidies.upsertOrganization(db, {
914
+ frequency: 'tx',
915
+ maxAmount: scenario.maxAmount,
916
+ orgId,
917
+ })
918
+ if (scenario.billing !== 'missing') {
919
+ await StripeCustomers.create(db, {
920
+ orgId,
921
+ stripeCustomerId: `cus_subsidy_policy_${index}`,
922
+ })
923
+ await StripeCustomers.setStatus(db, orgId, scenario.billing)
924
+ }
925
+ const depositAddress = `0x${(index + 113).toString(16).repeat(20)}`
926
+ const address = await DepositAddress.create(db, {
927
+ deliveryStrategy: 'provider',
928
+ environment: 'production',
929
+ orgId,
930
+ providerOutputToken: route.destinationToken,
931
+ snapshot: {
932
+ address: depositAddress,
933
+ destinationChain: route.destinationChain,
934
+ destinationToken: route.destinationToken,
935
+ provider: { id: 'local', name: 'Local' },
936
+ recipient: route.recipient,
937
+ refundAddress: `0x${(index + 121).toString(16).repeat(20)}`,
938
+ sourceChain: route.sourceChain,
939
+ sourceToken: route.sourceToken,
940
+ subsidize: true,
941
+ },
942
+ })
943
+ const sourceTransactionHash = [...sourceTransactionHashes][index]!
944
+ sourceRecipients.set(sourceTransactionHash, depositAddress)
945
+ const destinationTransactionHash = [...destinationAmounts.keys()][index]!
946
+ const result = await Reconciliation.reconcileRequest(db, {
947
+ address,
948
+ metrics,
949
+ request: {
950
+ createdAt: '2026-01-06T00:01:00.000Z',
951
+ destinationTransactionHashes: [destinationTransactionHash],
952
+ id: `subsidy-policy-request-${index}`,
953
+ refundTransactionHashes: [],
954
+ sourceTransactionHashes: [sourceTransactionHash],
955
+ ...(scenario.name === 'provider delivered in full'
956
+ ? {
957
+ subsidy: {
958
+ amount: {
959
+ baseUnits: '23838',
960
+ currency: 'USD',
961
+ decimals: 6,
962
+ formatted: '0.023838',
963
+ },
964
+ provider: 'relay',
965
+ token: route.sourceToken,
966
+ },
967
+ }
968
+ : {}),
969
+ status: 'success',
970
+ updatedAt: '2026-01-06T00:02:00.000Z',
971
+ },
972
+ trigger: 'manual',
973
+ verifyTransfers: Evidence.createVerifier({ db }),
974
+ })
975
+ const [record] = await RoutesDeposits.listBySourceTransaction(db, {
976
+ depositAddressId: address.id,
977
+ sourceTransactionHash,
978
+ })
979
+ records.push({
980
+ name: scenario.name,
981
+ status: record?.status,
982
+ statusReason: record?.statusReason,
983
+ subsidies: record ? RoutesDeposits.subsidies(record) : [],
984
+ subsidyAmount: record?.subsidyAmount?.baseUnits ?? null,
985
+ terminal: result.terminal,
986
+ })
987
+ }
988
+
989
+ expect({
990
+ outcomes: counts
991
+ .filter(([name]) => name === 'routes_deposit_subsidy_count')
992
+ .map(([, , tags]) => tags?.['outcome']),
993
+ records,
994
+ }).toMatchInlineSnapshot(`
995
+ {
996
+ "outcomes": [
997
+ "routes_subsidy_not_enabled",
998
+ "billing_required",
999
+ "billing_past_due",
1000
+ "routes_subsidy_limit_exceeded",
1001
+ ],
1002
+ "records": [
1003
+ {
1004
+ "name": "policy disabled",
1005
+ "status": "action-required",
1006
+ "statusReason": {
1007
+ "code": "routes_subsidy_not_enabled",
1008
+ "message": "Routes subsidies are not enabled for this organization.",
1009
+ },
1010
+ "subsidies": [],
1011
+ "subsidyAmount": null,
1012
+ "terminal": false,
1013
+ },
1014
+ {
1015
+ "name": "billing required",
1016
+ "status": "action-required",
1017
+ "statusReason": {
1018
+ "code": "billing_required",
1019
+ "message": "Billing required.",
1020
+ },
1021
+ "subsidies": [],
1022
+ "subsidyAmount": null,
1023
+ "terminal": false,
1024
+ },
1025
+ {
1026
+ "name": "billing past due",
1027
+ "status": "action-required",
1028
+ "statusReason": {
1029
+ "code": "billing_past_due",
1030
+ "message": "Billing past due.",
1031
+ },
1032
+ "subsidies": [],
1033
+ "subsidyAmount": null,
1034
+ "terminal": false,
1035
+ },
1036
+ {
1037
+ "name": "limit exceeded",
1038
+ "status": "action-required",
1039
+ "statusReason": {
1040
+ "code": "routes_subsidy_limit_exceeded",
1041
+ "message": "The required subsidy exceeds the per-transaction limit.",
1042
+ },
1043
+ "subsidies": [],
1044
+ "subsidyAmount": null,
1045
+ "terminal": false,
1046
+ },
1047
+ {
1048
+ "name": "provider delivered in full",
1049
+ "status": "completed",
1050
+ "statusReason": null,
1051
+ "subsidies": [
1052
+ {
1053
+ "amount": {
1054
+ "baseUnits": "23838",
1055
+ "currency": "USD",
1056
+ "decimals": 6,
1057
+ "formatted": "0.023838",
1058
+ },
1059
+ "provider": "relay",
1060
+ "token": {
1061
+ "address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
1062
+ "currency": "USD",
1063
+ "decimals": 6,
1064
+ "name": "USD Coin",
1065
+ "standard": "ERC-20",
1066
+ "symbol": "USDC",
1067
+ "tokenKey": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
1068
+ "verified": true,
1069
+ },
1070
+ },
1071
+ ],
1072
+ "subsidyAmount": null,
1073
+ "terminal": true,
1074
+ },
1075
+ ],
1076
+ }
1077
+ `)
1078
+ } finally {
1079
+ await server.closeAsync()
1080
+ }
1081
+ })
1082
+
630
1083
  test('verifies Relay refunds on the source chain before completing recovery', async () => {
631
- const route = TestFunding.transferSnapshot()
1084
+ const route = TestRoutes.transferSnapshot()
632
1085
  const depositAddress = `0x${'48'.repeat(20)}`
633
1086
  const firstRefundTransactionHash = `0x${'ce'.repeat(32)}`
634
1087
  const refundAddress = `0x${'49'.repeat(20)}`
@@ -636,7 +1089,6 @@ describe('createTracker', () => {
636
1089
  const settlementTransactionHash = `0x${'cf'.repeat(32)}`
637
1090
  const sourceTransactionHash = `0x${'ac'.repeat(32)}`
638
1091
  const address = await DepositAddress.create(db, {
639
- apiKeyId: 'key_refund_reconciliation',
640
1092
  deliveryStrategy: 'provider',
641
1093
  environment: 'production',
642
1094
  now: new Date('2026-01-07T00:00:00.000Z'),
@@ -738,7 +1190,7 @@ describe('createTracker', () => {
738
1190
  })
739
1191
 
740
1192
  try {
741
- await FundingCatalog.publish(db, {
1193
+ await RoutesCatalog.publish(db, {
742
1194
  chainTokens: [],
743
1195
  chains: [
744
1196
  {
@@ -778,7 +1230,7 @@ describe('createTracker', () => {
778
1230
  request,
779
1231
  verifyTransfers,
780
1232
  })
781
- const [firstRecord] = await FundingDeposits.listBySourceTransaction(db, {
1233
+ const [firstRecord] = await RoutesDeposits.listBySourceTransaction(db, {
782
1234
  depositAddressId: address.id,
783
1235
  sourceTransactionHash,
784
1236
  })
@@ -797,13 +1249,13 @@ describe('createTracker', () => {
797
1249
  request,
798
1250
  verifyTransfers,
799
1251
  })
800
- const [record] = await FundingDeposits.listBySourceTransaction(db, {
1252
+ const [record] = await RoutesDeposits.listBySourceTransaction(db, {
801
1253
  depositAddressId: address.id,
802
1254
  sourceTransactionHash,
803
1255
  })
804
- if (!firstRecord || !record) throw new Error('Expected reconciled funding deposits.')
1256
+ if (!firstRecord || !record) throw new Error('Expected reconciled route deposits.')
805
1257
 
806
- expect(depositUpdateVersions).toEqual([2, firstRecord.version, 4, record.version])
1258
+ expect(depositUpdateVersions).toEqual([2, 3, 4])
807
1259
 
808
1260
  expect({
809
1261
  counts,
@@ -820,6 +1272,7 @@ describe('createTracker', () => {
820
1272
  depositAddressId: expect.any(String),
821
1273
  id: expect.any(String),
822
1274
  snapshot: { depositAddressId: expect.any(String) },
1275
+ statusUpdatedAt: expect.any(String),
823
1276
  updatedAt: expect.any(String),
824
1277
  },
825
1278
  record: {
@@ -827,6 +1280,7 @@ describe('createTracker', () => {
827
1280
  depositAddressId: expect.any(String),
828
1281
  id: expect.any(String),
829
1282
  snapshot: { depositAddressId: expect.any(String) },
1283
+ statusUpdatedAt: expect.any(String),
830
1284
  updatedAt: expect.any(String),
831
1285
  },
832
1286
  },
@@ -834,7 +1288,46 @@ describe('createTracker', () => {
834
1288
  {
835
1289
  "counts": [
836
1290
  [
837
- "funding_deposit_refund_count",
1291
+ "routes_resource_transition_count",
1292
+ 1,
1293
+ {
1294
+ "from_status": "none",
1295
+ "method": "deposit_address",
1296
+ "provider": "relay",
1297
+ "reason": "none",
1298
+ "resource": "deposit",
1299
+ "routes_environment": "production",
1300
+ "to_status": "detected",
1301
+ },
1302
+ ],
1303
+ [
1304
+ "routes_resource_transition_count",
1305
+ 1,
1306
+ {
1307
+ "from_status": "detected",
1308
+ "method": "deposit_address",
1309
+ "provider": "relay",
1310
+ "reason": "none",
1311
+ "resource": "deposit",
1312
+ "routes_environment": "production",
1313
+ "to_status": "bridging",
1314
+ },
1315
+ ],
1316
+ [
1317
+ "routes_resource_transition_count",
1318
+ 1,
1319
+ {
1320
+ "from_status": "bridging",
1321
+ "method": "deposit_address",
1322
+ "provider": "relay",
1323
+ "reason": "none",
1324
+ "resource": "deposit",
1325
+ "routes_environment": "production",
1326
+ "to_status": "refunding",
1327
+ },
1328
+ ],
1329
+ [
1330
+ "routes_deposit_refund_count",
838
1331
  1,
839
1332
  {
840
1333
  "outcome": "pending",
@@ -842,7 +1335,20 @@ describe('createTracker', () => {
842
1335
  },
843
1336
  ],
844
1337
  [
845
- "funding_deposit_refund_count",
1338
+ "routes_resource_transition_count",
1339
+ 1,
1340
+ {
1341
+ "from_status": "refunding",
1342
+ "method": "deposit_address",
1343
+ "provider": "relay",
1344
+ "reason": "none",
1345
+ "resource": "deposit",
1346
+ "routes_environment": "production",
1347
+ "to_status": "refunded",
1348
+ },
1349
+ ],
1350
+ [
1351
+ "routes_deposit_refund_count",
846
1352
  1,
847
1353
  {
848
1354
  "outcome": "verified",
@@ -870,6 +1376,7 @@ describe('createTracker', () => {
870
1376
  "orgId": "org_refund_reconciliation",
871
1377
  "pollObservedAt": null,
872
1378
  "projectId": null,
1379
+ "providerDeliveredAt": null,
873
1380
  "providerOutputAmount": null,
874
1381
  "providerOutputToken": {
875
1382
  "address": "0x20c000000000000000000000b9537d11c60e8b50",
@@ -886,6 +1393,7 @@ describe('createTracker', () => {
886
1393
  "relay-refund-request",
887
1394
  ],
888
1395
  "providerState": null,
1396
+ "providerSubsidy": null,
889
1397
  "providerTransactionHashes": [
890
1398
  "0xcececececececececececececececececececececececececececececececece",
891
1399
  "0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd",
@@ -951,7 +1459,9 @@ describe('createTracker', () => {
951
1459
  "sourceTransferIndex": 0,
952
1460
  "status": "refunding",
953
1461
  "statusReason": null,
1462
+ "statusUpdatedAt": Any<String>,
954
1463
  "subsidyAmount": null,
1464
+ "subsidyMeterReportedAt": null,
955
1465
  "tempoGasPaid": null,
956
1466
  "updatedAt": Any<String>,
957
1467
  "version": 3,
@@ -966,6 +1476,7 @@ describe('createTracker', () => {
966
1476
  "orgId": "org_refund_reconciliation",
967
1477
  "pollObservedAt": null,
968
1478
  "projectId": null,
1479
+ "providerDeliveredAt": null,
969
1480
  "providerOutputAmount": null,
970
1481
  "providerOutputToken": {
971
1482
  "address": "0x20c000000000000000000000b9537d11c60e8b50",
@@ -982,6 +1493,7 @@ describe('createTracker', () => {
982
1493
  "relay-refund-request",
983
1494
  ],
984
1495
  "providerState": null,
1496
+ "providerSubsidy": null,
985
1497
  "providerTransactionHashes": [
986
1498
  "0xcececececececececececececececececececececececececececececececece",
987
1499
  "0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd",
@@ -1057,10 +1569,12 @@ describe('createTracker', () => {
1057
1569
  "sourceTransferIndex": 0,
1058
1570
  "status": "refunded",
1059
1571
  "statusReason": null,
1572
+ "statusUpdatedAt": Any<String>,
1060
1573
  "subsidyAmount": null,
1574
+ "subsidyMeterReportedAt": null,
1061
1575
  "tempoGasPaid": null,
1062
1576
  "updatedAt": Any<String>,
1063
- "version": 5,
1577
+ "version": 4,
1064
1578
  "webhookReceivedAt": null,
1065
1579
  },
1066
1580
  "request": {
@@ -1094,13 +1608,12 @@ describe('createTracker', () => {
1094
1608
  })
1095
1609
 
1096
1610
  test('preserves refund allocations when retrying a partially committed request', async () => {
1097
- const route = TestFunding.transferSnapshot()
1611
+ const route = TestRoutes.transferSnapshot()
1098
1612
  const depositAddress = `0x${'50'.repeat(20)}`
1099
1613
  const refundAddress = `0x${'51'.repeat(20)}`
1100
1614
  const refundTransactionHash = `0x${'d0'.repeat(32)}`
1101
1615
  const sourceTransactionHash = `0x${'b0'.repeat(32)}`
1102
1616
  const address = await DepositAddress.create(db, {
1103
- apiKeyId: 'key_refund_retry',
1104
1617
  deliveryStrategy: 'provider',
1105
1618
  environment: 'production',
1106
1619
  now: new Date('2026-01-09T00:00:00.000Z'),
@@ -1119,7 +1632,7 @@ describe('createTracker', () => {
1119
1632
  },
1120
1633
  })
1121
1634
  const first = await Deposit.create(db, {
1122
- id: 'fdp_refund_retry_0',
1635
+ id: 'rdp_refund_retry_0',
1123
1636
  now: new Date('2026-01-09T00:01:00.000Z'),
1124
1637
  providerRequestId: 'relay-refund-retry-request',
1125
1638
  providerTransferIndex: 0,
@@ -1144,7 +1657,7 @@ describe('createTracker', () => {
1144
1657
  sourceTransferIndex: 0,
1145
1658
  })
1146
1659
  await Deposit.create(db, {
1147
- id: 'fdp_refund_retry_1',
1660
+ id: 'rdp_refund_retry_1',
1148
1661
  now: new Date('2026-01-09T00:01:01.000Z'),
1149
1662
  providerRequestId: 'relay-refund-retry-request',
1150
1663
  providerTransferIndex: 1,
@@ -1242,7 +1755,7 @@ describe('createTracker', () => {
1242
1755
  })
1243
1756
 
1244
1757
  try {
1245
- await FundingCatalog.publish(db, {
1758
+ await RoutesCatalog.publish(db, {
1246
1759
  chainTokens: [],
1247
1760
  chains: [
1248
1761
  {
@@ -1279,7 +1792,7 @@ describe('createTracker', () => {
1279
1792
  verifyTransfers: Evidence.createVerifier({ db }),
1280
1793
  })
1281
1794
  const records = (
1282
- await FundingDeposits.listBySourceTransaction(db, {
1795
+ await RoutesDeposits.listBySourceTransaction(db, {
1283
1796
  depositAddressId: address.id,
1284
1797
  sourceTransactionHash,
1285
1798
  })
@@ -1314,7 +1827,7 @@ describe('createTracker', () => {
1314
1827
  "tokenKey": "eip155:4217/erc20:0x20c000000000000000000000b9537d11c60e8b50",
1315
1828
  "verified": true,
1316
1829
  },
1317
- "id": "fdp_refund_retry_0",
1830
+ "id": "rdp_refund_retry_0",
1318
1831
  "provider": {
1319
1832
  "id": "relay",
1320
1833
  "name": "Relay",
@@ -1378,7 +1891,7 @@ describe('createTracker', () => {
1378
1891
  "tokenKey": "eip155:4217/erc20:0x20c000000000000000000000b9537d11c60e8b50",
1379
1892
  "verified": true,
1380
1893
  },
1381
- "id": "fdp_refund_retry_1",
1894
+ "id": "rdp_refund_retry_1",
1382
1895
  "provider": {
1383
1896
  "id": "relay",
1384
1897
  "name": "Relay",
@@ -1439,12 +1952,11 @@ describe('createTracker', () => {
1439
1952
  })
1440
1953
 
1441
1954
  test('reconciles destination evidence reported with a Relay failure', async () => {
1442
- const route = TestFunding.transferSnapshot()
1955
+ const route = TestRoutes.transferSnapshot()
1443
1956
  const depositAddress = `0x${'56'.repeat(20)}`
1444
1957
  const destinationTransactionHash = `0x${'d1'.repeat(32)}`
1445
1958
  const sourceTransactionHash = `0x${'b1'.repeat(32)}`
1446
1959
  const address = await DepositAddress.create(db, {
1447
- apiKeyId: 'key_failure_delivery',
1448
1960
  deliveryStrategy: 'provider',
1449
1961
  environment: 'production',
1450
1962
  now: new Date('2026-01-10T00:00:00.000Z'),
@@ -1504,7 +2016,7 @@ describe('createTracker', () => {
1504
2016
  })
1505
2017
 
1506
2018
  try {
1507
- await FundingCatalog.publish(db, {
2019
+ await RoutesCatalog.publish(db, {
1508
2020
  chainTokens: [],
1509
2021
  chains: [
1510
2022
  {
@@ -1540,7 +2052,7 @@ describe('createTracker', () => {
1540
2052
  },
1541
2053
  verifyTransfers: Evidence.createVerifier({ db }),
1542
2054
  })
1543
- const [record] = await FundingDeposits.listBySourceTransaction(db, {
2055
+ const [record] = await RoutesDeposits.listBySourceTransaction(db, {
1544
2056
  depositAddressId: address.id,
1545
2057
  sourceTransactionHash,
1546
2058
  })
@@ -1643,12 +2155,11 @@ describe('createTracker', () => {
1643
2155
  })
1644
2156
 
1645
2157
  test('keeps Relay failures with unverified destination transactions pending for recovery', async () => {
1646
- const route = TestFunding.transferSnapshot()
2158
+ const route = TestRoutes.transferSnapshot()
1647
2159
  const depositAddress = `0x${'4d'.repeat(20)}`
1648
2160
  const sourceTransactionHash = `0x${'ad'.repeat(32)}`
1649
2161
  const unrelatedDestinationTransactionHash = `0x${'d2'.repeat(32)}`
1650
2162
  const address = await DepositAddress.create(db, {
1651
- apiKeyId: 'key_failed_reconciliation',
1652
2163
  deliveryStrategy: 'provider',
1653
2164
  environment: 'production',
1654
2165
  now: new Date('2026-01-08T00:00:00.000Z'),
@@ -1702,7 +2213,7 @@ describe('createTracker', () => {
1702
2213
  })
1703
2214
 
1704
2215
  try {
1705
- await FundingCatalog.publish(db, {
2216
+ await RoutesCatalog.publish(db, {
1706
2217
  chainTokens: [],
1707
2218
  chains: [
1708
2219
  {
@@ -1739,7 +2250,7 @@ describe('createTracker', () => {
1739
2250
  },
1740
2251
  verifyTransfers: Evidence.createVerifier({ db }),
1741
2252
  })
1742
- const [record] = await FundingDeposits.listBySourceTransaction(db, {
2253
+ const [record] = await RoutesDeposits.listBySourceTransaction(db, {
1743
2254
  depositAddressId: address.id,
1744
2255
  sourceTransactionHash,
1745
2256
  })
@@ -1751,6 +2262,7 @@ describe('createTracker', () => {
1751
2262
  depositAddressId: expect.any(String),
1752
2263
  id: expect.any(String),
1753
2264
  snapshot: { depositAddressId: expect.any(String) },
2265
+ statusUpdatedAt: expect.any(String),
1754
2266
  updatedAt: expect.any(String),
1755
2267
  },
1756
2268
  },
@@ -1758,7 +2270,46 @@ describe('createTracker', () => {
1758
2270
  {
1759
2271
  "counts": [
1760
2272
  [
1761
- "funding_deposit_refund_count",
2273
+ "routes_resource_transition_count",
2274
+ 1,
2275
+ {
2276
+ "from_status": "none",
2277
+ "method": "deposit_address",
2278
+ "provider": "relay",
2279
+ "reason": "none",
2280
+ "resource": "deposit",
2281
+ "routes_environment": "production",
2282
+ "to_status": "detected",
2283
+ },
2284
+ ],
2285
+ [
2286
+ "routes_resource_transition_count",
2287
+ 1,
2288
+ {
2289
+ "from_status": "detected",
2290
+ "method": "deposit_address",
2291
+ "provider": "relay",
2292
+ "reason": "none",
2293
+ "resource": "deposit",
2294
+ "routes_environment": "production",
2295
+ "to_status": "bridging",
2296
+ },
2297
+ ],
2298
+ [
2299
+ "routes_resource_transition_count",
2300
+ 1,
2301
+ {
2302
+ "from_status": "bridging",
2303
+ "method": "deposit_address",
2304
+ "provider": "relay",
2305
+ "reason": "none",
2306
+ "resource": "deposit",
2307
+ "routes_environment": "production",
2308
+ "to_status": "refunding",
2309
+ },
2310
+ ],
2311
+ [
2312
+ "routes_deposit_refund_count",
1762
2313
  1,
1763
2314
  {
1764
2315
  "outcome": "provider_failed",
@@ -1775,6 +2326,7 @@ describe('createTracker', () => {
1775
2326
  "orgId": "org_failed_reconciliation",
1776
2327
  "pollObservedAt": null,
1777
2328
  "projectId": null,
2329
+ "providerDeliveredAt": null,
1778
2330
  "providerOutputAmount": null,
1779
2331
  "providerOutputToken": {
1780
2332
  "address": "0x20c000000000000000000000b9537d11c60e8b50",
@@ -1791,6 +2343,7 @@ describe('createTracker', () => {
1791
2343
  "relay-failed-request",
1792
2344
  ],
1793
2345
  "providerState": null,
2346
+ "providerSubsidy": null,
1794
2347
  "providerTransactionHashes": [],
1795
2348
  "providerTransferIndex": 0,
1796
2349
  "retryState": null,
@@ -1852,7 +2405,9 @@ describe('createTracker', () => {
1852
2405
  "sourceTransferIndex": 0,
1853
2406
  "status": "refunding",
1854
2407
  "statusReason": null,
2408
+ "statusUpdatedAt": Any<String>,
1855
2409
  "subsidyAmount": null,
2410
+ "subsidyMeterReportedAt": null,
1856
2411
  "tempoGasPaid": null,
1857
2412
  "updatedAt": Any<String>,
1858
2413
  "version": 3,
@@ -1873,11 +2428,10 @@ describe('createTracker', () => {
1873
2428
  })
1874
2429
 
1875
2430
  test('persists a detected deposit before source verification succeeds', async () => {
1876
- const route = TestFunding.transferSnapshot()
2431
+ const route = TestRoutes.transferSnapshot()
1877
2432
  const depositAddress = `0x${'20'.repeat(20)}`
1878
2433
  const sourceTransactionHash = `0x${'21'.repeat(32)}`
1879
2434
  const address = await DepositAddress.create(db, {
1880
- apiKeyId: 'key_observed_reconciliation',
1881
2435
  deliveryStrategy: 'provider',
1882
2436
  environment: 'production',
1883
2437
  now: new Date('2026-01-04T00:00:00.000Z'),
@@ -1928,7 +2482,7 @@ describe('createTracker', () => {
1928
2482
  })
1929
2483
 
1930
2484
  try {
1931
- await FundingCatalog.publish(db, {
2485
+ await RoutesCatalog.publish(db, {
1932
2486
  chainTokens: [],
1933
2487
  chains: [
1934
2488
  {
@@ -1968,14 +2522,14 @@ describe('createTracker', () => {
1968
2522
  await tracker
1969
2523
  .reconcile({
1970
2524
  addressId: address.id,
1971
- type: 'funding:deposit-address:reconcile',
2525
+ type: 'routes:deposit-address:reconcile',
1972
2526
  })
1973
2527
  .then(
1974
2528
  () => false,
1975
2529
  () => true,
1976
2530
  ),
1977
2531
  )
1978
- const records = await FundingDeposits.listByAddress(
2532
+ const records = await RoutesDeposits.listByAddress(
1979
2533
  db,
1980
2534
  { environment: 'production', orgId: 'org_observed_reconciliation' },
1981
2535
  address.id,
@@ -2061,12 +2615,11 @@ describe('createTracker', () => {
2061
2615
  })
2062
2616
 
2063
2617
  test('rechecks pending Relay requests by id until delivery is verified', async () => {
2064
- const route = TestFunding.transferSnapshot()
2618
+ const route = TestRoutes.transferSnapshot()
2065
2619
  const depositAddress = `0x${'88'.repeat(20)}`
2066
2620
  const sourceTransactionHash = `0x${'cc'.repeat(32)}`
2067
2621
  const destinationTransactionHash = `0x${'dd'.repeat(32)}`
2068
2622
  const address = await DepositAddress.create(db, {
2069
- apiKeyId: 'key_pending_reconciliation',
2070
2623
  deliveryStrategy: 'provider',
2071
2624
  environment: 'production',
2072
2625
  now: new Date('2026-01-02T00:00:00.000Z'),
@@ -2173,7 +2726,7 @@ describe('createTracker', () => {
2173
2726
  })
2174
2727
 
2175
2728
  try {
2176
- await FundingCatalog.publish(db, {
2729
+ await RoutesCatalog.publish(db, {
2177
2730
  chainTokens: [],
2178
2731
  chains: [
2179
2732
  {
@@ -2217,7 +2770,7 @@ describe('createTracker', () => {
2217
2770
  addressId: address.id,
2218
2771
  requestId: 'relay-pending-request',
2219
2772
  trigger: 'webhook',
2220
- type: 'funding:deposit-address:reconcile',
2773
+ type: 'routes:deposit-address:reconcile',
2221
2774
  webhookTiming: {
2222
2775
  enqueuedAt: '2026-01-02T00:03:07.000Z',
2223
2776
  providerStatus: 'pending',
@@ -2233,10 +2786,13 @@ describe('createTracker', () => {
2233
2786
  const [firstFollowUp] = dispatches
2234
2787
  if (!firstFollowUp) throw new Error('Expected a provider follow-up message.')
2235
2788
  indexed = true
2236
- const pendingFollowUp = await tracker.reconcile(firstFollowUp[0])
2789
+ const pendingFollowUp = await tracker.reconcile({
2790
+ ...firstFollowUp[0],
2791
+ followUp: { attempt: 6, kind: 'provider' },
2792
+ })
2237
2793
  const exhausted = await tracker.reconcile({
2238
2794
  ...firstFollowUp[0],
2239
- followUp: { attempt: 5, kind: 'provider' },
2795
+ followUp: { attempt: 23, kind: 'provider' },
2240
2796
  })
2241
2797
  const [, secondFollowUp] = dispatches
2242
2798
  if (!secondFollowUp) throw new Error('Expected a second provider follow-up message.')
@@ -2249,7 +2805,7 @@ describe('createTracker', () => {
2249
2805
  const replay = await tracker.reconcile({
2250
2806
  addressId: address.id,
2251
2807
  trigger: 'webhook',
2252
- type: 'funding:deposit-address:reconcile',
2808
+ type: 'routes:deposit-address:reconcile',
2253
2809
  })
2254
2810
  includeAddressRequest = false
2255
2811
  returnOlderDirect = true
@@ -2257,22 +2813,33 @@ describe('createTracker', () => {
2257
2813
  addressId: address.id,
2258
2814
  requestId: 'relay-pending-request',
2259
2815
  trigger: 'webhook',
2260
- type: 'funding:deposit-address:reconcile',
2816
+ type: 'routes:deposit-address:reconcile',
2261
2817
  })
2262
- const [record] = await FundingDeposits.listBySourceTransaction(db, {
2818
+ const [record] = await RoutesDeposits.listBySourceTransaction(db, {
2263
2819
  depositAddressId: address.id,
2264
2820
  sourceTransactionHash,
2265
2821
  })
2266
- const storedAddress = await FundingDepositAddresses.get(db, address.id)
2822
+ const storedAddress = await RoutesDepositAddresses.get(db, address.id)
2823
+ const lifecycleDurations = histograms
2824
+ .filter(([name]) => name === 'routes_lifecycle_duration_ms')
2825
+ .map(([, duration]) => duration)
2826
+ expect(lifecycleDurations.every((duration) => duration >= 0)).toBe(true)
2267
2827
 
2268
2828
  expect({
2269
2829
  completed,
2270
- counts,
2830
+ counts: counts.filter(([name]) => name !== 'routes_provider_operation_count'),
2271
2831
  dispatches,
2272
2832
  exhausted,
2273
- histograms,
2833
+ histograms: histograms
2834
+ .filter(([name]) => name !== 'routes_provider_operation_duration_ms')
2835
+ .map(([name, duration, tags]) => [
2836
+ name,
2837
+ name === 'routes_lifecycle_duration_ms' ? '<duration>' : duration,
2838
+ tags,
2839
+ ]),
2274
2840
  pending,
2275
2841
  pendingFollowUp,
2842
+ providerOperations: providerOperationCounts(counts),
2276
2843
  record,
2277
2844
  replay,
2278
2845
  requestTargets,
@@ -2288,13 +2855,16 @@ describe('createTracker', () => {
2288
2855
  createdAt: expect.any(String),
2289
2856
  depositAddressId: expect.any(String),
2290
2857
  id: expect.any(String),
2858
+ providerDeliveredAt: expect.any(String),
2291
2859
  snapshot: { depositAddressId: expect.any(String) },
2860
+ statusUpdatedAt: expect.any(String),
2292
2861
  updatedAt: expect.any(String),
2293
2862
  },
2294
2863
  storedAddress: {
2295
2864
  id: expect.any(String),
2296
2865
  providerOutputToken: expect.any(Object),
2297
2866
  snapshot: expect.any(Object),
2867
+ statusUpdatedAt: expect.any(String),
2298
2868
  },
2299
2869
  },
2300
2870
  `
@@ -2306,7 +2876,7 @@ describe('createTracker', () => {
2306
2876
  },
2307
2877
  "counts": [
2308
2878
  [
2309
- "funding_deposit_reconciliation_count",
2879
+ "routes_deposit_reconciliation_count",
2310
2880
  1,
2311
2881
  {
2312
2882
  "outcome": "follow_up_enqueue_failed",
@@ -2315,7 +2885,7 @@ describe('createTracker', () => {
2315
2885
  },
2316
2886
  ],
2317
2887
  [
2318
- "funding_deposit_reconciliation_count",
2888
+ "routes_deposit_reconciliation_count",
2319
2889
  1,
2320
2890
  {
2321
2891
  "outcome": "failed",
@@ -2324,7 +2894,7 @@ describe('createTracker', () => {
2324
2894
  },
2325
2895
  ],
2326
2896
  [
2327
- "funding_deposit_reconciliation_count",
2897
+ "routes_deposit_reconciliation_count",
2328
2898
  1,
2329
2899
  {
2330
2900
  "outcome": "follow_up_enqueued",
@@ -2333,7 +2903,7 @@ describe('createTracker', () => {
2333
2903
  },
2334
2904
  ],
2335
2905
  [
2336
- "funding_deposit_reconciliation_count",
2906
+ "routes_deposit_reconciliation_count",
2337
2907
  1,
2338
2908
  {
2339
2909
  "outcome": "completed",
@@ -2342,7 +2912,33 @@ describe('createTracker', () => {
2342
2912
  },
2343
2913
  ],
2344
2914
  [
2345
- "funding_deposit_detection_count",
2915
+ "routes_resource_transition_count",
2916
+ 1,
2917
+ {
2918
+ "from_status": "none",
2919
+ "method": "deposit_address",
2920
+ "provider": "relay",
2921
+ "reason": "none",
2922
+ "resource": "deposit",
2923
+ "routes_environment": "production",
2924
+ "to_status": "detected",
2925
+ },
2926
+ ],
2927
+ [
2928
+ "routes_resource_transition_count",
2929
+ 1,
2930
+ {
2931
+ "from_status": "detected",
2932
+ "method": "deposit_address",
2933
+ "provider": "relay",
2934
+ "reason": "none",
2935
+ "resource": "deposit",
2936
+ "routes_environment": "production",
2937
+ "to_status": "bridging",
2938
+ },
2939
+ ],
2940
+ [
2941
+ "routes_deposit_detection_count",
2346
2942
  1,
2347
2943
  {
2348
2944
  "provider": "relay",
@@ -2350,7 +2946,7 @@ describe('createTracker', () => {
2350
2946
  },
2351
2947
  ],
2352
2948
  [
2353
- "funding_deposit_reconciliation_count",
2949
+ "routes_deposit_reconciliation_count",
2354
2950
  1,
2355
2951
  {
2356
2952
  "outcome": "follow_up_enqueued",
@@ -2359,7 +2955,7 @@ describe('createTracker', () => {
2359
2955
  },
2360
2956
  ],
2361
2957
  [
2362
- "funding_deposit_reconciliation_count",
2958
+ "routes_deposit_reconciliation_count",
2363
2959
  1,
2364
2960
  {
2365
2961
  "outcome": "completed",
@@ -2368,7 +2964,7 @@ describe('createTracker', () => {
2368
2964
  },
2369
2965
  ],
2370
2966
  [
2371
- "funding_deposit_reconciliation_count",
2967
+ "routes_deposit_reconciliation_count",
2372
2968
  1,
2373
2969
  {
2374
2970
  "outcome": "follow_up_exhausted",
@@ -2377,7 +2973,7 @@ describe('createTracker', () => {
2377
2973
  },
2378
2974
  ],
2379
2975
  [
2380
- "funding_deposit_reconciliation_count",
2976
+ "routes_deposit_reconciliation_count",
2381
2977
  1,
2382
2978
  {
2383
2979
  "outcome": "completed",
@@ -2386,7 +2982,20 @@ describe('createTracker', () => {
2386
2982
  },
2387
2983
  ],
2388
2984
  [
2389
- "funding_deposit_reconciliation_count",
2985
+ "routes_resource_transition_count",
2986
+ 1,
2987
+ {
2988
+ "from_status": "bridging",
2989
+ "method": "deposit_address",
2990
+ "provider": "relay",
2991
+ "reason": "none",
2992
+ "resource": "deposit",
2993
+ "routes_environment": "production",
2994
+ "to_status": "completed",
2995
+ },
2996
+ ],
2997
+ [
2998
+ "routes_deposit_reconciliation_count",
2390
2999
  1,
2391
3000
  {
2392
3001
  "outcome": "completed",
@@ -2395,7 +3004,7 @@ describe('createTracker', () => {
2395
3004
  },
2396
3005
  ],
2397
3006
  [
2398
- "funding_deposit_reconciliation_count",
3007
+ "routes_deposit_reconciliation_count",
2399
3008
  1,
2400
3009
  {
2401
3010
  "outcome": "completed",
@@ -2404,7 +3013,7 @@ describe('createTracker', () => {
2404
3013
  },
2405
3014
  ],
2406
3015
  [
2407
- "funding_deposit_reconciliation_count",
3016
+ "routes_deposit_reconciliation_count",
2408
3017
  1,
2409
3018
  {
2410
3019
  "outcome": "completed",
@@ -2423,7 +3032,7 @@ describe('createTracker', () => {
2423
3032
  },
2424
3033
  "requestId": "relay-pending-request",
2425
3034
  "trigger": "webhook",
2426
- "type": "funding:deposit-address:reconcile",
3035
+ "type": "routes:deposit-address:reconcile",
2427
3036
  "webhookTiming": {
2428
3037
  "enqueuedAt": "2026-01-02T00:03:07.000Z",
2429
3038
  "providerStatus": "pending",
@@ -2440,12 +3049,12 @@ describe('createTracker', () => {
2440
3049
  {
2441
3050
  "addressId": Any<String>,
2442
3051
  "followUp": {
2443
- "attempt": 1,
3052
+ "attempt": 7,
2444
3053
  "kind": "provider",
2445
3054
  },
2446
3055
  "requestId": "relay-pending-request",
2447
3056
  "trigger": "webhook",
2448
- "type": "funding:deposit-address:reconcile",
3057
+ "type": "routes:deposit-address:reconcile",
2449
3058
  "webhookTiming": {
2450
3059
  "enqueuedAt": "2026-01-02T00:03:07.000Z",
2451
3060
  "providerStatus": "pending",
@@ -2462,11 +3071,11 @@ describe('createTracker', () => {
2462
3071
  "exhausted": {
2463
3072
  "created": 0,
2464
3073
  "type": "completed",
2465
- "updated": 1,
3074
+ "updated": 0,
2466
3075
  },
2467
3076
  "histograms": [
2468
3077
  [
2469
- "funding_deposit_reconciliation_duration_ms",
3078
+ "routes_deposit_reconciliation_duration_ms",
2470
3079
  0,
2471
3080
  {
2472
3081
  "provider": "relay",
@@ -2474,7 +3083,7 @@ describe('createTracker', () => {
2474
3083
  },
2475
3084
  ],
2476
3085
  [
2477
- "funding_deposit_reconciliation_duration_ms",
3086
+ "routes_deposit_reconciliation_duration_ms",
2478
3087
  0,
2479
3088
  {
2480
3089
  "provider": "relay",
@@ -2482,7 +3091,7 @@ describe('createTracker', () => {
2482
3091
  },
2483
3092
  ],
2484
3093
  [
2485
- "funding_deposit_reconciliation_duration_ms",
3094
+ "routes_deposit_reconciliation_duration_ms",
2486
3095
  0,
2487
3096
  {
2488
3097
  "provider": "relay",
@@ -2490,7 +3099,43 @@ describe('createTracker', () => {
2490
3099
  },
2491
3100
  ],
2492
3101
  [
2493
- "funding_deposit_webhook_latency_ms",
3102
+ "routes_lifecycle_duration_ms",
3103
+ "<duration>",
3104
+ {
3105
+ "flow": "deposit_address",
3106
+ "outcome": "success",
3107
+ "provider": "relay",
3108
+ "routes_environment": "production",
3109
+ "segment": "detected_to_provider_delivery",
3110
+ },
3111
+ ],
3112
+ [
3113
+ "routes_customer_value_loss_bps",
3114
+ 0,
3115
+ {
3116
+ "destination_chain": "eip155:4217",
3117
+ "destination_token": "eip155:4217/erc20:0x20c000000000000000000000b9537d11c60e8b50",
3118
+ "method": "deposit_address",
3119
+ "provider": "relay",
3120
+ "routes_environment": "production",
3121
+ "source_chain": "eip155:8453",
3122
+ "source_token": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
3123
+ "stage": "executed",
3124
+ },
3125
+ ],
3126
+ [
3127
+ "routes_lifecycle_duration_ms",
3128
+ "<duration>",
3129
+ {
3130
+ "flow": "deposit_address",
3131
+ "outcome": "success",
3132
+ "provider": "relay",
3133
+ "routes_environment": "production",
3134
+ "segment": "detected_to_completed",
3135
+ },
3136
+ ],
3137
+ [
3138
+ "routes_deposit_webhook_latency_ms",
2494
3139
  5000,
2495
3140
  {
2496
3141
  "provider": "relay",
@@ -2499,7 +3144,7 @@ describe('createTracker', () => {
2499
3144
  },
2500
3145
  ],
2501
3146
  [
2502
- "funding_deposit_webhook_latency_ms",
3147
+ "routes_deposit_webhook_latency_ms",
2503
3148
  1000,
2504
3149
  {
2505
3150
  "provider": "relay",
@@ -2508,7 +3153,7 @@ describe('createTracker', () => {
2508
3153
  },
2509
3154
  ],
2510
3155
  [
2511
- "funding_deposit_webhook_latency_ms",
3156
+ "routes_deposit_webhook_latency_ms",
2512
3157
  1000,
2513
3158
  {
2514
3159
  "provider": "relay",
@@ -2517,7 +3162,7 @@ describe('createTracker', () => {
2517
3162
  },
2518
3163
  ],
2519
3164
  [
2520
- "funding_deposit_webhook_latency_ms",
3165
+ "routes_deposit_webhook_latency_ms",
2521
3166
  8000,
2522
3167
  {
2523
3168
  "provider": "relay",
@@ -2526,7 +3171,7 @@ describe('createTracker', () => {
2526
3171
  },
2527
3172
  ],
2528
3173
  [
2529
- "funding_deposit_webhook_latency_ms",
3174
+ "routes_deposit_webhook_latency_ms",
2530
3175
  15000,
2531
3176
  {
2532
3177
  "provider": "relay",
@@ -2535,7 +3180,7 @@ describe('createTracker', () => {
2535
3180
  },
2536
3181
  ],
2537
3182
  [
2538
- "funding_deposit_reconciliation_duration_ms",
3183
+ "routes_deposit_reconciliation_duration_ms",
2539
3184
  0,
2540
3185
  {
2541
3186
  "provider": "relay",
@@ -2543,7 +3188,7 @@ describe('createTracker', () => {
2543
3188
  },
2544
3189
  ],
2545
3190
  [
2546
- "funding_deposit_reconciliation_duration_ms",
3191
+ "routes_deposit_reconciliation_duration_ms",
2547
3192
  0,
2548
3193
  {
2549
3194
  "provider": "relay",
@@ -2551,7 +3196,7 @@ describe('createTracker', () => {
2551
3196
  },
2552
3197
  ],
2553
3198
  [
2554
- "funding_deposit_reconciliation_duration_ms",
3199
+ "routes_deposit_reconciliation_duration_ms",
2555
3200
  0,
2556
3201
  {
2557
3202
  "provider": "relay",
@@ -2569,6 +3214,9 @@ describe('createTracker', () => {
2569
3214
  "type": "completed",
2570
3215
  "updated": 1,
2571
3216
  },
3217
+ "providerOperations": {
3218
+ "relay:listDepositAddressRequests:success": 11,
3219
+ },
2572
3220
  "record": {
2573
3221
  "createdAt": Any<String>,
2574
3222
  "depositAddressId": Any<String>,
@@ -2578,6 +3226,7 @@ describe('createTracker', () => {
2578
3226
  "orgId": "org_pending_reconciliation",
2579
3227
  "pollObservedAt": null,
2580
3228
  "projectId": null,
3229
+ "providerDeliveredAt": Any<String>,
2581
3230
  "providerOutputAmount": {
2582
3231
  "baseUnits": "1000000",
2583
3232
  "currency": "USD",
@@ -2599,6 +3248,7 @@ describe('createTracker', () => {
2599
3248
  "relay-pending-request",
2600
3249
  ],
2601
3250
  "providerState": null,
3251
+ "providerSubsidy": null,
2602
3252
  "providerTransactionHashes": [
2603
3253
  "0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
2604
3254
  ],
@@ -2677,10 +3327,12 @@ describe('createTracker', () => {
2677
3327
  "sourceTransferIndex": 0,
2678
3328
  "status": "completed",
2679
3329
  "statusReason": null,
3330
+ "statusUpdatedAt": Any<String>,
2680
3331
  "subsidyAmount": null,
3332
+ "subsidyMeterReportedAt": null,
2681
3333
  "tempoGasPaid": null,
2682
3334
  "updatedAt": Any<String>,
2683
- "version": 7,
3335
+ "version": 4,
2684
3336
  "webhookReceivedAt": null,
2685
3337
  },
2686
3338
  "replay": {
@@ -2703,8 +3355,8 @@ describe('createTracker', () => {
2703
3355
  ],
2704
3356
  "storedAddress": {
2705
3357
  "address": "0x8888888888888888888888888888888888888888",
2706
- "apiKeyId": "key_pending_reconciliation",
2707
3358
  "createdAt": "2026-01-02T00:00:00.000Z",
3359
+ "creatorUserId": null,
2708
3360
  "deliveryStrategy": "provider",
2709
3361
  "destinationTokenKey": "eip155:4217/erc20:0x20c000000000000000000000b9537d11c60e8b50",
2710
3362
  "environment": "production",
@@ -2743,6 +3395,7 @@ describe('createTracker', () => {
2743
3395
  "sourceChainId": "eip155:8453",
2744
3396
  "sourceTokenKey": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
2745
3397
  "status": "active",
3398
+ "statusUpdatedAt": Any<String>,
2746
3399
  "subsidize": false,
2747
3400
  "updatedAt": "2026-01-02T00:00:00.000Z",
2748
3401
  "version": 1,
@@ -2760,20 +3413,25 @@ describe('createTracker', () => {
2760
3413
  }
2761
3414
  })
2762
3415
 
2763
- test('completes chain-detected Relay delivery before provider attribution', async () => {
2764
- const route = TestFunding.transferSnapshot()
3416
+ test('backfills late Relay subsidy after chain-detected delivery', async () => {
3417
+ const route = TestRoutes.transferSnapshot()
2765
3418
  const ambiguousOrderId = `0x${'3d'.repeat(32)}`
2766
3419
  const ambiguousSweepTransactionHash = `0x${'3e'.repeat(32)}`
2767
3420
  const depositAddress = `0x${'31'.repeat(20)}`
2768
3421
  const depository = `0x${'32'.repeat(20)}`
2769
3422
  const destinationTransactionHash = `0x${'33'.repeat(32)}`
2770
3423
  const orderId = `0x${'34'.repeat(32)}`
3424
+ const previousSourceTransactionHash = `0x${'39'.repeat(32)}`
2771
3425
  const refundAddress = `0x${'38'.repeat(20)}`
2772
3426
  const solver = `0x${'35'.repeat(20)}`
2773
3427
  const sourceSweepTransactionHash = `0x${'36'.repeat(32)}`
2774
3428
  const sourceTransactionHash = `0x${'37'.repeat(32)}`
3429
+ const sponsorPayment = {
3430
+ address: route.sourceToken.address,
3431
+ amount: '23838',
3432
+ chainId: Number(route.sourceChain.id.slice('eip155:'.length)),
3433
+ }
2775
3434
  const address = await DepositAddress.create(db, {
2776
- apiKeyId: 'key_delivery_observation',
2777
3435
  deliveryStrategy: 'provider',
2778
3436
  environment: 'production',
2779
3437
  now: new Date('2026-01-04T00:00:00.000Z'),
@@ -2804,17 +3462,36 @@ describe('createTracker', () => {
2804
3462
  const rpcMethods: string[] = []
2805
3463
  let ambiguous = true
2806
3464
  let correlateDestination = false
3465
+ let delayIndexedRequest = false
2807
3466
  let delivered = false
2808
3467
  let indexed = false
3468
+ let indexedDelivery = false
3469
+ let requestsUnavailable = false
3470
+ let sponsorPaymentAvailable = true
2809
3471
  const server = await TestRelay.createServer(async (request, response) => {
2810
3472
  if (request.method === 'GET') {
2811
3473
  const url = new URL(request.url ?? '/', server.url)
3474
+ const hideIndexedRequest = indexed && delayIndexedRequest
3475
+ delayIndexedRequest = false
3476
+ const indexedVisible = indexed && !hideIndexedRequest
3477
+ if (url.pathname !== '/chains' && requestsUnavailable) {
3478
+ response.writeHead(503, { 'content-type': 'application/json' })
3479
+ response.end(JSON.stringify({ message: 'temporarily unavailable' }))
3480
+ return
3481
+ }
2812
3482
  response.writeHead(200, { 'content-type': 'application/json' })
2813
3483
  response.end(
2814
3484
  JSON.stringify(
2815
3485
  url.pathname === '/chains'
2816
3486
  ? {
2817
3487
  chains: [
3488
+ {
3489
+ id: 792703809,
3490
+ protocol: {
3491
+ v2: { depository: '99vQwtBwYtrqqD9YSXbdum3KBdxPAVxYTaQ3cfnJSrN2' },
3492
+ },
3493
+ solverAddresses: ['F7p3dFrjRTbtRp8FRF6qHLomXbKRBzpvBLjtQcfcgmNe'],
3494
+ },
2818
3495
  {
2819
3496
  id: Number(route.sourceChain.id.slice('eip155:'.length)),
2820
3497
  protocol: { v2: { depository } },
@@ -2827,16 +3504,30 @@ describe('createTracker', () => {
2827
3504
  ],
2828
3505
  }
2829
3506
  : {
2830
- requests: indexed
3507
+ ...(indexedVisible && !url.searchParams.has('continuation')
3508
+ ? { continuation: 'next' }
3509
+ : {}),
3510
+ requests: indexedVisible
2831
3511
  ? [
2832
3512
  {
2833
3513
  createdAt: '2026-01-04T00:01:00.000Z',
2834
- data: { outTxs: [] },
2835
- depositAddress: { depositTxHash: sourceTransactionHash },
3514
+ data: {
3515
+ ...(sponsorPaymentAvailable
3516
+ ? { feeSponsorship: { actual: { sponsorPayment } } }
3517
+ : {}),
3518
+ outTxs: indexedDelivery ? [{ txHash: destinationTransactionHash }] : [],
3519
+ },
3520
+ depositAddress: {
3521
+ depositTxHash: indexedDelivery
3522
+ ? previousSourceTransactionHash
3523
+ : sourceTransactionHash,
3524
+ },
2836
3525
  id: 'relay-observed-request',
2837
3526
  protocol: {
2838
3527
  deposit: { origin: { depositor: refundAddress, depository } },
2839
- orderId,
3528
+ orderId: url.searchParams.has('continuation')
3529
+ ? orderId
3530
+ : ambiguousOrderId,
2840
3531
  solver: { address: solver },
2841
3532
  },
2842
3533
  status: 'pending',
@@ -2979,7 +3670,7 @@ describe('createTracker', () => {
2979
3670
  })
2980
3671
 
2981
3672
  try {
2982
- await FundingCatalog.publish(db, {
3673
+ await RoutesCatalog.publish(db, {
2983
3674
  chainTokens: [],
2984
3675
  chains: [
2985
3676
  {
@@ -3025,6 +3716,7 @@ describe('createTracker', () => {
3025
3716
  )
3026
3717
  ambiguous = false
3027
3718
  delivered = true
3719
+ requestsUnavailable = true
3028
3720
  const uncorrelatedObservation = await provider.observeDepositAddressRequest(
3029
3721
  {
3030
3722
  address: depositAddress,
@@ -3038,6 +3730,25 @@ describe('createTracker', () => {
3038
3730
  },
3039
3731
  new AbortController().signal,
3040
3732
  )
3733
+ requestsUnavailable = false
3734
+ indexed = true
3735
+ indexedDelivery = true
3736
+ const indexedObservation = await provider.observeDepositAddressRequest(
3737
+ {
3738
+ address: depositAddress,
3739
+ destinationChain: route.destinationChain,
3740
+ destinationToken: route.destinationToken,
3741
+ recipient: route.recipient,
3742
+ refundAddress,
3743
+ source: { amount: '1000000', transactionHash: sourceTransactionHash },
3744
+ sourceChain: route.sourceChain,
3745
+ sourceToken: route.sourceToken,
3746
+ },
3747
+ new AbortController().signal,
3748
+ )
3749
+ sponsorPaymentAvailable = false
3750
+ indexed = false
3751
+ indexedDelivery = false
3041
3752
  correlateDestination = true
3042
3753
  delivered = false
3043
3754
  const observed = await SourceObservation.observe(db, {
@@ -3065,34 +3776,73 @@ describe('createTracker', () => {
3065
3776
  const pending = await tracker.reconcile({
3066
3777
  addressId: address.id,
3067
3778
  trigger: 'chain',
3068
- type: 'funding:deposit-address:reconcile',
3779
+ type: 'routes:deposit-address:reconcile',
3069
3780
  })
3070
- const [deliveryFollowUp] = dispatches
3781
+ let deliveryFollowUp = dispatches.at(-1)
3071
3782
  if (!deliveryFollowUp) throw new Error('Expected a delivery follow-up message.')
3072
- delivered = true
3783
+ const dispatchCount = dispatches.length
3784
+ await tracker.reconcile({
3785
+ ...deliveryFollowUp[0],
3786
+ followUp: { attempt: 5, kind: 'delivery' },
3787
+ })
3788
+ deliveryFollowUp = dispatches[dispatchCount]
3789
+ if (!deliveryFollowUp) throw new Error('Expected another delivery follow-up message.')
3790
+ delayIndexedRequest = true
3791
+ indexed = true
3792
+ indexedDelivery = true
3073
3793
  const completed = await tracker.reconcile(deliveryFollowUp[0])
3074
- const completedRecord = await FundingDeposits.get(db, observed.record.id)
3075
- const [, providerFollowUp] = dispatches
3794
+ const completedRecord = await RoutesDeposits.get(db, observed.record.id)
3795
+ const providerFollowUp = dispatches.find(([message]) => message.followUp?.kind === 'provider')
3076
3796
  if (!providerFollowUp) throw new Error('Expected a provider follow-up message.')
3797
+ expect(providerFollowUp[1]).toStrictEqual({ delaySeconds: 5 })
3798
+ delayIndexedRequest = true
3077
3799
  indexed = true
3078
- const attributed = await tracker.reconcile(providerFollowUp[0])
3079
- const [record] = await FundingDeposits.listBySourceTransaction(db, {
3800
+ indexedDelivery = true
3801
+ sponsorPaymentAvailable = true
3802
+ const backfilled = await tracker.reconcile(providerFollowUp[0])
3803
+ const backfilledRecord = await RoutesDeposits.get(db, observed.record.id)
3804
+ const repeatedFollowUp = dispatches.at(-1)
3805
+ if (!repeatedFollowUp) throw new Error('Expected another provider follow-up message.')
3806
+ delayIndexedRequest = true
3807
+ const repeated = await tracker.reconcile(repeatedFollowUp[0])
3808
+ const [record] = await RoutesDeposits.listBySourceTransaction(db, {
3080
3809
  depositAddressId: address.id,
3081
3810
  sourceTransactionHash,
3082
3811
  })
3812
+ const records = await RoutesDeposits.listByAddress(
3813
+ db,
3814
+ { environment: 'production', orgId: 'org_delivery_observation' },
3815
+ address.id,
3816
+ { limit: 10 },
3817
+ )
3083
3818
 
3084
3819
  expect({
3085
3820
  ambiguousObservation,
3086
- attributed,
3821
+ backfill: {
3822
+ after: {
3823
+ providerSubsidy: backfilledRecord?.providerSubsidy,
3824
+ status: backfilledRecord?.status,
3825
+ version: backfilledRecord?.version,
3826
+ },
3827
+ before: {
3828
+ providerSubsidy: completedRecord?.providerSubsidy,
3829
+ status: completedRecord?.status,
3830
+ version: completedRecord?.version,
3831
+ },
3832
+ recordCount: records.length,
3833
+ },
3834
+ backfilled,
3087
3835
  completed,
3088
- completedRecord,
3089
- counts,
3836
+ counts: counts.filter(([name]) => name !== 'routes_provider_operation_count'),
3090
3837
  dispatches: dispatches.map(([message, dispatchOptions]) => [
3091
3838
  { ...message, addressId: '<address-id>' },
3092
3839
  dispatchOptions,
3093
3840
  ]),
3841
+ indexedObservation,
3094
3842
  pending,
3843
+ providerOperations: providerOperationCounts(counts),
3095
3844
  record,
3845
+ repeated,
3096
3846
  rpcMethods,
3097
3847
  sourceObservation: observed.type,
3098
3848
  uncorrelatedObservation,
@@ -3102,14 +3852,9 @@ describe('createTracker', () => {
3102
3852
  createdAt: expect.any(String),
3103
3853
  depositAddressId: expect.any(String),
3104
3854
  id: expect.any(String),
3855
+ providerDeliveredAt: expect.any(String),
3105
3856
  snapshot: { depositAddressId: expect.any(String) },
3106
- updatedAt: expect.any(String),
3107
- },
3108
- completedRecord: {
3109
- createdAt: expect.any(String),
3110
- depositAddressId: expect.any(String),
3111
- id: expect.any(String),
3112
- snapshot: { depositAddressId: expect.any(String) },
3857
+ statusUpdatedAt: expect.any(String),
3113
3858
  updatedAt: expect.any(String),
3114
3859
  },
3115
3860
  },
@@ -3118,7 +3863,38 @@ describe('createTracker', () => {
3118
3863
  "ambiguousObservation": {
3119
3864
  "type": "pending",
3120
3865
  },
3121
- "attributed": {
3866
+ "backfill": {
3867
+ "after": {
3868
+ "providerSubsidy": {
3869
+ "amount": {
3870
+ "baseUnits": "23838",
3871
+ "currency": "USD",
3872
+ "decimals": 6,
3873
+ "formatted": "0.023838",
3874
+ },
3875
+ "provider": "relay",
3876
+ "token": {
3877
+ "address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
3878
+ "currency": "USD",
3879
+ "decimals": 6,
3880
+ "name": "USD Coin",
3881
+ "standard": "ERC-20",
3882
+ "symbol": "USDC",
3883
+ "tokenKey": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
3884
+ "verified": true,
3885
+ },
3886
+ },
3887
+ "status": "completed",
3888
+ "version": 4,
3889
+ },
3890
+ "before": {
3891
+ "providerSubsidy": null,
3892
+ "status": "completed",
3893
+ "version": 3,
3894
+ },
3895
+ "recordCount": 1,
3896
+ },
3897
+ "backfilled": {
3122
3898
  "created": 0,
3123
3899
  "type": "completed",
3124
3900
  "updated": 1,
@@ -3128,132 +3904,95 @@ describe('createTracker', () => {
3128
3904
  "type": "completed",
3129
3905
  "updated": 1,
3130
3906
  },
3131
- "completedRecord": {
3132
- "createdAt": Any<String>,
3133
- "depositAddressId": Any<String>,
3134
- "detectionTrigger": "chain",
3135
- "environment": "production",
3136
- "id": Any<String>,
3137
- "orgId": "org_delivery_observation",
3138
- "pollObservedAt": null,
3139
- "projectId": null,
3140
- "providerOutputAmount": {
3141
- "baseUnits": "1000000",
3142
- "currency": "USD",
3143
- "decimals": 6,
3144
- "formatted": "1",
3145
- },
3146
- "providerOutputToken": {
3147
- "address": "0x20c000000000000000000000b9537d11c60e8b50",
3148
- "currency": "USD",
3149
- "decimals": 6,
3150
- "name": "Bridged USDC (Stargate)",
3151
- "standard": "TIP-20",
3152
- "symbol": "USDC.e",
3153
- "tokenKey": "eip155:4217/erc20:0x20c000000000000000000000b9537d11c60e8b50",
3154
- "verified": true,
3155
- },
3156
- "providerRequestId": null,
3157
- "providerRequestIds": [],
3158
- "providerState": {
3159
- "relay": {
3160
- "destinationObservedAt": "2026-01-04T00:03:00.000Z",
3161
- "orderId": "0x3434343434343434343434343434343434343434343434343434343434343434",
3162
- "sourceDepository": "0x3232323232323232323232323232323232323232",
3163
- "sourceObservedAt": "2026-01-04T00:03:00.000Z",
3164
- "sourceSweepTransactionHash": "0x3636363636363636363636363636363636363636363636363636363636363636",
3907
+ "counts": [
3908
+ [
3909
+ "routes_deposit_delivery_observation_count",
3910
+ 1,
3911
+ {
3912
+ "outcome": "pending",
3913
+ "provider": "relay",
3165
3914
  },
3166
- },
3167
- "providerTransactionHashes": [
3168
- "0x3636363636363636363636363636363636363636363636363636363636363636",
3169
- "0x3333333333333333333333333333333333333333333333333333333333333333",
3170
3915
  ],
3171
- "providerTransferIndex": 0,
3172
- "retryState": null,
3173
- "settlementTransaction": null,
3174
- "settlementTransactionHash": null,
3175
- "snapshot": {
3176
- "depositAddressId": Any<String>,
3177
- "destinationAmount": {
3178
- "baseUnits": "1000000",
3179
- "currency": "USD",
3180
- "decimals": 6,
3181
- "formatted": "1",
3916
+ [
3917
+ "routes_resource_transition_count",
3918
+ 1,
3919
+ {
3920
+ "from_status": "detected",
3921
+ "method": "deposit_address",
3922
+ "provider": "relay",
3923
+ "reason": "none",
3924
+ "resource": "deposit",
3925
+ "routes_environment": "production",
3926
+ "to_status": "bridging",
3182
3927
  },
3183
- "destinationChain": {
3184
- "addressFormat": "hex",
3185
- "id": "eip155:4217",
3186
- "kind": "evm",
3187
- "name": "Tempo",
3928
+ ],
3929
+ [
3930
+ "routes_deposit_reconciliation_count",
3931
+ 1,
3932
+ {
3933
+ "outcome": "follow_up_enqueued",
3934
+ "provider": "relay",
3935
+ "trigger": "chain",
3188
3936
  },
3189
- "destinationToken": {
3190
- "address": "0x20c000000000000000000000b9537d11c60e8b50",
3191
- "currency": "USD",
3192
- "decimals": 6,
3193
- "name": "Bridged USDC (Stargate)",
3194
- "standard": "TIP-20",
3195
- "symbol": "USDC.e",
3196
- "tokenKey": "eip155:4217/erc20:0x20c000000000000000000000b9537d11c60e8b50",
3197
- "verified": true,
3937
+ ],
3938
+ [
3939
+ "routes_deposit_reconciliation_count",
3940
+ 1,
3941
+ {
3942
+ "outcome": "completed",
3943
+ "provider": "relay",
3944
+ "trigger": "chain",
3198
3945
  },
3199
- "destinationTransactionHashes": [
3200
- "0x3333333333333333333333333333333333333333333333333333333333333333",
3201
- ],
3202
- "provider": {
3203
- "id": "relay",
3204
- "name": "Relay",
3946
+ ],
3947
+ [
3948
+ "routes_deposit_delivery_observation_count",
3949
+ 1,
3950
+ {
3951
+ "outcome": "pending",
3952
+ "provider": "relay",
3205
3953
  },
3206
- "recipient": "0x1111111111111111111111111111111111111111",
3207
- "refundAddress": "0x3838383838383838383838383838383838383838",
3208
- "sender": "0x3838383838383838383838383838383838383838",
3209
- "sourceAmount": {
3210
- "baseUnits": "1000000",
3211
- "currency": "USD",
3212
- "decimals": 6,
3213
- "formatted": "1",
3954
+ ],
3955
+ [
3956
+ "routes_deposit_reconciliation_count",
3957
+ 1,
3958
+ {
3959
+ "outcome": "follow_up_enqueued",
3960
+ "provider": "relay",
3961
+ "trigger": "chain",
3214
3962
  },
3215
- "sourceChain": {
3216
- "addressFormat": "hex",
3217
- "id": "eip155:8453",
3218
- "kind": "evm",
3219
- "name": "Base",
3963
+ ],
3964
+ [
3965
+ "routes_deposit_reconciliation_count",
3966
+ 1,
3967
+ {
3968
+ "outcome": "completed",
3969
+ "provider": "relay",
3970
+ "trigger": "chain",
3220
3971
  },
3221
- "sourceToken": {
3222
- "address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
3223
- "currency": "USD",
3224
- "decimals": 6,
3225
- "name": "USD Coin",
3226
- "standard": "ERC-20",
3227
- "symbol": "USDC",
3228
- "tokenKey": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
3229
- "verified": true,
3972
+ ],
3973
+ [
3974
+ "routes_deposit_delivery_observation_count",
3975
+ 1,
3976
+ {
3977
+ "outcome": "verified",
3978
+ "provider": "relay",
3230
3979
  },
3231
- "sourceTransactionHashes": [
3232
- "0x3737373737373737373737373737373737373737373737373737373737373737",
3233
- ],
3234
- },
3235
- "sourceChainId": "eip155:8453",
3236
- "sourceTransactionHash": "0x3737373737373737373737373737373737373737373737373737373737373737",
3237
- "sourceTransferIndex": 0,
3238
- "status": "completed",
3239
- "statusReason": null,
3240
- "subsidyAmount": null,
3241
- "tempoGasPaid": null,
3242
- "updatedAt": Any<String>,
3243
- "version": 3,
3244
- "webhookReceivedAt": null,
3245
- },
3246
- "counts": [
3980
+ ],
3247
3981
  [
3248
- "funding_deposit_delivery_observation_count",
3982
+ "routes_resource_transition_count",
3249
3983
  1,
3250
3984
  {
3251
- "outcome": "pending",
3985
+ "from_status": "bridging",
3986
+ "method": "deposit_address",
3252
3987
  "provider": "relay",
3988
+ "reason": "none",
3989
+ "resource": "deposit",
3990
+ "routes_environment": "production",
3991
+ "to_status": "completed",
3253
3992
  },
3254
3993
  ],
3255
3994
  [
3256
- "funding_deposit_reconciliation_count",
3995
+ "routes_deposit_reconciliation_count",
3257
3996
  1,
3258
3997
  {
3259
3998
  "outcome": "follow_up_enqueued",
@@ -3262,7 +4001,7 @@ describe('createTracker', () => {
3262
4001
  },
3263
4002
  ],
3264
4003
  [
3265
- "funding_deposit_reconciliation_count",
4004
+ "routes_deposit_reconciliation_count",
3266
4005
  1,
3267
4006
  {
3268
4007
  "outcome": "completed",
@@ -3271,7 +4010,7 @@ describe('createTracker', () => {
3271
4010
  },
3272
4011
  ],
3273
4012
  [
3274
- "funding_deposit_delivery_observation_count",
4013
+ "routes_deposit_delivery_observation_count",
3275
4014
  1,
3276
4015
  {
3277
4016
  "outcome": "verified",
@@ -3279,7 +4018,7 @@ describe('createTracker', () => {
3279
4018
  },
3280
4019
  ],
3281
4020
  [
3282
- "funding_deposit_reconciliation_count",
4021
+ "routes_deposit_reconciliation_count",
3283
4022
  1,
3284
4023
  {
3285
4024
  "outcome": "follow_up_enqueued",
@@ -3288,7 +4027,7 @@ describe('createTracker', () => {
3288
4027
  },
3289
4028
  ],
3290
4029
  [
3291
- "funding_deposit_reconciliation_count",
4030
+ "routes_deposit_reconciliation_count",
3292
4031
  1,
3293
4032
  {
3294
4033
  "outcome": "completed",
@@ -3297,7 +4036,16 @@ describe('createTracker', () => {
3297
4036
  },
3298
4037
  ],
3299
4038
  [
3300
- "funding_deposit_reconciliation_count",
4039
+ "routes_deposit_reconciliation_count",
4040
+ 1,
4041
+ {
4042
+ "outcome": "follow_up_enqueued",
4043
+ "provider": "relay",
4044
+ "trigger": "chain",
4045
+ },
4046
+ ],
4047
+ [
4048
+ "routes_deposit_reconciliation_count",
3301
4049
  1,
3302
4050
  {
3303
4051
  "outcome": "completed",
@@ -3315,7 +4063,21 @@ describe('createTracker', () => {
3315
4063
  "kind": "delivery",
3316
4064
  },
3317
4065
  "trigger": "chain",
3318
- "type": "funding:deposit-address:reconcile",
4066
+ "type": "routes:deposit-address:reconcile",
4067
+ },
4068
+ {
4069
+ "delaySeconds": 1,
4070
+ },
4071
+ ],
4072
+ [
4073
+ {
4074
+ "addressId": "<address-id>",
4075
+ "followUp": {
4076
+ "attempt": 6,
4077
+ "kind": "delivery",
4078
+ },
4079
+ "trigger": "chain",
4080
+ "type": "routes:deposit-address:reconcile",
3319
4081
  },
3320
4082
  {
3321
4083
  "delaySeconds": 1,
@@ -3329,18 +4091,88 @@ describe('createTracker', () => {
3329
4091
  "kind": "provider",
3330
4092
  },
3331
4093
  "trigger": "chain",
3332
- "type": "funding:deposit-address:reconcile",
4094
+ "type": "routes:deposit-address:reconcile",
3333
4095
  },
3334
4096
  {
3335
- "delaySeconds": 1,
4097
+ "delaySeconds": 5,
4098
+ },
4099
+ ],
4100
+ [
4101
+ {
4102
+ "addressId": "<address-id>",
4103
+ "followUp": {
4104
+ "attempt": 1,
4105
+ "kind": "provider",
4106
+ },
4107
+ "trigger": "chain",
4108
+ "type": "routes:deposit-address:reconcile",
4109
+ },
4110
+ {
4111
+ "delaySeconds": 5,
4112
+ },
4113
+ ],
4114
+ [
4115
+ {
4116
+ "addressId": "<address-id>",
4117
+ "followUp": {
4118
+ "attempt": 2,
4119
+ "kind": "provider",
4120
+ },
4121
+ "trigger": "chain",
4122
+ "type": "routes:deposit-address:reconcile",
4123
+ },
4124
+ {
4125
+ "delaySeconds": 5,
3336
4126
  },
3337
4127
  ],
3338
4128
  ],
4129
+ "indexedObservation": {
4130
+ "destinationTransactionHashes": [
4131
+ "0x3333333333333333333333333333333333333333333333333333333333333333",
4132
+ ],
4133
+ "providerState": {
4134
+ "relay": {
4135
+ "destinationObservedAt": "2026-01-04T00:03:00.000Z",
4136
+ "orderId": "0x3434343434343434343434343434343434343434343434343434343434343434",
4137
+ "sourceDepository": "0x3232323232323232323232323232323232323232",
4138
+ "sourceObservedAt": "2026-01-04T00:03:00.000Z",
4139
+ "sourceSweepTransactionHash": "0x3636363636363636363636363636363636363636363636363636363636363636",
4140
+ },
4141
+ },
4142
+ "providerTransactionHashes": [
4143
+ "0x3636363636363636363636363636363636363636363636363636363636363636",
4144
+ "0x3333333333333333333333333333333333333333333333333333333333333333",
4145
+ ],
4146
+ "subsidy": {
4147
+ "amount": {
4148
+ "baseUnits": "23838",
4149
+ "currency": "USD",
4150
+ "decimals": 6,
4151
+ "formatted": "0.023838",
4152
+ },
4153
+ "provider": "relay",
4154
+ "token": {
4155
+ "address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
4156
+ "currency": "USD",
4157
+ "decimals": 6,
4158
+ "name": "USD Coin",
4159
+ "standard": "ERC-20",
4160
+ "symbol": "USDC",
4161
+ "tokenKey": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
4162
+ "verified": true,
4163
+ },
4164
+ },
4165
+ "type": "verified",
4166
+ },
3339
4167
  "pending": {
3340
4168
  "created": 0,
3341
4169
  "type": "completed",
3342
4170
  "updated": 1,
3343
4171
  },
4172
+ "providerOperations": {
4173
+ "relay:listDepositAddressRequests:success": 5,
4174
+ "relay:observeDepositAddressRequest:success": 4,
4175
+ },
3344
4176
  "record": {
3345
4177
  "createdAt": Any<String>,
3346
4178
  "depositAddressId": Any<String>,
@@ -3350,6 +4182,7 @@ describe('createTracker', () => {
3350
4182
  "orgId": "org_delivery_observation",
3351
4183
  "pollObservedAt": null,
3352
4184
  "projectId": null,
4185
+ "providerDeliveredAt": Any<String>,
3353
4186
  "providerOutputAmount": {
3354
4187
  "baseUnits": "1000000",
3355
4188
  "currency": "USD",
@@ -3366,10 +4199,8 @@ describe('createTracker', () => {
3366
4199
  "tokenKey": "eip155:4217/erc20:0x20c000000000000000000000b9537d11c60e8b50",
3367
4200
  "verified": true,
3368
4201
  },
3369
- "providerRequestId": "relay-observed-request",
3370
- "providerRequestIds": [
3371
- "relay-observed-request",
3372
- ],
4202
+ "providerRequestId": null,
4203
+ "providerRequestIds": [],
3373
4204
  "providerState": {
3374
4205
  "relay": {
3375
4206
  "destinationObservedAt": "2026-01-04T00:03:00.000Z",
@@ -3379,6 +4210,25 @@ describe('createTracker', () => {
3379
4210
  "sourceSweepTransactionHash": "0x3636363636363636363636363636363636363636363636363636363636363636",
3380
4211
  },
3381
4212
  },
4213
+ "providerSubsidy": {
4214
+ "amount": {
4215
+ "baseUnits": "23838",
4216
+ "currency": "USD",
4217
+ "decimals": 6,
4218
+ "formatted": "0.023838",
4219
+ },
4220
+ "provider": "relay",
4221
+ "token": {
4222
+ "address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
4223
+ "currency": "USD",
4224
+ "decimals": 6,
4225
+ "name": "USD Coin",
4226
+ "standard": "ERC-20",
4227
+ "symbol": "USDC",
4228
+ "tokenKey": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
4229
+ "verified": true,
4230
+ },
4231
+ },
3382
4232
  "providerTransactionHashes": [
3383
4233
  "0x3636363636363636363636363636363636363636363636363636363636363636",
3384
4234
  "0x3333333333333333333333333333333333333333333333333333333333333333",
@@ -3458,12 +4308,19 @@ describe('createTracker', () => {
3458
4308
  "sourceTransferIndex": 0,
3459
4309
  "status": "completed",
3460
4310
  "statusReason": null,
4311
+ "statusUpdatedAt": Any<String>,
3461
4312
  "subsidyAmount": null,
4313
+ "subsidyMeterReportedAt": null,
3462
4314
  "tempoGasPaid": null,
3463
4315
  "updatedAt": Any<String>,
3464
4316
  "version": 4,
3465
4317
  "webhookReceivedAt": null,
3466
4318
  },
4319
+ "repeated": {
4320
+ "created": 0,
4321
+ "type": "completed",
4322
+ "updated": 0,
4323
+ },
3467
4324
  "rpcMethods": [
3468
4325
  "eth_getTransactionReceipt",
3469
4326
  "eth_blockNumber",
@@ -3479,6 +4336,10 @@ describe('createTracker', () => {
3479
4336
  "eth_getTransactionByHash",
3480
4337
  "eth_getTransactionReceipt",
3481
4338
  "eth_blockNumber",
4339
+ "eth_getLogs",
4340
+ "eth_getTransactionByHash",
4341
+ "eth_getTransactionReceipt",
4342
+ "eth_blockNumber",
3482
4343
  "eth_getTransactionReceipt",
3483
4344
  "eth_blockNumber",
3484
4345
  "eth_getLogs",
@@ -3489,7 +4350,12 @@ describe('createTracker', () => {
3489
4350
  "eth_blockNumber",
3490
4351
  "eth_blockNumber",
3491
4352
  "eth_getLogs",
3492
- "eth_getTransactionByHash",
4353
+ "eth_getTransactionReceipt",
4354
+ "eth_blockNumber",
4355
+ "eth_getTransactionReceipt",
4356
+ "eth_blockNumber",
4357
+ "eth_getTransactionReceipt",
4358
+ "eth_blockNumber",
3493
4359
  "eth_getTransactionReceipt",
3494
4360
  "eth_blockNumber",
3495
4361
  "eth_getTransactionReceipt",
@@ -3519,10 +4385,9 @@ describe('createTracker', () => {
3519
4385
  })
3520
4386
 
3521
4387
  test('renews the address lease during a slow provider read', async () => {
3522
- const route = TestFunding.transferSnapshot()
4388
+ const route = TestRoutes.transferSnapshot()
3523
4389
  const depositAddress = `0x${'16'.repeat(20)}`
3524
4390
  const address = await DepositAddress.create(db, {
3525
- apiKeyId: 'key_lease_reconciliation',
3526
4391
  deliveryStrategy: 'provider',
3527
4392
  environment: 'production',
3528
4393
  now: new Date('2026-01-04T00:00:00.000Z'),
@@ -3564,14 +4429,14 @@ describe('createTracker', () => {
3564
4429
  const reconciliation = tracker.reconcile({
3565
4430
  addressId: address.id,
3566
4431
  trigger: 'webhook',
3567
- type: 'funding:deposit-address:reconcile',
4432
+ type: 'routes:deposit-address:reconcile',
3568
4433
  })
3569
4434
  await providerStarted.promise
3570
4435
  await vi.advanceTimersByTimeAsync(60)
3571
- const renewed = await FundingDepositAddresses.get(db, address.id)
4436
+ const renewed = await RoutesDepositAddresses.get(db, address.id)
3572
4437
  providerReleased.resolve()
3573
4438
  const result = await reconciliation
3574
- const completed = await FundingDepositAddresses.get(db, address.id)
4439
+ const completed = await RoutesDepositAddresses.get(db, address.id)
3575
4440
 
3576
4441
  expect({ completed, renewed, result }).toMatchInlineSnapshot(
3577
4442
  {
@@ -3579,19 +4444,21 @@ describe('createTracker', () => {
3579
4444
  id: expect.any(String),
3580
4445
  providerOutputToken: expect.any(Object),
3581
4446
  snapshot: expect.any(Object),
4447
+ statusUpdatedAt: expect.any(String),
3582
4448
  },
3583
4449
  renewed: {
3584
4450
  id: expect.any(String),
3585
4451
  providerOutputToken: expect.any(Object),
3586
4452
  snapshot: expect.any(Object),
4453
+ statusUpdatedAt: expect.any(String),
3587
4454
  },
3588
4455
  },
3589
4456
  `
3590
4457
  {
3591
4458
  "completed": {
3592
4459
  "address": "0x1616161616161616161616161616161616161616",
3593
- "apiKeyId": "key_lease_reconciliation",
3594
4460
  "createdAt": "2026-01-04T00:00:00.000Z",
4461
+ "creatorUserId": null,
3595
4462
  "deliveryStrategy": "provider",
3596
4463
  "destinationTokenKey": "eip155:4217/erc20:0x20c000000000000000000000b9537d11c60e8b50",
3597
4464
  "environment": "production",
@@ -3618,14 +4485,15 @@ describe('createTracker', () => {
3618
4485
  "sourceChainId": "eip155:8453",
3619
4486
  "sourceTokenKey": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
3620
4487
  "status": "active",
4488
+ "statusUpdatedAt": Any<String>,
3621
4489
  "subsidize": false,
3622
4490
  "updatedAt": "2026-01-04T00:00:00.000Z",
3623
4491
  "version": 1,
3624
4492
  },
3625
4493
  "renewed": {
3626
4494
  "address": "0x1616161616161616161616161616161616161616",
3627
- "apiKeyId": "key_lease_reconciliation",
3628
4495
  "createdAt": "2026-01-04T00:00:00.000Z",
4496
+ "creatorUserId": null,
3629
4497
  "deliveryStrategy": "provider",
3630
4498
  "destinationTokenKey": "eip155:4217/erc20:0x20c000000000000000000000b9537d11c60e8b50",
3631
4499
  "environment": "production",
@@ -3647,6 +4515,7 @@ describe('createTracker', () => {
3647
4515
  "sourceChainId": "eip155:8453",
3648
4516
  "sourceTokenKey": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
3649
4517
  "status": "active",
4518
+ "statusUpdatedAt": Any<String>,
3650
4519
  "subsidize": false,
3651
4520
  "updatedAt": "2026-01-04T00:00:00.000Z",
3652
4521
  "version": 1,
@@ -3667,13 +4536,12 @@ describe('createTracker', () => {
3667
4536
  })
3668
4537
 
3669
4538
  test('waits for every source transaction before allocating provider output', async () => {
3670
- const route = TestFunding.transferSnapshot()
4539
+ const route = TestRoutes.transferSnapshot()
3671
4540
  const depositAddress = `0x${'21'.repeat(20)}`
3672
4541
  const firstSourceTransactionHash = `0x${'31'.repeat(32)}`
3673
4542
  const secondSourceTransactionHash = `0x${'32'.repeat(32)}`
3674
4543
  const destinationTransactionHash = `0x${'33'.repeat(32)}`
3675
4544
  const address = await DepositAddress.create(db, {
3676
- apiKeyId: 'key_source_evidence_reconciliation',
3677
4545
  deliveryStrategy: 'provider',
3678
4546
  environment: 'production',
3679
4547
  now: new Date('2026-01-05T00:00:00.000Z'),
@@ -3724,7 +4592,7 @@ describe('createTracker', () => {
3724
4592
  })
3725
4593
 
3726
4594
  try {
3727
- await FundingCatalog.publish(db, {
4595
+ await RoutesCatalog.publish(db, {
3728
4596
  chainTokens: [],
3729
4597
  chains: [
3730
4598
  {
@@ -3761,7 +4629,7 @@ describe('createTracker', () => {
3761
4629
  verifyTransfers: Evidence.createVerifier({ db }),
3762
4630
  })
3763
4631
  const records = (
3764
- await FundingDeposits.listByAddress(
4632
+ await RoutesDeposits.listByAddress(
3765
4633
  db,
3766
4634
  { environment: 'production', orgId: 'org_source_evidence_reconciliation' },
3767
4635
  address.id,
@@ -3779,6 +4647,7 @@ describe('createTracker', () => {
3779
4647
  depositAddressId: expect.any(String),
3780
4648
  id: expect.any(String),
3781
4649
  snapshot: { depositAddressId: expect.any(String) },
4650
+ statusUpdatedAt: expect.any(String),
3782
4651
  updatedAt: expect.any(String),
3783
4652
  },
3784
4653
  {
@@ -3786,6 +4655,7 @@ describe('createTracker', () => {
3786
4655
  depositAddressId: expect.any(String),
3787
4656
  id: expect.any(String),
3788
4657
  snapshot: { depositAddressId: expect.any(String) },
4658
+ statusUpdatedAt: expect.any(String),
3789
4659
  updatedAt: expect.any(String),
3790
4660
  },
3791
4661
  ],
@@ -3803,6 +4673,7 @@ describe('createTracker', () => {
3803
4673
  "orgId": "org_source_evidence_reconciliation",
3804
4674
  "pollObservedAt": null,
3805
4675
  "projectId": null,
4676
+ "providerDeliveredAt": null,
3806
4677
  "providerOutputAmount": null,
3807
4678
  "providerOutputToken": {
3808
4679
  "address": "0x20c000000000000000000000b9537d11c60e8b50",
@@ -3819,6 +4690,7 @@ describe('createTracker', () => {
3819
4690
  "source-evidence-request",
3820
4691
  ],
3821
4692
  "providerState": null,
4693
+ "providerSubsidy": null,
3822
4694
  "providerTransactionHashes": [],
3823
4695
  "providerTransferIndex": 0,
3824
4696
  "retryState": null,
@@ -3880,7 +4752,9 @@ describe('createTracker', () => {
3880
4752
  "sourceTransferIndex": 0,
3881
4753
  "status": "bridging",
3882
4754
  "statusReason": null,
4755
+ "statusUpdatedAt": Any<String>,
3883
4756
  "subsidyAmount": null,
4757
+ "subsidyMeterReportedAt": null,
3884
4758
  "tempoGasPaid": null,
3885
4759
  "updatedAt": Any<String>,
3886
4760
  "version": 2,
@@ -3895,6 +4769,7 @@ describe('createTracker', () => {
3895
4769
  "orgId": "org_source_evidence_reconciliation",
3896
4770
  "pollObservedAt": null,
3897
4771
  "projectId": null,
4772
+ "providerDeliveredAt": null,
3898
4773
  "providerOutputAmount": null,
3899
4774
  "providerOutputToken": {
3900
4775
  "address": "0x20c000000000000000000000b9537d11c60e8b50",
@@ -3911,6 +4786,7 @@ describe('createTracker', () => {
3911
4786
  "source-evidence-request",
3912
4787
  ],
3913
4788
  "providerState": null,
4789
+ "providerSubsidy": null,
3914
4790
  "providerTransactionHashes": [],
3915
4791
  "providerTransferIndex": 0,
3916
4792
  "retryState": null,
@@ -3965,7 +4841,9 @@ describe('createTracker', () => {
3965
4841
  "sourceTransferIndex": null,
3966
4842
  "status": "detected",
3967
4843
  "statusReason": null,
4844
+ "statusUpdatedAt": Any<String>,
3968
4845
  "subsidyAmount": null,
4846
+ "subsidyMeterReportedAt": null,
3969
4847
  "tempoGasPaid": null,
3970
4848
  "updatedAt": Any<String>,
3971
4849
  "version": 1,
@@ -3986,13 +4864,12 @@ describe('createTracker', () => {
3986
4864
  })
3987
4865
 
3988
4866
  test('records multiple source transfers with finer precision independently', async () => {
3989
- const route = TestFunding.transferSnapshot()
4867
+ const route = TestRoutes.transferSnapshot()
3990
4868
  const sourceToken = { ...route.sourceToken, decimals: 18 }
3991
4869
  const depositAddress = `0x${'12'.repeat(20)}`
3992
4870
  const sourceTransactionHash = `0x${'ee'.repeat(32)}`
3993
4871
  const destinationTransactionHash = `0x${'ff'.repeat(32)}`
3994
4872
  const address = await DepositAddress.create(db, {
3995
- apiKeyId: 'key_precision_reconciliation',
3996
4873
  deliveryStrategy: 'provider',
3997
4874
  environment: 'production',
3998
4875
  now: new Date('2026-01-03T00:00:00.000Z'),
@@ -4020,6 +4897,15 @@ describe('createTracker', () => {
4020
4897
  {
4021
4898
  createdAt: '2026-01-03T00:01:00.000Z',
4022
4899
  data: {
4900
+ feeSponsorship: {
4901
+ actual: {
4902
+ sponsorPayment: {
4903
+ address: sourceToken.address,
4904
+ amount: '23838',
4905
+ chainId: 8453,
4906
+ },
4907
+ },
4908
+ },
4023
4909
  inTxs: [{ txHash: sourceTransactionHash }],
4024
4910
  outTxs: [{ txHash: destinationTransactionHash }],
4025
4911
  },
@@ -4081,7 +4967,7 @@ describe('createTracker', () => {
4081
4967
  })
4082
4968
 
4083
4969
  try {
4084
- await FundingCatalog.publish(db, {
4970
+ await RoutesCatalog.publish(db, {
4085
4971
  chainTokens: [],
4086
4972
  chains: [
4087
4973
  {
@@ -4115,10 +5001,10 @@ describe('createTracker', () => {
4115
5001
  const result = await tracker.reconcile({
4116
5002
  addressId: address.id,
4117
5003
  trigger: 'webhook',
4118
- type: 'funding:deposit-address:reconcile',
5004
+ type: 'routes:deposit-address:reconcile',
4119
5005
  })
4120
5006
  const records = (
4121
- await FundingDeposits.listByAddress(
5007
+ await RoutesDeposits.listByAddress(
4122
5008
  db,
4123
5009
  { environment: 'production', orgId: 'org_precision_reconciliation' },
4124
5010
  address.id,
@@ -4127,8 +5013,12 @@ describe('createTracker', () => {
4127
5013
  ).toSorted(
4128
5014
  (left, right) => (right.sourceTransferIndex ?? -1) - (left.sourceTransferIndex ?? -1),
4129
5015
  )
4130
- const storedAddress = await FundingDepositAddresses.get(db, address.id)
5016
+ const storedAddress = await RoutesDepositAddresses.get(db, address.id)
4131
5017
 
5018
+ expect(records.map((record) => record.providerSubsidy?.amount.baseUnits ?? null)).toEqual([
5019
+ null,
5020
+ '23838',
5021
+ ])
4132
5022
  expect({ records, result, storedAddress }).toMatchInlineSnapshot(
4133
5023
  {
4134
5024
  records: [
@@ -4136,14 +5026,18 @@ describe('createTracker', () => {
4136
5026
  createdAt: expect.any(String),
4137
5027
  depositAddressId: expect.any(String),
4138
5028
  id: expect.any(String),
5029
+ providerDeliveredAt: expect.any(String),
4139
5030
  snapshot: { depositAddressId: expect.any(String) },
5031
+ statusUpdatedAt: expect.any(String),
4140
5032
  updatedAt: expect.any(String),
4141
5033
  },
4142
5034
  {
4143
5035
  createdAt: expect.any(String),
4144
5036
  depositAddressId: expect.any(String),
4145
5037
  id: expect.any(String),
5038
+ providerDeliveredAt: expect.any(String),
4146
5039
  snapshot: { depositAddressId: expect.any(String) },
5040
+ statusUpdatedAt: expect.any(String),
4147
5041
  updatedAt: expect.any(String),
4148
5042
  },
4149
5043
  ],
@@ -4151,6 +5045,7 @@ describe('createTracker', () => {
4151
5045
  id: expect.any(String),
4152
5046
  providerOutputToken: expect.any(Object),
4153
5047
  snapshot: expect.any(Object),
5048
+ statusUpdatedAt: expect.any(String),
4154
5049
  },
4155
5050
  },
4156
5051
  `
@@ -4165,6 +5060,7 @@ describe('createTracker', () => {
4165
5060
  "orgId": "org_precision_reconciliation",
4166
5061
  "pollObservedAt": null,
4167
5062
  "projectId": null,
5063
+ "providerDeliveredAt": Any<String>,
4168
5064
  "providerOutputAmount": {
4169
5065
  "baseUnits": "2000000",
4170
5066
  "currency": "USD",
@@ -4186,6 +5082,7 @@ describe('createTracker', () => {
4186
5082
  "relay-multiple-transfer-request",
4187
5083
  ],
4188
5084
  "providerState": null,
5085
+ "providerSubsidy": null,
4189
5086
  "providerTransactionHashes": [
4190
5087
  "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
4191
5088
  ],
@@ -4264,7 +5161,9 @@ describe('createTracker', () => {
4264
5161
  "sourceTransferIndex": 1,
4265
5162
  "status": "completed",
4266
5163
  "statusReason": null,
5164
+ "statusUpdatedAt": Any<String>,
4267
5165
  "subsidyAmount": null,
5166
+ "subsidyMeterReportedAt": null,
4268
5167
  "tempoGasPaid": null,
4269
5168
  "updatedAt": Any<String>,
4270
5169
  "version": 3,
@@ -4279,6 +5178,7 @@ describe('createTracker', () => {
4279
5178
  "orgId": "org_precision_reconciliation",
4280
5179
  "pollObservedAt": null,
4281
5180
  "projectId": null,
5181
+ "providerDeliveredAt": Any<String>,
4282
5182
  "providerOutputAmount": {
4283
5183
  "baseUnits": "1000000",
4284
5184
  "currency": "USD",
@@ -4300,6 +5200,25 @@ describe('createTracker', () => {
4300
5200
  "relay-multiple-transfer-request",
4301
5201
  ],
4302
5202
  "providerState": null,
5203
+ "providerSubsidy": {
5204
+ "amount": {
5205
+ "baseUnits": "23838",
5206
+ "currency": "USD",
5207
+ "decimals": 18,
5208
+ "formatted": "0.000000000000023838",
5209
+ },
5210
+ "provider": "relay",
5211
+ "token": {
5212
+ "address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
5213
+ "currency": "USD",
5214
+ "decimals": 18,
5215
+ "name": "USD Coin",
5216
+ "standard": "ERC-20",
5217
+ "symbol": "USDC",
5218
+ "tokenKey": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
5219
+ "verified": true,
5220
+ },
5221
+ },
4303
5222
  "providerTransactionHashes": [
4304
5223
  "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
4305
5224
  ],
@@ -4378,7 +5297,9 @@ describe('createTracker', () => {
4378
5297
  "sourceTransferIndex": 0,
4379
5298
  "status": "completed",
4380
5299
  "statusReason": null,
5300
+ "statusUpdatedAt": Any<String>,
4381
5301
  "subsidyAmount": null,
5302
+ "subsidyMeterReportedAt": null,
4382
5303
  "tempoGasPaid": null,
4383
5304
  "updatedAt": Any<String>,
4384
5305
  "version": 3,
@@ -4392,8 +5313,8 @@ describe('createTracker', () => {
4392
5313
  },
4393
5314
  "storedAddress": {
4394
5315
  "address": "0x1212121212121212121212121212121212121212",
4395
- "apiKeyId": "key_precision_reconciliation",
4396
5316
  "createdAt": "2026-01-03T00:00:00.000Z",
5317
+ "creatorUserId": null,
4397
5318
  "deliveryStrategy": "provider",
4398
5319
  "destinationTokenKey": "eip155:4217/erc20:0x20c000000000000000000000b9537d11c60e8b50",
4399
5320
  "environment": "production",
@@ -4425,6 +5346,7 @@ describe('createTracker', () => {
4425
5346
  "sourceChainId": "eip155:8453",
4426
5347
  "sourceTokenKey": "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
4427
5348
  "status": "active",
5349
+ "statusUpdatedAt": Any<String>,
4428
5350
  "subsidize": false,
4429
5351
  "updatedAt": "2026-01-03T00:00:00.000Z",
4430
5352
  "version": 1,
@@ -4438,6 +5360,18 @@ describe('createTracker', () => {
4438
5360
  })
4439
5361
  })
4440
5362
 
5363
+ function providerOperationCounts(events: readonly Parameters<Metrics.Metrics['count']>[]) {
5364
+ const counts = new Map<string, number>()
5365
+ for (const [name, value, tags] of events) {
5366
+ if (name !== 'routes_provider_operation_count') continue
5367
+ const key = [tags?.['provider'], tags?.['operation'], tags?.['outcome'], tags?.['failure']]
5368
+ .filter(Boolean)
5369
+ .join(':')
5370
+ counts.set(key, (counts.get(key) ?? 0) + value)
5371
+ }
5372
+ return Object.fromEntries([...counts].sort(([a], [b]) => a.localeCompare(b)))
5373
+ }
5374
+
4441
5375
  function transferLog(options: transferLog.Options) {
4442
5376
  return {
4443
5377
  address: options.token,