tapimo 0.14.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 (1141) 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 +12457 -10365
  9. package/dist/App.d.ts.map +1 -1
  10. package/dist/App.js +300 -22
  11. package/dist/App.js.map +1 -1
  12. package/dist/Assets.d.ts.map +1 -1
  13. package/dist/Assets.js +2 -1
  14. package/dist/Assets.js.map +1 -1
  15. package/dist/Handler.d.ts +0 -1
  16. package/dist/Handler.d.ts.map +1 -1
  17. package/dist/Handler.js +0 -1
  18. package/dist/Handler.js.map +1 -1
  19. package/dist/Scope.d.ts +13 -5
  20. package/dist/Scope.d.ts.map +1 -1
  21. package/dist/Scope.js +16 -5
  22. package/dist/Scope.js.map +1 -1
  23. package/dist/Webhooks.js +1 -1
  24. package/dist/Webhooks.js.map +1 -1
  25. package/dist/admin/App.d.ts +3057 -549
  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 +1398 -0
  34. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  35. package/dist/admin/apps/earn-vaults.js +463 -7
  36. package/dist/admin/apps/earn-vaults.js.map +1 -1
  37. package/dist/admin/apps/organizations.d.ts +267 -15
  38. package/dist/admin/apps/organizations.d.ts.map +1 -1
  39. package/dist/admin/apps/organizations.js +241 -25
  40. package/dist/admin/apps/organizations.js.map +1 -1
  41. package/dist/admin/apps/routes-support.d.ts +95 -0
  42. package/dist/admin/apps/routes-support.d.ts.map +1 -0
  43. package/dist/admin/apps/routes-support.js +151 -0
  44. package/dist/admin/apps/routes-support.js.map +1 -0
  45. package/dist/admin/apps/routes.d.ts +2764 -0
  46. package/dist/admin/apps/routes.d.ts.map +1 -0
  47. package/dist/admin/apps/routes.js +728 -0
  48. package/dist/admin/apps/routes.js.map +1 -0
  49. package/dist/admin/apps/subsidies.d.ts +501 -0
  50. package/dist/admin/apps/subsidies.d.ts.map +1 -0
  51. package/dist/admin/apps/subsidies.js +384 -0
  52. package/dist/admin/apps/subsidies.js.map +1 -0
  53. package/dist/admin/apps/verified-tokens.d.ts +88 -88
  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 +37 -5
  76. package/dist/apps/Zones.js.map +1 -1
  77. package/dist/apps/data/App.d.ts +3971 -2595
  78. package/dist/apps/data/App.d.ts.map +1 -1
  79. package/dist/apps/data/App.js +76 -21
  80. package/dist/apps/data/App.js.map +1 -1
  81. package/dist/apps/data/routes/activities.d.ts +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 +72 -0
  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 +1450 -337
  92. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  93. package/dist/apps/data/routes/earn.js +1226 -144
  94. package/dist/apps/data/routes/earn.js.map +1 -1
  95. package/dist/apps/data/routes/fee-amm.d.ts +5 -0
  96. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  97. package/dist/apps/data/routes/fee-amm.js +31 -19
  98. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  99. package/dist/apps/data/routes/indexer.d.ts +125 -0
  100. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  101. package/dist/apps/data/routes/indexer.js +83 -27
  102. package/dist/apps/data/routes/indexer.js.map +1 -1
  103. package/dist/apps/data/routes/rpc.d.ts +507 -33
  104. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  105. package/dist/apps/data/routes/rpc.js +266 -156
  106. package/dist/apps/data/routes/rpc.js.map +1 -1
  107. package/dist/apps/data/routes/tokenlist.d.ts +47 -15
  108. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  109. package/dist/apps/data/routes/tokenlist.js +68 -11
  110. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  111. package/dist/apps/data/routes/tokens.d.ts +2 -0
  112. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  113. package/dist/apps/data/routes/tokens.js +26 -14
  114. package/dist/apps/data/routes/tokens.js.map +1 -1
  115. package/dist/apps/data/routes/transfers.d.ts +28 -12
  116. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  117. package/dist/apps/data/routes/transfers.js +9 -7
  118. package/dist/apps/data/routes/transfers.js.map +1 -1
  119. package/dist/apps/data/routes/valuation.d.ts +30 -30
  120. package/dist/apps/data/routes/verified-tokens.d.ts +9 -9
  121. package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -1
  122. package/dist/apps/data/routes/verified-tokens.js +64 -20
  123. package/dist/apps/data/routes/verified-tokens.js.map +1 -1
  124. package/dist/apps/data/routes/webhooks.d.ts +613 -176
  125. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  126. package/dist/apps/data/routes/webhooks.js +291 -195
  127. package/dist/apps/data/routes/webhooks.js.map +1 -1
  128. package/dist/apps/data/routes/zones.d.ts.map +1 -1
  129. package/dist/apps/data/routes/zones.js +20 -12
  130. package/dist/apps/data/routes/zones.js.map +1 -1
  131. package/dist/apps/docs/reference.js +2 -2
  132. package/dist/apps/docs/reference.js.map +1 -1
  133. package/dist/apps/index.d.ts +1 -1
  134. package/dist/apps/index.d.ts.map +1 -1
  135. package/dist/apps/index.js +1 -1
  136. package/dist/apps/index.js.map +1 -1
  137. package/dist/apps/management/App.d.ts +3763 -3385
  138. package/dist/apps/management/App.d.ts.map +1 -1
  139. package/dist/apps/management/App.js +5 -14
  140. package/dist/apps/management/App.js.map +1 -1
  141. package/dist/apps/management/Billing.d.ts +48 -7
  142. package/dist/apps/management/Billing.d.ts.map +1 -1
  143. package/dist/apps/management/Billing.js +204 -25
  144. package/dist/apps/management/Billing.js.map +1 -1
  145. package/dist/apps/management/routes/api-keys.d.ts +106 -4
  146. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  147. package/dist/apps/management/routes/api-keys.js +43 -15
  148. package/dist/apps/management/routes/api-keys.js.map +1 -1
  149. package/dist/apps/management/routes/billing.d.ts +290 -4
  150. package/dist/apps/management/routes/billing.d.ts.map +1 -1
  151. package/dist/apps/management/routes/billing.js +274 -49
  152. package/dist/apps/management/routes/billing.js.map +1 -1
  153. package/dist/apps/management/routes/faucet.d.ts +6 -6
  154. package/dist/apps/management/routes/faucet.js +1 -1
  155. package/dist/apps/management/routes/faucet.js.map +1 -1
  156. package/dist/apps/management/routes/invitations.d.ts +77 -2
  157. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  158. package/dist/apps/management/routes/invitations.js +117 -13
  159. package/dist/apps/management/routes/invitations.js.map +1 -1
  160. package/dist/apps/management/routes/invite-links.d.ts +4 -4
  161. package/dist/apps/management/routes/me.d.ts.map +1 -1
  162. package/dist/apps/management/routes/me.js +6 -2
  163. package/dist/apps/management/routes/me.js.map +1 -1
  164. package/dist/apps/management/routes/members.d.ts +30 -30
  165. package/dist/apps/management/routes/orgs.d.ts +18 -2
  166. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  167. package/dist/apps/management/routes/orgs.js +52 -12
  168. package/dist/apps/management/routes/orgs.js.map +1 -1
  169. package/dist/apps/management/routes/projects.d.ts +4 -4
  170. package/dist/apps/management/routes/projects.d.ts.map +1 -1
  171. package/dist/apps/management/routes/projects.js +6 -1
  172. package/dist/apps/management/routes/projects.js.map +1 -1
  173. package/dist/apps/management/routes/scopes.d.ts.map +1 -1
  174. package/dist/apps/management/routes/scopes.js +4 -1
  175. package/dist/apps/management/routes/scopes.js.map +1 -1
  176. package/dist/apps/management/routes/usage.d.ts +24 -24
  177. package/dist/apps/management/routes/usage.js +21 -4
  178. package/dist/apps/management/routes/usage.js.map +1 -1
  179. package/dist/apps/management/routes/verified-token-requests.d.ts +2 -2
  180. package/dist/apps/management/routes/webhooks.d.ts +280 -214
  181. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  182. package/dist/apps/management/routes/webhooks.js +58 -12
  183. package/dist/apps/management/routes/webhooks.js.map +1 -1
  184. package/dist/apps/mcp.d.ts +1 -1
  185. package/dist/apps/mcp.js +7 -7
  186. package/dist/apps/mcp.js.map +1 -1
  187. package/dist/apps/mpp/App.d.ts.map +1 -1
  188. package/dist/apps/mpp/App.js +35 -7
  189. package/dist/apps/mpp/App.js.map +1 -1
  190. package/dist/apps/mpp/internal/Adapter.d.ts +2 -0
  191. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -1
  192. package/dist/apps/mpp/internal/Adapter.js +30 -1
  193. package/dist/apps/mpp/internal/Adapter.js.map +1 -1
  194. package/dist/apps/mpp/internal/Policy.d.ts +22 -4
  195. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
  196. package/dist/apps/mpp/internal/Policy.js +24 -6
  197. package/dist/apps/mpp/internal/Policy.js.map +1 -1
  198. package/dist/apps/mpp/internal/Sponsorship.d.ts +3 -0
  199. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
  200. package/dist/apps/mpp/internal/Sponsorship.js +6 -3
  201. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
  202. package/dist/apps/relay/App.d.ts +2 -0
  203. package/dist/apps/relay/App.d.ts.map +1 -1
  204. package/dist/apps/relay/App.js +134 -75
  205. package/dist/apps/relay/App.js.map +1 -1
  206. package/dist/apps/relay/Sponsorships.d.ts +5 -3
  207. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  208. package/dist/apps/relay/Sponsorships.js +209 -28
  209. package/dist/apps/relay/Sponsorships.js.map +1 -1
  210. package/dist/apps/{funding → routes}/Access.d.ts +4 -4
  211. package/dist/apps/routes/Access.d.ts.map +1 -0
  212. package/dist/apps/{funding → routes}/Access.js +4 -4
  213. package/dist/apps/routes/Access.js.map +1 -0
  214. package/dist/apps/{funding → routes}/App.d.ts +418 -124
  215. package/dist/apps/{funding → routes}/App.d.ts.map +1 -1
  216. package/dist/apps/{funding → routes}/App.js +16 -16
  217. package/dist/apps/routes/App.js.map +1 -0
  218. package/dist/apps/routes/Inventory.d.ts.map +1 -0
  219. package/dist/apps/{funding → routes}/Inventory.js +2 -2
  220. package/dist/apps/routes/Inventory.js.map +1 -0
  221. package/dist/apps/routes/index.d.ts +2 -0
  222. package/dist/apps/routes/index.d.ts.map +1 -0
  223. package/dist/apps/routes/index.js +2 -0
  224. package/dist/apps/routes/index.js.map +1 -0
  225. package/dist/apps/{funding → routes}/routes/chains.d.ts +7 -7
  226. package/dist/apps/routes/routes/chains.d.ts.map +1 -0
  227. package/dist/apps/{funding → routes}/routes/chains.js +25 -25
  228. package/dist/apps/routes/routes/chains.js.map +1 -0
  229. package/dist/apps/{funding → routes}/routes/deposit-addresses.d.ts +107 -43
  230. package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -0
  231. package/dist/apps/{funding → routes}/routes/deposit-addresses.js +497 -222
  232. package/dist/apps/routes/routes/deposit-addresses.js.map +1 -0
  233. package/dist/apps/{funding → routes}/routes/providers.d.ts +8 -8
  234. package/dist/apps/routes/routes/providers.d.ts.map +1 -0
  235. package/dist/apps/routes/routes/providers.js +57 -0
  236. package/dist/apps/routes/routes/providers.js.map +1 -0
  237. package/dist/apps/{funding → routes}/routes/quotes.d.ts +19 -16
  238. package/dist/apps/routes/routes/quotes.d.ts.map +1 -0
  239. package/dist/apps/{funding → routes}/routes/quotes.js +55 -38
  240. package/dist/apps/routes/routes/quotes.js.map +1 -0
  241. package/dist/apps/{funding → routes}/routes/transfers.d.ts +379 -74
  242. package/dist/apps/routes/routes/transfers.d.ts.map +1 -0
  243. package/dist/apps/routes/routes/transfers.js +1140 -0
  244. package/dist/apps/routes/routes/transfers.js.map +1 -0
  245. package/dist/cli/Cli.d.ts +30 -0
  246. package/dist/cli/Cli.d.ts.map +1 -1
  247. package/dist/cli/commands/admin.d.ts +36 -0
  248. package/dist/cli/commands/admin.d.ts.map +1 -1
  249. package/dist/cli/commands/admin.js +273 -0
  250. package/dist/cli/commands/admin.js.map +1 -1
  251. package/dist/cloudflare.d.ts +16 -14
  252. package/dist/cloudflare.d.ts.map +1 -1
  253. package/dist/cloudflare.js +26 -21
  254. package/dist/cloudflare.js.map +1 -1
  255. package/dist/db/Db.d.ts +63 -21
  256. package/dist/db/Db.d.ts.map +1 -1
  257. package/dist/db/Db.js +1030 -15
  258. package/dist/db/Db.js.map +1 -1
  259. package/dist/db/Schema.d.ts +780 -133
  260. package/dist/db/Schema.d.ts.map +1 -1
  261. package/dist/db/Schema.js +575 -162
  262. package/dist/db/Schema.js.map +1 -1
  263. package/dist/db/tables/apiKeyAdmissionBootstraps.d.ts +4 -0
  264. package/dist/db/tables/apiKeyAdmissionBootstraps.d.ts.map +1 -0
  265. package/dist/db/tables/apiKeyAdmissionBootstraps.js +2 -0
  266. package/dist/db/tables/apiKeyAdmissionBootstraps.js.map +1 -0
  267. package/dist/db/tables/apiKeyAdmissions.d.ts +73 -0
  268. package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -0
  269. package/dist/db/tables/apiKeyAdmissions.js +142 -0
  270. package/dist/db/tables/apiKeyAdmissions.js.map +1 -0
  271. package/dist/db/tables/apiKeyOwnerAdmissions.d.ts +4 -0
  272. package/dist/db/tables/apiKeyOwnerAdmissions.d.ts.map +1 -0
  273. package/dist/db/tables/apiKeyOwnerAdmissions.js +2 -0
  274. package/dist/db/tables/apiKeyOwnerAdmissions.js.map +1 -0
  275. package/dist/db/tables/apiKeyOwnerTombstones.d.ts +20 -0
  276. package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -0
  277. package/dist/db/tables/apiKeyOwnerTombstones.js +57 -0
  278. package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -0
  279. package/dist/db/tables/apiKeyRevocations.d.ts +21 -0
  280. package/dist/db/tables/apiKeyRevocations.d.ts.map +1 -0
  281. package/dist/db/tables/apiKeyRevocations.js +98 -0
  282. package/dist/db/tables/apiKeyRevocations.js.map +1 -0
  283. package/dist/db/tables/authAccounts.d.ts +47 -0
  284. package/dist/db/tables/authAccounts.d.ts.map +1 -0
  285. package/dist/db/tables/authAccounts.js +72 -0
  286. package/dist/db/tables/authAccounts.js.map +1 -0
  287. package/dist/db/tables/authSessions.d.ts +12 -0
  288. package/dist/db/tables/authSessions.d.ts.map +1 -0
  289. package/dist/db/tables/authSessions.js +2 -0
  290. package/dist/db/tables/authSessions.js.map +1 -0
  291. package/dist/db/tables/authVerifications.d.ts +12 -0
  292. package/dist/db/tables/authVerifications.d.ts.map +1 -0
  293. package/dist/db/tables/authVerifications.js +2 -0
  294. package/dist/db/tables/authVerifications.js.map +1 -0
  295. package/dist/db/tables/invitations.d.ts +17 -1
  296. package/dist/db/tables/invitations.d.ts.map +1 -1
  297. package/dist/db/tables/invitations.js +123 -43
  298. package/dist/db/tables/invitations.js.map +1 -1
  299. package/dist/db/tables/memberships.d.ts +8 -0
  300. package/dist/db/tables/memberships.d.ts.map +1 -1
  301. package/dist/db/tables/memberships.js +51 -2
  302. package/dist/db/tables/memberships.js.map +1 -1
  303. package/dist/db/tables/organizations.d.ts +32 -10
  304. package/dist/db/tables/organizations.d.ts.map +1 -1
  305. package/dist/db/tables/organizations.js +110 -49
  306. package/dist/db/tables/organizations.js.map +1 -1
  307. package/dist/db/tables/projects.d.ts +2 -0
  308. package/dist/db/tables/projects.d.ts.map +1 -1
  309. package/dist/db/tables/projects.js +12 -3
  310. package/dist/db/tables/projects.js.map +1 -1
  311. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  312. package/dist/db/tables/requestUsage.js.map +1 -1
  313. package/dist/db/tables/rewardAccounts.d.ts +86 -0
  314. package/dist/db/tables/rewardAccounts.d.ts.map +1 -0
  315. package/dist/db/tables/rewardAccounts.js +88 -0
  316. package/dist/db/tables/rewardAccounts.js.map +1 -0
  317. package/dist/db/tables/rewardCampaignDistributors.d.ts +36 -0
  318. package/dist/db/tables/rewardCampaignDistributors.d.ts.map +1 -0
  319. package/dist/db/tables/rewardCampaignDistributors.js +30 -0
  320. package/dist/db/tables/rewardCampaignDistributors.js.map +1 -0
  321. package/dist/db/tables/rewardCampaigns.d.ts +171 -0
  322. package/dist/db/tables/rewardCampaigns.d.ts.map +1 -0
  323. package/dist/db/tables/rewardCampaigns.js +392 -0
  324. package/dist/db/tables/rewardCampaigns.js.map +1 -0
  325. package/dist/db/tables/rewardCredits.d.ts +53 -0
  326. package/dist/db/tables/rewardCredits.d.ts.map +1 -0
  327. package/dist/db/tables/rewardCredits.js +63 -0
  328. package/dist/db/tables/rewardCredits.js.map +1 -0
  329. package/dist/db/tables/rewardEligibilityAssociations.d.ts +61 -0
  330. package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -0
  331. package/dist/db/tables/rewardEligibilityAssociations.js +103 -0
  332. package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -0
  333. package/dist/db/tables/rewardRuns.d.ts +188 -0
  334. package/dist/db/tables/rewardRuns.d.ts.map +1 -0
  335. package/dist/db/tables/rewardRuns.js +278 -0
  336. package/dist/db/tables/rewardRuns.js.map +1 -0
  337. package/dist/db/tables/rewardTransactionAttempts.d.ts +100 -0
  338. package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -0
  339. package/dist/db/tables/rewardTransactionAttempts.js +163 -0
  340. package/dist/db/tables/rewardTransactionAttempts.js.map +1 -0
  341. package/dist/db/tables/routesCatalog.d.ts +58 -0
  342. package/dist/db/tables/routesCatalog.d.ts.map +1 -0
  343. package/dist/db/tables/{fundingCatalog.js → routesCatalog.js} +19 -19
  344. package/dist/db/tables/routesCatalog.js.map +1 -0
  345. package/dist/db/tables/routesDepositAddresses.d.ts +476 -0
  346. package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -0
  347. package/dist/db/tables/routesDepositAddresses.js +587 -0
  348. package/dist/db/tables/routesDepositAddresses.js.map +1 -0
  349. package/dist/db/tables/{fundingDepositRequestObservations.d.ts → routesDepositRequestObservations.d.ts} +6 -6
  350. package/dist/db/tables/routesDepositRequestObservations.d.ts.map +1 -0
  351. package/dist/db/tables/{fundingDepositRequestObservations.js → routesDepositRequestObservations.js} +6 -6
  352. package/dist/db/tables/routesDepositRequestObservations.js.map +1 -0
  353. package/dist/db/tables/{fundingDeposits.d.ts → routesDeposits.d.ts} +210 -22
  354. package/dist/db/tables/routesDeposits.d.ts.map +1 -0
  355. package/dist/db/tables/routesDeposits.js +576 -0
  356. package/dist/db/tables/routesDeposits.js.map +1 -0
  357. package/dist/db/tables/routesIdempotency.d.ts +166 -0
  358. package/dist/db/tables/routesIdempotency.d.ts.map +1 -0
  359. package/dist/db/tables/routesIdempotency.js +330 -0
  360. package/dist/db/tables/routesIdempotency.js.map +1 -0
  361. package/dist/db/tables/routesSubsidies.d.ts +27 -0
  362. package/dist/db/tables/routesSubsidies.d.ts.map +1 -0
  363. package/dist/db/tables/routesSubsidies.js +45 -0
  364. package/dist/db/tables/routesSubsidies.js.map +1 -0
  365. package/dist/db/tables/{fundingTransferEvents.d.ts → routesTransferEvents.d.ts} +3 -3
  366. package/dist/db/tables/routesTransferEvents.d.ts.map +1 -0
  367. package/dist/db/tables/{fundingTransferEvents.js → routesTransferEvents.js} +3 -3
  368. package/dist/db/tables/routesTransferEvents.js.map +1 -0
  369. package/dist/db/tables/routesTransferSubsidies.d.ts +19 -0
  370. package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -0
  371. package/dist/db/tables/routesTransferSubsidies.js +17 -0
  372. package/dist/db/tables/routesTransferSubsidies.js.map +1 -0
  373. package/dist/db/tables/routesTransferSubsidyNonces.d.ts +51 -0
  374. package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -0
  375. package/dist/db/tables/routesTransferSubsidyNonces.js +82 -0
  376. package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -0
  377. package/dist/db/tables/routesTransferTransactions.d.ts +77 -0
  378. package/dist/db/tables/routesTransferTransactions.d.ts.map +1 -0
  379. package/dist/db/tables/{fundingTransferTransactions.js → routesTransferTransactions.js} +31 -13
  380. package/dist/db/tables/routesTransferTransactions.js.map +1 -0
  381. package/dist/db/tables/routesTransfers.d.ts +319 -0
  382. package/dist/db/tables/routesTransfers.d.ts.map +1 -0
  383. package/dist/db/tables/routesTransfers.js +372 -0
  384. package/dist/db/tables/routesTransfers.js.map +1 -0
  385. package/dist/db/tables/sponsoredTransactions.d.ts +75 -20
  386. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  387. package/dist/db/tables/sponsoredTransactions.js +124 -54
  388. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  389. package/dist/db/tables/sponsorshipAttributions.d.ts +69 -0
  390. package/dist/db/tables/sponsorshipAttributions.d.ts.map +1 -0
  391. package/dist/db/tables/sponsorshipAttributions.js +77 -0
  392. package/dist/db/tables/sponsorshipAttributions.js.map +1 -0
  393. package/dist/db/tables/sponsorshipReconciliationCursors.d.ts +22 -0
  394. package/dist/db/tables/sponsorshipReconciliationCursors.d.ts.map +1 -0
  395. package/dist/db/tables/sponsorshipReconciliationCursors.js +45 -0
  396. package/dist/db/tables/sponsorshipReconciliationCursors.js.map +1 -0
  397. package/dist/db/tables/stripeCustomers.d.ts +11 -0
  398. package/dist/db/tables/stripeCustomers.d.ts.map +1 -1
  399. package/dist/db/tables/stripeCustomers.js +13 -0
  400. package/dist/db/tables/stripeCustomers.js.map +1 -1
  401. package/dist/db/tables/users.d.ts +17 -1
  402. package/dist/db/tables/users.d.ts.map +1 -1
  403. package/dist/db/tables/users.js +47 -2
  404. package/dist/db/tables/users.js.map +1 -1
  405. package/dist/db/tables/webhookQueueEvents.d.ts.map +1 -1
  406. package/dist/db/tables/webhookQueueEvents.js +5 -1
  407. package/dist/db/tables/webhookQueueEvents.js.map +1 -1
  408. package/dist/db/tables/webhookSubscriptions.d.ts +19 -11
  409. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  410. package/dist/db/tables/webhookSubscriptions.js +45 -13
  411. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  412. package/dist/handlers/internal/executionError.d.ts +2 -2
  413. package/dist/handlers/internal/executionError.d.ts.map +1 -1
  414. package/dist/handlers/internal/executionError.js +1 -2
  415. package/dist/handlers/internal/executionError.js.map +1 -1
  416. package/dist/handlers/internal/multisig.d.ts +4 -232
  417. package/dist/handlers/internal/multisig.d.ts.map +1 -1
  418. package/dist/handlers/internal/multisig.js +11 -537
  419. package/dist/handlers/internal/multisig.js.map +1 -1
  420. package/dist/handlers/internal/sponsorship.d.ts +19 -8
  421. package/dist/handlers/internal/sponsorship.d.ts.map +1 -1
  422. package/dist/handlers/internal/sponsorship.js +13 -9
  423. package/dist/handlers/internal/sponsorship.js.map +1 -1
  424. package/dist/handlers/relay.d.ts +9 -12
  425. package/dist/handlers/relay.d.ts.map +1 -1
  426. package/dist/handlers/relay.js +81 -85
  427. package/dist/handlers/relay.js.map +1 -1
  428. package/dist/index.d.ts +0 -17
  429. package/dist/index.d.ts.map +1 -1
  430. package/dist/index.js +0 -17
  431. package/dist/index.js.map +1 -1
  432. package/dist/internal/AssetResponse.d.ts +12 -0
  433. package/dist/internal/AssetResponse.d.ts.map +1 -0
  434. package/dist/internal/AssetResponse.js +21 -0
  435. package/dist/internal/AssetResponse.js.map +1 -0
  436. package/dist/internal/Auth.d.ts +48 -12
  437. package/dist/internal/Auth.d.ts.map +1 -1
  438. package/dist/internal/Auth.js +603 -175
  439. package/dist/internal/Auth.js.map +1 -1
  440. package/dist/internal/BetterAuth.d.ts +1488 -0
  441. package/dist/internal/BetterAuth.d.ts.map +1 -0
  442. package/dist/internal/BetterAuth.js +253 -0
  443. package/dist/internal/BetterAuth.js.map +1 -0
  444. package/dist/internal/Cache.d.ts +2 -0
  445. package/dist/internal/Cache.d.ts.map +1 -1
  446. package/dist/internal/Cache.js +2 -0
  447. package/dist/internal/Cache.js.map +1 -1
  448. package/dist/internal/EarnRates.d.ts +26 -3
  449. package/dist/internal/EarnRates.d.ts.map +1 -1
  450. package/dist/internal/EarnRates.js +84 -19
  451. package/dist/internal/EarnRates.js.map +1 -1
  452. package/dist/internal/EarnSharePrices.d.ts +120 -0
  453. package/dist/internal/EarnSharePrices.d.ts.map +1 -0
  454. package/dist/internal/EarnSharePrices.js +179 -0
  455. package/dist/internal/EarnSharePrices.js.map +1 -0
  456. package/dist/internal/EarnVaults.d.ts +4 -0
  457. package/dist/internal/EarnVaults.d.ts.map +1 -1
  458. package/dist/internal/EarnVaults.js +27 -10
  459. package/dist/internal/EarnVaults.js.map +1 -1
  460. package/dist/internal/Email.d.ts +37 -0
  461. package/dist/internal/Email.d.ts.map +1 -0
  462. package/dist/internal/Email.js +16 -0
  463. package/dist/internal/Email.js.map +1 -0
  464. package/dist/internal/Log.d.ts +32 -28
  465. package/dist/internal/Log.d.ts.map +1 -1
  466. package/dist/internal/Log.js +18 -11
  467. package/dist/internal/Log.js.map +1 -1
  468. package/dist/internal/MetricSink.d.ts +3 -0
  469. package/dist/internal/MetricSink.d.ts.map +1 -1
  470. package/dist/internal/MetricSink.js +67 -8
  471. package/dist/internal/MetricSink.js.map +1 -1
  472. package/dist/internal/Mpp.d.ts.map +1 -1
  473. package/dist/internal/Mpp.js +20 -25
  474. package/dist/internal/Mpp.js.map +1 -1
  475. package/dist/internal/OpenApi.d.ts +26 -3
  476. package/dist/internal/OpenApi.d.ts.map +1 -1
  477. package/dist/internal/OpenApi.js +25 -10
  478. package/dist/internal/OpenApi.js.map +1 -1
  479. package/dist/internal/Provider.d.ts +1 -1
  480. package/dist/internal/Provider.d.ts.map +1 -1
  481. package/dist/internal/RateLimit.d.ts.map +1 -1
  482. package/dist/internal/RateLimit.js +13 -1
  483. package/dist/internal/RateLimit.js.map +1 -1
  484. package/dist/internal/Store.d.ts +16 -0
  485. package/dist/internal/Store.d.ts.map +1 -1
  486. package/dist/internal/Store.js +59 -8
  487. package/dist/internal/Store.js.map +1 -1
  488. package/dist/internal/Tidx.d.ts +9 -2
  489. package/dist/internal/Tidx.d.ts.map +1 -1
  490. package/dist/internal/Tidx.js +78 -11
  491. package/dist/internal/Tidx.js.map +1 -1
  492. package/dist/internal/Timing.d.ts +26 -0
  493. package/dist/internal/Timing.d.ts.map +1 -1
  494. package/dist/internal/Timing.js +63 -5
  495. package/dist/internal/Timing.js.map +1 -1
  496. package/dist/internal/VercelOidc.d.ts +94 -0
  497. package/dist/internal/VercelOidc.d.ts.map +1 -0
  498. package/dist/internal/VercelOidc.js +128 -0
  499. package/dist/internal/VercelOidc.js.map +1 -0
  500. package/dist/internal/VerifiedTokens.d.ts +2 -8
  501. package/dist/internal/VerifiedTokens.d.ts.map +1 -1
  502. package/dist/internal/VerifiedTokens.js +24 -24
  503. package/dist/internal/VerifiedTokens.js.map +1 -1
  504. package/dist/internal/Viem.d.ts +30 -2067
  505. package/dist/internal/Viem.d.ts.map +1 -1
  506. package/dist/internal/Viem.js +167 -17
  507. package/dist/internal/Viem.js.map +1 -1
  508. package/dist/internal/Webhooks.d.ts +12 -4
  509. package/dist/internal/Webhooks.d.ts.map +1 -1
  510. package/dist/internal/Webhooks.js +9 -3
  511. package/dist/internal/Webhooks.js.map +1 -1
  512. package/dist/internal/ZoneRpc.d.ts +7 -0
  513. package/dist/internal/ZoneRpc.d.ts.map +1 -0
  514. package/dist/internal/ZoneRpc.js +49 -0
  515. package/dist/internal/ZoneRpc.js.map +1 -0
  516. package/dist/internal/index.d.ts +3 -1
  517. package/dist/internal/index.d.ts.map +1 -1
  518. package/dist/internal/index.js +3 -1
  519. package/dist/internal/index.js.map +1 -1
  520. package/dist/internal/rewards/Audit.d.ts +88 -0
  521. package/dist/internal/rewards/Audit.d.ts.map +1 -0
  522. package/dist/internal/rewards/Audit.js +134 -0
  523. package/dist/internal/rewards/Audit.js.map +1 -0
  524. package/dist/internal/rewards/Campaigns.d.ts +572 -0
  525. package/dist/internal/rewards/Campaigns.d.ts.map +1 -0
  526. package/dist/internal/rewards/Campaigns.js +531 -0
  527. package/dist/internal/rewards/Campaigns.js.map +1 -0
  528. package/dist/internal/rewards/Credits.d.ts +76 -0
  529. package/dist/internal/rewards/Credits.d.ts.map +1 -0
  530. package/dist/internal/rewards/Credits.js +95 -0
  531. package/dist/internal/rewards/Credits.js.map +1 -0
  532. package/dist/internal/rewards/Events.d.ts +100 -0
  533. package/dist/internal/rewards/Events.d.ts.map +1 -0
  534. package/dist/internal/rewards/Events.js +340 -0
  535. package/dist/internal/rewards/Events.js.map +1 -0
  536. package/dist/internal/rewards/Projection.d.ts +237 -0
  537. package/dist/internal/rewards/Projection.d.ts.map +1 -0
  538. package/dist/internal/rewards/Projection.js +616 -0
  539. package/dist/internal/rewards/Projection.js.map +1 -0
  540. package/dist/internal/rewards/Rates.d.ts +44 -0
  541. package/dist/internal/rewards/Rates.d.ts.map +1 -0
  542. package/dist/internal/rewards/Rates.js +60 -0
  543. package/dist/internal/rewards/Rates.js.map +1 -0
  544. package/dist/internal/rewards/Read.d.ts +158 -0
  545. package/dist/internal/rewards/Read.d.ts.map +1 -0
  546. package/dist/internal/rewards/Read.js +292 -0
  547. package/dist/internal/rewards/Read.js.map +1 -0
  548. package/dist/internal/rewards/Runner.d.ts +164 -0
  549. package/dist/internal/rewards/Runner.d.ts.map +1 -0
  550. package/dist/internal/rewards/Runner.js +1778 -0
  551. package/dist/internal/rewards/Runner.js.map +1 -0
  552. package/dist/internal/rewards/Signer.d.ts +224 -0
  553. package/dist/internal/rewards/Signer.d.ts.map +1 -0
  554. package/dist/internal/rewards/Signer.js +135 -0
  555. package/dist/internal/rewards/Signer.js.map +1 -0
  556. package/dist/internal/rewards/index.d.ts +15 -0
  557. package/dist/internal/rewards/index.d.ts.map +1 -0
  558. package/dist/internal/rewards/index.js +15 -0
  559. package/dist/internal/rewards/index.js.map +1 -0
  560. package/dist/internal/{funding → routes}/Action.d.ts +12 -1
  561. package/dist/internal/routes/Action.d.ts.map +1 -0
  562. package/dist/internal/{funding → routes}/Action.js +17 -9
  563. package/dist/internal/routes/Action.js.map +1 -0
  564. package/dist/internal/{funding → routes}/Catalog.d.ts +20 -20
  565. package/dist/internal/routes/Catalog.d.ts.map +1 -0
  566. package/dist/internal/{funding → routes}/Catalog.js +29 -29
  567. package/dist/internal/routes/Catalog.js.map +1 -0
  568. package/dist/internal/{funding → routes}/Chain.d.ts +10 -10
  569. package/dist/internal/routes/Chain.d.ts.map +1 -0
  570. package/dist/internal/{funding → routes}/Chain.js +3 -3
  571. package/dist/internal/routes/Chain.js.map +1 -0
  572. package/dist/internal/{funding → routes}/Deposit.d.ts +45 -23
  573. package/dist/internal/routes/Deposit.d.ts.map +1 -0
  574. package/dist/internal/{funding → routes}/Deposit.js +60 -27
  575. package/dist/internal/routes/Deposit.js.map +1 -0
  576. package/dist/internal/{funding → routes}/DepositAddress.d.ts +56 -27
  577. package/dist/internal/routes/DepositAddress.d.ts.map +1 -0
  578. package/dist/internal/{funding → routes}/DepositAddress.js +95 -33
  579. package/dist/internal/routes/DepositAddress.js.map +1 -0
  580. package/dist/internal/{funding → routes}/DepositWebhook.d.ts +4 -4
  581. package/dist/internal/routes/DepositWebhook.d.ts.map +1 -0
  582. package/dist/internal/{funding → routes}/DepositWebhook.js +4 -4
  583. package/dist/internal/routes/DepositWebhook.js.map +1 -0
  584. package/dist/internal/routes/Economics.d.ts +25 -0
  585. package/dist/internal/routes/Economics.d.ts.map +1 -0
  586. package/dist/internal/routes/Economics.js +28 -0
  587. package/dist/internal/routes/Economics.js.map +1 -0
  588. package/dist/internal/{funding → routes}/Evidence.d.ts +3 -3
  589. package/dist/internal/routes/Evidence.d.ts.map +1 -0
  590. package/dist/internal/{funding → routes}/Evidence.js +7 -7
  591. package/dist/internal/routes/Evidence.js.map +1 -0
  592. package/dist/internal/routes/Observability.d.ts +154 -0
  593. package/dist/internal/routes/Observability.d.ts.map +1 -0
  594. package/dist/internal/routes/Observability.js +389 -0
  595. package/dist/internal/routes/Observability.js.map +1 -0
  596. package/dist/internal/{funding → routes}/Provider.d.ts +311 -105
  597. package/dist/internal/routes/Provider.d.ts.map +1 -0
  598. package/dist/internal/{funding → routes}/Provider.js +229 -98
  599. package/dist/internal/routes/Provider.js.map +1 -0
  600. package/dist/internal/{funding → routes}/Reconciliation.d.ts +11 -6
  601. package/dist/internal/routes/Reconciliation.d.ts.map +1 -0
  602. package/dist/internal/{funding → routes}/Reconciliation.js +408 -158
  603. package/dist/internal/routes/Reconciliation.js.map +1 -0
  604. package/dist/internal/routes/Route.d.ts +21 -0
  605. package/dist/internal/routes/Route.d.ts.map +1 -0
  606. package/dist/internal/{funding → routes}/Route.js +1 -1
  607. package/dist/internal/routes/Route.js.map +1 -0
  608. package/dist/internal/{funding → routes}/SourceObservation.d.ts +6 -6
  609. package/dist/internal/routes/SourceObservation.d.ts.map +1 -0
  610. package/dist/internal/{funding → routes}/SourceObservation.js +8 -8
  611. package/dist/internal/routes/SourceObservation.js.map +1 -0
  612. package/dist/internal/{funding → routes}/Subsidy.d.ts +48 -3
  613. package/dist/internal/routes/Subsidy.d.ts.map +1 -0
  614. package/dist/internal/{funding → routes}/Subsidy.js +43 -3
  615. package/dist/internal/routes/Subsidy.js.map +1 -0
  616. package/dist/internal/{funding → routes}/Token.d.ts +4 -4
  617. package/dist/internal/routes/Token.d.ts.map +1 -0
  618. package/dist/internal/{funding → routes}/Token.js +3 -3
  619. package/dist/internal/routes/Token.js.map +1 -0
  620. package/dist/internal/{funding → routes}/Transfer.d.ts +241 -46
  621. package/dist/internal/routes/Transfer.d.ts.map +1 -0
  622. package/dist/internal/routes/Transfer.js +728 -0
  623. package/dist/internal/routes/Transfer.js.map +1 -0
  624. package/dist/internal/{funding → routes}/TransferReconciliation.d.ts +13 -10
  625. package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -0
  626. package/dist/internal/routes/TransferReconciliation.js +422 -0
  627. package/dist/internal/routes/TransferReconciliation.js.map +1 -0
  628. package/dist/internal/routes/TransferSubsidy.d.ts +201 -0
  629. package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -0
  630. package/dist/internal/routes/TransferSubsidy.js +256 -0
  631. package/dist/internal/routes/TransferSubsidy.js.map +1 -0
  632. package/dist/internal/{funding → routes}/TransferWebhook.d.ts +5 -5
  633. package/dist/internal/routes/TransferWebhook.d.ts.map +1 -0
  634. package/dist/internal/{funding → routes}/TransferWebhook.js +3 -3
  635. package/dist/internal/routes/TransferWebhook.js.map +1 -0
  636. package/dist/internal/{funding → routes}/index.d.ts +2 -0
  637. package/dist/internal/routes/index.d.ts.map +1 -0
  638. package/dist/internal/{funding → routes}/index.js +2 -0
  639. package/dist/internal/routes/index.js.map +1 -0
  640. package/dist/internal/{funding → routes}/providers/across.d.ts +4 -4
  641. package/dist/internal/routes/providers/across.d.ts.map +1 -0
  642. package/dist/internal/{funding → routes}/providers/across.js +13 -13
  643. package/dist/internal/routes/providers/across.js.map +1 -0
  644. package/dist/internal/{funding → routes}/providers/relay.d.ts +21 -12
  645. package/dist/internal/routes/providers/relay.d.ts.map +1 -0
  646. package/dist/internal/{funding → routes}/providers/relay.js +194 -110
  647. package/dist/internal/routes/providers/relay.js.map +1 -0
  648. package/dist/internal/{funding → routes}/providers/rhino.d.ts +4 -4
  649. package/dist/internal/routes/providers/rhino.d.ts.map +1 -0
  650. package/dist/internal/{funding → routes}/providers/rhino.js +10 -10
  651. package/dist/internal/routes/providers/rhino.js.map +1 -0
  652. package/dist/internal/{funding → routes}/providers/squid.d.ts +4 -4
  653. package/dist/internal/routes/providers/squid.d.ts.map +1 -0
  654. package/dist/internal/{funding → routes}/providers/squid.js +14 -14
  655. package/dist/internal/routes/providers/squid.js.map +1 -0
  656. package/dist/internal/{funding → routes}/providers/stargate.d.ts +46 -18
  657. package/dist/internal/routes/providers/stargate.d.ts.map +1 -0
  658. package/dist/internal/routes/providers/stargate.js +898 -0
  659. package/dist/internal/routes/providers/stargate.js.map +1 -0
  660. package/dist/internal/{funding → routes}/providers/symbiosis.d.ts +4 -4
  661. package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -0
  662. package/dist/internal/{funding → routes}/providers/symbiosis.js +30 -20
  663. package/dist/internal/routes/providers/symbiosis.js.map +1 -0
  664. package/dist/internal/webhookDestinations/slack.js +12 -12
  665. package/dist/internal/webhookDestinations/slack.js.map +1 -1
  666. package/dist/providers/index.d.ts +12 -12
  667. package/dist/providers/index.d.ts.map +1 -1
  668. package/dist/providers/index.js +12 -12
  669. package/dist/providers/index.js.map +1 -1
  670. package/dist/server.d.ts +19 -0
  671. package/dist/server.d.ts.map +1 -0
  672. package/dist/server.js +19 -0
  673. package/dist/server.js.map +1 -0
  674. package/package.json +15 -4
  675. package/src/ApiKey.ts +1 -1
  676. package/src/ApiKeys.test.ts +1033 -3
  677. package/src/ApiKeys.ts +489 -48
  678. package/src/App.test-d.ts +1 -1
  679. package/src/App.test.ts +216 -25
  680. package/src/App.ts +334 -31
  681. package/src/Assets.test.ts +2 -2
  682. package/src/Assets.ts +3 -1
  683. package/src/Auth.test-d.ts +1 -1
  684. package/src/Client.test-d.ts +539 -110
  685. package/src/Handler.ts +0 -1
  686. package/src/OpenApi.contract.test.ts +195 -0
  687. package/src/Scope.ts +17 -5
  688. package/src/Webhooks.ts +1 -1
  689. package/src/admin/App.test.ts +30 -2
  690. package/src/admin/App.ts +42 -6
  691. package/src/admin/apps/api-keys.test.ts +267 -5
  692. package/src/admin/apps/api-keys.ts +100 -50
  693. package/src/admin/apps/earn-vaults.test.ts +158 -0
  694. package/src/admin/apps/earn-vaults.ts +679 -6
  695. package/src/admin/apps/organizations.test.ts +306 -17
  696. package/src/admin/apps/organizations.ts +299 -24
  697. package/src/admin/apps/routes-support.test.ts +200 -0
  698. package/src/admin/apps/routes-support.ts +201 -0
  699. package/src/admin/apps/routes.test.ts +450 -0
  700. package/src/admin/apps/routes.ts +896 -0
  701. package/src/admin/apps/scopes.test.ts +15 -5
  702. package/src/admin/apps/subsidies.test.ts +306 -0
  703. package/src/admin/apps/subsidies.ts +457 -0
  704. package/src/admin/apps/verified-tokens.test.ts +8 -3
  705. package/src/admin/apps/verified-tokens.ts +3 -3
  706. package/src/admin/ui/plugin.ts +1 -2
  707. package/src/admin/ui/src/components/RewardCampaignForm.tsx +1009 -0
  708. package/src/admin/ui/src/lib/config.ts +11 -2
  709. package/src/admin/ui/src/lib/earn-vaults.ts +2 -2
  710. package/src/admin/ui/src/lib/organizations.test.ts +83 -50
  711. package/src/admin/ui/src/lib/organizations.ts +106 -25
  712. package/src/admin/ui/src/lib/query-client.ts +1 -1
  713. package/src/admin/ui/src/lib/reward-campaigns.ts +136 -0
  714. package/src/admin/ui/src/lib/routes.test.ts +88 -0
  715. package/src/admin/ui/src/lib/routes.ts +304 -0
  716. package/src/admin/ui/src/lib/subsidies.ts +75 -0
  717. package/src/admin/ui/src/routeTree.gen.ts +63 -0
  718. package/src/admin/ui/src/routes/__root.tsx +12 -1
  719. package/src/admin/ui/src/routes/api-keys.tsx +196 -84
  720. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +105 -70
  721. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +239 -23
  722. package/src/admin/ui/src/routes/routes.tsx +1615 -0
  723. package/src/admin/ui/src/routes/routes_.support.tsx +248 -0
  724. package/src/admin/ui/src/routes/subsidies.tsx +799 -0
  725. package/src/admin/ui.generated.ts +144 -69
  726. package/src/analytics/Analytics.test.ts +108 -18
  727. package/src/analytics/Analytics.ts +38 -6
  728. package/src/analytics/tables/requestEvents.test.ts +100 -0
  729. package/src/analytics/tables/requestEvents.ts +10 -1
  730. package/src/analytics/tables/routesLifecycleIntervals.ts +140 -0
  731. package/src/apps/Zones.test.ts +15 -0
  732. package/src/apps/Zones.ts +52 -5
  733. package/src/apps/composition.test.ts +68 -60
  734. package/src/apps/data/App.test.ts +154 -2
  735. package/src/apps/data/App.ts +88 -28
  736. package/src/apps/data/routes/activities.test.ts +419 -7
  737. package/src/apps/data/routes/activities.ts +683 -216
  738. package/src/apps/data/routes/balances.test.ts +2 -2
  739. package/src/apps/data/routes/blocks.test.ts +46 -1
  740. package/src/apps/data/routes/coingecko.test.ts +419 -1
  741. package/src/apps/data/routes/coingecko.ts +309 -253
  742. package/src/apps/data/routes/earn.discovery.test.ts +274 -0
  743. package/src/apps/data/routes/earn.test.ts +1294 -17
  744. package/src/apps/data/routes/earn.ts +1838 -321
  745. package/src/apps/data/routes/exchanges.test.ts +12 -15
  746. package/src/apps/data/routes/fee-amm.test.ts +224 -0
  747. package/src/apps/data/routes/fee-amm.ts +191 -160
  748. package/src/apps/data/routes/indexer.test.ts +389 -0
  749. package/src/apps/data/routes/indexer.ts +165 -69
  750. package/src/apps/data/routes/receipts.test.ts +1 -1
  751. package/src/apps/data/routes/rpc.test.ts +352 -8
  752. package/src/apps/data/routes/rpc.ts +407 -219
  753. package/src/apps/data/routes/rpc.zone.test.ts +340 -0
  754. package/src/apps/data/routes/tokenlist.test.ts +285 -0
  755. package/src/apps/data/routes/tokenlist.ts +173 -88
  756. package/src/apps/data/routes/tokens.test.ts +93 -3
  757. package/src/apps/data/routes/tokens.ts +39 -23
  758. package/src/apps/data/routes/transactions.test.ts +1 -1
  759. package/src/apps/data/routes/transfers.test.ts +56 -24
  760. package/src/apps/data/routes/transfers.ts +19 -8
  761. package/src/apps/data/routes/valuation.test.ts +1 -1
  762. package/src/apps/data/routes/verified-tokens.test.ts +345 -0
  763. package/src/apps/data/routes/verified-tokens.ts +99 -29
  764. package/src/apps/data/routes/webhooks.test.ts +645 -83
  765. package/src/apps/data/routes/webhooks.ts +1089 -857
  766. package/src/apps/data/routes/zones.test.ts +148 -71
  767. package/src/apps/data/routes/zones.ts +71 -55
  768. package/src/apps/docs/reference.ts +2 -2
  769. package/src/apps/index.ts +1 -1
  770. package/src/apps/management/App.ts +9 -51
  771. package/src/apps/management/Billing.test.ts +375 -14
  772. package/src/apps/management/Billing.ts +265 -29
  773. package/src/apps/management/routes/api-keys.test.ts +269 -7
  774. package/src/apps/management/routes/api-keys.ts +61 -20
  775. package/src/apps/management/routes/billing.test.ts +477 -15
  776. package/src/apps/management/routes/billing.ts +377 -50
  777. package/src/apps/management/routes/faucet.test.ts +1 -1
  778. package/src/apps/management/routes/faucet.ts +1 -1
  779. package/src/apps/management/routes/invitations.test.ts +270 -3
  780. package/src/apps/management/routes/invitations.ts +185 -15
  781. package/src/apps/management/routes/invoicePreview.test.ts +549 -0
  782. package/src/apps/management/routes/me.test.ts +246 -5
  783. package/src/apps/management/routes/me.ts +7 -2
  784. package/src/apps/management/routes/members.test.ts +108 -0
  785. package/src/apps/management/routes/orgs.test.ts +191 -3
  786. package/src/apps/management/routes/orgs.ts +58 -11
  787. package/src/apps/management/routes/projects.test.ts +33 -3
  788. package/src/apps/management/routes/projects.ts +6 -1
  789. package/src/apps/management/routes/scopes.test.ts +30 -2
  790. package/src/apps/management/routes/scopes.ts +4 -1
  791. package/src/apps/management/routes/usage.test.ts +32 -0
  792. package/src/apps/management/routes/usage.ts +22 -4
  793. package/src/apps/management/routes/webhooks.test.ts +49 -26
  794. package/src/apps/management/routes/webhooks.ts +78 -22
  795. package/src/apps/mcp.test.ts +6 -6
  796. package/src/apps/mcp.ts +7 -7
  797. package/src/apps/mpp/App.ts +37 -7
  798. package/src/apps/mpp/Mpp.test.ts +49 -8
  799. package/src/apps/mpp/Mpp.zone.test.ts +219 -0
  800. package/src/apps/mpp/internal/Adapter.ts +34 -0
  801. package/src/apps/mpp/internal/Policy.test.ts +86 -31
  802. package/src/apps/mpp/internal/Policy.ts +49 -7
  803. package/src/apps/mpp/internal/Sponsorship.test.ts +207 -0
  804. package/src/apps/mpp/internal/Sponsorship.ts +9 -3
  805. package/src/apps/relay/App.test.ts +839 -64
  806. package/src/apps/relay/App.ts +148 -81
  807. package/src/apps/relay/App.zone-billing.test.ts +257 -0
  808. package/src/apps/relay/Sponsorships.test.ts +67 -4
  809. package/src/apps/relay/Sponsorships.ts +233 -32
  810. package/src/apps/relay/Sponsorships.zone.test.ts +102 -0
  811. package/src/apps/{funding → routes}/Access.ts +6 -6
  812. package/src/apps/routes/App.test.ts +165 -0
  813. package/src/apps/routes/App.ts +96 -0
  814. package/src/apps/{funding → routes}/Inventory.ts +2 -2
  815. package/src/apps/routes/index.ts +1 -0
  816. package/src/apps/{funding → routes}/routes/chains.test.ts +66 -66
  817. package/src/apps/{funding → routes}/routes/chains.ts +23 -23
  818. package/src/apps/{funding → routes}/routes/deposit-addresses.test.ts +1358 -458
  819. package/src/apps/{funding → routes}/routes/deposit-addresses.ts +566 -246
  820. package/src/apps/{funding → routes}/routes/providers.test.ts +27 -33
  821. package/src/apps/{funding → routes}/routes/providers.ts +23 -23
  822. package/src/apps/{funding → routes}/routes/quotes.test.ts +298 -41
  823. package/src/apps/{funding → routes}/routes/quotes.ts +57 -40
  824. package/src/apps/{funding → routes}/routes/transfers.test.ts +1100 -353
  825. package/src/apps/routes/routes/transfers.ts +1332 -0
  826. package/src/cli/Cli.test.ts +1 -1
  827. package/src/cli/commands/admin.test.ts +748 -1
  828. package/src/cli/commands/admin.ts +278 -0
  829. package/src/cloudflare.ts +52 -47
  830. package/src/db/Db.test.ts +245 -2
  831. package/src/db/Db.ts +1476 -34
  832. package/src/db/Schema.ts +729 -228
  833. package/src/db/tables/apiKeyAdmissionBootstraps.ts +4 -0
  834. package/src/db/tables/apiKeyAdmissions.ts +218 -0
  835. package/src/db/tables/apiKeyOwnerAdmissions.ts +4 -0
  836. package/src/db/tables/apiKeyOwnerTombstones.ts +81 -0
  837. package/src/db/tables/apiKeyRevocations.test.ts +74 -0
  838. package/src/db/tables/apiKeyRevocations.ts +121 -0
  839. package/src/db/tables/authAccounts.ts +105 -0
  840. package/src/db/tables/authSessions.ts +13 -0
  841. package/src/db/tables/authVerifications.ts +13 -0
  842. package/src/db/tables/invitations.ts +142 -45
  843. package/src/db/tables/memberships.ts +79 -3
  844. package/src/db/tables/organizations.test.ts +690 -13
  845. package/src/db/tables/organizations.ts +139 -55
  846. package/src/db/tables/projects.test.ts +16 -0
  847. package/src/db/tables/projects.ts +13 -3
  848. package/src/db/tables/requestUsage.ts +4 -1
  849. package/src/db/tables/rewardAccounts.ts +178 -0
  850. package/src/db/tables/rewardCampaignDistributors.ts +68 -0
  851. package/src/db/tables/rewardCampaigns.test.ts +1388 -0
  852. package/src/db/tables/rewardCampaigns.ts +647 -0
  853. package/src/db/tables/rewardCredits.ts +110 -0
  854. package/src/db/tables/rewardEligibilityAssociations.test.ts +271 -0
  855. package/src/db/tables/rewardEligibilityAssociations.ts +184 -0
  856. package/src/db/tables/rewardRuns.ts +514 -0
  857. package/src/db/tables/rewardTransactionAttempts.ts +272 -0
  858. package/src/db/tables/routesCatalog.test.ts +185 -0
  859. package/src/db/tables/routesCatalog.ts +163 -0
  860. package/src/db/tables/routesDepositAddresses.test.ts +1048 -0
  861. package/src/db/tables/routesDepositAddresses.ts +1008 -0
  862. package/src/db/tables/{fundingDepositRequestObservations.test.ts → routesDepositRequestObservations.test.ts} +13 -14
  863. package/src/db/tables/{fundingDepositRequestObservations.ts → routesDepositRequestObservations.ts} +10 -10
  864. package/src/db/tables/{fundingDeposits.test.ts → routesDeposits.test.ts} +316 -46
  865. package/src/db/tables/routesDeposits.ts +1062 -0
  866. package/src/db/tables/routesIdempotency.test.ts +796 -0
  867. package/src/db/tables/routesIdempotency.ts +496 -0
  868. package/src/db/tables/routesSubsidies.test.ts +120 -0
  869. package/src/db/tables/routesSubsidies.ts +71 -0
  870. package/src/db/tables/{fundingTransferEvents.ts → routesTransferEvents.ts} +4 -4
  871. package/src/db/tables/routesTransferSubsidies.ts +38 -0
  872. package/src/db/tables/routesTransferSubsidyNonces.ts +124 -0
  873. package/src/db/tables/routesTransferTransactions.test.ts +195 -0
  874. package/src/db/tables/{fundingTransferTransactions.ts → routesTransferTransactions.ts} +63 -18
  875. package/src/db/tables/routesTransfers.test.ts +338 -0
  876. package/src/db/tables/routesTransfers.ts +662 -0
  877. package/src/db/tables/sponsoredTransactions.test.ts +269 -45
  878. package/src/db/tables/sponsoredTransactions.ts +225 -65
  879. package/src/db/tables/sponsorshipAttributions.test.ts +160 -0
  880. package/src/db/tables/sponsorshipAttributions.ts +168 -0
  881. package/src/db/tables/sponsorshipReconciliationCursors.test.ts +115 -0
  882. package/src/db/tables/sponsorshipReconciliationCursors.ts +67 -0
  883. package/src/db/tables/stripeCustomers.test.ts +85 -0
  884. package/src/db/tables/stripeCustomers.ts +24 -0
  885. package/src/db/tables/users.test.ts +129 -0
  886. package/src/db/tables/users.ts +49 -3
  887. package/src/db/tables/webhookQueueEvents.ts +8 -1
  888. package/src/db/tables/webhookSubscriptions.ts +95 -20
  889. package/src/handlers/internal/executionError.ts +3 -4
  890. package/src/handlers/internal/multisig.ts +13 -816
  891. package/src/handlers/internal/sponsorship.ts +26 -10
  892. package/src/handlers/relay.test-d.ts +9 -1
  893. package/src/handlers/relay.test.ts +823 -3
  894. package/src/handlers/relay.ts +127 -107
  895. package/src/index.test-d.ts +7 -0
  896. package/src/index.ts +0 -17
  897. package/src/internal/AssetResponse.ts +26 -0
  898. package/src/internal/Auth.test.ts +1564 -9
  899. package/src/internal/Auth.ts +833 -239
  900. package/src/internal/BetterAuth.test.ts +242 -0
  901. package/src/internal/BetterAuth.ts +349 -0
  902. package/src/internal/Cache.ts +2 -0
  903. package/src/internal/EarnRates.test.ts +17 -0
  904. package/src/internal/EarnRates.ts +124 -31
  905. package/src/internal/EarnSharePrices.test.ts +182 -0
  906. package/src/internal/EarnSharePrices.ts +313 -0
  907. package/src/internal/EarnVaults.test.ts +21 -0
  908. package/src/internal/EarnVaults.ts +33 -11
  909. package/src/internal/Email.ts +54 -0
  910. package/src/internal/Idempotency.test.ts +2 -2
  911. package/src/internal/Log.test-d.ts +8 -7
  912. package/src/internal/Log.test.ts +114 -16
  913. package/src/internal/Log.ts +53 -40
  914. package/src/internal/MetricSink.test.ts +313 -26
  915. package/src/internal/MetricSink.ts +73 -8
  916. package/src/internal/Mpp.test.ts +31 -0
  917. package/src/internal/Mpp.ts +21 -24
  918. package/src/internal/OpenApi.ts +45 -12
  919. package/src/internal/Provider.test.ts +1 -1
  920. package/src/internal/Provider.ts +1 -1
  921. package/src/internal/RateLimit.test.ts +21 -3
  922. package/src/internal/RateLimit.ts +12 -1
  923. package/src/internal/Store.test-d.ts +1 -1
  924. package/src/internal/Store.test.ts +151 -8
  925. package/src/internal/Store.ts +76 -9
  926. package/src/internal/Tidx.test.ts +59 -8
  927. package/src/internal/Tidx.ts +86 -14
  928. package/src/internal/Timing.test.ts +77 -0
  929. package/src/internal/Timing.ts +83 -6
  930. package/src/internal/VercelOidc.test.ts +188 -0
  931. package/src/internal/VercelOidc.ts +193 -0
  932. package/src/internal/VerifiedTokens.test.ts +60 -6
  933. package/src/internal/VerifiedTokens.ts +21 -24
  934. package/src/internal/Viem.batch.test.ts +80 -0
  935. package/src/internal/Viem.test.ts +201 -2
  936. package/src/internal/Viem.ts +221 -25
  937. package/src/internal/Webhooks.test.ts +85 -6
  938. package/src/internal/Webhooks.ts +22 -4
  939. package/src/internal/ZoneRpc.ts +50 -0
  940. package/src/internal/exchange/Provider.test.ts +2 -2
  941. package/src/internal/index.test.ts +3 -1
  942. package/src/internal/index.ts +3 -1
  943. package/src/internal/rewards/Audit.ts +231 -0
  944. package/src/internal/rewards/Campaigns.test.ts +1234 -0
  945. package/src/internal/rewards/Campaigns.ts +1205 -0
  946. package/src/internal/rewards/Credits.ts +165 -0
  947. package/src/internal/rewards/Events.local.test.ts +113 -0
  948. package/src/internal/rewards/Events.test.ts +152 -0
  949. package/src/internal/rewards/Events.ts +468 -0
  950. package/src/internal/rewards/Projection.test.ts +681 -0
  951. package/src/internal/rewards/Projection.ts +987 -0
  952. package/src/internal/rewards/Rates.test.ts +171 -0
  953. package/src/internal/rewards/Rates.ts +110 -0
  954. package/src/internal/rewards/Read.test.ts +501 -0
  955. package/src/internal/rewards/Read.ts +476 -0
  956. package/src/internal/rewards/Runner.checkpoint.test.ts +80 -0
  957. package/src/internal/rewards/Runner.states.test.ts +188 -0
  958. package/src/internal/rewards/Runner.test.ts +90 -0
  959. package/src/internal/rewards/Runner.ts +2229 -0
  960. package/src/internal/rewards/Signer.test.ts +79 -0
  961. package/src/internal/rewards/Signer.ts +180 -0
  962. package/src/internal/rewards/index.ts +14 -0
  963. package/src/internal/{funding → routes}/Action.test.ts +63 -14
  964. package/src/internal/{funding → routes}/Action.ts +35 -8
  965. package/src/internal/{funding → routes}/Catalog.test.ts +3 -3
  966. package/src/internal/{funding → routes}/Catalog.ts +39 -39
  967. package/src/internal/{funding → routes}/Chain.test.ts +1 -1
  968. package/src/internal/{funding → routes}/Chain.ts +11 -11
  969. package/src/internal/{funding → routes}/Deposit.test.ts +1 -1
  970. package/src/internal/{funding → routes}/Deposit.ts +93 -45
  971. package/src/internal/{funding → routes}/DepositAddress.test.ts +11 -3
  972. package/src/internal/{funding → routes}/DepositAddress.ts +132 -53
  973. package/src/internal/{funding → routes}/DepositWebhook.test.ts +61 -18
  974. package/src/internal/{funding → routes}/DepositWebhook.ts +9 -9
  975. package/src/internal/routes/Economics.test.ts +42 -0
  976. package/src/internal/routes/Economics.ts +47 -0
  977. package/src/internal/{funding → routes}/Evidence.test.ts +6 -6
  978. package/src/internal/{funding → routes}/Evidence.ts +9 -9
  979. package/src/internal/routes/Observability.test.ts +636 -0
  980. package/src/internal/routes/Observability.ts +668 -0
  981. package/src/internal/{funding → routes}/Provider.test.ts +489 -153
  982. package/src/internal/{funding → routes}/Provider.ts +489 -186
  983. package/src/internal/{funding → routes}/Reconciliation.local.test.ts +84 -12
  984. package/src/internal/{funding → routes}/Reconciliation.test.ts +1213 -279
  985. package/src/internal/{funding → routes}/Reconciliation.ts +501 -203
  986. package/src/internal/routes/Reconciliation.unattributed.test.ts +250 -0
  987. package/src/internal/{funding → routes}/Route.ts +7 -7
  988. package/src/internal/{funding → routes}/SourceObservation.test.ts +13 -14
  989. package/src/internal/{funding → routes}/SourceObservation.ts +13 -13
  990. package/src/internal/{funding → routes}/Subsidy.local.test.ts +7 -7
  991. package/src/internal/routes/Subsidy.test.ts +169 -0
  992. package/src/internal/{funding → routes}/Subsidy.ts +86 -6
  993. package/src/internal/{funding → routes}/Token.test.ts +1 -1
  994. package/src/internal/{funding → routes}/Token.ts +5 -5
  995. package/src/internal/routes/Transfer.test.ts +1199 -0
  996. package/src/internal/routes/Transfer.ts +1206 -0
  997. package/src/internal/routes/TransferReconciliation.test.ts +731 -0
  998. package/src/internal/routes/TransferReconciliation.ts +527 -0
  999. package/src/internal/routes/TransferSubsidy.test.ts +172 -0
  1000. package/src/internal/routes/TransferSubsidy.ts +447 -0
  1001. package/src/internal/{funding → routes}/TransferWebhook.test.ts +13 -13
  1002. package/src/internal/{funding → routes}/TransferWebhook.ts +7 -7
  1003. package/src/internal/{funding → routes}/index.test.ts +5 -3
  1004. package/src/internal/{funding → routes}/index.ts +2 -0
  1005. package/src/internal/{funding → routes}/providers/across.ts +16 -16
  1006. package/src/internal/{funding → routes}/providers/index.test.ts +157 -44
  1007. package/src/internal/{funding → routes}/providers/relay.test.ts +165 -32
  1008. package/src/internal/{funding → routes}/providers/relay.ts +228 -121
  1009. package/src/internal/{funding → routes}/providers/rhino.ts +16 -16
  1010. package/src/internal/{funding → routes}/providers/squid.ts +17 -17
  1011. package/src/internal/routes/providers/stargate.test.ts +728 -0
  1012. package/src/internal/routes/providers/stargate.ts +1276 -0
  1013. package/src/internal/{funding → routes}/providers/symbiosis.ts +64 -24
  1014. package/src/internal/webhookDestinations/slack.ts +10 -10
  1015. package/src/providers/index.ts +13 -13
  1016. package/src/server.ts +18 -0
  1017. package/dist/apps/funding/Access.d.ts.map +0 -1
  1018. package/dist/apps/funding/Access.js.map +0 -1
  1019. package/dist/apps/funding/App.js.map +0 -1
  1020. package/dist/apps/funding/Inventory.d.ts.map +0 -1
  1021. package/dist/apps/funding/Inventory.js.map +0 -1
  1022. package/dist/apps/funding/ProviderAttempts.d.ts +0 -5
  1023. package/dist/apps/funding/ProviderAttempts.d.ts.map +0 -1
  1024. package/dist/apps/funding/ProviderAttempts.js +0 -24
  1025. package/dist/apps/funding/ProviderAttempts.js.map +0 -1
  1026. package/dist/apps/funding/index.d.ts +0 -2
  1027. package/dist/apps/funding/index.d.ts.map +0 -1
  1028. package/dist/apps/funding/index.js +0 -2
  1029. package/dist/apps/funding/index.js.map +0 -1
  1030. package/dist/apps/funding/routes/chains.d.ts.map +0 -1
  1031. package/dist/apps/funding/routes/chains.js.map +0 -1
  1032. package/dist/apps/funding/routes/deposit-addresses.d.ts.map +0 -1
  1033. package/dist/apps/funding/routes/deposit-addresses.js.map +0 -1
  1034. package/dist/apps/funding/routes/providers.d.ts.map +0 -1
  1035. package/dist/apps/funding/routes/providers.js +0 -57
  1036. package/dist/apps/funding/routes/providers.js.map +0 -1
  1037. package/dist/apps/funding/routes/quotes.d.ts.map +0 -1
  1038. package/dist/apps/funding/routes/quotes.js.map +0 -1
  1039. package/dist/apps/funding/routes/transfers.d.ts.map +0 -1
  1040. package/dist/apps/funding/routes/transfers.js +0 -828
  1041. package/dist/apps/funding/routes/transfers.js.map +0 -1
  1042. package/dist/db/tables/fundingCatalog.d.ts +0 -58
  1043. package/dist/db/tables/fundingCatalog.d.ts.map +0 -1
  1044. package/dist/db/tables/fundingCatalog.js.map +0 -1
  1045. package/dist/db/tables/fundingDepositAddresses.d.ts +0 -192
  1046. package/dist/db/tables/fundingDepositAddresses.d.ts.map +0 -1
  1047. package/dist/db/tables/fundingDepositAddresses.js +0 -235
  1048. package/dist/db/tables/fundingDepositAddresses.js.map +0 -1
  1049. package/dist/db/tables/fundingDepositRequestObservations.d.ts.map +0 -1
  1050. package/dist/db/tables/fundingDepositRequestObservations.js.map +0 -1
  1051. package/dist/db/tables/fundingDeposits.d.ts.map +0 -1
  1052. package/dist/db/tables/fundingDeposits.js +0 -295
  1053. package/dist/db/tables/fundingDeposits.js.map +0 -1
  1054. package/dist/db/tables/fundingIdempotency.d.ts +0 -91
  1055. package/dist/db/tables/fundingIdempotency.d.ts.map +0 -1
  1056. package/dist/db/tables/fundingIdempotency.js +0 -103
  1057. package/dist/db/tables/fundingIdempotency.js.map +0 -1
  1058. package/dist/db/tables/fundingTransferEvents.d.ts.map +0 -1
  1059. package/dist/db/tables/fundingTransferEvents.js.map +0 -1
  1060. package/dist/db/tables/fundingTransferTransactions.d.ts +0 -53
  1061. package/dist/db/tables/fundingTransferTransactions.d.ts.map +0 -1
  1062. package/dist/db/tables/fundingTransferTransactions.js.map +0 -1
  1063. package/dist/db/tables/fundingTransfers.d.ts +0 -99
  1064. package/dist/db/tables/fundingTransfers.d.ts.map +0 -1
  1065. package/dist/db/tables/fundingTransfers.js +0 -110
  1066. package/dist/db/tables/fundingTransfers.js.map +0 -1
  1067. package/dist/internal/funding/Action.d.ts.map +0 -1
  1068. package/dist/internal/funding/Action.js.map +0 -1
  1069. package/dist/internal/funding/Catalog.d.ts.map +0 -1
  1070. package/dist/internal/funding/Catalog.js.map +0 -1
  1071. package/dist/internal/funding/Chain.d.ts.map +0 -1
  1072. package/dist/internal/funding/Chain.js.map +0 -1
  1073. package/dist/internal/funding/Deposit.d.ts.map +0 -1
  1074. package/dist/internal/funding/Deposit.js.map +0 -1
  1075. package/dist/internal/funding/DepositAddress.d.ts.map +0 -1
  1076. package/dist/internal/funding/DepositAddress.js.map +0 -1
  1077. package/dist/internal/funding/DepositWebhook.d.ts.map +0 -1
  1078. package/dist/internal/funding/DepositWebhook.js.map +0 -1
  1079. package/dist/internal/funding/Evidence.d.ts.map +0 -1
  1080. package/dist/internal/funding/Evidence.js.map +0 -1
  1081. package/dist/internal/funding/Provider.d.ts.map +0 -1
  1082. package/dist/internal/funding/Provider.js.map +0 -1
  1083. package/dist/internal/funding/Reconciliation.d.ts.map +0 -1
  1084. package/dist/internal/funding/Reconciliation.js.map +0 -1
  1085. package/dist/internal/funding/Route.d.ts +0 -21
  1086. package/dist/internal/funding/Route.d.ts.map +0 -1
  1087. package/dist/internal/funding/Route.js.map +0 -1
  1088. package/dist/internal/funding/SourceObservation.d.ts.map +0 -1
  1089. package/dist/internal/funding/SourceObservation.js.map +0 -1
  1090. package/dist/internal/funding/Subsidy.d.ts.map +0 -1
  1091. package/dist/internal/funding/Subsidy.js.map +0 -1
  1092. package/dist/internal/funding/Token.d.ts.map +0 -1
  1093. package/dist/internal/funding/Token.js.map +0 -1
  1094. package/dist/internal/funding/Transfer.d.ts.map +0 -1
  1095. package/dist/internal/funding/Transfer.js +0 -462
  1096. package/dist/internal/funding/Transfer.js.map +0 -1
  1097. package/dist/internal/funding/TransferReconciliation.d.ts.map +0 -1
  1098. package/dist/internal/funding/TransferReconciliation.js +0 -192
  1099. package/dist/internal/funding/TransferReconciliation.js.map +0 -1
  1100. package/dist/internal/funding/TransferWebhook.d.ts.map +0 -1
  1101. package/dist/internal/funding/TransferWebhook.js.map +0 -1
  1102. package/dist/internal/funding/index.d.ts.map +0 -1
  1103. package/dist/internal/funding/index.js.map +0 -1
  1104. package/dist/internal/funding/providers/across.d.ts.map +0 -1
  1105. package/dist/internal/funding/providers/across.js.map +0 -1
  1106. package/dist/internal/funding/providers/relay.d.ts.map +0 -1
  1107. package/dist/internal/funding/providers/relay.js.map +0 -1
  1108. package/dist/internal/funding/providers/rhino.d.ts.map +0 -1
  1109. package/dist/internal/funding/providers/rhino.js.map +0 -1
  1110. package/dist/internal/funding/providers/squid.d.ts.map +0 -1
  1111. package/dist/internal/funding/providers/squid.js.map +0 -1
  1112. package/dist/internal/funding/providers/stargate.d.ts.map +0 -1
  1113. package/dist/internal/funding/providers/stargate.js +0 -579
  1114. package/dist/internal/funding/providers/stargate.js.map +0 -1
  1115. package/dist/internal/funding/providers/symbiosis.d.ts.map +0 -1
  1116. package/dist/internal/funding/providers/symbiosis.js.map +0 -1
  1117. package/src/apps/funding/App.test.ts +0 -78
  1118. package/src/apps/funding/App.ts +0 -88
  1119. package/src/apps/funding/ProviderAttempts.ts +0 -26
  1120. package/src/apps/funding/index.ts +0 -1
  1121. package/src/apps/funding/routes/transfers.ts +0 -987
  1122. package/src/db/tables/fundingCatalog.test.ts +0 -122
  1123. package/src/db/tables/fundingCatalog.ts +0 -163
  1124. package/src/db/tables/fundingDepositAddresses.test.ts +0 -608
  1125. package/src/db/tables/fundingDepositAddresses.ts +0 -443
  1126. package/src/db/tables/fundingDeposits.ts +0 -572
  1127. package/src/db/tables/fundingIdempotency.test.ts +0 -182
  1128. package/src/db/tables/fundingIdempotency.ts +0 -180
  1129. package/src/db/tables/fundingTransferTransactions.test.ts +0 -112
  1130. package/src/db/tables/fundingTransfers.test.ts +0 -115
  1131. package/src/db/tables/fundingTransfers.ts +0 -189
  1132. package/src/handlers/internal/multisig.test.ts +0 -818
  1133. package/src/internal/funding/Subsidy.test.ts +0 -75
  1134. package/src/internal/funding/Transfer.test.ts +0 -524
  1135. package/src/internal/funding/Transfer.ts +0 -762
  1136. package/src/internal/funding/TransferReconciliation.test.ts +0 -147
  1137. package/src/internal/funding/TransferReconciliation.ts +0 -264
  1138. package/src/internal/funding/providers/stargate.test.ts +0 -328
  1139. package/src/internal/funding/providers/stargate.ts +0 -856
  1140. /package/dist/apps/{funding → routes}/Inventory.d.ts +0 -0
  1141. /package/src/internal/{funding → routes}/Route.test.ts +0 -0
@@ -0,0 +1,1332 @@
1
+ import { type Context, Hono } from 'hono'
2
+ import { etag } from 'hono/etag'
3
+ import { AbiFunction, Hex } from 'ox'
4
+ import { getAddress } from 'viem'
5
+ import * as z from 'zod/mini'
6
+
7
+ import type * as App from '../../../App.js'
8
+ import * as Db from '../../../db/Db.js'
9
+ import * as RoutesIdempotency from '../../../db/tables/routesIdempotency.js'
10
+ import * as RoutesTransfers from '../../../db/tables/routesTransfers.js'
11
+ import * as Auth from '../../../internal/Auth.js'
12
+ import * as Cache from '../../../internal/Cache.js'
13
+ import * as RoutesCatalog from '../../../internal/routes/Catalog.js'
14
+ import * as RoutesObservability from '../../../internal/routes/Observability.js'
15
+ import * as RoutesProvider from '../../../internal/routes/Provider.js'
16
+ import * as RoutesSubsidy from '../../../internal/routes/Subsidy.js'
17
+ import * as RoutesTransfer from '../../../internal/routes/Transfer.js'
18
+ import * as RoutesTransferSubsidy from '../../../internal/routes/TransferSubsidy.js'
19
+ import * as RoutesTransferReconciliation from '../../../internal/routes/TransferReconciliation.js'
20
+ import * as Idempotency from '../../../internal/Idempotency.js'
21
+ import * as OpenApi from '../../../internal/OpenApi.js'
22
+ import * as Response from '../../../internal/Response.js'
23
+ import * as Schema from '../../../internal/Schema.js'
24
+ import * as Value from '../../../internal/Value.js'
25
+ import type * as Webhooks from '../../../internal/Webhooks.js'
26
+ import * as Access from '../Access.js'
27
+
28
+ const maximumSourceTransactionHashes = 10
29
+ const recipientExample = getAddress(`0x${'11'.repeat(20)}`)
30
+ const senderExample = getAddress(`0x${'22'.repeat(20)}`)
31
+ const stargatePoolExample = '0x8c76e2f6c5ceda9aa7772e7eff30280226c44392'
32
+ const stargateApproveExample = AbiFunction.from('function approve(address spender, uint256 amount)')
33
+ const stargateFeeTokenExample = '0x0cEb237E109eE22374a567c6b09F373C73FA4cBb'
34
+ const stargateSendExample = AbiFunction.from(
35
+ 'function send((uint32 dstEid, bytes32 to, uint256 amountLD, uint256 minAmountLD, bytes extraOptions, bytes composeMsg, bytes oftCmd) sendParam, (uint256 nativeFee, uint256 lzTokenFee) fee, address refundAddress)',
36
+ )
37
+ const stargateWrapExample = AbiFunction.from(
38
+ 'function wrap(address token, address to, uint256 amount)',
39
+ )
40
+
41
+ /** Zod schemas owned by route transfer resources. */
42
+ export namespace schema {
43
+ /** A durable route transfer. Reads never include the executable `action`. */
44
+ export const Transfer = RoutesTransfer.schema.RoutesTransfer
45
+ /** Schemas for the listRoutesTransfers operation. */
46
+ export namespace listRoutesTransfers {
47
+ /** Query parameters for listing route transfers. */
48
+ export const Query = z
49
+ .object({
50
+ cursor: Schema.Cursor,
51
+ include: Schema.totalCountInclude,
52
+ limit: Schema.Limit,
53
+ status: z.optional(RoutesTransfer.schema.Status),
54
+ })
55
+ .check(z.describe('Query parameters for listing route transfers.'))
56
+
57
+ /** Paginated route transfer list. */
58
+ export const Response = OpenApi.component(
59
+ z
60
+ .object({
61
+ data: z.array(Transfer).check(z.describe('Route transfers on this page, newest first.')),
62
+ meta: z
63
+ .optional(Schema.CountMeta)
64
+ .check(z.describe('Extra response metadata requested with `include`.')),
65
+ nextCursor: Schema.NextCursor,
66
+ })
67
+ .check(z.describe('A page of route transfers.')),
68
+ 'RoutesTransferList',
69
+ )
70
+ }
71
+
72
+ /** Schemas for the createRoutesTransfer operation. */
73
+ export namespace createRoutesTransfer {
74
+ /** Route transfer creation request body. */
75
+ export const Body = RoutesTransfer.schema.CreateRequest
76
+
77
+ /** Required headers for route transfer creation. */
78
+ export const Headers = z.object({
79
+ 'idempotency-key': z
80
+ .string()
81
+ .check(
82
+ z.minLength(1),
83
+ z.describe(
84
+ 'Opaque retry key scoped to the API key. Matching requests replay successful responses for 24 hours; changed input conflicts, in-flight requests block, and failed attempts release the key.',
85
+ ),
86
+ z.meta({ examples: ['routes_01k1c5j8q8p0be6j5v9m6d1e4r'] }),
87
+ ),
88
+ })
89
+
90
+ /** The created transfer with its one-time executable action. */
91
+ export const Response = RoutesTransfer.schema.CreatedRoutesTransfer
92
+ }
93
+
94
+ const destinationCreateFields = {
95
+ amount: RoutesTransfer.schema.CreateRequest.shape.amount,
96
+ mode: RoutesTransfer.schema.CreateRequest.shape.mode,
97
+ recipient: RoutesTransfer.schema.CreateRequest.shape.recipient,
98
+ sender: RoutesTransfer.schema.CreateRequest.shape.sender,
99
+ slippageBps: RoutesTransfer.schema.CreateRequest.shape.slippageBps,
100
+ sourceChain: RoutesTransfer.schema.CreateRequest.shape.sourceChain,
101
+ sourceToken: RoutesTransfer.schema.CreateRequest.shape.sourceToken,
102
+ }
103
+
104
+ /** Schemas for the createRoutesTransferVault operation. */
105
+ export namespace createRoutesTransferVault {
106
+ /** Route transfer creation request for an Earn vault destination. */
107
+ export const Body = OpenApi.component(
108
+ z
109
+ .strictObject({
110
+ ...destinationCreateFields,
111
+ vaultAddress: z
112
+ .string()
113
+ .check(
114
+ z.regex(/^0x[0-9a-fA-F]{40}$/),
115
+ z.describe('Tempo Earn vault contract address.'),
116
+ z.meta({ examples: [`0x${'f4'.repeat(20)}`] }),
117
+ ),
118
+ })
119
+ .check(z.describe('Vault route transfer creation request.')),
120
+ 'CreateRoutesTransferVaultRequest',
121
+ )
122
+
123
+ /** Required headers for vault route transfer creation. */
124
+ export const Headers = createRoutesTransfer.Headers
125
+ }
126
+
127
+ /** Schemas for the createRoutesTransferZone operation. */
128
+ export namespace createRoutesTransferZone {
129
+ /** Route transfer creation request for a Zone destination. */
130
+ export const Body = OpenApi.component(
131
+ z
132
+ .strictObject({
133
+ amount: destinationCreateFields.amount,
134
+ destinationChain: z
135
+ .string()
136
+ .check(
137
+ z.regex(/^eip155:\d+$/),
138
+ z.describe('Configured Zone CAIP-2 id.'),
139
+ z.meta({ examples: ['eip155:1424310003'] }),
140
+ ),
141
+ destinationToken: RoutesTransfer.schema.CreateRequest.shape.destinationToken,
142
+ mode: destinationCreateFields.mode,
143
+ recipient: destinationCreateFields.recipient,
144
+ recipientFallback: z
145
+ .string()
146
+ .check(
147
+ z.regex(/^0x[0-9a-fA-F]{40}$/),
148
+ z.describe('Public Tempo recipient used if the Zone credit cannot complete.'),
149
+ z.meta({ examples: [`0x${'22'.repeat(20)}`] }),
150
+ ),
151
+ sender: destinationCreateFields.sender,
152
+ slippageBps: destinationCreateFields.slippageBps,
153
+ sourceChain: destinationCreateFields.sourceChain,
154
+ sourceToken: destinationCreateFields.sourceToken,
155
+ })
156
+ .check(z.describe('Zone route transfer creation request.')),
157
+ 'CreateRoutesTransferZoneRequest',
158
+ )
159
+
160
+ /** Required headers for Zone route transfer creation. */
161
+ export const Headers = createRoutesTransfer.Headers
162
+ }
163
+
164
+ /** Schemas for the getRoutesTransfer operation. */
165
+ export namespace getRoutesTransfer {
166
+ /** Path parameters for a route transfer read. */
167
+ export const Params = z
168
+ .object({
169
+ id: z
170
+ .string()
171
+ .check(
172
+ z.describe('Route transfer ID (`rtr_…`).'),
173
+ z.meta({ examples: ['rtr_001785729600000_2ZPE2gvateYEQ0dQslgvkhjx'] }),
174
+ ),
175
+ })
176
+ .check(z.describe('Path parameters for a route transfer request.'))
177
+
178
+ /** The route transfer resource, returned directly. */
179
+ export const Response = Transfer
180
+ }
181
+
182
+ /** Schemas for the registerRoutesTransferSourceTransaction operation. */
183
+ export namespace registerRoutesTransferSourceTransaction {
184
+ /** Source transaction registration request body. */
185
+ export const Body = OpenApi.component(
186
+ z
187
+ .union([
188
+ z.strictObject({
189
+ transactionHash: Schema.hash(`0x${'51'.repeat(32)}`),
190
+ }),
191
+ z.strictObject({
192
+ transactionHashes: z
193
+ .array(Schema.hash(`0x${'52'.repeat(32)}`))
194
+ .check(
195
+ z.minLength(1),
196
+ z.maxLength(maximumSourceTransactionHashes),
197
+ z.describe('Source transactions produced by the prepared calls.'),
198
+ ),
199
+ }),
200
+ ])
201
+ .check(z.describe('Source transactions to verify and register for the transfer.')),
202
+ 'RegisterRoutesTransferSourceTransactionRequest',
203
+ )
204
+
205
+ /** Path parameters for source transaction registration. */
206
+ export const Params = getRoutesTransfer.Params
207
+
208
+ /** The transfer after source transaction registration. */
209
+ export const Response = Transfer
210
+ }
211
+ }
212
+
213
+ const baseChainExample = {
214
+ addressFormat: 'hex',
215
+ id: 'eip155:8453',
216
+ kind: 'evm',
217
+ name: 'Base',
218
+ } as const
219
+
220
+ const baseUsdcExample = {
221
+ address: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',
222
+ currency: 'USD',
223
+ decimals: 6,
224
+ name: 'USD Coin',
225
+ standard: 'ERC-20',
226
+ symbol: 'USDC',
227
+ tokenKey: 'eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',
228
+ verified: true,
229
+ } as const
230
+
231
+ const tempoChainExample = {
232
+ addressFormat: 'hex',
233
+ id: 'eip155:4217',
234
+ kind: 'evm',
235
+ name: 'Tempo',
236
+ } as const
237
+
238
+ const tempoUsdcExample = {
239
+ address: '0x20c000000000000000000000b9537d11c60e8b50',
240
+ currency: 'USD',
241
+ decimals: 6,
242
+ name: 'Bridged USDC (Stargate)',
243
+ standard: 'TIP-20',
244
+ symbol: 'USDC.e',
245
+ tokenKey: 'eip155:4217/erc20:0x20c000000000000000000000b9537d11c60e8b50',
246
+ verified: true,
247
+ } as const
248
+
249
+ const tempoFeeExample = {
250
+ address: '0x20c0000000000000000000000000000000000000',
251
+ currency: 'USD',
252
+ decimals: 6,
253
+ name: 'pathUSD',
254
+ standard: 'TIP-20',
255
+ symbol: 'pathUSD',
256
+ tokenKey: 'eip155:4217/erc20:0x20c0000000000000000000000000000000000000',
257
+ verified: true,
258
+ } as const
259
+
260
+ const routesTransferExample = {
261
+ createdAt: '2026-01-01T00:00:00.000Z',
262
+ destinationAmount: Value.tokenAmount({ baseUnits: '979295', currency: 'USD', decimals: 6 }),
263
+ destinationAmountMin: Value.tokenAmount({ baseUnits: '974398', currency: 'USD', decimals: 6 }),
264
+ destinationAmountRequired: Value.tokenAmount({
265
+ baseUnits: '1000000',
266
+ currency: 'USD',
267
+ decimals: 6,
268
+ }),
269
+ destinationChain: baseChainExample,
270
+ destinationToken: baseUsdcExample,
271
+ fees: [
272
+ {
273
+ amount: Value.tokenAmount({ baseUnits: '10000', currency: 'USD', decimals: 6 }),
274
+ side: 'source',
275
+ token: tempoFeeExample,
276
+ type: 'provider',
277
+ },
278
+ ],
279
+ id: 'rtr_001767225600000_2ZPE2gvateYEQ0dQslgvkhjx',
280
+ method: 'transaction',
281
+ mode: 'exactSource',
282
+ provider: { id: 'stargate', name: 'Stargate' },
283
+ quote: {
284
+ expiresAt: '2026-01-01T00:01:00.000Z',
285
+ sampledAt: '2026-01-01T00:00:00.000Z',
286
+ },
287
+ recipient: recipientExample,
288
+ sender: senderExample,
289
+ sourceAmount: Value.tokenAmount({ baseUnits: '1000000', currency: 'USD', decimals: 6 }),
290
+ sourceChain: tempoChainExample,
291
+ sourceToken: tempoUsdcExample,
292
+ status: 'awaiting-source',
293
+ subsidize: true,
294
+ updatedAt: '2026-01-01T00:00:00.000Z',
295
+ version: 1,
296
+ } satisfies z.output<typeof schema.Transfer>
297
+
298
+ const registeredRoutesTransferExample = {
299
+ ...routesTransferExample,
300
+ sourceTransactionHashes: [`0x${'51'.repeat(32)}`],
301
+ status: 'processing',
302
+ updatedAt: '2026-01-01T00:00:20.000Z',
303
+ version: 2,
304
+ } satisfies z.output<typeof schema.registerRoutesTransferSourceTransaction.Response>
305
+
306
+ const listRoutesTransfersResponseExample = {
307
+ data: [routesTransferExample],
308
+ nextCursor: null,
309
+ } satisfies z.output<typeof schema.listRoutesTransfers.Response>
310
+
311
+ const createdRoutesTransferExample = {
312
+ action: {
313
+ calls: [
314
+ {
315
+ data: AbiFunction.encodeData(stargateApproveExample, [stargatePoolExample, 1_000_000n]),
316
+ to: tempoUsdcExample.address,
317
+ value: '0x0',
318
+ },
319
+ {
320
+ data: AbiFunction.encodeData(stargateApproveExample, [stargateFeeTokenExample, 10_000n]),
321
+ to: tempoFeeExample.address,
322
+ value: '0x0',
323
+ },
324
+ {
325
+ data: AbiFunction.encodeData(stargateWrapExample, [
326
+ tempoFeeExample.address,
327
+ senderExample,
328
+ 10_000n,
329
+ ]),
330
+ to: stargateFeeTokenExample,
331
+ value: '0x0',
332
+ },
333
+ {
334
+ data: AbiFunction.encodeData(stargateApproveExample, [stargatePoolExample, 10_000n]),
335
+ to: stargateFeeTokenExample,
336
+ value: '0x0',
337
+ },
338
+ {
339
+ data: AbiFunction.encodeData(stargateSendExample, [
340
+ {
341
+ amountLD: 1_000_000n,
342
+ composeMsg: '0x',
343
+ dstEid: 30_184,
344
+ extraOptions: '0x',
345
+ minAmountLD: 974_398n,
346
+ oftCmd: '0x',
347
+ to: Hex.padLeft(recipientExample, 32),
348
+ },
349
+ { lzTokenFee: 0n, nativeFee: 10_000n },
350
+ senderExample,
351
+ ]),
352
+ to: stargatePoolExample,
353
+ value: '0x0',
354
+ },
355
+ ],
356
+ type: 'evm:calls',
357
+ },
358
+ ...routesTransferExample,
359
+ } satisfies z.output<typeof schema.createRoutesTransfer.Response>
360
+
361
+ const unimplementedRoutesTransferResponses = (() => {
362
+ const responses = OpenApi.responses({
363
+ errors: {
364
+ 400: { codes: ['body_invalid', 'idempotency_key_required'] },
365
+ 501: {
366
+ codes: ['not_implemented'],
367
+ description: 'This route transfer destination is not implemented.',
368
+ },
369
+ },
370
+ success: {
371
+ description: 'Unused until this destination is implemented.',
372
+ schema: z.never(),
373
+ },
374
+ })
375
+ const { 200: success, 502: upstream, ...errors } = responses
376
+ void success
377
+ void upstream
378
+ return errors
379
+ })()
380
+
381
+ // Replay the exact successful creation response for 24 hours.
382
+ const idempotencyReplayTtlMs = 86_400_000
383
+ // Pending claims only cover the bounded provider preparation window.
384
+ const idempotencyPendingTtlMs = 60_000
385
+ const routesEtag = etag()
386
+ const bodyValidation = {
387
+ code: 'body_invalid',
388
+ message: 'Check the request body and try again.',
389
+ } as const
390
+ const paramValidation = {
391
+ code: 'param_invalid',
392
+ message: 'Check the path parameters and try again.',
393
+ } as const
394
+
395
+ /** Mounts durable route transfer routes. */
396
+ export function transfers(options: transfers.Options = {}) {
397
+ return new Hono<App.Environment>()
398
+ .get(
399
+ '/v1/routes/transfers',
400
+ Auth.policy({ apiKey: { scopes: ['routes:read'] } }),
401
+ OpenApi.validate('query', schema.listRoutesTransfers.Query, {
402
+ code: 'query_invalid',
403
+ message: 'Check the query parameters and try again.',
404
+ }),
405
+ OpenApi.describeRoute({
406
+ description: 'Lists transfers from newest to oldest.',
407
+ operationId: 'listRoutesTransfers',
408
+ responses: OpenApi.responses({
409
+ errors: {
410
+ 400: { codes: ['query_invalid'] },
411
+ },
412
+ success: {
413
+ description: 'A page of route transfers.',
414
+ example: listRoutesTransfersResponseExample,
415
+ schema: schema.listRoutesTransfers.Response,
416
+ },
417
+ }),
418
+ summary: 'List transfers',
419
+ tags: ['Route Transfers'],
420
+ }),
421
+ routesEtag,
422
+ async (c) => {
423
+ if (Auth.narrowAccess) return Auth.accessError(c)
424
+ if (OpenApi.narrowValidation)
425
+ return OpenApi.validationError(c, {
426
+ code: 'query_invalid',
427
+ message: 'Check the query parameters and try again.',
428
+ })
429
+
430
+ const owner = Access.owner(c)
431
+ if (!owner) return Access.unauthorized(c)
432
+
433
+ const db = Db.get(c.get('db'))
434
+ const { cursor, include, limit, status } = c.req.valid('query')
435
+ try {
436
+ // `totalCount` is opt-in and capped (a capped subquery shares the
437
+ // list filter); run it concurrently with the page list. Best-effort:
438
+ // a failure omits `meta` rather than failing the page.
439
+ const countPromise = include.includes('totalCount')
440
+ ? RoutesTransfers.count(db, owner, { cap: Schema.countCap, status }).catch(() => {
441
+ c.set('routesTransferCountFailed', true)
442
+ return undefined
443
+ })
444
+ : undefined
445
+
446
+ // Fetch one extra to detect a further page without a second round-trip.
447
+ const rows = await RoutesTransfers.listByOwner(db, owner, {
448
+ cursor,
449
+ limit: limit + 1,
450
+ status,
451
+ })
452
+ const hasMore = rows.length > limit
453
+ const data = (hasMore ? rows.slice(0, limit) : rows).map(RoutesTransfer.toPublic)
454
+ const nextCursor = hasMore ? (data[data.length - 1]?.id ?? null) : null
455
+
456
+ const count = countPromise ? await countPromise : undefined
457
+
458
+ c.header('Cache-Control', Cache.policies.feed)
459
+ c.header('Vary', 'Accept-Encoding, Authorization, Tempo-API-Key, X-API-Key')
460
+
461
+ return c.json(
462
+ Response.validated(schema.listRoutesTransfers.Response, {
463
+ data,
464
+ ...(count !== undefined
465
+ ? {
466
+ meta: {
467
+ totalCountCapped: count > Schema.countCap,
468
+ totalCount: Math.min(count, Schema.countCap),
469
+ },
470
+ }
471
+ : {}),
472
+ nextCursor,
473
+ }),
474
+ 200,
475
+ )
476
+ } catch (cause) {
477
+ return Response.upstream(c, cause)
478
+ }
479
+ },
480
+ )
481
+ .get(
482
+ '/v1/routes/transfers/:id{rtr_[A-Za-z0-9_-]+}',
483
+ Auth.policy({ apiKey: { scopes: ['routes:read'] } }),
484
+ OpenApi.validate('param', schema.getRoutesTransfer.Params, {
485
+ code: 'param_invalid',
486
+ message: 'Check the path parameters and try again.',
487
+ }),
488
+ OpenApi.describeRoute({
489
+ description: 'Returns a transfer by ID.',
490
+ operationId: 'getRoutesTransfer',
491
+ responses: OpenApi.responses({
492
+ errors: {
493
+ 400: { codes: ['param_invalid'] },
494
+ 404: {
495
+ codes: ['routes_transfer_not_found'],
496
+ description: 'No visible route transfer exists for the identifier.',
497
+ },
498
+ },
499
+ success: {
500
+ description: 'The requested route transfer.',
501
+ example: routesTransferExample,
502
+ schema: schema.getRoutesTransfer.Response,
503
+ },
504
+ }),
505
+ summary: 'Get transfer',
506
+ tags: ['Route Transfers'],
507
+ }),
508
+ async (c) => {
509
+ if (Auth.narrowAccess) return Auth.accessError(c)
510
+ if (OpenApi.narrowValidation)
511
+ return OpenApi.validationError(c, {
512
+ code: 'param_invalid',
513
+ message: 'Check the path parameters and try again.',
514
+ })
515
+
516
+ const owner = Access.owner(c)
517
+ if (!owner) return Access.unauthorized(c)
518
+
519
+ const db = Db.get(c.get('db'))
520
+ const { id } = c.req.valid('param')
521
+ try {
522
+ // Ownership filters in SQL, so absent and foreign rows are the same 404.
523
+ const record = await RoutesTransfers.getOwned(db, owner, id)
524
+ if (!record)
525
+ return Response.error(c, {
526
+ code: 'routes_transfer_not_found',
527
+ message: 'Route transfer not found',
528
+ status: 404,
529
+ })
530
+ c.header('Cache-Control', Cache.policies.noStore)
531
+ c.header('Vary', 'Accept-Encoding, Authorization, Tempo-API-Key, X-API-Key')
532
+ return c.json(
533
+ Response.validated(schema.getRoutesTransfer.Response, RoutesTransfer.toPublic(record)),
534
+ 200,
535
+ )
536
+ } catch (cause) {
537
+ return Response.upstream(c, cause)
538
+ }
539
+ },
540
+ )
541
+ .post(
542
+ '/v1/routes/transfers/:id{rtr_[A-Za-z0-9_-]+}/source-transactions',
543
+ Auth.policy({ apiKey: { scopes: ['routes:write'] } }),
544
+ OpenApi.validate(
545
+ 'param',
546
+ schema.registerRoutesTransferSourceTransaction.Params,
547
+ paramValidation,
548
+ ),
549
+ OpenApi.validate('json', schema.registerRoutesTransferSourceTransaction.Body, bodyValidation),
550
+ OpenApi.describeRoute({
551
+ description:
552
+ 'Registers verified source transactions once per organization, environment, and project.',
553
+ operationId: 'registerRoutesTransferSourceTransaction',
554
+ responses: OpenApi.responses({
555
+ errors: {
556
+ 400: {
557
+ codes: ['body_invalid', 'param_invalid', 'source_transaction_invalid'],
558
+ description: 'The path, body, or submitted source transaction is invalid.',
559
+ },
560
+ 404: {
561
+ codes: ['routes_transfer_not_found'],
562
+ description: 'No visible route transfer exists for the identifier.',
563
+ },
564
+ 409: {
565
+ codes: [
566
+ 'routes_transfer_not_awaiting_source',
567
+ 'source_transaction_conflict',
568
+ 'source_transaction_pending',
569
+ ],
570
+ description: 'The transfer or source transaction cannot be registered yet.',
571
+ },
572
+ 501: {
573
+ codes: ['not_implemented'],
574
+ description: 'Source transaction reconciliation is not configured.',
575
+ },
576
+ 502: {
577
+ codes: ['upstream_error'],
578
+ description: 'Source verification or reconciliation dispatch failed.',
579
+ },
580
+ },
581
+ success: {
582
+ description: 'The transfer with its verified source transactions.',
583
+ example: registeredRoutesTransferExample,
584
+ schema: schema.registerRoutesTransferSourceTransaction.Response,
585
+ },
586
+ }),
587
+ summary: 'Register source transaction',
588
+ tags: ['Route Transfers'],
589
+ }),
590
+ async (c) => {
591
+ if (Auth.narrowAccess) return Auth.accessError(c)
592
+ if (OpenApi.narrowValidation) return OpenApi.validationError(c, paramValidation)
593
+ if (OpenApi.narrowValidation) return OpenApi.validationError(c, bodyValidation)
594
+
595
+ const owner = Access.owner(c)
596
+ if (!owner) return Access.unauthorized(c)
597
+ c.header('Cache-Control', Cache.policies.noStore)
598
+ c.header('Vary', 'Accept-Encoding, Authorization, Tempo-API-Key, X-API-Key')
599
+
600
+ const dispatch = options.dispatchTransferReconciliation
601
+ if (!dispatch)
602
+ return Response.error(c, {
603
+ code: 'not_implemented',
604
+ message: 'Source transaction reconciliation is not configured',
605
+ status: 501,
606
+ })
607
+
608
+ const db = Db.get(c.get('db'))
609
+ const { id } = c.req.valid('param')
610
+ const body = c.req.valid('json')
611
+ const transactionHashes = [
612
+ ...new Set('transactionHash' in body ? [body.transactionHash] : body.transactionHashes),
613
+ ]
614
+ try {
615
+ const record = await RoutesTransfers.getOwned(db, owner, id)
616
+ if (!record)
617
+ return Response.error(c, {
618
+ code: 'routes_transfer_not_found',
619
+ message: 'Route transfer not found',
620
+ status: 404,
621
+ })
622
+ if (
623
+ transactionHashes.every((transactionHash) =>
624
+ record.snapshot.sourceTransactionHashes?.some(
625
+ (candidate) => candidate.toLowerCase() === transactionHash,
626
+ ),
627
+ )
628
+ ) {
629
+ return c.json(
630
+ Response.validated(
631
+ schema.registerRoutesTransferSourceTransaction.Response,
632
+ RoutesTransfer.toPublic(record),
633
+ ),
634
+ 200,
635
+ )
636
+ }
637
+ const provider = c
638
+ .get('providers')
639
+ .filter(RoutesProvider.is)
640
+ .find((candidate) => candidate.id === record.providerId)
641
+ if (!provider || !RoutesProvider.canVerifySourceTransaction(provider))
642
+ return Response.error(c, {
643
+ code: 'routes_transfer_not_awaiting_source',
644
+ message: 'Route transfer does not accept source transactions',
645
+ status: 409,
646
+ })
647
+ if (record.status !== 'awaiting-source')
648
+ return Response.error(c, {
649
+ code: 'routes_transfer_not_awaiting_source',
650
+ message: 'Route transfer is not awaiting a source transaction',
651
+ status: 409,
652
+ })
653
+
654
+ const catalog = await RoutesCatalog.snapshot(c)
655
+ const destinationChain = catalog.chainsByKey.get(record.snapshot.destinationChain.id)
656
+ const sourceChain = catalog.chainsByKey.get(record.snapshot.sourceChain.id)
657
+ const routeConfiguration = catalog.routesByProvider
658
+ .get(record.providerId)
659
+ ?.find(
660
+ (candidate) =>
661
+ candidate.route.source.chain.id === record.snapshot.sourceChain.id &&
662
+ candidate.route.source.address.toLowerCase() ===
663
+ record.snapshot.sourceToken.address.toLowerCase() &&
664
+ candidate.route.destination.chain.id === record.snapshot.destinationChain.id &&
665
+ candidate.route.destination.address.toLowerCase() ===
666
+ record.snapshot.destinationToken.address.toLowerCase(),
667
+ )?.configuration
668
+ if (!destinationChain || !sourceChain)
669
+ return Response.error(c, {
670
+ code: 'routes_transfer_not_awaiting_source',
671
+ message: 'Route transfer route chains are no longer configured',
672
+ status: 409,
673
+ })
674
+
675
+ const attempts: RoutesProvider.ProviderAttemptResult[] = []
676
+ const verifications = transactionHashes.map(async (transactionHash) => ({
677
+ ...(await RoutesProvider.observe(
678
+ provider,
679
+ () =>
680
+ provider.verifySourceTransaction(
681
+ {
682
+ destinationChain,
683
+ providerState: record.providerState ?? undefined,
684
+ routeConfiguration,
685
+ sourceChain,
686
+ transactionHash,
687
+ transfer: record.snapshot,
688
+ },
689
+ c.req.raw.signal,
690
+ ),
691
+ {
692
+ onAttempt: (attempt) => attempts.push(attempt),
693
+ operation: 'verifySourceTransaction',
694
+ },
695
+ )),
696
+ transactionHash,
697
+ }))
698
+ const candidates = await Promise.all(verifications)
699
+ .catch(async (cause) => {
700
+ await Promise.allSettled(verifications)
701
+ throw cause
702
+ })
703
+ .finally(() => {
704
+ if (attempts.length > 0) c.set('routesProviderAttempts', attempts)
705
+ })
706
+ const verified = candidates.filter((candidate) => candidate.type === 'verified')
707
+ if (candidates.some((candidate) => candidate.type === 'invalid'))
708
+ return Response.error(c, {
709
+ code: 'source_transaction_invalid',
710
+ message: 'Source transactions do not match the route transfer',
711
+ status: 400,
712
+ })
713
+ if (candidates.some((candidate) => candidate.type === 'pending'))
714
+ return Response.error(c, {
715
+ code: 'source_transaction_pending',
716
+ message: 'A source transaction is not confirmed yet',
717
+ status: 409,
718
+ })
719
+ const evidence = verified[0]
720
+ if (!evidence || verified.length !== 1)
721
+ return Response.error(c, {
722
+ code: 'source_transaction_invalid',
723
+ message: 'Source transactions do not match the route transfer',
724
+ status: 400,
725
+ })
726
+
727
+ const registered = await RoutesTransfer.registerSourceTransactions(db, {
728
+ chainId: record.snapshot.sourceChain.id,
729
+ ...(evidence.destinationAmount
730
+ ? {
731
+ destinationAmount: Value.tokenAmount({
732
+ baseUnits: evidence.destinationAmount,
733
+ currency: record.snapshot.destinationToken.currency,
734
+ decimals: record.snapshot.destinationToken.decimals,
735
+ }),
736
+ }
737
+ : {}),
738
+ id: record.id,
739
+ providerState: evidence.providerState ?? {},
740
+ transactionHashes: [
741
+ evidence.transactionHash,
742
+ ...candidates
743
+ .filter((candidate) => candidate.type === 'related')
744
+ .map((candidate) => candidate.transactionHash),
745
+ ],
746
+ })
747
+ if (registered.type === 'not_found')
748
+ return Response.error(c, {
749
+ code: 'routes_transfer_not_found',
750
+ message: 'Route transfer not found',
751
+ status: 404,
752
+ })
753
+ if (registered.type === 'conflict')
754
+ return Response.error(c, {
755
+ code: 'source_transaction_conflict',
756
+ message: 'Source transaction is already assigned to another route transfer',
757
+ status: 409,
758
+ })
759
+ if (registered.type === 'invalid')
760
+ return Response.error(c, {
761
+ code: 'routes_transfer_not_awaiting_source',
762
+ message: 'Route transfer is not awaiting a source transaction',
763
+ status: 409,
764
+ })
765
+
766
+ const sourceRoutes = (() => {
767
+ if (registered.type !== 'registered') return undefined
768
+ RoutesObservability.recordTransfer(c.get('metrics'), {
769
+ previous: record,
770
+ record: registered.record,
771
+ })
772
+ return RoutesObservability.transferSourceRoutesInterval({
773
+ record: registered.record,
774
+ })
775
+ })()
776
+
777
+ await Promise.all([
778
+ registered.type === 'registered'
779
+ ? dispatch({ transferId: record.id, type: 'routes:transfer:reconcile' })
780
+ : undefined,
781
+ sourceRoutes && options.recordLifecycleInterval
782
+ ? options.recordLifecycleInterval(sourceRoutes)
783
+ : undefined,
784
+ registered.type === 'registered' &&
785
+ options.dispatchTransferUpdates &&
786
+ registered.references.length > 0
787
+ ? options.dispatchTransferUpdates(registered.references)
788
+ : undefined,
789
+ ])
790
+ return c.json(
791
+ Response.validated(
792
+ schema.registerRoutesTransferSourceTransaction.Response,
793
+ RoutesTransfer.toPublic(registered.record),
794
+ ),
795
+ 200,
796
+ )
797
+ } catch (cause) {
798
+ return Response.upstream(c, cause)
799
+ }
800
+ },
801
+ )
802
+ .post(
803
+ '/v1/routes/transfers',
804
+ Auth.policy({ apiKey: { scopes: ['routes:write'] } }),
805
+ OpenApi.validate('header', schema.createRoutesTransfer.Headers, {
806
+ code: 'idempotency_key_required',
807
+ message: 'Route transfer creation requires an `Idempotency-Key` header.',
808
+ }),
809
+ OpenApi.validate('json', schema.createRoutesTransfer.Body, {
810
+ code: 'body_invalid',
811
+ message: 'Check the request body and try again.',
812
+ }),
813
+ OpenApi.describeRoute({
814
+ description:
815
+ 'Creates a durable transfer between supported chains, including optional normalized destination subsidies.',
816
+ operationId: 'createRoutesTransfer',
817
+ responses: OpenApi.responses({
818
+ errors: {
819
+ 400: { codes: ['body_invalid', 'idempotency_key_required'] },
820
+ 403: {
821
+ codes: [
822
+ 'billing_past_due',
823
+ 'billing_required',
824
+ 'routes_subsidy_limit_exceeded',
825
+ 'routes_subsidy_not_enabled',
826
+ ],
827
+ description: 'The requested normalized delivery subsidy is unavailable.',
828
+ },
829
+ 404: {
830
+ codes: ['quote_not_available'],
831
+ description: 'No provider can prepare the requested route.',
832
+ },
833
+ 409: {
834
+ codes: ['idempotency_conflict', 'idempotency_in_progress'],
835
+ description: 'The Idempotency-Key conflicts with an existing or in-flight request.',
836
+ },
837
+ 501: {
838
+ codes: ['not_implemented'],
839
+ description: 'Destination subsidy settlement is not configured.',
840
+ },
841
+ 502: {
842
+ codes: ['upstream_error'],
843
+ description: 'No provider succeeded and at least one failed unexpectedly.',
844
+ },
845
+ 503: {
846
+ codes: ['subsidy_inventory_unavailable', 'subsidy_signer_unavailable'],
847
+ description: 'Destination subsidy capacity is temporarily unavailable.',
848
+ },
849
+ },
850
+ success: {
851
+ description: 'The created route transfer with its one-time executable action.',
852
+ example: createdRoutesTransferExample,
853
+ schema: schema.createRoutesTransfer.Response,
854
+ },
855
+ }),
856
+ summary: 'Create transfer',
857
+ tags: ['Route Transfers'],
858
+ }),
859
+ async (c) => {
860
+ if (Auth.narrowAccess) return Auth.accessError(c)
861
+ if (OpenApi.narrowValidation)
862
+ return OpenApi.validationError(c, {
863
+ code: 'body_invalid',
864
+ message: 'Check the request body and try again.',
865
+ })
866
+
867
+ const principal = Auth.getPrincipal(c)
868
+ const owner = Access.owner(c)
869
+ if (!owner || principal?.type !== 'api_key') return Access.unauthorized(c)
870
+ c.header('Cache-Control', 'no-store')
871
+
872
+ const idempotencyKey = c.req.valid('header')['idempotency-key']
873
+
874
+ const body = c.req.valid('json')
875
+ const subsidize = body.subsidize ?? false
876
+ if (subsidize && body.mode !== 'exactSource')
877
+ return Response.error(c, {
878
+ code: 'body_invalid',
879
+ message: 'Normalized delivery subsidies require `exactSource` mode.',
880
+ status: 400,
881
+ })
882
+ const db = Db.get(c.get('db'))
883
+ const identity = {
884
+ apiKeyId: principal.id,
885
+ keyHash: Idempotency.inputHash(idempotencyKey),
886
+ requestHash: Idempotency.inputHash(body),
887
+ }
888
+ const claimed = await (async () => {
889
+ try {
890
+ return {
891
+ claim: await RoutesIdempotency.claim(db, {
892
+ ...identity,
893
+ irrevocable: false,
894
+ operation: RoutesIdempotency.operations.transfer,
895
+ orgId: owner.orgId,
896
+ ttlMs: idempotencyPendingTtlMs,
897
+ }),
898
+ type: 'success',
899
+ } as const
900
+ } catch (cause) {
901
+ if (RoutesIdempotency.isOwnerFenceError(cause))
902
+ return { type: 'ownerNotFound' } as const
903
+ throw cause
904
+ }
905
+ })()
906
+ if (claimed.type === 'ownerNotFound') return ownerNotFound(c)
907
+ const claim = claimed.claim
908
+ if (claim.type === 'mismatch')
909
+ return Response.error(c, {
910
+ code: 'idempotency_conflict',
911
+ message: 'This Idempotency-Key was already used with different input.',
912
+ status: 409,
913
+ })
914
+ if (claim.type === 'pending')
915
+ return Response.error(c, {
916
+ code: 'idempotency_in_progress',
917
+ message: 'An equivalent route transfer creation is still running.',
918
+ status: 409,
919
+ })
920
+ if (claim.type === 'replay')
921
+ return c.json(
922
+ Response.validated(
923
+ schema.createRoutesTransfer.Response,
924
+ JSON.parse(claim.response) as Record<string, unknown>,
925
+ ),
926
+ 200,
927
+ )
928
+
929
+ const release = async () => {
930
+ try {
931
+ await RoutesIdempotency.release(db, {
932
+ apiKeyId: identity.apiKeyId,
933
+ createdAt: claim.createdAt,
934
+ keyHash: identity.keyHash,
935
+ })
936
+ } catch {
937
+ // The pending claim expires on its own; the response stays authoritative.
938
+ }
939
+ }
940
+ try {
941
+ if (subsidize && !options.transferSubsidy) {
942
+ await release()
943
+ return Response.error(c, {
944
+ code: 'not_implemented',
945
+ message: 'Destination subsidy settlement is not configured.',
946
+ status: 501,
947
+ })
948
+ }
949
+ const subsidyPolicy = subsidize
950
+ ? await RoutesSubsidy.check(db, {
951
+ environment: owner.environment,
952
+ orgId: owner.orgId,
953
+ })
954
+ : undefined
955
+ if (subsidyPolicy?.type === 'denied') {
956
+ RoutesObservability.recordSubsidyRejection(c.get('metrics'), {
957
+ reason: subsidyPolicy.reason,
958
+ routesEnvironment: owner.environment,
959
+ })
960
+ await release()
961
+ return Response.error(c, {
962
+ code: subsidyPolicy.reason,
963
+ message: RoutesSubsidy.denialMessages[subsidyPolicy.reason],
964
+ status: 403,
965
+ })
966
+ }
967
+ const attempts: RoutesProvider.ProviderAttempt[] = []
968
+ const catalog = await RoutesCatalog.snapshot(c)
969
+ const providers = c.get('providers').filter(RoutesProvider.is)
970
+ const selected = await RoutesProvider.prepareTransfer({
971
+ catalog,
972
+ destinationChain: body.destinationChain ?? `eip155:${c.get('chainId')}`,
973
+ destinationToken: body.destinationToken,
974
+ method: 'transaction',
975
+ mode: body.mode,
976
+ onAttempt: (attempt) => attempts.push(attempt),
977
+ provider: body.provider,
978
+ providers,
979
+ recipient: body.recipient,
980
+ sender: body.sender,
981
+ slippageBps: body.slippageBps,
982
+ sourceAmount: body.amount,
983
+ sourceChain: body.sourceChain,
984
+ sourceToken: body.sourceToken,
985
+ })
986
+ if (attempts.length > 0)
987
+ c.set('routesProviderAttempts', attempts.map(RoutesProvider.formatAttempt))
988
+ if (!selected) {
989
+ await release()
990
+ return quoteNotAvailable(c)
991
+ }
992
+
993
+ const { candidate, result } = selected
994
+ const subsidyDestinationChain = subsidize
995
+ ? catalog.chainsByKey.get(candidate.destinationChain.id)
996
+ : undefined
997
+ if (subsidize && !subsidyDestinationChain) {
998
+ await release()
999
+ return quoteNotAvailable(c)
1000
+ }
1001
+ if (
1002
+ subsidize &&
1003
+ (candidate.sourceChain.id !== `eip155:${c.get('chainId')}` ||
1004
+ !['eip155:1', 'eip155:8453'].includes(candidate.destinationChain.id))
1005
+ ) {
1006
+ await release()
1007
+ return Response.error(c, {
1008
+ code: 'body_invalid',
1009
+ message: 'Destination subsidies support Tempo transfers to Base or Ethereum.',
1010
+ status: 400,
1011
+ })
1012
+ }
1013
+ const destinationAmountRequired = subsidize
1014
+ ? RoutesTransferSubsidy.requiredAmount({
1015
+ destinationToken: candidate.destinationToken,
1016
+ sourceAmount: candidate.sourceAmount.amount,
1017
+ sourceToken: candidate.sourceToken,
1018
+ })
1019
+ : undefined
1020
+ const subsidyAmount =
1021
+ destinationAmountRequired !== undefined &&
1022
+ destinationAmountRequired > BigInt(result.destinationAmountMin)
1023
+ ? destinationAmountRequired - BigInt(result.destinationAmountMin)
1024
+ : 0n
1025
+ if (
1026
+ destinationAmountRequired !== undefined &&
1027
+ subsidyPolicy?.type === 'allowed' &&
1028
+ (!RoutesSubsidy.supportsGap(subsidyPolicy, {
1029
+ amount: subsidyAmount,
1030
+ destinationToken: candidate.destinationToken,
1031
+ }) ||
1032
+ (options.transferSubsidy !== undefined &&
1033
+ !RoutesSubsidy.supportsGap(options.transferSubsidy.policy, {
1034
+ amount: subsidyAmount,
1035
+ destinationToken: candidate.destinationToken,
1036
+ })))
1037
+ ) {
1038
+ await release()
1039
+ return Response.error(c, {
1040
+ code: 'routes_subsidy_limit_exceeded',
1041
+ message: 'The required destination subsidy exceeds the configured limit.',
1042
+ status: 403,
1043
+ })
1044
+ }
1045
+ const snapshot: RoutesTransfer.Snapshot = {
1046
+ destinationAmount: Value.tokenAmount({
1047
+ baseUnits: result.destinationAmount,
1048
+ currency: candidate.destinationToken.currency,
1049
+ decimals: candidate.destinationToken.decimals,
1050
+ }),
1051
+ destinationAmountMin: Value.tokenAmount({
1052
+ baseUnits: result.destinationAmountMin,
1053
+ currency: candidate.destinationToken.currency,
1054
+ decimals: candidate.destinationToken.decimals,
1055
+ }),
1056
+ ...(destinationAmountRequired === undefined
1057
+ ? {}
1058
+ : {
1059
+ destinationAmountRequired: Value.tokenAmount({
1060
+ baseUnits: destinationAmountRequired,
1061
+ currency: candidate.destinationToken.currency,
1062
+ decimals: candidate.destinationToken.decimals,
1063
+ }),
1064
+ }),
1065
+ destinationChain: candidate.destinationChain,
1066
+ destinationToken: candidate.destinationToken,
1067
+ fees: result.fees.map((fee) => {
1068
+ const token =
1069
+ fee.token ??
1070
+ (fee.side === 'source' ? candidate.sourceToken : candidate.destinationToken)
1071
+ return {
1072
+ amount: Value.tokenAmount({
1073
+ baseUnits: fee.amount,
1074
+ currency: token.currency,
1075
+ decimals: token.decimals,
1076
+ }),
1077
+ side: fee.side,
1078
+ token,
1079
+ type: 'provider',
1080
+ }
1081
+ }),
1082
+ method: 'transaction',
1083
+ mode: body.mode,
1084
+ provider: candidate.provider,
1085
+ quote: { expiresAt: result.expiresAt, sampledAt: result.sampledAt },
1086
+ recipient: selected.recipient,
1087
+ sender: selected.sender,
1088
+ sourceAmount: Value.tokenAmount({
1089
+ baseUnits: candidate.sourceAmount.amount,
1090
+ currency: candidate.sourceToken.currency,
1091
+ decimals: candidate.sourceToken.decimals,
1092
+ }),
1093
+ sourceChain: candidate.sourceChain,
1094
+ sourceToken: candidate.sourceToken,
1095
+ subsidize,
1096
+ }
1097
+
1098
+ // The transfer row, its version-1 event, and the replay body commit
1099
+ // atomically so a crash cannot leave a claimed key without a replay.
1100
+ const created = await db.transaction(async (tx) => {
1101
+ const input: RoutesTransfer.create.Input = {
1102
+ apiKeyId: principal.id,
1103
+ environment: owner.environment,
1104
+ orgId: owner.orgId,
1105
+ projectId: owner.projectId,
1106
+ providerState:
1107
+ result.correlation || result.providerState
1108
+ ? {
1109
+ ...result.correlation,
1110
+ ...result.providerState,
1111
+ }
1112
+ : undefined,
1113
+ snapshot,
1114
+ }
1115
+ const { record, references } =
1116
+ subsidize && subsidyAmount > 0n && options.transferSubsidy
1117
+ ? await RoutesTransfer.reserveSubsidyCommitmentIn(tx, input, {
1118
+ account: options.transferSubsidy.account,
1119
+ chainId: candidate.destinationChain.id,
1120
+ check: ({ reservations }) =>
1121
+ options.transferSubsidy!.check({
1122
+ amount: subsidyAmount,
1123
+ chain: subsidyDestinationChain!,
1124
+ recipient: getAddress(selected.recipient),
1125
+ reservations,
1126
+ token: getAddress(candidate.destinationToken.address),
1127
+ }),
1128
+ subsidyCommitmentAmount: Value.tokenAmount({
1129
+ baseUnits: subsidyAmount,
1130
+ currency: candidate.destinationToken.currency,
1131
+ decimals: candidate.destinationToken.decimals,
1132
+ }),
1133
+ tokenAddress: candidate.destinationToken.address,
1134
+ })
1135
+ : await RoutesTransfer.createIn(tx, input)
1136
+ const validated = Response.validated(
1137
+ schema.createRoutesTransfer.Response,
1138
+ RoutesTransfer.toCreated(record, result.action),
1139
+ )
1140
+ const completion = await RoutesIdempotency.complete(tx, {
1141
+ apiKeyId: identity.apiKeyId,
1142
+ createdAt: claim.createdAt,
1143
+ keyHash: identity.keyHash,
1144
+ replayTtlMs: idempotencyReplayTtlMs,
1145
+ response: JSON.stringify(validated),
1146
+ transferId: record.id,
1147
+ })
1148
+ if (!completion)
1149
+ throw new IdempotencyLeaseLostError('Route transfer creation lease was lost.')
1150
+ return { record, references, response: validated }
1151
+ })
1152
+ RoutesObservability.recordTransfer(c.get('metrics'), {
1153
+ record: created.record,
1154
+ ...(body.provider === undefined && selected.preparedCount > 1
1155
+ ? { selection: { bestDestinationAmount: selected.bestDestinationAmount } }
1156
+ : {}),
1157
+ })
1158
+ if (options.dispatchTransferUpdates && created.references.length > 0)
1159
+ try {
1160
+ await options.dispatchTransferUpdates(created.references)
1161
+ } catch (cause) {
1162
+ return Response.upstream(c, cause)
1163
+ }
1164
+ return c.json(created.response, 200)
1165
+ } catch (cause) {
1166
+ await release()
1167
+ if (cause instanceof RoutesProvider.InvalidAmountError)
1168
+ return Response.error(c, { code: 'body_invalid', message: 'Invalid `amount`.', status: 400 }) // prettier-ignore
1169
+ if (cause instanceof RoutesProvider.InvalidRecipientAddressError)
1170
+ return Response.error(c, { code: 'body_invalid', message: 'Invalid `recipient`.', status: 400 }) // prettier-ignore
1171
+ if (cause instanceof RoutesProvider.InvalidSenderAddressError)
1172
+ return Response.error(c, { code: 'body_invalid', message: 'Invalid `sender`.', status: 400 }) // prettier-ignore
1173
+ if (cause instanceof RoutesProvider.UnsupportedProviderError)
1174
+ return Response.error(c, { code: 'body_invalid', message: 'Unsupported `provider`.', status: 400 }) // prettier-ignore
1175
+ if (
1176
+ cause instanceof RoutesTransferSubsidy.UnsupportedAmountError ||
1177
+ cause instanceof RoutesTransferSubsidy.UnsupportedTokenError
1178
+ )
1179
+ return Response.error(c, {
1180
+ code: 'body_invalid',
1181
+ message: 'Normalized delivery requires compatible USD token amounts.',
1182
+ status: 400,
1183
+ })
1184
+ if (
1185
+ cause instanceof RoutesProvider.UnsupportedDestinationChainError ||
1186
+ cause instanceof RoutesProvider.UnsupportedSourceChainError
1187
+ )
1188
+ return quoteNotAvailable(c)
1189
+ if (cause instanceof RoutesTransfer.QuoteExpiredError) return quoteNotAvailable(c)
1190
+ if (cause instanceof RoutesProvider.ProviderQuoteError) {
1191
+ if (cause.routesProviderAttempts.length > 0)
1192
+ c.set('routesProviderAttempts', cause.routesProviderAttempts)
1193
+ if (cause.providerFailure) c.set('providerFailure', cause.providerFailure)
1194
+ if (cause.providerFailures) c.set('providerFailures', cause.providerFailures)
1195
+ return Response.error(c, {
1196
+ code: 'upstream_error',
1197
+ message: 'No route provider could prepare the transfer.',
1198
+ status: 502,
1199
+ })
1200
+ }
1201
+ if (cause instanceof RoutesTransferSubsidy.BalanceUnavailableError)
1202
+ return Response.error(c, {
1203
+ code: 'subsidy_inventory_unavailable',
1204
+ message: 'Tempo lacks enough destination token inventory or native gas.',
1205
+ status: 503,
1206
+ })
1207
+ if (cause instanceof RoutesTransferSubsidy.InventoryUpstreamError)
1208
+ return Response.upstream(c, cause)
1209
+ if (
1210
+ cause instanceof RoutesTransfer.OrganizationNotFoundError ||
1211
+ RoutesIdempotency.isOwnerFenceError(cause)
1212
+ )
1213
+ return ownerNotFound(c)
1214
+ if (cause instanceof RoutesTransfer.SubsidySignerBlockedError)
1215
+ return Response.error(c, {
1216
+ code: 'subsidy_signer_unavailable',
1217
+ message: 'Destination subsidy settlement is temporarily unavailable.',
1218
+ status: 503,
1219
+ })
1220
+ throw cause
1221
+ }
1222
+ },
1223
+ )
1224
+ .post(
1225
+ '/v1/routes/transfers/vault',
1226
+ Auth.policy({ apiKey: { scopes: ['routes:write'] } }),
1227
+ OpenApi.validate('header', schema.createRoutesTransferVault.Headers, {
1228
+ code: 'idempotency_key_required',
1229
+ message: 'Route transfer creation requires an `Idempotency-Key` header.',
1230
+ }),
1231
+ OpenApi.validate('json', schema.createRoutesTransferVault.Body, {
1232
+ code: 'body_invalid',
1233
+ message: 'Check the request body and try again.',
1234
+ }),
1235
+ OpenApi.describeRoute({
1236
+ description: 'Creates a transfer into a Tempo Earn vault.',
1237
+ operationId: 'createRoutesTransferVault',
1238
+ responses: unimplementedRoutesTransferResponses,
1239
+ summary: 'Create transfer into vault',
1240
+ tags: ['Route Transfers'],
1241
+ }),
1242
+ (c) => {
1243
+ if (Auth.narrowAccess) return Auth.accessError(c)
1244
+ if (OpenApi.narrowValidation)
1245
+ return OpenApi.validationError(c, {
1246
+ code: 'body_invalid',
1247
+ message: 'Check the request body and try again.',
1248
+ })
1249
+
1250
+ c.header('Cache-Control', 'no-store')
1251
+ return Response.error(c, {
1252
+ code: 'not_implemented',
1253
+ message: 'Vault route transfers are not implemented.',
1254
+ status: 501,
1255
+ })
1256
+ },
1257
+ )
1258
+ .post(
1259
+ '/v1/routes/transfers/zone',
1260
+ Auth.policy({ apiKey: { scopes: ['routes:write'] } }),
1261
+ OpenApi.validate('header', schema.createRoutesTransferZone.Headers, {
1262
+ code: 'idempotency_key_required',
1263
+ message: 'Route transfer creation requires an `Idempotency-Key` header.',
1264
+ }),
1265
+ OpenApi.validate('json', schema.createRoutesTransferZone.Body, {
1266
+ code: 'body_invalid',
1267
+ message: 'Check the request body and try again.',
1268
+ }),
1269
+ OpenApi.describeRoute({
1270
+ description: 'Creates a transfer into a Tempo Zone.',
1271
+ operationId: 'createRoutesTransferZone',
1272
+ responses: unimplementedRoutesTransferResponses,
1273
+ summary: 'Create transfer into zone',
1274
+ tags: ['Route Transfers'],
1275
+ }),
1276
+ (c) => {
1277
+ if (Auth.narrowAccess) return Auth.accessError(c)
1278
+ if (OpenApi.narrowValidation)
1279
+ return OpenApi.validationError(c, {
1280
+ code: 'body_invalid',
1281
+ message: 'Check the request body and try again.',
1282
+ })
1283
+
1284
+ c.header('Cache-Control', 'no-store')
1285
+ return Response.error(c, {
1286
+ code: 'not_implemented',
1287
+ message: 'Zone route transfers are not implemented.',
1288
+ status: 501,
1289
+ })
1290
+ },
1291
+ )
1292
+ }
1293
+
1294
+ export declare namespace transfers {
1295
+ /** Route transfer route dependencies. */
1296
+ type Options = {
1297
+ /** Enqueues one registered transfer for destination reconciliation. */
1298
+ dispatchTransferReconciliation?:
1299
+ | ((message: RoutesTransferReconciliation.Message) => Promise<void>)
1300
+ | undefined
1301
+ /** Enqueues webhook updates staged with transfer mutations. */
1302
+ dispatchTransferUpdates?:
1303
+ | ((references: readonly Webhooks.QueueReference[]) => Promise<number>)
1304
+ | undefined
1305
+ /** Records completed route lifecycle intervals. */
1306
+ recordLifecycleInterval?:
1307
+ | ((interval: RoutesObservability.LifecycleInterval) => Promise<void>)
1308
+ | undefined
1309
+ /** Read-only destination subsidy inventory, when settlement is configured. */
1310
+ transferSubsidy?: RoutesTransferSubsidy.Inventory | undefined
1311
+ }
1312
+ }
1313
+
1314
+ function quoteNotAvailable(c: Context<App.Environment>) {
1315
+ return Response.error(c, {
1316
+ code: 'quote_not_available',
1317
+ message: 'No provider can prepare the requested provider route.',
1318
+ status: 404,
1319
+ })
1320
+ }
1321
+
1322
+ function ownerNotFound(c: Context<App.Environment>) {
1323
+ return Response.error(c, {
1324
+ code: 'api_key_forbidden',
1325
+ message: 'API key organization no longer exists.',
1326
+ status: 403,
1327
+ })
1328
+ }
1329
+
1330
+ class IdempotencyLeaseLostError extends Error {
1331
+ override name = 'Routes.IdempotencyLeaseLostError'
1332
+ }