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
@@ -10,6 +10,8 @@ import * as Rhino from '../../../internal/funding/providers/rhino.js'
10
10
 
11
11
  import * as Squid from '../../../internal/funding/providers/squid.js'
12
12
 
13
+ import * as Stargate from '../../../internal/funding/providers/stargate.js'
14
+
13
15
  import * as Symbiosis from '../../../internal/funding/providers/symbiosis.js'
14
16
 
15
17
  import type * as Log from '../../../internal/Log.js'
@@ -34,6 +36,10 @@ const providers = [
34
36
  integratorId: 'squid-integrator-id',
35
37
  userAddress: '0x1111111111111111111111111111111111111111',
36
38
  }),
39
+ Stargate.stargate({
40
+ apiKey: 'layerzero-api-key',
41
+ userAddress: '0x1111111111111111111111111111111111111111',
42
+ }),
37
43
  Symbiosis.symbiosis({ userAddress: '0x1111111111111111111111111111111111111111' }),
38
44
  ] as const
39
45
 
@@ -175,6 +181,27 @@ describe('GET /funding/quotes', () => {
175
181
  expect(body.data[0]?.quote.expiresAt).toBe('2026-01-01T00:01:00Z')
176
182
  })
177
183
 
184
+ test('returns Stargate quotes for Base USDC to Tempo USDC.e', async () => {
185
+ const app = create({ providers: [stargateProvider()] })
186
+ const response = await app.request(quoteUrl({ ...baseUsdcQuery, provider: 'stargate' }), {
187
+ headers: TestApp.auth.headers,
188
+ })
189
+
190
+ expect(response.status).toBe(200)
191
+ const body = await TestApp.json(response, Funding.schema.quoteFunding.Response)
192
+ expect(body.data[0]).toMatchObject({
193
+ destinationAmount: { baseUnits: '999600' },
194
+ destinationAmountMin: { baseUnits: '999100' },
195
+ id: 'base-usdc-tempo-usdce-stargate',
196
+ provider: { id: 'stargate', name: 'Stargate' },
197
+ quality: {
198
+ liquiditySource: 'providerQuote',
199
+ sourceDetail: 'stargate:value-transfer-v1:bus',
200
+ tier: 'liquid',
201
+ },
202
+ })
203
+ })
204
+
178
205
  test('returns non-EVM Rhino quotes with stable chain and token ids', async () => {
179
206
  const app = create({ providers: [rhinoProvider()] })
180
207
  const response = await app.request(
@@ -501,6 +528,25 @@ function rhinoProvider() {
501
528
  })
502
529
  }
503
530
 
531
+ function stargateProvider() {
532
+ return withGetQuote('stargate', async (input, signal) => {
533
+ expect(signal.aborted).toBe(false)
534
+ expect(input.candidate.id).toBe('base-usdc-tempo-usdce-stargate')
535
+ return {
536
+ destinationAmountMin: '999100',
537
+ destinationAmount: '999600',
538
+ quality: {
539
+ estimatedSeconds: 28,
540
+ liquiditySource: 'providerQuote',
541
+ sourceDetail: 'stargate:value-transfer-v1:bus',
542
+ tier: 'liquid',
543
+ },
544
+ sampledAt: '2026-01-01T00:00:00Z',
545
+ status: 'available',
546
+ }
547
+ })
548
+ }
549
+
504
550
  function withGetQuote(
505
551
  id: FundingProvider.ProviderId,
506
552
  getQuote: FundingProvider.Provider['getQuote'],
@@ -22,11 +22,14 @@ export namespace schema {
22
22
  export const Query = FundingProvider.schema.QuoteRequest
23
23
 
24
24
  /** Non-paginated list of successful funding quotes. */
25
- export const Response = Schema.describe(
26
- z.object({
27
- data: z.array(FundingQuote).check(z.describe('Successful live funding quotes.')),
28
- }),
29
- 'A non-paginated list of successful live funding quotes.',
25
+ export const Response = OpenApi.component(
26
+ Schema.describe(
27
+ z.object({
28
+ data: z.array(FundingQuote).check(z.describe('Successful live funding quotes.')),
29
+ }),
30
+ 'A non-paginated list of successful live funding quotes.',
31
+ ),
32
+ 'FundingQuoteList',
30
33
  )
31
34
  }
32
35
  }
@@ -39,6 +39,24 @@ function create(options: TestApp.create.Options = {}) {
39
39
  return TestApp.create({ ...options, db })
40
40
  }
41
41
 
42
+ type JsonSchema = {
43
+ $ref?: string | undefined
44
+ additionalProperties?: boolean | undefined
45
+ examples?: readonly unknown[] | undefined
46
+ properties?: Record<string, JsonSchema> | undefined
47
+ required?: readonly string[] | undefined
48
+ }
49
+
50
+ type ComponentSpec = {
51
+ components: { schemas: Record<string, JsonSchema> }
52
+ }
53
+
54
+ function dereference(spec: ComponentSpec, schema: JsonSchema): JsonSchema {
55
+ if (!schema.$ref) return schema
56
+ const name = schema.$ref.split('/').at(-1)!
57
+ return spec.components.schemas[name]!
58
+ }
59
+
42
60
  describe('GET /funding/transfers', () => {
43
61
  test('requires the funding:read scope', async () => {
44
62
  const app = transfersApp()
@@ -766,33 +784,23 @@ describe('funding transfers OpenAPI', () => {
766
784
 
767
785
  test('publishes human-readable deposit address route examples', async () => {
768
786
  const app = create({ auth: false })
769
- type Property = { examples: string[] }
770
787
  type Operation = {
771
788
  requestBody: {
772
- content: Record<
773
- string,
774
- {
775
- schema: {
776
- properties: {
777
- destinationToken: Property
778
- sourceChain: Property
779
- sourceToken: Property
780
- }
781
- }
782
- }
783
- >
789
+ content: Record<string, { schema: JsonSchema }>
784
790
  }
785
791
  }
786
- type Spec = { paths: Record<string, { post: Operation }> }
792
+ type Spec = ComponentSpec & { paths: Record<string, { post: Operation }> }
787
793
  const spec = (await (await app.request('/openapi.json')).json()) as Spec
788
- const properties =
794
+ const properties = dereference(
795
+ spec,
789
796
  spec.paths['/v1/funding/deposit-addresses']!.post.requestBody.content['application/json']!
790
- .schema.properties
797
+ .schema,
798
+ ).properties!
791
799
 
792
800
  expect({
793
- destinationToken: properties.destinationToken.examples,
794
- sourceChain: properties.sourceChain.examples,
795
- sourceToken: properties.sourceToken.examples,
801
+ destinationToken: properties['destinationToken']!.examples,
802
+ sourceChain: properties['sourceChain']!.examples,
803
+ sourceToken: properties['sourceToken']!.examples,
796
804
  }).toMatchInlineSnapshot(`
797
805
  {
798
806
  "destinationToken": [
@@ -949,30 +957,22 @@ describe('funding transfers OpenAPI', () => {
949
957
 
950
958
  test('publishes concrete creation schemas', async () => {
951
959
  const app = create({ auth: false })
952
- const spec = (await (await app.request('/openapi.json')).json()) as {
960
+ type Spec = ComponentSpec & {
953
961
  paths: Record<
954
962
  string,
955
963
  {
956
964
  post?: {
957
965
  requestBody: {
958
- content: Record<
959
- string,
960
- {
961
- schema: {
962
- additionalProperties?: boolean
963
- properties: object
964
- required?: readonly string[] | undefined
965
- }
966
- }
967
- >
966
+ content: Record<string, { schema: JsonSchema }>
968
967
  }
969
968
  responses: Record<string, unknown>
970
969
  }
971
970
  }
972
971
  >
973
972
  }
973
+ const spec = (await (await app.request('/openapi.json')).json()) as Spec
974
974
  const creationSchema = (path: string) =>
975
- spec.paths[path]!.post!.requestBody.content['application/json']!.schema
975
+ dereference(spec, spec.paths[path]!.post!.requestBody.content['application/json']!.schema)
976
976
  expect(
977
977
  creationSchema('/v1/funding/deposit-addresses').required?.includes('subsidize') ?? false,
978
978
  ).toMatchInlineSnapshot(`false`)
@@ -980,7 +980,7 @@ describe('funding transfers OpenAPI', () => {
980
980
  const schema = creationSchema(path)
981
981
  return {
982
982
  additionalProperties: schema.additionalProperties,
983
- properties: Object.keys(schema.properties),
983
+ properties: Object.keys(schema.properties!),
984
984
  }
985
985
  }
986
986
 
@@ -1025,6 +1025,7 @@ describe('funding transfers OpenAPI', () => {
1025
1025
  "200",
1026
1026
  "400",
1027
1027
  "401",
1028
+ "403",
1028
1029
  "404",
1029
1030
  "409",
1030
1031
  "429",
@@ -1047,6 +1048,7 @@ describe('funding transfers OpenAPI', () => {
1047
1048
  "vaultResponses": [
1048
1049
  "400",
1049
1050
  "401",
1051
+ "403",
1050
1052
  "429",
1051
1053
  "500",
1052
1054
  "501",
@@ -1069,6 +1071,7 @@ describe('funding transfers OpenAPI', () => {
1069
1071
  "zoneResponses": [
1070
1072
  "400",
1071
1073
  "401",
1074
+ "403",
1072
1075
  "429",
1073
1076
  "500",
1074
1077
  "501",
@@ -199,6 +199,32 @@ describe('createReporter', () => {
199
199
  await db.close()
200
200
  })
201
201
 
202
+ test('behavior: marks a meter event that Stripe already accepted', async () => {
203
+ const db = create()
204
+ await db.migrate()
205
+ await StripeCustomers.create(db, { orgId: 'org_1', stripeCustomerId: 'cus_1' })
206
+ const row = await finalized(db, { feeAmount: '100000', seed: '03' })
207
+
208
+ const { stripe } = stubStripe({
209
+ meterEvent: (params) => {
210
+ throw new Error(`An event already exists with identifier ${params.identifier}.`)
211
+ },
212
+ subscriptions: [{ items: ['feePayerSpend', 'apiRequests'], status: 'active' }],
213
+ })
214
+ expect(await Billing.createReporter({ db, stripe }).tick()).toStrictEqual({
215
+ failed: 0,
216
+ reported: 1,
217
+ skipped: 0,
218
+ })
219
+ expect((await SponsoredTransactions.get(db, row.id))?.meterReportedAt).not.toBeNull()
220
+ expect(await Billing.createReporter({ db, stripe }).tick()).toStrictEqual({
221
+ failed: 0,
222
+ reported: 0,
223
+ skipped: 0,
224
+ })
225
+ await db.close()
226
+ })
227
+
202
228
  test('behavior: canceled customers skip without meter events', async () => {
203
229
  const db = create()
204
230
  await db.migrate()
@@ -357,12 +357,18 @@ export function createReporter(options: createReporter.Options): createReporter.
357
357
  const stamp = recent && !subscription.items.feePayerSpend?.created
358
358
  // The row id makes short-window retries idempotent on Stripe's
359
359
  // side; `meter_reported_at` is the durable exactly-once guard.
360
- await stripe.billing.meterEvents.create({
361
- event_name: meterEventName,
362
- identifier: row.id,
363
- payload: { stripe_customer_id: customer.stripeCustomerId, value: row.feeAmount! },
364
- ...(stamp ? { timestamp: Math.floor(finalizedAt / 1000) } : {}),
365
- })
360
+ try {
361
+ await stripe.billing.meterEvents.create({
362
+ event_name: meterEventName,
363
+ identifier: row.id,
364
+ payload: { stripe_customer_id: customer.stripeCustomerId, value: row.feeAmount! },
365
+ ...(stamp ? { timestamp: Math.floor(finalizedAt / 1000) } : {}),
366
+ })
367
+ } catch (error) {
368
+ // Stripe may persist the event before the Worker records its ack.
369
+ // Its duplicate response proves this exact row was already metered.
370
+ if (!isDuplicateMeterEvent(error, row.id)) throw error
371
+ }
366
372
  reported++
367
373
  } else {
368
374
  // Deleted orgs and Stripe-deleted (canceled) customers keep their
@@ -381,6 +387,14 @@ export function createReporter(options: createReporter.Options): createReporter.
381
387
  }
382
388
  }
383
389
 
390
+ /** Whether Stripe confirms that the exact meter event identifier already exists. */
391
+ function isDuplicateMeterEvent(error: unknown, identifier: string): boolean {
392
+ return (
393
+ error instanceof Error &&
394
+ error.message === `An event already exists with identifier ${identifier}.`
395
+ )
396
+ }
397
+
384
398
  export declare namespace createReporter {
385
399
  /** Options for {@link createReporter}. */
386
400
  type Options = {
@@ -452,7 +466,10 @@ export function createRequestUsageReporter(
452
466
  count: status.count,
453
467
  environment,
454
468
  oldestPendingAgeSeconds: status.oldestAttemptedAt
455
- ? Math.max(0, Math.floor((now() - new Date(status.oldestAttemptedAt).getTime()) / 1_000))
469
+ ? Math.max(
470
+ 0,
471
+ Math.floor((now() - new Date(status.oldestAttemptedAt).getTime()) / 1_000),
472
+ )
456
473
  : 0,
457
474
  }
458
475
  }),
@@ -82,6 +82,184 @@ async function fixture(app: ReturnType<typeof createApp>, cookie: string) {
82
82
  return { org, project }
83
83
  }
84
84
 
85
+ test('publishes generator-ready OpenAPI contracts', async () => {
86
+ const app = createApp({ kv: { store: TestApp.kvStore() } })
87
+ const spec = await (await app.request('/openapi.json')).json()
88
+ const collection = spec.paths['/v1/orgs/{orgId}/projects/{projectId}/api-keys']
89
+ const detail = spec.paths['/v1/orgs/{orgId}/projects/{projectId}/api-keys/{keyId}']
90
+ const organization = spec.paths['/v1/orgs/{orgId}/api-keys']
91
+
92
+ expect({
93
+ components: [
94
+ 'ApiKey',
95
+ 'ApiKeyList',
96
+ 'CreateApiKeyRequest',
97
+ 'CreateApiKeyResponse',
98
+ 'RevokeApiKeyResponse',
99
+ 'UpdateApiKeyRequest',
100
+ ].filter((name) => spec.components.schemas[name]),
101
+ create: {
102
+ errors: {
103
+ 400: collection.post.responses[400].content['application/json'].schema,
104
+ 403: collection.post.responses[403].content['application/json'].schema,
105
+ 404: collection.post.responses[404].content['application/json'].schema,
106
+ },
107
+ operationId: collection.post.operationId,
108
+ request: collection.post.requestBody.content['application/json'].schema,
109
+ response: collection.post.responses[200].content['application/json'].schema,
110
+ },
111
+ listOrganization: {
112
+ errors: {
113
+ 400: organization.get.responses[400].content['application/json'].schema,
114
+ 403: organization.get.responses[403].content['application/json'].schema,
115
+ 404: organization.get.responses[404].content['application/json'].schema,
116
+ },
117
+ operationId: organization.get.operationId,
118
+ response: organization.get.responses[200].content['application/json'].schema,
119
+ },
120
+ listProject: {
121
+ errors: {
122
+ 400: collection.get.responses[400].content['application/json'].schema,
123
+ 403: collection.get.responses[403].content['application/json'].schema,
124
+ 404: collection.get.responses[404].content['application/json'].schema,
125
+ },
126
+ operationId: collection.get.operationId,
127
+ response: collection.get.responses[200].content['application/json'].schema,
128
+ },
129
+ revoke: {
130
+ errors: {
131
+ 400: detail.delete.responses[400].content['application/json'].schema,
132
+ 403: detail.delete.responses[403].content['application/json'].schema,
133
+ 404: detail.delete.responses[404].content['application/json'].schema,
134
+ },
135
+ operationId: detail.delete.operationId,
136
+ response: detail.delete.responses[200].content['application/json'].schema,
137
+ },
138
+ timestamps: {
139
+ createdAt: spec.components.schemas.ApiKey.properties.createdAt.format,
140
+ expiresAt: spec.components.schemas.ApiKey.properties.expiresAt.format,
141
+ lastUsedAt: spec.components.schemas.ApiKey.properties.lastUsedAt.format,
142
+ },
143
+ update: {
144
+ errors: {
145
+ 400: detail.patch.responses[400].content['application/json'].schema,
146
+ 403: detail.patch.responses[403].content['application/json'].schema,
147
+ 404: detail.patch.responses[404].content['application/json'].schema,
148
+ },
149
+ operationId: detail.patch.operationId,
150
+ request: detail.patch.requestBody.content['application/json'].schema,
151
+ response: detail.patch.responses[200].content['application/json'].schema,
152
+ },
153
+ }).toMatchInlineSnapshot(`
154
+ {
155
+ "components": [
156
+ "ApiKey",
157
+ "ApiKeyList",
158
+ "CreateApiKeyRequest",
159
+ "CreateApiKeyResponse",
160
+ "RevokeApiKeyResponse",
161
+ "UpdateApiKeyRequest",
162
+ ],
163
+ "create": {
164
+ "errors": {
165
+ "400": {
166
+ "$ref": "#/components/schemas/ApiKeyMalformedOrBodyInvalidOrParamInvalidError",
167
+ },
168
+ "403": {
169
+ "$ref": "#/components/schemas/ApiKeyForbiddenOrApiKeyIpForbiddenOrForbiddenOrScopeNotIssuableError",
170
+ },
171
+ "404": {
172
+ "$ref": "#/components/schemas/ApiKeysNotEnabledOrOrganizationNotFoundOrProjectNotFoundError",
173
+ },
174
+ },
175
+ "operationId": "createApiKey",
176
+ "request": {
177
+ "$ref": "#/components/schemas/CreateApiKeyRequest",
178
+ },
179
+ "response": {
180
+ "$ref": "#/components/schemas/CreateApiKeyResponse",
181
+ },
182
+ },
183
+ "listOrganization": {
184
+ "errors": {
185
+ "400": {
186
+ "$ref": "#/components/schemas/ApiKeyMalformedOrParamInvalidOrQueryInvalidError",
187
+ },
188
+ "403": {
189
+ "$ref": "#/components/schemas/ForbiddenError",
190
+ },
191
+ "404": {
192
+ "$ref": "#/components/schemas/ApiKeysNotEnabledOrOrganizationNotFoundError",
193
+ },
194
+ },
195
+ "operationId": "listOrgApiKeys",
196
+ "response": {
197
+ "$ref": "#/components/schemas/ApiKeyList",
198
+ },
199
+ },
200
+ "listProject": {
201
+ "errors": {
202
+ "400": {
203
+ "$ref": "#/components/schemas/ApiKeyMalformedOrParamInvalidOrQueryInvalidError",
204
+ },
205
+ "403": {
206
+ "$ref": "#/components/schemas/ForbiddenError",
207
+ },
208
+ "404": {
209
+ "$ref": "#/components/schemas/ApiKeysNotEnabledOrOrganizationNotFoundOrProjectNotFoundError",
210
+ },
211
+ },
212
+ "operationId": "listApiKeys",
213
+ "response": {
214
+ "$ref": "#/components/schemas/ApiKeyList",
215
+ },
216
+ },
217
+ "revoke": {
218
+ "errors": {
219
+ "400": {
220
+ "$ref": "#/components/schemas/ApiKeyMalformedOrParamInvalidError",
221
+ },
222
+ "403": {
223
+ "$ref": "#/components/schemas/ForbiddenError",
224
+ },
225
+ "404": {
226
+ "$ref": "#/components/schemas/ApiKeyNotFoundOrApiKeysNotEnabledOrOrganizationNotFoundOrProjectNotFoundError",
227
+ },
228
+ },
229
+ "operationId": "revokeApiKey",
230
+ "response": {
231
+ "$ref": "#/components/schemas/RevokeApiKeyResponse",
232
+ },
233
+ },
234
+ "timestamps": {
235
+ "createdAt": "date-time",
236
+ "expiresAt": "date-time",
237
+ "lastUsedAt": "date-time",
238
+ },
239
+ "update": {
240
+ "errors": {
241
+ "400": {
242
+ "$ref": "#/components/schemas/ApiKeyMalformedOrBodyInvalidOrParamInvalidError",
243
+ },
244
+ "403": {
245
+ "$ref": "#/components/schemas/ForbiddenError",
246
+ },
247
+ "404": {
248
+ "$ref": "#/components/schemas/ApiKeyNotFoundOrApiKeysNotEnabledOrOrganizationNotFoundOrProjectNotFoundError",
249
+ },
250
+ },
251
+ "operationId": "updateApiKey",
252
+ "request": {
253
+ "$ref": "#/components/schemas/UpdateApiKeyRequest",
254
+ },
255
+ "response": {
256
+ "$ref": "#/components/schemas/ApiKey",
257
+ },
258
+ },
259
+ }
260
+ `)
261
+ })
262
+
85
263
  describe('keys', () => {
86
264
  test('requires an owner to issue management write keys', async () => {
87
265
  const db = TestApp.database()