tapimo 0.7.0 → 0.7.2

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 (689) hide show
  1. package/dist/ApiKeys.d.ts +24 -7
  2. package/dist/ApiKeys.d.ts.map +1 -1
  3. package/dist/ApiKeys.js +17 -5
  4. package/dist/ApiKeys.js.map +1 -1
  5. package/dist/App.d.ts +12104 -7861
  6. package/dist/App.d.ts.map +1 -1
  7. package/dist/App.js +191 -128
  8. package/dist/App.js.map +1 -1
  9. package/dist/Assets.d.ts +10 -0
  10. package/dist/Assets.d.ts.map +1 -1
  11. package/dist/Assets.js +17 -4
  12. package/dist/Assets.js.map +1 -1
  13. package/dist/Scope.d.ts +19 -8
  14. package/dist/Scope.d.ts.map +1 -1
  15. package/dist/Scope.js +25 -9
  16. package/dist/Scope.js.map +1 -1
  17. package/dist/Webhooks.d.ts +1 -1
  18. package/dist/admin/App.d.ts +601 -20
  19. package/dist/admin/App.d.ts.map +1 -1
  20. package/dist/admin/App.js +12 -2
  21. package/dist/admin/App.js.map +1 -1
  22. package/dist/admin/apps/api-keys.d.ts +94 -11
  23. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.js +141 -32
  25. package/dist/admin/apps/api-keys.js.map +1 -1
  26. package/dist/admin/apps/earn-vaults.d.ts +1069 -0
  27. package/dist/admin/apps/earn-vaults.d.ts.map +1 -0
  28. package/dist/admin/apps/earn-vaults.js +409 -0
  29. package/dist/admin/apps/earn-vaults.js.map +1 -0
  30. package/dist/admin/apps/verified-tokens.d.ts +166 -166
  31. package/dist/admin/ui.generated.d.ts +1 -1
  32. package/dist/admin/ui.generated.d.ts.map +1 -1
  33. package/dist/admin/ui.generated.js +151 -95
  34. package/dist/admin/ui.generated.js.map +1 -1
  35. package/dist/analytics/Analytics.d.ts +2 -0
  36. package/dist/analytics/Analytics.d.ts.map +1 -1
  37. package/dist/analytics/Analytics.js +18 -2
  38. package/dist/analytics/Analytics.js.map +1 -1
  39. package/dist/analytics/tables/requestEvents.d.ts +22 -1
  40. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  41. package/dist/analytics/tables/requestEvents.js +59 -39
  42. package/dist/analytics/tables/requestEvents.js.map +1 -1
  43. package/dist/apps/Zones.d.ts +8335 -0
  44. package/dist/apps/Zones.d.ts.map +1 -0
  45. package/dist/apps/Zones.js +38 -0
  46. package/dist/apps/Zones.js.map +1 -0
  47. package/dist/apps/data/App.d.ts +14377 -10165
  48. package/dist/apps/data/App.d.ts.map +1 -1
  49. package/dist/apps/data/App.js +91 -19
  50. package/dist/apps/data/App.js.map +1 -1
  51. package/dist/apps/data/FxOracle.d.ts +1 -1
  52. package/dist/apps/data/FxOracle.d.ts.map +1 -1
  53. package/dist/apps/data/index.d.ts +0 -1
  54. package/dist/apps/data/index.d.ts.map +1 -1
  55. package/dist/apps/data/index.js +0 -1
  56. package/dist/apps/data/index.js.map +1 -1
  57. package/dist/apps/data/routes/activities.d.ts +32 -32
  58. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  59. package/dist/apps/data/routes/activities.js +130 -65
  60. package/dist/apps/data/routes/activities.js.map +1 -1
  61. package/dist/apps/data/routes/addresses.d.ts +312 -312
  62. package/dist/apps/data/routes/balances.d.ts +18 -18
  63. package/dist/apps/data/routes/balances.js +5 -5
  64. package/dist/apps/data/routes/balances.js.map +1 -1
  65. package/dist/apps/data/routes/coingecko.d.ts +176 -176
  66. package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
  67. package/dist/apps/data/routes/coingecko.js +62 -35
  68. package/dist/apps/data/routes/coingecko.js.map +1 -1
  69. package/dist/apps/data/routes/earn.d.ts +2144 -0
  70. package/dist/apps/data/routes/earn.d.ts.map +1 -0
  71. package/dist/apps/data/routes/earn.js +947 -0
  72. package/dist/apps/data/routes/earn.js.map +1 -0
  73. package/dist/apps/data/routes/exchanges.d.ts +1231 -324
  74. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  75. package/dist/apps/data/routes/exchanges.js +656 -193
  76. package/dist/apps/data/routes/exchanges.js.map +1 -1
  77. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  78. package/dist/apps/data/routes/fee-amm.js +59 -8
  79. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  80. package/dist/apps/data/routes/funding.d.ts +4092 -387
  81. package/dist/apps/data/routes/funding.d.ts.map +1 -1
  82. package/dist/apps/data/routes/funding.js +1403 -256
  83. package/dist/apps/data/routes/funding.js.map +1 -1
  84. package/dist/apps/data/routes/indexer.d.ts +5 -5
  85. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  86. package/dist/apps/data/routes/indexer.js +19 -2
  87. package/dist/apps/data/routes/indexer.js.map +1 -1
  88. package/dist/apps/data/routes/receipts.d.ts +265 -265
  89. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  90. package/dist/apps/data/routes/receipts.js +11 -11
  91. package/dist/apps/data/routes/receipts.js.map +1 -1
  92. package/dist/apps/data/routes/rpc.d.ts +5 -5
  93. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  94. package/dist/apps/data/routes/rpc.js +211 -22
  95. package/dist/apps/data/routes/rpc.js.map +1 -1
  96. package/dist/apps/data/routes/tokenlist.d.ts +36 -36
  97. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  98. package/dist/apps/data/routes/tokenlist.js +49 -9
  99. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  100. package/dist/apps/data/routes/tokens.d.ts +116 -88
  101. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  102. package/dist/apps/data/routes/tokens.js +198 -91
  103. package/dist/apps/data/routes/tokens.js.map +1 -1
  104. package/dist/apps/data/routes/transactions.d.ts +55 -55
  105. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  106. package/dist/apps/data/routes/transactions.js +78 -39
  107. package/dist/apps/data/routes/transactions.js.map +1 -1
  108. package/dist/apps/data/routes/transfers.d.ts +78 -29
  109. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  110. package/dist/apps/data/routes/transfers.js +165 -67
  111. package/dist/apps/data/routes/transfers.js.map +1 -1
  112. package/dist/apps/data/routes/valuation.d.ts +10 -10
  113. package/dist/apps/data/routes/valuation.js +2 -2
  114. package/dist/apps/data/routes/valuation.js.map +1 -1
  115. package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -1
  116. package/dist/apps/data/routes/verified-tokens.js +34 -9
  117. package/dist/apps/data/routes/verified-tokens.js.map +1 -1
  118. package/dist/apps/data/routes/webhooks.d.ts +5 -3
  119. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  120. package/dist/apps/data/routes/webhooks.js +175 -65
  121. package/dist/apps/data/routes/webhooks.js.map +1 -1
  122. package/dist/apps/data/routes/zones.d.ts +281 -0
  123. package/dist/apps/data/routes/zones.d.ts.map +1 -0
  124. package/dist/apps/data/routes/zones.js +252 -0
  125. package/dist/apps/data/routes/zones.js.map +1 -0
  126. package/dist/apps/docs/reference.js +6 -5
  127. package/dist/apps/docs/reference.js.map +1 -1
  128. package/dist/apps/index.d.ts +2 -1
  129. package/dist/apps/index.d.ts.map +1 -1
  130. package/dist/apps/index.js +2 -1
  131. package/dist/apps/index.js.map +1 -1
  132. package/dist/apps/management/App.d.ts +670 -670
  133. package/dist/apps/management/Billing.d.ts +8 -0
  134. package/dist/apps/management/Billing.d.ts.map +1 -1
  135. package/dist/apps/management/Billing.js +12 -0
  136. package/dist/apps/management/Billing.js.map +1 -1
  137. package/dist/apps/management/Error.d.ts +12 -0
  138. package/dist/apps/management/Error.d.ts.map +1 -0
  139. package/dist/apps/management/Error.js +10 -0
  140. package/dist/apps/management/Error.js.map +1 -0
  141. package/dist/apps/management/routes/api-keys.d.ts +5 -5
  142. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  143. package/dist/apps/management/routes/api-keys.js +2 -8
  144. package/dist/apps/management/routes/api-keys.js.map +1 -1
  145. package/dist/apps/management/routes/billing.d.ts +119 -119
  146. package/dist/apps/management/routes/faucet.d.ts +35 -35
  147. package/dist/apps/management/routes/invitations.d.ts +62 -62
  148. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  149. package/dist/apps/management/routes/invitations.js +4 -10
  150. package/dist/apps/management/routes/invitations.js.map +1 -1
  151. package/dist/apps/management/routes/invite-links.d.ts +30 -30
  152. package/dist/apps/management/routes/me.d.ts +6 -6
  153. package/dist/apps/management/routes/members.d.ts +78 -78
  154. package/dist/apps/management/routes/orgs.d.ts +48 -48
  155. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  156. package/dist/apps/management/routes/orgs.js +2 -8
  157. package/dist/apps/management/routes/orgs.js.map +1 -1
  158. package/dist/apps/management/routes/projects.d.ts +9 -9
  159. package/dist/apps/management/routes/scopes.js +2 -2
  160. package/dist/apps/management/routes/scopes.js.map +1 -1
  161. package/dist/apps/management/routes/usage.d.ts +80 -80
  162. package/dist/apps/management/routes/verified-token-requests.d.ts +36 -36
  163. package/dist/apps/management/routes/webhooks.d.ts +50 -50
  164. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  165. package/dist/apps/management/routes/webhooks.js +15 -3
  166. package/dist/apps/management/routes/webhooks.js.map +1 -1
  167. package/dist/apps/mpp/App.d.ts +55 -56
  168. package/dist/apps/mpp/App.d.ts.map +1 -1
  169. package/dist/apps/mpp/App.js +192 -27
  170. package/dist/apps/mpp/App.js.map +1 -1
  171. package/dist/apps/mpp/Mpp.d.ts +0 -20
  172. package/dist/apps/mpp/Mpp.d.ts.map +1 -1
  173. package/dist/apps/mpp/Mpp.js +0 -24
  174. package/dist/apps/mpp/Mpp.js.map +1 -1
  175. package/dist/apps/mpp/internal/Adapter.d.ts +40 -0
  176. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -0
  177. package/dist/apps/mpp/internal/Adapter.js +66 -0
  178. package/dist/apps/mpp/internal/Adapter.js.map +1 -0
  179. package/dist/apps/mpp/internal/Error.d.ts +4 -0
  180. package/dist/apps/mpp/internal/Error.d.ts.map +1 -0
  181. package/dist/apps/mpp/internal/Error.js +41 -0
  182. package/dist/apps/mpp/internal/Error.js.map +1 -0
  183. package/dist/apps/mpp/internal/Idempotency.d.ts +33 -0
  184. package/dist/apps/mpp/internal/Idempotency.d.ts.map +1 -0
  185. package/dist/apps/mpp/internal/Idempotency.js +28 -0
  186. package/dist/apps/mpp/internal/Idempotency.js.map +1 -0
  187. package/dist/apps/mpp/internal/Policy.d.ts +46 -0
  188. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -0
  189. package/dist/apps/mpp/internal/Policy.js +57 -0
  190. package/dist/apps/mpp/internal/Policy.js.map +1 -0
  191. package/dist/apps/mpp/internal/ScreenManager.d.ts +27 -0
  192. package/dist/apps/mpp/internal/ScreenManager.d.ts.map +1 -0
  193. package/dist/apps/mpp/internal/ScreenManager.js +18 -0
  194. package/dist/apps/mpp/internal/ScreenManager.js.map +1 -0
  195. package/dist/apps/mpp/internal/Screening.d.ts +35 -0
  196. package/dist/apps/mpp/internal/Screening.d.ts.map +1 -0
  197. package/dist/apps/mpp/internal/Screening.js +20 -0
  198. package/dist/apps/mpp/internal/Screening.js.map +1 -0
  199. package/dist/apps/mpp/internal/Sponsorship.d.ts +36 -0
  200. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -0
  201. package/dist/apps/mpp/internal/Sponsorship.js +103 -0
  202. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -0
  203. package/dist/apps/mpp/internal/Utils.d.ts +7 -0
  204. package/dist/apps/mpp/internal/Utils.d.ts.map +1 -0
  205. package/dist/apps/mpp/internal/Utils.js +24 -0
  206. package/dist/apps/mpp/internal/Utils.js.map +1 -0
  207. package/dist/apps/relay/App.js +184 -24
  208. package/dist/apps/relay/App.js.map +1 -1
  209. package/dist/apps/relay/Sponsorships.d.ts +4 -0
  210. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  211. package/dist/apps/relay/Sponsorships.js +16 -7
  212. package/dist/apps/relay/Sponsorships.js.map +1 -1
  213. package/dist/db/Db.d.ts +20 -0
  214. package/dist/db/Db.d.ts.map +1 -1
  215. package/dist/db/Db.js +342 -0
  216. package/dist/db/Db.js.map +1 -1
  217. package/dist/db/Schema.d.ts +921 -1
  218. package/dist/db/Schema.d.ts.map +1 -1
  219. package/dist/db/Schema.js +269 -1
  220. package/dist/db/Schema.js.map +1 -1
  221. package/dist/db/tables/earnVaults.d.ts +68 -0
  222. package/dist/db/tables/earnVaults.d.ts.map +1 -0
  223. package/dist/db/tables/earnVaults.js +72 -0
  224. package/dist/db/tables/earnVaults.js.map +1 -0
  225. package/dist/db/tables/fundingCatalog.d.ts +56 -0
  226. package/dist/db/tables/fundingCatalog.d.ts.map +1 -0
  227. package/dist/db/tables/fundingCatalog.js +85 -0
  228. package/dist/db/tables/fundingCatalog.js.map +1 -0
  229. package/dist/db/tables/fundingDepositAddresses.d.ts +159 -0
  230. package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
  231. package/dist/db/tables/fundingDepositAddresses.js +206 -0
  232. package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
  233. package/dist/db/tables/fundingDeposits.d.ts +115 -0
  234. package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
  235. package/dist/db/tables/fundingDeposits.js +100 -0
  236. package/dist/db/tables/fundingDeposits.js.map +1 -0
  237. package/dist/db/tables/fundingIdempotency.d.ts +91 -0
  238. package/dist/db/tables/fundingIdempotency.d.ts.map +1 -0
  239. package/dist/db/tables/fundingIdempotency.js +103 -0
  240. package/dist/db/tables/fundingIdempotency.js.map +1 -0
  241. package/dist/db/tables/fundingTransferEvents.d.ts +12 -0
  242. package/dist/db/tables/fundingTransferEvents.d.ts.map +1 -0
  243. package/dist/db/tables/fundingTransferEvents.js +18 -0
  244. package/dist/db/tables/fundingTransferEvents.js.map +1 -0
  245. package/dist/db/tables/fundingTransferTransactions.d.ts +15 -0
  246. package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -0
  247. package/dist/db/tables/fundingTransferTransactions.js +27 -0
  248. package/dist/db/tables/fundingTransferTransactions.js.map +1 -0
  249. package/dist/db/tables/fundingTransfers.d.ts +82 -0
  250. package/dist/db/tables/fundingTransfers.d.ts.map +1 -0
  251. package/dist/db/tables/fundingTransfers.js +89 -0
  252. package/dist/db/tables/fundingTransfers.js.map +1 -0
  253. package/dist/db/tables/organizations.d.ts +8 -0
  254. package/dist/db/tables/organizations.d.ts.map +1 -1
  255. package/dist/db/tables/organizations.js +35 -0
  256. package/dist/db/tables/organizations.js.map +1 -1
  257. package/dist/db/tables/projects.d.ts +8 -0
  258. package/dist/db/tables/projects.d.ts.map +1 -1
  259. package/dist/db/tables/projects.js +16 -0
  260. package/dist/db/tables/projects.js.map +1 -1
  261. package/dist/db/tables/requestUsage.d.ts +13 -0
  262. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  263. package/dist/db/tables/requestUsage.js +16 -0
  264. package/dist/db/tables/requestUsage.js.map +1 -1
  265. package/dist/db/tables/sponsoredTransactions.d.ts +4 -2
  266. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  267. package/dist/db/tables/sponsoredTransactions.js +14 -4
  268. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  269. package/dist/db/tables/users.d.ts +8 -0
  270. package/dist/db/tables/users.d.ts.map +1 -1
  271. package/dist/db/tables/users.js +16 -0
  272. package/dist/db/tables/users.js.map +1 -1
  273. package/dist/db/tables/verifiedTokens.d.ts +14 -7
  274. package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
  275. package/dist/db/tables/verifiedTokens.js +9 -7
  276. package/dist/db/tables/verifiedTokens.js.map +1 -1
  277. package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
  278. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  279. package/dist/db/tables/webhookSubscriptions.js +24 -3
  280. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  281. package/dist/handlers/relay.js +108 -108
  282. package/dist/handlers/relay.js.map +1 -1
  283. package/dist/internal/Auth.d.ts +26 -0
  284. package/dist/internal/Auth.d.ts.map +1 -1
  285. package/dist/internal/Auth.js +35 -2
  286. package/dist/internal/Auth.js.map +1 -1
  287. package/dist/internal/Cache.d.ts.map +1 -1
  288. package/dist/internal/Cache.js +16 -10
  289. package/dist/internal/Cache.js.map +1 -1
  290. package/dist/internal/Cursor.js +1 -1
  291. package/dist/internal/Cursor.js.map +1 -1
  292. package/dist/internal/EarnRates.d.ts +89 -0
  293. package/dist/internal/EarnRates.d.ts.map +1 -0
  294. package/dist/internal/EarnRates.js +266 -0
  295. package/dist/internal/EarnRates.js.map +1 -0
  296. package/dist/internal/EarnVaults.d.ts +171 -0
  297. package/dist/internal/EarnVaults.d.ts.map +1 -0
  298. package/dist/internal/EarnVaults.js +547 -0
  299. package/dist/internal/EarnVaults.js.map +1 -0
  300. package/dist/internal/EdgeCache.d.ts +9 -2
  301. package/dist/internal/EdgeCache.d.ts.map +1 -1
  302. package/dist/internal/EdgeCache.js +36 -9
  303. package/dist/internal/EdgeCache.js.map +1 -1
  304. package/dist/internal/Id.d.ts +11 -0
  305. package/dist/internal/Id.d.ts.map +1 -1
  306. package/dist/internal/Id.js +13 -0
  307. package/dist/internal/Id.js.map +1 -1
  308. package/dist/internal/Idempotency.d.ts +83 -0
  309. package/dist/internal/Idempotency.d.ts.map +1 -0
  310. package/dist/internal/Idempotency.js +113 -0
  311. package/dist/internal/Idempotency.js.map +1 -0
  312. package/dist/internal/Log.d.ts +64 -9
  313. package/dist/internal/Log.d.ts.map +1 -1
  314. package/dist/internal/Log.js +29 -7
  315. package/dist/internal/Log.js.map +1 -1
  316. package/dist/internal/MetricSink.d.ts.map +1 -1
  317. package/dist/internal/MetricSink.js +47 -1
  318. package/dist/internal/MetricSink.js.map +1 -1
  319. package/dist/internal/OpenApi.d.ts +1 -1
  320. package/dist/internal/OpenApi.d.ts.map +1 -1
  321. package/dist/internal/OpenApi.js +3 -0
  322. package/dist/internal/OpenApi.js.map +1 -1
  323. package/dist/internal/Provider.d.ts +14 -0
  324. package/dist/internal/Provider.d.ts.map +1 -0
  325. package/dist/internal/Provider.js +5 -0
  326. package/dist/internal/Provider.js.map +1 -0
  327. package/dist/internal/Schema.d.ts +8 -3
  328. package/dist/internal/Schema.d.ts.map +1 -1
  329. package/dist/internal/Schema.js +24 -13
  330. package/dist/internal/Schema.js.map +1 -1
  331. package/dist/internal/Store.d.ts +6 -0
  332. package/dist/internal/Store.d.ts.map +1 -1
  333. package/dist/internal/Store.js +35 -0
  334. package/dist/internal/Store.js.map +1 -1
  335. package/dist/internal/Tidx.d.ts +43 -24
  336. package/dist/internal/Tidx.d.ts.map +1 -1
  337. package/dist/internal/Tidx.js +79 -11
  338. package/dist/internal/Tidx.js.map +1 -1
  339. package/dist/internal/Viem.d.ts +82 -65
  340. package/dist/internal/Viem.d.ts.map +1 -1
  341. package/dist/internal/Viem.js +83 -12
  342. package/dist/internal/Viem.js.map +1 -1
  343. package/dist/internal/WebhookDestination.d.ts.map +1 -1
  344. package/dist/internal/WebhookDestination.js +34 -28
  345. package/dist/internal/WebhookDestination.js.map +1 -1
  346. package/dist/internal/Webhooks.d.ts +9 -0
  347. package/dist/internal/Webhooks.d.ts.map +1 -1
  348. package/dist/internal/Webhooks.js +15 -10
  349. package/dist/internal/Webhooks.js.map +1 -1
  350. package/dist/internal/exchange/Provider.d.ts +219 -0
  351. package/dist/internal/exchange/Provider.d.ts.map +1 -0
  352. package/dist/internal/exchange/Provider.js +117 -0
  353. package/dist/internal/exchange/Provider.js.map +1 -0
  354. package/dist/internal/exchange/index.d.ts +2 -0
  355. package/dist/internal/exchange/index.d.ts.map +1 -0
  356. package/dist/internal/exchange/index.js +2 -0
  357. package/dist/internal/exchange/index.js.map +1 -0
  358. package/dist/internal/exchange/providers/uniswap.d.ts +57 -0
  359. package/dist/internal/exchange/providers/uniswap.d.ts.map +1 -0
  360. package/dist/internal/exchange/providers/uniswap.js +553 -0
  361. package/dist/internal/exchange/providers/uniswap.js.map +1 -0
  362. package/dist/internal/funding/Action.d.ts +55 -0
  363. package/dist/internal/funding/Action.d.ts.map +1 -0
  364. package/dist/internal/funding/Action.js +74 -0
  365. package/dist/internal/funding/Action.js.map +1 -0
  366. package/dist/internal/funding/Catalog.d.ts +107 -0
  367. package/dist/internal/funding/Catalog.d.ts.map +1 -0
  368. package/dist/internal/funding/Catalog.js +270 -0
  369. package/dist/internal/funding/Catalog.js.map +1 -0
  370. package/dist/internal/funding/Chain.d.ts +76 -0
  371. package/dist/internal/funding/Chain.d.ts.map +1 -0
  372. package/dist/internal/funding/Chain.js +38 -0
  373. package/dist/internal/funding/Chain.js.map +1 -0
  374. package/dist/internal/funding/Deposit.d.ts +366 -0
  375. package/dist/internal/funding/Deposit.d.ts.map +1 -0
  376. package/dist/internal/funding/Deposit.js +286 -0
  377. package/dist/internal/funding/Deposit.js.map +1 -0
  378. package/dist/internal/funding/DepositAddress.d.ts +345 -0
  379. package/dist/internal/funding/DepositAddress.d.ts.map +1 -0
  380. package/dist/internal/funding/DepositAddress.js +189 -0
  381. package/dist/internal/funding/DepositAddress.js.map +1 -0
  382. package/dist/internal/funding/Evidence.d.ts +52 -0
  383. package/dist/internal/funding/Evidence.d.ts.map +1 -0
  384. package/dist/internal/funding/Evidence.js +314 -0
  385. package/dist/internal/funding/Evidence.js.map +1 -0
  386. package/dist/internal/funding/Provider.d.ts +1186 -0
  387. package/dist/internal/funding/Provider.d.ts.map +1 -0
  388. package/dist/internal/funding/Provider.js +1081 -0
  389. package/dist/internal/funding/Provider.js.map +1 -0
  390. package/dist/internal/funding/Reconciliation.d.ts +113 -0
  391. package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
  392. package/dist/internal/funding/Reconciliation.js +676 -0
  393. package/dist/internal/funding/Reconciliation.js.map +1 -0
  394. package/dist/internal/funding/Route.d.ts +21 -0
  395. package/dist/internal/funding/Route.d.ts.map +1 -0
  396. package/dist/internal/funding/Route.js +5 -0
  397. package/dist/internal/funding/Route.js.map +1 -0
  398. package/dist/internal/funding/Subsidy.d.ts +113 -0
  399. package/dist/internal/funding/Subsidy.d.ts.map +1 -0
  400. package/dist/internal/funding/Subsidy.js +138 -0
  401. package/dist/internal/funding/Subsidy.js.map +1 -0
  402. package/dist/internal/funding/Token.d.ts +41 -0
  403. package/dist/internal/funding/Token.d.ts.map +1 -0
  404. package/dist/internal/funding/Token.js +22 -0
  405. package/dist/internal/funding/Token.js.map +1 -0
  406. package/dist/internal/funding/Transfer.d.ts +643 -0
  407. package/dist/internal/funding/Transfer.d.ts.map +1 -0
  408. package/dist/internal/funding/Transfer.js +332 -0
  409. package/dist/internal/funding/Transfer.js.map +1 -0
  410. package/dist/internal/funding/index.d.ts +13 -0
  411. package/dist/internal/funding/index.d.ts.map +1 -0
  412. package/dist/internal/funding/index.js +13 -0
  413. package/dist/internal/funding/index.js.map +1 -0
  414. package/dist/internal/funding/providers/across.d.ts +21 -0
  415. package/dist/internal/funding/providers/across.d.ts.map +1 -0
  416. package/dist/internal/funding/providers/across.js +117 -0
  417. package/dist/internal/funding/providers/across.js.map +1 -0
  418. package/dist/internal/funding/providers/relay.d.ts +46 -0
  419. package/dist/internal/funding/providers/relay.d.ts.map +1 -0
  420. package/dist/internal/funding/providers/relay.js +464 -0
  421. package/dist/internal/funding/providers/relay.js.map +1 -0
  422. package/dist/internal/funding/providers/rhino.d.ts +15 -0
  423. package/dist/internal/funding/providers/rhino.d.ts.map +1 -0
  424. package/dist/internal/funding/providers/rhino.js +116 -0
  425. package/dist/internal/funding/providers/rhino.js.map +1 -0
  426. package/dist/internal/funding/providers/squid.d.ts +19 -0
  427. package/dist/internal/funding/providers/squid.d.ts.map +1 -0
  428. package/dist/internal/funding/providers/squid.js +120 -0
  429. package/dist/internal/funding/providers/squid.js.map +1 -0
  430. package/dist/internal/funding/providers/symbiosis.d.ts +20 -0
  431. package/dist/internal/funding/providers/symbiosis.d.ts.map +1 -0
  432. package/dist/internal/funding/providers/symbiosis.js +176 -0
  433. package/dist/internal/funding/providers/symbiosis.js.map +1 -0
  434. package/dist/internal/index.d.ts +5 -1
  435. package/dist/internal/index.d.ts.map +1 -1
  436. package/dist/internal/index.js +5 -1
  437. package/dist/internal/index.js.map +1 -1
  438. package/dist/internal/webhookDestinations/url.js +61 -57
  439. package/dist/internal/webhookDestinations/url.js.map +1 -1
  440. package/dist/providers/index.d.ts +43 -0
  441. package/dist/providers/index.d.ts.map +1 -0
  442. package/dist/providers/index.js +19 -0
  443. package/dist/providers/index.js.map +1 -0
  444. package/package.json +9 -4
  445. package/src/ApiKeys.test.ts +11 -7
  446. package/src/ApiKeys.ts +37 -9
  447. package/src/App.test.ts +85 -10
  448. package/src/App.ts +224 -137
  449. package/src/Assets.ts +29 -4
  450. package/src/Client.test-d.ts +650 -30
  451. package/src/Scope.test.ts +19 -0
  452. package/src/Scope.ts +28 -11
  453. package/src/Webhooks.test.ts +25 -0
  454. package/src/Webhooks.ts +1 -1
  455. package/src/admin/App.test.ts +9 -2
  456. package/src/admin/App.ts +32 -9
  457. package/src/admin/apps/api-keys.test.ts +167 -23
  458. package/src/admin/apps/api-keys.ts +166 -28
  459. package/src/admin/apps/earn-vaults.test.ts +338 -0
  460. package/src/admin/apps/earn-vaults.ts +572 -0
  461. package/src/admin/apps/scopes.test.ts +16 -1
  462. package/src/admin/ui/plugin.ts +2 -2
  463. package/src/admin/ui/src/components/EarnVaultForm.tsx +137 -0
  464. package/src/admin/ui/src/components/MobileProfile.tsx +2 -2
  465. package/src/admin/ui/src/components/Page.tsx +1 -1
  466. package/src/admin/ui/src/components/ThemeToggle.tsx +1 -1
  467. package/src/admin/ui/src/lib/api-keys.ts +37 -7
  468. package/src/admin/ui/src/lib/client.ts +1 -1
  469. package/src/admin/ui/src/lib/config.ts +1 -1
  470. package/src/admin/ui/src/lib/early-access.ts +8 -9
  471. package/src/admin/ui/src/lib/earn-vaults.ts +207 -0
  472. package/src/admin/ui/src/lib/format.ts +13 -0
  473. package/src/admin/ui/src/lib/organizations.test.ts +14 -4
  474. package/src/admin/ui/src/lib/organizations.ts +7 -1
  475. package/src/admin/ui/src/lib/response.ts +22 -0
  476. package/src/admin/ui/src/lib/scopes.test.ts +19 -11
  477. package/src/admin/ui/src/lib/scopes.ts +28 -7
  478. package/src/admin/ui/src/lib/verified-tokens.ts +10 -9
  479. package/src/admin/ui/src/routeTree.gen.ts +70 -7
  480. package/src/admin/ui/src/router.tsx +2 -2
  481. package/src/admin/ui/src/routes/__root.tsx +9 -8
  482. package/src/admin/ui/src/routes/api-keys.tsx +475 -64
  483. package/src/admin/ui/src/routes/early-access.tsx +5 -12
  484. package/src/admin/ui/src/routes/earn.vaults.tsx +348 -0
  485. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +154 -0
  486. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +190 -0
  487. package/src/admin/ui/src/routes/organizations.tsx +4 -7
  488. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +56 -54
  489. package/src/admin/ui/src/routes/verified-tokens.tsx +4 -4
  490. package/src/admin/ui/vite.config.ts +4 -1
  491. package/src/admin/ui.generated.ts +189 -95
  492. package/src/analytics/Analytics.test.ts +69 -10
  493. package/src/analytics/Analytics.ts +20 -1
  494. package/src/analytics/tables/requestEvents.ts +79 -37
  495. package/src/apps/Zones.test.ts +33 -0
  496. package/src/apps/Zones.ts +40 -0
  497. package/src/apps/composition.test.ts +84 -1
  498. package/src/apps/data/App.test.ts +38 -9
  499. package/src/apps/data/App.ts +96 -33
  500. package/src/apps/data/FxOracle.ts +1 -1
  501. package/src/apps/data/index.ts +0 -1
  502. package/src/apps/data/routes/activities.test.ts +82 -6
  503. package/src/apps/data/routes/activities.ts +131 -71
  504. package/src/apps/data/routes/balances.test.ts +50 -37
  505. package/src/apps/data/routes/balances.ts +5 -5
  506. package/src/apps/data/routes/blocks.test.ts +2 -0
  507. package/src/apps/data/routes/coingecko.test.ts +22 -0
  508. package/src/apps/data/routes/coingecko.ts +84 -48
  509. package/src/apps/data/routes/earn.test.ts +1108 -0
  510. package/src/apps/data/routes/earn.ts +1391 -0
  511. package/src/apps/data/routes/exchanges.test.ts +82 -33
  512. package/src/apps/data/routes/exchanges.ts +842 -227
  513. package/src/apps/data/routes/fee-amm.test.ts +4 -6
  514. package/src/apps/data/routes/fee-amm.ts +69 -12
  515. package/src/apps/data/routes/funding.test.ts +2712 -221
  516. package/src/apps/data/routes/funding.ts +1604 -387
  517. package/src/apps/data/routes/indexer.test.ts +43 -34
  518. package/src/apps/data/routes/indexer.ts +19 -2
  519. package/src/apps/data/routes/receipts.test.ts +5 -3
  520. package/src/apps/data/routes/receipts.ts +13 -11
  521. package/src/apps/data/routes/rpc.test.ts +446 -28
  522. package/src/apps/data/routes/rpc.ts +243 -25
  523. package/src/apps/data/routes/tokenlist.test.ts +15 -0
  524. package/src/apps/data/routes/tokenlist.ts +88 -22
  525. package/src/apps/data/routes/tokens.ts +262 -86
  526. package/src/apps/data/routes/transactions.test.ts +2 -0
  527. package/src/apps/data/routes/transactions.ts +77 -42
  528. package/src/apps/data/routes/transfers.test.ts +166 -4
  529. package/src/apps/data/routes/transfers.ts +216 -78
  530. package/src/apps/data/routes/valuation.test.ts +62 -9
  531. package/src/apps/data/routes/valuation.ts +2 -2
  532. package/src/apps/data/routes/verified-tokens.test.ts +51 -0
  533. package/src/apps/data/routes/verified-tokens.ts +52 -15
  534. package/src/apps/data/routes/webhooks.test.ts +432 -33
  535. package/src/apps/data/routes/webhooks.ts +189 -79
  536. package/src/apps/data/routes/zones.test.ts +473 -0
  537. package/src/apps/data/routes/zones.ts +338 -0
  538. package/src/apps/docs/reference.ts +8 -6
  539. package/src/apps/index.ts +2 -1
  540. package/src/apps/management/Billing.test.ts +29 -0
  541. package/src/apps/management/Billing.ts +23 -0
  542. package/src/apps/management/Error.ts +12 -0
  543. package/src/apps/management/routes/api-keys.test.ts +5 -3
  544. package/src/apps/management/routes/api-keys.ts +2 -9
  545. package/src/apps/management/routes/invitations.ts +4 -11
  546. package/src/apps/management/routes/orgs.ts +2 -9
  547. package/src/apps/management/routes/scopes.test.ts +7 -2
  548. package/src/apps/management/routes/scopes.ts +2 -2
  549. package/src/apps/management/routes/webhooks.test.ts +6 -1
  550. package/src/apps/management/routes/webhooks.ts +15 -3
  551. package/src/apps/mpp/App.ts +276 -29
  552. package/src/apps/mpp/Mpp.test.ts +631 -26
  553. package/src/apps/mpp/Mpp.ts +0 -42
  554. package/src/apps/mpp/internal/Adapter.ts +108 -3
  555. package/src/apps/mpp/internal/Error.test.ts +33 -0
  556. package/src/apps/mpp/internal/Error.ts +44 -6
  557. package/src/apps/mpp/internal/Idempotency.test.ts +213 -0
  558. package/src/apps/mpp/internal/Idempotency.ts +59 -5
  559. package/src/apps/mpp/internal/Policy.test.ts +122 -0
  560. package/src/apps/mpp/internal/Policy.ts +98 -0
  561. package/src/apps/mpp/internal/ScreenManager.test.ts +68 -0
  562. package/src/apps/mpp/internal/ScreenManager.ts +41 -0
  563. package/src/apps/mpp/internal/Screening.ts +40 -3
  564. package/src/apps/mpp/internal/Sponsorship.ts +144 -0
  565. package/src/apps/mpp/internal/Utils.ts +30 -0
  566. package/src/apps/relay/App.test.ts +495 -64
  567. package/src/apps/relay/App.ts +234 -24
  568. package/src/apps/relay/Sponsorships.test.ts +51 -0
  569. package/src/apps/relay/Sponsorships.ts +19 -7
  570. package/src/db/Db.ts +439 -0
  571. package/src/db/Schema.ts +325 -2
  572. package/src/db/tables/earnVaults.test.ts +185 -0
  573. package/src/db/tables/earnVaults.ts +151 -0
  574. package/src/db/tables/fundingCatalog.test.ts +108 -0
  575. package/src/db/tables/fundingCatalog.ts +157 -0
  576. package/src/db/tables/fundingDepositAddresses.test.ts +580 -0
  577. package/src/db/tables/fundingDepositAddresses.ts +376 -0
  578. package/src/db/tables/fundingDeposits.test.ts +261 -0
  579. package/src/db/tables/fundingDeposits.ts +229 -0
  580. package/src/db/tables/fundingIdempotency.test.ts +182 -0
  581. package/src/db/tables/fundingIdempotency.ts +180 -0
  582. package/src/db/tables/fundingTransferEvents.ts +28 -0
  583. package/src/db/tables/fundingTransferTransactions.test.ts +69 -0
  584. package/src/db/tables/fundingTransferTransactions.ts +37 -0
  585. package/src/db/tables/fundingTransfers.test.ts +89 -0
  586. package/src/db/tables/fundingTransfers.ts +153 -0
  587. package/src/db/tables/organizations.test.ts +88 -0
  588. package/src/db/tables/organizations.ts +42 -1
  589. package/src/db/tables/projects.ts +16 -0
  590. package/src/db/tables/requestUsage.ts +23 -0
  591. package/src/db/tables/sponsoredTransactions.test.ts +52 -2
  592. package/src/db/tables/sponsoredTransactions.ts +18 -6
  593. package/src/db/tables/users.ts +16 -0
  594. package/src/db/tables/verifiedTokens.ts +19 -14
  595. package/src/db/tables/webhookSubscriptions.ts +58 -3
  596. package/src/handlers/relay.test.ts +2 -0
  597. package/src/handlers/relay.ts +95 -99
  598. package/src/internal/Auth.test.ts +48 -0
  599. package/src/internal/Auth.ts +61 -2
  600. package/src/internal/Cache.ts +13 -9
  601. package/src/internal/Cursor.test.ts +2 -2
  602. package/src/internal/Cursor.ts +1 -1
  603. package/src/internal/EarnRates.test.ts +125 -0
  604. package/src/internal/EarnRates.ts +409 -0
  605. package/src/internal/EarnVaults.test.ts +195 -0
  606. package/src/internal/EarnVaults.ts +876 -0
  607. package/src/internal/EdgeCache.test.ts +37 -5
  608. package/src/internal/EdgeCache.ts +39 -7
  609. package/src/internal/Id.ts +14 -0
  610. package/src/internal/Idempotency.test.ts +109 -0
  611. package/src/internal/Idempotency.ts +237 -0
  612. package/src/internal/Log.test-d.ts +41 -8
  613. package/src/internal/Log.test.ts +189 -8
  614. package/src/internal/Log.ts +124 -17
  615. package/src/internal/MetricSink.test.ts +244 -4
  616. package/src/internal/MetricSink.ts +51 -1
  617. package/src/internal/OpenApi.ts +3 -0
  618. package/src/internal/Provider.test.ts +17 -0
  619. package/src/internal/Provider.ts +17 -0
  620. package/src/internal/Schema.test.ts +13 -0
  621. package/src/internal/Schema.ts +41 -24
  622. package/src/internal/Store.test.ts +25 -0
  623. package/src/internal/Store.ts +46 -0
  624. package/src/internal/Tidx.local.test.ts +78 -3
  625. package/src/internal/Tidx.test.ts +212 -18
  626. package/src/internal/Tidx.ts +112 -32
  627. package/src/internal/VerifiedTokens.test.ts +15 -0
  628. package/src/internal/Viem.test.ts +170 -17
  629. package/src/internal/Viem.ts +111 -28
  630. package/src/internal/WebhookDestination.ts +25 -23
  631. package/src/internal/Webhooks.test.ts +59 -0
  632. package/src/internal/Webhooks.ts +34 -10
  633. package/src/internal/exchange/Provider.test.ts +216 -0
  634. package/src/internal/exchange/Provider.ts +326 -0
  635. package/src/internal/exchange/index.test.ts +6 -0
  636. package/src/internal/exchange/index.ts +1 -0
  637. package/src/internal/exchange/providers/uniswap.test.ts +122 -0
  638. package/src/internal/exchange/providers/uniswap.ts +682 -0
  639. package/src/internal/funding/Action.test.ts +138 -0
  640. package/src/internal/funding/Action.ts +117 -0
  641. package/src/internal/funding/Catalog.test.ts +311 -0
  642. package/src/internal/funding/Catalog.ts +347 -0
  643. package/src/internal/funding/Chain.test.ts +79 -0
  644. package/src/internal/funding/Chain.ts +120 -0
  645. package/src/internal/funding/Deposit.test.ts +26 -0
  646. package/src/internal/funding/Deposit.ts +453 -0
  647. package/src/internal/funding/DepositAddress.test.ts +18 -0
  648. package/src/internal/funding/DepositAddress.ts +312 -0
  649. package/src/internal/funding/Evidence.test.ts +297 -0
  650. package/src/internal/funding/Evidence.ts +430 -0
  651. package/src/internal/funding/Provider.test.ts +1328 -0
  652. package/src/internal/funding/Provider.ts +1796 -0
  653. package/src/internal/funding/Reconciliation.local.test.ts +504 -0
  654. package/src/internal/funding/Reconciliation.test.ts +2020 -0
  655. package/src/internal/funding/Reconciliation.ts +930 -0
  656. package/src/internal/funding/Route.test.ts +66 -0
  657. package/src/internal/funding/Route.ts +29 -0
  658. package/src/internal/funding/Subsidy.local.test.ts +152 -0
  659. package/src/internal/funding/Subsidy.test.ts +75 -0
  660. package/src/internal/funding/Subsidy.ts +260 -0
  661. package/src/internal/funding/Token.test.ts +47 -0
  662. package/src/internal/funding/Token.ts +59 -0
  663. package/src/internal/funding/Transfer.test.ts +369 -0
  664. package/src/internal/funding/Transfer.ts +522 -0
  665. package/src/internal/funding/index.test.ts +20 -0
  666. package/src/internal/funding/index.ts +12 -0
  667. package/src/internal/funding/providers/across.ts +149 -0
  668. package/src/{apps/data/FundingQuoteProviders.test.ts → internal/funding/providers/index.test.ts} +178 -157
  669. package/src/internal/funding/providers/relay.test.ts +474 -0
  670. package/src/internal/funding/providers/relay.ts +559 -0
  671. package/src/internal/funding/providers/rhino.ts +139 -0
  672. package/src/internal/funding/providers/squid.ts +151 -0
  673. package/src/internal/funding/providers/symbiosis.ts +221 -0
  674. package/src/internal/index.test.ts +5 -1
  675. package/src/internal/index.ts +5 -1
  676. package/src/internal/webhookDestinations/url.ts +49 -45
  677. package/src/providers/index.test.ts +14 -0
  678. package/src/providers/index.ts +54 -0
  679. package/dist/apps/data/FundingQuoteProviders.d.ts +0 -174
  680. package/dist/apps/data/FundingQuoteProviders.d.ts.map +0 -1
  681. package/dist/apps/data/FundingQuoteProviders.js +0 -775
  682. package/dist/apps/data/FundingQuoteProviders.js.map +0 -1
  683. package/dist/internal/FundingQuotes.d.ts +0 -864
  684. package/dist/internal/FundingQuotes.d.ts.map +0 -1
  685. package/dist/internal/FundingQuotes.js +0 -672
  686. package/dist/internal/FundingQuotes.js.map +0 -1
  687. package/src/apps/data/FundingQuoteProviders.ts +0 -1043
  688. package/src/internal/FundingQuotes.test.ts +0 -456
  689. package/src/internal/FundingQuotes.ts +0 -944
@@ -1,57 +1,33 @@
1
- import * as FundingQuotes from '../../internal/FundingQuotes.js'
2
- import * as FundingQuoteProviders from './FundingQuoteProviders.js'
1
+ import * as TestFunding from '../../../../test/Funding.js'
2
+ import * as FundingProvider from '../Provider.js'
3
+ import * as Across from './across.js'
4
+ import * as Relay from './relay.js'
5
+ import * as Rhino from './rhino.js'
6
+ import * as Squid from './squid.js'
7
+ import * as Symbiosis from './symbiosis.js'
3
8
 
4
9
  const now = () => new Date('2026-01-01T00:00:00.000Z')
5
-
6
- describe('FundingQuoteProviders', () => {
7
- test('requires every Across deployment binding when any is configured', () => {
8
- expect(FundingQuoteProviders.configureAcross()).toBeUndefined()
9
- expect(() =>
10
- FundingQuoteProviders.configureAcross({ apiKey: 'across-api-key' }),
11
- ).toThrowErrorMatchingInlineSnapshot(`[FundingQuoteProviders.ProviderConfigurationError]`)
12
- expect(
13
- FundingQuoteProviders.configureAcross({
14
- apiKey: 'across-api-key',
15
- integratorId: '0xdead',
16
- userAddress: '0x1111111111111111111111111111111111111111',
17
- }),
18
- ).toEqual({
19
- apiKey: 'across-api-key',
20
- integratorId: '0xdead',
21
- userAddress: '0x1111111111111111111111111111111111111111',
22
- })
23
- })
24
-
25
- test('requires every Squid deployment binding when any is configured', () => {
26
- expect(FundingQuoteProviders.configureSquid()).toBeUndefined()
27
- expect(() =>
28
- FundingQuoteProviders.configureSquid({ integratorId: 'squid-integrator-id' }),
29
- ).toThrowErrorMatchingInlineSnapshot(`[FundingQuoteProviders.ProviderConfigurationError]`)
30
- expect(
31
- FundingQuoteProviders.configureSquid({
32
- integratorId: 'squid-integrator-id',
33
- userAddress: '0x1111111111111111111111111111111111111111',
34
- }),
35
- ).toEqual({
36
- integratorId: 'squid-integrator-id',
37
- userAddress: '0x1111111111111111111111111111111111111111',
38
- })
39
- })
40
-
41
- test('configures Symbiosis only when its quote user is present', () => {
42
- expect(FundingQuoteProviders.configureSymbiosis()).toBeUndefined()
43
- expect(
44
- FundingQuoteProviders.configureSymbiosis({
45
- userAddress: '0x1111111111111111111111111111111111111111',
46
- }),
47
- ).toEqual({ userAddress: '0x1111111111111111111111111111111111111111' })
48
- })
49
-
50
- test('maps successful Across quotes to available quote probes', async () => {
10
+ const providers = [
11
+ Across.across({
12
+ apiKey: 'across-api-key',
13
+ integratorId: '0xdead',
14
+ userAddress: '0x1111111111111111111111111111111111111111',
15
+ }),
16
+ Relay.relay({ userAddress: '0x1111111111111111111111111111111111111111' }),
17
+ Rhino.rhino(),
18
+ Squid.squid({
19
+ integratorId: 'squid-integrator-id',
20
+ userAddress: '0x1111111111111111111111111111111111111111',
21
+ }),
22
+ Symbiosis.symbiosis({ userAddress: '0x1111111111111111111111111111111111111111' }),
23
+ ] as const
24
+
25
+ describe('funding providers', () => {
26
+ test('maps successful Across quotes to available quote results', async () => {
51
27
  const requests: RecordedRequest[] = []
52
28
  const candidate = quoteCandidate('across')
53
29
  const fetch = recordingFetch(requests, async () => jsonResponse(acrossQuote(candidate)))
54
- const adapter = FundingQuoteProviders.across({
30
+ const provider = Across.across({
55
31
  apiKey: 'across-api-key',
56
32
  baseUrl: 'https://across.test/api/',
57
33
  fetch,
@@ -60,7 +36,7 @@ describe('FundingQuoteProviders', () => {
60
36
  userAddress: '0x1111111111111111111111111111111111111111',
61
37
  })
62
38
 
63
- const result = await adapter.probeQuote(probeInput(candidate), new AbortController().signal)
39
+ const result = await provider.getQuote(getQuoteInput(candidate), new AbortController().signal)
64
40
 
65
41
  expect(requests).toHaveLength(1)
66
42
  expect(requests[0]?.url.pathname).toBe('/api/swap/approval')
@@ -82,8 +58,8 @@ describe('FundingQuoteProviders', () => {
82
58
  )
83
59
  expect(result).toMatchObject({
84
60
  expiresAt: '2026-01-01T00:01:00.000Z',
85
- minimumOutputAmount: '988000',
86
- outputAmount: '990000',
61
+ destinationAmountMin: '988000',
62
+ destinationAmount: '990000',
87
63
  quality: {
88
64
  estimatedSeconds: 2,
89
65
  liquiditySource: 'providerQuote',
@@ -95,10 +71,10 @@ describe('FundingQuoteProviders', () => {
95
71
  })
96
72
  })
97
73
 
98
- test('maps recognized Across quote errors to unavailable probes', async () => {
74
+ test('maps recognized Across quote errors to unavailable results', async () => {
99
75
  const candidate = quoteCandidate('across')
100
76
  const fetch = recordingFetch([], async () => jsonResponse({ code: 'NO_ROUTE' }, 400))
101
- const adapter = FundingQuoteProviders.across({
77
+ const provider = Across.across({
102
78
  apiKey: 'across-api-key',
103
79
  fetch,
104
80
  integratorId: '0xdead',
@@ -107,7 +83,7 @@ describe('FundingQuoteProviders', () => {
107
83
  })
108
84
 
109
85
  await expect(
110
- adapter.probeQuote(probeInput(candidate), new AbortController().signal),
86
+ provider.getQuote(getQuoteInput(candidate), new AbortController().signal),
111
87
  ).resolves.toMatchObject({
112
88
  quality: {
113
89
  liquiditySource: 'providerQuote',
@@ -123,7 +99,7 @@ describe('FundingQuoteProviders', () => {
123
99
  const fetch = recordingFetch([], async () =>
124
100
  jsonResponse({ ...acrossQuote(candidate), expectedOutputAmount: '0' }),
125
101
  )
126
- const adapter = FundingQuoteProviders.across({
102
+ const provider = Across.across({
127
103
  apiKey: 'across-api-key',
128
104
  fetch,
129
105
  integratorId: '0xdead',
@@ -132,21 +108,21 @@ describe('FundingQuoteProviders', () => {
132
108
  })
133
109
 
134
110
  await expect(
135
- adapter.probeQuote(probeInput(candidate), new AbortController().signal),
136
- ).rejects.toThrowErrorMatchingInlineSnapshot(`[FundingQuoteProviders.ProviderPayloadError]`)
111
+ provider.getQuote(getQuoteInput(candidate), new AbortController().signal),
112
+ ).rejects.toThrowErrorMatchingInlineSnapshot(`[FundingProvider.ProviderPayloadError]`)
137
113
  })
138
114
 
139
115
  test('rejects invalid Across configuration', () => {
140
116
  expect(() =>
141
- FundingQuoteProviders.across({
117
+ Across.across({
142
118
  apiKey: 'across-api-key',
143
119
  integratorId: 'tempo',
144
120
  userAddress: '0x1111111111111111111111111111111111111111',
145
121
  }),
146
- ).toThrowErrorMatchingInlineSnapshot(`[FundingQuoteProviders.ProviderConfigurationError]`)
122
+ ).toThrowErrorMatchingInlineSnapshot(`[FundingProvider.ProviderConfigurationError]`)
147
123
  })
148
124
 
149
- test('maps successful Relay quotes to available quote probes', async () => {
125
+ test('maps successful Relay quotes to available quote results', async () => {
150
126
  const requests: RecordedRequest[] = []
151
127
  const candidate = quoteCandidate()
152
128
  const fetch = recordingFetch(requests, async () =>
@@ -161,14 +137,14 @@ describe('FundingQuoteProviders', () => {
161
137
  },
162
138
  }),
163
139
  )
164
- const adapter = FundingQuoteProviders.relay({
140
+ const provider = Relay.relay({
165
141
  apiKey: 'relay-api-key',
166
142
  fetch,
167
143
  now,
168
144
  userAddress: '0x1111111111111111111111111111111111111111',
169
145
  })
170
146
 
171
- const result = await adapter.probeQuote(probeInput(candidate), new AbortController().signal)
147
+ const result = await provider.getQuote(getQuoteInput(candidate), new AbortController().signal)
172
148
 
173
149
  expect(requests.map((request) => request.url.pathname)).toEqual(['/quote/v2'])
174
150
  expect(new Headers(requests[0]?.init?.headers).get('x-api-key')).toBe('relay-api-key')
@@ -182,8 +158,8 @@ describe('FundingQuoteProviders', () => {
182
158
  user: '0x1111111111111111111111111111111111111111',
183
159
  })
184
160
  expect(result).toMatchObject({
185
- minimumOutputAmount: '980000',
186
- outputAmount: '990000',
161
+ destinationAmountMin: '980000',
162
+ destinationAmount: '990000',
187
163
  quality: {
188
164
  estimatedSeconds: 15,
189
165
  liquiditySource: 'providerQuote',
@@ -195,11 +171,32 @@ describe('FundingQuoteProviders', () => {
195
171
  })
196
172
  })
197
173
 
198
- test('maps successful Squid quotes to available quote probes', async () => {
174
+ test('keeps Relay preparation available without an indicative quote wallet', async () => {
175
+ const provider = Relay.relay({ now })
176
+ const result = await provider.getQuote(
177
+ getQuoteInput(quoteCandidate()),
178
+ new AbortController().signal,
179
+ )
180
+
181
+ expect(FundingProvider.canPrepareTransfer(provider)).toBe(true)
182
+ expect(result).toMatchInlineSnapshot(`
183
+ {
184
+ "quality": {
185
+ "liquiditySource": "providerQuote",
186
+ "sourceDetail": "relay:quote-v2:QUOTE_USER_NOT_CONFIGURED",
187
+ "tier": "unavailable",
188
+ },
189
+ "sampledAt": "2026-01-01T00:00:00.000Z",
190
+ "status": "unavailable",
191
+ }
192
+ `)
193
+ })
194
+
195
+ test('maps successful Squid quotes to available quote results', async () => {
199
196
  const requests: RecordedRequest[] = []
200
197
  const candidate = quoteCandidate('squid')
201
198
  const fetch = recordingFetch(requests, async () => jsonResponse(squidQuote(candidate)))
202
- const adapter = FundingQuoteProviders.squid({
199
+ const provider = Squid.squid({
203
200
  baseUrl: 'https://squid.test/v2/',
204
201
  fetch,
205
202
  integratorId: 'squid-integrator-id',
@@ -207,7 +204,7 @@ describe('FundingQuoteProviders', () => {
207
204
  userAddress: '0x1111111111111111111111111111111111111111',
208
205
  })
209
206
 
210
- const result = await adapter.probeQuote(probeInput(candidate), new AbortController().signal)
207
+ const result = await provider.getQuote(getQuoteInput(candidate), new AbortController().signal)
211
208
 
212
209
  expect(requests).toHaveLength(1)
213
210
  expect(requests[0]?.url.pathname).toBe('/v2/route')
@@ -226,8 +223,8 @@ describe('FundingQuoteProviders', () => {
226
223
  toToken: candidate.destinationToken.address,
227
224
  })
228
225
  expect(result).toEqual({
229
- minimumOutputAmount: '989622',
230
- outputAmount: '999620',
226
+ destinationAmountMin: '989622',
227
+ destinationAmount: '999620',
231
228
  quality: {
232
229
  estimatedSeconds: 10,
233
230
  liquiditySource: 'providerQuote',
@@ -239,9 +236,9 @@ describe('FundingQuoteProviders', () => {
239
236
  })
240
237
  })
241
238
 
242
- test('maps unavailable Squid routes to unavailable quote probes', async () => {
239
+ test('maps unavailable Squid routes to unavailable quote results', async () => {
243
240
  const candidate = quoteCandidate('squid')
244
- const adapter = FundingQuoteProviders.squid({
241
+ const provider = Squid.squid({
245
242
  fetch: recordingFetch([], async () =>
246
243
  jsonResponse(
247
244
  {
@@ -258,7 +255,7 @@ describe('FundingQuoteProviders', () => {
258
255
  })
259
256
 
260
257
  await expect(
261
- adapter.probeQuote(probeInput(candidate), new AbortController().signal),
258
+ provider.getQuote(getQuoteInput(candidate), new AbortController().signal),
262
259
  ).resolves.toMatchObject({
263
260
  quality: {
264
261
  sourceDetail: 'squid:route-v2:AMOUNT_TOO_LOW',
@@ -268,18 +265,18 @@ describe('FundingQuoteProviders', () => {
268
265
  })
269
266
  })
270
267
 
271
- test('maps successful Symbiosis quotes to available quote probes', async () => {
268
+ test('maps successful Symbiosis quotes to available quote results', async () => {
272
269
  const requests: RecordedRequest[] = []
273
270
  const candidate = quoteCandidate('symbiosis')
274
271
  const fetch = recordingFetch(requests, async () => jsonResponse(symbiosisQuote(candidate)))
275
- const adapter = FundingQuoteProviders.symbiosis({
272
+ const provider = Symbiosis.symbiosis({
276
273
  baseUrl: 'https://symbiosis.test/crosschain/',
277
274
  fetch,
278
275
  now,
279
276
  userAddress: '0x1111111111111111111111111111111111111111',
280
277
  })
281
278
 
282
- const result = await adapter.probeQuote(probeInput(candidate), new AbortController().signal)
279
+ const result = await provider.getQuote(getQuoteInput(candidate), new AbortController().signal)
283
280
 
284
281
  expect(requests).toHaveLength(1)
285
282
  expect(requests[0]?.url.pathname).toBe('/crosschain/v2/quote')
@@ -303,8 +300,8 @@ describe('FundingQuoteProviders', () => {
303
300
  },
304
301
  })
305
302
  expect(result).toEqual({
306
- minimumOutputAmount: '979000',
307
- outputAmount: '989000',
303
+ destinationAmountMin: '979000',
304
+ destinationAmount: '989000',
308
305
  quality: {
309
306
  estimatedSeconds: 18,
310
307
  liquiditySource: 'providerQuote',
@@ -324,13 +321,13 @@ describe('FundingQuoteProviders', () => {
324
321
  sourceToken: 'USDT',
325
322
  })
326
323
  const fetch = recordingFetch(requests, async () => jsonResponse(symbiosisQuote(candidate)))
327
- const adapter = FundingQuoteProviders.symbiosis({
324
+ const provider = Symbiosis.symbiosis({
328
325
  fetch,
329
326
  now,
330
327
  userAddress: '0x1111111111111111111111111111111111111111',
331
328
  })
332
329
 
333
- await adapter.probeQuote(probeInput(candidate), new AbortController().signal)
330
+ await provider.getQuote(getQuoteInput(candidate), new AbortController().signal)
334
331
 
335
332
  expect(jsonRequestBody(requests[0])).toMatchObject({
336
333
  tokenAmountIn: {
@@ -355,21 +352,21 @@ describe('FundingQuoteProviders', () => {
355
352
  tokenAmountOut: quote.tokenAmountOut,
356
353
  tokenAmountOutMin: quote.tokenAmountOutMin,
357
354
  }
358
- const adapter = FundingQuoteProviders.symbiosis({
355
+ const provider = Symbiosis.symbiosis({
359
356
  fetch: recordingFetch([], async () => jsonResponse(response)),
360
357
  now,
361
358
  userAddress: '0x1111111111111111111111111111111111111111',
362
359
  })
363
360
 
364
361
  await expect(
365
- adapter.probeQuote(probeInput(candidate), new AbortController().signal),
366
- ).rejects.toThrowErrorMatchingInlineSnapshot(`[FundingQuoteProviders.ProviderPayloadError]`)
362
+ provider.getQuote(getQuoteInput(candidate), new AbortController().signal),
363
+ ).rejects.toThrowErrorMatchingInlineSnapshot(`[FundingProvider.ProviderPayloadError]`)
367
364
  })
368
365
 
369
366
  test('enforces the Symbiosis provider quota before fetching', async () => {
370
367
  const requests: RecordedRequest[] = []
371
368
  const candidate = quoteCandidate('symbiosis')
372
- const adapter = FundingQuoteProviders.symbiosis({
369
+ const provider = Symbiosis.symbiosis({
373
370
  fetch: recordingFetch(requests, async () => jsonResponse(symbiosisQuote(candidate))),
374
371
  now,
375
372
  userAddress: '0x1111111111111111111111111111111111111111',
@@ -377,34 +374,40 @@ describe('FundingQuoteProviders', () => {
377
374
 
378
375
  await Promise.all(
379
376
  Array.from({ length: 4 }, () =>
380
- adapter.probeQuote(probeInput(candidate), new AbortController().signal),
377
+ provider.getQuote(getQuoteInput(candidate), new AbortController().signal),
381
378
  ),
382
379
  )
383
- const cause = await adapter
384
- .probeQuote(probeInput(candidate), new AbortController().signal)
380
+ const cause = await provider
381
+ .getQuote(getQuoteInput(candidate), new AbortController().signal)
385
382
  .catch((error: unknown) => error)
386
383
 
387
384
  expect(requests).toHaveLength(4)
388
385
  expect(cause).toMatchObject({
389
- name: 'FundingQuoteProviders.ProviderRateLimitError',
386
+ name: 'FundingProvider.ProviderRateLimitError',
390
387
  })
391
- expect(FundingQuoteProviders.providerFailure({ cause, provider: 'symbiosis' })).toEqual({
388
+ expect(
389
+ FundingProvider.failure({
390
+ cause,
391
+ operation: 'getQuote',
392
+ provider: getProvider('symbiosis'),
393
+ }),
394
+ ).toEqual({
392
395
  failure: 'rate_limit',
393
396
  id: 'symbiosis',
394
- operation: 'v2/quote',
397
+ operation: 'getQuote',
395
398
  })
396
399
  })
397
400
 
398
- test('maps unavailable Symbiosis routes to unavailable quote probes', async () => {
401
+ test('maps unavailable Symbiosis routes to unavailable quote results', async () => {
399
402
  const candidate = quoteCandidate('symbiosis')
400
- const adapter = FundingQuoteProviders.symbiosis({
403
+ const provider = Symbiosis.symbiosis({
401
404
  fetch: recordingFetch([], async () => jsonResponse({ code: 'NO_ROUTE' }, 400)),
402
405
  now,
403
406
  userAddress: '0x1111111111111111111111111111111111111111',
404
407
  })
405
408
 
406
409
  await expect(
407
- adapter.probeQuote(probeInput(candidate), new AbortController().signal),
410
+ provider.getQuote(getQuoteInput(candidate), new AbortController().signal),
408
411
  ).resolves.toMatchObject({
409
412
  quality: {
410
413
  sourceDetail: 'symbiosis:quote-v2:NO_ROUTE',
@@ -414,9 +417,9 @@ describe('FundingQuoteProviders', () => {
414
417
  })
415
418
  })
416
419
 
417
- test('maps Symbiosis fee-floor errors to unavailable quote probes', async () => {
420
+ test('maps Symbiosis fee-floor errors to unavailable quote results', async () => {
418
421
  const candidate = quoteCandidate('symbiosis')
419
- const adapter = FundingQuoteProviders.symbiosis({
422
+ const provider = Symbiosis.symbiosis({
420
423
  fetch: recordingFetch([], async () =>
421
424
  jsonResponse({ code: 0, message: 'Amount is too low to cover fees' }, 400),
422
425
  ),
@@ -425,7 +428,7 @@ describe('FundingQuoteProviders', () => {
425
428
  })
426
429
 
427
430
  await expect(
428
- adapter.probeQuote(probeInput(candidate), new AbortController().signal),
431
+ provider.getQuote(getQuoteInput(candidate), new AbortController().signal),
429
432
  ).resolves.toMatchObject({
430
433
  quality: {
431
434
  sourceDetail: 'symbiosis:quote-v2:AMOUNT_TOO_LOW',
@@ -437,11 +440,11 @@ describe('FundingQuoteProviders', () => {
437
440
 
438
441
  test('rejects invalid Symbiosis configuration', () => {
439
442
  expect(() =>
440
- FundingQuoteProviders.symbiosis({ userAddress: 'invalid' }),
441
- ).toThrowErrorMatchingInlineSnapshot(`[FundingQuoteProviders.ProviderConfigurationError]`)
443
+ Symbiosis.symbiosis({ userAddress: 'invalid' }),
444
+ ).toThrowErrorMatchingInlineSnapshot(`[FundingProvider.ProviderConfigurationError]`)
442
445
  })
443
446
 
444
- test('maps successful Rhino quotes to available quote probes', async () => {
447
+ test('maps successful Rhino quotes to available quote results', async () => {
445
448
  const requests: RecordedRequest[] = []
446
449
  const candidate = quoteCandidate('rhino')
447
450
  const fetch = recordingFetch(requests, async () =>
@@ -455,13 +458,13 @@ describe('FundingQuoteProviders', () => {
455
458
  token: 'USDC',
456
459
  }),
457
460
  )
458
- const adapter = FundingQuoteProviders.rhino({
461
+ const provider = Rhino.rhino({
459
462
  baseUrl: 'https://rhino.test/bridge/',
460
463
  fetch,
461
464
  now,
462
465
  })
463
466
 
464
- const result = await adapter.probeQuote(probeInput(candidate), new AbortController().signal)
467
+ const result = await provider.getQuote(getQuoteInput(candidate), new AbortController().signal)
465
468
 
466
469
  expect(requests).toHaveLength(1)
467
470
  expect(requests[0]?.url.pathname).toBe('/bridge/quote/bridge-swap/public')
@@ -475,7 +478,7 @@ describe('FundingQuoteProviders', () => {
475
478
  tokenOut: 'USDC',
476
479
  })
477
480
  expect(result).toEqual({
478
- outputAmount: '983000',
481
+ destinationAmount: '983000',
479
482
  quality: {
480
483
  estimatedSeconds: 2,
481
484
  liquiditySource: 'providerQuote',
@@ -487,15 +490,15 @@ describe('FundingQuoteProviders', () => {
487
490
  })
488
491
  })
489
492
 
490
- test('maps unavailable Rhino routes to unavailable quote probes', async () => {
493
+ test('maps unavailable Rhino routes to unavailable quote results', async () => {
491
494
  const candidate = quoteCandidate('rhino')
492
- const adapter = FundingQuoteProviders.rhino({
495
+ const provider = Rhino.rhino({
493
496
  fetch: recordingFetch([], async () => jsonResponse({ _tag: 'NoRouteFoundError' }, 404)),
494
497
  now,
495
498
  })
496
499
 
497
500
  await expect(
498
- adapter.probeQuote(probeInput(candidate), new AbortController().signal),
501
+ provider.getQuote(getQuoteInput(candidate), new AbortController().signal),
499
502
  ).resolves.toMatchObject({
500
503
  quality: {
501
504
  sourceDetail: 'rhino:bridge-swap-public:NoRouteFoundError',
@@ -525,7 +528,7 @@ describe('FundingQuoteProviders', () => {
525
528
 
526
529
  for (const testCase of cases) {
527
530
  const requests: RecordedRequest[] = []
528
- const adapter = FundingQuoteProviders.rhino({
531
+ const provider = Rhino.rhino({
529
532
  fetch: recordingFetch(requests, async () =>
530
533
  jsonResponse({
531
534
  _tag: 'bridge',
@@ -540,8 +543,8 @@ describe('FundingQuoteProviders', () => {
540
543
  })
541
544
 
542
545
  await expect(
543
- adapter.probeQuote(probeInput(testCase.candidate), new AbortController().signal),
544
- ).resolves.toMatchObject({ outputAmount: '983000', status: 'available' })
546
+ provider.getQuote(getQuoteInput(testCase.candidate), new AbortController().signal),
547
+ ).resolves.toMatchObject({ destinationAmount: '983000', status: 'available' })
545
548
  expect(requests[0]?.url.searchParams.get('chainIn')).toBe(testCase.chainIn)
546
549
  expect(requests[0]?.url.searchParams.get('tokenOut')).toBe(testCase.tokenOut)
547
550
  }
@@ -549,15 +552,15 @@ describe('FundingQuoteProviders', () => {
549
552
 
550
553
  test('surfaces Rhino request decoding failures', async () => {
551
554
  const candidate = quoteCandidate('rhino')
552
- const adapter = FundingQuoteProviders.rhino({
555
+ const provider = Rhino.rhino({
553
556
  fetch: recordingFetch([], async () => jsonResponse({ _tag: 'HttpApiDecodeError' }, 400)),
554
557
  now,
555
558
  })
556
559
 
557
560
  await expect(
558
- adapter.probeQuote(probeInput(candidate), new AbortController().signal),
561
+ provider.getQuote(getQuoteInput(candidate), new AbortController().signal),
559
562
  ).rejects.toThrowErrorMatchingInlineSnapshot(
560
- `[FundingQuoteProviders.ProviderResponseError: Provider request failed with status 400]`,
563
+ `[FundingProvider.ProviderResponseError: Provider request failed with status 400]`,
561
564
  )
562
565
  })
563
566
 
@@ -569,15 +572,15 @@ describe('FundingQuoteProviders', () => {
569
572
  ] as const
570
573
 
571
574
  for (const failure of failures) {
572
- const adapter = FundingQuoteProviders.rhino({
575
+ const provider = Rhino.rhino({
573
576
  fetch: recordingFetch([], async () => jsonResponse(failure.body, failure.status)),
574
577
  now,
575
578
  })
576
- const cause = await adapter
577
- .probeQuote(probeInput(candidate), new AbortController().signal)
579
+ const cause = await provider
580
+ .getQuote(getQuoteInput(candidate), new AbortController().signal)
578
581
  .catch((error: unknown) => error)
579
582
  expect(cause).toMatchObject({
580
- name: 'FundingQuoteProviders.ProviderResponseError',
583
+ name: 'FundingProvider.ProviderResponseError',
581
584
  status: failure.status,
582
585
  })
583
586
  }
@@ -585,7 +588,7 @@ describe('FundingQuoteProviders', () => {
585
588
 
586
589
  test('rejects mismatched Rhino quote payloads', async () => {
587
590
  const candidate = quoteCandidate('rhino')
588
- const adapter = FundingQuoteProviders.rhino({
591
+ const provider = Rhino.rhino({
589
592
  fetch: recordingFetch([], async () =>
590
593
  jsonResponse({
591
594
  _tag: 'bridge',
@@ -600,13 +603,13 @@ describe('FundingQuoteProviders', () => {
600
603
  })
601
604
 
602
605
  await expect(
603
- adapter.probeQuote(probeInput(candidate), new AbortController().signal),
604
- ).rejects.toThrowErrorMatchingInlineSnapshot(`[FundingQuoteProviders.ProviderPayloadError]`)
606
+ provider.getQuote(getQuoteInput(candidate), new AbortController().signal),
607
+ ).rejects.toThrowErrorMatchingInlineSnapshot(`[FundingProvider.ProviderPayloadError]`)
605
608
  })
606
609
 
607
610
  test('rejects non-representable Rhino output precision', async () => {
608
611
  const candidate = quoteCandidate('rhino')
609
- const adapter = FundingQuoteProviders.rhino({
612
+ const provider = Rhino.rhino({
610
613
  fetch: recordingFetch([], async () =>
611
614
  jsonResponse({
612
615
  _tag: 'bridge',
@@ -621,8 +624,8 @@ describe('FundingQuoteProviders', () => {
621
624
  })
622
625
 
623
626
  await expect(
624
- adapter.probeQuote(probeInput(candidate), new AbortController().signal),
625
- ).rejects.toThrowErrorMatchingInlineSnapshot(`[FundingQuoteProviders.ProviderPayloadError]`)
627
+ provider.getQuote(getQuoteInput(candidate), new AbortController().signal),
628
+ ).rejects.toThrowErrorMatchingInlineSnapshot(`[FundingProvider.ProviderPayloadError]`)
626
629
  })
627
630
 
628
631
  test('calls the runtime fetch method with its global receiver', async () => {
@@ -641,13 +644,13 @@ describe('FundingQuoteProviders', () => {
641
644
  vi.stubGlobal('fetch', fetch)
642
645
 
643
646
  try {
644
- const adapter = FundingQuoteProviders.relay({
647
+ const provider = Relay.relay({
645
648
  now,
646
649
  userAddress: '0x1111111111111111111111111111111111111111',
647
650
  })
648
- const result = await adapter.probeQuote(probeInput(candidate), new AbortController().signal)
651
+ const result = await provider.getQuote(getQuoteInput(candidate), new AbortController().signal)
649
652
 
650
- expect(result.outputAmount).toBe('990000')
653
+ expect(result.destinationAmount).toBe('990000')
651
654
  expect(fetch).toHaveBeenCalledTimes(1)
652
655
  } finally {
653
656
  vi.unstubAllGlobals()
@@ -692,7 +695,7 @@ describe('FundingQuoteProviders', () => {
692
695
  const candidate = quoteCandidate('across')
693
696
  const body = acrossQuote(candidate)
694
697
  mutate(body)
695
- const adapter = FundingQuoteProviders.across({
698
+ const provider = Across.across({
696
699
  apiKey: 'across-api-key',
697
700
  fetch: recordingFetch([], async () => jsonResponse(body)),
698
701
  integratorId: '0xdead',
@@ -701,8 +704,8 @@ describe('FundingQuoteProviders', () => {
701
704
  })
702
705
 
703
706
  await expect(
704
- adapter.probeQuote(probeInput(candidate), new AbortController().signal),
705
- ).rejects.toThrowErrorMatchingInlineSnapshot(`[FundingQuoteProviders.ProviderPayloadError]`)
707
+ provider.getQuote(getQuoteInput(candidate), new AbortController().signal),
708
+ ).rejects.toThrowErrorMatchingInlineSnapshot(`[FundingProvider.ProviderPayloadError]`)
706
709
  })
707
710
 
708
711
  const invalidSquidQuotes = [
@@ -751,7 +754,7 @@ describe('FundingQuoteProviders', () => {
751
754
  const candidate = quoteCandidate('squid')
752
755
  const body = squidQuote(candidate)
753
756
  mutate(body)
754
- const adapter = FundingQuoteProviders.squid({
757
+ const provider = Squid.squid({
755
758
  fetch: recordingFetch([], async () => jsonResponse(body)),
756
759
  integratorId: 'squid-integrator-id',
757
760
  now,
@@ -759,8 +762,8 @@ describe('FundingQuoteProviders', () => {
759
762
  })
760
763
 
761
764
  await expect(
762
- adapter.probeQuote(probeInput(candidate), new AbortController().signal),
763
- ).rejects.toThrowErrorMatchingInlineSnapshot(`[FundingQuoteProviders.ProviderPayloadError]`)
765
+ provider.getQuote(getQuoteInput(candidate), new AbortController().signal),
766
+ ).rejects.toThrowErrorMatchingInlineSnapshot(`[FundingProvider.ProviderPayloadError]`)
764
767
  })
765
768
 
766
769
  const invalidSymbiosisQuotes = [
@@ -819,20 +822,20 @@ describe('FundingQuoteProviders', () => {
819
822
  const candidate = quoteCandidate('symbiosis')
820
823
  const body = symbiosisQuote(candidate)
821
824
  mutate(body)
822
- const adapter = FundingQuoteProviders.symbiosis({
825
+ const provider = Symbiosis.symbiosis({
823
826
  fetch: recordingFetch([], async () => jsonResponse(body)),
824
827
  now,
825
828
  userAddress: '0x1111111111111111111111111111111111111111',
826
829
  })
827
830
 
828
831
  await expect(
829
- adapter.probeQuote(probeInput(candidate), new AbortController().signal),
830
- ).rejects.toThrowErrorMatchingInlineSnapshot(`[FundingQuoteProviders.ProviderPayloadError]`)
832
+ provider.getQuote(getQuoteInput(candidate), new AbortController().signal),
833
+ ).rejects.toThrowErrorMatchingInlineSnapshot(`[FundingProvider.ProviderPayloadError]`)
831
834
  })
832
835
 
833
836
  test('returns bounded Across failure diagnostics', async () => {
834
837
  const candidate = quoteCandidate('across')
835
- const adapter = FundingQuoteProviders.across({
838
+ const provider = Across.across({
836
839
  apiKey: 'across-api-key',
837
840
  fetch: recordingFetch([], async () =>
838
841
  jsonResponse({ apiKey: 'secret', code: 'UNAUTHORIZED' }, 401),
@@ -841,55 +844,64 @@ describe('FundingQuoteProviders', () => {
841
844
  now,
842
845
  userAddress: '0x1111111111111111111111111111111111111111',
843
846
  })
844
- const cause = await adapter
845
- .probeQuote(probeInput(candidate), new AbortController().signal)
847
+ const cause = await provider
848
+ .getQuote(getQuoteInput(candidate), new AbortController().signal)
846
849
  .catch((error: unknown) => error)
847
850
 
848
- expect(FundingQuoteProviders.providerFailure({ cause, provider: 'across' })).toEqual({
851
+ expect(
852
+ FundingProvider.failure({
853
+ cause,
854
+ operation: 'getQuote',
855
+ provider: getProvider('across'),
856
+ }),
857
+ ).toEqual({
849
858
  code: 'UNAUTHORIZED',
850
859
  failure: 'http',
851
860
  id: 'across',
852
- operation: 'swap/approval',
861
+ operation: 'getQuote',
853
862
  status: 401,
854
863
  })
855
864
  })
856
865
 
857
866
  test('returns explicit timeout failure diagnostics', () => {
858
867
  expect(
859
- FundingQuoteProviders.providerFailure({
860
- cause: new FundingQuotes.ProviderAdapterTimeoutError(),
861
- provider: 'across',
868
+ FundingProvider.failure({
869
+ cause: new FundingProvider.ProviderTimeoutError(),
870
+ operation: 'getQuote',
871
+ provider: getProvider('across'),
862
872
  }),
863
873
  ).toEqual({
864
874
  failure: 'timeout',
865
875
  id: 'across',
866
- operation: 'swap/approval',
876
+ operation: 'getQuote',
867
877
  })
868
878
  })
869
879
 
870
880
  test('returns bounded Squid failure diagnostics', () => {
871
881
  expect(
872
- FundingQuoteProviders.providerFailure({
882
+ FundingProvider.failure({
873
883
  cause: new TypeError('network failure'),
874
- provider: 'squid',
884
+ operation: 'getQuote',
885
+ provider: getProvider('squid'),
875
886
  }),
876
887
  ).toEqual({
877
888
  failure: 'network',
878
889
  id: 'squid',
879
- operation: 'v2/route',
890
+ operation: 'getQuote',
880
891
  })
881
892
  })
882
893
 
883
894
  test('returns bounded Symbiosis failure diagnostics', () => {
884
895
  expect(
885
- FundingQuoteProviders.providerFailure({
896
+ FundingProvider.failure({
886
897
  cause: new TypeError('network failure'),
887
- provider: 'symbiosis',
898
+ operation: 'getQuote',
899
+ provider: getProvider('symbiosis'),
888
900
  }),
889
901
  ).toEqual({
890
902
  failure: 'network',
891
903
  id: 'symbiosis',
892
- operation: 'v2/quote',
904
+ operation: 'getQuote',
893
905
  })
894
906
  })
895
907
  })
@@ -900,12 +912,14 @@ type RecordedRequest = {
900
912
  }
901
913
 
902
914
  function quoteCandidate(
903
- provider: FundingQuotes.ProviderId = 'relay',
915
+ provider: FundingProvider.ProviderId = 'relay',
904
916
  options: quoteCandidate.Options = {},
905
- ): FundingQuotes.QuoteProbeInput['candidate'] {
906
- const [candidate] = FundingQuotes.listQuoteCandidates({
917
+ ): FundingProvider.getQuote.Parameters['candidate'] {
918
+ const [candidate] = FundingProvider.getQuoteCandidates({
919
+ catalog: TestFunding.snapshot,
907
920
  destinationToken: options.destinationToken,
908
921
  provider,
922
+ providers,
909
923
  sourceAmount: '1000000',
910
924
  sourceAmountUnits: 'baseUnits',
911
925
  sourceChain: options.sourceChain ?? 'base',
@@ -915,6 +929,12 @@ function quoteCandidate(
915
929
  return candidate
916
930
  }
917
931
 
932
+ function getProvider(id: FundingProvider.ProviderId) {
933
+ const provider = providers.find((entry) => entry.id === id)
934
+ if (!provider) throw new Error(`Missing ${id} provider`)
935
+ return provider
936
+ }
937
+
918
938
  declare namespace quoteCandidate {
919
939
  type Options = {
920
940
  destinationToken?: string | undefined
@@ -923,7 +943,7 @@ declare namespace quoteCandidate {
923
943
  }
924
944
  }
925
945
 
926
- function acrossQuote(candidate: FundingQuotes.QuoteProbeInput['candidate']) {
946
+ function acrossQuote(candidate: FundingProvider.getQuote.Parameters['candidate']) {
927
947
  return {
928
948
  amountType: 'exactInput',
929
949
  expectedFillTime: 2,
@@ -946,7 +966,7 @@ function acrossQuote(candidate: FundingQuotes.QuoteProbeInput['candidate']) {
946
966
  }
947
967
  }
948
968
 
949
- function squidQuote(candidate: FundingQuotes.QuoteProbeInput['candidate']) {
969
+ function squidQuote(candidate: FundingProvider.getQuote.Parameters['candidate']) {
950
970
  return {
951
971
  route: {
952
972
  estimate: {
@@ -969,7 +989,7 @@ function squidQuote(candidate: FundingQuotes.QuoteProbeInput['candidate']) {
969
989
  }
970
990
  }
971
991
 
972
- function symbiosisQuote(candidate: FundingQuotes.QuoteProbeInput['candidate']) {
992
+ function symbiosisQuote(candidate: FundingProvider.getQuote.Parameters['candidate']) {
973
993
  const source =
974
994
  candidate.sourceChain.kind === 'tron'
975
995
  ? {
@@ -1004,9 +1024,9 @@ function symbiosisQuote(candidate: FundingQuotes.QuoteProbeInput['candidate']) {
1004
1024
  }
1005
1025
  }
1006
1026
 
1007
- function probeInput(
1008
- candidate: FundingQuotes.QuoteProbeInput['candidate'],
1009
- ): FundingQuotes.QuoteProbeInput {
1027
+ function getQuoteInput(
1028
+ candidate: FundingProvider.getQuote.Parameters['candidate'],
1029
+ ): FundingProvider.getQuote.Parameters {
1010
1030
  return {
1011
1031
  candidate,
1012
1032
  cache: { bypass: false },
@@ -1019,6 +1039,7 @@ function probeInput(
1019
1039
  sourceChain: candidate.sourceChain.id,
1020
1040
  sourceToken: candidate.sourceToken.symbol,
1021
1041
  },
1042
+ route: candidate.route,
1022
1043
  sourceAmount: candidate.sourceAmount,
1023
1044
  sourceChain: candidate.sourceChain,
1024
1045
  sourceToken: candidate.sourceToken,