tapimo 0.7.0 → 0.7.2

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 (689) hide show
  1. package/dist/ApiKeys.d.ts +24 -7
  2. package/dist/ApiKeys.d.ts.map +1 -1
  3. package/dist/ApiKeys.js +17 -5
  4. package/dist/ApiKeys.js.map +1 -1
  5. package/dist/App.d.ts +12104 -7861
  6. package/dist/App.d.ts.map +1 -1
  7. package/dist/App.js +191 -128
  8. package/dist/App.js.map +1 -1
  9. package/dist/Assets.d.ts +10 -0
  10. package/dist/Assets.d.ts.map +1 -1
  11. package/dist/Assets.js +17 -4
  12. package/dist/Assets.js.map +1 -1
  13. package/dist/Scope.d.ts +19 -8
  14. package/dist/Scope.d.ts.map +1 -1
  15. package/dist/Scope.js +25 -9
  16. package/dist/Scope.js.map +1 -1
  17. package/dist/Webhooks.d.ts +1 -1
  18. package/dist/admin/App.d.ts +601 -20
  19. package/dist/admin/App.d.ts.map +1 -1
  20. package/dist/admin/App.js +12 -2
  21. package/dist/admin/App.js.map +1 -1
  22. package/dist/admin/apps/api-keys.d.ts +94 -11
  23. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.js +141 -32
  25. package/dist/admin/apps/api-keys.js.map +1 -1
  26. package/dist/admin/apps/earn-vaults.d.ts +1069 -0
  27. package/dist/admin/apps/earn-vaults.d.ts.map +1 -0
  28. package/dist/admin/apps/earn-vaults.js +409 -0
  29. package/dist/admin/apps/earn-vaults.js.map +1 -0
  30. package/dist/admin/apps/verified-tokens.d.ts +166 -166
  31. package/dist/admin/ui.generated.d.ts +1 -1
  32. package/dist/admin/ui.generated.d.ts.map +1 -1
  33. package/dist/admin/ui.generated.js +151 -95
  34. package/dist/admin/ui.generated.js.map +1 -1
  35. package/dist/analytics/Analytics.d.ts +2 -0
  36. package/dist/analytics/Analytics.d.ts.map +1 -1
  37. package/dist/analytics/Analytics.js +18 -2
  38. package/dist/analytics/Analytics.js.map +1 -1
  39. package/dist/analytics/tables/requestEvents.d.ts +22 -1
  40. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  41. package/dist/analytics/tables/requestEvents.js +59 -39
  42. package/dist/analytics/tables/requestEvents.js.map +1 -1
  43. package/dist/apps/Zones.d.ts +8335 -0
  44. package/dist/apps/Zones.d.ts.map +1 -0
  45. package/dist/apps/Zones.js +38 -0
  46. package/dist/apps/Zones.js.map +1 -0
  47. package/dist/apps/data/App.d.ts +14377 -10165
  48. package/dist/apps/data/App.d.ts.map +1 -1
  49. package/dist/apps/data/App.js +91 -19
  50. package/dist/apps/data/App.js.map +1 -1
  51. package/dist/apps/data/FxOracle.d.ts +1 -1
  52. package/dist/apps/data/FxOracle.d.ts.map +1 -1
  53. package/dist/apps/data/index.d.ts +0 -1
  54. package/dist/apps/data/index.d.ts.map +1 -1
  55. package/dist/apps/data/index.js +0 -1
  56. package/dist/apps/data/index.js.map +1 -1
  57. package/dist/apps/data/routes/activities.d.ts +32 -32
  58. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  59. package/dist/apps/data/routes/activities.js +130 -65
  60. package/dist/apps/data/routes/activities.js.map +1 -1
  61. package/dist/apps/data/routes/addresses.d.ts +312 -312
  62. package/dist/apps/data/routes/balances.d.ts +18 -18
  63. package/dist/apps/data/routes/balances.js +5 -5
  64. package/dist/apps/data/routes/balances.js.map +1 -1
  65. package/dist/apps/data/routes/coingecko.d.ts +176 -176
  66. package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
  67. package/dist/apps/data/routes/coingecko.js +62 -35
  68. package/dist/apps/data/routes/coingecko.js.map +1 -1
  69. package/dist/apps/data/routes/earn.d.ts +2144 -0
  70. package/dist/apps/data/routes/earn.d.ts.map +1 -0
  71. package/dist/apps/data/routes/earn.js +947 -0
  72. package/dist/apps/data/routes/earn.js.map +1 -0
  73. package/dist/apps/data/routes/exchanges.d.ts +1231 -324
  74. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  75. package/dist/apps/data/routes/exchanges.js +656 -193
  76. package/dist/apps/data/routes/exchanges.js.map +1 -1
  77. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  78. package/dist/apps/data/routes/fee-amm.js +59 -8
  79. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  80. package/dist/apps/data/routes/funding.d.ts +4092 -387
  81. package/dist/apps/data/routes/funding.d.ts.map +1 -1
  82. package/dist/apps/data/routes/funding.js +1403 -256
  83. package/dist/apps/data/routes/funding.js.map +1 -1
  84. package/dist/apps/data/routes/indexer.d.ts +5 -5
  85. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  86. package/dist/apps/data/routes/indexer.js +19 -2
  87. package/dist/apps/data/routes/indexer.js.map +1 -1
  88. package/dist/apps/data/routes/receipts.d.ts +265 -265
  89. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  90. package/dist/apps/data/routes/receipts.js +11 -11
  91. package/dist/apps/data/routes/receipts.js.map +1 -1
  92. package/dist/apps/data/routes/rpc.d.ts +5 -5
  93. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  94. package/dist/apps/data/routes/rpc.js +211 -22
  95. package/dist/apps/data/routes/rpc.js.map +1 -1
  96. package/dist/apps/data/routes/tokenlist.d.ts +36 -36
  97. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  98. package/dist/apps/data/routes/tokenlist.js +49 -9
  99. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  100. package/dist/apps/data/routes/tokens.d.ts +116 -88
  101. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  102. package/dist/apps/data/routes/tokens.js +198 -91
  103. package/dist/apps/data/routes/tokens.js.map +1 -1
  104. package/dist/apps/data/routes/transactions.d.ts +55 -55
  105. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  106. package/dist/apps/data/routes/transactions.js +78 -39
  107. package/dist/apps/data/routes/transactions.js.map +1 -1
  108. package/dist/apps/data/routes/transfers.d.ts +78 -29
  109. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  110. package/dist/apps/data/routes/transfers.js +165 -67
  111. package/dist/apps/data/routes/transfers.js.map +1 -1
  112. package/dist/apps/data/routes/valuation.d.ts +10 -10
  113. package/dist/apps/data/routes/valuation.js +2 -2
  114. package/dist/apps/data/routes/valuation.js.map +1 -1
  115. package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -1
  116. package/dist/apps/data/routes/verified-tokens.js +34 -9
  117. package/dist/apps/data/routes/verified-tokens.js.map +1 -1
  118. package/dist/apps/data/routes/webhooks.d.ts +5 -3
  119. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  120. package/dist/apps/data/routes/webhooks.js +175 -65
  121. package/dist/apps/data/routes/webhooks.js.map +1 -1
  122. package/dist/apps/data/routes/zones.d.ts +281 -0
  123. package/dist/apps/data/routes/zones.d.ts.map +1 -0
  124. package/dist/apps/data/routes/zones.js +252 -0
  125. package/dist/apps/data/routes/zones.js.map +1 -0
  126. package/dist/apps/docs/reference.js +6 -5
  127. package/dist/apps/docs/reference.js.map +1 -1
  128. package/dist/apps/index.d.ts +2 -1
  129. package/dist/apps/index.d.ts.map +1 -1
  130. package/dist/apps/index.js +2 -1
  131. package/dist/apps/index.js.map +1 -1
  132. package/dist/apps/management/App.d.ts +670 -670
  133. package/dist/apps/management/Billing.d.ts +8 -0
  134. package/dist/apps/management/Billing.d.ts.map +1 -1
  135. package/dist/apps/management/Billing.js +12 -0
  136. package/dist/apps/management/Billing.js.map +1 -1
  137. package/dist/apps/management/Error.d.ts +12 -0
  138. package/dist/apps/management/Error.d.ts.map +1 -0
  139. package/dist/apps/management/Error.js +10 -0
  140. package/dist/apps/management/Error.js.map +1 -0
  141. package/dist/apps/management/routes/api-keys.d.ts +5 -5
  142. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  143. package/dist/apps/management/routes/api-keys.js +2 -8
  144. package/dist/apps/management/routes/api-keys.js.map +1 -1
  145. package/dist/apps/management/routes/billing.d.ts +119 -119
  146. package/dist/apps/management/routes/faucet.d.ts +35 -35
  147. package/dist/apps/management/routes/invitations.d.ts +62 -62
  148. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  149. package/dist/apps/management/routes/invitations.js +4 -10
  150. package/dist/apps/management/routes/invitations.js.map +1 -1
  151. package/dist/apps/management/routes/invite-links.d.ts +30 -30
  152. package/dist/apps/management/routes/me.d.ts +6 -6
  153. package/dist/apps/management/routes/members.d.ts +78 -78
  154. package/dist/apps/management/routes/orgs.d.ts +48 -48
  155. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  156. package/dist/apps/management/routes/orgs.js +2 -8
  157. package/dist/apps/management/routes/orgs.js.map +1 -1
  158. package/dist/apps/management/routes/projects.d.ts +9 -9
  159. package/dist/apps/management/routes/scopes.js +2 -2
  160. package/dist/apps/management/routes/scopes.js.map +1 -1
  161. package/dist/apps/management/routes/usage.d.ts +80 -80
  162. package/dist/apps/management/routes/verified-token-requests.d.ts +36 -36
  163. package/dist/apps/management/routes/webhooks.d.ts +50 -50
  164. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  165. package/dist/apps/management/routes/webhooks.js +15 -3
  166. package/dist/apps/management/routes/webhooks.js.map +1 -1
  167. package/dist/apps/mpp/App.d.ts +55 -56
  168. package/dist/apps/mpp/App.d.ts.map +1 -1
  169. package/dist/apps/mpp/App.js +192 -27
  170. package/dist/apps/mpp/App.js.map +1 -1
  171. package/dist/apps/mpp/Mpp.d.ts +0 -20
  172. package/dist/apps/mpp/Mpp.d.ts.map +1 -1
  173. package/dist/apps/mpp/Mpp.js +0 -24
  174. package/dist/apps/mpp/Mpp.js.map +1 -1
  175. package/dist/apps/mpp/internal/Adapter.d.ts +40 -0
  176. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -0
  177. package/dist/apps/mpp/internal/Adapter.js +66 -0
  178. package/dist/apps/mpp/internal/Adapter.js.map +1 -0
  179. package/dist/apps/mpp/internal/Error.d.ts +4 -0
  180. package/dist/apps/mpp/internal/Error.d.ts.map +1 -0
  181. package/dist/apps/mpp/internal/Error.js +41 -0
  182. package/dist/apps/mpp/internal/Error.js.map +1 -0
  183. package/dist/apps/mpp/internal/Idempotency.d.ts +33 -0
  184. package/dist/apps/mpp/internal/Idempotency.d.ts.map +1 -0
  185. package/dist/apps/mpp/internal/Idempotency.js +28 -0
  186. package/dist/apps/mpp/internal/Idempotency.js.map +1 -0
  187. package/dist/apps/mpp/internal/Policy.d.ts +46 -0
  188. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -0
  189. package/dist/apps/mpp/internal/Policy.js +57 -0
  190. package/dist/apps/mpp/internal/Policy.js.map +1 -0
  191. package/dist/apps/mpp/internal/ScreenManager.d.ts +27 -0
  192. package/dist/apps/mpp/internal/ScreenManager.d.ts.map +1 -0
  193. package/dist/apps/mpp/internal/ScreenManager.js +18 -0
  194. package/dist/apps/mpp/internal/ScreenManager.js.map +1 -0
  195. package/dist/apps/mpp/internal/Screening.d.ts +35 -0
  196. package/dist/apps/mpp/internal/Screening.d.ts.map +1 -0
  197. package/dist/apps/mpp/internal/Screening.js +20 -0
  198. package/dist/apps/mpp/internal/Screening.js.map +1 -0
  199. package/dist/apps/mpp/internal/Sponsorship.d.ts +36 -0
  200. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -0
  201. package/dist/apps/mpp/internal/Sponsorship.js +103 -0
  202. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -0
  203. package/dist/apps/mpp/internal/Utils.d.ts +7 -0
  204. package/dist/apps/mpp/internal/Utils.d.ts.map +1 -0
  205. package/dist/apps/mpp/internal/Utils.js +24 -0
  206. package/dist/apps/mpp/internal/Utils.js.map +1 -0
  207. package/dist/apps/relay/App.js +184 -24
  208. package/dist/apps/relay/App.js.map +1 -1
  209. package/dist/apps/relay/Sponsorships.d.ts +4 -0
  210. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  211. package/dist/apps/relay/Sponsorships.js +16 -7
  212. package/dist/apps/relay/Sponsorships.js.map +1 -1
  213. package/dist/db/Db.d.ts +20 -0
  214. package/dist/db/Db.d.ts.map +1 -1
  215. package/dist/db/Db.js +342 -0
  216. package/dist/db/Db.js.map +1 -1
  217. package/dist/db/Schema.d.ts +921 -1
  218. package/dist/db/Schema.d.ts.map +1 -1
  219. package/dist/db/Schema.js +269 -1
  220. package/dist/db/Schema.js.map +1 -1
  221. package/dist/db/tables/earnVaults.d.ts +68 -0
  222. package/dist/db/tables/earnVaults.d.ts.map +1 -0
  223. package/dist/db/tables/earnVaults.js +72 -0
  224. package/dist/db/tables/earnVaults.js.map +1 -0
  225. package/dist/db/tables/fundingCatalog.d.ts +56 -0
  226. package/dist/db/tables/fundingCatalog.d.ts.map +1 -0
  227. package/dist/db/tables/fundingCatalog.js +85 -0
  228. package/dist/db/tables/fundingCatalog.js.map +1 -0
  229. package/dist/db/tables/fundingDepositAddresses.d.ts +159 -0
  230. package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
  231. package/dist/db/tables/fundingDepositAddresses.js +206 -0
  232. package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
  233. package/dist/db/tables/fundingDeposits.d.ts +115 -0
  234. package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
  235. package/dist/db/tables/fundingDeposits.js +100 -0
  236. package/dist/db/tables/fundingDeposits.js.map +1 -0
  237. package/dist/db/tables/fundingIdempotency.d.ts +91 -0
  238. package/dist/db/tables/fundingIdempotency.d.ts.map +1 -0
  239. package/dist/db/tables/fundingIdempotency.js +103 -0
  240. package/dist/db/tables/fundingIdempotency.js.map +1 -0
  241. package/dist/db/tables/fundingTransferEvents.d.ts +12 -0
  242. package/dist/db/tables/fundingTransferEvents.d.ts.map +1 -0
  243. package/dist/db/tables/fundingTransferEvents.js +18 -0
  244. package/dist/db/tables/fundingTransferEvents.js.map +1 -0
  245. package/dist/db/tables/fundingTransferTransactions.d.ts +15 -0
  246. package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -0
  247. package/dist/db/tables/fundingTransferTransactions.js +27 -0
  248. package/dist/db/tables/fundingTransferTransactions.js.map +1 -0
  249. package/dist/db/tables/fundingTransfers.d.ts +82 -0
  250. package/dist/db/tables/fundingTransfers.d.ts.map +1 -0
  251. package/dist/db/tables/fundingTransfers.js +89 -0
  252. package/dist/db/tables/fundingTransfers.js.map +1 -0
  253. package/dist/db/tables/organizations.d.ts +8 -0
  254. package/dist/db/tables/organizations.d.ts.map +1 -1
  255. package/dist/db/tables/organizations.js +35 -0
  256. package/dist/db/tables/organizations.js.map +1 -1
  257. package/dist/db/tables/projects.d.ts +8 -0
  258. package/dist/db/tables/projects.d.ts.map +1 -1
  259. package/dist/db/tables/projects.js +16 -0
  260. package/dist/db/tables/projects.js.map +1 -1
  261. package/dist/db/tables/requestUsage.d.ts +13 -0
  262. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  263. package/dist/db/tables/requestUsage.js +16 -0
  264. package/dist/db/tables/requestUsage.js.map +1 -1
  265. package/dist/db/tables/sponsoredTransactions.d.ts +4 -2
  266. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  267. package/dist/db/tables/sponsoredTransactions.js +14 -4
  268. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  269. package/dist/db/tables/users.d.ts +8 -0
  270. package/dist/db/tables/users.d.ts.map +1 -1
  271. package/dist/db/tables/users.js +16 -0
  272. package/dist/db/tables/users.js.map +1 -1
  273. package/dist/db/tables/verifiedTokens.d.ts +14 -7
  274. package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
  275. package/dist/db/tables/verifiedTokens.js +9 -7
  276. package/dist/db/tables/verifiedTokens.js.map +1 -1
  277. package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
  278. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  279. package/dist/db/tables/webhookSubscriptions.js +24 -3
  280. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  281. package/dist/handlers/relay.js +108 -108
  282. package/dist/handlers/relay.js.map +1 -1
  283. package/dist/internal/Auth.d.ts +26 -0
  284. package/dist/internal/Auth.d.ts.map +1 -1
  285. package/dist/internal/Auth.js +35 -2
  286. package/dist/internal/Auth.js.map +1 -1
  287. package/dist/internal/Cache.d.ts.map +1 -1
  288. package/dist/internal/Cache.js +16 -10
  289. package/dist/internal/Cache.js.map +1 -1
  290. package/dist/internal/Cursor.js +1 -1
  291. package/dist/internal/Cursor.js.map +1 -1
  292. package/dist/internal/EarnRates.d.ts +89 -0
  293. package/dist/internal/EarnRates.d.ts.map +1 -0
  294. package/dist/internal/EarnRates.js +266 -0
  295. package/dist/internal/EarnRates.js.map +1 -0
  296. package/dist/internal/EarnVaults.d.ts +171 -0
  297. package/dist/internal/EarnVaults.d.ts.map +1 -0
  298. package/dist/internal/EarnVaults.js +547 -0
  299. package/dist/internal/EarnVaults.js.map +1 -0
  300. package/dist/internal/EdgeCache.d.ts +9 -2
  301. package/dist/internal/EdgeCache.d.ts.map +1 -1
  302. package/dist/internal/EdgeCache.js +36 -9
  303. package/dist/internal/EdgeCache.js.map +1 -1
  304. package/dist/internal/Id.d.ts +11 -0
  305. package/dist/internal/Id.d.ts.map +1 -1
  306. package/dist/internal/Id.js +13 -0
  307. package/dist/internal/Id.js.map +1 -1
  308. package/dist/internal/Idempotency.d.ts +83 -0
  309. package/dist/internal/Idempotency.d.ts.map +1 -0
  310. package/dist/internal/Idempotency.js +113 -0
  311. package/dist/internal/Idempotency.js.map +1 -0
  312. package/dist/internal/Log.d.ts +64 -9
  313. package/dist/internal/Log.d.ts.map +1 -1
  314. package/dist/internal/Log.js +29 -7
  315. package/dist/internal/Log.js.map +1 -1
  316. package/dist/internal/MetricSink.d.ts.map +1 -1
  317. package/dist/internal/MetricSink.js +47 -1
  318. package/dist/internal/MetricSink.js.map +1 -1
  319. package/dist/internal/OpenApi.d.ts +1 -1
  320. package/dist/internal/OpenApi.d.ts.map +1 -1
  321. package/dist/internal/OpenApi.js +3 -0
  322. package/dist/internal/OpenApi.js.map +1 -1
  323. package/dist/internal/Provider.d.ts +14 -0
  324. package/dist/internal/Provider.d.ts.map +1 -0
  325. package/dist/internal/Provider.js +5 -0
  326. package/dist/internal/Provider.js.map +1 -0
  327. package/dist/internal/Schema.d.ts +8 -3
  328. package/dist/internal/Schema.d.ts.map +1 -1
  329. package/dist/internal/Schema.js +24 -13
  330. package/dist/internal/Schema.js.map +1 -1
  331. package/dist/internal/Store.d.ts +6 -0
  332. package/dist/internal/Store.d.ts.map +1 -1
  333. package/dist/internal/Store.js +35 -0
  334. package/dist/internal/Store.js.map +1 -1
  335. package/dist/internal/Tidx.d.ts +43 -24
  336. package/dist/internal/Tidx.d.ts.map +1 -1
  337. package/dist/internal/Tidx.js +79 -11
  338. package/dist/internal/Tidx.js.map +1 -1
  339. package/dist/internal/Viem.d.ts +82 -65
  340. package/dist/internal/Viem.d.ts.map +1 -1
  341. package/dist/internal/Viem.js +83 -12
  342. package/dist/internal/Viem.js.map +1 -1
  343. package/dist/internal/WebhookDestination.d.ts.map +1 -1
  344. package/dist/internal/WebhookDestination.js +34 -28
  345. package/dist/internal/WebhookDestination.js.map +1 -1
  346. package/dist/internal/Webhooks.d.ts +9 -0
  347. package/dist/internal/Webhooks.d.ts.map +1 -1
  348. package/dist/internal/Webhooks.js +15 -10
  349. package/dist/internal/Webhooks.js.map +1 -1
  350. package/dist/internal/exchange/Provider.d.ts +219 -0
  351. package/dist/internal/exchange/Provider.d.ts.map +1 -0
  352. package/dist/internal/exchange/Provider.js +117 -0
  353. package/dist/internal/exchange/Provider.js.map +1 -0
  354. package/dist/internal/exchange/index.d.ts +2 -0
  355. package/dist/internal/exchange/index.d.ts.map +1 -0
  356. package/dist/internal/exchange/index.js +2 -0
  357. package/dist/internal/exchange/index.js.map +1 -0
  358. package/dist/internal/exchange/providers/uniswap.d.ts +57 -0
  359. package/dist/internal/exchange/providers/uniswap.d.ts.map +1 -0
  360. package/dist/internal/exchange/providers/uniswap.js +553 -0
  361. package/dist/internal/exchange/providers/uniswap.js.map +1 -0
  362. package/dist/internal/funding/Action.d.ts +55 -0
  363. package/dist/internal/funding/Action.d.ts.map +1 -0
  364. package/dist/internal/funding/Action.js +74 -0
  365. package/dist/internal/funding/Action.js.map +1 -0
  366. package/dist/internal/funding/Catalog.d.ts +107 -0
  367. package/dist/internal/funding/Catalog.d.ts.map +1 -0
  368. package/dist/internal/funding/Catalog.js +270 -0
  369. package/dist/internal/funding/Catalog.js.map +1 -0
  370. package/dist/internal/funding/Chain.d.ts +76 -0
  371. package/dist/internal/funding/Chain.d.ts.map +1 -0
  372. package/dist/internal/funding/Chain.js +38 -0
  373. package/dist/internal/funding/Chain.js.map +1 -0
  374. package/dist/internal/funding/Deposit.d.ts +366 -0
  375. package/dist/internal/funding/Deposit.d.ts.map +1 -0
  376. package/dist/internal/funding/Deposit.js +286 -0
  377. package/dist/internal/funding/Deposit.js.map +1 -0
  378. package/dist/internal/funding/DepositAddress.d.ts +345 -0
  379. package/dist/internal/funding/DepositAddress.d.ts.map +1 -0
  380. package/dist/internal/funding/DepositAddress.js +189 -0
  381. package/dist/internal/funding/DepositAddress.js.map +1 -0
  382. package/dist/internal/funding/Evidence.d.ts +52 -0
  383. package/dist/internal/funding/Evidence.d.ts.map +1 -0
  384. package/dist/internal/funding/Evidence.js +314 -0
  385. package/dist/internal/funding/Evidence.js.map +1 -0
  386. package/dist/internal/funding/Provider.d.ts +1186 -0
  387. package/dist/internal/funding/Provider.d.ts.map +1 -0
  388. package/dist/internal/funding/Provider.js +1081 -0
  389. package/dist/internal/funding/Provider.js.map +1 -0
  390. package/dist/internal/funding/Reconciliation.d.ts +113 -0
  391. package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
  392. package/dist/internal/funding/Reconciliation.js +676 -0
  393. package/dist/internal/funding/Reconciliation.js.map +1 -0
  394. package/dist/internal/funding/Route.d.ts +21 -0
  395. package/dist/internal/funding/Route.d.ts.map +1 -0
  396. package/dist/internal/funding/Route.js +5 -0
  397. package/dist/internal/funding/Route.js.map +1 -0
  398. package/dist/internal/funding/Subsidy.d.ts +113 -0
  399. package/dist/internal/funding/Subsidy.d.ts.map +1 -0
  400. package/dist/internal/funding/Subsidy.js +138 -0
  401. package/dist/internal/funding/Subsidy.js.map +1 -0
  402. package/dist/internal/funding/Token.d.ts +41 -0
  403. package/dist/internal/funding/Token.d.ts.map +1 -0
  404. package/dist/internal/funding/Token.js +22 -0
  405. package/dist/internal/funding/Token.js.map +1 -0
  406. package/dist/internal/funding/Transfer.d.ts +643 -0
  407. package/dist/internal/funding/Transfer.d.ts.map +1 -0
  408. package/dist/internal/funding/Transfer.js +332 -0
  409. package/dist/internal/funding/Transfer.js.map +1 -0
  410. package/dist/internal/funding/index.d.ts +13 -0
  411. package/dist/internal/funding/index.d.ts.map +1 -0
  412. package/dist/internal/funding/index.js +13 -0
  413. package/dist/internal/funding/index.js.map +1 -0
  414. package/dist/internal/funding/providers/across.d.ts +21 -0
  415. package/dist/internal/funding/providers/across.d.ts.map +1 -0
  416. package/dist/internal/funding/providers/across.js +117 -0
  417. package/dist/internal/funding/providers/across.js.map +1 -0
  418. package/dist/internal/funding/providers/relay.d.ts +46 -0
  419. package/dist/internal/funding/providers/relay.d.ts.map +1 -0
  420. package/dist/internal/funding/providers/relay.js +464 -0
  421. package/dist/internal/funding/providers/relay.js.map +1 -0
  422. package/dist/internal/funding/providers/rhino.d.ts +15 -0
  423. package/dist/internal/funding/providers/rhino.d.ts.map +1 -0
  424. package/dist/internal/funding/providers/rhino.js +116 -0
  425. package/dist/internal/funding/providers/rhino.js.map +1 -0
  426. package/dist/internal/funding/providers/squid.d.ts +19 -0
  427. package/dist/internal/funding/providers/squid.d.ts.map +1 -0
  428. package/dist/internal/funding/providers/squid.js +120 -0
  429. package/dist/internal/funding/providers/squid.js.map +1 -0
  430. package/dist/internal/funding/providers/symbiosis.d.ts +20 -0
  431. package/dist/internal/funding/providers/symbiosis.d.ts.map +1 -0
  432. package/dist/internal/funding/providers/symbiosis.js +176 -0
  433. package/dist/internal/funding/providers/symbiosis.js.map +1 -0
  434. package/dist/internal/index.d.ts +5 -1
  435. package/dist/internal/index.d.ts.map +1 -1
  436. package/dist/internal/index.js +5 -1
  437. package/dist/internal/index.js.map +1 -1
  438. package/dist/internal/webhookDestinations/url.js +61 -57
  439. package/dist/internal/webhookDestinations/url.js.map +1 -1
  440. package/dist/providers/index.d.ts +43 -0
  441. package/dist/providers/index.d.ts.map +1 -0
  442. package/dist/providers/index.js +19 -0
  443. package/dist/providers/index.js.map +1 -0
  444. package/package.json +9 -4
  445. package/src/ApiKeys.test.ts +11 -7
  446. package/src/ApiKeys.ts +37 -9
  447. package/src/App.test.ts +85 -10
  448. package/src/App.ts +224 -137
  449. package/src/Assets.ts +29 -4
  450. package/src/Client.test-d.ts +650 -30
  451. package/src/Scope.test.ts +19 -0
  452. package/src/Scope.ts +28 -11
  453. package/src/Webhooks.test.ts +25 -0
  454. package/src/Webhooks.ts +1 -1
  455. package/src/admin/App.test.ts +9 -2
  456. package/src/admin/App.ts +32 -9
  457. package/src/admin/apps/api-keys.test.ts +167 -23
  458. package/src/admin/apps/api-keys.ts +166 -28
  459. package/src/admin/apps/earn-vaults.test.ts +338 -0
  460. package/src/admin/apps/earn-vaults.ts +572 -0
  461. package/src/admin/apps/scopes.test.ts +16 -1
  462. package/src/admin/ui/plugin.ts +2 -2
  463. package/src/admin/ui/src/components/EarnVaultForm.tsx +137 -0
  464. package/src/admin/ui/src/components/MobileProfile.tsx +2 -2
  465. package/src/admin/ui/src/components/Page.tsx +1 -1
  466. package/src/admin/ui/src/components/ThemeToggle.tsx +1 -1
  467. package/src/admin/ui/src/lib/api-keys.ts +37 -7
  468. package/src/admin/ui/src/lib/client.ts +1 -1
  469. package/src/admin/ui/src/lib/config.ts +1 -1
  470. package/src/admin/ui/src/lib/early-access.ts +8 -9
  471. package/src/admin/ui/src/lib/earn-vaults.ts +207 -0
  472. package/src/admin/ui/src/lib/format.ts +13 -0
  473. package/src/admin/ui/src/lib/organizations.test.ts +14 -4
  474. package/src/admin/ui/src/lib/organizations.ts +7 -1
  475. package/src/admin/ui/src/lib/response.ts +22 -0
  476. package/src/admin/ui/src/lib/scopes.test.ts +19 -11
  477. package/src/admin/ui/src/lib/scopes.ts +28 -7
  478. package/src/admin/ui/src/lib/verified-tokens.ts +10 -9
  479. package/src/admin/ui/src/routeTree.gen.ts +70 -7
  480. package/src/admin/ui/src/router.tsx +2 -2
  481. package/src/admin/ui/src/routes/__root.tsx +9 -8
  482. package/src/admin/ui/src/routes/api-keys.tsx +475 -64
  483. package/src/admin/ui/src/routes/early-access.tsx +5 -12
  484. package/src/admin/ui/src/routes/earn.vaults.tsx +348 -0
  485. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +154 -0
  486. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +190 -0
  487. package/src/admin/ui/src/routes/organizations.tsx +4 -7
  488. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +56 -54
  489. package/src/admin/ui/src/routes/verified-tokens.tsx +4 -4
  490. package/src/admin/ui/vite.config.ts +4 -1
  491. package/src/admin/ui.generated.ts +189 -95
  492. package/src/analytics/Analytics.test.ts +69 -10
  493. package/src/analytics/Analytics.ts +20 -1
  494. package/src/analytics/tables/requestEvents.ts +79 -37
  495. package/src/apps/Zones.test.ts +33 -0
  496. package/src/apps/Zones.ts +40 -0
  497. package/src/apps/composition.test.ts +84 -1
  498. package/src/apps/data/App.test.ts +38 -9
  499. package/src/apps/data/App.ts +96 -33
  500. package/src/apps/data/FxOracle.ts +1 -1
  501. package/src/apps/data/index.ts +0 -1
  502. package/src/apps/data/routes/activities.test.ts +82 -6
  503. package/src/apps/data/routes/activities.ts +131 -71
  504. package/src/apps/data/routes/balances.test.ts +50 -37
  505. package/src/apps/data/routes/balances.ts +5 -5
  506. package/src/apps/data/routes/blocks.test.ts +2 -0
  507. package/src/apps/data/routes/coingecko.test.ts +22 -0
  508. package/src/apps/data/routes/coingecko.ts +84 -48
  509. package/src/apps/data/routes/earn.test.ts +1108 -0
  510. package/src/apps/data/routes/earn.ts +1391 -0
  511. package/src/apps/data/routes/exchanges.test.ts +82 -33
  512. package/src/apps/data/routes/exchanges.ts +842 -227
  513. package/src/apps/data/routes/fee-amm.test.ts +4 -6
  514. package/src/apps/data/routes/fee-amm.ts +69 -12
  515. package/src/apps/data/routes/funding.test.ts +2712 -221
  516. package/src/apps/data/routes/funding.ts +1604 -387
  517. package/src/apps/data/routes/indexer.test.ts +43 -34
  518. package/src/apps/data/routes/indexer.ts +19 -2
  519. package/src/apps/data/routes/receipts.test.ts +5 -3
  520. package/src/apps/data/routes/receipts.ts +13 -11
  521. package/src/apps/data/routes/rpc.test.ts +446 -28
  522. package/src/apps/data/routes/rpc.ts +243 -25
  523. package/src/apps/data/routes/tokenlist.test.ts +15 -0
  524. package/src/apps/data/routes/tokenlist.ts +88 -22
  525. package/src/apps/data/routes/tokens.ts +262 -86
  526. package/src/apps/data/routes/transactions.test.ts +2 -0
  527. package/src/apps/data/routes/transactions.ts +77 -42
  528. package/src/apps/data/routes/transfers.test.ts +166 -4
  529. package/src/apps/data/routes/transfers.ts +216 -78
  530. package/src/apps/data/routes/valuation.test.ts +62 -9
  531. package/src/apps/data/routes/valuation.ts +2 -2
  532. package/src/apps/data/routes/verified-tokens.test.ts +51 -0
  533. package/src/apps/data/routes/verified-tokens.ts +52 -15
  534. package/src/apps/data/routes/webhooks.test.ts +432 -33
  535. package/src/apps/data/routes/webhooks.ts +189 -79
  536. package/src/apps/data/routes/zones.test.ts +473 -0
  537. package/src/apps/data/routes/zones.ts +338 -0
  538. package/src/apps/docs/reference.ts +8 -6
  539. package/src/apps/index.ts +2 -1
  540. package/src/apps/management/Billing.test.ts +29 -0
  541. package/src/apps/management/Billing.ts +23 -0
  542. package/src/apps/management/Error.ts +12 -0
  543. package/src/apps/management/routes/api-keys.test.ts +5 -3
  544. package/src/apps/management/routes/api-keys.ts +2 -9
  545. package/src/apps/management/routes/invitations.ts +4 -11
  546. package/src/apps/management/routes/orgs.ts +2 -9
  547. package/src/apps/management/routes/scopes.test.ts +7 -2
  548. package/src/apps/management/routes/scopes.ts +2 -2
  549. package/src/apps/management/routes/webhooks.test.ts +6 -1
  550. package/src/apps/management/routes/webhooks.ts +15 -3
  551. package/src/apps/mpp/App.ts +276 -29
  552. package/src/apps/mpp/Mpp.test.ts +631 -26
  553. package/src/apps/mpp/Mpp.ts +0 -42
  554. package/src/apps/mpp/internal/Adapter.ts +108 -3
  555. package/src/apps/mpp/internal/Error.test.ts +33 -0
  556. package/src/apps/mpp/internal/Error.ts +44 -6
  557. package/src/apps/mpp/internal/Idempotency.test.ts +213 -0
  558. package/src/apps/mpp/internal/Idempotency.ts +59 -5
  559. package/src/apps/mpp/internal/Policy.test.ts +122 -0
  560. package/src/apps/mpp/internal/Policy.ts +98 -0
  561. package/src/apps/mpp/internal/ScreenManager.test.ts +68 -0
  562. package/src/apps/mpp/internal/ScreenManager.ts +41 -0
  563. package/src/apps/mpp/internal/Screening.ts +40 -3
  564. package/src/apps/mpp/internal/Sponsorship.ts +144 -0
  565. package/src/apps/mpp/internal/Utils.ts +30 -0
  566. package/src/apps/relay/App.test.ts +495 -64
  567. package/src/apps/relay/App.ts +234 -24
  568. package/src/apps/relay/Sponsorships.test.ts +51 -0
  569. package/src/apps/relay/Sponsorships.ts +19 -7
  570. package/src/db/Db.ts +439 -0
  571. package/src/db/Schema.ts +325 -2
  572. package/src/db/tables/earnVaults.test.ts +185 -0
  573. package/src/db/tables/earnVaults.ts +151 -0
  574. package/src/db/tables/fundingCatalog.test.ts +108 -0
  575. package/src/db/tables/fundingCatalog.ts +157 -0
  576. package/src/db/tables/fundingDepositAddresses.test.ts +580 -0
  577. package/src/db/tables/fundingDepositAddresses.ts +376 -0
  578. package/src/db/tables/fundingDeposits.test.ts +261 -0
  579. package/src/db/tables/fundingDeposits.ts +229 -0
  580. package/src/db/tables/fundingIdempotency.test.ts +182 -0
  581. package/src/db/tables/fundingIdempotency.ts +180 -0
  582. package/src/db/tables/fundingTransferEvents.ts +28 -0
  583. package/src/db/tables/fundingTransferTransactions.test.ts +69 -0
  584. package/src/db/tables/fundingTransferTransactions.ts +37 -0
  585. package/src/db/tables/fundingTransfers.test.ts +89 -0
  586. package/src/db/tables/fundingTransfers.ts +153 -0
  587. package/src/db/tables/organizations.test.ts +88 -0
  588. package/src/db/tables/organizations.ts +42 -1
  589. package/src/db/tables/projects.ts +16 -0
  590. package/src/db/tables/requestUsage.ts +23 -0
  591. package/src/db/tables/sponsoredTransactions.test.ts +52 -2
  592. package/src/db/tables/sponsoredTransactions.ts +18 -6
  593. package/src/db/tables/users.ts +16 -0
  594. package/src/db/tables/verifiedTokens.ts +19 -14
  595. package/src/db/tables/webhookSubscriptions.ts +58 -3
  596. package/src/handlers/relay.test.ts +2 -0
  597. package/src/handlers/relay.ts +95 -99
  598. package/src/internal/Auth.test.ts +48 -0
  599. package/src/internal/Auth.ts +61 -2
  600. package/src/internal/Cache.ts +13 -9
  601. package/src/internal/Cursor.test.ts +2 -2
  602. package/src/internal/Cursor.ts +1 -1
  603. package/src/internal/EarnRates.test.ts +125 -0
  604. package/src/internal/EarnRates.ts +409 -0
  605. package/src/internal/EarnVaults.test.ts +195 -0
  606. package/src/internal/EarnVaults.ts +876 -0
  607. package/src/internal/EdgeCache.test.ts +37 -5
  608. package/src/internal/EdgeCache.ts +39 -7
  609. package/src/internal/Id.ts +14 -0
  610. package/src/internal/Idempotency.test.ts +109 -0
  611. package/src/internal/Idempotency.ts +237 -0
  612. package/src/internal/Log.test-d.ts +41 -8
  613. package/src/internal/Log.test.ts +189 -8
  614. package/src/internal/Log.ts +124 -17
  615. package/src/internal/MetricSink.test.ts +244 -4
  616. package/src/internal/MetricSink.ts +51 -1
  617. package/src/internal/OpenApi.ts +3 -0
  618. package/src/internal/Provider.test.ts +17 -0
  619. package/src/internal/Provider.ts +17 -0
  620. package/src/internal/Schema.test.ts +13 -0
  621. package/src/internal/Schema.ts +41 -24
  622. package/src/internal/Store.test.ts +25 -0
  623. package/src/internal/Store.ts +46 -0
  624. package/src/internal/Tidx.local.test.ts +78 -3
  625. package/src/internal/Tidx.test.ts +212 -18
  626. package/src/internal/Tidx.ts +112 -32
  627. package/src/internal/VerifiedTokens.test.ts +15 -0
  628. package/src/internal/Viem.test.ts +170 -17
  629. package/src/internal/Viem.ts +111 -28
  630. package/src/internal/WebhookDestination.ts +25 -23
  631. package/src/internal/Webhooks.test.ts +59 -0
  632. package/src/internal/Webhooks.ts +34 -10
  633. package/src/internal/exchange/Provider.test.ts +216 -0
  634. package/src/internal/exchange/Provider.ts +326 -0
  635. package/src/internal/exchange/index.test.ts +6 -0
  636. package/src/internal/exchange/index.ts +1 -0
  637. package/src/internal/exchange/providers/uniswap.test.ts +122 -0
  638. package/src/internal/exchange/providers/uniswap.ts +682 -0
  639. package/src/internal/funding/Action.test.ts +138 -0
  640. package/src/internal/funding/Action.ts +117 -0
  641. package/src/internal/funding/Catalog.test.ts +311 -0
  642. package/src/internal/funding/Catalog.ts +347 -0
  643. package/src/internal/funding/Chain.test.ts +79 -0
  644. package/src/internal/funding/Chain.ts +120 -0
  645. package/src/internal/funding/Deposit.test.ts +26 -0
  646. package/src/internal/funding/Deposit.ts +453 -0
  647. package/src/internal/funding/DepositAddress.test.ts +18 -0
  648. package/src/internal/funding/DepositAddress.ts +312 -0
  649. package/src/internal/funding/Evidence.test.ts +297 -0
  650. package/src/internal/funding/Evidence.ts +430 -0
  651. package/src/internal/funding/Provider.test.ts +1328 -0
  652. package/src/internal/funding/Provider.ts +1796 -0
  653. package/src/internal/funding/Reconciliation.local.test.ts +504 -0
  654. package/src/internal/funding/Reconciliation.test.ts +2020 -0
  655. package/src/internal/funding/Reconciliation.ts +930 -0
  656. package/src/internal/funding/Route.test.ts +66 -0
  657. package/src/internal/funding/Route.ts +29 -0
  658. package/src/internal/funding/Subsidy.local.test.ts +152 -0
  659. package/src/internal/funding/Subsidy.test.ts +75 -0
  660. package/src/internal/funding/Subsidy.ts +260 -0
  661. package/src/internal/funding/Token.test.ts +47 -0
  662. package/src/internal/funding/Token.ts +59 -0
  663. package/src/internal/funding/Transfer.test.ts +369 -0
  664. package/src/internal/funding/Transfer.ts +522 -0
  665. package/src/internal/funding/index.test.ts +20 -0
  666. package/src/internal/funding/index.ts +12 -0
  667. package/src/internal/funding/providers/across.ts +149 -0
  668. package/src/{apps/data/FundingQuoteProviders.test.ts → internal/funding/providers/index.test.ts} +178 -157
  669. package/src/internal/funding/providers/relay.test.ts +474 -0
  670. package/src/internal/funding/providers/relay.ts +559 -0
  671. package/src/internal/funding/providers/rhino.ts +139 -0
  672. package/src/internal/funding/providers/squid.ts +151 -0
  673. package/src/internal/funding/providers/symbiosis.ts +221 -0
  674. package/src/internal/index.test.ts +5 -1
  675. package/src/internal/index.ts +5 -1
  676. package/src/internal/webhookDestinations/url.ts +49 -45
  677. package/src/providers/index.test.ts +14 -0
  678. package/src/providers/index.ts +54 -0
  679. package/dist/apps/data/FundingQuoteProviders.d.ts +0 -174
  680. package/dist/apps/data/FundingQuoteProviders.d.ts.map +0 -1
  681. package/dist/apps/data/FundingQuoteProviders.js +0 -775
  682. package/dist/apps/data/FundingQuoteProviders.js.map +0 -1
  683. package/dist/internal/FundingQuotes.d.ts +0 -864
  684. package/dist/internal/FundingQuotes.d.ts.map +0 -1
  685. package/dist/internal/FundingQuotes.js +0 -672
  686. package/dist/internal/FundingQuotes.js.map +0 -1
  687. package/src/apps/data/FundingQuoteProviders.ts +0 -1043
  688. package/src/internal/FundingQuotes.test.ts +0 -456
  689. package/src/internal/FundingQuotes.ts +0 -944
package/src/db/Schema.ts CHANGED
@@ -1,5 +1,12 @@
1
1
  import * as z from 'zod/mini'
2
-
2
+ import type { Address } from 'viem'
3
+
4
+ import type * as funding_Catalog from '../internal/funding/Catalog.js'
5
+ import type * as funding_Deposit from '../internal/funding/Deposit.js'
6
+ import type * as funding_DepositAddress from '../internal/funding/DepositAddress.js'
7
+ import type * as funding_Provider from '../internal/funding/Provider.js'
8
+ import type * as funding_Transfer from '../internal/funding/Transfer.js'
9
+ import type * as internal_Schema from '../internal/Schema.js'
3
10
  import type * as Webhooks from '../internal/Webhooks.js'
4
11
 
5
12
  /** One authenticated administrator access to a protected admin API route. */
@@ -81,6 +88,30 @@ export const EnabledBillingSource = z.object({
81
88
  /** Columns of the `enabled_billing_sources` table. */
82
89
  export type EnabledBillingSource = z.output<typeof EnabledBillingSource>
83
90
 
91
+ /** One curated Earn vault. */
92
+ export const EarnVault = z
93
+ .object({
94
+ chainId: z.number().check(z.int(), z.describe('Chain the deployment belongs to.')),
95
+ createdAt: z.string().check(z.describe('When the vault was registered (ISO 8601).')),
96
+ description: z
97
+ .nullable(z.string())
98
+ .check(z.describe('Curated vault description, or null when absent.')),
99
+ label: z.string().check(z.describe('Curated vault label.')),
100
+ privateInputTokens: z
101
+ .custom<readonly Address[]>()
102
+ .check(z.describe('Tokens accepted for private deposits (`jsonb`).')),
103
+ privateOutputTokens: z
104
+ .custom<readonly Address[]>()
105
+ .check(z.describe('Tokens supported for private redemptions (`jsonb`).')),
106
+ slug: z.string().check(z.describe('Stable URL slug assigned when the vault is registered.')),
107
+ updatedAt: z.string().check(z.describe('When the vault registration last changed (ISO 8601).')),
108
+ vaultAddress: z.custom<Address>().check(z.describe('Earn vault address (lowercase).')),
109
+ })
110
+ .check(z.describe('One curated Earn vault row.'))
111
+
112
+ /** Columns of the `earn_vaults` table. */
113
+ export type EarnVault = z.output<typeof EarnVault>
114
+
84
115
  /** A pending, expiring offer of organization membership. */
85
116
  export const Invitation = z.object({
86
117
  acceptedAt: z
@@ -250,7 +281,9 @@ export const SponsoredTransaction = z.object({
250
281
  .nullable(z.string())
251
282
  .check(z.describe('When the row was reported to the billing meter (ISO 8601), or null; exactly-once marker.')), // prettier-ignore
252
283
  orgId: z.string().check(z.describe('Organization id (`org_…`) the spend attributes to.')),
253
- projectId: z.string().check(z.describe('Project id (`prj_…`) the spend attributes to.')),
284
+ projectId: z
285
+ .nullable(z.string())
286
+ .check(z.describe('Project id (`prj_…`) the spend attributes to, or null for organization-level spend.')), // prettier-ignore
254
287
  signPayload: z
255
288
  .string()
256
289
  .check(z.describe('Fee-payer sign payload — a stable identity for the sponsored envelope.')),
@@ -361,6 +394,296 @@ export const User = z.object({
361
394
  /** Columns of the `users` table. */
362
395
  export type User = z.output<typeof User>
363
396
 
397
+ /** Metadata for the current funding catalog snapshot. */
398
+ export const FundingCatalog = z.object({
399
+ id: z.string().check(z.describe('Singleton funding catalog id.')),
400
+ updatedAt: z.string().check(z.describe('When the funding catalog was last published.')),
401
+ version: z.string().check(z.describe('Opaque funding catalog version.')),
402
+ })
403
+
404
+ /** Columns of the `funding_catalogs` table. */
405
+ export type FundingCatalog = z.output<typeof FundingCatalog>
406
+
407
+ /** One chain available to the funding catalog. */
408
+ export const FundingChain = z.object({
409
+ aliases: z
410
+ .readonly(z.array(z.string()))
411
+ .check(z.describe('Caller-facing aliases accepted for the funding chain.')),
412
+ id: z.string().check(z.describe('CAIP-2 funding chain identifier.')),
413
+ name: z.string().check(z.describe('Human-readable funding chain name.')),
414
+ parentChainId: z
415
+ .nullable(z.string())
416
+ .check(z.describe('Parent funding chain identifier for a Zone, or null.')),
417
+ rpcUrls: z
418
+ ._default(z.readonly(z.array(z.url())), [])
419
+ .check(z.describe('Public RPC endpoints used for funding-chain evidence.')),
420
+ slug: z.string().check(z.describe('Stable funding chain slug.')),
421
+ })
422
+
423
+ /** Columns of the `funding_chains` table. */
424
+ export type FundingChain = z.output<typeof FundingChain>
425
+
426
+ /** One token available to the funding catalog. */
427
+ export const FundingToken = z.object({
428
+ currency: z.string().check(z.describe('Monetary denomination represented by the token.')),
429
+ id: z.string().check(z.describe('Stable funding token identifier.')),
430
+ name: z.string().check(z.describe('Human-readable funding token name.')),
431
+ symbol: z.string().check(z.describe('Funding token ticker symbol.')),
432
+ })
433
+
434
+ /** Columns of the `funding_tokens` table. */
435
+ export type FundingToken = z.output<typeof FundingToken>
436
+
437
+ /** Chain-specific metadata for one funding token. */
438
+ export const FundingChainToken = z.object({
439
+ address: z.string().check(z.describe('Token address on the funding chain.')),
440
+ chainId: z.string().check(z.describe('CAIP-2 identifier of the funding chain.')),
441
+ decimals: z.number().check(z.int(), z.nonnegative(), z.describe('Token decimal precision.')),
442
+ name: z.nullable(z.string()).check(z.describe('Chain-specific token name override, or null.')),
443
+ standard: z.string().check(z.describe('Token standard on the funding chain.')),
444
+ tokenId: z.string().check(z.describe('Stable funding token identifier.')),
445
+ })
446
+
447
+ /** Columns of the `funding_chain_tokens` table. */
448
+ export type FundingChainToken = z.output<typeof FundingChainToken>
449
+
450
+ /** One source-to-destination route supported by a funding provider. */
451
+ export const FundingRoute = z.object({
452
+ destinationChainId: z.string().check(z.describe('Destination funding chain identifier.')),
453
+ destinationTokenId: z.string().check(z.describe('Destination funding token identifier.')),
454
+ capabilities: z
455
+ .nullable(z.custom<funding_Catalog.Capabilities>())
456
+ .check(z.describe('Executable capability (`jsonb`), or null for indicative-only routes.')),
457
+ providerId: z.string().check(z.describe('Funding provider identifier.')),
458
+ sourceChainId: z.string().check(z.describe('Source funding chain identifier.')),
459
+ sourceTokenId: z.string().check(z.describe('Source funding token identifier.')),
460
+ })
461
+
462
+ /** Columns of the `funding_routes` table. */
463
+ export type FundingRoute = z.output<typeof FundingRoute>
464
+
465
+ /**
466
+ * A reusable funding deposit address. Public route fields live in `snapshot`;
467
+ * provider routing and correlation remain private.
468
+ */
469
+ export const FundingDepositAddress = z.object({
470
+ address: z.string().check(z.describe('Reusable source-chain deposit address.')),
471
+ apiKeyId: z.string().check(z.describe('API key id (`key_…`) that provisioned the address.')),
472
+ createdAt: z.string().check(z.describe('When the address was created (ISO 8601).')),
473
+ deliveryStrategy: z
474
+ .custom<funding_DepositAddress.DeliveryStrategy>()
475
+ .check(z.describe('Whether the provider or Tempo delivers the requested destination token.')),
476
+ destinationTokenKey: z.string().check(z.describe('Customer destination token key.')),
477
+ environment: z
478
+ .enum(['production', 'sandbox'])
479
+ .check(z.describe('Key environment the address belongs to.')),
480
+ id: z.string().check(z.describe('Funding deposit address id (`fda_…`).')),
481
+ lastPolledAt: z
482
+ .nullable(z.string())
483
+ .check(z.describe('When provider reconciliation last completed successfully, or null.')),
484
+ nextPollAt: z.string().check(z.describe('When provider reconciliation is next due.')),
485
+ orgId: z.string().check(z.describe('Owning organization id (`org_…`).')),
486
+ pollFailureCount: z.number().check(z.int(), z.describe('Consecutive reconciliation failures.')),
487
+ pollLeaseUntil: z
488
+ .nullable(z.string())
489
+ .check(z.describe('When the current reconciliation lease expires, or null.')),
490
+ pollLeaseVersion: z
491
+ .number()
492
+ .check(z.int(), z.describe('Fencing token for reconciliation leases.')),
493
+ projectId: z.nullable(z.string()).check(z.describe('Attributed project id (`prj_…`), or null.')),
494
+ providerOutputToken: z
495
+ .custom<funding_Provider.TokenRef>()
496
+ .check(z.describe('Token that the provider outputs on Tempo (`jsonb`).')),
497
+ providerId: z.string().check(z.describe('Selected funding provider id.')),
498
+ providerRequestIds: z
499
+ .readonly(z.array(z.string()))
500
+ .check(z.describe('Private provider request identifiers (`jsonb`).')),
501
+ providerState: z
502
+ .nullable(z.custom<funding_DepositAddress.ProviderState>())
503
+ .check(z.describe('Bounded private provider state (`jsonb`), or null.')),
504
+ recipient: z.string().check(z.describe('Tempo account that receives completed deposits.')),
505
+ refundAddress: z.string().check(z.describe('Source-chain refund address.')),
506
+ snapshot: z
507
+ .custom<funding_DepositAddress.Snapshot>()
508
+ .check(z.describe('Public address fields (`jsonb`).')),
509
+ sourceChainId: z.string().check(z.describe('Source chain CAIP-2 id.')),
510
+ sourceTokenKey: z.string().check(z.describe('Source token key.')),
511
+ status: z.custom<funding_DepositAddress.Status>().check(z.describe('Lifecycle status.')),
512
+ subsidize: z.boolean().check(z.describe('Whether Tempo guarantees normalized 1:1 delivery.')),
513
+ updatedAt: z.string().check(z.describe('When the address last materially changed (ISO 8601).')),
514
+ version: z.number().check(z.int(), z.describe('Material version used to guard updates.')),
515
+ })
516
+
517
+ /** Columns of the `funding_deposit_addresses` table. */
518
+ export type FundingDepositAddress = z.output<typeof FundingDepositAddress>
519
+
520
+ /**
521
+ * One provider-observed deposit. Public route and evidence live in `snapshot`;
522
+ * reconciliation and settlement state is private.
523
+ */
524
+ export const FundingDeposit = z.object({
525
+ createdAt: z.string().check(z.describe('When the deposit was detected (ISO 8601).')),
526
+ depositAddressId: z.string().check(z.describe('Funding deposit address id (`fda_…`).')),
527
+ environment: z
528
+ .enum(['production', 'sandbox'])
529
+ .check(z.describe('Key environment inherited from the deposit address.')),
530
+ id: z.string().check(z.describe('Funding deposit id (`fdp_…`).')),
531
+ orgId: z.string().check(z.describe('Owning organization id (`org_…`).')),
532
+ projectId: z.nullable(z.string()).check(z.describe('Attributed project id (`prj_…`), or null.')),
533
+ providerOutputAmount: z
534
+ .nullable(z.custom<z.output<typeof internal_Schema.TokenAmount>>())
535
+ .check(z.describe('Provider output amount verified on Tempo (`jsonb`), or null.')),
536
+ providerOutputToken: z
537
+ .custom<funding_Provider.TokenRef>()
538
+ .check(z.describe('Token output by the provider on Tempo (`jsonb`).')),
539
+ providerRequestId: z
540
+ .nullable(z.string())
541
+ .check(z.describe('Provider request that first reported the deposit, or null if unavailable.')),
542
+ providerRequestIds: z
543
+ .readonly(z.array(z.string()))
544
+ .check(z.describe('Private provider request identifiers (`jsonb`).')),
545
+ providerState: z
546
+ .nullable(z.custom<funding_Deposit.PrivateState>())
547
+ .check(z.describe('Bounded private provider state (`jsonb`), or null.')),
548
+ providerTransactionHashes: z
549
+ .readonly(z.array(z.string()))
550
+ .check(z.describe('Private provider-leg transaction references (`jsonb`).')),
551
+ providerTransferIndex: z
552
+ .number()
553
+ .check(z.int(), z.nonnegative(), z.describe('Deposit position within the provider request.')),
554
+ retryState: z
555
+ .nullable(z.custom<funding_Deposit.PrivateState>())
556
+ .check(z.describe('Bounded private retry state (`jsonb`), or null.')),
557
+ settlementTransaction: z
558
+ .nullable(z.string())
559
+ .check(z.describe('Persisted settlement transaction bytes, or null.')),
560
+ settlementTransactionHash: z
561
+ .nullable(z.string())
562
+ .check(z.describe('Persisted settlement transaction hash, or null.')),
563
+ snapshot: z
564
+ .custom<funding_Deposit.Snapshot>()
565
+ .check(z.describe('Public deposit fields (`jsonb`).')),
566
+ sourceChainId: z.string().check(z.describe('Source chain CAIP-2 id.')),
567
+ sourceTransactionHash: z
568
+ .string()
569
+ .check(z.describe('Provider-observed source transaction reference.')),
570
+ sourceTransferIndex: z
571
+ .nullable(z.number().check(z.int()))
572
+ .check(z.describe('Verified transfer position in the source transaction, or null.')),
573
+ status: z.custom<funding_Deposit.Status>().check(z.describe('Lifecycle status.')),
574
+ statusReason: z
575
+ .nullable(z.custom<funding_Deposit.StatusReason>())
576
+ .check(z.describe('Customer-safe status reason (`jsonb`), or null.')),
577
+ subsidyAmount: z
578
+ .nullable(z.custom<z.output<typeof internal_Schema.TokenAmount>>())
579
+ .check(z.describe('Destination token amount supplied by Tempo (`jsonb`), or null.')),
580
+ tempoGasPaid: z.nullable(z.string()).check(z.describe('Tempo gas paid for settlement, or null.')),
581
+ updatedAt: z.string().check(z.describe('When the deposit last materially changed (ISO 8601).')),
582
+ version: z.number().check(z.int(), z.describe('Material version used to guard updates.')),
583
+ })
584
+
585
+ /** Columns of the `funding_deposits` table. */
586
+ export type FundingDeposit = z.output<typeof FundingDeposit>
587
+
588
+ /**
589
+ * A durable funding transfer. Lifecycle state lives in typed columns; the
590
+ * public quote terms and reconciled fields live in the `snapshot` jsonb and
591
+ * merge in at serialization (`Transfer.toPublic`).
592
+ */
593
+ export const FundingTransfer = z.object({
594
+ apiKeyId: z.string().check(z.describe('API key id (`key_…`) that created the transfer.')),
595
+ createdAt: z.string().check(z.describe('When the transfer was created (ISO 8601).')),
596
+ environment: z
597
+ .enum(['production', 'sandbox'])
598
+ .check(z.describe('Key environment the transfer belongs to.')),
599
+ id: z.string().check(z.describe('Transfer id (`ftr_…`, lexically time-ordered).')),
600
+ method: z
601
+ .custom<funding_Transfer.Snapshot['method']>()
602
+ .check(z.describe('Funding method selected at creation.')),
603
+ mode: z
604
+ .custom<funding_Transfer.Snapshot['mode']>()
605
+ .check(z.describe('Amount mode selected at creation.')),
606
+ orgId: z.string().check(z.describe('Owning organization id (`org_…`).')),
607
+ projectId: z
608
+ .nullable(z.string())
609
+ .check(z.describe('Attributed project id (`prj_…`), or null for organization-attributed keys.')), // prettier-ignore
610
+ providerId: z.string().check(z.describe('Selected funding provider id.')),
611
+ providerState: z
612
+ .nullable(z.custom<funding_Provider.prepareTransfer.Correlation>())
613
+ .check(z.describe('Private provider correlation (`jsonb`), or null. Never serialized publicly.')), // prettier-ignore
614
+ quoteExpiresAt: z
615
+ .string()
616
+ .check(z.describe('When the quoted terms stop being executable (ISO 8601).')),
617
+ snapshot: z
618
+ .custom<funding_Transfer.Snapshot>()
619
+ .check(z.describe('Public quote terms and reconciled fields (`jsonb`).')),
620
+ status: z.custom<funding_Transfer.Status>().check(z.describe('Lifecycle status.')),
621
+ statusReason: z
622
+ .nullable(z.custom<funding_Transfer.StatusReason>())
623
+ .check(z.describe('Customer-safe status reason (`jsonb`), or null.')),
624
+ updatedAt: z.string().check(z.describe('When the transfer last materially changed (ISO 8601).')),
625
+ version: z
626
+ .number()
627
+ .check(z.int(), z.describe('Increments on every material change; guards transitions.')),
628
+ })
629
+
630
+ /** Columns of the `funding_transfers` table. */
631
+ export type FundingTransfer = z.output<typeof FundingTransfer>
632
+
633
+ /** One immutable public snapshot of a funding transfer at a material version. */
634
+ export const FundingTransferEvent = z.object({
635
+ createdAt: z.string().check(z.describe('When the version was committed (ISO 8601).')),
636
+ snapshot: z
637
+ .custom<funding_Transfer.Public>()
638
+ .check(z.describe('The complete public transfer at this version (`jsonb`).')),
639
+ status: z.custom<funding_Transfer.Status>().check(z.describe('Status at this version.')),
640
+ transferId: z.string().check(z.describe('Transfer id (`ftr_…`) the event belongs to.')),
641
+ version: z.number().check(z.int(), z.describe('Material version the event records.')),
642
+ })
643
+
644
+ /** Columns of the `funding_transfer_events` table. */
645
+ export type FundingTransferEvent = z.output<typeof FundingTransferEvent>
646
+
647
+ /** One verified transaction reference associated with a funding transfer. */
648
+ export const FundingTransferTransaction = z.object({
649
+ chainId: z.string().check(z.describe('CAIP-2 chain the transaction executed on.')),
650
+ createdAt: z.string().check(z.describe('When the reference was accepted (ISO 8601).')),
651
+ role: z
652
+ .custom<funding_Transfer.TransactionRole>()
653
+ .check(z.describe('What the transaction evidences: `source`, `destination`, or `refund`.')),
654
+ transactionRef: z
655
+ .string()
656
+ .check(z.describe('EVM transaction hash or case-sensitive Solana signature.')),
657
+ transferId: z.string().check(z.describe('Transfer id (`ftr_…`) the reference belongs to.')),
658
+ })
659
+
660
+ /** Columns of the `funding_transfer_transactions` table. */
661
+ export type FundingTransferTransaction = z.output<typeof FundingTransferTransaction>
662
+
663
+ /**
664
+ * An API-key-scoped idempotency claim for funding resource creation. The row
665
+ * retains recovery checkpoints and completed responses until `expiresAt`.
666
+ */
667
+ export const FundingIdempotencyRequest = z.object({
668
+ apiKeyId: z.string().check(z.describe('API key id (`key_…`) the claim is scoped to.')),
669
+ createdAt: z.string().check(z.describe('When the claim was taken (ISO 8601).')),
670
+ expiresAt: z.string().check(z.describe('When the claim stops replaying (ISO 8601).')),
671
+ keyHash: z.string().check(z.describe('SHA-256 of the caller Idempotency-Key.')),
672
+ requestHash: z.string().check(z.describe('SHA-256 fingerprint of the canonical request.')),
673
+ response: z
674
+ .nullable(z.string())
675
+ .check(z.describe('Serialized checkpoint or success response, or null while pending.')),
676
+ status: z
677
+ .enum(['completed', 'pending', 'provisioned'])
678
+ .check(z.describe('Claim state for execution, recovery, or replay.')),
679
+ transferId: z
680
+ .nullable(z.string())
681
+ .check(z.describe('Transfer id (`ftr_…`) the completed claim created, or null.')),
682
+ })
683
+
684
+ /** Columns of the `funding_idempotency_requests` table. */
685
+ export type FundingIdempotencyRequest = z.output<typeof FundingIdempotencyRequest>
686
+
364
687
  /**
365
688
  * A verified token: one row per curated token, ordered by `position` (list
366
689
  * order is canonical and surfaced to clients). Addresses are stored lowercase;
@@ -0,0 +1,185 @@
1
+ import * as TestApp from '../../../test/App.js'
2
+ import * as EarnVaults from './earnVaults.js'
3
+
4
+ const input = {
5
+ chainId: 42_431,
6
+ description: 'Bridge test PATHUSD deposited into Tempo Earn.',
7
+ label: 'btPATHUSD Earn',
8
+ privateInputTokens: [
9
+ '0x20c00000000000000000000057F242B21a53ae4D',
10
+ '0x20c0000000000000000000005B77A125d795262A',
11
+ ],
12
+ privateOutputTokens: ['0x20c00000000000000000000057F242B21a53ae4D'],
13
+ vaultAddress: '0x2f05f4d3625B2eFFb383eFbEDAFd2D8F04371636',
14
+ } as const satisfies EarnVaults.upsert.Options
15
+
16
+ describe('upsert', () => {
17
+ test('inserts flattened curated fields and generates a stable slug', async () => {
18
+ vi.useFakeTimers()
19
+ try {
20
+ vi.setSystemTime('2026-01-01T00:00:00.000Z')
21
+ const record = await EarnVaults.upsert(TestApp.database(), input)
22
+ const { slug, ...stored } = record
23
+ expect(slug).toMatch(/^btpathusd-earn-[0-9a-z]{8}$/)
24
+ expect(stored).toMatchInlineSnapshot(`
25
+ {
26
+ "chainId": 42431,
27
+ "createdAt": "2026-01-01T00:00:00.000Z",
28
+ "description": "Bridge test PATHUSD deposited into Tempo Earn.",
29
+ "label": "btPATHUSD Earn",
30
+ "privateInputTokens": [
31
+ "0x20c00000000000000000000057F242B21a53ae4D",
32
+ "0x20c0000000000000000000005B77A125d795262A",
33
+ ],
34
+ "privateOutputTokens": [
35
+ "0x20c00000000000000000000057F242B21a53ae4D",
36
+ ],
37
+ "updatedAt": "2026-01-01T00:00:00.000Z",
38
+ "vaultAddress": "0x2f05f4d3625b2effb383efbedafd2d8f04371636",
39
+ }
40
+ `)
41
+ } finally {
42
+ vi.useRealTimers()
43
+ }
44
+ })
45
+
46
+ test('updates mutable fields while preserving createdAt', async () => {
47
+ vi.useFakeTimers()
48
+ try {
49
+ vi.setSystemTime('2026-01-01T00:00:00.000Z')
50
+ const db = TestApp.database()
51
+ const created = await EarnVaults.upsert(db, input)
52
+ vi.setSystemTime('2026-01-02T00:00:00.000Z')
53
+ const updated = await EarnVaults.upsert(db, {
54
+ ...input,
55
+ description: null,
56
+ label: 'Renamed Vault',
57
+ privateInputTokens: [],
58
+ privateOutputTokens: [],
59
+ slug: 'replacement-slug',
60
+ })
61
+ const { slug, ...stored } = updated
62
+ expect(slug).toBe('replacement-slug')
63
+ expect(stored.createdAt).toBe(created.createdAt)
64
+ expect({
65
+ createdAt: stored.createdAt,
66
+ description: stored.description,
67
+ label: stored.label,
68
+ privateInputTokens: stored.privateInputTokens,
69
+ privateOutputTokens: stored.privateOutputTokens,
70
+ updatedAt: stored.updatedAt,
71
+ }).toMatchInlineSnapshot(`
72
+ {
73
+ "createdAt": "2026-01-01T00:00:00.000Z",
74
+ "description": null,
75
+ "label": "Renamed Vault",
76
+ "privateInputTokens": [],
77
+ "privateOutputTokens": [],
78
+ "updatedAt": "2026-01-02T00:00:00.000Z",
79
+ }
80
+ `)
81
+
82
+ expect(updated.slug).toBe('replacement-slug')
83
+ } finally {
84
+ vi.useRealTimers()
85
+ }
86
+ })
87
+
88
+ test('supports chain ids above the Postgres integer range', async () => {
89
+ const chainId = 4_217_000_001
90
+ const db = TestApp.database()
91
+ const record = await EarnVaults.upsert(db, { ...input, chainId })
92
+ expect(record.chainId).toBe(chainId)
93
+ expect(
94
+ await EarnVaults.get(db, {
95
+ chainId,
96
+ vaultAddress: input.vaultAddress,
97
+ }),
98
+ ).toStrictEqual(record)
99
+ })
100
+ })
101
+
102
+ describe('get', () => {
103
+ test('reads case-insensitively and returns undefined when absent', async () => {
104
+ const db = TestApp.database()
105
+ const record = await EarnVaults.upsert(db, input)
106
+ expect(
107
+ await EarnVaults.get(db, {
108
+ chainId: input.chainId,
109
+ vaultAddress: input.vaultAddress.toUpperCase(),
110
+ }),
111
+ ).toStrictEqual(record)
112
+ expect(
113
+ await EarnVaults.get(db, {
114
+ chainId: 1,
115
+ vaultAddress: input.vaultAddress,
116
+ }),
117
+ ).toBeUndefined()
118
+ })
119
+ })
120
+
121
+ describe('list', () => {
122
+ test('filters by chain and returns stable order', async () => {
123
+ const db = TestApp.database()
124
+ const second = {
125
+ ...input,
126
+ vaultAddress: '0xaa0000000000000000000000000000000000000e',
127
+ } as const satisfies EarnVaults.upsert.Options
128
+ const third = {
129
+ ...input,
130
+ chainId: 4217,
131
+ vaultAddress: '0xaa0000000000000000000000000000000000000f',
132
+ } as const satisfies EarnVaults.upsert.Options
133
+ await EarnVaults.upsert(db, second)
134
+ await EarnVaults.upsert(db, input)
135
+ await EarnVaults.upsert(db, third)
136
+
137
+ expect(
138
+ (await EarnVaults.list(db)).map(({ chainId, vaultAddress }) => ({
139
+ chainId,
140
+ vaultAddress,
141
+ })),
142
+ ).toMatchInlineSnapshot(`
143
+ [
144
+ {
145
+ "chainId": 4217,
146
+ "vaultAddress": "0xaa0000000000000000000000000000000000000f",
147
+ },
148
+ {
149
+ "chainId": 42431,
150
+ "vaultAddress": "0x2f05f4d3625b2effb383efbedafd2d8f04371636",
151
+ },
152
+ {
153
+ "chainId": 42431,
154
+ "vaultAddress": "0xaa0000000000000000000000000000000000000e",
155
+ },
156
+ ]
157
+ `)
158
+ expect(await EarnVaults.list(db, { chainId: third.chainId })).toHaveLength(1)
159
+ })
160
+ })
161
+
162
+ describe('remove', () => {
163
+ test('physically deletes one curated vault', async () => {
164
+ const db = TestApp.database()
165
+ const created = await EarnVaults.upsert(db, input)
166
+ expect(
167
+ await EarnVaults.remove(db, {
168
+ chainId: input.chainId,
169
+ vaultAddress: input.vaultAddress.toUpperCase(),
170
+ }),
171
+ ).toStrictEqual(created)
172
+ expect(
173
+ await EarnVaults.get(db, {
174
+ chainId: input.chainId,
175
+ vaultAddress: input.vaultAddress,
176
+ }),
177
+ ).toBeUndefined()
178
+ expect(
179
+ await EarnVaults.remove(db, {
180
+ chainId: input.chainId,
181
+ vaultAddress: input.vaultAddress,
182
+ }),
183
+ ).toBeUndefined()
184
+ })
185
+ })
@@ -0,0 +1,151 @@
1
+ import type { ColumnType, JSONColumnType, Selectable } from 'kysely'
2
+ import { customAlphabet } from 'nanoid'
3
+ import type { Address } from 'viem'
4
+
5
+ import type * as Db from '../Db.js'
6
+ import type * as db_Schema from '../Schema.js'
7
+
8
+ const slugSuffix = customAlphabet('0123456789abcdefghijklmnopqrstuvwxyz', 8)
9
+
10
+ /** Columns of the `earn_vaults` table. */
11
+ export type Table = Omit<
12
+ db_Schema.EarnVault,
13
+ 'chainId' | 'privateInputTokens' | 'privateOutputTokens'
14
+ > & {
15
+ /** Bigint chain id, read as a string from pg and written as a number. */
16
+ chainId: ColumnType<string, number, number>
17
+ /** Tokens accepted for private deposits. */
18
+ privateInputTokens: JSONColumnType<db_Schema.EarnVault['privateInputTokens'], string, string>
19
+ /** Tokens supported for private redemptions. */
20
+ privateOutputTokens: JSONColumnType<db_Schema.EarnVault['privateOutputTokens'], string, string>
21
+ }
22
+
23
+ /** A stored curated Earn vault. */
24
+ export type Record = db_Schema.EarnVault
25
+
26
+ /** Reads one curated vault by chain and vault address. */
27
+ export async function get(db: Db.Db, options: get.Options): Promise<Record | undefined> {
28
+ const row = await db.kysely
29
+ .selectFrom('earn_vaults')
30
+ .selectAll()
31
+ .where('chainId', '=', String(options.chainId))
32
+ .where('vaultAddress', '=', normalize(options.vaultAddress))
33
+ .executeTakeFirst()
34
+ return row ? toRecord(row) : undefined
35
+ }
36
+
37
+ export declare namespace get {
38
+ /** Identity of one curated vault. */
39
+ type Options = {
40
+ /** Chain the vault belongs to. */
41
+ chainId: number
42
+ /** Earn vault address. */
43
+ vaultAddress: string
44
+ }
45
+ }
46
+
47
+ /** Lists curated vaults in stable chain and address order. */
48
+ export async function list(db: Db.Db, options: list.Options = {}): Promise<Record[]> {
49
+ let query = db.kysely.selectFrom('earn_vaults').selectAll()
50
+ if (options.chainId !== undefined) query = query.where('chainId', '=', String(options.chainId))
51
+ const rows = await query.orderBy('chainId', 'asc').orderBy('vaultAddress', 'asc').execute()
52
+ return rows.map(toRecord)
53
+ }
54
+
55
+ export declare namespace list {
56
+ /** Optional curated-vault filters. */
57
+ type Options = {
58
+ /** Restrict results to one chain. */
59
+ chainId?: number | undefined
60
+ }
61
+ }
62
+
63
+ /** Inserts or updates a curated vault while preserving its stable identity fields. */
64
+ export async function upsert(db: Db.Db, options: upsert.Options): Promise<Record> {
65
+ const now = new Date().toISOString()
66
+ const slug = options.slug ?? `${kebab(options.label)}-${slugSuffix()}`
67
+ const row = await db.kysely
68
+ .insertInto('earn_vaults')
69
+ .values({
70
+ chainId: options.chainId,
71
+ createdAt: now,
72
+ description: options.description,
73
+ label: options.label,
74
+ privateInputTokens: JSON.stringify(options.privateInputTokens),
75
+ privateOutputTokens: JSON.stringify(options.privateOutputTokens),
76
+ slug,
77
+ updatedAt: now,
78
+ vaultAddress: normalize(options.vaultAddress),
79
+ })
80
+ .onConflict((oc) =>
81
+ oc.columns(['chainId', 'vaultAddress']).doUpdateSet({
82
+ description: options.description,
83
+ label: options.label,
84
+ privateInputTokens: JSON.stringify(options.privateInputTokens),
85
+ privateOutputTokens: JSON.stringify(options.privateOutputTokens),
86
+ ...(options.slug !== undefined ? { slug } : {}),
87
+ updatedAt: now,
88
+ }),
89
+ )
90
+ .returningAll()
91
+ .executeTakeFirstOrThrow()
92
+ return toRecord(row)
93
+ }
94
+
95
+ export declare namespace upsert {
96
+ /** Curated fields stored for one verified vault. */
97
+ type Options = {
98
+ /** Chain the vault belongs to. */
99
+ chainId: number
100
+ /** Curated vault description. */
101
+ description: string | null
102
+ /** Curated vault label. */
103
+ label: string
104
+ /** Tokens accepted for private deposits. */
105
+ privateInputTokens: readonly Address[]
106
+ /** Tokens supported for private redemptions. */
107
+ privateOutputTokens: readonly Address[]
108
+ /** Stable slug, generated from the label when omitted. */
109
+ slug?: string | undefined
110
+ /** Earn vault address. */
111
+ vaultAddress: Address
112
+ }
113
+ }
114
+
115
+ /** Removes one curated vault. */
116
+ export async function remove(db: Db.Db, options: remove.Options): Promise<Record | undefined> {
117
+ const row = await db.kysely
118
+ .deleteFrom('earn_vaults')
119
+ .where('chainId', '=', String(options.chainId))
120
+ .where('vaultAddress', '=', normalize(options.vaultAddress))
121
+ .returningAll()
122
+ .executeTakeFirst()
123
+ return row ? toRecord(row) : undefined
124
+ }
125
+
126
+ export declare namespace remove {
127
+ /** Identity of one curated vault. */
128
+ type Options = {
129
+ /** Chain the vault belongs to. */
130
+ chainId: number
131
+ /** Earn vault address. */
132
+ vaultAddress: string
133
+ }
134
+ }
135
+
136
+ function kebab(label: string): string {
137
+ return (
138
+ label
139
+ .toLowerCase()
140
+ .replace(/[^a-z0-9]+/g, '-')
141
+ .replace(/^-|-$/g, '') || 'vault'
142
+ )
143
+ }
144
+
145
+ function toRecord(row: Selectable<Table>): Record {
146
+ return { ...row, chainId: Number(row.chainId) }
147
+ }
148
+
149
+ function normalize(address: string): Address {
150
+ return address.toLowerCase() as Address
151
+ }