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
@@ -0,0 +1,559 @@
1
+ import { Address, Hash, Hex } from 'ox'
2
+ import * as z from 'zod/mini'
3
+
4
+ import * as Db from '../../../db/Db.js'
5
+ import * as FundingDepositAddresses from '../../../db/tables/fundingDepositAddresses.js'
6
+ import * as FundingChain from '../Chain.js'
7
+ import * as FundingProvider from '../Provider.js'
8
+ import * as Subsidy from '../Subsidy.js'
9
+
10
+ const defaultBaseUrl = 'https://api.relay.link'
11
+ const defaultFetch: FundingProvider.Fetch = (input, init) => globalThis.fetch(input, init)
12
+ const webhookSignatureToleranceSeconds = 300
13
+
14
+ namespace schema {
15
+ const Decimal = z.union([
16
+ z.string().check(z.regex(/^\d+(\.\d+)?$/)),
17
+ z.pipe(
18
+ z.number().check(z.nonnegative()),
19
+ z.transform((value) => String(value)),
20
+ ),
21
+ ])
22
+
23
+ const Integer = z.union([
24
+ z.number().check(z.int(), z.nonnegative()),
25
+ z.pipe(
26
+ z.pipe(
27
+ z.string().check(z.regex(/^\d+$/)),
28
+ z.transform((value) => Number(value)),
29
+ ),
30
+ z.number().check(z.int(), z.nonnegative()),
31
+ ),
32
+ ])
33
+
34
+ export const Quote = z.object({
35
+ details: z.optional(
36
+ z.object({
37
+ currencyOut: z.optional(
38
+ z.object({
39
+ amount: z.optional(Decimal),
40
+ minimumAmount: z.optional(Decimal),
41
+ }),
42
+ ),
43
+ timeEstimate: z.optional(Integer),
44
+ }),
45
+ ),
46
+ })
47
+
48
+ const StepCall = z.object({
49
+ chainId: Integer,
50
+ data: z.string().check(z.regex(/^0x[0-9a-fA-F]*$/)),
51
+ from: z.string(),
52
+ to: z.string().check(z.regex(/^0x[0-9a-fA-F]{40}$/)),
53
+ value: z.optional(z.string().check(z.regex(/^\d+$/))),
54
+ })
55
+
56
+ const StepItem = z.object({
57
+ check: z.optional(z.object({ endpoint: z.string() })),
58
+ data: StepCall,
59
+ })
60
+
61
+ const Step = z.object({
62
+ depositAddress: z.optional(z.string()),
63
+ id: z.string(),
64
+ items: z.optional(z.array(StepItem)),
65
+ kind: z.string(),
66
+ requestId: z.optional(z.string()),
67
+ })
68
+
69
+ export const PreparedQuote = z.object({
70
+ details: z.object({
71
+ currencyIn: z.object({ amount: Decimal }),
72
+ currencyOut: z.object({ amount: Decimal, minimumAmount: Decimal }),
73
+ timeEstimate: z.optional(Integer),
74
+ }),
75
+ fees: z.optional(
76
+ z.object({
77
+ relayer: z.optional(z.object({ amount: Decimal })),
78
+ }),
79
+ ),
80
+ steps: z.array(Step),
81
+ })
82
+
83
+ export const DepositAddress = z.object({
84
+ details: PreparedQuote.shape.details,
85
+ fees: PreparedQuote.shape.fees,
86
+ steps: z.array(
87
+ z.object({
88
+ depositAddress: z.optional(z.string()),
89
+ items: z.optional(
90
+ z.array(
91
+ z.object({
92
+ check: z.optional(z.object({ endpoint: z.string() })),
93
+ }),
94
+ ),
95
+ ),
96
+ requestId: z.optional(z.string()),
97
+ }),
98
+ ),
99
+ })
100
+
101
+ const RequestTransaction = z.object({
102
+ hash: z.string().check(z.minLength(1)),
103
+ })
104
+
105
+ export const Requests = z.object({
106
+ continuation: z.optional(z.string().check(z.minLength(1))),
107
+ requests: z.array(
108
+ z.object({
109
+ createdAt: z.iso.datetime(),
110
+ data: z.optional(
111
+ z.object({
112
+ outTxs: z.optional(z.array(RequestTransaction)),
113
+ }),
114
+ ),
115
+ depositAddress: z.optional(
116
+ z.object({
117
+ depositTxHash: z.optional(z.string().check(z.minLength(1))),
118
+ }),
119
+ ),
120
+ id: z.string().check(z.minLength(1)),
121
+ status: z.string().check(z.minLength(1)),
122
+ updatedAt: z.iso.datetime(),
123
+ }),
124
+ ),
125
+ })
126
+
127
+ export const WebhookPayload = z.object({
128
+ data: z.object({
129
+ depositAddress: z.nullable(z.object({ address: z.string().check(z.minLength(1)) })),
130
+ requestId: z.optional(z.string().check(z.minLength(1))),
131
+ }),
132
+ event: z.literal('request.status.updated'),
133
+ })
134
+ }
135
+
136
+ /** Creates a Relay funding provider backed by `/quote/v2`. */
137
+ export function relay(options: relay.Options = {}): FundingProvider.Provider<'relay'> {
138
+ if (
139
+ (options.userAddress !== undefined &&
140
+ !Address.validate(options.userAddress, { strict: false })) ||
141
+ (options.recipientAddress !== undefined &&
142
+ !Address.validate(options.recipientAddress, { strict: false }))
143
+ )
144
+ throw new FundingProvider.ProviderConfigurationError()
145
+
146
+ const endpoint = quoteEndpoint(options)
147
+ const fetch = options.fetch ?? defaultFetch
148
+ const now = options.now ?? (() => new Date())
149
+ const webhook = (() => {
150
+ if (!options.apiKey || !options.webhook) return undefined
151
+ const { apiKey, webhook } = options
152
+ const verify = (input: FundingProvider.Webhook.verify.Parameters) =>
153
+ verifyWebhook(webhookOptions(input, apiKey))
154
+ return {
155
+ async receive(input: FundingProvider.Webhook.receive.Parameters) {
156
+ const hint = (() => {
157
+ try {
158
+ return verify(input)
159
+ } catch (cause) {
160
+ webhook.onResult?.(
161
+ cause instanceof FundingProvider.WebhookAuthenticationError
162
+ ? 'authentication_failed'
163
+ : 'payload_invalid',
164
+ )
165
+ throw cause
166
+ }
167
+ })()
168
+ if (!hint.address) {
169
+ webhook.onResult?.('ignored')
170
+ return { type: 'ignored' as const }
171
+ }
172
+ const address = await FundingDepositAddresses.getByProviderAddress(Db.get(webhook.db), {
173
+ address: hint.address,
174
+ providerId: 'relay',
175
+ })
176
+ if (!address) {
177
+ webhook.onResult?.('unknown_address')
178
+ return { type: 'unknown_address' as const }
179
+ }
180
+ try {
181
+ await webhook.dispatch({
182
+ addressId: address.id,
183
+ ...(hint.requestId ? { requestId: hint.requestId } : {}),
184
+ type: 'funding:deposit-address:reconcile',
185
+ })
186
+ } catch (cause) {
187
+ webhook.onResult?.('enqueue_failed')
188
+ throw cause
189
+ }
190
+ webhook.onResult?.('queued')
191
+ return { addressId: address.id, type: 'queued' as const }
192
+ },
193
+ verify,
194
+ }
195
+ })()
196
+
197
+ return FundingProvider.from({
198
+ id: 'relay',
199
+ name: 'Relay',
200
+ ...(webhook ? { webhook } : {}),
201
+ async createDepositAddress({ amount, candidate, recipient, refundAddress, subsidize }, signal) {
202
+ if (
203
+ subsidize &&
204
+ (!options.subsidies ||
205
+ !Subsidy.supports(options.subsidies, {
206
+ amount,
207
+ destinationToken: candidate.destinationToken,
208
+ sourceToken: candidate.sourceToken,
209
+ }))
210
+ )
211
+ throw new FundingProvider.ProviderUnavailableError()
212
+ const quote = await (async () => {
213
+ try {
214
+ return await FundingProvider.requestJson(endpoint, {
215
+ body: {
216
+ amount,
217
+ destinationChainId: relayChainId(candidate.route.destination.chain),
218
+ destinationCurrency: candidate.destinationToken.address,
219
+ originChainId: relayChainId(candidate.route.source.chain),
220
+ originCurrency: candidate.sourceToken.address,
221
+ recipient,
222
+ refundTo: refundAddress,
223
+ subsidizeFees: subsidize,
224
+ tradeType: 'EXACT_INPUT',
225
+ useDepositAddress: true,
226
+ user: refundAddress,
227
+ },
228
+ fetch,
229
+ headers: options.apiKey ? { 'x-api-key': options.apiKey } : undefined,
230
+ method: 'POST',
231
+ signal,
232
+ })
233
+ } catch (cause) {
234
+ if (FundingProvider.unavailable(cause, ['NO_QUOTES', 'NO_ROUTE', 'UNSUPPORTED_ROUTE']))
235
+ throw new FundingProvider.ProviderUnavailableError()
236
+ throw cause
237
+ }
238
+ })()
239
+ const parsed = schema.DepositAddress.safeParse(quote)
240
+ if (!parsed.success) throw new FundingProvider.ProviderPayloadError()
241
+ if (parsed.data.details.currencyIn.amount !== amount)
242
+ throw new FundingProvider.ProviderPayloadError()
243
+ const step = parsed.data.steps.find(
244
+ (candidate) => candidate.depositAddress && candidate.requestId,
245
+ )
246
+ if (!step?.depositAddress || !step.requestId) throw new FundingProvider.ProviderPayloadError()
247
+ const checkEndpoint = step.items?.find((item) => item.check)?.check?.endpoint
248
+ const providerFee = parsed.data.fees?.relayer?.amount
249
+ return {
250
+ address: step.depositAddress,
251
+ correlation: {
252
+ ...(checkEndpoint ? { checkEndpoint } : {}),
253
+ requestId: step.requestId,
254
+ },
255
+ destinationAmount: parsed.data.details.currencyOut.amount,
256
+ destinationAmountMin: parsed.data.details.currencyOut.minimumAmount,
257
+ fees:
258
+ providerFee && BigInt(providerFee) > 0n ? [{ amount: providerFee, side: 'source' }] : [],
259
+ sampledAt: now().toISOString(),
260
+ }
261
+ },
262
+ async getQuote({ candidate, route }, signal) {
263
+ if (options.userAddress === undefined)
264
+ return FundingProvider.unavailableResult({
265
+ detail: 'relay:quote-v2',
266
+ message: 'QUOTE_USER_NOT_CONFIGURED',
267
+ now: now(),
268
+ source: 'providerQuote',
269
+ })
270
+ const destinationChainId = relayChainId(route.destination.chain)
271
+ const sourceChainId = relayChainId(route.source.chain)
272
+ try {
273
+ const quote = await FundingProvider.requestJson(endpoint, {
274
+ body: {
275
+ amount: candidate.sourceAmount.amount,
276
+ destinationChainId,
277
+ destinationCurrency: candidate.destinationToken.address,
278
+ originChainId: sourceChainId,
279
+ originCurrency: candidate.sourceToken.address,
280
+ recipient: options.recipientAddress ?? options.userAddress,
281
+ tradeType: 'EXACT_INPUT',
282
+ user: options.userAddress,
283
+ },
284
+ fetch,
285
+ headers: options.apiKey ? { 'x-api-key': options.apiKey } : undefined,
286
+ method: 'POST',
287
+ signal,
288
+ })
289
+ const parsed = schema.Quote.safeParse(quote)
290
+ if (!parsed.success) throw new FundingProvider.ProviderPayloadError()
291
+ const destinationAmount = parsed.data.details?.currencyOut?.amount
292
+ const status = destinationAmount
293
+ ? { status: 'available' as const, tier: 'liquid' as const }
294
+ : { status: 'unknown' as const, tier: 'unknown' as const }
295
+
296
+ return {
297
+ destinationAmountMin: parsed.data.details?.currencyOut?.minimumAmount,
298
+ destinationAmount,
299
+ quality: {
300
+ estimatedSeconds: parsed.data.details?.timeEstimate,
301
+ liquiditySource: 'providerQuote',
302
+ sourceDetail: 'relay:quote-v2',
303
+ tier: status.tier,
304
+ },
305
+ sampledAt: now().toISOString(),
306
+ status: status.status,
307
+ }
308
+ } catch (cause) {
309
+ const unavailable = FundingProvider.unavailable(cause, [
310
+ 'NO_QUOTES',
311
+ 'NO_ROUTE',
312
+ 'UNSUPPORTED_ROUTE',
313
+ ])
314
+ if (!unavailable) throw cause
315
+ return FundingProvider.unavailableResult({
316
+ detail: 'relay:quote-v2',
317
+ message: unavailable,
318
+ now: now(),
319
+ source: 'providerQuote',
320
+ })
321
+ }
322
+ },
323
+ async listDepositAddressRequests({ address, continuation, requestId }, signal) {
324
+ const requestUrl = requestsEndpoint(options)
325
+ if (requestId) requestUrl.searchParams.set('id', requestId)
326
+ else {
327
+ requestUrl.searchParams.set('depositAddress', address)
328
+ requestUrl.searchParams.set('includeChildRequests', 'true')
329
+ }
330
+ requestUrl.searchParams.set('limit', '50')
331
+ requestUrl.searchParams.set('sortBy', 'updatedAt')
332
+ requestUrl.searchParams.set('sortDirection', 'desc')
333
+ if (continuation) requestUrl.searchParams.set('continuation', continuation)
334
+ const response = await FundingProvider.requestJson(requestUrl, {
335
+ fetch,
336
+ headers: options.apiKey ? { 'x-api-key': options.apiKey } : undefined,
337
+ method: 'GET',
338
+ signal,
339
+ })
340
+ const parsed = schema.Requests.safeParse(response)
341
+ if (!parsed.success) throw new FundingProvider.ProviderPayloadError()
342
+ return {
343
+ ...(parsed.data.continuation ? { continuation: parsed.data.continuation } : {}),
344
+ requests: parsed.data.requests.map((request) => ({
345
+ createdAt: new Date(request.createdAt).toISOString(),
346
+ destinationTransactionHashes: request.data?.outTxs?.map((tx) => tx.hash) ?? [],
347
+ id: request.id,
348
+ sourceTransactionHashes: request.depositAddress?.depositTxHash
349
+ ? [request.depositAddress.depositTxHash]
350
+ : [],
351
+ status: request.status,
352
+ updatedAt: new Date(request.updatedAt).toISOString(),
353
+ })),
354
+ }
355
+ },
356
+ async prepareTransfer({ candidate, method, mode, recipient, sender, slippageBps }, signal) {
357
+ // Catalog capabilities gate deposit addresses and exact destination
358
+ // off this adapter; refuse them defensively if one slips through.
359
+ if (method !== 'transaction' || mode !== 'exactSource')
360
+ throw new FundingProvider.ProviderConfigurationError()
361
+ const quote = await (async () => {
362
+ try {
363
+ return await FundingProvider.requestJson(endpoint, {
364
+ body: {
365
+ amount: candidate.sourceAmount.amount,
366
+ destinationChainId: Number(FundingChain.eip155Id(candidate.route.destination.chain)),
367
+ destinationCurrency: candidate.destinationToken.address,
368
+ originChainId: Number(FundingChain.eip155Id(candidate.route.source.chain)),
369
+ originCurrency: candidate.sourceToken.address,
370
+ recipient,
371
+ ...(slippageBps !== undefined ? { slippageTolerance: String(slippageBps) } : {}),
372
+ tradeType: 'EXACT_INPUT',
373
+ user: sender,
374
+ },
375
+ fetch,
376
+ headers: options.apiKey ? { 'x-api-key': options.apiKey } : undefined,
377
+ method: 'POST',
378
+ signal,
379
+ })
380
+ } catch (cause) {
381
+ if (FundingProvider.unavailable(cause, ['NO_QUOTES', 'NO_ROUTE', 'UNSUPPORTED_ROUTE']))
382
+ throw new FundingProvider.ProviderUnavailableError()
383
+ throw cause
384
+ }
385
+ })()
386
+ const parsed = schema.PreparedQuote.safeParse(quote)
387
+ if (!parsed.success) throw new FundingProvider.ProviderPayloadError()
388
+ const { details, fees, steps } = parsed.data
389
+ // The quoted input must match the request exactly; a drifted amount
390
+ // would desynchronize the stored terms from the prepared calls.
391
+ if (details.currencyIn.amount !== candidate.sourceAmount.amount)
392
+ throw new FundingProvider.ProviderPayloadError()
393
+
394
+ const items = steps
395
+ .filter((step) => step.kind === 'transaction')
396
+ .flatMap((step) => step.items ?? [])
397
+ const requestId = steps.find((step) => step.requestId)?.requestId
398
+ if (items.length === 0 || !requestId) throw new FundingProvider.ProviderPayloadError()
399
+ const sourceChainId = Number(FundingChain.eip155Id(candidate.route.source.chain))
400
+ for (const item of items)
401
+ if (
402
+ item.data.chainId !== sourceChainId ||
403
+ item.data.from.toLowerCase() !== sender.toLowerCase()
404
+ )
405
+ throw new FundingProvider.ProviderPayloadError()
406
+
407
+ const checkEndpoint = items.find((item) => item.check)?.check?.endpoint
408
+ // Relay's `relayer` fee is the solver's total source-side charge (gas
409
+ // plus service); it surfaces as the transfer's provider fee.
410
+ const providerFee = fees?.relayer?.amount
411
+ return {
412
+ action: {
413
+ calls: items.map((item) => ({
414
+ data: item.data.data,
415
+ to: item.data.to,
416
+ value: Hex.fromNumber(BigInt(item.data.value ?? '0')),
417
+ })),
418
+ type: 'evm:calls',
419
+ },
420
+ correlation: { ...(checkEndpoint ? { checkEndpoint } : {}), requestId },
421
+ fees:
422
+ providerFee && BigInt(providerFee) > 0n ? [{ amount: providerFee, side: 'source' }] : [],
423
+ destinationAmountMin: details.currencyOut.minimumAmount,
424
+ destinationAmount: details.currencyOut.amount,
425
+ quality: {
426
+ ...(details.timeEstimate !== undefined ? { estimatedSeconds: details.timeEstimate } : {}),
427
+ liquiditySource: 'providerQuote',
428
+ sourceDetail: 'relay:quote-v2',
429
+ tier: 'liquid',
430
+ },
431
+ sampledAt: now().toISOString(),
432
+ }
433
+ },
434
+ })
435
+ }
436
+
437
+ export declare namespace relay {
438
+ /** Relay provider options. */
439
+ type Options = {
440
+ /** Optional Relay API key for higher rate limits. */
441
+ apiKey?: string | undefined
442
+ /** Override for tests or Relay test environments. */
443
+ baseUrl?: string | undefined
444
+ /** Fetch implementation override for tests. */
445
+ fetch?: FundingProvider.Fetch | undefined
446
+ /** Clock override for deterministic tests. */
447
+ now?: (() => Date) | undefined
448
+ /** Optional recipient override; defaults to `userAddress`. */
449
+ recipientAddress?: string | undefined
450
+ /** Deposit subsidy policy enabled for this integration. */
451
+ subsidies?: Subsidy.Policy | undefined
452
+ /** Optional wallet address for indicative quotes. */
453
+ userAddress?: string | undefined
454
+ /** Tempo infrastructure used to receive authenticated Relay webhooks. */
455
+ webhook?: Webhook | undefined
456
+ }
457
+
458
+ /** Authenticated Relay webhook integration attached to a provider instance. */
459
+ type Webhook = {
460
+ /** Authoritative funding database or per-request database factory. */
461
+ db: Db.Source
462
+ /** Enqueues one bounded reconciliation hint. */
463
+ dispatch: (message: FundingProvider.Webhook.receive.Dispatchable) => Promise<void>
464
+ /** Observes one bounded webhook disposition. */
465
+ onResult?: ((result: WebhookResult) => void) | undefined
466
+ }
467
+
468
+ /** Bounded operational result emitted while receiving a Relay webhook. */
469
+ type WebhookResult =
470
+ | 'authentication_failed'
471
+ | 'enqueue_failed'
472
+ | 'ignored'
473
+ | 'payload_invalid'
474
+ | 'queued'
475
+ | 'unknown_address'
476
+ }
477
+
478
+ type VerifyWebhookOptions = {
479
+ body: string
480
+ secret: string
481
+ signature: string
482
+ timestamp: string
483
+ }
484
+
485
+ function verifyWebhook(options: VerifyWebhookOptions): FundingProvider.Webhook.verify.ReturnType {
486
+ const timestamp = Number(options.timestamp)
487
+ if (!Number.isSafeInteger(timestamp)) throw new WebhookSignatureError()
488
+ const now = Math.floor(Date.now() / 1_000)
489
+ if (Math.abs(now - timestamp) > webhookSignatureToleranceSeconds)
490
+ throw new WebhookSignatureError()
491
+ if (!/^[0-9a-fA-F]{64}$/.test(options.signature)) throw new WebhookSignatureError()
492
+ const expected = Hash.hmac256(
493
+ Hex.fromString(options.secret),
494
+ Hex.fromString(`${options.timestamp}.${options.body}`),
495
+ ).slice(2)
496
+ if (!timingSafeEqual(expected, options.signature)) throw new WebhookSignatureError()
497
+
498
+ const payload = (() => {
499
+ try {
500
+ return JSON.parse(options.body) as unknown
501
+ } catch {
502
+ throw new WebhookPayloadError()
503
+ }
504
+ })()
505
+ const parsed = schema.WebhookPayload.safeParse(payload)
506
+ if (!parsed.success) throw new WebhookPayloadError()
507
+ return {
508
+ address: parsed.data.data.depositAddress?.address,
509
+ requestId: parsed.data.data.requestId,
510
+ }
511
+ }
512
+
513
+ function webhookOptions(
514
+ input: FundingProvider.Webhook.verify.Parameters,
515
+ secret: string,
516
+ ): VerifyWebhookOptions {
517
+ const signature = input.headers.get('x-signature-sha256')
518
+ const timestamp = input.headers.get('x-signature-timestamp')
519
+ if (!signature || !timestamp) throw new WebhookSignatureError()
520
+ return { body: input.body, secret, signature, timestamp }
521
+ }
522
+
523
+ function quoteEndpoint(options: relay.Options): URL {
524
+ const endpoint = new URL(options.baseUrl ?? defaultBaseUrl)
525
+ endpoint.pathname = `${endpoint.pathname.replace(/\/+$/, '')}/quote/v2`
526
+ return endpoint
527
+ }
528
+
529
+ function requestsEndpoint(options: relay.Options): URL {
530
+ const endpoint = new URL(options.baseUrl ?? defaultBaseUrl)
531
+ endpoint.pathname = `${endpoint.pathname.replace(/\/+$/, '')}/requests/v2`
532
+ return endpoint
533
+ }
534
+
535
+ function timingSafeEqual(left: string, right: string): boolean {
536
+ if (left.length !== right.length) return false
537
+ let mismatch = 0
538
+ for (let index = 0; index < left.length; index++)
539
+ mismatch |= left.charCodeAt(index) ^ right.charCodeAt(index)
540
+ return mismatch === 0
541
+ }
542
+
543
+ function relayChainId(chain: FundingProvider.Chain): number {
544
+ if (chain.id.startsWith('eip155:')) return Number(FundingChain.eip155Id(chain))
545
+ // Relay uses a numeric chain ID for Solana instead of its CAIP-2 reference.
546
+ if (chain.id === 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp') return 792_703_809
547
+ if (chain.id.startsWith('tron:')) return Number(chain.id.slice('tron:'.length))
548
+ throw new FundingProvider.ProviderConfigurationError()
549
+ }
550
+
551
+ /** Relay webhook signature is missing, stale, or invalid. */
552
+ export class WebhookSignatureError extends FundingProvider.WebhookAuthenticationError {
553
+ override name = 'Funding.Provider.Relay.WebhookSignatureError'
554
+ }
555
+
556
+ /** Relay webhook body does not match the expected status event shape. */
557
+ export class WebhookPayloadError extends FundingProvider.WebhookPayloadError {
558
+ override name = 'Funding.Provider.Relay.WebhookPayloadError'
559
+ }
@@ -0,0 +1,139 @@
1
+ import { Value as core_Value } from 'ox'
2
+ import * as z from 'zod/mini'
3
+
4
+ import type * as FundingChain from '../Chain.js'
5
+ import type * as FundingToken from '../Token.js'
6
+ import * as FundingProvider from '../Provider.js'
7
+
8
+ const defaultBaseUrl = 'https://api.rhino.fi/bridge'
9
+ const defaultFetch: FundingProvider.Fetch = (input, init) => globalThis.fetch(input, init)
10
+
11
+ const chainIds = {
12
+ 'eip155:4217': 'TEMPO',
13
+ 'eip155:8453': 'BASE',
14
+ 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp': 'SOLANA',
15
+ 'tron:0x2b6653dc': 'TRON',
16
+ } as const satisfies Record<string, string>
17
+
18
+ const tokenIds = {
19
+ usdce: 'USDC',
20
+ usdt0: 'USDT',
21
+ } as const satisfies Record<string, string>
22
+
23
+ namespace schema {
24
+ export const Quote = z.object({
25
+ _tag: z.literal('bridge'),
26
+ chainIn: z.string(),
27
+ chainOut: z.string(),
28
+ estimatedDuration: z.optional(z.nullable(z.number().check(z.nonnegative()))),
29
+ payAmount: z.string().check(z.regex(/^\d+(\.\d+)?$/)),
30
+ receiveAmount: z.string().check(z.regex(/^\d+(\.\d+)?$/)),
31
+ token: z.string(),
32
+ })
33
+ }
34
+
35
+ /** Creates a Rhino funding provider backed by its public bridge-and-swap quote endpoint. */
36
+ export function rhino(options: rhino.Options = {}) {
37
+ const endpoint = new URL(options.baseUrl ?? defaultBaseUrl)
38
+ endpoint.pathname = `${endpoint.pathname.replace(/\/+$/, '')}/quote/bridge-swap/public`
39
+ const fetch = options.fetch ?? defaultFetch
40
+ const now = options.now ?? (() => new Date())
41
+
42
+ return FundingProvider.from({
43
+ id: 'rhino',
44
+ name: 'Rhino',
45
+ async getQuote({ cache, candidate, route }, signal) {
46
+ const chainIn = chainId(route.source.chain)
47
+ const chainOut = chainId(route.destination.chain)
48
+ const tokenOut = tokenId(route.destination)
49
+ const url = new URL(endpoint)
50
+ url.search = new URLSearchParams({
51
+ amount: candidate.sourceAmount.formatted,
52
+ amountNative: '0',
53
+ chainIn,
54
+ chainOut,
55
+ mode: 'pay',
56
+ tokenIn: candidate.sourceToken.symbol,
57
+ tokenOut,
58
+ }).toString()
59
+
60
+ try {
61
+ const quote = await FundingProvider.requestJson(url, {
62
+ fetch,
63
+ headers: cache.bypass ? { 'cache-control': 'no-cache' } : undefined,
64
+ signal,
65
+ })
66
+ const parsed = schema.Quote.safeParse(quote)
67
+ if (!parsed.success) throw new FundingProvider.ProviderPayloadError()
68
+ const response = parsed.data
69
+ const inputAmount = parseAmount(response.payAmount, candidate.sourceToken.decimals)
70
+ const destinationAmount = parseAmount(
71
+ response.receiveAmount,
72
+ candidate.destinationToken.decimals,
73
+ )
74
+ if (
75
+ response.chainIn !== chainIn ||
76
+ response.chainOut !== chainOut ||
77
+ response.token !== tokenOut ||
78
+ inputAmount !== candidate.sourceAmount.amount ||
79
+ destinationAmount === undefined ||
80
+ BigInt(destinationAmount) <= 0n
81
+ )
82
+ throw new FundingProvider.ProviderPayloadError()
83
+
84
+ return {
85
+ destinationAmount,
86
+ quality: {
87
+ ...(response.estimatedDuration === undefined || response.estimatedDuration === null
88
+ ? {}
89
+ : { estimatedSeconds: Math.ceil(response.estimatedDuration / 1_000) }),
90
+ liquiditySource: 'providerQuote',
91
+ sourceDetail: 'rhino:bridge-swap-public',
92
+ tier: 'liquid',
93
+ },
94
+ sampledAt: now().toISOString(),
95
+ status: 'available',
96
+ }
97
+ } catch (cause) {
98
+ const unavailable = FundingProvider.unavailable(cause, ['NoRouteFoundError'])
99
+ if (!unavailable) throw cause
100
+ return FundingProvider.unavailableResult({
101
+ detail: 'rhino:bridge-swap-public',
102
+ message: unavailable,
103
+ now: now(),
104
+ source: 'providerQuote',
105
+ })
106
+ }
107
+ },
108
+ })
109
+ }
110
+
111
+ export declare namespace rhino {
112
+ /** Rhino provider options. */
113
+ type Options = {
114
+ /** Override for tests or Rhino test environments. */
115
+ baseUrl?: string | undefined
116
+ /** Fetch implementation override for tests. */
117
+ fetch?: FundingProvider.Fetch | undefined
118
+ /** Clock override for deterministic tests. */
119
+ now?: (() => Date) | undefined
120
+ }
121
+ }
122
+
123
+ function parseAmount(value: string, decimals: number) {
124
+ const fraction = value.split('.')[1]?.replace(/0+$/, '') ?? ''
125
+ if (fraction.length > decimals) return undefined
126
+ return core_Value.from(value, decimals).toString()
127
+ }
128
+
129
+ function chainId(chain: FundingChain.Chain) {
130
+ const id = chainIds[chain.id as keyof typeof chainIds]
131
+ if (!id) throw new FundingProvider.ProviderConfigurationError()
132
+ return id
133
+ }
134
+
135
+ function tokenId(token: FundingToken.Resolved) {
136
+ const id = tokenIds[token.slug as keyof typeof tokenIds]
137
+ if (!id) throw new FundingProvider.ProviderConfigurationError()
138
+ return id
139
+ }