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
@@ -6,7 +6,9 @@ import * as FundingDepositRequestObservations from '../../db/tables/fundingDepos
6
6
  import * as FundingDeposits from '../../db/tables/fundingDeposits.js'
7
7
  import type * as Metrics from '../../Metrics.js'
8
8
  import * as Value from '../Value.js'
9
+ import type * as Webhooks from '../Webhooks.js'
9
10
  import * as Deposit from './Deposit.js'
11
+ import * as DepositWebhook from './DepositWebhook.js'
10
12
  import * as Provider from './Provider.js'
11
13
  import * as Subsidy from './Subsidy.js'
12
14
 
@@ -119,6 +121,17 @@ export function createTracker(options: createTracker.Options): createTracker.Tra
119
121
  })()
120
122
  heartbeat.assert()
121
123
  let created = 0
124
+ const depositWebhookReferences = new Map<string, Webhooks.QueueReference>()
125
+ const onDeposit: NonNullable<reconcileRequest.Options['onDeposit']> = (
126
+ _deposit,
127
+ references,
128
+ ) => {
129
+ for (const reference of references)
130
+ depositWebhookReferences.set(
131
+ `${reference.subscriptionId}:${reference.eventId}`,
132
+ reference,
133
+ )
134
+ }
122
135
  let updated = 0
123
136
  const pendingRequestIds = new Set([
124
137
  ...requests.pendingRequestIds,
@@ -129,6 +142,7 @@ export function createTracker(options: createTracker.Options): createTracker.Tra
129
142
  const result = await reconcileRequest(database, {
130
143
  address: claimed,
131
144
  metrics: options.metrics,
145
+ onDeposit,
132
146
  provider,
133
147
  request,
134
148
  signal: options.signal,
@@ -148,6 +162,7 @@ export function createTracker(options: createTracker.Options): createTracker.Tra
148
162
  const unattributed = await reconcileUnattributed(database, {
149
163
  address: claimed,
150
164
  metrics: options.metrics,
165
+ onDeposit,
151
166
  provider,
152
167
  signal: options.signal,
153
168
  subsidies: options.subsidies,
@@ -166,6 +181,24 @@ export function createTracker(options: createTracker.Options): createTracker.Tra
166
181
  trigger,
167
182
  })
168
183
 
184
+ if (options.dispatchDepositUpdates && depositWebhookReferences.size > 0) {
185
+ const references = [...depositWebhookReferences.values()]
186
+ await options.dispatchDepositUpdates(references).then(
187
+ (count) =>
188
+ options.metrics?.count('funding_deposit_webhook_enqueue_count', count, {
189
+ outcome: 'succeeded',
190
+ provider: claimed.providerId,
191
+ }),
192
+ (cause) => {
193
+ options.metrics?.count('funding_deposit_webhook_enqueue_count', references.length, {
194
+ outcome: 'failed',
195
+ provider: claimed.providerId,
196
+ })
197
+ throw cause
198
+ },
199
+ )
200
+ }
201
+
169
202
  const leaseFailure = await heartbeat.stop()
170
203
  if (leaseFailure !== undefined) throw leaseFailure
171
204
  const completedAt = now()
@@ -295,6 +328,10 @@ export declare namespace createTracker {
295
328
  message: Provider.Webhook.receive.Dispatchable,
296
329
  options?: createTracker.DispatchOptions,
297
330
  ) => Promise<void>
331
+ /** Stages and dispatches committed funding deposit webhook updates. */
332
+ dispatchDepositUpdates?:
333
+ | ((references: readonly Webhooks.QueueReference[]) => Promise<number>)
334
+ | undefined
298
335
  /** Duration of one reconciliation lease. */
299
336
  leaseMs?: number | undefined
300
337
  /** Optional bounded operational metrics sink. */
@@ -589,6 +626,7 @@ type VerifiedDeposit = {
589
626
  type ReconcileDeliveryOptions = {
590
627
  address: FundingDepositAddresses.Record
591
628
  metrics?: Metrics.Metrics | undefined
629
+ onDeposit?: reconcileRequest.Options['onDeposit'] | undefined
592
630
  provider?: Provider.Provider | undefined
593
631
  request?: Provider.listDepositAddressRequests.ReturnType['requests'][number] | undefined
594
632
  signal?: AbortSignal | undefined
@@ -690,7 +728,11 @@ async function reconcileUnattributed(db: Db.Db, options: reconcileUnattributed.O
690
728
  if (!delivery.terminal) terminal = false
691
729
  for (const id of delivery.updatedIds) updatedIds.add(id)
692
730
  }
693
- return { ...(followUp ? { followUp } : {}), terminal, updatedIds }
731
+ return {
732
+ ...(followUp ? { followUp } : {}),
733
+ terminal,
734
+ updatedIds,
735
+ }
694
736
  }
695
737
 
696
738
  declare namespace reconcileUnattributed {
@@ -843,21 +885,25 @@ export async function reconcileRequest(
843
885
  deposit.providerRequestId === null ||
844
886
  !deposit.providerRequestIds.includes(options.request.id)
845
887
  ) {
846
- const result = await Deposit.transition(db, {
847
- expectedVersion: deposit.version,
848
- id: deposit.id,
849
- providerRequestId: options.request.id,
850
- providerRequestIds: unique([...deposit.providerRequestIds, options.request.id]),
851
- providerTransferIndex,
852
- snapshot: {
853
- ...deposit.snapshot,
854
- ...(options.address.snapshot.subsidize ? { destinationAmountRequired } : {}),
855
- ...(transfer.sender ? { sender: transfer.sender } : {}),
856
- sourceAmount,
888
+ const result = await transitionDeposit(
889
+ db,
890
+ {
891
+ expectedVersion: deposit.version,
892
+ id: deposit.id,
893
+ providerRequestId: options.request.id,
894
+ providerRequestIds: unique([...deposit.providerRequestIds, options.request.id]),
895
+ providerTransferIndex,
896
+ snapshot: {
897
+ ...deposit.snapshot,
898
+ ...(options.address.snapshot.subsidize ? { destinationAmountRequired } : {}),
899
+ ...(transfer.sender ? { sender: transfer.sender } : {}),
900
+ sourceAmount,
901
+ },
902
+ sourceTransferIndex: transfer.transferIndex,
903
+ status: deposit.status === 'detected' ? 'bridging' : deposit.status,
857
904
  },
858
- sourceTransferIndex: transfer.transferIndex,
859
- status: deposit.status === 'detected' ? 'bridging' : deposit.status,
860
- })
905
+ options.onDeposit,
906
+ )
861
907
  if (result.type === 'applied') {
862
908
  deposit = result.record
863
909
  updatedIds.add(deposit.id)
@@ -867,7 +913,9 @@ export async function reconcileRequest(
867
913
  }
868
914
  }
869
915
  if (verified.length === 0) return { created, terminal: false, updated: updatedIds.size }
870
- if (!sourceEvidenceComplete) return { created, terminal: false, updated: updatedIds.size }
916
+ if (!sourceEvidenceComplete) {
917
+ return { created, terminal: false, updated: updatedIds.size }
918
+ }
871
919
  const recovery = await reconcileProviderRecovery(db, { ...options, verified })
872
920
  if (recovery) {
873
921
  for (const id of recovery.updatedIds) updatedIds.add(id)
@@ -895,6 +943,10 @@ export declare namespace reconcileRequest {
895
943
  address: FundingDepositAddresses.Record
896
944
  /** Optional bounded operational metrics sink. */
897
945
  metrics?: Metrics.Metrics | undefined
946
+ /** Observes the latest committed form of each verified deposit. */
947
+ onDeposit?:
948
+ | ((deposit: FundingDeposits.Record, references: readonly Webhooks.QueueReference[]) => void)
949
+ | undefined
898
950
  /** Provider integration that discovered the request. */
899
951
  provider?: Provider.Provider | undefined
900
952
  /** Provider request containing discovered chain transactions. */
@@ -922,6 +974,17 @@ export declare namespace reconcileRequest {
922
974
  }
923
975
  }
924
976
 
977
+ async function transitionDeposit(
978
+ db: Db.Db,
979
+ options: Deposit.transition.Options,
980
+ onDeposit: reconcileRequest.Options['onDeposit'],
981
+ ): Promise<Deposit.transition.Result> {
982
+ const committed = await DepositWebhook.transition(db, options)
983
+ if (committed.result.type === 'applied')
984
+ onDeposit?.(committed.result.record, committed.references)
985
+ return committed.result
986
+ }
987
+
925
988
  async function reconcileProviderRecovery(db: Db.Db, options: ReconcileDeliveryOptions) {
926
989
  const failed = (providerFailureStatuses as readonly string[]).includes(
927
990
  options.request?.status ?? '',
@@ -991,15 +1054,19 @@ async function reconcileProviderRecovery(db: Db.Db, options: ReconcileDeliveryOp
991
1054
  if (Deposit.isTerminal(entry.deposit.status)) continue
992
1055
  let deposit = entry.deposit
993
1056
  if (deposit.status !== 'refunding') {
994
- const result = await Deposit.transition(db, {
995
- expectedVersion: deposit.version,
996
- id: deposit.id,
997
- providerTransactionHashes: unique([
998
- ...deposit.providerTransactionHashes,
999
- ...providerRefundTransactionHashes,
1000
- ]),
1001
- status: 'refunding',
1002
- })
1057
+ const result = await transitionDeposit(
1058
+ db,
1059
+ {
1060
+ expectedVersion: deposit.version,
1061
+ id: deposit.id,
1062
+ providerTransactionHashes: unique([
1063
+ ...deposit.providerTransactionHashes,
1064
+ ...providerRefundTransactionHashes,
1065
+ ]),
1066
+ status: 'refunding',
1067
+ },
1068
+ options.onDeposit,
1069
+ )
1003
1070
  if (result.type === 'applied') {
1004
1071
  deposit = result.record
1005
1072
  updatedIds.add(deposit.id)
@@ -1011,20 +1078,24 @@ async function reconcileProviderRecovery(db: Db.Db, options: ReconcileDeliveryOp
1011
1078
  terminal = false
1012
1079
  continue
1013
1080
  }
1014
- const result = await Deposit.transition(db, {
1015
- expectedVersion: deposit.version,
1016
- id: deposit.id,
1017
- snapshot: {
1018
- ...deposit.snapshot,
1019
- refundAmount: Value.tokenAmount({
1020
- baseUnits: amount,
1021
- currency: options.address.snapshot.sourceToken.currency,
1022
- decimals: options.address.snapshot.sourceToken.decimals,
1023
- }),
1024
- refundTransactionHashes,
1081
+ const result = await transitionDeposit(
1082
+ db,
1083
+ {
1084
+ expectedVersion: deposit.version,
1085
+ id: deposit.id,
1086
+ snapshot: {
1087
+ ...deposit.snapshot,
1088
+ refundAmount: Value.tokenAmount({
1089
+ baseUnits: amount,
1090
+ currency: options.address.snapshot.sourceToken.currency,
1091
+ decimals: options.address.snapshot.sourceToken.decimals,
1092
+ }),
1093
+ refundTransactionHashes,
1094
+ },
1095
+ status: 'refunded',
1025
1096
  },
1026
- status: 'refunded',
1027
- })
1097
+ options.onDeposit,
1098
+ )
1028
1099
  if (result.type === 'applied') updatedIds.add(deposit.id)
1029
1100
  else if (result.type !== 'stale' || !Deposit.isTerminal(result.current.status)) terminal = false
1030
1101
  }
@@ -1116,57 +1187,61 @@ async function reconcileDelivery(db: Db.Db, options: ReconcileDeliveryOptions) {
1116
1187
  currency: options.address.snapshot.destinationToken.currency,
1117
1188
  decimals: options.address.snapshot.destinationToken.decimals,
1118
1189
  })
1119
- const result = await Deposit.transition(db, {
1120
- expectedVersion: deposit.version,
1121
- id: deposit.id,
1122
- ...(delivered > 0n
1123
- ? {
1124
- providerOutputAmount: Value.tokenAmount({
1125
- baseUnits: delivered,
1126
- currency: options.address.providerOutputToken.currency,
1127
- decimals: options.address.providerOutputToken.decimals,
1128
- }),
1129
- }
1130
- : {}),
1131
- providerRequestIds: options.request
1132
- ? unique([...deposit.providerRequestIds, options.request.id])
1133
- : deposit.providerRequestIds,
1134
- ...(deliveryObservation?.providerState
1135
- ? {
1136
- providerState: {
1137
- ...deposit.providerState,
1138
- ...deliveryObservation.providerState,
1139
- },
1140
- }
1141
- : {}),
1142
- providerTransactionHashes: unique([
1143
- ...deposit.providerTransactionHashes,
1144
- ...providerTransactionHashes,
1145
- ...(deliveryObservation?.providerTransactionHashes ?? []),
1146
- ]),
1147
- ...(settlement.settlementTransaction
1148
- ? { settlementTransaction: settlement.settlementTransaction }
1149
- : {}),
1150
- ...(settlement.settlementTransactionHash
1151
- ? { settlementTransactionHash: settlement.settlementTransactionHash }
1152
- : {}),
1153
- snapshot: {
1154
- ...deposit.snapshot,
1155
- ...(delivered + settlement.delivered > 0n ? { destinationAmount } : {}),
1156
- ...(settlement.status === 'completed' && !options.address.snapshot.subsidize
1157
- ? { destinationAmountRequired: destinationAmount }
1190
+ const result = await transitionDeposit(
1191
+ db,
1192
+ {
1193
+ expectedVersion: deposit.version,
1194
+ id: deposit.id,
1195
+ ...(delivered > 0n
1196
+ ? {
1197
+ providerOutputAmount: Value.tokenAmount({
1198
+ baseUnits: delivered,
1199
+ currency: options.address.providerOutputToken.currency,
1200
+ decimals: options.address.providerOutputToken.decimals,
1201
+ }),
1202
+ }
1203
+ : {}),
1204
+ providerRequestIds: options.request
1205
+ ? unique([...deposit.providerRequestIds, options.request.id])
1206
+ : deposit.providerRequestIds,
1207
+ ...(deliveryObservation?.providerState
1208
+ ? {
1209
+ providerState: {
1210
+ ...deposit.providerState,
1211
+ ...deliveryObservation.providerState,
1212
+ },
1213
+ }
1158
1214
  : {}),
1159
- destinationTransactionHashes: unique([
1160
- ...(deposit.snapshot.destinationTransactionHashes ?? []),
1161
- ...destinationTransfers.map((evidence) => evidence.transactionHash),
1162
- ...settlement.destinationTransactionHashes,
1215
+ providerTransactionHashes: unique([
1216
+ ...deposit.providerTransactionHashes,
1217
+ ...providerTransactionHashes,
1218
+ ...(deliveryObservation?.providerTransactionHashes ?? []),
1163
1219
  ]),
1220
+ ...(settlement.settlementTransaction
1221
+ ? { settlementTransaction: settlement.settlementTransaction }
1222
+ : {}),
1223
+ ...(settlement.settlementTransactionHash
1224
+ ? { settlementTransactionHash: settlement.settlementTransactionHash }
1225
+ : {}),
1226
+ snapshot: {
1227
+ ...deposit.snapshot,
1228
+ ...(delivered + settlement.delivered > 0n ? { destinationAmount } : {}),
1229
+ ...(settlement.status === 'completed' && !options.address.snapshot.subsidize
1230
+ ? { destinationAmountRequired: destinationAmount }
1231
+ : {}),
1232
+ destinationTransactionHashes: unique([
1233
+ ...(deposit.snapshot.destinationTransactionHashes ?? []),
1234
+ ...destinationTransfers.map((evidence) => evidence.transactionHash),
1235
+ ...settlement.destinationTransactionHashes,
1236
+ ]),
1237
+ },
1238
+ status: settlement.status,
1239
+ ...(settlement.statusReason ? { statusReason: settlement.statusReason } : {}),
1240
+ ...(settlement.subsidyAmount ? { subsidyAmount: settlement.subsidyAmount } : {}),
1241
+ ...(settlement.tempoGasPaid ? { tempoGasPaid: settlement.tempoGasPaid } : {}),
1164
1242
  },
1165
- status: settlement.status,
1166
- ...(settlement.statusReason ? { statusReason: settlement.statusReason } : {}),
1167
- ...(settlement.subsidyAmount ? { subsidyAmount: settlement.subsidyAmount } : {}),
1168
- ...(settlement.tempoGasPaid ? { tempoGasPaid: settlement.tempoGasPaid } : {}),
1169
- })
1243
+ options.onDeposit,
1244
+ )
1170
1245
  if (result.type === 'applied') {
1171
1246
  updatedIds.add(deposit.id)
1172
1247
  if (settlement.broadcast && options.subsidies) {
@@ -8,6 +8,7 @@ test('exports funding modules', () => {
8
8
  "Catalog",
9
9
  "Deposit",
10
10
  "DepositAddress",
11
+ "DepositWebhook",
11
12
  "Evidence",
12
13
  "Provider",
13
14
  "Reconciliation",
@@ -3,6 +3,7 @@ export * as Chain from './Chain.js'
3
3
  export * as Catalog from './Catalog.js'
4
4
  export * as Deposit from './Deposit.js'
5
5
  export * as DepositAddress from './DepositAddress.js'
6
+ export * as DepositWebhook from './DepositWebhook.js'
6
7
  export * as Evidence from './Evidence.js'
7
8
  export * as Provider from './Provider.js'
8
9
  export * as Reconciliation from './Reconciliation.js'
@@ -4,6 +4,7 @@ import * as Across from './across.js'
4
4
  import * as Relay from './relay.js'
5
5
  import * as Rhino from './rhino.js'
6
6
  import * as Squid from './squid.js'
7
+ import * as Stargate from './stargate.js'
7
8
  import * as Symbiosis from './symbiosis.js'
8
9
 
9
10
  const now = () => new Date('2026-01-01T00:00:00.000Z')
@@ -21,6 +22,10 @@ const providers = [
21
22
  integratorId: 'squid-integrator-id',
22
23
  userAddress: '0x1111111111111111111111111111111111111111',
23
24
  }),
25
+ Stargate.stargate({
26
+ apiKey: 'layerzero-api-key',
27
+ userAddress: '0x1111111111111111111111111111111111111111',
28
+ }),
24
29
  Symbiosis.symbiosis({ userAddress: '0x1111111111111111111111111111111111111111' }),
25
30
  ] as const
26
31
 
@@ -335,6 +340,126 @@ describe('funding providers', () => {
335
340
  })
336
341
  })
337
342
 
343
+ test('maps the best Stargate quote to an available quote result', async () => {
344
+ const requests: RecordedRequest[] = []
345
+ const candidate = quoteCandidate('stargate')
346
+ const fetch = recordingFetch(requests, async () => jsonResponse(stargateQuotes(candidate)))
347
+ const provider = Stargate.stargate({
348
+ apiKey: 'layerzero-api-key',
349
+ baseUrl: 'https://layerzero.test/v1/',
350
+ fetch,
351
+ now,
352
+ userAddress: '0x1111111111111111111111111111111111111111',
353
+ })
354
+
355
+ const result = await provider.getQuote(getQuoteInput(candidate), new AbortController().signal)
356
+
357
+ expect(requests).toHaveLength(1)
358
+ expect(requests[0]?.url.pathname).toBe('/v1/quotes')
359
+ expect(new Headers(requests[0]?.init?.headers).get('user-agent')).toBe('tempo-api')
360
+ expect(new Headers(requests[0]?.init?.headers).get('x-api-key')).toBe('layerzero-api-key')
361
+ expect(jsonRequestBody(requests[0])).toEqual({
362
+ amount: '1000000',
363
+ dstChainKey: 'tempo',
364
+ dstTokenAddress: candidate.destinationToken.address,
365
+ dstWalletAddress: '0x1111111111111111111111111111111111111111',
366
+ options: { amountType: 'EXACT_SRC_AMOUNT' },
367
+ srcChainKey: 'base',
368
+ srcTokenAddress: candidate.sourceToken.address,
369
+ srcWalletAddress: '0x1111111111111111111111111111111111111111',
370
+ })
371
+ expect(result).toEqual({
372
+ expiresAt: '2026-01-01T00:01:00.000Z',
373
+ destinationAmountMin: '999100',
374
+ destinationAmount: '999600',
375
+ quality: {
376
+ estimatedSeconds: 259,
377
+ liquiditySource: 'providerQuote',
378
+ sourceDetail: 'stargate:value-transfer-v1:bus',
379
+ tier: 'liquid',
380
+ },
381
+ sampledAt: '2026-01-01T00:00:00.000Z',
382
+ status: 'available',
383
+ })
384
+ })
385
+
386
+ test('skips expired Stargate alternatives', async () => {
387
+ const candidate = quoteCandidate('stargate')
388
+ const response = stargateQuotes(candidate)
389
+ response.quotes[2]!.expiresAt = '2026-01-01T00:00:00.000Z'
390
+ const provider = Stargate.stargate({
391
+ apiKey: 'layerzero-api-key',
392
+ fetch: recordingFetch([], async () => jsonResponse(response)),
393
+ now,
394
+ userAddress: '0x1111111111111111111111111111111111111111',
395
+ })
396
+
397
+ await expect(
398
+ provider.getQuote(getQuoteInput(candidate), new AbortController().signal),
399
+ ).resolves.toMatchObject({
400
+ destinationAmountMin: '999000',
401
+ destinationAmount: '999500',
402
+ quality: {
403
+ sourceDetail: 'stargate:value-transfer-v1:taxi',
404
+ tier: 'liquid',
405
+ },
406
+ status: 'available',
407
+ })
408
+ })
409
+
410
+ test('exposes Base and Ethereum Stargate quote candidates', () => {
411
+ expect(
412
+ ['base', 'ethereum'].map((sourceChain) => quoteCandidate('stargate', { sourceChain }).id),
413
+ ).toEqual(['base-usdc-tempo-usdce-stargate', 'ethereum-usdc-tempo-usdce-stargate'])
414
+ })
415
+
416
+ test('maps responses without Stargate routes to unavailable quote results', async () => {
417
+ const candidate = quoteCandidate('stargate')
418
+ const response = stargateQuotes(candidate)
419
+ response.quotes = response.quotes.filter((quote) => quote.routeSteps[0]?.type === 'CCTP')
420
+ const provider = Stargate.stargate({
421
+ apiKey: 'layerzero-api-key',
422
+ fetch: recordingFetch([], async () => jsonResponse(response)),
423
+ now,
424
+ userAddress: '0x1111111111111111111111111111111111111111',
425
+ })
426
+
427
+ await expect(
428
+ provider.getQuote(getQuoteInput(candidate), new AbortController().signal),
429
+ ).resolves.toMatchObject({
430
+ quality: {
431
+ sourceDetail: 'stargate:value-transfer-v1:NO_STARGATE_ROUTE',
432
+ tier: 'unavailable',
433
+ },
434
+ status: 'unavailable',
435
+ })
436
+ })
437
+
438
+ test('rejects malformed Stargate quotes', async () => {
439
+ const candidate = quoteCandidate('stargate')
440
+ const response = stargateQuotes(candidate)
441
+ response.quotes[2]!.srcAmount = '1'
442
+ const provider = Stargate.stargate({
443
+ apiKey: 'layerzero-api-key',
444
+ fetch: recordingFetch([], async () => jsonResponse(response)),
445
+ now,
446
+ userAddress: '0x1111111111111111111111111111111111111111',
447
+ })
448
+
449
+ await expect(
450
+ provider.getQuote(getQuoteInput(candidate), new AbortController().signal),
451
+ ).rejects.toThrowErrorMatchingInlineSnapshot(`[FundingProvider.ProviderPayloadError]`)
452
+ })
453
+
454
+ test('rejects invalid Stargate configuration', () => {
455
+ expect(() =>
456
+ Stargate.stargate({
457
+ apiKey: '',
458
+ userAddress: '0x1111111111111111111111111111111111111111',
459
+ }),
460
+ ).toThrowErrorMatchingInlineSnapshot(`[FundingProvider.ProviderConfigurationError]`)
461
+ })
462
+
338
463
  test('maps successful Symbiosis quotes to available quote results', async () => {
339
464
  const requests: RecordedRequest[] = []
340
465
  const candidate = quoteCandidate('symbiosis')
@@ -961,6 +1086,32 @@ describe('funding providers', () => {
961
1086
  })
962
1087
  })
963
1088
 
1089
+ test('returns bounded Stargate failure diagnostics', async () => {
1090
+ const candidate = quoteCandidate('stargate')
1091
+ const provider = Stargate.stargate({
1092
+ apiKey: 'layerzero-api-key',
1093
+ fetch: recordingFetch([], async () => jsonResponse({ message: 'Unauthorized' }, 401)),
1094
+ now,
1095
+ userAddress: '0x1111111111111111111111111111111111111111',
1096
+ })
1097
+ const cause = await provider
1098
+ .getQuote(getQuoteInput(candidate), new AbortController().signal)
1099
+ .catch((error: unknown) => error)
1100
+
1101
+ expect(
1102
+ FundingProvider.failure({
1103
+ cause,
1104
+ operation: 'getQuote',
1105
+ provider: getProvider('stargate'),
1106
+ }),
1107
+ ).toEqual({
1108
+ failure: 'http',
1109
+ id: 'stargate',
1110
+ operation: 'getQuote',
1111
+ status: 401,
1112
+ })
1113
+ })
1114
+
964
1115
  test('returns bounded Symbiosis failure diagnostics', () => {
965
1116
  expect(
966
1117
  FundingProvider.failure({
@@ -1059,6 +1210,40 @@ function squidQuote(candidate: FundingProvider.getQuote.Parameters['candidate'])
1059
1210
  }
1060
1211
  }
1061
1212
 
1213
+ function stargateQuotes(candidate: FundingProvider.getQuote.Parameters['candidate']) {
1214
+ return {
1215
+ error: null,
1216
+ quotes: [
1217
+ {
1218
+ dstAmount: '999900',
1219
+ dstAmountMin: '999800',
1220
+ duration: { estimated: '10000' },
1221
+ id: 'quote-cctp',
1222
+ routeSteps: [{ srcChainKey: 'base', type: 'CCTP' }],
1223
+ srcAmount: candidate.sourceAmount.amount,
1224
+ },
1225
+ {
1226
+ dstAmount: '999500',
1227
+ dstAmountMin: '999000',
1228
+ duration: { estimated: '27600' },
1229
+ expiresAt: '2026-01-01T00:01:00.000Z',
1230
+ id: 'quote-stargate-taxi',
1231
+ routeSteps: [{ srcChainKey: 'base', type: 'STARGATE_V2_TAXI' }],
1232
+ srcAmount: candidate.sourceAmount.amount,
1233
+ },
1234
+ {
1235
+ dstAmount: '999600',
1236
+ dstAmountMin: '999100',
1237
+ duration: { estimated: '258899.99999999997' },
1238
+ expiresAt: '2026-01-01T00:01:00.000Z',
1239
+ id: 'quote-stargate-bus',
1240
+ routeSteps: [{ srcChainKey: 'base', type: 'STARGATE_V2_BUS' }],
1241
+ srcAmount: candidate.sourceAmount.amount,
1242
+ },
1243
+ ],
1244
+ }
1245
+ }
1246
+
1062
1247
  function symbiosisQuote(candidate: FundingProvider.getQuote.Parameters['candidate']) {
1063
1248
  const source =
1064
1249
  candidate.sourceChain.kind === 'tron'