tapimo 0.15.1 → 0.18.1

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 (709) 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 +893 -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 +70 -70
  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 +529 -76
  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 +157 -157
  45. package/dist/admin/index.d.ts +0 -1
  46. package/dist/admin/index.d.ts.map +1 -1
  47. package/dist/admin/index.js +0 -1
  48. package/dist/admin/index.js.map +1 -1
  49. package/dist/admin/ui.generated.d.ts +1 -1
  50. package/dist/admin/ui.generated.d.ts.map +1 -1
  51. package/dist/admin/ui.generated.js +205 -201
  52. package/dist/admin/ui.generated.js.map +1 -1
  53. package/dist/analytics/Analytics.d.ts.map +1 -1
  54. package/dist/analytics/Analytics.js +65 -1
  55. package/dist/analytics/Analytics.js.map +1 -1
  56. package/dist/analytics/tables/requestEvents.d.ts +1 -1
  57. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  58. package/dist/analytics/tables/requestEvents.js +58 -59
  59. package/dist/analytics/tables/requestEvents.js.map +1 -1
  60. package/dist/apps/data/App.d.ts +2709 -2670
  61. package/dist/apps/data/App.d.ts.map +1 -1
  62. package/dist/apps/data/routes/activities.d.ts +357 -357
  63. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  64. package/dist/apps/data/routes/activities.js +50 -0
  65. package/dist/apps/data/routes/activities.js.map +1 -1
  66. package/dist/apps/data/routes/addresses.d.ts +248 -248
  67. package/dist/apps/data/routes/balances.d.ts +22 -22
  68. package/dist/apps/data/routes/balances.d.ts.map +1 -1
  69. package/dist/apps/data/routes/balances.js +5 -7
  70. package/dist/apps/data/routes/balances.js.map +1 -1
  71. package/dist/apps/data/routes/blocks.d.ts +125 -125
  72. package/dist/apps/data/routes/coingecko.d.ts +54 -54
  73. package/dist/apps/data/routes/earn.d.ts +103 -12
  74. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  75. package/dist/apps/data/routes/earn.js +456 -220
  76. package/dist/apps/data/routes/earn.js.map +1 -1
  77. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  78. package/dist/apps/data/routes/exchanges.js +267 -97
  79. package/dist/apps/data/routes/exchanges.js.map +1 -1
  80. package/dist/apps/data/routes/fee-amm.d.ts +109 -127
  81. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  82. package/dist/apps/data/routes/fee-amm.js +83 -54
  83. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  84. package/dist/apps/data/routes/indexer.d.ts +43 -43
  85. package/dist/apps/data/routes/receipts.d.ts +235 -235
  86. package/dist/apps/data/routes/rpc.d.ts +30 -30
  87. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  88. package/dist/apps/data/routes/tokens.js +11 -6
  89. package/dist/apps/data/routes/tokens.js.map +1 -1
  90. package/dist/apps/data/routes/transactions.d.ts +2 -0
  91. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  92. package/dist/apps/data/routes/transactions.js +30 -22
  93. package/dist/apps/data/routes/transactions.js.map +1 -1
  94. package/dist/apps/data/routes/transfers.d.ts +77 -77
  95. package/dist/apps/data/routes/valuation.d.ts +32 -32
  96. package/dist/apps/data/routes/verified-tokens.d.ts +86 -86
  97. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  98. package/dist/apps/data/routes/webhooks.js +1 -1
  99. package/dist/apps/data/routes/webhooks.js.map +1 -1
  100. package/dist/apps/data/routes/zones.d.ts +31 -31
  101. package/dist/apps/management/App.d.ts +2909 -2064
  102. package/dist/apps/management/App.d.ts.map +1 -1
  103. package/dist/apps/management/App.js +2 -0
  104. package/dist/apps/management/App.js.map +1 -1
  105. package/dist/apps/management/Billing.d.ts +2 -4
  106. package/dist/apps/management/Billing.d.ts.map +1 -1
  107. package/dist/apps/management/Billing.js +65 -26
  108. package/dist/apps/management/Billing.js.map +1 -1
  109. package/dist/apps/management/routes/api-keys.d.ts +257 -245
  110. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  111. package/dist/apps/management/routes/api-keys.js +70 -11
  112. package/dist/apps/management/routes/api-keys.js.map +1 -1
  113. package/dist/apps/management/routes/billing.d.ts +84 -84
  114. package/dist/apps/management/routes/cli.d.ts +912 -0
  115. package/dist/apps/management/routes/cli.d.ts.map +1 -0
  116. package/dist/apps/management/routes/cli.js +416 -0
  117. package/dist/apps/management/routes/cli.js.map +1 -0
  118. package/dist/apps/management/routes/faucet.d.ts +8 -8
  119. package/dist/apps/management/routes/invitations.d.ts +138 -138
  120. package/dist/apps/management/routes/invite-links.d.ts +172 -172
  121. package/dist/apps/management/routes/members.d.ts +16 -16
  122. package/dist/apps/management/routes/orgs.d.ts +104 -104
  123. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  124. package/dist/apps/management/routes/orgs.js +8 -2
  125. package/dist/apps/management/routes/orgs.js.map +1 -1
  126. package/dist/apps/management/routes/projects.d.ts +125 -125
  127. package/dist/apps/management/routes/usage.d.ts +8 -8
  128. package/dist/apps/management/routes/verified-token-requests.d.ts +86 -86
  129. package/dist/apps/management/routes/webhooks.d.ts +485 -485
  130. package/dist/apps/mpp/App.d.ts +44 -44
  131. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
  132. package/dist/apps/mpp/internal/Policy.js +4 -2
  133. package/dist/apps/mpp/internal/Policy.js.map +1 -1
  134. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
  135. package/dist/apps/mpp/internal/Sponsorship.js +6 -4
  136. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
  137. package/dist/apps/relay/App.d.ts +8 -0
  138. package/dist/apps/relay/App.d.ts.map +1 -1
  139. package/dist/apps/relay/App.js +16 -4
  140. package/dist/apps/relay/App.js.map +1 -1
  141. package/dist/apps/relay/Sponsorships.d.ts +4 -6
  142. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  143. package/dist/apps/relay/Sponsorships.js +71 -60
  144. package/dist/apps/relay/Sponsorships.js.map +1 -1
  145. package/dist/apps/routes/Access.d.ts +53 -0
  146. package/dist/apps/routes/Access.d.ts.map +1 -1
  147. package/dist/apps/routes/Access.js +121 -0
  148. package/dist/apps/routes/Access.js.map +1 -1
  149. package/dist/apps/routes/App.d.ts +397 -158
  150. package/dist/apps/routes/App.d.ts.map +1 -1
  151. package/dist/apps/routes/App.js.map +1 -1
  152. package/dist/apps/routes/routes/chains.d.ts +25 -25
  153. package/dist/apps/routes/routes/deposit-addresses.d.ts +169 -61
  154. package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -1
  155. package/dist/apps/routes/routes/deposit-addresses.js +217 -32
  156. package/dist/apps/routes/routes/deposit-addresses.js.map +1 -1
  157. package/dist/apps/routes/routes/quotes.d.ts +171 -81
  158. package/dist/apps/routes/routes/quotes.d.ts.map +1 -1
  159. package/dist/apps/routes/routes/quotes.js +101 -27
  160. package/dist/apps/routes/routes/quotes.js.map +1 -1
  161. package/dist/apps/routes/routes/transfers.d.ts +532 -480
  162. package/dist/apps/routes/routes/transfers.d.ts.map +1 -1
  163. package/dist/apps/routes/routes/transfers.js +182 -37
  164. package/dist/apps/routes/routes/transfers.js.map +1 -1
  165. package/dist/cli/ApiKeys.d.ts +120 -0
  166. package/dist/cli/ApiKeys.d.ts.map +1 -0
  167. package/dist/cli/ApiKeys.js +138 -0
  168. package/dist/cli/ApiKeys.js.map +1 -0
  169. package/dist/cli/Cli.d.ts +92 -34
  170. package/dist/cli/Cli.d.ts.map +1 -1
  171. package/dist/cli/Cli.js +188 -11
  172. package/dist/cli/Cli.js.map +1 -1
  173. package/dist/cli/Credentials.d.ts +95 -0
  174. package/dist/cli/Credentials.d.ts.map +1 -0
  175. package/dist/cli/Credentials.js +110 -0
  176. package/dist/cli/Credentials.js.map +1 -0
  177. package/dist/cli/Spec.d.ts +59 -0
  178. package/dist/cli/Spec.d.ts.map +1 -0
  179. package/dist/cli/Spec.js +77 -0
  180. package/dist/cli/Spec.js.map +1 -0
  181. package/dist/cli/bin.js +5 -1
  182. package/dist/cli/bin.js.map +1 -1
  183. package/dist/cli/commands/admin.d.ts +5 -5
  184. package/dist/cli/commands/admin.d.ts.map +1 -1
  185. package/dist/cli/commands/auth.d.ts +73 -0
  186. package/dist/cli/commands/auth.d.ts.map +1 -0
  187. package/dist/cli/commands/auth.js +204 -0
  188. package/dist/cli/commands/auth.js.map +1 -0
  189. package/dist/cli/commands/keys.d.ts +17 -0
  190. package/dist/cli/commands/keys.d.ts.map +1 -0
  191. package/dist/cli/commands/keys.js +109 -0
  192. package/dist/cli/commands/keys.js.map +1 -0
  193. package/dist/cloudflare.d.ts +27 -2
  194. package/dist/cloudflare.d.ts.map +1 -1
  195. package/dist/cloudflare.js +144 -17
  196. package/dist/cloudflare.js.map +1 -1
  197. package/dist/db/Db.d.ts +23 -0
  198. package/dist/db/Db.d.ts.map +1 -1
  199. package/dist/db/Db.js +413 -1
  200. package/dist/db/Db.js.map +1 -1
  201. package/dist/db/Schema.d.ts +44 -1
  202. package/dist/db/Schema.d.ts.map +1 -1
  203. package/dist/db/Schema.js +56 -3
  204. package/dist/db/Schema.js.map +1 -1
  205. package/dist/db/tables/apiKeyAdmissions.d.ts +28 -2
  206. package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -1
  207. package/dist/db/tables/apiKeyAdmissions.js +65 -9
  208. package/dist/db/tables/apiKeyAdmissions.js.map +1 -1
  209. package/dist/db/tables/apiKeyOwnerTombstones.d.ts +2 -0
  210. package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -1
  211. package/dist/db/tables/apiKeyOwnerTombstones.js +2 -2
  212. package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -1
  213. package/dist/db/tables/authAccounts.d.ts.map +1 -1
  214. package/dist/db/tables/authAccounts.js +1 -0
  215. package/dist/db/tables/authAccounts.js.map +1 -1
  216. package/dist/db/tables/earnVaults.d.ts +5 -1
  217. package/dist/db/tables/earnVaults.d.ts.map +1 -1
  218. package/dist/db/tables/earnVaults.js +12 -1
  219. package/dist/db/tables/earnVaults.js.map +1 -1
  220. package/dist/db/tables/organizations.d.ts +4 -2
  221. package/dist/db/tables/organizations.d.ts.map +1 -1
  222. package/dist/db/tables/organizations.js +8 -34
  223. package/dist/db/tables/organizations.js.map +1 -1
  224. package/dist/db/tables/requestUsage.d.ts +5 -1
  225. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  226. package/dist/db/tables/requestUsage.js +10 -2
  227. package/dist/db/tables/requestUsage.js.map +1 -1
  228. package/dist/db/tables/rewardEligibilityAssociations.d.ts +13 -0
  229. package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -1
  230. package/dist/db/tables/rewardEligibilityAssociations.js +11 -0
  231. package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -1
  232. package/dist/db/tables/rewardRuns.d.ts.map +1 -1
  233. package/dist/db/tables/rewardRuns.js +4 -0
  234. package/dist/db/tables/rewardRuns.js.map +1 -1
  235. package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -1
  236. package/dist/db/tables/rewardTransactionAttempts.js +2 -0
  237. package/dist/db/tables/rewardTransactionAttempts.js.map +1 -1
  238. package/dist/db/tables/routesDepositAddresses.d.ts +29 -0
  239. package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -1
  240. package/dist/db/tables/routesDepositAddresses.js +84 -31
  241. package/dist/db/tables/routesDepositAddresses.js.map +1 -1
  242. package/dist/db/tables/routesDeposits.d.ts.map +1 -1
  243. package/dist/db/tables/routesDeposits.js +31 -21
  244. package/dist/db/tables/routesDeposits.js.map +1 -1
  245. package/dist/db/tables/routesIdempotency.d.ts.map +1 -1
  246. package/dist/db/tables/routesIdempotency.js +2 -0
  247. package/dist/db/tables/routesIdempotency.js.map +1 -1
  248. package/dist/db/tables/routesPolicies.d.ts +58 -0
  249. package/dist/db/tables/routesPolicies.d.ts.map +1 -0
  250. package/dist/db/tables/routesPolicies.js +198 -0
  251. package/dist/db/tables/routesPolicies.js.map +1 -0
  252. package/dist/db/tables/routesTransferSubsidies.d.ts +22 -0
  253. package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -1
  254. package/dist/db/tables/routesTransferSubsidies.js +41 -0
  255. package/dist/db/tables/routesTransferSubsidies.js.map +1 -1
  256. package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -1
  257. package/dist/db/tables/routesTransferSubsidyNonces.js +12 -4
  258. package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -1
  259. package/dist/db/tables/routesTransfers.d.ts +26 -1
  260. package/dist/db/tables/routesTransfers.d.ts.map +1 -1
  261. package/dist/db/tables/routesTransfers.js +36 -6
  262. package/dist/db/tables/routesTransfers.js.map +1 -1
  263. package/dist/db/tables/sponsoredTransactions.d.ts +45 -13
  264. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  265. package/dist/db/tables/sponsoredTransactions.js +144 -33
  266. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  267. package/dist/db/tables/users.d.ts +2 -0
  268. package/dist/db/tables/users.d.ts.map +1 -1
  269. package/dist/db/tables/users.js +11 -0
  270. package/dist/db/tables/users.js.map +1 -1
  271. package/dist/handlers/internal/multisig.d.ts +1 -1
  272. package/dist/handlers/internal/multisig.d.ts.map +1 -1
  273. package/dist/handlers/internal/multisig.js +3 -2
  274. package/dist/handlers/internal/multisig.js.map +1 -1
  275. package/dist/handlers/relay.d.ts +2 -0
  276. package/dist/handlers/relay.d.ts.map +1 -1
  277. package/dist/handlers/relay.js +34 -15
  278. package/dist/handlers/relay.js.map +1 -1
  279. package/dist/internal/Auth.d.ts +57 -6
  280. package/dist/internal/Auth.d.ts.map +1 -1
  281. package/dist/internal/Auth.js +182 -78
  282. package/dist/internal/Auth.js.map +1 -1
  283. package/dist/internal/BetterAuth.d.ts +22 -0
  284. package/dist/internal/BetterAuth.d.ts.map +1 -1
  285. package/dist/internal/BetterAuth.js +17 -14
  286. package/dist/internal/BetterAuth.js.map +1 -1
  287. package/dist/internal/Cache.d.ts +5 -0
  288. package/dist/internal/Cache.d.ts.map +1 -1
  289. package/dist/internal/Cache.js +3 -1
  290. package/dist/internal/Cache.js.map +1 -1
  291. package/dist/internal/CliAuth.d.ts +243 -0
  292. package/dist/internal/CliAuth.d.ts.map +1 -0
  293. package/dist/internal/CliAuth.js +249 -0
  294. package/dist/internal/CliAuth.js.map +1 -0
  295. package/dist/internal/EarnSharePrices.d.ts +1 -1
  296. package/dist/internal/EarnSharePrices.d.ts.map +1 -1
  297. package/dist/internal/EarnSharePrices.js +7 -3
  298. package/dist/internal/EarnSharePrices.js.map +1 -1
  299. package/dist/internal/EarnVaults.d.ts +47 -0
  300. package/dist/internal/EarnVaults.d.ts.map +1 -1
  301. package/dist/internal/EarnVaults.js +188 -4
  302. package/dist/internal/EarnVaults.js.map +1 -1
  303. package/dist/internal/EarnWithdrawals.d.ts +73 -0
  304. package/dist/internal/EarnWithdrawals.d.ts.map +1 -0
  305. package/dist/internal/EarnWithdrawals.js +189 -0
  306. package/dist/internal/EarnWithdrawals.js.map +1 -0
  307. package/dist/internal/ExecutionContext.d.ts +21 -0
  308. package/dist/internal/ExecutionContext.d.ts.map +1 -0
  309. package/dist/internal/ExecutionContext.js +16 -0
  310. package/dist/internal/ExecutionContext.js.map +1 -0
  311. package/dist/internal/Log.d.ts +7 -3
  312. package/dist/internal/Log.d.ts.map +1 -1
  313. package/dist/internal/Log.js +163 -130
  314. package/dist/internal/Log.js.map +1 -1
  315. package/dist/internal/MetricSink.d.ts.map +1 -1
  316. package/dist/internal/MetricSink.js +26 -1
  317. package/dist/internal/MetricSink.js.map +1 -1
  318. package/dist/internal/RateLimit.d.ts +67 -0
  319. package/dist/internal/RateLimit.d.ts.map +1 -1
  320. package/dist/internal/RateLimit.js +174 -27
  321. package/dist/internal/RateLimit.js.map +1 -1
  322. package/dist/internal/Store.d.ts +6 -0
  323. package/dist/internal/Store.d.ts.map +1 -1
  324. package/dist/internal/Store.js +4 -5
  325. package/dist/internal/Store.js.map +1 -1
  326. package/dist/internal/Timing.d.ts +6 -0
  327. package/dist/internal/Timing.d.ts.map +1 -1
  328. package/dist/internal/Timing.js +21 -1
  329. package/dist/internal/Timing.js.map +1 -1
  330. package/dist/internal/Tron.d.ts +124 -0
  331. package/dist/internal/Tron.d.ts.map +1 -0
  332. package/dist/internal/Tron.js +202 -0
  333. package/dist/internal/Tron.js.map +1 -0
  334. package/dist/internal/Viem.d.ts +4 -0
  335. package/dist/internal/Viem.d.ts.map +1 -1
  336. package/dist/internal/Viem.js +25 -6
  337. package/dist/internal/Viem.js.map +1 -1
  338. package/dist/internal/rewards/Read.d.ts +2 -2
  339. package/dist/internal/rewards/Read.d.ts.map +1 -1
  340. package/dist/internal/rewards/Read.js +11 -2
  341. package/dist/internal/rewards/Read.js.map +1 -1
  342. package/dist/internal/routes/Action.d.ts +27 -0
  343. package/dist/internal/routes/Action.d.ts.map +1 -1
  344. package/dist/internal/routes/Action.js +49 -1
  345. package/dist/internal/routes/Action.js.map +1 -1
  346. package/dist/internal/routes/Chain.d.ts +2 -0
  347. package/dist/internal/routes/Chain.d.ts.map +1 -1
  348. package/dist/internal/routes/Chain.js +4 -0
  349. package/dist/internal/routes/Chain.js.map +1 -1
  350. package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
  351. package/dist/internal/routes/DepositAddress.js +5 -0
  352. package/dist/internal/routes/DepositAddress.js.map +1 -1
  353. package/dist/internal/routes/Evidence.d.ts.map +1 -1
  354. package/dist/internal/routes/Evidence.js +6 -2
  355. package/dist/internal/routes/Evidence.js.map +1 -1
  356. package/dist/internal/routes/EvmTransferSettlement.d.ts +17 -0
  357. package/dist/internal/routes/EvmTransferSettlement.d.ts.map +1 -0
  358. package/dist/internal/routes/EvmTransferSettlement.js +196 -0
  359. package/dist/internal/routes/EvmTransferSettlement.js.map +1 -0
  360. package/dist/internal/routes/Policy.d.ts +161 -0
  361. package/dist/internal/routes/Policy.d.ts.map +1 -0
  362. package/dist/internal/routes/Policy.js +249 -0
  363. package/dist/internal/routes/Policy.js.map +1 -0
  364. package/dist/internal/routes/Provider.d.ts +66 -3
  365. package/dist/internal/routes/Provider.d.ts.map +1 -1
  366. package/dist/internal/routes/Provider.js +106 -27
  367. package/dist/internal/routes/Provider.js.map +1 -1
  368. package/dist/internal/routes/Quota.d.ts +57 -0
  369. package/dist/internal/routes/Quota.d.ts.map +1 -0
  370. package/dist/internal/routes/Quota.js +144 -0
  371. package/dist/internal/routes/Quota.js.map +1 -0
  372. package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
  373. package/dist/internal/routes/Reconciliation.js +163 -47
  374. package/dist/internal/routes/Reconciliation.js.map +1 -1
  375. package/dist/internal/routes/SolanaTransferSettlement.d.ts +12 -0
  376. package/dist/internal/routes/SolanaTransferSettlement.d.ts.map +1 -0
  377. package/dist/internal/routes/SolanaTransferSettlement.js +220 -0
  378. package/dist/internal/routes/SolanaTransferSettlement.js.map +1 -0
  379. package/dist/internal/routes/SolanaTransferSubsidy.d.ts +172 -0
  380. package/dist/internal/routes/SolanaTransferSubsidy.d.ts.map +1 -0
  381. package/dist/internal/routes/SolanaTransferSubsidy.js +564 -0
  382. package/dist/internal/routes/SolanaTransferSubsidy.js.map +1 -0
  383. package/dist/internal/routes/Subsidy.d.ts +2 -2
  384. package/dist/internal/routes/Subsidy.d.ts.map +1 -1
  385. package/dist/internal/routes/Subsidy.js +2 -2
  386. package/dist/internal/routes/Subsidy.js.map +1 -1
  387. package/dist/internal/routes/Transfer.d.ts +229 -1
  388. package/dist/internal/routes/Transfer.d.ts.map +1 -1
  389. package/dist/internal/routes/Transfer.js +644 -7
  390. package/dist/internal/routes/Transfer.js.map +1 -1
  391. package/dist/internal/routes/TransferReconciliation.d.ts +6 -0
  392. package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -1
  393. package/dist/internal/routes/TransferReconciliation.js +83 -159
  394. package/dist/internal/routes/TransferReconciliation.js.map +1 -1
  395. package/dist/internal/routes/TransferSettlement.d.ts +45 -0
  396. package/dist/internal/routes/TransferSettlement.d.ts.map +1 -0
  397. package/dist/internal/routes/TransferSettlement.js +2 -0
  398. package/dist/internal/routes/TransferSettlement.js.map +1 -0
  399. package/dist/internal/routes/TransferSubsidy.d.ts +23 -8
  400. package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -1
  401. package/dist/internal/routes/TransferSubsidy.js +64 -5
  402. package/dist/internal/routes/TransferSubsidy.js.map +1 -1
  403. package/dist/internal/routes/TronTransferSettlement.d.ts +12 -0
  404. package/dist/internal/routes/TronTransferSettlement.d.ts.map +1 -0
  405. package/dist/internal/routes/TronTransferSettlement.js +201 -0
  406. package/dist/internal/routes/TronTransferSettlement.js.map +1 -0
  407. package/dist/internal/routes/TronTransferSubsidy.d.ts +174 -0
  408. package/dist/internal/routes/TronTransferSubsidy.d.ts.map +1 -0
  409. package/dist/internal/routes/TronTransferSubsidy.js +439 -0
  410. package/dist/internal/routes/TronTransferSubsidy.js.map +1 -0
  411. package/dist/internal/routes/index.d.ts +3 -0
  412. package/dist/internal/routes/index.d.ts.map +1 -1
  413. package/dist/internal/routes/index.js +3 -0
  414. package/dist/internal/routes/index.js.map +1 -1
  415. package/dist/internal/routes/providers/across.d.ts +3 -0
  416. package/dist/internal/routes/providers/across.d.ts.map +1 -1
  417. package/dist/internal/routes/providers/across.js +11 -0
  418. package/dist/internal/routes/providers/across.js.map +1 -1
  419. package/dist/internal/routes/providers/legacyMesh.d.ts +29 -0
  420. package/dist/internal/routes/providers/legacyMesh.d.ts.map +1 -0
  421. package/dist/internal/routes/providers/legacyMesh.js +474 -0
  422. package/dist/internal/routes/providers/legacyMesh.js.map +1 -0
  423. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts +59 -0
  424. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts.map +1 -0
  425. package/dist/internal/routes/providers/legacyMeshDelivery.js +229 -0
  426. package/dist/internal/routes/providers/legacyMeshDelivery.js.map +1 -0
  427. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts +19 -0
  428. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts.map +1 -0
  429. package/dist/internal/routes/providers/legacyMeshOutbound.js +457 -0
  430. package/dist/internal/routes/providers/legacyMeshOutbound.js.map +1 -0
  431. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts +123 -0
  432. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts.map +1 -0
  433. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js +333 -0
  434. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js.map +1 -0
  435. package/dist/internal/routes/providers/propAmm.d.ts +70 -0
  436. package/dist/internal/routes/providers/propAmm.d.ts.map +1 -0
  437. package/dist/internal/routes/providers/propAmm.js +524 -0
  438. package/dist/internal/routes/providers/propAmm.js.map +1 -0
  439. package/dist/internal/routes/providers/relay.d.ts +3 -0
  440. package/dist/internal/routes/providers/relay.d.ts.map +1 -1
  441. package/dist/internal/routes/providers/relay.js +352 -41
  442. package/dist/internal/routes/providers/relay.js.map +1 -1
  443. package/dist/internal/routes/providers/rhino.d.ts +3 -0
  444. package/dist/internal/routes/providers/rhino.d.ts.map +1 -1
  445. package/dist/internal/routes/providers/rhino.js +11 -0
  446. package/dist/internal/routes/providers/rhino.js.map +1 -1
  447. package/dist/internal/routes/providers/squid.d.ts +3 -0
  448. package/dist/internal/routes/providers/squid.d.ts.map +1 -1
  449. package/dist/internal/routes/providers/squid.js +19 -0
  450. package/dist/internal/routes/providers/squid.js.map +1 -1
  451. package/dist/internal/routes/providers/stargate.d.ts.map +1 -1
  452. package/dist/internal/routes/providers/stargate.js +22 -9
  453. package/dist/internal/routes/providers/stargate.js.map +1 -1
  454. package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -1
  455. package/dist/internal/routes/providers/symbiosis.js +13 -17
  456. package/dist/internal/routes/providers/symbiosis.js.map +1 -1
  457. package/dist/providers/index.d.ts +14 -0
  458. package/dist/providers/index.d.ts.map +1 -1
  459. package/dist/providers/index.js +6 -0
  460. package/dist/providers/index.js.map +1 -1
  461. package/package.json +16 -6
  462. package/src/ApiKey.ts +7 -3
  463. package/src/ApiKeys.test.ts +652 -8
  464. package/src/ApiKeys.ts +191 -11
  465. package/src/App.test.ts +405 -18
  466. package/src/App.ts +51 -15
  467. package/src/Client.test-d.ts +157 -10
  468. package/src/Client.test.ts +4 -4
  469. package/src/Scope.ts +1 -2
  470. package/src/admin/App.ts +11 -5
  471. package/src/admin/apps/api-keys.test.ts +98 -2
  472. package/src/admin/apps/api-keys.ts +21 -12
  473. package/src/admin/apps/earn-vaults.test.ts +76 -7
  474. package/src/admin/apps/earn-vaults.ts +47 -8
  475. package/src/admin/apps/organizations.test.ts +147 -31
  476. package/src/admin/apps/organizations.ts +5 -4
  477. package/src/admin/apps/route-policies.test.ts +220 -0
  478. package/src/admin/apps/route-policies.ts +322 -0
  479. package/src/admin/apps/routes-support.test.ts +107 -2
  480. package/src/admin/apps/routes-support.ts +43 -3
  481. package/src/admin/apps/routes.test.ts +150 -0
  482. package/src/admin/apps/routes.ts +97 -1
  483. package/src/admin/apps/scopes.test.ts +1 -1
  484. package/src/admin/index.ts +0 -1
  485. package/src/admin/ui/plugin.ts +2 -1
  486. package/src/admin/ui/src/components/Dialog.tsx +1 -1
  487. package/src/admin/ui/src/components/EarnVaultForm.tsx +45 -0
  488. package/src/admin/ui/src/components/RoutePicker.tsx +79 -0
  489. package/src/admin/ui/src/lib/earn-vaults.ts +1 -1
  490. package/src/admin/ui/src/lib/route-policies.test.ts +452 -0
  491. package/src/admin/ui/src/lib/route-policies.ts +232 -0
  492. package/src/admin/ui/src/lib/routes.ts +34 -0
  493. package/src/admin/ui/src/routeTree.gen.ts +21 -0
  494. package/src/admin/ui/src/routes/api-keys.tsx +21 -2
  495. package/src/admin/ui/src/routes/early-access.tsx +1 -0
  496. package/src/admin/ui/src/routes/earn.vaults.tsx +1 -0
  497. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +22 -0
  498. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +10 -0
  499. package/src/admin/ui/src/routes/organizations.tsx +1 -0
  500. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +18 -3
  501. package/src/admin/ui/src/routes/route-policies.tsx +678 -0
  502. package/src/admin/ui/src/routes/routes.tsx +85 -2
  503. package/src/admin/ui/src/routes/routes_.support.tsx +6 -22
  504. package/src/admin/ui/src/routes/subsidies.tsx +1 -0
  505. package/src/admin/ui/src/routes/verified-tokens.tsx +1 -0
  506. package/src/admin/ui.generated.ts +258 -202
  507. package/src/analytics/Analytics.test.ts +4 -50
  508. package/src/analytics/Analytics.ts +65 -1
  509. package/src/analytics/tables/requestEvents.test.ts +402 -1
  510. package/src/analytics/tables/requestEvents.ts +62 -93
  511. package/src/apps/data/routes/activities.test.ts +315 -14
  512. package/src/apps/data/routes/activities.ts +60 -0
  513. package/src/apps/data/routes/balances.ts +5 -7
  514. package/src/apps/data/routes/earn.bench.ts +18 -0
  515. package/src/apps/data/routes/earn.local.test.ts +507 -0
  516. package/src/apps/data/routes/earn.test.ts +405 -127
  517. package/src/apps/data/routes/earn.ts +660 -270
  518. package/src/apps/data/routes/exchanges.bench.ts +3 -1
  519. package/src/apps/data/routes/exchanges.test.ts +166 -2
  520. package/src/apps/data/routes/exchanges.ts +308 -101
  521. package/src/apps/data/routes/fee-amm.test.ts +134 -2
  522. package/src/apps/data/routes/fee-amm.ts +122 -60
  523. package/src/apps/data/routes/receipts.test.ts +21 -18
  524. package/src/apps/data/routes/rpc.test.ts +2 -2
  525. package/src/apps/data/routes/tokens.provenance.test.ts +157 -0
  526. package/src/apps/data/routes/tokens.test.ts +4 -4
  527. package/src/apps/data/routes/tokens.ts +11 -6
  528. package/src/apps/data/routes/transactions.test.ts +29 -0
  529. package/src/apps/data/routes/transactions.ts +33 -22
  530. package/src/apps/data/routes/webhooks.test.ts +12 -3
  531. package/src/apps/data/routes/webhooks.ts +2 -1
  532. package/src/apps/management/App.ts +4 -0
  533. package/src/apps/management/Billing.test.ts +253 -27
  534. package/src/apps/management/Billing.ts +83 -29
  535. package/src/apps/management/routes/api-keys.test.ts +1 -1
  536. package/src/apps/management/routes/api-keys.ts +85 -11
  537. package/src/apps/management/routes/billing.test.ts +68 -4
  538. package/src/apps/management/routes/cli.test.ts +370 -0
  539. package/src/apps/management/routes/cli.ts +533 -0
  540. package/src/apps/management/routes/me.test.ts +14 -4
  541. package/src/apps/management/routes/orgs.test.ts +108 -4
  542. package/src/apps/management/routes/orgs.ts +7 -2
  543. package/src/apps/management/routes/usage.test.ts +2 -2
  544. package/src/apps/mpp/internal/Policy.test.ts +51 -4
  545. package/src/apps/mpp/internal/Policy.ts +6 -2
  546. package/src/apps/mpp/internal/Sponsorship.test.ts +29 -0
  547. package/src/apps/mpp/internal/Sponsorship.ts +6 -4
  548. package/src/apps/relay/App.test.ts +85 -1
  549. package/src/apps/relay/App.ts +28 -4
  550. package/src/apps/relay/Sponsorships.test.ts +97 -1
  551. package/src/apps/relay/Sponsorships.ts +77 -66
  552. package/src/apps/routes/Access.test.ts +319 -0
  553. package/src/apps/routes/Access.ts +147 -0
  554. package/src/apps/routes/App.ts +10 -0
  555. package/src/apps/routes/routes/chains.test.ts +3 -2
  556. package/src/apps/routes/routes/deposit-addresses.test.ts +978 -34
  557. package/src/apps/routes/routes/deposit-addresses.ts +243 -32
  558. package/src/apps/routes/routes/propAmm.local.test.ts +951 -0
  559. package/src/apps/routes/routes/quotes.test.ts +81 -8
  560. package/src/apps/routes/routes/quotes.ts +109 -27
  561. package/src/apps/routes/routes/transfers.test.ts +252 -15
  562. package/src/apps/routes/routes/transfers.ts +212 -33
  563. package/src/cli/ApiKeys.test.ts +265 -0
  564. package/src/cli/ApiKeys.ts +189 -0
  565. package/src/cli/Cli.test.ts +188 -0
  566. package/src/cli/Cli.ts +280 -12
  567. package/src/cli/Credentials.test.ts +122 -0
  568. package/src/cli/Credentials.ts +144 -0
  569. package/src/cli/Spec.test.ts +133 -0
  570. package/src/cli/Spec.ts +132 -0
  571. package/src/cli/bin.test.ts +49 -0
  572. package/src/cli/bin.ts +5 -1
  573. package/src/cli/commands/auth.test.ts +138 -0
  574. package/src/cli/commands/auth.ts +254 -0
  575. package/src/cli/commands/keys.test.ts +68 -0
  576. package/src/cli/commands/keys.ts +125 -0
  577. package/src/cloudflare.ts +184 -36
  578. package/src/db/Db.test.ts +877 -0
  579. package/src/db/Db.ts +498 -1
  580. package/src/db/Schema.ts +75 -4
  581. package/src/db/tables/apiKeyAdmissions.test.ts +57 -0
  582. package/src/db/tables/apiKeyAdmissions.ts +101 -11
  583. package/src/db/tables/apiKeyOwnerTombstones.ts +2 -2
  584. package/src/db/tables/authAccounts.test.ts +30 -0
  585. package/src/db/tables/authAccounts.ts +1 -0
  586. package/src/db/tables/earnVaults.test.ts +34 -0
  587. package/src/db/tables/earnVaults.ts +17 -2
  588. package/src/db/tables/organizations.test.ts +148 -84
  589. package/src/db/tables/organizations.ts +11 -43
  590. package/src/db/tables/requestUsage.ts +13 -2
  591. package/src/db/tables/rewardCampaigns.test.ts +163 -0
  592. package/src/db/tables/rewardEligibilityAssociations.test.ts +14 -0
  593. package/src/db/tables/rewardEligibilityAssociations.ts +24 -0
  594. package/src/db/tables/rewardRuns.ts +4 -0
  595. package/src/db/tables/rewardTransactionAttempts.ts +2 -0
  596. package/src/db/tables/routesDepositAddresses.test.ts +263 -0
  597. package/src/db/tables/routesDepositAddresses.ts +118 -34
  598. package/src/db/tables/routesDeposits.test.ts +66 -5
  599. package/src/db/tables/routesDeposits.ts +47 -26
  600. package/src/db/tables/routesIdempotency.test.ts +80 -0
  601. package/src/db/tables/routesIdempotency.ts +2 -0
  602. package/src/db/tables/routesPolicies.test.ts +143 -0
  603. package/src/db/tables/routesPolicies.ts +251 -0
  604. package/src/db/tables/routesTransferSubsidies.ts +64 -0
  605. package/src/db/tables/routesTransferSubsidyNonces.ts +16 -4
  606. package/src/db/tables/routesTransfers.test.ts +183 -2
  607. package/src/db/tables/routesTransfers.ts +65 -6
  608. package/src/db/tables/sponsoredTransactions.test.ts +351 -76
  609. package/src/db/tables/sponsoredTransactions.ts +182 -38
  610. package/src/db/tables/users.test.ts +51 -0
  611. package/src/db/tables/users.ts +12 -0
  612. package/src/handlers/internal/multisig.store.test.ts +120 -0
  613. package/src/handlers/internal/multisig.test.ts +389 -0
  614. package/src/handlers/internal/multisig.ts +13 -10
  615. package/src/handlers/relay.test.ts +259 -83
  616. package/src/handlers/relay.ts +36 -17
  617. package/src/internal/Auth.test.ts +291 -8
  618. package/src/internal/Auth.ts +227 -96
  619. package/src/internal/BetterAuth.test.ts +58 -22
  620. package/src/internal/BetterAuth.ts +23 -17
  621. package/src/internal/Cache.ts +3 -1
  622. package/src/internal/CliAuth.test.ts +279 -0
  623. package/src/internal/CliAuth.ts +319 -0
  624. package/src/internal/EarnSharePrices.test.ts +25 -0
  625. package/src/internal/EarnSharePrices.ts +9 -2
  626. package/src/internal/EarnVaults.test.ts +67 -0
  627. package/src/internal/EarnVaults.ts +299 -4
  628. package/src/internal/EarnWithdrawals.test.ts +315 -0
  629. package/src/internal/EarnWithdrawals.ts +266 -0
  630. package/src/internal/ExecutionContext.ts +31 -0
  631. package/src/internal/Log.test.ts +210 -0
  632. package/src/internal/Log.ts +180 -142
  633. package/src/internal/MetricSink.test.ts +190 -15
  634. package/src/internal/MetricSink.ts +27 -1
  635. package/src/internal/RateLimit.test.ts +144 -8
  636. package/src/internal/RateLimit.ts +254 -26
  637. package/src/internal/Store.ts +4 -5
  638. package/src/internal/Timing.test.ts +32 -0
  639. package/src/internal/Timing.ts +20 -1
  640. package/src/internal/Tron.test-d.ts +22 -0
  641. package/src/internal/Tron.test.ts +94 -0
  642. package/src/internal/Tron.ts +289 -0
  643. package/src/internal/Viem.rpc.test.ts +76 -0
  644. package/src/internal/Viem.ts +29 -6
  645. package/src/internal/rewards/Read.test.ts +109 -0
  646. package/src/internal/rewards/Read.ts +13 -4
  647. package/src/internal/routes/Action.test.ts +70 -0
  648. package/src/internal/routes/Action.ts +76 -1
  649. package/src/internal/routes/Chain.test.ts +18 -0
  650. package/src/internal/routes/Chain.ts +5 -0
  651. package/src/internal/routes/DepositAddress.ts +5 -0
  652. package/src/internal/routes/Evidence.test.ts +64 -0
  653. package/src/internal/routes/Evidence.ts +11 -3
  654. package/src/internal/routes/EvmTransferSettlement.ts +213 -0
  655. package/src/internal/routes/Policy.test.ts +316 -0
  656. package/src/internal/routes/Policy.ts +399 -0
  657. package/src/internal/routes/Provider.test.ts +103 -2
  658. package/src/internal/routes/Provider.ts +149 -27
  659. package/src/internal/routes/Quota.test.ts +149 -0
  660. package/src/internal/routes/Quota.ts +226 -0
  661. package/src/internal/routes/Reconciliation.local.test.ts +285 -0
  662. package/src/internal/routes/Reconciliation.test.ts +371 -13
  663. package/src/internal/routes/Reconciliation.ts +193 -42
  664. package/src/internal/routes/SolanaTransferSettlement.ts +232 -0
  665. package/src/internal/routes/SolanaTransferSubsidy.test.ts +471 -0
  666. package/src/internal/routes/SolanaTransferSubsidy.ts +760 -0
  667. package/src/internal/routes/SourceObservation.test.ts +221 -0
  668. package/src/internal/routes/Subsidy.local.test.ts +46 -0
  669. package/src/internal/routes/Subsidy.ts +4 -2
  670. package/src/internal/routes/Transfer.solana.test.ts +389 -0
  671. package/src/internal/routes/Transfer.test.ts +130 -1
  672. package/src/internal/routes/Transfer.tron.test.ts +172 -0
  673. package/src/internal/routes/Transfer.ts +866 -8
  674. package/src/internal/routes/TransferReconciliation.test.ts +26 -4
  675. package/src/internal/routes/TransferReconciliation.ts +91 -166
  676. package/src/internal/routes/TransferSettlement.ts +48 -0
  677. package/src/internal/routes/TransferSubsidy.local.test.ts +143 -0
  678. package/src/internal/routes/TransferSubsidy.test.ts +34 -4
  679. package/src/internal/routes/TransferSubsidy.ts +87 -12
  680. package/src/internal/routes/TronTransferSettlement.ts +212 -0
  681. package/src/internal/routes/TronTransferSubsidy.test.ts +109 -0
  682. package/src/internal/routes/TronTransferSubsidy.ts +619 -0
  683. package/src/internal/routes/index.test.ts +3 -0
  684. package/src/internal/routes/index.ts +3 -0
  685. package/src/internal/routes/providers/across.ts +13 -0
  686. package/src/internal/routes/providers/index.test.ts +141 -0
  687. package/src/internal/routes/providers/legacyMesh.test.ts +484 -0
  688. package/src/internal/routes/providers/legacyMesh.ts +633 -0
  689. package/src/internal/routes/providers/legacyMeshDelivery.test.ts +306 -0
  690. package/src/internal/routes/providers/legacyMeshDelivery.ts +320 -0
  691. package/src/internal/routes/providers/legacyMeshOutbound.test.ts +401 -0
  692. package/src/internal/routes/providers/legacyMeshOutbound.ts +566 -0
  693. package/src/internal/routes/providers/legacyMeshOutboundDelivery.ts +473 -0
  694. package/src/internal/routes/providers/propAmm.ts +640 -0
  695. package/src/internal/routes/providers/relay.test.ts +1263 -41
  696. package/src/internal/routes/providers/relay.ts +423 -38
  697. package/src/internal/routes/providers/rhino.ts +14 -1
  698. package/src/internal/routes/providers/squid.ts +21 -0
  699. package/src/internal/routes/providers/stargate.test.ts +105 -1
  700. package/src/internal/routes/providers/stargate.ts +22 -9
  701. package/src/internal/routes/providers/symbiosis.ts +13 -47
  702. package/src/providers/index.test.ts +2 -0
  703. package/src/providers/index.ts +18 -0
  704. package/dist/admin/Access.d.ts +0 -39
  705. package/dist/admin/Access.d.ts.map +0 -1
  706. package/dist/admin/Access.js +0 -73
  707. package/dist/admin/Access.js.map +0 -1
  708. package/src/admin/Access.test.ts +0 -130
  709. package/src/admin/Access.ts +0 -85
package/src/db/Db.ts CHANGED
@@ -3,7 +3,10 @@ import {
3
3
  type Compilable,
4
4
  CompiledQuery,
5
5
  type Dialect,
6
+ type DatabaseConnection,
7
+ type Driver,
6
8
  Kysely,
9
+ type KyselyPlugin,
7
10
  PostgresDialect,
8
11
  type RawBuilder,
9
12
  sql,
@@ -42,6 +45,7 @@ import type * as RoutesDepositAddresses from './tables/routesDepositAddresses.js
42
45
  import type * as RoutesDepositRequestObservations from './tables/routesDepositRequestObservations.js'
43
46
  import type * as RoutesDeposits from './tables/routesDeposits.js'
44
47
  import type * as RoutesIdempotency from './tables/routesIdempotency.js'
48
+ import type * as RoutesPolicies from './tables/routesPolicies.js'
45
49
  import type * as RoutesSubsidies from './tables/routesSubsidies.js'
46
50
  import type * as RoutesTransferEvents from './tables/routesTransferEvents.js'
47
51
  import type * as RoutesTransfers from './tables/routesTransfers.js'
@@ -107,10 +111,12 @@ export type Database = {
107
111
  routes_deposit_request_observations: RoutesDepositRequestObservations.Table
108
112
  routes_deposits: RoutesDeposits.Table
109
113
  routes_idempotency_requests: RoutesIdempotency.Table
114
+ routes_policies: RoutesPolicies.Table
110
115
  routes_routes: RoutesCatalog.RouteTable
111
116
  routes_subsidies: RoutesSubsidies.Table
112
117
  routes_tokens: RoutesCatalog.TokenTable
113
118
  routes_transfer_events: RoutesTransferEvents.Table
119
+ routes_transfer_subsidy_expired_attempts: RoutesTransferSubsidies.ExpiredAttemptTable
114
120
  routes_transfer_subsidies: RoutesTransferSubsidies.Table
115
121
  routes_transfer_subsidy_nonces: RoutesTransferSubsidyNonces.Table
116
122
  routes_transfer_transactions: RoutesTransferTransactions.Table
@@ -150,6 +156,45 @@ export type Db = {
150
156
  transaction<value>(fn: (tx: Db) => Promise<value>): Promise<value>
151
157
  }
152
158
 
159
+ /** Per-execution observers, keyed by Kysely's query id so the driver can find them. */
160
+ const queryObservers = new WeakMap<object, observe.Options['onQuery']>()
161
+
162
+ /**
163
+ * Wraps a database so every query reports its wall-clock duration at the
164
+ * driver: acquisition of its connection plus execution, whether it succeeds or
165
+ * rejects. A rejected acquisition has no query to charge and goes unreported.
166
+ */
167
+ export function observe(db: Db, options: observe.Options): Db {
168
+ // The plugin only tags executions; the driver wrapper installed by
169
+ // `fromDialect` does the timing, so rejected queries report too.
170
+ const plugin: KyselyPlugin = {
171
+ transformQuery(args) {
172
+ queryObservers.set(args.queryId, options.onQuery)
173
+ return args.node
174
+ },
175
+ async transformResult(args) {
176
+ return args.result
177
+ },
178
+ }
179
+ return { ...db, kysely: db.kysely.withPlugin(plugin) }
180
+ }
181
+
182
+ export declare namespace observe {
183
+ /** Query observation hooks. */
184
+ type Options = {
185
+ /** Receives each completed query's total and component durations in milliseconds. */
186
+ onQuery: (durationMs: number, timing: Timing) => void
187
+ }
188
+
189
+ /** Connection acquisition and query execution durations, in milliseconds. */
190
+ type Timing = {
191
+ /** Time spent waiting for or connecting a database connection. */
192
+ acquire: number
193
+ /** Time spent executing the query, including network round trips. */
194
+ query: number
195
+ }
196
+ }
197
+
153
198
  /**
154
199
  * A {@link Db}, or a factory for per-request Workers/Hyperdrive connections.
155
200
  * Node can pass a long-lived singleton. Resolve at the leaf with {@link get}.
@@ -2980,6 +3025,389 @@ export const migrations: readonly Migration[] = [
2980
3025
  sql`UPDATE routes_deposits SET subsidy_meter_reported_at = coalesce(status_updated_at, updated_at) WHERE environment = 'production' AND subsidy_meter_reported_at IS NULL AND (provider_subsidy->'amount'->>'baseUnits')::numeric > 0 AND (status = 'completed' OR (status IN ('action-required', 'settling') AND tempo_gas_paid IS NOT NULL)) AND coalesce(status_updated_at, updated_at) < '2026-09-03T06:10:21.000Z'`,
2981
3026
  ),
2982
3027
  },
3028
+ {
3029
+ name: '0280_routes_policies',
3030
+ up: (db) =>
3031
+ raw(
3032
+ db,
3033
+ sql`DO $$ BEGIN
3034
+ CREATE TABLE IF NOT EXISTS routes_policies (org_id text NOT NULL REFERENCES organizations(id) ON DELETE CASCADE, environment text NOT NULL CHECK (environment IN ('production', 'sandbox')), project_id text NOT NULL DEFAULT '', api_key_id text NOT NULL DEFAULT '', version integer NOT NULL CHECK (version > 0), policy jsonb NOT NULL, created_at text NOT NULL, updated_at text NOT NULL, PRIMARY KEY (org_id, environment, project_id, api_key_id));
3035
+ ALTER TABLE api_key_admissions ADD COLUMN IF NOT EXISTS pending_scopes jsonb;
3036
+ END $$`,
3037
+ ),
3038
+ },
3039
+ {
3040
+ name: '0270_earn_vault_earnings',
3041
+ up: (db) => raw(db, sql`ALTER TABLE earn_vaults ADD COLUMN IF NOT EXISTS earnings jsonb`),
3042
+ },
3043
+ {
3044
+ // All workers must understand pinned commitments before this index permits multiple terms for the same wallets.
3045
+ name: '0281_routes_deposit_address_policy_identity',
3046
+ up: (db) =>
3047
+ raw(
3048
+ db,
3049
+ sql`DO $$ BEGIN
3050
+ CREATE UNIQUE INDEX IF NOT EXISTS routes_deposit_addresses_policy_identity_idx ON routes_deposit_addresses (org_id, environment, project_id, source_chain_id, source_token_key, destination_token_key, recipient, refund_address, subsidize, (coalesce(provider_state->>'routePolicyKey', ''))) NULLS NOT DISTINCT;
3051
+ DROP INDEX IF EXISTS routes_deposit_addresses_identity_idx;
3052
+ END $$`,
3053
+ ),
3054
+ },
3055
+ {
3056
+ // The funding-to-routes rename left existing subscriptions with event types rejected by response validation.
3057
+ name: '0282_webhook_subscription_routes_event_types',
3058
+ up: (db) =>
3059
+ raw(
3060
+ db,
3061
+ sql`UPDATE webhook_subscriptions SET event_type = CASE event_type WHEN 'funding:deposit.updated' THEN 'routes:deposit.updated' WHEN 'funding:transfer.updated' THEN 'routes:transfer.updated' END WHERE event_type IN ('funding:deposit.updated', 'funding:transfer.updated')`,
3062
+ ),
3063
+ },
3064
+ {
3065
+ name: '0283_sponsored_transactions_drop_hashless_recovery_index',
3066
+ up: (db) => raw(db, sql`DROP INDEX IF EXISTS sponsored_transactions_recovery_idx`),
3067
+ },
3068
+ {
3069
+ name: '0284_sponsored_transactions_failed_recovery_index',
3070
+ up: (db) =>
3071
+ raw(
3072
+ db,
3073
+ sql`CREATE INDEX IF NOT EXISTS sponsored_transactions_recovery_idx ON sponsored_transactions (finalized_at, chain_id, created_at) WHERE status = 'failed'`,
3074
+ ),
3075
+ },
3076
+ {
3077
+ name: '0285_sponsored_transactions_reconciled_hash',
3078
+ up: (db) =>
3079
+ raw(
3080
+ db,
3081
+ sql`ALTER TABLE sponsored_transactions ADD COLUMN IF NOT EXISTS transaction_hash_reconciled boolean NOT NULL DEFAULT false`,
3082
+ ),
3083
+ },
3084
+ {
3085
+ name: '0286_request_usage_event_timestamp',
3086
+ up: (db) =>
3087
+ raw(
3088
+ db,
3089
+ sql`ALTER TABLE request_usage_meter_events ADD COLUMN IF NOT EXISTS event_timestamp text`,
3090
+ ),
3091
+ },
3092
+ {
3093
+ name: '0287_users_terms_shared_at',
3094
+ up: (db) => raw(db, sql`ALTER TABLE users ADD COLUMN IF NOT EXISTS terms_shared_at text`),
3095
+ },
3096
+ {
3097
+ name: '0288_sponsored_transactions_meter_attempt',
3098
+ up: (db) => raw(db, sql`ALTER TABLE sponsored_transactions ADD COLUMN IF NOT EXISTS meter_report_attempted_at text`), // prettier-ignore
3099
+ },
3100
+ {
3101
+ name: '0289_sponsored_transactions_meter_attempt_index',
3102
+ up: (db) => raw(db, sql`CREATE INDEX IF NOT EXISTS sponsored_transactions_meter_attempt_idx ON sponsored_transactions (meter_report_attempted_at ASC NULLS FIRST, finalized_at, id) WHERE billable AND status = 'finalized' AND meter_reported_at IS NULL`), // prettier-ignore
3103
+ },
3104
+ {
3105
+ name: '0290_sponsored_transactions_first_meter_event_attempt',
3106
+ up: (db) => raw(db, sql`ALTER TABLE sponsored_transactions ADD COLUMN IF NOT EXISTS meter_event_first_attempted_at text`), // prettier-ignore
3107
+ },
3108
+ {
3109
+ name: '0291_sponsored_transactions_meter_retry_index',
3110
+ up: (db) => raw(db, sql`CREATE INDEX IF NOT EXISTS sponsored_transactions_meter_retry_idx ON sponsored_transactions (meter_report_attempted_at, finalized_at, id) WHERE billable AND status = 'finalized' AND meter_reported_at IS NULL AND meter_event_first_attempted_at IS NOT NULL`), // prettier-ignore
3111
+ },
3112
+ {
3113
+ name: '0292_routes_transfer_subsidies_tron_addresses',
3114
+ up: (db) =>
3115
+ raw(
3116
+ db,
3117
+ sql`CREATE OR REPLACE FUNCTION capture_routes_transfer_subsidy() RETURNS trigger
3118
+ LANGUAGE plpgsql SET search_path FROM CURRENT AS $capture$
3119
+ DECLARE
3120
+ settlement routes_transfer_subsidies%ROWTYPE;
3121
+ source_chain text;
3122
+ source_ref text;
3123
+ recipient text;
3124
+ token_address text;
3125
+ BEGIN
3126
+ IF NEW.subsidy_transaction_hash IS NULL OR NEW.provider_state->'transferSubsidy' IS NULL THEN
3127
+ RETURN NEW;
3128
+ END IF;
3129
+ source_chain := NEW.snapshot->'sourceChain'->>'id';
3130
+ source_ref := NEW.snapshot->'sourceTransactionHashes'->>0;
3131
+ IF source_ref IS NULL THEN
3132
+ RAISE EXCEPTION 'Subsidy source evidence is missing';
3133
+ END IF;
3134
+ recipient := CASE WHEN NEW.subsidy_chain_id LIKE 'tron:%'
3135
+ THEN NEW.snapshot->>'recipient' ELSE lower(NEW.snapshot->>'recipient') END;
3136
+ token_address := CASE WHEN NEW.subsidy_chain_id LIKE 'tron:%'
3137
+ THEN NEW.subsidy_token_address ELSE lower(NEW.subsidy_token_address) END;
3138
+ INSERT INTO routes_transfer_subsidies (
3139
+ source_chain_id, transaction_ref, destination_chain_id, recipient,
3140
+ token_address, transaction, transfer_id, created_at
3141
+ ) VALUES (
3142
+ source_chain, source_ref, NEW.subsidy_chain_id, recipient,
3143
+ token_address, NEW.provider_state->'transferSubsidy', NEW.id, NEW.updated_at
3144
+ ) ON CONFLICT DO NOTHING;
3145
+ SELECT * INTO STRICT settlement FROM routes_transfer_subsidies
3146
+ WHERE source_chain_id = source_chain AND transaction_ref = source_ref;
3147
+ IF settlement.transaction IS DISTINCT FROM NEW.provider_state->'transferSubsidy'
3148
+ OR settlement.destination_chain_id IS DISTINCT FROM NEW.subsidy_chain_id
3149
+ OR settlement.recipient IS DISTINCT FROM recipient
3150
+ OR settlement.token_address IS DISTINCT FROM token_address THEN
3151
+ RAISE EXCEPTION 'Source payment already has a different subsidy settlement';
3152
+ END IF;
3153
+ IF settlement.transfer_id <> NEW.id THEN
3154
+ NEW.subsidy_amount := NULL;
3155
+ NEW.subsidy_commitment_amount := NULL;
3156
+ NEW.subsidy_native_amount := NULL;
3157
+ END IF;
3158
+ RETURN NEW;
3159
+ END $capture$`,
3160
+ ),
3161
+ },
3162
+ {
3163
+ name: '0293_routes_transfer_subsidies_case_sensitive_addresses',
3164
+ up: (db) =>
3165
+ raw(
3166
+ db,
3167
+ sql`CREATE OR REPLACE FUNCTION capture_routes_transfer_subsidy() RETURNS trigger
3168
+ LANGUAGE plpgsql SET search_path FROM CURRENT AS $capture$
3169
+ DECLARE
3170
+ settlement routes_transfer_subsidies%ROWTYPE;
3171
+ source_chain text;
3172
+ source_ref text;
3173
+ recipient text;
3174
+ token_address text;
3175
+ BEGIN
3176
+ IF NEW.subsidy_transaction_hash IS NULL OR NEW.provider_state->'transferSubsidy' IS NULL THEN
3177
+ RETURN NEW;
3178
+ END IF;
3179
+ source_chain := NEW.snapshot->'sourceChain'->>'id';
3180
+ source_ref := NEW.snapshot->'sourceTransactionHashes'->>0;
3181
+ IF source_ref IS NULL THEN
3182
+ RAISE EXCEPTION 'Subsidy source evidence is missing';
3183
+ END IF;
3184
+ recipient := CASE WHEN NEW.subsidy_chain_id LIKE 'eip155:%'
3185
+ THEN lower(NEW.snapshot->>'recipient') ELSE NEW.snapshot->>'recipient' END;
3186
+ token_address := CASE WHEN NEW.subsidy_chain_id LIKE 'eip155:%'
3187
+ THEN lower(NEW.subsidy_token_address) ELSE NEW.subsidy_token_address END;
3188
+ INSERT INTO routes_transfer_subsidies (
3189
+ source_chain_id, transaction_ref, destination_chain_id, recipient,
3190
+ token_address, transaction, transfer_id, created_at
3191
+ ) VALUES (
3192
+ source_chain, source_ref, NEW.subsidy_chain_id, recipient,
3193
+ token_address, NEW.provider_state->'transferSubsidy', NEW.id, NEW.updated_at
3194
+ ) ON CONFLICT DO NOTHING;
3195
+ SELECT * INTO STRICT settlement FROM routes_transfer_subsidies
3196
+ WHERE source_chain_id = source_chain AND transaction_ref = source_ref;
3197
+ IF settlement.transaction IS DISTINCT FROM NEW.provider_state->'transferSubsidy'
3198
+ OR settlement.destination_chain_id IS DISTINCT FROM NEW.subsidy_chain_id
3199
+ OR settlement.recipient IS DISTINCT FROM recipient
3200
+ OR settlement.token_address IS DISTINCT FROM token_address THEN
3201
+ RAISE EXCEPTION 'Source payment already has a different subsidy settlement';
3202
+ END IF;
3203
+ IF settlement.transfer_id <> NEW.id THEN
3204
+ NEW.subsidy_amount := NULL;
3205
+ NEW.subsidy_commitment_amount := NULL;
3206
+ NEW.subsidy_native_amount := NULL;
3207
+ END IF;
3208
+ RETURN NEW;
3209
+ END $capture$`,
3210
+ ),
3211
+ },
3212
+ {
3213
+ name: '0294_routes_transfer_subsidies_status',
3214
+ up: (db) =>
3215
+ raw(
3216
+ db,
3217
+ sql`ALTER TABLE routes_transfer_subsidies ADD COLUMN IF NOT EXISTS status text NOT NULL DEFAULT 'active'`,
3218
+ ),
3219
+ },
3220
+ {
3221
+ name: '0295_routes_transfer_subsidies_status_check',
3222
+ up: (db) =>
3223
+ raw(
3224
+ db,
3225
+ sql`DO $$ BEGIN
3226
+ IF NOT EXISTS (
3227
+ SELECT 1 FROM pg_constraint WHERE conname = 'routes_transfer_subsidies_status_check'
3228
+ ) THEN
3229
+ ALTER TABLE routes_transfer_subsidies
3230
+ ADD CONSTRAINT routes_transfer_subsidies_status_check
3231
+ CHECK (status IN ('active', 'expired'));
3232
+ END IF;
3233
+ END $$`,
3234
+ ),
3235
+ },
3236
+ {
3237
+ name: '0296_routes_transfer_subsidy_expired_attempts',
3238
+ up: (db) =>
3239
+ db.schema
3240
+ .createTable('routesTransferSubsidyExpiredAttempts')
3241
+ .ifNotExists()
3242
+ .addColumn('createdAt', 'text', (c) => c.notNull())
3243
+ .addColumn('expiredAt', 'text', (c) => c.notNull())
3244
+ .addColumn('sourceChainId', 'text', (c) => c.notNull())
3245
+ .addColumn('transaction', 'jsonb', (c) => c.notNull())
3246
+ .addColumn('transactionHash', 'text', (c) => c.notNull())
3247
+ .addColumn('transactionRef', 'text', (c) => c.notNull())
3248
+ .addColumn('transferId', 'text', (c) => c.notNull())
3249
+ .addPrimaryKeyConstraint('routes_transfer_subsidy_expired_attempts_pkey', [
3250
+ 'sourceChainId',
3251
+ 'transactionRef',
3252
+ 'transactionHash',
3253
+ ]),
3254
+ },
3255
+ {
3256
+ name: '0297_routes_transfer_subsidy_expiry_capture',
3257
+ up: (db) =>
3258
+ raw(
3259
+ db,
3260
+ sql`CREATE OR REPLACE FUNCTION capture_routes_transfer_subsidy() RETURNS trigger
3261
+ LANGUAGE plpgsql SET search_path FROM CURRENT AS $capture$
3262
+ DECLARE
3263
+ settlement routes_transfer_subsidies%ROWTYPE;
3264
+ source_chain text;
3265
+ source_ref text;
3266
+ recipient text;
3267
+ token_address text;
3268
+ expired_signed jsonb;
3269
+ replacement_signed jsonb;
3270
+ BEGIN
3271
+ IF NEW.subsidy_transaction_hash IS NULL OR NEW.provider_state->'transferSubsidy' IS NULL THEN
3272
+ RETURN NEW;
3273
+ END IF;
3274
+ source_chain := NEW.snapshot->'sourceChain'->>'id';
3275
+ source_ref := NEW.snapshot->'sourceTransactionHashes'->>0;
3276
+ IF source_ref IS NULL THEN
3277
+ RAISE EXCEPTION 'Subsidy source evidence is missing';
3278
+ END IF;
3279
+ recipient := CASE WHEN NEW.subsidy_chain_id LIKE 'eip155:%'
3280
+ THEN lower(NEW.snapshot->>'recipient') ELSE NEW.snapshot->>'recipient' END;
3281
+ token_address := CASE WHEN NEW.subsidy_chain_id LIKE 'eip155:%'
3282
+ THEN lower(NEW.subsidy_token_address) ELSE NEW.subsidy_token_address END;
3283
+ INSERT INTO routes_transfer_subsidies (
3284
+ source_chain_id, transaction_ref, destination_chain_id, recipient,
3285
+ token_address, transaction, transfer_id, created_at
3286
+ ) VALUES (
3287
+ source_chain, source_ref, NEW.subsidy_chain_id, recipient,
3288
+ token_address, NEW.provider_state->'transferSubsidy', NEW.id, NEW.updated_at
3289
+ ) ON CONFLICT DO NOTHING;
3290
+ SELECT * INTO STRICT settlement FROM routes_transfer_subsidies
3291
+ WHERE source_chain_id = source_chain AND transaction_ref = source_ref;
3292
+ IF settlement.destination_chain_id IS DISTINCT FROM NEW.subsidy_chain_id
3293
+ OR settlement.recipient IS DISTINCT FROM recipient
3294
+ OR settlement.token_address IS DISTINCT FROM token_address THEN
3295
+ RAISE EXCEPTION 'Source payment already has a different subsidy settlement';
3296
+ END IF;
3297
+ IF settlement.status = 'expired'
3298
+ AND settlement.destination_chain_id LIKE 'solana:%'
3299
+ AND settlement.transaction IS DISTINCT FROM NEW.provider_state->'transferSubsidy' THEN
3300
+ IF settlement.transfer_id IS DISTINCT FROM NEW.id THEN
3301
+ RAISE EXCEPTION 'Only the subsidy owner may replace an expired settlement';
3302
+ END IF;
3303
+ expired_signed := (settlement.transaction #>> '{}')::jsonb;
3304
+ replacement_signed := (NEW.provider_state->>'transferSubsidy')::jsonb;
3305
+ IF expired_signed->>'account' IS DISTINCT FROM replacement_signed->>'account'
3306
+ OR expired_signed->>'amount' IS DISTINCT FROM replacement_signed->>'amount'
3307
+ OR expired_signed->>'chainId' IS DISTINCT FROM replacement_signed->>'chainId'
3308
+ OR replacement_signed->>'hash' IS DISTINCT FROM NEW.subsidy_transaction_hash THEN
3309
+ RAISE EXCEPTION 'Expired subsidy replacement changed settlement terms';
3310
+ END IF;
3311
+ UPDATE routes_transfer_subsidies SET
3312
+ transaction = NEW.provider_state->'transferSubsidy',
3313
+ created_at = NEW.updated_at,
3314
+ status = 'active'
3315
+ WHERE source_chain_id = source_chain AND transaction_ref = source_ref;
3316
+ ELSIF settlement.transaction IS DISTINCT FROM NEW.provider_state->'transferSubsidy' THEN
3317
+ RAISE EXCEPTION 'Source payment already has a different subsidy settlement';
3318
+ END IF;
3319
+ IF settlement.transfer_id <> NEW.id THEN
3320
+ NEW.subsidy_amount := NULL;
3321
+ NEW.subsidy_commitment_amount := NULL;
3322
+ NEW.subsidy_native_amount := NULL;
3323
+ END IF;
3324
+ RETURN NEW;
3325
+ END $capture$`,
3326
+ ),
3327
+ },
3328
+ {
3329
+ name: '0298_routes_transfer_subsidies_status_check_schema',
3330
+ up: (db) =>
3331
+ raw(
3332
+ db,
3333
+ sql`DO $$ BEGIN
3334
+ IF NOT EXISTS (
3335
+ SELECT 1 FROM pg_constraint
3336
+ WHERE conname = 'routes_transfer_subsidies_status_check'
3337
+ AND conrelid = 'routes_transfer_subsidies'::regclass
3338
+ ) THEN
3339
+ ALTER TABLE routes_transfer_subsidies
3340
+ ADD CONSTRAINT routes_transfer_subsidies_status_check
3341
+ CHECK (status IN ('active', 'expired'));
3342
+ END IF;
3343
+ END $$`,
3344
+ ),
3345
+ },
3346
+ {
3347
+ name: '0299_verified_tokens_ousd',
3348
+ up: (db) =>
3349
+ raw(
3350
+ db,
3351
+ // Matches the verified-token publisher's "vtok" lock for Tempo mainnet.
3352
+ sql`DO $migration$ BEGIN PERFORM pg_advisory_xact_lock(1987342187, 4217); WITH list AS (UPDATE verified_token_lists SET updated_at = CASE WHEN version LIKE '%_0299_ousd' THEN updated_at ELSE to_char(GREATEST(updated_at::timestamptz, clock_timestamp()) AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') END, version = CASE WHEN version LIKE '%_0299_ousd' THEN version ELSE version || '_0299_ousd' END WHERE chain_id = 4217 RETURNING chain_id) INSERT INTO verified_tokens (address, chain_id, currency, decimals, logo_uri, name, position, symbol) SELECT '0x20c0000000000000000000006a37da5c996874be', list.chain_id, 'USD', 6, NULL, 'OpenUSD', COALESCE((SELECT max(position) + 1 FROM verified_tokens WHERE chain_id = list.chain_id), 0), 'OUSD' FROM list ON CONFLICT (chain_id, address) DO UPDATE SET currency = EXCLUDED.currency, decimals = EXCLUDED.decimals, logo_uri = EXCLUDED.logo_uri, name = EXCLUDED.name, symbol = EXCLUDED.symbol; END $migration$`,
3353
+ ),
3354
+ },
3355
+ {
3356
+ name: '0300_reward_runs_latest_delivered_index',
3357
+ // Serves latest-run lookups per vault and phase without sorting every run.
3358
+ up: (db) => raw(db, sql`CREATE INDEX IF NOT EXISTS reward_runs_latest_idx ON reward_runs (chain_id, vault_address, phase, ends_at DESC)`), // prettier-ignore
3359
+ },
3360
+ {
3361
+ name: '0301_verified_tokens_ousd_testnet',
3362
+ up: (db) =>
3363
+ raw(
3364
+ db,
3365
+ // Matches the verified-token publisher's "vtok" lock for Tempo testnet.
3366
+ sql`DO $migration$ BEGIN PERFORM pg_advisory_xact_lock(1987342187, 42431); WITH list AS (UPDATE verified_token_lists SET updated_at = CASE WHEN version LIKE '%_0301_ousd' THEN updated_at ELSE to_char(GREATEST(updated_at::timestamptz, clock_timestamp()) AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') END, version = CASE WHEN version LIKE '%_0301_ousd' THEN version ELSE version || '_0301_ousd' END WHERE chain_id = 42431 RETURNING chain_id) INSERT INTO verified_tokens (address, chain_id, currency, decimals, logo_uri, name, position, symbol) SELECT '0x20c0000000000000000000006a37da5c996874be', list.chain_id, 'USD', 6, NULL, 'OpenUSD', COALESCE((SELECT max(position) + 1 FROM verified_tokens WHERE chain_id = list.chain_id), 0), 'OUSD' FROM list ON CONFLICT (chain_id, address) DO UPDATE SET currency = EXCLUDED.currency, decimals = EXCLUDED.decimals, logo_uri = EXCLUDED.logo_uri, name = EXCLUDED.name, symbol = EXCLUDED.symbol; END $migration$`,
3367
+ ),
3368
+ },
3369
+ {
3370
+ name: '0302_extend_d730_reward_campaign',
3371
+ up: (db) =>
3372
+ raw(
3373
+ db,
3374
+ // December 17, 2026 at noon EST. Preserve the delivered cursor so expired intervals accrue during catch-up.
3375
+ sql`DO $migration$
3376
+ DECLARE
3377
+ campaign reward_campaigns%ROWTYPE;
3378
+ replacement jsonb;
3379
+ capability text;
3380
+ BEGIN
3381
+ SELECT * INTO campaign FROM reward_campaigns
3382
+ WHERE chain_id = 4217 AND vault_address = '0xd730394f3bb85a4828e35fc5e361dcc9f894fa4f'
3383
+ FOR UPDATE;
3384
+ IF NOT FOUND THEN RETURN; END IF;
3385
+
3386
+ replacement := campaign.config;
3387
+ FOREACH capability IN ARRAY ARRAY['targetYield', 'boostRewards'] LOOP
3388
+ IF (replacement -> capability ->> 'endTimestamp')::bigint < 1797526800 THEN
3389
+ replacement := jsonb_set(replacement, ARRAY[capability, 'endTimestamp'], '1797526800'::jsonb);
3390
+ END IF;
3391
+ END LOOP;
3392
+ IF replacement = campaign.config THEN RETURN; END IF;
3393
+
3394
+ IF campaign.pending_config IS NOT NULL OR campaign.pending_effective_at IS NOT NULL THEN
3395
+ RAISE EXCEPTION 'Cannot extend d730 reward campaign: resolve the pending configuration before retrying migration';
3396
+ END IF;
3397
+ IF EXISTS (
3398
+ SELECT 1 FROM reward_runs
3399
+ WHERE chain_id = campaign.chain_id AND vault_address = campaign.vault_address
3400
+ AND (phase <> 'delivered' OR starts_after >= campaign.delivered_through)
3401
+ ) THEN
3402
+ RAISE EXCEPTION 'Cannot extend d730 reward campaign: finish outstanding reward runs before retrying migration';
3403
+ END IF;
3404
+
3405
+ UPDATE reward_campaigns SET config = replacement,
3406
+ updated_at = to_char(clock_timestamp() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"')
3407
+ WHERE chain_id = campaign.chain_id AND vault_address = campaign.vault_address;
3408
+ END $migration$`,
3409
+ ),
3410
+ },
2983
3411
  ]
2984
3412
 
2985
3413
  /**
@@ -3004,9 +3432,78 @@ export function from(dialect: Dialect): Db {
3004
3432
  return fromDialect(dialect)
3005
3433
  }
3006
3434
 
3435
+ /**
3436
+ * Times executions that {@link observe} tagged. Acquisition (pool checkout,
3437
+ * connect) is charged to the connection's next query so cold connects count.
3438
+ */
3439
+ function observeDriver(driver: Driver): Driver {
3440
+ const inner = new WeakMap<DatabaseConnection, DatabaseConnection>()
3441
+ const unwrap = (connection: DatabaseConnection) => inner.get(connection) ?? connection
3442
+ return {
3443
+ async acquireConnection() {
3444
+ const start = performance.now()
3445
+ const connection = await driver.acquireConnection()
3446
+ let pending = performance.now() - start
3447
+ const wrapped: DatabaseConnection = {
3448
+ async executeQuery(compiledQuery) {
3449
+ const onQuery = queryObservers.get(compiledQuery.queryId)
3450
+ if (!onQuery) return connection.executeQuery(compiledQuery)
3451
+ const acquired = pending
3452
+ pending = 0
3453
+ const started = performance.now()
3454
+ try {
3455
+ return await connection.executeQuery(compiledQuery)
3456
+ } finally {
3457
+ const query = performance.now() - started
3458
+ onQuery(acquired + query, { acquire: acquired, query })
3459
+ }
3460
+ },
3461
+ streamQuery(compiledQuery, chunkSize) {
3462
+ return connection.streamQuery(compiledQuery, chunkSize)
3463
+ },
3464
+ }
3465
+ inner.set(wrapped, connection)
3466
+ return wrapped
3467
+ },
3468
+ beginTransaction: (connection, settings) =>
3469
+ driver.beginTransaction(unwrap(connection), settings),
3470
+ commitTransaction: (connection) => driver.commitTransaction(unwrap(connection)),
3471
+ destroy: () => driver.destroy(),
3472
+ init: () => driver.init(),
3473
+ releaseConnection: (connection) => driver.releaseConnection(unwrap(connection)),
3474
+ rollbackTransaction: (connection) => driver.rollbackTransaction(unwrap(connection)),
3475
+ ...(driver.releaseSavepoint
3476
+ ? {
3477
+ releaseSavepoint: (connection, name, compile) =>
3478
+ driver.releaseSavepoint!(unwrap(connection), name, compile),
3479
+ }
3480
+ : {}),
3481
+ ...(driver.rollbackToSavepoint
3482
+ ? {
3483
+ rollbackToSavepoint: (connection, name, compile) =>
3484
+ driver.rollbackToSavepoint!(unwrap(connection), name, compile),
3485
+ }
3486
+ : {}),
3487
+ ...(driver.savepoint
3488
+ ? {
3489
+ savepoint: (connection, name, compile) =>
3490
+ driver.savepoint!(unwrap(connection), name, compile),
3491
+ }
3492
+ : {}),
3493
+ }
3494
+ }
3495
+
3007
3496
  /** Builds a database with internal dialect-specific options. */
3008
3497
  function fromDialect(dialect: Dialect, options: fromDialect.Options = {}): Db {
3009
- const root = new Kysely<Database>({ dialect, plugins: [new CamelCasePlugin()] })
3498
+ // Delegate method by method: the dialect is a class instance, so a spread
3499
+ // would drop its prototype methods.
3500
+ const observed: Dialect = {
3501
+ createAdapter: () => dialect.createAdapter(),
3502
+ createDriver: () => observeDriver(dialect.createDriver()),
3503
+ createIntrospector: (db) => dialect.createIntrospector(db),
3504
+ createQueryCompiler: () => dialect.createQueryCompiler(),
3505
+ }
3506
+ const root = new Kysely<Database>({ dialect: observed, plugins: [new CamelCasePlugin()] })
3010
3507
  // Qualify repository queries instead of relying on session search_path;
3011
3508
  // transaction poolers reset session state between statements.
3012
3509
  const kysely = options.schema ? root.withPlugin(new WithSchemaPlugin(options.schema)) : root