tapimo 0.11.0 → 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 (339) hide show
  1. package/dist/App.d.ts +2296 -1010
  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/admin/App.d.ts +53 -4
  10. package/dist/admin/App.d.ts.map +1 -1
  11. package/dist/admin/apps/api-keys.d.ts +4 -4
  12. package/dist/admin/apps/earn-vaults.d.ts +114 -0
  13. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  14. package/dist/admin/apps/earn-vaults.js +59 -6
  15. package/dist/admin/apps/earn-vaults.js.map +1 -1
  16. package/dist/admin/apps/organizations.d.ts.map +1 -1
  17. package/dist/admin/apps/organizations.js +4 -2
  18. package/dist/admin/apps/organizations.js.map +1 -1
  19. package/dist/admin/apps/verified-tokens.d.ts +9 -9
  20. package/dist/admin/ui.generated.d.ts +1 -1
  21. package/dist/admin/ui.generated.d.ts.map +1 -1
  22. package/dist/admin/ui.generated.js +151 -151
  23. package/dist/admin/ui.generated.js.map +1 -1
  24. package/dist/apps/data/App.d.ts +1699 -749
  25. package/dist/apps/data/App.d.ts.map +1 -1
  26. package/dist/apps/data/App.js +56 -7
  27. package/dist/apps/data/App.js.map +1 -1
  28. package/dist/apps/data/ZoneSelection.d.ts +62 -0
  29. package/dist/apps/data/ZoneSelection.d.ts.map +1 -0
  30. package/dist/apps/data/ZoneSelection.js +44 -0
  31. package/dist/apps/data/ZoneSelection.js.map +1 -0
  32. package/dist/apps/data/routes/activities.d.ts +2367 -4
  33. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  34. package/dist/apps/data/routes/activities.js +368 -87
  35. package/dist/apps/data/routes/activities.js.map +1 -1
  36. package/dist/apps/data/routes/addresses.d.ts +471 -340
  37. package/dist/apps/data/routes/addresses.d.ts.map +1 -1
  38. package/dist/apps/data/routes/balances.d.ts +28 -28
  39. package/dist/apps/data/routes/balances.js +1 -1
  40. package/dist/apps/data/routes/balances.js.map +1 -1
  41. package/dist/apps/data/routes/blocks.d.ts +4 -4
  42. package/dist/apps/data/routes/blocks.js +1 -1
  43. package/dist/apps/data/routes/blocks.js.map +1 -1
  44. package/dist/apps/data/routes/coingecko.d.ts +176 -176
  45. package/dist/apps/data/routes/earn.d.ts +131 -6
  46. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  47. package/dist/apps/data/routes/earn.js +157 -25
  48. package/dist/apps/data/routes/earn.js.map +1 -1
  49. package/dist/apps/data/routes/exchanges.d.ts +825 -119
  50. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  51. package/dist/apps/data/routes/exchanges.js +16 -13
  52. package/dist/apps/data/routes/exchanges.js.map +1 -1
  53. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  54. package/dist/apps/data/routes/fee-amm.js +9 -11
  55. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  56. package/dist/apps/data/routes/indexer.d.ts +34 -34
  57. package/dist/apps/data/routes/receipts.d.ts +230 -230
  58. package/dist/apps/data/routes/receipts.js +1 -1
  59. package/dist/apps/data/routes/receipts.js.map +1 -1
  60. package/dist/apps/data/routes/rpc.js +24 -10
  61. package/dist/apps/data/routes/rpc.js.map +1 -1
  62. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  63. package/dist/apps/data/routes/tokenlist.js +16 -15
  64. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  65. package/dist/apps/data/routes/tokens.d.ts +14 -0
  66. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  67. package/dist/apps/data/routes/tokens.js +34 -15
  68. package/dist/apps/data/routes/tokens.js.map +1 -1
  69. package/dist/apps/data/routes/transactions.js +1 -1
  70. package/dist/apps/data/routes/transactions.js.map +1 -1
  71. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  72. package/dist/apps/data/routes/transfers.js +7 -9
  73. package/dist/apps/data/routes/transfers.js.map +1 -1
  74. package/dist/apps/data/routes/webhooks.d.ts +4 -4
  75. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  76. package/dist/apps/data/routes/webhooks.js +2 -2
  77. package/dist/apps/data/routes/webhooks.js.map +1 -1
  78. package/dist/apps/data/routes/zones.d.ts +30 -30
  79. package/dist/apps/funding/App.d.ts +27 -27
  80. package/dist/apps/funding/routes/chains.d.ts.map +1 -1
  81. package/dist/apps/funding/routes/chains.js +5 -4
  82. package/dist/apps/funding/routes/chains.js.map +1 -1
  83. package/dist/apps/funding/routes/deposit-addresses.d.ts +16 -16
  84. package/dist/apps/funding/routes/deposit-addresses.d.ts.map +1 -1
  85. package/dist/apps/funding/routes/deposit-addresses.js +8 -8
  86. package/dist/apps/funding/routes/deposit-addresses.js.map +1 -1
  87. package/dist/apps/funding/routes/providers.d.ts +13 -13
  88. package/dist/apps/funding/routes/providers.d.ts.map +1 -1
  89. package/dist/apps/funding/routes/providers.js +3 -2
  90. package/dist/apps/funding/routes/providers.js.map +1 -1
  91. package/dist/apps/funding/routes/quotes.d.ts.map +1 -1
  92. package/dist/apps/funding/routes/quotes.js +2 -2
  93. package/dist/apps/funding/routes/quotes.js.map +1 -1
  94. package/dist/apps/management/App.d.ts +627 -293
  95. package/dist/apps/management/App.d.ts.map +1 -1
  96. package/dist/apps/management/Billing.d.ts.map +1 -1
  97. package/dist/apps/management/Billing.js +19 -6
  98. package/dist/apps/management/Billing.js.map +1 -1
  99. package/dist/apps/management/routes/api-keys.d.ts +114 -54
  100. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  101. package/dist/apps/management/routes/api-keys.js +76 -30
  102. package/dist/apps/management/routes/api-keys.js.map +1 -1
  103. package/dist/apps/management/routes/billing.d.ts +103 -30
  104. package/dist/apps/management/routes/billing.d.ts.map +1 -1
  105. package/dist/apps/management/routes/billing.js +91 -32
  106. package/dist/apps/management/routes/billing.js.map +1 -1
  107. package/dist/apps/management/routes/faucet.d.ts +33 -33
  108. package/dist/apps/management/routes/faucet.d.ts.map +1 -1
  109. package/dist/apps/management/routes/faucet.js +23 -12
  110. package/dist/apps/management/routes/faucet.js.map +1 -1
  111. package/dist/apps/management/routes/invitations.d.ts +46 -13
  112. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  113. package/dist/apps/management/routes/invitations.js +79 -29
  114. package/dist/apps/management/routes/invitations.js.map +1 -1
  115. package/dist/apps/management/routes/invite-links.d.ts +86 -41
  116. package/dist/apps/management/routes/invite-links.d.ts.map +1 -1
  117. package/dist/apps/management/routes/invite-links.js +100 -41
  118. package/dist/apps/management/routes/invite-links.js.map +1 -1
  119. package/dist/apps/management/routes/me.d.ts +5 -5
  120. package/dist/apps/management/routes/me.d.ts.map +1 -1
  121. package/dist/apps/management/routes/me.js +14 -10
  122. package/dist/apps/management/routes/me.js.map +1 -1
  123. package/dist/apps/management/routes/members.d.ts +93 -72
  124. package/dist/apps/management/routes/members.d.ts.map +1 -1
  125. package/dist/apps/management/routes/members.js +37 -18
  126. package/dist/apps/management/routes/members.js.map +1 -1
  127. package/dist/apps/management/routes/orgs.d.ts +48 -8
  128. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  129. package/dist/apps/management/routes/orgs.js +48 -19
  130. package/dist/apps/management/routes/orgs.js.map +1 -1
  131. package/dist/apps/management/routes/projects.d.ts +90 -28
  132. package/dist/apps/management/routes/projects.d.ts.map +1 -1
  133. package/dist/apps/management/routes/projects.js +72 -21
  134. package/dist/apps/management/routes/projects.js.map +1 -1
  135. package/dist/apps/management/routes/scopes.d.ts.map +1 -1
  136. package/dist/apps/management/routes/scopes.js +8 -5
  137. package/dist/apps/management/routes/scopes.js.map +1 -1
  138. package/dist/apps/management/routes/usage.d.ts +78 -78
  139. package/dist/apps/management/routes/usage.d.ts.map +1 -1
  140. package/dist/apps/management/routes/usage.js +41 -31
  141. package/dist/apps/management/routes/usage.js.map +1 -1
  142. package/dist/apps/management/routes/verified-token-requests.d.ts +34 -6
  143. package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
  144. package/dist/apps/management/routes/verified-token-requests.js +36 -17
  145. package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
  146. package/dist/apps/management/routes/webhooks.d.ts +147 -130
  147. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  148. package/dist/apps/management/routes/webhooks.js +80 -35
  149. package/dist/apps/management/routes/webhooks.js.map +1 -1
  150. package/dist/apps/mpp/internal/Adapter.d.ts +1 -1
  151. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -1
  152. package/dist/apps/mpp/internal/Adapter.js +12 -0
  153. package/dist/apps/mpp/internal/Adapter.js.map +1 -1
  154. package/dist/db/Db.d.ts +2 -0
  155. package/dist/db/Db.d.ts.map +1 -1
  156. package/dist/db/Db.js +40 -0
  157. package/dist/db/Db.js.map +1 -1
  158. package/dist/db/Schema.d.ts +23 -1
  159. package/dist/db/Schema.d.ts.map +1 -1
  160. package/dist/db/Schema.js +19 -3
  161. package/dist/db/Schema.js.map +1 -1
  162. package/dist/db/tables/earnVaults.d.ts +5 -1
  163. package/dist/db/tables/earnVaults.d.ts.map +1 -1
  164. package/dist/db/tables/earnVaults.js +5 -0
  165. package/dist/db/tables/earnVaults.js.map +1 -1
  166. package/dist/db/tables/webhookDeliveries.d.ts.map +1 -1
  167. package/dist/db/tables/webhookDeliveries.js +10 -0
  168. package/dist/db/tables/webhookDeliveries.js.map +1 -1
  169. package/dist/db/tables/webhookQueueCompletions.d.ts +15 -0
  170. package/dist/db/tables/webhookQueueCompletions.d.ts.map +1 -0
  171. package/dist/db/tables/webhookQueueCompletions.js +32 -0
  172. package/dist/db/tables/webhookQueueCompletions.js.map +1 -0
  173. package/dist/db/tables/webhookQueueEvents.d.ts +14 -20
  174. package/dist/db/tables/webhookQueueEvents.d.ts.map +1 -1
  175. package/dist/db/tables/webhookQueueEvents.js +68 -47
  176. package/dist/db/tables/webhookQueueEvents.js.map +1 -1
  177. package/dist/db/tables/webhookSubscriptions.d.ts +16 -5
  178. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  179. package/dist/db/tables/webhookSubscriptions.js +29 -5
  180. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  181. package/dist/internal/Auth.d.ts +8 -1
  182. package/dist/internal/Auth.d.ts.map +1 -1
  183. package/dist/internal/Auth.js +13 -3
  184. package/dist/internal/Auth.js.map +1 -1
  185. package/dist/internal/Cache.d.ts.map +1 -1
  186. package/dist/internal/Cache.js +11 -7
  187. package/dist/internal/Cache.js.map +1 -1
  188. package/dist/internal/EarnVaults.d.ts +41 -2
  189. package/dist/internal/EarnVaults.d.ts.map +1 -1
  190. package/dist/internal/EarnVaults.js +167 -0
  191. package/dist/internal/EarnVaults.js.map +1 -1
  192. package/dist/internal/OpenApi.d.ts +26 -22
  193. package/dist/internal/OpenApi.d.ts.map +1 -1
  194. package/dist/internal/OpenApi.js +128 -39
  195. package/dist/internal/OpenApi.js.map +1 -1
  196. package/dist/internal/Response.d.ts +13 -8
  197. package/dist/internal/Response.d.ts.map +1 -1
  198. package/dist/internal/Response.js +16 -5
  199. package/dist/internal/Response.js.map +1 -1
  200. package/dist/internal/Schema.d.ts +5 -7
  201. package/dist/internal/Schema.d.ts.map +1 -1
  202. package/dist/internal/Schema.js +6 -7
  203. package/dist/internal/Schema.js.map +1 -1
  204. package/dist/internal/Store.d.ts +15 -6
  205. package/dist/internal/Store.d.ts.map +1 -1
  206. package/dist/internal/Store.js +45 -15
  207. package/dist/internal/Store.js.map +1 -1
  208. package/dist/internal/Tidx.d.ts +2 -0
  209. package/dist/internal/Tidx.d.ts.map +1 -1
  210. package/dist/internal/Tidx.js +16 -4
  211. package/dist/internal/Tidx.js.map +1 -1
  212. package/dist/internal/Webhooks.d.ts +29 -12
  213. package/dist/internal/Webhooks.d.ts.map +1 -1
  214. package/dist/internal/Webhooks.js +37 -20
  215. package/dist/internal/Webhooks.js.map +1 -1
  216. package/dist/internal/funding/Deposit.d.ts +2 -2
  217. package/dist/internal/funding/Deposit.d.ts.map +1 -1
  218. package/dist/internal/funding/Deposit.js +9 -8
  219. package/dist/internal/funding/Deposit.js.map +1 -1
  220. package/dist/internal/funding/DepositAddress.d.ts +4 -4
  221. package/dist/internal/funding/DepositAddress.d.ts.map +1 -1
  222. package/dist/internal/funding/DepositAddress.js +9 -8
  223. package/dist/internal/funding/DepositAddress.js.map +1 -1
  224. package/dist/internal/funding/Provider.d.ts.map +1 -1
  225. package/dist/internal/funding/Provider.js +13 -12
  226. package/dist/internal/funding/Provider.js.map +1 -1
  227. package/dist/internal/funding/providers/stargate.d.ts +19 -0
  228. package/dist/internal/funding/providers/stargate.d.ts.map +1 -0
  229. package/dist/internal/funding/providers/stargate.js +143 -0
  230. package/dist/internal/funding/providers/stargate.js.map +1 -0
  231. package/dist/providers/index.d.ts +7 -0
  232. package/dist/providers/index.d.ts.map +1 -1
  233. package/dist/providers/index.js +3 -0
  234. package/dist/providers/index.js.map +1 -1
  235. package/package.json +2 -2
  236. package/src/App.test.ts +48 -0
  237. package/src/App.ts +4 -2
  238. package/src/Assets.test.ts +18 -0
  239. package/src/Assets.ts +22 -0
  240. package/src/Client.test-d.ts +265 -16
  241. package/src/admin/apps/earn-vaults.test.ts +143 -0
  242. package/src/admin/apps/earn-vaults.ts +83 -6
  243. package/src/admin/apps/organizations.ts +6 -2
  244. package/src/admin/ui/src/routes/api-keys.tsx +36 -0
  245. package/src/admin/ui.generated.ts +151 -189
  246. package/src/apps/data/App.test.ts +31 -0
  247. package/src/apps/data/App.ts +56 -8
  248. package/src/apps/data/ZoneSelection.test.ts +196 -0
  249. package/src/apps/data/ZoneSelection.ts +108 -0
  250. package/src/apps/data/routes/activities.test.ts +328 -1
  251. package/src/apps/data/routes/activities.ts +498 -93
  252. package/src/apps/data/routes/balances.ts +1 -1
  253. package/src/apps/data/routes/blocks.ts +1 -1
  254. package/src/apps/data/routes/earn.test.ts +183 -23
  255. package/src/apps/data/routes/earn.ts +225 -29
  256. package/src/apps/data/routes/earn.zone-access.test.ts +46 -0
  257. package/src/apps/data/routes/exchanges.test.ts +31 -1
  258. package/src/apps/data/routes/exchanges.ts +19 -15
  259. package/src/apps/data/routes/fee-amm.ts +18 -11
  260. package/src/apps/data/routes/receipts.ts +1 -1
  261. package/src/apps/data/routes/rpc.test.ts +75 -0
  262. package/src/apps/data/routes/rpc.ts +23 -9
  263. package/src/apps/data/routes/tokenlist.ts +21 -18
  264. package/src/apps/data/routes/tokens.test.ts +29 -0
  265. package/src/apps/data/routes/tokens.ts +38 -15
  266. package/src/apps/data/routes/transactions.ts +1 -1
  267. package/src/apps/data/routes/transfers.test.ts +3 -3
  268. package/src/apps/data/routes/transfers.ts +12 -9
  269. package/src/apps/data/routes/webhooks.ts +6 -2
  270. package/src/apps/data/routes/zones.test.ts +19 -13
  271. package/src/apps/funding/routes/chains.test.ts +211 -7
  272. package/src/apps/funding/routes/chains.ts +19 -12
  273. package/src/apps/funding/routes/deposit-addresses.test.ts +394 -0
  274. package/src/apps/funding/routes/deposit-addresses.ts +84 -72
  275. package/src/apps/funding/routes/providers.ts +9 -5
  276. package/src/apps/funding/routes/quotes.test.ts +46 -0
  277. package/src/apps/funding/routes/quotes.ts +8 -5
  278. package/src/apps/funding/routes/transfers.test.ts +35 -32
  279. package/src/apps/management/Billing.test.ts +26 -0
  280. package/src/apps/management/Billing.ts +24 -7
  281. package/src/apps/management/routes/api-keys.test.ts +178 -0
  282. package/src/apps/management/routes/api-keys.ts +203 -144
  283. package/src/apps/management/routes/billing.test.ts +209 -0
  284. package/src/apps/management/routes/billing.ts +254 -177
  285. package/src/apps/management/routes/faucet.test.ts +39 -0
  286. package/src/apps/management/routes/faucet.ts +75 -41
  287. package/src/apps/management/routes/invitations.test.ts +216 -0
  288. package/src/apps/management/routes/invitations.ts +186 -109
  289. package/src/apps/management/routes/invite-links.test.ts +263 -1
  290. package/src/apps/management/routes/invite-links.ts +295 -214
  291. package/src/apps/management/routes/me.test.ts +49 -0
  292. package/src/apps/management/routes/me.ts +42 -32
  293. package/src/apps/management/routes/members.test.ts +124 -1
  294. package/src/apps/management/routes/members.ts +81 -51
  295. package/src/apps/management/routes/orgs.test.ts +176 -0
  296. package/src/apps/management/routes/orgs.ts +101 -59
  297. package/src/apps/management/routes/projects.test.ts +183 -0
  298. package/src/apps/management/routes/projects.ts +124 -60
  299. package/src/apps/management/routes/scopes.test.ts +44 -0
  300. package/src/apps/management/routes/scopes.ts +37 -28
  301. package/src/apps/management/routes/usage.test.ts +92 -0
  302. package/src/apps/management/routes/usage.ts +186 -151
  303. package/src/apps/management/routes/verified-token-requests.test.ts +114 -0
  304. package/src/apps/management/routes/verified-token-requests.ts +166 -133
  305. package/src/apps/management/routes/webhooks.test.ts +234 -0
  306. package/src/apps/management/routes/webhooks.ts +191 -78
  307. package/src/apps/mpp/internal/Adapter.ts +13 -1
  308. package/src/db/Db.test.ts +41 -0
  309. package/src/db/Db.ts +62 -0
  310. package/src/db/Schema.ts +28 -3
  311. package/src/db/tables/earnVaults.test.ts +22 -0
  312. package/src/db/tables/earnVaults.ts +11 -1
  313. package/src/db/tables/webhookDeliveries.ts +13 -0
  314. package/src/db/tables/webhookQueueCompletions.ts +55 -0
  315. package/src/db/tables/webhookQueueEvents.ts +95 -61
  316. package/src/db/tables/webhookSubscriptions.ts +45 -6
  317. package/src/internal/Auth.ts +23 -5
  318. package/src/internal/Cache.ts +14 -7
  319. package/src/internal/EarnVaults.capabilities.test.ts +33 -0
  320. package/src/internal/EarnVaults.test.ts +79 -0
  321. package/src/internal/EarnVaults.ts +277 -0
  322. package/src/internal/OpenApi.ts +165 -49
  323. package/src/internal/Response.test.ts +95 -0
  324. package/src/internal/Response.ts +40 -2
  325. package/src/internal/Schema.test.ts +16 -0
  326. package/src/internal/Schema.ts +7 -7
  327. package/src/internal/Store.test.ts +186 -0
  328. package/src/internal/Store.ts +57 -17
  329. package/src/internal/Tidx.test.ts +19 -0
  330. package/src/internal/Tidx.ts +16 -4
  331. package/src/internal/Webhooks.test.ts +122 -8
  332. package/src/internal/Webhooks.ts +59 -29
  333. package/src/internal/funding/Deposit.ts +71 -64
  334. package/src/internal/funding/DepositAddress.ts +50 -43
  335. package/src/internal/funding/Provider.ts +164 -142
  336. package/src/internal/funding/providers/index.test.ts +185 -0
  337. package/src/internal/funding/providers/stargate.ts +184 -0
  338. package/src/providers/index.test.ts +1 -0
  339. package/src/providers/index.ts +9 -0
@@ -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'
@@ -0,0 +1,184 @@
1
+ import { Address } from 'ox'
2
+ import * as z from 'zod/mini'
3
+
4
+ import * as FundingProvider from '../Provider.js'
5
+
6
+ const defaultBaseUrl = 'https://transfer.layerzero-api.com/v1'
7
+ const defaultFetch: FundingProvider.Fetch = (input, init) => globalThis.fetch(input, init)
8
+ const sourceDetails = {
9
+ STARGATE_V2_BUS: 'stargate:value-transfer-v1:bus',
10
+ STARGATE_V2_TAXI: 'stargate:value-transfer-v1:taxi',
11
+ } as const
12
+
13
+ namespace schema {
14
+ const DecimalString = z.string().check(z.regex(/^\d+(\.\d+)?$/))
15
+ const IntegerString = z.string().check(z.regex(/^\d+$/))
16
+
17
+ const Quote = z.object({
18
+ dstAmount: IntegerString,
19
+ dstAmountMin: IntegerString,
20
+ duration: z.optional(
21
+ z.object({
22
+ estimated: z.nullable(DecimalString),
23
+ }),
24
+ ),
25
+ expiresAt: z.optional(z.iso.datetime()),
26
+ id: z.string().check(z.minLength(1)),
27
+ routeSteps: z
28
+ .array(
29
+ z.object({
30
+ srcChainKey: z.string(),
31
+ type: z.string(),
32
+ }),
33
+ )
34
+ .check(z.minLength(1)),
35
+ srcAmount: IntegerString,
36
+ })
37
+
38
+ const Error = z.object({
39
+ message: z.string(),
40
+ status: z.union([z.string(), z.number()]),
41
+ })
42
+
43
+ export const Quotes = z.object({
44
+ error: z.optional(z.nullable(Error)),
45
+ quotes: z.array(Quote),
46
+ })
47
+ }
48
+
49
+ /** Creates a Stargate funding provider backed by LayerZero's `/quotes` endpoint. */
50
+ export function stargate(options: stargate.Options) {
51
+ if (options.apiKey.trim().length === 0) throw new FundingProvider.ProviderConfigurationError()
52
+ if (!Address.validate(options.userAddress, { strict: false }))
53
+ throw new FundingProvider.ProviderConfigurationError()
54
+
55
+ const endpoint = new URL(options.baseUrl ?? defaultBaseUrl)
56
+ endpoint.pathname = `${endpoint.pathname.replace(/\/+$/, '')}/quotes`
57
+ const fetch = options.fetch ?? defaultFetch
58
+ const now = options.now ?? (() => new Date())
59
+
60
+ return FundingProvider.from({
61
+ id: 'stargate',
62
+ name: 'Stargate',
63
+ async getQuote({ candidate, route }, signal) {
64
+ const response = await FundingProvider.requestJson(endpoint, {
65
+ body: {
66
+ amount: candidate.sourceAmount.amount,
67
+ dstChainKey: route.destination.chain.slug,
68
+ dstTokenAddress: candidate.destinationToken.address,
69
+ dstWalletAddress: options.userAddress,
70
+ options: { amountType: 'EXACT_SRC_AMOUNT' },
71
+ srcChainKey: route.source.chain.slug,
72
+ srcTokenAddress: candidate.sourceToken.address,
73
+ srcWalletAddress: options.userAddress,
74
+ },
75
+ fetch,
76
+ headers: { 'user-agent': 'tempo-api', 'x-api-key': options.apiKey },
77
+ method: 'POST',
78
+ signal,
79
+ })
80
+ const parsed = schema.Quotes.safeParse(response)
81
+ if (!parsed.success || parsed.data.error) throw new FundingProvider.ProviderPayloadError()
82
+
83
+ const sampledAt = now()
84
+ const selected = selectQuote(parsed.data.quotes, {
85
+ amount: candidate.sourceAmount.amount,
86
+ now: sampledAt,
87
+ sourceChainKey: route.source.chain.slug,
88
+ })
89
+ if (!selected)
90
+ return FundingProvider.unavailableResult({
91
+ detail: 'stargate:value-transfer-v1',
92
+ message: 'NO_STARGATE_ROUTE',
93
+ now: sampledAt,
94
+ source: 'providerQuote',
95
+ })
96
+
97
+ const estimated = estimatedSeconds(selected.quote.duration?.estimated)
98
+ return {
99
+ ...(selected.quote.expiresAt ? { expiresAt: selected.quote.expiresAt } : {}),
100
+ destinationAmountMin: selected.quote.dstAmountMin,
101
+ destinationAmount: selected.quote.dstAmount,
102
+ quality: {
103
+ ...(estimated === undefined ? {} : { estimatedSeconds: estimated }),
104
+ liquiditySource: 'providerQuote',
105
+ sourceDetail: sourceDetails[selected.type],
106
+ tier: 'liquid',
107
+ },
108
+ sampledAt: sampledAt.toISOString(),
109
+ status: 'available',
110
+ }
111
+ },
112
+ })
113
+ }
114
+
115
+ export declare namespace stargate {
116
+ /** Stargate provider options. */
117
+ type Options = {
118
+ /** LayerZero Value Transfer API key sent in the required request header. */
119
+ apiKey: string
120
+ /** Override for tests or LayerZero test environments. */
121
+ baseUrl?: string | undefined
122
+ /** Fetch implementation override for tests. */
123
+ fetch?: FundingProvider.Fetch | undefined
124
+ /** Clock override for deterministic tests. */
125
+ now?: (() => Date) | undefined
126
+ /** Quote wallet address used as the LayerZero sender and recipient. */
127
+ userAddress: string
128
+ }
129
+ }
130
+
131
+ function selectQuote(
132
+ quotes: z.output<typeof schema.Quotes>['quotes'],
133
+ options: selectQuote.Options,
134
+ ) {
135
+ return quotes
136
+ .flatMap((quote) => {
137
+ const type = quote.routeSteps
138
+ .filter((step) => step.srcChainKey === options.sourceChainKey)
139
+ .map((step) => step.type)
140
+ .find(isStargateType)
141
+ if (!type) return []
142
+ if (
143
+ quote.expiresAt !== undefined &&
144
+ new Date(quote.expiresAt).getTime() <= options.now.getTime()
145
+ )
146
+ return []
147
+ if (
148
+ quote.srcAmount !== options.amount ||
149
+ BigInt(quote.dstAmount) <= 0n ||
150
+ BigInt(quote.dstAmountMin) <= 0n ||
151
+ BigInt(quote.dstAmountMin) > BigInt(quote.dstAmount)
152
+ )
153
+ throw new FundingProvider.ProviderPayloadError()
154
+ return [{ quote, type }]
155
+ })
156
+ .sort((a, b) => {
157
+ const delta = BigInt(b.quote.dstAmountMin) - BigInt(a.quote.dstAmountMin)
158
+ if (delta > 0n) return 1
159
+ if (delta < 0n) return -1
160
+ return 0
161
+ })[0]
162
+ }
163
+
164
+ declare namespace selectQuote {
165
+ type Options = {
166
+ amount: string
167
+ now: Date
168
+ sourceChainKey: string
169
+ }
170
+ }
171
+
172
+ function isStargateType(type: string): type is keyof typeof sourceDetails {
173
+ return Object.hasOwn(sourceDetails, type)
174
+ }
175
+
176
+ function estimatedSeconds(milliseconds: string | null | undefined) {
177
+ if (milliseconds === undefined || milliseconds === null) return undefined
178
+ const [whole = '0', fraction] = milliseconds.split('.')
179
+ const roundedMilliseconds =
180
+ BigInt(whole) + (fraction !== undefined && /[1-9]/.test(fraction) ? 1n : 0n)
181
+ const seconds = (roundedMilliseconds + 999n) / 1_000n
182
+ if (seconds > BigInt(Number.MAX_SAFE_INTEGER)) throw new FundingProvider.ProviderPayloadError()
183
+ return Number(seconds)
184
+ }
@@ -7,6 +7,7 @@ test('exports provider factories', () => {
7
7
  "relay",
8
8
  "rhino",
9
9
  "squid",
10
+ "stargate",
10
11
  "symbiosis",
11
12
  "uniswap",
12
13
  ]
@@ -3,6 +3,7 @@ import * as Across from '../internal/funding/providers/across.js'
3
3
  import * as Relay from '../internal/funding/providers/relay.js'
4
4
  import * as Rhino from '../internal/funding/providers/rhino.js'
5
5
  import * as Squid from '../internal/funding/providers/squid.js'
6
+ import * as Stargate from '../internal/funding/providers/stargate.js'
6
7
  import * as Symbiosis from '../internal/funding/providers/symbiosis.js'
7
8
 
8
9
  /** Creates an Across funding provider. */
@@ -37,6 +38,14 @@ export declare namespace squid {
37
38
  type Options = Squid.squid.Options
38
39
  }
39
40
 
41
+ /** Creates a Stargate funding provider. */
42
+ export const stargate = Stargate.stargate
43
+
44
+ export declare namespace stargate {
45
+ /** Stargate provider configuration. */
46
+ type Options = Stargate.stargate.Options
47
+ }
48
+
40
49
  /** Creates a Symbiosis funding provider. */
41
50
  export const symbiosis = Symbiosis.symbiosis
42
51