tapimo 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (786) hide show
  1. package/README.md +10 -7
  2. package/dist/ApiKey.d.ts +3 -0
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +10 -0
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +29 -8
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +24 -5
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +20680 -15487
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +250 -129
  13. package/dist/App.js.map +1 -1
  14. package/dist/Assets.d.ts +10 -0
  15. package/dist/Assets.d.ts.map +1 -1
  16. package/dist/Assets.js +17 -4
  17. package/dist/Assets.js.map +1 -1
  18. package/dist/Scope.d.ts +19 -8
  19. package/dist/Scope.d.ts.map +1 -1
  20. package/dist/Scope.js +25 -9
  21. package/dist/Scope.js.map +1 -1
  22. package/dist/Webhooks.d.ts +1 -1
  23. package/dist/admin/App.d.ts +667 -76
  24. package/dist/admin/App.d.ts.map +1 -1
  25. package/dist/admin/App.js +12 -2
  26. package/dist/admin/App.js.map +1 -1
  27. package/dist/admin/apps/api-keys.d.ts +107 -11
  28. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  29. package/dist/admin/apps/api-keys.js +145 -32
  30. package/dist/admin/apps/api-keys.js.map +1 -1
  31. package/dist/admin/apps/earn-vaults.d.ts +1069 -0
  32. package/dist/admin/apps/earn-vaults.d.ts.map +1 -0
  33. package/dist/admin/apps/earn-vaults.js +409 -0
  34. package/dist/admin/apps/earn-vaults.js.map +1 -0
  35. package/dist/admin/apps/organizations.d.ts +2 -0
  36. package/dist/admin/apps/organizations.d.ts.map +1 -1
  37. package/dist/admin/apps/verified-tokens.d.ts +74 -74
  38. package/dist/admin/ui.generated.d.ts +1 -1
  39. package/dist/admin/ui.generated.d.ts.map +1 -1
  40. package/dist/admin/ui.generated.js +99 -43
  41. package/dist/admin/ui.generated.js.map +1 -1
  42. package/dist/analytics/Analytics.d.ts +4 -0
  43. package/dist/analytics/Analytics.d.ts.map +1 -1
  44. package/dist/analytics/Analytics.js +21 -2
  45. package/dist/analytics/Analytics.js.map +1 -1
  46. package/dist/analytics/tables/requestEvents.d.ts +22 -1
  47. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  48. package/dist/analytics/tables/requestEvents.js +59 -39
  49. package/dist/analytics/tables/requestEvents.js.map +1 -1
  50. package/dist/apps/Zones.d.ts +8335 -0
  51. package/dist/apps/Zones.d.ts.map +1 -0
  52. package/dist/apps/Zones.js +38 -0
  53. package/dist/apps/Zones.js.map +1 -0
  54. package/dist/apps/data/App.d.ts +5666 -3934
  55. package/dist/apps/data/App.d.ts.map +1 -1
  56. package/dist/apps/data/App.js +90 -22
  57. package/dist/apps/data/App.js.map +1 -1
  58. package/dist/apps/data/FxOracle.d.ts +1 -1
  59. package/dist/apps/data/FxOracle.d.ts.map +1 -1
  60. package/dist/apps/data/index.d.ts +0 -1
  61. package/dist/apps/data/index.d.ts.map +1 -1
  62. package/dist/apps/data/index.js +0 -1
  63. package/dist/apps/data/index.js.map +1 -1
  64. package/dist/apps/data/routes/activities.d.ts +56 -56
  65. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  66. package/dist/apps/data/routes/activities.js +130 -65
  67. package/dist/apps/data/routes/activities.js.map +1 -1
  68. package/dist/apps/data/routes/addresses.d.ts +65 -65
  69. package/dist/apps/data/routes/balances.d.ts +14 -14
  70. package/dist/apps/data/routes/balances.js +5 -5
  71. package/dist/apps/data/routes/balances.js.map +1 -1
  72. package/dist/apps/data/routes/blocks.d.ts +39 -39
  73. package/dist/apps/data/routes/coingecko.d.ts +54 -54
  74. package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
  75. package/dist/apps/data/routes/coingecko.js +62 -35
  76. package/dist/apps/data/routes/coingecko.js.map +1 -1
  77. package/dist/apps/data/routes/earn.d.ts +2574 -0
  78. package/dist/apps/data/routes/earn.d.ts.map +1 -0
  79. package/dist/apps/data/routes/earn.js +1574 -0
  80. package/dist/apps/data/routes/earn.js.map +1 -0
  81. package/dist/apps/data/routes/exchanges.d.ts +1626 -719
  82. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  83. package/dist/apps/data/routes/exchanges.js +656 -193
  84. package/dist/apps/data/routes/exchanges.js.map +1 -1
  85. package/dist/apps/data/routes/fee-amm.d.ts +108 -108
  86. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  87. package/dist/apps/data/routes/fee-amm.js +59 -8
  88. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  89. package/dist/apps/data/routes/indexer.d.ts +35 -35
  90. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  91. package/dist/apps/data/routes/indexer.js +23 -3
  92. package/dist/apps/data/routes/indexer.js.map +1 -1
  93. package/dist/apps/data/routes/receipts.d.ts +33 -33
  94. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  95. package/dist/apps/data/routes/receipts.js +11 -11
  96. package/dist/apps/data/routes/receipts.js.map +1 -1
  97. package/dist/apps/data/routes/rpc.d.ts +6 -6
  98. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  99. package/dist/apps/data/routes/rpc.js +214 -22
  100. package/dist/apps/data/routes/rpc.js.map +1 -1
  101. package/dist/apps/data/routes/tokenlist.d.ts +1 -1
  102. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  103. package/dist/apps/data/routes/tokenlist.js +39 -8
  104. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  105. package/dist/apps/data/routes/tokens.d.ts +115 -87
  106. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  107. package/dist/apps/data/routes/tokens.js +194 -91
  108. package/dist/apps/data/routes/tokens.js.map +1 -1
  109. package/dist/apps/data/routes/transactions.d.ts +54 -54
  110. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  111. package/dist/apps/data/routes/transactions.js +78 -39
  112. package/dist/apps/data/routes/transactions.js.map +1 -1
  113. package/dist/apps/data/routes/transfers.d.ts +76 -27
  114. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  115. package/dist/apps/data/routes/transfers.js +165 -67
  116. package/dist/apps/data/routes/transfers.js.map +1 -1
  117. package/dist/apps/data/routes/valuation.d.ts +42 -42
  118. package/dist/apps/data/routes/valuation.js +2 -2
  119. package/dist/apps/data/routes/valuation.js.map +1 -1
  120. package/dist/apps/data/routes/verified-tokens.d.ts +36 -36
  121. package/dist/apps/data/routes/webhooks.d.ts +370 -368
  122. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  123. package/dist/apps/data/routes/webhooks.js +161 -59
  124. package/dist/apps/data/routes/webhooks.js.map +1 -1
  125. package/dist/apps/data/routes/zones.d.ts +281 -0
  126. package/dist/apps/data/routes/zones.d.ts.map +1 -0
  127. package/dist/apps/data/routes/zones.js +252 -0
  128. package/dist/apps/data/routes/zones.js.map +1 -0
  129. package/dist/apps/docs/reference.js +6 -5
  130. package/dist/apps/docs/reference.js.map +1 -1
  131. package/dist/apps/funding/Access.d.ts +16 -0
  132. package/dist/apps/funding/Access.d.ts.map +1 -0
  133. package/dist/apps/funding/Access.js +22 -0
  134. package/dist/apps/funding/Access.js.map +1 -0
  135. package/dist/apps/funding/App.d.ts +3183 -0
  136. package/dist/apps/funding/App.d.ts.map +1 -0
  137. package/dist/apps/funding/App.js +46 -0
  138. package/dist/apps/funding/App.js.map +1 -0
  139. package/dist/apps/funding/Inventory.d.ts +5 -0
  140. package/dist/apps/funding/Inventory.d.ts.map +1 -0
  141. package/dist/apps/funding/Inventory.js +25 -0
  142. package/dist/apps/funding/Inventory.js.map +1 -0
  143. package/dist/apps/funding/ProviderAttempts.d.ts +5 -0
  144. package/dist/apps/funding/ProviderAttempts.d.ts.map +1 -0
  145. package/dist/apps/funding/ProviderAttempts.js +24 -0
  146. package/dist/apps/funding/ProviderAttempts.js.map +1 -0
  147. package/dist/apps/funding/index.d.ts +2 -0
  148. package/dist/apps/funding/index.d.ts.map +1 -0
  149. package/dist/apps/funding/index.js +2 -0
  150. package/dist/apps/funding/index.js.map +1 -0
  151. package/dist/apps/funding/routes/chains.d.ts +169 -0
  152. package/dist/apps/funding/routes/chains.d.ts.map +1 -0
  153. package/dist/apps/funding/routes/chains.js +80 -0
  154. package/dist/apps/funding/routes/chains.js.map +1 -0
  155. package/dist/apps/funding/routes/deposit-addresses.d.ts +2388 -0
  156. package/dist/apps/funding/routes/deposit-addresses.d.ts.map +1 -0
  157. package/dist/apps/funding/routes/deposit-addresses.js +860 -0
  158. package/dist/apps/funding/routes/deposit-addresses.js.map +1 -0
  159. package/dist/apps/funding/routes/providers.d.ts +91 -0
  160. package/dist/apps/funding/routes/providers.d.ts.map +1 -0
  161. package/dist/apps/funding/routes/providers.js +56 -0
  162. package/dist/apps/funding/routes/providers.js.map +1 -0
  163. package/dist/apps/{data/routes/funding.d.ts → funding/routes/quotes.d.ts} +26 -396
  164. package/dist/apps/funding/routes/quotes.d.ts.map +1 -0
  165. package/dist/apps/funding/routes/quotes.js +188 -0
  166. package/dist/apps/funding/routes/quotes.js.map +1 -0
  167. package/dist/apps/funding/routes/transfers.d.ts +1999 -0
  168. package/dist/apps/funding/routes/transfers.d.ts.map +1 -0
  169. package/dist/apps/funding/routes/transfers.js +614 -0
  170. package/dist/apps/funding/routes/transfers.js.map +1 -0
  171. package/dist/apps/index.d.ts +3 -1
  172. package/dist/apps/index.d.ts.map +1 -1
  173. package/dist/apps/index.js +3 -1
  174. package/dist/apps/index.js.map +1 -1
  175. package/dist/apps/management/App.d.ts +839 -574
  176. package/dist/apps/management/App.d.ts.map +1 -1
  177. package/dist/apps/management/Billing.d.ts +8 -0
  178. package/dist/apps/management/Billing.d.ts.map +1 -1
  179. package/dist/apps/management/Billing.js +12 -0
  180. package/dist/apps/management/Billing.js.map +1 -1
  181. package/dist/apps/management/Error.d.ts +12 -0
  182. package/dist/apps/management/Error.d.ts.map +1 -0
  183. package/dist/apps/management/Error.js +10 -0
  184. package/dist/apps/management/Error.js.map +1 -0
  185. package/dist/apps/management/routes/api-keys.d.ts +296 -19
  186. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  187. package/dist/apps/management/routes/api-keys.js +77 -9
  188. package/dist/apps/management/routes/api-keys.js.map +1 -1
  189. package/dist/apps/management/routes/billing.d.ts +119 -119
  190. package/dist/apps/management/routes/faucet.d.ts +35 -35
  191. package/dist/apps/management/routes/invitations.d.ts +17 -17
  192. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  193. package/dist/apps/management/routes/invitations.js +4 -10
  194. package/dist/apps/management/routes/invitations.js.map +1 -1
  195. package/dist/apps/management/routes/invite-links.d.ts +38 -38
  196. package/dist/apps/management/routes/me.d.ts +6 -6
  197. package/dist/apps/management/routes/members.d.ts +69 -69
  198. package/dist/apps/management/routes/orgs.d.ts +16 -16
  199. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  200. package/dist/apps/management/routes/orgs.js +2 -8
  201. package/dist/apps/management/routes/orgs.js.map +1 -1
  202. package/dist/apps/management/routes/projects.d.ts +19 -19
  203. package/dist/apps/management/routes/scopes.d.ts +1 -1
  204. package/dist/apps/management/routes/scopes.js +2 -2
  205. package/dist/apps/management/routes/scopes.js.map +1 -1
  206. package/dist/apps/management/routes/usage.d.ts +72 -72
  207. package/dist/apps/management/routes/verified-token-requests.d.ts +18 -18
  208. package/dist/apps/management/routes/webhooks.d.ts +122 -122
  209. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  210. package/dist/apps/management/routes/webhooks.js +15 -3
  211. package/dist/apps/management/routes/webhooks.js.map +1 -1
  212. package/dist/apps/mcp.d.ts +2 -3
  213. package/dist/apps/mcp.d.ts.map +1 -1
  214. package/dist/apps/mcp.js +16 -14
  215. package/dist/apps/mcp.js.map +1 -1
  216. package/dist/apps/metadata.d.ts +4 -0
  217. package/dist/apps/metadata.d.ts.map +1 -1
  218. package/dist/apps/metadata.js +10 -0
  219. package/dist/apps/metadata.js.map +1 -1
  220. package/dist/apps/mpp/App.d.ts +57 -58
  221. package/dist/apps/mpp/App.d.ts.map +1 -1
  222. package/dist/apps/mpp/App.js +192 -27
  223. package/dist/apps/mpp/App.js.map +1 -1
  224. package/dist/apps/mpp/Mpp.d.ts +0 -20
  225. package/dist/apps/mpp/Mpp.d.ts.map +1 -1
  226. package/dist/apps/mpp/Mpp.js +0 -24
  227. package/dist/apps/mpp/Mpp.js.map +1 -1
  228. package/dist/apps/mpp/internal/Adapter.d.ts +40 -0
  229. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -0
  230. package/dist/apps/mpp/internal/Adapter.js +66 -0
  231. package/dist/apps/mpp/internal/Adapter.js.map +1 -0
  232. package/dist/apps/mpp/internal/Error.d.ts +4 -0
  233. package/dist/apps/mpp/internal/Error.d.ts.map +1 -0
  234. package/dist/apps/mpp/internal/Error.js +41 -0
  235. package/dist/apps/mpp/internal/Error.js.map +1 -0
  236. package/dist/apps/mpp/internal/Idempotency.d.ts +33 -0
  237. package/dist/apps/mpp/internal/Idempotency.d.ts.map +1 -0
  238. package/dist/apps/mpp/internal/Idempotency.js +28 -0
  239. package/dist/apps/mpp/internal/Idempotency.js.map +1 -0
  240. package/dist/apps/mpp/internal/Policy.d.ts +46 -0
  241. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -0
  242. package/dist/apps/mpp/internal/Policy.js +57 -0
  243. package/dist/apps/mpp/internal/Policy.js.map +1 -0
  244. package/dist/apps/mpp/internal/ScreenManager.d.ts +27 -0
  245. package/dist/apps/mpp/internal/ScreenManager.d.ts.map +1 -0
  246. package/dist/apps/mpp/internal/ScreenManager.js +18 -0
  247. package/dist/apps/mpp/internal/ScreenManager.js.map +1 -0
  248. package/dist/apps/mpp/internal/Screening.d.ts +35 -0
  249. package/dist/apps/mpp/internal/Screening.d.ts.map +1 -0
  250. package/dist/apps/mpp/internal/Screening.js +20 -0
  251. package/dist/apps/mpp/internal/Screening.js.map +1 -0
  252. package/dist/apps/mpp/internal/Sponsorship.d.ts +36 -0
  253. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -0
  254. package/dist/apps/mpp/internal/Sponsorship.js +103 -0
  255. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -0
  256. package/dist/apps/mpp/internal/Utils.d.ts +7 -0
  257. package/dist/apps/mpp/internal/Utils.d.ts.map +1 -0
  258. package/dist/apps/mpp/internal/Utils.js +24 -0
  259. package/dist/apps/mpp/internal/Utils.js.map +1 -0
  260. package/dist/apps/relay/App.js +183 -23
  261. package/dist/apps/relay/App.js.map +1 -1
  262. package/dist/apps/relay/Sponsorships.d.ts +4 -0
  263. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  264. package/dist/apps/relay/Sponsorships.js +15 -6
  265. package/dist/apps/relay/Sponsorships.js.map +1 -1
  266. package/dist/cloudflare.d.ts +50 -0
  267. package/dist/cloudflare.d.ts.map +1 -1
  268. package/dist/cloudflare.js +178 -0
  269. package/dist/cloudflare.js.map +1 -1
  270. package/dist/db/Db.d.ts +22 -0
  271. package/dist/db/Db.d.ts.map +1 -1
  272. package/dist/db/Db.js +379 -0
  273. package/dist/db/Db.js.map +1 -1
  274. package/dist/db/Schema.d.ts +933 -1
  275. package/dist/db/Schema.d.ts.map +1 -1
  276. package/dist/db/Schema.js +289 -1
  277. package/dist/db/Schema.js.map +1 -1
  278. package/dist/db/tables/earnVaults.d.ts +68 -0
  279. package/dist/db/tables/earnVaults.d.ts.map +1 -0
  280. package/dist/db/tables/earnVaults.js +72 -0
  281. package/dist/db/tables/earnVaults.js.map +1 -0
  282. package/dist/db/tables/fundingCatalog.d.ts +56 -0
  283. package/dist/db/tables/fundingCatalog.d.ts.map +1 -0
  284. package/dist/db/tables/fundingCatalog.js +85 -0
  285. package/dist/db/tables/fundingCatalog.js.map +1 -0
  286. package/dist/db/tables/fundingDepositAddresses.d.ts +172 -0
  287. package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
  288. package/dist/db/tables/fundingDepositAddresses.js +218 -0
  289. package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
  290. package/dist/db/tables/fundingDepositRequestObservations.d.ts +45 -0
  291. package/dist/db/tables/fundingDepositRequestObservations.d.ts.map +1 -0
  292. package/dist/db/tables/fundingDepositRequestObservations.js +46 -0
  293. package/dist/db/tables/fundingDepositRequestObservations.js.map +1 -0
  294. package/dist/db/tables/fundingDeposits.d.ts +171 -0
  295. package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
  296. package/dist/db/tables/fundingDeposits.js +182 -0
  297. package/dist/db/tables/fundingDeposits.js.map +1 -0
  298. package/dist/db/tables/fundingIdempotency.d.ts +91 -0
  299. package/dist/db/tables/fundingIdempotency.d.ts.map +1 -0
  300. package/dist/db/tables/fundingIdempotency.js +103 -0
  301. package/dist/db/tables/fundingIdempotency.js.map +1 -0
  302. package/dist/db/tables/fundingTransferEvents.d.ts +12 -0
  303. package/dist/db/tables/fundingTransferEvents.d.ts.map +1 -0
  304. package/dist/db/tables/fundingTransferEvents.js +18 -0
  305. package/dist/db/tables/fundingTransferEvents.js.map +1 -0
  306. package/dist/db/tables/fundingTransferTransactions.d.ts +15 -0
  307. package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -0
  308. package/dist/db/tables/fundingTransferTransactions.js +27 -0
  309. package/dist/db/tables/fundingTransferTransactions.js.map +1 -0
  310. package/dist/db/tables/fundingTransfers.d.ts +82 -0
  311. package/dist/db/tables/fundingTransfers.d.ts.map +1 -0
  312. package/dist/db/tables/fundingTransfers.js +89 -0
  313. package/dist/db/tables/fundingTransfers.js.map +1 -0
  314. package/dist/db/tables/organizations.d.ts +8 -0
  315. package/dist/db/tables/organizations.d.ts.map +1 -1
  316. package/dist/db/tables/organizations.js +16 -0
  317. package/dist/db/tables/organizations.js.map +1 -1
  318. package/dist/db/tables/projects.d.ts +8 -0
  319. package/dist/db/tables/projects.d.ts.map +1 -1
  320. package/dist/db/tables/projects.js +16 -0
  321. package/dist/db/tables/projects.js.map +1 -1
  322. package/dist/db/tables/requestUsage.d.ts +13 -0
  323. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  324. package/dist/db/tables/requestUsage.js +16 -0
  325. package/dist/db/tables/requestUsage.js.map +1 -1
  326. package/dist/db/tables/sponsoredTransactions.d.ts +2 -2
  327. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  328. package/dist/db/tables/sponsoredTransactions.js +1 -1
  329. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  330. package/dist/db/tables/users.d.ts +8 -0
  331. package/dist/db/tables/users.d.ts.map +1 -1
  332. package/dist/db/tables/users.js +16 -0
  333. package/dist/db/tables/users.js.map +1 -1
  334. package/dist/db/tables/verifiedTokens.d.ts +14 -7
  335. package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
  336. package/dist/db/tables/verifiedTokens.js +9 -7
  337. package/dist/db/tables/verifiedTokens.js.map +1 -1
  338. package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
  339. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  340. package/dist/db/tables/webhookSubscriptions.js +24 -3
  341. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  342. package/dist/handlers/relay.js +108 -108
  343. package/dist/handlers/relay.js.map +1 -1
  344. package/dist/internal/Auth.d.ts +37 -11
  345. package/dist/internal/Auth.d.ts.map +1 -1
  346. package/dist/internal/Auth.js +75 -16
  347. package/dist/internal/Auth.js.map +1 -1
  348. package/dist/internal/Cache.d.ts.map +1 -1
  349. package/dist/internal/Cache.js +17 -11
  350. package/dist/internal/Cache.js.map +1 -1
  351. package/dist/internal/Cursor.js +1 -1
  352. package/dist/internal/Cursor.js.map +1 -1
  353. package/dist/internal/EarnRates.d.ts +89 -0
  354. package/dist/internal/EarnRates.d.ts.map +1 -0
  355. package/dist/internal/EarnRates.js +266 -0
  356. package/dist/internal/EarnRates.js.map +1 -0
  357. package/dist/internal/EarnVaults.d.ts +171 -0
  358. package/dist/internal/EarnVaults.d.ts.map +1 -0
  359. package/dist/internal/EarnVaults.js +547 -0
  360. package/dist/internal/EarnVaults.js.map +1 -0
  361. package/dist/internal/EdgeCache.d.ts +10 -3
  362. package/dist/internal/EdgeCache.d.ts.map +1 -1
  363. package/dist/internal/EdgeCache.js +43 -11
  364. package/dist/internal/EdgeCache.js.map +1 -1
  365. package/dist/internal/Id.d.ts +11 -0
  366. package/dist/internal/Id.d.ts.map +1 -1
  367. package/dist/internal/Id.js +13 -0
  368. package/dist/internal/Id.js.map +1 -1
  369. package/dist/internal/Idempotency.d.ts +83 -0
  370. package/dist/internal/Idempotency.d.ts.map +1 -0
  371. package/dist/internal/Idempotency.js +113 -0
  372. package/dist/internal/Idempotency.js.map +1 -0
  373. package/dist/internal/IpAllowlist.d.ts +15 -0
  374. package/dist/internal/IpAllowlist.d.ts.map +1 -0
  375. package/dist/internal/IpAllowlist.js +27 -0
  376. package/dist/internal/IpAllowlist.js.map +1 -0
  377. package/dist/internal/Log.d.ts +64 -9
  378. package/dist/internal/Log.d.ts.map +1 -1
  379. package/dist/internal/Log.js +29 -7
  380. package/dist/internal/Log.js.map +1 -1
  381. package/dist/internal/MetricSink.d.ts.map +1 -1
  382. package/dist/internal/MetricSink.js +47 -1
  383. package/dist/internal/MetricSink.js.map +1 -1
  384. package/dist/internal/OpenApi.d.ts +2 -2
  385. package/dist/internal/OpenApi.d.ts.map +1 -1
  386. package/dist/internal/OpenApi.js +4 -1
  387. package/dist/internal/OpenApi.js.map +1 -1
  388. package/dist/internal/Provider.d.ts +14 -0
  389. package/dist/internal/Provider.d.ts.map +1 -0
  390. package/dist/internal/Provider.js +5 -0
  391. package/dist/internal/Provider.js.map +1 -0
  392. package/dist/internal/Schema.d.ts +6 -1
  393. package/dist/internal/Schema.d.ts.map +1 -1
  394. package/dist/internal/Schema.js +20 -11
  395. package/dist/internal/Schema.js.map +1 -1
  396. package/dist/internal/Store.d.ts +6 -0
  397. package/dist/internal/Store.d.ts.map +1 -1
  398. package/dist/internal/Store.js +35 -0
  399. package/dist/internal/Store.js.map +1 -1
  400. package/dist/internal/Tidx.d.ts +49 -24
  401. package/dist/internal/Tidx.d.ts.map +1 -1
  402. package/dist/internal/Tidx.js +90 -12
  403. package/dist/internal/Tidx.js.map +1 -1
  404. package/dist/internal/Viem.d.ts +90 -65
  405. package/dist/internal/Viem.d.ts.map +1 -1
  406. package/dist/internal/Viem.js +90 -12
  407. package/dist/internal/Viem.js.map +1 -1
  408. package/dist/internal/WebhookDestination.d.ts.map +1 -1
  409. package/dist/internal/WebhookDestination.js +34 -28
  410. package/dist/internal/WebhookDestination.js.map +1 -1
  411. package/dist/internal/Webhooks.d.ts +9 -0
  412. package/dist/internal/Webhooks.d.ts.map +1 -1
  413. package/dist/internal/Webhooks.js +15 -10
  414. package/dist/internal/Webhooks.js.map +1 -1
  415. package/dist/internal/exchange/Provider.d.ts +219 -0
  416. package/dist/internal/exchange/Provider.d.ts.map +1 -0
  417. package/dist/internal/exchange/Provider.js +117 -0
  418. package/dist/internal/exchange/Provider.js.map +1 -0
  419. package/dist/internal/exchange/index.d.ts +2 -0
  420. package/dist/internal/exchange/index.d.ts.map +1 -0
  421. package/dist/internal/exchange/index.js +2 -0
  422. package/dist/internal/exchange/index.js.map +1 -0
  423. package/dist/internal/exchange/providers/uniswap.d.ts +57 -0
  424. package/dist/internal/exchange/providers/uniswap.d.ts.map +1 -0
  425. package/dist/internal/exchange/providers/uniswap.js +553 -0
  426. package/dist/internal/exchange/providers/uniswap.js.map +1 -0
  427. package/dist/internal/funding/Action.d.ts +55 -0
  428. package/dist/internal/funding/Action.d.ts.map +1 -0
  429. package/dist/internal/funding/Action.js +74 -0
  430. package/dist/internal/funding/Action.js.map +1 -0
  431. package/dist/internal/funding/Catalog.d.ts +107 -0
  432. package/dist/internal/funding/Catalog.d.ts.map +1 -0
  433. package/dist/internal/funding/Catalog.js +270 -0
  434. package/dist/internal/funding/Catalog.js.map +1 -0
  435. package/dist/internal/funding/Chain.d.ts +76 -0
  436. package/dist/internal/funding/Chain.d.ts.map +1 -0
  437. package/dist/internal/funding/Chain.js +38 -0
  438. package/dist/internal/funding/Chain.js.map +1 -0
  439. package/dist/internal/funding/Deposit.d.ts +408 -0
  440. package/dist/internal/funding/Deposit.d.ts.map +1 -0
  441. package/dist/internal/funding/Deposit.js +318 -0
  442. package/dist/internal/funding/Deposit.js.map +1 -0
  443. package/dist/internal/funding/DepositAddress.d.ts +345 -0
  444. package/dist/internal/funding/DepositAddress.d.ts.map +1 -0
  445. package/dist/internal/funding/DepositAddress.js +189 -0
  446. package/dist/internal/funding/DepositAddress.js.map +1 -0
  447. package/dist/internal/funding/Evidence.d.ts +48 -0
  448. package/dist/internal/funding/Evidence.d.ts.map +1 -0
  449. package/dist/internal/funding/Evidence.js +315 -0
  450. package/dist/internal/funding/Evidence.js.map +1 -0
  451. package/dist/internal/funding/Provider.d.ts +1288 -0
  452. package/dist/internal/funding/Provider.d.ts.map +1 -0
  453. package/dist/internal/funding/Provider.js +1086 -0
  454. package/dist/internal/funding/Provider.js.map +1 -0
  455. package/dist/internal/funding/Reconciliation.d.ts +127 -0
  456. package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
  457. package/dist/internal/funding/Reconciliation.js +885 -0
  458. package/dist/internal/funding/Reconciliation.js.map +1 -0
  459. package/dist/internal/funding/Route.d.ts +21 -0
  460. package/dist/internal/funding/Route.d.ts.map +1 -0
  461. package/dist/internal/funding/Route.js +5 -0
  462. package/dist/internal/funding/Route.js.map +1 -0
  463. package/dist/internal/funding/SourceObservation.d.ts +108 -0
  464. package/dist/internal/funding/SourceObservation.d.ts.map +1 -0
  465. package/dist/internal/funding/SourceObservation.js +143 -0
  466. package/dist/internal/funding/SourceObservation.js.map +1 -0
  467. package/dist/internal/funding/Subsidy.d.ts +113 -0
  468. package/dist/internal/funding/Subsidy.d.ts.map +1 -0
  469. package/dist/internal/funding/Subsidy.js +138 -0
  470. package/dist/internal/funding/Subsidy.js.map +1 -0
  471. package/dist/internal/funding/Token.d.ts +41 -0
  472. package/dist/internal/funding/Token.d.ts.map +1 -0
  473. package/dist/internal/funding/Token.js +22 -0
  474. package/dist/internal/funding/Token.js.map +1 -0
  475. package/dist/internal/funding/Transfer.d.ts +643 -0
  476. package/dist/internal/funding/Transfer.d.ts.map +1 -0
  477. package/dist/internal/funding/Transfer.js +332 -0
  478. package/dist/internal/funding/Transfer.js.map +1 -0
  479. package/dist/internal/funding/index.d.ts +14 -0
  480. package/dist/internal/funding/index.d.ts.map +1 -0
  481. package/dist/internal/funding/index.js +14 -0
  482. package/dist/internal/funding/index.js.map +1 -0
  483. package/dist/internal/funding/providers/across.d.ts +21 -0
  484. package/dist/internal/funding/providers/across.d.ts.map +1 -0
  485. package/dist/internal/funding/providers/across.js +117 -0
  486. package/dist/internal/funding/providers/across.js.map +1 -0
  487. package/dist/internal/funding/providers/relay.d.ts +88 -0
  488. package/dist/internal/funding/providers/relay.d.ts.map +1 -0
  489. package/dist/internal/funding/providers/relay.js +871 -0
  490. package/dist/internal/funding/providers/relay.js.map +1 -0
  491. package/dist/internal/funding/providers/rhino.d.ts +15 -0
  492. package/dist/internal/funding/providers/rhino.d.ts.map +1 -0
  493. package/dist/internal/funding/providers/rhino.js +116 -0
  494. package/dist/internal/funding/providers/rhino.js.map +1 -0
  495. package/dist/internal/funding/providers/squid.d.ts +19 -0
  496. package/dist/internal/funding/providers/squid.d.ts.map +1 -0
  497. package/dist/internal/funding/providers/squid.js +120 -0
  498. package/dist/internal/funding/providers/squid.js.map +1 -0
  499. package/dist/internal/funding/providers/symbiosis.d.ts +20 -0
  500. package/dist/internal/funding/providers/symbiosis.d.ts.map +1 -0
  501. package/dist/internal/funding/providers/symbiosis.js +176 -0
  502. package/dist/internal/funding/providers/symbiosis.js.map +1 -0
  503. package/dist/internal/index.d.ts +5 -1
  504. package/dist/internal/index.d.ts.map +1 -1
  505. package/dist/internal/index.js +5 -1
  506. package/dist/internal/index.js.map +1 -1
  507. package/dist/internal/webhookDestinations/url.js +61 -57
  508. package/dist/internal/webhookDestinations/url.js.map +1 -1
  509. package/dist/providers/index.d.ts +43 -0
  510. package/dist/providers/index.d.ts.map +1 -0
  511. package/dist/providers/index.js +19 -0
  512. package/dist/providers/index.js.map +1 -0
  513. package/package.json +10 -5
  514. package/src/ApiKey.test.ts +35 -0
  515. package/src/ApiKey.ts +27 -0
  516. package/src/ApiKeys.test.ts +40 -7
  517. package/src/ApiKeys.ts +46 -10
  518. package/src/App.test.ts +108 -15
  519. package/src/App.ts +296 -138
  520. package/src/Assets.ts +29 -4
  521. package/src/Client.test-d.ts +809 -37
  522. package/src/Scope.test.ts +19 -0
  523. package/src/Scope.ts +28 -11
  524. package/src/Webhooks.test.ts +25 -0
  525. package/src/Webhooks.ts +1 -1
  526. package/src/admin/App.test.ts +9 -2
  527. package/src/admin/App.ts +32 -9
  528. package/src/admin/apps/api-keys.test.ts +190 -22
  529. package/src/admin/apps/api-keys.ts +170 -28
  530. package/src/admin/apps/earn-vaults.test.ts +338 -0
  531. package/src/admin/apps/earn-vaults.ts +572 -0
  532. package/src/admin/apps/scopes.test.ts +16 -1
  533. package/src/admin/ui/plugin.ts +2 -2
  534. package/src/admin/ui/src/components/EarnVaultForm.tsx +137 -0
  535. package/src/admin/ui/src/components/MobileProfile.tsx +2 -2
  536. package/src/admin/ui/src/components/Page.tsx +1 -1
  537. package/src/admin/ui/src/components/ThemeToggle.tsx +1 -1
  538. package/src/admin/ui/src/lib/api-keys.ts +37 -7
  539. package/src/admin/ui/src/lib/client.ts +1 -1
  540. package/src/admin/ui/src/lib/config.ts +1 -1
  541. package/src/admin/ui/src/lib/early-access.ts +8 -9
  542. package/src/admin/ui/src/lib/earn-vaults.ts +207 -0
  543. package/src/admin/ui/src/lib/format.ts +13 -0
  544. package/src/admin/ui/src/lib/organizations.test.ts +14 -4
  545. package/src/admin/ui/src/lib/organizations.ts +7 -1
  546. package/src/admin/ui/src/lib/response.ts +22 -0
  547. package/src/admin/ui/src/lib/scopes.test.ts +19 -11
  548. package/src/admin/ui/src/lib/scopes.ts +28 -7
  549. package/src/admin/ui/src/lib/verified-tokens.ts +10 -9
  550. package/src/admin/ui/src/routeTree.gen.ts +70 -7
  551. package/src/admin/ui/src/router.tsx +2 -2
  552. package/src/admin/ui/src/routes/__root.tsx +9 -8
  553. package/src/admin/ui/src/routes/api-keys.tsx +475 -64
  554. package/src/admin/ui/src/routes/early-access.tsx +5 -12
  555. package/src/admin/ui/src/routes/earn.vaults.tsx +348 -0
  556. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +154 -0
  557. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +190 -0
  558. package/src/admin/ui/src/routes/organizations.tsx +4 -7
  559. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +56 -54
  560. package/src/admin/ui/src/routes/verified-tokens.tsx +4 -4
  561. package/src/admin/ui/vite.config.ts +4 -1
  562. package/src/admin/ui.generated.ts +113 -43
  563. package/src/analytics/Analytics.test.ts +69 -10
  564. package/src/analytics/Analytics.ts +24 -1
  565. package/src/analytics/tables/requestEvents.ts +79 -37
  566. package/src/apps/Zones.test.ts +33 -0
  567. package/src/apps/Zones.ts +40 -0
  568. package/src/apps/composition.test.ts +184 -3
  569. package/src/apps/data/App.test.ts +28 -23
  570. package/src/apps/data/App.ts +95 -36
  571. package/src/apps/data/FxOracle.ts +1 -1
  572. package/src/apps/data/index.ts +0 -1
  573. package/src/apps/data/routes/activities.test.ts +82 -6
  574. package/src/apps/data/routes/activities.ts +131 -71
  575. package/src/apps/data/routes/balances.test.ts +50 -37
  576. package/src/apps/data/routes/balances.ts +5 -5
  577. package/src/apps/data/routes/blocks.test.ts +2 -0
  578. package/src/apps/data/routes/coingecko.test.ts +22 -0
  579. package/src/apps/data/routes/coingecko.ts +84 -48
  580. package/src/apps/data/routes/earn.test.ts +1391 -0
  581. package/src/apps/data/routes/earn.ts +2188 -0
  582. package/src/apps/data/routes/exchanges.test.ts +82 -33
  583. package/src/apps/data/routes/exchanges.ts +842 -227
  584. package/src/apps/data/routes/fee-amm.test.ts +4 -6
  585. package/src/apps/data/routes/fee-amm.ts +69 -12
  586. package/src/apps/data/routes/indexer.test.ts +43 -34
  587. package/src/apps/data/routes/indexer.ts +21 -3
  588. package/src/apps/data/routes/receipts.test.ts +5 -3
  589. package/src/apps/data/routes/receipts.ts +13 -11
  590. package/src/apps/data/routes/rpc.test.ts +446 -28
  591. package/src/apps/data/routes/rpc.ts +245 -25
  592. package/src/apps/data/routes/tokenlist.ts +72 -19
  593. package/src/apps/data/routes/tokens.test.ts +6 -8
  594. package/src/apps/data/routes/tokens.ts +258 -86
  595. package/src/apps/data/routes/transactions.test.ts +2 -0
  596. package/src/apps/data/routes/transactions.ts +77 -42
  597. package/src/apps/data/routes/transfers.test.ts +166 -4
  598. package/src/apps/data/routes/transfers.ts +216 -78
  599. package/src/apps/data/routes/valuation.test.ts +62 -9
  600. package/src/apps/data/routes/valuation.ts +2 -2
  601. package/src/apps/data/routes/webhooks.test.ts +386 -43
  602. package/src/apps/data/routes/webhooks.ts +172 -71
  603. package/src/apps/data/routes/zones.test.ts +473 -0
  604. package/src/apps/data/routes/zones.ts +338 -0
  605. package/src/apps/docs/reference.ts +8 -6
  606. package/src/apps/funding/Access.ts +26 -0
  607. package/src/apps/funding/App.test.ts +78 -0
  608. package/src/apps/funding/App.ts +63 -0
  609. package/src/apps/funding/Inventory.ts +30 -0
  610. package/src/apps/funding/ProviderAttempts.ts +26 -0
  611. package/src/apps/funding/index.ts +1 -0
  612. package/src/apps/funding/routes/chains.test.ts +78 -0
  613. package/src/apps/funding/routes/chains.ts +101 -0
  614. package/src/apps/funding/routes/deposit-addresses.test.ts +1628 -0
  615. package/src/apps/funding/routes/deposit-addresses.ts +1015 -0
  616. package/src/apps/funding/routes/providers.test.ts +165 -0
  617. package/src/apps/funding/routes/providers.ts +73 -0
  618. package/src/apps/funding/routes/quotes.test.ts +511 -0
  619. package/src/apps/funding/routes/quotes.ts +205 -0
  620. package/src/apps/funding/routes/transfers.test.ts +1255 -0
  621. package/src/apps/funding/routes/transfers.ts +704 -0
  622. package/src/apps/index.ts +3 -1
  623. package/src/apps/management/Billing.test.ts +29 -0
  624. package/src/apps/management/Billing.ts +23 -0
  625. package/src/apps/management/Error.ts +12 -0
  626. package/src/apps/management/routes/api-keys.test.ts +103 -3
  627. package/src/apps/management/routes/api-keys.ts +98 -10
  628. package/src/apps/management/routes/invitations.ts +4 -11
  629. package/src/apps/management/routes/orgs.ts +2 -9
  630. package/src/apps/management/routes/scopes.test.ts +7 -2
  631. package/src/apps/management/routes/scopes.ts +2 -2
  632. package/src/apps/management/routes/webhooks.test.ts +6 -1
  633. package/src/apps/management/routes/webhooks.ts +15 -3
  634. package/src/apps/mcp.test.ts +17 -2
  635. package/src/apps/mcp.ts +18 -13
  636. package/src/apps/metadata.ts +12 -0
  637. package/src/apps/mpp/App.ts +276 -29
  638. package/src/apps/mpp/Mpp.test.ts +631 -26
  639. package/src/apps/mpp/Mpp.ts +0 -42
  640. package/src/apps/mpp/internal/Adapter.ts +108 -3
  641. package/src/apps/mpp/internal/Error.test.ts +33 -0
  642. package/src/apps/mpp/internal/Error.ts +44 -6
  643. package/src/apps/mpp/internal/Idempotency.test.ts +213 -0
  644. package/src/apps/mpp/internal/Idempotency.ts +59 -5
  645. package/src/apps/mpp/internal/Policy.test.ts +128 -0
  646. package/src/apps/mpp/internal/Policy.ts +98 -0
  647. package/src/apps/mpp/internal/ScreenManager.test.ts +68 -0
  648. package/src/apps/mpp/internal/ScreenManager.ts +41 -0
  649. package/src/apps/mpp/internal/Screening.ts +40 -3
  650. package/src/apps/mpp/internal/Sponsorship.ts +144 -0
  651. package/src/apps/mpp/internal/Utils.ts +30 -0
  652. package/src/apps/relay/App.test.ts +493 -62
  653. package/src/apps/relay/App.ts +233 -23
  654. package/src/apps/relay/Sponsorships.test.ts +49 -0
  655. package/src/apps/relay/Sponsorships.ts +18 -6
  656. package/src/cloudflare.ts +279 -0
  657. package/src/db/Db.ts +501 -0
  658. package/src/db/Schema.ts +349 -2
  659. package/src/db/tables/earnVaults.test.ts +185 -0
  660. package/src/db/tables/earnVaults.ts +151 -0
  661. package/src/db/tables/fundingCatalog.test.ts +108 -0
  662. package/src/db/tables/fundingCatalog.ts +157 -0
  663. package/src/db/tables/fundingDepositAddresses.test.ts +580 -0
  664. package/src/db/tables/fundingDepositAddresses.ts +404 -0
  665. package/src/db/tables/fundingDepositRequestObservations.test.ts +106 -0
  666. package/src/db/tables/fundingDepositRequestObservations.ts +99 -0
  667. package/src/db/tables/fundingDeposits.test.ts +399 -0
  668. package/src/db/tables/fundingDeposits.ts +373 -0
  669. package/src/db/tables/fundingIdempotency.test.ts +182 -0
  670. package/src/db/tables/fundingIdempotency.ts +180 -0
  671. package/src/db/tables/fundingTransferEvents.ts +28 -0
  672. package/src/db/tables/fundingTransferTransactions.test.ts +69 -0
  673. package/src/db/tables/fundingTransferTransactions.ts +37 -0
  674. package/src/db/tables/fundingTransfers.test.ts +89 -0
  675. package/src/db/tables/fundingTransfers.ts +153 -0
  676. package/src/db/tables/organizations.ts +16 -0
  677. package/src/db/tables/projects.ts +16 -0
  678. package/src/db/tables/requestUsage.ts +23 -0
  679. package/src/db/tables/sponsoredTransactions.test.ts +11 -0
  680. package/src/db/tables/sponsoredTransactions.ts +3 -3
  681. package/src/db/tables/users.ts +16 -0
  682. package/src/db/tables/verifiedTokens.ts +19 -14
  683. package/src/db/tables/webhookSubscriptions.ts +58 -3
  684. package/src/handlers/relay.test.ts +2 -0
  685. package/src/handlers/relay.ts +95 -99
  686. package/src/internal/Auth.test.ts +225 -5
  687. package/src/internal/Auth.ts +109 -20
  688. package/src/internal/Cache.test.ts +37 -3
  689. package/src/internal/Cache.ts +14 -10
  690. package/src/internal/Cursor.test.ts +2 -2
  691. package/src/internal/Cursor.ts +1 -1
  692. package/src/internal/EarnRates.test.ts +125 -0
  693. package/src/internal/EarnRates.ts +409 -0
  694. package/src/internal/EarnVaults.test.ts +195 -0
  695. package/src/internal/EarnVaults.ts +876 -0
  696. package/src/internal/EdgeCache.test.ts +26 -7
  697. package/src/internal/EdgeCache.ts +48 -9
  698. package/src/internal/Id.ts +14 -0
  699. package/src/internal/Idempotency.test.ts +109 -0
  700. package/src/internal/Idempotency.ts +237 -0
  701. package/src/internal/IpAllowlist.test.ts +52 -0
  702. package/src/internal/IpAllowlist.ts +39 -0
  703. package/src/internal/Log.test-d.ts +41 -8
  704. package/src/internal/Log.test.ts +196 -9
  705. package/src/internal/Log.ts +124 -17
  706. package/src/internal/MetricSink.test.ts +244 -4
  707. package/src/internal/MetricSink.ts +51 -1
  708. package/src/internal/OpenApi.ts +4 -1
  709. package/src/internal/Provider.test.ts +17 -0
  710. package/src/internal/Provider.ts +17 -0
  711. package/src/internal/Schema.ts +27 -17
  712. package/src/internal/Store.test.ts +25 -0
  713. package/src/internal/Store.ts +46 -0
  714. package/src/internal/Tidx.local.test.ts +78 -3
  715. package/src/internal/Tidx.test.ts +240 -18
  716. package/src/internal/Tidx.ts +129 -33
  717. package/src/internal/VerifiedTokens.test.ts +15 -0
  718. package/src/internal/Viem.test.ts +198 -17
  719. package/src/internal/Viem.ts +127 -28
  720. package/src/internal/WebhookDestination.ts +25 -23
  721. package/src/internal/Webhooks.test.ts +59 -0
  722. package/src/internal/Webhooks.ts +34 -10
  723. package/src/internal/exchange/Provider.test.ts +216 -0
  724. package/src/internal/exchange/Provider.ts +326 -0
  725. package/src/internal/exchange/index.test.ts +6 -0
  726. package/src/internal/exchange/index.ts +1 -0
  727. package/src/internal/exchange/providers/uniswap.test.ts +122 -0
  728. package/src/internal/exchange/providers/uniswap.ts +682 -0
  729. package/src/internal/funding/Action.test.ts +138 -0
  730. package/src/internal/funding/Action.ts +117 -0
  731. package/src/internal/funding/Catalog.test.ts +311 -0
  732. package/src/internal/funding/Catalog.ts +347 -0
  733. package/src/internal/funding/Chain.test.ts +79 -0
  734. package/src/internal/funding/Chain.ts +120 -0
  735. package/src/internal/funding/Deposit.test.ts +26 -0
  736. package/src/internal/funding/Deposit.ts +522 -0
  737. package/src/internal/funding/DepositAddress.test.ts +18 -0
  738. package/src/internal/funding/DepositAddress.ts +312 -0
  739. package/src/internal/funding/Evidence.test.ts +297 -0
  740. package/src/internal/funding/Evidence.ts +425 -0
  741. package/src/internal/funding/Provider.test.ts +1328 -0
  742. package/src/internal/funding/Provider.ts +1911 -0
  743. package/src/internal/funding/Reconciliation.local.test.ts +511 -0
  744. package/src/internal/funding/Reconciliation.test.ts +3037 -0
  745. package/src/internal/funding/Reconciliation.ts +1202 -0
  746. package/src/internal/funding/Route.test.ts +66 -0
  747. package/src/internal/funding/Route.ts +29 -0
  748. package/src/internal/funding/SourceObservation.test.ts +301 -0
  749. package/src/internal/funding/SourceObservation.ts +267 -0
  750. package/src/internal/funding/Subsidy.local.test.ts +152 -0
  751. package/src/internal/funding/Subsidy.test.ts +75 -0
  752. package/src/internal/funding/Subsidy.ts +260 -0
  753. package/src/internal/funding/Token.test.ts +47 -0
  754. package/src/internal/funding/Token.ts +59 -0
  755. package/src/internal/funding/Transfer.test.ts +369 -0
  756. package/src/internal/funding/Transfer.ts +522 -0
  757. package/src/internal/funding/index.test.ts +21 -0
  758. package/src/internal/funding/index.ts +13 -0
  759. package/src/internal/funding/providers/across.ts +149 -0
  760. package/src/{apps/data/FundingQuoteProviders.test.ts → internal/funding/providers/index.test.ts} +178 -157
  761. package/src/internal/funding/providers/relay.test.ts +564 -0
  762. package/src/internal/funding/providers/relay.ts +1060 -0
  763. package/src/internal/funding/providers/rhino.ts +139 -0
  764. package/src/internal/funding/providers/squid.ts +151 -0
  765. package/src/internal/funding/providers/symbiosis.ts +221 -0
  766. package/src/internal/index.test.ts +5 -1
  767. package/src/internal/index.ts +5 -1
  768. package/src/internal/webhookDestinations/url.ts +49 -45
  769. package/src/providers/index.test.ts +14 -0
  770. package/src/providers/index.ts +54 -0
  771. package/dist/apps/data/FundingQuoteProviders.d.ts +0 -174
  772. package/dist/apps/data/FundingQuoteProviders.d.ts.map +0 -1
  773. package/dist/apps/data/FundingQuoteProviders.js +0 -775
  774. package/dist/apps/data/FundingQuoteProviders.js.map +0 -1
  775. package/dist/apps/data/routes/funding.d.ts.map +0 -1
  776. package/dist/apps/data/routes/funding.js +0 -410
  777. package/dist/apps/data/routes/funding.js.map +0 -1
  778. package/dist/internal/FundingQuotes.d.ts +0 -864
  779. package/dist/internal/FundingQuotes.d.ts.map +0 -1
  780. package/dist/internal/FundingQuotes.js +0 -672
  781. package/dist/internal/FundingQuotes.js.map +0 -1
  782. package/src/apps/data/FundingQuoteProviders.ts +0 -1043
  783. package/src/apps/data/routes/funding.test.ts +0 -503
  784. package/src/apps/data/routes/funding.ts +0 -604
  785. package/src/internal/FundingQuotes.test.ts +0 -456
  786. package/src/internal/FundingQuotes.ts +0 -944
@@ -0,0 +1,1060 @@
1
+ import { AbiEvent, AbiFunction, Address, Hash, Hex, RpcTransport } from 'ox'
2
+ import { createClient, custom, fallback } from 'viem'
3
+ import { getBlockNumber, getLogs, getTransaction, getTransactionReceipt } from 'viem/actions'
4
+ import * as z from 'zod/mini'
5
+
6
+ import * as Db from '../../../db/Db.js'
7
+ import * as FundingDepositAddresses from '../../../db/tables/fundingDepositAddresses.js'
8
+ import * as FundingDepositRequestObservations from '../../../db/tables/fundingDepositRequestObservations.js'
9
+ import * as Viem from '../../Viem.js'
10
+ import * as FundingCatalog from '../Catalog.js'
11
+ import * as FundingChain from '../Chain.js'
12
+ import * as Evidence from '../Evidence.js'
13
+ import * as FundingProvider from '../Provider.js'
14
+ import * as Subsidy from '../Subsidy.js'
15
+
16
+ const defaultBaseUrl = 'https://api.relay.link'
17
+ const defaultFetch: FundingProvider.Fetch = (input, init) => globalThis.fetch(input, init)
18
+ const deliveryBackfillBlocks = 256n
19
+ const relayChainsCacheTtlMs = 60_000
20
+ const sourceSweepForwardBlocks = 256n
21
+ const depositErc20FullAllowance = AbiFunction.from(
22
+ 'function depositErc20(address depositor,address token,bytes32 id)',
23
+ )
24
+ const depositErc20WithAmount = AbiFunction.from(
25
+ 'function depositErc20(address depositor,address token,uint256 amount,bytes32 id)',
26
+ )
27
+ const relayErc20DepositEvent = AbiEvent.from(
28
+ 'event RelayErc20Deposit(address from, address token, uint256 amount, bytes32 id)',
29
+ )
30
+ const relayTransfer = AbiFunction.from('function transfer(address recipient,uint256 amount)')
31
+ const transferEvent = AbiEvent.from(
32
+ 'event Transfer(address indexed from, address indexed to, uint256 value)',
33
+ )
34
+ const webhookSignatureToleranceMs = 300_000
35
+ const deliveryObservationStatuses = [
36
+ 'depositing',
37
+ 'pending',
38
+ 'submitted',
39
+ 'success',
40
+ 'waiting',
41
+ ] as const
42
+ // Bound provider statuses before using them as metric tags.
43
+ const webhookStatuses = [
44
+ 'depositing',
45
+ 'failure',
46
+ 'fallback',
47
+ 'pending',
48
+ 'refund',
49
+ 'submitted',
50
+ 'success',
51
+ 'waiting',
52
+ ] as const
53
+
54
+ namespace schema {
55
+ const Decimal = z.union([
56
+ z.string().check(z.regex(/^\d+(\.\d+)?$/)),
57
+ z.pipe(
58
+ z.number().check(z.nonnegative()),
59
+ z.transform((value) => String(value)),
60
+ ),
61
+ ])
62
+
63
+ const Integer = z.union([
64
+ z.number().check(z.int(), z.nonnegative()),
65
+ z.pipe(
66
+ z.pipe(
67
+ z.string().check(z.regex(/^\d+$/)),
68
+ z.transform((value) => Number(value)),
69
+ ),
70
+ z.number().check(z.int(), z.nonnegative()),
71
+ ),
72
+ ])
73
+
74
+ export const Quote = z.object({
75
+ details: z.optional(
76
+ z.object({
77
+ currencyOut: z.optional(
78
+ z.object({
79
+ amount: z.optional(Decimal),
80
+ minimumAmount: z.optional(Decimal),
81
+ }),
82
+ ),
83
+ timeEstimate: z.optional(Integer),
84
+ }),
85
+ ),
86
+ })
87
+
88
+ const StepCall = z.object({
89
+ chainId: Integer,
90
+ data: z.string().check(z.regex(/^0x[0-9a-fA-F]*$/)),
91
+ from: z.string(),
92
+ to: z.string().check(z.regex(/^0x[0-9a-fA-F]{40}$/)),
93
+ value: z.optional(z.string().check(z.regex(/^\d+$/))),
94
+ })
95
+
96
+ const StepItem = z.object({
97
+ check: z.optional(z.object({ endpoint: z.string() })),
98
+ data: StepCall,
99
+ })
100
+
101
+ const Step = z.object({
102
+ depositAddress: z.optional(z.string()),
103
+ id: z.string(),
104
+ items: z.optional(z.array(StepItem)),
105
+ kind: z.string(),
106
+ requestId: z.optional(z.string()),
107
+ })
108
+
109
+ export const PreparedQuote = z.object({
110
+ details: z.object({
111
+ currencyIn: z.object({ amount: Decimal }),
112
+ currencyOut: z.object({ amount: Decimal, minimumAmount: Decimal }),
113
+ timeEstimate: z.optional(Integer),
114
+ }),
115
+ fees: z.optional(
116
+ z.object({
117
+ relayer: z.optional(z.object({ amount: Decimal })),
118
+ }),
119
+ ),
120
+ steps: z.array(Step),
121
+ })
122
+
123
+ export const DepositAddress = z.object({
124
+ details: PreparedQuote.shape.details,
125
+ fees: PreparedQuote.shape.fees,
126
+ steps: z.array(
127
+ z.object({
128
+ depositAddress: z.optional(z.string()),
129
+ items: z.optional(
130
+ z.array(
131
+ z.object({
132
+ check: z.optional(z.object({ endpoint: z.string() })),
133
+ }),
134
+ ),
135
+ ),
136
+ requestId: z.optional(z.string()),
137
+ }),
138
+ ),
139
+ })
140
+
141
+ export const Chains = z.object({
142
+ chains: z.array(
143
+ z.object({
144
+ id: Integer,
145
+ protocol: z.optional(
146
+ z.object({
147
+ v2: z.optional(
148
+ z.object({
149
+ depository: z.string().check(z.regex(/^0x[0-9a-fA-F]{40}$/)),
150
+ }),
151
+ ),
152
+ }),
153
+ ),
154
+ solverAddresses: z.optional(z.array(z.string().check(z.regex(/^0x[0-9a-fA-F]{40}$/)))),
155
+ }),
156
+ ),
157
+ })
158
+
159
+ export const DeliveryObservation = z.object({
160
+ relay: z.object({
161
+ orderId: z.string().check(z.regex(/^0x[0-9a-fA-F]{64}$/)),
162
+ sourceDepository: z.string().check(z.regex(/^0x[0-9a-fA-F]{40}$/)),
163
+ sourceObservedAt: z.iso.datetime(),
164
+ sourceSweepTransactionHash: z.string().check(z.regex(/^0x[0-9a-fA-F]{64}$/)),
165
+ }),
166
+ })
167
+
168
+ export const RequestCorrelation = z.object({
169
+ relay: z.object({
170
+ depositor: z.optional(z.string().check(z.regex(/^0x[0-9a-fA-F]{40}$/))),
171
+ depository: z.optional(z.string().check(z.regex(/^0x[0-9a-fA-F]{40}$/))),
172
+ orderId: z.optional(z.string().check(z.regex(/^0x[0-9a-fA-F]{64}$/))),
173
+ solver: z.optional(z.string().check(z.regex(/^0x[0-9a-fA-F]{40}$/))),
174
+ }),
175
+ })
176
+
177
+ const RequestTransaction = z.object({
178
+ txHash: z.string().check(z.minLength(1)),
179
+ })
180
+
181
+ export const Requests = z.object({
182
+ continuation: z.optional(z.string().check(z.minLength(1))),
183
+ requests: z.array(
184
+ z.object({
185
+ createdAt: z.iso.datetime(),
186
+ data: z.optional(
187
+ z.object({
188
+ outTxs: z.optional(z.array(RequestTransaction)),
189
+ }),
190
+ ),
191
+ depositAddress: z.optional(
192
+ z.nullable(
193
+ z.object({
194
+ depositTxHash: z.optional(z.nullable(z.string().check(z.minLength(1)))),
195
+ }),
196
+ ),
197
+ ),
198
+ id: z.string().check(z.minLength(1)),
199
+ protocol: z.optional(
200
+ z.nullable(
201
+ z.object({
202
+ deposit: z.optional(
203
+ z.object({
204
+ origin: z.optional(
205
+ z.object({
206
+ depositor: z.optional(z.string().check(z.regex(/^0x[0-9a-fA-F]{40}$/))),
207
+ depository: z.optional(z.string().check(z.regex(/^0x[0-9a-fA-F]{40}$/))),
208
+ }),
209
+ ),
210
+ }),
211
+ ),
212
+ orderId: z.optional(z.string().check(z.regex(/^0x[0-9a-fA-F]{64}$/))),
213
+ solver: z.optional(
214
+ z.object({
215
+ address: z.optional(z.string().check(z.regex(/^0x[0-9a-fA-F]{40}$/))),
216
+ }),
217
+ ),
218
+ }),
219
+ ),
220
+ ),
221
+ status: z.string().check(z.minLength(1)),
222
+ updatedAt: z.iso.datetime(),
223
+ }),
224
+ ),
225
+ })
226
+
227
+ export const WebhookPayload = z.object({
228
+ data: z.object({
229
+ depositAddress: z.nullable(z.object({ address: z.string().check(z.minLength(1)) })),
230
+ requestId: z.optional(z.string().check(z.minLength(1))),
231
+ status: z.string().check(z.minLength(1)),
232
+ updatedAt: z.number().check(z.int(), z.nonnegative()),
233
+ }),
234
+ event: z.literal('request.status.updated'),
235
+ })
236
+ }
237
+
238
+ /** Validates a Relay request-list response and reports payload drift with field-level details. */
239
+ export function parseDepositAddressRequests(value: unknown) {
240
+ const parsed = schema.Requests.safeParse(value)
241
+ if (!parsed.success) throw new FundingProvider.ProviderPayloadError(z.prettifyError(parsed.error))
242
+ return parsed.data
243
+ }
244
+
245
+ /** Creates a Relay funding provider backed by `/quote/v2`. */
246
+ export function relay(options: relay.Options = {}): FundingProvider.Provider<'relay'> {
247
+ if (
248
+ (options.userAddress !== undefined &&
249
+ !Address.validate(options.userAddress, { strict: false })) ||
250
+ (options.recipientAddress !== undefined &&
251
+ !Address.validate(options.recipientAddress, { strict: false }))
252
+ )
253
+ throw new FundingProvider.ProviderConfigurationError()
254
+
255
+ const endpoint = quoteEndpoint(options)
256
+ const fetch = options.fetch ?? defaultFetch
257
+ const now = options.now ?? (() => new Date())
258
+ const observeDepositAddressRequest = options.observation
259
+ ? createDepositAddressObserver({
260
+ ...options.observation,
261
+ ...(options.apiKey ? { apiKey: options.apiKey } : {}),
262
+ ...(options.baseUrl ? { baseUrl: options.baseUrl } : {}),
263
+ fetch,
264
+ now,
265
+ })
266
+ : undefined
267
+ const webhook = (() => {
268
+ if (!options.apiKey || !options.webhook) return undefined
269
+ const { apiKey, webhook } = options
270
+ const verify = (input: FundingProvider.Webhook.verify.Parameters) =>
271
+ verifyWebhook(webhookOptions(input, apiKey))
272
+ return {
273
+ async receive(input: FundingProvider.Webhook.receive.Parameters) {
274
+ const receivedAt = now().toISOString()
275
+ const hint = (() => {
276
+ try {
277
+ return verify(input)
278
+ } catch (cause) {
279
+ webhook.onResult?.(
280
+ cause instanceof FundingProvider.WebhookAuthenticationError
281
+ ? 'authentication_failed'
282
+ : 'payload_invalid',
283
+ )
284
+ throw cause
285
+ }
286
+ })()
287
+ if (!hint.address) {
288
+ webhook.onResult?.('ignored')
289
+ return { type: 'ignored' as const }
290
+ }
291
+ const database = Db.get(webhook.db)
292
+ const address = await FundingDepositAddresses.getByProviderAddress(database, {
293
+ address: hint.address,
294
+ providerId: 'relay',
295
+ })
296
+ if (!address) {
297
+ webhook.onResult?.('unknown_address')
298
+ return { type: 'unknown_address' as const }
299
+ }
300
+ if (hint.requestId)
301
+ await FundingDepositRequestObservations.observeWebhook(database, {
302
+ depositAddressId: address.id,
303
+ providerRequestId: hint.requestId,
304
+ receivedAt,
305
+ }).catch((cause) => {
306
+ webhook.onResult?.('observation_failed')
307
+ throw cause
308
+ })
309
+ try {
310
+ const webhookTiming = (() => {
311
+ if (!hint.providerStatus || !hint.providerUpdatedAt || !hint.requestId || !hint.sentAt)
312
+ return undefined
313
+ return {
314
+ enqueuedAt: now().toISOString(),
315
+ providerStatus: hint.providerStatus,
316
+ providerUpdatedAt: hint.providerUpdatedAt,
317
+ receivedAt,
318
+ sentAt: hint.sentAt,
319
+ }
320
+ })()
321
+ await webhook.dispatch({
322
+ addressId: address.id,
323
+ ...(hint.requestId ? { requestId: hint.requestId } : {}),
324
+ trigger: 'webhook',
325
+ type: 'funding:deposit-address:reconcile',
326
+ ...(webhookTiming ? { webhookTiming } : {}),
327
+ })
328
+ } catch (cause) {
329
+ webhook.onResult?.('enqueue_failed')
330
+ throw cause
331
+ }
332
+ webhook.onResult?.('queued')
333
+ return { addressId: address.id, type: 'queued' as const }
334
+ },
335
+ verify,
336
+ }
337
+ })()
338
+
339
+ return FundingProvider.from({
340
+ id: 'relay',
341
+ name: 'Relay',
342
+ ...(webhook ? { webhook } : {}),
343
+ async createDepositAddress({ amount, candidate, recipient, refundAddress, subsidize }, signal) {
344
+ if (
345
+ subsidize &&
346
+ (!options.subsidies ||
347
+ !Subsidy.supports(options.subsidies, {
348
+ amount,
349
+ destinationToken: candidate.destinationToken,
350
+ sourceToken: candidate.sourceToken,
351
+ }))
352
+ )
353
+ throw new FundingProvider.ProviderUnavailableError()
354
+ const quote = await (async () => {
355
+ try {
356
+ return await FundingProvider.requestJson(endpoint, {
357
+ body: {
358
+ amount,
359
+ destinationChainId: relayChainId(candidate.route.destination.chain),
360
+ destinationCurrency: candidate.destinationToken.address,
361
+ originChainId: relayChainId(candidate.route.source.chain),
362
+ originCurrency: candidate.sourceToken.address,
363
+ recipient,
364
+ refundTo: refundAddress,
365
+ subsidizeFees: subsidize,
366
+ tradeType: 'EXACT_INPUT',
367
+ useDepositAddress: true,
368
+ user: refundAddress,
369
+ },
370
+ fetch,
371
+ headers: options.apiKey ? { 'x-api-key': options.apiKey } : undefined,
372
+ method: 'POST',
373
+ signal,
374
+ })
375
+ } catch (cause) {
376
+ if (FundingProvider.unavailable(cause, ['NO_QUOTES', 'NO_ROUTE', 'UNSUPPORTED_ROUTE']))
377
+ throw new FundingProvider.ProviderUnavailableError()
378
+ throw cause
379
+ }
380
+ })()
381
+ const parsed = schema.DepositAddress.safeParse(quote)
382
+ if (!parsed.success) throw new FundingProvider.ProviderPayloadError()
383
+ if (parsed.data.details.currencyIn.amount !== amount)
384
+ throw new FundingProvider.ProviderPayloadError()
385
+ const step = parsed.data.steps.find(
386
+ (candidate) => candidate.depositAddress && candidate.requestId,
387
+ )
388
+ if (!step?.depositAddress || !step.requestId) throw new FundingProvider.ProviderPayloadError()
389
+ const checkEndpoint = step.items?.find((item) => item.check)?.check?.endpoint
390
+ const providerFee = parsed.data.fees?.relayer?.amount
391
+ return {
392
+ address: step.depositAddress,
393
+ correlation: {
394
+ ...(checkEndpoint ? { checkEndpoint } : {}),
395
+ requestId: step.requestId,
396
+ },
397
+ destinationAmount: parsed.data.details.currencyOut.amount,
398
+ destinationAmountMin: parsed.data.details.currencyOut.minimumAmount,
399
+ fees:
400
+ providerFee && BigInt(providerFee) > 0n ? [{ amount: providerFee, side: 'source' }] : [],
401
+ sampledAt: now().toISOString(),
402
+ }
403
+ },
404
+ async getQuote({ candidate, route }, signal) {
405
+ if (options.userAddress === undefined)
406
+ return FundingProvider.unavailableResult({
407
+ detail: 'relay:quote-v2',
408
+ message: 'QUOTE_USER_NOT_CONFIGURED',
409
+ now: now(),
410
+ source: 'providerQuote',
411
+ })
412
+ const destinationChainId = relayChainId(route.destination.chain)
413
+ const sourceChainId = relayChainId(route.source.chain)
414
+ try {
415
+ const quote = await FundingProvider.requestJson(endpoint, {
416
+ body: {
417
+ amount: candidate.sourceAmount.amount,
418
+ destinationChainId,
419
+ destinationCurrency: candidate.destinationToken.address,
420
+ originChainId: sourceChainId,
421
+ originCurrency: candidate.sourceToken.address,
422
+ recipient: options.recipientAddress ?? options.userAddress,
423
+ tradeType: 'EXACT_INPUT',
424
+ user: options.userAddress,
425
+ },
426
+ fetch,
427
+ headers: options.apiKey ? { 'x-api-key': options.apiKey } : undefined,
428
+ method: 'POST',
429
+ signal,
430
+ })
431
+ const parsed = schema.Quote.safeParse(quote)
432
+ if (!parsed.success) throw new FundingProvider.ProviderPayloadError()
433
+ const destinationAmount = parsed.data.details?.currencyOut?.amount
434
+ const status = destinationAmount
435
+ ? { status: 'available' as const, tier: 'liquid' as const }
436
+ : { status: 'unknown' as const, tier: 'unknown' as const }
437
+
438
+ return {
439
+ destinationAmountMin: parsed.data.details?.currencyOut?.minimumAmount,
440
+ destinationAmount,
441
+ quality: {
442
+ estimatedSeconds: parsed.data.details?.timeEstimate,
443
+ liquiditySource: 'providerQuote',
444
+ sourceDetail: 'relay:quote-v2',
445
+ tier: status.tier,
446
+ },
447
+ sampledAt: now().toISOString(),
448
+ status: status.status,
449
+ }
450
+ } catch (cause) {
451
+ const unavailable = FundingProvider.unavailable(cause, [
452
+ 'NO_QUOTES',
453
+ 'NO_ROUTE',
454
+ 'UNSUPPORTED_ROUTE',
455
+ ])
456
+ if (!unavailable) throw cause
457
+ return FundingProvider.unavailableResult({
458
+ detail: 'relay:quote-v2',
459
+ message: unavailable,
460
+ now: now(),
461
+ source: 'providerQuote',
462
+ })
463
+ }
464
+ },
465
+ async listDepositAddressRequests({ address, continuation, requestId }, signal) {
466
+ const requestUrl = requestsEndpoint(options)
467
+ if (requestId) requestUrl.searchParams.set('id', requestId)
468
+ else requestUrl.searchParams.set('depositAddress', address)
469
+ requestUrl.searchParams.set('includeChildRequests', 'true')
470
+ requestUrl.searchParams.set('limit', '50')
471
+ requestUrl.searchParams.set('sortBy', 'updatedAt')
472
+ requestUrl.searchParams.set('sortDirection', 'desc')
473
+ if (continuation) requestUrl.searchParams.set('continuation', continuation)
474
+ const response = await FundingProvider.requestJson(requestUrl, {
475
+ fetch,
476
+ headers: options.apiKey ? { 'x-api-key': options.apiKey } : undefined,
477
+ method: 'GET',
478
+ signal,
479
+ })
480
+ const parsed = parseDepositAddressRequests(response)
481
+ return {
482
+ ...(parsed.continuation ? { continuation: parsed.continuation } : {}),
483
+ requests: parsed.requests.map((request) => {
484
+ const correlation = (() => {
485
+ const { protocol } = request
486
+ if (!protocol) return undefined
487
+ const relay = {
488
+ ...(protocol.deposit?.origin?.depositor
489
+ ? { depositor: protocol.deposit.origin.depositor }
490
+ : {}),
491
+ ...(protocol.deposit?.origin?.depository
492
+ ? { depository: protocol.deposit.origin.depository }
493
+ : {}),
494
+ ...(protocol.orderId ? { orderId: protocol.orderId } : {}),
495
+ ...(protocol.solver?.address ? { solver: protocol.solver.address } : {}),
496
+ }
497
+ if (Object.keys(relay).length === 0) return undefined
498
+ return schema.RequestCorrelation.parse({ relay })
499
+ })()
500
+ return {
501
+ createdAt: new Date(request.createdAt).toISOString(),
502
+ destinationTransactionHashes: request.data?.outTxs?.map((tx) => tx.txHash) ?? [],
503
+ id: request.id,
504
+ ...(correlation ? { providerState: correlation } : {}),
505
+ sourceTransactionHashes: request.depositAddress?.depositTxHash
506
+ ? [request.depositAddress.depositTxHash]
507
+ : [],
508
+ status: request.status,
509
+ updatedAt: new Date(request.updatedAt).toISOString(),
510
+ }
511
+ }),
512
+ }
513
+ },
514
+ ...(observeDepositAddressRequest ? { observeDepositAddressRequest } : {}),
515
+ async prepareTransfer({ candidate, method, mode, recipient, sender, slippageBps }, signal) {
516
+ // Catalog capabilities gate deposit addresses and exact destination
517
+ // off this adapter; refuse them defensively if one slips through.
518
+ if (method !== 'transaction' || mode !== 'exactSource')
519
+ throw new FundingProvider.ProviderConfigurationError()
520
+ const quote = await (async () => {
521
+ try {
522
+ return await FundingProvider.requestJson(endpoint, {
523
+ body: {
524
+ amount: candidate.sourceAmount.amount,
525
+ destinationChainId: Number(FundingChain.eip155Id(candidate.route.destination.chain)),
526
+ destinationCurrency: candidate.destinationToken.address,
527
+ originChainId: Number(FundingChain.eip155Id(candidate.route.source.chain)),
528
+ originCurrency: candidate.sourceToken.address,
529
+ recipient,
530
+ ...(slippageBps !== undefined ? { slippageTolerance: String(slippageBps) } : {}),
531
+ tradeType: 'EXACT_INPUT',
532
+ user: sender,
533
+ },
534
+ fetch,
535
+ headers: options.apiKey ? { 'x-api-key': options.apiKey } : undefined,
536
+ method: 'POST',
537
+ signal,
538
+ })
539
+ } catch (cause) {
540
+ if (FundingProvider.unavailable(cause, ['NO_QUOTES', 'NO_ROUTE', 'UNSUPPORTED_ROUTE']))
541
+ throw new FundingProvider.ProviderUnavailableError()
542
+ throw cause
543
+ }
544
+ })()
545
+ const parsed = schema.PreparedQuote.safeParse(quote)
546
+ if (!parsed.success) throw new FundingProvider.ProviderPayloadError()
547
+ const { details, fees, steps } = parsed.data
548
+ // The quoted input must match the request exactly; a drifted amount
549
+ // would desynchronize the stored terms from the prepared calls.
550
+ if (details.currencyIn.amount !== candidate.sourceAmount.amount)
551
+ throw new FundingProvider.ProviderPayloadError()
552
+
553
+ const items = steps
554
+ .filter((step) => step.kind === 'transaction')
555
+ .flatMap((step) => step.items ?? [])
556
+ const requestId = steps.find((step) => step.requestId)?.requestId
557
+ if (items.length === 0 || !requestId) throw new FundingProvider.ProviderPayloadError()
558
+ const sourceChainId = Number(FundingChain.eip155Id(candidate.route.source.chain))
559
+ for (const item of items)
560
+ if (
561
+ item.data.chainId !== sourceChainId ||
562
+ item.data.from.toLowerCase() !== sender.toLowerCase()
563
+ )
564
+ throw new FundingProvider.ProviderPayloadError()
565
+
566
+ const checkEndpoint = items.find((item) => item.check)?.check?.endpoint
567
+ // Relay's `relayer` fee is the solver's total source-side charge (gas
568
+ // plus service); it surfaces as the transfer's provider fee.
569
+ const providerFee = fees?.relayer?.amount
570
+ return {
571
+ action: {
572
+ calls: items.map((item) => ({
573
+ data: item.data.data,
574
+ to: item.data.to,
575
+ value: Hex.fromNumber(BigInt(item.data.value ?? '0')),
576
+ })),
577
+ type: 'evm:calls',
578
+ },
579
+ correlation: { ...(checkEndpoint ? { checkEndpoint } : {}), requestId },
580
+ fees:
581
+ providerFee && BigInt(providerFee) > 0n ? [{ amount: providerFee, side: 'source' }] : [],
582
+ destinationAmountMin: details.currencyOut.minimumAmount,
583
+ destinationAmount: details.currencyOut.amount,
584
+ quality: {
585
+ ...(details.timeEstimate !== undefined ? { estimatedSeconds: details.timeEstimate } : {}),
586
+ liquiditySource: 'providerQuote',
587
+ sourceDetail: 'relay:quote-v2',
588
+ tier: 'liquid',
589
+ },
590
+ sampledAt: now().toISOString(),
591
+ }
592
+ },
593
+ })
594
+ }
595
+
596
+ export declare namespace relay {
597
+ /** Relay provider options. */
598
+ type Options = {
599
+ /** Optional Relay API key for higher rate limits. */
600
+ apiKey?: string | undefined
601
+ /** Override for tests or Relay test environments. */
602
+ baseUrl?: string | undefined
603
+ /** Fetch implementation override for tests. */
604
+ fetch?: FundingProvider.Fetch | undefined
605
+ /** Clock override for deterministic tests. */
606
+ now?: (() => Date) | undefined
607
+ /** EVM chain evidence used to accelerate authenticated provider delivery. */
608
+ observation?: Observation | undefined
609
+ /** Optional recipient override; defaults to `userAddress`. */
610
+ recipientAddress?: string | undefined
611
+ /** Deposit subsidy policy enabled for this integration. */
612
+ subsidies?: Subsidy.Policy | undefined
613
+ /** Optional wallet address for indicative quotes. */
614
+ userAddress?: string | undefined
615
+ /** Tempo infrastructure used to receive authenticated Relay webhooks. */
616
+ webhook?: Webhook | undefined
617
+ }
618
+
619
+ /** Chain evidence configuration for Relay delivery observation. */
620
+ type Observation = {
621
+ /** Authoritative funding database or per-request database factory. */
622
+ db: Db.Source
623
+ /** Tempo chain that receives a shared RPC URL override. */
624
+ defaultChainId?: Viem.ChainId | undefined
625
+ /** Shared or per-EVM-chain RPC URL environment value. */
626
+ rpcUrlEnv?: Viem.UrlResolver | undefined
627
+ }
628
+
629
+ /** Authenticated Relay webhook integration attached to a provider instance. */
630
+ type Webhook = {
631
+ /** Authoritative funding database or per-request database factory. */
632
+ db: Db.Source
633
+ /** Enqueues one bounded reconciliation hint. */
634
+ dispatch: (message: FundingProvider.Webhook.receive.Dispatchable) => Promise<void>
635
+ /** Observes one bounded webhook disposition. */
636
+ onResult?: ((result: WebhookResult) => void) | undefined
637
+ }
638
+
639
+ /** Bounded operational result emitted while receiving a Relay webhook. */
640
+ type WebhookResult =
641
+ | 'authentication_failed'
642
+ | 'enqueue_failed'
643
+ | 'ignored'
644
+ | 'observation_failed'
645
+ | 'payload_invalid'
646
+ | 'queued'
647
+ | 'unknown_address'
648
+ }
649
+
650
+ type DepositAddressObserverOptions = relay.Observation & {
651
+ apiKey?: string | undefined
652
+ baseUrl?: string | undefined
653
+ fetch: FundingProvider.Fetch
654
+ now: () => Date
655
+ }
656
+
657
+ type RelayChain = z.output<typeof schema.Chains>['chains'][number]
658
+ type RelayDeliveryObservation = z.output<typeof schema.DeliveryObservation>['relay']
659
+
660
+ function createDepositAddressObserver(
661
+ options: DepositAddressObserverOptions,
662
+ ): NonNullable<FundingProvider.Provider['observeDepositAddressRequest']> {
663
+ let chainsExpiresAt = 0
664
+ let chainsPromise: Promise<readonly RelayChain[]> | undefined
665
+ let urlsExpiresAt = 0
666
+ let urlsPromise: Promise<ReadonlyMap<string, readonly string[]>> | undefined
667
+ const getChains = (signal: AbortSignal) => {
668
+ if (chainsPromise && options.now().getTime() < chainsExpiresAt) return chainsPromise
669
+ chainsExpiresAt = options.now().getTime() + relayChainsCacheTtlMs
670
+ chainsPromise = FundingProvider.requestJson(chainsEndpoint(options), {
671
+ fetch: options.fetch,
672
+ headers: options.apiKey ? { 'x-api-key': options.apiKey } : undefined,
673
+ signal,
674
+ })
675
+ .then((value) => schema.Chains.parse(value).chains)
676
+ .catch((cause) => {
677
+ chainsExpiresAt = 0
678
+ chainsPromise = undefined
679
+ throw cause
680
+ })
681
+ return chainsPromise
682
+ }
683
+ const getUrls = () => {
684
+ if (urlsPromise && options.now().getTime() < urlsExpiresAt) return urlsPromise
685
+ urlsExpiresAt = options.now().getTime() + relayChainsCacheTtlMs
686
+ urlsPromise = FundingCatalog.read(Db.get(options.db))
687
+ .then(
688
+ (catalog) =>
689
+ new Map<string, readonly string[]>(
690
+ [...catalog.chainsByKey.values()].map(
691
+ (chain) =>
692
+ [
693
+ chain.id,
694
+ Evidence.resolveRpcUrls({
695
+ chain,
696
+ defaultChainId: options.defaultChainId ?? Viem.defaultChainId,
697
+ rpcUrlEnv: options.rpcUrlEnv,
698
+ }),
699
+ ] as const,
700
+ ),
701
+ ),
702
+ )
703
+ .catch((cause) => {
704
+ urlsExpiresAt = 0
705
+ urlsPromise = undefined
706
+ throw cause
707
+ })
708
+ return urlsPromise
709
+ }
710
+
711
+ return async (parameters, signal) => {
712
+ if (!(deliveryObservationStatuses as readonly string[]).includes(parameters.request.status))
713
+ return { type: 'unsupported' }
714
+ if (parameters.sourceChain.kind !== 'evm' || parameters.destinationChain.kind !== 'evm')
715
+ return { type: 'unsupported' }
716
+ if (
717
+ !Address.validate(parameters.address, { strict: false }) ||
718
+ !Address.validate(parameters.destinationToken.address, { strict: false }) ||
719
+ !Address.validate(parameters.recipient, { strict: false }) ||
720
+ !Address.validate(parameters.refundAddress, { strict: false }) ||
721
+ !Address.validate(parameters.sourceToken.address, { strict: false }) ||
722
+ !Hash.validate(parameters.source.transactionHash)
723
+ )
724
+ return { type: 'unsupported' }
725
+
726
+ const [chains, urls] = await Promise.all([getChains(signal), getUrls()])
727
+ const sourceChain = relayEvmChain(chains, parameters.sourceChain)
728
+ const destinationChain = relayEvmChain(chains, parameters.destinationChain)
729
+ const sourceUrls = urls.get(parameters.sourceChain.id)
730
+ const destinationUrls = urls.get(parameters.destinationChain.id)
731
+ const depository = sourceChain?.protocol?.v2?.depository
732
+ const solvers = destinationChain?.solverAddresses
733
+ if (
734
+ !depository ||
735
+ !solvers ||
736
+ solvers.length === 0 ||
737
+ !sourceUrls?.length ||
738
+ !destinationUrls?.length
739
+ )
740
+ return { type: 'unsupported' }
741
+
742
+ const parsedCorrelation = schema.RequestCorrelation.safeParse(parameters.request.providerState)
743
+ const correlation = parsedCorrelation.success ? parsedCorrelation.data.relay : undefined
744
+ if (
745
+ (correlation?.depository &&
746
+ !Address.isEqual(
747
+ correlation.depository as Address.Address,
748
+ depository as Address.Address,
749
+ )) ||
750
+ (correlation?.solver &&
751
+ !solvers.some((solver) =>
752
+ Address.isEqual(solver as Address.Address, correlation.solver as Address.Address),
753
+ ))
754
+ )
755
+ return { type: 'unsupported' }
756
+ const depositor = (correlation?.depositor ?? parameters.refundAddress) as Address.Address
757
+
758
+ const stored = schema.DeliveryObservation.safeParse(parameters.providerState)
759
+ const sourceObservation = await (async () => {
760
+ if (stored.success) return stored.data.relay
761
+ const sourceClient = jsonRpcClient({ fetch: options.fetch, urls: sourceUrls })
762
+ const sourceReceipt = await getTransactionReceipt(sourceClient, {
763
+ hash: parameters.source.transactionHash as Hex.Hex,
764
+ })
765
+ if (sourceReceipt.status !== 'success' || sourceReceipt.blockNumber === null) return undefined
766
+ const sourceHead = await getBlockNumber(sourceClient, { cacheTime: 0 })
767
+ const sweepLogs = await getLogs(sourceClient, {
768
+ address: depository as Address.Address,
769
+ event: relayErc20DepositEvent,
770
+ fromBlock: sourceReceipt.blockNumber,
771
+ toBlock: minimum(sourceHead, sourceReceipt.blockNumber + sourceSweepForwardBlocks),
772
+ })
773
+ const observations: RelayDeliveryObservation[] = []
774
+ for (const log of sweepLogs) {
775
+ if (!log.transactionHash) continue
776
+ const event = decodeEvent(relayErc20DepositEvent, log)
777
+ if (
778
+ !event ||
779
+ !Address.isEqual(event.from, depositor) ||
780
+ !Address.isEqual(event.token, parameters.sourceToken.address as Address.Address) ||
781
+ event.amount !== BigInt(parameters.source.amount) ||
782
+ (correlation?.orderId && !Hex.isEqual(event.id, correlation.orderId as Hex.Hex))
783
+ )
784
+ continue
785
+ const transaction = await getTransaction(sourceClient, { hash: log.transactionHash })
786
+ const call = decodeRelayErc20Deposit(transaction.input)
787
+ if (
788
+ !call ||
789
+ !Address.isEqual(transaction.from, parameters.address as Address.Address) ||
790
+ !transaction.to ||
791
+ !Address.isEqual(transaction.to, depository as Address.Address) ||
792
+ !Address.isEqual(call.depositor, event.from) ||
793
+ !Address.isEqual(call.token, event.token) ||
794
+ (call.amount !== undefined && call.amount !== event.amount) ||
795
+ !Hex.isEqual(call.id, event.id)
796
+ )
797
+ continue
798
+ observations.push({
799
+ orderId: event.id,
800
+ sourceDepository: depository,
801
+ sourceObservedAt: options.now().toISOString(),
802
+ sourceSweepTransactionHash: log.transactionHash,
803
+ })
804
+ }
805
+ return observations.length === 1 ? observations[0] : undefined
806
+ })()
807
+ if (!sourceObservation) return { type: 'pending' }
808
+
809
+ const destinationClient = jsonRpcClient({ fetch: options.fetch, urls: destinationUrls })
810
+ const destinationHead = await getBlockNumber(destinationClient, { cacheTime: 0 })
811
+ const destinationLogs = await getLogs(destinationClient, {
812
+ address: parameters.destinationToken.address as Address.Address,
813
+ args: { to: parameters.recipient as Address.Address },
814
+ event: transferEvent,
815
+ fromBlock:
816
+ destinationHead > deliveryBackfillBlocks ? destinationHead - deliveryBackfillBlocks : 0n,
817
+ toBlock: destinationHead,
818
+ })
819
+ const solverAddresses = (correlation?.solver ? [correlation.solver] : solvers).map(
820
+ (address) => address as Address.Address,
821
+ )
822
+ const correlatedTransactionHashes: Hex.Hex[] = []
823
+ const uncorrelatedTransactionHashes: Hex.Hex[] = []
824
+ for (const log of destinationLogs) {
825
+ if (
826
+ !log.transactionHash ||
827
+ correlatedTransactionHashes.includes(log.transactionHash) ||
828
+ uncorrelatedTransactionHashes.includes(log.transactionHash)
829
+ )
830
+ continue
831
+ const event = decodeEvent(transferEvent, log)
832
+ if (
833
+ !event ||
834
+ event.value === 0n ||
835
+ !Address.isEqual(event.to, parameters.recipient as Address.Address) ||
836
+ !solverAddresses.some((address) => Address.isEqual(address, event.from))
837
+ )
838
+ continue
839
+ const transaction = await getTransaction(destinationClient, { hash: log.transactionHash })
840
+ const call = decodeRelayTransfer(transaction.input)
841
+ if (
842
+ !call ||
843
+ !solverAddresses.some((address) => Address.isEqual(address, transaction.from)) ||
844
+ !Address.isEqual(event.from, transaction.from) ||
845
+ !transaction.to ||
846
+ !Address.isEqual(transaction.to, parameters.destinationToken.address as Address.Address) ||
847
+ !Address.isEqual(call.recipient, event.to) ||
848
+ call.amount !== event.value ||
849
+ (call.orderId && !Hex.isEqual(call.orderId, sourceObservation.orderId as Hex.Hex))
850
+ )
851
+ continue
852
+ if (call.orderId) correlatedTransactionHashes.push(log.transactionHash)
853
+ else uncorrelatedTransactionHashes.push(log.transactionHash)
854
+ }
855
+ const destinationTransactionHashes = (() => {
856
+ if (correlatedTransactionHashes.length > 0) return correlatedTransactionHashes
857
+ if (uncorrelatedTransactionHashes.length === 1) return uncorrelatedTransactionHashes
858
+ return []
859
+ })()
860
+ const providerState = { relay: sourceObservation }
861
+ if (destinationTransactionHashes.length === 0)
862
+ return {
863
+ providerState,
864
+ providerTransactionHashes: [sourceObservation.sourceSweepTransactionHash],
865
+ type: 'pending',
866
+ }
867
+
868
+ return {
869
+ destinationTransactionHashes,
870
+ providerState: {
871
+ relay: {
872
+ ...sourceObservation,
873
+ destinationObservedAt: options.now().toISOString(),
874
+ },
875
+ },
876
+ providerTransactionHashes: [
877
+ sourceObservation.sourceSweepTransactionHash,
878
+ ...destinationTransactionHashes,
879
+ ],
880
+ type: 'verified',
881
+ }
882
+ }
883
+ }
884
+
885
+ function chainsEndpoint(options: Pick<DepositAddressObserverOptions, 'baseUrl'>): URL {
886
+ const endpoint = new URL(options.baseUrl ?? defaultBaseUrl)
887
+ endpoint.pathname = `${endpoint.pathname.replace(/\/+$/, '')}/chains`
888
+ return endpoint
889
+ }
890
+
891
+ function decodeRelayErc20Deposit(data: Hex.Hex) {
892
+ const fullAllowanceLength = 2 + 2 * (4 + 32 * 3)
893
+ const withAmountLength = 2 + 2 * (4 + 32 * 4)
894
+ try {
895
+ if (data.length === withAmountLength) {
896
+ const [depositor, token, amount, id] = AbiFunction.decodeData(depositErc20WithAmount, data)
897
+ return { amount, depositor, id, token }
898
+ }
899
+ if (data.length === fullAllowanceLength) {
900
+ const [depositor, token, id] = AbiFunction.decodeData(depositErc20FullAllowance, data)
901
+ return { depositor, id, token }
902
+ }
903
+ return undefined
904
+ } catch {
905
+ return undefined
906
+ }
907
+ }
908
+
909
+ function decodeRelayTransfer(data: Hex.Hex) {
910
+ const encodedLength = 2 + 2 * (4 + 32 * 2)
911
+ if (data.length !== encodedLength && data.length !== encodedLength + 64) return undefined
912
+ try {
913
+ const [recipient, amount] = AbiFunction.decodeData(
914
+ relayTransfer,
915
+ data.slice(0, encodedLength) as Hex.Hex,
916
+ )
917
+ return {
918
+ amount,
919
+ ...(data.length > encodedLength
920
+ ? { orderId: `0x${data.slice(encodedLength)}` as Hex.Hex }
921
+ : {}),
922
+ recipient,
923
+ }
924
+ } catch {
925
+ return undefined
926
+ }
927
+ }
928
+
929
+ function decodeEvent<const event extends AbiEvent.AbiEvent>(
930
+ abiEvent: event,
931
+ log: { data: Hex.Hex; topics: readonly Hex.Hex[] },
932
+ ): AbiEvent.decode.ReturnType<event> | undefined {
933
+ try {
934
+ return AbiEvent.decode(abiEvent, log)
935
+ } catch {
936
+ return undefined
937
+ }
938
+ }
939
+
940
+ function jsonRpcClient(options: { fetch: FundingProvider.Fetch; urls: readonly string[] }) {
941
+ return createClient({
942
+ transport: fallback(
943
+ options.urls.map((url) => {
944
+ const transport = RpcTransport.fromHttp(url, { fetchFn: options.fetch })
945
+ return custom(transport, { retryCount: 0 })
946
+ }),
947
+ ),
948
+ })
949
+ }
950
+
951
+ function minimum(left: bigint, right: bigint): bigint {
952
+ return left < right ? left : right
953
+ }
954
+
955
+ function relayEvmChain(
956
+ chains: readonly RelayChain[],
957
+ chain: FundingProvider.ChainRef,
958
+ ): RelayChain | undefined {
959
+ if (chain.kind !== 'evm') return undefined
960
+ const match = /^eip155:(\d+)$/.exec(chain.id)
961
+ if (!match?.[1]) return undefined
962
+ return chains.find((candidate) => candidate.id === Number(match[1]))
963
+ }
964
+
965
+ type VerifyWebhookOptions = {
966
+ body: string
967
+ secret: string
968
+ signature: string
969
+ timestamp: string
970
+ }
971
+
972
+ function verifyWebhook(options: VerifyWebhookOptions): FundingProvider.Webhook.verify.ReturnType {
973
+ const timestamp = Number(options.timestamp)
974
+ if (!Number.isSafeInteger(timestamp)) throw new WebhookSignatureError()
975
+ if (Math.abs(Date.now() - timestamp) > webhookSignatureToleranceMs)
976
+ throw new WebhookSignatureError()
977
+ if (!/^[0-9a-fA-F]{64}$/.test(options.signature)) throw new WebhookSignatureError()
978
+ const expected = Hash.hmac256(
979
+ Hex.fromString(options.secret),
980
+ Hex.fromString(`${options.timestamp}.${options.body}`),
981
+ ).slice(2)
982
+ if (!timingSafeEqual(expected, options.signature)) throw new WebhookSignatureError()
983
+
984
+ const payload = (() => {
985
+ try {
986
+ return JSON.parse(options.body) as unknown
987
+ } catch {
988
+ throw new WebhookPayloadError()
989
+ }
990
+ })()
991
+ const parsed = schema.WebhookPayload.safeParse(payload)
992
+ if (!parsed.success) throw new WebhookPayloadError()
993
+ return {
994
+ address: parsed.data.data.depositAddress?.address,
995
+ providerStatus: webhookStatus(parsed.data.data.status),
996
+ providerUpdatedAt: webhookTimestamp(parsed.data.data.updatedAt),
997
+ requestId: parsed.data.data.requestId,
998
+ sentAt: webhookTimestamp(timestamp),
999
+ }
1000
+ }
1001
+
1002
+ function webhookOptions(
1003
+ input: FundingProvider.Webhook.verify.Parameters,
1004
+ secret: string,
1005
+ ): VerifyWebhookOptions {
1006
+ const signature = input.headers.get('x-signature-sha256')
1007
+ const timestamp = input.headers.get('x-signature-timestamp')
1008
+ if (!signature || !timestamp) throw new WebhookSignatureError()
1009
+ return { body: input.body, secret, signature, timestamp }
1010
+ }
1011
+
1012
+ function quoteEndpoint(options: relay.Options): URL {
1013
+ const endpoint = new URL(options.baseUrl ?? defaultBaseUrl)
1014
+ endpoint.pathname = `${endpoint.pathname.replace(/\/+$/, '')}/quote/v2`
1015
+ return endpoint
1016
+ }
1017
+
1018
+ function requestsEndpoint(options: relay.Options): URL {
1019
+ const endpoint = new URL(options.baseUrl ?? defaultBaseUrl)
1020
+ endpoint.pathname = `${endpoint.pathname.replace(/\/+$/, '')}/requests/v3`
1021
+ return endpoint
1022
+ }
1023
+
1024
+ function timingSafeEqual(left: string, right: string): boolean {
1025
+ if (left.length !== right.length) return false
1026
+ let mismatch = 0
1027
+ for (let index = 0; index < left.length; index++)
1028
+ mismatch |= left.charCodeAt(index) ^ right.charCodeAt(index)
1029
+ return mismatch === 0
1030
+ }
1031
+
1032
+ function webhookStatus(status: string): string {
1033
+ return (webhookStatuses as readonly string[]).includes(status) ? status : 'unknown'
1034
+ }
1035
+
1036
+ function webhookTimestamp(value: number): string {
1037
+ try {
1038
+ return new Date(value).toISOString()
1039
+ } catch {
1040
+ throw new WebhookPayloadError()
1041
+ }
1042
+ }
1043
+
1044
+ function relayChainId(chain: FundingProvider.Chain): number {
1045
+ if (chain.id.startsWith('eip155:')) return Number(FundingChain.eip155Id(chain))
1046
+ // Relay uses a numeric chain ID for Solana instead of its CAIP-2 reference.
1047
+ if (chain.id === 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp') return 792_703_809
1048
+ if (chain.id.startsWith('tron:')) return Number(chain.id.slice('tron:'.length))
1049
+ throw new FundingProvider.ProviderConfigurationError()
1050
+ }
1051
+
1052
+ /** Relay webhook signature is missing, stale, or invalid. */
1053
+ export class WebhookSignatureError extends FundingProvider.WebhookAuthenticationError {
1054
+ override name = 'Funding.Provider.Relay.WebhookSignatureError'
1055
+ }
1056
+
1057
+ /** Relay webhook body does not match the expected status event shape. */
1058
+ export class WebhookPayloadError extends FundingProvider.WebhookPayloadError {
1059
+ override name = 'Funding.Provider.Relay.WebhookPayloadError'
1060
+ }