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
@@ -0,0 +1,1388 @@
1
+ import * as TestApp from '../../../test/App.js'
2
+ import * as Campaigns from '../../internal/rewards/Campaigns.js'
3
+ import * as Signer from '../../internal/rewards/Signer.js'
4
+ import * as Runner from '../../internal/rewards/Runner.js'
5
+ import * as EarnVaults from './earnVaults.js'
6
+ import * as RewardCampaignDistributors from './rewardCampaignDistributors.js'
7
+ import * as RewardCampaigns from './rewardCampaigns.js'
8
+ import * as RewardRuns from './rewardRuns.js'
9
+ import * as RewardTransactionAttempts from './rewardTransactionAttempts.js'
10
+
11
+ const vaultAddress = '0x1000000000000000000000000000000000000001'
12
+ const shareAddress = '0x2000000000000000000000000000000000000002'
13
+ const assetAddress = '0x3000000000000000000000000000000000000003'
14
+ const funder = '0x4000000000000000000000000000000000000004'
15
+ const treasury = '0x5000000000000000000000000000000000000005'
16
+ const signer = '0x6000000000000000000000000000000000000006'
17
+
18
+ const config = {
19
+ boostRewards: {
20
+ endTimestamp: 2_000_000_600,
21
+ excludedAddresses: [],
22
+ funding: { wallet: funder },
23
+ intervalSeconds: 300,
24
+ perUserPrincipalCapAssets: '25000000000',
25
+ startTimestamp: 2_000_000_000,
26
+ targetAnnualRateBps: 700,
27
+ totalPrincipalCapAssets: '10000000000000',
28
+ treasury,
29
+ },
30
+ } satisfies Campaigns.Config
31
+
32
+ const targetYieldConfig = {
33
+ annualRate: { bps: 500 },
34
+ endTimestamp: 2_000_000_600,
35
+ funding: [{ remainder: true, wallet: funder }],
36
+ intervalSeconds: 300,
37
+ startTimestamp: 2_000_000_000,
38
+ } satisfies NonNullable<Campaigns.Config['targetYield']>
39
+
40
+ describe('reward campaign persistence', () => {
41
+ test('schedules deterministic periphery provisioning before campaign start', async () => {
42
+ const db = TestApp.database()
43
+ await seedCampaign(db)
44
+ await expect(Runner.due(db, 1_999_999_000_000)).resolves.toStrictEqual([
45
+ { chainId: 4217, type: 'earn:reward:run', vaultAddress },
46
+ ])
47
+ })
48
+
49
+ test('schedules periphery required only by a pending configuration', async () => {
50
+ const db = TestApp.database()
51
+ await seedVault(db)
52
+ const targetOnly = { targetYield: targetYieldConfig }
53
+ await RewardCampaigns.upsert(db, {
54
+ assetAddress,
55
+ assetDecimals: 6,
56
+ chainId: 4217,
57
+ config: targetOnly,
58
+ earnShareAddress: shareAddress,
59
+ earnShareDecimals: 18,
60
+ now: 1_999_999_000,
61
+ vaultAddress,
62
+ })
63
+ await RewardCampaigns.setBindings(db, {
64
+ chainId: 4217,
65
+ config: targetOnly,
66
+ controllerAddress: '0x7000000000000000000000000000000000000007',
67
+ vaultAddress,
68
+ })
69
+ await RewardCampaigns.upsert(db, {
70
+ assetAddress,
71
+ assetDecimals: 6,
72
+ chainId: 4217,
73
+ config: {
74
+ boostRewards: {
75
+ ...config.boostRewards,
76
+ endTimestamp: 2_000_000_900,
77
+ startTimestamp: 2_000_000_300,
78
+ },
79
+ },
80
+ earnShareAddress: shareAddress,
81
+ earnShareDecimals: 18,
82
+ now: 2_000_000_010,
83
+ vaultAddress,
84
+ })
85
+
86
+ await expect(RewardCampaigns.listUnprovisioned(db, { limit: 100 })).resolves.toMatchObject([
87
+ { controllerAddress: '0x7000000000000000000000000000000000000007', vaultAddress },
88
+ ])
89
+ })
90
+
91
+ test('does not reschedule a fully delivered provisioned campaign', async () => {
92
+ const db = TestApp.database()
93
+ await seedCampaign(db)
94
+ await RewardCampaigns.setBindings(db, {
95
+ chainId: 4217,
96
+ distributorAddress: '0x7000000000000000000000000000000000000007',
97
+ vaultAddress,
98
+ })
99
+ await RewardCampaigns.advance(db, {
100
+ chainId: 4217,
101
+ deliveredThrough: config.boostRewards.endTimestamp,
102
+ expectedDeliveredThrough: config.boostRewards.startTimestamp,
103
+ vaultAddress,
104
+ })
105
+ await expect(Runner.due(db, 2_000_001_000_000)).resolves.toStrictEqual([])
106
+ })
107
+
108
+ test('does not list a campaign delivered through its final complete boundary', async () => {
109
+ const db = TestApp.database()
110
+ await seedVault(db)
111
+ const partial = {
112
+ boostRewards: { ...config.boostRewards, endTimestamp: 2_000_000_650 },
113
+ }
114
+ await RewardCampaigns.upsert(db, {
115
+ assetAddress,
116
+ assetDecimals: 6,
117
+ chainId: 4217,
118
+ config: partial,
119
+ earnShareAddress: shareAddress,
120
+ earnShareDecimals: 18,
121
+ now: 1_999_999_000,
122
+ vaultAddress,
123
+ })
124
+ await RewardCampaigns.advance(db, {
125
+ chainId: 4217,
126
+ deliveredThrough: 2_000_000_600,
127
+ expectedDeliveredThrough: 2_000_000_000,
128
+ vaultAddress,
129
+ })
130
+
131
+ await expect(
132
+ RewardCampaigns.listDue(db, { limit: 100, through: 2_000_001_000 }),
133
+ ).resolves.toStrictEqual([])
134
+ })
135
+
136
+ test('keeps a campaign due through the later independent schedule', async () => {
137
+ const db = TestApp.database()
138
+ await seedVault(db)
139
+ const independent = {
140
+ boostRewards: { ...config.boostRewards, endTimestamp: 2_000_001_200 },
141
+ targetYield: { ...targetYieldConfig, endTimestamp: 2_000_000_600 },
142
+ }
143
+ await RewardCampaigns.upsert(db, {
144
+ assetAddress,
145
+ assetDecimals: 6,
146
+ chainId: 4217,
147
+ config: independent,
148
+ earnShareAddress: shareAddress,
149
+ earnShareDecimals: 18,
150
+ now: 1_999_999_000,
151
+ vaultAddress,
152
+ })
153
+ await RewardCampaigns.advance(db, {
154
+ chainId: 4217,
155
+ deliveredThrough: 2_000_000_600,
156
+ expectedDeliveredThrough: 2_000_000_000,
157
+ vaultAddress,
158
+ })
159
+
160
+ await expect(
161
+ RewardCampaigns.listDue(db, { limit: 100, through: 2_000_001_200 }),
162
+ ).resolves.toMatchObject([{ vaultAddress }])
163
+ })
164
+
165
+ test('preserves the original accounting grid after an earlier schedule is removed', async () => {
166
+ const db = TestApp.database()
167
+ await seedVault(db)
168
+ const independent = {
169
+ boostRewards: {
170
+ ...config.boostRewards,
171
+ endTimestamp: 2_000_001_800,
172
+ startTimestamp: 2_000_001_200,
173
+ },
174
+ targetYield: targetYieldConfig,
175
+ }
176
+ const campaign = await RewardCampaigns.upsert(db, {
177
+ assetAddress,
178
+ assetDecimals: 6,
179
+ chainId: 4217,
180
+ config: independent,
181
+ earnShareAddress: shareAddress,
182
+ earnShareDecimals: 18,
183
+ now: 1_999_999_000,
184
+ vaultAddress,
185
+ })
186
+ const run = await RewardRuns.ensure(db, {
187
+ chainId: 4217,
188
+ config: campaign.config,
189
+ endsAt: 2_000_000_300,
190
+ startsAfter: 2_000_000_000,
191
+ vaultAddress,
192
+ })
193
+ await RewardRuns.transition(db, { fence: '0', id: run.id, patch: {}, phase: 'delivered' })
194
+ await RewardCampaigns.advance(db, {
195
+ chainId: 4217,
196
+ deliveredThrough: 2_000_000_300,
197
+ expectedDeliveredThrough: 2_000_000_000,
198
+ vaultAddress,
199
+ })
200
+ await RewardCampaigns.upsert(db, {
201
+ assetAddress,
202
+ assetDecimals: 6,
203
+ chainId: 4217,
204
+ config: { boostRewards: independent.boostRewards },
205
+ earnShareAddress: shareAddress,
206
+ earnShareDecimals: 18,
207
+ now: 2_000_000_310,
208
+ vaultAddress,
209
+ })
210
+ await RewardCampaigns.advance(db, {
211
+ chainId: 4217,
212
+ deliveredThrough: 2_000_000_600,
213
+ expectedDeliveredThrough: 2_000_000_300,
214
+ vaultAddress,
215
+ })
216
+
217
+ await expect(
218
+ RewardCampaigns.upsert(db, {
219
+ assetAddress,
220
+ assetDecimals: 6,
221
+ chainId: 4217,
222
+ config: {
223
+ boostRewards: {
224
+ ...independent.boostRewards,
225
+ intervalSeconds: 60,
226
+ },
227
+ },
228
+ earnShareAddress: shareAddress,
229
+ earnShareDecimals: 18,
230
+ now: 2_000_000_700,
231
+ vaultAddress,
232
+ }),
233
+ ).rejects.toThrow('intervalSeconds cannot change after campaign start')
234
+ })
235
+
236
+ test('replaces pre-start configuration and schedules live updates prospectively', async () => {
237
+ const db = TestApp.database()
238
+ await seedVault(db)
239
+ const created = await RewardCampaigns.upsert(db, {
240
+ assetAddress,
241
+ assetDecimals: 6,
242
+ chainId: 4217,
243
+ config,
244
+ earnShareAddress: shareAddress,
245
+ earnShareDecimals: 18,
246
+ now: 1_999_999_000,
247
+ vaultAddress,
248
+ })
249
+ const replay = await RewardCampaigns.upsert(db, {
250
+ assetAddress,
251
+ assetDecimals: 6,
252
+ chainId: 4217,
253
+ config,
254
+ earnShareAddress: shareAddress,
255
+ earnShareDecimals: 18,
256
+ now: 1_999_999_100,
257
+ vaultAddress,
258
+ })
259
+ const preStart = await RewardCampaigns.upsert(db, {
260
+ assetAddress,
261
+ assetDecimals: 6,
262
+ chainId: 4217,
263
+ config: {
264
+ ...config,
265
+ boostRewards: {
266
+ ...config.boostRewards,
267
+ endTimestamp: 2_000_000_900,
268
+ startTimestamp: 2_000_000_300,
269
+ targetAnnualRateBps: 725,
270
+ },
271
+ },
272
+ earnShareAddress: shareAddress,
273
+ earnShareDecimals: 18,
274
+ now: 1_999_999_100,
275
+ vaultAddress,
276
+ })
277
+ const updated = await RewardCampaigns.upsert(db, {
278
+ assetAddress,
279
+ assetDecimals: 6,
280
+ chainId: 4217,
281
+ config: {
282
+ ...preStart.config,
283
+ boostRewards: { ...preStart.config.boostRewards!, targetAnnualRateBps: 750 },
284
+ },
285
+ earnShareAddress: shareAddress,
286
+ earnShareDecimals: 18,
287
+ now: 2_000_000_310,
288
+ vaultAddress,
289
+ })
290
+
291
+ expect({
292
+ deliveredThrough: created.deliveredThrough,
293
+ preStartDeliveredThrough: preStart.deliveredThrough,
294
+ preStartPending: preStart.pendingConfig,
295
+ replayPending: replay.pendingConfig,
296
+ pendingEffectiveAt: updated.pendingEffectiveAt,
297
+ pendingRate: updated.pendingConfig?.boostRewards?.targetAnnualRateBps,
298
+ }).toStrictEqual({
299
+ deliveredThrough: '2000000000',
300
+ pendingEffectiveAt: '2000000600',
301
+ pendingRate: 750,
302
+ preStartDeliveredThrough: '2000000300',
303
+ preStartPending: null,
304
+ replayPending: null,
305
+ })
306
+ })
307
+
308
+ test('keeps provisioned boost bindings immutable before campaign start', async () => {
309
+ const db = TestApp.database()
310
+ await seedCampaign(db)
311
+ await RewardCampaigns.setBindings(db, {
312
+ chainId: 4217,
313
+ distributorAddress: '0x7000000000000000000000000000000000000007',
314
+ vaultAddress,
315
+ })
316
+ const replace = (config_next: Campaigns.Config) =>
317
+ RewardCampaigns.upsert(db, {
318
+ assetAddress,
319
+ assetDecimals: 6,
320
+ chainId: 4217,
321
+ config: config_next,
322
+ earnShareAddress: shareAddress,
323
+ earnShareDecimals: 18,
324
+ now: 1_999_999_100,
325
+ vaultAddress,
326
+ })
327
+
328
+ await expect(
329
+ replace({
330
+ boostRewards: {
331
+ ...config.boostRewards,
332
+ treasury: '0x8000000000000000000000000000000000000008',
333
+ },
334
+ }),
335
+ ).rejects.toThrow('boostRewards treasury is immutable after distributor provisioning')
336
+ await expect(replace({ targetYield: targetYieldConfig })).rejects.toThrow(
337
+ 'boostRewards cannot be removed after distributor provisioning',
338
+ )
339
+ })
340
+
341
+ test('rejects stale provisioning bindings after configuration changes', async () => {
342
+ const db = TestApp.database()
343
+ await seedCampaign(db)
344
+ await RewardCampaigns.setBindings(db, {
345
+ chainId: 4217,
346
+ config,
347
+ distributorAddress: '0x6000000000000000000000000000000000000006',
348
+ vaultAddress,
349
+ })
350
+ const updated = await RewardCampaigns.upsert(db, {
351
+ assetAddress,
352
+ assetDecimals: 6,
353
+ chainId: 4217,
354
+ config: {
355
+ boostRewards: { ...config.boostRewards, targetAnnualRateBps: 750 },
356
+ },
357
+ earnShareAddress: shareAddress,
358
+ earnShareDecimals: 18,
359
+ now: 1_999_999_100,
360
+ vaultAddress,
361
+ })
362
+ const stale = await RewardCampaigns.setBindings(db, {
363
+ chainId: 4217,
364
+ config,
365
+ distributorAddress: '0x7000000000000000000000000000000000000007',
366
+ vaultAddress,
367
+ })
368
+ const current = await RewardCampaigns.setBindings(db, {
369
+ chainId: 4217,
370
+ config: updated.config,
371
+ distributorAddress: '0x8000000000000000000000000000000000000008',
372
+ vaultAddress,
373
+ })
374
+
375
+ expect([stale, current?.distributorAddress]).toStrictEqual([
376
+ undefined,
377
+ '0x8000000000000000000000000000000000000008',
378
+ ])
379
+ await expect(
380
+ RewardCampaignDistributors.list(db, { chainId: 4217, vaultAddress }),
381
+ ).resolves.toMatchObject([
382
+ { distributorAddress: '0x6000000000000000000000000000000000000006' },
383
+ { distributorAddress: '0x8000000000000000000000000000000000000008' },
384
+ ])
385
+ })
386
+
387
+ test('exposes provisioning failures until verified bindings replace them', async () => {
388
+ const db = TestApp.database()
389
+ await seedCampaign(db)
390
+ const failed = await RewardCampaigns.setProvisioningError(db, {
391
+ chainId: 4217,
392
+ config,
393
+ error: 'reviewed factory is unavailable',
394
+ vaultAddress,
395
+ })
396
+ const ready = await RewardCampaigns.setBindings(db, {
397
+ chainId: 4217,
398
+ config,
399
+ distributorAddress: '0x7000000000000000000000000000000000000007',
400
+ error: null,
401
+ vaultAddress,
402
+ })
403
+
404
+ expect([failed?.provisioningError, ready?.provisioningError]).toStrictEqual([
405
+ 'reviewed factory is unavailable',
406
+ null,
407
+ ])
408
+ await expect(
409
+ RewardCampaigns.setProvisioningError(db, {
410
+ chainId: 4217,
411
+ config,
412
+ error: 'late duplicate failure',
413
+ vaultAddress,
414
+ }),
415
+ ).resolves.toBeUndefined()
416
+ await expect(RewardCampaigns.get(db, { chainId: 4217, vaultAddress })).resolves.toMatchObject({
417
+ provisioningError: null,
418
+ })
419
+ })
420
+
421
+ test('clears a provisioning failure when its missing capability is removed', async () => {
422
+ const db = TestApp.database()
423
+ await seedCampaign(db)
424
+ await RewardCampaigns.setBindings(db, {
425
+ chainId: 4217,
426
+ config,
427
+ distributorAddress: '0x7000000000000000000000000000000000000007',
428
+ vaultAddress,
429
+ })
430
+ const combined = {
431
+ ...config,
432
+ targetYield: targetYieldConfig,
433
+ }
434
+ await RewardCampaigns.upsert(db, {
435
+ assetAddress,
436
+ assetDecimals: 6,
437
+ chainId: 4217,
438
+ config: combined,
439
+ earnShareAddress: shareAddress,
440
+ earnShareDecimals: 6,
441
+ now: 1_999_999_100,
442
+ vaultAddress,
443
+ })
444
+ await RewardCampaigns.setProvisioningError(db, {
445
+ chainId: 4217,
446
+ config: combined,
447
+ error: 'controller deployment failed',
448
+ vaultAddress,
449
+ })
450
+
451
+ await expect(
452
+ RewardCampaigns.upsert(db, {
453
+ assetAddress,
454
+ assetDecimals: 6,
455
+ chainId: 4217,
456
+ config,
457
+ earnShareAddress: shareAddress,
458
+ earnShareDecimals: 6,
459
+ now: 1_999_999_200,
460
+ vaultAddress,
461
+ }),
462
+ ).resolves.toMatchObject({ provisioningError: null })
463
+ })
464
+
465
+ test('rejects cap changes after boost accrual begins', async () => {
466
+ const db = TestApp.database()
467
+ await seedVault(db)
468
+ await RewardCampaigns.upsert(db, {
469
+ assetAddress,
470
+ assetDecimals: 6,
471
+ chainId: 4217,
472
+ config,
473
+ earnShareAddress: shareAddress,
474
+ earnShareDecimals: 18,
475
+ now: 1_999_999_000,
476
+ vaultAddress,
477
+ })
478
+ await expect(
479
+ RewardCampaigns.upsert(db, {
480
+ assetAddress,
481
+ assetDecimals: 6,
482
+ chainId: 4217,
483
+ config: {
484
+ ...config,
485
+ boostRewards: { ...config.boostRewards, totalPrincipalCapAssets: '10000000000001' },
486
+ },
487
+ earnShareAddress: shareAddress,
488
+ earnShareDecimals: 18,
489
+ now: 2_000_000_010,
490
+ vaultAddress,
491
+ }),
492
+ ).rejects.toThrow('boost principal caps are immutable')
493
+ })
494
+
495
+ test('rejects exclusion changes after boost accrual begins', async () => {
496
+ const db = TestApp.database()
497
+ await seedCampaign(db)
498
+ await expect(
499
+ RewardCampaigns.upsert(db, {
500
+ assetAddress,
501
+ assetDecimals: 6,
502
+ chainId: 4217,
503
+ config: {
504
+ boostRewards: {
505
+ ...config.boostRewards,
506
+ excludedAddresses: ['0x7000000000000000000000000000000000000007'],
507
+ },
508
+ },
509
+ earnShareAddress: shareAddress,
510
+ earnShareDecimals: 18,
511
+ now: 2_000_000_010,
512
+ vaultAddress,
513
+ }),
514
+ ).rejects.toThrow('boost excludedAddresses are immutable')
515
+ })
516
+
517
+ test('schedules updates after the active run snapshot', async () => {
518
+ const db = TestApp.database()
519
+ await seedCampaign(db)
520
+ await RewardRuns.ensure(db, {
521
+ chainId: 4217,
522
+ config,
523
+ endsAt: 2_000_000_600,
524
+ startsAfter: 2_000_000_000,
525
+ vaultAddress,
526
+ })
527
+ const updated = await RewardCampaigns.upsert(db, {
528
+ assetAddress,
529
+ assetDecimals: 6,
530
+ chainId: 4217,
531
+ config: {
532
+ boostRewards: {
533
+ ...config.boostRewards,
534
+ endTimestamp: 2_000_000_900,
535
+ targetAnnualRateBps: 750,
536
+ },
537
+ },
538
+ earnShareAddress: shareAddress,
539
+ earnShareDecimals: 18,
540
+ now: 2_000_000_010,
541
+ vaultAddress,
542
+ })
543
+ expect(updated.pendingEffectiveAt).toBe('2000000600')
544
+ })
545
+
546
+ test('rejects extending a campaign after its durable schedule ended', async () => {
547
+ const db = TestApp.database()
548
+ await seedCampaign(db)
549
+ await expect(
550
+ RewardCampaigns.upsert(db, {
551
+ assetAddress,
552
+ assetDecimals: 6,
553
+ chainId: 4217,
554
+ config: {
555
+ boostRewards: { ...config.boostRewards, endTimestamp: 2_000_000_900 },
556
+ },
557
+ earnShareAddress: shareAddress,
558
+ earnShareDecimals: 18,
559
+ now: config.boostRewards.endTimestamp,
560
+ vaultAddress,
561
+ }),
562
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
563
+ `[RewardCampaigns.ConfigurationError: an ended reward campaign cannot be extended]`,
564
+ )
565
+ })
566
+
567
+ test('rejects updates after the final complete boundary of a partial schedule', async () => {
568
+ const db = TestApp.database()
569
+ await seedVault(db)
570
+ const partial = {
571
+ boostRewards: { ...config.boostRewards, endTimestamp: 2_000_000_650 },
572
+ }
573
+ await RewardCampaigns.upsert(db, {
574
+ assetAddress,
575
+ assetDecimals: 6,
576
+ chainId: 4217,
577
+ config: partial,
578
+ earnShareAddress: shareAddress,
579
+ earnShareDecimals: 18,
580
+ now: 1_999_999_000,
581
+ vaultAddress,
582
+ })
583
+ await expect(
584
+ RewardCampaigns.upsert(db, {
585
+ assetAddress,
586
+ assetDecimals: 6,
587
+ chainId: 4217,
588
+ config: {
589
+ boostRewards: { ...partial.boostRewards, endTimestamp: 2_000_000_900 },
590
+ },
591
+ earnShareAddress: shareAddress,
592
+ earnShareDecimals: 18,
593
+ now: 2_000_000_610,
594
+ vaultAddress,
595
+ }),
596
+ ).rejects.toThrow('an ended reward campaign cannot be extended')
597
+ })
598
+
599
+ test('updates an active schedule after the other schedule has ended', async () => {
600
+ const db = TestApp.database()
601
+ await seedVault(db)
602
+ const independent = {
603
+ boostRewards: { ...config.boostRewards, endTimestamp: 2_000_001_200 },
604
+ targetYield: { ...targetYieldConfig, endTimestamp: 2_000_000_300 },
605
+ }
606
+ await RewardCampaigns.upsert(db, {
607
+ assetAddress,
608
+ assetDecimals: 6,
609
+ chainId: 4217,
610
+ config: independent,
611
+ earnShareAddress: shareAddress,
612
+ earnShareDecimals: 18,
613
+ now: 1_999_999_000,
614
+ vaultAddress,
615
+ })
616
+
617
+ await expect(
618
+ RewardCampaigns.upsert(db, {
619
+ assetAddress,
620
+ assetDecimals: 6,
621
+ chainId: 4217,
622
+ config: {
623
+ ...independent,
624
+ boostRewards: { ...independent.boostRewards, enabled: false },
625
+ },
626
+ earnShareAddress: shareAddress,
627
+ earnShareDecimals: 18,
628
+ now: 2_000_000_310,
629
+ vaultAddress,
630
+ }),
631
+ ).resolves.toMatchObject({
632
+ pendingConfig: { boostRewards: { enabled: false }, targetYield: independent.targetYield },
633
+ pendingEffectiveAt: '2000000600',
634
+ })
635
+ })
636
+
637
+ test('updates a future boost after target yield has started', async () => {
638
+ const db = TestApp.database()
639
+ await seedVault(db)
640
+ const independent = {
641
+ boostRewards: {
642
+ ...config.boostRewards,
643
+ endTimestamp: 2_000_001_800,
644
+ startTimestamp: 2_000_000_600,
645
+ },
646
+ targetYield: { ...targetYieldConfig, endTimestamp: 2_000_001_200 },
647
+ }
648
+ await RewardCampaigns.upsert(db, {
649
+ assetAddress,
650
+ assetDecimals: 6,
651
+ chainId: 4217,
652
+ config: independent,
653
+ earnShareAddress: shareAddress,
654
+ earnShareDecimals: 18,
655
+ now: 1_999_999_000,
656
+ vaultAddress,
657
+ })
658
+ const boostRewards = {
659
+ ...independent.boostRewards,
660
+ endTimestamp: 2_000_002_100,
661
+ perUserPrincipalCapAssets: '26000000000',
662
+ startTimestamp: 2_000_000_900,
663
+ totalPrincipalCapAssets: '11000000000000',
664
+ }
665
+
666
+ await expect(
667
+ RewardCampaigns.upsert(db, {
668
+ assetAddress,
669
+ assetDecimals: 6,
670
+ chainId: 4217,
671
+ config: { boostRewards, targetYield: independent.targetYield },
672
+ earnShareAddress: shareAddress,
673
+ earnShareDecimals: 18,
674
+ now: 2_000_000_010,
675
+ vaultAddress,
676
+ }),
677
+ ).resolves.toMatchObject({
678
+ pendingConfig: { boostRewards },
679
+ pendingEffectiveAt: '2000000300',
680
+ })
681
+ })
682
+
683
+ test('rejects a retroactive target replacement start', async () => {
684
+ const db = TestApp.database()
685
+ await seedVault(db)
686
+ const independent = {
687
+ boostRewards: { ...config.boostRewards, endTimestamp: 2_000_001_800 },
688
+ targetYield: {
689
+ ...targetYieldConfig,
690
+ endTimestamp: 2_000_001_800,
691
+ startTimestamp: 2_000_000_600,
692
+ },
693
+ }
694
+ await RewardCampaigns.upsert(db, {
695
+ assetAddress,
696
+ assetDecimals: 6,
697
+ chainId: 4217,
698
+ config: independent,
699
+ earnShareAddress: shareAddress,
700
+ earnShareDecimals: 18,
701
+ now: 1_999_999_000,
702
+ vaultAddress,
703
+ })
704
+
705
+ await expect(
706
+ RewardCampaigns.upsert(db, {
707
+ assetAddress,
708
+ assetDecimals: 6,
709
+ chainId: 4217,
710
+ config: {
711
+ ...independent,
712
+ targetYield: { ...independent.targetYield, startTimestamp: 2_000_000_000 },
713
+ },
714
+ earnShareAddress: shareAddress,
715
+ earnShareDecimals: 18,
716
+ now: 2_000_000_010,
717
+ vaultAddress,
718
+ }),
719
+ ).rejects.toThrow(
720
+ 'replacement targetYield schedules must start at or after the update boundary',
721
+ )
722
+ })
723
+
724
+ test('treats omitted and explicit enabled boost flags as equal', async () => {
725
+ const db = TestApp.database()
726
+ const campaign = await seedCampaign(db)
727
+
728
+ await expect(
729
+ RewardCampaigns.upsert(db, {
730
+ assetAddress,
731
+ assetDecimals: 6,
732
+ chainId: 4217,
733
+ config: { boostRewards: { ...config.boostRewards, enabled: true } },
734
+ earnShareAddress: shareAddress,
735
+ earnShareDecimals: 18,
736
+ now: 2_000_000_010,
737
+ vaultAddress,
738
+ }),
739
+ ).resolves.toStrictEqual(campaign)
740
+ })
741
+
742
+ test('keeps replacement schedules on the active boundary grid', async () => {
743
+ const db = TestApp.database()
744
+ await seedVault(db)
745
+ const targetOnly = { targetYield: targetYieldConfig }
746
+ await RewardCampaigns.upsert(db, {
747
+ assetAddress,
748
+ assetDecimals: 6,
749
+ chainId: 4217,
750
+ config: targetOnly,
751
+ earnShareAddress: shareAddress,
752
+ earnShareDecimals: 18,
753
+ now: 1_999_999_000,
754
+ vaultAddress,
755
+ })
756
+ await expect(
757
+ RewardCampaigns.upsert(db, {
758
+ assetAddress,
759
+ assetDecimals: 6,
760
+ chainId: 4217,
761
+ config: {
762
+ targetYield: {
763
+ ...targetYieldConfig,
764
+ endTimestamp: 2_000_000_901,
765
+ startTimestamp: 2_000_000_001,
766
+ },
767
+ },
768
+ earnShareAddress: shareAddress,
769
+ earnShareDecimals: 18,
770
+ now: 2_000_000_010,
771
+ vaultAddress,
772
+ }),
773
+ ).rejects.toThrow('replacement schedules must remain on the active boundary grid')
774
+ })
775
+
776
+ test('requires a complete interval after the replacement boundary', async () => {
777
+ const db = TestApp.database()
778
+ await seedVault(db)
779
+ const targetOnly = { targetYield: targetYieldConfig }
780
+ await RewardCampaigns.upsert(db, {
781
+ assetAddress,
782
+ assetDecimals: 6,
783
+ chainId: 4217,
784
+ config: targetOnly,
785
+ earnShareAddress: shareAddress,
786
+ earnShareDecimals: 18,
787
+ now: 1_999_999_000,
788
+ vaultAddress,
789
+ })
790
+ await expect(
791
+ RewardCampaigns.upsert(db, {
792
+ assetAddress,
793
+ assetDecimals: 6,
794
+ chainId: 4217,
795
+ config: {
796
+ targetYield: { ...targetYieldConfig, endTimestamp: 2_000_000_650 },
797
+ },
798
+ earnShareAddress: shareAddress,
799
+ earnShareDecimals: 18,
800
+ now: 2_000_000_310,
801
+ vaultAddress,
802
+ }),
803
+ ).rejects.toThrow('targetYield must have a complete interval after the update boundary')
804
+ })
805
+
806
+ test('reposting the active document cancels its pending replacement', async () => {
807
+ const db = TestApp.database()
808
+ await seedCampaign(db)
809
+ const pending = await RewardCampaigns.upsert(db, {
810
+ assetAddress,
811
+ assetDecimals: 6,
812
+ chainId: 4217,
813
+ config: {
814
+ boostRewards: { ...config.boostRewards, targetAnnualRateBps: 750 },
815
+ },
816
+ earnShareAddress: shareAddress,
817
+ earnShareDecimals: 18,
818
+ now: 2_000_000_010,
819
+ vaultAddress,
820
+ })
821
+ const cancelled = await RewardCampaigns.upsert(db, {
822
+ assetAddress,
823
+ assetDecimals: 6,
824
+ chainId: 4217,
825
+ config,
826
+ earnShareAddress: shareAddress,
827
+ earnShareDecimals: 18,
828
+ now: 2_000_000_020,
829
+ vaultAddress,
830
+ })
831
+ expect({ cancelled: cancelled.pendingConfig, pending: pending.pendingConfig }).toMatchObject({
832
+ cancelled: null,
833
+ pending: { boostRewards: { targetAnnualRateBps: 750 } },
834
+ })
835
+ })
836
+
837
+ test('does not discard boost bindings provisioned for a pending configuration', async () => {
838
+ const db = TestApp.database()
839
+ await seedVault(db)
840
+ const targetOnly = { targetYield: targetYieldConfig }
841
+ await RewardCampaigns.upsert(db, {
842
+ assetAddress,
843
+ assetDecimals: 6,
844
+ chainId: 4217,
845
+ config: targetOnly,
846
+ earnShareAddress: shareAddress,
847
+ earnShareDecimals: 18,
848
+ now: 1_999_999_000,
849
+ vaultAddress,
850
+ })
851
+ const pending = {
852
+ boostRewards: {
853
+ ...config.boostRewards,
854
+ endTimestamp: 2_000_000_900,
855
+ startTimestamp: 2_000_000_300,
856
+ },
857
+ }
858
+ await RewardCampaigns.upsert(db, {
859
+ assetAddress,
860
+ assetDecimals: 6,
861
+ chainId: 4217,
862
+ config: pending,
863
+ earnShareAddress: shareAddress,
864
+ earnShareDecimals: 18,
865
+ now: 2_000_000_010,
866
+ vaultAddress,
867
+ })
868
+ await RewardCampaigns.setBindings(db, {
869
+ chainId: 4217,
870
+ config: pending,
871
+ distributorAddress: '0x7000000000000000000000000000000000000007',
872
+ vaultAddress,
873
+ })
874
+
875
+ await expect(
876
+ RewardCampaigns.upsert(db, {
877
+ assetAddress,
878
+ assetDecimals: 6,
879
+ chainId: 4217,
880
+ config: targetOnly,
881
+ earnShareAddress: shareAddress,
882
+ earnShareDecimals: 18,
883
+ now: 2_000_000_020,
884
+ vaultAddress,
885
+ }),
886
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
887
+ `[RewardCampaigns.ConfigurationError: boostRewards cannot be removed after distributor provisioning]`,
888
+ )
889
+ })
890
+
891
+ test('permanently binds the first reward signer', async () => {
892
+ const db = TestApp.database()
893
+ await seedCampaign(db)
894
+ const bound = await RewardCampaigns.bindSigner(db, {
895
+ chainId: 4217,
896
+ signerAddress: signer,
897
+ vaultAddress,
898
+ })
899
+ const replay = await RewardCampaigns.bindSigner(db, {
900
+ chainId: 4217,
901
+ signerAddress: signer,
902
+ vaultAddress,
903
+ })
904
+ const rejected = await RewardCampaigns.bindSigner(db, {
905
+ chainId: 4217,
906
+ signerAddress: '0x7000000000000000000000000000000000000007',
907
+ vaultAddress,
908
+ })
909
+ expect([bound?.signerAddress, replay?.signerAddress, rejected]).toStrictEqual([
910
+ signer.toLowerCase(),
911
+ signer.toLowerCase(),
912
+ undefined,
913
+ ])
914
+ })
915
+
916
+ test('preserves the TIDX cursor when an interval contains no new events', async () => {
917
+ const db = TestApp.database()
918
+ const campaign = await seedCampaign(db)
919
+ const cursor = { blockNumber: 12, logIndex: 4, transactionIndex: 3 }
920
+ const first = await RewardCampaigns.advance(db, {
921
+ chainId: 4217,
922
+ deliveredThrough: Number(campaign.deliveredThrough) + 300,
923
+ eventCursor: cursor,
924
+ expectedDeliveredThrough: Number(campaign.deliveredThrough),
925
+ vaultAddress,
926
+ })
927
+ const second = await RewardCampaigns.advance(db, {
928
+ chainId: 4217,
929
+ deliveredThrough: Number(campaign.deliveredThrough) + 600,
930
+ expectedDeliveredThrough: Number(campaign.deliveredThrough) + 300,
931
+ vaultAddress,
932
+ })
933
+ expect([first?.eventCursor, second?.eventCursor]).toStrictEqual([cursor, cursor])
934
+ })
935
+ })
936
+
937
+ describe('reward execution fencing and transaction journal', () => {
938
+ test('exposes a root-confirmed statement before the phase transition completes', async () => {
939
+ const db = TestApp.database()
940
+ await seedCampaign(db)
941
+ const run = await RewardRuns.ensure(db, {
942
+ chainId: 4217,
943
+ config,
944
+ endsAt: 2_000_000_300,
945
+ startsAfter: 2_000_000_000,
946
+ vaultAddress,
947
+ })
948
+ const statement = Campaigns.buildStatement({
949
+ campaignId: `0x${'00'.repeat(12)}${vaultAddress.slice(2)}`,
950
+ chainId: 4217,
951
+ distributor: '0x7000000000000000000000000000000000000007',
952
+ entitlements: [{ cumulativeAmount: '1', recipient: vaultAddress }],
953
+ })
954
+ await RewardRuns.transition(db, {
955
+ fence: run.fence,
956
+ id: run.id,
957
+ patch: {
958
+ root: statement.root,
959
+ rootVersion: '0',
960
+ statement,
961
+ statementHash: statement.statementHash,
962
+ },
963
+ phase: 'statement',
964
+ })
965
+ const attempt = await RewardTransactionAttempts.create(db, {
966
+ chainId: 4217,
967
+ intent: {
968
+ id: `0x${'11'.repeat(32)}`,
969
+ operation: 'publish',
970
+ payload: {},
971
+ },
972
+ runId: run.id,
973
+ signer,
974
+ vaultAddress,
975
+ })
976
+ await RewardTransactionAttempts.confirm(db, {
977
+ id: attempt.id,
978
+ receipt: {
979
+ blockHash: `0x${'22'.repeat(32)}`,
980
+ blockNumber: '1',
981
+ gasUsed: '1',
982
+ status: 'success',
983
+ transactionHash: `0x${'33'.repeat(32)}`,
984
+ },
985
+ })
986
+
987
+ await expect(
988
+ RewardRuns.latestStatement(db, { chainId: 4217, vaultAddress }),
989
+ ).resolves.toMatchObject({
990
+ id: run.id,
991
+ rootVersion: '1',
992
+ statementHash: statement.statementHash,
993
+ })
994
+ })
995
+
996
+ test('leases one run at a time and fences a later owner', async () => {
997
+ vi.useFakeTimers()
998
+ try {
999
+ vi.setSystemTime('2026-01-01T00:00:00.000Z')
1000
+ const db = TestApp.database()
1001
+ await seedCampaign(db)
1002
+ const run = await RewardRuns.ensure(db, {
1003
+ chainId: 4217,
1004
+ config,
1005
+ endsAt: 2_000_000_300,
1006
+ startsAfter: 2_000_000_000,
1007
+ vaultAddress,
1008
+ })
1009
+ const first = await RewardRuns.acquire(db, { id: run.id, leaseMilliseconds: 60_000 })
1010
+ expect(
1011
+ await RewardRuns.acquire(db, { id: run.id, leaseMilliseconds: 60_000 }),
1012
+ ).toBeUndefined()
1013
+ vi.advanceTimersByTime(60_001)
1014
+ const second = await RewardRuns.acquire(db, { id: run.id, leaseMilliseconds: 60_000 })
1015
+ expect([first?.fence, second?.fence]).toStrictEqual(['1', '2'])
1016
+ expect(
1017
+ await RewardRuns.transition(db, {
1018
+ fence: first!.fence,
1019
+ id: run.id,
1020
+ patch: {},
1021
+ phase: 'calculating',
1022
+ }),
1023
+ ).toBeUndefined()
1024
+ } finally {
1025
+ vi.useRealTimers()
1026
+ }
1027
+ })
1028
+
1029
+ test('renews only the current fenced run lease', async () => {
1030
+ vi.useFakeTimers()
1031
+ try {
1032
+ vi.setSystemTime('2026-01-01T00:00:00.000Z')
1033
+ const db = TestApp.database()
1034
+ await seedCampaign(db)
1035
+ const run = await RewardRuns.ensure(db, {
1036
+ chainId: 4217,
1037
+ config,
1038
+ endsAt: 2_000_000_300,
1039
+ startsAfter: 2_000_000_000,
1040
+ vaultAddress,
1041
+ })
1042
+ const leased = await RewardRuns.acquire(db, { id: run.id, leaseMilliseconds: 60_000 })
1043
+ const renewed = await RewardRuns.renew(db, {
1044
+ fence: leased!.fence,
1045
+ id: run.id,
1046
+ leaseExpiresAt: '2026-01-01T00:02:00.000Z',
1047
+ })
1048
+ const stale = await RewardRuns.renew(db, {
1049
+ fence: '0',
1050
+ id: run.id,
1051
+ leaseExpiresAt: '2026-01-01T00:03:00.000Z',
1052
+ })
1053
+ vi.advanceTimersByTime(120_001)
1054
+ const expired = await RewardRuns.renew(db, {
1055
+ fence: leased!.fence,
1056
+ id: run.id,
1057
+ leaseExpiresAt: '2026-01-01T00:04:00.000Z',
1058
+ })
1059
+ expect({ expired, renewed, stale }).toStrictEqual({
1060
+ expired: false,
1061
+ renewed: true,
1062
+ stale: false,
1063
+ })
1064
+ } finally {
1065
+ vi.useRealTimers()
1066
+ }
1067
+ })
1068
+
1069
+ test('resumes an existing interval snapshot after later boundaries become available', async () => {
1070
+ const db = TestApp.database()
1071
+ await seedCampaign(db)
1072
+ const first = await RewardRuns.ensure(db, {
1073
+ chainId: 4217,
1074
+ config,
1075
+ endsAt: 2_000_000_300,
1076
+ startsAfter: 2_000_000_000,
1077
+ vaultAddress,
1078
+ })
1079
+ const resumed = await RewardRuns.ensure(db, {
1080
+ chainId: 4217,
1081
+ config,
1082
+ endsAt: 2_000_000_600,
1083
+ startsAfter: 2_000_000_000,
1084
+ vaultAddress,
1085
+ })
1086
+ expect({ endsAt: resumed.endsAt, sameRun: resumed.id === first.id }).toStrictEqual({
1087
+ endsAt: '2000000300',
1088
+ sameRun: true,
1089
+ })
1090
+ })
1091
+
1092
+ test('persists bytes before broadcast and prevents nonce reuse', async () => {
1093
+ const db = TestApp.database()
1094
+ await seedCampaign(db)
1095
+ const signerIntent = {
1096
+ boostRewards: true,
1097
+ domain: {
1098
+ chainId: 4217,
1099
+ earnShare: shareAddress,
1100
+ earnVault: vaultAddress,
1101
+ factory: '0x7000000000000000000000000000000000000007',
1102
+ treasury,
1103
+ },
1104
+ operation: 'deploy' as const,
1105
+ targetYield: false,
1106
+ treasury,
1107
+ } satisfies Signer.Request['intent']
1108
+ const intentId = Signer.id(signerIntent)
1109
+ const first = await RewardTransactionAttempts.create(db, {
1110
+ chainId: 4217,
1111
+ intent: { id: intentId, operation: 'deploy', payload: signerIntent },
1112
+ signer,
1113
+ vaultAddress,
1114
+ })
1115
+ const signed = await RewardTransactionAttempts.recordSignature(db, {
1116
+ expiresAt: null,
1117
+ id: first.id,
1118
+ nonce: '9',
1119
+ signedBytes: '0x01',
1120
+ transactionHash: `0x${'11'.repeat(32)}`,
1121
+ })
1122
+ expect(signed?.state).toBe('signed')
1123
+ const second = await RewardTransactionAttempts.create(db, {
1124
+ chainId: 4217,
1125
+ intent: { id: `0x${'22'.repeat(32)}`, operation: 'deploy', payload: signerIntent },
1126
+ signer,
1127
+ vaultAddress,
1128
+ })
1129
+ await expect(
1130
+ RewardTransactionAttempts.recordSignature(db, {
1131
+ expiresAt: null,
1132
+ id: second.id,
1133
+ nonce: '9',
1134
+ signedBytes: '0x02',
1135
+ transactionHash: `0x${'33'.repeat(32)}`,
1136
+ }),
1137
+ ).rejects.toMatchObject({ code: '23505' })
1138
+ })
1139
+
1140
+ test('keeps confirmed target funding terminal for reconciliation', async () => {
1141
+ const db = TestApp.database()
1142
+ await seedCampaign(db)
1143
+ const run = await RewardRuns.ensure(db, {
1144
+ chainId: 4217,
1145
+ config,
1146
+ endsAt: 2_000_000_300,
1147
+ startsAfter: 2_000_000_000,
1148
+ vaultAddress,
1149
+ })
1150
+ const signerIntent = {
1151
+ controller: '0x7000000000000000000000000000000000000007',
1152
+ domain: {
1153
+ chainId: 4217,
1154
+ earnShare: shareAddress,
1155
+ earnVault: vaultAddress,
1156
+ factory: '0x8000000000000000000000000000000000000008',
1157
+ treasury: '0x0000000000000000000000000000000000000000',
1158
+ },
1159
+ funders: [funder],
1160
+ maxEarnShareSupply: '100',
1161
+ operation: 'targetYield' as const,
1162
+ requestedAssets: ['5'],
1163
+ } satisfies Signer.Request['intent']
1164
+ const intentId = Signer.id(signerIntent)
1165
+ const attempt = await RewardTransactionAttempts.create(db, {
1166
+ chainId: 4217,
1167
+ intent: { id: intentId, operation: 'targetYield', payload: signerIntent },
1168
+ runId: run.id,
1169
+ signer,
1170
+ vaultAddress,
1171
+ })
1172
+ await RewardTransactionAttempts.recordSignature(db, {
1173
+ expiresAt: null,
1174
+ id: attempt.id,
1175
+ nonce: '10',
1176
+ signedBytes: '0x01',
1177
+ transactionHash: `0x${'44'.repeat(32)}`,
1178
+ })
1179
+ await expect(
1180
+ RewardTransactionAttempts.latestRecoverable(db, {
1181
+ operation: 'targetYield',
1182
+ runId: run.id,
1183
+ }),
1184
+ ).resolves.toMatchObject({ id: attempt.id, state: 'signed' })
1185
+ await RewardTransactionAttempts.confirm(db, {
1186
+ id: attempt.id,
1187
+ receipt: {
1188
+ blockHash: `0x${'55'.repeat(32)}`,
1189
+ blockNumber: '12',
1190
+ gasUsed: '100',
1191
+ status: 'success',
1192
+ transactionHash: `0x${'44'.repeat(32)}`,
1193
+ },
1194
+ })
1195
+ await expect(
1196
+ RewardTransactionAttempts.latestRecoverable(db, {
1197
+ operation: 'targetYield',
1198
+ runId: run.id,
1199
+ }),
1200
+ ).resolves.toMatchObject({ id: attempt.id, state: 'confirmed' })
1201
+ await expect(
1202
+ RewardTransactionAttempts.latestRecoverable(db, {
1203
+ operation: 'targetYield',
1204
+ runId: run.id,
1205
+ }),
1206
+ ).resolves.toMatchObject({ id: attempt.id, state: 'confirmed' })
1207
+ })
1208
+
1209
+ test('retries confirmed target funding that made no contribution', async () => {
1210
+ const db = TestApp.database()
1211
+ await seedCampaign(db)
1212
+ const run = await RewardRuns.ensure(db, {
1213
+ chainId: 4217,
1214
+ config,
1215
+ endsAt: 2_000_000_300,
1216
+ startsAfter: 2_000_000_000,
1217
+ vaultAddress,
1218
+ })
1219
+ const signerIntent = {
1220
+ controller: '0x7000000000000000000000000000000000000007',
1221
+ domain: {
1222
+ chainId: 4217,
1223
+ earnShare: shareAddress,
1224
+ earnVault: vaultAddress,
1225
+ factory: '0x8000000000000000000000000000000000000008',
1226
+ treasury: '0x0000000000000000000000000000000000000000',
1227
+ },
1228
+ funders: [funder],
1229
+ maxEarnShareSupply: '100',
1230
+ operation: 'targetYield' as const,
1231
+ requestedAssets: ['5'],
1232
+ } satisfies Signer.Request['intent']
1233
+ const intentId = Signer.id(signerIntent)
1234
+ const attempt = await RewardTransactionAttempts.create(db, {
1235
+ chainId: 4217,
1236
+ intent: { id: intentId, operation: 'targetYield', payload: signerIntent },
1237
+ runId: run.id,
1238
+ signer,
1239
+ vaultAddress,
1240
+ })
1241
+ await RewardTransactionAttempts.recordSignature(db, {
1242
+ expiresAt: null,
1243
+ id: attempt.id,
1244
+ nonce: '10',
1245
+ signedBytes: '0x01',
1246
+ transactionHash: `0x${'44'.repeat(32)}`,
1247
+ })
1248
+ await RewardTransactionAttempts.confirm(db, {
1249
+ id: attempt.id,
1250
+ receipt: {
1251
+ blockHash: `0x${'55'.repeat(32)}`,
1252
+ blockNumber: '12',
1253
+ gasUsed: '100',
1254
+ status: 'success',
1255
+ transactionHash: `0x${'44'.repeat(32)}`,
1256
+ },
1257
+ })
1258
+ await expect(RewardTransactionAttempts.markIneffective(db, attempt.id)).resolves.toMatchObject({
1259
+ id: attempt.id,
1260
+ receipt: { status: 'success' },
1261
+ state: 'ineffective',
1262
+ })
1263
+ await expect(
1264
+ RewardTransactionAttempts.latestRecoverable(db, {
1265
+ operation: 'targetYield',
1266
+ runId: run.id,
1267
+ }),
1268
+ ).resolves.toBeUndefined()
1269
+ await expect(
1270
+ RewardTransactionAttempts.create(db, {
1271
+ chainId: 4217,
1272
+ intent: { id: intentId, operation: 'targetYield', payload: signerIntent },
1273
+ replacementOf: attempt.id,
1274
+ runId: run.id,
1275
+ signer,
1276
+ vaultAddress,
1277
+ }),
1278
+ ).resolves.toMatchObject({ replacementOf: attempt.id, state: 'created' })
1279
+ })
1280
+
1281
+ test('does not reuse a confirmed intent from another reward run', async () => {
1282
+ const db = TestApp.database()
1283
+ await seedCampaign(db)
1284
+ const firstRun = await RewardRuns.ensure(db, {
1285
+ chainId: 4217,
1286
+ config,
1287
+ endsAt: 2_000_000_300,
1288
+ startsAfter: 2_000_000_000,
1289
+ vaultAddress,
1290
+ })
1291
+ await RewardRuns.transition(db, {
1292
+ fence: '0',
1293
+ id: firstRun.id,
1294
+ patch: {},
1295
+ phase: 'delivered',
1296
+ })
1297
+ await RewardCampaigns.advance(db, {
1298
+ chainId: 4217,
1299
+ deliveredThrough: 2_000_000_300,
1300
+ expectedDeliveredThrough: 2_000_000_000,
1301
+ vaultAddress,
1302
+ })
1303
+ const secondRun = await RewardRuns.ensure(db, {
1304
+ chainId: 4217,
1305
+ config,
1306
+ endsAt: 2_000_000_600,
1307
+ startsAfter: 2_000_000_300,
1308
+ vaultAddress,
1309
+ })
1310
+ const signerIntent = {
1311
+ boostRewards: true,
1312
+ domain: {
1313
+ chainId: 4217,
1314
+ earnShare: shareAddress,
1315
+ earnVault: vaultAddress,
1316
+ factory: '0x7000000000000000000000000000000000000007',
1317
+ treasury,
1318
+ },
1319
+ operation: 'deploy' as const,
1320
+ targetYield: false,
1321
+ treasury,
1322
+ } satisfies Signer.Request['intent']
1323
+ const intentId = Signer.id(signerIntent)
1324
+ const first = await RewardTransactionAttempts.create(db, {
1325
+ chainId: 4217,
1326
+ intent: { id: intentId, operation: 'deploy', payload: signerIntent },
1327
+ runId: firstRun.id,
1328
+ signer,
1329
+ vaultAddress,
1330
+ })
1331
+ await RewardTransactionAttempts.confirm(db, {
1332
+ id: first.id,
1333
+ receipt: {
1334
+ blockHash: `0x${'11'.repeat(32)}`,
1335
+ blockNumber: '1',
1336
+ gasUsed: '1',
1337
+ status: 'success',
1338
+ transactionHash: `0x${'22'.repeat(32)}`,
1339
+ },
1340
+ })
1341
+ const second = await RewardTransactionAttempts.create(db, {
1342
+ chainId: 4217,
1343
+ intent: { id: intentId, operation: 'deploy', payload: signerIntent },
1344
+ runId: secondRun.id,
1345
+ signer,
1346
+ vaultAddress,
1347
+ })
1348
+ await expect(
1349
+ Promise.all([
1350
+ RewardTransactionAttempts.latestForIntent(db, {
1351
+ intentId,
1352
+ runId: firstRun.id,
1353
+ }),
1354
+ RewardTransactionAttempts.latestForIntent(db, {
1355
+ intentId,
1356
+ runId: secondRun.id,
1357
+ }),
1358
+ ]),
1359
+ ).resolves.toMatchObject([{ id: first.id }, { id: second.id }])
1360
+ })
1361
+ })
1362
+
1363
+ async function seedCampaign(db: ReturnType<typeof TestApp.database>) {
1364
+ await seedVault(db)
1365
+ return RewardCampaigns.upsert(db, {
1366
+ assetAddress,
1367
+ assetDecimals: 6,
1368
+ chainId: 4217,
1369
+ config,
1370
+ earnShareAddress: shareAddress,
1371
+ earnShareDecimals: 18,
1372
+ now: 1_999_999_000,
1373
+ vaultAddress,
1374
+ })
1375
+ }
1376
+
1377
+ async function seedVault(db: ReturnType<typeof TestApp.database>) {
1378
+ return EarnVaults.upsert(db, {
1379
+ chainId: 4217,
1380
+ description: null,
1381
+ label: 'Reward test vault',
1382
+ privateInputTokens: [],
1383
+ privateOutputTokens: [],
1384
+ slug: 'reward-test-vault',
1385
+ vaultAddress,
1386
+ zones: [],
1387
+ })
1388
+ }