tapimo 0.10.2 → 0.12.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 (386) hide show
  1. package/dist/App.d.ts +4896 -2166
  2. package/dist/App.d.ts.map +1 -1
  3. package/dist/App.js +2 -2
  4. package/dist/App.js.map +1 -1
  5. package/dist/Assets.d.ts +15 -0
  6. package/dist/Assets.d.ts.map +1 -1
  7. package/dist/Assets.js +7 -0
  8. package/dist/Assets.js.map +1 -1
  9. package/dist/Webhooks.d.ts +0 -75
  10. package/dist/Webhooks.d.ts.map +1 -1
  11. package/dist/Webhooks.js +1 -143
  12. package/dist/Webhooks.js.map +1 -1
  13. package/dist/admin/App.d.ts +127 -78
  14. package/dist/admin/App.d.ts.map +1 -1
  15. package/dist/admin/apps/earn-vaults.d.ts +115 -1
  16. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  17. package/dist/admin/apps/earn-vaults.js +59 -6
  18. package/dist/admin/apps/earn-vaults.js.map +1 -1
  19. package/dist/admin/apps/organizations.d.ts +3 -3
  20. package/dist/admin/apps/organizations.d.ts.map +1 -1
  21. package/dist/admin/apps/organizations.js +4 -2
  22. package/dist/admin/apps/organizations.js.map +1 -1
  23. package/dist/admin/apps/verified-tokens.d.ts +83 -83
  24. package/dist/admin/ui.generated.d.ts +1 -1
  25. package/dist/admin/ui.generated.d.ts.map +1 -1
  26. package/dist/admin/ui.generated.js +151 -151
  27. package/dist/admin/ui.generated.js.map +1 -1
  28. package/dist/apps/data/App.d.ts +5924 -4310
  29. package/dist/apps/data/App.d.ts.map +1 -1
  30. package/dist/apps/data/App.js +61 -9
  31. package/dist/apps/data/App.js.map +1 -1
  32. package/dist/apps/data/ZoneSelection.d.ts +62 -0
  33. package/dist/apps/data/ZoneSelection.d.ts.map +1 -0
  34. package/dist/apps/data/ZoneSelection.js +44 -0
  35. package/dist/apps/data/ZoneSelection.js.map +1 -0
  36. package/dist/apps/data/routes/activities.d.ts +2368 -5
  37. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  38. package/dist/apps/data/routes/activities.js +423 -114
  39. package/dist/apps/data/routes/activities.js.map +1 -1
  40. package/dist/apps/data/routes/addresses.d.ts +131 -0
  41. package/dist/apps/data/routes/addresses.d.ts.map +1 -1
  42. package/dist/apps/data/routes/balances.d.ts +25 -25
  43. package/dist/apps/data/routes/balances.js +1 -1
  44. package/dist/apps/data/routes/balances.js.map +1 -1
  45. package/dist/apps/data/routes/blocks.d.ts +1 -1
  46. package/dist/apps/data/routes/blocks.js +1 -1
  47. package/dist/apps/data/routes/blocks.js.map +1 -1
  48. package/dist/apps/data/routes/earn.d.ts +135 -10
  49. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  50. package/dist/apps/data/routes/earn.js +157 -25
  51. package/dist/apps/data/routes/earn.js.map +1 -1
  52. package/dist/apps/data/routes/exchanges.d.ts +829 -123
  53. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  54. package/dist/apps/data/routes/exchanges.js +16 -13
  55. package/dist/apps/data/routes/exchanges.js.map +1 -1
  56. package/dist/apps/data/routes/fee-amm.d.ts +26 -26
  57. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  58. package/dist/apps/data/routes/fee-amm.js +9 -11
  59. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  60. package/dist/apps/data/routes/receipts.d.ts +54 -54
  61. package/dist/apps/data/routes/receipts.js +1 -1
  62. package/dist/apps/data/routes/receipts.js.map +1 -1
  63. package/dist/apps/data/routes/rpc.js +24 -10
  64. package/dist/apps/data/routes/rpc.js.map +1 -1
  65. package/dist/apps/data/routes/tokenlist.d.ts +12 -12
  66. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  67. package/dist/apps/data/routes/tokenlist.js +16 -15
  68. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  69. package/dist/apps/data/routes/tokens.d.ts +17 -3
  70. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  71. package/dist/apps/data/routes/tokens.js +34 -15
  72. package/dist/apps/data/routes/tokens.js.map +1 -1
  73. package/dist/apps/data/routes/transactions.d.ts +1 -1
  74. package/dist/apps/data/routes/transactions.js +1 -1
  75. package/dist/apps/data/routes/transactions.js.map +1 -1
  76. package/dist/apps/data/routes/transfers.d.ts +13 -13
  77. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  78. package/dist/apps/data/routes/transfers.js +7 -9
  79. package/dist/apps/data/routes/transfers.js.map +1 -1
  80. package/dist/apps/data/routes/valuation.d.ts +21 -21
  81. package/dist/apps/data/routes/verified-tokens.d.ts +5 -5
  82. package/dist/apps/data/routes/webhooks.d.ts +1011 -151
  83. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  84. package/dist/apps/data/routes/webhooks.js +126 -739
  85. package/dist/apps/data/routes/webhooks.js.map +1 -1
  86. package/dist/apps/data/routes/zones.d.ts +15 -15
  87. package/dist/apps/funding/App.d.ts +27 -27
  88. package/dist/apps/funding/routes/chains.d.ts.map +1 -1
  89. package/dist/apps/funding/routes/chains.js +5 -4
  90. package/dist/apps/funding/routes/chains.js.map +1 -1
  91. package/dist/apps/funding/routes/deposit-addresses.d.ts +18 -18
  92. package/dist/apps/funding/routes/deposit-addresses.d.ts.map +1 -1
  93. package/dist/apps/funding/routes/deposit-addresses.js +8 -8
  94. package/dist/apps/funding/routes/deposit-addresses.js.map +1 -1
  95. package/dist/apps/funding/routes/providers.d.ts.map +1 -1
  96. package/dist/apps/funding/routes/providers.js +3 -2
  97. package/dist/apps/funding/routes/providers.js.map +1 -1
  98. package/dist/apps/funding/routes/quotes.d.ts.map +1 -1
  99. package/dist/apps/funding/routes/quotes.js +2 -2
  100. package/dist/apps/funding/routes/quotes.js.map +1 -1
  101. package/dist/apps/funding/routes/transfers.d.ts +33 -33
  102. package/dist/apps/management/App.d.ts +1433 -322
  103. package/dist/apps/management/App.d.ts.map +1 -1
  104. package/dist/apps/management/Billing.d.ts.map +1 -1
  105. package/dist/apps/management/Billing.js +19 -6
  106. package/dist/apps/management/Billing.js.map +1 -1
  107. package/dist/apps/management/routes/api-keys.d.ts +154 -94
  108. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  109. package/dist/apps/management/routes/api-keys.js +76 -30
  110. package/dist/apps/management/routes/api-keys.js.map +1 -1
  111. package/dist/apps/management/routes/billing.d.ts +103 -30
  112. package/dist/apps/management/routes/billing.d.ts.map +1 -1
  113. package/dist/apps/management/routes/billing.js +91 -32
  114. package/dist/apps/management/routes/billing.js.map +1 -1
  115. package/dist/apps/management/routes/faucet.d.ts +12 -12
  116. package/dist/apps/management/routes/faucet.d.ts.map +1 -1
  117. package/dist/apps/management/routes/faucet.js +23 -12
  118. package/dist/apps/management/routes/faucet.js.map +1 -1
  119. package/dist/apps/management/routes/invitations.d.ts +46 -13
  120. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  121. package/dist/apps/management/routes/invitations.js +79 -29
  122. package/dist/apps/management/routes/invitations.js.map +1 -1
  123. package/dist/apps/management/routes/invite-links.d.ts +128 -83
  124. package/dist/apps/management/routes/invite-links.d.ts.map +1 -1
  125. package/dist/apps/management/routes/invite-links.js +100 -41
  126. package/dist/apps/management/routes/invite-links.js.map +1 -1
  127. package/dist/apps/management/routes/me.d.ts +5 -5
  128. package/dist/apps/management/routes/me.d.ts.map +1 -1
  129. package/dist/apps/management/routes/me.js +14 -10
  130. package/dist/apps/management/routes/me.js.map +1 -1
  131. package/dist/apps/management/routes/members.d.ts +68 -47
  132. package/dist/apps/management/routes/members.d.ts.map +1 -1
  133. package/dist/apps/management/routes/members.js +37 -18
  134. package/dist/apps/management/routes/members.js.map +1 -1
  135. package/dist/apps/management/routes/orgs.d.ts +48 -8
  136. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  137. package/dist/apps/management/routes/orgs.js +48 -19
  138. package/dist/apps/management/routes/orgs.js.map +1 -1
  139. package/dist/apps/management/routes/projects.d.ts +130 -68
  140. package/dist/apps/management/routes/projects.d.ts.map +1 -1
  141. package/dist/apps/management/routes/projects.js +72 -21
  142. package/dist/apps/management/routes/projects.js.map +1 -1
  143. package/dist/apps/management/routes/scopes.d.ts.map +1 -1
  144. package/dist/apps/management/routes/scopes.js +8 -5
  145. package/dist/apps/management/routes/scopes.js.map +1 -1
  146. package/dist/apps/management/routes/usage.d.ts +38 -38
  147. package/dist/apps/management/routes/usage.d.ts.map +1 -1
  148. package/dist/apps/management/routes/usage.js +41 -31
  149. package/dist/apps/management/routes/usage.js.map +1 -1
  150. package/dist/apps/management/routes/verified-token-requests.d.ts +34 -6
  151. package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
  152. package/dist/apps/management/routes/verified-token-requests.js +36 -17
  153. package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
  154. package/dist/apps/management/routes/webhooks.d.ts +1186 -197
  155. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  156. package/dist/apps/management/routes/webhooks.js +106 -38
  157. package/dist/apps/management/routes/webhooks.js.map +1 -1
  158. package/dist/apps/mpp/internal/Adapter.d.ts +1 -1
  159. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -1
  160. package/dist/apps/mpp/internal/Adapter.js +12 -0
  161. package/dist/apps/mpp/internal/Adapter.js.map +1 -1
  162. package/dist/db/Db.d.ts +2 -0
  163. package/dist/db/Db.d.ts.map +1 -1
  164. package/dist/db/Db.js +61 -0
  165. package/dist/db/Db.js.map +1 -1
  166. package/dist/db/Schema.d.ts +30 -2
  167. package/dist/db/Schema.d.ts.map +1 -1
  168. package/dist/db/Schema.js +28 -3
  169. package/dist/db/Schema.js.map +1 -1
  170. package/dist/db/tables/earnVaults.d.ts +5 -1
  171. package/dist/db/tables/earnVaults.d.ts.map +1 -1
  172. package/dist/db/tables/earnVaults.js +5 -0
  173. package/dist/db/tables/earnVaults.js.map +1 -1
  174. package/dist/db/tables/webhookDeliveries.d.ts.map +1 -1
  175. package/dist/db/tables/webhookDeliveries.js +10 -0
  176. package/dist/db/tables/webhookDeliveries.js.map +1 -1
  177. package/dist/db/tables/webhookQueueCompletions.d.ts +15 -0
  178. package/dist/db/tables/webhookQueueCompletions.d.ts.map +1 -0
  179. package/dist/db/tables/webhookQueueCompletions.js +32 -0
  180. package/dist/db/tables/webhookQueueCompletions.js.map +1 -0
  181. package/dist/db/tables/webhookQueueEvents.d.ts +16 -20
  182. package/dist/db/tables/webhookQueueEvents.d.ts.map +1 -1
  183. package/dist/db/tables/webhookQueueEvents.js +68 -43
  184. package/dist/db/tables/webhookQueueEvents.js.map +1 -1
  185. package/dist/db/tables/webhookSubscriptions.d.ts +47 -72
  186. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  187. package/dist/db/tables/webhookSubscriptions.js +92 -105
  188. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  189. package/dist/internal/Auth.d.ts +8 -1
  190. package/dist/internal/Auth.d.ts.map +1 -1
  191. package/dist/internal/Auth.js +13 -3
  192. package/dist/internal/Auth.js.map +1 -1
  193. package/dist/internal/Cache.d.ts.map +1 -1
  194. package/dist/internal/Cache.js +11 -7
  195. package/dist/internal/Cache.js.map +1 -1
  196. package/dist/internal/EarnVaults.d.ts +41 -2
  197. package/dist/internal/EarnVaults.d.ts.map +1 -1
  198. package/dist/internal/EarnVaults.js +167 -0
  199. package/dist/internal/EarnVaults.js.map +1 -1
  200. package/dist/internal/MetricSink.d.ts +35 -125
  201. package/dist/internal/MetricSink.d.ts.map +1 -1
  202. package/dist/internal/MetricSink.js +50 -121
  203. package/dist/internal/MetricSink.js.map +1 -1
  204. package/dist/internal/OpenApi.d.ts +26 -22
  205. package/dist/internal/OpenApi.d.ts.map +1 -1
  206. package/dist/internal/OpenApi.js +128 -39
  207. package/dist/internal/OpenApi.js.map +1 -1
  208. package/dist/internal/Response.d.ts +13 -8
  209. package/dist/internal/Response.d.ts.map +1 -1
  210. package/dist/internal/Response.js +16 -5
  211. package/dist/internal/Response.js.map +1 -1
  212. package/dist/internal/Schema.d.ts +8 -8
  213. package/dist/internal/Schema.d.ts.map +1 -1
  214. package/dist/internal/Schema.js +10 -9
  215. package/dist/internal/Schema.js.map +1 -1
  216. package/dist/internal/Store.d.ts +15 -6
  217. package/dist/internal/Store.d.ts.map +1 -1
  218. package/dist/internal/Store.js +45 -15
  219. package/dist/internal/Store.js.map +1 -1
  220. package/dist/internal/Tidx.d.ts +2 -0
  221. package/dist/internal/Tidx.d.ts.map +1 -1
  222. package/dist/internal/Tidx.js +16 -4
  223. package/dist/internal/Tidx.js.map +1 -1
  224. package/dist/internal/WebhookTransfer.d.ts +1 -55
  225. package/dist/internal/WebhookTransfer.d.ts.map +1 -1
  226. package/dist/internal/WebhookTransfer.js +1 -239
  227. package/dist/internal/WebhookTransfer.js.map +1 -1
  228. package/dist/internal/Webhooks.d.ts +112 -56
  229. package/dist/internal/Webhooks.d.ts.map +1 -1
  230. package/dist/internal/Webhooks.js +124 -93
  231. package/dist/internal/Webhooks.js.map +1 -1
  232. package/dist/internal/funding/Deposit.d.ts +2 -2
  233. package/dist/internal/funding/Deposit.d.ts.map +1 -1
  234. package/dist/internal/funding/Deposit.js +9 -8
  235. package/dist/internal/funding/Deposit.js.map +1 -1
  236. package/dist/internal/funding/DepositAddress.d.ts +4 -4
  237. package/dist/internal/funding/DepositAddress.d.ts.map +1 -1
  238. package/dist/internal/funding/DepositAddress.js +9 -8
  239. package/dist/internal/funding/DepositAddress.js.map +1 -1
  240. package/dist/internal/funding/DepositWebhook.d.ts +25 -0
  241. package/dist/internal/funding/DepositWebhook.d.ts.map +1 -0
  242. package/dist/internal/funding/DepositWebhook.js +74 -0
  243. package/dist/internal/funding/DepositWebhook.js.map +1 -0
  244. package/dist/internal/funding/Provider.d.ts.map +1 -1
  245. package/dist/internal/funding/Provider.js +13 -12
  246. package/dist/internal/funding/Provider.js.map +1 -1
  247. package/dist/internal/funding/Reconciliation.d.ts +6 -0
  248. package/dist/internal/funding/Reconciliation.d.ts.map +1 -1
  249. package/dist/internal/funding/Reconciliation.js +42 -10
  250. package/dist/internal/funding/Reconciliation.js.map +1 -1
  251. package/dist/internal/funding/index.d.ts +1 -0
  252. package/dist/internal/funding/index.d.ts.map +1 -1
  253. package/dist/internal/funding/index.js +1 -0
  254. package/dist/internal/funding/index.js.map +1 -1
  255. package/dist/internal/funding/providers/stargate.d.ts +19 -0
  256. package/dist/internal/funding/providers/stargate.d.ts.map +1 -0
  257. package/dist/internal/funding/providers/stargate.js +143 -0
  258. package/dist/internal/funding/providers/stargate.js.map +1 -0
  259. package/dist/internal/webhookDestinations/slack.d.ts.map +1 -1
  260. package/dist/internal/webhookDestinations/slack.js +16 -0
  261. package/dist/internal/webhookDestinations/slack.js.map +1 -1
  262. package/dist/providers/index.d.ts +7 -0
  263. package/dist/providers/index.d.ts.map +1 -1
  264. package/dist/providers/index.js +3 -0
  265. package/dist/providers/index.js.map +1 -1
  266. package/package.json +2 -2
  267. package/src/App.test.ts +48 -0
  268. package/src/App.ts +7 -2
  269. package/src/Assets.test.ts +18 -0
  270. package/src/Assets.ts +22 -0
  271. package/src/Client.test-d.ts +287 -17
  272. package/src/Webhooks.ts +1 -220
  273. package/src/admin/apps/earn-vaults.test.ts +143 -0
  274. package/src/admin/apps/earn-vaults.ts +83 -6
  275. package/src/admin/apps/organizations.ts +6 -2
  276. package/src/admin/ui/src/routes/api-keys.tsx +36 -0
  277. package/src/admin/ui.generated.ts +151 -189
  278. package/src/apps/data/App.test.ts +31 -0
  279. package/src/apps/data/App.ts +64 -10
  280. package/src/apps/data/ZoneSelection.test.ts +196 -0
  281. package/src/apps/data/ZoneSelection.ts +108 -0
  282. package/src/apps/data/routes/activities.test.ts +435 -12
  283. package/src/apps/data/routes/activities.ts +562 -125
  284. package/src/apps/data/routes/balances.ts +1 -1
  285. package/src/apps/data/routes/blocks.ts +1 -1
  286. package/src/apps/data/routes/earn.test.ts +183 -23
  287. package/src/apps/data/routes/earn.ts +225 -29
  288. package/src/apps/data/routes/earn.zone-access.test.ts +46 -0
  289. package/src/apps/data/routes/exchanges.test.ts +31 -1
  290. package/src/apps/data/routes/exchanges.ts +19 -15
  291. package/src/apps/data/routes/fee-amm.ts +18 -11
  292. package/src/apps/data/routes/receipts.ts +1 -1
  293. package/src/apps/data/routes/rpc.test.ts +75 -0
  294. package/src/apps/data/routes/rpc.ts +23 -9
  295. package/src/apps/data/routes/tokenlist.ts +21 -18
  296. package/src/apps/data/routes/tokens.test.ts +29 -0
  297. package/src/apps/data/routes/tokens.ts +38 -15
  298. package/src/apps/data/routes/transactions.ts +1 -1
  299. package/src/apps/data/routes/transfers.test.ts +3 -3
  300. package/src/apps/data/routes/transfers.ts +12 -9
  301. package/src/apps/data/routes/webhooks.test.ts +179 -1497
  302. package/src/apps/data/routes/webhooks.ts +156 -976
  303. package/src/apps/data/routes/zones.test.ts +19 -13
  304. package/src/apps/funding/routes/chains.test.ts +211 -7
  305. package/src/apps/funding/routes/chains.ts +19 -12
  306. package/src/apps/funding/routes/deposit-addresses.test.ts +394 -0
  307. package/src/apps/funding/routes/deposit-addresses.ts +84 -72
  308. package/src/apps/funding/routes/providers.ts +9 -5
  309. package/src/apps/funding/routes/quotes.test.ts +46 -0
  310. package/src/apps/funding/routes/quotes.ts +8 -5
  311. package/src/apps/funding/routes/transfers.test.ts +35 -32
  312. package/src/apps/management/Billing.test.ts +26 -0
  313. package/src/apps/management/Billing.ts +24 -7
  314. package/src/apps/management/routes/api-keys.test.ts +178 -0
  315. package/src/apps/management/routes/api-keys.ts +203 -144
  316. package/src/apps/management/routes/billing.test.ts +209 -0
  317. package/src/apps/management/routes/billing.ts +254 -177
  318. package/src/apps/management/routes/faucet.test.ts +39 -0
  319. package/src/apps/management/routes/faucet.ts +75 -41
  320. package/src/apps/management/routes/invitations.test.ts +216 -0
  321. package/src/apps/management/routes/invitations.ts +186 -109
  322. package/src/apps/management/routes/invite-links.test.ts +263 -1
  323. package/src/apps/management/routes/invite-links.ts +295 -214
  324. package/src/apps/management/routes/me.test.ts +49 -0
  325. package/src/apps/management/routes/me.ts +42 -32
  326. package/src/apps/management/routes/members.test.ts +124 -1
  327. package/src/apps/management/routes/members.ts +81 -51
  328. package/src/apps/management/routes/orgs.test.ts +176 -0
  329. package/src/apps/management/routes/orgs.ts +101 -59
  330. package/src/apps/management/routes/projects.test.ts +183 -0
  331. package/src/apps/management/routes/projects.ts +124 -60
  332. package/src/apps/management/routes/scopes.test.ts +44 -0
  333. package/src/apps/management/routes/scopes.ts +37 -28
  334. package/src/apps/management/routes/usage.test.ts +92 -0
  335. package/src/apps/management/routes/usage.ts +186 -151
  336. package/src/apps/management/routes/verified-token-requests.test.ts +114 -0
  337. package/src/apps/management/routes/verified-token-requests.ts +166 -133
  338. package/src/apps/management/routes/webhooks.test.ts +313 -1
  339. package/src/apps/management/routes/webhooks.ts +220 -71
  340. package/src/apps/mpp/internal/Adapter.ts +13 -1
  341. package/src/db/Db.test.ts +42 -5
  342. package/src/db/Db.ts +85 -0
  343. package/src/db/Schema.ts +41 -3
  344. package/src/db/tables/earnVaults.test.ts +22 -0
  345. package/src/db/tables/earnVaults.ts +11 -1
  346. package/src/db/tables/organizations.test.ts +5 -2
  347. package/src/db/tables/webhookDeliveries.ts +13 -0
  348. package/src/db/tables/webhookQueueCompletions.ts +55 -0
  349. package/src/db/tables/webhookQueueEvents.ts +97 -57
  350. package/src/db/tables/webhookSubscriptions.ts +134 -144
  351. package/src/internal/Auth.ts +23 -5
  352. package/src/internal/Cache.ts +14 -7
  353. package/src/internal/EarnVaults.capabilities.test.ts +33 -0
  354. package/src/internal/EarnVaults.test.ts +79 -0
  355. package/src/internal/EarnVaults.ts +277 -0
  356. package/src/internal/MetricSink.test.ts +41 -373
  357. package/src/internal/MetricSink.ts +92 -273
  358. package/src/internal/OpenApi.ts +165 -49
  359. package/src/internal/Response.test.ts +95 -0
  360. package/src/internal/Response.ts +40 -2
  361. package/src/internal/Schema.test.ts +34 -0
  362. package/src/internal/Schema.ts +20 -9
  363. package/src/internal/Store.test.ts +186 -0
  364. package/src/internal/Store.ts +57 -17
  365. package/src/internal/Tidx.test.ts +19 -0
  366. package/src/internal/Tidx.ts +16 -4
  367. package/src/internal/WebhookTransfer.ts +1 -351
  368. package/src/internal/Webhooks.test.ts +222 -145
  369. package/src/internal/Webhooks.ts +234 -135
  370. package/src/internal/funding/Deposit.ts +71 -64
  371. package/src/internal/funding/DepositAddress.ts +50 -43
  372. package/src/internal/funding/DepositWebhook.test.ts +131 -0
  373. package/src/internal/funding/DepositWebhook.ts +101 -0
  374. package/src/internal/funding/Provider.ts +164 -142
  375. package/src/internal/funding/Reconciliation.test.ts +14 -0
  376. package/src/internal/funding/Reconciliation.ts +161 -86
  377. package/src/internal/funding/index.test.ts +1 -0
  378. package/src/internal/funding/index.ts +1 -0
  379. package/src/internal/funding/providers/index.test.ts +185 -0
  380. package/src/internal/funding/providers/stargate.ts +184 -0
  381. package/src/internal/webhookDestinations/slack.ts +15 -0
  382. package/src/providers/index.test.ts +1 -0
  383. package/src/providers/index.ts +9 -0
  384. package/src/Webhooks.bench.ts +0 -714
  385. package/src/Webhooks.memory.bench.ts +0 -250
  386. package/src/Webhooks.test.ts +0 -146
@@ -4,6 +4,7 @@ import type * as Db from '../../db/Db.js'
4
4
  import * as FundingDepositAddresses from '../../db/tables/fundingDepositAddresses.js'
5
5
  import * as FundingDeposits from '../../db/tables/fundingDeposits.js'
6
6
  import * as Id from '../Id.js'
7
+ import * as OpenApi from '../OpenApi.js'
7
8
  import * as Schema from '../Schema.js'
8
9
  import * as Provider from './Provider.js'
9
10
 
@@ -115,22 +116,25 @@ export namespace schema {
115
116
  )
116
117
 
117
118
  /** Customer-safe explanation of a deposit status. */
118
- export const StatusReason = z
119
- .object({
120
- code: z
121
- .enum(statusReasonCodes)
122
- .check(
123
- z.describe('Stable machine-readable reason code.'),
124
- z.meta({ examples: ['delivery_liquidity_unavailable'] }),
125
- ),
126
- message: z
127
- .string()
128
- .check(
129
- z.describe('Human-readable explanation of the current status.'),
130
- z.meta({ examples: ['The required destination amount is not currently available.'] }),
131
- ),
132
- })
133
- .check(z.describe('Why a deposit needs attention or recovery.'))
119
+ export const StatusReason = OpenApi.component(
120
+ z
121
+ .object({
122
+ code: z
123
+ .enum(statusReasonCodes)
124
+ .check(
125
+ z.describe('Stable machine-readable reason code.'),
126
+ z.meta({ examples: ['delivery_liquidity_unavailable'] }),
127
+ ),
128
+ message: z
129
+ .string()
130
+ .check(
131
+ z.describe('Human-readable explanation of the current status.'),
132
+ z.meta({ examples: ['The required destination amount is not currently available.'] }),
133
+ ),
134
+ })
135
+ .check(z.describe('Why a deposit needs attention or recovery.')),
136
+ 'FundingDepositStatusReason',
137
+ )
134
138
 
135
139
  /** Public fields persisted as the deposit snapshot. */
136
140
  export const Snapshot = z
@@ -189,54 +193,57 @@ export namespace schema {
189
193
  )
190
194
 
191
195
  /** One detected funding deposit. */
192
- export const FundingDeposit = z
193
- .object({
194
- createdAt: z
195
- .string()
196
- .check(
197
- z.describe('When the deposit was first detected (ISO 8601).'),
198
- z.meta({ examples: ['2026-08-04T00:01:00.000Z'] }),
199
- ),
200
- depositAddressId: Snapshot.shape.depositAddressId,
201
- detectionTrigger: z.optional(DetectionTrigger),
202
- destinationAmount: Snapshot.shape.destinationAmount,
203
- destinationAmountRequired: Snapshot.shape.destinationAmountRequired,
204
- destinationChain: Snapshot.shape.destinationChain,
205
- destinationToken: Snapshot.shape.destinationToken,
206
- destinationTransactionHashes: Snapshot.shape.destinationTransactionHashes,
207
- id: z
208
- .string()
209
- .check(
210
- z.regex(/^fdp_[A-Za-z0-9_-]+$/),
211
- z.describe('Funding deposit id (`fdp_…`).'),
212
- z.meta({ examples: ['fdp_001785792060000_2ZPE2gvateYEQ0dQslgvkhjx'] }),
213
- ),
214
- provider: Snapshot.shape.provider,
215
- recipient: Snapshot.shape.recipient,
216
- refundAddress: Snapshot.shape.refundAddress,
217
- refundAmount: Snapshot.shape.refundAmount,
218
- refundTransactionHashes: Snapshot.shape.refundTransactionHashes,
219
- sender: Snapshot.shape.sender,
220
- sourceAmount: Snapshot.shape.sourceAmount,
221
- sourceChain: Snapshot.shape.sourceChain,
222
- sourceToken: Snapshot.shape.sourceToken,
223
- sourceTransactionHashes: Snapshot.shape.sourceTransactionHashes,
224
- sourceTransferIndex: z
225
- .optional(z.number().check(z.int(), z.minimum(0)))
226
- .check(
227
- z.describe('Verified transfer position within the source transaction.'),
228
- z.meta({ examples: [0] }),
229
- ),
230
- status: Status,
231
- statusReason: z.optional(StatusReason),
232
- updatedAt: z
233
- .string()
234
- .check(
235
- z.describe('When the deposit last materially changed (ISO 8601).'),
236
- z.meta({ examples: ['2026-08-04T00:02:00.000Z'] }),
237
- ),
238
- })
239
- .check(z.describe('One detected deposit and its delivery status.'))
196
+ export const FundingDeposit = OpenApi.component(
197
+ z
198
+ .object({
199
+ createdAt: z.iso
200
+ .datetime()
201
+ .check(
202
+ z.describe('When the deposit was first detected (ISO 8601).'),
203
+ z.meta({ examples: ['2026-08-04T00:01:00.000Z'] }),
204
+ ),
205
+ depositAddressId: Snapshot.shape.depositAddressId,
206
+ detectionTrigger: z.optional(DetectionTrigger),
207
+ destinationAmount: Snapshot.shape.destinationAmount,
208
+ destinationAmountRequired: Snapshot.shape.destinationAmountRequired,
209
+ destinationChain: Snapshot.shape.destinationChain,
210
+ destinationToken: Snapshot.shape.destinationToken,
211
+ destinationTransactionHashes: Snapshot.shape.destinationTransactionHashes,
212
+ id: z
213
+ .string()
214
+ .check(
215
+ z.regex(/^fdp_[A-Za-z0-9_-]+$/),
216
+ z.describe('Funding deposit id (`fdp_…`).'),
217
+ z.meta({ examples: ['fdp_001785792060000_2ZPE2gvateYEQ0dQslgvkhjx'] }),
218
+ ),
219
+ provider: Snapshot.shape.provider,
220
+ recipient: Snapshot.shape.recipient,
221
+ refundAddress: Snapshot.shape.refundAddress,
222
+ refundAmount: Snapshot.shape.refundAmount,
223
+ refundTransactionHashes: Snapshot.shape.refundTransactionHashes,
224
+ sender: Snapshot.shape.sender,
225
+ sourceAmount: Snapshot.shape.sourceAmount,
226
+ sourceChain: Snapshot.shape.sourceChain,
227
+ sourceToken: Snapshot.shape.sourceToken,
228
+ sourceTransactionHashes: Snapshot.shape.sourceTransactionHashes,
229
+ sourceTransferIndex: z
230
+ .optional(z.number().check(z.int(), z.minimum(0)))
231
+ .check(
232
+ z.describe('Verified transfer position within the source transaction.'),
233
+ z.meta({ examples: [0] }),
234
+ ),
235
+ status: Status,
236
+ statusReason: z.optional(StatusReason),
237
+ updatedAt: z.iso
238
+ .datetime()
239
+ .check(
240
+ z.describe('When the deposit last materially changed (ISO 8601).'),
241
+ z.meta({ examples: ['2026-08-04T00:02:00.000Z'] }),
242
+ ),
243
+ })
244
+ .check(z.describe('One detected deposit and its delivery status.')),
245
+ 'FundingDeposit',
246
+ )
240
247
  }
241
248
 
242
249
  /** Stored public snapshot of a funding deposit. */
@@ -3,6 +3,7 @@ import * as z from 'zod/mini'
3
3
  import type * as Db from '../../db/Db.js'
4
4
  import * as FundingDepositAddresses from '../../db/tables/fundingDepositAddresses.js'
5
5
  import * as Id from '../Id.js'
6
+ import * as OpenApi from '../OpenApi.js'
6
7
  import * as Provider from './Provider.js'
7
8
  import * as Transfer from './Transfer.js'
8
9
 
@@ -83,51 +84,57 @@ export namespace schema {
83
84
  .check(z.describe('Public route and ownership-independent fields of a deposit address.'))
84
85
 
85
86
  /** One reusable funding deposit address. */
86
- export const FundingDepositAddress = z
87
- .object({
88
- address: Snapshot.shape.address,
89
- createdAt: z
90
- .string()
91
- .check(
92
- z.describe('When the deposit address was created (ISO 8601).'),
93
- z.meta({ examples: ['2026-08-04T00:00:00.000Z'] }),
94
- ),
95
- destinationChain: Snapshot.shape.destinationChain,
96
- destinationToken: Snapshot.shape.destinationToken,
97
- id: z
98
- .string()
99
- .check(
100
- z.regex(/^fda_[A-Za-z0-9_-]+$/),
101
- z.describe('Funding deposit address id (`fda_…`).'),
102
- z.meta({ examples: ['fda_001785792000000_2ZPE2gvateYEQ0dQslgvkhjx'] }),
103
- ),
104
- provider: Snapshot.shape.provider,
105
- recipient: Snapshot.shape.recipient,
106
- refundAddress: Snapshot.shape.refundAddress,
107
- sourceChain: Snapshot.shape.sourceChain,
108
- sourceToken: Snapshot.shape.sourceToken,
109
- status: Status,
110
- subsidize: Snapshot.shape.subsidize,
111
- updatedAt: z
112
- .string()
113
- .check(
114
- z.describe('When the deposit address last materially changed (ISO 8601).'),
115
- z.meta({ examples: ['2026-08-04T00:00:00.000Z'] }),
116
- ),
117
- })
118
- .check(z.describe('One reusable address for funding a Tempo account.'))
87
+ export const FundingDepositAddress = OpenApi.component(
88
+ z
89
+ .object({
90
+ address: Snapshot.shape.address,
91
+ createdAt: z.iso
92
+ .datetime()
93
+ .check(
94
+ z.describe('When the deposit address was created (ISO 8601).'),
95
+ z.meta({ examples: ['2026-08-04T00:00:00.000Z'] }),
96
+ ),
97
+ destinationChain: Snapshot.shape.destinationChain,
98
+ destinationToken: Snapshot.shape.destinationToken,
99
+ id: z
100
+ .string()
101
+ .check(
102
+ z.regex(/^fda_[A-Za-z0-9_-]+$/),
103
+ z.describe('Funding deposit address id (`fda_…`).'),
104
+ z.meta({ examples: ['fda_001785792000000_2ZPE2gvateYEQ0dQslgvkhjx'] }),
105
+ ),
106
+ provider: Snapshot.shape.provider,
107
+ recipient: Snapshot.shape.recipient,
108
+ refundAddress: Snapshot.shape.refundAddress,
109
+ sourceChain: Snapshot.shape.sourceChain,
110
+ sourceToken: Snapshot.shape.sourceToken,
111
+ status: Status,
112
+ subsidize: Snapshot.shape.subsidize,
113
+ updatedAt: z.iso
114
+ .datetime()
115
+ .check(
116
+ z.describe('When the deposit address last materially changed (ISO 8601).'),
117
+ z.meta({ examples: ['2026-08-04T00:00:00.000Z'] }),
118
+ ),
119
+ })
120
+ .check(z.describe('One reusable address for funding a Tempo account.')),
121
+ 'FundingDepositAddress',
122
+ )
119
123
 
120
124
  /** A reusable funding deposit address with terms sampled during creation. */
121
- export const CreatedFundingDepositAddress = z
122
- .object({
123
- ...FundingDepositAddress.shape,
124
- destinationAmount: Provider.schema.FundingQuote.shape.destinationAmount,
125
- destinationAmountMin: Provider.schema.FundingQuote.shape.destinationAmountMin,
126
- fees: z.array(Transfer.schema.Fee).check(z.describe('Fees applied to the quoted deposit.')),
127
- quote: Provider.schema.QuoteDetails,
128
- sourceAmount: Provider.schema.FundingQuote.shape.sourceAmount,
129
- })
130
- .check(z.describe('A reusable funding deposit address with current quoted delivery terms.'))
125
+ export const CreatedFundingDepositAddress = OpenApi.component(
126
+ z
127
+ .object({
128
+ ...FundingDepositAddress.shape,
129
+ destinationAmount: Provider.schema.FundingQuote.shape.destinationAmount,
130
+ destinationAmountMin: Provider.schema.FundingQuote.shape.destinationAmountMin,
131
+ fees: z.array(Transfer.schema.Fee).check(z.describe('Fees applied to the quoted deposit.')),
132
+ quote: Provider.schema.QuoteDetails,
133
+ sourceAmount: Provider.schema.FundingQuote.shape.sourceAmount,
134
+ })
135
+ .check(z.describe('A reusable funding deposit address with current quoted delivery terms.')),
136
+ 'CreatedFundingDepositAddress',
137
+ )
131
138
  }
132
139
 
133
140
  /** Stored public snapshot of a funding deposit address. */
@@ -0,0 +1,131 @@
1
+ import * as TestApp from '../../../test/App.js'
2
+ import * as TestFunding from '../../../test/Funding.js'
3
+ import * as WebhookQueueEvents from '../../db/tables/webhookQueueEvents.js'
4
+ import * as Webhooks from '../Webhooks.js'
5
+ import * as Deposit from './Deposit.js'
6
+ import * as FundingDepositAddress from './DepositAddress.js'
7
+ import * as DepositWebhook from './DepositWebhook.js'
8
+
9
+ const db = TestApp.database()
10
+
11
+ describe('stage', () => {
12
+ test('matches owner, environment, project, and filters with stable event ids', async () => {
13
+ const orgId = 'org_funding_deposit_webhook'
14
+ const projectId = 'prj_funding_deposit_webhook'
15
+ const address = await FundingDepositAddress.create(db, {
16
+ apiKeyId: 'key_funding_deposit_webhook',
17
+ deliveryStrategy: 'provider',
18
+ environment: 'production',
19
+ now: new Date('2026-08-12T00:00:00.000Z'),
20
+ orgId,
21
+ projectId,
22
+ providerOutputToken: TestFunding.providerOutputToken(),
23
+ snapshot: TestFunding.depositAddressSnapshot({
24
+ address: 'TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE',
25
+ recipient: `0x${'ab'.repeat(20)}`,
26
+ }),
27
+ })
28
+ const deposit = await Deposit.create(db, {
29
+ now: new Date('2026-08-12T00:01:00.000Z'),
30
+ providerRequestId: 'relay_deposit_webhook',
31
+ snapshot: TestFunding.depositSnapshot(address.id),
32
+ sourceTransactionHash: `0x${'aa'.repeat(32)}`,
33
+ sourceTransferIndex: 0,
34
+ })
35
+ const completed = await Deposit.transition(db, {
36
+ expectedVersion: deposit.version,
37
+ id: deposit.id,
38
+ status: 'completed',
39
+ })
40
+ if (completed.type !== 'applied') throw new Error('Expected deposit transition to apply.')
41
+
42
+ const filters = {
43
+ depositAddressId: address.id,
44
+ recipient: address.recipient.toLowerCase(),
45
+ status: 'completed',
46
+ }
47
+ const org = await subscription({ filters, orgId })
48
+ const project = await subscription({ filters, orgId, projectId })
49
+ await subscription({ orgId, projectId: 'prj_funding_deposit_sibling' })
50
+ await subscription({ environment: 'sandbox', orgId })
51
+ await subscription({ filters: { status: 'refunded' }, orgId })
52
+
53
+ const first = await DepositWebhook.stage(db, { records: [completed.record] })
54
+ const second = await DepositWebhook.stage(db, { records: [completed.record] })
55
+ expect({ created: first.created, repeated: second.created }).toEqual({
56
+ created: 2,
57
+ repeated: 0,
58
+ })
59
+ expect(first.references.map((reference) => reference.subscriptionId)).toEqual([
60
+ org.id,
61
+ project.id,
62
+ ])
63
+ const event = await WebhookQueueEvents.get(db, first.references[0]!)
64
+ expect(event?.envelope).toMatchObject({
65
+ chainId: 4217,
66
+ data: { id: completed.record.id, status: 'completed' },
67
+ id: first.references[0]!.eventId,
68
+ subscriptionId: org.id,
69
+ type: 'funding:deposit.updated',
70
+ })
71
+ })
72
+ })
73
+
74
+ describe('transition', () => {
75
+ test('commits the deposit version with its webhook obligation', async () => {
76
+ const orgId = 'org_funding_deposit_transition'
77
+ const address = await FundingDepositAddress.create(db, {
78
+ apiKeyId: 'key_funding_deposit_transition',
79
+ deliveryStrategy: 'provider',
80
+ environment: 'production',
81
+ now: new Date('2026-08-12T01:00:00.000Z'),
82
+ orgId,
83
+ providerOutputToken: TestFunding.providerOutputToken(),
84
+ snapshot: TestFunding.depositAddressSnapshot(),
85
+ })
86
+ const deposit = await Deposit.create(db, {
87
+ now: new Date('2026-08-12T01:01:00.000Z'),
88
+ providerRequestId: 'relay_deposit_transition',
89
+ snapshot: TestFunding.depositSnapshot(address.id),
90
+ sourceTransactionHash: `0x${'bb'.repeat(32)}`,
91
+ sourceTransferIndex: 0,
92
+ })
93
+ await subscription({ filters: {}, orgId })
94
+
95
+ const transitioned = await DepositWebhook.transition(db, {
96
+ expectedVersion: deposit.version,
97
+ id: deposit.id,
98
+ status: 'bridging',
99
+ })
100
+ if (transitioned.result.type !== 'applied') throw new Error('Expected applied transition.')
101
+
102
+ expect(transitioned.references).toHaveLength(1)
103
+ expect(await WebhookQueueEvents.get(db, transitioned.references[0]!)).toMatchObject({
104
+ envelope: {
105
+ data: { id: deposit.id, status: 'bridging' },
106
+ id: transitioned.references[0]!.eventId,
107
+ },
108
+ })
109
+ })
110
+ })
111
+
112
+ function subscription(options: subscription.Options) {
113
+ return Webhooks.createSubscription(db, {
114
+ chainId: 4217,
115
+ destination: { type: 'url', url: 'https://example.com/webhooks/tempo' },
116
+ environment: options.environment ?? 'production',
117
+ eventType: 'funding:deposit.updated',
118
+ filters: options.filters ?? { recipient: `0x${'ab'.repeat(20)}`, status: 'completed' },
119
+ owner: { orgId: options.orgId, type: 'api_key' },
120
+ ...(options.projectId === undefined ? {} : { projectId: options.projectId }),
121
+ })
122
+ }
123
+
124
+ declare namespace subscription {
125
+ type Options = {
126
+ environment?: 'production' | 'sandbox' | undefined
127
+ filters?: Record<string, unknown> | undefined
128
+ orgId: string
129
+ projectId?: string | undefined
130
+ }
131
+ }
@@ -0,0 +1,101 @@
1
+ import type * as Db from '../../db/Db.js'
2
+ import * as FundingDeposits from '../../db/tables/fundingDeposits.js'
3
+ import * as WebhookSubscriptions from '../../db/tables/webhookSubscriptions.js'
4
+ import * as Webhooks from '../Webhooks.js'
5
+ import * as Deposit from './Deposit.js'
6
+
7
+ /** Applies a deposit transition and stages every matching webhook obligation atomically. */
8
+ export async function transition(
9
+ db: Db.Db,
10
+ options: Deposit.transition.Options,
11
+ ): Promise<transition.Result> {
12
+ return db.transaction(async (tx) => {
13
+ const result = await Deposit.transition(tx, options)
14
+ if (result.type !== 'applied') return { references: [], result }
15
+ const staged = await stage(tx, { records: [result.record] })
16
+ return { references: staged.references, result }
17
+ })
18
+ }
19
+
20
+ export declare namespace transition {
21
+ /** Transition result plus compact references for atomically staged obligations. */
22
+ type Result = {
23
+ /** Queue references staged with the applied transition. */
24
+ references: Webhooks.QueueReference[]
25
+ /** Version-guarded deposit transition outcome. */
26
+ result: Deposit.transition.Result
27
+ }
28
+ }
29
+
30
+ /** Stages durable webhook obligations for committed funding deposit versions. */
31
+ export async function stage(
32
+ db: Db.Db,
33
+ options: stage.Options,
34
+ ): Promise<Webhooks.ensureQueueEvents.Result> {
35
+ const dispatchables: Webhooks.ensureQueueEvents.Dispatchable[] = []
36
+ const now = new Date().toISOString()
37
+ for (const record of unique(options.records)) {
38
+ const chainId = destinationChainId(record)
39
+ if (chainId === undefined) continue
40
+ const subscriptions = await WebhookSubscriptions.listActiveForFundingDeposit(db, {
41
+ chainId,
42
+ environment: record.environment,
43
+ now,
44
+ orgId: record.orgId,
45
+ ...(record.projectId === null ? {} : { projectId: record.projectId }),
46
+ })
47
+ const data = Deposit.toPublic(record)
48
+ for (const subscription of subscriptions) {
49
+ if (!matches(subscription.filters, data)) continue
50
+ dispatchables.push({
51
+ envelope: Webhooks.buildKeyedEnvelope({
52
+ createdAt: new Date(record.updatedAt),
53
+ data,
54
+ key: `${record.id}:${record.version}`,
55
+ subscription,
56
+ }),
57
+ subscription,
58
+ })
59
+ }
60
+ }
61
+ return Webhooks.ensureQueueEvents(db, dispatchables)
62
+ }
63
+
64
+ export declare namespace stage {
65
+ /** Committed deposit changes eligible for customer webhook delivery. */
66
+ type Options = {
67
+ /** Latest committed funding deposit records. */
68
+ records: readonly FundingDeposits.Record[]
69
+ }
70
+ }
71
+
72
+ function destinationChainId(record: FundingDeposits.Record): number | undefined {
73
+ const match = /^eip155:(\d+)$/.exec(record.snapshot.destinationChain.id)
74
+ if (!match) return undefined
75
+ const chainId = Number(match[1])
76
+ return Number.isSafeInteger(chainId) && chainId > 0 ? chainId : undefined
77
+ }
78
+
79
+ function matches(filters: Record<string, unknown>, deposit: Deposit.Public): boolean {
80
+ if (
81
+ typeof filters['depositAddressId'] === 'string' &&
82
+ filters['depositAddressId'] !== deposit.depositAddressId
83
+ )
84
+ return false
85
+ if (
86
+ typeof filters['recipient'] === 'string' &&
87
+ filters['recipient'].toLowerCase() !== deposit.recipient.toLowerCase()
88
+ )
89
+ return false
90
+ if (typeof filters['status'] === 'string' && filters['status'] !== deposit.status) return false
91
+ return true
92
+ }
93
+
94
+ function unique(records: readonly FundingDeposits.Record[]): FundingDeposits.Record[] {
95
+ const byId = new Map<string, FundingDeposits.Record>()
96
+ for (const record of records) {
97
+ const current = byId.get(record.id)
98
+ if (!current || current.version < record.version) byId.set(record.id, record)
99
+ }
100
+ return [...byId.values()]
101
+ }