tapimo 0.7.1 → 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 (681) 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 +99 -43
  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 +12125 -7913
  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 +1625 -718
  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 +108 -108
  78. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  79. package/dist/apps/data/routes/fee-amm.js +59 -8
  80. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  81. package/dist/apps/data/routes/funding.d.ts +4092 -387
  82. package/dist/apps/data/routes/funding.d.ts.map +1 -1
  83. package/dist/apps/data/routes/funding.js +1403 -256
  84. package/dist/apps/data/routes/funding.js.map +1 -1
  85. package/dist/apps/data/routes/indexer.d.ts +30 -30
  86. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  87. package/dist/apps/data/routes/indexer.js +19 -2
  88. package/dist/apps/data/routes/indexer.js.map +1 -1
  89. package/dist/apps/data/routes/receipts.d.ts +263 -263
  90. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  91. package/dist/apps/data/routes/receipts.js +11 -11
  92. package/dist/apps/data/routes/receipts.js.map +1 -1
  93. package/dist/apps/data/routes/rpc.d.ts +5 -5
  94. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  95. package/dist/apps/data/routes/rpc.js +211 -22
  96. package/dist/apps/data/routes/rpc.js.map +1 -1
  97. package/dist/apps/data/routes/tokenlist.d.ts +36 -36
  98. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  99. package/dist/apps/data/routes/tokenlist.js +39 -8
  100. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  101. package/dist/apps/data/routes/tokens.d.ts +114 -86
  102. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  103. package/dist/apps/data/routes/tokens.js +194 -91
  104. package/dist/apps/data/routes/tokens.js.map +1 -1
  105. package/dist/apps/data/routes/transactions.d.ts +53 -53
  106. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  107. package/dist/apps/data/routes/transactions.js +78 -39
  108. package/dist/apps/data/routes/transactions.js.map +1 -1
  109. package/dist/apps/data/routes/transfers.d.ts +76 -27
  110. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  111. package/dist/apps/data/routes/transfers.js +165 -67
  112. package/dist/apps/data/routes/transfers.js.map +1 -1
  113. package/dist/apps/data/routes/valuation.d.ts +42 -42
  114. package/dist/apps/data/routes/valuation.js +2 -2
  115. package/dist/apps/data/routes/valuation.js.map +1 -1
  116. package/dist/apps/data/routes/webhooks.d.ts +369 -367
  117. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  118. package/dist/apps/data/routes/webhooks.js +161 -59
  119. package/dist/apps/data/routes/webhooks.js.map +1 -1
  120. package/dist/apps/data/routes/zones.d.ts +281 -0
  121. package/dist/apps/data/routes/zones.d.ts.map +1 -0
  122. package/dist/apps/data/routes/zones.js +252 -0
  123. package/dist/apps/data/routes/zones.js.map +1 -0
  124. package/dist/apps/docs/reference.js +6 -5
  125. package/dist/apps/docs/reference.js.map +1 -1
  126. package/dist/apps/index.d.ts +2 -1
  127. package/dist/apps/index.d.ts.map +1 -1
  128. package/dist/apps/index.js +2 -1
  129. package/dist/apps/index.js.map +1 -1
  130. package/dist/apps/management/App.d.ts +670 -670
  131. package/dist/apps/management/Billing.d.ts +8 -0
  132. package/dist/apps/management/Billing.d.ts.map +1 -1
  133. package/dist/apps/management/Billing.js +12 -0
  134. package/dist/apps/management/Billing.js.map +1 -1
  135. package/dist/apps/management/Error.d.ts +12 -0
  136. package/dist/apps/management/Error.d.ts.map +1 -0
  137. package/dist/apps/management/Error.js +10 -0
  138. package/dist/apps/management/Error.js.map +1 -0
  139. package/dist/apps/management/routes/api-keys.d.ts +5 -5
  140. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  141. package/dist/apps/management/routes/api-keys.js +2 -8
  142. package/dist/apps/management/routes/api-keys.js.map +1 -1
  143. package/dist/apps/management/routes/billing.d.ts +119 -119
  144. package/dist/apps/management/routes/faucet.d.ts +2 -2
  145. package/dist/apps/management/routes/invitations.d.ts +62 -62
  146. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  147. package/dist/apps/management/routes/invitations.js +4 -10
  148. package/dist/apps/management/routes/invitations.js.map +1 -1
  149. package/dist/apps/management/routes/invite-links.d.ts +30 -30
  150. package/dist/apps/management/routes/me.d.ts +6 -6
  151. package/dist/apps/management/routes/members.d.ts +2 -2
  152. package/dist/apps/management/routes/orgs.d.ts +48 -48
  153. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  154. package/dist/apps/management/routes/orgs.js +2 -8
  155. package/dist/apps/management/routes/orgs.js.map +1 -1
  156. package/dist/apps/management/routes/projects.d.ts +9 -9
  157. package/dist/apps/management/routes/scopes.js +2 -2
  158. package/dist/apps/management/routes/scopes.js.map +1 -1
  159. package/dist/apps/management/routes/verified-token-requests.d.ts +36 -36
  160. package/dist/apps/management/routes/webhooks.d.ts +50 -50
  161. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  162. package/dist/apps/management/routes/webhooks.js +15 -3
  163. package/dist/apps/management/routes/webhooks.js.map +1 -1
  164. package/dist/apps/mpp/App.d.ts +55 -56
  165. package/dist/apps/mpp/App.d.ts.map +1 -1
  166. package/dist/apps/mpp/App.js +192 -27
  167. package/dist/apps/mpp/App.js.map +1 -1
  168. package/dist/apps/mpp/Mpp.d.ts +0 -20
  169. package/dist/apps/mpp/Mpp.d.ts.map +1 -1
  170. package/dist/apps/mpp/Mpp.js +0 -24
  171. package/dist/apps/mpp/Mpp.js.map +1 -1
  172. package/dist/apps/mpp/internal/Adapter.d.ts +40 -0
  173. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -0
  174. package/dist/apps/mpp/internal/Adapter.js +66 -0
  175. package/dist/apps/mpp/internal/Adapter.js.map +1 -0
  176. package/dist/apps/mpp/internal/Error.d.ts +4 -0
  177. package/dist/apps/mpp/internal/Error.d.ts.map +1 -0
  178. package/dist/apps/mpp/internal/Error.js +41 -0
  179. package/dist/apps/mpp/internal/Error.js.map +1 -0
  180. package/dist/apps/mpp/internal/Idempotency.d.ts +33 -0
  181. package/dist/apps/mpp/internal/Idempotency.d.ts.map +1 -0
  182. package/dist/apps/mpp/internal/Idempotency.js +28 -0
  183. package/dist/apps/mpp/internal/Idempotency.js.map +1 -0
  184. package/dist/apps/mpp/internal/Policy.d.ts +46 -0
  185. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -0
  186. package/dist/apps/mpp/internal/Policy.js +57 -0
  187. package/dist/apps/mpp/internal/Policy.js.map +1 -0
  188. package/dist/apps/mpp/internal/ScreenManager.d.ts +27 -0
  189. package/dist/apps/mpp/internal/ScreenManager.d.ts.map +1 -0
  190. package/dist/apps/mpp/internal/ScreenManager.js +18 -0
  191. package/dist/apps/mpp/internal/ScreenManager.js.map +1 -0
  192. package/dist/apps/mpp/internal/Screening.d.ts +35 -0
  193. package/dist/apps/mpp/internal/Screening.d.ts.map +1 -0
  194. package/dist/apps/mpp/internal/Screening.js +20 -0
  195. package/dist/apps/mpp/internal/Screening.js.map +1 -0
  196. package/dist/apps/mpp/internal/Sponsorship.d.ts +36 -0
  197. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -0
  198. package/dist/apps/mpp/internal/Sponsorship.js +103 -0
  199. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -0
  200. package/dist/apps/mpp/internal/Utils.d.ts +7 -0
  201. package/dist/apps/mpp/internal/Utils.d.ts.map +1 -0
  202. package/dist/apps/mpp/internal/Utils.js +24 -0
  203. package/dist/apps/mpp/internal/Utils.js.map +1 -0
  204. package/dist/apps/relay/App.js +183 -23
  205. package/dist/apps/relay/App.js.map +1 -1
  206. package/dist/apps/relay/Sponsorships.d.ts +4 -0
  207. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  208. package/dist/apps/relay/Sponsorships.js +15 -6
  209. package/dist/apps/relay/Sponsorships.js.map +1 -1
  210. package/dist/db/Db.d.ts +20 -0
  211. package/dist/db/Db.d.ts.map +1 -1
  212. package/dist/db/Db.js +342 -0
  213. package/dist/db/Db.js.map +1 -1
  214. package/dist/db/Schema.d.ts +921 -1
  215. package/dist/db/Schema.d.ts.map +1 -1
  216. package/dist/db/Schema.js +269 -1
  217. package/dist/db/Schema.js.map +1 -1
  218. package/dist/db/tables/earnVaults.d.ts +68 -0
  219. package/dist/db/tables/earnVaults.d.ts.map +1 -0
  220. package/dist/db/tables/earnVaults.js +72 -0
  221. package/dist/db/tables/earnVaults.js.map +1 -0
  222. package/dist/db/tables/fundingCatalog.d.ts +56 -0
  223. package/dist/db/tables/fundingCatalog.d.ts.map +1 -0
  224. package/dist/db/tables/fundingCatalog.js +85 -0
  225. package/dist/db/tables/fundingCatalog.js.map +1 -0
  226. package/dist/db/tables/fundingDepositAddresses.d.ts +159 -0
  227. package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
  228. package/dist/db/tables/fundingDepositAddresses.js +206 -0
  229. package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
  230. package/dist/db/tables/fundingDeposits.d.ts +115 -0
  231. package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
  232. package/dist/db/tables/fundingDeposits.js +100 -0
  233. package/dist/db/tables/fundingDeposits.js.map +1 -0
  234. package/dist/db/tables/fundingIdempotency.d.ts +91 -0
  235. package/dist/db/tables/fundingIdempotency.d.ts.map +1 -0
  236. package/dist/db/tables/fundingIdempotency.js +103 -0
  237. package/dist/db/tables/fundingIdempotency.js.map +1 -0
  238. package/dist/db/tables/fundingTransferEvents.d.ts +12 -0
  239. package/dist/db/tables/fundingTransferEvents.d.ts.map +1 -0
  240. package/dist/db/tables/fundingTransferEvents.js +18 -0
  241. package/dist/db/tables/fundingTransferEvents.js.map +1 -0
  242. package/dist/db/tables/fundingTransferTransactions.d.ts +15 -0
  243. package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -0
  244. package/dist/db/tables/fundingTransferTransactions.js +27 -0
  245. package/dist/db/tables/fundingTransferTransactions.js.map +1 -0
  246. package/dist/db/tables/fundingTransfers.d.ts +82 -0
  247. package/dist/db/tables/fundingTransfers.d.ts.map +1 -0
  248. package/dist/db/tables/fundingTransfers.js +89 -0
  249. package/dist/db/tables/fundingTransfers.js.map +1 -0
  250. package/dist/db/tables/organizations.d.ts +8 -0
  251. package/dist/db/tables/organizations.d.ts.map +1 -1
  252. package/dist/db/tables/organizations.js +16 -0
  253. package/dist/db/tables/organizations.js.map +1 -1
  254. package/dist/db/tables/projects.d.ts +8 -0
  255. package/dist/db/tables/projects.d.ts.map +1 -1
  256. package/dist/db/tables/projects.js +16 -0
  257. package/dist/db/tables/projects.js.map +1 -1
  258. package/dist/db/tables/requestUsage.d.ts +13 -0
  259. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  260. package/dist/db/tables/requestUsage.js +16 -0
  261. package/dist/db/tables/requestUsage.js.map +1 -1
  262. package/dist/db/tables/sponsoredTransactions.d.ts +2 -2
  263. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  264. package/dist/db/tables/sponsoredTransactions.js +1 -1
  265. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  266. package/dist/db/tables/users.d.ts +8 -0
  267. package/dist/db/tables/users.d.ts.map +1 -1
  268. package/dist/db/tables/users.js +16 -0
  269. package/dist/db/tables/users.js.map +1 -1
  270. package/dist/db/tables/verifiedTokens.d.ts +14 -7
  271. package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
  272. package/dist/db/tables/verifiedTokens.js +9 -7
  273. package/dist/db/tables/verifiedTokens.js.map +1 -1
  274. package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
  275. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  276. package/dist/db/tables/webhookSubscriptions.js +24 -3
  277. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  278. package/dist/handlers/relay.js +108 -108
  279. package/dist/handlers/relay.js.map +1 -1
  280. package/dist/internal/Auth.d.ts +26 -0
  281. package/dist/internal/Auth.d.ts.map +1 -1
  282. package/dist/internal/Auth.js +35 -2
  283. package/dist/internal/Auth.js.map +1 -1
  284. package/dist/internal/Cache.d.ts.map +1 -1
  285. package/dist/internal/Cache.js +16 -10
  286. package/dist/internal/Cache.js.map +1 -1
  287. package/dist/internal/Cursor.js +1 -1
  288. package/dist/internal/Cursor.js.map +1 -1
  289. package/dist/internal/EarnRates.d.ts +89 -0
  290. package/dist/internal/EarnRates.d.ts.map +1 -0
  291. package/dist/internal/EarnRates.js +266 -0
  292. package/dist/internal/EarnRates.js.map +1 -0
  293. package/dist/internal/EarnVaults.d.ts +171 -0
  294. package/dist/internal/EarnVaults.d.ts.map +1 -0
  295. package/dist/internal/EarnVaults.js +547 -0
  296. package/dist/internal/EarnVaults.js.map +1 -0
  297. package/dist/internal/EdgeCache.d.ts +8 -1
  298. package/dist/internal/EdgeCache.d.ts.map +1 -1
  299. package/dist/internal/EdgeCache.js +33 -7
  300. package/dist/internal/EdgeCache.js.map +1 -1
  301. package/dist/internal/Id.d.ts +11 -0
  302. package/dist/internal/Id.d.ts.map +1 -1
  303. package/dist/internal/Id.js +13 -0
  304. package/dist/internal/Id.js.map +1 -1
  305. package/dist/internal/Idempotency.d.ts +83 -0
  306. package/dist/internal/Idempotency.d.ts.map +1 -0
  307. package/dist/internal/Idempotency.js +113 -0
  308. package/dist/internal/Idempotency.js.map +1 -0
  309. package/dist/internal/Log.d.ts +64 -9
  310. package/dist/internal/Log.d.ts.map +1 -1
  311. package/dist/internal/Log.js +29 -7
  312. package/dist/internal/Log.js.map +1 -1
  313. package/dist/internal/MetricSink.d.ts.map +1 -1
  314. package/dist/internal/MetricSink.js +47 -1
  315. package/dist/internal/MetricSink.js.map +1 -1
  316. package/dist/internal/OpenApi.d.ts +1 -1
  317. package/dist/internal/OpenApi.d.ts.map +1 -1
  318. package/dist/internal/OpenApi.js +3 -0
  319. package/dist/internal/OpenApi.js.map +1 -1
  320. package/dist/internal/Provider.d.ts +14 -0
  321. package/dist/internal/Provider.d.ts.map +1 -0
  322. package/dist/internal/Provider.js +5 -0
  323. package/dist/internal/Provider.js.map +1 -0
  324. package/dist/internal/Schema.d.ts +6 -1
  325. package/dist/internal/Schema.d.ts.map +1 -1
  326. package/dist/internal/Schema.js +20 -11
  327. package/dist/internal/Schema.js.map +1 -1
  328. package/dist/internal/Store.d.ts +6 -0
  329. package/dist/internal/Store.d.ts.map +1 -1
  330. package/dist/internal/Store.js +35 -0
  331. package/dist/internal/Store.js.map +1 -1
  332. package/dist/internal/Tidx.d.ts +43 -24
  333. package/dist/internal/Tidx.d.ts.map +1 -1
  334. package/dist/internal/Tidx.js +79 -11
  335. package/dist/internal/Tidx.js.map +1 -1
  336. package/dist/internal/Viem.d.ts +82 -65
  337. package/dist/internal/Viem.d.ts.map +1 -1
  338. package/dist/internal/Viem.js +83 -12
  339. package/dist/internal/Viem.js.map +1 -1
  340. package/dist/internal/WebhookDestination.d.ts.map +1 -1
  341. package/dist/internal/WebhookDestination.js +34 -28
  342. package/dist/internal/WebhookDestination.js.map +1 -1
  343. package/dist/internal/Webhooks.d.ts +9 -0
  344. package/dist/internal/Webhooks.d.ts.map +1 -1
  345. package/dist/internal/Webhooks.js +15 -10
  346. package/dist/internal/Webhooks.js.map +1 -1
  347. package/dist/internal/exchange/Provider.d.ts +219 -0
  348. package/dist/internal/exchange/Provider.d.ts.map +1 -0
  349. package/dist/internal/exchange/Provider.js +117 -0
  350. package/dist/internal/exchange/Provider.js.map +1 -0
  351. package/dist/internal/exchange/index.d.ts +2 -0
  352. package/dist/internal/exchange/index.d.ts.map +1 -0
  353. package/dist/internal/exchange/index.js +2 -0
  354. package/dist/internal/exchange/index.js.map +1 -0
  355. package/dist/internal/exchange/providers/uniswap.d.ts +57 -0
  356. package/dist/internal/exchange/providers/uniswap.d.ts.map +1 -0
  357. package/dist/internal/exchange/providers/uniswap.js +553 -0
  358. package/dist/internal/exchange/providers/uniswap.js.map +1 -0
  359. package/dist/internal/funding/Action.d.ts +55 -0
  360. package/dist/internal/funding/Action.d.ts.map +1 -0
  361. package/dist/internal/funding/Action.js +74 -0
  362. package/dist/internal/funding/Action.js.map +1 -0
  363. package/dist/internal/funding/Catalog.d.ts +107 -0
  364. package/dist/internal/funding/Catalog.d.ts.map +1 -0
  365. package/dist/internal/funding/Catalog.js +270 -0
  366. package/dist/internal/funding/Catalog.js.map +1 -0
  367. package/dist/internal/funding/Chain.d.ts +76 -0
  368. package/dist/internal/funding/Chain.d.ts.map +1 -0
  369. package/dist/internal/funding/Chain.js +38 -0
  370. package/dist/internal/funding/Chain.js.map +1 -0
  371. package/dist/internal/funding/Deposit.d.ts +366 -0
  372. package/dist/internal/funding/Deposit.d.ts.map +1 -0
  373. package/dist/internal/funding/Deposit.js +286 -0
  374. package/dist/internal/funding/Deposit.js.map +1 -0
  375. package/dist/internal/funding/DepositAddress.d.ts +345 -0
  376. package/dist/internal/funding/DepositAddress.d.ts.map +1 -0
  377. package/dist/internal/funding/DepositAddress.js +189 -0
  378. package/dist/internal/funding/DepositAddress.js.map +1 -0
  379. package/dist/internal/funding/Evidence.d.ts +52 -0
  380. package/dist/internal/funding/Evidence.d.ts.map +1 -0
  381. package/dist/internal/funding/Evidence.js +314 -0
  382. package/dist/internal/funding/Evidence.js.map +1 -0
  383. package/dist/internal/funding/Provider.d.ts +1186 -0
  384. package/dist/internal/funding/Provider.d.ts.map +1 -0
  385. package/dist/internal/funding/Provider.js +1081 -0
  386. package/dist/internal/funding/Provider.js.map +1 -0
  387. package/dist/internal/funding/Reconciliation.d.ts +113 -0
  388. package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
  389. package/dist/internal/funding/Reconciliation.js +676 -0
  390. package/dist/internal/funding/Reconciliation.js.map +1 -0
  391. package/dist/internal/funding/Route.d.ts +21 -0
  392. package/dist/internal/funding/Route.d.ts.map +1 -0
  393. package/dist/internal/funding/Route.js +5 -0
  394. package/dist/internal/funding/Route.js.map +1 -0
  395. package/dist/internal/funding/Subsidy.d.ts +113 -0
  396. package/dist/internal/funding/Subsidy.d.ts.map +1 -0
  397. package/dist/internal/funding/Subsidy.js +138 -0
  398. package/dist/internal/funding/Subsidy.js.map +1 -0
  399. package/dist/internal/funding/Token.d.ts +41 -0
  400. package/dist/internal/funding/Token.d.ts.map +1 -0
  401. package/dist/internal/funding/Token.js +22 -0
  402. package/dist/internal/funding/Token.js.map +1 -0
  403. package/dist/internal/funding/Transfer.d.ts +643 -0
  404. package/dist/internal/funding/Transfer.d.ts.map +1 -0
  405. package/dist/internal/funding/Transfer.js +332 -0
  406. package/dist/internal/funding/Transfer.js.map +1 -0
  407. package/dist/internal/funding/index.d.ts +13 -0
  408. package/dist/internal/funding/index.d.ts.map +1 -0
  409. package/dist/internal/funding/index.js +13 -0
  410. package/dist/internal/funding/index.js.map +1 -0
  411. package/dist/internal/funding/providers/across.d.ts +21 -0
  412. package/dist/internal/funding/providers/across.d.ts.map +1 -0
  413. package/dist/internal/funding/providers/across.js +117 -0
  414. package/dist/internal/funding/providers/across.js.map +1 -0
  415. package/dist/internal/funding/providers/relay.d.ts +46 -0
  416. package/dist/internal/funding/providers/relay.d.ts.map +1 -0
  417. package/dist/internal/funding/providers/relay.js +464 -0
  418. package/dist/internal/funding/providers/relay.js.map +1 -0
  419. package/dist/internal/funding/providers/rhino.d.ts +15 -0
  420. package/dist/internal/funding/providers/rhino.d.ts.map +1 -0
  421. package/dist/internal/funding/providers/rhino.js +116 -0
  422. package/dist/internal/funding/providers/rhino.js.map +1 -0
  423. package/dist/internal/funding/providers/squid.d.ts +19 -0
  424. package/dist/internal/funding/providers/squid.d.ts.map +1 -0
  425. package/dist/internal/funding/providers/squid.js +120 -0
  426. package/dist/internal/funding/providers/squid.js.map +1 -0
  427. package/dist/internal/funding/providers/symbiosis.d.ts +20 -0
  428. package/dist/internal/funding/providers/symbiosis.d.ts.map +1 -0
  429. package/dist/internal/funding/providers/symbiosis.js +176 -0
  430. package/dist/internal/funding/providers/symbiosis.js.map +1 -0
  431. package/dist/internal/index.d.ts +5 -1
  432. package/dist/internal/index.d.ts.map +1 -1
  433. package/dist/internal/index.js +5 -1
  434. package/dist/internal/index.js.map +1 -1
  435. package/dist/internal/webhookDestinations/url.js +61 -57
  436. package/dist/internal/webhookDestinations/url.js.map +1 -1
  437. package/dist/providers/index.d.ts +43 -0
  438. package/dist/providers/index.d.ts.map +1 -0
  439. package/dist/providers/index.js +19 -0
  440. package/dist/providers/index.js.map +1 -0
  441. package/package.json +9 -4
  442. package/src/ApiKeys.test.ts +11 -7
  443. package/src/ApiKeys.ts +37 -9
  444. package/src/App.test.ts +85 -10
  445. package/src/App.ts +224 -137
  446. package/src/Assets.ts +29 -4
  447. package/src/Client.test-d.ts +650 -30
  448. package/src/Scope.test.ts +19 -0
  449. package/src/Scope.ts +28 -11
  450. package/src/Webhooks.test.ts +25 -0
  451. package/src/Webhooks.ts +1 -1
  452. package/src/admin/App.test.ts +9 -2
  453. package/src/admin/App.ts +32 -9
  454. package/src/admin/apps/api-keys.test.ts +167 -23
  455. package/src/admin/apps/api-keys.ts +166 -28
  456. package/src/admin/apps/earn-vaults.test.ts +338 -0
  457. package/src/admin/apps/earn-vaults.ts +572 -0
  458. package/src/admin/apps/scopes.test.ts +16 -1
  459. package/src/admin/ui/plugin.ts +2 -2
  460. package/src/admin/ui/src/components/EarnVaultForm.tsx +137 -0
  461. package/src/admin/ui/src/components/MobileProfile.tsx +2 -2
  462. package/src/admin/ui/src/components/Page.tsx +1 -1
  463. package/src/admin/ui/src/components/ThemeToggle.tsx +1 -1
  464. package/src/admin/ui/src/lib/api-keys.ts +37 -7
  465. package/src/admin/ui/src/lib/client.ts +1 -1
  466. package/src/admin/ui/src/lib/config.ts +1 -1
  467. package/src/admin/ui/src/lib/early-access.ts +8 -9
  468. package/src/admin/ui/src/lib/earn-vaults.ts +207 -0
  469. package/src/admin/ui/src/lib/format.ts +13 -0
  470. package/src/admin/ui/src/lib/organizations.test.ts +14 -4
  471. package/src/admin/ui/src/lib/organizations.ts +7 -1
  472. package/src/admin/ui/src/lib/response.ts +22 -0
  473. package/src/admin/ui/src/lib/scopes.test.ts +19 -11
  474. package/src/admin/ui/src/lib/scopes.ts +28 -7
  475. package/src/admin/ui/src/lib/verified-tokens.ts +10 -9
  476. package/src/admin/ui/src/routeTree.gen.ts +70 -7
  477. package/src/admin/ui/src/router.tsx +2 -2
  478. package/src/admin/ui/src/routes/__root.tsx +9 -8
  479. package/src/admin/ui/src/routes/api-keys.tsx +475 -64
  480. package/src/admin/ui/src/routes/early-access.tsx +5 -12
  481. package/src/admin/ui/src/routes/earn.vaults.tsx +348 -0
  482. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +154 -0
  483. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +190 -0
  484. package/src/admin/ui/src/routes/organizations.tsx +4 -7
  485. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +56 -54
  486. package/src/admin/ui/src/routes/verified-tokens.tsx +4 -4
  487. package/src/admin/ui/vite.config.ts +4 -1
  488. package/src/admin/ui.generated.ts +113 -43
  489. package/src/analytics/Analytics.test.ts +69 -10
  490. package/src/analytics/Analytics.ts +20 -1
  491. package/src/analytics/tables/requestEvents.ts +79 -37
  492. package/src/apps/Zones.test.ts +33 -0
  493. package/src/apps/Zones.ts +40 -0
  494. package/src/apps/composition.test.ts +84 -1
  495. package/src/apps/data/App.test.ts +28 -11
  496. package/src/apps/data/App.ts +96 -33
  497. package/src/apps/data/FxOracle.ts +1 -1
  498. package/src/apps/data/index.ts +0 -1
  499. package/src/apps/data/routes/activities.test.ts +82 -6
  500. package/src/apps/data/routes/activities.ts +131 -71
  501. package/src/apps/data/routes/balances.test.ts +50 -37
  502. package/src/apps/data/routes/balances.ts +5 -5
  503. package/src/apps/data/routes/blocks.test.ts +2 -0
  504. package/src/apps/data/routes/coingecko.test.ts +22 -0
  505. package/src/apps/data/routes/coingecko.ts +84 -48
  506. package/src/apps/data/routes/earn.test.ts +1108 -0
  507. package/src/apps/data/routes/earn.ts +1391 -0
  508. package/src/apps/data/routes/exchanges.test.ts +82 -33
  509. package/src/apps/data/routes/exchanges.ts +842 -227
  510. package/src/apps/data/routes/fee-amm.test.ts +4 -6
  511. package/src/apps/data/routes/fee-amm.ts +69 -12
  512. package/src/apps/data/routes/funding.test.ts +2712 -221
  513. package/src/apps/data/routes/funding.ts +1604 -387
  514. package/src/apps/data/routes/indexer.test.ts +43 -34
  515. package/src/apps/data/routes/indexer.ts +19 -2
  516. package/src/apps/data/routes/receipts.test.ts +5 -3
  517. package/src/apps/data/routes/receipts.ts +13 -11
  518. package/src/apps/data/routes/rpc.test.ts +446 -28
  519. package/src/apps/data/routes/rpc.ts +243 -25
  520. package/src/apps/data/routes/tokenlist.ts +72 -19
  521. package/src/apps/data/routes/tokens.ts +258 -86
  522. package/src/apps/data/routes/transactions.test.ts +2 -0
  523. package/src/apps/data/routes/transactions.ts +77 -42
  524. package/src/apps/data/routes/transfers.test.ts +166 -4
  525. package/src/apps/data/routes/transfers.ts +216 -78
  526. package/src/apps/data/routes/valuation.test.ts +62 -9
  527. package/src/apps/data/routes/valuation.ts +2 -2
  528. package/src/apps/data/routes/webhooks.test.ts +386 -43
  529. package/src/apps/data/routes/webhooks.ts +172 -71
  530. package/src/apps/data/routes/zones.test.ts +473 -0
  531. package/src/apps/data/routes/zones.ts +338 -0
  532. package/src/apps/docs/reference.ts +8 -6
  533. package/src/apps/index.ts +2 -1
  534. package/src/apps/management/Billing.test.ts +29 -0
  535. package/src/apps/management/Billing.ts +23 -0
  536. package/src/apps/management/Error.ts +12 -0
  537. package/src/apps/management/routes/api-keys.test.ts +5 -3
  538. package/src/apps/management/routes/api-keys.ts +2 -9
  539. package/src/apps/management/routes/invitations.ts +4 -11
  540. package/src/apps/management/routes/orgs.ts +2 -9
  541. package/src/apps/management/routes/scopes.test.ts +7 -2
  542. package/src/apps/management/routes/scopes.ts +2 -2
  543. package/src/apps/management/routes/webhooks.test.ts +6 -1
  544. package/src/apps/management/routes/webhooks.ts +15 -3
  545. package/src/apps/mpp/App.ts +276 -29
  546. package/src/apps/mpp/Mpp.test.ts +631 -26
  547. package/src/apps/mpp/Mpp.ts +0 -42
  548. package/src/apps/mpp/internal/Adapter.ts +108 -3
  549. package/src/apps/mpp/internal/Error.test.ts +33 -0
  550. package/src/apps/mpp/internal/Error.ts +44 -6
  551. package/src/apps/mpp/internal/Idempotency.test.ts +213 -0
  552. package/src/apps/mpp/internal/Idempotency.ts +59 -5
  553. package/src/apps/mpp/internal/Policy.test.ts +122 -0
  554. package/src/apps/mpp/internal/Policy.ts +98 -0
  555. package/src/apps/mpp/internal/ScreenManager.test.ts +68 -0
  556. package/src/apps/mpp/internal/ScreenManager.ts +41 -0
  557. package/src/apps/mpp/internal/Screening.ts +40 -3
  558. package/src/apps/mpp/internal/Sponsorship.ts +144 -0
  559. package/src/apps/mpp/internal/Utils.ts +30 -0
  560. package/src/apps/relay/App.test.ts +493 -62
  561. package/src/apps/relay/App.ts +233 -23
  562. package/src/apps/relay/Sponsorships.test.ts +49 -0
  563. package/src/apps/relay/Sponsorships.ts +18 -6
  564. package/src/db/Db.ts +439 -0
  565. package/src/db/Schema.ts +325 -2
  566. package/src/db/tables/earnVaults.test.ts +185 -0
  567. package/src/db/tables/earnVaults.ts +151 -0
  568. package/src/db/tables/fundingCatalog.test.ts +108 -0
  569. package/src/db/tables/fundingCatalog.ts +157 -0
  570. package/src/db/tables/fundingDepositAddresses.test.ts +580 -0
  571. package/src/db/tables/fundingDepositAddresses.ts +376 -0
  572. package/src/db/tables/fundingDeposits.test.ts +261 -0
  573. package/src/db/tables/fundingDeposits.ts +229 -0
  574. package/src/db/tables/fundingIdempotency.test.ts +182 -0
  575. package/src/db/tables/fundingIdempotency.ts +180 -0
  576. package/src/db/tables/fundingTransferEvents.ts +28 -0
  577. package/src/db/tables/fundingTransferTransactions.test.ts +69 -0
  578. package/src/db/tables/fundingTransferTransactions.ts +37 -0
  579. package/src/db/tables/fundingTransfers.test.ts +89 -0
  580. package/src/db/tables/fundingTransfers.ts +153 -0
  581. package/src/db/tables/organizations.ts +16 -0
  582. package/src/db/tables/projects.ts +16 -0
  583. package/src/db/tables/requestUsage.ts +23 -0
  584. package/src/db/tables/sponsoredTransactions.test.ts +11 -0
  585. package/src/db/tables/sponsoredTransactions.ts +3 -3
  586. package/src/db/tables/users.ts +16 -0
  587. package/src/db/tables/verifiedTokens.ts +19 -14
  588. package/src/db/tables/webhookSubscriptions.ts +58 -3
  589. package/src/handlers/relay.test.ts +2 -0
  590. package/src/handlers/relay.ts +95 -99
  591. package/src/internal/Auth.test.ts +48 -0
  592. package/src/internal/Auth.ts +61 -2
  593. package/src/internal/Cache.ts +13 -9
  594. package/src/internal/Cursor.test.ts +2 -2
  595. package/src/internal/Cursor.ts +1 -1
  596. package/src/internal/EarnRates.test.ts +125 -0
  597. package/src/internal/EarnRates.ts +409 -0
  598. package/src/internal/EarnVaults.test.ts +195 -0
  599. package/src/internal/EarnVaults.ts +876 -0
  600. package/src/internal/EdgeCache.test.ts +19 -0
  601. package/src/internal/EdgeCache.ts +35 -5
  602. package/src/internal/Id.ts +14 -0
  603. package/src/internal/Idempotency.test.ts +109 -0
  604. package/src/internal/Idempotency.ts +237 -0
  605. package/src/internal/Log.test-d.ts +41 -8
  606. package/src/internal/Log.test.ts +189 -8
  607. package/src/internal/Log.ts +124 -17
  608. package/src/internal/MetricSink.test.ts +244 -4
  609. package/src/internal/MetricSink.ts +51 -1
  610. package/src/internal/OpenApi.ts +3 -0
  611. package/src/internal/Provider.test.ts +17 -0
  612. package/src/internal/Provider.ts +17 -0
  613. package/src/internal/Schema.ts +27 -17
  614. package/src/internal/Store.test.ts +25 -0
  615. package/src/internal/Store.ts +46 -0
  616. package/src/internal/Tidx.local.test.ts +78 -3
  617. package/src/internal/Tidx.test.ts +212 -18
  618. package/src/internal/Tidx.ts +112 -32
  619. package/src/internal/VerifiedTokens.test.ts +15 -0
  620. package/src/internal/Viem.test.ts +170 -17
  621. package/src/internal/Viem.ts +111 -28
  622. package/src/internal/WebhookDestination.ts +25 -23
  623. package/src/internal/Webhooks.test.ts +59 -0
  624. package/src/internal/Webhooks.ts +34 -10
  625. package/src/internal/exchange/Provider.test.ts +216 -0
  626. package/src/internal/exchange/Provider.ts +326 -0
  627. package/src/internal/exchange/index.test.ts +6 -0
  628. package/src/internal/exchange/index.ts +1 -0
  629. package/src/internal/exchange/providers/uniswap.test.ts +122 -0
  630. package/src/internal/exchange/providers/uniswap.ts +682 -0
  631. package/src/internal/funding/Action.test.ts +138 -0
  632. package/src/internal/funding/Action.ts +117 -0
  633. package/src/internal/funding/Catalog.test.ts +311 -0
  634. package/src/internal/funding/Catalog.ts +347 -0
  635. package/src/internal/funding/Chain.test.ts +79 -0
  636. package/src/internal/funding/Chain.ts +120 -0
  637. package/src/internal/funding/Deposit.test.ts +26 -0
  638. package/src/internal/funding/Deposit.ts +453 -0
  639. package/src/internal/funding/DepositAddress.test.ts +18 -0
  640. package/src/internal/funding/DepositAddress.ts +312 -0
  641. package/src/internal/funding/Evidence.test.ts +297 -0
  642. package/src/internal/funding/Evidence.ts +430 -0
  643. package/src/internal/funding/Provider.test.ts +1328 -0
  644. package/src/internal/funding/Provider.ts +1796 -0
  645. package/src/internal/funding/Reconciliation.local.test.ts +504 -0
  646. package/src/internal/funding/Reconciliation.test.ts +2020 -0
  647. package/src/internal/funding/Reconciliation.ts +930 -0
  648. package/src/internal/funding/Route.test.ts +66 -0
  649. package/src/internal/funding/Route.ts +29 -0
  650. package/src/internal/funding/Subsidy.local.test.ts +152 -0
  651. package/src/internal/funding/Subsidy.test.ts +75 -0
  652. package/src/internal/funding/Subsidy.ts +260 -0
  653. package/src/internal/funding/Token.test.ts +47 -0
  654. package/src/internal/funding/Token.ts +59 -0
  655. package/src/internal/funding/Transfer.test.ts +369 -0
  656. package/src/internal/funding/Transfer.ts +522 -0
  657. package/src/internal/funding/index.test.ts +20 -0
  658. package/src/internal/funding/index.ts +12 -0
  659. package/src/internal/funding/providers/across.ts +149 -0
  660. package/src/{apps/data/FundingQuoteProviders.test.ts → internal/funding/providers/index.test.ts} +178 -157
  661. package/src/internal/funding/providers/relay.test.ts +474 -0
  662. package/src/internal/funding/providers/relay.ts +559 -0
  663. package/src/internal/funding/providers/rhino.ts +139 -0
  664. package/src/internal/funding/providers/squid.ts +151 -0
  665. package/src/internal/funding/providers/symbiosis.ts +221 -0
  666. package/src/internal/index.test.ts +5 -1
  667. package/src/internal/index.ts +5 -1
  668. package/src/internal/webhookDestinations/url.ts +49 -45
  669. package/src/providers/index.test.ts +14 -0
  670. package/src/providers/index.ts +54 -0
  671. package/dist/apps/data/FundingQuoteProviders.d.ts +0 -174
  672. package/dist/apps/data/FundingQuoteProviders.d.ts.map +0 -1
  673. package/dist/apps/data/FundingQuoteProviders.js +0 -775
  674. package/dist/apps/data/FundingQuoteProviders.js.map +0 -1
  675. package/dist/internal/FundingQuotes.d.ts +0 -864
  676. package/dist/internal/FundingQuotes.d.ts.map +0 -1
  677. package/dist/internal/FundingQuotes.js +0 -672
  678. package/dist/internal/FundingQuotes.js.map +0 -1
  679. package/src/apps/data/FundingQuoteProviders.ts +0 -1043
  680. package/src/internal/FundingQuotes.test.ts +0 -456
  681. package/src/internal/FundingQuotes.ts +0 -944
@@ -0,0 +1,37 @@
1
+ import type { Selectable } from 'kysely'
2
+
3
+ import type * as Db from '../Db.js'
4
+ import type * as db_Schema from '../Schema.js'
5
+
6
+ /** Columns of the `funding_transfer_transactions` table. */
7
+ export type Table = db_Schema.FundingTransferTransaction
8
+ /** One verified transaction reference on a transfer. */
9
+ export type Record = Selectable<Table>
10
+
11
+ /**
12
+ * Inserts a transaction reference, lowercasing EVM hashes while preserving
13
+ * other references. Repeats return `undefined`; conflicting source ownership throws.
14
+ */
15
+ export function insert(db: Db.Db, record: Record): Promise<Record | undefined> {
16
+ return db.kysely
17
+ .insertInto('funding_transfer_transactions')
18
+ .values({
19
+ ...record,
20
+ transactionRef: record.chainId.startsWith('eip155:')
21
+ ? record.transactionRef.toLowerCase()
22
+ : record.transactionRef,
23
+ })
24
+ .onConflict((oc) => oc.columns(['transferId', 'role', 'transactionRef']).doNothing())
25
+ .returningAll()
26
+ .executeTakeFirst()
27
+ }
28
+
29
+ /** Lists a transfer's transaction references, oldest first. */
30
+ export function listByTransfer(db: Db.Db, transferId: string): Promise<Record[]> {
31
+ return db.kysely
32
+ .selectFrom('funding_transfer_transactions')
33
+ .selectAll()
34
+ .where('transferId', '=', transferId)
35
+ .orderBy('createdAt', 'asc')
36
+ .execute()
37
+ }
@@ -0,0 +1,89 @@
1
+ import * as Transfer from '../../internal/funding/Transfer.js'
2
+ import * as TestApp from '../../../test/App.js'
3
+ import * as TestFunding from '../../../test/Funding.js'
4
+ import * as FundingTransfers from './fundingTransfers.js'
5
+
6
+ const db = TestApp.database()
7
+
8
+ const owner = { environment: 'production', orgId: 'org_list' } as const
9
+
10
+ let counter = 0
11
+ function seed(input: Partial<Transfer.create.Input> = {}) {
12
+ // Distinct create times keep ids strictly ordered for paging assertions.
13
+ return Transfer.create(db, {
14
+ apiKeyId: 'key_test',
15
+ environment: 'production',
16
+ id: Transfer.generateId(new Date(Date.UTC(2026, 0, 1, 0, 0, counter++))),
17
+ orgId: owner.orgId,
18
+ snapshot: TestFunding.transferSnapshot(),
19
+ ...input,
20
+ })
21
+ }
22
+
23
+ describe('list', () => {
24
+ test('pages newest-first by id with owner isolation', async () => {
25
+ const first = await seed()
26
+ const second = await seed({ projectId: 'prj_a' })
27
+ const third = await seed()
28
+ await seed({ orgId: 'org_other' })
29
+ await seed({ environment: 'sandbox' })
30
+
31
+ const page = await FundingTransfers.list(db, owner, { limit: 3 })
32
+ expect(page.map((row) => row.id)).toEqual([third.id, second.id, first.id])
33
+
34
+ const rest = await FundingTransfers.list(db, owner, { cursor: third.id, limit: 3 })
35
+ expect(rest.map((row) => row.id)).toEqual([second.id, first.id])
36
+ })
37
+
38
+ test('narrows project-attributed owners to their project', async () => {
39
+ const rows = await FundingTransfers.list(db, { ...owner, projectId: 'prj_a' }, { limit: 10 })
40
+ expect(rows.every((row) => row.projectId === 'prj_a')).toBe(true)
41
+ expect(rows.length).toBeGreaterThan(0)
42
+ })
43
+
44
+ test('filters by status', async () => {
45
+ const record = await seed()
46
+ await Transfer.transition(db, { expectedVersion: 1, id: record.id, status: 'expired' })
47
+ const rows = await FundingTransfers.list(db, owner, { limit: 10, status: 'expired' })
48
+ expect(rows.map((row) => row.id)).toEqual([record.id])
49
+ })
50
+ })
51
+
52
+ describe('count', () => {
53
+ test('shares the list filter and stops at the cap', async () => {
54
+ const total = await FundingTransfers.count(db, owner, { cap: 100 })
55
+ expect(total).toBeGreaterThanOrEqual(3)
56
+ expect(await FundingTransfers.count(db, owner, { cap: 2 })).toBe(3)
57
+ expect(await FundingTransfers.count(db, { ...owner, orgId: 'org_none' }, { cap: 100 })).toBe(0)
58
+ })
59
+ })
60
+
61
+ describe('getOwned', () => {
62
+ test('returns owned rows and hides foreign ones', async () => {
63
+ const record = await seed()
64
+ expect((await FundingTransfers.getOwned(db, owner, record.id))?.id).toBe(record.id)
65
+ expect(
66
+ await FundingTransfers.getOwned(db, { ...owner, orgId: 'org_other' }, record.id),
67
+ ).toBeUndefined()
68
+ expect(
69
+ await FundingTransfers.getOwned(db, { ...owner, projectId: 'prj_a' }, record.id),
70
+ ).toBeUndefined()
71
+ })
72
+ })
73
+
74
+ describe('update', () => {
75
+ test('applies only against the expected version', async () => {
76
+ const record = await seed()
77
+ const options = {
78
+ expectedVersion: 1,
79
+ id: record.id,
80
+ snapshot: record.snapshot,
81
+ status: 'processing',
82
+ statusReason: null,
83
+ updatedAt: '2026-01-01T00:10:00.000Z',
84
+ version: 2,
85
+ } as const
86
+ expect((await FundingTransfers.update(db, options))?.version).toBe(2)
87
+ expect(await FundingTransfers.update(db, options)).toBeUndefined()
88
+ })
89
+ })
@@ -0,0 +1,153 @@
1
+ import type { Selectable } from 'kysely'
2
+
3
+ import type * as Db from '../Db.js'
4
+ import type * as db_Schema from '../Schema.js'
5
+
6
+ /** Columns of the `funding_transfers` table. */
7
+ export type Table = db_Schema.FundingTransfer
8
+ /** A stored funding transfer. */
9
+ export type Record = Selectable<Table>
10
+
11
+ /**
12
+ * Ownership filter derived from the API-key principal, never from the
13
+ * request. A `projectId` narrows reads to that project; organization-attributed
14
+ * keys omit it and see every project in their organization and environment.
15
+ */
16
+ export type Owner = {
17
+ /** Key environment. */
18
+ environment: Record['environment']
19
+ /** Owning organization id (`org_…`). */
20
+ orgId: string
21
+ /** Attributed project id, for project-attributed keys. */
22
+ projectId?: string | undefined
23
+ }
24
+
25
+ /** Inserts a transfer row. Callers commit the matching event in the same transaction. */
26
+ export function insert(db: Db.Db, record: Record): Promise<Record> {
27
+ return db.kysely
28
+ .insertInto('funding_transfers')
29
+ .values(record)
30
+ .returningAll()
31
+ .executeTakeFirstOrThrow()
32
+ }
33
+
34
+ /** Gets a transfer by id without ownership scoping (domain and reconciler use). */
35
+ export function get(db: Db.Db, id: string): Promise<Record | undefined> {
36
+ return db.kysely
37
+ .selectFrom('funding_transfers')
38
+ .selectAll()
39
+ .where('id', '=', id)
40
+ .executeTakeFirst()
41
+ }
42
+
43
+ /** Gets an owner-visible transfer by id; `undefined` for absent or foreign rows. */
44
+ export function getOwned(db: Db.Db, owner: Owner, id: string): Promise<Record | undefined> {
45
+ let query = db.kysely
46
+ .selectFrom('funding_transfers')
47
+ .selectAll()
48
+ .where('id', '=', id)
49
+ .where('orgId', '=', owner.orgId)
50
+ .where('environment', '=', owner.environment)
51
+ if (owner.projectId !== undefined) query = query.where('projectId', '=', owner.projectId)
52
+ return query.executeTakeFirst()
53
+ }
54
+
55
+ /**
56
+ * Lists an owner's transfers newest-first. Ids embed a timestamp, so lexical
57
+ * key order is chronological and the cursor is the last returned id.
58
+ */
59
+ export function list(db: Db.Db, owner: Owner, options: list.Options): Promise<Record[]> {
60
+ let query = db.kysely
61
+ .selectFrom('funding_transfers')
62
+ .selectAll()
63
+ .where('orgId', '=', owner.orgId)
64
+ .where('environment', '=', owner.environment)
65
+ if (owner.projectId !== undefined) query = query.where('projectId', '=', owner.projectId)
66
+ if (options.status !== undefined) query = query.where('status', '=', options.status)
67
+ if (options.cursor !== undefined) query = query.where('id', '<', options.cursor)
68
+ return query.orderBy('id', 'desc').limit(options.limit).execute()
69
+ }
70
+
71
+ export declare namespace list {
72
+ /** Paging and filter options. */
73
+ type Options = {
74
+ /** Exclusive lower bound: the last id of the previous page. */
75
+ cursor?: string | undefined
76
+ /** Maximum rows to return (fetch one extra to detect a further page). */
77
+ limit: number
78
+ /** Restricts to one lifecycle status. */
79
+ status?: Record['status'] | undefined
80
+ }
81
+ }
82
+
83
+ /**
84
+ * Counts an owner's transfers through a capped subquery sharing the list
85
+ * filter, so the count cannot scan unboundedly. A result above `cap` means
86
+ * the true count was truncated.
87
+ */
88
+ export async function count(db: Db.Db, owner: Owner, options: count.Options): Promise<number> {
89
+ const row = await db.kysely
90
+ .selectFrom((eb) => {
91
+ let query = eb
92
+ .selectFrom('funding_transfers')
93
+ .select('id')
94
+ .where('orgId', '=', owner.orgId)
95
+ .where('environment', '=', owner.environment)
96
+ if (owner.projectId !== undefined) query = query.where('projectId', '=', owner.projectId)
97
+ if (options.status !== undefined) query = query.where('status', '=', options.status)
98
+ return query.limit(options.cap + 1).as('page')
99
+ })
100
+ .select(({ fn }) => fn.countAll<string>().as('count'))
101
+ .executeTakeFirstOrThrow()
102
+ return Number(row.count)
103
+ }
104
+
105
+ export declare namespace count {
106
+ /** Count options sharing the list filter. */
107
+ type Options = {
108
+ /** Row ceiling; a result above it signals a truncated count. */
109
+ cap: number
110
+ /** Restricts to one lifecycle status. */
111
+ status?: Record['status'] | undefined
112
+ }
113
+ }
114
+
115
+ /**
116
+ * Applies a version-guarded update; `undefined` when the row moved past
117
+ * `expectedVersion` (or vanished) so the caller retries against fresh state.
118
+ */
119
+ export function update(db: Db.Db, options: update.Options): Promise<Record | undefined> {
120
+ return db.kysely
121
+ .updateTable('funding_transfers')
122
+ .set({
123
+ snapshot: options.snapshot,
124
+ status: options.status,
125
+ statusReason: options.statusReason,
126
+ updatedAt: options.updatedAt,
127
+ version: options.version,
128
+ })
129
+ .where('id', '=', options.id)
130
+ .where('version', '=', options.expectedVersion)
131
+ .returningAll()
132
+ .executeTakeFirst()
133
+ }
134
+
135
+ export declare namespace update {
136
+ /** Guarded update fields. */
137
+ type Options = {
138
+ /** The version the update was computed against. */
139
+ expectedVersion: number
140
+ /** Transfer id (`ftr_…`). */
141
+ id: string
142
+ /** Replacement public snapshot. */
143
+ snapshot: Record['snapshot']
144
+ /** New lifecycle status. */
145
+ status: Record['status']
146
+ /** Customer-safe reason, or null to clear. */
147
+ statusReason: Record['statusReason']
148
+ /** Mutation timestamp (ISO 8601). */
149
+ updatedAt: string
150
+ /** The incremented version. */
151
+ version: number
152
+ }
153
+ }
@@ -186,6 +186,22 @@ export function get(db: Db.Db, id: string): Promise<Record | undefined> {
186
186
  return db.kysely.selectFrom('organizations').selectAll().where('id', '=', id).executeTakeFirst()
187
187
  }
188
188
 
189
+ /**
190
+ * Reads organizations by id for operational attribution displays.
191
+ *
192
+ * @param db - The database.
193
+ * @param ids - Organization ids to read.
194
+ * @returns Matching organization records.
195
+ */
196
+ export function listByIds(db: Db.Db, ids: readonly string[]): Promise<Record[]> {
197
+ if (ids.length === 0) return Promise.resolve([])
198
+ return db.kysely
199
+ .selectFrom('organizations')
200
+ .selectAll()
201
+ .where('id', 'in', [...ids])
202
+ .execute()
203
+ }
204
+
189
205
  /**
190
206
  * Reads an organization with current member and project counts.
191
207
  *
@@ -65,6 +65,22 @@ export function get(db: Db.Db, id: string): Promise<Record | undefined> {
65
65
  return db.kysely.selectFrom('projects').selectAll().where('id', '=', id).executeTakeFirst()
66
66
  }
67
67
 
68
+ /**
69
+ * Reads projects by id for operational attribution displays.
70
+ *
71
+ * @param db - The database.
72
+ * @param ids - Project ids to read.
73
+ * @returns Matching project records.
74
+ */
75
+ export function listByIds(db: Db.Db, ids: readonly string[]): Promise<Record[]> {
76
+ if (ids.length === 0) return Promise.resolve([])
77
+ return db.kysely
78
+ .selectFrom('projects')
79
+ .selectAll()
80
+ .where('id', 'in', [...ids])
81
+ .execute()
82
+ }
83
+
68
84
  /**
69
85
  * Lists an organization's projects, newest first.
70
86
  *
@@ -43,6 +43,12 @@ export type Bucket = db_Schema.RequestUsageBucket
43
43
  /** A stored request-count meter event. */
44
44
  export type MeterEvent = db_Schema.RequestUsageMeterEvent
45
45
 
46
+ /** Aggregate state for pending meter events in one billing environment. */
47
+ export type PendingStatus = {
48
+ count: number
49
+ oldestAttemptedAt: string | undefined
50
+ }
51
+
46
52
  /** Identifies one hourly bucket for an org in an environment. */
47
53
  export type BucketKey = {
48
54
  /** UTC hour start (ISO 8601). */
@@ -91,6 +97,23 @@ export async function listPending(db: Db.Db, environment: Environment): Promise<
91
97
  return rows.map(toMeterEvent)
92
98
  }
93
99
 
100
+ /**
101
+ * Reads the number and age anchor of meter events still awaiting Stripe.
102
+ *
103
+ * @param db - The database.
104
+ * @param environment - The billing environment to inspect.
105
+ * @returns The pending-event count and oldest first attempt.
106
+ */
107
+ export async function getPendingStatus(db: Db.Db, environment: Environment): Promise<PendingStatus> {
108
+ const row = await db.kysely
109
+ .selectFrom('request_usage_meter_events')
110
+ .select((eb) => [eb.fn.countAll().as('count'), eb.fn.min('firstAttemptedAt').as('oldest')])
111
+ .where('environment', '=', environment)
112
+ .where('state', '=', 'pending')
113
+ .executeTakeFirstOrThrow()
114
+ return { count: Number(row.count), oldestAttemptedAt: row.oldest ?? undefined }
115
+ }
116
+
94
117
  /**
95
118
  * Inserts a frozen `pending` meter event, claiming a delta. Idempotent on the
96
119
  * deterministic `identifier`: a re-seal after a crash resolves to the existing
@@ -62,6 +62,17 @@ describe('upsert', () => {
62
62
  await db.close()
63
63
  })
64
64
 
65
+ test('behavior: records organization-level sponsorship without a project', async () => {
66
+ const db = create()
67
+ await db.migrate()
68
+ const { projectId: _, ...organization } = input
69
+ const record = await SponsoredTransactions.upsert(db, organization)
70
+
71
+ expect(record.orgId).toMatchInlineSnapshot(`"org_1"`)
72
+ expect(record.projectId).toBeNull()
73
+ await db.close()
74
+ })
75
+
65
76
  test('behavior: preserves an explicit fee token', async () => {
66
77
  const db = create()
67
78
  await db.migrate()
@@ -40,7 +40,7 @@ export async function upsert(db: Db.Db, input: upsert.Input): Promise<Record> {
40
40
  id: Id.generate('stx'),
41
41
  meterReportedAt: null,
42
42
  orgId: input.orgId,
43
- projectId: input.projectId,
43
+ projectId: input.projectId ?? null,
44
44
  signPayload: input.signPayload,
45
45
  status: 'pending',
46
46
  transaction: input.transaction,
@@ -95,8 +95,8 @@ export declare namespace upsert {
95
95
  feeToken?: string | undefined
96
96
  /** Organization id (`org_…`) the spend attributes to. */
97
97
  orgId: string
98
- /** Project id (`prj_…`) the spend attributes to. */
99
- projectId: string
98
+ /** Project id (`prj_…`) the spend attributes to; omit for organization-level spend. */
99
+ projectId?: string | undefined
100
100
  /** Fee-payer sign payload — a stable identity for the sponsored envelope. */
101
101
  signPayload: string
102
102
  /** Serialized sponsored transaction, kept for observability beyond log retention. */
@@ -21,6 +21,22 @@ export function get(db: Db.Db, id: string): Promise<Record | undefined> {
21
21
  return db.kysely.selectFrom('users').selectAll().where('id', '=', id).executeTakeFirst()
22
22
  }
23
23
 
24
+ /**
25
+ * Reads users by id for operational identity displays.
26
+ *
27
+ * @param db - The database.
28
+ * @param ids - User ids to read.
29
+ * @returns Matching user records.
30
+ */
31
+ export function listByIds(db: Db.Db, ids: readonly string[]): Promise<Record[]> {
32
+ if (ids.length === 0) return Promise.resolve([])
33
+ return db.kysely
34
+ .selectFrom('users')
35
+ .selectAll()
36
+ .where('id', 'in', [...ids])
37
+ .execute()
38
+ }
39
+
24
40
  /**
25
41
  * Reads a user by wallet address (compared lowercase).
26
42
  *
@@ -1,21 +1,24 @@
1
- import type { Selectable } from 'kysely'
1
+ import type { ColumnType } from 'kysely'
2
2
  import type { Hex } from 'ox'
3
3
 
4
4
  import type * as VerifiedTokens from '../../internal/VerifiedTokens.js'
5
5
  import type * as Db from '../Db.js'
6
6
  import type * as db_Schema from '../Schema.js'
7
7
 
8
- /** Columns of the `verified_tokens` table, derived from `Schema.VerifiedToken`. */
9
- export type Table = db_Schema.VerifiedToken
8
+ /** A bigint chain id, read as a string from pg and written as a number. */
9
+ type ChainId = ColumnType<string, number, number>
10
10
 
11
- /** Columns of the `verified_token_lists` table, derived from `Schema.VerifiedTokenList`. */
12
- export type ListTable = db_Schema.VerifiedTokenList
11
+ /** Columns of the `verified_tokens` table. */
12
+ export type Table = Omit<db_Schema.VerifiedToken, 'chainId'> & { chainId: ChainId }
13
+
14
+ /** Columns of the `verified_token_lists` table. */
15
+ export type ListTable = Omit<db_Schema.VerifiedTokenList, 'chainId'> & { chainId: ChainId }
13
16
 
14
17
  /** A stored verified-token row. */
15
- export type Row = Selectable<Table>
18
+ export type Row = db_Schema.VerifiedToken
16
19
 
17
20
  /** A chain's list-level metadata. */
18
- export type Meta = Selectable<ListTable>
21
+ export type Meta = db_Schema.VerifiedTokenList
19
22
 
20
23
  /**
21
24
  * Reads a chain's list metadata — the "head" the soft-refresh cache compares
@@ -25,12 +28,13 @@ export type Meta = Selectable<ListTable>
25
28
  * @param chainId - The chain id.
26
29
  * @returns The metadata, or `undefined` when the chain has no list yet.
27
30
  */
28
- export function head(db: Db.Db, chainId: number): Promise<Meta | undefined> {
29
- return db.kysely
31
+ export async function head(db: Db.Db, chainId: number): Promise<Meta | undefined> {
32
+ const row = await db.kysely
30
33
  .selectFrom('verified_token_lists')
31
34
  .selectAll()
32
- .where('chainId', '=', chainId)
35
+ .where('chainId', '=', String(chainId))
33
36
  .executeTakeFirst()
37
+ return row ? { ...row, chainId: Number(row.chainId) } : undefined
34
38
  }
35
39
 
36
40
  /**
@@ -40,13 +44,14 @@ export function head(db: Db.Db, chainId: number): Promise<Meta | undefined> {
40
44
  * @param chainId - The chain id.
41
45
  * @returns The rows.
42
46
  */
43
- export function list(db: Db.Db, chainId: number): Promise<Row[]> {
44
- return db.kysely
47
+ export async function list(db: Db.Db, chainId: number): Promise<Row[]> {
48
+ const rows = await db.kysely
45
49
  .selectFrom('verified_tokens')
46
50
  .selectAll()
47
- .where('chainId', '=', chainId)
51
+ .where('chainId', '=', String(chainId))
48
52
  .orderBy('position')
49
53
  .execute()
54
+ return rows.map((row) => ({ ...row, chainId: Number(row.chainId) }))
50
55
  }
51
56
 
52
57
  /**
@@ -59,7 +64,7 @@ export function list(db: Db.Db, chainId: number): Promise<Row[]> {
59
64
  * @param input - The validated list and its new version metadata.
60
65
  */
61
66
  export async function publish(db: Db.Db, chainId: number, input: publish.Input): Promise<void> {
62
- await db.kysely.deleteFrom('verified_tokens').where('chainId', '=', chainId).execute()
67
+ await db.kysely.deleteFrom('verified_tokens').where('chainId', '=', String(chainId)).execute()
63
68
  if (input.tokens.length > 0)
64
69
  await db.kysely
65
70
  .insertInto('verified_tokens')
@@ -46,8 +46,13 @@ export function toSubscription(row: Record): Webhooks.Subscription {
46
46
  *
47
47
  * @param db - The database.
48
48
  * @param subscription - The subscription to insert.
49
+ * @param options - Initial cursor options.
49
50
  */
50
- export async function insert(db: Db.Db, subscription: Webhooks.Subscription): Promise<void> {
51
+ export async function insert(
52
+ db: Db.Db,
53
+ subscription: Webhooks.Subscription,
54
+ options: insert.Options = {},
55
+ ): Promise<void> {
51
56
  await db.kysely
52
57
  .insertInto('webhook_subscriptions')
53
58
  .values({
@@ -63,7 +68,7 @@ export async function insert(db: Db.Db, subscription: Webhooks.Subscription): Pr
63
68
  lastDeliveryAt: subscription.lastDeliveryAt ?? null,
64
69
  ownerId: ownerId(subscription.owner),
65
70
  ownerType: subscription.owner.type,
66
- pollerCursor: null,
71
+ pollerCursor: options.pollerCursor ?? null,
67
72
  secret: subscription.secret,
68
73
  status: subscription.status,
69
74
  updatedAt: subscription.updatedAt,
@@ -71,6 +76,14 @@ export async function insert(db: Db.Db, subscription: Webhooks.Subscription): Pr
71
76
  .execute()
72
77
  }
73
78
 
79
+ export declare namespace insert {
80
+ /** Options for {@link insert}. */
81
+ type Options = {
82
+ /** Initial poller cursor committed with the subscription. */
83
+ pollerCursor?: string | undefined
84
+ }
85
+ }
86
+
74
87
  /**
75
88
  * Inserts a subscription when its owner remains below the configured cap.
76
89
  * An owner-scoped transaction lock serializes the count and insert.
@@ -85,7 +98,11 @@ export async function insertWithinLimit(
85
98
  await sql`select pg_advisory_xact_lock(${subscriptionLimitLockClass}, hashtext(${owner}))`.execute(tx.kysely) // prettier-ignore
86
99
  const existing = await count(tx, subscription.owner, options.now)
87
100
  if (existing >= options.maxPerOwner) return false
88
- await insert(tx, subscription)
101
+ await insert(
102
+ tx,
103
+ subscription,
104
+ options.pollerCursor === undefined ? {} : { pollerCursor: options.pollerCursor },
105
+ )
89
106
  return true
90
107
  })
91
108
  }
@@ -97,6 +114,8 @@ export declare namespace insertWithinLimit {
97
114
  maxPerOwner: number
98
115
  /** ISO timestamp used to exclude expired rows from the count. */
99
116
  now: string
117
+ /** Initial poller cursor committed with the subscription. */
118
+ pollerCursor?: string | undefined
100
119
  }
101
120
  }
102
121
 
@@ -312,6 +331,42 @@ export async function setCursor(db: Db.Db, id: string, cursor: string): Promise<
312
331
  .execute()
313
332
  }
314
333
 
334
+ /**
335
+ * Writes a poller cursor only when the stored cursor still matches the caller's
336
+ * observed value.
337
+ *
338
+ * @param db - The database.
339
+ * @param options - Subscription, expected cursor, and next cursor.
340
+ * @returns Whether the cursor was updated.
341
+ */
342
+ export async function compareAndSetCursor(
343
+ db: Db.Db,
344
+ options: compareAndSetCursor.Options,
345
+ ): Promise<boolean> {
346
+ let query = db.kysely
347
+ .updateTable('webhook_subscriptions')
348
+ .set({ pollerCursor: options.cursor })
349
+ .where('id', '=', options.subscriptionId)
350
+ query =
351
+ options.expectedCursor === null
352
+ ? query.where('pollerCursor', 'is', null)
353
+ : query.where('pollerCursor', '=', options.expectedCursor)
354
+ const result = await query.executeTakeFirst()
355
+ return result.numUpdatedRows > 0n
356
+ }
357
+
358
+ export declare namespace compareAndSetCursor {
359
+ /** Options for {@link compareAndSetCursor}. */
360
+ type Options = {
361
+ /** Next keyset cursor. */
362
+ cursor: string
363
+ /** Cursor observed before scanning, or null for an uninitialized subscription. */
364
+ expectedCursor: string | null
365
+ /** Subscription whose cursor advances. */
366
+ subscriptionId: string
367
+ }
368
+ }
369
+
315
370
  /**
316
371
  * Records a successful delivery: resets the consecutive-failure counter and
317
372
  * stamps `lastDeliveryAt`.
@@ -1,3 +1,5 @@
1
+ /** @module-tag localnet */
2
+
1
3
  import type { RpcRequest } from 'ox'
2
4
  import { SignatureEnvelope, TxEnvelopeTempo } from 'ox/tempo'
3
5
  import { parseUnits, type Address, type BaseError } from 'viem'