tapimo 0.15.0 → 0.18.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 (734) hide show
  1. package/README.md +137 -0
  2. package/dist/ApiKey.d.ts +1 -0
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +4 -2
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +37 -11
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +163 -10
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +13085 -11974
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +46 -15
  13. package/dist/App.js.map +1 -1
  14. package/dist/Scope.d.ts +1 -1
  15. package/dist/Scope.d.ts.map +1 -1
  16. package/dist/Scope.js +1 -1
  17. package/dist/Scope.js.map +1 -1
  18. package/dist/admin/App.d.ts +896 -191
  19. package/dist/admin/App.d.ts.map +1 -1
  20. package/dist/admin/App.js +5 -1
  21. package/dist/admin/App.js.map +1 -1
  22. package/dist/admin/apps/api-keys.d.ts +33 -33
  23. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.js +8 -3
  25. package/dist/admin/apps/api-keys.js.map +1 -1
  26. package/dist/admin/apps/earn-vaults.d.ts +66 -27
  27. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  28. package/dist/admin/apps/earn-vaults.js +36 -7
  29. package/dist/admin/apps/earn-vaults.js.map +1 -1
  30. package/dist/admin/apps/organizations.d.ts +25 -25
  31. package/dist/admin/apps/organizations.d.ts.map +1 -1
  32. package/dist/admin/apps/organizations.js +5 -4
  33. package/dist/admin/apps/organizations.js.map +1 -1
  34. package/dist/admin/apps/route-policies.d.ts +632 -0
  35. package/dist/admin/apps/route-policies.d.ts.map +1 -0
  36. package/dist/admin/apps/route-policies.js +257 -0
  37. package/dist/admin/apps/route-policies.js.map +1 -0
  38. package/dist/admin/apps/routes-support.js +39 -3
  39. package/dist/admin/apps/routes-support.js.map +1 -1
  40. package/dist/admin/apps/routes.d.ts +454 -1
  41. package/dist/admin/apps/routes.d.ts.map +1 -1
  42. package/dist/admin/apps/routes.js +82 -1
  43. package/dist/admin/apps/routes.js.map +1 -1
  44. package/dist/admin/apps/verified-tokens.d.ts +10 -4
  45. package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
  46. package/dist/admin/apps/verified-tokens.js +24 -4
  47. package/dist/admin/apps/verified-tokens.js.map +1 -1
  48. package/dist/admin/index.d.ts +0 -1
  49. package/dist/admin/index.d.ts.map +1 -1
  50. package/dist/admin/index.js +0 -1
  51. package/dist/admin/index.js.map +1 -1
  52. package/dist/admin/ui.generated.d.ts +1 -1
  53. package/dist/admin/ui.generated.d.ts.map +1 -1
  54. package/dist/admin/ui.generated.js +99 -103
  55. package/dist/admin/ui.generated.js.map +1 -1
  56. package/dist/analytics/Analytics.d.ts.map +1 -1
  57. package/dist/analytics/Analytics.js +65 -1
  58. package/dist/analytics/Analytics.js.map +1 -1
  59. package/dist/analytics/tables/requestEvents.d.ts +1 -1
  60. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  61. package/dist/analytics/tables/requestEvents.js +58 -59
  62. package/dist/analytics/tables/requestEvents.js.map +1 -1
  63. package/dist/apps/data/App.d.ts +2709 -2670
  64. package/dist/apps/data/App.d.ts.map +1 -1
  65. package/dist/apps/data/routes/activities.d.ts +5 -5
  66. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  67. package/dist/apps/data/routes/activities.js +50 -0
  68. package/dist/apps/data/routes/activities.js.map +1 -1
  69. package/dist/apps/data/routes/addresses.d.ts +248 -248
  70. package/dist/apps/data/routes/balances.d.ts +22 -22
  71. package/dist/apps/data/routes/balances.d.ts.map +1 -1
  72. package/dist/apps/data/routes/balances.js +5 -7
  73. package/dist/apps/data/routes/balances.js.map +1 -1
  74. package/dist/apps/data/routes/coingecko.d.ts +54 -54
  75. package/dist/apps/data/routes/earn.d.ts +103 -12
  76. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  77. package/dist/apps/data/routes/earn.js +456 -220
  78. package/dist/apps/data/routes/earn.js.map +1 -1
  79. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  80. package/dist/apps/data/routes/exchanges.js +267 -97
  81. package/dist/apps/data/routes/exchanges.js.map +1 -1
  82. package/dist/apps/data/routes/fee-amm.d.ts +1 -19
  83. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  84. package/dist/apps/data/routes/fee-amm.js +93 -56
  85. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  86. package/dist/apps/data/routes/indexer.d.ts +10 -10
  87. package/dist/apps/data/routes/rpc.d.ts +30 -30
  88. package/dist/apps/data/routes/rpc.js +45 -11
  89. package/dist/apps/data/routes/rpc.js.map +1 -1
  90. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  91. package/dist/apps/data/routes/tokens.js +11 -6
  92. package/dist/apps/data/routes/tokens.js.map +1 -1
  93. package/dist/apps/data/routes/transactions.d.ts +2 -0
  94. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  95. package/dist/apps/data/routes/transactions.js +30 -22
  96. package/dist/apps/data/routes/transactions.js.map +1 -1
  97. package/dist/apps/data/routes/transfers.d.ts +12 -12
  98. package/dist/apps/data/routes/valuation.d.ts +30 -30
  99. package/dist/apps/data/routes/verified-tokens.d.ts +5 -5
  100. package/dist/apps/data/routes/webhooks.d.ts +1 -1
  101. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  102. package/dist/apps/data/routes/webhooks.js +18 -11
  103. package/dist/apps/data/routes/webhooks.js.map +1 -1
  104. package/dist/apps/data/routes/zones.d.ts +3 -3
  105. package/dist/apps/management/App.d.ts +3043 -2198
  106. package/dist/apps/management/App.d.ts.map +1 -1
  107. package/dist/apps/management/App.js +2 -0
  108. package/dist/apps/management/App.js.map +1 -1
  109. package/dist/apps/management/Billing.d.ts +2 -4
  110. package/dist/apps/management/Billing.d.ts.map +1 -1
  111. package/dist/apps/management/Billing.js +65 -26
  112. package/dist/apps/management/Billing.js.map +1 -1
  113. package/dist/apps/management/routes/api-keys.d.ts +16 -4
  114. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  115. package/dist/apps/management/routes/api-keys.js +70 -11
  116. package/dist/apps/management/routes/api-keys.js.map +1 -1
  117. package/dist/apps/management/routes/billing.d.ts +84 -84
  118. package/dist/apps/management/routes/cli.d.ts +912 -0
  119. package/dist/apps/management/routes/cli.d.ts.map +1 -0
  120. package/dist/apps/management/routes/cli.js +416 -0
  121. package/dist/apps/management/routes/cli.js.map +1 -0
  122. package/dist/apps/management/routes/faucet.d.ts +8 -8
  123. package/dist/apps/management/routes/invitations.d.ts +24 -24
  124. package/dist/apps/management/routes/invite-links.d.ts +66 -66
  125. package/dist/apps/management/routes/members.d.ts +16 -16
  126. package/dist/apps/management/routes/orgs.d.ts +20 -20
  127. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  128. package/dist/apps/management/routes/orgs.js +8 -2
  129. package/dist/apps/management/routes/orgs.js.map +1 -1
  130. package/dist/apps/management/routes/projects.d.ts +76 -76
  131. package/dist/apps/management/routes/usage.d.ts +8 -8
  132. package/dist/apps/management/routes/verified-token-requests.d.ts +42 -42
  133. package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
  134. package/dist/apps/management/routes/verified-token-requests.js +7 -9
  135. package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
  136. package/dist/apps/management/routes/webhooks.d.ts +119 -119
  137. package/dist/apps/mcp.d.ts.map +1 -1
  138. package/dist/apps/mcp.js +16 -3
  139. package/dist/apps/mcp.js.map +1 -1
  140. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
  141. package/dist/apps/mpp/internal/Policy.js +4 -2
  142. package/dist/apps/mpp/internal/Policy.js.map +1 -1
  143. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
  144. package/dist/apps/mpp/internal/Sponsorship.js +6 -4
  145. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
  146. package/dist/apps/relay/App.d.ts +8 -0
  147. package/dist/apps/relay/App.d.ts.map +1 -1
  148. package/dist/apps/relay/App.js +16 -4
  149. package/dist/apps/relay/App.js.map +1 -1
  150. package/dist/apps/relay/Sponsorships.d.ts +4 -6
  151. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  152. package/dist/apps/relay/Sponsorships.js +71 -60
  153. package/dist/apps/relay/Sponsorships.js.map +1 -1
  154. package/dist/apps/routes/Access.d.ts +53 -0
  155. package/dist/apps/routes/Access.d.ts.map +1 -1
  156. package/dist/apps/routes/Access.js +121 -0
  157. package/dist/apps/routes/Access.js.map +1 -1
  158. package/dist/apps/routes/App.d.ts +397 -158
  159. package/dist/apps/routes/App.d.ts.map +1 -1
  160. package/dist/apps/routes/App.js.map +1 -1
  161. package/dist/apps/routes/routes/deposit-addresses.d.ts +169 -61
  162. package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -1
  163. package/dist/apps/routes/routes/deposit-addresses.js +217 -32
  164. package/dist/apps/routes/routes/deposit-addresses.js.map +1 -1
  165. package/dist/apps/routes/routes/quotes.d.ts +90 -0
  166. package/dist/apps/routes/routes/quotes.d.ts.map +1 -1
  167. package/dist/apps/routes/routes/quotes.js +101 -27
  168. package/dist/apps/routes/routes/quotes.js.map +1 -1
  169. package/dist/apps/routes/routes/transfers.d.ts +187 -135
  170. package/dist/apps/routes/routes/transfers.d.ts.map +1 -1
  171. package/dist/apps/routes/routes/transfers.js +182 -37
  172. package/dist/apps/routes/routes/transfers.js.map +1 -1
  173. package/dist/cli/ApiKeys.d.ts +120 -0
  174. package/dist/cli/ApiKeys.d.ts.map +1 -0
  175. package/dist/cli/ApiKeys.js +138 -0
  176. package/dist/cli/ApiKeys.js.map +1 -0
  177. package/dist/cli/Cli.d.ts +92 -34
  178. package/dist/cli/Cli.d.ts.map +1 -1
  179. package/dist/cli/Cli.js +188 -11
  180. package/dist/cli/Cli.js.map +1 -1
  181. package/dist/cli/Credentials.d.ts +95 -0
  182. package/dist/cli/Credentials.d.ts.map +1 -0
  183. package/dist/cli/Credentials.js +110 -0
  184. package/dist/cli/Credentials.js.map +1 -0
  185. package/dist/cli/Spec.d.ts +59 -0
  186. package/dist/cli/Spec.d.ts.map +1 -0
  187. package/dist/cli/Spec.js +77 -0
  188. package/dist/cli/Spec.js.map +1 -0
  189. package/dist/cli/bin.js +5 -1
  190. package/dist/cli/bin.js.map +1 -1
  191. package/dist/cli/commands/admin.d.ts +5 -5
  192. package/dist/cli/commands/admin.d.ts.map +1 -1
  193. package/dist/cli/commands/auth.d.ts +73 -0
  194. package/dist/cli/commands/auth.d.ts.map +1 -0
  195. package/dist/cli/commands/auth.js +204 -0
  196. package/dist/cli/commands/auth.js.map +1 -0
  197. package/dist/cli/commands/keys.d.ts +17 -0
  198. package/dist/cli/commands/keys.d.ts.map +1 -0
  199. package/dist/cli/commands/keys.js +109 -0
  200. package/dist/cli/commands/keys.js.map +1 -0
  201. package/dist/cloudflare.d.ts +27 -2
  202. package/dist/cloudflare.d.ts.map +1 -1
  203. package/dist/cloudflare.js +144 -17
  204. package/dist/cloudflare.js.map +1 -1
  205. package/dist/db/Db.d.ts +23 -0
  206. package/dist/db/Db.d.ts.map +1 -1
  207. package/dist/db/Db.js +418 -1
  208. package/dist/db/Db.js.map +1 -1
  209. package/dist/db/Schema.d.ts +44 -1
  210. package/dist/db/Schema.d.ts.map +1 -1
  211. package/dist/db/Schema.js +56 -3
  212. package/dist/db/Schema.js.map +1 -1
  213. package/dist/db/tables/apiKeyAdmissions.d.ts +28 -2
  214. package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -1
  215. package/dist/db/tables/apiKeyAdmissions.js +65 -9
  216. package/dist/db/tables/apiKeyAdmissions.js.map +1 -1
  217. package/dist/db/tables/apiKeyOwnerTombstones.d.ts +2 -0
  218. package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -1
  219. package/dist/db/tables/apiKeyOwnerTombstones.js +2 -2
  220. package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -1
  221. package/dist/db/tables/authAccounts.d.ts.map +1 -1
  222. package/dist/db/tables/authAccounts.js +1 -0
  223. package/dist/db/tables/authAccounts.js.map +1 -1
  224. package/dist/db/tables/earnVaults.d.ts +5 -1
  225. package/dist/db/tables/earnVaults.d.ts.map +1 -1
  226. package/dist/db/tables/earnVaults.js +12 -1
  227. package/dist/db/tables/earnVaults.js.map +1 -1
  228. package/dist/db/tables/organizations.d.ts +4 -2
  229. package/dist/db/tables/organizations.d.ts.map +1 -1
  230. package/dist/db/tables/organizations.js +8 -34
  231. package/dist/db/tables/organizations.js.map +1 -1
  232. package/dist/db/tables/requestUsage.d.ts +5 -1
  233. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  234. package/dist/db/tables/requestUsage.js +10 -2
  235. package/dist/db/tables/requestUsage.js.map +1 -1
  236. package/dist/db/tables/rewardEligibilityAssociations.d.ts +13 -0
  237. package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -1
  238. package/dist/db/tables/rewardEligibilityAssociations.js +11 -0
  239. package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -1
  240. package/dist/db/tables/rewardRuns.d.ts.map +1 -1
  241. package/dist/db/tables/rewardRuns.js +4 -0
  242. package/dist/db/tables/rewardRuns.js.map +1 -1
  243. package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -1
  244. package/dist/db/tables/rewardTransactionAttempts.js +2 -0
  245. package/dist/db/tables/rewardTransactionAttempts.js.map +1 -1
  246. package/dist/db/tables/routesDepositAddresses.d.ts +29 -0
  247. package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -1
  248. package/dist/db/tables/routesDepositAddresses.js +84 -31
  249. package/dist/db/tables/routesDepositAddresses.js.map +1 -1
  250. package/dist/db/tables/routesDeposits.d.ts.map +1 -1
  251. package/dist/db/tables/routesDeposits.js +31 -21
  252. package/dist/db/tables/routesDeposits.js.map +1 -1
  253. package/dist/db/tables/routesIdempotency.d.ts.map +1 -1
  254. package/dist/db/tables/routesIdempotency.js +2 -0
  255. package/dist/db/tables/routesIdempotency.js.map +1 -1
  256. package/dist/db/tables/routesPolicies.d.ts +58 -0
  257. package/dist/db/tables/routesPolicies.d.ts.map +1 -0
  258. package/dist/db/tables/routesPolicies.js +198 -0
  259. package/dist/db/tables/routesPolicies.js.map +1 -0
  260. package/dist/db/tables/routesTransferSubsidies.d.ts +22 -0
  261. package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -1
  262. package/dist/db/tables/routesTransferSubsidies.js +41 -0
  263. package/dist/db/tables/routesTransferSubsidies.js.map +1 -1
  264. package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -1
  265. package/dist/db/tables/routesTransferSubsidyNonces.js +12 -4
  266. package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -1
  267. package/dist/db/tables/routesTransfers.d.ts +26 -1
  268. package/dist/db/tables/routesTransfers.d.ts.map +1 -1
  269. package/dist/db/tables/routesTransfers.js +36 -6
  270. package/dist/db/tables/routesTransfers.js.map +1 -1
  271. package/dist/db/tables/sponsoredTransactions.d.ts +45 -13
  272. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  273. package/dist/db/tables/sponsoredTransactions.js +144 -33
  274. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  275. package/dist/db/tables/users.d.ts +2 -0
  276. package/dist/db/tables/users.d.ts.map +1 -1
  277. package/dist/db/tables/users.js +11 -0
  278. package/dist/db/tables/users.js.map +1 -1
  279. package/dist/db/tables/verifiedTokenRequests.d.ts +21 -4
  280. package/dist/db/tables/verifiedTokenRequests.d.ts.map +1 -1
  281. package/dist/db/tables/verifiedTokenRequests.js +65 -44
  282. package/dist/db/tables/verifiedTokenRequests.js.map +1 -1
  283. package/dist/handlers/internal/multisig.d.ts +1 -1
  284. package/dist/handlers/internal/multisig.d.ts.map +1 -1
  285. package/dist/handlers/internal/multisig.js +3 -2
  286. package/dist/handlers/internal/multisig.js.map +1 -1
  287. package/dist/handlers/relay.d.ts +2 -0
  288. package/dist/handlers/relay.d.ts.map +1 -1
  289. package/dist/handlers/relay.js +34 -15
  290. package/dist/handlers/relay.js.map +1 -1
  291. package/dist/internal/Auth.d.ts +73 -6
  292. package/dist/internal/Auth.d.ts.map +1 -1
  293. package/dist/internal/Auth.js +212 -85
  294. package/dist/internal/Auth.js.map +1 -1
  295. package/dist/internal/BetterAuth.d.ts +22 -0
  296. package/dist/internal/BetterAuth.d.ts.map +1 -1
  297. package/dist/internal/BetterAuth.js +17 -14
  298. package/dist/internal/BetterAuth.js.map +1 -1
  299. package/dist/internal/Cache.d.ts +5 -0
  300. package/dist/internal/Cache.d.ts.map +1 -1
  301. package/dist/internal/Cache.js +3 -1
  302. package/dist/internal/Cache.js.map +1 -1
  303. package/dist/internal/CliAuth.d.ts +243 -0
  304. package/dist/internal/CliAuth.d.ts.map +1 -0
  305. package/dist/internal/CliAuth.js +249 -0
  306. package/dist/internal/CliAuth.js.map +1 -0
  307. package/dist/internal/EarnSharePrices.d.ts +1 -1
  308. package/dist/internal/EarnSharePrices.d.ts.map +1 -1
  309. package/dist/internal/EarnSharePrices.js +7 -3
  310. package/dist/internal/EarnSharePrices.js.map +1 -1
  311. package/dist/internal/EarnVaults.d.ts +47 -0
  312. package/dist/internal/EarnVaults.d.ts.map +1 -1
  313. package/dist/internal/EarnVaults.js +188 -4
  314. package/dist/internal/EarnVaults.js.map +1 -1
  315. package/dist/internal/EarnWithdrawals.d.ts +73 -0
  316. package/dist/internal/EarnWithdrawals.d.ts.map +1 -0
  317. package/dist/internal/EarnWithdrawals.js +189 -0
  318. package/dist/internal/EarnWithdrawals.js.map +1 -0
  319. package/dist/internal/ExecutionContext.d.ts +21 -0
  320. package/dist/internal/ExecutionContext.d.ts.map +1 -0
  321. package/dist/internal/ExecutionContext.js +16 -0
  322. package/dist/internal/ExecutionContext.js.map +1 -0
  323. package/dist/internal/Log.d.ts +7 -3
  324. package/dist/internal/Log.d.ts.map +1 -1
  325. package/dist/internal/Log.js +163 -130
  326. package/dist/internal/Log.js.map +1 -1
  327. package/dist/internal/MetricSink.d.ts.map +1 -1
  328. package/dist/internal/MetricSink.js +26 -1
  329. package/dist/internal/MetricSink.js.map +1 -1
  330. package/dist/internal/RateLimit.d.ts +67 -0
  331. package/dist/internal/RateLimit.d.ts.map +1 -1
  332. package/dist/internal/RateLimit.js +174 -27
  333. package/dist/internal/RateLimit.js.map +1 -1
  334. package/dist/internal/Store.d.ts +6 -0
  335. package/dist/internal/Store.d.ts.map +1 -1
  336. package/dist/internal/Store.js +4 -5
  337. package/dist/internal/Store.js.map +1 -1
  338. package/dist/internal/Timing.d.ts +6 -0
  339. package/dist/internal/Timing.d.ts.map +1 -1
  340. package/dist/internal/Timing.js +21 -1
  341. package/dist/internal/Timing.js.map +1 -1
  342. package/dist/internal/Tron.d.ts +124 -0
  343. package/dist/internal/Tron.d.ts.map +1 -0
  344. package/dist/internal/Tron.js +202 -0
  345. package/dist/internal/Tron.js.map +1 -0
  346. package/dist/internal/Viem.d.ts +4 -0
  347. package/dist/internal/Viem.d.ts.map +1 -1
  348. package/dist/internal/Viem.js +25 -6
  349. package/dist/internal/Viem.js.map +1 -1
  350. package/dist/internal/rewards/Read.d.ts +2 -2
  351. package/dist/internal/rewards/Read.d.ts.map +1 -1
  352. package/dist/internal/rewards/Read.js +11 -2
  353. package/dist/internal/rewards/Read.js.map +1 -1
  354. package/dist/internal/routes/Action.d.ts +27 -0
  355. package/dist/internal/routes/Action.d.ts.map +1 -1
  356. package/dist/internal/routes/Action.js +49 -1
  357. package/dist/internal/routes/Action.js.map +1 -1
  358. package/dist/internal/routes/Chain.d.ts +2 -0
  359. package/dist/internal/routes/Chain.d.ts.map +1 -1
  360. package/dist/internal/routes/Chain.js +4 -0
  361. package/dist/internal/routes/Chain.js.map +1 -1
  362. package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
  363. package/dist/internal/routes/DepositAddress.js +5 -0
  364. package/dist/internal/routes/DepositAddress.js.map +1 -1
  365. package/dist/internal/routes/Evidence.d.ts.map +1 -1
  366. package/dist/internal/routes/Evidence.js +6 -2
  367. package/dist/internal/routes/Evidence.js.map +1 -1
  368. package/dist/internal/routes/EvmTransferSettlement.d.ts +17 -0
  369. package/dist/internal/routes/EvmTransferSettlement.d.ts.map +1 -0
  370. package/dist/internal/routes/EvmTransferSettlement.js +196 -0
  371. package/dist/internal/routes/EvmTransferSettlement.js.map +1 -0
  372. package/dist/internal/routes/Policy.d.ts +161 -0
  373. package/dist/internal/routes/Policy.d.ts.map +1 -0
  374. package/dist/internal/routes/Policy.js +249 -0
  375. package/dist/internal/routes/Policy.js.map +1 -0
  376. package/dist/internal/routes/Provider.d.ts +66 -3
  377. package/dist/internal/routes/Provider.d.ts.map +1 -1
  378. package/dist/internal/routes/Provider.js +106 -27
  379. package/dist/internal/routes/Provider.js.map +1 -1
  380. package/dist/internal/routes/Quota.d.ts +57 -0
  381. package/dist/internal/routes/Quota.d.ts.map +1 -0
  382. package/dist/internal/routes/Quota.js +144 -0
  383. package/dist/internal/routes/Quota.js.map +1 -0
  384. package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
  385. package/dist/internal/routes/Reconciliation.js +163 -47
  386. package/dist/internal/routes/Reconciliation.js.map +1 -1
  387. package/dist/internal/routes/SolanaTransferSettlement.d.ts +12 -0
  388. package/dist/internal/routes/SolanaTransferSettlement.d.ts.map +1 -0
  389. package/dist/internal/routes/SolanaTransferSettlement.js +220 -0
  390. package/dist/internal/routes/SolanaTransferSettlement.js.map +1 -0
  391. package/dist/internal/routes/SolanaTransferSubsidy.d.ts +172 -0
  392. package/dist/internal/routes/SolanaTransferSubsidy.d.ts.map +1 -0
  393. package/dist/internal/routes/SolanaTransferSubsidy.js +564 -0
  394. package/dist/internal/routes/SolanaTransferSubsidy.js.map +1 -0
  395. package/dist/internal/routes/Subsidy.d.ts +2 -2
  396. package/dist/internal/routes/Subsidy.d.ts.map +1 -1
  397. package/dist/internal/routes/Subsidy.js +2 -2
  398. package/dist/internal/routes/Subsidy.js.map +1 -1
  399. package/dist/internal/routes/Transfer.d.ts +229 -1
  400. package/dist/internal/routes/Transfer.d.ts.map +1 -1
  401. package/dist/internal/routes/Transfer.js +644 -7
  402. package/dist/internal/routes/Transfer.js.map +1 -1
  403. package/dist/internal/routes/TransferReconciliation.d.ts +6 -0
  404. package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -1
  405. package/dist/internal/routes/TransferReconciliation.js +83 -159
  406. package/dist/internal/routes/TransferReconciliation.js.map +1 -1
  407. package/dist/internal/routes/TransferSettlement.d.ts +45 -0
  408. package/dist/internal/routes/TransferSettlement.d.ts.map +1 -0
  409. package/dist/internal/routes/TransferSettlement.js +2 -0
  410. package/dist/internal/routes/TransferSettlement.js.map +1 -0
  411. package/dist/internal/routes/TransferSubsidy.d.ts +23 -8
  412. package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -1
  413. package/dist/internal/routes/TransferSubsidy.js +64 -5
  414. package/dist/internal/routes/TransferSubsidy.js.map +1 -1
  415. package/dist/internal/routes/TronTransferSettlement.d.ts +12 -0
  416. package/dist/internal/routes/TronTransferSettlement.d.ts.map +1 -0
  417. package/dist/internal/routes/TronTransferSettlement.js +201 -0
  418. package/dist/internal/routes/TronTransferSettlement.js.map +1 -0
  419. package/dist/internal/routes/TronTransferSubsidy.d.ts +174 -0
  420. package/dist/internal/routes/TronTransferSubsidy.d.ts.map +1 -0
  421. package/dist/internal/routes/TronTransferSubsidy.js +439 -0
  422. package/dist/internal/routes/TronTransferSubsidy.js.map +1 -0
  423. package/dist/internal/routes/index.d.ts +3 -0
  424. package/dist/internal/routes/index.d.ts.map +1 -1
  425. package/dist/internal/routes/index.js +3 -0
  426. package/dist/internal/routes/index.js.map +1 -1
  427. package/dist/internal/routes/providers/across.d.ts +3 -0
  428. package/dist/internal/routes/providers/across.d.ts.map +1 -1
  429. package/dist/internal/routes/providers/across.js +11 -0
  430. package/dist/internal/routes/providers/across.js.map +1 -1
  431. package/dist/internal/routes/providers/legacyMesh.d.ts +29 -0
  432. package/dist/internal/routes/providers/legacyMesh.d.ts.map +1 -0
  433. package/dist/internal/routes/providers/legacyMesh.js +474 -0
  434. package/dist/internal/routes/providers/legacyMesh.js.map +1 -0
  435. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts +59 -0
  436. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts.map +1 -0
  437. package/dist/internal/routes/providers/legacyMeshDelivery.js +229 -0
  438. package/dist/internal/routes/providers/legacyMeshDelivery.js.map +1 -0
  439. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts +19 -0
  440. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts.map +1 -0
  441. package/dist/internal/routes/providers/legacyMeshOutbound.js +457 -0
  442. package/dist/internal/routes/providers/legacyMeshOutbound.js.map +1 -0
  443. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts +123 -0
  444. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts.map +1 -0
  445. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js +333 -0
  446. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js.map +1 -0
  447. package/dist/internal/routes/providers/propAmm.d.ts +70 -0
  448. package/dist/internal/routes/providers/propAmm.d.ts.map +1 -0
  449. package/dist/internal/routes/providers/propAmm.js +524 -0
  450. package/dist/internal/routes/providers/propAmm.js.map +1 -0
  451. package/dist/internal/routes/providers/relay.d.ts +4 -1
  452. package/dist/internal/routes/providers/relay.d.ts.map +1 -1
  453. package/dist/internal/routes/providers/relay.js +353 -42
  454. package/dist/internal/routes/providers/relay.js.map +1 -1
  455. package/dist/internal/routes/providers/rhino.d.ts +3 -0
  456. package/dist/internal/routes/providers/rhino.d.ts.map +1 -1
  457. package/dist/internal/routes/providers/rhino.js +11 -0
  458. package/dist/internal/routes/providers/rhino.js.map +1 -1
  459. package/dist/internal/routes/providers/squid.d.ts +3 -0
  460. package/dist/internal/routes/providers/squid.d.ts.map +1 -1
  461. package/dist/internal/routes/providers/squid.js +19 -0
  462. package/dist/internal/routes/providers/squid.js.map +1 -1
  463. package/dist/internal/routes/providers/stargate.d.ts.map +1 -1
  464. package/dist/internal/routes/providers/stargate.js +22 -9
  465. package/dist/internal/routes/providers/stargate.js.map +1 -1
  466. package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -1
  467. package/dist/internal/routes/providers/symbiosis.js +13 -17
  468. package/dist/internal/routes/providers/symbiosis.js.map +1 -1
  469. package/dist/providers/index.d.ts +14 -0
  470. package/dist/providers/index.d.ts.map +1 -1
  471. package/dist/providers/index.js +6 -0
  472. package/dist/providers/index.js.map +1 -1
  473. package/package.json +16 -6
  474. package/src/ApiKey.ts +7 -3
  475. package/src/ApiKeys.test.ts +652 -8
  476. package/src/ApiKeys.ts +191 -11
  477. package/src/App.test.ts +405 -18
  478. package/src/App.ts +51 -15
  479. package/src/Client.test-d.ts +157 -10
  480. package/src/Client.test.ts +4 -4
  481. package/src/Scope.ts +1 -2
  482. package/src/admin/App.ts +11 -5
  483. package/src/admin/apps/api-keys.test.ts +98 -2
  484. package/src/admin/apps/api-keys.ts +21 -12
  485. package/src/admin/apps/earn-vaults.test.ts +76 -7
  486. package/src/admin/apps/earn-vaults.ts +47 -8
  487. package/src/admin/apps/organizations.test.ts +147 -31
  488. package/src/admin/apps/organizations.ts +5 -4
  489. package/src/admin/apps/route-policies.test.ts +220 -0
  490. package/src/admin/apps/route-policies.ts +322 -0
  491. package/src/admin/apps/routes-support.test.ts +107 -2
  492. package/src/admin/apps/routes-support.ts +43 -3
  493. package/src/admin/apps/routes.test.ts +150 -0
  494. package/src/admin/apps/routes.ts +97 -1
  495. package/src/admin/apps/scopes.test.ts +1 -1
  496. package/src/admin/apps/verified-tokens.test.ts +32 -0
  497. package/src/admin/apps/verified-tokens.ts +30 -4
  498. package/src/admin/index.ts +0 -1
  499. package/src/admin/ui/plugin.ts +2 -1
  500. package/src/admin/ui/src/components/Dialog.tsx +1 -1
  501. package/src/admin/ui/src/components/EarnVaultForm.tsx +45 -0
  502. package/src/admin/ui/src/components/RoutePicker.tsx +79 -0
  503. package/src/admin/ui/src/lib/earn-vaults.ts +1 -1
  504. package/src/admin/ui/src/lib/route-policies.test.ts +452 -0
  505. package/src/admin/ui/src/lib/route-policies.ts +232 -0
  506. package/src/admin/ui/src/lib/routes.ts +34 -0
  507. package/src/admin/ui/src/lib/verified-tokens.ts +24 -9
  508. package/src/admin/ui/src/routeTree.gen.ts +21 -0
  509. package/src/admin/ui/src/routes/__root.tsx +1 -1
  510. package/src/admin/ui/src/routes/api-keys.tsx +21 -2
  511. package/src/admin/ui/src/routes/early-access.tsx +1 -0
  512. package/src/admin/ui/src/routes/earn.vaults.tsx +1 -0
  513. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +22 -0
  514. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +10 -0
  515. package/src/admin/ui/src/routes/organizations.tsx +35 -4
  516. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +18 -3
  517. package/src/admin/ui/src/routes/route-policies.tsx +678 -0
  518. package/src/admin/ui/src/routes/routes.tsx +85 -2
  519. package/src/admin/ui/src/routes/routes_.support.tsx +6 -22
  520. package/src/admin/ui/src/routes/subsidies.tsx +1 -0
  521. package/src/admin/ui/src/routes/verified-tokens.tsx +65 -20
  522. package/src/admin/ui.generated.ts +99 -104
  523. package/src/analytics/Analytics.test.ts +4 -50
  524. package/src/analytics/Analytics.ts +65 -1
  525. package/src/analytics/tables/requestEvents.test.ts +402 -1
  526. package/src/analytics/tables/requestEvents.ts +62 -93
  527. package/src/apps/data/App.test.ts +26 -0
  528. package/src/apps/data/routes/activities.test.ts +315 -14
  529. package/src/apps/data/routes/activities.ts +60 -0
  530. package/src/apps/data/routes/balances.ts +5 -7
  531. package/src/apps/data/routes/earn.bench.ts +18 -0
  532. package/src/apps/data/routes/earn.local.test.ts +507 -0
  533. package/src/apps/data/routes/earn.test.ts +405 -127
  534. package/src/apps/data/routes/earn.ts +660 -270
  535. package/src/apps/data/routes/exchanges.bench.ts +3 -1
  536. package/src/apps/data/routes/exchanges.test.ts +166 -2
  537. package/src/apps/data/routes/exchanges.ts +308 -101
  538. package/src/apps/data/routes/fee-amm.test.ts +153 -2
  539. package/src/apps/data/routes/fee-amm.ts +132 -62
  540. package/src/apps/data/routes/receipts.test.ts +21 -18
  541. package/src/apps/data/routes/rpc.test.ts +34 -2
  542. package/src/apps/data/routes/rpc.ts +47 -10
  543. package/src/apps/data/routes/tokens.provenance.test.ts +157 -0
  544. package/src/apps/data/routes/tokens.test.ts +4 -4
  545. package/src/apps/data/routes/tokens.ts +11 -6
  546. package/src/apps/data/routes/transactions.test.ts +29 -0
  547. package/src/apps/data/routes/transactions.ts +33 -22
  548. package/src/apps/data/routes/webhooks.scan.test.ts +29 -0
  549. package/src/apps/data/routes/webhooks.test.ts +18 -3
  550. package/src/apps/data/routes/webhooks.ts +27 -13
  551. package/src/apps/management/App.ts +4 -0
  552. package/src/apps/management/Billing.test.ts +253 -27
  553. package/src/apps/management/Billing.ts +83 -29
  554. package/src/apps/management/routes/api-keys.test.ts +1 -1
  555. package/src/apps/management/routes/api-keys.ts +85 -11
  556. package/src/apps/management/routes/billing.test.ts +68 -4
  557. package/src/apps/management/routes/cli.test.ts +370 -0
  558. package/src/apps/management/routes/cli.ts +533 -0
  559. package/src/apps/management/routes/me.test.ts +14 -4
  560. package/src/apps/management/routes/orgs.test.ts +108 -4
  561. package/src/apps/management/routes/orgs.ts +7 -2
  562. package/src/apps/management/routes/usage.test.ts +2 -2
  563. package/src/apps/management/routes/verified-token-requests.test.ts +16 -2
  564. package/src/apps/management/routes/verified-token-requests.ts +7 -10
  565. package/src/apps/mcp.test.ts +108 -25
  566. package/src/apps/mcp.ts +15 -3
  567. package/src/apps/mpp/internal/Policy.test.ts +51 -4
  568. package/src/apps/mpp/internal/Policy.ts +6 -2
  569. package/src/apps/mpp/internal/Sponsorship.test.ts +29 -0
  570. package/src/apps/mpp/internal/Sponsorship.ts +6 -4
  571. package/src/apps/relay/App.test.ts +85 -1
  572. package/src/apps/relay/App.ts +28 -4
  573. package/src/apps/relay/Sponsorships.test.ts +97 -1
  574. package/src/apps/relay/Sponsorships.ts +77 -66
  575. package/src/apps/routes/Access.test.ts +319 -0
  576. package/src/apps/routes/Access.ts +147 -0
  577. package/src/apps/routes/App.ts +10 -0
  578. package/src/apps/routes/routes/chains.test.ts +3 -2
  579. package/src/apps/routes/routes/deposit-addresses.test.ts +978 -34
  580. package/src/apps/routes/routes/deposit-addresses.ts +243 -32
  581. package/src/apps/routes/routes/propAmm.local.test.ts +951 -0
  582. package/src/apps/routes/routes/quotes.test.ts +81 -8
  583. package/src/apps/routes/routes/quotes.ts +109 -27
  584. package/src/apps/routes/routes/transfers.test.ts +252 -15
  585. package/src/apps/routes/routes/transfers.ts +212 -33
  586. package/src/cli/ApiKeys.test.ts +265 -0
  587. package/src/cli/ApiKeys.ts +189 -0
  588. package/src/cli/Cli.test.ts +188 -0
  589. package/src/cli/Cli.ts +280 -12
  590. package/src/cli/Credentials.test.ts +122 -0
  591. package/src/cli/Credentials.ts +144 -0
  592. package/src/cli/Spec.test.ts +133 -0
  593. package/src/cli/Spec.ts +132 -0
  594. package/src/cli/bin.test.ts +49 -0
  595. package/src/cli/bin.ts +5 -1
  596. package/src/cli/commands/auth.test.ts +138 -0
  597. package/src/cli/commands/auth.ts +254 -0
  598. package/src/cli/commands/keys.test.ts +68 -0
  599. package/src/cli/commands/keys.ts +125 -0
  600. package/src/cloudflare.ts +184 -36
  601. package/src/db/Db.test.ts +877 -0
  602. package/src/db/Db.ts +507 -1
  603. package/src/db/Schema.ts +75 -4
  604. package/src/db/tables/apiKeyAdmissions.test.ts +57 -0
  605. package/src/db/tables/apiKeyAdmissions.ts +101 -11
  606. package/src/db/tables/apiKeyOwnerTombstones.ts +2 -2
  607. package/src/db/tables/authAccounts.test.ts +30 -0
  608. package/src/db/tables/authAccounts.ts +1 -0
  609. package/src/db/tables/earnVaults.test.ts +34 -0
  610. package/src/db/tables/earnVaults.ts +17 -2
  611. package/src/db/tables/organizations.test.ts +148 -84
  612. package/src/db/tables/organizations.ts +11 -43
  613. package/src/db/tables/requestUsage.ts +13 -2
  614. package/src/db/tables/rewardCampaigns.test.ts +163 -0
  615. package/src/db/tables/rewardEligibilityAssociations.test.ts +14 -0
  616. package/src/db/tables/rewardEligibilityAssociations.ts +24 -0
  617. package/src/db/tables/rewardRuns.ts +4 -0
  618. package/src/db/tables/rewardTransactionAttempts.ts +2 -0
  619. package/src/db/tables/routesDepositAddresses.test.ts +263 -0
  620. package/src/db/tables/routesDepositAddresses.ts +118 -34
  621. package/src/db/tables/routesDeposits.test.ts +133 -0
  622. package/src/db/tables/routesDeposits.ts +47 -26
  623. package/src/db/tables/routesIdempotency.test.ts +80 -0
  624. package/src/db/tables/routesIdempotency.ts +2 -0
  625. package/src/db/tables/routesPolicies.test.ts +143 -0
  626. package/src/db/tables/routesPolicies.ts +251 -0
  627. package/src/db/tables/routesTransferSubsidies.ts +64 -0
  628. package/src/db/tables/routesTransferSubsidyNonces.ts +16 -4
  629. package/src/db/tables/routesTransfers.test.ts +183 -2
  630. package/src/db/tables/routesTransfers.ts +65 -6
  631. package/src/db/tables/sponsoredTransactions.test.ts +351 -76
  632. package/src/db/tables/sponsoredTransactions.ts +182 -38
  633. package/src/db/tables/users.test.ts +51 -0
  634. package/src/db/tables/users.ts +12 -0
  635. package/src/db/tables/verifiedTokenRequests.test.ts +39 -20
  636. package/src/db/tables/verifiedTokenRequests.ts +80 -44
  637. package/src/handlers/internal/multisig.store.test.ts +120 -0
  638. package/src/handlers/internal/multisig.test.ts +389 -0
  639. package/src/handlers/internal/multisig.ts +13 -10
  640. package/src/handlers/relay.test.ts +259 -83
  641. package/src/handlers/relay.ts +36 -17
  642. package/src/internal/Auth.test.ts +383 -8
  643. package/src/internal/Auth.ts +272 -99
  644. package/src/internal/BetterAuth.test.ts +58 -22
  645. package/src/internal/BetterAuth.ts +23 -17
  646. package/src/internal/Cache.ts +3 -1
  647. package/src/internal/CliAuth.test.ts +279 -0
  648. package/src/internal/CliAuth.ts +319 -0
  649. package/src/internal/EarnSharePrices.test.ts +25 -0
  650. package/src/internal/EarnSharePrices.ts +9 -2
  651. package/src/internal/EarnVaults.test.ts +67 -0
  652. package/src/internal/EarnVaults.ts +299 -4
  653. package/src/internal/EarnWithdrawals.test.ts +315 -0
  654. package/src/internal/EarnWithdrawals.ts +266 -0
  655. package/src/internal/ExecutionContext.ts +31 -0
  656. package/src/internal/Log.test.ts +210 -0
  657. package/src/internal/Log.ts +180 -142
  658. package/src/internal/MetricSink.test.ts +190 -15
  659. package/src/internal/MetricSink.ts +27 -1
  660. package/src/internal/RateLimit.test.ts +144 -8
  661. package/src/internal/RateLimit.ts +254 -26
  662. package/src/internal/Store.ts +4 -5
  663. package/src/internal/Timing.test.ts +32 -0
  664. package/src/internal/Timing.ts +20 -1
  665. package/src/internal/Tron.test-d.ts +22 -0
  666. package/src/internal/Tron.test.ts +94 -0
  667. package/src/internal/Tron.ts +289 -0
  668. package/src/internal/Viem.rpc.test.ts +76 -0
  669. package/src/internal/Viem.ts +29 -6
  670. package/src/internal/rewards/Read.test.ts +109 -0
  671. package/src/internal/rewards/Read.ts +13 -4
  672. package/src/internal/routes/Action.test.ts +70 -0
  673. package/src/internal/routes/Action.ts +76 -1
  674. package/src/internal/routes/Chain.test.ts +18 -0
  675. package/src/internal/routes/Chain.ts +5 -0
  676. package/src/internal/routes/DepositAddress.ts +5 -0
  677. package/src/internal/routes/Evidence.test.ts +64 -0
  678. package/src/internal/routes/Evidence.ts +11 -3
  679. package/src/internal/routes/EvmTransferSettlement.ts +213 -0
  680. package/src/internal/routes/Policy.test.ts +316 -0
  681. package/src/internal/routes/Policy.ts +399 -0
  682. package/src/internal/routes/Provider.test.ts +103 -2
  683. package/src/internal/routes/Provider.ts +149 -27
  684. package/src/internal/routes/Quota.test.ts +149 -0
  685. package/src/internal/routes/Quota.ts +226 -0
  686. package/src/internal/routes/Reconciliation.local.test.ts +285 -0
  687. package/src/internal/routes/Reconciliation.test.ts +371 -13
  688. package/src/internal/routes/Reconciliation.ts +193 -42
  689. package/src/internal/routes/SolanaTransferSettlement.ts +232 -0
  690. package/src/internal/routes/SolanaTransferSubsidy.test.ts +471 -0
  691. package/src/internal/routes/SolanaTransferSubsidy.ts +760 -0
  692. package/src/internal/routes/SourceObservation.test.ts +221 -0
  693. package/src/internal/routes/Subsidy.local.test.ts +46 -0
  694. package/src/internal/routes/Subsidy.ts +4 -2
  695. package/src/internal/routes/Transfer.solana.test.ts +389 -0
  696. package/src/internal/routes/Transfer.test.ts +130 -1
  697. package/src/internal/routes/Transfer.tron.test.ts +172 -0
  698. package/src/internal/routes/Transfer.ts +866 -8
  699. package/src/internal/routes/TransferReconciliation.test.ts +26 -4
  700. package/src/internal/routes/TransferReconciliation.ts +91 -166
  701. package/src/internal/routes/TransferSettlement.ts +48 -0
  702. package/src/internal/routes/TransferSubsidy.local.test.ts +143 -0
  703. package/src/internal/routes/TransferSubsidy.test.ts +34 -4
  704. package/src/internal/routes/TransferSubsidy.ts +87 -12
  705. package/src/internal/routes/TronTransferSettlement.ts +212 -0
  706. package/src/internal/routes/TronTransferSubsidy.test.ts +109 -0
  707. package/src/internal/routes/TronTransferSubsidy.ts +619 -0
  708. package/src/internal/routes/index.test.ts +3 -0
  709. package/src/internal/routes/index.ts +3 -0
  710. package/src/internal/routes/providers/across.ts +13 -0
  711. package/src/internal/routes/providers/index.test.ts +141 -0
  712. package/src/internal/routes/providers/legacyMesh.test.ts +484 -0
  713. package/src/internal/routes/providers/legacyMesh.ts +633 -0
  714. package/src/internal/routes/providers/legacyMeshDelivery.test.ts +306 -0
  715. package/src/internal/routes/providers/legacyMeshDelivery.ts +320 -0
  716. package/src/internal/routes/providers/legacyMeshOutbound.test.ts +401 -0
  717. package/src/internal/routes/providers/legacyMeshOutbound.ts +566 -0
  718. package/src/internal/routes/providers/legacyMeshOutboundDelivery.ts +473 -0
  719. package/src/internal/routes/providers/propAmm.ts +640 -0
  720. package/src/internal/routes/providers/relay.test.ts +1299 -18
  721. package/src/internal/routes/providers/relay.ts +424 -39
  722. package/src/internal/routes/providers/rhino.ts +14 -1
  723. package/src/internal/routes/providers/squid.ts +21 -0
  724. package/src/internal/routes/providers/stargate.test.ts +105 -1
  725. package/src/internal/routes/providers/stargate.ts +22 -9
  726. package/src/internal/routes/providers/symbiosis.ts +13 -47
  727. package/src/providers/index.test.ts +2 -0
  728. package/src/providers/index.ts +18 -0
  729. package/dist/admin/Access.d.ts +0 -39
  730. package/dist/admin/Access.d.ts.map +0 -1
  731. package/dist/admin/Access.js +0 -73
  732. package/dist/admin/Access.js.map +0 -1
  733. package/src/admin/Access.test.ts +0 -130
  734. package/src/admin/Access.ts +0 -85
@@ -9,6 +9,7 @@ import * as Deposit from '../../internal/routes/Deposit.js'
9
9
  import * as DepositAddress from '../../internal/routes/DepositAddress.js'
10
10
  import * as Transfer from '../../internal/routes/Transfer.js'
11
11
  import * as Db from '../Db.js'
12
+ import * as ApiKeyOwnerTombstones from './apiKeyOwnerTombstones.js'
12
13
  import * as EnabledBillingSources from './enabledBillingSources.js'
13
14
  import * as Memberships from './memberships.js'
14
15
  import * as Organizations from './organizations.js'
@@ -665,48 +666,52 @@ describe('deleteOrganization', () => {
665
666
  await db.close()
666
667
  })
667
668
 
668
- test('behavior: preserves an org with unreported billable sponsorships', async () => {
669
- const db = create()
670
- await db.migrate()
671
- await Organizations.create(db, { id: 'org_1', name: 'One' })
672
- await StripeCustomers.create(db, {
673
- orgId: 'org_1',
674
- stripeCustomerId: 'cus_org_1',
675
- })
676
- await EnabledBillingSources.add(db, {
677
- createdBy: 'admin@tempo.xyz',
678
- orgId: 'org_1',
679
- source: 'stripe',
680
- })
681
- await SponsoredTransactions.upsert(db, {
682
- apiKeyId: 'key_1',
683
- billable: true,
684
- chainId: 4217,
685
- environment: 'production',
686
- orgId: 'org_1',
687
- projectId: 'prj_1',
688
- signPayload: `0x${'bb'.repeat(32)}`,
689
- transaction: `0x76${'cc'.repeat(16)}`,
690
- transactionHash: `0x${'aa'.repeat(32)}`,
691
- })
669
+ test.each([Viem.chainId.mainnet, 421700001])(
670
+ 'behavior: preserves billable sponsorships on chain %s',
671
+ async (chainId) => {
672
+ const db = create()
673
+ await db.migrate()
674
+ await Organizations.create(db, { id: 'org_1', name: 'One' })
675
+ await StripeCustomers.create(db, {
676
+ orgId: 'org_1',
677
+ stripeCustomerId: 'cus_org_1',
678
+ })
679
+ await EnabledBillingSources.add(db, {
680
+ createdBy: 'admin@tempo.xyz',
681
+ orgId: 'org_1',
682
+ source: 'stripe',
683
+ })
684
+ await SponsoredTransactions.upsert(db, {
685
+ apiKeyId: 'key_1',
686
+ billable: true,
687
+ chainId,
688
+ environment: 'production',
689
+ orgId: 'org_1',
690
+ projectId: 'prj_1',
691
+ signPayload: `0x${'bb'.repeat(32)}`,
692
+ transaction: `0x76${'cc'.repeat(16)}`,
693
+ transactionHash: `0x${'aa'.repeat(32)}`,
694
+ })
692
695
 
693
- expect(await Organizations.hasUnreportedMeteredUsage(db, 'org_1')).toBe(true)
694
- await expect(Organizations.deleteOrganization(db, 'org_1')).rejects.toThrow(
695
- Organizations.UnreportedMeteredUsageError,
696
- )
697
- expect(await Organizations.get(db, 'org_1')).toBeDefined()
698
- expect(await EnabledBillingSources.isEnabled(db, { orgId: 'org_1', source: 'stripe' })).toBe(
699
- true,
700
- )
701
- expect(await StripeCustomers.get(db, 'org_1')).toBeDefined()
702
- await db.close()
703
- })
696
+ expect(await Organizations.hasUnreportedMeteredUsage(db, 'org_1')).toBe(true)
697
+ await expect(Organizations.deleteOrganization(db, 'org_1')).rejects.toThrow(
698
+ Organizations.UnreportedMeteredUsageError,
699
+ )
700
+ expect(await Organizations.get(db, 'org_1')).toBeDefined()
701
+ expect(await EnabledBillingSources.isEnabled(db, { orgId: 'org_1', source: 'stripe' })).toBe(
702
+ true,
703
+ )
704
+ expect(await StripeCustomers.get(db, 'org_1')).toBeDefined()
705
+ expect(await ApiKeyOwnerTombstones.isDeleted(db, { orgId: 'org_1' })).toBe(false)
706
+ await db.close()
707
+ },
708
+ )
704
709
 
705
- test('behavior: deletes an org with only failed or non-mainnet sponsorships', async () => {
710
+ test('behavior: deletes an org with only reported or non-billable sponsorships', async () => {
706
711
  const db = create()
707
712
  await db.migrate()
708
713
  await Organizations.create(db, { id: 'org_1', name: 'One' })
709
- const failed = await SponsoredTransactions.upsert(db, {
714
+ const reported = await SponsoredTransactions.upsert(db, {
710
715
  apiKeyId: 'key_1',
711
716
  billable: true,
712
717
  chainId: Viem.chainId.mainnet,
@@ -717,10 +722,14 @@ describe('deleteOrganization', () => {
717
722
  transaction: `0x76${'cc'.repeat(16)}`,
718
723
  transactionHash: `0x${'aa'.repeat(32)}`,
719
724
  })
720
- await SponsoredTransactions.fail(db, failed.id, '2026-01-01T00:00:00.000Z')
725
+ await SponsoredTransactions.finalize(db, reported.id, {
726
+ feeAmount: '100',
727
+ finalizedAt: '2026-01-01T00:00:00.000Z',
728
+ })
729
+ await SponsoredTransactions.markReported(db, reported.id, '2026-01-01T00:00:01.000Z')
721
730
  const testnet = await SponsoredTransactions.upsert(db, {
722
731
  apiKeyId: 'key_1',
723
- billable: true,
732
+ billable: false,
724
733
  chainId: Viem.chainId.testnet,
725
734
  environment: 'production',
726
735
  orgId: 'org_1',
@@ -878,6 +887,51 @@ describe('deleteOrganization', () => {
878
887
  await db.close()
879
888
  })
880
889
 
890
+ test('behavior: deletion waits for an in-flight sponsorship and preserves its billing identity', async () => {
891
+ const schema = `t_${nanoid()}`
892
+ const db = Db.postgres({ connectionString: Runtime.postgresUrl, schema })
893
+ const concurrent = Db.postgres({ connectionString: Runtime.postgresUrl, schema })
894
+ await db.migrate()
895
+ await settleRouteRollout(db)
896
+ await Organizations.create(db, { id: 'org_1', name: 'One' })
897
+ await StripeCustomers.create(db, { orgId: 'org_1', stripeCustomerId: 'cus_org_1' })
898
+ const recorded = Promise.withResolvers<void>()
899
+ const release = Promise.withResolvers<void>()
900
+ const sponsorship = db.transaction(async (tx) => {
901
+ await SponsoredTransactions.upsert(tx, {
902
+ apiKeyId: 'key_1',
903
+ billable: true,
904
+ chainId: 421700001,
905
+ environment: 'production',
906
+ orgId: 'org_1',
907
+ signPayload: `0x${'bb'.repeat(32)}`,
908
+ transaction: `0x76${'cc'.repeat(16)}`,
909
+ })
910
+ recorded.resolve()
911
+ await release.promise
912
+ })
913
+ await recorded.promise
914
+ const deletion = Organizations.deleteOrganization(concurrent, 'org_1')
915
+ try {
916
+ expect(
917
+ await Promise.race([
918
+ deletion.then(
919
+ () => 'deleted',
920
+ () => 'rejected',
921
+ ),
922
+ new Promise((resolve) => setTimeout(() => resolve('waiting'), 100)),
923
+ ]),
924
+ ).toBe('waiting')
925
+ } finally {
926
+ release.resolve()
927
+ }
928
+ await sponsorship
929
+ await expect(deletion).rejects.toThrow(Organizations.UnreportedMeteredUsageError)
930
+ expect(await StripeCustomers.get(db, 'org_1')).toBeDefined()
931
+ expect(await ApiKeyOwnerTombstones.isDeleted(db, { orgId: 'org_1' })).toBe(false)
932
+ await Promise.all([db.close(), concurrent.close()])
933
+ })
934
+
881
935
  test('behavior: serializes deletion with subsidy liability persistence', async () => {
882
936
  const schema = `t_${nanoid()}`
883
937
  const db = Db.postgres({ connectionString: Runtime.postgresUrl, schema })
@@ -984,54 +1038,64 @@ describe('deleteOrganization', () => {
984
1038
  await db.close()
985
1039
  })
986
1040
 
987
- test('behavior: preserves an org with a recoverable failed fill intent', async () => {
988
- const db = create()
989
- await db.migrate()
990
- await Organizations.create(db, { id: 'org_1', name: 'One' })
991
- const failed = await SponsoredTransactions.upsert(db, {
992
- apiKeyId: 'key_1',
993
- billable: true,
994
- chainId: Viem.chainId.mainnet,
995
- environment: 'production',
996
- orgId: 'org_1',
997
- projectId: 'prj_1',
998
- signPayload: `0x${'bb'.repeat(32)}`,
999
- transaction: `0x76${'cc'.repeat(16)}`,
1000
- })
1001
- await SponsoredTransactions.fail(db, failed.id, new Date().toISOString())
1041
+ test.each([undefined, `0x${'aa'.repeat(32)}`])(
1042
+ 'behavior: preserves a failed sponsorship with hash %s',
1043
+ async (transactionHash) => {
1044
+ const db = create()
1045
+ await db.migrate()
1046
+ await Organizations.create(db, { id: 'org_1', name: 'One' })
1047
+ const failed = await SponsoredTransactions.upsert(db, {
1048
+ apiKeyId: 'key_1',
1049
+ billable: true,
1050
+ chainId: Viem.chainId.mainnet,
1051
+ environment: 'production',
1052
+ orgId: 'org_1',
1053
+ projectId: 'prj_1',
1054
+ signPayload: `0x${'bb'.repeat(32)}`,
1055
+ transaction: `0x76${'cc'.repeat(16)}`,
1056
+ transactionHash,
1057
+ })
1058
+ await SponsoredTransactions.fail(db, failed.id, new Date().toISOString())
1002
1059
 
1003
- expect(await Organizations.hasUnreportedMeteredUsage(db, 'org_1')).toBe(true)
1004
- await expect(Organizations.deleteOrganization(db, 'org_1')).rejects.toThrow(
1005
- Organizations.UnreportedMeteredUsageError,
1006
- )
1007
- expect(await Organizations.get(db, 'org_1')).toBeDefined()
1008
- await db.close()
1009
- })
1060
+ expect(await Organizations.hasUnreportedMeteredUsage(db, 'org_1')).toBe(true)
1061
+ await expect(Organizations.deleteOrganization(db, 'org_1')).rejects.toThrow(
1062
+ Organizations.UnreportedMeteredUsageError,
1063
+ )
1064
+ expect(await Organizations.get(db, 'org_1')).toBeDefined()
1065
+ await db.close()
1066
+ },
1067
+ )
1010
1068
 
1011
- test('behavior: deletes an org with only expired failed fill intents', async () => {
1012
- const db = create()
1013
- await db.migrate()
1014
- await Organizations.create(db, { id: 'org_1', name: 'One' })
1015
- const failed = await SponsoredTransactions.upsert(db, {
1016
- apiKeyId: 'key_1',
1017
- billable: true,
1018
- chainId: Viem.chainId.mainnet,
1019
- environment: 'production',
1020
- orgId: 'org_1',
1021
- projectId: 'prj_1',
1022
- signPayload: `0x${'bb'.repeat(32)}`,
1023
- transaction: `0x76${'cc'.repeat(16)}`,
1024
- })
1025
- await SponsoredTransactions.fail(
1026
- db,
1027
- failed.id,
1028
- new Date(Date.now() - SponsoredTransactions.failedIntentRecoveryTtlMs - 1).toISOString(),
1029
- )
1069
+ test.each([undefined, `0x${'aa'.repeat(32)}`])(
1070
+ 'behavior: recovery expiry cannot clear a signed liability with hash %s',
1071
+ async (transactionHash) => {
1072
+ const db = create()
1073
+ await db.migrate()
1074
+ await Organizations.create(db, { id: 'org_1', name: 'One' })
1075
+ const failed = await SponsoredTransactions.upsert(db, {
1076
+ apiKeyId: 'key_1',
1077
+ billable: true,
1078
+ chainId: Viem.chainId.mainnet,
1079
+ environment: 'production',
1080
+ orgId: 'org_1',
1081
+ projectId: 'prj_1',
1082
+ signPayload: `0x${'bb'.repeat(32)}`,
1083
+ transaction: `0x76${'cc'.repeat(16)}`,
1084
+ transactionHash,
1085
+ })
1086
+ await SponsoredTransactions.fail(
1087
+ db,
1088
+ failed.id,
1089
+ new Date(Date.now() - SponsoredTransactions.failedIntentRecoveryTtlMs - 1).toISOString(),
1090
+ )
1030
1091
 
1031
- expect(await Organizations.hasUnreportedMeteredUsage(db, 'org_1')).toBe(false)
1032
- expect(await Organizations.deleteOrganization(db, 'org_1')).toBe(true)
1033
- await db.close()
1034
- })
1092
+ expect(await Organizations.hasUnreportedMeteredUsage(db, 'org_1')).toBe(true)
1093
+ await expect(Organizations.deleteOrganization(db, 'org_1')).rejects.toThrow(
1094
+ Organizations.UnreportedMeteredUsageError,
1095
+ )
1096
+ await db.close()
1097
+ },
1098
+ )
1035
1099
 
1036
1100
  test('behavior: deletes enabled billing sources', async () => {
1037
1101
  const db = create()
@@ -1,7 +1,6 @@
1
- import { sql, type ExpressionBuilder, type Selectable } from 'kysely'
1
+ import { sql, type Selectable } from 'kysely'
2
2
 
3
3
  import * as Id from '../../internal/Id.js'
4
- import * as Viem from '../../internal/Viem.js'
5
4
  import * as ApiKeyAdmissions from './apiKeyAdmissions.js'
6
5
  import * as ApiKeyOwnerTombstones from './apiKeyOwnerTombstones.js'
7
6
  import * as AuthAccounts from './authAccounts.js'
@@ -9,7 +8,6 @@ import * as RoutesDepositAddresses from './routesDepositAddresses.js'
9
8
  import * as RoutesDeposits from './routesDeposits.js'
10
9
  import * as RoutesIdempotency from './routesIdempotency.js'
11
10
  import * as RoutesTransfers from './routesTransfers.js'
12
- import * as SponsoredTransactions from './sponsoredTransactions.js'
13
11
  import * as Users from './users.js'
14
12
  import type * as Db from '../Db.js'
15
13
  import type * as db_Schema from '../Schema.js'
@@ -139,7 +137,7 @@ export declare namespace createOwned {
139
137
  *
140
138
  * @param db - The database.
141
139
  * @param id - The organization id (`org_…`).
142
- * @param options - Post-commit lifecycle hooks.
140
+ * @param options - Deletion lifecycle hooks.
143
141
  * @returns Whether the organization existed and was deleted.
144
142
  */
145
143
  export async function deleteOrganization(
@@ -149,25 +147,9 @@ export async function deleteOrganization(
149
147
  ): Promise<boolean> {
150
148
  const result = await RoutesDeposits.withSubsidySettlement(db, {
151
149
  fn: async (tx) => {
152
- const failedSince = new Date(
153
- Date.now() - SponsoredTransactions.failedIntentRecoveryTtlMs,
154
- ).toISOString()
155
- const unreportedSponsorship = await tx.kysely
156
- .selectFrom('sponsored_transactions')
157
- .select('id')
158
- .where('orgId', '=', id)
159
- .where('billable', '=', true)
160
- .where('chainId', '=', Viem.chainId.mainnet)
161
- .where('meterReportedAt', 'is', null)
162
- .where(unreportedSponsorshipStatus(failedSince))
163
- .limit(1)
164
- .executeTakeFirst()
165
- const [unreportedDepositSubsidy, unreportedTransferSubsidy] = await Promise.all([
166
- RoutesDeposits.hasUnreportedSubsidies(tx, { orgId: id }),
167
- RoutesTransfers.hasUnreportedSubsidies(tx, id),
168
- ])
169
- if (unreportedSponsorship || unreportedDepositSubsidy || unreportedTransferSubsidy)
170
- throw new UnreportedMeteredUsageError()
150
+ // Fence new commitments before checking liabilities; a rejected deletion rolls back the fence.
151
+ await ApiKeyOwnerTombstones.markDeleted(tx, { orgId: id })
152
+ if (await hasUnreportedMeteredUsage(tx, id)) throw new UnreportedMeteredUsageError()
171
153
  if (await RoutesIdempotency.hasUnattributedInFlightClaim(tx))
172
154
  throw new IrrevocableDepositAddressError()
173
155
  if (await RoutesIdempotency.hasInFlightDepositAddress(tx, id))
@@ -180,7 +162,6 @@ export async function deleteOrganization(
180
162
  now: new Date().toISOString(),
181
163
  orgId: id,
182
164
  })
183
- await ApiKeyOwnerTombstones.markDeleted(tx, { orgId: id })
184
165
  await ApiKeyAdmissions.releaseOwner(tx, { orgId: id })
185
166
  await tx.kysely
186
167
  .deleteFrom('webhook_subscriptions')
@@ -201,6 +182,8 @@ export async function deleteOrganization(
201
182
  .deleteFrom('organizations')
202
183
  .where('id', '=', id)
203
184
  .executeTakeFirst()
185
+ // Publish external deletion fences before committing the irreversible owner removal.
186
+ if (result.numDeletedRows > 0n) await options.beforeCommit?.()
204
187
  const deactivatedById = new Map(deactivated.map((record) => [record.id, record]))
205
188
  return {
206
189
  deactivated: previous.flatMap((previous) => {
@@ -218,8 +201,10 @@ export async function deleteOrganization(
218
201
  }
219
202
 
220
203
  export declare namespace deleteOrganization {
221
- /** Post-commit organization deletion hooks. */
204
+ /** Organization deletion hooks. */
222
205
  type Options = {
206
+ /** Publishes the KV owner fence before commit; failure rolls back deletion. */
207
+ beforeCommit?: (() => Promise<void>) | undefined
223
208
  /** Receives committed deposit-address deactivation transitions. */
224
209
  onDepositAddressesDeactivated?:
225
210
  | ((transitions: readonly DepositAddressDeactivation[]) => Promise<void> | void)
@@ -237,17 +222,13 @@ export declare namespace deleteOrganization {
237
222
 
238
223
  /** Whether an organization has metered usage awaiting Stripe settlement. */
239
224
  export async function hasUnreportedMeteredUsage(db: Db.Db, id: string): Promise<boolean> {
240
- const failedSince = new Date(
241
- Date.now() - SponsoredTransactions.failedIntentRecoveryTtlMs,
242
- ).toISOString()
225
+ // Timeouts and recovery cutoffs do not revoke signatures. Only acknowledged billing clears a billable commitment, on any chain.
243
226
  const sponsorship = await db.kysely
244
227
  .selectFrom('sponsored_transactions')
245
228
  .select('id')
246
229
  .where('orgId', '=', id)
247
230
  .where('billable', '=', true)
248
- .where('chainId', '=', Viem.chainId.mainnet)
249
231
  .where('meterReportedAt', 'is', null)
250
- .where(unreportedSponsorshipStatus(failedSince))
251
232
  .limit(1)
252
233
  .executeTakeFirst()
253
234
  if (sponsorship) return true
@@ -585,19 +566,6 @@ export declare namespace upsert {
585
566
  }
586
567
  }
587
568
 
588
- /** Blocks rows that can still settle or recover into billable mainnet spend. */
589
- function unreportedSponsorshipStatus(failedSince: string) {
590
- return (eb: ExpressionBuilder<Db.Database, 'sponsored_transactions'>) =>
591
- eb.or([
592
- eb('status', '!=', 'failed'),
593
- eb.and([
594
- eb('status', '=', 'failed'),
595
- eb('transactionHash', 'is', null),
596
- eb('finalizedAt', '>=', failedSince),
597
- ]),
598
- ])
599
- }
600
-
601
569
  /** Organization deletion is blocked by a provider subsidy that cannot be revoked. */
602
570
  export class IrrevocableDepositAddressError extends Error {
603
571
  override name = 'Organizations.IrrevocableDepositAddressError'
@@ -27,6 +27,7 @@ export type MeterEventTable = {
27
27
  deltaCount: Count
28
28
  environment: Environment
29
29
  error: string | null
30
+ eventTimestamp: string | null
30
31
  firstAttemptedAt: string
31
32
  identifier: string
32
33
  orgId: string
@@ -135,6 +136,7 @@ export async function insertPending(db: Db.Db, input: insertPending.Input): Prom
135
136
  deltaCount: input.deltaCount,
136
137
  environment: input.environment,
137
138
  error: null,
139
+ eventTimestamp: input.eventTimestamp,
138
140
  firstAttemptedAt: now,
139
141
  identifier: input.identifier,
140
142
  orgId: input.orgId,
@@ -159,6 +161,8 @@ export declare namespace insertPending {
159
161
  deltaCount: number
160
162
  /** Environment the requests were served under. */
161
163
  environment: Environment
164
+ /** Timestamp sent with this frozen Stripe meter event (ISO 8601). */
165
+ eventTimestamp: string
162
166
  /** Deterministic id; also the Stripe identifier and idempotency key. */
163
167
  identifier: string
164
168
  /** Organization id (`org_…`). */
@@ -211,7 +215,8 @@ export function settle(db: Db.Db, identifier: string, at: string): Promise<boole
211
215
  }
212
216
 
213
217
  /**
214
- * Records a transient failure on a pending event; it stays pending for retry.
218
+ * Records failure detail on a pending event; it stays visible for retry or
219
+ * manual reconciliation.
215
220
  *
216
221
  * @param db - The database.
217
222
  * @param identifier - The event identifier.
@@ -233,5 +238,11 @@ function toBucket(row: Selectable<BucketTable>): Bucket {
233
238
 
234
239
  /** Maps a meter-event row to its domain record. */
235
240
  function toMeterEvent(row: Selectable<MeterEventTable>): MeterEvent {
236
- return { ...row, deltaCount: Number(row.deltaCount), sequence: Number(row.sequence) }
241
+ const { eventTimestamp, ...record } = row
242
+ return {
243
+ ...record,
244
+ deltaCount: Number(row.deltaCount),
245
+ ...(eventTimestamp === null ? {} : { eventTimestamp }),
246
+ sequence: Number(row.sequence),
247
+ }
237
248
  }
@@ -1360,6 +1360,140 @@ describe('reward execution fencing and transaction journal', () => {
1360
1360
  })
1361
1361
  })
1362
1362
 
1363
+ describe('latestDelivered', () => {
1364
+ test('returns the newest delivered run among several', async () => {
1365
+ const db = TestApp.database()
1366
+ const runs = await seedRunSequence(db)
1367
+ await deliver(db, runs[0])
1368
+ await deliver(db, runs[1])
1369
+
1370
+ const latest = await RewardRuns.latestDelivered(db, { chainId: 4217, vaultAddress })
1371
+
1372
+ expect(latest?.endsAt).toBe('2000000400')
1373
+ })
1374
+ })
1375
+
1376
+ describe('latestSummary', () => {
1377
+ test('returns the run with the newest start whatever its phase', async () => {
1378
+ const db = TestApp.database()
1379
+ const runs = await seedRunSequence(db)
1380
+ await deliver(db, runs[0])
1381
+
1382
+ const latest = await RewardRuns.latestSummary(db, { chainId: 4217, vaultAddress })
1383
+
1384
+ expect([latest?.id, latest?.phase]).toEqual([runs[2].id, 'indexing'])
1385
+ })
1386
+ })
1387
+
1388
+ describe('latestForIntent', () => {
1389
+ test('returns the newest attempt among equally ranked states', async () => {
1390
+ const db = TestApp.database()
1391
+ await seedCampaign(db)
1392
+ const run = await RewardRuns.ensure(db, {
1393
+ chainId: 4217,
1394
+ config,
1395
+ endsAt: 2_000_000_300,
1396
+ startsAfter: 2_000_000_000,
1397
+ vaultAddress,
1398
+ })
1399
+ const signerIntent = targetYieldIntent()
1400
+ const intentId = Signer.id(signerIntent)
1401
+ const expireAttempt = async (options: { nonce: string; replacementOf?: string }) => {
1402
+ const attempt = await RewardTransactionAttempts.create(db, {
1403
+ chainId: 4217,
1404
+ intent: { id: intentId, operation: 'targetYield', payload: signerIntent },
1405
+ replacementOf: options.replacementOf,
1406
+ runId: run.id,
1407
+ signer,
1408
+ vaultAddress,
1409
+ })
1410
+ await RewardTransactionAttempts.recordSignature(db, {
1411
+ expiresAt: '2026-01-01T00:00:00.000Z',
1412
+ id: attempt.id,
1413
+ nonce: options.nonce,
1414
+ signedBytes: '0x01',
1415
+ transactionHash: `0x${options.nonce.repeat(64)}`,
1416
+ })
1417
+ await RewardTransactionAttempts.expire(db, attempt.id)
1418
+ return attempt
1419
+ }
1420
+ const older = await expireAttempt({ nonce: '1' })
1421
+ const newer = await expireAttempt({ nonce: '2', replacementOf: older.id })
1422
+ await setCreatedAt(db, {
1423
+ [older.id]: '2026-01-01T00:00:00.000Z',
1424
+ [newer.id]: '2026-01-02T00:00:00.000Z',
1425
+ })
1426
+
1427
+ await expect(
1428
+ RewardTransactionAttempts.latestForIntent(db, { intentId, runId: run.id }),
1429
+ ).resolves.toMatchObject({ id: newer.id, state: 'expired' })
1430
+ })
1431
+ })
1432
+
1433
+ describe('latestRecoverable', () => {
1434
+ test('returns the newest recoverable attempt for a run operation', async () => {
1435
+ const db = TestApp.database()
1436
+ await seedCampaign(db)
1437
+ const run = await RewardRuns.ensure(db, {
1438
+ chainId: 4217,
1439
+ config,
1440
+ endsAt: 2_000_000_300,
1441
+ startsAfter: 2_000_000_000,
1442
+ vaultAddress,
1443
+ })
1444
+ const signerIntent = targetYieldIntent()
1445
+ const [older, newer] = await Promise.all(
1446
+ [`0x${'11'.repeat(32)}` as const, `0x${'22'.repeat(32)}` as const].map((id) =>
1447
+ RewardTransactionAttempts.create(db, {
1448
+ chainId: 4217,
1449
+ intent: { id, operation: 'targetYield', payload: signerIntent },
1450
+ runId: run.id,
1451
+ signer,
1452
+ vaultAddress,
1453
+ }),
1454
+ ),
1455
+ )
1456
+ if (!older || !newer) throw new Error('Expected two attempts.')
1457
+ await setCreatedAt(db, {
1458
+ [older.id]: '2026-01-01T00:00:00.000Z',
1459
+ [newer.id]: '2026-01-02T00:00:00.000Z',
1460
+ })
1461
+
1462
+ await expect(
1463
+ RewardTransactionAttempts.latestRecoverable(db, { operation: 'targetYield', runId: run.id }),
1464
+ ).resolves.toMatchObject({ id: newer.id, state: 'created' })
1465
+ })
1466
+ })
1467
+
1468
+ function targetYieldIntent() {
1469
+ return {
1470
+ controller: '0x7000000000000000000000000000000000000007',
1471
+ domain: {
1472
+ chainId: 4217,
1473
+ earnShare: shareAddress,
1474
+ earnVault: vaultAddress,
1475
+ factory: '0x8000000000000000000000000000000000000008',
1476
+ treasury: '0x0000000000000000000000000000000000000000',
1477
+ },
1478
+ funders: [funder],
1479
+ maxEarnShareSupply: '100',
1480
+ operation: 'targetYield' as const,
1481
+ requestedAssets: ['5'],
1482
+ } satisfies Signer.Request['intent']
1483
+ }
1484
+
1485
+ async function setCreatedAt(
1486
+ db: ReturnType<typeof TestApp.database>,
1487
+ createdAt: { [id: string]: string },
1488
+ ) {
1489
+ for (const [id, value] of Object.entries(createdAt))
1490
+ await db.kysely
1491
+ .updateTable('reward_transaction_attempts')
1492
+ .set({ createdAt: value })
1493
+ .where('id', '=', id)
1494
+ .execute()
1495
+ }
1496
+
1363
1497
  async function seedCampaign(db: ReturnType<typeof TestApp.database>) {
1364
1498
  await seedVault(db)
1365
1499
  return RewardCampaigns.upsert(db, {
@@ -1386,3 +1520,32 @@ async function seedVault(db: ReturnType<typeof TestApp.database>) {
1386
1520
  zones: [],
1387
1521
  })
1388
1522
  }
1523
+
1524
+ /** Seeds three consecutive runs, advancing the campaign boundary between them. */
1525
+ async function seedRunSequence(db: ReturnType<typeof TestApp.database>) {
1526
+ await seedCampaign(db)
1527
+ const runs = []
1528
+ for (const startsAfter of [2_000_000_000, 2_000_000_200, 2_000_000_400]) {
1529
+ runs.push(
1530
+ await RewardRuns.ensure(db, {
1531
+ chainId: 4217,
1532
+ config,
1533
+ endsAt: startsAfter + 200,
1534
+ startsAfter,
1535
+ vaultAddress,
1536
+ }),
1537
+ )
1538
+ if (startsAfter === 2_000_000_400) break
1539
+ await RewardCampaigns.advance(db, {
1540
+ chainId: 4217,
1541
+ deliveredThrough: startsAfter + 200,
1542
+ expectedDeliveredThrough: startsAfter,
1543
+ vaultAddress,
1544
+ })
1545
+ }
1546
+ return runs as [RewardRuns.Record, RewardRuns.Record, RewardRuns.Record]
1547
+ }
1548
+
1549
+ async function deliver(db: ReturnType<typeof TestApp.database>, run: RewardRuns.Record) {
1550
+ await RewardRuns.transition(db, { fence: run.fence, id: run.id, patch: {}, phase: 'delivered' })
1551
+ }
@@ -14,6 +14,20 @@ const input = {
14
14
  walletAddress: Schema.Address.parse(`0x${'Bb'.repeat(20)}`),
15
15
  } as const satisfies RewardEligibilityAssociations.upsert.Options
16
16
 
17
+ describe('get', () => {
18
+ test('normalizes addresses and scopes registration by chain, vault, and wallet', async () => {
19
+ const db = TestApp.database()
20
+ const { record } = await RewardEligibilityAssociations.upsert(db, input)
21
+ await expect(RewardEligibilityAssociations.get(db, input)).resolves.toEqual(record)
22
+ for (const selector of [
23
+ { ...input, chainId: 42431 },
24
+ { ...input, vaultAddress: input.walletAddress },
25
+ { ...input, walletAddress: input.vaultAddress },
26
+ ])
27
+ await expect(RewardEligibilityAssociations.get(db, selector)).resolves.toBeUndefined()
28
+ })
29
+ })
30
+
17
31
  describe('upsert', () => {
18
32
  test('creates a normalized association and refreshes its latest registration', async () => {
19
33
  vi.useFakeTimers()
@@ -22,6 +22,30 @@ export type Table = Omit<
22
22
  /** A stored reward eligibility association. */
23
23
  export type Record = db_Schema.RewardEligibilityAssociation
24
24
 
25
+ /** Reads one wallet's eligibility registration for a vault. */
26
+ export async function get(db: Db.Db, options: get.Options): Promise<Record | undefined> {
27
+ const row = await db.kysely
28
+ .selectFrom('reward_eligibility_associations')
29
+ .selectAll()
30
+ .where('chainId', '=', String(options.chainId))
31
+ .where('vaultAddress', '=', normalize(options.vaultAddress))
32
+ .where('walletAddress', '=', normalize(options.walletAddress))
33
+ .executeTakeFirst()
34
+ return row ? toRecord(row) : undefined
35
+ }
36
+
37
+ export declare namespace get {
38
+ /** One vault and wallet registration selector. */
39
+ type Options = {
40
+ /** Chain containing the vault. */
41
+ chainId: number
42
+ /** Earn vault address. */
43
+ vaultAddress: Address
44
+ /** Wallet whose eligibility is read. */
45
+ walletAddress: Address
46
+ }
47
+ }
48
+
25
49
  /** Inserts or refreshes one eligibility association. */
26
50
  export async function upsert(db: Db.Db, options: upsert.Options): Promise<upsert.Result> {
27
51
  const now = new Date().toISOString()