tapimo 0.13.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1143) hide show
  1. package/README.md +7 -4
  2. package/dist/ApiKey.js +1 -1
  3. package/dist/ApiKey.js.map +1 -1
  4. package/dist/ApiKeys.d.ts +95 -14
  5. package/dist/ApiKeys.d.ts.map +1 -1
  6. package/dist/ApiKeys.js +360 -49
  7. package/dist/ApiKeys.js.map +1 -1
  8. package/dist/App.d.ts +21383 -18056
  9. package/dist/App.d.ts.map +1 -1
  10. package/dist/App.js +301 -22
  11. package/dist/App.js.map +1 -1
  12. package/dist/Assets.d.ts.map +1 -1
  13. package/dist/Assets.js +2 -1
  14. package/dist/Assets.js.map +1 -1
  15. package/dist/Handler.d.ts +0 -1
  16. package/dist/Handler.d.ts.map +1 -1
  17. package/dist/Handler.js +0 -1
  18. package/dist/Handler.js.map +1 -1
  19. package/dist/Scope.d.ts +13 -5
  20. package/dist/Scope.d.ts.map +1 -1
  21. package/dist/Scope.js +16 -5
  22. package/dist/Scope.js.map +1 -1
  23. package/dist/Webhooks.js +2 -2
  24. package/dist/Webhooks.js.map +1 -1
  25. package/dist/admin/App.d.ts +3936 -1337
  26. package/dist/admin/App.d.ts.map +1 -1
  27. package/dist/admin/App.js +26 -5
  28. package/dist/admin/App.js.map +1 -1
  29. package/dist/admin/apps/api-keys.d.ts +159 -7
  30. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  31. package/dist/admin/apps/api-keys.js +95 -43
  32. package/dist/admin/apps/api-keys.js.map +1 -1
  33. package/dist/admin/apps/earn-vaults.d.ts +1446 -0
  34. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  35. package/dist/admin/apps/earn-vaults.js +465 -8
  36. package/dist/admin/apps/earn-vaults.js.map +1 -1
  37. package/dist/admin/apps/organizations.d.ts +344 -3
  38. package/dist/admin/apps/organizations.d.ts.map +1 -1
  39. package/dist/admin/apps/organizations.js +288 -10
  40. package/dist/admin/apps/organizations.js.map +1 -1
  41. package/dist/admin/apps/routes-support.d.ts +95 -0
  42. package/dist/admin/apps/routes-support.d.ts.map +1 -0
  43. package/dist/admin/apps/routes-support.js +151 -0
  44. package/dist/admin/apps/routes-support.js.map +1 -0
  45. package/dist/admin/apps/routes.d.ts +2764 -0
  46. package/dist/admin/apps/routes.d.ts.map +1 -0
  47. package/dist/admin/apps/routes.js +728 -0
  48. package/dist/admin/apps/routes.js.map +1 -0
  49. package/dist/admin/apps/subsidies.d.ts +501 -0
  50. package/dist/admin/apps/subsidies.d.ts.map +1 -0
  51. package/dist/admin/apps/subsidies.js +384 -0
  52. package/dist/admin/apps/subsidies.js.map +1 -0
  53. package/dist/admin/apps/verified-tokens.d.ts +16 -16
  54. package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
  55. package/dist/admin/apps/verified-tokens.js +3 -3
  56. package/dist/admin/apps/verified-tokens.js.map +1 -1
  57. package/dist/admin/ui.generated.d.ts +1 -1
  58. package/dist/admin/ui.generated.d.ts.map +1 -1
  59. package/dist/admin/ui.generated.js +129 -69
  60. package/dist/admin/ui.generated.js.map +1 -1
  61. package/dist/analytics/Analytics.d.ts +5 -2
  62. package/dist/analytics/Analytics.d.ts.map +1 -1
  63. package/dist/analytics/Analytics.js +31 -1
  64. package/dist/analytics/Analytics.js.map +1 -1
  65. package/dist/analytics/tables/requestEvents.d.ts +2 -1
  66. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  67. package/dist/analytics/tables/requestEvents.js +10 -1
  68. package/dist/analytics/tables/requestEvents.js.map +1 -1
  69. package/dist/analytics/tables/routesLifecycleIntervals.d.ts +72 -0
  70. package/dist/analytics/tables/routesLifecycleIntervals.d.ts.map +1 -0
  71. package/dist/analytics/tables/routesLifecycleIntervals.js +56 -0
  72. package/dist/analytics/tables/routesLifecycleIntervals.js.map +1 -0
  73. package/dist/apps/Zones.d.ts +21 -12526
  74. package/dist/apps/Zones.d.ts.map +1 -1
  75. package/dist/apps/Zones.js +40 -8
  76. package/dist/apps/Zones.js.map +1 -1
  77. package/dist/apps/data/App.d.ts +4310 -2548
  78. package/dist/apps/data/App.d.ts.map +1 -1
  79. package/dist/apps/data/App.js +86 -26
  80. package/dist/apps/data/App.js.map +1 -1
  81. package/dist/apps/data/routes/activities.d.ts +364 -34
  82. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  83. package/dist/apps/data/routes/activities.js +495 -190
  84. package/dist/apps/data/routes/activities.js.map +1 -1
  85. package/dist/apps/data/routes/addresses.d.ts +94 -22
  86. package/dist/apps/data/routes/addresses.d.ts.map +1 -1
  87. package/dist/apps/data/routes/blocks.d.ts +37 -37
  88. package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
  89. package/dist/apps/data/routes/coingecko.js +47 -21
  90. package/dist/apps/data/routes/coingecko.js.map +1 -1
  91. package/dist/apps/data/routes/earn.d.ts +1641 -352
  92. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  93. package/dist/apps/data/routes/earn.js +1561 -120
  94. package/dist/apps/data/routes/earn.js.map +1 -1
  95. package/dist/apps/data/routes/exchanges.d.ts +15 -0
  96. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  97. package/dist/apps/data/routes/exchanges.js +180 -114
  98. package/dist/apps/data/routes/exchanges.js.map +1 -1
  99. package/dist/apps/data/routes/fee-amm.d.ts +5 -0
  100. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  101. package/dist/apps/data/routes/fee-amm.js +49 -38
  102. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  103. package/dist/apps/data/routes/indexer.d.ts +125 -0
  104. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  105. package/dist/apps/data/routes/indexer.js +83 -27
  106. package/dist/apps/data/routes/indexer.js.map +1 -1
  107. package/dist/apps/data/routes/rpc.d.ts +507 -33
  108. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  109. package/dist/apps/data/routes/rpc.js +266 -156
  110. package/dist/apps/data/routes/rpc.js.map +1 -1
  111. package/dist/apps/data/routes/tokenlist.d.ts +47 -15
  112. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  113. package/dist/apps/data/routes/tokenlist.js +68 -11
  114. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  115. package/dist/apps/data/routes/tokens.d.ts +95 -93
  116. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  117. package/dist/apps/data/routes/tokens.js +26 -14
  118. package/dist/apps/data/routes/tokens.js.map +1 -1
  119. package/dist/apps/data/routes/transfers.d.ts +16 -0
  120. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  121. package/dist/apps/data/routes/transfers.js +9 -7
  122. package/dist/apps/data/routes/transfers.js.map +1 -1
  123. package/dist/apps/data/routes/verified-tokens.d.ts +4 -4
  124. package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -1
  125. package/dist/apps/data/routes/verified-tokens.js +64 -20
  126. package/dist/apps/data/routes/verified-tokens.js.map +1 -1
  127. package/dist/apps/data/routes/webhooks.d.ts +1210 -70
  128. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  129. package/dist/apps/data/routes/webhooks.js +301 -163
  130. package/dist/apps/data/routes/webhooks.js.map +1 -1
  131. package/dist/apps/data/routes/zones.d.ts.map +1 -1
  132. package/dist/apps/data/routes/zones.js +20 -12
  133. package/dist/apps/data/routes/zones.js.map +1 -1
  134. package/dist/apps/docs/reference.js +2 -2
  135. package/dist/apps/docs/reference.js.map +1 -1
  136. package/dist/apps/index.d.ts +1 -1
  137. package/dist/apps/index.d.ts.map +1 -1
  138. package/dist/apps/index.js +1 -1
  139. package/dist/apps/index.js.map +1 -1
  140. package/dist/apps/management/App.d.ts +4119 -3297
  141. package/dist/apps/management/App.d.ts.map +1 -1
  142. package/dist/apps/management/App.js +5 -14
  143. package/dist/apps/management/App.js.map +1 -1
  144. package/dist/apps/management/Billing.d.ts +49 -8
  145. package/dist/apps/management/Billing.d.ts.map +1 -1
  146. package/dist/apps/management/Billing.js +221 -26
  147. package/dist/apps/management/Billing.js.map +1 -1
  148. package/dist/apps/management/routes/api-keys.d.ts +174 -72
  149. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  150. package/dist/apps/management/routes/api-keys.js +43 -15
  151. package/dist/apps/management/routes/api-keys.js.map +1 -1
  152. package/dist/apps/management/routes/billing.d.ts +364 -78
  153. package/dist/apps/management/routes/billing.d.ts.map +1 -1
  154. package/dist/apps/management/routes/billing.js +274 -49
  155. package/dist/apps/management/routes/billing.js.map +1 -1
  156. package/dist/apps/management/routes/faucet.d.ts +6 -6
  157. package/dist/apps/management/routes/faucet.js +1 -1
  158. package/dist/apps/management/routes/faucet.js.map +1 -1
  159. package/dist/apps/management/routes/invitations.d.ts +99 -24
  160. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  161. package/dist/apps/management/routes/invitations.js +117 -13
  162. package/dist/apps/management/routes/invitations.js.map +1 -1
  163. package/dist/apps/management/routes/invite-links.d.ts +42 -42
  164. package/dist/apps/management/routes/me.d.ts.map +1 -1
  165. package/dist/apps/management/routes/me.js +6 -2
  166. package/dist/apps/management/routes/me.js.map +1 -1
  167. package/dist/apps/management/routes/members.d.ts +16 -16
  168. package/dist/apps/management/routes/orgs.d.ts +36 -20
  169. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  170. package/dist/apps/management/routes/orgs.js +52 -12
  171. package/dist/apps/management/routes/orgs.js.map +1 -1
  172. package/dist/apps/management/routes/projects.d.ts +40 -40
  173. package/dist/apps/management/routes/projects.d.ts.map +1 -1
  174. package/dist/apps/management/routes/projects.js +6 -1
  175. package/dist/apps/management/routes/projects.js.map +1 -1
  176. package/dist/apps/management/routes/scopes.d.ts.map +1 -1
  177. package/dist/apps/management/routes/scopes.js +4 -1
  178. package/dist/apps/management/routes/scopes.js.map +1 -1
  179. package/dist/apps/management/routes/usage.d.ts +8 -8
  180. package/dist/apps/management/routes/usage.js +21 -4
  181. package/dist/apps/management/routes/usage.js.map +1 -1
  182. package/dist/apps/management/routes/verified-token-requests.d.ts +16 -16
  183. package/dist/apps/management/routes/webhooks.d.ts +931 -215
  184. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  185. package/dist/apps/management/routes/webhooks.js +71 -25
  186. package/dist/apps/management/routes/webhooks.js.map +1 -1
  187. package/dist/apps/mcp.d.ts +1 -1
  188. package/dist/apps/mcp.js +7 -7
  189. package/dist/apps/mcp.js.map +1 -1
  190. package/dist/apps/mpp/App.d.ts.map +1 -1
  191. package/dist/apps/mpp/App.js +35 -7
  192. package/dist/apps/mpp/App.js.map +1 -1
  193. package/dist/apps/mpp/internal/Adapter.d.ts +2 -0
  194. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -1
  195. package/dist/apps/mpp/internal/Adapter.js +30 -1
  196. package/dist/apps/mpp/internal/Adapter.js.map +1 -1
  197. package/dist/apps/mpp/internal/Policy.d.ts +22 -4
  198. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
  199. package/dist/apps/mpp/internal/Policy.js +24 -6
  200. package/dist/apps/mpp/internal/Policy.js.map +1 -1
  201. package/dist/apps/mpp/internal/Sponsorship.d.ts +3 -0
  202. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
  203. package/dist/apps/mpp/internal/Sponsorship.js +6 -3
  204. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
  205. package/dist/apps/relay/App.d.ts +2 -0
  206. package/dist/apps/relay/App.d.ts.map +1 -1
  207. package/dist/apps/relay/App.js +177 -26
  208. package/dist/apps/relay/App.js.map +1 -1
  209. package/dist/apps/relay/Sponsorships.d.ts +5 -3
  210. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  211. package/dist/apps/relay/Sponsorships.js +232 -25
  212. package/dist/apps/relay/Sponsorships.js.map +1 -1
  213. package/dist/apps/{funding → routes}/Access.d.ts +4 -4
  214. package/dist/apps/routes/Access.d.ts.map +1 -0
  215. package/dist/apps/{funding → routes}/Access.js +4 -4
  216. package/dist/apps/routes/Access.js.map +1 -0
  217. package/dist/apps/{funding → routes}/App.d.ts +841 -136
  218. package/dist/apps/{funding → routes}/App.d.ts.map +1 -1
  219. package/dist/apps/{funding → routes}/App.js +17 -17
  220. package/dist/apps/routes/App.js.map +1 -0
  221. package/dist/apps/routes/Inventory.d.ts.map +1 -0
  222. package/dist/apps/{funding → routes}/Inventory.js +2 -2
  223. package/dist/apps/routes/Inventory.js.map +1 -0
  224. package/dist/apps/routes/index.d.ts +2 -0
  225. package/dist/apps/routes/index.d.ts.map +1 -0
  226. package/dist/apps/routes/index.js +2 -0
  227. package/dist/apps/routes/index.js.map +1 -0
  228. package/dist/apps/{funding → routes}/routes/chains.d.ts +7 -7
  229. package/dist/apps/routes/routes/chains.d.ts.map +1 -0
  230. package/dist/apps/{funding → routes}/routes/chains.js +25 -25
  231. package/dist/apps/routes/routes/chains.js.map +1 -0
  232. package/dist/apps/{funding → routes}/routes/deposit-addresses.d.ts +123 -59
  233. package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -0
  234. package/dist/apps/{funding → routes}/routes/deposit-addresses.js +498 -223
  235. package/dist/apps/routes/routes/deposit-addresses.js.map +1 -0
  236. package/dist/apps/{funding → routes}/routes/providers.d.ts +8 -8
  237. package/dist/apps/routes/routes/providers.d.ts.map +1 -0
  238. package/dist/apps/routes/routes/providers.js +57 -0
  239. package/dist/apps/routes/routes/providers.js.map +1 -0
  240. package/dist/apps/{funding → routes}/routes/quotes.d.ts +19 -16
  241. package/dist/apps/routes/routes/quotes.d.ts.map +1 -0
  242. package/dist/apps/{funding → routes}/routes/quotes.js +55 -38
  243. package/dist/apps/routes/routes/quotes.js.map +1 -0
  244. package/dist/apps/{funding → routes}/routes/transfers.d.ts +957 -71
  245. package/dist/apps/routes/routes/transfers.d.ts.map +1 -0
  246. package/dist/apps/routes/routes/transfers.js +1140 -0
  247. package/dist/apps/routes/routes/transfers.js.map +1 -0
  248. package/dist/cli/Cli.d.ts +30 -0
  249. package/dist/cli/Cli.d.ts.map +1 -1
  250. package/dist/cli/commands/admin.d.ts +36 -0
  251. package/dist/cli/commands/admin.d.ts.map +1 -1
  252. package/dist/cli/commands/admin.js +273 -0
  253. package/dist/cli/commands/admin.js.map +1 -1
  254. package/dist/cloudflare.d.ts +16 -14
  255. package/dist/cloudflare.d.ts.map +1 -1
  256. package/dist/cloudflare.js +26 -21
  257. package/dist/cloudflare.js.map +1 -1
  258. package/dist/db/Db.d.ts +63 -21
  259. package/dist/db/Db.d.ts.map +1 -1
  260. package/dist/db/Db.js +1052 -15
  261. package/dist/db/Db.js.map +1 -1
  262. package/dist/db/Schema.d.ts +785 -133
  263. package/dist/db/Schema.d.ts.map +1 -1
  264. package/dist/db/Schema.js +590 -162
  265. package/dist/db/Schema.js.map +1 -1
  266. package/dist/db/tables/apiKeyAdmissionBootstraps.d.ts +4 -0
  267. package/dist/db/tables/apiKeyAdmissionBootstraps.d.ts.map +1 -0
  268. package/dist/db/tables/apiKeyAdmissionBootstraps.js +2 -0
  269. package/dist/db/tables/apiKeyAdmissionBootstraps.js.map +1 -0
  270. package/dist/db/tables/apiKeyAdmissions.d.ts +73 -0
  271. package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -0
  272. package/dist/db/tables/apiKeyAdmissions.js +142 -0
  273. package/dist/db/tables/apiKeyAdmissions.js.map +1 -0
  274. package/dist/db/tables/apiKeyOwnerAdmissions.d.ts +4 -0
  275. package/dist/db/tables/apiKeyOwnerAdmissions.d.ts.map +1 -0
  276. package/dist/db/tables/apiKeyOwnerAdmissions.js +2 -0
  277. package/dist/db/tables/apiKeyOwnerAdmissions.js.map +1 -0
  278. package/dist/db/tables/apiKeyOwnerTombstones.d.ts +20 -0
  279. package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -0
  280. package/dist/db/tables/apiKeyOwnerTombstones.js +57 -0
  281. package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -0
  282. package/dist/db/tables/apiKeyRevocations.d.ts +21 -0
  283. package/dist/db/tables/apiKeyRevocations.d.ts.map +1 -0
  284. package/dist/db/tables/apiKeyRevocations.js +98 -0
  285. package/dist/db/tables/apiKeyRevocations.js.map +1 -0
  286. package/dist/db/tables/authAccounts.d.ts +47 -0
  287. package/dist/db/tables/authAccounts.d.ts.map +1 -0
  288. package/dist/db/tables/authAccounts.js +72 -0
  289. package/dist/db/tables/authAccounts.js.map +1 -0
  290. package/dist/db/tables/authSessions.d.ts +12 -0
  291. package/dist/db/tables/authSessions.d.ts.map +1 -0
  292. package/dist/db/tables/authSessions.js +2 -0
  293. package/dist/db/tables/authSessions.js.map +1 -0
  294. package/dist/db/tables/authVerifications.d.ts +12 -0
  295. package/dist/db/tables/authVerifications.d.ts.map +1 -0
  296. package/dist/db/tables/authVerifications.js +2 -0
  297. package/dist/db/tables/authVerifications.js.map +1 -0
  298. package/dist/db/tables/invitations.d.ts +17 -1
  299. package/dist/db/tables/invitations.d.ts.map +1 -1
  300. package/dist/db/tables/invitations.js +123 -43
  301. package/dist/db/tables/invitations.js.map +1 -1
  302. package/dist/db/tables/memberships.d.ts +8 -0
  303. package/dist/db/tables/memberships.d.ts.map +1 -1
  304. package/dist/db/tables/memberships.js +51 -2
  305. package/dist/db/tables/memberships.js.map +1 -1
  306. package/dist/db/tables/organizations.d.ts +51 -5
  307. package/dist/db/tables/organizations.d.ts.map +1 -1
  308. package/dist/db/tables/organizations.js +135 -47
  309. package/dist/db/tables/organizations.js.map +1 -1
  310. package/dist/db/tables/projects.d.ts +27 -1
  311. package/dist/db/tables/projects.d.ts.map +1 -1
  312. package/dist/db/tables/projects.js +38 -3
  313. package/dist/db/tables/projects.js.map +1 -1
  314. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  315. package/dist/db/tables/requestUsage.js.map +1 -1
  316. package/dist/db/tables/rewardAccounts.d.ts +86 -0
  317. package/dist/db/tables/rewardAccounts.d.ts.map +1 -0
  318. package/dist/db/tables/rewardAccounts.js +88 -0
  319. package/dist/db/tables/rewardAccounts.js.map +1 -0
  320. package/dist/db/tables/rewardCampaignDistributors.d.ts +36 -0
  321. package/dist/db/tables/rewardCampaignDistributors.d.ts.map +1 -0
  322. package/dist/db/tables/rewardCampaignDistributors.js +30 -0
  323. package/dist/db/tables/rewardCampaignDistributors.js.map +1 -0
  324. package/dist/db/tables/rewardCampaigns.d.ts +171 -0
  325. package/dist/db/tables/rewardCampaigns.d.ts.map +1 -0
  326. package/dist/db/tables/rewardCampaigns.js +392 -0
  327. package/dist/db/tables/rewardCampaigns.js.map +1 -0
  328. package/dist/db/tables/rewardCredits.d.ts +53 -0
  329. package/dist/db/tables/rewardCredits.d.ts.map +1 -0
  330. package/dist/db/tables/rewardCredits.js +63 -0
  331. package/dist/db/tables/rewardCredits.js.map +1 -0
  332. package/dist/db/tables/rewardEligibilityAssociations.d.ts +61 -0
  333. package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -0
  334. package/dist/db/tables/rewardEligibilityAssociations.js +103 -0
  335. package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -0
  336. package/dist/db/tables/rewardRuns.d.ts +188 -0
  337. package/dist/db/tables/rewardRuns.d.ts.map +1 -0
  338. package/dist/db/tables/rewardRuns.js +278 -0
  339. package/dist/db/tables/rewardRuns.js.map +1 -0
  340. package/dist/db/tables/rewardTransactionAttempts.d.ts +100 -0
  341. package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -0
  342. package/dist/db/tables/rewardTransactionAttempts.js +163 -0
  343. package/dist/db/tables/rewardTransactionAttempts.js.map +1 -0
  344. package/dist/db/tables/routesCatalog.d.ts +58 -0
  345. package/dist/db/tables/routesCatalog.d.ts.map +1 -0
  346. package/dist/db/tables/{fundingCatalog.js → routesCatalog.js} +19 -19
  347. package/dist/db/tables/routesCatalog.js.map +1 -0
  348. package/dist/db/tables/routesDepositAddresses.d.ts +476 -0
  349. package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -0
  350. package/dist/db/tables/routesDepositAddresses.js +587 -0
  351. package/dist/db/tables/routesDepositAddresses.js.map +1 -0
  352. package/dist/db/tables/{fundingDepositRequestObservations.d.ts → routesDepositRequestObservations.d.ts} +6 -6
  353. package/dist/db/tables/routesDepositRequestObservations.d.ts.map +1 -0
  354. package/dist/db/tables/{fundingDepositRequestObservations.js → routesDepositRequestObservations.js} +6 -6
  355. package/dist/db/tables/routesDepositRequestObservations.js.map +1 -0
  356. package/dist/db/tables/{fundingDeposits.d.ts → routesDeposits.d.ts} +210 -22
  357. package/dist/db/tables/routesDeposits.d.ts.map +1 -0
  358. package/dist/db/tables/routesDeposits.js +576 -0
  359. package/dist/db/tables/routesDeposits.js.map +1 -0
  360. package/dist/db/tables/routesIdempotency.d.ts +166 -0
  361. package/dist/db/tables/routesIdempotency.d.ts.map +1 -0
  362. package/dist/db/tables/routesIdempotency.js +330 -0
  363. package/dist/db/tables/routesIdempotency.js.map +1 -0
  364. package/dist/db/tables/routesSubsidies.d.ts +27 -0
  365. package/dist/db/tables/routesSubsidies.d.ts.map +1 -0
  366. package/dist/db/tables/routesSubsidies.js +45 -0
  367. package/dist/db/tables/routesSubsidies.js.map +1 -0
  368. package/dist/db/tables/{fundingTransferEvents.d.ts → routesTransferEvents.d.ts} +3 -3
  369. package/dist/db/tables/routesTransferEvents.d.ts.map +1 -0
  370. package/dist/db/tables/{fundingTransferEvents.js → routesTransferEvents.js} +3 -3
  371. package/dist/db/tables/routesTransferEvents.js.map +1 -0
  372. package/dist/db/tables/routesTransferSubsidies.d.ts +19 -0
  373. package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -0
  374. package/dist/db/tables/routesTransferSubsidies.js +17 -0
  375. package/dist/db/tables/routesTransferSubsidies.js.map +1 -0
  376. package/dist/db/tables/routesTransferSubsidyNonces.d.ts +51 -0
  377. package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -0
  378. package/dist/db/tables/routesTransferSubsidyNonces.js +82 -0
  379. package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -0
  380. package/dist/db/tables/routesTransferTransactions.d.ts +77 -0
  381. package/dist/db/tables/routesTransferTransactions.d.ts.map +1 -0
  382. package/dist/db/tables/routesTransferTransactions.js +86 -0
  383. package/dist/db/tables/routesTransferTransactions.js.map +1 -0
  384. package/dist/db/tables/routesTransfers.d.ts +319 -0
  385. package/dist/db/tables/routesTransfers.d.ts.map +1 -0
  386. package/dist/db/tables/routesTransfers.js +372 -0
  387. package/dist/db/tables/routesTransfers.js.map +1 -0
  388. package/dist/db/tables/sponsoredTransactions.d.ts +112 -13
  389. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  390. package/dist/db/tables/sponsoredTransactions.js +241 -38
  391. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  392. package/dist/db/tables/sponsorshipAttributions.d.ts +69 -0
  393. package/dist/db/tables/sponsorshipAttributions.d.ts.map +1 -0
  394. package/dist/db/tables/sponsorshipAttributions.js +77 -0
  395. package/dist/db/tables/sponsorshipAttributions.js.map +1 -0
  396. package/dist/db/tables/sponsorshipReconciliationCursors.d.ts +22 -0
  397. package/dist/db/tables/sponsorshipReconciliationCursors.d.ts.map +1 -0
  398. package/dist/db/tables/sponsorshipReconciliationCursors.js +45 -0
  399. package/dist/db/tables/sponsorshipReconciliationCursors.js.map +1 -0
  400. package/dist/db/tables/stripeCustomers.d.ts +11 -0
  401. package/dist/db/tables/stripeCustomers.d.ts.map +1 -1
  402. package/dist/db/tables/stripeCustomers.js +13 -0
  403. package/dist/db/tables/stripeCustomers.js.map +1 -1
  404. package/dist/db/tables/users.d.ts +17 -1
  405. package/dist/db/tables/users.d.ts.map +1 -1
  406. package/dist/db/tables/users.js +47 -2
  407. package/dist/db/tables/users.js.map +1 -1
  408. package/dist/db/tables/webhookQueueEvents.d.ts.map +1 -1
  409. package/dist/db/tables/webhookQueueEvents.js +5 -1
  410. package/dist/db/tables/webhookQueueEvents.js.map +1 -1
  411. package/dist/db/tables/webhookSubscriptions.d.ts +22 -10
  412. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  413. package/dist/db/tables/webhookSubscriptions.js +50 -15
  414. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  415. package/dist/handlers/internal/executionError.d.ts +2 -2
  416. package/dist/handlers/internal/executionError.d.ts.map +1 -1
  417. package/dist/handlers/internal/executionError.js +1 -2
  418. package/dist/handlers/internal/executionError.js.map +1 -1
  419. package/dist/handlers/internal/multisig.d.ts +4 -232
  420. package/dist/handlers/internal/multisig.d.ts.map +1 -1
  421. package/dist/handlers/internal/multisig.js +11 -537
  422. package/dist/handlers/internal/multisig.js.map +1 -1
  423. package/dist/handlers/internal/sponsorship.d.ts +19 -8
  424. package/dist/handlers/internal/sponsorship.d.ts.map +1 -1
  425. package/dist/handlers/internal/sponsorship.js +13 -9
  426. package/dist/handlers/internal/sponsorship.js.map +1 -1
  427. package/dist/handlers/relay.d.ts +9 -12
  428. package/dist/handlers/relay.d.ts.map +1 -1
  429. package/dist/handlers/relay.js +81 -85
  430. package/dist/handlers/relay.js.map +1 -1
  431. package/dist/index.d.ts +0 -17
  432. package/dist/index.d.ts.map +1 -1
  433. package/dist/index.js +0 -17
  434. package/dist/index.js.map +1 -1
  435. package/dist/internal/AssetResponse.d.ts +12 -0
  436. package/dist/internal/AssetResponse.d.ts.map +1 -0
  437. package/dist/internal/AssetResponse.js +21 -0
  438. package/dist/internal/AssetResponse.js.map +1 -0
  439. package/dist/internal/Auth.d.ts +48 -12
  440. package/dist/internal/Auth.d.ts.map +1 -1
  441. package/dist/internal/Auth.js +603 -175
  442. package/dist/internal/Auth.js.map +1 -1
  443. package/dist/internal/BetterAuth.d.ts +1488 -0
  444. package/dist/internal/BetterAuth.d.ts.map +1 -0
  445. package/dist/internal/BetterAuth.js +253 -0
  446. package/dist/internal/BetterAuth.js.map +1 -0
  447. package/dist/internal/Cache.d.ts +2 -0
  448. package/dist/internal/Cache.d.ts.map +1 -1
  449. package/dist/internal/Cache.js +2 -0
  450. package/dist/internal/Cache.js.map +1 -1
  451. package/dist/internal/EarnRates.d.ts +26 -3
  452. package/dist/internal/EarnRates.d.ts.map +1 -1
  453. package/dist/internal/EarnRates.js +84 -19
  454. package/dist/internal/EarnRates.js.map +1 -1
  455. package/dist/internal/EarnSharePrices.d.ts +120 -0
  456. package/dist/internal/EarnSharePrices.d.ts.map +1 -0
  457. package/dist/internal/EarnSharePrices.js +179 -0
  458. package/dist/internal/EarnSharePrices.js.map +1 -0
  459. package/dist/internal/EarnVaults.d.ts +4 -0
  460. package/dist/internal/EarnVaults.d.ts.map +1 -1
  461. package/dist/internal/EarnVaults.js +31 -14
  462. package/dist/internal/EarnVaults.js.map +1 -1
  463. package/dist/internal/Email.d.ts +37 -0
  464. package/dist/internal/Email.d.ts.map +1 -0
  465. package/dist/internal/Email.js +16 -0
  466. package/dist/internal/Email.js.map +1 -0
  467. package/dist/internal/Log.d.ts +32 -28
  468. package/dist/internal/Log.d.ts.map +1 -1
  469. package/dist/internal/Log.js +18 -11
  470. package/dist/internal/Log.js.map +1 -1
  471. package/dist/internal/MetricSink.d.ts +3 -0
  472. package/dist/internal/MetricSink.d.ts.map +1 -1
  473. package/dist/internal/MetricSink.js +67 -8
  474. package/dist/internal/MetricSink.js.map +1 -1
  475. package/dist/internal/Mpp.d.ts.map +1 -1
  476. package/dist/internal/Mpp.js +20 -25
  477. package/dist/internal/Mpp.js.map +1 -1
  478. package/dist/internal/OpenApi.d.ts +26 -3
  479. package/dist/internal/OpenApi.d.ts.map +1 -1
  480. package/dist/internal/OpenApi.js +25 -10
  481. package/dist/internal/OpenApi.js.map +1 -1
  482. package/dist/internal/Provider.d.ts +1 -1
  483. package/dist/internal/Provider.d.ts.map +1 -1
  484. package/dist/internal/RateLimit.d.ts.map +1 -1
  485. package/dist/internal/RateLimit.js +13 -1
  486. package/dist/internal/RateLimit.js.map +1 -1
  487. package/dist/internal/Store.d.ts +16 -0
  488. package/dist/internal/Store.d.ts.map +1 -1
  489. package/dist/internal/Store.js +59 -8
  490. package/dist/internal/Store.js.map +1 -1
  491. package/dist/internal/Tidx.d.ts +9 -2
  492. package/dist/internal/Tidx.d.ts.map +1 -1
  493. package/dist/internal/Tidx.js +78 -11
  494. package/dist/internal/Tidx.js.map +1 -1
  495. package/dist/internal/Timing.d.ts +26 -0
  496. package/dist/internal/Timing.d.ts.map +1 -1
  497. package/dist/internal/Timing.js +63 -5
  498. package/dist/internal/Timing.js.map +1 -1
  499. package/dist/internal/VercelOidc.d.ts +94 -0
  500. package/dist/internal/VercelOidc.d.ts.map +1 -0
  501. package/dist/internal/VercelOidc.js +128 -0
  502. package/dist/internal/VercelOidc.js.map +1 -0
  503. package/dist/internal/VerifiedTokens.d.ts +2 -8
  504. package/dist/internal/VerifiedTokens.d.ts.map +1 -1
  505. package/dist/internal/VerifiedTokens.js +24 -24
  506. package/dist/internal/VerifiedTokens.js.map +1 -1
  507. package/dist/internal/Viem.d.ts +46 -2068
  508. package/dist/internal/Viem.d.ts.map +1 -1
  509. package/dist/internal/Viem.js +171 -11
  510. package/dist/internal/Viem.js.map +1 -1
  511. package/dist/internal/Webhooks.d.ts +12 -4
  512. package/dist/internal/Webhooks.d.ts.map +1 -1
  513. package/dist/internal/Webhooks.js +9 -3
  514. package/dist/internal/Webhooks.js.map +1 -1
  515. package/dist/internal/ZoneRpc.d.ts +7 -0
  516. package/dist/internal/ZoneRpc.d.ts.map +1 -0
  517. package/dist/internal/ZoneRpc.js +49 -0
  518. package/dist/internal/ZoneRpc.js.map +1 -0
  519. package/dist/internal/index.d.ts +3 -1
  520. package/dist/internal/index.d.ts.map +1 -1
  521. package/dist/internal/index.js +3 -1
  522. package/dist/internal/index.js.map +1 -1
  523. package/dist/internal/rewards/Audit.d.ts +88 -0
  524. package/dist/internal/rewards/Audit.d.ts.map +1 -0
  525. package/dist/internal/rewards/Audit.js +134 -0
  526. package/dist/internal/rewards/Audit.js.map +1 -0
  527. package/dist/internal/rewards/Campaigns.d.ts +572 -0
  528. package/dist/internal/rewards/Campaigns.d.ts.map +1 -0
  529. package/dist/internal/rewards/Campaigns.js +531 -0
  530. package/dist/internal/rewards/Campaigns.js.map +1 -0
  531. package/dist/internal/rewards/Credits.d.ts +76 -0
  532. package/dist/internal/rewards/Credits.d.ts.map +1 -0
  533. package/dist/internal/rewards/Credits.js +95 -0
  534. package/dist/internal/rewards/Credits.js.map +1 -0
  535. package/dist/internal/rewards/Events.d.ts +100 -0
  536. package/dist/internal/rewards/Events.d.ts.map +1 -0
  537. package/dist/internal/rewards/Events.js +340 -0
  538. package/dist/internal/rewards/Events.js.map +1 -0
  539. package/dist/internal/rewards/Projection.d.ts +237 -0
  540. package/dist/internal/rewards/Projection.d.ts.map +1 -0
  541. package/dist/internal/rewards/Projection.js +616 -0
  542. package/dist/internal/rewards/Projection.js.map +1 -0
  543. package/dist/internal/rewards/Rates.d.ts +44 -0
  544. package/dist/internal/rewards/Rates.d.ts.map +1 -0
  545. package/dist/internal/rewards/Rates.js +60 -0
  546. package/dist/internal/rewards/Rates.js.map +1 -0
  547. package/dist/internal/rewards/Read.d.ts +158 -0
  548. package/dist/internal/rewards/Read.d.ts.map +1 -0
  549. package/dist/internal/rewards/Read.js +292 -0
  550. package/dist/internal/rewards/Read.js.map +1 -0
  551. package/dist/internal/rewards/Runner.d.ts +164 -0
  552. package/dist/internal/rewards/Runner.d.ts.map +1 -0
  553. package/dist/internal/rewards/Runner.js +1778 -0
  554. package/dist/internal/rewards/Runner.js.map +1 -0
  555. package/dist/internal/rewards/Signer.d.ts +224 -0
  556. package/dist/internal/rewards/Signer.d.ts.map +1 -0
  557. package/dist/internal/rewards/Signer.js +135 -0
  558. package/dist/internal/rewards/Signer.js.map +1 -0
  559. package/dist/internal/rewards/index.d.ts +15 -0
  560. package/dist/internal/rewards/index.d.ts.map +1 -0
  561. package/dist/internal/rewards/index.js +15 -0
  562. package/dist/internal/rewards/index.js.map +1 -0
  563. package/dist/internal/{funding → routes}/Action.d.ts +12 -1
  564. package/dist/internal/routes/Action.d.ts.map +1 -0
  565. package/dist/internal/{funding → routes}/Action.js +17 -9
  566. package/dist/internal/routes/Action.js.map +1 -0
  567. package/dist/internal/{funding → routes}/Catalog.d.ts +20 -20
  568. package/dist/internal/routes/Catalog.d.ts.map +1 -0
  569. package/dist/internal/{funding → routes}/Catalog.js +29 -29
  570. package/dist/internal/routes/Catalog.js.map +1 -0
  571. package/dist/internal/{funding → routes}/Chain.d.ts +10 -10
  572. package/dist/internal/routes/Chain.d.ts.map +1 -0
  573. package/dist/internal/{funding → routes}/Chain.js +3 -3
  574. package/dist/internal/routes/Chain.js.map +1 -0
  575. package/dist/internal/{funding → routes}/Deposit.d.ts +45 -23
  576. package/dist/internal/routes/Deposit.d.ts.map +1 -0
  577. package/dist/internal/{funding → routes}/Deposit.js +60 -27
  578. package/dist/internal/routes/Deposit.js.map +1 -0
  579. package/dist/internal/{funding → routes}/DepositAddress.d.ts +56 -27
  580. package/dist/internal/routes/DepositAddress.d.ts.map +1 -0
  581. package/dist/internal/{funding → routes}/DepositAddress.js +95 -33
  582. package/dist/internal/routes/DepositAddress.js.map +1 -0
  583. package/dist/internal/{funding → routes}/DepositWebhook.d.ts +4 -4
  584. package/dist/internal/routes/DepositWebhook.d.ts.map +1 -0
  585. package/dist/internal/{funding → routes}/DepositWebhook.js +4 -3
  586. package/dist/internal/routes/DepositWebhook.js.map +1 -0
  587. package/dist/internal/routes/Economics.d.ts +25 -0
  588. package/dist/internal/routes/Economics.d.ts.map +1 -0
  589. package/dist/internal/routes/Economics.js +28 -0
  590. package/dist/internal/routes/Economics.js.map +1 -0
  591. package/dist/internal/{funding → routes}/Evidence.d.ts +3 -3
  592. package/dist/internal/routes/Evidence.d.ts.map +1 -0
  593. package/dist/internal/{funding → routes}/Evidence.js +9 -17
  594. package/dist/internal/routes/Evidence.js.map +1 -0
  595. package/dist/internal/routes/Observability.d.ts +154 -0
  596. package/dist/internal/routes/Observability.d.ts.map +1 -0
  597. package/dist/internal/routes/Observability.js +389 -0
  598. package/dist/internal/routes/Observability.js.map +1 -0
  599. package/dist/internal/{funding → routes}/Provider.d.ts +350 -104
  600. package/dist/internal/routes/Provider.d.ts.map +1 -0
  601. package/dist/internal/{funding → routes}/Provider.js +233 -97
  602. package/dist/internal/routes/Provider.js.map +1 -0
  603. package/dist/internal/{funding → routes}/Reconciliation.d.ts +11 -6
  604. package/dist/internal/routes/Reconciliation.d.ts.map +1 -0
  605. package/dist/internal/{funding → routes}/Reconciliation.js +408 -158
  606. package/dist/internal/routes/Reconciliation.js.map +1 -0
  607. package/dist/internal/routes/Route.d.ts +21 -0
  608. package/dist/internal/routes/Route.d.ts.map +1 -0
  609. package/dist/internal/{funding → routes}/Route.js +1 -1
  610. package/dist/internal/routes/Route.js.map +1 -0
  611. package/dist/internal/{funding → routes}/SourceObservation.d.ts +6 -6
  612. package/dist/internal/routes/SourceObservation.d.ts.map +1 -0
  613. package/dist/internal/{funding → routes}/SourceObservation.js +13 -15
  614. package/dist/internal/routes/SourceObservation.js.map +1 -0
  615. package/dist/internal/{funding → routes}/Subsidy.d.ts +48 -3
  616. package/dist/internal/routes/Subsidy.d.ts.map +1 -0
  617. package/dist/internal/{funding → routes}/Subsidy.js +43 -3
  618. package/dist/internal/routes/Subsidy.js.map +1 -0
  619. package/dist/internal/{funding → routes}/Token.d.ts +4 -4
  620. package/dist/internal/routes/Token.d.ts.map +1 -0
  621. package/dist/internal/{funding → routes}/Token.js +3 -3
  622. package/dist/internal/routes/Token.js.map +1 -0
  623. package/dist/internal/{funding → routes}/Transfer.d.ts +324 -34
  624. package/dist/internal/routes/Transfer.d.ts.map +1 -0
  625. package/dist/internal/routes/Transfer.js +728 -0
  626. package/dist/internal/routes/Transfer.js.map +1 -0
  627. package/dist/internal/routes/TransferReconciliation.d.ts +55 -0
  628. package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -0
  629. package/dist/internal/routes/TransferReconciliation.js +422 -0
  630. package/dist/internal/routes/TransferReconciliation.js.map +1 -0
  631. package/dist/internal/routes/TransferSubsidy.d.ts +201 -0
  632. package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -0
  633. package/dist/internal/routes/TransferSubsidy.js +256 -0
  634. package/dist/internal/routes/TransferSubsidy.js.map +1 -0
  635. package/dist/internal/routes/TransferWebhook.d.ts +21 -0
  636. package/dist/internal/routes/TransferWebhook.d.ts.map +1 -0
  637. package/dist/internal/routes/TransferWebhook.js +43 -0
  638. package/dist/internal/routes/TransferWebhook.js.map +1 -0
  639. package/dist/internal/{funding → routes}/index.d.ts +3 -0
  640. package/dist/internal/routes/index.d.ts.map +1 -0
  641. package/dist/internal/{funding → routes}/index.js +3 -0
  642. package/dist/internal/routes/index.js.map +1 -0
  643. package/dist/internal/{funding → routes}/providers/across.d.ts +4 -4
  644. package/dist/internal/routes/providers/across.d.ts.map +1 -0
  645. package/dist/internal/{funding → routes}/providers/across.js +13 -13
  646. package/dist/internal/routes/providers/across.js.map +1 -0
  647. package/dist/internal/{funding → routes}/providers/relay.d.ts +21 -12
  648. package/dist/internal/routes/providers/relay.d.ts.map +1 -0
  649. package/dist/internal/{funding → routes}/providers/relay.js +197 -122
  650. package/dist/internal/routes/providers/relay.js.map +1 -0
  651. package/dist/internal/{funding → routes}/providers/rhino.d.ts +4 -4
  652. package/dist/internal/routes/providers/rhino.d.ts.map +1 -0
  653. package/dist/internal/{funding → routes}/providers/rhino.js +10 -10
  654. package/dist/internal/routes/providers/rhino.js.map +1 -0
  655. package/dist/internal/{funding → routes}/providers/squid.d.ts +4 -4
  656. package/dist/internal/routes/providers/squid.d.ts.map +1 -0
  657. package/dist/internal/{funding → routes}/providers/squid.js +14 -14
  658. package/dist/internal/routes/providers/squid.js.map +1 -0
  659. package/dist/internal/routes/providers/stargate.d.ts +165 -0
  660. package/dist/internal/routes/providers/stargate.d.ts.map +1 -0
  661. package/dist/internal/routes/providers/stargate.js +898 -0
  662. package/dist/internal/routes/providers/stargate.js.map +1 -0
  663. package/dist/internal/{funding → routes}/providers/symbiosis.d.ts +4 -4
  664. package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -0
  665. package/dist/internal/{funding → routes}/providers/symbiosis.js +30 -20
  666. package/dist/internal/routes/providers/symbiosis.js.map +1 -0
  667. package/dist/internal/webhookDestinations/slack.d.ts.map +1 -1
  668. package/dist/internal/webhookDestinations/slack.js +22 -6
  669. package/dist/internal/webhookDestinations/slack.js.map +1 -1
  670. package/dist/providers/index.d.ts +12 -12
  671. package/dist/providers/index.d.ts.map +1 -1
  672. package/dist/providers/index.js +12 -12
  673. package/dist/providers/index.js.map +1 -1
  674. package/dist/server.d.ts +19 -0
  675. package/dist/server.d.ts.map +1 -0
  676. package/dist/server.js +19 -0
  677. package/dist/server.js.map +1 -0
  678. package/package.json +15 -4
  679. package/src/ApiKey.ts +1 -1
  680. package/src/ApiKeys.test.ts +1033 -3
  681. package/src/ApiKeys.ts +489 -48
  682. package/src/App.test-d.ts +1 -1
  683. package/src/App.test.ts +216 -25
  684. package/src/App.ts +335 -31
  685. package/src/Assets.test.ts +2 -2
  686. package/src/Assets.ts +3 -1
  687. package/src/Auth.test-d.ts +1 -1
  688. package/src/Client.test-d.ts +611 -101
  689. package/src/Handler.ts +0 -1
  690. package/src/OpenApi.contract.test.ts +195 -0
  691. package/src/Scope.ts +17 -5
  692. package/src/Webhooks.ts +2 -2
  693. package/src/admin/App.test.ts +30 -2
  694. package/src/admin/App.ts +42 -6
  695. package/src/admin/apps/api-keys.test.ts +267 -5
  696. package/src/admin/apps/api-keys.ts +100 -50
  697. package/src/admin/apps/earn-vaults.test.ts +158 -0
  698. package/src/admin/apps/earn-vaults.ts +681 -7
  699. package/src/admin/apps/organizations.test.ts +342 -1
  700. package/src/admin/apps/organizations.ts +368 -8
  701. package/src/admin/apps/routes-support.test.ts +200 -0
  702. package/src/admin/apps/routes-support.ts +201 -0
  703. package/src/admin/apps/routes.test.ts +450 -0
  704. package/src/admin/apps/routes.ts +896 -0
  705. package/src/admin/apps/scopes.test.ts +15 -5
  706. package/src/admin/apps/subsidies.test.ts +306 -0
  707. package/src/admin/apps/subsidies.ts +457 -0
  708. package/src/admin/apps/verified-tokens.test.ts +8 -3
  709. package/src/admin/apps/verified-tokens.ts +3 -3
  710. package/src/admin/ui/plugin.ts +1 -2
  711. package/src/admin/ui/src/components/RewardCampaignForm.tsx +1009 -0
  712. package/src/admin/ui/src/lib/config.ts +11 -2
  713. package/src/admin/ui/src/lib/earn-vaults.ts +2 -2
  714. package/src/admin/ui/src/lib/organizations.test.ts +147 -3
  715. package/src/admin/ui/src/lib/organizations.ts +136 -0
  716. package/src/admin/ui/src/lib/query-client.ts +1 -1
  717. package/src/admin/ui/src/lib/reward-campaigns.ts +136 -0
  718. package/src/admin/ui/src/lib/routes.test.ts +88 -0
  719. package/src/admin/ui/src/lib/routes.ts +304 -0
  720. package/src/admin/ui/src/lib/subsidies.ts +75 -0
  721. package/src/admin/ui/src/routeTree.gen.ts +63 -0
  722. package/src/admin/ui/src/routes/__root.tsx +12 -1
  723. package/src/admin/ui/src/routes/api-keys.tsx +196 -84
  724. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +105 -70
  725. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +334 -2
  726. package/src/admin/ui/src/routes/routes.tsx +1615 -0
  727. package/src/admin/ui/src/routes/routes_.support.tsx +248 -0
  728. package/src/admin/ui/src/routes/subsidies.tsx +799 -0
  729. package/src/admin/ui.generated.ts +144 -69
  730. package/src/analytics/Analytics.test.ts +108 -18
  731. package/src/analytics/Analytics.ts +38 -6
  732. package/src/analytics/tables/requestEvents.test.ts +100 -0
  733. package/src/analytics/tables/requestEvents.ts +10 -1
  734. package/src/analytics/tables/routesLifecycleIntervals.ts +140 -0
  735. package/src/apps/Zones.test.ts +18 -3
  736. package/src/apps/Zones.ts +55 -8
  737. package/src/apps/composition.test.ts +68 -59
  738. package/src/apps/data/App.test.ts +154 -2
  739. package/src/apps/data/App.ts +102 -33
  740. package/src/apps/data/routes/activities.test.ts +419 -7
  741. package/src/apps/data/routes/activities.ts +683 -216
  742. package/src/apps/data/routes/balances.test.ts +2 -2
  743. package/src/apps/data/routes/blocks.test.ts +46 -1
  744. package/src/apps/data/routes/coingecko.test.ts +419 -1
  745. package/src/apps/data/routes/coingecko.ts +309 -253
  746. package/src/apps/data/routes/earn.discovery.test.ts +274 -0
  747. package/src/apps/data/routes/earn.test.ts +1661 -29
  748. package/src/apps/data/routes/earn.ts +2314 -328
  749. package/src/apps/data/routes/exchanges.test.ts +752 -30
  750. package/src/apps/data/routes/exchanges.ts +954 -753
  751. package/src/apps/data/routes/fee-amm.test.ts +224 -0
  752. package/src/apps/data/routes/fee-amm.ts +208 -178
  753. package/src/apps/data/routes/indexer.test.ts +389 -0
  754. package/src/apps/data/routes/indexer.ts +165 -69
  755. package/src/apps/data/routes/receipts.test.ts +1 -1
  756. package/src/apps/data/routes/rpc.test.ts +352 -8
  757. package/src/apps/data/routes/rpc.ts +407 -219
  758. package/src/apps/data/routes/rpc.zone.test.ts +340 -0
  759. package/src/apps/data/routes/tokenlist.test.ts +285 -0
  760. package/src/apps/data/routes/tokenlist.ts +173 -88
  761. package/src/apps/data/routes/tokens.test.ts +93 -3
  762. package/src/apps/data/routes/tokens.ts +39 -23
  763. package/src/apps/data/routes/transactions.test.ts +1 -1
  764. package/src/apps/data/routes/transfers.test.ts +56 -24
  765. package/src/apps/data/routes/transfers.ts +19 -8
  766. package/src/apps/data/routes/valuation.test.ts +1 -1
  767. package/src/apps/data/routes/verified-tokens.test.ts +345 -0
  768. package/src/apps/data/routes/verified-tokens.ts +99 -29
  769. package/src/apps/data/routes/webhooks.test.ts +659 -81
  770. package/src/apps/data/routes/webhooks.ts +1104 -817
  771. package/src/apps/data/routes/zones.test.ts +148 -71
  772. package/src/apps/data/routes/zones.ts +71 -55
  773. package/src/apps/docs/reference.ts +2 -2
  774. package/src/apps/index.ts +1 -1
  775. package/src/apps/management/App.ts +9 -51
  776. package/src/apps/management/Billing.test.ts +375 -14
  777. package/src/apps/management/Billing.ts +283 -34
  778. package/src/apps/management/routes/api-keys.test.ts +269 -7
  779. package/src/apps/management/routes/api-keys.ts +61 -20
  780. package/src/apps/management/routes/billing.test.ts +477 -15
  781. package/src/apps/management/routes/billing.ts +377 -50
  782. package/src/apps/management/routes/faucet.test.ts +1 -1
  783. package/src/apps/management/routes/faucet.ts +1 -1
  784. package/src/apps/management/routes/invitations.test.ts +270 -3
  785. package/src/apps/management/routes/invitations.ts +185 -15
  786. package/src/apps/management/routes/invoicePreview.test.ts +549 -0
  787. package/src/apps/management/routes/me.test.ts +246 -5
  788. package/src/apps/management/routes/me.ts +7 -2
  789. package/src/apps/management/routes/members.test.ts +108 -0
  790. package/src/apps/management/routes/orgs.test.ts +191 -3
  791. package/src/apps/management/routes/orgs.ts +58 -11
  792. package/src/apps/management/routes/projects.test.ts +33 -3
  793. package/src/apps/management/routes/projects.ts +6 -1
  794. package/src/apps/management/routes/scopes.test.ts +30 -2
  795. package/src/apps/management/routes/scopes.ts +4 -1
  796. package/src/apps/management/routes/usage.test.ts +32 -0
  797. package/src/apps/management/routes/usage.ts +22 -4
  798. package/src/apps/management/routes/webhooks.test.ts +49 -26
  799. package/src/apps/management/routes/webhooks.ts +93 -38
  800. package/src/apps/mcp.test.ts +6 -6
  801. package/src/apps/mcp.ts +7 -7
  802. package/src/apps/mpp/App.ts +37 -7
  803. package/src/apps/mpp/Mpp.test.ts +49 -8
  804. package/src/apps/mpp/Mpp.zone.test.ts +219 -0
  805. package/src/apps/mpp/internal/Adapter.ts +34 -0
  806. package/src/apps/mpp/internal/Policy.test.ts +86 -31
  807. package/src/apps/mpp/internal/Policy.ts +49 -7
  808. package/src/apps/mpp/internal/Sponsorship.test.ts +207 -0
  809. package/src/apps/mpp/internal/Sponsorship.ts +9 -3
  810. package/src/apps/relay/App.test.ts +1024 -38
  811. package/src/apps/relay/App.ts +228 -32
  812. package/src/apps/relay/App.zone-billing.test.ts +257 -0
  813. package/src/apps/relay/Sponsorships.test.ts +67 -4
  814. package/src/apps/relay/Sponsorships.ts +253 -29
  815. package/src/apps/relay/Sponsorships.zone.test.ts +102 -0
  816. package/src/apps/{funding → routes}/Access.ts +6 -6
  817. package/src/apps/routes/App.test.ts +165 -0
  818. package/src/apps/routes/App.ts +96 -0
  819. package/src/apps/{funding → routes}/Inventory.ts +2 -2
  820. package/src/apps/routes/index.ts +1 -0
  821. package/src/apps/{funding → routes}/routes/chains.test.ts +66 -66
  822. package/src/apps/{funding → routes}/routes/chains.ts +23 -23
  823. package/src/apps/{funding → routes}/routes/deposit-addresses.test.ts +1362 -462
  824. package/src/apps/{funding → routes}/routes/deposit-addresses.ts +568 -248
  825. package/src/apps/{funding → routes}/routes/providers.test.ts +27 -33
  826. package/src/apps/{funding → routes}/routes/providers.ts +23 -23
  827. package/src/apps/{funding → routes}/routes/quotes.test.ts +298 -41
  828. package/src/apps/{funding → routes}/routes/quotes.ts +57 -40
  829. package/src/apps/routes/routes/transfers.test.ts +2876 -0
  830. package/src/apps/routes/routes/transfers.ts +1332 -0
  831. package/src/cli/Cli.test.ts +1 -1
  832. package/src/cli/commands/admin.test.ts +748 -1
  833. package/src/cli/commands/admin.ts +278 -0
  834. package/src/cloudflare.ts +52 -47
  835. package/src/db/Db.test.ts +245 -2
  836. package/src/db/Db.ts +1511 -34
  837. package/src/db/Schema.ts +744 -228
  838. package/src/db/tables/apiKeyAdmissionBootstraps.ts +4 -0
  839. package/src/db/tables/apiKeyAdmissions.ts +218 -0
  840. package/src/db/tables/apiKeyOwnerAdmissions.ts +4 -0
  841. package/src/db/tables/apiKeyOwnerTombstones.ts +81 -0
  842. package/src/db/tables/apiKeyRevocations.test.ts +74 -0
  843. package/src/db/tables/apiKeyRevocations.ts +121 -0
  844. package/src/db/tables/authAccounts.ts +105 -0
  845. package/src/db/tables/authSessions.ts +13 -0
  846. package/src/db/tables/authVerifications.ts +13 -0
  847. package/src/db/tables/invitations.ts +142 -45
  848. package/src/db/tables/memberships.ts +79 -3
  849. package/src/db/tables/organizations.test.ts +725 -7
  850. package/src/db/tables/organizations.ts +182 -49
  851. package/src/db/tables/projects.test.ts +71 -0
  852. package/src/db/tables/projects.ts +59 -4
  853. package/src/db/tables/requestUsage.ts +4 -1
  854. package/src/db/tables/rewardAccounts.ts +178 -0
  855. package/src/db/tables/rewardCampaignDistributors.ts +68 -0
  856. package/src/db/tables/rewardCampaigns.test.ts +1388 -0
  857. package/src/db/tables/rewardCampaigns.ts +647 -0
  858. package/src/db/tables/rewardCredits.ts +110 -0
  859. package/src/db/tables/rewardEligibilityAssociations.test.ts +271 -0
  860. package/src/db/tables/rewardEligibilityAssociations.ts +184 -0
  861. package/src/db/tables/rewardRuns.ts +514 -0
  862. package/src/db/tables/rewardTransactionAttempts.ts +272 -0
  863. package/src/db/tables/routesCatalog.test.ts +185 -0
  864. package/src/db/tables/routesCatalog.ts +163 -0
  865. package/src/db/tables/routesDepositAddresses.test.ts +1048 -0
  866. package/src/db/tables/routesDepositAddresses.ts +1008 -0
  867. package/src/db/tables/{fundingDepositRequestObservations.test.ts → routesDepositRequestObservations.test.ts} +13 -14
  868. package/src/db/tables/{fundingDepositRequestObservations.ts → routesDepositRequestObservations.ts} +10 -10
  869. package/src/db/tables/{fundingDeposits.test.ts → routesDeposits.test.ts} +316 -46
  870. package/src/db/tables/routesDeposits.ts +1062 -0
  871. package/src/db/tables/routesIdempotency.test.ts +796 -0
  872. package/src/db/tables/routesIdempotency.ts +496 -0
  873. package/src/db/tables/routesSubsidies.test.ts +120 -0
  874. package/src/db/tables/routesSubsidies.ts +71 -0
  875. package/src/db/tables/{fundingTransferEvents.ts → routesTransferEvents.ts} +4 -4
  876. package/src/db/tables/routesTransferSubsidies.ts +38 -0
  877. package/src/db/tables/routesTransferSubsidyNonces.ts +124 -0
  878. package/src/db/tables/routesTransferTransactions.test.ts +195 -0
  879. package/src/db/tables/routesTransferTransactions.ts +158 -0
  880. package/src/db/tables/routesTransfers.test.ts +338 -0
  881. package/src/db/tables/routesTransfers.ts +662 -0
  882. package/src/db/tables/sponsoredTransactions.test.ts +563 -1
  883. package/src/db/tables/sponsoredTransactions.ts +386 -42
  884. package/src/db/tables/sponsorshipAttributions.test.ts +160 -0
  885. package/src/db/tables/sponsorshipAttributions.ts +168 -0
  886. package/src/db/tables/sponsorshipReconciliationCursors.test.ts +115 -0
  887. package/src/db/tables/sponsorshipReconciliationCursors.ts +67 -0
  888. package/src/db/tables/stripeCustomers.test.ts +85 -0
  889. package/src/db/tables/stripeCustomers.ts +24 -0
  890. package/src/db/tables/users.test.ts +129 -0
  891. package/src/db/tables/users.ts +49 -3
  892. package/src/db/tables/webhookQueueEvents.ts +8 -1
  893. package/src/db/tables/webhookSubscriptions.ts +103 -21
  894. package/src/handlers/internal/executionError.ts +3 -4
  895. package/src/handlers/internal/multisig.ts +13 -816
  896. package/src/handlers/internal/sponsorship.ts +26 -10
  897. package/src/handlers/relay.test-d.ts +9 -1
  898. package/src/handlers/relay.test.ts +823 -3
  899. package/src/handlers/relay.ts +127 -107
  900. package/src/index.test-d.ts +7 -0
  901. package/src/index.ts +0 -17
  902. package/src/internal/AssetResponse.ts +26 -0
  903. package/src/internal/Auth.test.ts +1564 -9
  904. package/src/internal/Auth.ts +833 -239
  905. package/src/internal/BetterAuth.test.ts +242 -0
  906. package/src/internal/BetterAuth.ts +349 -0
  907. package/src/internal/Cache.ts +2 -0
  908. package/src/internal/EarnRates.test.ts +17 -0
  909. package/src/internal/EarnRates.ts +124 -31
  910. package/src/internal/EarnSharePrices.test.ts +182 -0
  911. package/src/internal/EarnSharePrices.ts +313 -0
  912. package/src/internal/EarnVaults.test.ts +21 -0
  913. package/src/internal/EarnVaults.ts +37 -15
  914. package/src/internal/Email.ts +54 -0
  915. package/src/internal/Idempotency.test.ts +2 -2
  916. package/src/internal/Log.test-d.ts +10 -7
  917. package/src/internal/Log.test.ts +114 -16
  918. package/src/internal/Log.ts +55 -40
  919. package/src/internal/MetricSink.test.ts +313 -26
  920. package/src/internal/MetricSink.ts +73 -8
  921. package/src/internal/Mpp.test.ts +31 -0
  922. package/src/internal/Mpp.ts +21 -24
  923. package/src/internal/OpenApi.ts +45 -12
  924. package/src/internal/Provider.test.ts +1 -1
  925. package/src/internal/Provider.ts +1 -1
  926. package/src/internal/RateLimit.test.ts +21 -3
  927. package/src/internal/RateLimit.ts +12 -1
  928. package/src/internal/Store.test-d.ts +1 -1
  929. package/src/internal/Store.test.ts +151 -8
  930. package/src/internal/Store.ts +76 -9
  931. package/src/internal/Tidx.test.ts +59 -8
  932. package/src/internal/Tidx.ts +86 -14
  933. package/src/internal/Timing.test.ts +77 -0
  934. package/src/internal/Timing.ts +83 -6
  935. package/src/internal/VercelOidc.test.ts +188 -0
  936. package/src/internal/VercelOidc.ts +193 -0
  937. package/src/internal/VerifiedTokens.test.ts +60 -6
  938. package/src/internal/VerifiedTokens.ts +21 -24
  939. package/src/internal/Viem.batch.test.ts +80 -0
  940. package/src/internal/Viem.test.ts +201 -2
  941. package/src/internal/Viem.ts +249 -17
  942. package/src/internal/Webhooks.test.ts +125 -1
  943. package/src/internal/Webhooks.ts +22 -4
  944. package/src/internal/ZoneRpc.ts +50 -0
  945. package/src/internal/exchange/Provider.test.ts +2 -2
  946. package/src/internal/index.test.ts +3 -1
  947. package/src/internal/index.ts +3 -1
  948. package/src/internal/rewards/Audit.ts +231 -0
  949. package/src/internal/rewards/Campaigns.test.ts +1234 -0
  950. package/src/internal/rewards/Campaigns.ts +1205 -0
  951. package/src/internal/rewards/Credits.ts +165 -0
  952. package/src/internal/rewards/Events.local.test.ts +113 -0
  953. package/src/internal/rewards/Events.test.ts +152 -0
  954. package/src/internal/rewards/Events.ts +468 -0
  955. package/src/internal/rewards/Projection.test.ts +681 -0
  956. package/src/internal/rewards/Projection.ts +987 -0
  957. package/src/internal/rewards/Rates.test.ts +171 -0
  958. package/src/internal/rewards/Rates.ts +110 -0
  959. package/src/internal/rewards/Read.test.ts +501 -0
  960. package/src/internal/rewards/Read.ts +476 -0
  961. package/src/internal/rewards/Runner.checkpoint.test.ts +80 -0
  962. package/src/internal/rewards/Runner.states.test.ts +188 -0
  963. package/src/internal/rewards/Runner.test.ts +90 -0
  964. package/src/internal/rewards/Runner.ts +2229 -0
  965. package/src/internal/rewards/Signer.test.ts +79 -0
  966. package/src/internal/rewards/Signer.ts +180 -0
  967. package/src/internal/rewards/index.ts +14 -0
  968. package/src/internal/{funding → routes}/Action.test.ts +63 -14
  969. package/src/internal/{funding → routes}/Action.ts +35 -8
  970. package/src/internal/{funding → routes}/Catalog.test.ts +3 -3
  971. package/src/internal/{funding → routes}/Catalog.ts +39 -39
  972. package/src/internal/{funding → routes}/Chain.test.ts +1 -1
  973. package/src/internal/{funding → routes}/Chain.ts +11 -11
  974. package/src/internal/{funding → routes}/Deposit.test.ts +1 -1
  975. package/src/internal/{funding → routes}/Deposit.ts +93 -45
  976. package/src/internal/{funding → routes}/DepositAddress.test.ts +11 -3
  977. package/src/internal/{funding → routes}/DepositAddress.ts +132 -53
  978. package/src/internal/{funding → routes}/DepositWebhook.test.ts +61 -18
  979. package/src/internal/{funding → routes}/DepositWebhook.ts +9 -8
  980. package/src/internal/routes/Economics.test.ts +42 -0
  981. package/src/internal/routes/Economics.ts +47 -0
  982. package/src/internal/{funding → routes}/Evidence.test.ts +6 -6
  983. package/src/internal/{funding → routes}/Evidence.ts +11 -22
  984. package/src/internal/routes/Observability.test.ts +636 -0
  985. package/src/internal/routes/Observability.ts +668 -0
  986. package/src/internal/{funding → routes}/Provider.test.ts +489 -153
  987. package/src/internal/{funding → routes}/Provider.ts +531 -185
  988. package/src/internal/{funding → routes}/Reconciliation.local.test.ts +84 -12
  989. package/src/internal/{funding → routes}/Reconciliation.test.ts +1213 -279
  990. package/src/internal/{funding → routes}/Reconciliation.ts +501 -203
  991. package/src/internal/routes/Reconciliation.unattributed.test.ts +250 -0
  992. package/src/internal/{funding → routes}/Route.ts +7 -7
  993. package/src/internal/{funding → routes}/SourceObservation.test.ts +13 -14
  994. package/src/internal/{funding → routes}/SourceObservation.ts +18 -22
  995. package/src/internal/{funding → routes}/Subsidy.local.test.ts +7 -7
  996. package/src/internal/routes/Subsidy.test.ts +169 -0
  997. package/src/internal/{funding → routes}/Subsidy.ts +86 -6
  998. package/src/internal/{funding → routes}/Token.test.ts +1 -1
  999. package/src/internal/{funding → routes}/Token.ts +5 -5
  1000. package/src/internal/routes/Transfer.test.ts +1199 -0
  1001. package/src/internal/routes/Transfer.ts +1206 -0
  1002. package/src/internal/routes/TransferReconciliation.test.ts +731 -0
  1003. package/src/internal/routes/TransferReconciliation.ts +527 -0
  1004. package/src/internal/routes/TransferSubsidy.test.ts +172 -0
  1005. package/src/internal/routes/TransferSubsidy.ts +447 -0
  1006. package/src/internal/routes/TransferWebhook.test.ts +128 -0
  1007. package/src/internal/routes/TransferWebhook.ts +67 -0
  1008. package/src/internal/{funding → routes}/index.test.ts +6 -3
  1009. package/src/internal/{funding → routes}/index.ts +3 -0
  1010. package/src/internal/{funding → routes}/providers/across.ts +16 -16
  1011. package/src/internal/{funding → routes}/providers/index.test.ts +157 -44
  1012. package/src/internal/{funding → routes}/providers/relay.test.ts +165 -32
  1013. package/src/internal/{funding → routes}/providers/relay.ts +231 -136
  1014. package/src/internal/{funding → routes}/providers/rhino.ts +16 -16
  1015. package/src/internal/{funding → routes}/providers/squid.ts +17 -17
  1016. package/src/internal/routes/providers/stargate.test.ts +728 -0
  1017. package/src/internal/routes/providers/stargate.ts +1276 -0
  1018. package/src/internal/{funding → routes}/providers/symbiosis.ts +64 -24
  1019. package/src/internal/webhookDestinations/slack.ts +20 -5
  1020. package/src/providers/index.ts +13 -13
  1021. package/src/server.ts +18 -0
  1022. package/dist/apps/funding/Access.d.ts.map +0 -1
  1023. package/dist/apps/funding/Access.js.map +0 -1
  1024. package/dist/apps/funding/App.js.map +0 -1
  1025. package/dist/apps/funding/Inventory.d.ts.map +0 -1
  1026. package/dist/apps/funding/Inventory.js.map +0 -1
  1027. package/dist/apps/funding/ProviderAttempts.d.ts +0 -5
  1028. package/dist/apps/funding/ProviderAttempts.d.ts.map +0 -1
  1029. package/dist/apps/funding/ProviderAttempts.js +0 -24
  1030. package/dist/apps/funding/ProviderAttempts.js.map +0 -1
  1031. package/dist/apps/funding/index.d.ts +0 -2
  1032. package/dist/apps/funding/index.d.ts.map +0 -1
  1033. package/dist/apps/funding/index.js +0 -2
  1034. package/dist/apps/funding/index.js.map +0 -1
  1035. package/dist/apps/funding/routes/chains.d.ts.map +0 -1
  1036. package/dist/apps/funding/routes/chains.js.map +0 -1
  1037. package/dist/apps/funding/routes/deposit-addresses.d.ts.map +0 -1
  1038. package/dist/apps/funding/routes/deposit-addresses.js.map +0 -1
  1039. package/dist/apps/funding/routes/providers.d.ts.map +0 -1
  1040. package/dist/apps/funding/routes/providers.js +0 -57
  1041. package/dist/apps/funding/routes/providers.js.map +0 -1
  1042. package/dist/apps/funding/routes/quotes.d.ts.map +0 -1
  1043. package/dist/apps/funding/routes/quotes.js.map +0 -1
  1044. package/dist/apps/funding/routes/transfers.d.ts.map +0 -1
  1045. package/dist/apps/funding/routes/transfers.js +0 -622
  1046. package/dist/apps/funding/routes/transfers.js.map +0 -1
  1047. package/dist/db/tables/fundingCatalog.d.ts +0 -58
  1048. package/dist/db/tables/fundingCatalog.d.ts.map +0 -1
  1049. package/dist/db/tables/fundingCatalog.js.map +0 -1
  1050. package/dist/db/tables/fundingDepositAddresses.d.ts +0 -192
  1051. package/dist/db/tables/fundingDepositAddresses.d.ts.map +0 -1
  1052. package/dist/db/tables/fundingDepositAddresses.js +0 -235
  1053. package/dist/db/tables/fundingDepositAddresses.js.map +0 -1
  1054. package/dist/db/tables/fundingDepositRequestObservations.d.ts.map +0 -1
  1055. package/dist/db/tables/fundingDepositRequestObservations.js.map +0 -1
  1056. package/dist/db/tables/fundingDeposits.d.ts.map +0 -1
  1057. package/dist/db/tables/fundingDeposits.js +0 -295
  1058. package/dist/db/tables/fundingDeposits.js.map +0 -1
  1059. package/dist/db/tables/fundingIdempotency.d.ts +0 -91
  1060. package/dist/db/tables/fundingIdempotency.d.ts.map +0 -1
  1061. package/dist/db/tables/fundingIdempotency.js +0 -103
  1062. package/dist/db/tables/fundingIdempotency.js.map +0 -1
  1063. package/dist/db/tables/fundingTransferEvents.d.ts.map +0 -1
  1064. package/dist/db/tables/fundingTransferEvents.js.map +0 -1
  1065. package/dist/db/tables/fundingTransferTransactions.d.ts +0 -15
  1066. package/dist/db/tables/fundingTransferTransactions.d.ts.map +0 -1
  1067. package/dist/db/tables/fundingTransferTransactions.js +0 -27
  1068. package/dist/db/tables/fundingTransferTransactions.js.map +0 -1
  1069. package/dist/db/tables/fundingTransfers.d.ts +0 -82
  1070. package/dist/db/tables/fundingTransfers.d.ts.map +0 -1
  1071. package/dist/db/tables/fundingTransfers.js +0 -89
  1072. package/dist/db/tables/fundingTransfers.js.map +0 -1
  1073. package/dist/internal/funding/Action.d.ts.map +0 -1
  1074. package/dist/internal/funding/Action.js.map +0 -1
  1075. package/dist/internal/funding/Catalog.d.ts.map +0 -1
  1076. package/dist/internal/funding/Catalog.js.map +0 -1
  1077. package/dist/internal/funding/Chain.d.ts.map +0 -1
  1078. package/dist/internal/funding/Chain.js.map +0 -1
  1079. package/dist/internal/funding/Deposit.d.ts.map +0 -1
  1080. package/dist/internal/funding/Deposit.js.map +0 -1
  1081. package/dist/internal/funding/DepositAddress.d.ts.map +0 -1
  1082. package/dist/internal/funding/DepositAddress.js.map +0 -1
  1083. package/dist/internal/funding/DepositWebhook.d.ts.map +0 -1
  1084. package/dist/internal/funding/DepositWebhook.js.map +0 -1
  1085. package/dist/internal/funding/Evidence.d.ts.map +0 -1
  1086. package/dist/internal/funding/Evidence.js.map +0 -1
  1087. package/dist/internal/funding/Provider.d.ts.map +0 -1
  1088. package/dist/internal/funding/Provider.js.map +0 -1
  1089. package/dist/internal/funding/Reconciliation.d.ts.map +0 -1
  1090. package/dist/internal/funding/Reconciliation.js.map +0 -1
  1091. package/dist/internal/funding/Route.d.ts +0 -21
  1092. package/dist/internal/funding/Route.d.ts.map +0 -1
  1093. package/dist/internal/funding/Route.js.map +0 -1
  1094. package/dist/internal/funding/SourceObservation.d.ts.map +0 -1
  1095. package/dist/internal/funding/SourceObservation.js.map +0 -1
  1096. package/dist/internal/funding/Subsidy.d.ts.map +0 -1
  1097. package/dist/internal/funding/Subsidy.js.map +0 -1
  1098. package/dist/internal/funding/Token.d.ts.map +0 -1
  1099. package/dist/internal/funding/Token.js.map +0 -1
  1100. package/dist/internal/funding/Transfer.d.ts.map +0 -1
  1101. package/dist/internal/funding/Transfer.js +0 -334
  1102. package/dist/internal/funding/Transfer.js.map +0 -1
  1103. package/dist/internal/funding/index.d.ts.map +0 -1
  1104. package/dist/internal/funding/index.js.map +0 -1
  1105. package/dist/internal/funding/providers/across.d.ts.map +0 -1
  1106. package/dist/internal/funding/providers/across.js.map +0 -1
  1107. package/dist/internal/funding/providers/relay.d.ts.map +0 -1
  1108. package/dist/internal/funding/providers/relay.js.map +0 -1
  1109. package/dist/internal/funding/providers/rhino.d.ts.map +0 -1
  1110. package/dist/internal/funding/providers/rhino.js.map +0 -1
  1111. package/dist/internal/funding/providers/squid.d.ts.map +0 -1
  1112. package/dist/internal/funding/providers/squid.js.map +0 -1
  1113. package/dist/internal/funding/providers/stargate.d.ts +0 -38
  1114. package/dist/internal/funding/providers/stargate.d.ts.map +0 -1
  1115. package/dist/internal/funding/providers/stargate.js +0 -277
  1116. package/dist/internal/funding/providers/stargate.js.map +0 -1
  1117. package/dist/internal/funding/providers/symbiosis.d.ts.map +0 -1
  1118. package/dist/internal/funding/providers/symbiosis.js.map +0 -1
  1119. package/src/apps/funding/App.test.ts +0 -78
  1120. package/src/apps/funding/App.ts +0 -78
  1121. package/src/apps/funding/ProviderAttempts.ts +0 -26
  1122. package/src/apps/funding/index.ts +0 -1
  1123. package/src/apps/funding/routes/transfers.test.ts +0 -1638
  1124. package/src/apps/funding/routes/transfers.ts +0 -721
  1125. package/src/db/tables/fundingCatalog.test.ts +0 -122
  1126. package/src/db/tables/fundingCatalog.ts +0 -163
  1127. package/src/db/tables/fundingDepositAddresses.test.ts +0 -608
  1128. package/src/db/tables/fundingDepositAddresses.ts +0 -443
  1129. package/src/db/tables/fundingDeposits.ts +0 -572
  1130. package/src/db/tables/fundingIdempotency.test.ts +0 -182
  1131. package/src/db/tables/fundingIdempotency.ts +0 -180
  1132. package/src/db/tables/fundingTransferTransactions.test.ts +0 -69
  1133. package/src/db/tables/fundingTransferTransactions.ts +0 -37
  1134. package/src/db/tables/fundingTransfers.test.ts +0 -89
  1135. package/src/db/tables/fundingTransfers.ts +0 -153
  1136. package/src/handlers/internal/multisig.test.ts +0 -818
  1137. package/src/internal/funding/Subsidy.test.ts +0 -75
  1138. package/src/internal/funding/Transfer.test.ts +0 -369
  1139. package/src/internal/funding/Transfer.ts +0 -545
  1140. package/src/internal/funding/providers/stargate.test.ts +0 -163
  1141. package/src/internal/funding/providers/stargate.ts +0 -409
  1142. /package/dist/apps/{funding → routes}/Inventory.d.ts +0 -0
  1143. /package/src/internal/{funding → routes}/Route.test.ts +0 -0
package/dist/db/Db.js CHANGED
@@ -1157,6 +1157,1052 @@ export const migrations = [
1157
1157
  name: '0137_funding_routes_configuration',
1158
1158
  up: (db) => raw(db, sql `ALTER TABLE funding_routes ADD COLUMN IF NOT EXISTS configuration jsonb`),
1159
1159
  },
1160
+ {
1161
+ name: '0138_organizations_sponsorship_subsidy',
1162
+ up: (db) => raw(db, sql `ALTER TABLE organizations
1163
+ ADD COLUMN IF NOT EXISTS sponsorship_subsidy_duration_days integer,
1164
+ ADD COLUMN IF NOT EXISTS sponsorship_subsidy_project_spend_limit text`),
1165
+ },
1166
+ {
1167
+ name: '0139_projects_sponsorship_activation',
1168
+ up: (db) => raw(db, sql `ALTER TABLE projects
1169
+ ADD COLUMN IF NOT EXISTS sponsorship_subsidy_starts_at text,
1170
+ ADD COLUMN IF NOT EXISTS sponsorship_subsidy_ends_at text,
1171
+ DROP CONSTRAINT IF EXISTS projects_sponsorship_subsidy_window_consistent,
1172
+ ADD CONSTRAINT projects_sponsorship_subsidy_window_consistent CHECK ((sponsorship_subsidy_starts_at IS NULL) = (sponsorship_subsidy_ends_at IS NULL))`),
1173
+ },
1174
+ {
1175
+ name: '0140_projects_sponsorship_spend_limit',
1176
+ up: (db) => raw(db, sql `ALTER TABLE projects ADD COLUMN IF NOT EXISTS sponsorship_spend_limit text`),
1177
+ },
1178
+ {
1179
+ name: '0141_sponsored_transactions_promotion_spend_index',
1180
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS sponsored_transactions_promotion_spend_idx ON sponsored_transactions (org_id, project_id, status, created_at) WHERE NOT billable`),
1181
+ },
1182
+ {
1183
+ name: '0142_funding_transfers_status_updated_at',
1184
+ up: (db) => raw(db, sql `ALTER TABLE funding_transfers ADD COLUMN IF NOT EXISTS status_updated_at text`),
1185
+ },
1186
+ {
1187
+ name: '0143_funding_deposits_status_updated_at',
1188
+ up: (db) => raw(db, sql `ALTER TABLE funding_deposits ADD COLUMN IF NOT EXISTS status_updated_at text`),
1189
+ },
1190
+ {
1191
+ name: '0144_funding_deposit_addresses_status_updated_at',
1192
+ up: (db) => raw(db, sql `ALTER TABLE funding_deposit_addresses ADD COLUMN IF NOT EXISTS status_updated_at text`),
1193
+ },
1194
+ {
1195
+ name: '0145_funding_transfers_state_metrics_index',
1196
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS funding_transfers_state_metrics_idx ON funding_transfers (status, environment, provider_id, method, (status_reason->>'code'), status_updated_at, updated_at)`),
1197
+ },
1198
+ {
1199
+ name: '0146_funding_deposits_state_metrics_index',
1200
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS funding_deposits_state_metrics_idx ON funding_deposits (status, environment, deposit_address_id, (status_reason->>'code'), status_updated_at, updated_at)`),
1201
+ },
1202
+ {
1203
+ name: '0147_funding_deposits_provider_delivered_at',
1204
+ up: (db) => raw(db, sql `ALTER TABLE funding_deposits ADD COLUMN IF NOT EXISTS provider_delivered_at text`),
1205
+ },
1206
+ {
1207
+ name: '0148_funding_transfers_updated_at_index',
1208
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS funding_transfers_updated_at_idx ON funding_transfers (updated_at DESC, id DESC)`),
1209
+ },
1210
+ {
1211
+ name: '0149_funding_deposits_updated_at_index',
1212
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS funding_deposits_updated_at_idx ON funding_deposits (updated_at DESC, id DESC)`),
1213
+ },
1214
+ {
1215
+ name: '0150_funding_deposit_addresses_updated_at_index',
1216
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS funding_deposit_addresses_updated_at_idx ON funding_deposit_addresses (updated_at DESC, id DESC)`),
1217
+ },
1218
+ {
1219
+ name: '0151_sponsorship_attributions',
1220
+ up: (db) => db.schema
1221
+ .createTable('sponsorshipAttributions')
1222
+ .ifNotExists()
1223
+ .addColumn('id', 'text', (c) => c.primaryKey())
1224
+ .addColumn('orgId', 'text', (c) => c.notNull())
1225
+ .addColumn('externalId', 'text')
1226
+ .addColumn('projectId', 'text')
1227
+ .addColumn('startsAt', 'text')
1228
+ .addColumn('endsAt', 'text')
1229
+ .addColumn('spendLimit', 'text')
1230
+ .addColumn('createdAt', 'text', (c) => c.notNull())
1231
+ .addColumn('updatedAt', 'text', (c) => c.notNull())
1232
+ .addCheckConstraint('sponsorship_attributions_source_check', sql `(external_id IS NULL) <> (project_id IS NULL)`)
1233
+ .addCheckConstraint('sponsorship_attributions_window_check', sql `(starts_at IS NULL) = (ends_at IS NULL)`),
1234
+ },
1235
+ {
1236
+ name: '0152_sponsorship_attributions_external_unique',
1237
+ up: (db) => raw(db, sql `CREATE UNIQUE INDEX IF NOT EXISTS sponsorship_attributions_external_unique ON sponsorship_attributions (org_id, external_id) WHERE external_id IS NOT NULL`),
1238
+ },
1239
+ {
1240
+ name: '0153_sponsorship_attributions_project_unique',
1241
+ up: (db) => raw(db, sql `CREATE UNIQUE INDEX IF NOT EXISTS sponsorship_attributions_project_unique ON sponsorship_attributions (org_id, project_id) WHERE project_id IS NOT NULL`),
1242
+ },
1243
+ {
1244
+ name: '0154_sponsored_transactions_attribution_id',
1245
+ up: (db) => raw(db, sql `ALTER TABLE sponsored_transactions ADD COLUMN IF NOT EXISTS sponsorship_attribution_id text`),
1246
+ },
1247
+ {
1248
+ name: '0155_sponsored_transactions_attribution_spend_index',
1249
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS sponsored_transactions_attribution_spend_idx ON sponsored_transactions (org_id, sponsorship_attribution_id, status, created_at) WHERE NOT billable`),
1250
+ },
1251
+ {
1252
+ name: '0156_project_sponsorship_attributions',
1253
+ up: (db) => raw(db, sql `INSERT INTO sponsorship_attributions (id, org_id, external_id, project_id, starts_at, ends_at, spend_limit, created_at, updated_at)
1254
+ SELECT 'sat_' || md5(projects.org_id || ':' || projects.id), projects.org_id, NULL, projects.id, projects.sponsorship_subsidy_starts_at, projects.sponsorship_subsidy_ends_at, projects.sponsorship_spend_limit, projects.created_at, projects.updated_at
1255
+ FROM projects
1256
+ WHERE projects.sponsorship_subsidy_starts_at IS NOT NULL
1257
+ ON CONFLICT (org_id, project_id) WHERE project_id IS NOT NULL DO UPDATE
1258
+ SET starts_at = EXCLUDED.starts_at, ends_at = EXCLUDED.ends_at, spend_limit = EXCLUDED.spend_limit, updated_at = EXCLUDED.updated_at
1259
+ WHERE sponsorship_attributions.starts_at IS NULL`),
1260
+ },
1261
+ {
1262
+ name: '0157_project_sponsored_transaction_attributions',
1263
+ up: (db) => raw(db, sql `UPDATE sponsored_transactions
1264
+ SET sponsorship_attribution_id = sponsorship_attributions.id
1265
+ FROM sponsorship_attributions
1266
+ WHERE sponsored_transactions.sponsorship_attribution_id IS NULL
1267
+ AND sponsored_transactions.org_id = sponsorship_attributions.org_id
1268
+ AND sponsored_transactions.project_id = sponsorship_attributions.project_id`),
1269
+ },
1270
+ {
1271
+ name: '0158_reward_eligibility_associations',
1272
+ up: (db) => db.schema
1273
+ .createTable('rewardEligibilityAssociations')
1274
+ .ifNotExists()
1275
+ .addColumn('chainId', 'bigint', (c) => c.notNull())
1276
+ .addColumn('vaultAddress', 'text', (c) => c.notNull())
1277
+ .addColumn('walletAddress', 'text', (c) => c.notNull())
1278
+ .addColumn('firstRegisteredAt', 'text', (c) => c.notNull())
1279
+ .addColumn('latestRegisteredAt', 'text', (c) => c.notNull())
1280
+ .addColumn('transactionHash', 'text')
1281
+ .addPrimaryKeyConstraint('reward_eligibility_associations_pkey', [
1282
+ 'chainId',
1283
+ 'vaultAddress',
1284
+ 'walletAddress',
1285
+ ]),
1286
+ },
1287
+ {
1288
+ name: '0159_reward_eligibility_registration_order',
1289
+ up: (db) => raw(db, sql `ALTER TABLE reward_eligibility_associations ADD COLUMN IF NOT EXISTS registration_order bigint GENERATED ALWAYS AS IDENTITY UNIQUE`),
1290
+ },
1291
+ {
1292
+ name: '0160_reward_eligibility_page_index',
1293
+ up: (db) => db.schema
1294
+ .createIndex('reward_eligibility_associations_page_idx')
1295
+ .ifNotExists()
1296
+ .on('rewardEligibilityAssociations')
1297
+ .columns(['chainId', 'vaultAddress', 'registrationOrder']),
1298
+ },
1299
+ {
1300
+ name: '0161_users_name',
1301
+ up: (db) => raw(db, sql `ALTER TABLE users ADD COLUMN IF NOT EXISTS name text`),
1302
+ },
1303
+ {
1304
+ name: '0162_users_image',
1305
+ up: (db) => raw(db, sql `ALTER TABLE users ADD COLUMN IF NOT EXISTS image text`),
1306
+ },
1307
+ {
1308
+ name: '0163_users_email_verified',
1309
+ up: (db) => raw(db, sql `ALTER TABLE users ADD COLUMN IF NOT EXISTS email_verified boolean`),
1310
+ },
1311
+ {
1312
+ name: '0164_users_auth_fields_backfill',
1313
+ up: (db) => raw(db, sql `UPDATE users SET email_verified = email IS NOT NULL, name = COALESCE(NULLIF(btrim(email), ''), id) WHERE email_verified IS NULL OR name IS NULL`),
1314
+ },
1315
+ {
1316
+ name: '0165_users_auth_fields_required',
1317
+ // Defaults keep inserts from the previous Worker valid while the new
1318
+ // required Better Auth fields roll out.
1319
+ up: (db) => raw(db, sql `ALTER TABLE users ALTER COLUMN email_verified SET DEFAULT false, ALTER COLUMN email_verified SET NOT NULL, ALTER COLUMN name SET DEFAULT '', ALTER COLUMN name SET NOT NULL`),
1320
+ },
1321
+ {
1322
+ name: '0166_users_email_auth_precondition',
1323
+ up: (db) => raw(db, sql `DO $$ BEGIN
1324
+ IF EXISTS (SELECT 1 FROM users WHERE email IS NOT NULL AND btrim(email) = '') THEN
1325
+ RAISE EXCEPTION 'users.email contains blank values';
1326
+ END IF;
1327
+ END $$`),
1328
+ },
1329
+ {
1330
+ name: '0167_users_email_normalized',
1331
+ up: (db) => raw(db, sql `UPDATE users SET email = lower(btrim(email))`),
1332
+ },
1333
+ {
1334
+ name: '0168_users_email_index',
1335
+ // SIWE still creates address-keyed users. Enforce email uniqueness in a
1336
+ // later deployment after wallet identities are linked.
1337
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS users_email_idx ON users (email)`),
1338
+ },
1339
+ {
1340
+ name: '0169_users_email_normalized_index',
1341
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS users_email_normalized_idx ON users (lower(btrim(email))) WHERE email IS NOT NULL`),
1342
+ },
1343
+ {
1344
+ name: '0170_auth_sessions',
1345
+ up: (db) => db.schema
1346
+ .createTable('authSessions')
1347
+ .ifNotExists()
1348
+ .addColumn('id', 'text', (c) => c.primaryKey().notNull())
1349
+ .addColumn('expiresAt', 'text', (c) => c.notNull())
1350
+ .addColumn('token', 'text', (c) => c.notNull().unique())
1351
+ .addColumn('createdAt', 'text', (c) => c.notNull())
1352
+ .addColumn('updatedAt', 'text', (c) => c.notNull())
1353
+ .addColumn('ipAddress', 'text')
1354
+ .addColumn('userAgent', 'text')
1355
+ .addColumn('userId', 'text', (c) => c.notNull().references('users.id').onDelete('cascade')),
1356
+ },
1357
+ {
1358
+ name: '0171_auth_sessions_user_index',
1359
+ up: (db) => db.schema
1360
+ .createIndex('auth_sessions_user_id_idx')
1361
+ .ifNotExists()
1362
+ .on('authSessions')
1363
+ .column('userId'),
1364
+ },
1365
+ {
1366
+ name: '0172_auth_accounts',
1367
+ up: (db) => db.schema
1368
+ .createTable('authAccounts')
1369
+ .ifNotExists()
1370
+ .addColumn('id', 'text', (c) => c.primaryKey().notNull())
1371
+ .addColumn('issuer', 'text', (c) => c.notNull())
1372
+ .addColumn('accountId', 'text', (c) => c.notNull())
1373
+ .addColumn('providerId', 'text', (c) => c.notNull())
1374
+ .addColumn('userId', 'text', (c) => c.notNull().references('users.id').onDelete('cascade'))
1375
+ .addColumn('accessToken', 'text')
1376
+ .addColumn('refreshToken', 'text')
1377
+ .addColumn('idToken', 'text')
1378
+ .addColumn('accessTokenExpiresAt', 'text')
1379
+ .addColumn('refreshTokenExpiresAt', 'text')
1380
+ .addColumn('scope', 'text')
1381
+ .addColumn('password', 'text')
1382
+ .addColumn('createdAt', 'text', (c) => c.notNull())
1383
+ .addColumn('updatedAt', 'text', (c) => c.notNull()),
1384
+ },
1385
+ {
1386
+ name: '0173_auth_accounts_user_index',
1387
+ up: (db) => db.schema
1388
+ .createIndex('auth_accounts_user_id_idx')
1389
+ .ifNotExists()
1390
+ .on('authAccounts')
1391
+ .column('userId'),
1392
+ },
1393
+ {
1394
+ name: '0174_auth_accounts_identity_index',
1395
+ up: (db) => db.schema
1396
+ .createIndex('auth_accounts_issuer_account_id_unique_idx')
1397
+ .ifNotExists()
1398
+ .unique()
1399
+ .on('authAccounts')
1400
+ .columns(['issuer', 'accountId']),
1401
+ },
1402
+ {
1403
+ name: '0175_auth_verifications',
1404
+ up: (db) => db.schema
1405
+ .createTable('authVerifications')
1406
+ .ifNotExists()
1407
+ .addColumn('id', 'text', (c) => c.primaryKey().notNull())
1408
+ .addColumn('identifier', 'text', (c) => c.notNull())
1409
+ .addColumn('value', 'text', (c) => c.notNull())
1410
+ .addColumn('expiresAt', 'text', (c) => c.notNull())
1411
+ .addColumn('createdAt', 'text', (c) => c.notNull())
1412
+ .addColumn('updatedAt', 'text', (c) => c.notNull()),
1413
+ },
1414
+ {
1415
+ name: '0176_auth_verifications_identifier_index',
1416
+ up: (db) => db.schema
1417
+ .createIndex('auth_verifications_identifier_idx')
1418
+ .ifNotExists()
1419
+ .on('authVerifications')
1420
+ .column('identifier'),
1421
+ },
1422
+ {
1423
+ name: '0177_auth_sessions_provider',
1424
+ up: (db) => raw(db, sql `ALTER TABLE auth_sessions ADD COLUMN IF NOT EXISTS provider text`),
1425
+ },
1426
+ {
1427
+ name: '0178_reward_campaigns',
1428
+ up: (db) => db.schema
1429
+ .createTable('rewardCampaigns')
1430
+ .ifNotExists()
1431
+ .addColumn('chainId', 'bigint', (c) => c.notNull())
1432
+ .addColumn('vaultAddress', 'text', (c) => c.notNull())
1433
+ .addColumn('assetAddress', 'text', (c) => c.notNull())
1434
+ .addColumn('assetDecimals', 'integer', (c) => c.notNull())
1435
+ .addColumn('earnShareAddress', 'text', (c) => c.notNull())
1436
+ .addColumn('controllerAddress', 'text')
1437
+ .addColumn('distributorAddress', 'text')
1438
+ .addColumn('config', 'jsonb', (c) => c.notNull())
1439
+ .addColumn('pendingConfig', 'jsonb')
1440
+ .addColumn('pendingEffectiveAt', 'bigint')
1441
+ .addColumn('eventCursor', 'jsonb')
1442
+ .addColumn('deliveredThrough', 'bigint', (c) => c.notNull())
1443
+ .addColumn('paused', 'boolean', (c) => c.notNull().defaultTo(false))
1444
+ .addColumn('provisioningError', 'text')
1445
+ .addColumn('createdAt', 'text', (c) => c.notNull())
1446
+ .addColumn('updatedAt', 'text', (c) => c.notNull())
1447
+ .addPrimaryKeyConstraint('reward_campaigns_pkey', ['chainId', 'vaultAddress'])
1448
+ .addForeignKeyConstraint('reward_campaigns_vault_fkey', ['chainId', 'vaultAddress'], 'earnVaults', ['chainId', 'vaultAddress'], (c) => c.onDelete('restrict')),
1449
+ },
1450
+ {
1451
+ name: '0179_reward_accounts',
1452
+ up: (db) => db.schema
1453
+ .createTable('rewardAccounts')
1454
+ .ifNotExists()
1455
+ .addColumn('chainId', 'bigint', (c) => c.notNull())
1456
+ .addColumn('vaultAddress', 'text', (c) => c.notNull())
1457
+ .addColumn('recipient', 'text', (c) => c.notNull())
1458
+ .addColumn('registrationOrder', 'bigint', (c) => c.notNull())
1459
+ .addColumn('publicEarnShares', 'numeric', (c) => c.notNull())
1460
+ .addColumn('qualifiedEarnShares', 'numeric', (c) => c.notNull())
1461
+ .addColumn('allocatedPrincipalAssets', 'numeric', (c) => c.notNull())
1462
+ .addColumn('accrualRemainder', 'numeric', (c) => c.notNull())
1463
+ .addColumn('pendingRewardAssets', 'numeric', (c) => c.notNull())
1464
+ .addColumn('cumulativeEntitlement', 'numeric', (c) => c.notNull())
1465
+ .addColumn('cumulativePaid', 'numeric', (c) => c.notNull())
1466
+ .addColumn('deferral', 'text')
1467
+ .addColumn('lots', 'jsonb', (c) => c.notNull())
1468
+ .addColumn('updatedAt', 'text', (c) => c.notNull())
1469
+ .addPrimaryKeyConstraint('reward_accounts_pkey', ['chainId', 'vaultAddress', 'recipient'])
1470
+ .addForeignKeyConstraint('reward_accounts_campaign_fkey', ['chainId', 'vaultAddress'], 'rewardCampaigns', ['chainId', 'vaultAddress'], (c) => c.onDelete('cascade')),
1471
+ },
1472
+ {
1473
+ name: '0180_reward_runs',
1474
+ up: (db) => db.schema
1475
+ .createTable('rewardRuns')
1476
+ .ifNotExists()
1477
+ .addColumn('id', 'text', (c) => c.primaryKey().notNull())
1478
+ .addColumn('chainId', 'bigint', (c) => c.notNull())
1479
+ .addColumn('vaultAddress', 'text', (c) => c.notNull())
1480
+ .addColumn('startsAfter', 'bigint', (c) => c.notNull())
1481
+ .addColumn('endsAt', 'bigint', (c) => c.notNull())
1482
+ .addColumn('config', 'jsonb', (c) => c.notNull())
1483
+ .addColumn('phase', 'text', (c) => c.notNull())
1484
+ .addColumn('leaseExpiresAt', 'text')
1485
+ .addColumn('fence', 'bigint', (c) => c.notNull().defaultTo(0))
1486
+ .addColumn('evidence', 'jsonb')
1487
+ .addColumn('fundedAssets', 'numeric')
1488
+ .addColumn('mintedEarnShares', 'numeric')
1489
+ .addColumn('statement', 'jsonb')
1490
+ .addColumn('statementHash', 'text')
1491
+ .addColumn('root', 'text')
1492
+ .addColumn('rootVersion', 'bigint')
1493
+ .addColumn('liability', 'numeric')
1494
+ .addColumn('error', 'text')
1495
+ .addColumn('createdAt', 'text', (c) => c.notNull())
1496
+ .addColumn('updatedAt', 'text', (c) => c.notNull())
1497
+ .addUniqueConstraint('reward_runs_boundary_key', ['chainId', 'vaultAddress', 'startsAfter'])
1498
+ .addForeignKeyConstraint('reward_runs_campaign_fkey', ['chainId', 'vaultAddress'], 'rewardCampaigns', ['chainId', 'vaultAddress'], (c) => c.onDelete('cascade')),
1499
+ },
1500
+ {
1501
+ name: '0181_reward_transaction_attempts',
1502
+ up: (db) => db.schema
1503
+ .createTable('rewardTransactionAttempts')
1504
+ .ifNotExists()
1505
+ .addColumn('id', 'text', (c) => c.primaryKey().notNull())
1506
+ .addColumn('chainId', 'bigint', (c) => c.notNull())
1507
+ .addColumn('vaultAddress', 'text', (c) => c.notNull())
1508
+ .addColumn('runId', 'text')
1509
+ .addColumn('intent', 'jsonb', (c) => c.notNull())
1510
+ .addColumn('intentId', 'text', (c) => c.notNull())
1511
+ .addColumn('signer', 'text', (c) => c.notNull())
1512
+ .addColumn('nonce', 'numeric')
1513
+ .addColumn('expiresAt', 'text')
1514
+ .addColumn('signedBytes', 'text')
1515
+ .addColumn('transactionHash', 'text')
1516
+ .addColumn('state', 'text', (c) => c.notNull())
1517
+ .addColumn('receipt', 'jsonb')
1518
+ .addColumn('confirmedBlockHash', 'text')
1519
+ .addColumn('replacementOf', 'text')
1520
+ .addColumn('createdAt', 'text', (c) => c.notNull())
1521
+ .addColumn('updatedAt', 'text', (c) => c.notNull())
1522
+ .addForeignKeyConstraint('reward_transaction_attempts_campaign_fkey', ['chainId', 'vaultAddress'], 'rewardCampaigns', ['chainId', 'vaultAddress'], (c) => c.onDelete('cascade'))
1523
+ .addForeignKeyConstraint('reward_transaction_attempts_run_fkey', ['runId'], 'rewardRuns', ['id'], (c) => c.onDelete('cascade'))
1524
+ .addForeignKeyConstraint('reward_transaction_attempts_replacement_fkey', ['replacementOf'], 'rewardTransactionAttempts', ['id'], (c) => c.onDelete('restrict')),
1525
+ },
1526
+ {
1527
+ name: '0182_reward_transaction_attempt_nonce_key',
1528
+ up: (db) => raw(db, sql `CREATE UNIQUE INDEX IF NOT EXISTS reward_transaction_attempt_nonce_key ON reward_transaction_attempts (chain_id, signer, nonce) WHERE nonce IS NOT NULL`),
1529
+ },
1530
+ {
1531
+ name: '0183_reward_campaigns_due_index',
1532
+ up: (db) => db.schema
1533
+ .createIndex('reward_campaigns_due_idx')
1534
+ .ifNotExists()
1535
+ .on('rewardCampaigns')
1536
+ .columns(['paused', 'deliveredThrough']),
1537
+ },
1538
+ {
1539
+ name: '0184_reward_transaction_attempt_live_intent_key',
1540
+ up: (db) => raw(db, sql `CREATE UNIQUE INDEX IF NOT EXISTS reward_transaction_attempt_live_intent_key ON reward_transaction_attempts (intent_id) WHERE state IN ('created', 'signed', 'broadcast')`),
1541
+ },
1542
+ {
1543
+ name: '0185_reward_campaign_signer',
1544
+ up: (db) => raw(db, sql `ALTER TABLE reward_campaigns ADD COLUMN IF NOT EXISTS signer_address text`),
1545
+ },
1546
+ {
1547
+ name: '0186_reward_transaction_attempt_run_index',
1548
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS reward_transaction_attempt_run_idx ON reward_transaction_attempts (run_id, created_at)`),
1549
+ },
1550
+ {
1551
+ name: '0187_reward_transaction_attempt_intent_run_index',
1552
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS reward_transaction_attempt_intent_run_idx ON reward_transaction_attempts (intent_id, run_id, created_at)`),
1553
+ },
1554
+ {
1555
+ name: '0188_reward_campaign_earn_share_decimals',
1556
+ up: (db) => raw(db, sql `ALTER TABLE reward_campaigns ADD COLUMN IF NOT EXISTS earn_share_decimals integer NOT NULL DEFAULT 18`),
1557
+ },
1558
+ {
1559
+ name: '0189_reward_campaign_earn_share_decimals_default',
1560
+ up: (db) => raw(db, sql `ALTER TABLE reward_campaigns ALTER COLUMN earn_share_decimals DROP DEFAULT`),
1561
+ },
1562
+ {
1563
+ name: '0190_routes_tables',
1564
+ up: (db) => raw(db, sql `DO $$
1565
+ DECLARE
1566
+ entry record;
1567
+ target_name text;
1568
+ BEGIN
1569
+ -- Tests replay every DDL statement on new connections, recreating empty legacy tables.
1570
+ IF to_regclass('routes_catalogs') IS NOT NULL THEN
1571
+ DROP TABLE IF EXISTS
1572
+ funding_deposit_request_observations,
1573
+ funding_deposits,
1574
+ funding_deposit_addresses,
1575
+ funding_transfer_transactions,
1576
+ funding_transfer_events,
1577
+ funding_idempotency_requests,
1578
+ funding_transfers,
1579
+ funding_routes,
1580
+ funding_chain_tokens,
1581
+ funding_tokens,
1582
+ funding_chains,
1583
+ funding_catalogs
1584
+ CASCADE;
1585
+ END IF;
1586
+
1587
+ IF to_regclass('funding_catalogs') IS NOT NULL AND to_regclass('routes_catalogs') IS NULL THEN
1588
+ ALTER TABLE funding_catalogs RENAME TO routes_catalogs;
1589
+ END IF;
1590
+ IF to_regclass('funding_chain_tokens') IS NOT NULL AND to_regclass('routes_chain_tokens') IS NULL THEN
1591
+ ALTER TABLE funding_chain_tokens RENAME TO routes_chain_tokens;
1592
+ END IF;
1593
+ IF to_regclass('funding_chains') IS NOT NULL AND to_regclass('routes_chains') IS NULL THEN
1594
+ ALTER TABLE funding_chains RENAME TO routes_chains;
1595
+ END IF;
1596
+ IF to_regclass('funding_deposit_addresses') IS NOT NULL AND to_regclass('routes_deposit_addresses') IS NULL THEN
1597
+ ALTER TABLE funding_deposit_addresses RENAME TO routes_deposit_addresses;
1598
+ END IF;
1599
+ IF to_regclass('funding_deposit_request_observations') IS NOT NULL AND to_regclass('routes_deposit_request_observations') IS NULL THEN
1600
+ ALTER TABLE funding_deposit_request_observations RENAME TO routes_deposit_request_observations;
1601
+ END IF;
1602
+ IF to_regclass('funding_deposits') IS NOT NULL AND to_regclass('routes_deposits') IS NULL THEN
1603
+ ALTER TABLE funding_deposits RENAME TO routes_deposits;
1604
+ END IF;
1605
+ IF to_regclass('funding_idempotency_requests') IS NOT NULL AND to_regclass('routes_idempotency_requests') IS NULL THEN
1606
+ ALTER TABLE funding_idempotency_requests RENAME TO routes_idempotency_requests;
1607
+ END IF;
1608
+ IF to_regclass('funding_routes') IS NOT NULL AND to_regclass('routes_routes') IS NULL THEN
1609
+ ALTER TABLE funding_routes RENAME TO routes_routes;
1610
+ END IF;
1611
+ IF to_regclass('funding_tokens') IS NOT NULL AND to_regclass('routes_tokens') IS NULL THEN
1612
+ ALTER TABLE funding_tokens RENAME TO routes_tokens;
1613
+ END IF;
1614
+ IF to_regclass('funding_transfer_events') IS NOT NULL AND to_regclass('routes_transfer_events') IS NULL THEN
1615
+ ALTER TABLE funding_transfer_events RENAME TO routes_transfer_events;
1616
+ END IF;
1617
+ IF to_regclass('funding_transfer_transactions') IS NOT NULL AND to_regclass('routes_transfer_transactions') IS NULL THEN
1618
+ ALTER TABLE funding_transfer_transactions RENAME TO routes_transfer_transactions;
1619
+ END IF;
1620
+ IF to_regclass('funding_transfers') IS NOT NULL AND to_regclass('routes_transfers') IS NULL THEN
1621
+ ALTER TABLE funding_transfers RENAME TO routes_transfers;
1622
+ END IF;
1623
+
1624
+ UPDATE routes_deposit_addresses
1625
+ SET snapshot = jsonb_set(snapshot, '{subsidize}', to_jsonb(subsidize), true)
1626
+ WHERE snapshot->'subsidize' IS DISTINCT FROM to_jsonb(subsidize);
1627
+
1628
+ FOR entry IN
1629
+ SELECT c.conname AS name, t.relname AS table_name
1630
+ FROM pg_constraint AS c
1631
+ JOIN pg_class AS t ON t.oid = c.conrelid
1632
+ JOIN pg_namespace AS n ON n.oid = t.relnamespace
1633
+ WHERE n.nspname = current_schema() AND c.conname LIKE 'funding\_%' ESCAPE '\\'
1634
+ LOOP
1635
+ target_name := regexp_replace(entry.name, '^funding_', 'routes_');
1636
+ EXECUTE format(
1637
+ 'ALTER TABLE %I.%I RENAME CONSTRAINT %I TO %I',
1638
+ current_schema(),
1639
+ entry.table_name,
1640
+ entry.name,
1641
+ target_name
1642
+ );
1643
+ END LOOP;
1644
+
1645
+ FOR entry IN
1646
+ SELECT indexname AS name
1647
+ FROM pg_indexes
1648
+ WHERE schemaname = current_schema() AND indexname LIKE 'funding\_%' ESCAPE '\\'
1649
+ LOOP
1650
+ target_name := regexp_replace(entry.name, '^funding_', 'routes_');
1651
+ IF to_regclass(target_name) IS NULL THEN
1652
+ EXECUTE format('ALTER INDEX %I.%I RENAME TO %I', current_schema(), entry.name, target_name);
1653
+ ELSE
1654
+ EXECUTE format('DROP INDEX %I.%I', current_schema(), entry.name);
1655
+ END IF;
1656
+ END LOOP;
1657
+ END $$`),
1658
+ },
1659
+ {
1660
+ // Correct the deelUSD router boundary so registry reads can verify its bytecode.
1661
+ name: '0191_deelusd_earn_router_deployment_block',
1662
+ up: (db) => raw(db, sql `UPDATE earn_vaults
1663
+ SET zones = jsonb_set(zones, '{0,deploymentBlock}', '35822949'::jsonb)
1664
+ WHERE chain_id = 4217
1665
+ AND vault_address = '0x4f94590b636f5878bce585e82379de81e1ec174f'
1666
+ AND zones->0->>'chainId' = '421700001'
1667
+ AND lower(zones->0->>'earnRouter') = '0x8117e0ba6239b9695f780deb010f72a2fa4bdfb6'
1668
+ AND zones->0->>'deploymentBlock' = '35816964'`),
1669
+ },
1670
+ {
1671
+ name: '0192_reward_account_eligibility_registration',
1672
+ up: (db) => raw(db, sql `ALTER TABLE reward_accounts ADD COLUMN IF NOT EXISTS eligibility_registered_at text`),
1673
+ },
1674
+ {
1675
+ name: '0193_routes_subsidies',
1676
+ up: (db) => db.schema
1677
+ .createTable('routesSubsidies')
1678
+ .ifNotExists()
1679
+ .addColumn('apiKeyId', 'text')
1680
+ .addColumn('createdAt', 'text', (c) => c.notNull())
1681
+ .addColumn('enabled', 'boolean', (c) => c.notNull())
1682
+ .addColumn('frequency', 'text', (c) => c.notNull())
1683
+ .addColumn('maxAmount', 'text')
1684
+ .addColumn('orgId', 'text', (c) => c.notNull().references('organizations.id').onDelete('cascade'))
1685
+ .addColumn('updatedAt', 'text', (c) => c.notNull())
1686
+ .addCheckConstraint('routes_subsidies_frequency_check', sql `frequency = 'tx'`)
1687
+ .addCheckConstraint('routes_subsidies_enabled_check', sql `CASE WHEN enabled THEN CASE WHEN max_amount ~ '^(0|[1-9][0-9]*)([.][0-9]{1,6})?$' THEN max_amount::numeric > 0 ELSE false END ELSE max_amount IS NULL END`),
1688
+ },
1689
+ {
1690
+ name: '0194_routes_subsidies_org_unique',
1691
+ up: (db) => raw(db, sql `CREATE UNIQUE INDEX IF NOT EXISTS routes_subsidies_org_unique ON routes_subsidies (org_id) WHERE api_key_id IS NULL`),
1692
+ },
1693
+ {
1694
+ name: '0195_routes_subsidies_api_key_unique',
1695
+ up: (db) => raw(db, sql `CREATE UNIQUE INDEX IF NOT EXISTS routes_subsidies_api_key_unique ON routes_subsidies (api_key_id) WHERE api_key_id IS NOT NULL`),
1696
+ },
1697
+ {
1698
+ name: '0196_routes_subsidies_backfill',
1699
+ up: (db) => raw(db, sql `INSERT INTO routes_subsidies (api_key_id, created_at, enabled, frequency, max_amount, org_id, updated_at) SELECT NULL, created_at, true, 'tx', '5', id, updated_at FROM organizations ON CONFLICT DO NOTHING`),
1700
+ },
1701
+ {
1702
+ name: '0197_routes_deposits_subsidy_meter_reported_at',
1703
+ up: (db) => raw(db, sql `ALTER TABLE routes_deposits ADD COLUMN IF NOT EXISTS subsidy_meter_reported_at text`),
1704
+ },
1705
+ {
1706
+ name: '0198_routes_deposits_unreported_subsidy_index',
1707
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS routes_deposits_unreported_subsidy_idx ON routes_deposits (status_updated_at, id) WHERE environment = 'production' AND status = 'completed' AND settlement_transaction_hash IS NOT NULL AND subsidy_amount IS NOT NULL AND subsidy_meter_reported_at IS NULL`),
1708
+ },
1709
+ {
1710
+ name: '0199_routes_deposits_subsidy_usage_index',
1711
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS routes_deposits_subsidy_usage_idx ON routes_deposits (org_id, environment, status_updated_at) WHERE status = 'completed' AND settlement_transaction_hash IS NOT NULL AND subsidy_amount IS NOT NULL`),
1712
+ },
1713
+ {
1714
+ name: '0200_routes_deposits_legacy_subsidies_reported',
1715
+ up: (db) => raw(db, sql `UPDATE routes_deposits SET subsidy_meter_reported_at = coalesce(status_updated_at, updated_at) WHERE environment = 'production' AND settlement_transaction_hash IS NOT NULL AND subsidy_amount IS NOT NULL AND subsidy_meter_reported_at IS NULL`),
1716
+ },
1717
+ {
1718
+ name: '0201_routes_deposits_billable_subsidy_index',
1719
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS routes_deposits_billable_subsidy_idx ON routes_deposits (status_updated_at, id) WHERE environment = 'production' AND settlement_transaction_hash IS NOT NULL AND subsidy_amount IS NOT NULL AND (subsidy_amount->>'baseUnits')::numeric > 0 AND subsidy_meter_reported_at IS NULL AND (status = 'completed' OR (status IN ('action-required', 'settling') AND tempo_gas_paid IS NOT NULL))`),
1720
+ },
1721
+ {
1722
+ name: '0202_routes_deposits_provider_subsidy',
1723
+ up: (db) => raw(db, sql `ALTER TABLE routes_deposits ADD COLUMN IF NOT EXISTS provider_subsidy jsonb`),
1724
+ },
1725
+ {
1726
+ name: '0203_routes_deposits_billable_subsidy_index_v2',
1727
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS routes_deposits_billable_subsidy_v2_idx ON routes_deposits (status_updated_at, id) WHERE environment = 'production' AND subsidy_meter_reported_at IS NULL AND (status = 'completed' OR (status IN ('action-required', 'settling') AND tempo_gas_paid IS NOT NULL)) AND (((provider_subsidy->'amount'->>'baseUnits')::numeric > 0) OR (settlement_transaction_hash IS NOT NULL AND (subsidy_amount->>'baseUnits')::numeric > 0))`),
1728
+ },
1729
+ {
1730
+ name: '0204_routes_deposits_subsidy_usage_index_v2',
1731
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS routes_deposits_subsidy_usage_v2_idx ON routes_deposits (org_id, environment, subsidy_meter_reported_at) WHERE (provider_subsidy->'amount'->>'baseUnits')::numeric > 0 OR (subsidy_amount->>'baseUnits')::numeric > 0`),
1732
+ },
1733
+ {
1734
+ name: '0205_sponsored_transactions_admin_index',
1735
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS sponsored_transactions_admin_idx ON sponsored_transactions (created_at DESC, id DESC)`),
1736
+ },
1737
+ {
1738
+ name: '0206_routes_deposits_admin_subsidy_index',
1739
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS routes_deposits_admin_subsidy_idx ON routes_deposits (updated_at DESC, id DESC) WHERE (provider_subsidy->'amount'->>'baseUnits')::numeric > 0 OR (subsidy_amount->>'baseUnits')::numeric > 0`),
1740
+ },
1741
+ {
1742
+ name: '0207_routes_deposit_addresses_drop_api_key',
1743
+ up: (db) => raw(db, sql `ALTER TABLE routes_deposit_addresses DROP COLUMN IF EXISTS api_key_id`),
1744
+ },
1745
+ {
1746
+ name: '0208_routes_subsidies_drop_api_key_policies',
1747
+ up: (db) => raw(db, sql `DO $$
1748
+ BEGIN
1749
+ IF EXISTS (
1750
+ SELECT 1
1751
+ FROM information_schema.columns
1752
+ WHERE table_schema = current_schema()
1753
+ AND table_name = 'routes_subsidies'
1754
+ AND column_name = 'api_key_id'
1755
+ ) THEN
1756
+ DELETE FROM routes_subsidies WHERE api_key_id IS NOT NULL;
1757
+ END IF;
1758
+ END $$`),
1759
+ },
1760
+ {
1761
+ name: '0209_routes_subsidies_drop_api_key_indexes',
1762
+ up: (db) => raw(db, sql `DROP INDEX IF EXISTS routes_subsidies_org_unique, routes_subsidies_api_key_unique`),
1763
+ },
1764
+ {
1765
+ name: '0210_routes_subsidies_drop_api_key',
1766
+ up: (db) => raw(db, sql `ALTER TABLE routes_subsidies DROP COLUMN IF EXISTS api_key_id`),
1767
+ },
1768
+ {
1769
+ name: '0211_routes_subsidies_org_unique',
1770
+ up: (db) => raw(db, sql `CREATE UNIQUE INDEX IF NOT EXISTS routes_subsidies_org_unique ON routes_subsidies (org_id)`),
1771
+ },
1772
+ {
1773
+ name: '0212_routes_transfer_subsidy_nonces',
1774
+ up: (db) => db.schema
1775
+ .createTable('routesTransferSubsidyNonces')
1776
+ .ifNotExists()
1777
+ .addColumn('account', 'text', (c) => c.notNull())
1778
+ .addColumn('chainId', 'text', (c) => c.notNull())
1779
+ .addColumn('nextNonce', 'text', (c) => c.notNull())
1780
+ .addColumn('updatedAt', 'text', (c) => c.notNull())
1781
+ .addPrimaryKeyConstraint('routes_transfer_subsidy_nonces_pkey', ['chainId', 'account']),
1782
+ },
1783
+ {
1784
+ name: '0213_routes_transfers_subsidy_amount',
1785
+ up: (db) => raw(db, sql `ALTER TABLE routes_transfers ADD COLUMN IF NOT EXISTS subsidy_amount jsonb`), // prettier-ignore
1786
+ },
1787
+ {
1788
+ name: '0214_routes_transfers_subsidy_meter_reported_at',
1789
+ up: (db) => raw(db, sql `ALTER TABLE routes_transfers ADD COLUMN IF NOT EXISTS subsidy_meter_reported_at text`), // prettier-ignore
1790
+ },
1791
+ {
1792
+ name: '0215_routes_transfers_subsidy_transaction_hash',
1793
+ up: (db) => raw(db, sql `ALTER TABLE routes_transfers ADD COLUMN IF NOT EXISTS subsidy_transaction_hash text`), // prettier-ignore
1794
+ },
1795
+ {
1796
+ name: '0216_routes_transfers_billable_subsidy_index',
1797
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS routes_transfers_billable_subsidy_idx ON routes_transfers (status_updated_at, id) WHERE environment = 'production' AND status = 'completed' AND subsidy_transaction_hash IS NOT NULL AND subsidy_amount IS NOT NULL AND (subsidy_amount->>'baseUnits')::numeric > 0 AND subsidy_meter_reported_at IS NULL`),
1798
+ },
1799
+ {
1800
+ name: '0217_routes_transfers_subsidy_account',
1801
+ up: (db) => raw(db, sql `ALTER TABLE routes_transfers ADD COLUMN IF NOT EXISTS subsidy_account text`), // prettier-ignore
1802
+ },
1803
+ {
1804
+ name: '0218_routes_transfers_subsidy_chain_id',
1805
+ up: (db) => raw(db, sql `ALTER TABLE routes_transfers ADD COLUMN IF NOT EXISTS subsidy_chain_id text`), // prettier-ignore
1806
+ },
1807
+ {
1808
+ name: '0219_routes_transfers_subsidy_native_amount',
1809
+ up: (db) => raw(db, sql `ALTER TABLE routes_transfers ADD COLUMN IF NOT EXISTS subsidy_native_amount text`), // prettier-ignore
1810
+ },
1811
+ {
1812
+ name: '0220_routes_transfers_subsidy_token_address',
1813
+ up: (db) => raw(db, sql `ALTER TABLE routes_transfers ADD COLUMN IF NOT EXISTS subsidy_token_address text`), // prettier-ignore
1814
+ },
1815
+ {
1816
+ name: '0221_routes_transfers_subsidy_reservation_index',
1817
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS routes_transfers_subsidy_reservation_idx ON routes_transfers (subsidy_chain_id, subsidy_account, subsidy_token_address) WHERE status IN ('processing', 'action-required') AND subsidy_amount IS NOT NULL AND (subsidy_amount->>'baseUnits')::numeric > 0`),
1818
+ },
1819
+ {
1820
+ name: '0222_routes_transfers_subsidy_commitment_amount',
1821
+ up: (db) => raw(db, sql `ALTER TABLE routes_transfers ADD COLUMN IF NOT EXISTS subsidy_commitment_amount jsonb`), // prettier-ignore
1822
+ },
1823
+ {
1824
+ name: '0223_routes_transfers_provider_delivered_at',
1825
+ up: (db) => raw(db, sql `ALTER TABLE routes_transfers ADD COLUMN IF NOT EXISTS provider_delivered_at text`), // prettier-ignore
1826
+ },
1827
+ {
1828
+ name: '0224_routes_transfer_subsidy_nonces_blocked_at',
1829
+ up: (db) => raw(db, sql `ALTER TABLE routes_transfer_subsidy_nonces ADD COLUMN IF NOT EXISTS blocked_at text`), // prettier-ignore
1830
+ },
1831
+ {
1832
+ name: '0225_routes_transfer_subsidy_nonces_blocked_transfer_id',
1833
+ up: (db) => raw(db, sql `ALTER TABLE routes_transfer_subsidy_nonces ADD COLUMN IF NOT EXISTS blocked_transfer_id text`), // prettier-ignore
1834
+ },
1835
+ {
1836
+ name: '0226_routes_transfer_subsidy_nonces_blocked_reason',
1837
+ up: (db) => raw(db, sql `ALTER TABLE routes_transfer_subsidy_nonces ADD COLUMN IF NOT EXISTS blocked_reason text`), // prettier-ignore
1838
+ },
1839
+ {
1840
+ name: '0227_routes_transfers_subsidy_commitment_index',
1841
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS routes_transfers_subsidy_commitment_idx ON routes_transfers (subsidy_chain_id, subsidy_account, subsidy_token_address) WHERE status IN ('awaiting-source', 'processing', 'action-required', 'refunding') AND subsidy_commitment_amount IS NOT NULL AND (subsidy_commitment_amount->>'baseUnits')::numeric > 0`),
1842
+ },
1843
+ {
1844
+ name: '0228_routes_transfer_subsidy_nonces_block_check',
1845
+ up: (db) => raw(db, sql `DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'routes_transfer_subsidy_nonces_block_check' AND conrelid = 'routes_transfer_subsidy_nonces'::regclass) THEN ALTER TABLE routes_transfer_subsidy_nonces ADD CONSTRAINT routes_transfer_subsidy_nonces_block_check CHECK ((blocked_at IS NULL AND blocked_transfer_id IS NULL AND blocked_reason IS NULL) OR (blocked_at IS NOT NULL AND blocked_transfer_id IS NOT NULL AND blocked_reason = 'broadcast_rejected')); END IF; END $$`),
1846
+ },
1847
+ {
1848
+ // The test harness replays idempotent DDL on new connections, so legacy
1849
+ // index migrations still need this unused physical column to exist.
1850
+ name: '0229_routes_subsidies_legacy_api_key_compatibility',
1851
+ up: (db) => raw(db, sql `ALTER TABLE routes_subsidies ADD COLUMN IF NOT EXISTS api_key_id text`), // prettier-ignore
1852
+ },
1853
+ {
1854
+ name: '0230_routes_transfers_admin_subsidy_index',
1855
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS routes_transfers_admin_subsidy_idx ON routes_transfers (updated_at DESC, id DESC) WHERE subsidy_amount IS NOT NULL AND (subsidy_amount->>'baseUnits')::numeric > 0`),
1856
+ },
1857
+ {
1858
+ name: '0231_routes_transfers_expired_subsidy_commitments_index',
1859
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS routes_transfers_expired_subsidy_commitments_idx ON routes_transfers (quote_expires_at, id) WHERE status = 'awaiting-source' AND subsidy_commitment_amount IS NOT NULL AND (subsidy_commitment_amount->>'baseUnits')::numeric > 0`),
1860
+ },
1861
+ {
1862
+ name: '0232_sponsorship_reconciliation_cursors',
1863
+ up: (db) => db.schema
1864
+ .createTable('sponsorshipReconciliationCursors')
1865
+ .ifNotExists()
1866
+ .addColumn('blockNumber', 'text', (c) => c.notNull())
1867
+ .addColumn('chainId', 'integer', (c) => c.notNull())
1868
+ .addColumn('feePayer', 'text', (c) => c.notNull())
1869
+ .addColumn('transactionIndex', 'integer', (c) => c.notNull())
1870
+ .addColumn('updatedAt', 'text', (c) => c.notNull())
1871
+ .addPrimaryKeyConstraint('sponsorship_reconciliation_cursors_pkey', [
1872
+ 'chainId',
1873
+ 'feePayer',
1874
+ ]),
1875
+ },
1876
+ {
1877
+ name: '0233_sponsored_transactions_recovery_index',
1878
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS sponsored_transactions_recovery_idx ON sponsored_transactions (finalized_at, chain_id, created_at) WHERE status = 'failed' AND transaction_hash IS NULL`),
1879
+ },
1880
+ {
1881
+ name: '0234_sponsorship_reconciliation_progress',
1882
+ up: (db) => raw(db, sql `ALTER TABLE sponsorship_reconciliation_cursors ADD COLUMN IF NOT EXISTS complete boolean NOT NULL DEFAULT false, ADD COLUMN IF NOT EXISTS retry_count integer NOT NULL DEFAULT 0, ADD COLUMN IF NOT EXISTS retry_key text, ADD COLUMN IF NOT EXISTS revision text NOT NULL DEFAULT ''`),
1883
+ },
1884
+ {
1885
+ name: '0235_routes_deposits_unattributed_index',
1886
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS routes_deposits_unattributed_idx ON routes_deposits (deposit_address_id, created_at, id) WHERE provider_request_id IS NULL`),
1887
+ },
1888
+ {
1889
+ name: '0236_routes_transfer_subsidies',
1890
+ up: (db) => db.schema
1891
+ .createTable('routesTransferSubsidies')
1892
+ .ifNotExists()
1893
+ .addColumn('sourceChainId', 'text', (c) => c.notNull())
1894
+ .addColumn('transactionRef', 'text', (c) => c.notNull())
1895
+ .addColumn('destinationChainId', 'text', (c) => c.notNull())
1896
+ .addColumn('recipient', 'text', (c) => c.notNull())
1897
+ .addColumn('tokenAddress', 'text', (c) => c.notNull())
1898
+ .addColumn('transaction', 'jsonb', (c) => c.notNull())
1899
+ .addColumn('transferId', 'text', (c) => c.notNull())
1900
+ .addColumn('createdAt', 'text', (c) => c.notNull())
1901
+ .addPrimaryKeyConstraint('routes_transfer_subsidies_pkey', [
1902
+ 'sourceChainId',
1903
+ 'transactionRef',
1904
+ ]),
1905
+ },
1906
+ {
1907
+ name: '0237_routes_transfer_subsidies_capture',
1908
+ // Capture legacy Worker writes during rollout and retain settlement evidence after transfer deletion.
1909
+ up: (db) => raw(db, sql `DO $$
1910
+ BEGIN
1911
+ LOCK TABLE routes_transfers IN SHARE ROW EXCLUSIVE MODE;
1912
+ INSERT INTO routes_transfer_subsidies (
1913
+ source_chain_id, transaction_ref, destination_chain_id, recipient,
1914
+ token_address, transaction, transfer_id, created_at
1915
+ )
1916
+ SELECT snapshot->'sourceChain'->>'id', snapshot->'sourceTransactionHashes'->>0,
1917
+ subsidy_chain_id, lower(snapshot->>'recipient'), subsidy_token_address,
1918
+ provider_state->'transferSubsidy', id, updated_at
1919
+ FROM routes_transfers
1920
+ WHERE subsidy_transaction_hash IS NOT NULL
1921
+ AND provider_state->'transferSubsidy' IS NOT NULL
1922
+ AND snapshot->'sourceTransactionHashes'->>0 IS NOT NULL
1923
+ ON CONFLICT DO NOTHING;
1924
+
1925
+ CREATE OR REPLACE FUNCTION capture_routes_transfer_subsidy() RETURNS trigger
1926
+ LANGUAGE plpgsql SET search_path FROM CURRENT AS $capture$
1927
+ DECLARE
1928
+ settlement routes_transfer_subsidies%ROWTYPE;
1929
+ source_chain text;
1930
+ source_ref text;
1931
+ BEGIN
1932
+ IF NEW.subsidy_transaction_hash IS NULL OR NEW.provider_state->'transferSubsidy' IS NULL THEN
1933
+ RETURN NEW;
1934
+ END IF;
1935
+ source_chain := NEW.snapshot->'sourceChain'->>'id';
1936
+ source_ref := NEW.snapshot->'sourceTransactionHashes'->>0;
1937
+ IF source_ref IS NULL THEN
1938
+ RAISE EXCEPTION 'Subsidy source evidence is missing';
1939
+ END IF;
1940
+ INSERT INTO routes_transfer_subsidies (
1941
+ source_chain_id, transaction_ref, destination_chain_id, recipient,
1942
+ token_address, transaction, transfer_id, created_at
1943
+ ) VALUES (
1944
+ source_chain, source_ref, NEW.subsidy_chain_id, lower(NEW.snapshot->>'recipient'),
1945
+ NEW.subsidy_token_address, NEW.provider_state->'transferSubsidy', NEW.id, NEW.updated_at
1946
+ ) ON CONFLICT DO NOTHING;
1947
+ SELECT * INTO STRICT settlement FROM routes_transfer_subsidies
1948
+ WHERE source_chain_id = source_chain AND transaction_ref = source_ref;
1949
+ IF settlement.transaction IS DISTINCT FROM NEW.provider_state->'transferSubsidy'
1950
+ OR settlement.destination_chain_id IS DISTINCT FROM NEW.subsidy_chain_id
1951
+ OR settlement.recipient IS DISTINCT FROM lower(NEW.snapshot->>'recipient')
1952
+ OR settlement.token_address IS DISTINCT FROM NEW.subsidy_token_address THEN
1953
+ RAISE EXCEPTION 'Source payment already has a different subsidy settlement';
1954
+ END IF;
1955
+ IF settlement.transfer_id <> NEW.id THEN
1956
+ NEW.subsidy_amount := NULL;
1957
+ NEW.subsidy_commitment_amount := NULL;
1958
+ NEW.subsidy_native_amount := NULL;
1959
+ END IF;
1960
+ RETURN NEW;
1961
+ END $capture$;
1962
+ DROP TRIGGER IF EXISTS routes_transfer_subsidy_capture ON routes_transfers;
1963
+ CREATE TRIGGER routes_transfer_subsidy_capture
1964
+ BEFORE INSERT OR UPDATE OF provider_state, subsidy_transaction_hash, subsidy_amount
1965
+ ON routes_transfers FOR EACH ROW EXECUTE FUNCTION capture_routes_transfer_subsidy();
1966
+ END $$`),
1967
+ },
1968
+ {
1969
+ name: '0238_routes_transfer_source_claim_scope',
1970
+ // Derive tenancy for old and new writers before replacing global source uniqueness.
1971
+ up: (db) => raw(db, sql `DO $$
1972
+ BEGIN
1973
+ ALTER TABLE routes_transfer_transactions
1974
+ ADD COLUMN IF NOT EXISTS org_id text,
1975
+ ADD COLUMN IF NOT EXISTS environment text,
1976
+ ADD COLUMN IF NOT EXISTS project_id text;
1977
+ UPDATE routes_transfer_transactions AS evidence
1978
+ SET org_id = owner.org_id, environment = owner.environment, project_id = owner.project_id
1979
+ FROM routes_transfers AS owner WHERE owner.id = evidence.transfer_id;
1980
+ ALTER TABLE routes_transfer_transactions
1981
+ ALTER COLUMN org_id SET NOT NULL, ALTER COLUMN environment SET NOT NULL;
1982
+ CREATE OR REPLACE FUNCTION scope_routes_transfer_transaction() RETURNS trigger
1983
+ LANGUAGE plpgsql SET search_path FROM CURRENT AS $scope$
1984
+ BEGIN
1985
+ SELECT org_id, environment, project_id INTO STRICT NEW.org_id, NEW.environment, NEW.project_id
1986
+ FROM routes_transfers WHERE id = NEW.transfer_id;
1987
+ RETURN NEW;
1988
+ END $scope$;
1989
+ DROP TRIGGER IF EXISTS routes_transfer_transaction_scope ON routes_transfer_transactions;
1990
+ CREATE TRIGGER routes_transfer_transaction_scope
1991
+ BEFORE INSERT OR UPDATE ON routes_transfer_transactions
1992
+ FOR EACH ROW EXECUTE FUNCTION scope_routes_transfer_transaction();
1993
+ CREATE UNIQUE INDEX IF NOT EXISTS routes_transfer_transactions_source_owner_unique
1994
+ ON routes_transfer_transactions (org_id, environment, project_id, chain_id, transaction_ref)
1995
+ NULLS NOT DISTINCT WHERE role = 'source';
1996
+ DROP INDEX IF EXISTS routes_transfer_transactions_source_unique;
1997
+ END $$`),
1998
+ },
1999
+ {
2000
+ name: '0239_routes_transfer_source_lookup_index',
2001
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS routes_transfer_transactions_source_lookup_idx ON routes_transfer_transactions (chain_id, transaction_ref) WHERE role = 'source'`),
2002
+ },
2003
+ {
2004
+ name: '0240_sponsored_transactions_finalization_attempted_at',
2005
+ up: (db) => raw(db, sql `ALTER TABLE sponsored_transactions ADD COLUMN IF NOT EXISTS finalization_attempted_at text`),
2006
+ },
2007
+ {
2008
+ name: '0241_sponsored_transactions_finalization_queue_index',
2009
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS sponsored_transactions_finalization_queue_idx ON sponsored_transactions (finalization_attempted_at NULLS FIRST, created_at, id) WHERE status = 'pending'`),
2010
+ },
2011
+ {
2012
+ name: '0242_api_key_owner_tombstones',
2013
+ up: (db) => db.schema
2014
+ .createTable('api_key_owner_tombstones')
2015
+ .ifNotExists()
2016
+ .addColumn('id', 'text', (column) => column.primaryKey())
2017
+ .addColumn('createdAt', 'text', (column) => column.notNull()),
2018
+ },
2019
+ {
2020
+ name: '0243_api_key_owner_admissions',
2021
+ up: (db) => db.schema
2022
+ .createTable('api_key_owner_admissions')
2023
+ .ifNotExists()
2024
+ .addColumn('orgId', 'text', (column) => column.primaryKey())
2025
+ .addColumn('liveKeys', 'integer', (column) => column.notNull())
2026
+ .addColumn('updatedAt', 'text', (column) => column.notNull()),
2027
+ },
2028
+ {
2029
+ name: '0244_api_key_admissions',
2030
+ up: (db) => db.schema
2031
+ .createTable('api_key_admissions')
2032
+ .ifNotExists()
2033
+ .addColumn('expiresAt', 'text')
2034
+ .addColumn('id', 'text', (column) => column.notNull().unique())
2035
+ .addColumn('orgId', 'text', (column) => column.notNull())
2036
+ .addColumn('projectId', 'text')
2037
+ .addPrimaryKeyConstraint('api_key_admissions_pkey', ['orgId', 'id']),
2038
+ },
2039
+ {
2040
+ name: '0245_api_key_admission_bootstraps',
2041
+ up: (db) => db.schema
2042
+ .createTable('api_key_admission_bootstraps')
2043
+ .ifNotExists()
2044
+ .addColumn('orgId', 'text', (column) => column.primaryKey())
2045
+ .addColumn('bootstrappedAt', 'text', (column) => column.notNull()),
2046
+ },
2047
+ {
2048
+ name: '0246_api_key_revocations',
2049
+ up: (db) => db.schema
2050
+ .createTable('api_key_revocations')
2051
+ .ifNotExists()
2052
+ .addColumn('id', 'text', (column) => column.primaryKey())
2053
+ .addColumn('revokedAt', 'text', (column) => column.notNull()),
2054
+ },
2055
+ {
2056
+ name: '0247_api_key_revocation_lifecycle',
2057
+ up: (db) => raw(db, sql `ALTER TABLE api_key_revocations ADD COLUMN IF NOT EXISTS org_id text REFERENCES organizations(id) ON DELETE CASCADE, ADD COLUMN IF NOT EXISTS expires_at text`),
2058
+ },
2059
+ {
2060
+ name: '0248_api_key_revocation_expiry_backfill',
2061
+ up: (db) => raw(db, sql `UPDATE api_key_revocations SET expires_at = to_char(revoked_at::timestamptz + interval '7 days', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') WHERE expires_at IS NULL`),
2062
+ },
2063
+ {
2064
+ name: '0249_api_key_revocation_expiry_required',
2065
+ up: (db) => raw(db, sql `ALTER TABLE api_key_revocations ALTER COLUMN expires_at SET NOT NULL`),
2066
+ },
2067
+ {
2068
+ name: '0250_api_key_revocation_expiry_index',
2069
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS api_key_revocations_expiry_idx ON api_key_revocations (expires_at, id)`),
2070
+ },
2071
+ {
2072
+ name: '0251_api_key_revocation_org_index',
2073
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS api_key_revocations_org_idx ON api_key_revocations (org_id) WHERE org_id IS NOT NULL`),
2074
+ },
2075
+ {
2076
+ // Triggers make migrate-before-deploy safe: older Workers still fence raw owner deletes and acquire the same locks as new key writes.
2077
+ name: '0252_api_key_owner_delete_trigger_function',
2078
+ up: (db) => raw(db, sql `CREATE OR REPLACE FUNCTION api_key_fence_deleted_owner() RETURNS trigger LANGUAGE plpgsql AS $api_key_fence$
2079
+ DECLARE owner_key text;
2080
+ BEGIN
2081
+ IF TG_TABLE_NAME = 'organizations' THEN
2082
+ owner_key := 'organization:' || OLD.id;
2083
+ ELSE
2084
+ PERFORM pg_advisory_xact_lock(hashtextextended('organization:' || OLD.org_id, 0));
2085
+ owner_key := 'project:' || OLD.org_id || ':' || OLD.id;
2086
+ END IF;
2087
+ PERFORM pg_advisory_xact_lock(hashtextextended(owner_key, 0));
2088
+ EXECUTE format('INSERT INTO %I.api_key_owner_tombstones (id, created_at) VALUES ($1, $2) ON CONFLICT (id) DO NOTHING', TG_TABLE_SCHEMA)
2089
+ USING owner_key, to_char(clock_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"');
2090
+ RETURN OLD;
2091
+ END
2092
+ $api_key_fence$`),
2093
+ },
2094
+ {
2095
+ name: '0253_api_key_organization_delete_trigger',
2096
+ up: (db) => raw(db, sql `DO $api_key_trigger$
2097
+ BEGIN
2098
+ IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'api_key_fence_deleted_organization' AND tgrelid = 'organizations'::regclass) THEN
2099
+ CREATE TRIGGER api_key_fence_deleted_organization BEFORE DELETE ON organizations FOR EACH ROW EXECUTE FUNCTION api_key_fence_deleted_owner();
2100
+ END IF;
2101
+ END
2102
+ $api_key_trigger$`),
2103
+ },
2104
+ {
2105
+ name: '0254_api_key_project_delete_trigger',
2106
+ up: (db) => raw(db, sql `DO $api_key_trigger$
2107
+ BEGIN
2108
+ IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'api_key_fence_deleted_project' AND tgrelid = 'projects'::regclass) THEN
2109
+ CREATE TRIGGER api_key_fence_deleted_project BEFORE DELETE ON projects FOR EACH ROW EXECUTE FUNCTION api_key_fence_deleted_owner();
2110
+ END IF;
2111
+ END
2112
+ $api_key_trigger$`),
2113
+ },
2114
+ {
2115
+ // The table lock partitions legacy writers; a 24-hour organization-deletion embargo lets pre-fence Worker requests finish before owners can disappear.
2116
+ name: '0255_routes_organization_delete_fence',
2117
+ up: (db) => raw(db, sql `DO $migration$ BEGIN LOCK TABLE routes_idempotency_requests IN SHARE ROW EXCLUSIVE MODE; EXECUTE $definition$ CREATE OR REPLACE FUNCTION api_key_fence_deleted_owner() RETURNS trigger LANGUAGE plpgsql AS $body$ DECLARE owner_key text; BEGIN IF TG_TABLE_NAME = 'organizations' THEN PERFORM pg_advisory_xact_lock(hashtextextended('routes-subsidy:' || OLD.id, 0)); PERFORM pg_advisory_xact_lock(hashtextextended('routes-ownerless-legacy', 0)); owner_key := 'organization:' || OLD.id; ELSE PERFORM pg_advisory_xact_lock(hashtextextended('organization:' || OLD.org_id, 0)); owner_key := 'project:' || OLD.org_id || ':' || OLD.id; END IF; PERFORM pg_advisory_xact_lock(hashtextextended(owner_key, 0)); EXECUTE format('INSERT INTO %I.api_key_owner_tombstones (id, created_at) VALUES ($1, $2) ON CONFLICT (id) DO NOTHING', TG_TABLE_SCHEMA) USING owner_key, to_char(clock_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"'); IF TG_TABLE_NAME = 'organizations' THEN EXECUTE format('INSERT INTO %I.api_key_owner_tombstones (id, created_at) VALUES ($1, $2) ON CONFLICT (id) DO NOTHING', TG_TABLE_SCHEMA) USING 'routes-ownerless-legacy-cutoff', to_char(clock_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"'); END IF; RETURN OLD; END $body$ $definition$; EXECUTE $definition$ CREATE OR REPLACE FUNCTION fence_routes_organization_delete() RETURNS trigger LANGUAGE plpgsql SET search_path FROM CURRENT AS $body$ BEGIN PERFORM pg_advisory_xact_lock(hashtextextended('routes-ownerless-legacy', 0)); IF EXISTS (SELECT 1 FROM api_key_owner_tombstones WHERE id = 'routes-legacy-attempt-drain' AND created_at::timestamptz + interval '24 hours' > CURRENT_TIMESTAMP) THEN RAISE EXCEPTION 'route lifecycle rollout drain is active' USING ERRCODE = '23503'; END IF; IF EXISTS (SELECT 1 FROM routes_deposit_addresses WHERE org_id = OLD.id AND (status != 'deactivated' OR (provider_id = 'relay' AND subsidize))) OR EXISTS (SELECT 1 FROM routes_idempotency_requests AS request WHERE request.status IN ('pending', 'provisioned') AND (request.expires_at::timestamptz > CURRENT_TIMESTAMP OR COALESCE((to_jsonb(request)->>'irrevocable')::boolean, false)) AND (((to_jsonb(request)->>'org_id') = OLD.id AND (to_jsonb(request)->>'operation') = 'deposit_address') OR to_jsonb(request)->>'org_id' IS NULL OR to_jsonb(request)->>'operation' IS NULL)) THEN RAISE EXCEPTION 'organization has active route deposit address work' USING ERRCODE = '23503'; END IF; RETURN OLD; END $body$ $definition$; EXECUTE $definition$ CREATE OR REPLACE FUNCTION fence_routes_deposit_address_owner() RETURNS trigger LANGUAGE plpgsql SET search_path FROM CURRENT AS $body$ BEGIN PERFORM pg_advisory_xact_lock(hashtextextended('routes-subsidy:' || NEW.org_id, 0)); IF EXISTS (SELECT 1 FROM api_key_owner_tombstones WHERE id = 'organization:' || NEW.org_id) THEN RAISE EXCEPTION 'route deposit address owner was deleted' USING ERRCODE = '23503'; END IF; RETURN NEW; END $body$ $definition$; EXECUTE $definition$ CREATE OR REPLACE FUNCTION fence_routes_idempotency_owner() RETURNS trigger LANGUAGE plpgsql SET search_path FROM CURRENT AS $body$ DECLARE owner_id text; BEGIN owner_id := to_jsonb(NEW)->>'org_id'; IF owner_id IS NULL THEN SELECT org_id INTO owner_id FROM api_key_admissions WHERE id = NEW.api_key_id; END IF; IF owner_id IS NULL THEN PERFORM pg_advisory_xact_lock(hashtextextended('routes-ownerless-legacy', 0)); IF EXISTS (SELECT 1 FROM api_key_owner_tombstones WHERE id = 'routes-ownerless-legacy-cutoff') THEN RAISE EXCEPTION 'ownerless route idempotency creation is disabled' USING ERRCODE = '23503'; END IF; RETURN NEW; END IF; PERFORM pg_advisory_xact_lock(hashtextextended('routes-subsidy:' || owner_id, 0)); IF EXISTS (SELECT 1 FROM api_key_owner_tombstones WHERE id = 'organization:' || owner_id) THEN RAISE EXCEPTION 'route idempotency owner was deleted' USING ERRCODE = '23503'; END IF; RETURN NEW; END $body$ $definition$; EXECUTE 'CREATE OR REPLACE TRIGGER routes_deposit_address_owner_fence BEFORE INSERT OR UPDATE OF org_id ON routes_deposit_addresses FOR EACH ROW EXECUTE FUNCTION fence_routes_deposit_address_owner()'; EXECUTE 'CREATE OR REPLACE TRIGGER routes_idempotency_owner_fence BEFORE INSERT OR UPDATE ON routes_idempotency_requests FOR EACH ROW EXECUTE FUNCTION fence_routes_idempotency_owner()'; EXECUTE 'CREATE OR REPLACE TRIGGER routes_organization_delete_fence BEFORE DELETE ON organizations FOR EACH ROW EXECUTE FUNCTION fence_routes_organization_delete()'; INSERT INTO api_key_owner_tombstones (id, created_at) VALUES ('routes-legacy-attempt-drain', to_char(clock_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"')) ON CONFLICT (id) DO NOTHING; END $migration$`),
2118
+ },
2119
+ {
2120
+ name: '0256_routes_idempotency_organization',
2121
+ up: (db) => raw(db, sql `ALTER TABLE routes_idempotency_requests ADD COLUMN IF NOT EXISTS org_id text`),
2122
+ },
2123
+ {
2124
+ name: '0257_routes_idempotency_operation',
2125
+ up: (db) => raw(db, sql `ALTER TABLE routes_idempotency_requests ADD COLUMN IF NOT EXISTS operation text`),
2126
+ },
2127
+ {
2128
+ name: '0258_routes_idempotency_irrevocable',
2129
+ up: (db) => raw(db, sql `ALTER TABLE routes_idempotency_requests ADD COLUMN IF NOT EXISTS irrevocable boolean NOT NULL DEFAULT false`),
2130
+ },
2131
+ {
2132
+ name: '0259_routes_idempotency_organization_inflight_index',
2133
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS routes_idempotency_requests_organization_inflight_idx ON routes_idempotency_requests (org_id) WHERE org_id IS NOT NULL AND operation = 'deposit_address' AND status IN ('pending', 'provisioned')`),
2134
+ },
2135
+ {
2136
+ name: '0260_routes_idempotency_match_hash',
2137
+ up: (db) => raw(db, sql `ALTER TABLE routes_idempotency_requests ADD COLUMN IF NOT EXISTS match_hash text`),
2138
+ },
2139
+ {
2140
+ name: '0261_routes_idempotency_match_inflight_index',
2141
+ up: (db) => raw(db, sql `CREATE INDEX IF NOT EXISTS routes_idempotency_requests_match_inflight_idx ON routes_idempotency_requests (org_id, match_hash) WHERE match_hash IS NOT NULL AND operation = 'deposit_address' AND status IN ('pending', 'provisioned')`),
2142
+ },
2143
+ {
2144
+ name: '0262_routes_organization_delete_fence_unattributed_checkpoint',
2145
+ up: (db) => raw(db, sql `CREATE OR REPLACE FUNCTION fence_routes_organization_delete() RETURNS trigger LANGUAGE plpgsql SET search_path FROM CURRENT AS $body$ BEGIN PERFORM pg_advisory_xact_lock(hashtextextended('routes-ownerless-legacy', 0)); IF EXISTS (SELECT 1 FROM api_key_owner_tombstones WHERE id = 'routes-legacy-attempt-drain' AND created_at::timestamptz + interval '24 hours' > CURRENT_TIMESTAMP) THEN RAISE EXCEPTION 'route lifecycle rollout drain is active' USING ERRCODE = '23503'; END IF; IF EXISTS (SELECT 1 FROM routes_deposit_addresses WHERE org_id = OLD.id AND (status != 'deactivated' OR (provider_id = 'relay' AND subsidize))) OR EXISTS (SELECT 1 FROM routes_idempotency_requests AS request WHERE request.status IN ('pending', 'provisioned') AND (request.expires_at::timestamptz > CURRENT_TIMESTAMP OR COALESCE((to_jsonb(request)->>'irrevocable')::boolean, false)) AND (((to_jsonb(request)->>'org_id') = OLD.id AND (to_jsonb(request)->>'operation') = 'deposit_address') OR to_jsonb(request)->>'org_id' IS NULL OR to_jsonb(request)->>'operation' IS NULL)) THEN RAISE EXCEPTION 'organization has active route deposit address work' USING ERRCODE = '23503'; END IF; RETURN OLD; END $body$`),
2146
+ },
2147
+ {
2148
+ // Rolling workers may insert after preflight; these triggers share the deletion lock and reject owners deleted while provisioning.
2149
+ name: '0263_routes_creation_owner_fences',
2150
+ up: (db) => raw(db, sql `DO $migration$ BEGIN EXECUTE $definition$ CREATE OR REPLACE FUNCTION fence_routes_idempotency_owner() RETURNS trigger LANGUAGE plpgsql SET search_path FROM CURRENT AS $body$ DECLARE owner_id text; BEGIN owner_id := NEW.org_id; IF owner_id IS NULL THEN SELECT org_id INTO owner_id FROM api_key_admissions WHERE id = NEW.api_key_id; END IF; IF owner_id IS NULL THEN PERFORM pg_advisory_xact_lock(hashtextextended('routes-ownerless-legacy', 0)); IF EXISTS (SELECT 1 FROM api_key_owner_tombstones WHERE id = 'routes-ownerless-legacy-cutoff') THEN RAISE EXCEPTION 'ownerless route idempotency creation is disabled' USING ERRCODE = '23503'; END IF; RETURN NEW; END IF; PERFORM pg_advisory_xact_lock(hashtextextended('routes-subsidy:' || owner_id, 0)); IF EXISTS (SELECT 1 FROM api_key_owner_tombstones WHERE id = 'organization:' || owner_id) THEN RAISE EXCEPTION 'route idempotency owner was deleted' USING ERRCODE = '23503'; END IF; RETURN NEW; END $body$ $definition$; EXECUTE 'CREATE OR REPLACE TRIGGER routes_idempotency_owner_fence BEFORE INSERT OR UPDATE OF org_id, status ON routes_idempotency_requests FOR EACH ROW EXECUTE FUNCTION fence_routes_idempotency_owner()'; END $migration$`),
2151
+ },
2152
+ {
2153
+ // Existing unattributed checkpoints get one bounded drain window because their subsidy intent cannot be reconstructed.
2154
+ name: '0264_routes_legacy_checkpoint_drain',
2155
+ up: (db) => raw(db, sql `WITH marker AS (INSERT INTO api_key_owner_tombstones (id, created_at) VALUES ('routes-legacy-checkpoint-drain', to_char(clock_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"')) ON CONFLICT (id) DO UPDATE SET created_at = api_key_owner_tombstones.created_at RETURNING created_at) UPDATE routes_idempotency_requests AS request SET expires_at = to_char(marker.created_at::timestamptz + interval '24 hours', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') FROM marker WHERE request.status = 'provisioned' AND (request.org_id IS NULL OR request.operation IS NULL) AND request.expires_at::timestamptz < marker.created_at::timestamptz + interval '24 hours'`),
2156
+ },
2157
+ {
2158
+ name: '0265_routes_deposit_address_creator',
2159
+ up: (db) => raw(db, sql `DO $migration$ BEGIN ALTER TABLE routes_deposit_addresses ADD COLUMN IF NOT EXISTS creator_user_id text; UPDATE routes_deposit_addresses AS address SET creator_user_id = organization.user_id FROM organizations AS organization WHERE address.org_id = organization.id AND address.creator_user_id IS NULL; CREATE INDEX IF NOT EXISTS routes_deposit_addresses_creator_user_idx ON routes_deposit_addresses (creator_user_id) WHERE creator_user_id IS NOT NULL; EXECUTE $definition$ CREATE OR REPLACE FUNCTION set_routes_deposit_address_creator() RETURNS trigger LANGUAGE plpgsql SET search_path FROM CURRENT AS $body$ BEGIN NEW.creator_user_id := (SELECT user_id FROM organizations WHERE id = NEW.org_id); RETURN NEW; END $body$ $definition$; EXECUTE 'CREATE OR REPLACE TRIGGER routes_deposit_address_creator BEFORE INSERT OR UPDATE OF org_id ON routes_deposit_addresses FOR EACH ROW EXECUTE FUNCTION set_routes_deposit_address_creator()'; END $migration$`),
2160
+ },
2161
+ {
2162
+ name: '0266_reward_credits',
2163
+ up: (db) => db.schema
2164
+ .createTable('rewardCredits')
2165
+ .ifNotExists()
2166
+ .addColumn('chainId', 'bigint', (c) => c.notNull())
2167
+ .addColumn('vaultAddress', 'text', (c) => c.notNull())
2168
+ .addColumn('recipient', 'text', (c) => c.notNull())
2169
+ .addColumn('reference', 'text', (c) => c.notNull())
2170
+ .addColumn('assets', 'numeric', (c) => c.notNull())
2171
+ .addColumn('createdAt', 'text', (c) => c.notNull())
2172
+ .addPrimaryKeyConstraint('reward_credits_pkey', [
2173
+ 'chainId',
2174
+ 'vaultAddress',
2175
+ 'recipient',
2176
+ 'reference',
2177
+ ])
2178
+ // Runs rewrite reward_accounts wholesale, so the ledger must not cascade from it.
2179
+ .addForeignKeyConstraint('reward_credits_campaign_fkey', ['chainId', 'vaultAddress'], 'rewardCampaigns', ['chainId', 'vaultAddress'], (c) => c.onDelete('cascade')),
2180
+ },
2181
+ {
2182
+ name: '0267_reward_campaign_distributors',
2183
+ up: (db) => db.schema
2184
+ .createTable('rewardCampaignDistributors')
2185
+ .ifNotExists()
2186
+ .addColumn('chainId', 'bigint', (c) => c.notNull())
2187
+ .addColumn('vaultAddress', 'text', (c) => c.notNull())
2188
+ .addColumn('distributorAddress', 'text', (c) => c.notNull())
2189
+ .addColumn('createdAt', 'text', (c) => c.notNull())
2190
+ .addPrimaryKeyConstraint('reward_campaign_distributors_pkey', [
2191
+ 'chainId',
2192
+ 'vaultAddress',
2193
+ 'distributorAddress',
2194
+ ])
2195
+ .addForeignKeyConstraint('reward_campaign_distributors_campaign_fkey', ['chainId', 'vaultAddress'], 'rewardCampaigns', ['chainId', 'vaultAddress'], (c) => c.onDelete('cascade')),
2196
+ },
2197
+ {
2198
+ name: '0268_reward_campaign_distributors_backfill',
2199
+ up: (db) => raw(db, sql `INSERT INTO reward_campaign_distributors (chain_id, vault_address, distributor_address, created_at) SELECT chain_id, vault_address, distributor_address, updated_at FROM reward_campaigns WHERE distributor_address IS NOT NULL ON CONFLICT DO NOTHING`),
2200
+ },
2201
+ {
2202
+ // This verified distributor paid rewards before distributor history was retained.
2203
+ name: '0269_reward_campaign_previous_distributor',
2204
+ up: (db) => raw(db, sql `INSERT INTO reward_campaign_distributors (chain_id, vault_address, distributor_address, created_at) SELECT chain_id, vault_address, '0x6c857bf1fe7de1bc1d5c639c721b2633f8fe34f3', created_at FROM reward_campaigns WHERE chain_id = 4217 AND vault_address = '0xd730394f3bb85a4828e35fc5e361dcc9f894fa4f' ON CONFLICT DO NOTHING`),
2205
+ },
1160
2206
  ];
1161
2207
  /**
1162
2208
  * Adapts a raw statement to the migration contract (argument-less
@@ -1185,10 +2231,7 @@ function fromDialect(dialect, options = {}) {
1185
2231
  // transaction poolers reset session state between statements.
1186
2232
  const kysely = options.schema ? root.withPlugin(new WithSchemaPlugin(options.schema)) : root;
1187
2233
  // Builds Db over a top-level Kysely handle or transaction-scoped Kysely handle.
1188
- function build(kysely) {
1189
- // Prevents same-handle nested transactions from deadlocking capped pools.
1190
- // Nested work must use the callback's scoped `tx`.
1191
- let active = false;
2234
+ function build(kysely, transactional = false) {
1192
2235
  return {
1193
2236
  async close() {
1194
2237
  await kysely.destroy();
@@ -1248,15 +2291,9 @@ function fromDialect(dialect, options = {}) {
1248
2291
  });
1249
2292
  },
1250
2293
  async transaction(fn) {
1251
- if (active)
2294
+ if (transactional)
1252
2295
  throw new Error('Db.transaction does not support nesting.');
1253
- active = true;
1254
- try {
1255
- return await kysely.transaction().execute((trx) => fn(build(trx)));
1256
- }
1257
- finally {
1258
- active = false;
1259
- }
2296
+ return kysely.transaction().execute((trx) => fn(build(trx, true)));
1260
2297
  },
1261
2298
  };
1262
2299
  }
@@ -1264,20 +2301,20 @@ function fromDialect(dialect, options = {}) {
1264
2301
  }
1265
2302
  /**
1266
2303
  * Creates a Postgres-backed {@link Db} via Kysely's `PostgresDialect`. Optional
1267
- * `schema` qualifies repository queries, scopes migrations, and caps the pool.
2304
+ * `schema` qualifies repository queries and scopes migrations.
1268
2305
  *
1269
2306
  * @param options - Postgres options.
1270
2307
  * @returns The database.
1271
2308
  */
1272
2309
  export function postgres(options) {
1273
- const { connectionString, schema } = options;
2310
+ const { connectionString, maxConnections, schema } = options;
1274
2311
  // Bounded connect and pool-checkout wait: the pg default (0) waits forever,
1275
2312
  // so an unresponsive origin parks callers and their invocation memory
1276
2313
  // invisibly instead of failing into the retry paths.
1277
2314
  const pool = new pg.Pool({
1278
2315
  connectionString,
1279
2316
  connectionTimeoutMillis: 30_000,
1280
- ...(schema ? { max: 1 } : {}),
2317
+ ...(maxConnections === undefined && !schema ? {} : { max: maxConnections ?? 1 }),
1281
2318
  });
1282
2319
  return fromDialect(new PostgresDialect({ pool }), { schema });
1283
2320
  }