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
@@ -20,6 +20,15 @@ const input = {
20
20
  privateOutputTokens: [],
21
21
  slug: 'btpathusd-earn',
22
22
  vaultAddress,
23
+ zones: [],
24
+ } as const
25
+
26
+ const zoneInput = {
27
+ ...input,
28
+ label: 'Moderato Earn',
29
+ slug: 'moderato-earn',
30
+ vaultAddress: TestEarn.zoneVaultAddress,
31
+ zones: [TestEarn.zoneRoute],
23
32
  } as const
24
33
 
25
34
  describe('authentication', () => {
@@ -179,6 +188,140 @@ describe('putVerifiedEarnVault', () => {
179
188
  expect(await response.json()).toMatchObject({ error: { code: 'body_invalid' } })
180
189
  })
181
190
 
191
+ test.runIf(Runtime.get().mode === 'testnet')(
192
+ 'rejects duplicate Zone routes',
193
+ async () => {
194
+ const { app } = TestAdmin.setup({ zones: [TestEarn.zone] })
195
+ const response = await app.request('/earn/verified-vaults', {
196
+ body: JSON.stringify({
197
+ ...zoneInput,
198
+ zones: [TestEarn.zoneRoute, TestEarn.zoneRoute],
199
+ }),
200
+ headers: { 'content-type': 'application/json' },
201
+ method: 'PUT',
202
+ })
203
+ expect(response.status).toBe(400)
204
+ expect(await response.json()).toMatchObject({
205
+ error: {
206
+ code: 'body_invalid',
207
+ details: [{ message: 'Zone 1424310001 is configured more than once.' }],
208
+ },
209
+ })
210
+ },
211
+ 60_000,
212
+ )
213
+
214
+ test.runIf(Runtime.get().mode === 'testnet')(
215
+ 'rejects a router bound to a different vault',
216
+ async () => {
217
+ const { app } = TestAdmin.setup({ zones: [TestEarn.zone] })
218
+ const response = await app.request('/earn/verified-vaults', {
219
+ body: JSON.stringify({ ...zoneInput, vaultAddress }),
220
+ headers: { 'content-type': 'application/json' },
221
+ method: 'PUT',
222
+ })
223
+ expect(response.status).toBe(409)
224
+ expect(await response.json()).toEqual(
225
+ expect.objectContaining({
226
+ error: expect.objectContaining({
227
+ code: 'earn_vault_verification_failed',
228
+ details: expect.arrayContaining([
229
+ { message: 'Earn router is configured for a different Earn vault.' },
230
+ ]),
231
+ }),
232
+ }),
233
+ )
234
+ },
235
+ 60_000,
236
+ )
237
+
238
+ test.runIf(Runtime.get().mode === 'testnet')(
239
+ 'verifies, stores, and preserves a Zone route',
240
+ async () => {
241
+ const { app, db } = TestAdmin.setup({ zones: [TestEarn.zone] })
242
+ const response = await app.request('/earn/verified-vaults', {
243
+ body: JSON.stringify(zoneInput),
244
+ headers: { 'content-type': 'application/json' },
245
+ method: 'PUT',
246
+ })
247
+ expect(response.status).toBe(200)
248
+ const vault = await TestApp.json(response, App.schema.putVerifiedEarnVault.Response)
249
+ expect(vault.capabilities).toMatchObject({ privateRouting: true, routerSwaps: true })
250
+ expect(vault.zones).toHaveLength(1)
251
+ expect(vault.zones?.[0]).toMatchObject(TestEarn.zoneRoute)
252
+ expect(vault.zone).toStrictEqual(
253
+ vault.zones?.[0]
254
+ ? {
255
+ chainId: vault.zones[0].chainId,
256
+ inputTokens: vault.zones[0].inputTokens,
257
+ name: vault.zones[0].name,
258
+ outputTokens: vault.zones[0].outputTokens,
259
+ }
260
+ : null,
261
+ )
262
+ expect(vault.zones?.[0]?.inputTokens).toHaveLength(1)
263
+ expect(vault.zones?.[0]?.outputTokens).toStrictEqual(vault.zones?.[0]?.inputTokens)
264
+
265
+ const updatedResponse = await app.request('/earn/verified-vaults', {
266
+ body: JSON.stringify({
267
+ chainId: zoneInput.chainId,
268
+ label: 'Updated Moderato Earn',
269
+ vaultAddress: zoneInput.vaultAddress,
270
+ }),
271
+ headers: { 'content-type': 'application/json' },
272
+ method: 'PUT',
273
+ })
274
+ expect(updatedResponse.status).toBe(200)
275
+ expect(
276
+ (await TestApp.json(updatedResponse, App.schema.putVerifiedEarnVault.Response)).zones,
277
+ ).toStrictEqual(vault.zones)
278
+ expect(
279
+ await core_EarnVaults.get(db, {
280
+ chainId: zoneInput.chainId,
281
+ vaultAddress: zoneInput.vaultAddress,
282
+ }),
283
+ ).toMatchObject({ zones: [TestEarn.zoneRoute] })
284
+ },
285
+ 90_000,
286
+ )
287
+
288
+ test.runIf(Runtime.get().mode === 'testnet')(
289
+ 'migrates preserved private tokens to a verified Zone route',
290
+ async () => {
291
+ const { app, db } = TestAdmin.setup({ zones: [TestEarn.zone] })
292
+ await core_EarnVaults.upsert(db, {
293
+ ...TestEarn.zoneVerifiedVault,
294
+ privateInputTokens: [asset],
295
+ privateOutputTokens: [asset],
296
+ zones: [],
297
+ })
298
+ const response = await app.request('/earn/verified-vaults', {
299
+ body: JSON.stringify({
300
+ chainId: zoneInput.chainId,
301
+ vaultAddress: zoneInput.vaultAddress,
302
+ zones: zoneInput.zones,
303
+ }),
304
+ headers: { 'content-type': 'application/json' },
305
+ method: 'PUT',
306
+ })
307
+
308
+ expect(response.status).toBe(200)
309
+ const vault = await TestApp.json(response, App.schema.putVerifiedEarnVault.Response)
310
+ expect(vault.zones).toHaveLength(1)
311
+ expect(
312
+ await core_EarnVaults.get(db, {
313
+ chainId: zoneInput.chainId,
314
+ vaultAddress: zoneInput.vaultAddress,
315
+ }),
316
+ ).toMatchObject({
317
+ privateInputTokens: [asset],
318
+ privateOutputTokens: [asset],
319
+ zones: [TestEarn.zoneRoute],
320
+ })
321
+ },
322
+ 90_000,
323
+ )
324
+
182
325
  test.runIf(Runtime.get().mode === 'testnet')(
183
326
  'rejects private tokens without a configured router',
184
327
  async () => {
@@ -96,6 +96,9 @@ export namespace schema {
96
96
  z.describe('Earn vault contract address.'),
97
97
  z.meta({ examples: ['0xf4ae63687d6753a78e7f551d2eda1d0d31a5ea3a'] }),
98
98
  ),
99
+ zones: z
100
+ .optional(z.array(EarnVaults.schema.ZoneRoute))
101
+ .check(z.describe('Curated private Zone routes.')),
99
102
  })
100
103
  .check(z.describe('Curated fields used to verify and store one Earn vault.'))
101
104
 
@@ -240,11 +243,22 @@ export function earnVaults() {
240
243
  const privateInputTokens = input.privateInputTokens ?? existing?.privateInputTokens ?? []
241
244
  const privateOutputTokens =
242
245
  input.privateOutputTokens ?? existing?.privateOutputTokens ?? []
246
+ const zoneRoutes = input.zones ?? existing?.zones ?? []
243
247
  const hasPrivateInputs = privateInputTokens.length > 0
244
248
  const hasPrivateOutputs = privateOutputTokens.length > 0
245
249
  if (hasPrivateInputs !== hasPrivateOutputs)
246
250
  return verificationFailed(c, 'Private input and output tokens must both be configured.')
247
- if (hasPrivateInputs && !discovery.capabilities.privateRouting)
251
+ const resolvedZoneRoutes = await EarnVaults.resolveZoneRoutes({
252
+ discovery,
253
+ getClient: c.get('getClient'),
254
+ routes: zoneRoutes,
255
+ zones: c.get('zones'),
256
+ })
257
+ const capabilities =
258
+ resolvedZoneRoutes.length > 0
259
+ ? EarnVaults.addZoneRouteCapabilities(discovery.capabilities)
260
+ : discovery.capabilities
261
+ if (hasPrivateInputs && !capabilities.privateRouting)
248
262
  return verificationFailed(c, 'The chain does not support private Earn routing.')
249
263
 
250
264
  await core_EarnVaults.upsert(db, {
@@ -256,10 +270,11 @@ export function earnVaults() {
256
270
  privateOutputTokens,
257
271
  ...(input.slug !== undefined ? { slug: input.slug } : {}),
258
272
  vaultAddress: input.vaultAddress,
273
+ zones: zoneRoutes,
259
274
  })
260
275
  const data = await getVault(c, {
261
276
  chainId: input.chainId,
262
- include: ['access', 'capabilities', 'zone'],
277
+ include: ['access', 'capabilities', 'zone', 'zones'],
263
278
  vaultAddress: input.vaultAddress,
264
279
  })
265
280
  return c.json(Response.validated(schema.putVerifiedEarnVault.Response, data), 200)
@@ -326,13 +341,19 @@ async function listVerifiedVaults(
326
341
  const matches: listVerifiedVaults.Match[] = []
327
342
 
328
343
  for (const record of candidates) {
329
- const discovery = await resolveVault(c, {
344
+ const discovered = await resolveVault(c, {
330
345
  chainId: options.chainId,
331
346
  include: discoveryInclude(options),
332
347
  vaultAddress: record.vaultAddress,
333
348
  })
349
+ const { discovery, zoneRoutes } = await resolveVaultRoutes(c, {
350
+ capability: options.capability,
351
+ discovery: discovered,
352
+ include: options.include,
353
+ record,
354
+ })
334
355
  if (!Earn.matchesVaultFilters(discovery, options)) continue
335
- matches.push({ discovery, record })
356
+ matches.push({ discovery, record, zoneRoutes })
336
357
  if (matches.length > options.limit) break
337
358
  }
338
359
 
@@ -361,6 +382,8 @@ declare namespace listVerifiedVaults {
361
382
  discovery: EarnVaults.Discovery
362
383
  /** Curated registry row. */
363
384
  record: core_EarnVaults.Record
385
+ /** Verified private Zone routes selected for serialization. */
386
+ zoneRoutes: readonly EarnVaults.ResolvedZoneRoute[]
364
387
  }
365
388
 
366
389
  type Options = z.output<typeof schema.listVerifiedEarnVaults.Query> & {
@@ -373,14 +396,20 @@ async function getVault(c: Context<App.Environment>, options: getVault.Options)
373
396
  const db = Db.get(c.get('db'))
374
397
  const record = await core_EarnVaults.get(db, options)
375
398
  try {
376
- const [discovery, snapshot] = await Promise.all([
399
+ const [discovered, snapshot] = await Promise.all([
377
400
  resolveVault(c, {
378
401
  ...options,
379
402
  include: discoveryInclude({ capability: [], include: options.include }),
380
403
  }),
381
404
  VerifiedTokens.read(db, options.chainId),
382
405
  ])
383
- return serializeVault(c, { ...options, discovery, record, snapshot })
406
+ const { discovery, zoneRoutes } = await resolveVaultRoutes(c, {
407
+ capability: [],
408
+ discovery: discovered,
409
+ include: options.include,
410
+ record,
411
+ })
412
+ return serializeVault(c, { ...options, discovery, record, snapshot, zoneRoutes })
384
413
  } catch (cause) {
385
414
  if (Earn.isIncompatible(cause)) throw new Earn.NotFoundError()
386
415
  throw cause
@@ -421,6 +450,51 @@ declare namespace resolveVault {
421
450
  }
422
451
  }
423
452
 
453
+ async function resolveVaultRoutes(
454
+ c: Context<App.Environment>,
455
+ options: resolveVaultRoutes.Options,
456
+ ): Promise<resolveVaultRoutes.Result> {
457
+ const { discovery, record } = options
458
+ if (!record || record.zones.length === 0) return { discovery, zoneRoutes: [] }
459
+
460
+ const includesRoutes = options.include.includes('zone') || options.include.includes('zones')
461
+ const needsCapabilities =
462
+ options.include.includes('capabilities') ||
463
+ options.capability.includes('privateRouting') ||
464
+ options.capability.includes('routerSwaps')
465
+ if (!includesRoutes && !needsCapabilities) return { discovery, zoneRoutes: [] }
466
+
467
+ const zoneRoutes = await EarnVaults.resolveZoneRoutes({
468
+ discovery,
469
+ getClient: c.get('getClient'),
470
+ routes: record.zones,
471
+ zones: c.get('zones'),
472
+ })
473
+ const capabilities = discovery.capabilities
474
+ if (needsCapabilities && !capabilities)
475
+ throw new Error('Earn vault capabilities were not resolved.')
476
+ return {
477
+ discovery: capabilities
478
+ ? { ...discovery, capabilities: EarnVaults.addZoneRouteCapabilities(capabilities) }
479
+ : discovery,
480
+ zoneRoutes: includesRoutes ? zoneRoutes : [],
481
+ }
482
+ }
483
+
484
+ declare namespace resolveVaultRoutes {
485
+ type Options = {
486
+ capability: z.output<typeof schema.listVerifiedEarnVaults.Query>['capability']
487
+ discovery: EarnVaults.Discovery
488
+ include: z.output<typeof schema.getVerifiedEarnVault.Query>['include']
489
+ record?: core_EarnVaults.Record | undefined
490
+ }
491
+
492
+ type Result = {
493
+ discovery: EarnVaults.Discovery
494
+ zoneRoutes: readonly EarnVaults.ResolvedZoneRoute[]
495
+ }
496
+ }
497
+
424
498
  async function serializeVault(
425
499
  c: Context<App.Environment>,
426
500
  options: serializeVault.Options,
@@ -439,6 +513,7 @@ async function serializeVault(
439
513
  record: options.record,
440
514
  shareToken,
441
515
  tvl: null,
516
+ zoneRoutes: options.zoneRoutes,
442
517
  zones: c.get('zones'),
443
518
  })
444
519
  }
@@ -455,6 +530,8 @@ declare namespace serializeVault {
455
530
  record?: core_EarnVaults.Record | undefined
456
531
  /** Verified-token snapshot, when configured. */
457
532
  snapshot: VerifiedTokens.Snapshot | null
533
+ /** Verified private Zone routes selected for serialization. */
534
+ zoneRoutes: readonly EarnVaults.ResolvedZoneRoute[]
458
535
  }
459
536
  }
460
537
 
@@ -504,11 +504,15 @@ export namespace schema {
504
504
  .check(
505
505
  z.int(),
506
506
  z.nonnegative(),
507
- z.describe('Consecutive delivery failures.'),
507
+ z.describe('Consecutive delivery failures, capped at the auto-disable threshold.'),
508
508
  z.meta({ examples: [2] }),
509
509
  ),
510
510
  id: z.string().check(z.describe('Subscription id.'), z.meta({ examples: ['wh_123'] })),
511
- lastDeliveryAt: z.nullable(timestamp).check(z.describe('Last successful delivery, or null.')),
511
+ lastDeliveryAt: z
512
+ .nullable(timestamp)
513
+ .check(
514
+ z.describe('Last successful delivery (refreshed at most once per minute), or null.'),
515
+ ),
512
516
  status: z
513
517
  .enum(['active', 'disabled', 'paused'])
514
518
  .check(z.describe('Subscription status.'), z.meta({ examples: ['active'] })),
@@ -59,6 +59,14 @@ function RouteComponent() {
59
59
  alert('Enter a name that identifies what uses this key.')
60
60
  return
61
61
  }
62
+ const allowedIps = [
63
+ ...new Set(
64
+ field('allowedIps')
65
+ .split(/[,\n]/)
66
+ .map((value) => value.trim())
67
+ .filter(Boolean),
68
+ ),
69
+ ]
62
70
  const expiresAt_value = field('expiresAt')
63
71
  const expiresAt = expiresAt_value ? new Date(expiresAt_value).toISOString() : undefined
64
72
  const orgId = filters.orgId ?? field('orgId')
@@ -88,6 +96,7 @@ function RouteComponent() {
88
96
  }
89
97
  provision.mutate(
90
98
  {
99
+ allowedIps,
91
100
  environment,
92
101
  ...(expiresAt === undefined ? {} : { expiresAt }),
93
102
  name,
@@ -309,6 +318,19 @@ function ProvisionForm(props: {
309
318
  suffix="req/min"
310
319
  type="number"
311
320
  />
321
+ <label className="flex min-w-0 flex-col gap-2">
322
+ <span className="text-label-13 text-foreground-secondary">IP allowlist (optional)</span>
323
+ <textarea
324
+ className="min-h-24 w-full resize-y rounded-body border-2 border-transparent bg-secondary px-3 py-2.5 font-mono text-copy-13 text-foreground outline-none placeholder:font-sans placeholder:text-foreground-secondary/50 hover:bg-secondary-hover focus-visible:border-focus focus-visible:bg-secondary-hover"
325
+ name="allowedIps"
326
+ placeholder={'203.0.113.10\n198.51.100.0/24'}
327
+ rows={4}
328
+ />
329
+ <span className="text-label-12 text-foreground-secondary">
330
+ Separate exact IP addresses or CIDR ranges with commas or new lines. Leave empty for
331
+ unrestricted access.
332
+ </span>
333
+ </label>
312
334
  <div className="flex flex-col gap-2">
313
335
  <span className="label-13 text-foreground-secondary">Scopes</span>
314
336
  {scopes.isPending ? (
@@ -681,6 +703,19 @@ function KeyRow(props: { currentUser?: string | undefined; record: ApiKeys.ApiKe
681
703
  {record.expiresAt ? (
682
704
  <Detail label="Expires">{Format.date(record.expiresAt)}</Detail>
683
705
  ) : null}
706
+ <Detail className="w-full" label="IP allowlist">
707
+ {record.allowedIps.length === 0 ? (
708
+ 'Unrestricted'
709
+ ) : (
710
+ <span className="flex flex-wrap gap-x-3 gap-y-1 font-mono">
711
+ {record.allowedIps.map((address) => (
712
+ <span className="break-all" key={address}>
713
+ {address}
714
+ </span>
715
+ ))}
716
+ </span>
717
+ )}
718
+ </Detail>
684
719
  <Detail className="w-full" label="Scopes">
685
720
  {record.scopes.length === 0 ? (
686
721
  '—'
@@ -893,6 +928,7 @@ function matches(record: ApiKeys.ApiKey, query?: string) {
893
928
  record.projectId,
894
929
  record.projectName,
895
930
  record.tokenLast4,
931
+ ...record.allowedIps,
896
932
  ...record.scopes,
897
933
  ].some((value) => value?.toLowerCase().includes(normalized))
898
934
  }