tapimo 0.12.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. package/dist/App.d.ts +11333 -9563
  2. package/dist/App.d.ts.map +1 -1
  3. package/dist/App.js +39 -3
  4. package/dist/App.js.map +1 -1
  5. package/dist/Scope.d.ts +2 -0
  6. package/dist/Scope.d.ts.map +1 -1
  7. package/dist/Scope.js +17 -0
  8. package/dist/Scope.js.map +1 -1
  9. package/dist/Webhooks.js +2 -2
  10. package/dist/Webhooks.js.map +1 -1
  11. package/dist/admin/App.d.ts +1064 -924
  12. package/dist/admin/App.d.ts.map +1 -1
  13. package/dist/admin/apps/api-keys.d.ts +80 -0
  14. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  15. package/dist/admin/apps/api-keys.js +54 -0
  16. package/dist/admin/apps/api-keys.js.map +1 -1
  17. package/dist/admin/apps/earn-vaults.d.ts +63 -15
  18. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  19. package/dist/admin/apps/earn-vaults.js +2 -1
  20. package/dist/admin/apps/earn-vaults.js.map +1 -1
  21. package/dist/admin/apps/organizations.d.ts +92 -3
  22. package/dist/admin/apps/organizations.d.ts.map +1 -1
  23. package/dist/admin/apps/organizations.js +69 -7
  24. package/dist/admin/apps/organizations.js.map +1 -1
  25. package/dist/admin/apps/verified-tokens.d.ts +7 -7
  26. package/dist/admin/ui.generated.d.ts +1 -1
  27. package/dist/admin/ui.generated.d.ts.map +1 -1
  28. package/dist/admin/ui.generated.js +151 -151
  29. package/dist/admin/ui.generated.js.map +1 -1
  30. package/dist/apps/Zones.d.ts +28 -28
  31. package/dist/apps/Zones.js +7 -7
  32. package/dist/apps/data/App.d.ts +2909 -2523
  33. package/dist/apps/data/App.d.ts.map +1 -1
  34. package/dist/apps/data/App.js +26 -21
  35. package/dist/apps/data/App.js.map +1 -1
  36. package/dist/apps/data/ZoneSelection.d.ts +8 -8
  37. package/dist/apps/data/ZoneSelection.d.ts.map +1 -1
  38. package/dist/apps/data/ZoneSelection.js +1 -1
  39. package/dist/apps/data/ZoneSelection.js.map +1 -1
  40. package/dist/apps/data/routes/activities.d.ts +588 -584
  41. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  42. package/dist/apps/data/routes/activities.js +1561 -1239
  43. package/dist/apps/data/routes/activities.js.map +1 -1
  44. package/dist/apps/data/routes/addresses.d.ts +22 -22
  45. package/dist/apps/data/routes/balances.d.ts +26 -26
  46. package/dist/apps/data/routes/balances.d.ts.map +1 -1
  47. package/dist/apps/data/routes/balances.js +43 -16
  48. package/dist/apps/data/routes/balances.js.map +1 -1
  49. package/dist/apps/data/routes/blocks.d.ts +44 -44
  50. package/dist/apps/data/routes/blocks.d.ts.map +1 -1
  51. package/dist/apps/data/routes/blocks.js +21 -11
  52. package/dist/apps/data/routes/blocks.js.map +1 -1
  53. package/dist/apps/data/routes/coingecko.d.ts +3 -3
  54. package/dist/apps/data/routes/earn.d.ts +201 -25
  55. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  56. package/dist/apps/data/routes/earn.js +434 -75
  57. package/dist/apps/data/routes/earn.js.map +1 -1
  58. package/dist/apps/data/routes/exchanges.d.ts +160 -145
  59. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  60. package/dist/apps/data/routes/exchanges.js +180 -114
  61. package/dist/apps/data/routes/exchanges.js.map +1 -1
  62. package/dist/apps/data/routes/fee-amm.d.ts +2 -2
  63. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  64. package/dist/apps/data/routes/fee-amm.js +18 -19
  65. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  66. package/dist/apps/data/routes/receipts.d.ts +155 -55
  67. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  68. package/dist/apps/data/routes/receipts.js +28 -10
  69. package/dist/apps/data/routes/receipts.js.map +1 -1
  70. package/dist/apps/data/routes/tokenlist.d.ts +13 -13
  71. package/dist/apps/data/routes/tokens.d.ts +5 -5
  72. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  73. package/dist/apps/data/routes/tokens.js +51 -20
  74. package/dist/apps/data/routes/tokens.js.map +1 -1
  75. package/dist/apps/data/routes/transactions.d.ts +7 -2
  76. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  77. package/dist/apps/data/routes/transactions.js +37 -17
  78. package/dist/apps/data/routes/transactions.js.map +1 -1
  79. package/dist/apps/data/routes/transfers.d.ts +13 -13
  80. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  81. package/dist/apps/data/routes/transfers.js +18 -12
  82. package/dist/apps/data/routes/transfers.js.map +1 -1
  83. package/dist/apps/data/routes/valuation.d.ts +31 -31
  84. package/dist/apps/data/routes/valuation.d.ts.map +1 -1
  85. package/dist/apps/data/routes/valuation.js +12 -7
  86. package/dist/apps/data/routes/valuation.js.map +1 -1
  87. package/dist/apps/data/routes/verified-tokens.d.ts +8 -8
  88. package/dist/apps/data/routes/webhooks.d.ts +816 -113
  89. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  90. package/dist/apps/data/routes/webhooks.js +47 -5
  91. package/dist/apps/data/routes/webhooks.js.map +1 -1
  92. package/dist/apps/data/routes/zones.d.ts +14 -14
  93. package/dist/apps/data/routes/zones.js +1 -1
  94. package/dist/apps/funding/App.d.ts +466 -44
  95. package/dist/apps/funding/App.d.ts.map +1 -1
  96. package/dist/apps/funding/App.js +1 -1
  97. package/dist/apps/funding/App.js.map +1 -1
  98. package/dist/apps/funding/routes/deposit-addresses.d.ts +17 -17
  99. package/dist/apps/funding/routes/deposit-addresses.d.ts.map +1 -1
  100. package/dist/apps/funding/routes/deposit-addresses.js +17 -12
  101. package/dist/apps/funding/routes/deposit-addresses.js.map +1 -1
  102. package/dist/apps/funding/routes/transfers.d.ts +650 -57
  103. package/dist/apps/funding/routes/transfers.d.ts.map +1 -1
  104. package/dist/apps/funding/routes/transfers.js +238 -24
  105. package/dist/apps/funding/routes/transfers.js.map +1 -1
  106. package/dist/apps/management/App.d.ts +5120 -4152
  107. package/dist/apps/management/App.d.ts.map +1 -1
  108. package/dist/apps/management/Billing.d.ts +1 -1
  109. package/dist/apps/management/Billing.d.ts.map +1 -1
  110. package/dist/apps/management/Billing.js +17 -1
  111. package/dist/apps/management/Billing.js.map +1 -1
  112. package/dist/apps/management/routes/api-keys.d.ts +632 -81
  113. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  114. package/dist/apps/management/routes/api-keys.js +236 -4
  115. package/dist/apps/management/routes/api-keys.js.map +1 -1
  116. package/dist/apps/management/routes/billing.d.ts +76 -76
  117. package/dist/apps/management/routes/faucet.d.ts +6 -6
  118. package/dist/apps/management/routes/invitations.d.ts +24 -24
  119. package/dist/apps/management/routes/invite-links.d.ts +4 -4
  120. package/dist/apps/management/routes/members.d.ts +16 -16
  121. package/dist/apps/management/routes/orgs.d.ts +20 -20
  122. package/dist/apps/management/routes/projects.d.ts +4 -4
  123. package/dist/apps/management/routes/usage.d.ts +8 -8
  124. package/dist/apps/management/routes/verified-token-requests.d.ts +17 -17
  125. package/dist/apps/management/routes/webhooks.d.ts +675 -25
  126. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  127. package/dist/apps/management/routes/webhooks.js +21 -21
  128. package/dist/apps/management/routes/webhooks.js.map +1 -1
  129. package/dist/apps/relay/App.d.ts.map +1 -1
  130. package/dist/apps/relay/App.js +115 -23
  131. package/dist/apps/relay/App.js.map +1 -1
  132. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  133. package/dist/apps/relay/Sponsorships.js +27 -1
  134. package/dist/apps/relay/Sponsorships.js.map +1 -1
  135. package/dist/db/Db.d.ts.map +1 -1
  136. package/dist/db/Db.js +34 -1
  137. package/dist/db/Db.js.map +1 -1
  138. package/dist/db/Schema.d.ts +11 -5
  139. package/dist/db/Schema.d.ts.map +1 -1
  140. package/dist/db/Schema.js +21 -3
  141. package/dist/db/Schema.js.map +1 -1
  142. package/dist/db/tables/fundingCatalog.d.ts +4 -2
  143. package/dist/db/tables/fundingCatalog.d.ts.map +1 -1
  144. package/dist/db/tables/fundingCatalog.js +5 -1
  145. package/dist/db/tables/fundingCatalog.js.map +1 -1
  146. package/dist/db/tables/fundingTransferTransactions.d.ts +38 -0
  147. package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -1
  148. package/dist/db/tables/fundingTransferTransactions.js +44 -3
  149. package/dist/db/tables/fundingTransferTransactions.js.map +1 -1
  150. package/dist/db/tables/fundingTransfers.d.ts +17 -0
  151. package/dist/db/tables/fundingTransfers.d.ts.map +1 -1
  152. package/dist/db/tables/fundingTransfers.js +21 -0
  153. package/dist/db/tables/fundingTransfers.js.map +1 -1
  154. package/dist/db/tables/organizations.d.ts +24 -0
  155. package/dist/db/tables/organizations.d.ts.map +1 -1
  156. package/dist/db/tables/organizations.js +27 -0
  157. package/dist/db/tables/organizations.js.map +1 -1
  158. package/dist/db/tables/projects.d.ts +25 -1
  159. package/dist/db/tables/projects.d.ts.map +1 -1
  160. package/dist/db/tables/projects.js +26 -0
  161. package/dist/db/tables/projects.js.map +1 -1
  162. package/dist/db/tables/sponsoredTransactions.d.ts +44 -0
  163. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  164. package/dist/db/tables/sponsoredTransactions.js +146 -13
  165. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  166. package/dist/db/tables/webhookSubscriptions.d.ts +10 -6
  167. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  168. package/dist/db/tables/webhookSubscriptions.js +9 -6
  169. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  170. package/dist/handlers/internal/utils.d.ts.map +1 -1
  171. package/dist/handlers/internal/utils.js +9 -0
  172. package/dist/handlers/internal/utils.js.map +1 -1
  173. package/dist/internal/Auth.d.ts +3 -1
  174. package/dist/internal/Auth.d.ts.map +1 -1
  175. package/dist/internal/Auth.js +6 -3
  176. package/dist/internal/Auth.js.map +1 -1
  177. package/dist/internal/EarnVaults.d.ts +3 -3
  178. package/dist/internal/EarnVaults.js +5 -5
  179. package/dist/internal/EarnVaults.js.map +1 -1
  180. package/dist/internal/Fetch.d.ts +23 -0
  181. package/dist/internal/Fetch.d.ts.map +1 -0
  182. package/dist/internal/Fetch.js +26 -0
  183. package/dist/internal/Fetch.js.map +1 -0
  184. package/dist/internal/Log.d.ts +4 -2
  185. package/dist/internal/Log.d.ts.map +1 -1
  186. package/dist/internal/Log.js +16 -3
  187. package/dist/internal/Log.js.map +1 -1
  188. package/dist/internal/OpenApi.d.ts +5 -3
  189. package/dist/internal/OpenApi.d.ts.map +1 -1
  190. package/dist/internal/OpenApi.js +13 -3
  191. package/dist/internal/OpenApi.js.map +1 -1
  192. package/dist/internal/Response.d.ts +1 -1
  193. package/dist/internal/Response.d.ts.map +1 -1
  194. package/dist/internal/Schema.d.ts +6 -3
  195. package/dist/internal/Schema.d.ts.map +1 -1
  196. package/dist/internal/Schema.js +8 -2
  197. package/dist/internal/Schema.js.map +1 -1
  198. package/dist/internal/Store.d.ts +16 -3
  199. package/dist/internal/Store.d.ts.map +1 -1
  200. package/dist/internal/Store.js +82 -16
  201. package/dist/internal/Store.js.map +1 -1
  202. package/dist/internal/Tidx.d.ts.map +1 -1
  203. package/dist/internal/Tidx.js +7 -2
  204. package/dist/internal/Tidx.js.map +1 -1
  205. package/dist/internal/Timeout.d.ts +36 -0
  206. package/dist/internal/Timeout.d.ts.map +1 -0
  207. package/dist/internal/Timeout.js +37 -0
  208. package/dist/internal/Timeout.js.map +1 -0
  209. package/dist/internal/Timing.d.ts +9 -0
  210. package/dist/internal/Timing.d.ts.map +1 -1
  211. package/dist/internal/Timing.js +7 -0
  212. package/dist/internal/Timing.js.map +1 -1
  213. package/dist/internal/Viem.d.ts +16 -1
  214. package/dist/internal/Viem.d.ts.map +1 -1
  215. package/dist/internal/Viem.js +12 -2
  216. package/dist/internal/Viem.js.map +1 -1
  217. package/dist/internal/WebhookDestination.d.ts.map +1 -1
  218. package/dist/internal/WebhookDestination.js +3 -0
  219. package/dist/internal/WebhookDestination.js.map +1 -1
  220. package/dist/internal/funding/Action.d.ts +9 -0
  221. package/dist/internal/funding/Action.d.ts.map +1 -1
  222. package/dist/internal/funding/Action.js +16 -8
  223. package/dist/internal/funding/Action.js.map +1 -1
  224. package/dist/internal/funding/Catalog.d.ts +9 -2
  225. package/dist/internal/funding/Catalog.d.ts.map +1 -1
  226. package/dist/internal/funding/Catalog.js +19 -8
  227. package/dist/internal/funding/Catalog.js.map +1 -1
  228. package/dist/internal/funding/DepositWebhook.d.ts.map +1 -1
  229. package/dist/internal/funding/DepositWebhook.js +2 -1
  230. package/dist/internal/funding/DepositWebhook.js.map +1 -1
  231. package/dist/internal/funding/Evidence.d.ts.map +1 -1
  232. package/dist/internal/funding/Evidence.js +2 -10
  233. package/dist/internal/funding/Evidence.js.map +1 -1
  234. package/dist/internal/funding/Provider.d.ts +108 -13
  235. package/dist/internal/funding/Provider.d.ts.map +1 -1
  236. package/dist/internal/funding/Provider.js +34 -8
  237. package/dist/internal/funding/Provider.js.map +1 -1
  238. package/dist/internal/funding/SourceObservation.d.ts.map +1 -1
  239. package/dist/internal/funding/SourceObservation.js +5 -7
  240. package/dist/internal/funding/SourceObservation.js.map +1 -1
  241. package/dist/internal/funding/Transfer.d.ts +114 -18
  242. package/dist/internal/funding/Transfer.d.ts.map +1 -1
  243. package/dist/internal/funding/Transfer.js +185 -55
  244. package/dist/internal/funding/Transfer.js.map +1 -1
  245. package/dist/internal/funding/TransferReconciliation.d.ts +52 -0
  246. package/dist/internal/funding/TransferReconciliation.d.ts.map +1 -0
  247. package/dist/internal/funding/TransferReconciliation.js +192 -0
  248. package/dist/internal/funding/TransferReconciliation.js.map +1 -0
  249. package/dist/internal/funding/TransferWebhook.d.ts +21 -0
  250. package/dist/internal/funding/TransferWebhook.d.ts.map +1 -0
  251. package/dist/internal/funding/TransferWebhook.js +43 -0
  252. package/dist/internal/funding/TransferWebhook.js.map +1 -0
  253. package/dist/internal/funding/index.d.ts +1 -0
  254. package/dist/internal/funding/index.d.ts.map +1 -1
  255. package/dist/internal/funding/index.js +1 -0
  256. package/dist/internal/funding/index.js.map +1 -1
  257. package/dist/internal/funding/providers/relay.d.ts.map +1 -1
  258. package/dist/internal/funding/providers/relay.js +3 -12
  259. package/dist/internal/funding/providers/relay.js.map +1 -1
  260. package/dist/internal/funding/providers/stargate.d.ts +127 -9
  261. package/dist/internal/funding/providers/stargate.d.ts.map +1 -1
  262. package/dist/internal/funding/providers/stargate.js +548 -112
  263. package/dist/internal/funding/providers/stargate.js.map +1 -1
  264. package/dist/internal/index.d.ts +1 -0
  265. package/dist/internal/index.d.ts.map +1 -1
  266. package/dist/internal/index.js +1 -0
  267. package/dist/internal/index.js.map +1 -1
  268. package/dist/internal/webhookDestinations/slack.d.ts.map +1 -1
  269. package/dist/internal/webhookDestinations/slack.js +16 -0
  270. package/dist/internal/webhookDestinations/slack.js.map +1 -1
  271. package/package.json +2 -2
  272. package/src/App.test.ts +100 -0
  273. package/src/App.ts +43 -3
  274. package/src/Client.test-d.ts +129 -2
  275. package/src/Scope.test.ts +20 -0
  276. package/src/Scope.ts +16 -0
  277. package/src/Webhooks.ts +2 -2
  278. package/src/admin/apps/api-keys.test.ts +75 -0
  279. package/src/admin/apps/api-keys.ts +64 -0
  280. package/src/admin/apps/earn-vaults.test.ts +1 -1
  281. package/src/admin/apps/earn-vaults.ts +2 -1
  282. package/src/admin/apps/organizations.test.ts +53 -1
  283. package/src/admin/apps/organizations.ts +90 -5
  284. package/src/admin/ui/src/lib/api-keys.ts +19 -0
  285. package/src/admin/ui/src/lib/organizations.test.ts +112 -1
  286. package/src/admin/ui/src/lib/organizations.ts +55 -0
  287. package/src/admin/ui/src/routes/api-keys.tsx +89 -2
  288. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +116 -0
  289. package/src/admin/ui.generated.ts +189 -151
  290. package/src/apps/Zones.test.ts +7 -7
  291. package/src/apps/Zones.ts +7 -7
  292. package/src/apps/composition.test.ts +2 -1
  293. package/src/apps/data/App.test.ts +41 -0
  294. package/src/apps/data/App.ts +30 -21
  295. package/src/apps/data/ZoneSelection.test.ts +2 -2
  296. package/src/apps/data/ZoneSelection.ts +8 -8
  297. package/src/apps/data/routes/activities.test.ts +1526 -12
  298. package/src/apps/data/routes/activities.ts +1774 -1356
  299. package/src/apps/data/routes/balances.ts +133 -97
  300. package/src/apps/data/routes/blocks.test.ts +533 -0
  301. package/src/apps/data/routes/blocks.ts +35 -16
  302. package/src/apps/data/routes/earn.test.ts +373 -16
  303. package/src/apps/data/routes/earn.ts +548 -79
  304. package/src/apps/data/routes/earn.zone-access.test.ts +6 -6
  305. package/src/apps/data/routes/exchanges.test.ts +740 -15
  306. package/src/apps/data/routes/exchanges.ts +954 -753
  307. package/src/apps/data/routes/fee-amm.ts +17 -18
  308. package/src/apps/data/routes/receipts.ts +47 -16
  309. package/src/apps/data/routes/tokens.test.ts +578 -0
  310. package/src/apps/data/routes/tokens.ts +283 -225
  311. package/src/apps/data/routes/transactions.ts +68 -29
  312. package/src/apps/data/routes/transfers.test.ts +421 -0
  313. package/src/apps/data/routes/transfers.ts +45 -27
  314. package/src/apps/data/routes/valuation.ts +94 -78
  315. package/src/apps/data/routes/webhooks.test.ts +21 -5
  316. package/src/apps/data/routes/webhooks.ts +63 -8
  317. package/src/apps/data/routes/zones.test.ts +2 -2
  318. package/src/apps/data/routes/zones.ts +1 -1
  319. package/src/apps/funding/App.ts +12 -2
  320. package/src/apps/funding/routes/deposit-addresses.test.ts +29 -7
  321. package/src/apps/funding/routes/deposit-addresses.ts +19 -14
  322. package/src/apps/funding/routes/quotes.test.ts +5 -9
  323. package/src/apps/funding/routes/transfers.test.ts +901 -23
  324. package/src/apps/funding/routes/transfers.ts +347 -64
  325. package/src/apps/management/Billing.ts +18 -5
  326. package/src/apps/management/routes/api-keys.test.ts +220 -0
  327. package/src/apps/management/routes/api-keys.ts +280 -3
  328. package/src/apps/management/routes/webhooks.test.ts +3 -3
  329. package/src/apps/management/routes/webhooks.ts +24 -25
  330. package/src/apps/relay/App.test.ts +212 -1
  331. package/src/apps/relay/App.ts +158 -29
  332. package/src/apps/relay/Sponsorships.ts +24 -1
  333. package/src/db/Db.ts +48 -1
  334. package/src/db/Schema.ts +22 -4
  335. package/src/db/tables/earnVaults.test.ts +9 -9
  336. package/src/db/tables/fundingCatalog.test.ts +16 -2
  337. package/src/db/tables/fundingCatalog.ts +9 -3
  338. package/src/db/tables/fundingTransferTransactions.test.ts +43 -0
  339. package/src/db/tables/fundingTransferTransactions.ts +79 -3
  340. package/src/db/tables/fundingTransfers.test.ts +26 -0
  341. package/src/db/tables/fundingTransfers.ts +36 -0
  342. package/src/db/tables/organizations.test.ts +41 -0
  343. package/src/db/tables/organizations.ts +49 -0
  344. package/src/db/tables/projects.test.ts +55 -0
  345. package/src/db/tables/projects.ts +46 -1
  346. package/src/db/tables/sponsoredTransactions.test.ts +338 -0
  347. package/src/db/tables/sponsoredTransactions.ts +197 -13
  348. package/src/db/tables/webhookSubscriptions.ts +18 -11
  349. package/src/handlers/internal/utils.test.ts +53 -0
  350. package/src/handlers/internal/utils.ts +15 -0
  351. package/src/internal/Auth.ts +12 -4
  352. package/src/internal/EarnVaults.capabilities.test.ts +2 -2
  353. package/src/internal/EarnVaults.test.ts +1 -1
  354. package/src/internal/EarnVaults.ts +5 -5
  355. package/src/internal/Fetch.test.ts +46 -0
  356. package/src/internal/Fetch.ts +56 -0
  357. package/src/internal/Log.test-d.ts +2 -0
  358. package/src/internal/Log.test.ts +21 -0
  359. package/src/internal/Log.ts +22 -5
  360. package/src/internal/OpenApi.ts +14 -4
  361. package/src/internal/Response.ts +1 -1
  362. package/src/internal/Schema.test.ts +2 -0
  363. package/src/internal/Schema.ts +12 -2
  364. package/src/internal/Store.test.ts +178 -0
  365. package/src/internal/Store.ts +104 -18
  366. package/src/internal/Tidx.test.ts +2 -1
  367. package/src/internal/Tidx.ts +7 -2
  368. package/src/internal/Timeout.test.ts +35 -0
  369. package/src/internal/Timeout.ts +73 -0
  370. package/src/internal/Timing.ts +16 -0
  371. package/src/internal/Viem.ts +39 -3
  372. package/src/internal/WebhookDestination.ts +3 -0
  373. package/src/internal/Webhooks.test.ts +45 -0
  374. package/src/internal/funding/Action.test.ts +41 -1
  375. package/src/internal/funding/Action.ts +69 -41
  376. package/src/internal/funding/Catalog.test.ts +34 -0
  377. package/src/internal/funding/Catalog.ts +28 -11
  378. package/src/internal/funding/DepositWebhook.ts +2 -1
  379. package/src/internal/funding/Evidence.ts +2 -13
  380. package/src/internal/funding/Provider.test.ts +73 -0
  381. package/src/internal/funding/Provider.ts +125 -28
  382. package/src/internal/funding/SourceObservation.ts +5 -9
  383. package/src/internal/funding/Transfer.test.ts +155 -0
  384. package/src/internal/funding/Transfer.ts +387 -147
  385. package/src/internal/funding/TransferReconciliation.test.ts +147 -0
  386. package/src/internal/funding/TransferReconciliation.ts +264 -0
  387. package/src/internal/funding/TransferWebhook.test.ts +128 -0
  388. package/src/internal/funding/TransferWebhook.ts +67 -0
  389. package/src/internal/funding/index.test.ts +1 -0
  390. package/src/internal/funding/index.ts +1 -0
  391. package/src/internal/funding/providers/index.test.ts +4 -167
  392. package/src/internal/funding/providers/relay.test.ts +2 -2
  393. package/src/internal/funding/providers/relay.ts +3 -15
  394. package/src/internal/funding/providers/stargate.test.ts +328 -0
  395. package/src/internal/funding/providers/stargate.ts +807 -135
  396. package/src/internal/index.test.ts +1 -0
  397. package/src/internal/index.ts +1 -0
  398. package/src/internal/webhookDestinations/slack.ts +15 -0
@@ -17,15 +17,87 @@ export function insert(db: Db.Db, record: Record): Promise<Record | undefined> {
17
17
  .insertInto('funding_transfer_transactions')
18
18
  .values({
19
19
  ...record,
20
- transactionRef: record.chainId.startsWith('eip155:')
21
- ? record.transactionRef.toLowerCase()
22
- : record.transactionRef,
20
+ transactionRef: normalize(record.chainId, record.transactionRef),
23
21
  })
24
22
  .onConflict((oc) => oc.columns(['transferId', 'role', 'transactionRef']).doNothing())
25
23
  .returningAll()
26
24
  .executeTakeFirst()
27
25
  }
28
26
 
27
+ /** Claims a source transaction for one transfer without racing another transfer. */
28
+ export async function claimSource(db: Db.Db, record: Record): Promise<claimSource.Result> {
29
+ const transactionRef = normalize(record.chainId, record.transactionRef)
30
+ const inserted = await db.kysely
31
+ .insertInto('funding_transfer_transactions')
32
+ .values({ ...record, transactionRef })
33
+ .onConflict((oc) => oc.doNothing())
34
+ .returningAll()
35
+ .executeTakeFirst()
36
+ if (inserted) return { record: inserted, type: 'claimed' }
37
+ const existing = await getSource(db, {
38
+ chainId: record.chainId,
39
+ transactionRef,
40
+ })
41
+ if (existing?.transferId === record.transferId) return { record: existing, type: 'replayed' }
42
+ return { type: 'conflict' }
43
+ }
44
+
45
+ export declare namespace claimSource {
46
+ /** Source transaction ownership outcome. */
47
+ type Result =
48
+ | { record: Record; type: 'claimed' }
49
+ | { record: Record; type: 'replayed' }
50
+ | { type: 'conflict' }
51
+ }
52
+
53
+ /** Gets the transfer that owns one source transaction reference. */
54
+ export function getSource(db: Db.Db, options: getSource.Options): Promise<Record | undefined> {
55
+ return db.kysely
56
+ .selectFrom('funding_transfer_transactions')
57
+ .selectAll()
58
+ .where('chainId', '=', options.chainId)
59
+ .where('role', '=', 'source')
60
+ .where('transactionRef', '=', normalize(options.chainId, options.transactionRef))
61
+ .executeTakeFirst()
62
+ }
63
+
64
+ export declare namespace getSource {
65
+ /** Source transaction identity. */
66
+ type Options = {
67
+ /** CAIP-2 chain containing the transaction. */
68
+ chainId: string
69
+ /** EVM transaction hash or case-sensitive chain reference. */
70
+ transactionRef: string
71
+ }
72
+ }
73
+
74
+ /** Removes one source transaction only when the transfer still owns it. */
75
+ export function removeSource(
76
+ db: Db.Db,
77
+ options: removeSource.Options,
78
+ ): Promise<Record | undefined> {
79
+ return db.kysely
80
+ .deleteFrom('funding_transfer_transactions')
81
+ .where('chainId', '=', options.chainId)
82
+ .where('role', '=', 'source')
83
+ .where('transactionRef', '=', normalize(options.chainId, options.transactionHash))
84
+ .where('transferId', '=', options.transferId)
85
+ .returningAll()
86
+ .executeTakeFirst()
87
+ }
88
+
89
+ export declare namespace removeSource {
90
+ /** Exact source evidence identity and owner. */
91
+ type Options = {
92
+ /** CAIP-2 chain containing the transaction. */
93
+ chainId: string
94
+ /** Source transaction reference. */
95
+ transactionHash: string
96
+ /** Owning transfer id (`ftr_…`). */
97
+ transferId: string
98
+ }
99
+ }
100
+
29
101
  /** Lists a transfer's transaction references, oldest first. */
30
102
  export function listByTransfer(db: Db.Db, transferId: string): Promise<Record[]> {
31
103
  return db.kysely
@@ -35,3 +107,7 @@ export function listByTransfer(db: Db.Db, transferId: string): Promise<Record[]>
35
107
  .orderBy('createdAt', 'asc')
36
108
  .execute()
37
109
  }
110
+
111
+ function normalize(chainId: string, transactionRef: string): string {
112
+ return chainId.startsWith('eip155:') ? transactionRef.toLowerCase() : transactionRef
113
+ }
@@ -49,6 +49,32 @@ describe('list', () => {
49
49
  })
50
50
  })
51
51
 
52
+ describe('listProcessing', () => {
53
+ test('returns only processing transfers for the provider', async () => {
54
+ const first = await seed({
55
+ snapshot: TestFunding.transferSnapshot({ provider: { id: 'stargate', name: 'Stargate' } }),
56
+ })
57
+ const second = await seed({
58
+ snapshot: TestFunding.transferSnapshot({ provider: { id: 'stargate', name: 'Stargate' } }),
59
+ })
60
+ const relay = await seed()
61
+ await Transfer.transition(db, { expectedVersion: 1, id: first.id, status: 'processing' })
62
+ await Transfer.transition(db, { expectedVersion: 1, id: second.id, status: 'processing' })
63
+ await Transfer.transition(db, { expectedVersion: 1, id: relay.id, status: 'processing' })
64
+
65
+ const page = await FundingTransfers.listProcessing(db, { limit: 1, providerId: 'stargate' })
66
+ const rest = await FundingTransfers.listProcessing(db, {
67
+ cursor: page[0]!.id,
68
+ limit: 1,
69
+ providerId: 'stargate',
70
+ })
71
+ expect([page.map((row) => row.id), rest.map((row) => row.id)]).toEqual([
72
+ [first.id],
73
+ [second.id],
74
+ ])
75
+ })
76
+ })
77
+
52
78
  describe('count', () => {
53
79
  test('shares the list filter and stops at the cap', async () => {
54
80
  const total = await FundingTransfers.count(db, owner, { cap: 100 })
@@ -40,6 +40,39 @@ export function get(db: Db.Db, id: string): Promise<Record | undefined> {
40
40
  .executeTakeFirst()
41
41
  }
42
42
 
43
+ /** Lists processing transfers for one provider, oldest first. */
44
+ export function listProcessing(db: Db.Db, options: listProcessing.Options): Promise<Record[]> {
45
+ let query = db.kysely
46
+ .selectFrom('funding_transfers')
47
+ .selectAll()
48
+ .where('providerId', '=', options.providerId)
49
+ .where('status', '=', 'processing')
50
+ if (options.cursor !== undefined) query = query.where('id', '>', options.cursor)
51
+ return query.orderBy('id', 'asc').limit(options.limit).execute()
52
+ }
53
+
54
+ export declare namespace listProcessing {
55
+ /** Provider filter for one recovery scan. */
56
+ type Options = {
57
+ /** Exclusive lower bound from the prior recovery page. */
58
+ cursor?: string | undefined
59
+ /** Maximum transfers returned in one recovery page. */
60
+ limit: number
61
+ /** Funding provider id. */
62
+ providerId: string
63
+ }
64
+ }
65
+
66
+ /** Gets and locks a transfer for one atomic domain mutation. */
67
+ export function getForUpdate(db: Db.Db, id: string): Promise<Record | undefined> {
68
+ return db.kysely
69
+ .selectFrom('funding_transfers')
70
+ .selectAll()
71
+ .where('id', '=', id)
72
+ .forUpdate()
73
+ .executeTakeFirst()
74
+ }
75
+
43
76
  /** Gets an owner-visible transfer by id; `undefined` for absent or foreign rows. */
44
77
  export function getOwned(db: Db.Db, owner: Owner, id: string): Promise<Record | undefined> {
45
78
  let query = db.kysely
@@ -120,6 +153,7 @@ export function update(db: Db.Db, options: update.Options): Promise<Record | und
120
153
  return db.kysely
121
154
  .updateTable('funding_transfers')
122
155
  .set({
156
+ providerState: options.providerState,
123
157
  snapshot: options.snapshot,
124
158
  status: options.status,
125
159
  statusReason: options.statusReason,
@@ -139,6 +173,8 @@ export declare namespace update {
139
173
  expectedVersion: number
140
174
  /** Transfer id (`ftr_…`). */
141
175
  id: string
176
+ /** Replacement private provider state; omitted keeps the stored value. */
177
+ providerState?: Record['providerState'] | undefined
142
178
  /** Replacement public snapshot. */
143
179
  snapshot: Record['snapshot']
144
180
  /** New lifecycle status. */
@@ -34,6 +34,8 @@ describe('create', () => {
34
34
  "createdBy": null,
35
35
  "id": "org_<id>",
36
36
  "name": "Acme, Inc.",
37
+ "sponsorshipSubsidyDurationDays": null,
38
+ "sponsorshipSubsidyProjectSpendLimit": null,
37
39
  "updatedAt": "<timestamp>",
38
40
  "userId": null,
39
41
  }
@@ -55,6 +57,8 @@ describe('create', () => {
55
57
  "createdBy": "admin@tempo.xyz",
56
58
  "id": "org_explicit",
57
59
  "name": "Explicit",
60
+ "sponsorshipSubsidyDurationDays": null,
61
+ "sponsorshipSubsidyProjectSpendLimit": null,
58
62
  "updatedAt": "<timestamp>",
59
63
  "userId": null,
60
64
  }
@@ -170,6 +174,43 @@ describe('update', () => {
170
174
  })
171
175
  })
172
176
 
177
+ describe('setSponsorshipSubsidy', () => {
178
+ test('behavior: replaces and disables the organization policy', async () => {
179
+ const db = create()
180
+ await db.migrate()
181
+ await Organizations.create(db, { id: 'org_1', name: 'One' })
182
+
183
+ const enabled = await Organizations.setSponsorshipSubsidy(db, 'org_1', {
184
+ durationDays: 90,
185
+ projectSpendLimit: '100.00',
186
+ })
187
+ expect({
188
+ durationDays: enabled?.sponsorshipSubsidyDurationDays,
189
+ projectSpendLimit: enabled?.sponsorshipSubsidyProjectSpendLimit,
190
+ }).toMatchInlineSnapshot(`
191
+ {
192
+ "durationDays": 90,
193
+ "projectSpendLimit": "100.00",
194
+ }
195
+ `)
196
+
197
+ const disabled = await Organizations.setSponsorshipSubsidy(db, 'org_1', {
198
+ durationDays: null,
199
+ projectSpendLimit: null,
200
+ })
201
+ expect({
202
+ durationDays: disabled?.sponsorshipSubsidyDurationDays,
203
+ projectSpendLimit: disabled?.sponsorshipSubsidyProjectSpendLimit,
204
+ }).toMatchInlineSnapshot(`
205
+ {
206
+ "durationDays": null,
207
+ "projectSpendLimit": null,
208
+ }
209
+ `)
210
+ await db.close()
211
+ })
212
+ })
213
+
173
214
  describe('upsert', () => {
174
215
  test('behavior: inserts when absent, defaulting name to the id', async () => {
175
216
  const db = create()
@@ -31,6 +31,8 @@ export function create(db: Db.Db, input: create.Input): Promise<Record> {
31
31
  createdBy: input.createdBy ?? null,
32
32
  id: input.id ?? Id.generate('org'),
33
33
  name: input.name,
34
+ sponsorshipSubsidyDurationDays: null,
35
+ sponsorshipSubsidyProjectSpendLimit: null,
34
36
  updatedAt: now,
35
37
  userId: input.userId ?? null,
36
38
  })
@@ -70,6 +72,8 @@ export function createOwned(db: Db.Db, input: createOwned.Input): Promise<Record
70
72
  createdBy: input.userId,
71
73
  id: Id.generate('org'),
72
74
  name: input.name,
75
+ sponsorshipSubsidyDurationDays: null,
76
+ sponsorshipSubsidyProjectSpendLimit: null,
73
77
  updatedAt: now,
74
78
  userId: input.userId,
75
79
  })
@@ -422,6 +426,49 @@ export declare namespace update {
422
426
  }
423
427
  }
424
428
 
429
+ /**
430
+ * Replaces the organization's sponsorship subsidy policy. A null duration
431
+ * disables the program; an enabled policy may omit its per-project spend cap.
432
+ *
433
+ * @param db - The database.
434
+ * @param id - The organization id (`org_…`).
435
+ * @param input - The replacement subsidy policy.
436
+ * @returns The updated organization, or `undefined` when absent.
437
+ */
438
+ export function setSponsorshipSubsidy(
439
+ db: Db.Db,
440
+ id: string,
441
+ input: setSponsorshipSubsidy.Input,
442
+ ): Promise<Record | undefined> {
443
+ return db.kysely
444
+ .updateTable('organizations')
445
+ .set({
446
+ sponsorshipSubsidyDurationDays: input.durationDays,
447
+ sponsorshipSubsidyProjectSpendLimit: input.projectSpendLimit,
448
+ updatedAt: new Date().toISOString(),
449
+ })
450
+ .where('id', '=', id)
451
+ .returningAll()
452
+ .executeTakeFirst()
453
+ }
454
+
455
+ export declare namespace setSponsorshipSubsidy {
456
+ /** Replacement organization subsidy policy. */
457
+ type Input =
458
+ | {
459
+ /** Fixed promotion duration in days. */
460
+ durationDays: 90
461
+ /** Optional decimal USD spend cap applied independently to each project. */
462
+ projectSpendLimit: string | null
463
+ }
464
+ | {
465
+ /** Null disables the promotion. */
466
+ durationDays: null
467
+ /** Null disables the promotion. */
468
+ projectSpendLimit: null
469
+ }
470
+ }
471
+
425
472
  /**
426
473
  * Inserts an organization when absent (`ON CONFLICT DO NOTHING`) — the
427
474
  * mint/backfill path, where a key's `orgId` must resolve to a real row. The
@@ -439,6 +486,8 @@ export async function upsert(db: Db.Db, input: upsert.Input): Promise<void> {
439
486
  createdBy: input.createdBy ?? null,
440
487
  id: input.id,
441
488
  name: input.name ?? input.id,
489
+ sponsorshipSubsidyDurationDays: null,
490
+ sponsorshipSubsidyProjectSpendLimit: null,
442
491
  updatedAt: now,
443
492
  })
444
493
  .onConflict((oc) => oc.column('id').doNothing())
@@ -0,0 +1,55 @@
1
+ import { nanoid } from 'nanoid'
2
+
3
+ import * as Runtime from '../../../test/runtime.js'
4
+ import * as Db from '../Db.js'
5
+ import * as Projects from './projects.js'
6
+
7
+ const create = () => Db.postgres({ connectionString: Runtime.postgresUrl, schema: `t_${nanoid()}` })
8
+
9
+ describe('activateSponsorship', () => {
10
+ test('behavior: stores the first activation time once', async () => {
11
+ const db = create()
12
+ await db.migrate()
13
+ const project = await Projects.create(db, { name: 'Privy app', orgId: 'org_1' })
14
+
15
+ const first = await Projects.activateSponsorship(db, {
16
+ at: '2026-01-01T00:00:00.000Z',
17
+ endsAt: '2026-04-01T00:00:00.000Z',
18
+ id: project.id,
19
+ orgId: 'org_1',
20
+ spendLimit: '100000000',
21
+ })
22
+ const second = await Projects.activateSponsorship(db, {
23
+ at: '2026-02-01T00:00:00.000Z',
24
+ endsAt: '2026-05-02T00:00:00.000Z',
25
+ id: project.id,
26
+ orgId: 'org_1',
27
+ spendLimit: '200000000',
28
+ })
29
+
30
+ expect(first?.sponsorshipSubsidyStartsAt).toMatchInlineSnapshot(`"2026-01-01T00:00:00.000Z"`)
31
+ expect(first?.sponsorshipSubsidyEndsAt).toMatchInlineSnapshot(`"2026-04-01T00:00:00.000Z"`)
32
+ expect(second?.sponsorshipSubsidyStartsAt).toBe(first?.sponsorshipSubsidyStartsAt)
33
+ expect(second?.sponsorshipSubsidyEndsAt).toBe(first?.sponsorshipSubsidyEndsAt)
34
+ expect(second?.sponsorshipSpendLimit).toBe(first?.sponsorshipSpendLimit)
35
+ expect(second?.sponsorshipSpendLimit).toBe('100000000')
36
+ await db.close()
37
+ })
38
+
39
+ test('behavior: requires matching organization ownership', async () => {
40
+ const db = create()
41
+ await db.migrate()
42
+ const project = await Projects.create(db, { name: 'Privy app', orgId: 'org_1' })
43
+
44
+ expect(
45
+ await Projects.activateSponsorship(db, {
46
+ at: '2026-01-01T00:00:00.000Z',
47
+ endsAt: '2026-04-01T00:00:00.000Z',
48
+ id: project.id,
49
+ orgId: 'org_2',
50
+ spendLimit: '100000000',
51
+ }),
52
+ ).toBeUndefined()
53
+ await db.close()
54
+ })
55
+ })
@@ -1,4 +1,4 @@
1
- import type { Selectable } from 'kysely'
1
+ import { sql, type Selectable } from 'kysely'
2
2
 
3
3
  import * as Id from '../../internal/Id.js'
4
4
  import type * as Db from '../Db.js'
@@ -26,6 +26,9 @@ export function create(db: Db.Db, input: create.Input): Promise<Record> {
26
26
  id: Id.generate('prj'),
27
27
  name: input.name,
28
28
  orgId: input.orgId,
29
+ sponsorshipSubsidyEndsAt: null,
30
+ sponsorshipSubsidyStartsAt: null,
31
+ sponsorshipSpendLimit: null,
29
32
  updatedAt: now,
30
33
  })
31
34
  .returningAll()
@@ -65,6 +68,48 @@ export function get(db: Db.Db, id: string): Promise<Record | undefined> {
65
68
  return db.kysely.selectFrom('projects').selectAll().where('id', '=', id).executeTakeFirst()
66
69
  }
67
70
 
71
+ /**
72
+ * Sets a project's sponsorship activation time once. Concurrent first
73
+ * requests converge on the same stored timestamp.
74
+ *
75
+ * @param db - The database.
76
+ * @param options - Project ownership and activation time.
77
+ * @returns The project with its stable activation time, or `undefined` when absent.
78
+ */
79
+ export function activateSponsorship(
80
+ db: Db.Db,
81
+ options: activateSponsorship.Options,
82
+ ): Promise<Record | undefined> {
83
+ return db.kysely
84
+ .updateTable('projects')
85
+ .set({
86
+ sponsorshipSpendLimit: sql`case when sponsorship_subsidy_starts_at is null then ${options.spendLimit} else sponsorship_spend_limit end`,
87
+ sponsorshipSubsidyEndsAt: sql`coalesce(sponsorship_subsidy_ends_at, ${options.endsAt})`,
88
+ sponsorshipSubsidyStartsAt: sql`coalesce(sponsorship_subsidy_starts_at, ${options.at})`,
89
+ updatedAt: sql`case when sponsorship_subsidy_starts_at is null then ${options.at} else updated_at end`,
90
+ })
91
+ .where('id', '=', options.id)
92
+ .where('orgId', '=', options.orgId)
93
+ .returningAll()
94
+ .executeTakeFirst()
95
+ }
96
+
97
+ export declare namespace activateSponsorship {
98
+ /** Project activation inputs. */
99
+ type Options = {
100
+ /** Activation time used only when the project has not started its window. */
101
+ at: string
102
+ /** End of the promotion window, stored with the first activation. */
103
+ endsAt: string
104
+ /** Project id (`prj_…`). */
105
+ id: string
106
+ /** Owning organization id (`org_…`). */
107
+ orgId: string
108
+ /** Optional promotion cap in fee-token base units, stored only on first activation. */
109
+ spendLimit: string | null
110
+ }
111
+ }
112
+
68
113
  /**
69
114
  * Reads projects by id for operational attribution displays.
70
115
  *